Module:Show stats

From Wikidata
Jump to navigation Jump to search
Lua
CodeDiscussionLinksLink count SubpagesDocumentationTestsResultsSandboxLive code All modules

Code

-- VERY HACKSIH MODULE for displaying data stored in [[Module:Statstics]] and subpages

local p = {}
local pieChart = require 'Module:Pie maker'
local barChart = require 'Module:Bar maker'
local quicktable = require 'Module:Table maker'
local data = require 'Module:Statistical data'
local wikidata = require "Module:Wikidata" 
local formatnum = require "Module:Formatnum".formatNum
local linguistic = require "Module:Linguistic"

-- I18 n 
local lang = mw.getCurrentFrame():preprocess("{{int:lang}}")
local langSwitch = require "Module:Fallback"._langSwitch
local linguistic = require "Module:Linguistic"
local i18n = {
	otherclass = {
		en = 'other P31/P279',
		fr = 'autre P31/P279',
	},
	noclass = {
		en = 'no P31/P279',
		fr = 'pas de P31/P279',
	}
}

local siteids = {
	abwiki = 'Q3568035',
	acewiki = 'Q3957795',
	afwiki = 'Q766705',
	akwiki = 'Q8558731',
	alswiki = 'Q1211233',
	amwiki = 'Q3025527',
	anwiki = 'Q1147071',
	angwiki = 'Q8558960',
	arwiki = 'Q199700',
	arcwiki = 'Q8569951',
	arzwiki = 'Q2374285',
	aswiki = 'Q8559119',
	astwiki = 'Q1071918',
	avwiki = 'Q5652665',
	aywiki = 'Q3826575',
	azwiki = 'Q58251',
	bawiki = 'Q58209',
	barwiki = 'Q1961887',
	bat_smgwiki = 'Q3568069',
	bclwiki = 'Q8561870',
	bewiki = 'Q877583',
	be_x_oldwiki = 'Q8937989',
	bgwiki = 'Q11913',
	bhwiki = 'Q8561277',
	biwiki = 'Q8561332',
	bjnwiki = 'Q2983979',
	bmwiki = 'Q8559737',
	bnwiki = 'Q427715',
	bowiki = 'Q2091593',
	bpywiki = 'Q1287192',
	brwiki = 'Q846871',
	bswiki = 'Q1047829',
	bugwiki = 'Q4097773',
	bxrwiki = 'Q8561415',
	cawiki = 'Q199693',
	cbk_zamwiki = 'Q8575930',
	cdowiki = 'Q846630',
	cewiki = 'Q4783991',
	cebwiki = 'Q837615',
	chwiki = 'Q8576190',
	chrwiki = 'Q8576237',
	chywiki = 'Q8561491',
	ckbwiki = 'Q4115463',
	cowiki = 'Q3111179',
	crwiki = 'Q8561582',
	crhwiki = 'Q60786',
	cswiki = 'Q191168',
	csbwiki = 'Q3756269',
	cuwiki = 'Q547271',
	cvwiki = 'Q58215',
	cywiki = 'Q848525',
	dawiki = 'Q181163',
	dewiki = 'Q48183',
	diqwiki = 'Q38288',
	dsbwiki = 'Q8561147',
	dvwiki = 'Q928808',
	dzwiki = 'Q8561662',
	eewiki = 'Q8562097',
	elwiki = 'Q11918',
	emlwiki = 'Q3568066',
	enwiki = 'Q328',
	eowiki = 'Q190551',
	eswiki = 'Q8449',
	etwiki = 'Q200060',
	euwiki = 'Q207260',
	extwiki = 'Q3181928',
	fawiki = 'Q48952',
	ffwiki = 'Q8562927',
	fiwiki = 'Q175482',
	fiu_vrowiki = 'Q1585232',
	fjwiki = 'Q8562502',
	fowiki = 'Q8042979',
	frwiki = 'Q8447',
	frpwiki = 'Q8562529',
	frrwiki = 'Q8669146',
	furwiki = 'Q3568039',
	fywiki = 'Q2602203',
	gawiki = 'Q875631',
	gagwiki = 'Q79633',
	ganwiki = 'Q6125437',
	gdwiki = 'Q8562272',
	glwiki = 'Q841208',
	glkwiki = 'Q3944107',
	gnwiki = 'Q3807895',
	gotwiki = 'Q8563136',
	guwiki = 'Q3180306',
	gvwiki = 'Q8566503',
	hawiki = 'Q8563393',
	hakwiki = 'Q6112922',
	hawwiki = 'Q3568043',
	hewiki = 'Q199913',
	hiwiki = 'Q722040',
	hifwiki = 'Q8562481',
	hrwiki = 'Q203488',
	hsbwiki = 'Q2402143',
	htwiki = 'Q1066461',
	huwiki = 'Q53464',
	hywiki = 'Q1975217',
	iawiki = 'Q3757068',
	idwiki = 'Q155214',
	iewiki = 'Q6167360',
	igwiki = 'Q8563635',
	ikwiki = 'Q8563863',
	ilowiki = 'Q8563685',
	iowiki = 'Q1154766',
	iswiki = 'Q718394',
	itwiki = 'Q11920',
	iuwiki = 'Q3913095',
	jawiki = 'Q177837',
	jbowiki = 'Q8566311',
	jvwiki = 'Q3477935',
	kawiki = 'Q848974',
	kaawiki = 'Q79636',
	kabwiki = 'Q8564352',
	kbdwiki = 'Q13231253',
	kgwiki = 'Q8565463',
	kiwiki = 'Q8565476',
	kkwiki = 'Q58172',
	klwiki = 'Q3568042',
	kmwiki = 'Q3568044',
	knwiki = 'Q3181422',
	kowiki = 'Q17985',
	koiwiki = 'Q1116066',
	krcwiki = 'Q1249553',
	kswiki = 'Q8565447',
	kshwiki = 'Q3568041',
	kuwiki = 'Q1154741',
	kvwiki = 'Q925661',
	kwwiki = 'Q8565801',
	kywiki = 'Q60799',
	lawiki = 'Q12237',
	ladwiki = 'Q3756562',
	lbwiki = 'Q950058',
	lbewiki = 'Q6587084',
	lezwiki = 'Q45041',
	lgwiki = 'Q8566347',
	liwiki = 'Q2328409',
	lijwiki = 'Q3568046',
	lmowiki = 'Q3913160',
	lnwiki = 'Q8566298',
	lowiki = 'Q3568045',
	ltwiki = 'Q202472',
	ltgwiki = 'Q2913253',
	lvwiki = 'Q728945',
	map_bmswiki = 'Q4077512',
	mdfwiki = 'Q1178461',
	mgwiki = 'Q3123304',
	mhrwiki = 'Q824297',
	miwiki = 'Q2732019',
	minwiki = 'Q4296423',
	mkwiki = 'Q842341',
	mlwiki = 'Q874555',
	mnwiki = 'Q2998037',
	mowiki = 'Q3568049',
	mrwiki = 'Q3486726',
	mrjwiki = 'Q1034940',
	mswiki = 'Q845993',
	mtwiki = 'Q3180091',
	mwlwiki = 'Q8568791',
	mywiki = 'Q4614845',
	myvwiki = 'Q856881',
	mznwiki = 'Q3568048',
	nawiki = 'Q3753095',
	nahwiki = 'Q2744155',
	napwiki = 'Q1047851',
	ndswiki = 'Q4925786',
	nds_nlwiki = 'Q1574617',
	newiki = 'Q8560590',
	newwiki = 'Q1291627',
	nlwiki = 'Q10000',
	nnwiki = 'Q2349453',
	nowiki = 'Q191769',
	novwiki = 'Q8570353',
	nrmwiki = 'Q3568051',
	nsowiki = 'Q13230970',
	nvwiki = 'Q8569757',
	nywiki = 'Q8561552',
	ocwiki = 'Q595628',
	omwiki = 'Q8570425',
	orwiki = 'Q7102897',
	oswiki = 'Q226150',
	pawiki = 'Q1754193',
	pagwiki = 'Q12265494',
	pamwiki = 'Q588620',
	papwiki = 'Q3568056',
	pcdwiki = 'Q3568053',
	pdcwiki = 'Q3025736',
	pflwiki = 'Q13358221',
	piwiki = 'Q8570791',
	pihwiki = 'Q8570048',
	plwiki = 'Q1551807',
	pmswiki = 'Q3046353',
	pnbwiki = 'Q3696028',
	pntwiki = 'Q4372058',
	pswiki = 'Q3568054',
	ptwiki = 'Q11921',
	quwiki = 'Q1377618',
	rmwiki = 'Q3026819',
	rmywiki = 'Q8571143',
	rnwiki = 'Q8565742',
	rowiki = 'Q199864',
	roa_rupwiki = 'Q2073394',
	roa_tarawiki = 'Q3568062',
	ruwiki = 'Q206855',
	ruewiki = 'Q58781',
	rwwiki = 'Q8565518',
	sawiki = 'Q2587255',
	sahwiki = 'Q225594',
	scwiki = 'Q3568059',
	scnwiki = 'Q1058430',
	scowiki = 'Q1444686',
	sdwiki = 'Q8571840',
	sewiki = 'Q4115441',
	sgwiki = 'Q8571487',
	shwiki = 'Q58679',
	siwiki = 'Q8571954',
	simplewiki = 'Q200183',
	skwiki = 'Q192582',
	slwiki = 'Q14380',
	smwiki = 'Q8571427',
	snwiki = 'Q8571809',
	sowiki = 'Q8572132',
	sqwiki = 'Q208533',
	srwiki = 'Q200386',
	srnwiki = 'Q3568060',
	sswiki = 'Q3432470',
	stwiki = 'Q8572199',
	stqwiki = 'Q3568040',
	suwiki = 'Q966609',
	svwiki = 'Q169514',
	swwiki = 'Q722243',
	szlwiki = 'Q940309',
	tawiki = 'Q844491',
	tewiki = 'Q848046',
	tetwiki = 'Q8575385',
	tgwiki = 'Q2742472',
	thwiki = 'Q565074',
	tiwiki = 'Q8575467',
	tkwiki = 'Q511754',
	tlwiki = 'Q877685',
	tnwiki = 'Q3568063',
	towiki = 'Q3112631',
	tpiwiki = 'Q571001',
	trwiki = 'Q58255',
	tswiki = 'Q8575674',
	ttwiki = 'Q60819',
	tumwiki = 'Q8575782',
	twwiki = 'Q8575885',
	tywiki = 'Q3568061',
	udmwiki = 'Q221444',
	ugwiki = 'Q60856',
	ukwiki = 'Q199698',
	urwiki = 'Q1067878',
	uzwiki = 'Q2081526',
	vewiki = 'Q8577029',
	vecwiki = 'Q1055841',
	vepwiki = 'Q4107346',
	viwiki = 'Q200180',
	vlswiki = 'Q3568038',
	vowiki = 'Q714826',
	wawiki = 'Q1132977',
	warwiki = 'Q1648786',
	wowiki = 'Q8582589',
	wuuwiki = 'Q1110233',
	xalwiki = 'Q4210231',
	xhwiki = 'Q3568065',
	xmfwiki = 'Q2029239',
	yiwiki = 'Q1968379',
	yowiki = 'Q1148240',
	zawiki = 'Q3311132',
	zeawiki = 'Q2111591',
	zhwiki = 'Q30239',
	zh_classicalwiki = 'Q1378484',
	zh_min_nanwiki = 'Q3239456',
	zh_yuewiki = 'Q1190962',
	zuwiki = 'Q8075204',
	commonswiki = 'Q565',
	wikidata = 'Q2013',
	freebase = 'Q1453477',
}

