Vés al contingut

Mòdul:LoadData

De la Viquipèdia, l'enciclopèdia lliure
Icona de documentació de mòdul Documentació del mòdul [ mostra ] [ modifica el codi ] [ mostra l'historial ] [ refresca ]

Mòdul LoadData (codi · ús · discussió · proves · tests · casos prova | subpàgines · enllaços)

A continuació es mostra la documentació transclosa de la subpàgina /ús. [salta a la caixa de codi]



Una versió més complexa de Mòdul:Data amb més opcions i la possibilitat de seleccionar índexs amb un operador de desigualtat.

{{#invoke:{{BASEPAGENAME}}|Nom del mòdul|index1|2 lteq=index2 limit|...|}}
  • El paràmetre zero és el nom del mòdul de dades que cal llegir, sense Mòdul:, p. Exemple/dades
  • Els paràmetres següents, per a un índex N que comença per un, s'anomenen |N= per a l'índex exacte que necessiteu, forçat a numerar si és possible, |N lteq= per seleccionar l'índex numèric més alt menor o igual que l'argument, o |N gteq= per al contrari.
  • |template= és una cadena d'estil printf per interpolar els valors resultants, p. <b>%s</b>.
  • |preprocess= és com |template= excepte que s'executa frame:preprocess; això fa que p. ex. les transclusions de plantilla funcionin.
  • |if nil= és la cadena a retornar si el resultat és nul. El valor per defecte és nul, que surt com a cadena buida.


local p = {}

-- Finds the next key key <= or >= the given i.
-- operator is ±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'] -- not a required argument, OK to return nil here.
    end
    
    if type(data) == 'table' then
    	-- Put the table into another table because the return value of loadData
    	-- is a "fake" table that only has certain metamethods.
    	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('Module:' .. k, frame)
    	end
	end
})