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:Icono/doc

-- Módulo:Icono — iconos de la interfaz de MundoConan (set Lucide, licencia ISC).
--   {{Icono|estrella}}                      -> insignia azul con el icono
--   {{Icono|estrella|color=dorado|tamaño=g}} -> colores: azul, rojo, dorado, verde, morado, negro, gris
--   {{Icono|estrella|estilo=plano}}         -> solo el icono blanco (para fondos de color)
-- Desde otros módulos: require('Módulo:Icono').html('estrella', { color = 'dorado' })
local p = {}

-- Nombre -> archivo (Archivo:Icono-<nombre>.svg). Los alias permiten escribir variantes.
local ICONOS = {
	anime = true, aviso = true, azar = true, biblioteca = true, bomba = true, buscar = true, calavera = true,
	calendario = true, carpeta = true, ciencia = true, cine = true, coche = true, cohete = true, colaborar = true,
	copyright = true, corazon = true, corona = true, correo = true, editar = true, escudo = true, estrella = true,
	exito = true, fanfic = true, fantasma = true, flecha = true, foro = true, historial = true, huella = true,
	idea = true, imagen = true, info = true, joya = true, libre = true, lista = true, llave = true, lugar = true,
	manga = true, musica = true, nota = true, noticias = true, nuevo = true, obras = true, organizacion = true,
	ova = true, pelicula = true, peligro = true, personaje = true, personajes = true, pregunta = true, reloj = true,
	spoiler = true, tarjetas = true, trofeo = true, videojuego = true, web = true,
}
local ALIAS = {
	['música'] = 'musica', ['película'] = 'pelicula', ['organización'] = 'organizacion', ['corazón'] = 'corazon',
	['éxito'] = 'exito', juego = 'videojuego', videojuegos = 'videojuego', libro = 'manga', tv = 'anime',
	lupa = 'buscar', dado = 'azar', usuario = 'personaje', grupo = 'personajes', destacado = 'estrella',
	ayuda = 'pregunta', cuenta = 'reloj', reloj_arena = 'reloj', noticia = 'noticias', ideas = 'idea',
	mapa = 'lugar', lugares = 'lugar', escritura = 'fanfic', licencia = 'copyright', disco = 'ova',
	-- Emojis antiguos -> icono equivalente (para plantillas y páginas que aún los usan)
	['⭐'] = 'estrella', ['🔍'] = 'buscar', ['🔎'] = 'buscar', ['🎲'] = 'azar', ['🕵️'] = 'personaje', ['📺'] = 'anime',
	['📖'] = 'manga', ['📚'] = 'biblioteca', ['🎬'] = 'pelicula', ['🕶️'] = 'organizacion', ['🎵'] = 'musica',
	['🎮'] = 'videojuego', ['🏙️'] = 'lugar', ['💡'] = 'idea', ['📰'] = 'noticias', ['💬'] = 'foro', ['🆕'] = 'nuevo',
	['✏️'] = 'editar', ['📅'] = 'calendario', ['⏳'] = 'reloj', ['🤝'] = 'colaborar', ['ℹ️'] = 'info', ['⚠️'] = 'aviso',
	['⛔'] = 'peligro', ['✅'] = 'exito', ['📂'] = 'carpeta', ['📄'] = 'copyright', ['©️'] = 'copyright',
	['🆓'] = 'libre', ['🌐'] = 'web', ['✉️'] = 'correo', ['❓'] = 'pregunta', ['🚧'] = 'obras', ['📝'] = 'nota',
	['📀'] = 'ova', ['🛡️'] = 'escudo', ['❤️'] = 'corazon', ['🎩'] = 'joya', ['📺️'] = 'anime',
}
local COLORES = { azul = true, rojo = true, dorado = true, verde = true, morado = true, negro = true, gris = true, claro = true }
local TAM = { p = 14, m = 18, g = 24, xg = 32 }

local function normalizar(nombre)
	nombre = mw.text.trim(nombre or '')
	local bajo = mw.ustring.lower(nombre)
	if ICONOS[bajo] then
		return bajo
	end
	return ALIAS[bajo] or ALIAS[nombre]
end

-- ¿Es un nombre (o emoji) que tiene icono?
function p.existe(nombre)
	return normalizar(nombre) ~= nil
end

function p.html(nombre, opts)
	opts = opts or {}
	local n = normalizar(nombre)
	if not n then
		return nombre or ''
	end
	local clave = TAM[opts.tam or ''] and opts.tam or 'm'
	local tam = TAM[clave]
	local color = COLORES[opts.color or ''] and opts.color or 'azul'
	local clases = 'mc-ico mc-ico--t' .. clave
	if opts.estilo == 'plano' then
		clases = clases .. ' mc-ico--plano'
	else
		clases = clases .. ' mc-ico--' .. color
	end
	return '<span class="' .. clases .. '">[[Archivo:Icono-' .. n .. '.svg|'
		.. tam .. 'px|link=' .. (opts.enlace or '') .. '|alt=' .. (opts.alt or '') .. ']]</span>'
end

function p.icono(frame)
	local a = frame:getParent().args
	local nombre = a[1] or frame.args[1] or ''
	if mw.text.trim(nombre) == 'AD' then
		-- Compatibilidad: {{Icono|AD}} = estrella de artículo destacado junto al título
		return frame:extensionTag('indicator', p.html('estrella', { color = 'dorado', tam = 'p', alt = 'Artículo destacado' }),
			{ name = 'destacado' })
	end
	return p.html(nombre, {
		color = a.color, tam = a['tamaño'] or a.tamano or a[2], estilo = a.estilo, enlace = a.enlace, alt = a.alt,
	})
end

-- Lista de todos los iconos (para la documentación)
function p.lista(frame)
	local nombres = {}
	for n, _ in pairs(ICONOS) do
		table.insert(nombres, n)
	end
	table.sort(nombres)
	local out = { '<div class="mc-ico-lista">' }
	for _, n in ipairs(nombres) do
		table.insert(out, '<div>' .. p.html(n, { tam = 'g' }) .. '<code>' .. n .. '</code></div>')
	end
	table.insert(out, '</div>')
	return table.concat(out)
end

return p