Module documentation[view] [edit] [history] [purge]
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.

On modules, you can include local infobox= require("Module:Infobox")._infobox to create an infobox.
Introspection summary for Module:Infobox 
Functions provided (6)
Line Function Params
17 infobox_header (title, adjacent_links)
64 infobox_row (row_content)
87 _infobox (main) (args)
121 infobox (invokable) (frame)
202 build (title, entries, prev_link, next_link)
261 build_multilink (title, entries, adjacent_links)
Lua modules required (1)
Variable Module Functions used
getArgs Module:Arguments getArgs

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 = 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 or data ~= nil) then
			row = {
				["Header"] = header,
				["Data"] = ((header ~= nil and data == nil) and "" or 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