Editing Module:Infobox

Jump to: navigation, search

Warning: You are not logged in. Your IP address will be publicly visible if you make any edits. If you log in or create an account, your edits will be attributed to your username, along with other benefits.

The edit can be undone. Please check the comparison below to verify that this is what you want to do, and then save 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 = {}
  
Line 8: Line 8:
  
 
local args = {}
 
local args = {}
local origArgs = {}
+
local origArgs
 
local root
 
local root
 
local function notempty( s ) return s and s:match( '%S' ) end
 
 
local function fixChildBoxes(sval, tt)
 
if notempty(sval) then
 
local marker = '<span class=special_infobox_marker>'
 
local s = sval
 
s = mw.ustring.gsub(s, '(<%s*[Tt][Rr])', marker .. '%1')
 
s = mw.ustring.gsub(s, '(</[Tt][Rr]%s*>)', '%1' .. marker)
 
if s:match(marker) then
 
s = mw.ustring.gsub(s, marker .. '%s*' .. marker, '')
 
s = mw.ustring.gsub(s, '([\r\n]|-[^\r\n]*[\r\n])%s*' .. marker, '%1')
 
s = mw.ustring.gsub(s, marker .. '%s*([\r\n]|-)', '%1')
 
s = mw.ustring.gsub(s, '(</[Cc][Aa][Pp][Tt][Ii][Oo][Nn]%s*>%s*)' .. marker, '%1')
 
s = mw.ustring.gsub(s, '(<%s*[Tt][Aa][Bb][Ll][Ee][^<>]*>%s*)' .. marker, '%1')
 
s = mw.ustring.gsub(s, '^(%{|[^\r\n]*[\r\n]%s*)' .. marker, '%1')
 
s = mw.ustring.gsub(s, '([\r\n]%{|[^\r\n]*[\r\n]%s*)' .. marker, '%1')
 
s = mw.ustring.gsub(s, marker .. '(%s*</[Tt][Aa][Bb][Ll][Ee]%s*>)', '%1')
 
s = mw.ustring.gsub(s, marker .. '(%s*\n|%})', '%1')
 
end
 
if s:match(marker) then
 
local subcells = mw.text.split(s, marker)
 
s = ''
 
for k = 1, #subcells do
 
if k == 1 then
 
s = s .. subcells[k] .. '</' .. tt .. '></tr>'
 
elseif k == #subcells then
 
local rowstyle = ' style="display:none"'
 
if notempty(subcells[k]) then rowstyle = '' end
 
s = s .. '<tr' .. rowstyle ..'><' .. tt .. ' colspan=2>\n' .. subcells[k]
 
elseif notempty(subcells[k]) then
 
if (k % 2) == 0 then
 
s = s .. subcells[k]
 
else
 
s = s .. '<tr><' .. tt .. ' colspan=2>\n' .. subcells[k] .. '</' .. tt .. '></tr>'
 
end
 
end
 
end
 
end
 
-- the next two lines add a newline at the end of lists for the PHP parser
 
-- https://en.wikipedia.org/w/index.php?title=Template_talk:Infobox_musical_artist&oldid=849054481
 
-- remove when [[:phab:T191516]] is fixed or OBE
 
s = mw.ustring.gsub(s, '([\r\n][%*#;:][^\r\n]*)$', '%1\n')
 
s = mw.ustring.gsub(s, '^([%*#;:][^\r\n]*)$', '%1\n')
 
s = mw.ustring.gsub(s, '^([%*#;:])', '\n%1')
 
s = mw.ustring.gsub(s, '^(%{%|)', '\n%1')
 
return s
 
else
 
return sval
 
end
 
end
 
  
 
local function union(t1, t2)
 
local 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 = {}
for k, v in pairs(t1) do
+
    for k, v in pairs(t1) do
vals[v] = true
+
        vals[v] = true
end
+
    end
for k, v in pairs(t2) do
+
    for k, v in pairs(t2) do
vals[v] = true
+
        vals[v] = true
end
+
    end
local ret = {}
+
    local ret = {}
for k, v in pairs(vals) do
+
    for k, v in pairs(vals) do
table.insert(ret, k)
+
        table.insert(ret, k)
end
+
    end
return ret
+
    return ret
 
end
 
end
  
 
local function getArgNums(prefix)
 
local function getArgNums(prefix)
-- Returns a table containing the numbers of the arguments that exist
+
    -- Returns a table containing the numbers of the arguments that exist
