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

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

rename jp to japan

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