source: subversion/applications/utils/tagwatch/tagwatch.pl @ 26137

Last change on this file since 26137 was 26137, checked in by Dirk Stoecker, 8 years ago

fix tagwatch a little bit

  • Property svn:executable set to *
File size: 7.4 KB
Line 
1#!/usr/bin/perl -I .
2#-----------------------------------------------------------------
3# Creates pages describing the tagging schemes in use within
4# OpenStreetmap
5#-----------------------------------------------------------------
6# Usage: perl tagwatch.pl
7# Will create an ./html/ directory and fill it with HTML files
8# Uses input from http://wiki.openstreetmap.org/index.php/Tagwatch/*
9# and other OSMwiki pages
10#-----------------------------------------------------------------
11# This file is part of Tagwatch
12# Tagwatch is free software: you can redistribute it and/or modify
13# it under the terms of the GNU General Public License as published by
14# the Free Software Foundation, either version 3 of the License, or
15# (at your option) any later version.
16#
17# Tagwatch is distributed in the hope that it will be useful,
18# but WITHOUT ANY WARRANTY; without even the implied warranty of
19# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
20# GNU General Public License for more details.
21#
22# You should have received a copy of the GNU General Public License
23# along with Tagwatch.  If not, see <http://www.gnu.org/licenses/>.
24#---------------------------------------------------------------
25
26use strict;
27use libs::getWikiTags;
28use libs::getPhotos;
29use libs::getWikiSettings;
30use libs::processOSMFiles;
31use libs::constructHTMLStats;
32use libs::makeRenderSamples;
33use LWP::Simple;
34use encoding 'utf8', STDERR => 'utf8';
35 
36my $configfile = "tagwatch.conf";
37
38foreach my $arg (@ARGV)
39{
40  $configfile = $1 if($arg =~ /^config_file=(.+)$/);
41}
42
43print "read config ...\n";
44my %Config = ReadConfig($configfile);
45
46foreach my $arg (@ARGV)
47{
48  $Config{$1} = $2 if($arg =~ /^(.+)=(.+)$/);
49}
50
51my @urls;
52foreach my $key (sort keys %Config)
53{
54        push(@urls, $Config{$key}) if $key =~ /^osmDownloadUrl/ && $Config{$key};
55}
56print "\n++++++++++++++++++++++++++++++++++++++++++++\n";
57if(!@urls)
58{
59        print "+ use previous downloaded osm files ...\n";
60}
61else
62{
63        print "+ download osm files ...\n";
64        getOSMFiles($Config{'osmfile_folder'}, @urls);
65}
66
67print "\n++++++++++++++++++++++++++++++++++++++++++++\n";
68if($Config{'use_WikiTag_Cache'} eq "yes")
69{
70        print "+ use cached wiki descriptions ...\n";
71}
72else
73{
74        print "+ get Tag description from the wiki ...\n";
75        buildWikiTagCache(%Config);
76}
77
78print "\n++++++++++++++++++++++++++++++++++++++++++++\n";
79if($Config{'use_Photo_Cache'} eq "yes")
80{
81        print "+ use cached photos ...\n";
82}
83else
84{
85        print "+ get photos from the wiki ...\n";
86        getPhotos(%Config);
87}
88
89print "\n++++++++++++++++++++++++++++++++++++++++++++\n";
90if($Config{'use_WikiSettings_Cache'} eq "yes")
91{
92        print "+ use cached wiki settings ...\n";
93}
94else
95{
96        print "+ get Tagwatch settings from the wiki ...\n";
97        buildWikiSettingsCache(%Config);
98}
99
100print "\n++++++++++++++++++++++++++++++++++++++++++++\n";
101if($Config{'use_OSMFile_Cache'} eq "yes")
102{
103        print "+ use cached OSM files ...\n";
104}
105else
106{
107        print "+ process OSM files ...\n";
108        processOSMFiles(%Config);
109}
110
111print "\n++++++++++++++++++++++++++++++++++++++++++++\n";
112print "create html files ...\n";
113constructHTML(%Config);
114
115print "\n++++++++++++++++++++++++++++++++++++++++++++\n";
116if($Config{'use_TagSample_Cache'} eq "yes")
117{
118        print "+ use cached tag sample files ...\n";
119}
120else
121{
122        print "+ create tag sample files ...\n";
123        renderExamples(%Config);
124}
125
126print "\n++++++++++++++++++++++++++++++++++++++++++++\n";
127if($Config{'delete_OsmFiles'} eq "yes")
128{
129        print "+ delete osm source files ...\n";
130        my $deleteIt = sprintf("rm -f -R %s", $Config{'osmfile_folder'});
131        system($deleteIt);
132}
133
134#--------------------------------------------------------------------------
135# Reads the tagwatch config file, returns a hash array
136#--------------------------------------------------------------------------
137sub ReadConfig {
138        my ($Filename) = @_;
139        my %Config;
140
141        open(my $fp,"<$Filename") || die("Can't open \"$Filename\" ($!)\n");
142
143        while(my $Line = <$fp>)
144        {
145            $Line =~ s/#.*$//; # Comments
146            $Line =~ s/\s*$//; # Trailing whitespace
147
148            if($Line =~ m{
149                        ^
150                        \s*
151                        ([A-Za-z0-9._-]+) # Keyword: just one single word no spaces
152                        \s*            # Optional whitespace
153                        =              # Equals
154                        \s*            # Optional whitespace
155                        (.*)           # Value
156                        }x)
157            {
158                # Store config options in a hash array
159                $Config{$1} = $2;
160            }
161        }
162        close $fp;
163
164
165    if($Config{basedir})
166    {
167        foreach my $folder (keys %Config)
168        {
169            next if !($folder =~ /_folder$/);
170            $Config{$folder} = "$Config{basedir}/$Config{$folder}";
171        }
172        system "mkdir -p $Config{basedir}" if ! -d $Config{basedir};
173    }
174    return %Config;
175}
176
177#--------------------------------------------------------------------------
178# Downloads the osm files from the url specified in the conf file
179# unzip it afterwards.
180#--------------------------------------------------------------------------
181sub getOSMFiles
182{
183        my ($Folder, @Urls) = @_;
184
185        my %usefiles;
186        foreach my $key (sort keys %Config)
187        {
188                $usefiles{$Config{$key}} = 1 if $key =~ /^osmDownloadFile/ && $Config{$key};
189        }
190
191        mkdir $Folder if ! -d $Folder;
192
193        my %files;
194        if(open(FILELIST,"<","$Folder/filelist.txt"))
195        {
196                while(my $line = <FILELIST>)
197                {
198                        chomp($line);
199                        my ($name, $date) = split (/\|/,$line);
200                        $files{$name} = $date;
201                }
202                close FILELIST;
203        }
204
205        open(FILELIST,">","$Folder/filelist.txt");
206        my $new = 0;
207        foreach my $Url (@Urls)
208        {
209                if($Url =~ /^\//)
210                {
211                        my $files = `find '$Url' -maxdepth 1 -type f -printf '%f|%TY-%Tm-%Td %TH:%TM\n'`;
212                        foreach my $file (sort split"\n", $files)
213                        {
214                                $file =~ s/(.*)\|(.*)//;
215                                my $Date = $2;
216                                my $FileName = $1;
217                                my $usename = $FileName;
218                                next if (!($FileName =~ /\.osm/)) || ($FileName =~ /\.md5/) || ($FileName =~ /\.pbf/);
219                                # strip date
220                                $usename =~ s/-\d+(\.osm.*)$/$1/;
221                                next if %usefiles && !$usefiles{$usename};
222
223                                $usename =~ s/.bz2// if($Config{'extract_OsmFiles'} eq "yes");
224
225                                if(!$files{$usename} || $files{$usename} ne $Date)#
226                                {
227                                        system "ln -sf '$Url/$FileName' '$Folder/$usename'";
228                                        ++$new;
229                                        if($Config{'extract_OsmFiles'} eq "yes")
230                                        {
231                                                system("bunzip2 $Folder/$FileName");
232                                        }
233                                }
234                                delete $files{$usename};
235                                print FILELIST "$usename|$Date\n";
236                        }
237                        next;
238                }
239                foreach my $Line (split("\n",get($Url)))
240                {
241                        if($Line =~ m{(.*)<a href="(.*).osm.bz2">(.*)</a></td><td align="right">(.*?) *</td>(.*)<td align="right">(.*)}
242                        || $Line =~ m{(.*)<a href="(.*).osm.bz2">(.*)</a>  +(.*? \d\d:\d\d)})
243                        {
244                                my $Date = $4;
245                                my $FileName = $3;
246                                my $usename = $FileName;
247                                next if %usefiles && !$usefiles{$usename};
248
249                                $usename =~ s/.bz2// if($Config{'extract_OsmFiles'} eq "yes");
250
251                                if(!$files{$usename} || $files{$usename} ne $Date)#
252                                {
253                                        system("wget --no-verbose --directory-prefix=$Folder \"$Url$FileName\"");
254                                        ++$new;
255                                        if($Config{'extract_OsmFiles'} eq "yes")
256                                        {
257                                                system("bunzip2 $Folder/$FileName");
258                                        }
259                                }
260                                delete $files{$usename};
261                                print FILELIST "$usename|$Date\n";
262                        }
263                }
264        }
265        die "Nothing changed\n" if !$new && $Config{'die_when_unchanged'} eq "yes";
266
267        if($Config{'delete_OldOsmFiles'} eq "yes")
268        {
269                foreach my $file (keys %files)
270                {
271                        unlink("$Folder/$file");
272                }
273        }
274        close FILELIST;
275}
Note: See TracBrowser for help on using the repository browser.