<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="pt-BR">
	<id>https://wiki.tokusatsus.com/index.php?action=history&amp;feed=atom&amp;title=M%C3%B3dulo%3AArguments</id>
	<title>Módulo:Arguments - Histórico de revisão</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.tokusatsus.com/index.php?action=history&amp;feed=atom&amp;title=M%C3%B3dulo%3AArguments"/>
	<link rel="alternate" type="text/html" href="https://wiki.tokusatsus.com/index.php?title=M%C3%B3dulo:Arguments&amp;action=history"/>
	<updated>2026-07-05T07:59:32Z</updated>
	<subtitle>Histórico de revisões para esta página neste wiki</subtitle>
	<generator>MediaWiki 1.45.3</generator>
	<entry>
		<id>https://wiki.tokusatsus.com/index.php?title=M%C3%B3dulo:Arguments&amp;diff=2411&amp;oldid=prev</id>
		<title>Tavoraadmin: Importando predefinição/módulo da Wikipédia em português para manter layout</title>
		<link rel="alternate" type="text/html" href="https://wiki.tokusatsus.com/index.php?title=M%C3%B3dulo:Arguments&amp;diff=2411&amp;oldid=prev"/>
		<updated>2026-07-05T04:39:35Z</updated>

		<summary type="html">&lt;p&gt;Importando predefinição/módulo da Wikipédia em português para manter layout&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Página nova&lt;/b&gt;&lt;/p&gt;&lt;div&gt;-- Este módulo fornece processamento fácil de argumentos passados para a Scribunto &lt;br /&gt;
