Modulo:Dati popolazione/sandbox

Da Wikipedia, l'enciclopedia libera.
Vai alla navigazione Vai alla ricerca
require('strict')

local cfg = mw.loadData('Modulo:Dati popolazione/Configurazione/sandbox')
local getArgs = require('Module:Arguments').getArgs
local mWikidata = require('Modulo:Wikidata')

-- =============================================================================
--                            Funzioni di utilità
-- =============================================================================

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()
	return self.iso31662 and self:_getTemplateValue() or self:_getFallbackValue()
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()
	if self:_isFallbackValueNeeded() then
		return self.default_value or self:_getValueFromWikidata()
	end
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:_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)
	local Manager = args[3] and MetadataManager or DataManager
	args[4] = frame.args[4]

	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