Line 9: |
Line 9: |
| | | |
| local args | | local args |
− | local tableRowAdded = false
| |
| local border | | local border |
− | local listnums = {} | + | local listnums |
| local ODD_EVEN_MARKER = '\127_ODDEVEN_\127' | | local ODD_EVEN_MARKER = '\127_ODDEVEN_\127' |
| local RESTART_MARKER = '\127_ODDEVEN0_\127' | | local RESTART_MARKER = '\127_ODDEVEN0_\127' |
Line 57: |
Line 56: |
| end | | end |
| | | |
− | local function addNewline(s) | + | local function processItem(item, nowrapitems) |
− | if s:match('^[*:;#]') or s:match('^{|') then | + | if item:sub(1, 2) == '{|' then |
− | return '\n' .. s ..'\n'
| + | -- Applying nowrap to lines in a table does not make sense. |
− | else
| + | -- Add newlines to compensate for trim of x in |parm=x in a template. |
− | return s | + | return '\n' .. item ..'\n' |
| + | end |
| + | if nowrapitems == 'yes' then |
| + | local lines = {} |
| + | for line in (item .. '\n'):gmatch('([^\n]*)\n') do |
| + | local prefix, content = line:match('^([*:;#]+)%s*(.*)') |
| + | if prefix and not content:match('^<span class="nowrap">') then |
| + | line = prefix .. '<span class="nowrap">' .. content .. '</span>' |
| + | end |
| + | table.insert(lines, line) |
| + | end |
| + | item = table.concat(lines, '\n') |
| end | | end |
− | end
| + | if item:match('^[*:;#]') then |
− | | + | return '\n' .. item ..'\n' |
− | local function addTableRow(tbl)
| |
− | -- If any other rows have already been added, then we add a 2px gutter row.
| |
− | if tableRowAdded then | |
− | tbl
| |
− | :tag('tr')
| |
− | :css('height', '2px')
| |
− | :tag('td')
| |
− | :attr('colspan',2)
| |
| end | | end |
− | | + | return item |
− | tableRowAdded = true
| |
− | | |
− | return tbl:tag('tr') | |
| end | | end |
| | | |
Line 86: |
Line 85: |
| 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;-moz-box-shadow:none;-webkit-box-shadow:none;box-shadow:none; padding:0;' |
| }) | | }) |
| end | | end |
Line 98: |
Line 97: |
| if not args.title then return end | | if not args.title then return end |
| | | |
− | local titleRow = addTableRow(tbl) | + | local titleRow = tbl:tag('tr') |
| | | |
| if args.titlegroup then | | if args.titlegroup then |
Line 135: |
Line 134: |
| titleCell | | titleCell |
| :tag('div') | | :tag('div') |
| + | -- id for aria-labelledby attribute |
| :attr('id', mw.uri.anchorEncode(args.title)) | | :attr('id', mw.uri.anchorEncode(args.title)) |
| :addClass(args.titleclass) | | :addClass(args.titleclass) |
| :css('font-size', '114%') | | :css('font-size', '114%') |
| :css('margin', '0 4em') | | :css('margin', '0 4em') |
− | :wikitext(addNewline(args.title)) | + | :wikitext(processItem(args.title)) |
| end | | end |
| | | |
Line 156: |
Line 156: |
| if not args.above then return end | | if not args.above then return end |
| | | |
− | addTableRow(tbl) | + | tbl:tag('tr') |
| :tag('td') | | :tag('td') |
| :addClass('navbox-abovebelow') | | :addClass('navbox-abovebelow') |
Line 164: |
Line 164: |
| :attr('colspan', getAboveBelowColspan()) | | :attr('colspan', getAboveBelowColspan()) |
| :tag('div') | | :tag('div') |
− | :wikitext(addNewline(args.above)) | + | -- id for aria-labelledby attribute, if no title |
| + | :attr('id', args.title and nil or mw.uri.anchorEncode(args.above)) |
| + | :wikitext(processItem(args.above, args.nowrapitems)) |
| end | | end |
| | | |
Line 170: |
Line 172: |
| if not args.below then return end | | if not args.below then return end |
| | | |
− | addTableRow(tbl) | + | tbl:tag('tr') |
| :tag('td') | | :tag('td') |
| :addClass('navbox-abovebelow') | | :addClass('navbox-abovebelow') |
Line 178: |
Line 180: |
| :attr('colspan', getAboveBelowColspan()) | | :attr('colspan', getAboveBelowColspan()) |
| :tag('div') | | :tag('div') |
− | :wikitext(addNewline(args.below)) | + | :wikitext(processItem(args.below, args.nowrapitems)) |
| end | | end |
| | | |
Line 185: |
Line 187: |
| -- | | -- |
| local function renderListRow(tbl, index, listnum) | | local function renderListRow(tbl, index, listnum) |
− | local row = addTableRow(tbl) | + | local row = tbl:tag('tr') |
| | | |
| if index == 1 and args.imageleft then | | if index == 1 and args.imageleft then |
Line 192: |
Line 194: |
| :addClass('navbox-image') | | :addClass('navbox-image') |
| :addClass(args.imageclass) | | :addClass(args.imageclass) |
− | :css('width', '0%') | + | :css('width', '1px') -- Minimize width |
| :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', #listnums) |
| :tag('div') | | :tag('div') |
− | :wikitext(addNewline(args.imageleft)) | + | :wikitext(processItem(args.imageleft)) |
| end | | end |
| | | |
| if args['group' .. listnum] then | | 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 |
| + | if listnum == 1 and not (args.title or args.above or args.group2) then |
| + | groupCell |
| + | :attr('id', mw.uri.anchorEncode(args.group1)) |
| + | end |
| | | |
| groupCell | | groupCell |
Line 208: |
Line 216: |
| :addClass(args.groupclass) | | :addClass(args.groupclass) |
| :cssText(args.basestyle) | | :cssText(args.basestyle) |
− | | + | :css('width', args.groupwidth or '1%') -- If groupwidth not specified, minimize width |
− | if args.groupwidth then
| |
− | groupCell:css('width', args.groupwidth) | |
− | end
| |
| | | |
| groupCell | | groupCell |
Line 255: |
Line 260: |
| :addClass('navbox-' .. oddEven) | | :addClass('navbox-' .. oddEven) |
| :addClass(args.listclass) | | :addClass(args.listclass) |
| + | :addClass(args['list' .. listnum .. 'class']) |
| :tag('div') | | :tag('div') |
| :css('padding', (index == 1 and args.list1padding) or args.listpadding or '0em 0.25em') | | :css('padding', (index == 1 and args.list1padding) or args.listpadding or '0em 0.25em') |
− | :wikitext(addNewline(listText)) | + | :wikitext(processItem(listText, args.nowrapitems)) |
| | | |
| if index == 1 and args.image then | | if index == 1 and args.image then |
Line 264: |
Line 270: |
| :addClass('navbox-image') | | :addClass('navbox-image') |
| :addClass(args.imageclass) | | :addClass(args.imageclass) |
− | :css('width', '0%') | + | :css('width', '1px') -- Minimize width |
| :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', #listnums) |
| :tag('div') | | :tag('div') |
− | :wikitext(addNewline(args.image)) | + | :wikitext(processItem(args.image)) |
| end | | end |
| end | | end |
Line 291: |
Line 297: |
| | | |
| local function hasBackgroundColors() | | local function hasBackgroundColors() |
− | for _, key in ipairs({'titlestyle', 'groupstyle', 'basestyle'}) do | + | 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 |
| + | end |
| + | end |
| + | end |
| + | |
| + | local function hasBorders() |
| + | for _, key in ipairs({'groupstyle', 'basestyle', 'abovestyle', 'belowstyle'}) do |
| + | if tostring(args[key]):find('border', 1, true) then |
| return true | | return true |
| end | | end |
Line 316: |
Line 330: |
| if hasBackgroundColors() then table.insert(cats, 'Navboxes using background colours') end | | if hasBackgroundColors() then table.insert(cats, 'Navboxes using background colours') end |
| if isIllegible() then table.insert(cats, 'Potentially illegible navboxes') end | | if isIllegible() then table.insert(cats, 'Potentially illegible navboxes') end |
| + | if hasBorders() then table.insert(cats, 'Navboxes using borders') end |
| return cats | | return cats |
| end | | end |
Line 325: |
Line 340: |
| if subpage == 'doc' or subpage == 'sandbox' or subpage == 'testcases' then return end | | if subpage == 'doc' or subpage == 'sandbox' or subpage == 'testcases' then return end |
| | | |
− | for i, cat in ipairs(getTrackingCategories()) do | + | for _, cat in ipairs(getTrackingCategories()) do |
| builder:wikitext('[[Category:' .. cat .. ']]') | | builder:wikitext('[[Category:' .. cat .. ']]') |
| end | | end |
Line 370: |
Line 385: |
| function p._navbox(navboxArgs) | | function p._navbox(navboxArgs) |
| args = navboxArgs | | args = navboxArgs |
| + | listnums = {} |
| | | |
− | for k, v in pairs(args) do | + | for k, _ in pairs(args) do |
− | local listnum = ('' .. k):match('^list(%d+)$') | + | if type(k) == 'string' then |
− | if listnum then table.insert(listnums, tonumber(listnum)) end
| + | local listnum = k:match('^list(%d+)$') |
| + | if listnum then table.insert(listnums, tonumber(listnum)) end |
| + | end |
| end | | end |
| table.sort(listnums) | | table.sort(listnums) |
Line 391: |
Line 409: |
| :attr('role', 'navigation') | | :attr('role', 'navigation') |
| :node(tbl) | | :node(tbl) |
− | if args.title then | + | -- aria-labelledby title, otherwise above, otherwise lone group |
− | nav:attr('aria-labelledby', mw.uri.anchorEncode(args.title)) | + | 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)) |
| else | | else |
| nav:attr('aria-label', 'Navbox') | | nav:attr('aria-label', 'Navbox') |
Line 412: |
Line 431: |
| :css('padding', '3px') | | :css('padding', '3px') |
| :node(tbl) | | :node(tbl) |
− | if args.title then | + | -- aria-labelledby title, otherwise above, otherwise lone group |
− | nav:attr('aria-labelledby', mw.uri.anchorEncode(args.title)) | + | 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)) |
| else | | else |
| nav:attr('aria-label', 'Navbox') | | nav:attr('aria-label', 'Navbox') |
Line 419: |
Line 439: |
| end | | end |
| | | |
− | renderTrackingCategories(res) | + | if (args.nocat or 'false'):lower() == 'false' then |
− | | + | renderTrackingCategories(res) |
| + | end |
| return striped(tostring(res)) | | return striped(tostring(res)) |
| end | | end |
Line 428: |
Line 449: |
| getArgs = require('Module:Arguments').getArgs | | getArgs = require('Module:Arguments').getArgs |
| end | | end |
− | args = getArgs(frame, {wrappers = 'Template:Navbox'}) | + | 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 number in the right order. | | -- Read the arguments in the order they'll be output in, to make references number in the right order. |