Module:Infobox: Difference between revisions
(Created crafting_parsing and crafting_raw) |
(Switch to ":" as the recipe separator) |
||
Line 51: | Line 51: | ||
end | end | ||
local recipe_parts = p._split(args[1], " | local recipe_parts = p._split(args[1], ":") | ||
local ingredients = p._crafting_parsing_split(frame, recipe_parts[1]) | local ingredients = p._crafting_parsing_split(frame, recipe_parts[1]) | ||
Line 71: | Line 71: | ||
end | end | ||
local recipe_parts = p._split(args[1], " | local recipe_parts = p._split(args[1], ":") | ||
return p._crafting_parsing_split(frame, recipe_parts[1]) | return p._crafting_parsing_split(frame, recipe_parts[1]) | ||
end | end |
Revision as of 10:13, 3 October 2024
Lua methods used by Template:Infobox.
Methods
technology_parsing
Takes one argument in the form of a string and one named argument, "color". The string is expected to have the following format:
Military 4 + Advanced oil processing + Advanced electronics 2, 2
This string is split so that each entry between a +
is forwarded to Template:Icon/special so that it displays the technology and has the level as the caption.
Before forwarding the arguments to the icon template, " (research)" is appended to the technology if a page with that name exists. Furthermore, the technology level is deduced from the technology name if it is not manually specified.
The color defaults to "999".
item_parsing
Takes one argument in the form of a string. The string is expected to have the following format:
Item, count + Iron plate, 45 + Iron ore + Electronic circuit, 5
This string is split so that each entry between a +
is forwarded to Template:Icon/special so that it displays the item and has the number as the caption. The number (, N
) is optional and defaults to nothing.
crafting_parsing
Takes one argument in the form of a string. The string is expected to have the following format:
Item ingredient, count + Iron ore, 45 + Electronic circuit, 5 = Item product, count + Advanced circuit, 4
The text in front of the equals sign are treated as the recipe ingredients, the text behind the equals sign is treated as the recipe products. The products are optional and default to the name of the current page. For both ingredients and products, the count (, N
) is optional and defaults to 1.
This string is split so that each entry between a +
is forwarded to Template:Icon/special so that it displays the item and has the count as the caption.
crafting_raw
Takes one argument in the form of a string. The string is expected to have the following format:
Item ingredient, count + Iron ore, 45 + Electronic circuit, 5
The text in front of the equals sign are treated as the recipe ingredients, the text behind the equals sign is treated as the recipe products. If this is given the format from "crafting_parsing", then the products are ignored. For the ingredients the count (, N
) is optional and defaults to 1.
This string is split so that each entry between a +
is forwarded to Template:Icon/special so that it displays the item and has the count as the caption.
local p = {}
function p.technology_parsing(frame)
local args = frame.args
if args[1] == "?" then
return args[1] -- same as old template, likely not needed
end
local ret = {}
local techs = p._split(args[1], "+")
for _, tech in ipairs(techs) do
local tech_parts = p._split(tech, ",")
local tech_name = tech_parts[1] .. " (research)"
if not p._page_exists(tech_name) then -- fall back to plain name if page with " (research)" doesn't exist
tech_name = tech_parts[1]
end
local tech_level = tech_parts[2] or ""
if tech_level == "" then -- fall back to level from tech name if none given manually
local second_to_last_char = string.sub(tech_parts[1], -2, -2)
if second_to_last_char == " " then
tech_level = string.sub(tech_parts[1], -1) -- last character should be the level of the tech
end
end
ret[#ret+1] = frame:expandTemplate{title = 'icon/special', args = {tech_name, tech_level, color=args.color or "999"}}
end
return table.concat(ret)
end
function p.item_parsing(frame)
local args = frame.args
if args[1] == "?" then
return args[1] -- same as old template, likely not needed
end
local ret = {}
local items = p._split(args[1], "+")
for _, item in ipairs(items) do
local icon_args = p._split(item, ",")
icon_args[2] = icon_args[2] or ""
ret[#ret+1] = frame:expandTemplate{title = 'icon/special', args = icon_args}
end
return table.concat(ret)
end
function p.crafting_parsing(frame)
local args = frame.args
if args[1] == "?" then
return args[1] -- same as old template, likely not needed
end
local recipe_parts = p._split(args[1], ":")
local ingredients = p._crafting_parsing_split(frame, recipe_parts[1])
local products = recipe_parts[2]
if products then
products = "→ " .. p._crafting_parsing_split(products)
else
local item_name = frame:expandTemplate{title = 'No language suffix/No namespace'}
products = "→ " .. frame:expandTemplate{title = 'icon/special', args = {item_name, "1"}}
end
return ingredients .. products
end
function p.crafting_raw(frame)
local args = frame.args
if args[1] == "?" then
return args[1] -- same as old template, likely not needed
end
local recipe_parts = p._split(args[1], ":")
return p._crafting_parsing_split(frame, recipe_parts[1])
end
-- @param frame
-- @param str string A list of "item, count" separated by "+"
-- @return string @The resulting icons with a "+" between each icon
function p._crafting_parsing_split(frame, str)
local ret = {}
local items = p._split(str, "+")
for _, item in ipairs(items) do
local item_parts = p._split(item, ",")
local item_count = item_parts[2] or "1" -- fall back to 1, not empty!
item_count = frame:expandTemplate{title = 'Crop', args = {item_count}}
ret[#ret+1] = frame:expandTemplate{title = 'icon/special', args = {item_parts[1], item_count}}
end
return table.concat(ret, "+")
end
-- @param inputstr string A string to be split
-- @param separator string The separator
-- @return string[] @The separated strings, without the separator
function p._split(inputstr, separator)
local result = {}
for str in string.gmatch(inputstr, "([^"..separator.."]+)") do
table.insert(result, mw.text.trim(str))
end
return result
end
-- @param page_title string The title of the page
-- @return boolean
function p._page_exists(page_title)
if page_title and page_title ~= "" then
return mw.title.new(page_title).exists
else
return false
end
end
return p