source: subversion/applications/share/map-icons/create_overview.pl @ 4340

Last change on this file since 4340 was 4340, checked in by joerg, 12 years ago

also add no-license-info for icons with standard comment

  • Property svn:executable set to *
File size: 13.3 KB
Line 
1#!/usr/bin/perl
2#####################################################################
3#
4#  This script handles the XML-Files for the POI-Types in gpsdrive.
5#  It has to be run from the data directory.
6
7#  Default actions, when no options are given:
8#  - Create overview.html from the XML-File to show all
9#    available poi_types and icons.
10
11#use diagnostics;
12use strict;
13use warnings;
14
15use utf8;
16use IO::File;
17use File::Find;
18use Getopt::Std;
19use Pod::Usage;
20use File::Basename;
21use File::Copy;
22use File::Path;
23use Data::Dumper;
24use XML::Simple;
25use Image::Info;
26
27our ($opt_b, $opt_h, $opt_i, $opt_j, $opt_l, $opt_n, $opt_p, $opt_r,$opt_s,$opt_v, $opt_D, $opt_F) = 0;
28getopts('bhijlnprsvF:D:') or $opt_h = 1;
29pod2usage( -exitval => '1', 
30           -verbose => '1') if $opt_h;
31
32$opt_b ||=0;
33my $base_dir = $opt_D || '.';
34my $file_xml = $opt_F || './icons.xml';
35my $i = 0;
36my $poi_reserved = 30;
37my $poi_type_id_base = $poi_reserved;
38my $VERBOSE = $opt_v;
39
40my @ALL_TYPES = qw(square.big square.small classic.big classic.small svg japan );
41
42my $SVN_STATUS={};
43my $SVN_VERSION = '';
44
45sub update_overview($$);
46
47#####################################################################
48#
49#  M A I N
50#
51#
52unless (-e $file_xml)
53{
54  create_xml(); # Create a new XML-File if none exists
55}
56get_svn_status();
57
58my $rules = XMLin("$file_xml",ForceArray => ['description','title','condition']);
59my @rules=@{$rules->{rule}};
60
61my @INCOMMING_RULES;
62if ( $opt_i ) {
63    my $id=999;
64    my %INCOMMING_RULES;
65    for my $theme ( @ALL_TYPES ) {
66        find( \&add_icons,  "$theme/incomming/" );
67    }
68    sub add_icons { 
69        my $name = $File::Find::name;
70        return if $name =~ m/\.svn/;
71        return unless $name =~ m/incomming/;
72        $name =~ s/\.(svg|png)$//;
73        $name =~ s/^.*incomming/incomming/;
74        $name =~ s/\//\./g;
75       
76        print "--- $name\n";
77        $INCOMMING_RULES{$name}++;
78    }
79
80    for my $name ( sort keys %INCOMMING_RULES ) {
81        push( @INCOMMING_RULES,
82          {
83              geoinfo => {
84                  name => "$name",
85                  poi_type_id => $id++,
86              },
87          } );
88    }
89    push(@rules, @INCOMMING_RULES);
90}
91
92update_overview('en',\@rules);   # update html overview from XML-File
93update_overview('de',\@rules);
94
95exit (0);
96
97##################################################################
98# Get the licence from a svg File
99# RETURNS:
100#     'PD' for PublicDomain
101#     '?'  if unknown
102sub get_svg_license($){
103    my $icon_file=shift;
104    my $icon = XMLin($icon_file,ForceArray => ['description','title','condition']);
105    my $license = $icon->{'metadata'}->{'rdf:RDF'}->{'cc:Work'}->{'cc:license'}->{'rdf:resource'};
106    #print Dumper(\$license);
107    return "?" unless $license;
108    return "PD" if $license eq "http://web.resource.org/cc/PublicDomain";
109    $license =~ s,http://creativecommons.org/licenses/LGPL,LGPL,;
110    return $license;
111}
112
113sub get_png_license($){
114    my $filename = shift;
115    my $comment = get_png_comment($filename);
116    return "?" unless $comment;
117    $comment =~ s/Created with The GIMP//;
118    $comment =~ s,Created with Inkscape \(http://www.inkscape.org/\),,;
119    $comment =~ s,Generator: Adobe Illustrator 10.0\, SVG Export Plug-In \. SVG Version: [\d\.]+ Build \d+\),,g;
120    $comment =~ s/^\s*//g;
121    $comment =~ s/\s*$//g;
122    print "Comment($filename): $comment\n" if $VERBOSE && $comment;
123    return "PD" if $comment =~ m/Public.*Domain/i;
124    return "?" unless $comment;
125    return $comment if $comment && $comment =~ m/license/;
126}
127
128# Get Comment Field from a PNG
129sub get_png_comment($){
130    my $filename = shift;
131    my ($s1,$s2)=Image::Info::image_info($filename);
132    my $comment = $s1->{'Comment'};
133}
134
135#####################################################################
136#
137# Get the "svn status" for all icons Files
138#
139sub get_svn_status {
140    return unless $opt_s;
141    $SVN_VERSION = `svnversion`;
142    chomp($SVN_VERSION);
143    $SVN_VERSION =~ s/M//;
144    my $svn_status = `svn -v status .`;
145    for my $line (split(/[\r\n]+/,$svn_status)) {
146        chomp $line;
147        $line =~ s/^ /_/;
148        my ($status,$rev,$rev_ci,$user,$file) = (split(/\s+/,$line),('')x5);
149        if ( $status eq "?" ) {
150            $file = $rev; 
151            $rev ='';
152        }
153        $SVN_STATUS->{$file}="$status,$rev,$rev_ci,$user";
154        #print STDERR "SVN STATUS: $status,$rev,$rev_ci,$user   '$file'\n" if $VERBOSE;
155    }
156}
157
158sub html_head(){
159    # html 'template'
160    my $html_head =
161        "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\"\n".
162        "  \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">\n".
163        "<html xmlns=\"http://www.w3.org/1999/xhtml\" lang=\"en\" ".
164        "xml:lang=\"en\">\n".
165        "<head>\n".
166        "<meta http-equiv=\"Content-Type\" ".
167        "content=\"text/html; charset=utf-8\" />\n".
168        "\n".
169        "<title>Available POI-Types in gpsdrive</title>\n".
170        "<style type=\"text/css\">\n".
171        "       table            { width:100%;  background-color:#fff8B2; }\n".
172        "       tr               { border-top:5px solid black; }\n".
173        "       tr.id            { background-color:#6666ff; color:white; font-weight:bold; }\n".
174        "       td.id            { text-align:right; }\n".
175        "       td.icon          { text-align:center;}\n".
176        "       td.empty         { text-align:center; height:32px; }\n".
177        "       img.square_big   { width:32px; height:32px; }\n".
178        "       img.square_small { width:16px; height:16px; }\n".
179        "       img.classic      { max-height:32px; }\n".
180        "       img.svg          { max-height:32px; }\n".
181        "       img.japan        { max-height:32px; }\n".
182        "       span.desc        { font:x-small italic condensed }\n".
183        "</style>\n".
184        "</head>\n";
185    $html_head .= "<body>\n";
186    $html_head .= "<table border=\"$opt_b\">\n";
187    $html_head .= "  <tr>";
188    $html_head .= "    <th>ID</th>" if $opt_j;
189    $html_head .= "    <th>Name</th>\n";
190    $html_head .= "    <th>Path</th>\n" if $opt_p;
191    $html_head .= "    <th colspan=\"".(scalar(@ALL_TYPES))."\">Icons</th>\n";
192    $html_head .= "    <th>Description</th>\n";
193    $html_head .= "    <th>condition</th>\n";
194    $html_head .= "  </tr>\n";
195    return $html_head;
196}
197
198# Header with a list of all types used in one <tr> line
199sub all_type_header(){
200    my $all_type_header= "<tr>";
201    $all_type_header .= "<td></td>" if $opt_j;
202    $all_type_header .= " <td></td>";
203    $all_type_header .= " <td></td>\n" if $opt_p;
204    for my $type ( @ALL_TYPES  ) {
205        my $txt=$type;
206        $txt=~s/\.$//;
207        $txt=~s/\./<br>/;
208        $all_type_header .= "  <td align=\"top\"><font size=\"-3\">$txt</font></td>\n";
209    }
210    $all_type_header .= " <td></td>\n";
211    $all_type_header .= " <td></td>\n";
212    $all_type_header .= " <td></td>\n";
213    $all_type_header .= " </tr>\n\n";
214    return $all_type_header;
215}
216
217#####################################################################
218#
219#  Update HTML Overview of available Icons and POI-Types
220#
221#
222sub update_overview($$){
223    my $lang  = shift || 'en';
224    my $rules = shift;
225    my $file_html = "$base_dir/overview.$lang.html";
226
227    print STDOUT "----- Updating HTML Overview '$file_html' -----\n";
228   
229    my %out;
230
231    my $ID_SEEN={};
232    for my $rule (@{$rules}) {
233        #print Dumper(\$rule);
234        my $content = '';
235        my $id = $rule->{'geoinfo'}->{'poi_type_id'};
236        my $nm = $rule->{'geoinfo'}->{'name'};
237        my $restricted = $rule->{'geoinfo'}->{'restricted'};
238
239        if ( $ID_SEEN->{$id} ){
240            die "$id was already seen at $ID_SEEN->{$id}. Here in $nm\n";
241        };
242        $ID_SEEN->{$id}=$nm;
243
244        if ( $restricted && not $opt_r ){
245            next;
246        }
247
248        my $title='';
249        for my $t ( @{$rule->{'title'}||[]} ){
250            $title = $t->{content}
251            if $t->{'lang'} eq $lang && $t->{content};
252        }
253       
254        my $descr ='';
255        for my $d (@{$rule->{'description'}}) {
256            my $c = $d->{content};
257            if ($d->{'lang'} eq $lang && $c) {
258                $descr = '<span class="desc">&nbsp;&nbsp;'.$c.'</span>';
259            }
260        }
261       
262        my $conditions='';
263        for my $c (@{$rule->{'condition'}}) {
264            next if $c->{k} eq "poi";
265            $conditions .= "$c->{k}=$c->{v}<br>";
266        }
267
268        my $icon = $nm;
269        my $ind = $nm;
270
271        # accentuate base categories
272        my $header_line=0;
273        if ($id <= $poi_reserved || ( $icon !~ m,\.,) ) {
274            $content .= "  <tr><td>&nbsp;</td></tr>\n";
275            $content .=     all_type_header();
276            $content .= "  <tr class=\"id\">\n";
277            $content .= "     <td class=\"id\">$id</td>\n" if $opt_j;
278            $content .= "     <td>&nbsp;$nm</td>\n";
279            $header_line++;
280        } else {
281            my $level = ($icon =~ tr,\.,/,);
282            my $html_space = '';
283            while ($level)
284            { $html_space .='&nbsp;&nbsp;&nbsp;&nbsp;&rsaquo;&nbsp;'; $level--; };
285            $nm =~ s,.*\.,,g;
286            $content .= "<tr>\n";
287            $content .= "    <td class=\"id\">$id</td>" if $opt_j;
288            $content .= "    <td>&nbsp;$html_space$nm</td>\n";
289        }
290
291        # Add filename+path column
292        $content .= "<td><font size=-4>$icon</font></td>\n" 
293            if $opt_p;
294
295        # display all icons
296        for my $type ( @ALL_TYPES  ) {
297            my $icon_s = "${type}/$icon.svg";
298            my $icon_p = "${type}/$icon.png";
299            my $icon_t = "${type}_tn/${icon}.png";
300            my $class = $type;
301            $class =~ s/\./_/g;
302
303            my $icon_path_current;
304            if ( -s "$base_dir/$icon_t" ) { $icon_path_current = $icon_t; }
305            else {              $icon_path_current = $icon_p;   };
306            my $icon_path_svn=$icon_path_current;
307            $icon_path_svn =~ s,/([^/]+)\.(...)$,/.svn/text-base/$1.$2.svn-base,;
308
309            my $svn_bgcolor='';
310            my $status_line = $SVN_STATUS->{$icon_s};
311            $status_line ||= $SVN_STATUS->{$icon_p};
312            $status_line ||= '';
313            my ($status,$rev,$rev_ci,$user,$file) =
314                (split(/,/, $status_line),('')x5);
315            $status_line = " $status  $user $rev_ci";
316            #$status_line =~ s/guenther/g/;
317            #$status_line =~ s/joerg/j/;
318            #$status_line =~ s/ulf/u/;
319            #$status_line =~ s/$SVN_VERSION//;
320            $status_line ="<font size=\"-3\">$status_line</font><br>" if $status_line;
321           
322            print STDERR "svn_status($icon_p): $status\n" if $VERBOSE;
323            if ( $status eq "" ) {
324                if ( -$icon_path_svn # Im original svn Verzeichnis
325                     || -s "$icon_s"
326                     || -s "$icon_p"
327                     || -s "$icon_t"
328                     ) {
329                    $svn_bgcolor='';
330                } else {
331                    $svn_bgcolor=' bgcolor="#E5E5E5" ';
332                }
333            } elsif ( $status eq "_" ) { 
334                $svn_bgcolor='';
335            } elsif ( $status eq "?" ) { 
336                $svn_bgcolor=' bgcolor="blue" ';
337            } elsif ( $status eq "M" ){
338                $svn_bgcolor=' bgcolor="green" ';
339            } elsif ( $status eq "D" ){
340                $svn_bgcolor=' bgcolor="red" ';
341            } else {
342                $svn_bgcolor=' bgcolor="red" ';
343            }
344           
345            $content .=  "    <td ";
346            my $empty= ! ( -s "$base_dir/$icon_p" or -s "$base_dir/$icon_s");
347            if ( $empty && ! $status  ){
348                $svn_bgcolor='';
349            }
350            if ( $empty ) { # exchange empty or missing icon files with a char for faster display
351                $content .=  " class=\"empty\" " unless $header_line;
352                $content .=  $svn_bgcolor;
353                $content .=  " >";
354            } elsif ( $restricted && not $opt_r ){
355                $content .=  " class=\"empty\" " unless $header_line;
356                $content .=  $svn_bgcolor;
357                $content .=  " >";
358            } else {
359                $content .=  " class=\"icon\" " unless $header_line;
360                $content .= $svn_bgcolor;
361                $content .=  " >";
362            }
363
364            if ( $opt_s && $status ) {
365                $content .= "     $status_line" if $opt_n;
366                $content .= "    <img src=\"$icon_path_svn\" /> -->" 
367                    if -s $icon_path_svn && $status =~ "M|D";
368            }
369            if ( $empty ) { # exchange empty or missing icon files with a char for faster display
370                $content .=  ".";
371            } elsif ( $restricted && not $opt_r ){
372                $content .=   "r";
373            } else {
374                $content .= "     <img src=\"$icon_path_current\" class=\"$class\" alt=\"$nm\" />"
375                    if -s "$base_dir/$icon_path_current";
376            }
377            if ( ! $empty && $opt_l ) { # Add license Information
378                my $license='';
379                if ( -s "$icon_s"  ) {
380                    $license = get_svg_license($icon_s);
381                } elsif ( -s "$icon_p" ) {
382                    $license = get_png_license($icon_p);
383                }
384                if ( $license eq "PD" ) {
385                    $content .= "<br><font size=\"-2\">$license</font>";
386                } elsif( $license && $license eq "?") {
387                    $content .= "<br><font size=\"-2\">no-license-info</font>";
388                } elsif ( $license ) {
389                    $content .= "<br><font size=\"-2\">license:$license</font>";
390                }
391                print "License($type/$icon): $license\n"
392                    if $VERBOSE && $license && $license ne "?";
393            }
394
395            $content .= "</td>\n";
396        }
397        $content .= "    <td>$title<br>$descr</td>\n";
398        $content .= "    <td><font size=-1>$conditions</font></td>\n";
399        $content .= "  </tr>\n";
400        $out{$ind} = $content;
401    } 
402
403    # create backup of old overview.html
404    move("$file_html","$file_html.bak")
405        or die (" Couldn't create backup file!")
406        if (-e $file_html);
407
408    my $fo = IO::File->new(">$file_html");
409    $fo ||die "Cannot write to '$file_html': $!\n";
410    $fo->binmode(":utf8");
411    print $fo html_head();
412    # sorted output
413    foreach ( sort keys(%out) )  {
414        print $fo $out{$_};
415    }
416    print $fo "</table>\n</body>\n</html>";
417    $fo->close();
418    return;
419
420}
421
422
423__END__
424
425
426=head1 SYNOPSIS
427 
428update_icons.pl [-h] [-v] [-i] [-r] [-s] [-f XML-FILE]
429 
430=head1 OPTIONS
431 
432=over 2
433 
434=item B<--h>
435
436 Show this help
437
438=item B<-F> XML-FILE
439
440 Set file, that holds all the necessary icon and poi_type information.
441 The default file is 'icons.xml'.
442
443=item B<-D> DIRECTORY
444
445 The directory to search for the icons. Default it ./
446
447=item B<-v>
448
449 Enable verbose output
450
451=item B<-i>
452
453 Include incomming directory in icons.xml and overview.html
454
455    not working yet
456
457=item B<-j>
458
459    show internal id in html page
460
461=item B<-l>
462
463Add licence to overview where known (Currently only svg)
464
465=item B<-r>
466
467 Include restricted icons in overview.html
468
469=item B<-p>
470
471 Show path of Filename
472
473=item B<-b>
474
475 Show Border in Table
476
477=item B<-s>
478
479 add svn status to overview
480    grey is missing in svn
481    green is modified
482    red is any other condition
483 this also shows the old and new icon if it is found in the
484 .svn/ directory
485
486=item B<-n>
487    show the svn revision numbers and user too
488    needs option -s to work
489
490=back
Note: See TracBrowser for help on using the repository browser.