source: subversion/applications/share/map-icons/create_icons_index.pl @ 14145

Last change on this file since 14145 was 13977, checked in by guenther, 11 years ago
  • added new scripts to work with changed icons.xml
  • Property svn:eol-style set to native
  • Property svn:executable set to *
File size: 12.6 KB
Line 
1#!/usr/bin/perl
2#####################################################################
3#
4#  This script creates an overview.html from the XML-File to
5#  show all available poi_types and icons.
6#  It has to be run from the data directory.
7#
8
9#use diagnostics;
10use strict;
11use warnings;
12
13use utf8;
14use IO::File;
15use File::Find;
16use Getopt::Std;
17use Pod::Usage;
18use File::Basename;
19use File::Copy;
20use File::Path;
21use Data::Dumper;
22use XML::Simple;
23use Image::Info;
24use Cwd;
25
26our ($opt_b, $opt_h, $opt_i, $opt_j, $opt_p, $opt_r,$opt_v, $opt_D, $opt_F, $opt_L, $opt_P,$opt_S) = 0;
27getopts('bhijprvF:D:L:P:S:') or $opt_h = 1;
28pod2usage( -exitval => '1', 
29           -verbose => '1') if $opt_h;
30
31$opt_b ||=0;
32my $cwd = cwd;
33my $languages = $opt_L || "en,de";
34my $icon_types = "all,poi,dynamic,general,rendering";
35my $base_dir = $opt_D || cwd;
36my $file_xml = $opt_F || './icons.xml';
37my $i = 0;
38my $poi_reserved = 30;
39my $poi_type_id_base = $poi_reserved;
40my $VERBOSE = $opt_v;
41$opt_P ||= "index";
42
43my @ALL_TYPES = qw(square.big square.small classic.big classic.small svg svg-twotone japan nickw);
44
45sub html_head($$);
46sub update_overview($$$);
47
48#####################################################################
49#
50#  M A I N
51#
52#
53my $rules = XMLin("$file_xml",ForceArray => ['description','title','condition','condition_2nd','condition_3rd']);
54my @rules=@{$rules->{rule}};
55
56for my $type ( split ( ",", $icon_types)){
57    for my $lang ( split ( ",", $languages)){
58        update_overview($type, $lang,\@rules);   # update html overview from XML-File
59    }
60}
61
62exit (0);
63
64
65sub html_head($$){
66    my $type = shift;
67    my $lang = shift;
68    my $title = 'All available icons';
69    if ($type ne 'all'){
70        $title = 'Available icons of type "'.$type.'"'
71    }
72    # html 'template'
73    my $html_head =
74        "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\"\n".
75        "  \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">\n".
76        "<html xmlns=\"http://www.w3.org/1999/xhtml\" lang=\"en\" ".
77        "xml:lang=\"en\">\n".
78        "<head>\n".
79        "<meta http-equiv=\"Content-Type\" ".
80        "content=\"text/html; charset=utf-8\" />\n".
81        "\n".
82        "<title>".$title."</title>\n".
83        "<style type=\"text/css\">\n".
84        "       table            { width:100%;  background-color:#fff8B2; }\n".
85        "       tr               { border-top:5px solid black; }\n".
86        "       td               { border-bottom:1px solid #888888; }\n".
87        "       tr.id            { background-color:#6666ff; color:white; font-weight:bold; }\n".
88        "       td.id            { text-align:right; vertical-align:top;}\n".
89        "       td.icon          { text-align:center; vertical-align:top;}\n".
90        "       td.status        { text-align:left; vertical-align:top;}\n".
91        "       td.empty         { text-align:center; height:32px; }\n".
92        "       img              { border:0px; }\n".
93        "       img.square_big   { border:0px; width:32px; height:32px; }\n".
94        "       img.square_small { border:0px; width:16px; height:16px; }\n".
95        "       img.classic      { border:0px; max-height:32px; }\n".
96        "       img.svg          { max-height:32px; }\n".
97        "       img.japan        { max-height:32px; }\n".
98        "       img.svg-twotone  { max-height:32px; }\n".
99        "       img.nickw        { max-height:32px; }\n".
100        "       span.desc        { font:x-small italic condensed }\n".
101        "       h1               { text-align:center; }\n".
102        "</style>\n".
103        "</head>\n";
104    $html_head .= "<body style=\"background-color:#bbbbbb;\">\n";
105
106
107    if ( $lang eq "de" ) {
108        $html_head .= '<h1>Verf&uuml;gbare Icons des Typs "'.$type."\"</h1>\n";
109    } else {
110        $html_head .= '<h1>Available icons of type "'.$type."\"</h1>\n";
111    };
112
113    # Legende
114    $html_head .= "<table>\n";
115    $html_head .= "<tr>\n";
116    if ( 1 ) { # Content with links
117        $html_head .= "<td valign=\"top\">\n";
118        if ( $lang eq "de" ) {
119            $html_head .= "<h3>Kategorien</h3>\n";
120        } else {
121            $html_head .= "<h3>Categories</h3>\n";
122        };
123
124        $html_head .= "<table><tr><td valign=\"top\">\n";
125        $html_head .= "<font size=\"-2\"><ul>\n";
126        #for my $rule (@{$rules}) {
127        my %top_categories;
128        for my $dir ( sort glob ( "$base_dir/*/*")) {
129            next unless -d $dir;
130            next if  $dir =~ m/CMakeFiles/;
131            my ($cat) = ($dir =~ m/.*\/(.+)(\.svg|\.png)?$/ );
132#           print "$cat\t$dir\n";
133            $top_categories{$cat}++;
134        }
135        my @top_categories;
136        @top_categories = (sort keys %top_categories);
137        my $cat_count=1;
138        for my $top_level ( @top_categories ) {
139            $html_head .= "     <li><a href=\"\#$top_level\">$top_level</a></li>\n";
140            $html_head .= "\n   </font></ul></td><td valign=\"top\"><ul><font size=\"-2\">\n" 
141                unless $cat_count++ % 5;
142        }
143        $html_head .= "</font></ul>\n";
144        $html_head .= "</td></tr></table>\n";
145        $html_head .= "</td>\n";
146    }
147
148    $html_head .= "\n";
149    $html_head .= "<td valign=\"top\">\n";
150
151    # Links to other Versions
152    if (0) {
153        $html_head .= "\n";
154        $html_head .= "<table border=\"1\">\n";
155        $html_head .= "<td valign=\"top\">\n";
156        $html_head .= "<a href=\"overview.en.html\">Without License Info in English</a><br/>\n";
157        $html_head .= "<a href=\"overview.de.html\">Without License Info in German</a><br/>\n";
158        $html_head .= "</td>\n";
159        $html_head .= "</table>\n";
160    };
161   
162    $html_head .= "\n";
163        $html_head .= "</table>\n";
164
165
166    $html_head .= "</td>\n";
167    $html_head .= "</tr>\n";
168    $html_head .= "</table>\n";
169    $html_head .= "\n";
170    $html_head .= "\n";
171
172
173    $html_head .= "<table border=\"$opt_b\">\n";
174    $html_head .= "  <tr>";
175    $html_head .= "    <th>ID</th>" if $opt_j;
176    $html_head .= "    <th>Name</th>\n";
177    $html_head .= "    <th>Path</th>\n" if $opt_p;
178    my $cols_per_icon= 1;
179    $html_head .= "    <th colspan=\"".($cols_per_icon*scalar(@ALL_TYPES))."\">Icons</th>\n";
180    $html_head .= "    <th>Description</th>\n";
181    $html_head .= "    <th>OSM Condition</th>\n";
182    $html_head .= "  </tr>\n";
183    return $html_head;
184}
185
186# Header with a list of all types used in one <tr> line
187sub all_type_header(){
188    my $all_type_header= "<tr>";
189    $all_type_header .= "<td></td>" if $opt_j;
190    $all_type_header .= " <td></td>";
191    $all_type_header .= " <td></td>\n" if $opt_p;
192    for my $type ( @ALL_TYPES  ) {
193        my $txt=$type;
194        $txt=~s/\.$//;
195        $txt=~s/\./<br>/;
196        $all_type_header .= " <td  valign=\"top\"><font size=\"-3\">$txt</font></td>\n";
197    }
198    $all_type_header .= " <td></td>\n";
199    $all_type_header .= " <td></td>\n";
200    $all_type_header .= " <td></td>\n";
201    $all_type_header .= " </tr>\n\n";
202    return $all_type_header;
203}
204
205#####################################################################
206#
207#  Update HTML Overview of available Icons and POI-Types
208#
209#
210sub update_overview($$$){
211    my $type = shift;
212    my $lang  = shift || 'en';
213    my $rules = shift;
214    my $file_html = "$base_dir/${opt_P}_${type}.${lang}.html";
215
216    print STDOUT "----- Updating HTML Overview '$file_html' -----\n";
217   
218    my %out;
219
220    my $ID_SEEN={};
221    for my $rule (@{$rules}) {
222        my $content = '';
223        my $name = $rule->{v};
224        my $id = $name;
225        if ( $type ne "all" ) {
226            next if ( $rule->{k} ne $type && $name =~ m/\./)
227        }
228        print "name: '$name'\n" if $VERBOSE;
229        if ( ! $name ) {
230            warn "Undefined Name\n";
231            warn Dumper(\$rule);
232            next;
233        }
234        my $restricted = $rule->{'restricted'};
235
236        if ( $id && defined($ID_SEEN->{$id}) && "$ID_SEEN->{$id}" ){
237            die "$id was already seen at $ID_SEEN->{$id}. Here in $name\n";
238        };
239        $ID_SEEN->{$id}=$name;
240
241        if ( $restricted && not $opt_r ){
242            next;
243        }
244
245        my $title='';
246        for my $t ( @{$rule->{'title'}||[]} ){
247            $title = $t->{content}
248            if $t->{'lang'} eq $lang && $t->{content};
249        }
250       
251        my $descr ='';
252        for my $d (@{$rule->{'description'}}) {
253            my $c = $d->{content};
254            if ($d->{'lang'} eq $lang && $c) {
255                $descr = '<span class="desc">&nbsp;&nbsp;'.$c.'</span>';
256            }
257        }
258       
259        my $conditions='';
260        for my $c (@{$rule->{'condition'}}) {
261            next if $c->{k} eq "poi";
262            $conditions .= "$c->{k}=$c->{v}<br>";
263        }
264
265        for my $c2 (@{$rule->{'condition_2nd'}}) {
266            next if $c2->{k} eq "poi";
267            $conditions .= " + $c2->{k}=$c2->{v}<br>";
268        }
269
270        for my $c3 (@{$rule->{'condition_3rd'}}) {
271            next if $c3->{k} eq "poi";
272            $conditions .= " ++ $c3->{k}=$c3->{v}<br>";
273        }
274
275
276        my $icon = $name;
277        my $ind = $name;
278
279        # accentuate base categories
280        my $header_line=0;
281        if ($id !~ m/\./ || ( $icon !~ m,\.,) ) {
282            $content .= "  <tr><td>&nbsp;</td></tr>\n";
283            $content .=     all_type_header();
284            $content .= "  <tr class=\"id\">\n";
285            $content .= "     <td class=\"id\">$id</td>\n" if $opt_j;
286            $content .= "     <td>&nbsp;<a name=\"$name\">$name</a></td>\n";
287            $header_line++;
288        } else {
289            my $level = ($icon =~ tr,\.,/,);
290            my $html_space = '';
291            while ($level)
292            { $html_space .='&nbsp;&nbsp;&nbsp;&nbsp;&rsaquo;&nbsp;'; $level--; };
293            $name =~ s,.*\.,,g;
294            $content .= "<tr>\n";
295            $content .= "    <td class=\"id\">$id</td>" if $opt_j;
296            $content .= "    <td>&nbsp;$html_space$name</td>\n";
297        }
298
299        # Add filename+path column
300        $content .= "<td><font size=-4>$icon</font></td>\n" 
301            if $opt_p;
302
303        # display all icons
304        for my $type ( @ALL_TYPES  ) {
305            my $icon_s = "${type}/$icon.svg";
306            my $icon_p = "${type}/$icon.png";
307            my $icon_t = "${type}-png/${icon}.png";
308            my $class = $type;
309            $class =~ s/\./_/g;
310
311            my $icon_path_current;
312            if ( -s "$base_dir/$icon_t" ) { $icon_path_current = $icon_t; }
313            else {              $icon_path_current = $icon_p;   };
314
315            my $svn_bgcolor='';
316           
317            $content .=  "    <td ";
318            my $empty= ! ( -s "$base_dir/$icon_p" or -s "$base_dir/$icon_s");
319            if ( $empty ) { # exchange empty or missing icon files with a char for faster display
320                $content .=  " class=\"empty\" " unless $header_line;
321            } elsif ( $restricted && not $opt_r ){
322                $content .=  " class=\"empty\" " unless $header_line;
323            } else {
324                $content .=  " class=\"icon\" " unless $header_line;
325            }
326
327            # -------------- Add license Information Part 1
328            my $license='';
329            my $lic_color=' ';
330            my $lic_bgcolor=' ';
331
332            $content .=  " >";
333
334
335            if ( $empty ) { # exchange empty or missing icon files with a char for faster display
336                $content .=  ".";
337            } elsif ( $restricted && not $opt_r ){
338                $content .=   "r";
339            } else {
340                if ( -s "$base_dir/$icon_path_current" ){
341                    $content .= "     <a href=\"$icon_path_current\" >\n";
342                    $content .= "                 <img title=\"$name\" src=\"$icon_path_current\" class=\"$class\" alt=\"$name\" />";
343                    $content .= "</a>";
344                }
345            }
346            $content .= "</td>\n";
347
348        }
349        $content .= "    <td>$title<br>$descr</td>\n";
350        $content .= "    <td><font size=-1>$conditions</font></td>\n";
351        $content .= "  </tr>\n";
352        $out{$ind} = $content;
353    } 
354
355    # create backup of old overview.html
356
357    my $fo = IO::File->new(">$file_html");
358    $fo ||die "Cannot write to '$file_html': $!\n";
359    $fo->binmode(":utf8");
360    print $fo html_head($type,$lang);
361    # sorted output
362    foreach ( sort keys(%out) )  {
363        print $fo $out{$_};
364    }
365
366    print $fo "</table>\n";
367    if ( $opt_i ) {
368        print $fo "<h3>Incomming Directories</h3>\n";
369       
370        for my $theme ( @ALL_TYPES ) {
371            my $ext = "png";
372            $ext = "svg" if $theme =~ m/svg|japan/;
373            print $fo "<br>\n";
374            print $fo "Incomming for $theme\n";
375            print $fo "<table border=\"1\">\n";
376            print $fo "<tr>\n";
377            my $count=0;
378            print STDERR "glob($theme/incomming/*.$ext)\n";
379            for my $icon ( glob("$theme/incomming/*.$ext" ) ){
380                print STDERR "$icon\n" if $VERBOSE;
381                my $name = $icon;
382                $name =~ s/.*\/incomming\///;
383                $name =~ s/\.(svg|png)$//;
384                my $icon_t = $icon;
385                $icon_t =~ s/\//-png\//;
386                $icon_t =~ s/\.svg/\.png/;
387                print STDERR "thumb: $icon_t\n" if $VERBOSE;
388                $icon_t = $icon unless -s $icon_t;
389                my $content = "     <a href=\"$icon_t\" >";
390                $content .= "         <img alt=\"$icon\" title=\"$icon\" src=\"$icon_t\" />";
391                $content .= "<br/>$name\n";
392                $content .= "</a>\n";
393                print $fo "    <td>$content</td>";
394
395                if ( $count++ > 5) {
396                    $count=0;
397                    print $fo "</tr><tr>\n";
398                }
399            }
400            print $fo "</tr>\n";
401            print $fo "</table>\n";
402
403        }
404    }
405
406
407    print $fo "\n</body>\n</html>";
408    $fo->close();
409    return;
410
411}
412
413
414__END__
415
416
417=head1 SYNOPSIS
418 
419create_overview.pl [-h] [-v] [-i] [-r] [-s] [-F XML-FILE] [-D DIR] [-P FILENAME_PREFIX]
420 
421=head1 OPTIONS
422 
423=over 2
424 
425=item B<--h>
426
427Show this help
428
429=item B<-F> XML-FILE
430
431Set file, that holds all the necessary icon and poi_type information.
432The default file is 'icons.xml'.
433
434=item B<-D> DIRECTORY
435
436The directory to search for the icons. Default it CWD (./)
437
438=item B<-v>
439
440Enable verbose output
441
442=item B<-i>
443
444Add incomming directory to the end of the
445overview.*.html file.
446
447=item B<-j>
448
449show internal gpsdrive-mysql id in html page
450
451=item B<-r>
452
453Include restricted icons in overview.html
454
455=item B<-p>
456
457Show path of Filename
458
459=item B<-b>
460
461Add Border to Table
462
463=item B<-L language>
464
465Update only this language. Default is en,de
466
467=item B<-P FILENAME-PREFIX>
468
469Use this for the filename Prefix. Default: overview
470
471=item B<-S SVN-BASE>
472
473Use the Directory  SVN-BASE as Base for determining SVN Status
474
475=back
Note: See TracBrowser for help on using the repository browser.