Module:Infobox: Difference between revisions
m rename args |
Add infobox class |
||
| (12 intermediate revisions by one other user not shown) | |||
| Line 8: | Line 8: | ||
-- TODO (medium priority): | -- TODO (medium priority): | ||
-- - | -- - Use templatestyles | ||
-------------------------------------------------------------------------------- | -------------------------------------------------------------------------------- | ||
| Line 21: | Line 19: | ||
local adjacent_links = args["Adjacent Links"] | local adjacent_links = args["Adjacent Links"] | ||
local header_row = args["Header Row"] | local header_row = args["Header Row"] | ||
local rows = args["Rows" | local rows = args["Rows"] | ||
local footer_row = args["Footer Row"] | local footer_row = args["Footer Row"] | ||
local name = args["name"] | local name = args["name"] | ||
-- Helper function; preprocess rows | |||
function preprocess_rows() | |||
-- Preproces rows | |||
local is_jagged = true | |||
for i = 1, #rows do | |||
local row = rows[i] | |||
is_jagged = is_jagged and (#row == 1 or #row == 2) | |||
end | |||
if is_jagged then return tiu.jagged_array_to_header_data_pairs(rows) | |||
else return rows end | |||
end | |||
-- Preprocess rows | |||
rows = preprocess_rows() | |||
-- Nested helper function | -- Nested helper function | ||
| Line 118: | Line 132: | ||
-- Infobox boilerplate | -- Infobox boilerplate | ||
table.insert(lines, | table.insert(lines, | ||
[[<div style=" | [[<div class="infobox" style=" | ||
border: 1px solid #999; | border: 1px solid #999; | ||
margin: 0; | margin: 0; | ||
| Line 173: | Line 187: | ||
-- placed on the left and right of the title: | -- placed on the left and right of the title: | ||
-- [Link 1] Title [Link 2] | -- [Link 1] Title [Link 2] | ||
-- If there are eight adjacent links (such as with mosses), then links | -- If there are eight adjacent links (such as with mosses), then links | ||
-- surround the title in a 3x3 grid: | -- surround the title in a 3x3 grid: | ||
| Line 179: | Line 192: | ||
-- [Link 4] Title [Link 5] | -- [Link 4] Title [Link 5] | ||
-- [Link 6] [Link 7] [Link 8] | -- [Link 6] [Link 7] [Link 8] | ||
local function any_keys_present(tbl, keys) | |||
for _, key in ipairs(keys) do | |||
if tbl[key] ~= nil then | |||
return true | |||
end | |||
end | |||
return false | |||
end | |||
-- Keys to links | |||
-- Left and right are added if at least one is present -> 2-element table. | |||
-- All three rows are added if at least one link from the upper or lower | |||
-- rows is present, regardless of side links -> 8-element table. | |||
-- No links are added if none of them are present -> 0-element table. | |||
local upper_links = { "Upper Left Link", "Upper Link", "Upper Right Link" } | |||
local side_links = { "Left Link", "Right Link" } | |||
local lower_links = { "Lower Left Link", "Lower Link", "Lower Right Link" } | |||
-- Check which links are present | |||
local is_upper_lower_links_present = | |||
any_keys_present(args, upper_links) or any_keys_present(args, lower_links) | |||
local is_side_links_present = any_keys_present(args, side_links) | |||
-- Build adjacent_links | |||
-- Links from args are removed, as they're stored in a separate table | |||
local adjacent_links = {} | local adjacent_links = {} | ||
if is_upper_lower_links_present then | if is_upper_lower_links_present then | ||
table.insert(adjacent_links, args[ | -- Upper row of links | ||
table.insert(adjacent_links, args[ | for _, key in ipairs(upper_links) do | ||
table.insert(adjacent_links, args[key] or "") | |||
args[key] = nil | |||
end | |||
table.insert(adjacent_links, args[ | -- Middle row of links | ||
for _, key in ipairs(side_links) do | |||
table.insert(adjacent_links, args[key] or "") | |||
args[key] = nil | |||
end | |||
-- Bottom row of links | |||
for _, key in ipairs(lower_links) do | |||
table.insert(adjacent_links, args[key] or "") | |||
args[key] = nil | |||
end | |||
elseif is_side_links_present then | |||
-- Left and right links only | |||
for _, key in ipairs(side_links) do | |||
table.insert(adjacent_links, args[key] or "") | |||
args[key] = nil | |||
end | |||
end | end | ||
args["Adjacent Links"] = adjacent_links | args["Adjacent Links"] = adjacent_links | ||
-- Preprocess rows | -- Preprocess rows | ||
-- Set row count to 30, under the reasoning that an infobox may need more | -- Set row count to 30, under the reasoning that an infobox may need more | ||
-- rows and/or headers. This may be increased to 40 if needed. | -- rows and/or headers. This may be increased to 40 if needed. | ||
args["Rows"] = tiu. | args["Rows"] = tiu.numbered_header_data_args_to_table(args, 30) | ||
local result = p._infobox(args) | local result = p._infobox(args) | ||
| Line 233: | Line 263: | ||
-- These functions are kept in the meantime to support older infoboxes and WILL | -- These functions are kept in the meantime to support older infoboxes and WILL | ||
-- be entirely deleted later! Please switch to the new functions! | -- be entirely deleted later! Please switch to the new functions! | ||
-- Original function signature, kept for legacy support (for now). | -- Original function signature, kept for legacy support (for now). | ||
| Line 255: | Line 269: | ||
["Adjacent Links"] = { (prev_link or ""), (next_link or "") }, | ["Adjacent Links"] = { (prev_link or ""), (next_link or "") }, | ||
["Title"] = title, | ["Title"] = title, | ||
["Rows"] = | ["Rows"] = entries | ||
} | } | ||
| Line 266: | Line 280: | ||
["Adjacent Links"] = adjacent_links, | ["Adjacent Links"] = adjacent_links, | ||
["Title"] = title, | ["Title"] = title, | ||
["Rows"] = | ["Rows"] = entries | ||
} | } | ||