https://www.smitingshepherds.com/index.php?title=Module:Navbox&feed=atom&action=history
Module:Navbox - Revision history
2024-03-28T13:05:49Z
Revision history for this page on the wiki
MediaWiki 1.27.1
https://www.smitingshepherds.com/index.php?title=Module:Navbox&diff=497&oldid=prev
Sysop: 1 revision imported
2017-03-23T23:32:25Z
<p>1 revision imported</p>
<table class="diff diff-contentalign-left" data-mw="interface">
<tr style='vertical-align: top;' lang='en'>
<td colspan='1' style="background-color: white; color:black; text-align: center;">← Older revision</td>
<td colspan='1' style="background-color: white; color:black; text-align: center;">Revision as of 23:32, 23 March 2017</td>
</tr><tr><td colspan='2' style='text-align: center;' lang='en'><div class="mw-diff-empty">(No difference)</div>
</td></tr></table>
Sysop
https://www.smitingshepherds.com/index.php?title=Module:Navbox&diff=496&oldid=prev
Johnuniq: update from Module:Navbox/sandbox per talk; this implements automatic striping that applies to a navbox and any subgroup (child) navboxes it contains
2017-03-12T23:51:56Z
<p>update from <a href="/index.php?title=Module:Navbox/sandbox&action=edit&redlink=1" class="new" title="Module:Navbox/sandbox (page does not exist)">Module:Navbox/sandbox</a> per talk; this implements automatic striping that applies to a navbox and any subgroup (child) navboxes it contains</p>
<p><b>New page</b></p><div>--<br />
-- This module implements {{Navbox}}<br />
--<br />
<br />
local p = {}<br />
<br />
local navbar = require('Module:Navbar')._navbar<br />
local getArgs -- lazily initialized<br />
<br />
local args<br />
local tableRowAdded = false<br />
local border<br />
local listnums = {}<br />
local ODD_EVEN_MARKER = '\127_ODDEVEN_\127'<br />
local RESTART_MARKER = '\127_ODDEVEN0_\127'<br />
local REGEX_MARKER = '\127_ODDEVEN(%d?)_\127'<br />
<br />
local function striped(wikitext)<br />
-- Return wikitext with markers replaced for odd/even striping.<br />
-- Child (subgroup) navboxes are flagged with a category that is removed<br />
-- by parent navboxes. The result is that the category shows all pages<br />
-- where a child navbox is not contained in a parent navbox.<br />
local orphanCat = '[[Category:Navbox orphans]]'<br />
if border == 'subgroup' and args.orphan ~= 'yes' then<br />
-- No change; striping occurs in outermost navbox.<br />
return wikitext .. orphanCat<br />
end<br />
local first, second = 'odd', 'even'<br />
if args.evenodd then<br />
if args.evenodd == 'swap' then<br />
first, second = second, first<br />
else<br />
first = args.evenodd<br />
second = first<br />
end<br />
end<br />
local changer<br />
if first == second then<br />
changer = first<br />
else<br />
local index = 0<br />
changer = function (code)<br />
if code == '0' then<br />
-- Current occurrence is for a group before a nested table.<br />
-- Set it to first as a valid although pointless class.<br />
-- The next occurrence will be the first row after a title<br />
-- in a subgroup and will also be first.<br />
index = 0<br />
return first<br />
end<br />
index = index + 1<br />
return index % 2 == 1 and first or second<br />
end<br />
end<br />
local regex = orphanCat:gsub('([%[%]])', '%%%1')<br />
return (wikitext:gsub(regex, ''):gsub(REGEX_MARKER, changer)) -- () omits gsub count<br />
end<br />
<br />
local function addNewline(s)<br />
if s:match('^[*:;#]') or s:match('^{|') then<br />
return '\n' .. s ..'\n'<br />
else<br />
return s<br />
end<br />
end<br />
<br />
local function addTableRow(tbl)<br />
-- If any other rows have already been added, then we add a 2px gutter row.<br />
if tableRowAdded then<br />
tbl<br />
:tag('tr')<br />
:css('height', '2px')<br />
:tag('td')<br />
:attr('colspan',2)<br />
end<br />
<br />
tableRowAdded = true<br />
<br />
return tbl:tag('tr')<br />
end<br />
<br />
local function renderNavBar(titleCell)<br />
<br />
if args.navbar ~= 'off' and args.navbar ~= 'plain' and not (not args.name and mw.getCurrentFrame():getParent():getTitle():gsub('/sandbox$', '') == 'Template:Navbox') then<br />
titleCell:wikitext(navbar{<br />
args.name,<br />
mini = 1,<br />
fontstyle = (args.basestyle or '') .. ';' .. (args.titlestyle or '') .. ';background:none transparent;border:none;'<br />
})<br />
end<br />
<br />
end<br />
<br />
--<br />
-- Title row<br />
--<br />
local function renderTitleRow(tbl)<br />
if not args.title then return end<br />
<br />
local titleRow = addTableRow(tbl)<br />
<br />
if args.titlegroup then<br />
titleRow<br />
:tag('th')<br />
:attr('scope', 'row')<br />
:addClass('navbox-group')<br />
:addClass(args.titlegroupclass)<br />
:cssText(args.basestyle)<br />
:cssText(args.groupstyle)<br />
:cssText(args.titlegroupstyle)<br />
:wikitext(args.titlegroup)<br />
end<br />
<br />
local titleCell = titleRow:tag('th'):attr('scope', 'col')<br />
<br />
if args.titlegroup then<br />
titleCell<br />
:css('border-left', '2px solid #fdfdfd')<br />
:css('width', '100%')<br />
end<br />
<br />
local titleColspan = 2<br />
if args.imageleft then titleColspan = titleColspan + 1 end<br />
if args.image then titleColspan = titleColspan + 1 end<br />
if args.titlegroup then titleColspan = titleColspan - 1 end<br />
<br />
titleCell<br />
:cssText(args.basestyle)<br />
:cssText(args.titlestyle)<br />
:addClass('navbox-title')<br />
:attr('colspan', titleColspan)<br />
<br />
renderNavBar(titleCell)<br />
<br />
titleCell<br />
:tag('div')<br />
:attr('id', mw.uri.anchorEncode(args.title))<br />
:addClass(args.titleclass)<br />
:css('font-size', '114%')<br />
:css('margin', '0 4em')<br />
:wikitext(addNewline(args.title))<br />
end<br />
<br />
--<br />
-- Above/Below rows<br />
--<br />
<br />
local function getAboveBelowColspan()<br />
local ret = 2<br />
if args.imageleft then ret = ret + 1 end<br />
if args.image then ret = ret + 1 end<br />
return ret<br />
end<br />
<br />
local function renderAboveRow(tbl)<br />
if not args.above then return end<br />
<br />
addTableRow(tbl)<br />
:tag('td')<br />
:addClass('navbox-abovebelow')<br />
:addClass(args.aboveclass)<br />
:cssText(args.basestyle)<br />
:cssText(args.abovestyle)<br />
:attr('colspan', getAboveBelowColspan())<br />
:tag('div')<br />
:wikitext(addNewline(args.above))<br />
end<br />
<br />
local function renderBelowRow(tbl)<br />
if not args.below then return end<br />
<br />
addTableRow(tbl)<br />
:tag('td')<br />
:addClass('navbox-abovebelow')<br />
:addClass(args.belowclass)<br />
:cssText(args.basestyle)<br />
:cssText(args.belowstyle)<br />
:attr('colspan', getAboveBelowColspan())<br />
:tag('div')<br />
:wikitext(addNewline(args.below))<br />
end<br />
<br />
--<br />
-- List rows<br />
--<br />
local function renderListRow(tbl, index, listnum)<br />
local row = addTableRow(tbl)<br />
<br />
if index == 1 and args.imageleft then<br />
row<br />
:tag('td')<br />
:addClass('navbox-image')<br />
:addClass(args.imageclass)<br />
:css('width', '0%')<br />
:css('padding', '0px 2px 0px 0px')<br />
:cssText(args.imageleftstyle)<br />
:attr('rowspan', 2 * #listnums - 1)<br />
:tag('div')<br />
:wikitext(addNewline(args.imageleft))<br />
end<br />
<br />
if args['group' .. listnum] then<br />
local groupCell = row:tag('th')<br />
<br />
groupCell<br />
:attr('scope', 'row')<br />
:addClass('navbox-group')<br />
:addClass(args.groupclass)<br />
:cssText(args.basestyle)<br />
<br />
if args.groupwidth then<br />
groupCell:css('width', args.groupwidth)<br />
end<br />
<br />
groupCell<br />
:cssText(args.groupstyle)<br />
:cssText(args['group' .. listnum .. 'style'])<br />
:wikitext(args['group' .. listnum])<br />
end<br />
<br />
local listCell = row:tag('td')<br />
<br />
if args['group' .. listnum] then<br />
listCell<br />
:css('text-align', 'left')<br />
:css('border-left-width', '2px')<br />
:css('border-left-style', 'solid')<br />
else<br />
listCell:attr('colspan', 2)<br />
end<br />
<br />
if not args.groupwidth then<br />
listCell:css('width', '100%')<br />
end<br />
<br />
local rowstyle -- usually nil so cssText(rowstyle) usually adds nothing<br />
if index % 2 == 1 then<br />
rowstyle = args.oddstyle<br />
else<br />
rowstyle = args.evenstyle<br />
end<br />
<br />
local listText = args['list' .. listnum]<br />
local oddEven = ODD_EVEN_MARKER<br />
if listText:sub(1, 12) == '</div><table' then<br />
-- Assume list text is for a subgroup navbox so no automatic striping for this row.<br />
oddEven = listText:find('<th[^>]*"navbox%-title"') and RESTART_MARKER or 'odd'<br />
end<br />
listCell<br />
:css('padding', '0px')<br />
:cssText(args.liststyle)<br />
:cssText(rowstyle)<br />
:cssText(args['list' .. listnum .. 'style'])<br />
:addClass('navbox-list')<br />
:addClass('navbox-' .. oddEven)<br />
:addClass(args.listclass)<br />
:tag('div')<br />
:css('padding', (index == 1 and args.list1padding) or args.listpadding or '0em 0.25em')<br />
:wikitext(addNewline(listText))<br />
<br />
if index == 1 and args.image then<br />
row<br />
:tag('td')<br />
:addClass('navbox-image')<br />
:addClass(args.imageclass)<br />
:css('width', '0%')<br />
:css('padding', '0px 0px 0px 2px')<br />
:cssText(args.imagestyle)<br />
:attr('rowspan', 2 * #listnums - 1)<br />
:tag('div')<br />
:wikitext(addNewline(args.image))<br />
end<br />
end<br />
<br />
<br />
--<br />
-- Tracking categories<br />
--<br />
<br />
local function needsHorizontalLists()<br />
if border == 'subgroup' or args.tracking == 'no' then<br />
return false<br />
end<br />
local listClasses = {<br />
['plainlist'] = true, ['hlist'] = true, ['hlist hnum'] = true,<br />
['hlist hwrap'] = true, ['hlist vcard'] = true, ['vcard hlist'] = true,<br />
['hlist vevent'] = true,<br />
}<br />
return not (listClasses[args.listclass] or listClasses[args.bodyclass])<br />
end<br />
<br />
local function hasBackgroundColors()<br />
for _, key in ipairs({'titlestyle', 'groupstyle', 'basestyle'}) do<br />
if tostring(args[key]):find('background', 1, true) then<br />
return true<br />
end<br />
end<br />
end<br />
<br />
local function isIllegible()<br />
local styleratio = require('Module:Color contrast')._styleratio<br />
<br />
for key, style in pairs(args) do<br />
if tostring(key):match("style$") then<br />
if styleratio{mw.text.unstripNoWiki(style)} < 4.5 then<br />
return true<br />
end<br />
end<br />
end<br />
return false<br />
end<br />
<br />
local function getTrackingCategories()<br />
local cats = {}<br />
if needsHorizontalLists() then table.insert(cats, 'Navigational boxes without horizontal lists') end<br />
if hasBackgroundColors() then table.insert(cats, 'Navboxes using background colours') end<br />
if isIllegible() then table.insert(cats, 'Potentially illegible navboxes') end<br />
return cats<br />
end<br />
<br />
local function renderTrackingCategories(builder)<br />
local title = mw.title.getCurrentTitle()<br />
if title.namespace ~= 10 then return end -- not in template space<br />
local subpage = title.subpageText<br />
if subpage == 'doc' or subpage == 'sandbox' or subpage == 'testcases' then return end<br />
<br />
for i, cat in ipairs(getTrackingCategories()) do<br />
builder:wikitext('[[Category:' .. cat .. ']]')<br />
end<br />
end<br />
<br />
--<br />
-- Main navbox tables<br />
--<br />
local function renderMainTable()<br />
local tbl = mw.html.create('table')<br />
:addClass('nowraplinks')<br />
:addClass(args.bodyclass)<br />
<br />
if args.title and (args.state ~= 'plain' and args.state ~= 'off') then<br />
tbl<br />
:addClass('collapsible')<br />
:addClass(args.state or 'autocollapse')<br />
end<br />
<br />
tbl:css('border-spacing', 0)<br />
if border == 'subgroup' or border == 'none' then<br />
tbl<br />
:addClass('navbox-subgroup')<br />
:cssText(args.bodystyle)<br />
:cssText(args.style)<br />
else -- regular navbox - bodystyle and style will be applied to the wrapper table<br />
tbl<br />
:addClass('navbox-inner')<br />
:css('background', 'transparent')<br />
:css('color', 'inherit')<br />
end<br />
tbl:cssText(args.innerstyle)<br />
<br />
renderTitleRow(tbl)<br />
renderAboveRow(tbl)<br />
for i, listnum in ipairs(listnums) do<br />
renderListRow(tbl, i, listnum)<br />
end<br />
renderBelowRow(tbl)<br />
<br />
return tbl<br />
end<br />
<br />
function p._navbox(navboxArgs)<br />
args = navboxArgs<br />
<br />
for k, v in pairs(args) do<br />
local listnum = ('' .. k):match('^list(%d+)$')<br />
if listnum then table.insert(listnums, tonumber(listnum)) end<br />
end<br />
table.sort(listnums)<br />
<br />
border = mw.text.trim(args.border or args[1] or '')<br />
if border == 'child' then<br />
border = 'subgroup'<br />
end<br />
<br />
-- render the main body of the navbox<br />
local tbl = renderMainTable()<br />
<br />
-- render the appropriate wrapper around the navbox, depending on the border param<br />
local res = mw.html.create()<br />
if border == 'none' then<br />
local nav = res:tag('div')<br />
:attr('role', 'navigation')<br />
:node(tbl)<br />
if args.title then<br />
nav:attr('aria-labelledby', mw.uri.anchorEncode(args.title))<br />
else<br />
nav:attr('aria-label', 'Navbox')<br />
end<br />
elseif border == 'subgroup' then<br />
-- We assume that this navbox is being rendered in a list cell of a parent navbox, and is<br />
-- therefore inside a div with padding:0em 0.25em. We start with a </div> to avoid the<br />
-- padding being applied, and at the end add a <div> to balance out the parent's </div><br />
res<br />
:wikitext('</div>')<br />
:node(tbl)<br />
:wikitext('<div>')<br />
else<br />
local nav = res:tag('div')<br />
:attr('role', 'navigation')<br />
:addClass('navbox')<br />
:cssText(args.bodystyle)<br />
:cssText(args.style)<br />
:css('padding', '3px')<br />
:node(tbl)<br />
if args.title then<br />
nav:attr('aria-labelledby', mw.uri.anchorEncode(args.title))<br />
else<br />
nav:attr('aria-label', 'Navbox')<br />
end<br />
end<br />
<br />
renderTrackingCategories(res)<br />
<br />
return striped(tostring(res))<br />
end<br />
<br />
function p.navbox(frame)<br />
if not getArgs then<br />
getArgs = require('Module:Arguments').getArgs<br />
end<br />
args = getArgs(frame, {wrappers = 'Template:Navbox'})<br />
<br />
-- Read the arguments in the order they'll be output in, to make references number in the right order.<br />
local _<br />
_ = args.title<br />
_ = args.above<br />
for i = 1, 20 do<br />
_ = args["group" .. tostring(i)]<br />
_ = args["list" .. tostring(i)]<br />
end<br />
_ = args.below<br />
<br />
return p._navbox(args)<br />
end<br />
<br />
return p</div>
Johnuniq