Módulo:Zona de pruebas/Juan Mayordomo/ficha de entidad subnacional
Este módulo no tiene página de documentación[crear]
-- MÓDULO EN DESARROLLO
-- Implementado código hasta distancias
-- Falta comprobar si existe artículo local para la bandera y el escudo en caso de que no se de como parámetro
-- Falta por añadir los mapas de localización
-- Falta lista de entidades intermedias, intentar hacerlo con acceso arbitrario para poder cargarlo de Wikidata
-- Falta el bloque de fundación
local z = {}
local argumentos -- Tabla de argumentos con los que se llama a la función
local argumento={} -- Argumentos eliminando los argumentos sin datos
local Entidad -- Tabla con los datos en Wikidata del libro.
-- Ver Wikidata:WikiProject Books para las propiedades posibles
local algunaPropiedadEnlazaWikidata -- Para alguna propiedad no existe la etiqueta ni el enlace mostrándose algo de la forma d:...
-- Módulos utilizados
local ModuloArgumentos = require('Módulo:Argumentos')
local ModuloFicha = require('Módulo:Ficha')
local ModuloWikidata = require('Módulo:Wikidata')
-- Constantes
local titleCoord = {['tipo'] = 'city', ['uno'] = 'sí', ['formato'] = 'dms', ['display'] = 'inline,title'}
local inlineCoord = {['tipo'] = 'city', ['uno'] = 'sí', ['formato'] = 'dms', ['display'] = 'inline'}
local es = mw.language.new('es')
local function formatoCantidad(cantidad, unidad)
if not cantidad then
return
end
if cantidad == '1' then
return '1 ' .. unidad
end
local cantidadNumerica = tonumber(cantidad)
if cantidadNumerica then
return es:formatNum(cantidadNumerica) .. ' ' .. unidad
else
return cantidad .. ' ' .. unidad
end
end
function z.Ficha(frame)
-- Hacer que funcione la función formatBandera y formatoGentilicio
ModuloWikidata:setFrame(frame) -- No funciona si se pone ModuloWikidata.setFrame(marco)
-- Obtener una copia de los argumentos eliminando los argumentos sin valor
local argumento = ModuloArgumentos.obtenerArgumentosConValor(frame)
-- Obtener datos complejos
-- Obtener los datos de la página donde se inserta la ficha de Wikidata.
Entidad = mw.wikibase.getEntityObject(argumento['entidad'] or nil) or {}
nombreOficial = argumento['nombre'] or argumento['nombre_oficial'] or argumento['nombre completo'] or frame:preprocess('{{Título sin coletilla}}')
nombreOriginal = argumento['nombre original']
if nombreOficial and nombreOriginal and nombreOficial ~= nombreOriginal then
titulo = nombreOficial .. '<br /><span style="font-size:smaller">' .. nombreOriginal .. '</span>'
else
titulo = nombreOficial or nombreOriginal
end
unidad = argumento['unidad'] or propiedad('P31', {['formato texto'] = 'mayúscula', ['rango_mayor'] = 'sí', ['prioridad'] = 'sí'}) or '[[Entidad subnacional]]'
pais = propiedad('P17', {['prioridad'] = 'sí'}) or argumento['país']
if unidad and pais then
subtitulo = unidad .. ' ' .. frame:preprocess('{{de país|' .. pais .. '}}')
else
subtitulo = unidad
end
imagenBandera = ''
if not (argumento['imagen_bandera'] == 'no' or argumento['bandera'] == 'no') then
imagenBandera = propiedad('P41', {['uno'] = 'sí', ['categorías'] = 'no'}) or argumento['imagen_bandera'] or argumento['bandera'] or 'Flag of None.svg'
end
imagenEscudo = ''
if not (argumento['imagen_escudo'] == 'no' or argumento['escudo'] == 'no') then
imagenEscudo = propiedad('P94', {['uno'] = 'sí', ['categorías'] = 'no'}) or argumento['imagen_escudo'] or argumento['escudo'] or 'Coats of arms of None.svg'
end
if argumento['ciudad_grande'] ~= argumento['capital'] and argumento['ciudad_grande'] ~= propiedad('P36') then
ciudadMasGrande = argumento['ciudad_grande']
end
local Ficha = {
entidad = argumento['entidad'],
--clase = 'geography vcard',
clasetitulo = 'mapa fn org',
estilotitulo = 'padding:0',
titulo = titulo,
estilosubtitulo1 = 'font-size:100%; font-weight:bold; background-color:#cddeff',
subtitulo = subtitulo,
--estiloetiqueta = 'padding:2px 7px 1px 7px; width:30%;',
--estilodatos = 'padding:2px 7px 1px 1px',
estiloetiqueta = 'width:30%;',
imagensuperior = argumento['img_panorama_urb'] or argumento['image_skyline'] or argumento['imagen'],
estilopiesuperior = 'font-size:smaller; font-weight:bold',
piesuperior = argumento['image_caption'] or argumento['pie_img_panorama_urb'] or argumento['pie_de_imagen'],
['tamañoimagensuperior'] = argumento['imagesize'] or argumento['tam_img_panorama_urb'] or argumento['tamaño_imagen'] or '250px',
imagenizquierda = imagenBandera,
['tamañoimagenizquierda'] = argumento['bandera_tamaño'] or argumento['imagen_bandera_tamaño'] or '100x78px',
estilopieizquierdo = 'font-size:smaller; font-weight:bold',
pieizquierdo = propiedad('P163', {['etiqueta'] = 'Bandera', ['uno'] = 'sí'}) or argumento['artículo_bandera'] or 'Bandera',
imagenderecha = imagenEscudo,
['tamañoimagenderecha'] = argumento['escudo_tamaño'] or argumento['imagen_escudo_tamaño'] or '88x88px',
estilopiederecha = 'font-size:smaller; font-weight:bold',
piederecho = propiedad('P237', {['etiqueta'] = 'Escudo', ['uno'] = 'sí'}) or argumento['artículo_escudo'] or 'Escudo',
datosup1 = (argumento['apodo'] and '[[Apodo|Otros nombres]]: <span style="font-style:italic">' .. argumento['apodo'] .. '</span>') or '',
datosup2 = (argumento['lema'] and '[[Anexo:Lemas de Estado|Lema]]: ' .. argumento['lema']) or '',
datosup3 = (argumento['himno'] and '[[Himno]]:' .. argumento['himno']) or '',
{'[[Coordenadas geográficas|Coordenadas]]', propiedad('P625', titleCoord) },
obtenerDatosCapital(),
{'Ciudad más poblada', ciudadMasGrande},
{'[[Idioma oficial]]', argumento['idioma'] or argumento['idiomas'] or argumento['lengua'] or argumento['idiomas_oficiales'] or propiedad('P37') },
{' • Co-oficiales', (argumento['idioma'] or argumento['idiomas'] or argumento['lengua'] or argumento['idiomas_oficiales'] or propiedad('P37')) and
(argumento['idiomas_co-oficiales'] or argumento['idiomas co-oficiales'] or argumento['idioma_co-oficial'] or argumento['idioma co-oficial']),
estiloetiqueta = 'border:0;padding:1px 7px;font-weight:100',
estilodatos = 'border:0;padding:1px 7px 1px 1px'},
{' • Otros idiomas', (argumento['idioma'] or argumento['idiomas'] or argumento['lengua']) and (argumento['otros_idiomas'] or argumento['otros idiomas']) },
{argumento['dirigentes_títulos'] or 'Dirigentes', ((argumento['dirigente1'] and ' ') or '') .. (argumento['dirigentes_nombres'] or '')},
{' • '.. (argumento['dirigente1_cargo'] or 'Dirigente') .. ((argumento['dirigente1_año'] and ' <span style="font-weight:normal; font-size:90%">('..argumento['dirigente1_año']) or '') .. ')</span>',
argumento['dirigente1'],
estiloetiqueta = 'border:0;padding:1px 7px;font-weight:100',
estilodatos = 'border:0;padding:1px 7px 1px 1px' },
{' • [[Coalición|Partidos gobernantes]]', argumento['partidos_gobernantes'],
estiloetiqueta = 'border:0;padding:1px 7px;font-weight:100',
estilodatos = 'border:0;padding:1px 7px 1px 1px' },
{' • [[Coalición|Partidos gobernantes]]', argumento['partidos_gobernantes'],
estiloetiqueta = 'border:0;padding:1px 7px;font-weight:100',
estilodatos = 'border:0;padding:1px 7px 1px 1px' },
{' • Escaños' .. ((argumento['partidos'] and ('<br />' .. argumento['partidos'])) or ''), argumento['escaños'],
estiloetiqueta = 'border:0;padding:1px 7px;font-weight:100',
estilodatos = 'border:0;padding:1px 7px 1px 1px' },
{'Subdivisiones', argumento['subdivisión']},
{argumento['tipo_div_1'], argumento['div1'],
estiloetiqueta = 'border:0;padding:1px 7px;font-weight:100',
estilodatos = 'border:0;padding:1px 7px 1px 1px' },
{argumento['tipo_div_2'], argumento['div2'],
estiloetiqueta = 'border:0;padding:1px 7px;font-weight:100',
estilodatos = 'border:0;padding:1px 7px 1px 1px' },
{argumento['tipo_div_3'], argumento['div3'],
estiloetiqueta = 'border:0;padding:1px 7px;font-weight:100',
estilodatos = 'border:0;padding:1px 7px 1px 1px' },
{ tipo = 'sección',
{"'''[[Área|Superficie]]'''", (argumento['superficie_puesto'] and 'Puesto ' .. argumento['superficie_puesto'] .. '.º' .. ((argumento['número_entidades'] and ' de ' .. argumento['número_entidades']) or '') or ((propiedad('P2046') or argumento['superficie'] or argumento['superficie_tierra'] or argumento['superficie_agua'] or argumento['fronteras']) and ' ') or '') },
{" • Total", frame:preprocess('{{#if: {{#property:P2046}}' ..
'| {{formatnum:{{Propiedad|P2046|formato unidad=número}}}} [[kilómetro cuadrado|km²]]' .. (argumento['superficie_post'] or '') ..
'| ' .. ((argumento['superficie'] and argumento['superficie'] .. ' [[kilómetro cuadrado|km²]]' .. (argumento['superficie_post'] or '')) or '') ..
'}}' ),
},
{' • Tierra', formatoCantidad(argumento['superficie'], 'km²')},
{' • Agua', formatoCantidad(argumento['superficie_agua'], 'km²')},
},
{ '[[Frontera]]s', argumento['fronteras'],
estiloetiqueta = 'border:0;padding:1px 7px',
estilodatos = 'border:0;padding:1px 7px 1px 1px' },
{ tipo = 'sección',
titulo = '[[Altitud]]',
{' • Media', propiedad('P2044') or formatoCantidad(argumento['elevación_media'] or argumento['elevación media'] or argumento['altitud'], 'msnm')},
{' • Máxima', formatoCantidad(argumento['elevación_alta'] or argumento['elevación alta'] or argumento['altitud_max'], 'msnm')},
{' • Mínima', formatoCantidad(argumento['elevación_baja'] or argumento['elevación baja'] or argumento['altitud_min'], 'msnm')},
},
}
categorias = ''
return ModuloFicha.infobox(Ficha) .. categorias
end
function obtenerDatosCapital()
capitalEntity = obtenerEntidadesEnPropiedad('P36')[1]
capital = propiedad('P36') or argumento['capital']
coordenadas = propiedad('P625', inlineCoord, capitalEntity)
if not capital then return {} end
poblacionBase = propiedadSinFormato('P1082', {['rangoMayor'] = 'sí'}, capitalEntity)
poblacion = ModuloWikidata.formatoDato(poblacionBase[1].mainsnak, {})
poblacion_a = ModuloWikidata.formatoDato(poblacionBase[1].qualifiers['P585'][1], {['formatoFecha'] = 'año'})
if poblacion and poblacion_a then
poblacion_txt = formatoNumeroSeparadorMillares(poblacion) .. ' hab. <small>(' .. poblacion_a .. ')</small>'
elseif poblacion then
poblacion_txt = formatoNumeroSeparadorMillares(poblacion) .. ' hab.'
else
poblacion_txt = argumento['capital_poblacion']
end
return { tipo = 'sección',
estiloetiqueta = 'padding:2px 7px; width:30%;',
estilodatos = 'padding:2px 7px',
{ argumento['capital_denominación'] or '[[Capital (política)|Capital]]', argumento['capital'] or propiedad('P36', {}) },
{ ' • Población', poblacion_txt ,
estiloetiqueta = 'font-size:90%;border:0;padding:1px 7px;font-weight:100',
estilodatos = 'font-size:90%;border:0;padding:1px 7px 1px 1px'
},
{ ' • [[Coordenadas geográficas|Coordenadas]]', coordenadas,
estiloetiqueta = 'border:0;padding:1px 7px;font-weight:100;font-size:90%',
estilodatos = 'border:0;padding:1px 7px 1px 1px;font-size:90%'
}
}
end
-- Función que devuelve la lista de los valores de una propiedad en Wikidata formateados
function propiedad(idPropiedad,opciones,entidad)
entidad = entidad or Entidad
if entidad and entidad.claims and entidad.claims[idPropiedad] then
if not opciones then
opciones = {}
end
opciones['propiedad'] = idPropiedad
valorPropiedad = ModuloWikidata.getPropiedad(opciones,entidad.claims[idPropiedad])
if valorPropiedad and valorPropiedad:match('%[%[:d:') then
algunaPropiedadEnlazaWikidata = true
end
return valorPropiedad
end
end
function propiedadSinFormato(idPropiedad, opciones, entidad)
entidad = entidad or Entidad
if entidad and entidad.claims and entidad.claims[idPropiedad] then
opciones = opciones or {}
opciones['propiedad'] = idPropiedad
propiedades = {}
if opciones['rangoMayor'] == 'sí' then
preferred = {}
normal = {}
for k,v in pairs(entidad.claims[idPropiedad]) do
if v.rank == 'preferred' then
preferred[#preferred+1] = v
elseif v.rank == 'normal' then
normal[#normal+1] = v
end
end
if #preferred > 0 then
propiedades = preferred
else
propiedades = normal
end
else
propiedades = entidad.claims[idPropiedad]
end
return propiedades
end
end
-- Carga mediante acceso arbitrario las entidades que están enlazadas a una propiedad
function obtenerEntidadesEnPropiedad(idPropiedad)
local entidades = {}
local componentes = Entidad and Entidad.claims and Entidad.claims[idPropiedad]
if componentes then
for k,v in pairs(componentes) do
local value = v and v.mainsnak and v.mainsnak.datavalue and v.mainsnak.datavalue.value or {}
if value and value['numeric-id'] then
entidades[k] = mw.wikibase.getEntityObject('Q' .. value['numeric-id'])
end
end
end
return entidades
end
function obtenerEtiquetaWikidata()
if Entidad and Entidad.labels and Entidad.labels.es then
return Entidad.labels.es.value
end
end
function formatoNumeroSeparadorMillares(numero, separador)
separador = separador or ' '
local formato = numero
while true do
formato, k = string.gsub(formato, "^(-?%d+)(%d%d%d)", '%1'..separador..'%2')
if (k==0) then
break
end
end
return formato
end
return z