Module:International Refugee Day Edit-a-thon
Module documentation
[create]
-- International Refugee Day Edit-a-thon: builds a list of articles based on information from Wikidata
-- Sample use: {{#invoke:International Refugee Day Edit-a-thon|table|Q1|Q2|Q3|Q4|Q5}}
-- Can be used to list 400+ articles on 1 page
-- by User:Voll, with additions by Halibutt, Braveheart, Jura1, Strainu, Yupik
-- Original at https://meta.wikimedia.org/wiki/Module:WikimediaCEETable. Please contribute amendments there and keep copies in sync with that version.
local langTable = {
'bs', 'cs', 'de', 'el', 'en', 'es', 'fr',
'hu', 'it', 'mk', 'pl', 'pt', 'sr', 'tr'
}
local p = {}
local function def(bla)
local zdef = {}
for _, l in ipairs(bla) do zdef[l] = true end
return zdef
end
function p.table(frame)
-- header/init
if frame.args['occupation'] then
occupation_header = '! Occupation '
else
occupation_header = ''
end
header = {
'{| class="wikitable sortable" style="width: 100%;"',
'|-',
'! №',
'! style="width: 18%;" | Article',
occupation_header,
(function()
local ret = {}
for i = 1, #langTable do
ret[#ret + 1] = '! class="unsortable" | ' .. langTable[i]
end
return table.concat(ret, '\n')
end)(),
'! Σ ',
'! Wikidata',
'! <abbr title="number of main statements on item">st.</abbr>',
'! ',
'|-'
}
resultTable = table.concat(header, '\n');
index = 1
ctt = {}
statementst = 0
coords = 0
images = 0
wqsitems = ''
qids = ''
timeline = 0
mylang = frame:preprocess('{{int:lang}}')
for langCount = 1, #langTable do
ctt[langCount] = 0
end
-- rows
while frame.args[index] do
Id = frame.args[index]
entity = mw.wikibase.getEntityObject(Id)
-- if not entity or not entity.sitelinks then
if not entity then
return '<b>Entity ' .. Id .. ' not found</b>'
end
Label = entity:getLabel(mylang)
if not Label then
Label = ''
end
ensitelink = entity:getSitelink( 'enwiki' )
if ensitelink then
if Label == '' then
Label = ensitelink
end
end
result2 = ''
ct = 0
wqsitems = wqsitems .. 'wd%3A' .. Id .. '%20'
qids = qids .. string.sub(Id, 2) .. ','
idinternal = def {
'P373', 'P948', 'P935', 'P460', 'P856', 'P910', 'P213', 'P1343', 'P973',
'P345', 'P227', 'P244','P1612', 'P1472', 'P1325', 'P106'
}
commonsp = def {
'P18', 'P10', 'P14', 'P15', 'P41', 'P51', 'P94', 'P109', 'P117', 'P154',
'P158', 'P181', 'P207', 'P242', 'P367', 'P373', 'P443', 'P491', 'P692',
'P935', 'P948', 'P989', 'P990', 'P996', 'P1442', 'P1472', 'P1543', 'P1612',
'P1621', 'P1766', 'P1801', 'P1846', 'P1943', 'P1944'
}
-- occupation (P106)
local claims
if entity.claims then
claims = entity.claims['P106']
end
if frame.args['occupation'] then
if (claims and claims[1] and claims[1].mainsnak.snaktype == 'value' and claims[1].mainsnak.datavalue.type == 'wikibase-entityid' and claims[1].mainsnak.datavalue.value['id']) then
entity2 = mw.wikibase.getEntityObject(claims[1].mainsnak.datavalue.value['id'])
occupation = entity2:getLabel(mylang)
result2 = result2 .. ' \n| ' .. occupation
else
result2 = result2 .. '\n| - '
end
end
-- columns per row
for langCount = 1, #langTable do
sitelink = entity:getSitelink( langTable[langCount] .. 'wiki' )
if sitelink then
iw = langTable[langCount]
if iw == 'be_x_old' then iw = 'be-tarask' end
result2 = result2 .. '\n| style="background:#cfc;"|' .. '[[:' .. iw .. ':' .. sitelink .. '| +]]'
ct = ct + 1
ctt[langCount] = ctt[langCount] + 1
if Label == '' then
Label = sitelink
end
else
result2 = result2 .. '\n| -'
end
end
-- first cells of row
result1 = '|-\n|align=right|' .. index .. '\n|'
if ensitelink then
result1 = result1 .. '[[:en:' .. ensitelink .. '|' .. Label ..']]'
else
result1 = result1 .. Label
end
-- icon for females (Q6581072 & Q1052281)
local claims
if entity.claims then
claims = entity.claims['P21']
end
if (claims and claims[1] and claims[1].mainsnak.snaktype == 'value' and claims[1].mainsnak.datavalue.type == 'wikibase-entityid' and claims[1].mainsnak.datavalue.value['numeric-id'] and (claims[1].mainsnak.datavalue.value['numeric-id'] == 6581072 or claims[1].mainsnak.datavalue.value['numeric-id'] == 1052281)) then
result1 = result1 .. ' [[File:Female Icon.svg|link=|18px]]'
end
-- years for humans (Q5)
local claims
if entity.claims then
claims = entity.claims['P31']
end
if (claims and claims[1] and claims[1].mainsnak.snaktype == 'value' and claims[1].mainsnak.datavalue.type == 'wikibase-entityid' and claims[1].mainsnak.datavalue.value['numeric-id'] and claims[1].mainsnak.datavalue.value['numeric-id'] == 5) then
local yr = '%d%d%d%d$'
local p569 = entity:formatPropertyValues( 'P569' ).value
if p569 ~= "" then
if p569:match(yr) ~= nil then
p569 = p569:match(yr)
end
local p570 = entity:formatPropertyValues( 'P570' ).value
if p570 ~= "" then
if p570:match(yr) ~= nil then
p570 = p570:match(yr)
end
result1 = result1 .. ' <span style="font-size:smaller;font-weight:100">(' .. p569 .. '-' .. p570 .. ')</span> '
else
result1 = result1 .. ' <span style="font-size:smaller;font-weight:100">(b. ' .. p569 .. ')</span>'
end
else
result1 = result1 .. ' <span style="font-size:smaller;font-weight:100">(?)</span>'
end
end
local tl = ""
tl = tl .. entity:formatPropertyValues( 'P580' ).value
tl = tl .. entity:formatPropertyValues( 'P569' ).value
tl = tl .. entity:formatPropertyValues( 'P571' ).value
tl = tl .. entity:formatPropertyValues( 'P582' ).value
tl = tl .. entity:formatPropertyValues( 'P576' ).value
tl = tl .. entity:formatPropertyValues( 'P577' ).value
if tl ~= "" then
timeline = timeline + 1
end
local p625 = entity:formatPropertyValues( 'P625' ).value
if p625 ~= "" then
result1 = result1 .. ' [[File:Geographylogo.svg|18px|view on maps|link=https://tools.wmflabs.org/geohack/geohack.php?language=en&pagename=' .. mw.uri.encode( Label, 'PATH' ) .. '¶ms=' .. entity.claims.P625[1].mainsnak.datavalue.value.latitude .. '_N_' .. entity.claims.P625[1].mainsnak.datavalue.value.longitude .. '_E]]'
coords = coords + 1
end
local p18 = entity:formatPropertyValues( 'P18' ).value
if p18 ~= "" then
images = images + 1
end
-- last cells of row
index = index + 1
local commons = false
local statements = 0
if entity.claims then
for i, statement in pairs( entity.claims ) do
if statement then
if statement[1].mainsnak then
if not idinternal[i] then
if statement[1].mainsnak.datatype ~= 'external-id' then
statements = statements+1
end
end
if commonsp[i] then
commons = true
end
end
end
end
end
-- local statements = #entity:getProperties()
-- todo : check for Commons sitelinks
local commonsstr = ""
if commons then
commonsstr = '<span title="Wikidata item includes Commons resources">+</span>'
-- commonsstr = '[https://commons.wikimedia.org/w/index.php?fulltext=1&search='.. mw.uri.encode( Label, 'PATH' ) .. ' +]'
end
statementst = statementst + statements
if statements == 0 then
bgcolor = ''
else
bgcolor = 'background:#cfc;'
end
resultTable = resultTable .. result1 .. result2 ..'\n| align=right style="font-size:smaller;"| ' .. ct .. '\n| style="background:#cfc;" data-sort-value="' .. string.sub(Id, 2) .. '"|[[d:' .. Id .. '|' .. Id .. ']] \n|style="' .. bgcolor .. 'font-size:smaller;" align=right title="number of main statements on Wikidata item"|'.. statements .. '\n|style="background:#cfc;"|' .. commonsstr .. '\n'
end
-- footer
if qids ~= "" then
qids = qids:sub(1, -2)
end
tline = ""
if timeline > 2 then
tline = '[https://tools.wmflabs.org/wikidata-timeline/#/timeline?query=' .. mw.uri.encode('items[' .. qids .. ']', 'PATH' ) .. ' → timeline]'
end
mapme = ""
if coords > 0 or images > 0 then
mapme = '[https://query.wikidata.org/#%23%20click%20%22Execute%22%20to%20run%20the%20query%2C%20then%20%28on%20the%20right%20side%29%20below%20%22Display%22%20select%20the%20link%20%22Map%22%20or%20%22Image%20Grid%22%0ASELECT%20%0A%09%3Fitem%20%0A%09%3FitemLabel%20%0A%09%28GROUP_CONCAT%28DISTINCT%28%3FinstanceLabel%29%3B%20separator%3D%22%2C%20%22%29%20as%20%3Finstance_of%29%0A%09%28SAMPLE%28%3Fcoord%29%20as%20%3Fcoordinates%29%0A%09%28SAMPLE%28%3Fimg%29%20as%20%3Fimage%29%0AWHERE%0A{%0A%09VALUES%20%3Fitem%20{%20' .. wqsitems .. '%20}%09OPTIONAL%20{%3Fitem%20wdt%3AP625%20%3Fcoord1%20}%20.%0A%20%20%09OPTIONAL%20{%3Fitem%20wdt%3AP131%2Fwdt%3AP625%20%3Fcoord2%20}%20.%0A%20%20%09OPTIONAL%20{%3Fitem%20wdt%3AP276%2Fwdt%3AP625%20%3Fcoord3%20}%20.%0A%09BIND%28IF%28!BOUND%28%3Fcoord1%29%2C%28IF%28!BOUND%28%3Fcoord2%29%2C%3Fcoord3%2C%3Fcoord2%29%29%2C%3Fcoord1%29%20as%20%3Fcoord%29%0A%20.%20%20%0A%09OPTIONAL%20{%3Fitem%20wdt%3AP31%20%3Finstance%20}%20.%20%20%20%0A%20%20%09OPTIONAL%20{%3Fitem%20wdt%3AP18%20%3Fimg%20}%20.%20%20%20%0A%09SERVICE%20wikibase%3Alabel%20{%20bd%3AserviceParam%20wikibase%3Alanguage%20%22' .. mylang .. '%2Cen%22%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20.%20%3Fitem%20rdfs%3Alabel%20%3FitemLabel%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20.%20%3Finstance%20rdfs%3Alabel%20%3FinstanceLabel%20}%0A}%0AGROUP%20BY%20%3Fitem%20%3FitemLabel%20 →'
if coords > 0 then
mapme = mapme .. ' map'
end
if images > 0 then
mapme = mapme .. ' gallery'
end
mapme = mapme .. ']'
end
local autolist = '[https://tools.wmflabs.org/autolist/?language=' .. mylang .. '&project=wikipedia&wdq=' .. mw.uri.encode('items[' .. qids .. ']', 'PATH' ) .. '&run=Run&mode_manual=or&mode_cat=or&mode_wdq=not&mode_wdqs=or&mode_find=or&chunk_size=10000 → Autolist]'
result1 = '|- align=right style="font-size:smaller" class="sortbottom"\n! Σ \n|' .. autolist .. mapme .. tline
result2 = ''
ct = 0
for langCount = 1, #langTable do
result2 = result2 .. '\n |' .. ctt[langCount]
ct = ct + ctt[langCount]
end
resultTable = resultTable .. result1 .. result2 ..'\n| ' .. ct .. '\n| data-sort-value="999999999999"| avg: <span title="average number of language versions (of ' .. #langTable .. ') per article">' .. math.floor(ct/(index-1)+0.5) .. '</span>\\<span title="average number of articles (of ' .. (index-1) .. ') per language">' .. math.floor(ct / #langTable + 0.5) .. '</span>\\<span title="overall in percent (all: '.. (#langTable * (index-1)) .. ')">' .. math.floor( ct / #langTable / (index-1)*100 + 0.5) .. '%</span>\n|' .. statementst .. '\n| [[File:Commons-logo.svg|16px|link=|Wikimedia Commons]]'
resultTable = resultTable .. '\n|}\n'
return resultTable
end
-- International Refugee Day Edit-a-thon.count: counts articles from the list in certain wiki
-- Sample use: {{#invoke:International Refugee Day Edit-a-thon|count|lang|Q1|Q2|Q3|Q4|Q5}}
-- based on previous "table" function stripped from all the table formatting.
function p.count(frame)
resultText = ''
anum = 2
wikianum = 0
ctt = {}
for langCount = 1, #langTable do
ctt[langCount] = 0
end
while frame.args[anum] do
Id = frame.args[anum]
anum = anum + 1
local entity = mw.wikibase.getEntityObject(Id)
-- if not entity or not entity.sitelinks then
if not entity then
return '<b>Entity ' .. Id .. ' not found</b>'
end
for langCount = 1, #langTable do
local sitelink = entity:getSitelink( langTable[langCount] .. 'wiki' )
if sitelink then
iw = langTable[langCount]
if iw == 'be_x_old' then iw = 'be-tarask' end
ctt[langCount] = ctt[langCount] + 1
end
end
end
anum = anum - 2
-- number of articles in certain wiki. Straight...
for langCount = 1, #langTable do
if langTable[langCount] == frame.args[1] then wikianum = ctt[langCount] end
end
resultText = wikianum .. '/' .. anum -- result is two numbers with '/' separator
return resultText
end
return p