Module:Infobox: Difference between revisions

Ganaram inukshuk (talk | contribs)
m more bugfix
Sintel (talk | contribs)
Add infobox class
 
(21 intermediate revisions by one other user not shown)
Line 1: Line 1:
-- This module follows [[User:Ganaram inukshuk/Provisional style guide for Lua]]
local getArgs = require("Module:Arguments").getArgs
local getArgs = require("Module:Arguments").getArgs
local navbar  = require("Module:Navbar")._navbar
local navbar  = require("Module:Navbar")._navbar
local tiu    = require("Module:Template input utils")
local yesno  = require("Module:Yesno")
local yesno  = require("Module:Yesno")


local p = {}
local p = {}


-- TODO (low priority):
-- TODO (medium priority):
-- - Add a header/footer option.
-- - Use templatestyles
-- - Allow for headerless data rows and dataless header rows. Requires changing
--  row content from a regular array to an associative array.


--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
Line 18: Line 18:
local title          = args["Title"] or "Infobox Title"
local title          = args["Title"] or "Infobox Title"
local adjacent_links = args["Adjacent Links"]
local adjacent_links = args["Adjacent Links"]
local header_row = args["Header"]
local header_row = args["Header Row"]
local rows      = args["Rows" ]
local rows      = args["Rows"]
local footer_row = args["Footer"]
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 66: Line 82:
-- Produces a row in the infobox
-- Produces a row in the infobox
function infobox_row(row_content)
function infobox_row(row_content)
if #row_content > 1 then
local header = row_content["Header"]
local data  = row_content["Data"  ]
if header and data then
local lines = {}
table.insert(lines, '|-')
table.insert(lines, '| style="text-align: right; padding-right: 0.25em;" | ' .. header)
table.insert(lines, '| style="background-color: white; padding-left: 0.25em; font-weight: bold;" | ' .. data)
return table.concat(lines, "\n")
elseif header and not data then
local lines = {}
local lines = {}
table.insert(lines, '|-')
table.insert(lines, '|-')
table.insert(lines, '| style="text-align: right; padding-right: 0.25em;" | ' .. row_content[1])
table.insert(lines, '| colspan="2" style="text-align: center;" | ' .. header)
table.insert(lines, '| style="background-color: white; padding-left: 0.25em; font-weight: bold;" | ' .. row_content[2])
return table.concat(lines, "\n")
return table.concat(lines, "\n")
elseif #row_content == 1 then
elseif data and not header then
local lines = {}
local lines = {}
table.insert(lines, '|-')
table.insert(lines, '|-')
table.insert(lines, '| colspan="2" style="text-align: center;" | ' .. row_content[1])
table.insert(lines, '| colspan="2" style="text-align: center;" | ' .. data)
return table.concat(lines, "\n")
return table.concat(lines, "\n")
Line 106: Line 131:
-- Infobox boilerplate
-- Infobox boilerplate
table.insert(lines, [[<div style="
table.insert(lines,  
[[<div class="infobox" style="
border: 1px solid #999;  
border: 1px solid #999;  
margin: 0;  
margin: 0;  
Line 145: Line 171:
-- End of infobox
-- End of infobox
table.insert(lines, "|}</div>")
table.insert(lines, "|}")
table.insert(lines, "</div>")


return table.concat(lines, "\n")
return table.concat(lines, "\n")
Line 160: 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]
-- - Link 1 is previous, link 2 is next
-- 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 166: Line 192:
-- [Link 4]  Title  [Link 5]
-- [Link 4]  Title  [Link 5]
-- [Link 6] [Link 7] [Link 8]
-- [Link 6] [Link 7] [Link 8]
-- Individual links can be omitted. If at least one upper or lower link is
local function any_keys_present(tbl, keys)
-- present, then rows for those two sets of links are added. Having no links
for _, key in ipairs(keys) do
-- defaults to having only the title.
if tbl[key] ~= nil then
local is_upper_lower_links_present = args["Upper Left Link"] ~= nil or args["Upper Link"] ~= nil or args["Upper Right Link"] ~= nil
return true
or args["Lower Left Link"] ~= nil or args["Lower Link"] ~= nil or args["Lower Right Link"] ~= nil
end
local is_side_links_present  = args["Left Link"] ~= nil or args["Right Link"] ~= nil
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 Left Link" ] or "")
-- Upper row of links
table.insert(adjacent_links, args["Upper Link"      ] or "")
for _, key in ipairs(upper_links) do
table.insert(adjacent_links, args["Upper Right Link"] or "")
table.insert(adjacent_links, args[key] or "")
end
args[key] = nil
if is_side_links_present then
end
table.insert(adjacent_links, args["Left Link" ] or "")
-- Middle row of links
table.insert(adjacent_links, args["Right Link"] or "")
for _, key in ipairs(side_links) do
end
table.insert(adjacent_links, args[key] or "")
if is_upper_lower_links_present then
args[key] = nil
table.insert(adjacent_links, args["Lower Left Link" ] or "")
end
table.insert(adjacent_links, args["Lower Link"      ] or "")
-- Bottom row of links
table.insert(adjacent_links, args["Lower Right Link"] or "")
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
-- Cleanup individual links, as they've been combined into one table
args["Upper Left Link" ] = nil
args["Upper Link"      ] = nil
args["Upper Right Link"] = nil
args["Left Link"      ] = nil
args["Right Link"      ] = nil
args["Lower Left Link" ] = nil
args["Lower Link"      ] = nil
args["Lower Right Link"] = nil
-- 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.
local rows = {}
args["Rows"] = tiu.numbered_header_data_args_to_table(args, 30)
for i = 1, 30 do
local header = args["Header " .. i]
local data  = args["Data "  .. i]
local row = nil
if (header == nil and data ~= nil) then
row = {}
table.insert(row, data)
elseif (header ~= nil and data ~= nil) then
row = {}
table.insert(row, header)
table.insert(row, data)
end
if row ~= nil then
table.insert(rows, row)
end
-- Remove original entries as cleanup
args["Header " .. i] = nil
args["Data "  .. i] = nil
end
args["Rows"] = rows
local result = p._infobox(args)
local result = p._infobox(args)
Line 249: Line 269:
["Adjacent Links"] = { (prev_link or ""), (next_link or "") },
["Adjacent Links"] = { (prev_link or ""), (next_link or "") },
["Title"] = title,
["Title"] = title,
["Rows"] = entries,
["Rows"] = entries
}
}


Line 260: Line 280:
["Adjacent Links"] = adjacent_links,
["Adjacent Links"] = adjacent_links,
["Title"] = title,
["Title"] = title,
["Rows"] = entries,
["Rows"] = entries
}
}