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

Last change on this file since 4328 was 4195, checked in by joerg, 13 years ago

get a pale yellow background for the html page to better see if a icon
has white speces

  • Property svn:executable set to *
File size: 11.2 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".
127        "<head>\n".
128        "<meta http-equiv=\"Content-Type\" ".
129        "content=\"text/html; charset=utf-8\" />\n".
130        "\n".
131        "<title>Available POI-Types in gpsdrive</title>\n".
132        "<style type=\"text/css\">\n".
133        "       table            { width:100%;  background-color:#fff8B2; }\n".
134        "       tr               { border-top:5px solid black; }\n".
135        "       tr.id            { background-color:#6666ff; color:white; font-weight:bold; }\n".
136        "       td.id            { text-align:right; }\n".
137        "       td.icon          { text-align:center;}\n".
138        "       td.empty         { text-align:center; height:32px; }\n".
139        "       img.square_big   { width:32px; height:32px; }\n".
140        "       img.square_small { width:16px; height:16px; }\n".
141        "       img.classic      { max-height:32px; }\n".
142        "       img.svg          { max-height:32px; }\n".
143        "       img.japan        { max-height:32px; }\n".
144        "       span.desc        { font:x-small italic condensed }\n".
145        "</style>\n".
146        "</head>\n";
147    $html_head .= "<body>\n";
148    $html_head .= "<table border=\"$opt_b\">\n";
149    $html_head .= "  <tr>";
150    $html_head .= "    <th>ID</th>" if $opt_j;
151    $html_head .= "    <th>Name</th>\n";
152    $html_head .= "    <th>Path</th>\n" if $opt_p;
153    $html_head .= "    <th colspan=\"".(scalar(@ALL_TYPES))."\">Icons</th>\n";
154    $html_head .= "    <th>Description</th>\n";
155    $html_head .= "    <th>condition</th>\n";
156    $html_head .= "  </tr>\n";
157    return $html_head;
158}
159
160# Header with a list of all types used in one <tr> line
161sub all_type_header(){
162    my $all_type_header= "<tr>";
163    $all_type_header .= "<td></td>" if $opt_j;
164    $all_type_header .= " <td></td>";
165    $all_type_header .= " <td></td>\n" if $opt_p;
166    for my $type ( @ALL_TYPES  ) {
167        my $txt=$type;
168        $txt=~s/\.$//;
169        $txt=~s/\./<br>/;
170        $all_type_header .= "  <td align=\"top\"><font size=\"-3\">$txt</font></td>\n";
171    }
172    $all_type_header .= " <td></td>\n";
173    $all_type_header .= " <td></td>\n";
174    $all_type_header .= " <td></td>\n";
175    $all_type_header .= " </tr>\n\n";
176    return $all_type_header;
177}
178
179#####################################################################
180#
181#  Update HTML Overview of available Icons and POI-Types
182#
183#
184sub update_overview($$){
185    my $lang  = shift || 'en';
186    my $rules = shift;
187    my $file_html = "$base_dir/overview.$lang.html";
188
189    print STDOUT "----- Updating HTML Overview '$file_html' -----\n";
190   
191    my %out;
192
193    my $ID_SEEN={};
194    for my $rule (@{$rules}) {
195        #print Dumper(\$rule);
196        my $content = '';
197        my $id = $rule->{'geoinfo'}->{'poi_type_id'};
198        my $nm = $rule->{'geoinfo'}->{'name'};
199        my $restricted = $rule->{'geoinfo'}->{'restricted'};
200
201        if ( $ID_SEEN->{$id} ){
202            die "$id was already seen at $ID_SEEN->{$id}. Here in $nm\n";
203        };
204        $ID_SEEN->{$id}=$nm;
205
206        if ( $restricted && not $opt_r ){
207            next;
208        }
209
210        my $title='';
211        for my $t ( @{$rule->{'title'}||[]} ){
212            $title = $t->{content}
213            if $t->{'lang'} eq $lang && $t->{content};
214        }
215       
216        my $descr ='';
217        for my $d (@{$rule->{'description'}}) {
218            my $c = $d->{content};
219            if ($d->{'lang'} eq $lang && $c) {
220                $descr = '<span class="desc">&nbsp;&nbsp;'.$c.'</span>';
221            }
222        }
223       
224        my $conditions='';
225        for my $c (@{$rule->{'condition'}}) {
226            next if $c->{k} eq "poi";
227            $conditions .= "$c->{k}=$c->{v}<br>";
228        }
229
230        my $icon = $nm;
231        my $ind = $nm;
232
233        # accentuate base categories
234        my $header_line=0;
235        if ($id <= $poi_reserved || ( $icon !~ m,\.,) ) {
236            $content .= "  <tr><td>&nbsp;</td></tr>\n";
237            $content .=     all_type_header();
238            $content .= "  <tr class=\"id\">\n";
239            $content .= "     <td class=\"id\">$id</td>\n" if $opt_j;
240            $content .= "     <td>&nbsp;$nm</td>\n";
241            $header_line++;
242        } else {
243            my $level = ($icon =~ tr,\.,/,);
244            my $html_space = '';
245            while ($level)
246            { $html_space .='&nbsp;&nbsp;&nbsp;&nbsp;&rsaquo;&nbsp;'; $level--; };
247            $nm =~ s,.*\.,,g;
248            $content .= "<tr>\n";
249            $content .= "    <td class=\"id\">$id</td>" if $opt_j;
250            $content .= "    <td>&nbsp;$html_space$nm</td>\n";
251        }
252
253        # Add filename+path column
254        $content .= "<td><font size=-4>$icon</font></td>\n" 
255            if $opt_p;
256
257        # display all icons
258        for my $type ( @ALL_TYPES  ) {
259            my $icon_s = "${type}/$icon.svg";
260            my $icon_p = "${type}/$icon.png";
261            my $icon_t = "${type}_tn/${icon}.png";
262            my $class = $type;
263            $class =~ s/\./_/g;
264
265            my $icon_path_current;
266            if ( -s "$base_dir/$icon_t" ) { $icon_path_current = $icon_t; }
267            else {              $icon_path_current = $icon_p;   };
268            my $icon_path_svn=$icon_path_current;
269            $icon_path_svn =~ s,/([^/]+)\.(...)$,/.svn/text-base/$1.$2.svn-base,;
270
271            my $svn_bgcolor='';
272            my $status_line = $SVN_STATUS->{$icon_s};
273            $status_line ||= $SVN_STATUS->{$icon_p};
274            $status_line ||= '';
275            my ($status,$rev,$rev_ci,$user,$file) =
276                (split(/,/, $status_line),('')x5);
277            $status_line = " $status  $user $rev_ci";
278            #$status_line =~ s/guenther/g/;
279            #$status_line =~ s/joerg/j/;
280            #$status_line =~ s/ulf/u/;
281            #$status_line =~ s/$SVN_VERSION//;
282            $status_line ="<font size=\"-3\">$status_line</font><br>" if $status_line;
283           
284            print STDERR "svn_status($icon_p): $status\n" if $VERBOSE;
285            if ( $status eq "" ) {
286                if ( -$icon_path_svn # Im original svn Verzeichnis
287                     || -s "$icon_s"
288                     || -s "$icon_p"
289                     || -s "$icon_t"
290                     ) {
291                    $svn_bgcolor='';
292                } else {
293                    $svn_bgcolor=' bgcolor="#E5E5E5" ';
294                }
295            } elsif ( $status eq "_" ) { 
296                $svn_bgcolor='';
297            } elsif ( $status eq "?" ) { 
298                $svn_bgcolor=' bgcolor="blue" ';
299            } elsif ( $status eq "M" ){
300                $svn_bgcolor=' bgcolor="green" ';
301            } elsif ( $status eq "D" ){
302                $svn_bgcolor=' bgcolor="red" ';
303            } else {
304                $svn_bgcolor=' bgcolor="red" ';
305            }
306           
307            $content .=  "    <td ";
308            my $empty= ! ( -s "$base_dir/$icon_p" or -s "$base_dir/$icon_s");
309            if ( $empty && ! $status  ){
310                $svn_bgcolor='';
311            }
312            if ( $empty ) { # exchange empty or missing icon files with a char for faster display
313                $content .=  " class=\"empty\" " unless $header_line;
314                $content .=  $svn_bgcolor;
315                $content .=  " >";
316            } elsif ( $restricted && not $opt_r ){
317                $content .=  " class=\"empty\" " unless $header_line;
318                $content .=  $svn_bgcolor;
319                $content .=  " >";
320            } else {
321                $content .=  " class=\"icon\" " unless $header_line;
322                $content .= $svn_bgcolor;
323                $content .=  " >";
324            }
325
326            if ( $opt_s && $status ) {
327                $content .= "     $status_line" if $opt_n;
328                $content .= "    <img src=\"$icon_path_svn\" /> -->" 
329                    if -s $icon_path_svn && $status =~ "M|D";
330            }
331            if ( $empty ) { # exchange empty or missing icon files with a char for faster display
332                $content .=  ".";
333            } elsif ( $restricted && not $opt_r ){
334                $content .=   "r";
335            } else {
336                $content .= "     <img src=\"$icon_path_current\" class=\"$class\" alt=\"$nm\" />"
337                    if -s "$base_dir/$icon_path_current";
338            }
339
340            $content .= "</td>\n";
341        }
342        $content .= "    <td>$title<br>$descr</td>\n";
343        $content .= "    <td><font size=-1>$conditions</font></td>\n";
344        $content .= "  </tr>\n";
345        $out{$ind} = $content;
346    } 
347
348    # create backup of old overview.html
349    move("$file_html","$file_html.bak")
350        or die (" Couldn't create backup file!")
351        if (-e $file_html);
352
353    my $fo = IO::File->new(">$file_html");
354    $fo ||die "Cannot write to '$file_html': $!\n";
355    $fo->binmode(":utf8");
356    print $fo html_head();
357    # sorted output
358    foreach ( sort keys(%out) )  {
359        print $fo $out{$_};
360    }
361    print $fo "</table>\n</body>\n</html>";
362    $fo->close();
363    return;
364
365}
366
367
368__END__
369
370
371=head1 SYNOPSIS
372 
373update_icons.pl [-h] [-v] [-i] [-r] [-s] [-f XML-FILE]
374 
375=head1 OPTIONS
376 
377=over 2
378 
379=item B<--h>
380
381 Show this help
382
383=item B<-F> XML-FILE
384
385 Set file, that holds all the necessary icon and poi_type information.
386 The default file is 'icons.xml'.
387
388=item B<-D> DIRECTORY
389
390 The directory to search for the icons. Default it ./
391
392=item B<-v>
393
394 Enable verbose output
395
396=item B<-i>
397
398 Include incomming directory in icons.xml and overview.html
399
400    not working yet
401
402=item B<-j>
403
404    show internal id in html page
405
406=item B<-r>
407
408 Include restricted icons in overview.html
409
410=item B<-p>
411
412 Show path of Filename
413
414=item B<-b>
415
416 Show Border in Table
417
418=item B<-s>
419
420 add svn status to overview
421    grey is missing in svn
422    green is modified
423    red is any other condition
424 this also shows the old and new icon if it is found in the
425 .svn/ directory
426
427=item B<-n>
428    show the svn revision numbers and user too
429    needs option -s to work
430
431=back
Note: See TracBrowser for help on using the repository browser.