Este módulo implementa las fichas que pretende reemplazar a la actual implementación de

el cual a su vez es implementado por Módulo:Ficha animanga.


-- Este módulo auxiliar contiene fichas que usan junto con 'Módulo:Ficha animanga'

local p = {}

local ModuloFicha				= require('Módulo:Ficha animanga')
local ModuloWikidata			= require('Módulo:Wikidata')
local ModuloFormatos			= require('Módulo:Wikidata/Formatos')
local ModuloPaginas				= require('Módulo:Páginas')
local ModuloArgs    			= require('Módulo:Argumentos')
local elementoTabla				= require('Módulo:Tablas').elemento
local formatoNumero				= ModuloFormatos.formatoNumero2
local numeroUnidad				= ModuloFormatos.formatoUnidad2
local lang						= mw.language.new('es')
local obtenerEtiquetaWikidata	= ModuloWikidata.obtenerEtiquetaWikidata
local obtenerImagenWikidata		= ModuloWikidata.obtenerImagenWikidata
local argumentos				= ModuloArgs.obtenerValorDeArgumentos
local ficha						= ModuloFicha.infobox

-- :: Tablas de datos
local Datos						= mw.loadData('Módulo:Ficha_animanga/datos')
local ColoresCabello			= mw.loadData('Módulo:Ficha de personaje/Colores')

-- Variables globales
local Entidad, InstanciaDeID, Integrada, Titulo, Subtitulo, TamanoImagen, Pie, PieTabla,  ClaseTitulo, EstiloTitulo, EstiloSubtitulo, EstiloEtiqueta,  anchoImagen, ColorTituloFondo, ColorTituloTexto, ColorEtiqueta

-- Esta función establece los vaores iniciales de cada ficha
local function _init(frame)
	ModuloWikidata:setFrame(frame)
	ModuloArgs.obtenerTablaDeArgumentos(frame)
	argumentos(frame)
	Entidad			= mw.wikibase.getEntityObject(argumentos{'entidad', 'id'}) or {}
	InstanciaDeID	= propiedad('P31', {['formato'] = 'entidadID'})

	-- :: Estilos globales
	ClaseTitulo		= 'animanga'
	EstiloTitulo	= 'font-weight:bold;'
	EstiloSubtitulo	= 'font-style:italic;font-size:120%'
	EstiloEtiqueta	= 'width:30%;font-weight:bold;'
	EstiloDatos		= 'width:70%;'
	anchoImagen		= '245px'
	ColorTituloFondo= '#ccccff'
	ColorTituloTexto= '#000000'
	ColorEtiqueta	= '#eeeeff'

	Integrada		= argumentos{'uni', 'child', 'integrada', 'animanga'} or 'sí'

	Titulo			= argumentos{'titulo', 'título', {obtenerEtiquetaWikidata, Entidad}, {ModuloPaginas.nombrePagina, {desambiguar='sí'}}}
	Subtitulo		= argumentos{'eslogan', 'slogan', 'subtítulo', {propiedad, 'P6291'}} or ''
	
	-- :: Imagen del encabezado
	Imagen			= argumentos{'imagen', 'image', 'logo', 'Imagen'}
	TamanoImagen	= argumentos{'tamaño de imagen', 'image_width', 'tamaño imagen', 'tamaño_imagen'} or '250px'
	if Imagen then
		Pie			= argumentos{'pie', 'image_caption'}
	else
		Imagen, Pie	= aaa --obtenerImagenWikidata('P18') or obtenerImagenWikidata('P154')
	end
	
	-- :: Pie de tabla
	local PieTabla		= argumentos{'1'}-- or 'logo'
	local PieDatos	= {
		['logo']	= {
			"vertical-align:middle;text-align:left;float-left;background:#ccccff",
			"[[Archivo:Wikipe-tan face.jpg|50px]]'''[[Portal:Anime y Manga|<span style=\"color:black;margin-left:6px\">Portal Anime y Manga</span>]]'''",
			},
		['normal']	= {
			'background:#ccccff',
			"'''[[Portal:Anime y Manga|<span style=\"color:black\">Portal Anime y Manga</span>]]'''",
			},
		}
	if PieDatos[Pie] then
		EstiloPie	= PieDatos[Pie][1]
		PieTabla	= PieDatos[Pie][2]
	end
end

