User talk:Ignatus/Namespace map

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.';<>

--Ignatus (talk) 21:49, 1 February 2014 (UTC)Reply

Return to the user page of "Ignatus/Namespace map".