Module:Sandbox/Frietjes/country population table

local p = {}

local lang = mw.language.getContentLanguage

local function getPopulations(qid) -- Return table of all population or nil if none found. -- Each entry is a table { POP, TIMESTAMP } where POP is a number. local populations = {} local props = mw.wikibase.getAllStatements(qid, 'P1082') if not props then return nil end for _, v in pairs(props) do		if v.qualifiers and v.qualifiers["P585"] then local timestamp = v.qualifiers["P585"][1].datavalue.value.time timestamp = timestamp:gsub("%-00%-00T", "-01-01T") if string.sub(timestamp, 1, 1) ~= '-' then populations[#populations + 1] = { tonumber(v.mainsnak.datavalue.value.amount), -- number or nil tonumber(lang:formatDate('U',timestamp)) -- timestamp }			end end end if next(populations) then -- if table is not empty return populations end return nil end

local function getPopEst(qid) local populations = getPopulations(qid) if not populations then return -1 end -- get the two most recent population counts local popCurrent, popPrevious, timeCurrent, timePrevious = -1, -1, -1, -1 for i, v in ipairs(populations) do		if v[2] > timeCurrent then popPrevious = popCurrent timePrevious = timeCurrent popCurrent = v[1] timeCurrent = v[2] elseif v[2] > timePrevious then popPrevious = v[1] timePrevious = v[2] end end if (timeCurrent > 0) and (timePrevious > 0) then local timeNow = lang:formatDate( 'U', nil, true ) return math.floor(popCurrent + (popCurrent - popPrevious)/(timeCurrent - timePrevious)*(timeNow - timeCurrent) + 0.5) else return -1 end end

function p.row(frame) local function formatnum(num) return frame:callParserFunction{ name = 'formatnum', args = num } end local function flag(str) return frame:expandTemplate{ title = 'flag', args = { str } } end local args = frame.args local res = '' local argnums = {} for k, v in pairs( args ) do		if type( k ) == 'number' and v ~= '' then argnums[#argnums + 1] = k		end end table.sort(argnums) local wpop = getPopEst('Q2') for j = 1,#argnums do		local country = args[argnums[j]]

local qid = nil if country == nil or country == "" then qid = mw.wikibase.getEntityIdForCurrentPage else qid = mw.wikibase.getEntityIdForTitle(country) end local cpop = getPopEst(qid)

if (cpop > 0) and (wpop > 0) then local pct = math.floor(1000*cpop / wpop + 0.5) / 10 cpop = formatnum(cpop) res = res .. '|-\n|' .. flag(country) .. '||' .. cpop .. ' || ' .. lang:formatDate( 'd F Y', nil, true ) .. ' || ' .. pct .. '%\n' else res = res .. 'Error: Country = ' .. country .. ' Country population estimate = ' .. cpop .. ' World population estimate = ' .. wpop end end return res end

return p