function p.fichaEncabezado(frame)
	-- :: Inicializador
	_init(frame)

	-- Colores de la ficha en base al color de cabello del personaje
	local ColorAuto		= argumentos{'color auto', 'color_auto'} or 'sí'
	local ColorCabello	= propiedad('P1884', {['formato'] = 'entidadID'})
	if ColoresCabello[ColorCabello] and ColorAuto then
		ColorTituloFondo= ColoresCabello[ColorCabello][1]
		ColorTituloTexto= ColoresCabello[ColorCabello][3]
		ColorEtiqueta	= ColoresCabello[ColorCabello][2]
	end

	-- :: General
	local NombreOrig	= argumentos{'nombre_original', 'nombre original', 'real', 'nombrejapon', 'japanname', 'namejapon', 'nombre_ja', 'ja_kanji', {propiedad, 'P1476', {['idioma'] = 'ja'}}}
	--if NombreOrig then Titulo = Titulo .. '<br><small>' .. NombreOrig .. '</small>' end

	local Autor			= argumentos{'creador', 'autor', {propiedad, 'P50'}}
	
	local Genero		= argumentos{'género', 'genero', 'genre', {propiedad, 'P136', {['lista'] = 'nobullet'}}}
	
	-- :: Estilos
	ColorTituloFondo	= argumentos{'piel', 'colorfondo'} or ColorTituloFondo
	ColorTituloTexto	= argumentos{'colortexto'} or ColorTituloTexto
	EstiloTitulo		= EstiloTitulo .. 'font-style:italic;background-color:' .. ColorTituloFondo .. ';color:' .. ColorTituloTexto
	EstiloEtiqueta		= argumentos{'estiloetiqueta'} or EstiloEtiqueta .. ';background-color:' .. ColorEtiqueta
	
	local TablaFicha = {
		tipo				= 'cabecera',
		uni					= Integrada,
		titulo  			= Titulo,
		clasetitulo			= ClaseTitulo,
		estilotitulo		= EstiloTitulo,
		estilosubtitulo		= EstiloTitulo,
		estiloetiqueta		= EstiloEtiqueta,
		estilodatos			= EstiloDatos,
		imagen				= Imagen,
		["tamañoimagen"]	= TamanoImagen,
		pie					= Pie,
		estilopie			= "font-size:88%",
		{tipo="sección",
			estilodatos		= EstiloDatos,
			{'Autor', Autor},
			{'Género', Genero},
		}
	}
	return ficha(TablaFicha)
end

