Line 1: |
Line 1: |
| -- | | -- |
− | -- This module will implement {{Navbox}} | + | -- This module implements {{Navbox}} |
| -- | | -- |
− |
| + | |
| local p = {} | | local p = {} |
− |
| + | |
− | local HtmlBuilder = require('Module:HtmlBuilder') | + | local navbar = require('Module:Navbar')._navbar |
− | local Navbar = require('Module:Navbar') | + | local getArgs -- lazily initialized |
| | | |
| local args | | local args |
− | local frame
| |
| local tableRowAdded = false | | local tableRowAdded = false |
| local border | | local border |
| local listnums = {} | | local listnums = {} |
− |
| + | |
− | function trim(s) | + | local function trim(s) |
| return (mw.ustring.gsub(s, "^%s*(.-)%s*$", "%1")) | | return (mw.ustring.gsub(s, "^%s*(.-)%s*$", "%1")) |
| end | | end |
| | | |
− | function addTableRow(tbl) | + | local function addNewline(s) |
| + | if s:match('^[*:;#]') or s:match('^{|') then |
| + | return '\n' .. s ..'\n' |
| + | else |
| + | return s |
| + | end |
| + | end |
| + | |
| + | local function addTableRow(tbl) |
| -- If any other rows have already been added, then we add a 2px gutter row. | | -- If any other rows have already been added, then we add a 2px gutter row. |
| if tableRowAdded then | | if tableRowAdded then |
| tbl | | tbl |
− | .tag('tr') | + | :tag('tr') |
− | .css('height', '2px') | + | :css('height', '2px') |
− | .tag('td') | + | :tag('td') |
| + | :attr('colspan',2) |
| end | | end |
− |
| + | |
| tableRowAdded = true | | tableRowAdded = true |
− |
| |
− | return tbl.tag('tr')
| |
− | end
| |
− |
| |
| | | |
− | --
| + | return tbl:tag('tr') |
− | -- Title row
| |
− | --
| |
− | function renderTitleRow(tbl)
| |
− | if not args.title then return end | |
− |
| |
− | local titleRow = addTableRow(tbl)
| |
− |
| |
− | if args.titlegroup then
| |
− | titleRow
| |
− | .tag('th')
| |
− | .attr('scope', 'row')
| |
− | .addClass('navbox-group')
| |
− | .addClass(args.titlegroupclass)
| |
− | .cssText(args.basestyle)
| |
− | .cssText(args.groupstyle)
| |
− | .cssText(args.titlegroupstyle)
| |
− | .wikitext(args.titlegroup)
| |
− | end
| |
− |
| |
− | local titleCell = titleRow.tag('th').attr('scope', 'col')
| |
− |
| |
− | if args.titlegroup then
| |
− | titleCell
| |
− | .css('border-left', '2px solid #fdfdfd')
| |
− | .css('width', '100%')
| |
− | end
| |
− |
| |
− | local titleColspan = 2
| |
− | if args.imageleft then titleColspan = titleColspan + 1 end
| |
− | if args.image then titleColspan = titleColspan + 1 end
| |
− | if args.titlegroup then titleColspan = titleColspan - 1 end
| |
− |
| |
− | titleCell
| |
− | .cssText(args.basestyle)
| |
− | .cssText(args.titlestyle)
| |
− | .addClass('navbox-title')
| |
− | .attr('colspan', titleColspan)
| |
− |
| |
− | renderNavBar(titleCell)
| |
− |
| |
− | titleCell
| |
− | .tag('div')
| |
− | .addClass(args.titleclass)
| |
− | .css('font-size', '110%')
| |
− | .newline()
| |
− | .wikitext(args.title)
| |
| end | | end |
| | | |
− | function renderNavBar(titleCell) | + | local function renderNavBar(titleCell) |
| -- Depending on the presence of the navbar and/or show/hide link, we may need to add a spacer div on the left | | -- Depending on the presence of the navbar and/or show/hide link, we may need to add a spacer div on the left |
| -- or right to keep the title centered. | | -- or right to keep the title centered. |
Line 91: |
Line 49: |
| -- also no show/hide link, then we need a spacer on the right to achieve the left shift. | | -- also no show/hide link, then we need a spacer on the right to achieve the left shift. |
| if args.state == 'plain' then spacerSide = 'right' end | | if args.state == 'plain' then spacerSide = 'right' end |
− | elseif args.navbar == 'plain' or args.navbar == 'off' or (not args.name and (border == 'subgroup' or border == 'child' or border == 'none')) then | + | elseif args.navbar == 'plain' or (not args.name and mw.getCurrentFrame():getParent():getTitle():gsub('/sandbox$', '') == 'Template:Navbox') then |
| -- No navbar. Need a spacer on the left to balance out the width of the show/hide link. | | -- No navbar. Need a spacer on the left to balance out the width of the show/hide link. |
| if args.state ~= 'plain' then spacerSide = 'left' end | | if args.state ~= 'plain' then spacerSide = 'left' end |
Line 99: |
Line 57: |
| if args.state == 'plain' then spacerSide = 'right' end | | if args.state == 'plain' then spacerSide = 'right' end |
| | | |
− | titleCell.wikitext(Navbar.navbar({ | + | titleCell:wikitext(navbar{ |
− | args.name, | + | args.name, |
− | mini = 1, | + | mini = 1, |
| fontstyle = (args.basestyle or '') .. ';' .. (args.titlestyle or '') .. ';background:none transparent;border:none;' | | fontstyle = (args.basestyle or '') .. ';' .. (args.titlestyle or '') .. ';background:none transparent;border:none;' |
− | })) | + | }) |
| end | | end |
− |
| + | |
| -- Render the spacer div. | | -- Render the spacer div. |
| if spacerSide then | | if spacerSide then |
| titleCell | | titleCell |
− | .tag('span') | + | :tag('span') |
− | .css('float', spacerSide) | + | :css('float', spacerSide) |
− | .css('width', '6em') | + | :css('width', '6em') |
− | .wikitext(' ') | + | :wikitext(' ') |
| end | | end |
| end | | end |
| | | |
| + | -- |
| + | -- Title row |
| + | -- |
| + | local function renderTitleRow(tbl) |
| + | if not args.title then return end |
| + | |
| + | local titleRow = addTableRow(tbl) |
| + | |
| + | if args.titlegroup then |
| + | titleRow |
| + | :tag('th') |
| + | :attr('scope', 'row') |
| + | :addClass('navbox-group') |
| + | :addClass(args.titlegroupclass) |
| + | :cssText(args.basestyle) |
| + | :cssText(args.groupstyle) |
| + | :cssText(args.titlegroupstyle) |
| + | :wikitext(args.titlegroup) |
| + | end |
| + | |
| + | local titleCell = titleRow:tag('th'):attr('scope', 'col') |
| + | |
| + | if args.titlegroup then |
| + | titleCell |
| + | :css('border-left', '2px solid #fdfdfd') |
| + | :css('width', '100%') |
| + | end |
| + | |
| + | local titleColspan = 2 |
| + | if args.imageleft then titleColspan = titleColspan + 1 end |
| + | if args.image then titleColspan = titleColspan + 1 end |
| + | if args.titlegroup then titleColspan = titleColspan - 1 end |
| + | |
| + | titleCell |
| + | :cssText(args.basestyle) |
| + | :cssText(args.titlestyle) |
| + | :addClass('navbox-title') |
| + | :attr('colspan', titleColspan) |
| + | |
| + | renderNavBar(titleCell) |
| + | |
| + | titleCell |
| + | :tag('div') |
| + | :addClass(args.titleclass) |
| + | :css('font-size', '114%') |
| + | :wikitext(addNewline(args.title)) |
| + | end |
| | | |
| -- | | -- |
| -- Above/Below rows | | -- Above/Below rows |
| -- | | -- |
− | function renderAboveRow(tbl) | + | |
| + | local function getAboveBelowColspan() |
| + | local ret = 2 |
| + | if args.imageleft then ret = ret + 1 end |
| + | if args.image then ret = ret + 1 end |
| + | return ret |
| + | end |
| + | |
| + | local function renderAboveRow(tbl) |
| if not args.above then return end | | if not args.above then return end |
− |
| + | |
| addTableRow(tbl) | | addTableRow(tbl) |
− | .tag('td') | + | :tag('td') |
− | .addClass('navbox-abovebelow') | + | :addClass('navbox-abovebelow') |
− | .addClass(args.aboveclass) | + | :addClass(args.aboveclass) |
− | .cssText(args.basestyle) | + | :cssText(args.basestyle) |
− | .cssText(args.abovestyle) | + | :cssText(args.abovestyle) |
− | .attr('colspan', getAboveBelowColspan()) | + | :attr('colspan', getAboveBelowColspan()) |
− | .tag('div') | + | :tag('div') |
− | .newline() | + | :wikitext(addNewline(args.above)) |
− | .wikitext(args.above)
| |
| end | | end |
| | | |
− | function renderBelowRow(tbl) | + | local function renderBelowRow(tbl) |
| if not args.below then return end | | if not args.below then return end |
− |
| + | |
| addTableRow(tbl) | | addTableRow(tbl) |
− | .tag('td') | + | :tag('td') |
− | .addClass('navbox-abovebelow') | + | :addClass('navbox-abovebelow') |
− | .addClass(args.belowclass) | + | :addClass(args.belowclass) |
− | .cssText(args.basestyle) | + | :cssText(args.basestyle) |
− | .cssText(args.belowstyle) | + | :cssText(args.belowstyle) |
− | .attr('colspan', getAboveBelowColspan()) | + | :attr('colspan', getAboveBelowColspan()) |
− | .tag('div') | + | :tag('div') |
− | .newline() | + | :wikitext(addNewline(args.below)) |
− | .wikitext(args.below)
| |
| end | | end |
| | | |
− | function getAboveBelowColspan()
| |
− | local ret = 2
| |
− | if args.imageleft then ret = ret + 1 end
| |
− | if args.image then ret = ret + 1 end
| |
− | return ret
| |
− | end
| |
− |
| |
− |
| |
| -- | | -- |
| -- List rows | | -- List rows |
| -- | | -- |
− | function renderListRow(tbl, listnum) | + | local function renderListRow(tbl, listnum) |
| local row = addTableRow(tbl) | | local row = addTableRow(tbl) |
− |
| + | |
| if listnum == 1 and args.imageleft then | | if listnum == 1 and args.imageleft then |
| row | | row |
− | .tag('td') | + | :tag('td') |
− | .addClass('navbox-image') | + | :addClass('navbox-image') |
− | .addClass(args.imageclass) | + | :addClass(args.imageclass) |
− | .css('width', '0%') | + | :css('width', '0%') |
− | .css('padding', '0px 2px 0px 0px') | + | :css('padding', '0px 2px 0px 0px') |
− | .cssText(args.imageleftstyle) | + | :cssText(args.imageleftstyle) |
− | .attr('rowspan', 2 * #listnums - 1) | + | :attr('rowspan', 2 * #listnums - 1) |
− | .tag('div') | + | :tag('div') |
− | .newline() | + | :wikitext(addNewline(args.imageleft)) |
− | .wikitext(args.imageleft)
| |
| end | | end |
− |
| + | |
| if args['group' .. listnum] then | | if args['group' .. listnum] then |
− | local groupCell = row.tag('th') | + | local groupCell = row:tag('th') |
− |
| + | |
| groupCell | | groupCell |
− | .attr('scope', 'row')
| + | :attr('scope', 'row') |
− | .addClass('navbox-group')
| + | :addClass('navbox-group') |
− | .addClass(args.groupclass)
| + | :addClass(args.groupclass) |
− | .cssText(args.basestyle)
| + | :cssText(args.basestyle) |
− |
| + | |
| if args.groupwidth then | | if args.groupwidth then |
− | groupCell.css('width', args.groupwidth) | + | groupCell:css('width', args.groupwidth) |
| end | | end |
− |
| + | |
| groupCell | | groupCell |
− | .cssText(args.groupstyle) | + | :cssText(args.groupstyle) |
− | .cssText(args['group' .. listnum .. 'style']) | + | :cssText(args['group' .. listnum .. 'style']) |
− | .wikitext(args['group' .. listnum]) | + | :wikitext(args['group' .. listnum]) |
| end | | end |
− |
| + | |
− | local listCell = row.tag('td') | + | local listCell = row:tag('td') |
| | | |
| if args['group' .. listnum] then | | if args['group' .. listnum] then |
| listCell | | listCell |
− | .css('text-align', 'left') | + | :css('text-align', 'left') |
− | .css('border-left-width', '2px') | + | :css('border-left-width', '2px') |
− | .css('border-left-style', 'solid') | + | :css('border-left-style', 'solid') |
| else | | else |
− | listCell.attr('colspan', 2) | + | listCell:attr('colspan', 2) |
| end | | end |
− |
| + | |
− | if not args.groupwidth then | + | if not args.groupwidth then |
− | listCell.css('width', '100%') | + | listCell:css('width', '100%') |
| end | | end |
− |
| + | |
| local isOdd = (listnum % 2) == 1 | | local isOdd = (listnum % 2) == 1 |
| local rowstyle = args.evenstyle | | local rowstyle = args.evenstyle |
| if isOdd then rowstyle = args.oddstyle end | | if isOdd then rowstyle = args.oddstyle end |
− |
| + | |
| local evenOdd | | local evenOdd |
| if args.evenodd == 'swap' then | | if args.evenodd == 'swap' then |
Line 222: |
Line 224: |
| if isOdd then evenOdd = args.evenodd or 'odd' else evenOdd = args.evenodd or 'even' end | | if isOdd then evenOdd = args.evenodd or 'odd' else evenOdd = args.evenodd or 'even' end |
| end | | end |
− |
| + | |
| listCell | | listCell |
− | .css('padding', '0px') | + | :css('padding', '0px') |
− | .cssText(args.liststyle) | + | :cssText(args.liststyle) |
− | .cssText(rowstyle) | + | :cssText(rowstyle) |
− | .cssText(args['list' .. listnum .. 'style']) | + | :cssText(args['list' .. listnum .. 'style']) |
− | .addClass('navbox-list') | + | :addClass('navbox-list') |
− | .addClass('navbox-' .. evenOdd) | + | :addClass('navbox-' .. evenOdd) |
− | .addClass(args.listclass) | + | :addClass(args.listclass) |
− | .tag('div') | + | :tag('div') |
− | .css('padding', (listnum == 1 and args.list1padding) or args.listpadding or '0em 0.25em') | + | :css('padding', (listnum == 1 and args.list1padding) or args.listpadding or '0em 0.25em') |
− | .newline() | + | :wikitext(addNewline(args['list' .. listnum])) |
− | .wikitext(args['list' .. listnum])
| |
| | | |
| if listnum == 1 and args.image then | | if listnum == 1 and args.image then |
| row | | row |
− | .tag('td') | + | :tag('td') |
− | .addClass('navbox-image') | + | :addClass('navbox-image') |
− | .addClass(args.imageclass) | + | :addClass(args.imageclass) |
− | .css('width', '0%') | + | :css('width', '0%') |
− | .css('padding', '0px 0px 0px 2px') | + | :css('padding', '0px 0px 0px 2px') |
− | .cssText(args.imagestyle) | + | :cssText(args.imagestyle) |
− | .attr('rowspan', 2 * #listnums - 1) | + | :attr('rowspan', 2 * #listnums - 1) |
− | .tag('div') | + | :tag('div') |
− | .newline() | + | :wikitext(addNewline(args.image)) |
− | .wikitext(args.image)
| |
| end | | end |
| end | | end |
Line 255: |
Line 255: |
| -- Tracking categories | | -- Tracking categories |
| -- | | -- |
− | function renderTrackingCategories(builder)
| |
− | local frame = mw.getCurrentFrame()
| |
− |
| |
− | if not frame then return end
| |
− |
| |
− | local s = frame:preprocess('{{#ifeq:{{NAMESPACE}}|{{ns:10}}|1|0}}{{SUBPAGENAME}}')
| |
− | if mw.ustring.sub(s, 1, 1) == '0' then return end -- not in template space
| |
− | local subpage = mw.ustring.lower(mw.ustring.sub(s, 2))
| |
− | if subpage == 'doc' or subpage == 'sandbox' or subpage == 'testcases' then return end
| |
− |
| |
− | for i, cat in ipairs(getTrackingCategories()) do
| |
− | builder.wikitext('[[Category:' .. cat .. ']]')
| |
− | end
| |
− | end
| |
| | | |
− | function getTrackingCategories() | + | local function needsHorizontalLists() |
− | local cats = {} | + | if border == 'child' or border == 'subgroup' or args.tracking == 'no' then return false end |
− | if needsHorizontalLists() then table.insert(cats, 'Navigational boxes without horizontal lists') end
| |
− | if hasBackgroundColors() then table.insert(cats, 'Navboxes using background colours') end
| |
− | return cats
| |
− | end | |
| | | |
− | function needsHorizontalLists()
| |
− | if border == 'child' or border == 'subgroup' or args.tracking == 'no' then return false end
| |
− |
| |
| local listClasses = {'plainlist', 'hlist', 'hlist hnum', 'hlist hwrap', 'hlist vcard', 'vcard hlist', 'hlist vevent'} | | local listClasses = {'plainlist', 'hlist', 'hlist hnum', 'hlist hwrap', 'hlist vcard', 'vcard hlist', 'hlist vevent'} |
| for i, cls in ipairs(listClasses) do | | for i, cls in ipairs(listClasses) do |
Line 290: |
Line 269: |
| end | | end |
| | | |
− | function hasBackgroundColors() | + | local function hasBackgroundColors() |
− | return args.titlestyle or args.groupstyle | + | return mw.ustring.match(args.titlestyle or '','background') or mw.ustring.match(args.groupstyle or '','background') or mw.ustring.match(args.basestyle or '','background') |
| end | | end |
| | | |
| + | local function isIllegible() |
| + | local styleratio = require('Module:Color contrast')._styleratio |
| + | |
| + | for key, style in pairs(args) do |
| + | if tostring(key):match("style$") then |
| + | if styleratio{mw.text.unstripNoWiki(style)} < 4.5 then |
| + | return true |
| + | end |
| + | end |
| + | end |
| + | return false |
| + | end |
| + | |
| + | local function getTrackingCategories() |
| + | local cats = {} |
| + | if needsHorizontalLists() then table.insert(cats, 'Navigational boxes without horizontal lists') end |
| + | if hasBackgroundColors() then table.insert(cats, 'Navboxes using background colours') end |
| + | if isIllegible() then table.insert(cats, 'Potentially illegible navboxes') end |
| + | return cats |
| + | end |
| + | |
| + | local function renderTrackingCategories(builder) |
| + | local title = mw.title.getCurrentTitle() |
| + | if title.namespace ~= 10 then return end -- not in template space |
| + | local subpage = title.subpageText |
| + | if subpage == 'doc' or subpage == 'sandbox' or subpage == 'testcases' then return end |
| + | |
| + | for i, cat in ipairs(getTrackingCategories()) do |
| + | builder:wikitext('[[Category:' .. cat .. ']]') |
| + | end |
| + | end |
| | | |
| -- | | -- |
| -- Main navbox tables | | -- Main navbox tables |
| -- | | -- |
− | function renderMainTable() | + | local function renderMainTable() |
− | local tbl = HtmlBuilder.create('table') | + | local tbl = mw.html.create('table') |
− | .attr('cellspacing', 0) | + | :addClass('nowraplinks') |
− | .addClass('nowraplinks')
| + | :addClass(args.bodyclass) |
− | .addClass(args.bodyclass) | + | |
− |
| |
| if args.title and (args.state ~= 'plain' and args.state ~= 'off') then | | if args.title and (args.state ~= 'plain' and args.state ~= 'off') then |
| tbl | | tbl |
− | .addClass('collapsible') | + | :addClass('collapsible') |
− | .addClass(args.state or 'autocollapse') | + | :addClass(args.state or 'autocollapse') |
| end | | end |
− |
| + | |
− | tbl.css('border-spacing', 0) | + | tbl:css('border-spacing', 0) |
| if border == 'subgroup' or border == 'child' or border == 'none' then | | if border == 'subgroup' or border == 'child' or border == 'none' then |
| tbl | | tbl |
− | .addClass('navbox-subgroup') | + | :addClass('navbox-subgroup') |
− | .cssText(args.bodystyle) | + | :cssText(args.bodystyle) |
− | .cssText(args.style) | + | :cssText(args.style) |
| else -- regular navobx - bodystyle and style will be applied to the wrapper table | | else -- regular navobx - bodystyle and style will be applied to the wrapper table |
| tbl | | tbl |
− | .addClass('navbox-inner') | + | :addClass('navbox-inner') |
− | .css('background', 'transparent') | + | :css('background', 'transparent') |
− | .css('color', 'inherit') | + | :css('color', 'inherit') |
| end | | end |
− | tbl.cssText(args.innerstyle) | + | tbl:cssText(args.innerstyle) |
− |
| + | |
| renderTitleRow(tbl) | | renderTitleRow(tbl) |
| renderAboveRow(tbl) | | renderAboveRow(tbl) |
| for i, listnum in ipairs(listnums) do | | for i, listnum in ipairs(listnums) do |
− | renderListRow(tbl, listnum) | + | renderListRow(tbl, listnum) |
| end | | end |
| renderBelowRow(tbl) | | renderBelowRow(tbl) |
− |
| + | |
| return tbl | | return tbl |
| end | | end |
Line 336: |
Line 345: |
| function p._navbox(navboxArgs) | | function p._navbox(navboxArgs) |
| args = navboxArgs | | args = navboxArgs |
− |
| + | |
| for k, v in pairs(args) do | | for k, v in pairs(args) do |
| local listnum = ('' .. k):match('^list(%d+)$') | | local listnum = ('' .. k):match('^list(%d+)$') |
Line 342: |
Line 351: |
| end | | end |
| table.sort(listnums) | | table.sort(listnums) |
− |
| + | |
| border = trim(args.border or args[1] or '') | | border = trim(args.border or args[1] or '') |
| | | |
Line 349: |
Line 358: |
| | | |
| -- render the appropriate wrapper around the navbox, depending on the border param | | -- render the appropriate wrapper around the navbox, depending on the border param |
− | local res = HtmlBuilder.create() | + | local res = mw.html.create() |
| if border == 'none' then | | if border == 'none' then |
− | res.node(tbl) | + | res:node(tbl) |
| elseif border == 'subgroup' or border == 'child' then | | elseif border == 'subgroup' or border == 'child' then |
| -- We assume that this navbox is being rendered in a list cell of a parent navbox, and is | | -- We assume that this navbox is being rendered in a list cell of a parent navbox, and is |
Line 357: |
Line 366: |
| -- padding being applied, and at the end add a <div> to balance out the parent's </div> | | -- padding being applied, and at the end add a <div> to balance out the parent's </div> |
| res | | res |
− | .tag('/div', {unclosed = true}) | + | :wikitext('</div>') -- XXX: hack due to lack of unclosed support in mw.html. |
− | .done()
| + | :node(tbl) |
− | .node(tbl) | + | :wikitext('<div>') -- XXX: hack due to lack of unclosed support in mw.html. |
− | .tag('div', {unclosed = true}) | |
| else | | else |
| res | | res |
− | .tag('table') | + | :tag('table') |
− | .attr('cellspacing', 0) | + | :addClass('navbox') |
− | .addClass('navbox')
| + | :css('border-spacing', 0) |
− | .css('border-spacing', 0) | + | :cssText(args.bodystyle) |
− | .cssText(args.bodystyle) | + | :cssText(args.style) |
− | .cssText(args.style) | + | :tag('tr') |
− | .tag('tr') | + | :tag('td') |
− | .tag('td') | + | :css('padding', '2px') |
− | .css('padding', '2px') | + | :node(tbl) |
− | .node(tbl) | |
| end | | end |
− |
| + | |
| renderTrackingCategories(res) | | renderTrackingCategories(res) |
− |
| + | |
| return tostring(res) | | return tostring(res) |
| end | | end |
− |
| + | |
| function p.navbox(frame) | | function p.navbox(frame) |
− | -- ParserFunctions considers the empty string to be false, so to preserve the previous | + | if not getArgs then |
− | -- behavior of {{navbox}}, change any empty arguments to nil, so Lua will consider
| + | getArgs = require('Module:Arguments').getArgs |
− | -- them false too. | + | end |
− | local args = {} | + | args = getArgs(frame, {wrappers = 'Template:Navbox'}) |
− | local parent_args = frame:getParent().args;
| |
| | | |
− | -- Out of order parsing bug. | + | -- Read the arguments in the order they'll be output in, to make references number in the right order. |
− | local temp; | + | local _ |
− | temp = parent_args.title; | + | _ = args.title |
− | temp = parent_args.above; | + | _ = args.above |
| for i = 1, 20 do | | for i = 1, 20 do |
− | temp = parent_args["group" .. tostring(i)]; | + | _ = args["group" .. tostring(i)] |
− | temp = parent_args["list" .. tostring(i)]; | + | _ = args["list" .. tostring(i)] |
− | end
| |
− | temp = parent_args.below;
| |
− |
| |
− | for k, v in pairs(parent_args) do
| |
− | if v ~= '' then
| |
− | args[k] = v
| |
− | end
| |
| end | | end |
| + | _ = args.below |
| + | |
| return p._navbox(args) | | return p._navbox(args) |
| end | | end |
− |
| + | |
| return p | | return p |