379
edits
en>Izno (remove titlegroup per templatestyles section on talk page) |
m (1 revision imported) |
||
Line 1: | Line 1: | ||
-- | |||
-- This module implements {{Navbox}} | |||
-- | |||
local p = {} | local p = {} | ||
local navbar = require('Module:Navbar')._navbar | local navbar = require('Module:Navbar')._navbar | ||
local getArgs -- lazily initialized | local getArgs -- lazily initialized | ||
local args | local args | ||
local | local border | ||
local listnums | |||
local ODD_EVEN_MARKER = '\127_ODDEVEN_\127' | |||
local RESTART_MARKER = '\127_ODDEVEN0_\127' | |||
local REGEX_MARKER = '\127_ODDEVEN(%d?)_\127' | |||
local function striped(wikitext | local function striped(wikitext) | ||
-- Return wikitext with markers replaced for odd/even striping. | -- Return wikitext with markers replaced for odd/even striping. | ||
-- Child (subgroup) navboxes are flagged with a category that is removed | -- Child (subgroup) navboxes are flagged with a category that is removed | ||
-- by parent navboxes. The result is that the category shows all pages | -- by parent navboxes. The result is that the category shows all pages | ||
-- where a child navbox is not contained in a parent navbox. | -- where a child navbox is not contained in a parent navbox. | ||
local orphanCat = | local orphanCat = '[[Category:Navbox orphans]]' | ||
if border == | if border == 'subgroup' and args.orphan ~= 'yes' then | ||
-- No change; striping occurs in outermost navbox. | -- No change; striping occurs in outermost navbox. | ||
return wikitext .. orphanCat | return wikitext .. orphanCat | ||
end | end | ||
local first, second = | local first, second = 'odd', 'even' | ||
if args | if args.evenodd then | ||
if args | if args.evenodd == 'swap' then | ||
first, second = second, first | first, second = second, first | ||
else | else | ||
first = args | first = args.evenodd | ||
second = first | second = first | ||
end | end | ||
Line 44: | Line 53: | ||
end | end | ||
local regex = orphanCat:gsub('([%[%]])', '%%%1') | local regex = orphanCat:gsub('([%[%]])', '%%%1') | ||
return (wikitext:gsub(regex, ''):gsub( | return (wikitext:gsub(regex, ''):gsub(REGEX_MARKER, changer)) -- () omits gsub count | ||
end | end | ||
Line 53: | Line 62: | ||
return '\n' .. item ..'\n' | return '\n' .. item ..'\n' | ||
end | end | ||
if nowrapitems == | if nowrapitems == 'yes' then | ||
local lines = {} | local lines = {} | ||
for line in (item .. '\n'):gmatch('([^\n]*)\n') do | for line in (item .. '\n'):gmatch('([^\n]*)\n') do | ||
local prefix, content = line:match('^([*:;#]+)%s*(.*)') | local prefix, content = line:match('^([*:;#]+)%s*(.*)') | ||
if prefix and not content:match( | if prefix and not content:match('^<span class="nowrap">') then | ||
line = | line = prefix .. '<span class="nowrap">' .. content .. '</span>' | ||
end | end | ||
table.insert(lines, line) | table.insert(lines, line) | ||
Line 70: | Line 79: | ||
end | end | ||
-- we | -- Separate function so that we can evaluate properly whether hlist should | ||
-- be added by the module | |||
local function has_navbar() | local function has_navbar() | ||
return args | return args.navbar ~= 'off' and args.navbar ~= 'plain' and | ||
(args.name or mw.getCurrentFrame():getParent():getTitle():gsub('/sandbox$', '') ~= 'Template:Navbox') | |||
end | end | ||
local function renderNavBar(titleCell) | local function renderNavBar(titleCell) | ||
if has_navbar() then | if has_navbar() then | ||
titleCell:wikitext(navbar{ | titleCell:wikitext(navbar{ | ||
args.name, | |||
-- we depend on this being mini = 1 when the navbox module decides | |||
-- to add hlist templatestyles. we also depend on navbar outputting | |||
-- a copy of the hlist templatestyles. | |||
mini = 1, | |||
fontstyle = (args.basestyle or '') .. ';' .. (args.titlestyle or '') .. ';background:none transparent;border:none;box-shadow:none; padding:0;' | |||
}) | }) | ||
end | end | ||
Line 94: | Line 101: | ||
end | end | ||
-- | |||
-- Title row | |||
-- | |||
local function renderTitleRow(tbl) | local function renderTitleRow(tbl) | ||
if not args | if not args.title then return end | ||
local titleRow = tbl:tag('tr') | local titleRow = tbl:tag('tr') | ||
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') | local titleCell = titleRow:tag('th'):attr('scope', 'col') | ||
if args.titlegroup then | |||
titleCell | |||
:addClass('navbox-title1') | |||
end | |||
local titleColspan = 2 | local titleColspan = 2 | ||
if args | if args.imageleft then titleColspan = titleColspan + 1 end | ||
if args | if args.image then titleColspan = titleColspan + 1 end | ||
if args.titlegroup then titleColspan = titleColspan - 1 end | |||
titleCell | titleCell | ||
:cssText(args | :cssText(args.basestyle) | ||
:cssText(args | :cssText(args.titlestyle) | ||
:addClass( | :addClass('navbox-title') | ||
:attr('colspan', titleColspan) | :attr('colspan', titleColspan) | ||
Line 116: | Line 144: | ||
:tag('div') | :tag('div') | ||
-- id for aria-labelledby attribute | -- id for aria-labelledby attribute | ||
:attr('id', mw.uri.anchorEncode(args | :attr('id', mw.uri.anchorEncode(args.title)) | ||
:addClass(args | :addClass(args.titleclass) | ||
:css('font-size', '114%') | :css('font-size', '114%') | ||
:css('margin', '0 4em') | :css('margin', '0 4em') | ||
:wikitext(processItem(args | :wikitext(processItem(args.title)) | ||
end | end | ||
-- | |||
-- Above/Below rows | |||
-- | |||
local function getAboveBelowColspan() | local function getAboveBelowColspan() | ||
local ret = 2 | local ret = 2 | ||
if args | if args.imageleft then ret = ret + 1 end | ||
if args | if args.image then ret = ret + 1 end | ||
return ret | return ret | ||
end | end | ||
local function renderAboveRow(tbl) | local function renderAboveRow(tbl) | ||
if not args | if not args.above then return end | ||
tbl:tag('tr') | tbl:tag('tr') | ||
:tag('td') | :tag('td') | ||
:addClass( | :addClass('navbox-abovebelow') | ||
:addClass(args | :addClass(args.aboveclass) | ||
:cssText(args | :cssText(args.basestyle) | ||
:cssText(args | :cssText(args.abovestyle) | ||
:attr('colspan', getAboveBelowColspan()) | :attr('colspan', getAboveBelowColspan()) | ||
:tag('div') | :tag('div') | ||
-- id for aria-labelledby attribute, if no title | -- id for aria-labelledby attribute, if no title | ||
:attr('id', args | :attr('id', args.title and nil or mw.uri.anchorEncode(args.above)) | ||
:wikitext(processItem(args | :wikitext(processItem(args.above, args.nowrapitems)) | ||
end | end | ||
local function renderBelowRow(tbl) | local function renderBelowRow(tbl) | ||
if not args | if not args.below then return end | ||
tbl:tag('tr') | tbl:tag('tr') | ||
:tag('td') | :tag('td') | ||
:addClass( | :addClass('navbox-abovebelow') | ||
:addClass(args | :addClass(args.belowclass) | ||
:cssText(args | :cssText(args.basestyle) | ||
:cssText(args | :cssText(args.belowstyle) | ||
:attr('colspan', getAboveBelowColspan()) | :attr('colspan', getAboveBelowColspan()) | ||
:tag('div') | :tag('div') | ||
:wikitext(processItem(args | :wikitext(processItem(args.below, args.nowrapitems)) | ||
end | end | ||
local function renderListRow(tbl, index, listnum | -- | ||
-- List rows | |||
-- | |||
local function renderListRow(tbl, index, listnum) | |||
local row = tbl:tag('tr') | local row = tbl:tag('tr') | ||
if index == 1 and args | if index == 1 and args.imageleft then | ||
row | row | ||
:tag('td') | :tag('td') | ||
:addClass( | :addClass('navbox-image') | ||
:addClass(args.imageclass) | |||
:addClass(args | |||
:css('width', '1px') -- Minimize width | :css('width', '1px') -- Minimize width | ||
:css('padding', ' | :css('padding', '0px 2px 0px 0px') | ||
:cssText(args | :cssText(args.imageleftstyle) | ||
:attr('rowspan', | :attr('rowspan', #listnums) | ||
:tag('div') | :tag('div') | ||
:wikitext(processItem(args | :wikitext(processItem(args.imageleft)) | ||
end | end | ||
if args['group' .. listnum] then | |||
local groupCell = row:tag('th') | local groupCell = row:tag('th') | ||
-- id for aria-labelledby attribute, if lone group with no title or above | -- id for aria-labelledby attribute, if lone group with no title or above | ||
if listnum == 1 and not (args | if listnum == 1 and not (args.title or args.above or args.group2) then | ||
groupCell | groupCell | ||
:attr('id', mw.uri.anchorEncode(args | :attr('id', mw.uri.anchorEncode(args.group1)) | ||
end | end | ||
groupCell | groupCell | ||
:attr('scope', 'row') | :attr('scope', 'row') | ||
:addClass( | :addClass('navbox-group') | ||
:addClass(args | :addClass(args.groupclass) | ||
:cssText(args | :cssText(args.basestyle) | ||
:css('width', args.groupwidth or '1%') -- If groupwidth not specified, minimize width | |||
:css('width', args | |||
groupCell | groupCell | ||
:cssText(args | :cssText(args.groupstyle) | ||
:cssText(args[ | :cssText(args['group' .. listnum .. 'style']) | ||
:wikitext(args[ | :wikitext(args['group' .. listnum]) | ||
end | end | ||
local listCell = row:tag('td') | local listCell = row:tag('td') | ||
if args[ | if args['group' .. listnum] then | ||
listCell | listCell | ||
:addClass( | :addClass('navbox-list1') | ||
else | else | ||
listCell:attr('colspan', 2) | listCell:attr('colspan', 2) | ||
end | end | ||
if not args | if not args.groupwidth then | ||
listCell:css('width', '100%') | listCell:css('width', '100%') | ||
end | end | ||
Line 217: | Line 248: | ||
local rowstyle -- usually nil so cssText(rowstyle) usually adds nothing | local rowstyle -- usually nil so cssText(rowstyle) usually adds nothing | ||
if index % 2 == 1 then | if index % 2 == 1 then | ||
rowstyle = args | rowstyle = args.oddstyle | ||
else | else | ||
rowstyle = args | rowstyle = args.evenstyle | ||
end | end | ||
local | local listText = args['list' .. listnum] | ||
local oddEven = ODD_EVEN_MARKER | |||
local oddEven = | |||
if listText:sub(1, 12) == '</div><table' then | if listText:sub(1, 12) == '</div><table' then | ||
-- Assume list text is for a subgroup navbox so no automatic striping for this row. | -- Assume list text is for a subgroup navbox so no automatic striping for this row. | ||
oddEven = listText:find( | oddEven = listText:find('<th[^>]*"navbox%-title"') and RESTART_MARKER or 'odd' | ||
end | end | ||
listCell | listCell | ||
:css('padding', ' | :css('padding', '0px') | ||
:cssText(args | :cssText(args.liststyle) | ||
:cssText(rowstyle) | :cssText(rowstyle) | ||
:cssText(args[ | :cssText(args['list' .. listnum .. 'style']) | ||
:addClass( | :addClass('navbox-list') | ||
:addClass( | :addClass('navbox-' .. oddEven) | ||
:addClass(args | :addClass(args.listclass) | ||
:addClass(args[ | :addClass(args['list' .. listnum .. 'class']) | ||
:tag('div') | :tag('div') | ||
:css('padding', | :css('padding', (index == 1 and args.list1padding) or args.listpadding or '0em 0.25em') | ||
:wikitext(processItem(listText, args.nowrapitems)) | |||
:wikitext(processItem(listText, args | |||
if index == 1 and args | if index == 1 and args.image then | ||
row | row | ||
:tag('td') | :tag('td') | ||
:addClass( | :addClass('navbox-image') | ||
:addClass(args.imageclass) | |||
:addClass(args | |||
:css('width', '1px') -- Minimize width | :css('width', '1px') -- Minimize width | ||
:css('padding', ' | :css('padding', '0px 0px 0px 2px') | ||
:cssText(args | :cssText(args.imagestyle) | ||
:attr('rowspan', | :attr('rowspan', #listnums) | ||
:tag('div') | :tag('div') | ||
:wikitext(processItem(args | :wikitext(processItem(args.image)) | ||
end | end | ||
end | end | ||
-- | |||
-- | -- | ||
local function | -- Tracking categories | ||
local | -- | ||
local function needsHorizontalLists() | |||
if border == 'subgroup' or args.tracking == 'no' then | |||
return false | |||
end | |||
local listClasses = { | |||
['plainlist'] = true, ['hlist'] = true, ['hlist hnum'] = true, | |||
['hlist hwrap'] = true, ['hlist vcard'] = true, ['vcard hlist'] = true, | |||
['hlist vevent'] = true, | |||
} | } | ||
local patterns = { | return not (listClasses[args.listclass] or listClasses[args.bodyclass]) | ||
end | |||
-- there are a lot of list classes in the wild, so we have a function to find | |||
-- them and add their TemplateStyles | |||
local function addListStyles() | |||
local frame = mw.getCurrentFrame() | |||
-- TODO?: Should maybe take a table of classes for e.g. hnum, hwrap as above | |||
-- I'm going to do the stupid thing first though | |||
-- Also not sure hnum and hwrap are going to live in the same TemplateStyles | |||
-- as hlist | |||
local function _addListStyles(htmlclass, templatestyles) | |||
local class_args = { -- rough order of probability of use | |||
'bodyclass', 'listclass', 'aboveclass', 'belowclass', 'titleclass', | |||
'navboxclass', 'groupclass', 'titlegroupclass', 'imageclass' | |||
} | |||
local patterns = { | |||
'^' .. htmlclass .. '$', | |||
'%s' .. htmlclass .. '$', | |||
'^' .. htmlclass .. '%s', | |||
'%s' .. htmlclass .. '%s' | |||
} | |||
local found = false | |||
for _, arg in ipairs(class_args) do | |||
for _, pattern in ipairs(patterns) do | |||
if mw.ustring.find(args[arg] or '', pattern) then | |||
found = true | |||
break | |||
end | |||
end | end | ||
if found then break end | |||
end | |||
if found then | |||
return frame:extensionTag{ | |||
name = 'templatestyles', args = { src = templatestyles } | |||
} | |||
else | |||
return '' | |||
end | end | ||
end | end | ||
local hlist_styles = '' | |||
-- navbar always has mini = 1, so here (on this wiki) we can assume that | |||
-- we don't need to output hlist styles in navbox again. | |||
if | if not has_navbar() then | ||
hlist_styles = _addListStyles('hlist', 'Flatlist/styles.css') | |||
end | end | ||
local plainlist_styles = _addListStyles('plainlist', 'Plainlist/styles.css') | |||
return hlist_styles .. plainlist_styles | |||
end | end | ||
local function hasBackgroundColors() | local function hasBackgroundColors() | ||
for _, key in ipairs({ | for _, key in ipairs({'titlestyle', 'groupstyle', 'basestyle', 'abovestyle', 'belowstyle'}) do | ||
if tostring(args[key]):find('background', 1, true) then | if tostring(args[key]):find('background', 1, true) then | ||
return true | return true | ||
end | end | ||
end | end | ||
end | end | ||
local function hasBorders() | local function hasBorders() | ||
for _, key in ipairs({ | for _, key in ipairs({'groupstyle', 'basestyle', 'abovestyle', 'belowstyle'}) do | ||
if tostring(args[key]):find('border', 1, true) then | if tostring(args[key]):find('border', 1, true) then | ||
return true | return true | ||
end | end | ||
end | end | ||
end | end | ||
local function isIllegible() | local function isIllegible() | ||
-- require('Module:Color contrast') absent on mediawiki.org | |||
return false | return false | ||
end | end | ||
local function getTrackingCategories( | local function getTrackingCategories() | ||
local cats = {} | local cats = {} | ||
if needsHorizontalLists( | if needsHorizontalLists() then table.insert(cats, 'Navigational boxes without horizontal lists') end | ||
if hasBackgroundColors() then table.insert(cats, | if hasBackgroundColors() then table.insert(cats, 'Navboxes using background colours') end | ||
if isIllegible() then table.insert(cats, | if isIllegible() then table.insert(cats, 'Potentially illegible navboxes') end | ||
if hasBorders() then table.insert(cats, | if hasBorders() then table.insert(cats, 'Navboxes using borders') end | ||
return cats | return cats | ||
end | end | ||
local function renderTrackingCategories(builder | local function renderTrackingCategories(builder) | ||
local title = mw.title.getCurrentTitle() | local title = mw.title.getCurrentTitle() | ||
if title.namespace ~= 10 then return end -- not in template space | if title.namespace ~= 10 then return end -- not in template space | ||
local subpage = title.subpageText | local subpage = title.subpageText | ||
if subpage == | if subpage == 'doc' or subpage == 'sandbox' or subpage == 'testcases' then return end | ||
for _, cat in ipairs(getTrackingCategories( | for _, cat in ipairs(getTrackingCategories()) do | ||
builder:wikitext('[[Category:' .. cat .. ']]') | builder:wikitext('[[Category:' .. cat .. ']]') | ||
end | end | ||
end | end | ||
local function renderMainTable( | -- | ||
-- Main navbox tables | |||
-- | |||
local function renderMainTable() | |||
local tbl = mw.html.create('table') | local tbl = mw.html.create('table') | ||
:addClass( | :addClass('nowraplinks') | ||
:addClass(args | :addClass(args.bodyclass) | ||
if args.title and (args.state ~= 'plain' and args.state ~= 'off') then | |||
if args | if args.state == 'collapsed' then args.state = 'mw-collapsed' end | ||
if state == | |||
tbl | tbl | ||
:addClass( | :addClass('mw-collapsible') | ||
:addClass(state or | :addClass(args.state or 'autocollapse') | ||
end | end | ||
tbl:css('border-spacing', 0) | tbl:css('border-spacing', 0) | ||
if border == | if border == 'subgroup' or border == 'none' then | ||
tbl | tbl | ||
:addClass( | :addClass('navbox-subgroup') | ||
:cssText(args | :cssText(args.bodystyle) | ||
:cssText(args | :cssText(args.style) | ||
else -- regular navbox - bodystyle and style will be applied to the wrapper table | else -- regular navbox - bodystyle and style will be applied to the wrapper table | ||
tbl | tbl | ||
:addClass( | :addClass('navbox-inner') | ||
:css('background', 'transparent') | :css('background', 'transparent') | ||
:css('color', 'inherit') | :css('color', 'inherit') | ||
end | end | ||
tbl:cssText(args | 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, i, listnum | renderListRow(tbl, i, listnum) | ||
end | end | ||
renderBelowRow(tbl) | renderBelowRow(tbl) | ||
return tbl | return tbl | ||
end | end | ||
function p._navbox(navboxArgs) | function p._navbox(navboxArgs) | ||
args = navboxArgs | args = navboxArgs | ||
listnums = {} | |||
for k, _ in pairs(args) do | for k, _ in pairs(args) do | ||
if type(k) == 'string' then | if type(k) == 'string' then | ||
local listnum = k:match( | local listnum = k:match('^list(%d+)$') | ||
if listnum then table.insert(listnums, tonumber(listnum)) end | if listnum then table.insert(listnums, tonumber(listnum)) end | ||
end | end | ||
Line 429: | Line 445: | ||
table.sort(listnums) | table.sort(listnums) | ||
border = mw.text.trim(args.border or args[1] or '') | |||
if border == | if border == 'child' then | ||
border = | border = 'subgroup' | ||
end | end | ||
-- render the main body of the navbox | -- render the main body of the navbox | ||
local tbl = renderMainTable( | local tbl = renderMainTable() | ||
-- get templatestyles | |||
local frame = mw.getCurrentFrame() | |||
local base_templatestyles = frame:extensionTag{ | |||
name = 'templatestyles', args = { src = 'Module:Navbox/styles.css' } | |||
} | |||
local templatestyles = '' | |||
if args.templatestyles and args.templatestyles ~= '' then | |||
templatestyles = frame:extensionTag{ | |||
name = 'templatestyles', args = { src = args.templatestyles } | |||
} | |||
end | |||
local res = mw.html.create() | local res = mw.html.create() | ||
-- render the appropriate wrapper | -- 'navbox-styles' exists for two reasons: | ||
-- 1. To wrap the styles to work around phab: T200206 more elegantly. Instead | |||
if border == | -- of combinatorial rules, this ends up being linear number of CSS rules. | ||
-- 2. To allow MobileFrontend to rip the styles out with 'nomobile' such that | |||
-- they are not dumped into the mobile view. | |||
res:tag('div') | |||
:addClass('navbox-styles') | |||
:addClass('nomobile') | |||
:wikitext(base_templatestyles .. templatestyles) | |||
:done() | |||
-- render the appropriate wrapper around the navbox, depending on the border param | |||
if border == 'none' then | |||
local nav = res:tag('div') | local nav = res:tag('div') | ||
:attr('role', 'navigation') | :attr('role', 'navigation') | ||
:wikitext(addListStyles()) | |||
:node(tbl) | :node(tbl) | ||
-- aria-labelledby title, otherwise above, otherwise lone group | -- aria-labelledby title, otherwise above, otherwise lone group | ||
if args | if args.title or args.above or (args.group1 and not args.group2) then | ||
nav:attr('aria-labelledby', mw.uri.anchorEncode(args.title or args.above or args.group1)) | |||
nav:attr( | |||
else | else | ||
nav:attr('aria-label', | nav:attr('aria-label', 'Navbox') | ||
end | end | ||
elseif border == | elseif border == 'subgroup' then | ||
-- We assume that this navbox is being rendered in a list cell of a | -- We assume that this navbox is being rendered in a list cell of a | ||
-- parent navbox, and is therefore inside a div with padding:0em 0.25em. | -- parent navbox, and is therefore inside a div with padding:0em 0.25em. | ||
Line 464: | Line 496: | ||
res | res | ||
:wikitext('</div>') | :wikitext('</div>') | ||
:wikitext(addListStyles()) | |||
:node(tbl) | :node(tbl) | ||
:wikitext('<div>') | :wikitext('<div>') | ||
else | else | ||
local nav = res:tag('div') | local nav = res:tag('div') | ||
:attr('role', 'navigation') | :attr('role', 'navigation') | ||
:addClass( | :addClass('navbox') | ||
:addClass(args | :addClass(args.navboxclass) | ||
:cssText(args | :cssText(args.bodystyle) | ||
:cssText(args | :cssText(args.style) | ||
:css('padding', '3px') | :css('padding', '3px') | ||
:wikitext(addListStyles()) | |||
:node(tbl) | :node(tbl) | ||
-- aria-labelledby title, otherwise above, otherwise lone group | -- aria-labelledby title, otherwise above, otherwise lone group | ||
if args | if args.title or args.above or (args.group1 and not args.group2) then | ||
nav:attr('aria-labelledby', mw.uri.anchorEncode(args.title or args.above or args.group1)) | |||
nav:attr( | |||
else | else | ||
nav:attr('aria-label', | nav:attr('aria-label', 'Navbox') | ||
end | end | ||
end | end | ||
if (args | if (args.nocat or 'false'):lower() == 'false' then | ||
renderTrackingCategories(res | renderTrackingCategories(res) | ||
end | end | ||
return striped(tostring(res) | |||
return striped(tostring(res)) | |||
end | end | ||
Line 498: | Line 528: | ||
getArgs = require('Module:Arguments').getArgs | getArgs = require('Module:Arguments').getArgs | ||
end | end | ||
args = getArgs(frame, {wrappers = { | args = getArgs(frame, {wrappers = {'Template:Navbox', 'Template:Navbox subgroup'}}) | ||
if frame.args.border then | |||
-- This allows Template:Navbox_subgroup to use {{#invoke:Navbox|navbox|border=...}}. | |||
args.border = frame.args.border | |||
end | |||
-- Read the arguments in the order they'll be output in, to make references | -- Read the arguments in the order they'll be output in, to make references number in the right order. | ||
local _ | local _ | ||
_ = args | _ = args.title | ||
_ = args | _ = args.above | ||
for i = 1, 20 do | for i = 1, 20 do | ||
_ = args[ | _ = args["group" .. tostring(i)] | ||
_ = args[ | _ = args["list" .. tostring(i)] | ||
end | end | ||
_ = args | _ = args.below | ||
return p._navbox(args) | return p._navbox(args) |