function p.fichaPrincipal(frame)
	-- :: Inicializador
	_init(frame)

	-- :: General
	local NombreOrig	= argumentos{'nombre_original', 'nombre original', 'real', 'nombrejapon', 'japanname', 'namejapon', 'nombre_ja', 'ja_kanji', {propiedad, 'P1476', {['idioma'] = 'ja', ['calificativo'] = 'P2440'}}, {propiedad, 'P1559', {['idioma'] = 'ja', ['calificativo'] = 'P2440'}}, {propiedad, 'P1705', {['idioma'] = 'ja', ['calificativo'] = 'P2440'}}} or ''
	
	local OtrosNombres	= argumentos{'título_otros', 'titulo_otros', {propiedad, 'P4970', {['lista'] = 'nobullet'}}}
	local Autor			= argumentos{'autor', 'author', 'creador', 'mangaka', {propiedad, 'P50', {['lista'] = 'nobullet'}}}
	local Director		= argumentos{'director', {propiedad, 'P57', {['lista'] = 'nobullet'}}}
	local Ilustrador	= argumentos{'ilustrador', 'illustrator', {propiedad, 'P110', {['lista'] = 'nobullet'}}}
	local Disenador		= argumentos{'diseñador', 'designer', {propiedad, 'P287', {['lista'] = 'nobullet'}}}
	local Productor		= argumentos{'productor', 'producción', 'producer', {propiedad, 'P162'}}
	local Escritor		= argumentos{'escritor', 'writer', {propiedad, 'P98', {['lista'] = 'nobullet'}}}
	local Guion			= argumentos{'guión', 'guion', 'script', {propiedad, 'P58', {['lista'] = 'nobullet'}}}
	local Estudio		= argumentos{'estudio', 'studio', {propiedad, 'P272', {['lista'] = 'nobullet'}}}
	local Imprenta		= argumentos{'imprenta', 'imprint', {propiedad, 'P872', {['lista'] = 'nobullet'}}}
	local Cadena		= argumentos{'cadena', 'emisora', 'station', {propiedad, 'P449', {['lista'] = 'nobullet'}}}
	local OtrasCadenas	= argumentos{'cadena_otros', 'cadena otros', {propiedad, 'P750', {['lista'] = 'nobullet'}}}
	if OtrasCadenas then OtrasCadenas = seccionDesplegable(frame, 'Otras cadenas', OtrasCadenas, ColorEtiqueta) end
	local Editorial		= argumentos{'editorial', {propiedad, 'P123', {['lista'] = 'nobullet'}}}
	local OtrasEdit		= argumentos{'editorial_otros', 'editorial_otros'}
	if OtrasEdit then OtrasEdit = seccionDesplegable(frame, 'Otras editoriales', OtrasEdit, ColorEtiqueta) end
	local Revista		= argumentos{'revista', 'magazine', 'publicado en', {propiedad, 'P1433', {['lista'] = 'nobullet'}}}
	local Compositor	= argumentos{'música', 'musica', 'compositor', 'composer', {propiedad, 'P86', {['lista'] = 'nobullet'}}}
	local Reparto		= argumentos{'reparto', 'cast', {propiedad, 'P161', {['lista'] = 'nobullet'}}}
	local Licenciador	= argumentos{'licencia', 'licensee', 'licensor', {propiedad, 'P275', {['lista'] = 'nobullet'}}}
	local Desarrollador	= argumentos{'desarrollador', 'developer', {propiedad, 'P178', {['lista'] = 'nobullet'}}}
	local Distribuidor	= argumentos{'distribuidor', 'publisher', {propiedad, 'P750', {['lista'] = 'nobullet'}}}
	local Demografia	= argumentos{'demografía', 'demografia', 'demographic', {propiedad, 'P2360', {['lista'] = 'nobullet'}}}
	local Genero		= argumentos{'género', 'genero', {propiedad, 'P136', {['lista'] = 'nobullet'}}}
	local Motor			= argumentos{'motor', {propiedad, 'P408', {['lista'] = 'nobullet'}}}
	local Plataforma	= argumentos{'plataforma', 'platform', {propiedad, 'P400', {['lista'] = 'nobullet'}}}
	local Clasificacion	= argumentos{'clasificación', 'clasificacion'}
	local Inicio		= argumentos{'fecha_inicio', 'lanzamiento', 'estreno', 'first', {propiedad, 'P577', {['enlace'] = 'no'}},
		{propiedad, 'P1191', {['enlace'] = 'no'}}, {propiedad, 'P577', {['enlace'] = 'no'}}, {propiedad, 'P580', {['enlace'] = 'no'}}}
	local Fin			= argumentos{'fecha_fin', 'último', 'ultimo', 'last', {propiedad, 'P582', {['enlace'] = 'no'}}}
	local Duracion		= argumentos{'duración', 'duracion', 'runtime', {propiedad, 'P2047'}}
	local Episodios		= argumentos{'num_episodios', 'episodes', {propiedad, 'P1113'}}
	local ListaEpisodios= argumentos{'lista_episodios', 'lista episodios', 'episode_list', {propiedad, 'P1113', {['calificador'] = 'P1811'}}}
	local RefEpisodios	= argumentos{'ref_episodios', {propiedad, 'P1113', {['calificador'] = 'P854'}}}
	local Volumenes		= argumentos{'num_volumen', 'volumes', {propiedad, 'P2635'}}
	local ListaVolumenes= argumentos{'lista_volumen', 'lista volumen', 'volume_list', {propiedad, 'P2635', {['calificador'] = 'P1811'}}}
	local RefVolumenes	= argumentos{'ref_volumen', {propiedad, 'P2635', {['calificador'] = 'P854'}}}
	local Pais			= argumentos{'paíslanzamiento', 'paislanzamiento', {propiedad, 'P495'}}
	local Idiomas		= argumentos{'idioma', 'idiomas', 'lang', {propiedad, 'P407', {['lista'] = 'nobullet'}}}
	local ISBN10		= argumentos{'isbn10', 'isbn-10', {propiedad, 'P957'}}
	local ISBN13		= argumentos{'isbn', 'isbn13', 'isbn-13', {propiedad, 'P212'}}
	local ISBN			= ISBN13 or ISBN10 or ''
	local Contenido		= argumentos{'contenido'}

	local NoCategorizar	= argumentos{'nocat', 'no_cat'}
	local Categoria		= {}
	local Anio			= argumentos{'año'}
	--if pcall(lang:formatDate('Y', Inicio)) then Anio = Anio or lang:formatDate('Y', Inicio)	end
	
	local TipoObra		= string.lower(argumentos{'tipo', 'type'} or InstanciaDeID or 'otro')
	local TipoObraSubtitulo
	local TipoObraInicio='Fecha de inicio'
	local TipoObraFin	='Fecha de fin'
	local TipoObraEstudioEditorial = 'Estudio'
	local TipoObraCategoria
	
	local EstudioCategoria = argumentos{'estudio', 'studio', {propiedad, 'P272', {['formato'] = 'entidadID'}}}
	if Datos['estudios'][EstudioCategoria] then table.insert(Categoria,'[[Categoría:' .. Datos['estudios'][EstudioCategoria] .. ']]') end
	
	if Datos['tipo_obra'][TipoObra] then
		TipoObraSubtitulo		= Datos['tipo_obra'][TipoObra][1]
		TipoObraInicio			= Datos['tipo_obra'][TipoObra][2]
		TipoObraFin				= Datos['tipo_obra'][TipoObra][3]
		TipoObraEstudioEditorial= Datos['tipo_obra'][TipoObra][4]
		TipoObraCategoria		= (function()
			local Pais = argumentos{'paíslanzamiento', 'paislanzamiento', {propiedad, 'P495', {['enlace'] = 'no'}}}
			if Datos['tipo_obra'][TipoObra][6] and Pais and Pais ~= 'Japón' then
				return Datos['tipo_obra'][TipoObra][6] .. ' de ' .. Pais
			end
			return Datos['tipo_obra'][TipoObra][5]
		end)()
			
	end

	if TipoObraCategoria and not NoCategorizar then
		if Anio then
		table.insert(Categoria,'[[Categoría:' .. TipoObraCategoria .. 'de ' .. Anio .. ']]')
		else
			table.insert(Categoria,'[[Categoría:' .. TipoObraCategoria .. ']]')
		end
	end
	
	if Entidad then table.insert(Categoria, '[[Categoría:Animanga con datos en Wikidata]]') end
	
	Categoria = table.concat(Categoria,'')
	
	-- :: Datos externos
	local identificadoresExternos = {}
	local imdbId	= argumentos{'imdbid', 'imdbId', {propiedad, 'P345', {['uno'] = 'sí'}}}
	local ANNaop	= argumentos{'ann_aop', {propiedad, 'P1985', {['uno'] = 'sí'}}}
	local ANNm		= argumentos{'ann_m', {propiedad, 'P1984', {['uno'] = 'sí'}}}
	local VNDB		= argumentos{'vndb', {propiedad, 'P3180', {['uno'] = 'sí'}}}

	if imdbId then table.insert(identificadoresExternos, '[https://www.imdb.com/title/'..imdbId..'/ Ficha] en [[Internet Movie Database]]') end
	if ANNaop then table.insert(identificadoresExternos, '[https://www.animenewsnetwork.com/encyclopedia/anime.php?id='..ANNaop..'/ Ficha] en [[Anime News Network]]') end
	if ANNm then table.insert(identificadoresExternos, '[https://www.animenewsnetwork.com/encyclopedia/manga.php?id='..ANNm..'/ Ficha] en [[Anime News Network]]') end
	if VNDB then table.insert(identificadoresExternos, '[https://www.animenewsnetwork.com/encyclopedia/manga.php?id='..VNDB..'/ Ficha] en [[Visual Novel Database]]') end
	identificadoresExternos = table.concat(identificadoresExternos, '<br>')
	
	local PieTabla = {}
	if Contenido then table.insert(PieTabla, Contenido) end
	if identificadoresExternos then table.insert(PieTabla, identificadoresExternos) end
