Módulo:Detección de espacio de nombres

Este módulo permite imprimir un texto diferente dependiendo del espacio de nombres en el que se encuentre una página determinada. Se trata de una implementación Lua de la plantilla {{Detecta espacio de nombres}}, con algunas mejoras: todos los espacios de nombres y todos los alias de espacio de nombres son compatibles, y los nombres de espacio de nombres se detectan automáticamente para la wiki local.

Uso

{{#invoke: Detección de espacio de nombres | main
| page              = <!-- página para detectar el espacio de nombres, si no es la página actual -->
| main              = <!-- texto para volver al espacio de nombres principal -->
| talk              = <!-- texto para volver a los espacios de nombres de discusión -->

<!-- texto para volver a espacios de nombres de sujetos específicos -->
| portal            = 
| category          = 
| user              = 
| wikipedia         = 
| education program = 
| mediawiki         = 
| book              = 
| timedtext         = 
| template          = 
| special           = 
| media             = 
| file              = 
| image             = 
| help 	            = 
| module            = 

| other             = <!-- texto para volver a espacios de nombres no especificados -->
| demospace         = <!-- espacio de nombres para mostrar texto -->

| subjectns         = <!-- ponga "yes" para tratar a las páginas de discusión como la página de asunto correspondiente -->
}}

Parámetros

  • main - devuele si la pagina está en el espacio de nombres principal.
  • talk - devuele si la pagina está en un espacio de nombres de discusión. Esto puede ser cualquier espacio de nombres de discusión - coincidirá con cualquiera de "Talk:", "Wikipedia talk:", "User talk:", etc.
  • Parámetros de asuntos, por ej. wikipedia, user, file... - devuele si la página está en el espacio de nombres correspondiente. Este módulo acepta a todos los espacio de nombres de asunto como parámetros, incluyendo namespace aliases y virtual namespaces. Vea más abajo para una lista de valores admitidos.
  • other - devuele si no se especificaron parámetros para el espacio de nombres de la página. Este texto también se devuelve si |demospace= está puesto en un valor de espacio de nombres no válido.
  • subjectns - si se está en una página de discusión, usar el asunto correspondiente de la página. Se puede poner con valores de "yes", "y", "true" o "1".
  • demopage - especifica una página para detectar el espacio de nombres. Si no se especifica, y si el parámetro |demospace= no está puesto, entonces el módulo utiliza la página actual.
  • demospace - obliga al módulo a comportarse como si la página estuviera en el espacio de nombres especificado. A menudo usado para demostraciones.

Parámetros del espacio de nombres

Los valores posibles para los parámetros del espacio de nombres de asunto son los siguientes:

Dominio Nombres Alternativos
main
usuario user, usuaria
wikipedia project, wp
archivo file, imagen, image
mediawiki
plantilla template
ayuda help
categoría category, cat
portal
wikiproyecto pr
anexo
timedtext
módulo module
event

Función de tabla

Usar lo siguiente para mostrar una tabla con los diferentes parámetros de espacio de nombres posibles:

