Module:Infobox: Difference between revisions
Jump to navigation
Jump to search
m bugfix entering rows: each row is a table with one or two entries (how it already was) |
mNo edit summary |
||
| Line 177: | Line 177: | ||
local row = nil | local row = nil | ||
if (header == nil and data ~= nil) then | if (header == nil and data ~= nil) then | ||
row = {} | |||
table.insert(row, data) | table.insert(row, data) | ||
elseif (header ~= nil and data ~= nil) then | elseif (header ~= nil and data ~= nil) then | ||
row = {} | |||
table.insert(row, header) | table.insert(row, header) | ||
table.insert(row, data) | table.insert(row, data) | ||
Revision as of 07:22, 27 November 2024
- This module implements a metatemplate, and may be invoked by templates using its corresponding template Template:Infobox, or used directly from other modules.
Module:Infobox is a module that implements the {{Infobox}} template. Infobox templates can be made by using the template or by calling the _sidebar function from another module.
On templates, you can create an infobox by using {{Infobox}}, which calls this module's wrapper function.
local infobox= require("Module:Infobox")._infobox to create an infobox.
| Introspection summary for Module:Infobox | ||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
| |||||||||||||||||||||||||||
No function descriptions were provided. The Lua code may have further information.
local getArgs = require("Module:Arguments").getArgs
local p = {}
-- TODO:
-- Transfer functionality to new functions (in-progress)
-- Once done, convert old functions into wrapper functions (note that only
-- infobox mos needs the 8-link form, so the 8-link function can be removed and
-- infobox mos updated to use new "main" function)
--------------------------------------------------------------------------------
------------------------------- HELPER FUNCTIONS -------------------------------
--------------------------------------------------------------------------------
-- Infobox header with adjacent links
-- Adjacent links are placed on the sides of the title, with options for 0, 2,
-- or 8 links.
function p.infobox_header(title, adjacent_links)
local header = ''
if adjacent_links == nil then
header = header .. title
header = header .. '\n'
elseif #adjacent_links == 2 then
local prev_link = adjacent_links[1]
local next_link = adjacent_links[2]
header = header
.. '<table style="width: 100%; margin: 0;">\n'
.. '<tr>\n'
.. '<td style="width: 15%; text-align: left; white-space: nowrap; font-size: 0.75em;">\n' .. (prev_link or '') .. '</td>\n'
.. '<td style="width: 70%; padding-left: 1em; padding-right: 1em; text-align: center;">\n' .. title .. '</td>\n'
.. '<td style="width: 15%; text-align: right; white-space: nowrap; font-size: 0.75em;">\n' .. (next_link or '') .. '</td>\n'
.. '</tr>\n'
.. '</table>'
elseif #adjacent_links == 8 then
-- First row
header = header
.. '<table style="width: 100%; margin: 0;">\n'
.. '<tr>\n' -- First row
.. '<td style="width: 15%; text-align: left; white-space: nowrap; font-size: 0.75em;">\n' .. (adjacent_links[1] or '') .. '</td>\n'
.. '<td style="width: 70%; padding-left: 1em; padding-right: 1em; text-align: center;">\n' .. (adjacent_links[2] or '') .. '</td>\n'
.. '<td style="width: 15%; text-align: right; white-space: nowrap; font-size: 0.75em;">\n' .. (adjacent_links[3] or '') .. '</td>\n'
.. '</tr>\n'
.. '<tr>\n' -- Second row
.. '<td style="width: 15%; text-align: left; white-space: nowrap; font-size: 0.75em;">\n' .. (adjacent_links[4] or '') .. '</td>\n'
.. '<td style="width: 70%; padding-left: 1em; padding-right: 1em; text-align: center;">\n' .. title .. '</td>\n'
.. '<td style="width: 15%; text-align: right; white-space: nowrap; font-size: 0.75em;">\n' .. (adjacent_links[5] or '') .. '</td>\n'
.. '</tr>\n'
.. '<tr>\n' -- Third row
.. '<td style="width: 15%; text-align: left; white-space: nowrap; font-size: 0.75em;">\n' .. (adjacent_links[6] or '') .. '</td>\n'
.. '<td style="width: 70%; padding-left: 1em; padding-right: 1em; text-align: center;">\n' .. (adjacent_links[7] or '') .. '</td>\n'
.. '<td style="width: 15%; text-align: right; white-space: nowrap; font-size: 0.75em;">\n' .. (adjacent_links[8] or '') .. '</td>\n'
.. '</tr>\n'
-- End
.. '</table>'
else
header = title
end
return header
end
-- Row of an infobox
-- Infobox is set up as a Mediawiki table with two cols.
function p.infobox_row(row_content)
local row = ""
if #row_content > 1 then
local caption = row_content[1]
local text = row_content[2]
row = row
.. '|-\n'
.. '| style="text-align: right; padding-right: 0.25em;" | ' .. caption .. '\n'
.. '| style="background-color: white; padding-left: 0.25em; font-weight: bold;" | ' .. text '\n'
elseif #row_content == 1 then
local text = row_content[1]
row = row
.. '|-\n'
.. '| colspan="2" style="text-align: center;" | ' .. text .. '\n'
end
return row
end
--------------------------------------------------------------------------------
-------------------------------- MAIN FUNCTIONS --------------------------------
--------------------------------------------------------------------------------
-- Function to be called by other modules; also called by wrapper function
function p._infobox(args)
local title = args["Title"] or "Infobox Title"
local adjacent_links = args["Adjacent Links"]
local rows = args["Rows"]
-- Start of infobox; outer div and start of table
local infobox = '<div style="'
.. 'border: 1px solid #999; '
.. 'margin: 0; '
.. 'margin-left: 1em; '
.. 'margin-bottom: 0.5em; '
.. 'padding: 0.5em; '
.. 'background-color: #f0f0f0; '
.. 'min-width: 15em; '
.. 'float: right; '
.. 'max-width: 100%; '
.. 'overflow: auto;">\n'
-- Infobox table, starting with table
.. '{| width="100%" style="border-collapse: collapse;"\n'
.. '|+ style="font-size: 105%; font-weight: bold; text-align: center;" | ' .. p.infobox_header(title, adjacent_links) .. '\n'
-- For loop for populating entries
for i = 1, #rows do
infobox = infobox .. p.infobox_row(rows[i])
end
infobox = infobox .. "|}</div>"
return infobox
end
-- Function to be #invoke'd
-- Wrapper function for template-based infoboxes
-- Modeled off of navbox
function p.infobox(frame)
local args = getArgs(frame)
-- Preprocess adjacent links
-- If there are two adjacent links (such as with edos), then links
-- will be placed on the left and right of the title
-- [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 surround the title, forming a 3x3 grid as such:
-- [Link 1] [Link 2] [Link 3]
-- [Link 4] Title [Link 5]
-- [Link 6] [Link 7] [Link 8]
-- - 1: prev_A, prev_B
-- - 2: prev_B
-- - 3: next_A, prev_B
-- - 4: prev_A,
-- - 5: next_A,
-- - 6: prev_A, next_B
-- - 7: next_B,
-- - 8: next_A, next_B
-- Leaving this field nil defaults to only having the title; individual
-- links, as with "border" cases (eg, nothing comes before 0edo), can be
-- left blank.
local adjacent_links = {}
local link_count = tonumber(args["Link Count"]) -- This is 0, 2, or 8
if link_count == 2 then
table.insert(adjacent_links, args["Left Link" ])
table.insert(adjacent_links, args["Right Link"])
elseif link_count == 8 then
table.insert(adjacent_links, args["Upper Left Link" ])
table.insert(adjacent_links, args["Upper Link" ])
table.insert(adjacent_links, args["Upper Right Link"])
table.insert(adjacent_links, args["Left Link" ])
table.insert(adjacent_links, args["Right Link" ])
table.insert(adjacent_links, args["Lower Left Link" ])
table.insert(adjacent_links, args["Lower Link" ])
table.insert(adjacent_links, args["Lower Right Link"])
end
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
-- Set row count to 30; if more rows are needed, this can be changed or a
-- module can be written for that.
local rows = {}
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
return p._infobox(args)
end
--------------------------------------------------------------------------------
------------------------------ EXISTING FUNCTIONS ------------------------------
--------------------------------------------------------------------------------
-- Original function; kept for supporting old navboxes
function p.build(title, entries, prev_link, next_link)
local s = "<div style=\""
.. "border: 1px solid #999; "
.. "margin: 0; "
.. "margin-left: 1em; "
.. "margin-bottom: 0.5em; "
.. "padding: 0.5em; "
.. "background-color: #f0f0f0; "
.. "min-width: 15em; "
.. "float: right; "
.. "max-width: 100%; "
.. "overflow: auto; "
.. "\">\n"
.. "{| width=\"100%\" style=\"border-collapse: collapse;\"\n"
.. "|+ style=\"font-size: 105%; font-weight: bold; text-align: center;\" | "
local has_adjacent = (prev_link and #prev_link > 0) or (next_link and #next_link > 0)
if has_adjacent then
s = s
.. "<table style=\"width: 100%; margin: 0;\"><tr>"
.. "<td style=\"width: 15%; text-align: left; white-space: nowrap; font-size: 0.75em;\">"
.. (prev_link or "")
.. "</td>"
.. "<td style=\"width: 70%; padding-left: 1em; padding-right: 1em; text-align: center;\">"
.. title
.. "</td>"
.. "<td style=\"width: 15%; text-align: right; white-space: nowrap; font-size: 0.75em;\">"
.. (next_link or "")
.. "</td>"
.. "</tr></table>"
else
s = s .. title
end
s = s .. "\n"
for _, entry in ipairs(entries) do
if #entry > 1 then
local caption = entry[1]
local text = entry[2]
s = s
.. "|-\n"
.. "| style=\"text-align: right; padding-right: 0.25em;\" | "
.. caption
.. "\n"
.. "| style=\"background-color: white; padding-left: 0.25em; font-weight: bold;\" | "
.. text
.. "\n"
elseif #entry == 1 then
local text = entry[1]
s = s .. "|-\n" .. "| colspan=\"2\" style=\"text-align: center;\" | ".. text .. "\n"
end
end
s = s .. "|}</div>"
return s
end
-- Multilink infobox
-- The following must be passed in:
-- - Title (self-explanatory)
-- - Sections (see comments for details)
-- - Adjacent links; supports 0, 2, or 8 adjacent links
function p.build_multilink(title, entries, adjacent_links)
-- Boilerplate stuff
local s = "<div style=\""
.. "border: 1px solid #999; "
.. "margin: 0; "
.. "margin-left: 1em; "
.. "margin-bottom: 0.5em; "
.. "padding: 0.5em; "
.. "background-color: #f0f0f0; "
.. "min-width: 15em; "
.. "float: right; "
.. "max-width: 100%; "
.. "overflow: auto;"
.. "\">\n"
.. "{| width=\"100%\" style=\"border-collapse: collapse;\"\n"
.. "|+ style=\"font-size: 105%; font-weight: bold; text-align: center;\" | "
-- Adjacent links
-- If there are two adjacent links (such as with edos), then links
-- will be placed on the left and right of the title
-- [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 surround the title, forming a 3x3 grid as such:
-- [Link 1] [Link 2] [Link 3]
-- [Link 4] Title [Link 5]
-- [Link 6] [Link 7] [Link 8]
-- - 1: prev_A, prev_B
-- - 2: prev_B
-- - 3: next_A, prev_B
-- - 4: prev_A,
-- - 5: next_A,
-- - 6: prev_A, next_B
-- - 7: next_B,
-- - 8: next_A, next_B
-- Leaving this field nil defaults to only having the title; individual
-- links, as with "border" cases (eg, nothing comes before 0edo), can be
-- left blank.
if adjacent_links == nil then
s = s .. title
s = s .. "\n"
elseif #adjacent_links == 2 then
local prev_link = adjacent_links[1]
local next_link = adjacent_links[2]
s = s
.. "<table style=\"width: 100%; margin: 0;\"><tr>"
.. "<td style=\"width: 15%; text-align: left; white-space: nowrap; font-size: 0.75em;\">"
.. (prev_link or "")
.. "</td>"
.. "<td style=\"width: 70%; padding-left: 1em; padding-right: 1em; text-align: center;\">"
.. title
.. "</td>"
.. "<td style=\"width: 15%; text-align: right; white-space: nowrap; font-size: 0.75em;\">"
.. (next_link or "")
.. "</td>"
.. "</tr></table>"
s = s .. "\n"
elseif #adjacent_links == 8 then
-- First row
s = s .. "<table style=\"width: 100%; margin: 0;\"><tr>"
.. "<td style=\"width: 15%; text-align: left; white-space: nowrap; font-size: 0.75em;\">"
.. (adjacent_links[1] or "")
.. "</td>"
.. "<td style=\"width: 75%; padding-left: 1em; padding-right: 1em; text-align: center; font-size: 0.75em;\">"
.. (adjacent_links[2] or "")
.. "\n</td><td style=\"width: 15%; text-align: right; white-space: nowrap; font-size: 0.75em;\">"
.. (adjacent_links[3] or "")
.. "</td>"
-- Second row
.. "\n<tr>"
.. "<td style=\"width: 15%; text-align: left; white-space: nowrap; font-size: 0.75em;\">"
.. (adjacent_links[4] or "")
.. "</td>"
.. "<td style=\"width: 75%; padding-left: 1em; padding-right: 1em; text-align: center;\">"
.. title
.. "</td>"
.. "<td style=\"width: 15%; text-align: right; white-space: nowrap; font-size: 0.75em;\">"
.. (adjacent_links[5] or "")
.. "</td>"
.. "</tr>"
.. "<tr>"
-- Third row
.. "<td style=\"width: 15%; text-align: left; white-space: nowrap; font-size: 0.75em;\">"
.. (adjacent_links[6] or "")
.. "</td><td style=\"width: 75%; padding-left: 1em; padding-right: 1em; text-align: center; font-size: 0.75em;\">"
.. (adjacent_links[7] or "")
.. "\n</td>"
.. "<td style=\"width: 15%; text-align: right; white-space: nowrap; font-size: 0.75em;\">"
.. (adjacent_links[8] or "")
.. "</td>"
.. "</tr>"
.. "</table>"
s = s .. "\n"
else
s = s .. title
s = s .. "\n"
end
-- Add infobox entries
-- Entries are entered as a jagged array (array of arrays) where each
-- subarray has either one or two entries.
-- These entries form the rows of a two-column table.
-- One-entry arrays are used for entries that must span both columns,
-- such as a section header. Two-entry arrays are used for the main content.
for _, entry in ipairs(entries) do
if #entry > 1 then
local caption = entry[1]
local text = entry[2]
s = s
.. "|-\n"
.. "| style=\"text-align: right; padding-right: 0.25em;\" | "
.. caption
.. "\n"
.. "| style=\"background-color: white; padding-left: 0.25em; font-weight: bold;\" | "
.. text
.. "\n"
elseif #entry == 1 then
local text = entry[1]
s = s .. "|-\n" .. "| colspan=\"2\" style=\"text-align: center;\" | " .. text .. "\n"
end
end
-- End of infobox
s = s .. "|}\n"
.. "</div>"
return s
end
return p