--	if Categoria then table.insert(PieTabla, Categoria) end
	PieTabla = table.concat(PieTabla,'\n')
	
	-- :: Estilos
	ColorTituloFondo	= argumentos{'piel', 'colorfondo'} or ColorTituloFondo
	ColorTituloTexto	= argumentos{'colortexto'} or ColorTituloTexto
	EstiloTitulo		= EstiloTitulo .. 'background-color:' .. ColorTituloFondo .. ';color:' .. ColorTituloTexto
	EstiloEtiqueta		= argumentos{'estiloetiqueta'} or EstiloEtiqueta .. ';background-color:' .. ColorEtiqueta

--	Debug = InstanciaDeID

	local TablaFicha = {
		uni					= Integrada,
		subtitulo			= TipoObraSubtitulo,
		clasetitulo			= ClaseTitulo,
		estilotitulo		= EstiloTitulo,
		estilosubtitulo		= EstiloTitulo,
		estiloetiqueta		= EstiloEtiqueta,
		estilodatos			= EstiloDatos,
		{tipo="sección",
			estilodatos		= EstiloSubtitulo,
			{'', Titulo},
		},
		{tipo="sección",
			estiloetiqueta		= EstiloEtiqueta,
			{'Otros Nombres', OtrosNombres},
			{'Demografía', Demografia},
			{'Genero', Genero},
			{'País de lanzamiento', Pais},
			{'Idiomas', Idiomas},
			{'Autor', Autor},
			{'Director', Director},
			{'Ilustrador', Ilustrador},
			{'Disenador', Disenador},
			{'Productor', Productor},
			{'Escritor', Escritor},
			{'Guion', Guion},
			{'Reparto', Reparto},
			{'Compositor', Compositor},
			{'Estudio', Estudio},
			{'Imprenta', Imprenta},
			{'Cadena', Cadena},
			{'', OtrasCadenas},
			{'Editorial', Editorial},
			{'', OtrasEdit},
			{'Revista', Revista},
			{'Licenciado&nbsp;por', Licenciador},
			{'Desarrollador', Desarrollador},
			{'Distribuidor', Distribuidor},
			{'Plataforma', Plataforma},
			{'Motor', Motor},
			{'Clasificacion', Clasificacion},
			{TipoObraInicio, Inicio},
			{TipoObraFin, Fin},
			{'Duracion', Duracion},
			{'Episodios', Episodios},
			{'Volumenes', Volumenes},
			{'ISBN', ISBN},
			{'Debug', Debug},
			{'', PieTabla},
		},
		estilopiedetabla= 'display:none',
		piedetabla		= Categoria,
	}
	return ficha(TablaFicha)
