Módulo:LoadData
Aspeto
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 queframe: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]
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
})