-- for the specified prefix. For example, if the prefix was 'data', and
+
    -- for the specified prefix. For example, if the prefix was 'data', and
-- 'data1', 'data2', and 'data5' exist, it would return {1, 2, 5}.
+
    -- 'data1', 'data2', and 'data5' exist, it would return {1, 2, 5}.
local nums = {}
+
    local nums = {}
for k, v in pairs(args) do
+
    for k, v in pairs(args) do
local num = tostring(k):match('^' .. prefix .. '([1-9]%d*)$')
+
        local num = tostring(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
table.sort(nums)
+
    table.sort(nums)
return nums
+
    return nums
 
end
 
end
  
 
local function addRow(rowArgs)
 
local function addRow(rowArgs)
-- Adds a row to the infobox, with either a header cell
+
    -- Adds a row to the infobox, with either a header cell
-- or a label/data cell combination.
+
    -- or a label/data cell combination.
if rowArgs.header and rowArgs.header ~= '_BLANK_' then
+
    if rowArgs.header then
root
+
        root
:tag('tr')
+
            :tag('tr')
:addClass(rowArgs.rowclass)
+
                :addClass(rowArgs.rowclass)
:cssText(rowArgs.rowstyle)
+
                :cssText(rowArgs.rowstyle)
:attr('id', rowArgs.rowid)
+
                :attr('id', rowArgs.rowid)
:tag('th')
+
                :tag('th')
:attr('colspan', 2)
+
                    :attr('colspan', 2)
:attr('id', rowArgs.headerid)
+
                    :attr('id', rowArgs.headerid)
:addClass(rowArgs.class)
+
                    :addClass(rowArgs.class)
:addClass(args.headerclass)
+
                    :addClass(args.headerclass)
:css('text-align', 'center')
+
                    :css('text-align', 'center')
:cssText(args.headerstyle)
+
                    :cssText(args.headerstyle)
:cssText(rowArgs.rowcellstyle)
+
                    :wikitext(rowArgs.header)
:wikitext(fixChildBoxes(rowArgs.header, 'th'))
+
    elseif rowArgs.data then
if rowArgs.data then
+
        local row = root:tag('tr')
root:wikitext('[[Category:Pages which use infobox templates with ignored data cells]]')
+
        row:addClass(rowArgs.rowclass)
end
+
        row:cssText(rowArgs.rowstyle)
elseif rowArgs.data then
+
        row:attr('id', rowArgs.rowid)
if not rowArgs.data:gsub('%[%[%s*[Cc][Aa][Tt][Ee][Gg][Oo][Rr][Yy]%s*:[^]]*]]', ''):match('^%S') then
+
        if rowArgs.label then
rowArgs.rowstyle = 'display:none'
+
            row
end
+
                :tag('th')
local row = root:tag('tr')
+
                    :attr('scope', 'row')
row:addClass(rowArgs.rowclass)
+
                    :attr('id', rowArgs.labelid)
row:cssText(rowArgs.rowstyle)
+
                    :cssText(args.labelstyle)
row:attr('id', rowArgs.rowid)
+
                    :wikitext(rowArgs.label)
if rowArgs.label then
+
                    :done()
row
+
        end
:tag('th')
+
       
:attr('scope', 'row')
+
        local dataCell = row:tag('td')
:attr('id', rowArgs.labelid)
+
        if not rowArgs.label then  
:cssText(args.labelstyle)
+
            dataCell
:cssText(rowArgs.rowcellstyle)
+
                :attr('colspan', 2)
:wikitext(rowArgs.label)
+
                :css('text-align', 'center')  
:done()
+
        end
end
+
        dataCell
 
+
            :attr('id', rowArgs.dataid)
local dataCell = row:tag('td')
+
            :addClass(rowArgs.class)
if not rowArgs.label then
+
            :cssText(rowArgs.datastyle)
dataCell
+
            :newline()
:attr('colspan', 2)
+
            :wikitext(rowArgs.data)
:css('text-align', 'center')
+
    end
end
 
dataCell
 
:attr('id', rowArgs.dataid)
 
:addClass(rowArgs.class)
 
:cssText(rowArgs.datastyle)
 
:cssText(rowArgs.rowcellstyle)
 
:wikitext(fixChildBoxes(rowArgs.data, 'td'))
 
end
 
 
end
 
end
  
 
local function renderTitle()
 
local function renderTitle()
if not args.title then return end
+
    if not args.title then return end
  
root
+
    root
:tag('caption')
+
        :tag('caption')
:addClass(args.titleclass)
+
            :addClass(args.titleclass)
:cssText(args.titlestyle)
+
            :cssText(args.titlestyle)
:wikitext(args.title)
+
            :wikitext(args.title)
 
end
 
end
  
 
local function renderAboveRow()
 
local function renderAboveRow()
if not args.above then return end
+
    if not args.above then return end
 
+
   
root
+
    root
:tag('tr')
+
        :tag('tr')
:tag('th')
+
            :tag('th')
:attr('colspan', 2)
+
                :attr('colspan', 2)
:addClass(args.aboveclass)
+
                :addClass(args.aboveclass)
:css('text-align', 'center')
+
                :css('text-align', 'center')
:css('font-size', '125%')
+
                :css('font-size', '125%')
:css('font-weight', 'bold')
+
                :css('font-weight', 'bold')
:cssText(args.abovestyle)
+
                :cssText(args.abovestyle)
:wikitext(fixChildBoxes(args.above,'th'))
+
                :wikitext(args.above)
 
end
 
end
  
 
local function renderBelowRow()
 
local function renderBelowRow()
if not args.below then return end
+
    if not args.below then return end
 
+
   
root
+
    root
:tag('tr')
+
        :tag('tr')
:tag('td')
+
            :tag('td')
:attr('colspan', '2')
+
                :attr('colspan', '2')
:addClass(args.belowclass)
+
                :addClass(args.belowclass)
:css('text-align', 'center')
+
                :css('text-align', 'center')
:cssText(args.belowstyle)
+
                :cssText(args.belowstyle)
:wikitext(fixChildBoxes(args.below,'td'))
+
                :newline()
 +
                :wikitext(args.below)
 
end
 
end
  
 
local function renderSubheaders()
 
local function renderSubheaders()
if args.subheader then
+
    if args.subheader then
args.subheader1 = args.subheader
+
        args.subheader1 = args.subheader
end
+
    end
if args.subheaderrowclass then
+
    if args.subheaderrowclass then
args.subheaderrowclass1 = args.subheaderrowclass
+
        args.subheaderrowclass1 = args.subheaderrowclass
end
+
    end
local subheadernums = getArgNums('subheader')
+
    local subheadernums = getArgNums('subheader')
for k, num in ipairs(subheadernums) do
+
    for k, num in ipairs(subheadernums) do
addRow({
+
        addRow({
data = args['subheader' .. tostring(num)],
+
            data = args['subheader' .. tostring(num)],
datastyle = args.subheaderstyle,
+
            datastyle = args.subheaderstyle or args['subheaderstyle' .. tostring(num)],
rowcellstyle = args['subheaderstyle' .. tostring(num)],
+
            class = args.subheaderclass,
class = args.subheaderclass,
+
            rowclass = args['subheaderrowclass' .. tostring(num)]
rowclass = args['subheaderrowclass' .. tostring(num)]
+
        })
})
+
    end
end
 
 
end
 
end
  
 
local function renderImages()
 
local function renderImages()
if args.image then
+
    if args.image then
args.image1 = args.image
+
        args.image1 = args.image
end
+
    end
if args.caption then
+
    if args.caption then
args.caption1 = args.caption
+
        args.caption1 = args.caption
end
+
    end
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' .. tostring(num)]
+
        local caption = args['caption' .. tostring(num)]
local data = mw.html.create():wikitext(args['image' .. tostring(num)])
+
        local data = mw.html.create():wikitext(args['image' .. tostring(num)])
if caption then
+
        if caption then
data
+
            data
:tag('div')
+
                :tag('div')
:cssText(args.captionstyle)
+
                    :cssText(args.captionstyle)
:wikitext(caption)
+
                    :wikitext(caption)
end
+
        end
addRow({
+
        addRow({
data = tostring(data),
+
            data = tostring(data),
datastyle = args.imagestyle,
+
            datastyle = args.imagestyle,
class = args.imageclass,
+
            class = args.imageclass,
rowclass = args['imagerowclass' .. tostring(num)]
+
            rowclass = args['imagerowclass' .. tostring(num)]
})
+
        })
end
+
    end
end
 
 
 
local function preprocessRows()
 
-- Gets the union of the header and data argument numbers,
 
-- and renders them all in order using addRow.
 
local rownums = union(getArgNums('header'), getArgNums('data'))
 
table.sort(rownums)
 
local lastheader
 
for k, num in ipairs(rownums) do
 
if args['header' .. tostring(num)] then
 
if lastheader then
 
args['header' .. tostring(lastheader)] = nil
 
end
 
lastheader = num
 
elseif args['data' .. tostring(num)] and args['data' .. tostring(num)]:gsub('%[%[%s*[Cc][Aa][Tt][Ee][Gg][Oo][Rr][Yy]%s*:[^]]*]]', ''):match('^%S') then
 
local data = args['data' .. tostring(num)]
 
if data:gsub('%[%[%s*[Cc][Aa][Tt][Ee][Gg][Oo][Rr][Yy]%s*:[^]]*]]', ''):match('%S') then
 
lastheader = nil
 
end
 
end
 
end
 
if lastheader then
 
args['header' .. tostring(lastheader)] = nil
 
end
 
 
end
 
end
  
 
local function renderRows()
 
local function renderRows()
-- Gets the union of the header and data argument numbers,
+
    -- Gets the union of the header and data argument numbers,
-- and renders them all in order using addRow.
+
    -- and renders them all in order using addRow.
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' .. tostring(num)],
+
            header = args['header' .. tostring(num)],
label = args['label' .. tostring(num)],
+
            label = args['label' .. tostring(num)],
data = args['data' .. tostring(num)],
+
            data = args['data' .. tostring(num)],
datastyle = args.datastyle,
+
            datastyle = args.datastyle,
class = args['class' .. tostring(num)],
+
            class = args['class' .. tostring(num)],
rowclass = args['rowclass' .. tostring(num)],
+
            rowclass = args['rowclass' .. tostring(num)],
rowstyle = args['rowstyle' .. tostring(num)],
+
            rowstyle = args['rowstyle' .. tostring(num)],
rowcellstyle = args['rowcellstyle' .. tostring(num)],
+
            dataid = args['dataid' .. tostring(num)],
dataid = args['dataid' .. tostring(num)],
+
            labelid = args['labelid' .. tostring(num)],
labelid = args['labelid' .. tostring(num)],
+
            headerid = args['headerid' .. tostring(num)],
headerid = args['headerid' .. tostring(num)],
+
            rowid = args['rowid' .. tostring(num)]
rowid = args['rowid' .. tostring(num)]
+
        })
})
+
    end
