Istruzioni per l'uso
Questo è un modulo scritto in Lua. Le istruzioni che seguono sono contenute nella sottopagina Modulo:Dati popolazione/man (modifica · cronologia)
Sandbox: Modulo:Dati popolazione/sandbox (modifica · cronologia) · Sottopagine: lista · Test: Modulo:Dati popolazione/test (modifica · cronologia · Esegui)
Questo è un modulo scritto in Lua. Le istruzioni che seguono sono contenute nella sottopagina Modulo:Dati popolazione/man (modifica · cronologia)
Sandbox: Modulo:Dati popolazione/sandbox (modifica · cronologia) · Sottopagine: lista · Test: Modulo:Dati popolazione/test (modifica · cronologia · Esegui)
Questo modulo restituisce il numero di abitanti di una sottodivisione amministrativa (o i relativi metadati) se riesce a ricavarli dai template nella Categoria:Template dati demografici o da Wikidata.
Ha una sottopagina di configurazione: Modulo:Dati popolazione/Configurazione.
require('strict')
local cfg = mw.loadData('Modulo:Dati popolazione/Configurazione')
local getArgs = require('Module:Arguments').getArgs
local mWikidata = require('Modulo:Wikidata')
local TEMPLATE_DATA_NOT_FOUND_CAT = '[[Categoria:Errori del modulo Dati popolazione - dati non trovati]]'
-- =============================================================================
-- Funzioni di utilità
-- =============================================================================
local function formatOutput(formatstring, value)
formatstring = mw.ustring.gsub(formatstring, '\\{', '{')
formatstring = mw.ustring.gsub(formatstring, '\\}', '}')
value = mw.message.newRawMessage(formatstring, value):plain()
return mw.getCurrentFrame():preprocess(value)
end
local function expandTemplate(iso31662, template_args)
local value = mw.getCurrentFrame():expandTemplate{
title = 'Template:Dati popolazione ' .. iso31662,
args = template_args
}
return value ~= '' and value or nil
end
-- Funzione temporanea, va corretto il modulo:Wikidata
local function getAllClaims(wd_args)
local ret
if wd_args.from then
local claims = mw.wikibase.getAllStatements(wd_args.from, wd_args[1])
if #claims > 0 then
ret = {}
for _, claim in ipairs(claims) do
table.insert(ret, mWikidata._formatStatement(claim, wd_args))
end
end
end
return ret
end
local function getPropertyFromSuperdivision(wd_args)
local ret
wd_args.from = mWikidata._getProperty({ 'P131', from = wd_args.from, n = 1,
formatting = 'id', qualifiertype = 'latest' })
if wd_args.from then
ret = wd_args.n == 1 and mWikidata._getProperty(wd_args) or getAllClaims(wd_args)
ret = ret or getPropertyFromSuperdivision(wd_args)
end
return ret, wd_args.from
end
local function formatCode(code, code_prop, formats, entity_id)
local ret
for _, format in ipairs(formats) do
local msg_params = {}
local msg_args = {}
for param_name in string.gmatch(format.formatstring, '$%d+') do
table.insert(msg_params, format[param_name])
end
for _, msg_param in ipairs(msg_params) do
local wd_args = { msg_param.property, from = entity_id, n = 1, formatting = 'raw' }
local msg_arg
if msg_param.property == code_prop then
msg_arg = code
elseif msg_param.fromP131 then
msg_arg = getPropertyFromSuperdivision(mw.clone(wd_args))
else
msg_arg = mWikidata._getProperty(wd_args)
end
if not msg_arg then break end
msg_arg = msg_arg:sub(msg_param.startpos or 0, msg_param.endpos or #msg_arg)
table.insert(msg_args, msg_arg)
end
if #msg_params == #msg_args then
ret = mw.message.newRawMessage(format.formatstring, msg_args):plain()
break
end
end
return ret
end
local function getSubdivisionCode(user_input, iso31661, entity_id)
local ret
if user_input then
ret = user_input
elseif entity_id and cfg.wd_IDs_to_subdivision_codes[entity_id] then
ret = cfg.wd_IDs_to_subdivision_codes[entity_id]
elseif cfg.props_for_subdivision_codes[iso31661] then
for _, prop in ipairs(cfg.props_for_subdivision_codes[iso31661]) do
local claim = mWikidata._getProperty({
prop, from = entity_id, n = 1, formatting = 'raw' })
local formats = cfg.formats_for_props[prop]
if claim and formats then
ret = formatCode(claim, prop, formats, entity_id)
else
ret = claim
end
if ret then break end
end
end
return ret
end
local function getISO3166Parts(user_input, entity_id)
local iso31661, iso31662, superdivision_id
local wd_args = { 'P300', from = entity_id, formatting = 'raw' }
local claims = not user_input and getAllClaims(wd_args) or { user_input }
while claims do
for _, claim in ipairs(claims) do
local start_index = claim:find('-')
if start_index then
local pre = claim:sub(0, start_index - 1)
local formats = cfg.formats_for_template_names[pre]
if formats then
claim = formatCode(claim, 'P300', formats, entity_id)
end
if mw.title.new('Template:Dati popolazione ' .. claim).exists then
iso31661, iso31662 = pre, claim
break
end
end
end
if iso31661 and iso31662 or user_input then break end
local cloned_wd_args = mw.clone(wd_args)
if superdivision_id then
cloned_wd_args.from = superdivision_id
end
claims, superdivision_id = getPropertyFromSuperdivision(cloned_wd_args)
end
return iso31661, iso31662
end
-- =============================================================================
-- classe DataManager
-- =============================================================================
local DataManager = {}
function DataManager:new(args)
local o = {}
setmetatable(o, self)
self.__index = self
if args then
self.args = args
self.iso31661, self.iso31662 = getISO3166Parts(args[1], args.from)
self.subdivision_code = getSubdivisionCode(args[2], self.iso31661, args.from)
self.metadata_arg = cfg.aliases[args[3]] or args[3]
self.default_value = args[4]
end
return o
end
function DataManager:getValue()
local ret = self.iso31662 and self:_getTemplateValue() or self:_getFallbackValue()
if self.args.formatstring and ret then
ret = formatOutput(self.args.formatstring, ret)
end
return ret
end
function DataManager:_getTemplateValue()
self.population = expandTemplate(self.iso31662, { self.subdivision_code })
if tonumber(self.population) then
self.population = mw.getContentLanguage():formatNum(tonumber(self.population))
end
return self.population
end
function DataManager:_getFallbackValue()
local ret = ''
if self:_isFallbackValueNeeded() then
if self.default_value then
local unformatted_num = self.default_value:gsub('%.', '')
if tonumber(unformatted_num) then
self.default_value = mw.getContentLanguage():formatNum(tonumber(unformatted_num))
end
ret = ret .. self.default_value
else
ret = ret .. (self:_getValueFromWikidata() or '')
end
end
ret = ret .. TEMPLATE_DATA_NOT_FOUND_CAT
return ret
end
function DataManager:_isFallbackValueNeeded()
return not(self.args[1] or self.args[2])
end
function DataManager:_getValueFromWikidata()
return mWikidata._getProperty({ 'P1082', from = self.args.from, n = 1,
qualifiertype = 'latest', formatnum = 'sì' })
end
-- =============================================================================
-- classe MetadataManager
-- =============================================================================
local MetadataManager = DataManager:new()
function MetadataManager:_getTemplateValue()
local template_args = { self.subdivision_code }
self.population = expandTemplate(self.iso31662, template_args)
if self.population then
table.insert(template_args, self.metadata_arg)
return expandTemplate(self.iso31662, template_args)
end
end
function MetadataManager:_getFallbackValue()
if self:_isFallbackValueNeeded() then
return self.default_value or self:_getValueFromWikidata()
end
end
function MetadataManager:_isFallbackValueNeeded()
return not(self.args[1] or self.args[2] or self.population)
end
function MetadataManager:_getValueFromWikidata()
local ret
if self.metadata_arg == 'STAND' then
local time = mWikidata._getQualifier({ 'P1082', 'P585', from = self.args.from,
n = 1, nq = 1, qualifiertype = 'latest', formatting = 'raw' })
if time then
ret = mw.getContentLanguage():formatDate('d-m-Y', time)
end
elseif self.metadata_arg == 'QUELLE' then
-- TODO
end
return ret
end
-- =============================================================================
-- Funzioni esportate
-- =============================================================================
local p = {}
function p.main(frame)
local args = getArgs(frame, { frameOnly = true })
local Manager = args[3] and MetadataManager or DataManager
if mw.title.getCurrentTitle().prefixedText ~= 'Discussioni modulo:Dati popolazione/test' then
args.from = mw.wikibase.getEntityIdForCurrentPage()
end
return Manager:new(args):getValue()
end
return p