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

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