end
 
 
end
 
end
  
 
local function renderNavBar()
 
local function renderNavBar()
if not args.name then return end
+
    if not args.name then return end
 
+
   
root
+
    root
:tag('tr')
+
        :tag('tr')
:tag('td')
+
            :tag('td')
:attr('colspan', '2')
+
                :attr('colspan', '2')
:css('text-align', 'right')
+
                :css('text-align', 'right')
:wikitext(navbar{
+
                :wikitext(navbar{
args.name,
+
                    args.name,
mini = 1,
+
                    mini = 1,
})
+
                })
 
end
 
end
  
 
local function renderItalicTitle()
 
local function renderItalicTitle()
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:wikitext(mw.getCurrentFrame():expandTemplate({title = 'italic title'}))
+
        root:wikitext(mw.getCurrentFrame():expandTemplate({title = 'italic title'}))
end
+
    end
 
end
 
end
  
 
local function renderTrackingCategories()
 
local function renderTrackingCategories()
if args.decat ~= 'yes' then
+
    if args.decat ~= 'yes' then
if args.child == 'yes' then
+
        if #(getArgNums('data')) == 0 and mw.title.getCurrentTitle().namespace == 0 then
if args.title then
+
            root:wikitext('[[Category:Articles which use infobox templates with no data rows]]')
