Ir al contenido

Módulo:Top

De Wikiviajes, la guía libre de viajes

La documentación para este módulo puede ser creada en Módulo:Top/doc

local function starts_with(str, start)
   return str:sub(1, #start) == start
end

local function renderRow(heading, value)
	return '|-\n| class="info" | \'\'\'' .. heading .. '\'\'\'\n| style="padding-right:5px;" | ' .. value .. '\n'
end

local function renderLinkedClaim(id)
	local linkTarget = mw.wikibase.sitelink(id)
	local linkName = mw.wikibase.label(id)
	if linkTarget == nil then
		return linkName
	else
		return '[[' .. linkTarget .. '|' .. linkName .. ']]'
	end
end

local function rSimple(item, property)
	return item:formatPropertyValues(property).value
end

local lang = mw.language.getContentLanguage()
local thousands = {'', 'mil', 'millón', 'mil millones'}

local function sigfigs(num)
	local digits = math.floor(math.log10(num) / 3)
	if digits <= 0 then
		return lang:formatNum(num)
	end
	num = math.floor(num / math.pow(10, 3 * digits -1)) / 10
	local result = lang:formatNum(num)
	result = result .. ' ' .. thousands[digits+1]
	return result
end

local function rPopulation(item, property, frame)
	local s = item:getBestStatements(property)[1]
	local result = sigfigs( tonumber(s.mainsnak.datavalue.value.amount) )

	if s.qualifiers ~= nil and s.qualifiers['P585'] ~= nil and #s.qualifiers['P585'] > 0 then
		result = result .. ' (' ..  string.match(s.qualifiers['P585'][1].datavalue.value.time, '0*([1-9][0-9]+)\-', 1) .. ')'
	end
	return result
end

local function rElectricity(item, property)
	local claims = item:getBestStatements(property)
	local voltage = {}
	for _,s in pairs(claims) do 
		local v = mw.wikibase.renderSnak(s.mainsnak)
		if s.qualifiers ~= nil and s.qualifiers['P2144'] ~= nil and #s.qualifiers['P2144'] > 0 then
			v = v .. ' / ' .. mw.wikibase.renderSnak(s.qualifiers['P2144'][1])
		end
		table.insert(voltage, v)
	end
	local result = table.concat(voltage, ' y ')
	if #item:getBestStatements('P2853') > 0 then
		result = result .. ' (' .. item:formatPropertyValues('P2853').value .. ')'
	end
	return result
end

local function claimOrLabel(id, property) 
	local item = mw.wikibase.getEntity(id)
	if #item:getBestStatements(property) > 0 and item:getBestStatements(property)[1].mainsnak.datavalue ~= nil then
		return mw.wikibase.renderSnak(item:getBestStatements(property)[1].mainsnak)
	end
	return item:getLabel()
end

local function rCurrency(item, property)
	local claims = item:getBestStatements(property)
	local result = {}
	for _, claim in pairs(claims) do
		local id = 'Q' .. claim.mainsnak.datavalue.value['numeric-id']
		local currency = mw.wikibase.getEntity(id)
		local subresult = currency:getLabel()
		local symbol = claimOrLabel(id, 'P498')
		if symbol ~= currency:getLabel() then
			subresult = subresult .. ' (' .. symbol .. ')'
		end
		table.insert(result, subresult)
	end
	return table.concat(result, '<br/>')
end

local function rEmergency(item, property)
	local claims = item:getBestStatements(property)
	local result = {}
	for _, claim in pairs(claims) do
		local id = 'Q' .. claim.mainsnak.datavalue.value['numeric-id']
		local res = claimOrLabel(id, 'P1329')
		if claim.qualifiers ~= nil and claim.qualifiers['P366'] ~= nil and #claim.qualifiers['P366'] > 0 then
			local usage = {}
			for _, qual in pairs(claim.qualifiers['P366']) do
				table.insert(usage, mw.wikibase.renderSnak(qual))
			end
			res = res .. ' (' .. table.concat(usage, ', ') .. ')'
		end
		table.insert(result, res)
	end
	return table.concat(result, ', ')
end

local function rTimezones(item, property)
	local claims = item:getBestStatements(property)
	if #claims > 3 then
		local minEntity = nil
		local maxEntity = nil
		local minOffset = 20
		local maxOffset = -20
		local unknownTZs = {}
		for _, claim in pairs(claims) do
			local e = mw.wikibase.getEntity('Q' .. claim.mainsnak.datavalue.value['numeric-id'])
			if #e:getBestStatements('P2907') == 1 then
				local val = tonumber(e:getBestStatements('P2907')[1].mainsnak.datavalue.value.amount)
				if val < minOffset then
					minOffset = val
					minEntity = e
				end
				if val > maxOffset then
					maxOffset = val
					maxEntity = e
				end
			else
				table.insert(unknownTZs, e:getLabel())
			end
		end
		if minEntity ~= nil and maxEntity ~= nil and minOffset ~= maxOffset then
			local r = minEntity:getLabel() .. ' a ' .. maxEntity:getLabel()
			if #unknownTZs > 0 then
				r = r .. ' y ' .. table.concat(unknownTZs, ', ')
			end
			return r
		end
	end
	return rSimple(item, property)
end

local function rSingleLinked(item, property)
	if item:getBestStatements(property)[1].mainsnak.datavalue ~= nil then
		return renderLinkedClaim('Q' .. item:getBestStatements(property)[1].mainsnak.datavalue.value['numeric-id'])
	else
		return nil
	end
end

local function rLinked(item, property)
	local claims = item.claims[property]
	local result = {}
	for _, claim in pairs(claims) do
		local id = 'Q' .. claim.mainsnak.datavalue.value['numeric-id']
		table.insert(result, renderLinkedClaim(id))
	end
	return table.concat(result, ', ')
end

local conf = {
	{'capital', 'Capital', 36, rSingleLinked},
	{'currency', 'Moneda', 38, rCurrency},
	{'population', 'Población', 1082, rPopulation},
	{'electricity', '[[Sistemas eléctricos|Electricidad]]', 2884, rElectricity},
	{'callingcode', 'Código telefónico', 474, rSimple},
	{'timezone', 'Huso horario', 421, rTimezones},
	{'emergencies', 'Emergencias', 2852, rEmergency},
	{'driving side', 'Lado de conducción', 1622, rSimple}
}

local p = {}

function p.quickbar(frame)
	local parentArgs = frame:getParent().args
	local elements = {}

	local item = mw.wikibase.getEntity()

	local useWikidata = (item ~= nil and item.claims ~= nil)
	local missingInfo = false

	-- Se elimina la recopilación de la imagen de localización (P242)

	for _, params in pairs(conf) do
		if params[3] ~= 0 then
			local val = parentArgs[params[1]]
			if (val and starts_with(val, '#Q')) then
				item = mw.wikibase.getEntity(val:gsub("#", ""))
				val = nil
			end
			if val == '' or val == nil then
				if useWikidata and #item:getBestStatements('P' .. params[3]) > 0 then
					val = params[4](item, 'P' .. params[3], frame)
					if val ~= nil then
						table.insert(elements, renderRow(params[2], val))
					else
						missingInfo = true
					end
				else
					missingInfo = true
				end
			else
				table.insert(elements, renderRow(params[2], val))
			end
		end
		item = mw.wikibase.getEntity()
	end

	local editRow = ''
	if item ~= nil then
		editRow = '|-\n| colspan="2" class="info footer" |[[:d:' .. item.id .. '|editar en Wikidata]]\n'
	end

	if #elements > 0 then
		return frame:extensionTag {name = 'templatestyles', args = {src = 'Top/estilo.css'}} .. 
			'<div id="quickbar" class="wv-quickbar floatright">\n{| cellpadding="0" cellspacing="0"\n|-\n' ..
			table.concat(elements) ..
			'\n' .. editRow .. '|}</div>'
	else
		return ''
	end
end

return p