Module:Item

local p = {}

local function escape(str) return str:gsub("[|\\]", function (c) return string.format("\\%03d", c:byte) end) end

local function unescape(str) return str:gsub("\\(%d%d%d)", function (d) return string.char(d) end) end

function p.pack(frame) local parent = frame:getParent local result = '' for key, value in pairs(parent.args) do result = result .. "|" .. escape(tostring(key)) .. "|" .. escape(value) end return result .. "|"; end

local function unpack(str) local result = { } for key, value in str:gfind("|([^|]*)|([^|]*)") do		result[unescape(key)] = unescape(value) end return result end

local function getItems(frame) return frame:getParent.args end

local function getTemplate(frame) return frame.args.template end

function p.each(frame) local items = getItems(frame) local separator = frame.args[1] or "" local template = getTemplate(frame) local result = "" for i, item in ipairs(items) do result = result .. frame:expandTemplate{ title = template, args = unpack(item) } if items[i + 1] then result = result .. separator end end return result end

function p.gather(frame) local items = getItems(frame) local template = getTemplate(frame) local parameter = frame.args.parameter or "1" local args = { } for i, item in ipairs(items) do		args[i] = unpack(item)[parameter] end return frame:expandTemplate{ title = template, args = args } end

return p