Jump to content
Menú alternativo
Alternar el menú de preferencias
Menú alternativo personal
No has accedido
Tu dirección IP será visible si haces alguna edición
Revisión del 03:33 15 oct 2026 de Administrador (Hablar | contribs.) (Correcciones de diseño)
(difs.) ← Revisión anterior | Revisión actual (difs.) | Revisión siguiente → (difs.)

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

-- Módulo:Ficha — fichas (infobox) de MundoConan Wiki.
-- Las definiciones de cada tipo están en Módulo:Ficha/datos.
-- Uso desde una plantilla: {{#invoke:Ficha|ficha|tipo=personaje}}
local p = {}

local datos = mw.loadData('Módulo:Ficha/datos')

local COLORES = {
	azul = true, rojo = true, negro = true, dorado = true, verde = true, morado = true,
}

local function limpio(v)
	if v == nil then
		return nil
	end
	v = mw.text.trim(v)
	if v == '' then
		return nil
	end
	return v
end

-- Acepta «Conan.png», «Archivo:Conan.png», «File:Conan.png» o un [[...]] / <tabber> ya formado
local function imagen(valor, ancho)
	if valor:find('[[', 1, true) or valor:find('<', 1, true) then
		return valor
	end
	valor = valor:gsub('^[Aa]rchivo:', ''):gsub('^[Ff]ile:', ''):gsub('^[Ii]magen:', '')
	return '[[Archivo:' .. valor .. '|' .. ancho .. 'px|link=]]'
end

function p.ficha(frame)
	local tipo = frame.args.tipo or 'personaje'
	local def = datos[tipo]
	if not def then
		return '<strong class="error">Módulo:Ficha: tipo de ficha desconocido «' .. tipo .. '».</strong>'
	end

	local args = {}
	for k, v in pairs(frame:getParent().args) do
		args[k] = limpio(v)
	end

	local titulo = mw.title.getCurrentTitle()
	local color = args.color and COLORES[mw.ustring.lower(args.color)] and mw.ustring.lower(args.color) or def.color

	local caja = mw.html.create('div')
		:addClass('mc-ficha')
		:addClass('mc-ficha--' .. color)
		:attr('role', 'complementary')
		:attr('aria-label', 'Ficha')

	local cab = caja:tag('div'):addClass('mc-ficha__titulo')
	cab:tag('div'):addClass('mc-ficha__nombre'):wikitext(args.nombre or titulo.text)
	if args['japonés'] then
		cab:tag('div'):addClass('mc-ficha__japones'):wikitext(args['japonés'])
	end

	if args.imagen then
		local img = caja:tag('div'):addClass('mc-ficha__imagen')
		img:wikitext(imagen(args.imagen, 270))
		if args.pie then
			img:tag('div'):addClass('mc-ficha__pie'):wikitext(args.pie)
		end
	end

	local hayFilas = false
	for _, sec in ipairs(def.secciones) do
		local filas = {}
		for _, campo in ipairs(sec.campos) do
			local valor = args[campo[1]]
			if valor then
				table.insert(filas, { campo[2], valor, campo.oculto })
			end
		end
		if #filas > 0 then
			hayFilas = true
			if sec.titulo then
				caja:tag('div'):addClass('mc-ficha__seccion'):wikitext(sec.titulo)
			end
			local dl = caja:tag('dl'):addClass('mc-ficha__datos')
			for _, f in ipairs(filas) do
				local fila = dl:tag('div'):addClass('mc-ficha__fila')
				fila:tag('dt'):wikitext(f[1])
				local dd = fila:tag('dd')
				if f[3] then
					-- Spoiler: oculto hasta que se pulsa (mw-collapsible, funciona sin JS de sitio)
					dd:tag('div')
						:addClass('mw-collapsible mw-collapsed mc-ficha__oculto')
						:attr('data-expandtext', 'mostrar')
						:attr('data-collapsetext', 'ocultar')
						:tag('div'):addClass('mw-collapsible-content'):newline():wikitext(f[2])
				else
					dd:newline():wikitext(f[2])
				end
			end
		end
	end

	if not hayFilas and not args.imagen then
		caja:tag('div'):addClass('mc-ficha__vacia'):wikitext('Ficha vacía: rellena sus campos editando la página.')
	end

	local salida = frame:extensionTag('templatestyles', '', { src = 'Plantilla:Ficha/styles.css' }) .. tostring(caja)

	-- Categoría automática solo en artículos
	if titulo.namespace == 0 and def.categoria then
		salida = salida .. '[[Categoría:' .. def.categoria .. ']]'
	end
	return salida
end

return p