9 use Test::More qw(no_plan);
 
  10 use YAML::XS qw(Dump);
 
  14 update-wiki-pages - Scrape the wiki for key/value wiki description pages
 
  18     perl script/misc/update-wiki-pages config/wiki_pages.yml 
 
  22     prove -e 'perl script/misc/update-wiki-pages' config/wiki_pages.yml
 
  26 # Get the command-line options
 
  27 Getopt::Long::Parser->new(
 
  28     config => [ qw< bundling no_ignore_case no_require_order pass_through > ],
 
  30     'h|help' => \my $help,
 
  36 my $out_file = $ARGV[0];
 
  37 $out_file //= 'config/wiki_pages.yml';
 
  39 help() unless -f $out_file;
 
  42 my $mw = MediaWiki::API->new();
 
  43 ok($mw, "Got a MediaWiki API");
 
  44 $mw->{config}->{api_url} = 'https://wiki.openstreetmap.org/w/api.php';
 
  45 $mw->{config}->{retries} = 5;
 
  46 $mw->{config}->{retry_delay} = 30;
 
  49 my (%feature, %count);
 
  51 # This is what you get on:
 
  52 ## http://wiki.openstreetmap.org/w/index.php?search=Template:KeyDescription&fulltext=Search&fulltext=Search
 
  53 for my $lang ('', map { "${_}:" } qw[ Pt Fi De It HU Cz Fr RU Pl ]) {
 
  54     ok(1, "  Templates for language '$lang'");
 
  57     ok(1, "    Getting key pages");
 
  58     my $cnt = stick_content_in_hash("key", "Template:${lang}KeyDescription", \%feature);
 
  59     $cnt += stick_content_in_hash("key", "Template:${lang}Feature", \%feature);
 
  60     ok(1, "    Got $cnt key pages");
 
  64     ok(1, "    Getting key prefix pages");
 
  65     $cnt = stick_content_in_hash("key", "Template:${lang}KeyPrefixDescription", \%feature);
 
  66     ok(1, "    Got $cnt key prefix pages");
 
  67     $count{keyprefix} += $cnt;
 
  70     ok(1, "    Getting value pages");
 
  71     $cnt = stick_content_in_hash("tag", "Template:${lang}ValueDescription", \%feature);
 
  72     ok(1, "    Got $cnt value pages");
 
  73     $count{value} += $cnt;
 
  76 ok(1, "Got a total of $count{$_} ${_}s") for qw[ key keyprefix value ];
 
  79 open my $out, ">", $out_file or die "Can't open file '$out_file' supplied on the command line";
 
  80 say $out "# THIS FILE IS AUTOGENERATED WITH THE script/misc/update-wiki-pages";
 
  81 say $out "# PROGRAM DO NOT MANUALLY EDIT IT";
 
  83 say $out Dump(\%feature);
 
  88 sub stick_content_in_hash
 
  90     my ($key, $title, $hash) = @_;
 
  91     my $ukey = ucfirst $key;
 
  93     my $space_to_underscore = sub {
 
 101     my $process_link = sub {
 
 104         ok(1, "    ... got $count links") if $count % 200 == 0;
 
 105         my $title = $link->{title};
 
 108         if ($title =~ /^$ukey:(?<key_name>.*?)$/) {
 
 111             $key_name = $space_to_underscore->($+{key_name});
 
 112         } elsif ($title =~ /^(?<lang>[^:]+):$ukey:(?<key_name>.*?)$/) {
 
 114             $key_name = $space_to_underscore->($+{key_name});
 
 116         if ($lang && !exists($hash->{$lang}->{$key}->{$key_name})) {
 
 117             $hash->{$lang}->{$key}->{$key_name} = $title;
 
 125             $process_link->($link);
 
 130                     $process_link->($link) if exists($link->{redirect});
 
 141     my $callback = shift;
 
 143     for my $link (@$links) {
 
 150     my ($title, $callback) = @_;
 
 151     my $articles = $mw->list(
 
 154             list => 'embeddedin',
 
 156             eifilterredir => 'nonredirects',
 
 157             # Doesn't work for De:* and anything non-en. Odd.
 
 158             # einamespace => '0|8',
 
 163             hook => sub { process_list($callback, @_) },
 
 166     ) || die $mw->{error}->{code} . ': ' . $mw->{error}->{details};
 
 171     my ($title, $callback) = @_;
 
 172     my $articles = $mw->list(
 
 177             blfilterredir => 'redirects',
 
 178             # Doesn't work for De:* and anything non-en. Odd.
 
 179             # einamespace => '0|8',
 
 184             hook => sub { process_list($callback, @_) },
 
 187     ) || die $mw->{error}->{code} . ': ' . $mw->{error}->{details};
 
 194     Pod::Usage::pod2usage(
 
 195         -verbose => $arg{ verbose },
 
 196         -exitval => $arg{ exitval } || 0,