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

Last change on this file since 30786 was 22607, checked in by bastik, 9 years ago

fixed mime type; added option to use absolute links to osm trac for images

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