Módulo:Detección de espacio de nombres

Revisión del 07:29 25 abr 2023 de Pyc1948 (discusión | contribs.) (Página creada con «--[[ -------------------------------------------------------------------------------- -- -- -- 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 todo…»)
(difs.) ← Revisión anterior | Revisión actual (difs.) | Revisión siguiente → (difs.)

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 Plantilla:Tl, 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:

Error de Lua en la línea 175: attempt to index field '?' (a nil value).

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