-- 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