Módulo:Testes/Gkiyoshinishimoto/Namespace detect
Este módulo pode ter sua documentação deficiente. Por favor, documente-o ou melhore suas explicações caso o saiba usar ou tenha conhecimentos para tal. |
A documentação acima é transcluída de Módulo:Testes/Gkiyoshinishimoto/Namespace detect/doc. (editar | histórico) Editores podem experimentar nas páginas de teste (criar | espelhar) e de exemplos para testes (criar) deste módulo. Subpáginas deste módulo. |
--------------------------------------------------------------------------------
-- --
-- Namespace detect --
-- --
-- Este módulo implementa a predefinição --
-- {{Teste/Gkiyoshinishimoto/Namespace detect}} em Lua, com algumas --
-- melhorias: todos os espaços nomeados ('namespaces') e todos os nomes --
-- alternativos ('aliases') de espaços nomeados ('namespaces') são suportados,--
-- e nomes de espaços nomeados ('namespaces') são detectados automaticamente --
-- para a wiki local. O módulo também pode usar o valor de espaço nomeado --
-- ('namespace') de assunto correspondente se ele for usado em uma página de --
-- discussão. Os nomes dos parâmetros podem ser configurados para diferentes --
-- wikis alterando os valores na tabela "cfg" em --
-- Módulo:Testes/Gkiyoshinishimoto/Namespace detect/config. --
-- --
--------------------------------------------------------------------------------
local data = mw.loadData('Módulo:Testes/Gkiyoshinishimoto/Namespace detect/data')
local argKeys = data.argKeys
local cfg = data.cfg
local mappings = data.mappings
local yesno = require('Módulo:Testes/Gkiyoshinishimoto/Yesno')
local mArguments -- Inicializa preguiçosamente Módulo:Testes/Gkiyoshinishimoto/Arguments
local mTableTools -- Inicializa preguiçosamente Módulo:Testes/Gkiyoshinishimoto/TableTools
local ustringLower = mw.ustring.lower
local p = {}
local function fetchValue(t1, t2)
-- Busca um valor da tabela "t1" para a primeira chave no arranjo ('array') "t2" onde
-- existe um valor que não é nulo ("nil") de "t1".
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)
-- Retorna "true" se o valor ("value") for igual a um valor no arranjo ('array') "t".
-- Caso não, retorna "false".
for i, arrayValue in ipairs(t) do
if value == arrayValue then
return true
end
end
return false
end
function p.getPageObject(page)
-- Obtém o objeto de página, passando a função por "pcall" em caso de
-- erros, por exemplo, estar acima do limite de contagem de funções caras.
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
-- Fornecido para compatibilidade com versões anteriores com outros módulos
function p.getParamMappings()
return mappings
end
local function getNamespace(args)
-- Essa função obtém o nome do espaço nomeado ('namespace') do 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
-- Lida com "demospace = main" adequadamente.
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
-- Obtém o espaço nomeado ('namespace') do assunto se a opção estiver
-- definida. Caso não, 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 -- retorna nulo ("nil") se o objeto de página não existir.
end
end
ret = ret:gsub('_', ' ')
return ustringLower(ret)
end
function p._main(args)
-- Verifica os parâmetros armazenados na tabela de mapeamentos para quaisquer correspondências.
local namespace = getNamespace(args) or 'other' -- "other" evita chaves de tabela nulas ("nil")
local params = mappings[namespace] or {}
local ret = fetchValue(args, params)
-- Se não houver correspondências, retorna os parâmetros para outros espaços nomeados ('namespaces').
-- Isso acontece se não houver texto especificado para o espaço nomeado ('namespace') que
-- foi detectado ou se o parâmetro "demospace" não for um espaço nomeado ('namespace') válido.
-- Observe que o parâmetro para o espaço nomeado ('namespace') detectado deve estar
-- completamente ausente para que isso aconteça, não meramente em branco ('blank').
if ret == nil then
ret = fetchValue(args, argKeys.other)
end
return ret
end
function p.main(frame)
mArguments = require('Módulo:Testes/Gkiyoshinishimoto/Arguments')
local args = mArguments.getArgs(frame, {removeBlanks = false})
local ret = p._main(args)
return ret or ''
end
function p.table(frame)
-- Cria uma tabela wiki de todos os parâmetros de espaço nomeado ('namespace')
-- de assunto, para fins de documentação. O parâmetro "talk" é opcional, caso
-- precise ser excluído da documentação.
-- Carrega módulos e inicializa variáveis.
mTableTools = require('Módulo:Testes/Gkiyoshinishimoto/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) -- Se o parâmetro "talk" deve ser usado.
-- Obtém os nomes dos cabeçalhos.
local function checkValue(value, default)
if type(value) == 'string' then
return value
else
return default
end
end
local nsHeader = checkValue(cfg.wikitableNamespaceHeader, 'Espaço nomeado')
local aliasesHeader = checkValue(cfg.wikitableAliasesHeader, 'Nome(s) alternativo(s)')
-- Coloca os espaços nomeados ('namespaces') em ordem.
local mappingsOrdered = {}
for nsname, params in pairs(mappings) do
if useTalk or nsname ~= 'talk' then
local nsid = namespaces[nsname].id
-- Adiciona 1, pois o arranjo ('array') deve começar com 1; caso não, "nsid 0" seria perdido.
nsid = nsid + 1
mappingsOrdered[nsid] = params
end
end
mappingsOrdered = mTableTools.compressSparseArray(mappingsOrdered)
-- Constrói a tabela.
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