root:wikitext('[[Category:Pages which use embedded infobox templates with the title parameter]]')
+
        end
end
+
        if args.child == 'yes' and args.title then
elseif #(getArgNums('data')) == 0 and mw.title.getCurrentTitle().namespace == 0 then
+
            root:wikitext('[[Category:Pages which use embedded infobox templates with the title parameter]]')
root:wikitext('[[Category:Articles which use infobox templates with no data rows]]')
+
        end
end
+
    end
end
 
 
end
 
end
  
 
local function _infobox()
 
local function _infobox()
-- Specify the overall layout of the infobox, with special settings
+
    -- Specify the overall layout of the infobox, with special settings
-- 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 = mw.html.create('table')
+
        root = mw.html.create('table')
 +
       
 +
        root
 +
            :addClass('infobox')
 +
            :addClass(args.bodyclass)
 +
           
 +
            if args.subbox == 'yes' then
 +
                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
 +
                root
 +
                    :css('width', '22em')
 +
            end
 +
        root
 +
            :cssText(args.bodystyle)
 +
   
 +
        renderTitle()
 +
        renderAboveRow()
 +
    else
 +
        root = mw.html.create()
 +
       
 +
        root
 +
            :wikitext(args.title)
 +
    end
  
root
+
    renderSubheaders()
