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 .. '&nbsp;' .. 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') },
		
		{'&nbsp;• 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'},
		
		{'&nbsp;• 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 '&nbsp;') or '') .. (argumento['dirigentes_nombres'] or '')},
		{'&nbsp;• '.. (argumento['dirigente1_cargo'] or 'Dirigente') .. ((argumento['dirigente1_año'] and '&nbsp;<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' },
		{'&nbsp;• [[Coalición|Partidos gobernantes]]', argumento['partidos_gobernantes'],
			estiloetiqueta = 'border:0;padding:1px 7px;font-weight:100',
			estilodatos = 'border:0;padding:1px 7px 1px 1px' },
		{'&nbsp;• [[Coalición|Partidos gobernantes]]', argumento['partidos_gobernantes'],
			estiloetiqueta = 'border:0;padding:1px 7px;font-weight:100',
			estilodatos = 'border:0;padding:1px 7px 1px 1px' },
		{'&nbsp;• 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 '&nbsp;de ' .. argumento['número_entidades']) or '') or ((propiedad('P2046') or argumento['superficie'] or argumento['superficie_tierra'] or argumento['superficie_agua'] or argumento['fronteras']) and '&nbsp;') or '') },
			{"&nbsp;• 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 '') ..
	                    '}}' ),
	        },
			{'&nbsp;• Tierra', formatoCantidad(argumento['superficie'], 'km²')},
			{'&nbsp;• 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]]',
		  {'&nbsp;• Media',  propiedad('P2044') or formatoCantidad(argumento['elevación_media'] or argumento['elevación media'] or argumento['altitud'], 'msnm')},
		  {'&nbsp;• Máxima', formatoCantidad(argumento['elevación_alta'] or argumento['elevación alta'] or argumento['altitud_max'], 'msnm')},
		  {'&nbsp;• 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) .. '&nbsp;hab. <small>(' .. poblacion_a .. ')</small>'
	elseif poblacion then
		poblacion_txt = formatoNumeroSeparadorMillares(poblacion) .. '&nbsp;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', {}) },
		{	'&nbsp;• 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'
		},
		{	'&nbsp;• [[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 '&nbsp;'
  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