Difference between revisions of "Module:Item"

From blackwiki
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 getTemplate(frame)
+
local function invert(tbl)
return frame.args.template
+
local result = { }
 +
for key, value in pairs(tbl) do
 +
result[value] = key
 +
end
 +
return result
 
end
 
end
  
function p.format(frame)
+
-- Add args into item as appropriate (see [[Template:Format item]])
local args = frame:getParent().args
+
local function addArgs(
local templateArgs = unpack(args.item)
+
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 ~= "template" and key ~= "item" then
+
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 templateArgs[paramKey] == nil then
+
if shift and type(paramKey) == "number" then
templateArgs[paramKey] = value
+
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 = frame.args[1] or ""
+
local separator = args[1] or ""
local template = getTemplate(frame)
+
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 = unpack(item) }
+
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 template = getTemplate(frame)
+
local parameter = args.parameter or "1"
local parameter = frame.args.parameter or "1"
 
 
 
local args = { }
+
local templateArgs = { }
 
for i, item in ipairs(items) do
 
for i, item in ipairs(items) do
args[i] = unpack(item)[parameter]
+
templateArgs[i] = unpack(item)[parameter]
 
end
 
end
 
 
return frame:expandTemplate{ title = template, args = 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