end

-- Un subconjunto de la plantilla Ficha de personaje,
-- como sección para una ficha de personaje en distintos contextos
function p.fichaPersonajeSerie(frame)
	-- :: Inicializador
	_init(frame)

	-- :: General
	local NombreOrig	= argumentos{'nombre_original', 'nombre original', 'real', 'nombrejapon', 'japanname', 'namejapon', 'nombre_ja', 'nombre_co', {propiedad, 'P1559', {['calificativo'] = 'P2440'}}, {propiedad, 'P1559', {['calificativo'] = 'P1705'}}}
	local Alias			= argumentos{'sobrenombre', 'alias', {propiedad, 'P1449', {['lista'] = 'nobullet'}}}
	local OtrosNombres	= argumentos{'otrosnombres', {propiedad, 'P4970', {['lista'] = 'nobullet'}}}
	local FechaNac		= argumentos{'nacido', {propiedad, 'P569', {['uno'] = 'sí'}}}
	local FechaFall		= argumentos{'fallecido', {propiedad, 'P570', {['uno'] = 'sí'}}}
	local Genero		= argumentos{'sexo', 'género', {propiedad, 'P21', {['uno'] = 'sí'}}}
	local Edad			= argumentos{'edad', {propiedad, 'P6249', {['formato'] = 'unidad', ['separador'] = ' '}}}
	local Estatura		= argumentos{'altura', 'metricheight'}
	if Estatura then
		Estatura 		= Estatura .. ' [[Metro|m]]'
	else
		Estatura 		= argumentos{{propiedad, 'P2048', {['formato'] = 'unidad', ['separador'] = ' '}}}
	end
	local Peso			= argumentos{'peso', 'metricweight'}
	if Peso then
		Peso 			= Peso .. ' [[kg]]'
	else
		Peso 			= argumentos{{propiedad, 'P2067', {['formato'] = 'unidad', ['separador'] = ' '}}}
	end
	local Cabello		= argumentos{'pelo', 'cabello', {propiedad, 'P1884', {['uno'] = 'sí'}}}
	local Ojos			= argumentos{'ojos', {propiedad, 'P1340', {['uno'] = 'sí'}}}

	-- :: Datos de personaje
	local Especie		= argumentos{'especie'}
	local Raza			= argumentos{'raza', {propiedad, 'P4743', {['uno'] = 'sí'}}}
	local Ocupacion		= argumentos{'ocupación', {propiedad, 'P106'}}
	local TituloCortes	= argumentos{'título', {propiedad, 'P1035', {['lista'] = 'nobullet'}}}
	local Equipamiento	= argumentos{'equipamiento'}
	
	local PoderesTitulo		= 'Poderes'
	local Poderes			= argumentos{'especialidad', 'poderes'} or ''
	if string.len(Poderes) > 342 then
		Poderes				= Poderes:gsub('<div [%w%"%%:;=%s]*>\n<div [%w%"%%:;=%s]*>[%w%s]*</div>',''):gsub('</div>\n</div>','</div>')
		Poderes				= seccionDesplegable(frame, PoderesTitulo, Poderes, ColorTituloFondo)
	else
		PoderesEtiqueta		= PoderesTitulo
	end
	
	local HabilidadesTitulo	= argumentos{'tipotecnicas'} or 'Habilidades'
	local Habilidades		= argumentos{'habilidad', 'ability'} or ''
	if string.len(Habilidades) > 342 then
		Habilidades			= Habilidades:gsub('<div [%w%"%%:;=%s]*>\n<div [%w%"%%:;=%s]*>[%w%s]*</div>',''):gsub('</div>\n</div>','</div>')
		Habilidades			= seccionDesplegable(frame, HabilidadesTitulo, Habilidades, ColorTituloFondo)
	else
		HabilidadesEtiqueta	= HabilidadesTitulo
	end

	local ExtraTitulo		= argumentos{'tipoextra'} or 'Otras habilidades'
	local ExtraDatos		= argumentos{'extra'}
	if string.len(Habilidades) > 342 then
		ExtraDatos			= ExtraDatos:gsub('<div [%w%"%%:;=%s]*>\n<div [%w%"%%:;=%s]*>[%w%s]*</div>',''):gsub('</div>\n</div>','</div>')
		ExtraDatos			= seccionDesplegable(frame, HabilidadesTitulo, ExtraDatos, ColorTituloFondo)
	else
		ExtraEtiqueta	= ExtraTitulo
	end

	local Relevancia		= argumentos{'relevancia'}
	
	local Equipo		= argumentos{'equipo', {propiedad, 'P463', {['lista'] = 'nobullet'}}}
	local Organizacion	= argumentos{'organización', {propiedad, 'P749', {['lista'] = 'nobullet'}}}
	local Miembros		= argumentos{'miembros'}
	local ExMiembros	= argumentos{'exmiembros'}
	local Rango			= argumentos{'rango'}
	local Aliados		= argumentos{'aliados'}
	local Enemigos		= argumentos{'enemigos'}
	local Afiliaciones	= argumentos{'afiliaciones', {propiedad, 'P1416', {['lista'] = 'nobullet'}}}
	local AfilAnt		= argumentos{'afiliaciones_anteriores'}
	local Maestro		= argumentos{'maestro', {propiedad, 'P1066', {['lista'] = 'nobullet'}}}
	
	local Familia		= argumentos{'familia', {propiedad, 'P53', {['lista'] = 'nobullet'}}}
	local Conexiones	= argumentos{'conexiones'}
	local Conyuge		= argumentos{'cónyuge', {propiedad, 'P26', {['lista'] = 'nobullet'}}}
	local Pareja		= argumentos{'pareja', {propiedad, 'P451', {['lista'] = 'nobullet'}}}
	local Padres		= argumentos{'padres'}
	local Padre
	local Madre
	if not Padres then
		Padres			= {}
		Padre			= argumentos{'padre', {propiedad, 'P22', {['uno'] = 'sí'}}}
		Madre			= argumentos{'madre', {propiedad, 'P25', {['uno'] = 'sí'}}}
		if Padre then table.insert(Padres, Padre) end
		if Madre then table.insert(Padres, Madre) end
		Padres			= table.concat(Padres, '<br>')
	end
	local Hijos			= argumentos{'hijos', {propiedad, 'P40', {['lista'] = 'nobullet'}}}
	local Familiares	= argumentos{'familiares', 'parientes', {propiedad, 'P1038', {['lista'] = 'nobullet'}}}
	local Residencia	= argumentos{'residencia', {propiedad, 'P551'}}
	local Religion		= argumentos{'religión', 'credo', {propiedad, 'P140'}}
	local Nacionalidad	= argumentos{'nacionalidad', {propiedad, 'P27'}}
	local EstadoActual	= argumentos{'estatus', 'status', 'estado'}
	
	local Aldea			= argumentos{'aldea'}
	local Pais			= argumentos{'país', 'pais', {propiedad, 'P495'}}
	local Procedencia	= argumentos{'procedencia'}
	
	-- :: Autoría
	local Autor			= argumentos{'creador', 'autor', {propiedad, 'P170', {['lista'] = 'nobullet'}}}
	local Desarrollador	= argumentos{'desarrollador', 'developer', {propiedad, 'P178', {['lista'] = 'nobullet'}}}
	local Interprete	= argumentos{'actor', {propiedad, 'P175', {['lista'] = 'nobullet'}}}
	local Ilustrador	= argumentos{'ilustrador', 'dibujante', {propiedad, 'P110', {['lista'] = 'nobullet'}}}
	local Voz			= argumentos{'voz', 'doblador', 'seiyu', {propiedad, 'P725', {['lista'] = 'nobullet'}}}
	local VozLatam		= argumentos{'doblador_hispanoamérica', 'doblador hispanoamérica', 'doblador'}
	local VozEsp		= argumentos{'doblador_españa', 'doblador españa'}
	local Editorial		= argumentos{'editorial', {propiedad, 'P123', {['lista'] = 'nobullet'}}}

	-- :: Fechas
	local Debut			= argumentos{'primera_aparición', 'primera', 'debut', 'fecha_salida', 'lanzamiento', {propiedad, 'P4584'}, {propiedad, 'P580'}, {propiedad, 'P577'}, {propiedad, 'P5204'}}
	local Retiro		= argumentos{'última_aparición', 'ultima', 'última', {propiedad, 'P582'}}
	local MotivoRetiro	= argumentos{'última_aparición_causa', 'causa'}
	if MotivoRetiro then Retiro = Retiro .. '<small>(' .. MotivoRetiro .. ')</small>' end
	local WebLanzamineto= argumentos{'web_lanzamiento'}
	
	-- :: Cabecera y pie ficha
	Titulo		= argumentos{'anime', 'manga', 'serie', {obtenerEtiquetaWikidata, Entidad}}

	-- :: Sobreescribir colores para personajes
	ColorTituloFondo	= '#69A0F3'
	ColorTituloTexto	= '#ffffff'
	ColorEtiqueta		= '#e7f0fd'

	-- :: Estilos
	ColorTituloFondo	= argumentos{'piel', 'colorfondo'} or ColorTituloFondo
	ColorTituloTexto	= argumentos{'colortexto'} or ColorTituloTexto
	EstiloTitulo		= EstiloTitulo .. 'background-color:' .. ColorTituloFondo .. ';color:' .. ColorTituloTexto
	EstiloEtiqueta		= argumentos{'estiloetiqueta'} or EstiloEtiqueta .. ';background-color:' .. ColorEtiqueta

	local TablaFicha = {
		uni					= Integrada,
		subtitulo			= Titulo,
		estilo				= EstiloTabla,
		clasetitulo			= ClaseTitulo,
		estilotitulo		= EstiloTitulo,
		estilosubtitulo		= EstiloTitulo,
		estiloetiqueta		= EstiloEtiqueta,
		estilodatos			= EstiloDatos,
		{tipo="sección",
			{'Nombre', NombreOrig},
			{'Alias', Alias},
			{'Otros nombres', OtrosNombres},
			{'Edad', Edad},
			{'Estatura', Estatura},
			{'Peso', Peso},
			{'Especie', Especie},
			{'Raza', Raza},
			{'Ocupacion', Ocupacion},
			{'Relevancia', Relevancia},
			{'Aldea', Aldea},
			{'Pais', Pais},
			{'Procedencia', Procedencia},
			{'Maestro', Maestro},
			{'Equipo', Equipo},
			{'Organización', Organizacion},
			{'Rango', Rango},
			{'Familia', Familia},
			{PoderesTitulo, Poderes},
			{HabilidadesEtiqueta, Habilidades},
			{ExtraTitulo, ExtraDatos},
		}
	}
	return ficha(TablaFicha)
	
