Editing Module:Navbox
Warning: You are not logged in.
Your IP address will be recorded in this page's edit history.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 1: | Line 1: | ||
-- | -- | ||
− | -- This module | + | -- This module will implement {{Navbox}} |
-- | -- | ||
− | + | ||
local p = {} | local p = {} | ||
− | + | ||
+ | local HtmlBuilder = require('Module:HtmlBuilder') | ||
local navbar = require('Module:Navbar')._navbar | local navbar = require('Module:Navbar')._navbar | ||
local getArgs -- lazily initialized | local getArgs -- lazily initialized | ||
Line 12: | Line 13: | ||
local border | local border | ||
local listnums = {} | local listnums = {} | ||
− | + | ||
local function trim(s) | local function trim(s) | ||
return (mw.ustring.gsub(s, "^%s*(.-)%s*$", "%1")) | return (mw.ustring.gsub(s, "^%s*(.-)%s*$", "%1")) | ||
Line 29: | Line 30: | ||
if tableRowAdded then | if tableRowAdded then | ||
tbl | tbl | ||
− | + | .tag('tr') | |
− | + | .css('height', '2px') | |
− | + | .tag('td') | |
− | + | .attr('colspan',2) | |
end | end | ||
− | + | ||
tableRowAdded = true | tableRowAdded = true | ||
− | + | ||
− | return tbl | + | return tbl.tag('tr') |
end | end | ||
Line 49: | Line 50: | ||
-- 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 (not args.name and mw.getCurrentFrame():getParent():getTitle(): | + | elseif args.navbar == 'plain' or (not args.name and mw.getCurrentFrame():getParent():getTitle() == 'Template:Navbox' and (border == 'subgroup' or border == 'child' or border == 'none')) 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 57: | Line 58: | ||
if args.state == 'plain' then spacerSide = 'right' end | if args.state == 'plain' then spacerSide = 'right' end | ||
− | titleCell | + | 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') | |
− | + | .css('float', spacerSide) | |
− | + | .css('width', '6em') | |
− | + | .wikitext(' ') | |
end | end | ||
end | end | ||
Line 79: | Line 80: | ||
local function renderTitleRow(tbl) | local function renderTitleRow(tbl) | ||
if not args.title then return end | if not args.title then return end | ||
− | + | ||
local titleRow = addTableRow(tbl) | local titleRow = addTableRow(tbl) | ||
− | + | ||
if args.titlegroup then | if args.titlegroup then | ||
titleRow | 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 | end | ||
− | + | ||
− | local titleCell = titleRow | + | local titleCell = titleRow.tag('th').attr('scope', 'col') |
− | + | ||
if args.titlegroup then | if args.titlegroup then | ||
titleCell | titleCell | ||
− | + | .css('border-left', '2px solid #fdfdfd') | |
− | + | .css('width', '100%') | |
end | end | ||
− | + | ||
local titleColspan = 2 | local titleColspan = 2 | ||
if args.imageleft then titleColspan = titleColspan + 1 end | if args.imageleft then titleColspan = titleColspan + 1 end | ||
if args.image then titleColspan = titleColspan + 1 end | if args.image then titleColspan = titleColspan + 1 end | ||
if args.titlegroup then titleColspan = titleColspan - 1 end | if args.titlegroup then titleColspan = titleColspan - 1 end | ||
− | + | ||
titleCell | titleCell | ||
− | + | .cssText(args.basestyle) | |
− | + | .cssText(args.titlestyle) | |
− | + | .addClass('navbox-title') | |
− | + | .attr('colspan', titleColspan) | |
− | + | ||
renderNavBar(titleCell) | renderNavBar(titleCell) | ||
titleCell | titleCell | ||
− | + | .tag('div') | |
− | + | .addClass(args.titleclass) | |
− | + | .css('font-size', '110%') | |
− | + | .wikitext(addNewline(args.title)) | |
end | end | ||
Line 137: | Line 138: | ||
addTableRow(tbl) | addTableRow(tbl) | ||
− | + | .tag('td') | |
− | + | .addClass('navbox-abovebelow') | |
− | + | .addClass(args.aboveclass) | |
− | + | .cssText(args.basestyle) | |
− | + | .cssText(args.abovestyle) | |
− | + | .attr('colspan', getAboveBelowColspan()) | |
− | + | .tag('div') | |
− | + | .wikitext(addNewline(args.above)) | |
end | end | ||
Line 151: | Line 152: | ||
addTableRow(tbl) | addTableRow(tbl) | ||
− | + | .tag('td') | |
− | + | .addClass('navbox-abovebelow') | |
− | + | .addClass(args.belowclass) | |
− | + | .cssText(args.basestyle) | |
− | + | .cssText(args.belowstyle) | |
− | + | .attr('colspan', getAboveBelowColspan()) | |
− | + | .tag('div') | |
− | + | .wikitext(addNewline(args.below)) | |
end | end | ||
− | + | ||
-- | -- | ||
-- List rows | -- List rows | ||
Line 166: | Line 167: | ||
local 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') | |
− | + | .addClass('navbox-image') | |
− | + | .addClass(args.imageclass) | |
− | + | .css('width', '0%') | |
− | + | .css('padding', '0px 2px 0px 0px') | |
− | + | .cssText(args.imageleftstyle) | |
− | + | .attr('rowspan', 2 * #listnums - 1) | |
− | + | .tag('div') | |
− | + | .wikitext(addNewline(args.imageleft)) | |
end | end | ||
− | + | ||
if args['group' .. listnum] then | if args['group' .. listnum] then | ||
− | local groupCell = row | + | local groupCell = row.tag('th') |
− | + | ||
groupCell | groupCell | ||
− | + | .attr('scope', 'row') | |
− | + | .addClass('navbox-group') | |
− | + | .addClass(args.groupclass) | |
− | + | .cssText(args.basestyle) | |
− | + | ||
if args.groupwidth then | if args.groupwidth then | ||
− | groupCell | + | groupCell.css('width', args.groupwidth) |
end | end | ||
− | + | ||
groupCell | groupCell | ||
− | + | .cssText(args.groupstyle) | |
− | + | .cssText(args['group' .. listnum .. 'style']) | |
− | + | .wikitext(args['group' .. listnum]) | |
end | end | ||
− | + | ||
− | local listCell = row | + | local listCell = row.tag('td') |
if args['group' .. listnum] then | if args['group' .. listnum] then | ||
listCell | listCell | ||
− | + | .css('text-align', 'left') | |
− | + | .css('border-left-width', '2px') | |
− | + | .css('border-left-style', 'solid') | |
else | else | ||
− | listCell | + | listCell.attr('colspan', 2) |
end | end | ||
− | + | ||
− | if not args.groupwidth then | + | if not args.groupwidth then |
− | listCell | + | 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 226: | Line 227: | ||
listCell | listCell | ||
− | + | .css('padding', '0px') | |
− | + | .cssText(args.liststyle) | |
− | + | .cssText(rowstyle) | |
− | + | .cssText(args['list' .. listnum .. 'style']) | |
− | + | .addClass('navbox-list') | |
− | + | .addClass('navbox-' .. evenOdd) | |
− | + | .addClass(args.listclass) | |
− | + | .tag('div') | |
− | + | .css('padding', (listnum == 1 and args.list1padding) or args.listpadding or '0em 0.25em') | |
− | + | .wikitext(addNewline(args['list' .. listnum])) | |
if listnum == 1 and args.image then | if listnum == 1 and args.image then | ||
row | row | ||
− | + | .tag('td') | |
− | + | .addClass('navbox-image') | |
− | + | .addClass(args.imageclass) | |
− | + | .css('width', '0%') | |
− | + | .css('padding', '0px 0px 0px 2px') | |
− | + | .cssText(args.imagestyle) | |
− | + | .attr('rowspan', 2 * #listnums - 1) | |
− | + | .tag('div') | |
− | + | .wikitext(addNewline(args.image)) | |
end | end | ||
end | end | ||
Line 258: | Line 259: | ||
local function needsHorizontalLists() | local function needsHorizontalLists() | ||
if border == 'child' or border == 'subgroup' or args.tracking == 'no' then return false end | 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 285: | Line 286: | ||
local subpage = title.subpageText | local subpage = title.subpageText | ||
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 i, cat in ipairs(getTrackingCategories()) do | ||
− | builder | + | builder.wikitext('[[Category:' .. cat .. ']]') |
end | end | ||
end | end | ||
Line 295: | Line 296: | ||
-- | -- | ||
local function renderMainTable() | local function renderMainTable() | ||
− | local tbl = | + | local tbl = HtmlBuilder.create('table') |
− | + | .attr('cellspacing', 0) | |
− | + | .addClass('nowraplinks') | |
− | + | .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(args.state or 'autocollapse') | |
end | end | ||
− | + | ||
− | tbl | + | 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') | |
− | + | .cssText(args.bodystyle) | |
− | + | .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') | |
− | + | .css('background', 'transparent') | |
− | + | .css('color', 'inherit') | |
end | end | ||
− | tbl | + | 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 331: | Line 333: | ||
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 337: | Line 339: | ||
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 344: | Line 346: | ||
-- 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 = | + | local res = HtmlBuilder.create() |
if border == 'none' then | if border == 'none' then | ||
− | res | + | 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 352: | Line 354: | ||
-- 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}) | |
− | + | .done() | |
− | + | .node(tbl) | |
+ | .tag('div', {unclosed = true}) | ||
else | else | ||
res | res | ||
− | + | .tag('table') | |
− | + | .attr('cellspacing', 0) | |
− | + | .addClass('navbox') | |
− | + | .css('border-spacing', 0) | |
− | + | .cssText(args.bodystyle) | |
− | + | .cssText(args.style) | |
− | + | .tag('tr') | |
− | + | .tag('td') | |
− | + | .css('padding', '2px') | |
+ | .node(tbl) | ||
end | end | ||
− | + | ||
renderTrackingCategories(res) | renderTrackingCategories(res) | ||
− | + | ||
return tostring(res) | return tostring(res) | ||
end | end | ||
− | + | ||
function p.navbox(frame) | function p.navbox(frame) | ||
if not getArgs then | if not getArgs then | ||
− | + | getArgs = require('Module:Arguments').getArgs | |
end | end | ||
args = getArgs(frame, {wrappers = 'Template:Navbox'}) | args = getArgs(frame, {wrappers = 'Template:Navbox'}) | ||
Line 386: | Line 390: | ||
_ = args["group" .. tostring(i)] | _ = args["group" .. tostring(i)] | ||
_ = args["list" .. tostring(i)] | _ = args["list" .. tostring(i)] | ||
− | end | + | end |
_ = args.below | _ = args.below | ||
return p._navbox(args) | return p._navbox(args) | ||
end | end | ||
− | + | ||
return p | return p |