:addClass((args.subbox ~= 'yes') and 'infobox' or nil)
+
    renderImages()  
:addClass(args.bodyclass)
+
    renderRows()  
 
+
    renderBelowRow()
if args.subbox == 'yes' then
+
    renderNavBar()
root
+
    renderItalicTitle()
:css('padding', '0')
+
    renderTrackingCategories()
:css('border', 'none')
+
   
:css('margin', '-3px')
+
    return tostring(root)
:css('width', 'auto')
 
:css('min-width', '100%')
 
:css('font-size', '100%')
 
:css('clear', 'none')
 
:css('float', 'none')
 
:css('background-color', 'transparent')
 
else
 
root
 
:css('width', '22em')
 
end
 
root
 
:cssText(args.bodystyle)
 
 
 
renderTitle()
 
renderAboveRow()
 
else
 
root = mw.html.create()
 
 
 
root
 
:wikitext(args.title)
 
end
 
 
 
renderSubheaders()
 
renderImages()
 
if args.autoheaders then
 
preprocessRows()
 
end
 
renderRows()
 
renderBelowRow()
 
renderNavBar()
 
renderItalicTitle()
 
renderTrackingCategories()
 
 
 
return tostring(root)
 
 
end
 
end
  
 
local function preprocessSingleArg(argName)
 
local function preprocessSingleArg(argName)
-- If the argument exists and isn't blank, add it to the argument table.
+
    -- If the argument exists and isn't blank, add it to the argument table.
-- Blank arguments are treated as nil to match the behaviour of ParserFunctions.
+
    -- Blank arguments are treated as nil to match the behaviour of ParserFunctions.
if origArgs[argName] and origArgs[argName] ~= '' then
+
    if origArgs[argName] and origArgs[argName] ~= '' then
args[argName] = origArgs[argName]
+
        args[argName] = origArgs[argName]
end
+
    end
 
end
 
end
  
 
local function preprocessArgs(prefixTable, step)
 
local function preprocessArgs(prefixTable, step)
-- Assign the parameters with the given prefixes to the args table, in order, in batches
+
    -- Assign the parameters with the given prefixes to the args table, in order, in batches
-- of the step size specified. This is to prevent references etc. from appearing in the
+
    -- of the step size specified. This is to prevent references etc. from appearing in the
-- wrong order. The prefixTable should be an array containing tables, each of which has
+
    -- wrong order. The prefixTable should be an array containing tables, each of which has
-- two possible fields, a "prefix" string and a "depend" table. The function always parses
+
    -- two possible fields, a "prefix" string and a "depend" table. The function always parses
-- parameters containing the "prefix" string, but only parses parameters in the "depend"
+
    -- parameters containing the "prefix" string, but only parses parameters in the "depend"
-- table if the prefix parameter is present and non-blank.
+
    -- table if the prefix parameter is present and non-blank.
if type(prefixTable) ~= 'table' then
+
    if type(prefixTable) ~= 'table' then
error("Non-table value detected for the prefix table", 2)
+
        error("Non-table value detected for the prefix table", 2)
end
+
    end
if type(step) ~= 'number' then
+
    if type(step) ~= 'number' then
error("Invalid step value detected", 2)
+
        error("Invalid step value detected", 2)
end
+
    end
 
+
   
-- Get arguments without a number suffix, and check for bad input.
+
    -- Get arguments without a number suffix, and check for bad input.
for i,v in ipairs(prefixTable) do
+
    for i,v in ipairs(prefixTable) do
if type(v) ~= 'table' or type(v.prefix) ~= "string" or (v.depend and type(v.depend) ~= 'table') then
+
        if type(v) ~= 'table' or type(v.prefix) ~= "string" or (v.depend and type(v.depend) ~= 'table') then