end

function p.fichaPersonajeHabilidades(frame)
	-- :: Inicializador
	_init(frame)

--	local HabilidadesTitulo	= argumentos{'tipotecnicas'} or 'Habilidades especiales'
	local HabilidadesTitulo	= 'Habilidades especiales'
	local HabilidadesEtiqueta
	local Habilidades		= argumentos{'listatecnicas', 'lista tecnicas'} or ''
	if string.len(Habilidades) > 342 then
		Habilidades			= Habilidades:gsub('<div [%w%"%%:;=%s]*>\n<div [%w%"%%:;=%s]*>[%w%s]*</div>',''):gsub('</div>\n</div>','</div>')
		Habilidades			= seccionDesplegable(frame, HabilidadesTitulo, Habilidades, ColorEtiqueta)
	else
		HabilidadesEtiqueta	= HabilidadesTitulo
	end

	local Habilidades1Titulo= argumentos{'tipoextra1'}
	local Habilidades1Etiqueta
	local Habilidades1		= argumentos{'listaextra1'} or ''
	if string.len(Habilidades1) > 342 then
		Habilidades1		= Habilidades1:gsub('<div [%w%"%%:;=%s]*>\n<div [%w%"%%:;=%s]*>[%w%s]*</div>',''):gsub('</div>\n</div>','</div>')
		Habilidades1		= seccionDesplegable(frame, Habilidades1Titulo, Habilidades1, ColorEtiqueta)
	else
		Habilidades1Etiqueta= Habilidades1Titulo
	end

	local Habilidades2Titulo= argumentos{'tipoextra2'}
	local Habilidades2Etiqueta
	local Habilidades2		= argumentos{'listaextra2'} or ''
	if string.len(Habilidades2) > 342 then
		Habilidades2		= Habilidades2:gsub('<div [%w%"%%:;=%s]*>\n<div [%w%"%%:;=%s]*>[%w%s]*</div>',''):gsub('</div>\n</div>','</div>')
		Habilidades2		= seccionDesplegable(frame, Habilidades2Titulo, Habilidades2, ColorEtiqueta)
	else
		Habilidades2Etiqueta= Habilidades2Titulo
	end
	
	-- :: Sobreescribir colores para personajes
	ColorTituloFondo	= '#69A0F3'
	ColorTituloTexto	= '#ffffff'
	ColorEtiqueta		= '#e7f0fd'

	-- :: Estilos
	ColorTituloFondo	= argumentos{'piel', 'colorfondo'} or ColorTituloFondo
	ColorTituloTexto	= argumentos{'colortexto'} or ColorTituloTexto
	EstiloTitulo		= EstiloTitulo .. 'background-color:' .. ColorTituloFondo .. ';color:' .. ColorTituloTexto
	EstiloEtiqueta		= argumentos{'estiloetiqueta'} or EstiloEtiqueta .. ';background-color:' .. ColorEtiqueta 

	local TablaFicha = {
		uni					= Integrada,
		estilo				= EstiloTabla,
		clasetitulo			= ClaseTitulo,
		estilotitulo		= EstiloTitulo,
		estilosubtitulo		= EstiloTitulo,
		estiloetiqueta		= EstiloEtiqueta,
		estilodatos			= EstiloDatos,
		{tipo="sección",
			{HabilidadesEtiqueta, Habilidades},
			{Habilidades1Etiqueta, Habilidades1},
			{Habilidades2Etiqueta, Habilidades2},
		},
	}
	return ficha(TablaFicha)
	
