Replace.pl

Материал из Викиреальностя
Перейти к: навигация, поиск

Написан на языке программирования Perl.

Содержание

[править] Исходный код

binmode STDOUT, ':utf8';
 
use utf8;
use MediaWiki::API;
my $mw = MediaWiki::API->new({ api_url => 'http://wikireality.ru/w/api.php' });
$mw->login({ lgname => 'Моё имя', lgpassword => 'Мой пароль' }) || die;
 
$mw->list({
        action => 'query',
        list => 'allpages',
        apnamespace => 0, # Номер неймспейса (0 - статьи)
        apfilterredir => "nonredirects",
        aplimit => 5000
}, { hook => \&process_article, max => 999 });
 
our @MARKUP_HIDDEN = (); # Used by 'escape_wiki_syntax' below
 
sub process_article
{
        my($ref) = @_;
        foreach my $target(@$ref)
        {
                my $res = $mw->get_page($target);
                next if(!$res);
 
                my $text = $res->{'*'};
 
                escape_wiki_syntax(\$text); # Secure <nowiki>…</nowiki> etc.
                do_repl(\$text);
                unescape_wiki_syntax(\$text);
 
                if($text ne $res->{'*'})
                {
                        print "\t" . $target->{title}, "\n";
 
                        $mw->edit({
                                action => 'edit',
                                title => $target->{title},
                                text => $text,
                                minor => 1, # Малая правка
                                nocreate => 1, # Не создавать страницу
                                bot => 1, # Скрыть из свежих правок
                                timestamp => $res->{timestamp},
                                summary => "А это комментарий к правке!"
                        }, { skip_encoding => 1 }); # ВНИМАНИЕ: см. «Комментарии» ниже, №5.
                }
        }
}
 
# Вот тут, собственно, ваши автозамены.
sub do_repl
{
        my $p = shift;
 
        my $kolvo_moih_zamen = 0; 
 
        # Это основные замены бота, впишите сюда, что вам ещё нужно
        $kolvo_moih_zamen += ($$p =~ s/чего-то/что-то ещё/g); 
        $kolvo_moih_zamen += ($$p =~ s/ну и ещё что-то там/какую-то лабуду/g);
 
        if($kolvo_moih_zamen > 0) 
        { 
                # А тут общие регекспы: троеточия там, и т.п. 
                # Замены часто используемых специальных символов на символы Юникода
                $$p =~ s/\.\.\./…/g;
                $$p =~ s/\+\-/±/g;
 
                # Приведение окончаний в соответствии с рекомендациями
                $$p =~ s/(?<=[0-9%])\-ая/-я/g;
                $$p =~ s/(?<=[0-9%])\-(ы|о)й/-й/g;
                $$p =~ s/(?<=[0-9%])\-(ы|о)е/-е/g;
                $$p =~ s/(?<=[0-9%])\-(ы|о)м/-м/g;
                $$p =~ s/(?<=[0-9%])\-ых/-х/g;
                $$p =~ s/(?<=[0-9%])\-ью/-ю/g;
        }
}
 
 
sub escape_wiki_syntax
{
        my $text_p = shift;
 
        escape_hide_tag($text_p, 'nowiki');
        escape_hide_tag($text_p, 'pre');
        escape_hide_tag($text_p, 'source');
        escape_hide_tag($text_p, 'code');
        escape_hide_tag($text_p, 'tt');
        escape_hide_tag($text_p, 'math');
        escape_hide_tag($text_p, 'gallery');
        escape_hide($text_p, qr/^ .*/m);
        escape_hide($text_p, qr/(https?|ftp|news|nntp|telnet|irc|gopher):\/\/[^\s\[\]<>"]+ ?/i);
        escape_hide($text_p, qr/^#(redirect|перенапр(авление)?)/i);
}
sub escape_hide
{
        my($text_p, $regex) = @_;
        $$text_p =~ s/$regex/push @MARKUP_HIDDEN, $&; "\x01" . $#MARKUP_HIDDEN . "\x02"/eg;
}
sub escape_hide_tag
{
        my($text_p, $tag) = @_;
        my $regex = qr/<$tag( [^>]+)?>[\s\S]+?<\/$tag>/i;
 
        escape_hide($text_p, $regex);
}
sub unescape_wiki_syntax
{
        my $text_p = shift;
        while(@MARKUP_HIDDEN)
        {       
                my $regex = "\x01" . $#MARKUP_HIDDEN . "\x02";
                $$text_p =~ s/$regex/pop @MARKUP_HIDDEN;/eg;
        }
}

[править] Работа с файлом

Робот проводит автозамены во всех имеющихся статьях википроекта. Если вам надо использовать список статей из файла (по одному названию на строку), замените строки 5—11 на следующий код:

open F, "имя_файла.допустим_txt"; 
while(my $line = <F>) 
{ 
chomp $line; # Убирает перенос строки 
process_article([{ title => $line }]); 
} 
close F;

[править] Комментарии

  1. Понадобится модуль MediaWiki::API. В командной строке введите cpan MediaWiki::API, и он сам установится.
  2. Для ограничения бота совершением одной правки вставьте сразу после $mw->edit(...); строку die;.
  3. Запрос подтверждения (вставлять перед $mw->edit; этот код выключит бот, если вы наберёте с клавиатуры не строку, начинающуюся с y/Y):
my $yesno = <>;
die if(lc(substr($yesno, 0, 1)) ne 'y');
  1. Если в коде бота используется кириллица, в его начале необходимо добавить строку use utf8;.
  2. Если при тестовом запуске бота портятся страницы (стирается кириллица), попробуйте удалить из кода следующий фрагмент: «, { skip_encoding => 1 }».

[править] Ссылки

Replace.pl относится к теме «Техники и викиботы»   ±