Permanently protected module
From Wikipedia, the free encyclopedia


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 databestIndex 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 argsi then data = datatonumber(argsi]) or argsi]]

        elseif argsi .. ' lteq' then

            data = findItemRange(data, tonumber(argsi .. ' lteq']), 1)

        elseif argsi .. ' gteq' then

            data = findItemRange(data, tonumber(argsi .. ' 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

    		realdatak = 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

})