error('Invalid input detected to preprocessArgs prefix table', 2)
+
            error('Invalid input detected to preprocessArgs prefix table', 2)
end
+
        end
preprocessSingleArg(v.prefix)
+
        preprocessSingleArg(v.prefix)
-- Only parse the depend parameter if the prefix parameter is present and not blank.
+
        -- Only parse the depend parameter if the prefix parameter is present and not blank.
if args[v.prefix] and v.depend then
+
        if args[v.prefix] and v.depend then
for j, dependValue in ipairs(v.depend) do
+
            for j, dependValue in ipairs(v.depend) do
if type(dependValue) ~= 'string' then
+
                if type(dependValue) ~= 'string' then
error('Invalid "depend" parameter value detected in preprocessArgs')
+
                    error('Invalid "depend" parameter value detected in preprocessArgs')
end
+
                end
preprocessSingleArg(dependValue)
+
                preprocessSingleArg(dependValue)
end
+
            end
end
+
        end
end
+
    end
 
 
-- Get arguments with number suffixes.
 
local a = 1 -- Counter variable.
 
local moreArgumentsExist = true
 
while moreArgumentsExist == true do
 
moreArgumentsExist = false
 
for i = a, a + step - 1 do
 
for j,v in ipairs(prefixTable) do
 
local prefixArgName = v.prefix .. tostring(i)
 
if origArgs[prefixArgName] then
 
moreArgumentsExist = true -- Do another loop if any arguments are found, even blank ones.
 
preprocessSingleArg(prefixArgName)
 
end
 
-- Process the depend table if the prefix argument is present and not blank, or
 
-- we are processing "prefix1" and "prefix" is present and not blank, and
 
-- if the depend table is present.
 
if v.depend and (args[prefixArgName] or (i == 1 and args[v.prefix])) then
 
for j,dependValue in ipairs(v.depend) do
 
local dependArgName = dependValue .. tostring(i)
 
preprocessSingleArg(dependArgName)
 
end
 
end
 
end
 
end
 
a = a + step
 
end
 
end
 
  
local function parseDataParameters()
+
    -- Get arguments with number suffixes.
-- Parse the data parameters in the same order that the old {{infobox}} did, so that
+
    local a = 1 -- Counter variable.
-- references etc. will display in the expected places. Parameters that depend on
+
    local moreArgumentsExist = true
-- another parameter are only processed if that parameter is present, to avoid
+
    while moreArgumentsExist == true do
-- phantom references appearing in article reference lists.
+
        moreArgumentsExist = false
preprocessSingleArg('autoheaders')
+
        for i = a, a + step - 1 do
preprocessSingleArg('child')
+
            for j,v in ipairs(prefixTable) do
preprocessSingleArg('bodyclass')
+
                local prefixArgName = v.prefix .. tostring(i)
preprocessSingleArg('subbox')
+
                if origArgs[prefixArgName] then
preprocessSingleArg('bodystyle')
+
                    moreArgumentsExist = true -- Do another loop if any arguments are found, even blank ones.
preprocessSingleArg('title')
+
                    preprocessSingleArg(prefixArgName)
preprocessSingleArg('titleclass')
+
                end
preprocessSingleArg('titlestyle')
+
                -- Process the depend table if the prefix argument is present and not blank, or
preprocessSingleArg('above')
+
                -- we are processing "prefix1" and "prefix" is present and not blank, and
preprocessSingleArg('aboveclass')
+
                -- if the depend table is present.
preprocessSingleArg('abovestyle')
+
                if v.depend and (args[prefixArgName] or (i == 1 and args[v.prefix])) then
preprocessArgs({
+
                    for j,dependValue in ipairs(v.depend) do
{prefix = 'subheader', depend = {'subheaderstyle', 'subheaderrowclass'}}
+
                        local dependArgName = dependValue .. tostring(i)
}, 10)
+
                        preprocessSingleArg(dependArgName)
preprocessSingleArg('subheaderstyle')
+
                    end
preprocessSingleArg('subheaderclass')
+
                end
preprocessArgs({
+
            end
{prefix = 'image', depend = {'caption', 'imagerowclass'}}
+
        end
}, 10)
+
        a = a + step
preprocessSingleArg('captionstyle')
+
    end
preprocessSingleArg('imagestyle')
 
