Módulo:Testes/Gkiyoshinishimoto/Namespace detect

Origem: Wikipédia, a enciclopédia livre.
Documentação do módulo[ver] [editar] [histórico] [purgar]

--------------------------------------------------------------------------------
--                                                                            --
--                              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