local function translate(str)
	if i18n[str] then
		return langSwitch(i18n[str], lang)
	end
	return str .. '?'
end

-- HELPER FUNCTIONS
local wdq = require 'Module:WDQ'

local function split(s)
	if type(s) == 'table' then
		return s
	end
	if type(s) == 'string' then
		return mw.text.split(s, ' ')
	end
end
local function querylink(query, wiki, item, value)
	local patterns = {
		['id'] = item.id,
		['lat'] = function() return wikidata.getClaims{entity = item, property = 'P625', excludespecial = 1}[1].mainsnak.datavalue.value.latitude end,
		['long'] = function() return wikidata.getClaims{entity = item, property = 'P625', excludespecial = 1}[1].mainsnak.datavalue.value.longitude end,
	}
	for i, j in pairs(patterns) do
		query = query:gsub("%$" .. i,  function() if type(j) == 'function' then local success, val = pcall(j) return val end return j end )
	end
	if wiki ~= 'wikidata' then query = query .. 'and link[' .. wiki .. ']' end
	return wdq.makelink(query, value, lang)
end

local function projectLabel(project)
	local id = siteids[project]
	if not id then
		return project
	end
	return wikidata._getLabel(id,lang)
end

local function sitecontent_core(total, classes, sitedata, datasource, classq)
	local inmain = total
	local other = inmain - (sitedata.none or 0) -- pages that have a P31/P279 but are not in any of the classes used
	
	for i,j in pairs(classes) do
		other = other - (sitedata[j] or 0)
	end
	
	local pie = pieChart:new()
	pie:addTitle((wikidata._getLabel(siteids[sitecode], lang) or '') .. linguistic.inparentheses(formatnum(inmain, lang), lang))
	for i, j in pairs(classes) do
		if sitedata[j] then pie:addSlice{sitedata[j] , classq and wikidata._getLabel(j, lang) or j } end
	end
	pie:addSlice{other, translate('otherclass'), '#9922CC'}
	pie:addSlice{sitedata.none, translate('noclass'), '#BEBEBE'}
	pie:addSource(linguistic.conj({"[[" .. datasource .. "]]", sitedata.timestamp}, lang, 'comma'))
	pie:format{radius = '100'}
	pie:format{percent = true}
	return pie:show()