{{#invoke:Detección de espacio de nombres|table|talk=yes}}

Para incluir el parámetro para espacios de nombres de discusión, usar |talk=yes.

Portando a diferentes wikis

Este módulo está diseñado para ser portable. Para usarlo en una wiki diferente, todo lo que se necesita hacer es cambiar los valores en Módulo:Detección de espacio de nombres/configuración. Las instrucciones están disponibles en esa página.

Detalles técnicos

El módulo usa una página de datos en Módulo:Detección de espacio de nombres/data. Esta página se carga con mw.loadData, lo que significa que se procesa una vez por página en lugar de una vez por #invoke. Esto se hizo por razones de rendimiento.


--[[
--------------------------------------------------------------------------------
--                                                                            --
--                    DETECCIÓN DE ESPACIO DE NOMBRES                         --
--                                                                            --
-- Este módulo implementa la plantilla {{namespace detect}} en Lua, con       --
-- algunos implementos: todos los espacios de nombres y todos los alias de    --
-- espacio de nombres son soportados, y los nombres de espacio de nombres     --
-- son detectados automaticamente para una wiki local. El módulo también      --
-- puede usar el correspondiente valor del espacio de nombres de asunto si    --
-- esta siendo usado en una página de discusión. Los nombres de los           --
-- Parámetros pueden ser configurados para diferentes wikis alterando los     --
-- valores en la tabla "cfg" localizada en                                    --
-- "Módulo:Detección de espacio de nombres/configuración".                    --
--                                                                            --
--------------------------------------------------------------------------------
--]]

local data = mw.loadData('Módulo:Detección de espacio de nombres/data')
local argKeys = data.argKeys
local cfg = data.cfg
local mappings = data.mappings

local yesno = require('Módulo:Yesno')
local mArgumentos -- Lentamente inicializar Módulo:Argumentos
local mTableTools -- Lentamente inicializar Módulo:TableTools
local ustringLower = mw.ustring.lower

local p = {}

local function fetchValue(t1, t2)
	-- Obtiene un valor de la tabla t1 para la primera clave
	-- en la matriz t2 donde un archivo no-nil de t1 existe
	for i, key in ipairs(t2) do
		local value = t1[key]
		if value ~= nil then
			return value
		end
	end
	return nil
end

local function equalsArrayValue(t, value)
	-- Devuelve true si el valor es igual a un valor en la matriz t.
	-- De lo contrario devuelve false.
	for i, arrayValue in ipairs(t) do
		if value == arrayValue then
			return true
		end
	end
	return false
end

function p.getPageObject(page)
	-- Obtener el objeto de página, pasando la función a través
	-- de pcall en caso de errores, por ej. estar sobre el
	-- límite del costoso conteo de funciones.
	if page then
		local success, pageObject = pcall(mw.title.new, page)
		if success then
			return pageObject
		else
			return nil
		end
	else
		return mw.title.getCurrentTitle()
	end
end

-- Proporcionada compatibilidad hacia atrás con otros módulos
function p.getParamMappings()
	return mappings
end

local function getNamespace(args)
	-- Esta función obtiene el nombre del espacio de nombres
	-- a partir del objeto de página.
	local page = fetchValue(args, argKeys.demopage)
	if page == '' then
		page = nil
	end
	local demospace = fetchValue(args, argKeys.demospace)
	if demospace == '' then
		demospace = nil
	end
	local subjectns = fetchValue(args, argKeys.subjectns)
	local ret
	if demospace then
		-- Manejar "demospace = main" correctamente.
		if equalsArrayValue(argKeys.main, ustringLower(demospace)) then
			ret = mw.site.namespaces[0].name
		else
			ret = demospace
		end
	else
		local pageObject = p.getPageObject(page)
		if pageObject then
			if pageObject.isTalkPage then
				-- Obtener el espacio de nombres de asunto si la opción
				-- está puesta, de otra manera usa "talk".
				if yesno(subjectns) then
					ret = mw.site.namespaces[pageObject.namespace].subject.name
				else
					ret = 'talk'
				end
			else
				ret = pageObject.nsText
			end
		else
			return nil -- devolver nil si el objeto de página no existe.
		end
	end
	ret = ret:gsub('_', ' ')
	return ustringLower(ret)
end

function p._main(args)
	-- Comprobar los parámetros almacenados en la tabla de asignaciones
	-- para cualquier coincidencia.
	local namespace = getNamespace(args) or 'other' -- "other" evita las claves de una tabla con valor nil
	local params = mappings[namespace] or {}
	local ret = fetchValue(args, params)
	--[[
	-- Si no hay coincidencias, devolver los parámetros a otros
	-- espacio de nombres. Esto pasa si allí no hay un texto especificado
	-- para el espacio de nombres que fue detectado o si el parámetro
	-- "demospace" del espacio de nombres no es un espacio de nombres valido.
	-- Notar que el parámetro para el espacio de nombres detectado debe ser
	-- completamente ausente para que esto pase, no solo en blanco.
	--]]
	if ret == nil then
		ret = fetchValue(args, argKeys.other)
	end
	return ret
end

function p.main(frame)
	mArgumentos = require('Módulo:Argumentos')
	local args = mArgumentos.obtenerArgumentos(frame, {removeBlanks = false})
	local ret = p._main(args)
	return ret or ''
end

function p.table(frame)
	--[[
	-- Crear una "wikitable" de todos los parámetros del espacio 
	-- de nombres de asuntos, para propósitos de documentación.
	-- El parámetro "talk" es opcional, en ese caso necesita ser
	-- excluido de la documentación.
	--]]
	
	-- Cargar módulos e inicializar variables.
	mTableTools = require('Módulo:TableTools')
	local namespaces = mw.site.namespaces
	local cfg = data.cfg
	local useTalk = type(frame) == 'table' 
		and type(frame.args) == 'table' 
		and yesno(frame.args.talk) -- Si se utiliza el parámetro "talk".
	
	-- Obtener los nombres del encabezado.
	local function checkValue(value, default)
		if type(value) == 'string' then
			return value
		else
			return default
		end
	end
	local nsHeader = checkValue(cfg.wikitableNamespaceHeader, 'Dominio')
	local aliasesHeader = checkValue(cfg.wikitableAliasesHeader, 'Nombres Alternativos')

	-- Poner los espacio de nombres en orden.
	local mappingsOrdered = {}
	for nsname, params in pairs(mappings) do
		if useTalk or nsname ~= 'talk' then
			local nsid = namespaces[nsname].id
			-- Agregar 1, ya que la matriz debe comenzar con 1;
			-- nsid 0 se perdería de otra manera.
			nsid = nsid + 1 
			mappingsOrdered[nsid] = params
		end
	end
	mappingsOrdered = mTableTools.compressSparseArray(mappingsOrdered)

	-- Construir la tabla.
	local ret = '{| class="wikitable"'
		.. '\n|-'
		.. '\n! ' .. nsHeader
		.. '\n! ' .. aliasesHeader
	for i, params in ipairs(mappingsOrdered) do
		for j, param in ipairs(params) do
			if j == 1 then
				ret = ret .. '\n|-'
					.. '\n| <code>' .. param .. '</code>'
					.. '\n| '
			elseif j == 2 then
				ret = ret .. '<code>' .. param .. '</code>'
			else
				ret = ret .. ', <code>' .. param .. '</code>'
			end
		end
	end
	ret = ret .. '\n|-'
		.. '\n|}'
	return ret
end

return p