-- a partir de #invoke. Ele destina-se ao uso por outros módulos Lua e não &lt;br /&gt;
-- deve ser chamado diretamente a partir de #invoke.&lt;br /&gt;
&lt;br /&gt;
local libraryUtil = require(&amp;#039;libraryUtil&amp;#039;)&lt;br /&gt;
local checkType = libraryUtil.checkType&lt;br /&gt;
&lt;br /&gt;
local arguments = {}&lt;br /&gt;
&lt;br /&gt;
-- Gera quatro funções &amp;quot;tidyVal&amp;quot; diferentes, para que não tenhamos que verificar &lt;br /&gt;
-- as opções todas vezes que chamamos.&lt;br /&gt;
&lt;br /&gt;
local function tidyValDefault(key, val)&lt;br /&gt;
	if type(val) == &amp;#039;string&amp;#039; then&lt;br /&gt;
		val = val:match(&amp;#039;^%s*(.-)%s*$&amp;#039;)&lt;br /&gt;
		if val == &amp;#039;&amp;#039; then&lt;br /&gt;
			return nil&lt;br /&gt;
		else&lt;br /&gt;
			return val&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		return val&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function tidyValTrimOnly(key, val)&lt;br /&gt;
	if type(val) == &amp;#039;string&amp;#039; then&lt;br /&gt;
		return val:match(&amp;#039;^%s*(.-)%s*$&amp;#039;)&lt;br /&gt;
	else&lt;br /&gt;
		return val&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function tidyValRemoveBlanksOnly(key, val)&lt;br /&gt;
	if type(val) == &amp;#039;string&amp;#039; then&lt;br /&gt;
		if val:find(&amp;#039;%S&amp;#039;) then&lt;br /&gt;
			return val&lt;br /&gt;
		else&lt;br /&gt;
			return nil&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		return val&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function tidyValNoChange(key, val)&lt;br /&gt;
	return val&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function matchesTitle(given, title)&lt;br /&gt;
	local tp = type( given )&lt;br /&gt;
	return (tp == &amp;#039;string&amp;#039; or tp == &amp;#039;number&amp;#039;) and mw.title.new( given ).prefixedText == title&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local translate_mt = { __index = function(t, k) return k end }&lt;br /&gt;
&lt;br /&gt;
function arguments.getArgs(frame, options)&lt;br /&gt;
	checkType(&amp;#039;getArgs&amp;#039;, 1, frame, &amp;#039;table&amp;#039;, true)&lt;br /&gt;
	checkType(&amp;#039;getArgs&amp;#039;, 2, options, &amp;#039;table&amp;#039;, true)&lt;br /&gt;
	frame = frame or {}&lt;br /&gt;
	options = options or {}&lt;br /&gt;
&lt;br /&gt;
	--[[&lt;br /&gt;
	-- Define a tradução de argumentos.&lt;br /&gt;
	--]]&lt;br /&gt;
	options.translate = options.translate or {}&lt;br /&gt;
	if getmetatable(options.translate) == nil then&lt;br /&gt;
		setmetatable(options.translate, translate_mt)&lt;br /&gt;
	end&lt;br /&gt;
	if options.backtranslate == nil then&lt;br /&gt;
		options.backtranslate = {}&lt;br /&gt;
		for k,v in pairs(options.translate) do&lt;br /&gt;
			options.backtranslate[v] = k&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if options.backtranslate and getmetatable(options.backtranslate) == nil then&lt;br /&gt;
		setmetatable(options.backtranslate, {&lt;br /&gt;
			__index = function(t, k)&lt;br /&gt;
				if options.translate[k] ~= k then&lt;br /&gt;
					return nil&lt;br /&gt;
				else&lt;br /&gt;
					return k&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		})&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	--[[&lt;br /&gt;
	-- Obtém as tabelas de argumentos. Se nos foi passado um objeto de quadro válido, &lt;br /&gt;
	-- obtemos os argumentos do quadro (&amp;quot;fargs&amp;quot;) e os argumentos do quadro parental (&amp;quot;pargs&amp;quot;),&lt;br /&gt;
	-- dependendo das opções definidas e da disponibilidade do quadro parental. Se não nos &lt;br /&gt;
	-- foi passado um objeto de quadro válido, estamos sendo chamados de outro módulo Lua&lt;br /&gt;
	-- ou do console de depuração, então assume que uma tabela de argumentos nos foi passada&lt;br /&gt;
	-- diretamente e a atribui a uma nova variável (&amp;quot;luaArgs&amp;quot;).&lt;br /&gt;
	--]]&lt;br /&gt;
	local fargs, pargs, luaArgs&lt;br /&gt;
	if type(frame.args) == &amp;#039;table&amp;#039; and type(frame.getParent) == &amp;#039;function&amp;#039; then&lt;br /&gt;
		if options.wrappers then&lt;br /&gt;
			--[[&lt;br /&gt;
			-- A opção &amp;quot;wrappers&amp;quot; faz o Módulo:Arguments procurar argumentos na &lt;br /&gt;
			-- tabela de argumentos do quadro ou na tabela de argumentos parental, mas&lt;br /&gt;
			-- mas não em ambas. Isso significa que os usuários podem usar a sintaxe&lt;br /&gt;
			-- &amp;quot;#invoke&amp;quot; ou uma predefinição &amp;quot;wrapper&amp;quot; sem a perda de desempenho &lt;br /&gt;
			-- associada à procura de argumentos no quadro e no quadro parental.&lt;br /&gt;
			-- O Módulo:Arguments procurará argumentos no quadro parental&lt;br /&gt;
			-- se encontrar o título do quadro parental em &amp;quot;options.wrapper&amp;quot;;&lt;br /&gt;
			-- caso não, ele procurará argumentos no objeto de quadro passado&lt;br /&gt;
			-- para &amp;quot;getArgs&amp;quot;.&lt;br /&gt;
			--]]&lt;br /&gt;
			local parent = frame:getParent()&lt;br /&gt;
			if not parent then&lt;br /&gt;
				fargs = frame.args&lt;br /&gt;
			else&lt;br /&gt;
				local title = parent:getTitle():gsub(&amp;#039;/Testes$&amp;#039;, &amp;#039;&amp;#039;)&lt;br /&gt;
				local found = false&lt;br /&gt;
				if matchesTitle(options.wrappers, title) then&lt;br /&gt;
					found = true&lt;br /&gt;
				elseif type(options.wrappers) == &amp;#039;table&amp;#039; then&lt;br /&gt;
					for _,v in pairs(options.wrappers) do&lt;br /&gt;
						if matchesTitle(v, title) then&lt;br /&gt;
							found = true&lt;br /&gt;
							break&lt;br /&gt;
						end&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
&lt;br /&gt;
				-- Nós testamos &amp;quot;false&amp;quot; especificamente aqui para que &lt;br /&gt;
				-- &amp;quot;nil&amp;quot; (o padrão) aja como &amp;quot;true&amp;quot;.&lt;br /&gt;
				if found or options.frameOnly == false then&lt;br /&gt;
					pargs = parent.args&lt;br /&gt;
				end&lt;br /&gt;
				if not found or options.parentOnly == false then&lt;br /&gt;
					fargs = frame.args&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		else&lt;br /&gt;
			-- &amp;quot;options.wrapper&amp;quot; não está definido, portanto verifica as &lt;br /&gt;
			-- outras opções.&lt;br /&gt;
			if not options.parentOnly then&lt;br /&gt;
				fargs = frame.args&lt;br /&gt;
			end&lt;br /&gt;
			if not options.frameOnly then&lt;br /&gt;
				local parent = frame:getParent()&lt;br /&gt;
				pargs = parent and parent.args or nil&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		if options.parentFirst then&lt;br /&gt;
			fargs, pargs = pargs, fargs&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		luaArgs = frame&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Define a ordem de precedência das tabelas de argumentos. Se as variáveis &lt;br /&gt;
	-- forem &amp;quot;nil&amp;quot;, nada será adicionado à tabela, que é como evitamos confrontos&lt;br /&gt;
	-- entre os argumentos do quadro/parental e os argumentos Lua.&lt;br /&gt;
	local argTables = {fargs}&lt;br /&gt;
	argTables[#argTables + 1] = pargs&lt;br /&gt;
	argTables[#argTables + 1] = luaArgs&lt;br /&gt;
&lt;br /&gt;
	--[[&lt;br /&gt;
	-- Gera a função &amp;quot;tidyVal&amp;quot;. Se tiver sido especificado pelo usuário, nós&lt;br /&gt;
	-- usamos isso; caso não, escolhemos uma das quatro funções dependendo das&lt;br /&gt;
	-- opções escolhidas. Isso é para que não tenhamos que chamar a tabela de &lt;br /&gt;
	-- opções toda vez que a função for chamada.&lt;br /&gt;
	--]]&lt;br /&gt;
	local tidyVal = options.valueFunc&lt;br /&gt;
	if tidyVal then&lt;br /&gt;
		if type(tidyVal) ~= &amp;#039;function&amp;#039; then&lt;br /&gt;
			error(&lt;br /&gt;
				&amp;quot;valor inválido atribuído à opção &amp;#039;valueFunc&amp;#039;&amp;quot;&lt;br /&gt;
					.. &amp;#039;(função esperada, obteve &amp;#039;&lt;br /&gt;
					.. type(tidyVal)&lt;br /&gt;
					.. &amp;#039;)&amp;#039;,&lt;br /&gt;
				2&lt;br /&gt;
			)&lt;br /&gt;
		end&lt;br /&gt;
	elseif options.trim ~= false then&lt;br /&gt;
		if options.removeBlanks ~= false then&lt;br /&gt;
			tidyVal = tidyValDefault&lt;br /&gt;
		else&lt;br /&gt;
			tidyVal = tidyValTrimOnly&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		if options.removeBlanks ~= false then&lt;br /&gt;
			tidyVal = tidyValRemoveBlanksOnly&lt;br /&gt;
		else&lt;br /&gt;
			tidyVal = tidyValNoChange&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	--[[&lt;br /&gt;
	-- Define as tabelas &amp;quot;args&amp;quot;, &amp;quot;metaArgs&amp;quot; e &amp;quot;nilArgs&amp;quot;. &amp;quot;args&amp;quot; será a única&lt;br /&gt;
	-- acessada a partir de funções e &amp;quot;metaArgs&amp;quot; manterá os argumentos reais. &lt;br /&gt;
	-- Os argumentos nulos são memorizados em &amp;quot;nilArgs&amp;quot; e a metatabela &lt;br /&gt;
	-- conecta todos eles juntos.&lt;br /&gt;
	--]]&lt;br /&gt;
	local args, metaArgs, nilArgs, metatable = {}, {}, {}, {}&lt;br /&gt;
	setmetatable(args, metatable)&lt;br /&gt;
&lt;br /&gt;
	local function mergeArgs(tables)&lt;br /&gt;
		--[[&lt;br /&gt;
		-- Aceita várias tabelas como entrada e mescla suas chaves e valores&lt;br /&gt;
		-- em uma tabela. Se um valor já estiver presente, ele não será substituído;&lt;br /&gt;
		-- as tabelas listadas anteriormente têm precedência. Também estamos memorizando &lt;br /&gt;
		-- valores nulos, que podem ser sobrescritos se forem &amp;quot;s&amp;quot; (&amp;#039;soft&amp;#039;).&lt;br /&gt;
		--]]&lt;br /&gt;
		for _, t in ipairs(tables) do&lt;br /&gt;
			for key, val in pairs(t) do&lt;br /&gt;
				if metaArgs[key] == nil and nilArgs[key] ~= &amp;#039;h&amp;#039; then&lt;br /&gt;
					local tidiedVal = tidyVal(key, val)&lt;br /&gt;
					if tidiedVal == nil then&lt;br /&gt;
						nilArgs[key] = &amp;#039;s&amp;#039;&lt;br /&gt;
					else&lt;br /&gt;
						metaArgs[key] = tidiedVal&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	--[[&lt;br /&gt;
	-- Define o comportamento da metatabela. Os argumentos são memorizados na tabela &amp;quot;metaArgs&amp;quot;,&lt;br /&gt;
	-- e são buscados apenas uma vez nas tabelas de argumentos. Obter os argumentos&lt;br /&gt;
	-- a partir das tabelas de argumentos é o passo mais intensiva em recursos neste&lt;br /&gt;
	-- módulo, então tentamos evitá-lo sempre que possível. Por este motivo, os argumentos nulos&lt;br /&gt;
	-- também são memorizados, na tabela &amp;quot;nilArgs&amp;quot;. Além disso, mantemos um registro&lt;br /&gt;
	-- na metatabela de quando &amp;quot;pairs&amp;quot; e &amp;quot;ipairs&amp;quot; foram chamadas, então nós não &lt;br /&gt;
	-- executamos &amp;quot;pairs&amp;quot; e &amp;quot;ipairs&amp;quot; nas tabelas de argumentos mais de uma vez. Nós também  &lt;br /&gt;
	-- não executamos &amp;quot;ipairs&amp;quot; em &amp;quot;fargs&amp;quot; e &amp;quot;pargs&amp;quot; se &amp;quot;pairs&amp;quot; já tiver sido executada, &lt;br /&gt;
	-- pois todos os argumentos já terão sido copiados.&lt;br /&gt;
	--]]&lt;br /&gt;
&lt;br /&gt;
	metatable.__index = function (t, key)&lt;br /&gt;
		--[[&lt;br /&gt;
		-- Busca um argumento quando a tabela &amp;quot;args&amp;quot; é indexada. Primeiro nós verificamos&lt;br /&gt;
		-- para ver se o valor está memorizado e, caso não, tentamos buscá-lo a partir &lt;br /&gt;
		-- das tabelas de argumentos. Quando nós verificamos a memorização, nós precisamos verificar&lt;br /&gt;
		-- &amp;quot;metaArgs&amp;quot; antes de &amp;quot;nilArgs&amp;quot;, pois ambas podem não ser nulas (&amp;#039;nil&amp;#039;) ao mesmo tempo.&lt;br /&gt;
		-- Se o argumento não estiver presente em &amp;quot;metaArgs&amp;quot;, nós também verificamos se&lt;br /&gt;
		-- &amp;quot;pairs&amp;quot; já foi executada. Se &amp;quot;pairs&amp;quot; já tiver sido executada, retornamos &amp;quot;nil&amp;quot; (nulo).&lt;br /&gt;
		-- Isso ocorre porque todos os argumentos já terão sido copiados para&lt;br /&gt;
		-- &amp;quot;metaArgs&amp;quot; pela função &amp;quot;mergeArgs&amp;quot;, significando que quaisquer outros &lt;br /&gt;
		-- argumentos devem ser &amp;quot;nil&amp;quot; (nulos).&lt;br /&gt;
		--]]&lt;br /&gt;
		if type(key) == &amp;#039;string&amp;#039; then&lt;br /&gt;
			key = options.translate[key]&lt;br /&gt;
		end&lt;br /&gt;
		local val = metaArgs[key]&lt;br /&gt;
		if val ~= nil then&lt;br /&gt;
			return val&lt;br /&gt;
		elseif metatable.donePairs or nilArgs[key] then&lt;br /&gt;
			return nil&lt;br /&gt;
		end&lt;br /&gt;
		for _, argTable in ipairs(argTables) do&lt;br /&gt;
			local argTableVal = tidyVal(key, argTable[key])&lt;br /&gt;
			if argTableVal ~= nil then&lt;br /&gt;
				metaArgs[key] = argTableVal&lt;br /&gt;
				return argTableVal&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		nilArgs[key] = &amp;#039;h&amp;#039;&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	metatable.__newindex = function (t, key, val)&lt;br /&gt;
		-- Esta função é chamada quando um módulo tenta adicionar um novo &lt;br /&gt;
		-- valor à tabela &amp;quot;args&amp;quot; ou tenta alterar um valor existente.&lt;br /&gt;
		if type(key) == &amp;#039;string&amp;#039; then&lt;br /&gt;
			key = options.translate[key]&lt;br /&gt;
		end&lt;br /&gt;
		if options.readOnly then&lt;br /&gt;
			error(&lt;br /&gt;
				&amp;#039;não foi possível gravar na chave da tabela de argumentos &amp;quot;&amp;#039;&lt;br /&gt;
					.. tostring(key)&lt;br /&gt;
					.. &amp;#039;&amp;quot;; a tabela é somente leitura&amp;#039;,&lt;br /&gt;
				2&lt;br /&gt;
			)&lt;br /&gt;
		elseif options.noOverwrite and args[key] ~= nil then&lt;br /&gt;
			error(&lt;br /&gt;
				&amp;#039;não foi possível gravar na chave da tabela de argumentos &amp;quot;&amp;#039;&lt;br /&gt;
					.. tostring(key)&lt;br /&gt;
					.. &amp;#039;&amp;quot;; sobrescrever argumentos existentes não é permitido&amp;#039;,&lt;br /&gt;
				2&lt;br /&gt;
			)&lt;br /&gt;
		elseif val == nil then&lt;br /&gt;
			--[[&lt;br /&gt;
			-- Se o argumento for substituído por &amp;quot;nil&amp;quot;, nós precisamos apagar&lt;br /&gt;
			-- o valor em &amp;quot;metaArgs&amp;quot;, para que &amp;quot;__index&amp;quot;, &amp;quot;__pairs&amp;quot; e &amp;quot;__ipairs&amp;quot; &lt;br /&gt;
			-- não usem um valor existente anterior, se presente; e nós também precisamos&lt;br /&gt;
			-- memorizar &amp;quot;nil&amp;quot; (nulo) em &amp;quot;nilArgs&amp;quot;, para que o valor não seja procurado&lt;br /&gt;
			-- nas tabelas de argumentos se for acessado novamente.&lt;br /&gt;
			--]]&lt;br /&gt;
			metaArgs[key] = nil&lt;br /&gt;
			nilArgs[key] = &amp;#039;h&amp;#039;&lt;br /&gt;
		else&lt;br /&gt;
			metaArgs[key] = val&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local function translatenext(invariant)&lt;br /&gt;
		local k, v = next(invariant.t, invariant.k)&lt;br /&gt;
		invariant.k = k&lt;br /&gt;
		if k == nil then&lt;br /&gt;
			return nil&lt;br /&gt;
		elseif type(k) ~= &amp;#039;string&amp;#039; or not options.backtranslate then&lt;br /&gt;
			return k, v&lt;br /&gt;
		else&lt;br /&gt;
			local backtranslate = options.backtranslate[k]&lt;br /&gt;
			if backtranslate == nil then&lt;br /&gt;
				-- Ignora este. Esta é uma chamada final, então isso não causará &lt;br /&gt;
				-- estouro de pilha&lt;br /&gt;
				return translatenext(invariant)&lt;br /&gt;
			else&lt;br /&gt;
				return backtranslate, v&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	metatable.__pairs = function ()&lt;br /&gt;
		-- Chamada quando &amp;quot;pairs&amp;quot; é executada na tabela &amp;quot;args&amp;quot;.&lt;br /&gt;
		if not metatable.donePairs then&lt;br /&gt;
			mergeArgs(argTables)&lt;br /&gt;
			metatable.donePairs = true&lt;br /&gt;
		end&lt;br /&gt;
		return translatenext, { t = metaArgs }&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local function inext(t, i)&lt;br /&gt;
		-- Isso usa nosso metamétodo &amp;quot;__index&amp;quot;&lt;br /&gt;
		local v = t[i + 1]&lt;br /&gt;
		if v ~= nil then&lt;br /&gt;
			return i + 1, v&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	metatable.__ipairs = function (t)&lt;br /&gt;
		-- Chamada quando &amp;quot;ipairs&amp;quot; é executada na tabela &amp;quot;args&amp;quot;.&lt;br /&gt;
		return inext, t, 0&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return args&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return arguments&lt;/div&gt;</summary>
		<author><name>Tavoraadmin</name></author>
	</entry>
</feed>