Module:Navbox: Difference between revisions
From Zoophilia Wiki
Jump to navigationJump to search
meta>Toohool ←Created page with '-- -- This module will implement {{Navbox}} -- local p = {} local gutterRow = '<tr style="height:2px;"><td></td></tr>' local ret = {} function add(...) fo...' |
meta>Toohool refactoring |
||
Line 16: | Line 16: | ||
end | end | ||
function | function renderTitleRow(args) | ||
if not args.title then return end | |||
add('<tr>') | |||
if args.titlegroup then | |||
add('<th scope="row" class="navbox-group ', args.titlegroupclass, '" style="', args.basestyle, ';', args.groupstyle, ';', args.titlegroupstyle, '">', args.titlegroup, '</th><th scope="col" style="border-left:2px solid #fdfdfd;width:100%;') | |||
else | |||
add('<th scope="col" style="') | |||
end | |||
local colspan = 2 | |||
if args.imageleft then colspan = colspan + 1 end | |||
if args.image then colspan = colspan + 1 end | |||
if args.titlegroup then colspan = colspan - 1 end | |||
add(args.basestyle, ';', args.titlestyle, '" class="navbox-title" colspan=', colspan, '>') | |||
local stateLinkPlaceholder = '<span style="float:right;width:6em;"> </span>' | |||
if args.navbar == 'plain' or args.navbar == 'off' or (not args.name and (border == 'subgroup' or border == 'child' or border == 'none')) then | |||
if args.navbar == 'off' then | |||
if args.state == 'plain' then add(stateLinkPlaceholder) end | |||
else | |||
if args.state ~= 'plain' then add(stateLinkPlaceholder) end | |||
end | |||
else | |||
if args.name then | |||
add(mw.getCurrentFrame():expandTemplate{ title = 'navbar', args = { | |||
args.name, | |||
mini = 1, | |||
fontstyle = (args.basestyle or '') .. ';' .. (args.titlestyle or '') .. ';background:none transparent;border:none;' | |||
}}) | |||
else | |||
add('<span class="error" style="float:left;white-space:nowrap;">Error: No name provided</span>') | |||
if args.state == 'plain' then add(stateLinkPlaceholder) end | |||
end | |||
end | |||
add('<div class="', args.titleclass, '" style="font-size:110%;">') | |||
add(args.title) | |||
add('</div></th></tr>') | |||
end | |||
function renderAboveRow(args) | |||
if not args.above then return end | |||
if args.title then add(gutterRow) end | |||
add('<tr><td class="navbox-abovebelow ', args.aboveclass, '" style="', args.basestyle, ';', args.abovestyle, '" colspan="', getAboveBelowColspan(args), '">') | |||
add('<div>', args.above, '</div></td></tr>') | |||
end | |||
function renderBelowRow(args) | |||
if args.below then | |||
if args.title or args.above or #listnums > 0 then add(gutterRow) end | |||
add('<tr><td class="navbox-abovebelow ', args.belowclass, '" style="', args.basestyle, ';', args.belowstyle, '" colspan="', getAboveBelowColspan(args), '">') | |||
add('<div>', args.below, '</div></td></tr>') | |||
end | |||
end | |||
function getAboveBelowColspan(args) | |||
local ret = 2 | |||
if args.imageleft then ret = ret + 1 end | |||
if args.image then ret = ret + 1 end | |||
return ret | |||
end | |||
function renderFirstListRow(args) | |||
if not args.list1 then return end | |||
if args.title or args.above then add(gutterRow) end | |||
add('<tr>') | |||
if args.imageleft then | |||
add('<td class="navbox-image ', args.imageclass, '" style="width:0%;padding:0px 2px 0px 0px;', args.imageleftstyle, '"') | |||
add(' rowspan=', (2 * #listnums - 1), '><div>', args.imageleft, '</div></td>') | |||
end | |||
if args.group1 then | |||
add('<th scope="row" class="navbox-group ', args.groupclass, '" style="', args.basestyle, ';') | |||
if args.groupwidth then add('width:', args.groupwidth, ';') end | |||
add(args.groupstyle, ';', args.group1style, '">') | |||
add(args.group1, '</th>') | |||
add('<td style="text-align:left;border-left-width:2px;border-left-style:solid;') | |||
else | |||
add('<td colspan=2 style="') | |||
end | |||
if not args.groupwidth then add('width:100%;') end | |||
add('padding:0px;', args.liststyle, ';', args.oddstyle, ';', args.list1style, '" class="navbox-list navbox-') | |||
if args.evenodd == 'swap' then | |||
add('even') | |||
else | |||
add(args.evenodd or 'odd') | |||
end | |||
add(' ', args.listclass, '">') | |||
add('<div style="padding:', args.list1padding or args.listpadding or '0em 0.25em', '">') | |||
add(args.list1) | |||
add('</div></td>') | |||
if args.image then | |||
add('<td class="navbox-image ', args.imageclass, '" style="width:0%;padding:0px 0px 0px 2px;', args.imagestyle, '" ') | |||
add(' rowspan=', (2 * #listnums - 1), '>') | |||
add('<div>', args.image, '</div></td>') | |||
end | |||
add('</tr>') | |||
end | |||
function renderNthListRow(args, listnum) | |||
if args.title or args.above or args.list1 then | if args.title or args.above or args.list1 then | ||
add(gutterRow) | add(gutterRow) | ||
Line 76: | Line 177: | ||
add(';', args.innerstyle, ';">') | add(';', args.innerstyle, ';">') | ||
renderTitleRow(args) | |||
renderAboveRow(args) | |||
renderFirstListRow(args) | |||
-- render lists 2 through N | -- render lists 2 through N | ||
for i, listnum in ipairs(listnums) do | for i, listnum in ipairs(listnums) do | ||
if listnum > 1 then | if listnum > 1 then | ||
renderNthListRow(args, listnum) | |||
end | end | ||
end | end | ||
renderBelowRow(args) | |||
add('</table>') | add('</table>') |
Revision as of 08:49, 25 February 2013
This Lua module is used on approximately 4,150,000 pages, or roughly 61110% of all pages. To avoid major disruption and server load, any changes should be tested in the module's /sandbox or /testcases subpages, or in your own module sandbox. The tested changes can be added to this page in a single edit. Consider discussing changes on the talk page before implementing them. |
This module is subject to page protection. It is a highly visible module in use by a very large number of pages, or is substituted very frequently. Because vandalism or mistakes would affect many pages, and even trivial editing might cause substantial load on the servers, it is protected from editing. |
This module depends on the following other modules: |
Related pages |
---|
This module implements the {{Navbox}} template. Please see the template page for usage instructions.
Tracking/maintenance categories
- Category:Navigational boxes without horizontal lists (1)
- Category:Navboxes using background colours (18)
- Category:Potentially illegible navboxes (0)
- Category:Navboxes using borders (0)
--
-- This module will implement {{Navbox}}
--
local p = {}
local gutterRow = '<tr style="height:2px;"><td></td></tr>'
local ret = {}
function add(...)
for i, s in ipairs({...}) do
if s then
table.insert(ret, s)
end
end
end
function renderTitleRow(args)
if not args.title then return end
add('<tr>')
if args.titlegroup then
add('<th scope="row" class="navbox-group ', args.titlegroupclass, '" style="', args.basestyle, ';', args.groupstyle, ';', args.titlegroupstyle, '">', args.titlegroup, '</th><th scope="col" style="border-left:2px solid #fdfdfd;width:100%;')
else
add('<th scope="col" style="')
end
local colspan = 2
if args.imageleft then colspan = colspan + 1 end
if args.image then colspan = colspan + 1 end
if args.titlegroup then colspan = colspan - 1 end
add(args.basestyle, ';', args.titlestyle, '" class="navbox-title" colspan=', colspan, '>')
local stateLinkPlaceholder = '<span style="float:right;width:6em;"> </span>'
if args.navbar == 'plain' or args.navbar == 'off' or (not args.name and (border == 'subgroup' or border == 'child' or border == 'none')) then
if args.navbar == 'off' then
if args.state == 'plain' then add(stateLinkPlaceholder) end
else
if args.state ~= 'plain' then add(stateLinkPlaceholder) end
end
else
if args.name then
add(mw.getCurrentFrame():expandTemplate{ title = 'navbar', args = {
args.name,
mini = 1,
fontstyle = (args.basestyle or '') .. ';' .. (args.titlestyle or '') .. ';background:none transparent;border:none;'
}})
else
add('<span class="error" style="float:left;white-space:nowrap;">Error: No name provided</span>')
if args.state == 'plain' then add(stateLinkPlaceholder) end
end
end
add('<div class="', args.titleclass, '" style="font-size:110%;">')
add(args.title)
add('</div></th></tr>')
end
function renderAboveRow(args)
if not args.above then return end
if args.title then add(gutterRow) end
add('<tr><td class="navbox-abovebelow ', args.aboveclass, '" style="', args.basestyle, ';', args.abovestyle, '" colspan="', getAboveBelowColspan(args), '">')
add('<div>', args.above, '</div></td></tr>')
end
function renderBelowRow(args)
if args.below then
if args.title or args.above or #listnums > 0 then add(gutterRow) end
add('<tr><td class="navbox-abovebelow ', args.belowclass, '" style="', args.basestyle, ';', args.belowstyle, '" colspan="', getAboveBelowColspan(args), '">')
add('<div>', args.below, '</div></td></tr>')
end
end
function getAboveBelowColspan(args)
local ret = 2
if args.imageleft then ret = ret + 1 end
if args.image then ret = ret + 1 end
return ret
end
function renderFirstListRow(args)
if not args.list1 then return end
if args.title or args.above then add(gutterRow) end
add('<tr>')
if args.imageleft then
add('<td class="navbox-image ', args.imageclass, '" style="width:0%;padding:0px 2px 0px 0px;', args.imageleftstyle, '"')
add(' rowspan=', (2 * #listnums - 1), '><div>', args.imageleft, '</div></td>')
end
if args.group1 then
add('<th scope="row" class="navbox-group ', args.groupclass, '" style="', args.basestyle, ';')
if args.groupwidth then add('width:', args.groupwidth, ';') end
add(args.groupstyle, ';', args.group1style, '">')
add(args.group1, '</th>')
add('<td style="text-align:left;border-left-width:2px;border-left-style:solid;')
else
add('<td colspan=2 style="')
end
if not args.groupwidth then add('width:100%;') end
add('padding:0px;', args.liststyle, ';', args.oddstyle, ';', args.list1style, '" class="navbox-list navbox-')
if args.evenodd == 'swap' then
add('even')
else
add(args.evenodd or 'odd')
end
add(' ', args.listclass, '">')
add('<div style="padding:', args.list1padding or args.listpadding or '0em 0.25em', '">')
add(args.list1)
add('</div></td>')
if args.image then
add('<td class="navbox-image ', args.imageclass, '" style="width:0%;padding:0px 0px 0px 2px;', args.imagestyle, '" ')
add(' rowspan=', (2 * #listnums - 1), '>')
add('<div>', args.image, '</div></td>')
end
add('</tr>')
end
function renderNthListRow(args, listnum)
if args.title or args.above or args.list1 then
add(gutterRow)
end
add('<tr>')
if args['group' .. listnum] then
add('<th scope="row" class="navbox-group ', args.groupclass, '" style="', args.basestyle, ';')
if args.groupwidth then add('width:', args.groupwidth, ';') end
add(args.groupstyle, ';', args['group' .. listnum .. 'style'], '">')
add(args['group' .. listnum])
add('</th><td style="text-align:left;border-left-width:2px;border-left-style:solid;')
else
add('<td colspan=2 style="')
end
if not args.groupwidth then add('width:100%;') end
local isOdd = (listnum % 2) == 1
local rowstyle = args.evenstyle
if isOdd then rowstyle = args.oddstyle end
add('padding:0px;', args.liststyle, ';', rowstyle, ';', args['list' .. listnum .. 'style'], '" ')
add('class="navbox-list navbox-')
if args.evenodd == 'swap' then
if isOdd then add('even') else add('odd') end
else
if isOdd then add(args.evenodd or 'odd') else add(args.evenodd or 'even') end
end
add(' ', args.listclass, '">')
add('<div style="padding:', args.listpadding or '0em 0.25em', '">', args['list' .. listnum], '</div></td></tr>')
end
function p._navbox(args)
local listnums = {}
for k, v in pairs(args) do
local listnum = k:match('^list(%d+)$')
if listnum then table.insert(listnums, tonumber(listnum)) end
end
table.sort(listnums)
local border = args.border or args[1]
if border == 'subgroup' or border == 'child' then
add('</div>')
elseif border ~= 'none' then
add('<table cellspacing="0" class="navbox" style="border-spacing:0;', args.bodystyle, ';', args.style, '"><tr><td style="padding:2px;">')
end
add('<table cellspacing="0" class="nowraplinks ', args.bodyclass, ' ')
if args.title and (args.state ~= 'plain' and args.state ~= 'off') then
add('collapsible ', args.state or 'autocollapse', ' ')
end
if border == 'subgroup' or border == 'child' or border == 'none' then
add('navbox-subgroup" style="border-spacing:0;', args.bodystyle, ';', args.style)
else
add('navbox-inner" style="border-spacing:0;background:transparent;color:inherit')
end
add(';', args.innerstyle, ';">')
renderTitleRow(args)
renderAboveRow(args)
renderFirstListRow(args)
-- render lists 2 through N
for i, listnum in ipairs(listnums) do
if listnum > 1 then
renderNthListRow(args, listnum)
end
end
renderBelowRow(args)
add('</table>')
if border == 'subgroup' or border == 'child' then
add('<div>')
elseif border ~= 'none' then
add('</td></tr></table>')
end
-- TODO: add tracking categories
return table.concat(ret, '')
end
function p.navbox(frame)
return p._navbox(frame:getParent().args)
end
return p