end

-- FRAME FUNCTIONS
function p.sitecontent(frame)
	local sitecode = frame.args[1]
	local datasource = frame.args[2] or "Module:Statistical data/by project/classes"
	local lang = frame.args.lang
	local sitedata = require (datasource) [sitecode]
	if not sitedata then
		return "no data available for " .. sitecode .. "See [[" .. datasource .. "]] for more information."
	end
	
	-- process data
	local inmain = sitedata.total - sitedata.Q11266439 - sitedata.Q4167836 - sitedata.Q15184295
	local classes = { -- classes we use
		'Q5', -- human  
		'Q16521',  -- taxon
		'Q56061', --administrative unit 
		'Q811979', -- architectural structure 
		'Q1190554', -- event
		'Q11173', -- chemical compound
		'Q386724', --  work (currently disputed, not to be used together with film)
		'Q11424', --  film                       claim[31:(tree[11424][][279])]
		'Q83620', -- thoroughfare (street,public squares) claim[31:(tree[83620][][279])]
		'Q6999', --  astronomical object
		'Q13406463', -- list
		'Q4167410', -- disambiguation
		'Q16686448', -- other artificial object
		'Q17633526', -- Wikinews articles          claim[31:17633526]
		'Q20160182', -- source text pages at Wikisource (estimate)  (see discussion at [[Wikidata_talk:Statistics/Wikipedia#Sitecontent]]
		'Q13442814' -- scientific articles or more other publication types
	} -- if you added a class please also update the query in Template:Site content/generator
	
	return sitecontent_core(inmain, classes, sitedata, datasource, true)
end

function p._datatable(datapage, projects, items)
	
	local data = require ('Module:Statistical data/' .. mw.ustring.lower(datapage))
	local tab = quicktable:new()
	tab:addSource( linguistic.conj({'[[Module:Statistical data/' .. mw.ustring.lower(datapage) .. ']]' , data.timestamp}, lang, 'comma'))
	
	local values = data.data
	items = items or data.items -- all items by default
	projects = split(projects)
	if not projects then -- all projects by default
		projects = {}
		for i, j in pairs(values) do
			if i ~= 'wikidata' then
				table.insert(projects, i)
			end
		end
		table.sort(projects)
		table.insert(projects, 'wikidata')
	end
	local query = data.wdq

	-- wikinames as columns rather than rows (more interesting sorting, otherwise data are too dependent on Wiki's absolute size
	local header = {''}
	for i, proj in pairs(projects) do
		table.insert(header, proj)
	end
	tab:addHeaders(header)
	for i, item in pairs(items) do
		local entity = wikidata.getEntity(item)
		local label = wikidata._getLabel(item)
		local row = {label}
		for j, wiki in pairs(projects) do
			local formattedval = querylink(query, wiki, entity, values[wiki][i])
			table.insert(row, formattedval)
		end
		tab:addRow(row)
	end
	return tab:show()
end

function p._bars(datapage, projects, item)
	local data = require ('Module:Statistical data/' .. mw.ustring.lower(datapage))
	local values = data.data
	items = items or data.items -- all items by default
	local itemindexes = {}
	for i, j in pairs(items) do
		for k, l in pairs(data.items) do
			if j == l then table.insert(itemindexes, k) end
		end
	end
	if not projects then -- all projects by default
		projects = {}
		for i, j in pairs(data.data) do
		table.insert(projects, i)
		end
	end
	projects = split(projects)
	local query = data.wdq
	local chart = barChart:new()
	
	if #projects == 1 then -- special layout
		chart:addTitle(projects[1])
		local vals, legends = {}, {}
		for i, j in pairs(itemindexes) do
			table.insert(vals, values[projects[1]][j])
			table.insert(legends, mw.ustring.sub(wikidata._getLabel(data.items[j]), 1, 3))
		end
		chart:xLegends(legends)
		chart:addGroup(vals, '', 'blue')
		return chart:show()
	end
	chart:addTitle(mw.ustring.gsub(datapage, 'by project/', ''))
	local legends = {}
	local colors = {'green', 'orange', 'yellow'}
	local legends = {} a = 1
	for i, index in pairs(itemindexes) do
		local vals = {}
		for j, project in pairs(projects) do
			table.insert(vals, values[project][index])
		end
		chart:addGroup(vals,  wikidata._getLabel(items[index]), colors[i])
	end
	for j, project in pairs(projects) do
		table.insert(legends, project)
	end
	chart:xLegends(legends)
	return chart:show()
end

function p.bars(frame)
	local args = {}
	for i, j in pairs(frame.args) do
		if j ~= '' then args[i] = j end
	end
	local data = args.data
	local projects = args.project or args.projects
	return p._bars(data, projects)
end

function p.datatable(frame)
	local args = {}
	for i, j in pairs(frame.args) do
		if j ~= '' then args[i] = j end
	end
	local data = args.data
	local projects = args.project or args.projects
	return p._datatable(data, projects)
end
	
return p