end

function p.fichaCierre(frame)
	-- :: Inicializador
	_init(frame)

	local TablaFicha= {
		tipo			= 'cierre',
		uni				= Integrada,
		piedetabla		= PieTabla,
		estilopiedetabla= EstiloPie
	}
	return ficha(TablaFicha)
end

function seccionDesplegable(frame, titulo, lista, colorTitulo)
	if not lista then return false end
	if not colorTitulo then colorTitulo = '#eeeeff' end
	return frame:preprocess('{{Sección desplegable|estilotitulo=text-align:left;background-color:' .. colorTitulo .. ';padding:2px 0 2px 0|estilodatos=text-align:left|título=' .. (titulo or '') .. '|datos='.. lista .. '}}')
end

-- Función, propiedad() personalizada
function propiedad(idPropiedad, opciones, entidad)
	if not entidad then entidad = Entidad end

	if entidad and entidad.claims and entidad.claims[idPropiedad] then
		if not opciones then
			opciones = {['linkback']='sí'}
		end
		
		opciones['idioma'] = 'es'

		local ValorPosicional = 1
		if type(opciones['valor_posicional']) == 'number' then ValorPosicional = opciones['valor_posicional'] end
		
		local ValorPosicionalCalif = 1
		if type(opciones['valor_posicional_calif']) == 'number' then ValorPosicional = opciones['valor_posicional_calif'] end

		local Calificador = opciones['calificador']

		local Obj = elementoTabla(Entidad, 'claims', idPropiedad, ValorPosicional)
		if Calificador then
			Obj = elementoTabla(Obj, 'qualifiers', Calificador, ValorPosicionalCalif)
		else
			Obj = elementoTabla(Obj, 'mainsnak')
		end

		if opciones['formato'] == 'número' then
			if elementoTabla(Obj, 'datavalue', 'type') == 'quantity' then
				return formatoNumero(elementoTabla(Obj, 'mainsnak', 'datavalue', 'value', 'amount'))
			end

		-- Valores cuya unidad deba ir a la derecha, separada de un espacio
		elseif opciones['formato'] == 'unidad' then
			if elementoTabla(Entidad, 'claims', idPropiedad, 2, 'mainsnak', 'datavalue') then
				return formatoNumero(elementoTabla(Entidad, 'claims', idPropiedad, 1, 'mainsnak', 'datavalue', 'value', 'amount')) .. '&nbsp;-&nbsp;' .. numeroUnidad(elementoTabla(Entidad, 'claims', idPropiedad, 2, 'mainsnak', 'datavalue'))
			else
				return numeroUnidad(elementoTabla(Entidad, 'claims', idPropiedad, 1, 'mainsnak', 'datavalue'))
			end
			
		-- Valores cuya unidad deba ir a la izquierda (ej, las monedas o divisas)
		elseif opciones['formato'] == 'moneda' then
			if elementoTabla(Entidad, 'claims', idPropiedad, 2, 'mainsnak', 'datavalue') then
				return numeroUnidad(elementoTabla(Entidad, 'claims', idPropiedad, 1, 'mainsnak', 'datavalue'), false) .. '&nbsp;-&nbsp;' .. numeroUnidad(elementoTabla(Entidad, 'claims', idPropiedad, 2, 'mainsnak', 'datavalue'), false)
			else
				return numeroUnidad(elementoTabla(Entidad, 'claims', idPropiedad, 1, 'mainsnak', 'datavalue'), false)
			end
		
		-- Devolver el ID de la entidad, para propiedades de entidad
		elseif opciones['formato'] == 'entidadID' then
			return elementoTabla(Obj, 'datavalue', 'value', 'id')
		end

		-- Invocar a la función fallback si no se cumplen las condiciones anteriores
		opciones.entityId  = entidad.id
		opciones.propiedad = idPropiedad
		return ModuloWikidata.getPropiedad(opciones, entidad.claims[idPropiedad])
	end
end

return p