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;
[править] Комментарии
- Понадобится модуль MediaWiki::API. В командной строке введите
cpan MediaWiki::API
, и он сам установится. - Для ограничения бота совершением одной правки вставьте сразу после
$mw->edit(...);
строкуdie;
. - Запрос подтверждения (вставлять перед
$mw->edit
; этот код выключит бот, если вы наберёте с клавиатуры не строку, начинающуюся с y/Y):
my $yesno = <>; die if(lc(substr($yesno, 0, 1)) ne 'y');
- Если в коде бота используется кириллица, в его начале необходимо добавить строку
use utf8;
. - Если при тестовом запуске бота портятся страницы (стирается кириллица), попробуйте удалить из кода следующий фрагмент: «
, { skip_encoding => 1 }
».
[править] Ссылки
- Как использовать модуль MediaWiki::API: http://search.cpan.org/~exobuzz/MediaWiki-API-0.34/lib/MediaWiki/API.pm
- Какие параметры можно получить из API: http://wikireality.ru/w/api.php?action=help
Replace.pl относится к теме «Техники и викиботы» |