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

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

separate createion ov html files and creation of thumbnails out from update_icons.pl

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