Saltar para o conteúdo

Módulo:Namespace detect/Testes

Origem: Wikipédia, a enciclopédia livre.
--------------------------------------------------------------------------------
--                                                                            --
--                         Detecção de espaço nomeado                         --
--                                                                            --
-- Este módulo implementa a predefinição                                      --
-- {{Namespace detect/Testes}} em Lua, com algumas melhorias: todos os        --
-- espaços nomeados e todos os nomes alternativos de espaços nomeados são     --
-- suportados, e nomes de espaços nomeados são detectados automaticamente     --
-- para a wiki local. O módulo também pode usar o valor de espaço nomeado 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:Namespace detect/Testes/config.                                     --
--                                                                            --
--------------------------------------------------------------------------------


local data = mw.loadData('Módulo:Namespace detect/Testes/data')
local argKeys = data.argKeys
local cfg = data.cfg
local mappings = data.mappings

local yesno = require('Módulo:Yesno/Testes')
local mArguments -- Inicializa preguiçosamente Módulo:Arguments/Testes
local mTableTools -- Inicializa preguiçosamente Módulo:TableTools/Testes
local ustringLower = mw.ustring.lower

local p = {}

local function fetchValue(t1, t2)
	-- Busca um valor da tabela "t1" para a primeira chave no arranjo "t2" 
	-- onde existe um valor que não é nulo 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 verdadeiro ("true") se o valor for igual a um valor
	--  no arranjo "t". Caso não, retorna falso ("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 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 de 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 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
	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.
	-- Isso acontece se não houver texto especificado para o espaço nomeado que
	-- foi detectado ou se o parâmetro "demospace" não for um espaço nomeado válido.
	-- Observe que o parâmetro para o espaço nomeado detectado deve estar
	-- completamente ausente para que isso aconteça, não meramente em branco.
	
	if ret == nil then
		ret = fetchValue(args, argKeys.other)
	end
	return ret
end

function p.main(frame)
	mArguments = require('Módulo:Arguments/Testes')
	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
	-- 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:TableTools/Testes')
	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 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 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