preprocessSingleArg('imageclass')
 
preprocessArgs({
 
{prefix = 'header'},
 
{prefix = 'data', depend = {'label'}},
 
{prefix = 'rowclass'},
 
{prefix = 'rowstyle'},
 
{prefix = 'rowcellstyle'},
 
{prefix = 'class'},
 
{prefix = 'dataid'},
 
{prefix = 'labelid'},
 
{prefix = 'headerid'},
 
{prefix = 'rowid'}
 
}, 50)
 
preprocessSingleArg('headerclass')
 
preprocessSingleArg('headerstyle')
 
preprocessSingleArg('labelstyle')
 
preprocessSingleArg('datastyle')
 
preprocessSingleArg('below')
 
preprocessSingleArg('belowclass')
 
preprocessSingleArg('belowstyle')
 
preprocessSingleArg('name')
 
args['italic title'] = origArgs['italic title'] -- different behaviour if blank or absent
 
preprocessSingleArg('decat')
 
 
end
 
end
 
+
 
function p.infobox(frame)
 
function p.infobox(frame)
-- 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.
if frame == mw.getCurrentFrame() then
+
    if frame == mw.getCurrentFrame() then
origArgs = frame:getParent().args
+
        origArgs = frame:getParent().args
else
+
    else
origArgs = frame
+
        origArgs = frame
end
+
    end
+
   
parseDataParameters()
+
    -- Parse the data parameters in the same order that the old {{infobox}} did, so that
+
    -- references etc. will display in the expected places. Parameters that depend on
return _infobox()
+
    -- another parameter are only processed if that parameter is present, to avoid
end
+
    -- phantom references appearing in article reference lists.
 
+
    preprocessSingleArg('child')
function p.infoboxTemplate(frame)
+
    preprocessSingleArg('bodyclass')
-- For calling via #invoke within a template
+
    preprocessSingleArg('subbox')
origArgs = {}
+
    preprocessSingleArg('bodystyle')
for k,v in pairs(frame.args) do origArgs[k] = mw.text.trim(v) end
+
    preprocessSingleArg('title')
+
    preprocessSingleArg('titleclass')
parseDataParameters()
+
    preprocessSingleArg('titlestyle')
+
    preprocessSingleArg('above')
return _infobox()
+
    preprocessSingleArg('aboveclass')
 +
    preprocessSingleArg('abovestyle')
 +
    preprocessArgs({
 +
        {prefix = 'subheader', depend = {'subheaderstyle', 'subheaderrowclass'}}
 +
    }, 10)
 +
    preprocessSingleArg('subheaderstyle')
 +
    preprocessSingleArg('subheaderclass')
 +
    preprocessArgs({
 +
        {prefix = 'image', depend = {'caption', 'imagerowclass'}}
 +
    }, 10)
 +
    preprocessSingleArg('captionstyle')
 +
    preprocessSingleArg('imagestyle')
 +
    preprocessSingleArg('imageclass')
 +
    preprocessArgs({
 +
        {prefix = 'header'},
 +
        {prefix = 'data', depend = {'label'}},
 +
        {prefix = 'rowclass'},
 +
        {prefix = 'rowstyle'},
 +
        {prefix = 'class'},
 +
        {prefix = 'dataid'},
 +
        {prefix = 'labelid'},
 +
        {prefix = 'headerid'},
 +
        {prefix = 'rowid'}
 +
    }, 50)
 +
    preprocessSingleArg('headerclass')
 +
    preprocessSingleArg('headerstyle')
 +
    preprocessSingleArg('labelstyle')
 +
    preprocessSingleArg('datastyle')
 +
    preprocessSingleArg('below')
 +
    preprocessSingleArg('belowclass')
 +
    preprocessSingleArg('belowstyle')
 +
    preprocessSingleArg('name')
 +
    args['italic title'] = origArgs['italic title'] -- different behaviour if blank or absent
 +
    preprocessSingleArg('decat')
 +
 +
    return _infobox()
 
end
 
end
 +
 
return p
 
return p

Please note that all contributions to All About Ayrshire may be edited, altered, or removed by other contributors. If you do not want your writing to be edited mercilessly, then do not submit it here.
You are also promising us that you wrote this yourself, or copied it from a public domain or similar free resource (see All About Ayrshire:Copyrights for details). Do not submit copyrighted work without permission!

Cancel Editing help (opens in new window)

Template used on this page: