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