Difference between revisions of "Module:Item"
Jump to navigation
Jump to search
blackwiki>Petr Matas (+ format) |
blackwiki>Petr Matas (Implement additional arguments for method each, doc) |
||
| Line 9: | Line 9: | ||
end | end | ||
| + | -- Implements [[Template:Item]] | ||
function p.pack(frame) | function p.pack(frame) | ||
local parent = frame:getParent() | local parent = frame:getParent() | ||
| Line 26: | Line 27: | ||
end | end | ||
| + | -- Implements [[Template:Component]] | ||
function p.component(frame) | function p.component(frame) | ||
return unpack(frame.args[1])[frame.args[2]] | return unpack(frame.args[1])[frame.args[2]] | ||
| Line 34: | Line 36: | ||
end | end | ||
| − | local function | + | local function invert(tbl) |
| − | return | + | local result = { } |
| + | for key, value in pairs(tbl) do | ||
| + | result[value] = key | ||
| + | end | ||
| + | return result | ||
end | end | ||
| − | + | -- Add args into item as appropriate (see [[Template:Format item]]) | |
| − | + | local function addArgs( | |
| − | + | item, -- unpacked item to modify | |
| − | + | args, -- arguments for adding into item | |
| + | ignore, -- pass in invert{keys to ignore} | ||
| + | shift -- for numbered arguments, args[key+shift] is assigned to item[key] | ||
| + | -- returns: item | ||
| + | ) | ||
for key, value in pairs(args) do | for key, value in pairs(args) do | ||
| − | if key | + | if not ignore[key] then |
local _, _, paramKey = string.find(key, "^param (.*)") | local _, _, paramKey = string.find(key, "^param (.*)") | ||
local _, _, importantKey = string.find(key, "^important (.*)") | local _, _, importantKey = string.find(key, "^important (.*)") | ||
paramKey = paramKey or importantKey or key | paramKey = paramKey or importantKey or key | ||
| − | if importantKey or | + | if shift and type(paramKey) == "number" then |
| − | + | paramKey = paramKey - shift | |
| + | if paramKey < 1 then paramKey = nil end | ||
| + | end | ||
| + | if paramKey and (importantKey or item[paramKey] == nil) then | ||
| + | item[paramKey] = value | ||
end | end | ||
end | end | ||
end | end | ||
| + | |||
| + | return item | ||
| + | end | ||
| + | |||
| + | -- Implements [[Template:Format item]] | ||
| + | function p.format(frame) | ||
| + | local args = frame:getParent().args | ||
| + | local ignore = invert{ "template", "item" } | ||
| + | local templateArgs = addArgs(unpack(args.item), args, ignore) | ||
return frame:expandTemplate{ title = args.template, args = templateArgs } | return frame:expandTemplate{ title = args.template, args = templateArgs } | ||
end | end | ||
| + | -- See [[Template:Item#Format each item using a template]] | ||
function p.each(frame) | function p.each(frame) | ||
| + | local args = frame.args | ||
local items = getItems(frame) | local items = getItems(frame) | ||
| − | local separator = | + | local separator = args[1] or "" |
| − | local template = | + | local ignore = invert{ "template" } |
| − | + | local shift = 1 | |
| + | |||
local result = "" | local result = "" | ||
for i, item in ipairs(items) do | for i, item in ipairs(items) do | ||
| − | result = result .. frame:expandTemplate{ title = template, args = | + | local templateArgs = addArgs(unpack(item), args, ignore, shift) |
| + | result = result .. frame:expandTemplate{ title = args.template, args = templateArgs } | ||
if items[i + 1] then | if items[i + 1] then | ||
result = result .. separator | result = result .. separator | ||
| Line 71: | Line 98: | ||
end | end | ||
| + | -- See [[Template:Item#Gather given parameter from all items]] | ||
function p.gather(frame) | function p.gather(frame) | ||
| + | local args = frame.args | ||
local items = getItems(frame) | local items = getItems(frame) | ||
| − | + | local parameter = args.parameter or "1" | |
| − | local parameter = | ||
| − | local | + | local templateArgs = { } |
for i, item in ipairs(items) do | for i, item in ipairs(items) do | ||
| − | + | templateArgs[i] = unpack(item)[parameter] | |
end | end | ||
| − | return frame:expandTemplate{ title = template, args = | + | return frame:expandTemplate{ title = args.template, args = templateArgs } |
end | end | ||
return p | return p | ||
Revision as of 13:59, 14 December 2015
This template implements {{Item}}, {{Component}} and {{Format 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
-- Implements [[Template:Item]]
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
-- Implements [[Template:Component]]
function p.component(frame)
return unpack(frame.args[1])[frame.args[2]]
end
local function getItems(frame)
return frame:getParent().args
end
local function invert(tbl)
local result = { }
for key, value in pairs(tbl) do
result[value] = key
end
return result
end
-- Add args into item as appropriate (see [[Template:Format item]])
local function addArgs(
item, -- unpacked item to modify
args, -- arguments for adding into item
ignore, -- pass in invert{keys to ignore}
shift -- for numbered arguments, args[key+shift] is assigned to item[key]
-- returns: item
)
for key, value in pairs(args) do
if not ignore[key] then
local _, _, paramKey = string.find(key, "^param (.*)")
local _, _, importantKey = string.find(key, "^important (.*)")
paramKey = paramKey or importantKey or key
if shift and type(paramKey) == "number" then
paramKey = paramKey - shift
if paramKey < 1 then paramKey = nil end
end
if paramKey and (importantKey or item[paramKey] == nil) then
item[paramKey] = value
end
end
end
return item
end
-- Implements [[Template:Format item]]
function p.format(frame)
local args = frame:getParent().args
local ignore = invert{ "template", "item" }
local templateArgs = addArgs(unpack(args.item), args, ignore)
return frame:expandTemplate{ title = args.template, args = templateArgs }
end
-- See [[Template:Item#Format each item using a template]]
function p.each(frame)
local args = frame.args
local items = getItems(frame)
local separator = args[1] or ""
local ignore = invert{ "template" }
local shift = 1
local result = ""
for i, item in ipairs(items) do
local templateArgs = addArgs(unpack(item), args, ignore, shift)
result = result .. frame:expandTemplate{ title = args.template, args = templateArgs }
if items[i + 1] then
result = result .. separator
end
end
return result
end
-- See [[Template:Item#Gather given parameter from all items]]
function p.gather(frame)
local args = frame.args
local items = getItems(frame)
local parameter = args.parameter or "1"
local templateArgs = { }
for i, item in ipairs(items) do
templateArgs[i] = unpack(item)[parameter]
end
return frame:expandTemplate{ title = args.template, args = templateArgs }
end
return p