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 2: | Line 2: | ||
-- This module implements {{Infobox}} | -- This module implements {{Infobox}} | ||
-- | -- | ||
local p = {} | local p = {} | ||
local | local HtmlBuilder = require('Module:HtmlBuilder') | ||
local args | local args | ||
local root | local root | ||
function union(t1, t2) | |||
-- Returns the union of the values of two tables, as a sequence. | -- Returns the union of the values of two tables, as a sequence. | ||
local vals = {} | local vals = {} | ||
Line 94: | Line 44: | ||
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 81: | ||
root | root | ||
.tag('caption') | |||
.addClass(args.titleclass) | |||
.cssText(args.titlestyle) | |||
.wikitext(args.title) | |||
end | end | ||
Line 153: | Line 91: | ||
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 106: | ||
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 127: | ||
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 144: | ||
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 158: | ||
datastyle = args.imagestyle, | datastyle = args.imagestyle, | ||
class = args.imageclass, | class = args.imageclass, | ||
rowclass = args['imagerowclass' .. | rowclass = args['imagerowclass' .. num] | ||
}) | }) | ||
end | end | ||
Line 229: | Line 170: | ||
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 184: | ||
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 197: | ||
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 203: | ||
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 282: | Line 216: | ||
-- if the infobox is used as a 'child' inside another infobox. | -- if the infobox is used as a 'child' inside another 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 326: | Line 258: | ||
end | end | ||
local function | local function touchParameters(prefixTable, origArgs, step) | ||
-- Parse the parameters with the given prefixes, in order, in batches | |||
-- of the step size specified. This is to prevent references etc. from | |||
-- appearing in the wrong order. | |||
if type(prefixTable) ~= 'table' or type(origArgs) ~= 'table' then | |||
error("Invalid input to the touchParameters function detected. Both parameters must be tables.", 2) | |||
-- | |||
-- of the step size specified. This is to prevent references etc. from | |||
-- wrong order | |||
if type(prefixTable) ~= 'table' then | |||
error(" | |||
end | end | ||
if type(step) ~= 'number' then | if step and type(step) ~= 'number' then | ||
error(" | error("Non-numerical step value detected.", 2) | ||
end | end | ||
-- | step = step or 20 -- If the step size is not given, the default is 20. | ||
for | local temp | ||
if type(v) | local a = 1 -- Counter variable. | ||
error( | local moreArgumentsExist = true | ||
for j,v in ipairs(prefixTable) do | |||
if not type(v) == "string" then | |||
error("Non-string value detected in the prefix table in the touchParameters function.", 2) | |||
end | end | ||
temp = origArgs[v] | |||
end | end | ||
while moreArgumentsExist == true do | while moreArgumentsExist == true do | ||
moreArgumentsExist = false | moreArgumentsExist = false | ||
for i = a, a + step - 1 do | for i = a, a + step - 1 do | ||
for j,v in ipairs(prefixTable) do | for j,v in ipairs(prefixTable) do | ||
temp = origArgs[v .. tostring(i)] | |||
if | if temp then | ||
moreArgumentsExist = true | moreArgumentsExist = true | ||
end | end | ||
end | end | ||
Line 393: | Line 294: | ||
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 402: | Line 304: | ||
-- Parse the data parameters in the same order that the old {{infobox}} did, so that | -- Parse the data parameters in the same order that the old {{infobox}} did, so that | ||
-- references etc. will display in the expected places. | -- references etc. will display in the expected places. | ||
local temp | |||
temp = origArgs.title | |||
temp = origArgs.above | |||
touchParameters({'subheader'}, origArgs, 5) | |||
touchParameters({'image', 'caption'}, origArgs, 5) | |||
touchParameters({'header', 'label', 'data'}, origArgs, 20) | |||
temp = origArgs.below | |||
-- 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() |