Editing Module:Infobox
The edit can be undone. Please check the comparison below to verify that this is what you want to do, and then publish the changes below to finish undoing the edit.
Latest revision | Your text | ||
Line 1: | Line 1: | ||
-- | -- | ||
-- This module | -- This module will implement {{Infobox}} | ||
-- | -- | ||
local p = {} | local p = {} | ||
local | local HtmlBuilder = require('Module:HtmlBuilder') | ||
local args | local args | ||
local root | local root | ||
function union(t1, t2) | |||
-- return the union of the values of two tables, as a sequence | |||
-- | |||
local vals = {} | local vals = {} | ||
for k, v in pairs(t1) do | for k, v in pairs(t1) do | ||
Line 77: | Line 27: | ||
local function getArgNums(prefix) | local function getArgNums(prefix) | ||
local nums = {} | local nums = {} | ||
for k, v in pairs(args) do | for k, v in pairs(args) do | ||
local num = | local num = ('' .. k):match('^' .. prefix .. '([1-9]%d*)$') | ||
if num then table.insert(nums, tonumber(num)) end | if num then table.insert(nums, tonumber(num)) end | ||
end | end | ||
Line 90: | Line 37: | ||
local function addRow(rowArgs) | local function addRow(rowArgs) | ||
if rowArgs.header then | if rowArgs.header then | ||
root | root | ||
.tag('tr') | |||
.tag('th') | |||
.attr('colspan', 2) | |||
.addClass(rowArgs.class) | |||
.css('text-align', 'center') | |||
.cssText(args.headerstyle) | |||
.wikitext(rowArgs.header) | |||
elseif rowArgs.data then | elseif rowArgs.data then | ||
local row = root | local row = root.tag('tr') | ||
row | row.addClass(rowArgs.rowclass) | ||
if rowArgs.label then | if rowArgs.label then | ||
row | row | ||
.tag('th') | |||
.attr('scope', 'row') | |||
.css('text-align', 'left') | |||
.cssText(args.labelstyle) | |||
.wikitext(rowArgs.label) | |||
.done() | |||
end | end | ||
local dataCell = row | local dataCell = row.tag('td') | ||
if not rowArgs.label then | if not rowArgs.label then | ||
dataCell | dataCell | ||
.attr('colspan', 2) | |||
.css('text-align', 'center') | |||
end | end | ||
dataCell | dataCell | ||
.addClass(rowArgs.class) | |||
.cssText(rowArgs.datastyle) | |||
.wikitext(rowArgs.data) | |||
end | end | ||
end | end | ||
Line 143: | Line 76: | ||
root | root | ||
.tag('caption') | |||
.addClass(args.titleclass) | |||
.cssText(args.titlestyle) | |||
.wikitext(args.title) | |||
end | end | ||
Line 153: | Line 86: | ||
root | root | ||
.tag('tr') | |||
.tag('th') | |||
.attr('colspan', 2) | |||
.addClass(args.aboveclass) | |||
.css('text-align', 'center') | |||
.css('font-size', '125%') | |||
.css('font-weight', 'bold') | |||
.cssText(args.abovestyle) | |||
.wikitext(args.above) | |||
end | end | ||
Line 168: | Line 101: | ||
root | root | ||
.tag('tr') | |||
.tag('td') | |||
.attr('colspan', '2') | |||
.addClass(args.belowclass) | |||
.css('text-align', 'center') | |||
.cssText(args.belowstyle) | |||
.newline() | |||
.wikitext(args.below) | |||
.newline() | |||
end | end | ||
Line 188: | Line 122: | ||
for k, num in ipairs(subheadernums) do | for k, num in ipairs(subheadernums) do | ||
addRow({ | addRow({ | ||
data = args['subheader' .. | data = args['subheader' .. num], | ||
datastyle = args.subheaderstyle or args['subheaderstyle' .. | datastyle = args.subheaderstyle or args['subheaderstyle' .. num], | ||
class = args.subheaderclass, | class = args.subheaderclass, | ||
rowclass = args['subheaderrowclass' .. | rowclass = args['subheaderrowclass' .. num] | ||
}) | }) | ||
end | end | ||
Line 205: | Line 139: | ||
local imagenums = getArgNums('image') | local imagenums = getArgNums('image') | ||
for k, num in ipairs(imagenums) do | for k, num in ipairs(imagenums) do | ||
local caption = args['caption' .. | local caption = args['caption' .. num] | ||
local data = | local data = HtmlBuilder.create().wikitext(args['image' .. num]) | ||
if caption then | if caption then | ||
data | data | ||
.tag('br', {selfClosing = true}) | |||
.done() | |||
.tag('span') | |||
.cssText(args.captionstyle) | |||
.wikitext(caption) | |||
end | end | ||
addRow({ | addRow({ | ||
Line 217: | Line 153: | ||
datastyle = args.imagestyle, | datastyle = args.imagestyle, | ||
class = args.imageclass, | class = args.imageclass, | ||
rowclass = args['imagerowclass' .. | rowclass = args['imagerowclass' .. num] | ||
}) | }) | ||
end | end | ||
Line 223: | Line 159: | ||
local function renderRows() | local function renderRows() | ||
local rownums = union(getArgNums('header'), getArgNums('data')) | local rownums = union(getArgNums('header'), getArgNums('data')) | ||
table.sort(rownums) | table.sort(rownums) | ||
for k, num in ipairs(rownums) do | for k, num in ipairs(rownums) do | ||
addRow({ | addRow({ | ||
header = args['header' .. | header = args['header' .. num], | ||
label = args['label' .. | label = args['label' .. num], | ||
data = args['data' .. | data = args['data' .. num], | ||
datastyle = args.datastyle, | datastyle = args.datastyle, | ||
class = args['class' .. | class = args['class' .. num], | ||
rowclass = args['rowclass' .. | rowclass = args['rowclass' .. num] | ||
}) | }) | ||
end | end | ||
Line 249: | Line 177: | ||
root | root | ||
.tag('tr') | |||
.tag('td') | |||
.attr('colspan', '2') | |||
.css('text-align', 'right') | |||
: | .wikitext(mw.getCurrentFrame():expandTemplate({ | ||
args.name, | title = 'navbar', | ||
args = { args.name, mini = 1 } | |||
}) | })) | ||
end | end | ||
Line 262: | Line 190: | ||
local italicTitle = args['italic title'] and mw.ustring.lower(args['italic title']) | local italicTitle = args['italic title'] and mw.ustring.lower(args['italic title']) | ||
if italicTitle == '' or italicTitle == 'force' or italicTitle == 'yes' then | if italicTitle == '' or italicTitle == 'force' or italicTitle == 'yes' then | ||
root | root.wikitext(mw.getCurrentFrame():expandTemplate({title = 'italic title'})) | ||
end | end | ||
end | end | ||
Line 268: | Line 196: | ||
local function renderTrackingCategories() | local function renderTrackingCategories() | ||
if args.decat ~= 'yes' then | if args.decat ~= 'yes' then | ||
if #(getArgNums('data')) == 0 and mw.title.getCurrentTitle().namespace == 0 then | |||
root.wikitext('[[Category:Articles which use infobox templates with no data rows]]') | |||
end | |||
if args.child == 'yes' and args.title then | |||
root.wikitext('[[Category:Articles which use embedded infobox templates with the title parameter]]') | |||
root | |||
end | end | ||
end | end | ||
Line 279: | Line 206: | ||
local function _infobox() | local function _infobox() | ||
if args.child ~= 'yes' then | if args.child ~= 'yes' then | ||
root = | root = HtmlBuilder.create('table') | ||
root | root | ||
.addClass('infobox') | |||
.addClass(args.bodyclass) | |||
.attr('cellspacing', 3) | |||
.css('border-spacing', '3px') | |||
.cssText(args.bodystyle) | |||
if args.subbox == 'yes' then | if args.subbox == 'yes' then | ||
root | root | ||
.css('padding', '0') | |||
.css('border', 'none') | |||
.css('margin', '-3px') | |||
.css('width', 'auto') | |||
.css('min-width', '100%') | |||
.css('font-size', '100%') | |||
.css('clear', 'none') | |||
.css('float', 'none') | |||
.css('background-color', 'transparent') | |||
else | else | ||
root | root | ||
.css('width', '22em') | |||
end | end | ||
renderTitle() | renderTitle() | ||
renderAboveRow() | renderAboveRow() | ||
else | else | ||
root = | root = HtmlBuilder.create() | ||
end | end | ||
Line 324: | Line 247: | ||
return tostring(root) | return tostring(root) | ||
end | end | ||
function p.infobox(frame) | function p.infobox(frame) | ||
local origArgs | |||
-- If called via #invoke, use the args passed into the invoking template. | -- If called via #invoke, use the args passed into the invoking template. | ||
-- Otherwise, for testing purposes, assume args are being passed directly in. | -- Otherwise, for testing purposes, assume args are being passed directly in. | ||
Line 400: | Line 258: | ||
origArgs = frame | origArgs = frame | ||
end | end | ||
-- | -- ParserFunctions considers whitespace to be false, so to preserve the previous | ||
-- behavior of {{infobox}}, change any whitespace arguments to nil, so Lua will consider | |||
-- | -- them false too. (Except the 'italic title' param, which specifies different behavior | ||
-- depending on whether it's absent or empty) | |||
args = {} | |||
for k, v in pairs(origArgs) do | |||
if mw.ustring.match(v, '%S') or k == 'italic title' then | |||
args[k] = v | |||
end | |||
end | |||
return _infobox() | return _infobox() |