Saltar para o conteúdo

Módulo:LoadData

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

Uma versão mais complexa do Módulo:Dados [en] com mais opções e a capacidade de selecionar índices com um operador de desigualdade.

Uso[editar código-fonte]

{{#invoke:{{BASEPAGENAME}}|Nome do módulo|index1|2 lteq=limite do index2|...|}}
  • O parâmetro zero é o nome do módulo de dados a ler, sem Módulo:, por exemplo: Exemplo/data
  • Os próximos parâmetros, para um índice N começando em um, são chamados |N= para o índice exato que você precisa, coagido a um número se possível, |N lteq= para selecionar o maior índice numérico menor ou igual ao argumento, ou |N gteq= para o oposto.
  • |template= é uma sequência[a] estilo printf para interpolar o(s) valor(es) resultante(s), por exemplo: <b>%s</b>.
  • |preprocess= é como |template= exceto que frame:preprocess é executado nele; isso faz, por exemplo, o trabalho de transclusões de predefinições.
  • |if nil= é a sequência [a] a ser retornada se o resultado for nulo. O padrão é "nil", que sai como uma sequência [a] vazia.

Nota[editar código-fonte]

  1. a b c do inglês string

local p = {}

-- Localiza a próxima chave-chave <= ou >= o i fornecido.
-- o operador é ±1
local function findItemRange(data, i, operator)
    local bestIndex = nil
    i = i * operator
    for k, v in pairs(data) do
    	local kop = type(k) == 'number' and k * operator
        if kop and kop <= i and (bestIndex == nil or kop > bestIndex * operator) then
        	bestIndex = k
        end
    end
    if bestIndex then return data[bestIndex] else return nil end
end

local function load(datamodule, frame)
	local args = frame.args
    local data = mw.loadData(datamodule)
    for i = 1, 20 do
        if args[i] then data = data[tonumber(args[i]) or args[i]]
        elseif args[i .. ' lteq'] then
            data = findItemRange(data, tonumber(args[i .. ' lteq']), 1)
        elseif args[i .. ' gteq'] then
            data = findItemRange(data, tonumber(args[i .. ' gteq']), -1)
        else break end
    end
    
    if data == nil then
    	return args['if_nil'] -- não é um argumento obrigatório, OK para retornar nil aqui.
    end
    
    if type(data) == 'table' then
    	-- Coloca a tabela em outra tabela porque o valor de retorno de loadData
    	-- ié uma tabela "falsa" que possui apenas determinados metamétodos.
    	local realdata = {}
    	for k, v in pairs(data) do
    		realdata[k] = v
    	end
    	data = realdata
    else
    	data = { data }
    end
    
    if args['template'] then
    	return mw.text.unstripNoWiki(args['template']):format(unpack(data))
    elseif args['preprocess'] then
    	return frame:preprocess(mw.text.unstripNoWiki(args['preprocess']):format(unpack(data)))
    else
    	return table.concat(data)
    end
end

return setmetatable({}, {
	__index = function(t, k)
		return function(frame)
			return load('Módulo:' .. k, frame)
    	end
	end
})