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

Last change on this file since 6043 was 4368, checked in by joerg, 13 years ago

add links to icons
more incomming as block to end of html page

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