User talk:Ignatus/Namespace map
Add topicAppearance
Latest comment: 10 years ago by Ignatus
Current page is collected at 2014-02-01 by the following script (see history for previous ones):
use strict;
use warnings;
use LWP::Simple;
use JSON;
use Encode;
sub getdata($@){
my ($x,@r)=shift;foreach my $o(@_){push @r, ($x=~/$o[^\w]*?=\s*(\d+)/g)};@r
};
# Настройки ботовода — проверьте совместимость!
my $prototype=qr/([\w_-]+\.wikipedia\.org)/;# включает testwiki
my $home = 'ru.wikipedia.org';# влияет на то, откуда получать список интервик, но не на языки
my $file_out = 'D:\\WP\\globnspaces2.txt';# путь до файла, куда сохранять
# Получаем список википедий
my $iwmap=from_json(get("https://$home/w/api.php?action=query&meta=siteinfo&siprop=interwikimap&sifilteriw=local&format=json"));
my (@wikis,%sites,%langs);
foreach ( @{ $iwmap->{query}->{interwikimap} } ){
if($_->{url} =~ $prototype){
unless( $_->{prefix} eq 'sep11' or $sites{$1} or !$_->{language} or $langs{$_->{language}}){
# фильтрация алиасов типа jp (=ja), sk=sl, также сбивает левые псевдовикипедии
push @wikis, [$_->{language}, $1, $_->{prefix}];
$langs{$_->{language}} = $sites{$1} = $_->{prefix}
}
}
};
# Смотрим пространства имён в каждом проекте
our(%info,@nstat, @nscol, @cn);
foreach(@wikis){
print encode cp866=>"$$_[0] ($$_[2])";
my $x=eval <<TERM or print (($@ or $!),"\n") and next;
from_json(get(
"https://$$_[1]/w/api.php?action=scribunto-console&title=Module:A&content=return{a=function()mw.logObject(mw.site.stats);for k,v in pairs(mw.site.namespaces)do if k~=0 then mw.log(table.concat({k,table.concat({v.name,unpack(v.aliases)},':'),v.canonicalName,mw.site.stats.pagesInNamespace(k)},'|'))end end end}&question=p.a()&format=json"
))->{print};
TERM
$x=~s/_/ /g;#проблема такая в алиасах у Lua
my (@ns,@ms);
while( $x=~/(\-?\d+)\|([^|]+)\|([^|]+)\|(\d+)/g ){
my ($id,$na,$cn,$pc) = ($1,$2,$3,$4);
if($id>0){
if(!$cn[$id] or $$_[2] eq 'ru'){$cn[$id]=$3};# Russian by default
$ns[$id] = join('<br/>',split ':',$na )."||$pc";
$nstat[$id]++
}else{ $ms[2+$id] = join('<br/>',split ':',$na) }
};
$info{$$_[2]}=[getdata($x,qw/pages articles activeUsers/),@ms,\@ns];
print encode cp866=>join "", map{$_ ? "$_\t" :''}(map{ref($_)?@$_:$_}@{$info{$$_[2]}}), "\n"
};
print "\n@nstat\n";
for(my $i=1;$i<=$#nstat;$i++){if($nstat[$i]){push @nscol,$i}};
open F,'>:utf8',$file_out;
print F (<<STOP,join ("\n",map{"!colspan=2|$_ ($nstat[$_])"}@nscol), "\n|-\n!", join('!!',map{($cn[$_]||"(\#$_)")."!!#"}@nscol));
{| class="wikitable sortable" style="text-align:center"
|-
!rowspan=2|Wiki
!rowspan=2|Pages
!rowspan=2|Articles
!rowspan=2|Active users
!rowspan=2|-2
!rowspan=2|-1
STOP
foreach(@wikis){
print F "\n|-\n|", join(
'||',#sep
"$$_[2]<br/>$$_[0]",@{$info{$$_[2]}}[0..4],#служебные поля
map{$_ or ' || '}@{$info{$$_[2]}[5]}[@nscol]#поля пространств
)
};
print F "\n|}";close F;print 'done.';<>