User:Bikabot/Source/pass1.pl

use strict; use encoding "utf8"; use Perlwikipedia; use Encode;
 * 1) !/usr/bin/perl -w -C

my $user = 'Bikabot'; my $pass = '***'; my $editor = Perlwikipedia->new($user); $editor->{debug} = 1; $editor->login($user,$pass);

my $template = "Template:Infobox animanga/Header"; my @articles = $editor->what_links_here($template);

my $count; my $countmax; my $counttotal = scalar(@articles);

$| = 1; my $test = 0; # whether the current run is a dry run $countmax = $test? 75 : $counttotal;

my $trial = 1; # whether the current run is a trial run my $edits; my $editsmax; $editsmax = $trial? 100 : $counttotal;

my $waittime = 10; my $logpage = "User:Bikabot/Pass1". ($test? "Test" : ($trial? "Trial" : "")). "Log";

my %success; my %notag; my $report_several_headers; my $report_several_tags; my $report_unparsable_tag; my $report_unparsable_mangabox; my $report_correct; my $report_footer;

sub commit_delay { my $wait = $waittime; print "Waiting $wait seconds"; while( $wait-- ) { sleep 1; print "."; } print "\n"; }

sub commit_text { my $title = shift; my $text = encode_utf8( shift );

if( $test ) { return if rand(100) > 3;

$title = "User:Bikabot/$title"; $report_footer = "== Results committed to userspace ==\n" unless $report_footer; $report_footer .= "* $title.\n"; }   #$title = "User:Bikabot/$title" if $trial; #FIXME

my $r = $editor->edit( $title, $text,       "Bikabot Pass 1: fixing demographic tags. " .        "See User:Bikabot for details." ); print "Committing to $title. "; print $r->status_line; print "\n\n";

$edits++; commit_delay; }

sub commit_log { my @keys; my $report_success; my $report_notag; @keys = sort {$a <=> $b} keys %success; foreach my $c ( @keys ) { $report_success .= "\n=== Demographic tag copied to $c manga box(es) ===\n"; $report_success .= join '', @{ $success{$c} }; }   @keys = sort {$a <=> $b} keys %notag; foreach my $c ( @keys ) { $report_notag .= "\n=== Empty demographic tag added to $c manga box(es) ===\n"; $report_notag .= join '', @{ $notag{$c} }; }

my $dry = $test? ' (dry run)' : ($trial? ' (trial run)' : ''); my $report = <<"EOF"; Bikabot pass 1 report$dry.

Total number of relevant pages: $counttotal pages.

Done: $count/$countmax pages and $edits edits ($editsmax allowed).

Success
$report_success

No action required
$report_notag

Already in correct format
$report_correct

Pages with more than one animanga header
$report_several_headers

Pages with more than one demographic tags
$report_several_tags

Pages with possibly unparsable demographic tag
$report_unparsable_tag

Pages with unparsable mangabox
$report_unparsable_mangabox $report_footer EOF

$report = encode_utf8( $report ); my $r = $editor->edit( $logpage, $report,       "Bikabot pass 1 log$dry." ); print "Logging. "; print $r->status_line; print "\n\n"; }

sub change_mangaboxes { my $textref = shift; my $line = shift; my $logentries = shift; my $logline = shift;

if( $$textref =~ s/       ^({{Infobox\ animanga\/Manga.*?)        (\|\s*serialized)        /$1$line$2/msxg    ) { my $mangaboxes; while( $$textref =~ m//g ) { $mangaboxes++ } push @{ $logentries->{$mangaboxes} }, $logline; $$textref =~ s///sg; return $mangaboxes; }   else { if( $$textref =~ m/{{Infobox animanga\/Manga/ ) { $report_unparsable_mangabox .= $logline; return -1; }       else { push @{ $logentries->{'no'} }, $logline; return 0; }   } }

for my $hash (@articles) { last if ++$count > $countmax; last if $edits >= $editsmax;

my %hash = %{$hash}; next unless ( $hash{'type'} eq 'transclusion' );

my $commit = 0; my $title = $hash{'title'}; my $text = $editor->get_text($title);

my $reportline = "* $title.\n";

my $infoboxes = 0; while( $text =~ m/{{Infobox animanga\/Header/g ) { $infoboxes++; } if( $infoboxes > 1 ) { $report_several_headers .= $reportline; }   elsif( $text =~ s/        ({{Infobox\ animanga\/Header.*?)        (\|\s*demographic\s*=\s*([^\n]+)\n\s*)        (?=\|)/$1/sx    ) { my $demographicline = $2; my $demographic = $3; $reportline .= ":Demographics: $demographic.\n";

if( ($demographic =~ tr/[//) > 2 ) { $report_several_tags .= $reportline; }       elsif( $1 =~ m/{{Infobox animanga\/Manga/s ) { $report_correct .= $reportline; }       else { $commit = change_mangaboxes( \$text, $demographicline,               \%success, $reportline) >= 0; }   }    elsif( $text =~ m/demographic\s*=/ ) { $report_unparsable_tag .= $reportline; }   else { $commit = change_mangaboxes( \$text, "| demographic = \n",           \%notag, $reportline) > 0; }

print $reportline; commit_text( $title, $text ) if $commit; commit_log unless ( $count%50 ); }

$count--; commit_log;