mNo edit summary |
mNo edit summary |
||
Line 274: | Line 274: | ||
headercell:tag('div') |
headercell:tag('div') |
||
:css('padding', listpadding) |
:css('padding', listpadding) |
||
− | :wikitext('') |
+ | :wikitext('a') |
local headertable = headercell:tag('table') |
local headertable = headercell:tag('table') |
||
Line 302: | Line 302: | ||
_addGutter(headertable) |
_addGutter(headertable) |
||
− | if args.evenodd == 'swap' then |
+ | --if args.evenodd == 'swap' then |
− | alt = true |
+ | -- alt = true |
− | end |
+ | --end |
listrow = headertable:tag('tr') |
listrow = headertable:tag('tr') |
||
Line 336: | Line 336: | ||
end |
end |
||
− | if not withcollapsiblegroups and args.listclass then listcell:addClass(args.listclass) end |
+ | if not args.withcollapsiblegroups and args.listclass then listcell:addClass(args.listclass) end |
if args.liststyle then listcell:cssText(args.liststyle) end |
if args.liststyle then listcell:cssText(args.liststyle) end |
||
if args['list' .. num .. 'style'] then listcell:cssText(args['list' .. num .. 'style']) end |
if args['list' .. num .. 'style'] then listcell:cssText(args['list' .. num .. 'style']) end |
Revision as of 03:19, 27 December 2019
Description
This module is the Lua back-end for {{Navbox}}.
Usage
{{#invoke:Navbox|main|<parameter list>}}
For parameter details see Template:Navbox/doc
--------------------------------------------------------------------
--<pre> Navbox Module
--
-- * Fully CSS styled (inline styles possible but not default)
-- * Supports unlimited rows
-- * Supports collapsible groups (just set parameter withcollapsiblegroups)
--
-- By User:Effan_R from disneymagickingdomswiki.fandom.com
-- Adapted from Navbox Module by User:Tjcool007 from layton.wikia.com
--------------------------------------------------------------------
local p = {}
local args = {} -- Arguments passed to template
local navbox -- Actual navbox
local rownums = {}
local hasrows, alt, altg, isChild = false, false, false, false
local cimage, cimageleft
local colspan, rowspan
local spacer = false
------------------------------------------------
-- Title
------------------------------------------------
--- Processes the VDE links in the title
--
-- @param titlecell The table cell of the title
local function processVde( titlecell )
if not args.name then return end
titlecell:wikitext(mw.getCurrentFrame():expandTemplate({
title = 'Navbar',
args = { args.name,
['fontstyle'] = (args.basestyle or '') .. ';' .. (args.titlestyle or '') .. ';border:none;',
['mini'] = 1
}
}))
end
--- Processes the main title row
local function processTitle()
-- Nothing to do if no title --
if not args.title then return end
local titleRow = navbox:tag('tr')
if args.titlegroup then
titleRow:tag('td')
:addClass('navbox-group')
:wikitext(args.titlegroup)
if args.titlegroupstyle then titlerow:cssText(args.titlegroupstyle) end
end
local titleCell = titleRow:tag('th')
if args.titlegroup then
titleCell:css('border-left', '2px solid #fdfdfd')
:css('width', '100%')
end
titleCell:addClass('navbox-title')
:attr('colspan', colspan)
if args.basestyle then titleCell:cssText(args.basestyle) end
if args.titlestyle then titleCell:cssText(args.titlestyle) end
local titlebar = titleCell:tag('div')
titlebar:css('width', '6em')
if not args.name and isChild or args.navbar == 'plain' or args.navbar == 'off' then
if args.navbar == 'off' then
if args.state == 'plain' then
titlebar:css('float', 'right')
:wikitext(' ')
end
else
if args.state ~= 'plain' then
titlebar:css('float', 'left')
:css('text-align', 'left')
:wikitext(' ')
end
end
else
titlebar:css('float', 'left')
:css('text-align', 'left')
processVde(titlebar)
end
titleCell
:tag('span')
:addClass(args.titleclass)
:css('font-size', (isChild and '100%' or '110%'))
:wikitext(args.title)
spacer = true
end
--- Processes the group title row
local function processGroupTitle(parent, num)
-- Nothing to do if no group # --
if not args['group' .. num] then return end
local titleRow = parent:tag('tr')
local titleCell = titleRow:tag('th')
titleCell:addClass('navbox-title')
:attr('colspan', colspan)
if args.basestyle then titleCell:cssText(args.basestyle) end
if args.groupstyle then titleCell:cssText(args.groupstyle) end
if args['group' .. num .. 'style'] then
titleCell:cssText(args['group' .. num .. 'style'])
end
local titlebar = titleCell:tag('div')
titlebar:css('width', '6em')
:css('float', 'left')
:css('text-align', 'left')
:wikitext(' ')
titleCell
:tag('span')
:css('font-size', '100%')
:wikitext(args['group' .. num])
spacer = true
end
------------------------------------------------
-- Gutter
------------------------------------------------
--- Add gutter between rows
--
-- @param parent node, inRowspan to increment image rowspan
local function _addGutter( parent, incRowspan )
if spacer then
local gutterCell = parent:tag('tr'):css('height', '2px')
gutterCell:tag('td')
end
if incRowspan then
rowspan = rowspan + 1
end
spacer = false
end
------------------------------------------------
-- Above/Below
------------------------------------------------
--- Processes the above and below rows
--
-- @param rowtype Either 'above' or 'below'
local function processAboveBelow( rowtype )
if not args[rowtype] then return end
local abrow = mw.html.create('tr')
local abcell = mw.html.create('td')
abcell:addClass('navbox-abovebelow')
:attr('colspan', colspan)
if args[rowtype .. 'class'] then abcell:addClass(args[rowtype .. 'class']) end
if args.basestyle then abcell:cssText(args.basestyle) end
if args[rowtype .. 'style'] then abcell:cssText(args[rowtype .. 'style']) end
abcell:tag('div')
:wikitext(args[rowtype])
abrow:node(abcell)
_addGutter( navbox )
navbox:node( abrow )
spacer = true
end
------------------------------------------------
-- Main Rows
------------------------------------------------
--- Processes the images
local function _processImage(row, imgtype)
if not args[imgtype] then return end
local imagecell = row:tag('td')
:addClass('navbox-image')
imagecell:css('width', '0%')
:css('padding', '0px 0px 0px 2px')
if args.imageclass then imagecell:addClass(args.imageclass) end
if args.imagestyle then imagecell:cssText(args.imagestyle) end
local imagediv = imagecell:tag('div')
:wikitext(args[imgtype])
if imgtype == 'image' then
cimage = imagecell
else
cimageleft = imagecell
end
end
--- Handles Odd Even Groups
--
-- @return Alternatingly returns true (odd) or false (even). Returns fixed value of
-- true (odd) or false (even) if specified by args.evenodd
local function _evenoddGroup()
if args.evenodd == 'even' then return false end
if args.evenodd == 'odd' then return true end
altg = not altg
return altg
end
--- Handles Odd Even rows
--
-- @return Alternatingly returns true (odd) or false (even). Returns fixed value of
-- true (odd) or false (even) if specified by args.evenodd
local function _evenoddRow()
if args.evenodd == 'even' then return false end
if args.evenodd == 'odd' then return true end
alt = not alt
return alt
end
--- Processes a single list row
--
-- @param num Number of the row to be processed
local function processList(num)
if not args['list'..num] then return end
local row = mw.html.create('tr')
local listrow
if not hasrows then
_processImage(row, 'imageleft')
end
local listpadding = args['list' .. num .. 'padding'] or args.listpadding or '0em 0.25em'
if args['group'..num] then
if args.withcollapsiblegroups then
-- convert Group to collapsible title row --
_addGutter(navbox)
local altGroup = _evenoddGroup()
local headercell = row:tag('td')
:addClass('navbox-list')
:attr('colspan', 2)
:css('padding', '0px')
if altGroup then
headercell:addClass('navbox-odd')
if args.oddstyle then headercell:cssText(args.oddstyle) end
else
headercell:addClass('navbox-even')
if args.evenstyle then headercell:cssText(args.evenstyle) end
end
if args.listclass then headercell:addClass(args.listclass) end
if args.liststyle then headercell:cssText(args.liststyle) end
if args['list' .. num .. 'style'] then headercell:cssText(args['list' .. num .. 'style']) end
if not args.groupwidth then headercell:css('width', '100%') end
headercell:tag('div')
:css('padding', listpadding)
:wikitext('a')
local headertable = headercell:tag('table')
headertable:addClass('navbox-subgroup')
if args.bodystyle then headertable:cssText(args.bodystyle) end
if args.style then headertable:cssText(args.style) end
headertable:addClass('nowraplinks')
:addClass('mw-collapsible')
:attr('cellspacing', '0')
:attr('data-expandtext', 'show')
:attr('data-collapsetext', 'hide')
:css('border-spacing', 0)
if args.bodyclass then headertable:addClass(args.bodyclass) end
if args.innerstyle then headertable:cssText(args.innerstyle) end
if args.selected ~= args['abbr' .. num] then
if args['state' .. num] then
headertable:addClass(args['state' .. num])
else
headertable:addClass('mw-collapsed')
end
end
processGroupTitle(headertable, num)
_addGutter(headertable)
--if args.evenodd == 'swap' then
-- alt = true
--end
listrow = headertable:tag('tr')
else
local groupcell = row:tag('th')
:addClass('navbox-group')
:attr('scope','row')
:wikitext( args['group'..num] )
if args.groupclass then groupcell:addClass( args.groupclass ) end
if args.groupstyle then groupcell:cssText( args.groupstyle ) end
if args.basestyle then groupcell:cssText( args.basestyle ) end
if args['group' .. num .. 'style'] then groupcell:cssText(args['group' .. num .. 'style']) end
if args.groupwidth then groupcell:css('width', args.groupwidth) end
listrow = row
end
end
local altRow = _evenoddRow()
local listcell = listrow:tag('td')
:addClass('navbox-list')
:css('padding', '0px')
if altRow then
listcell:addClass('navbox-odd')
if args.oddstyle then listcell:cssText(args.oddstyle) end
else
listcell:addClass('navbox-even')
if args.evenstyle then listcell:cssText(args.evenstyle) end
end
if not args.withcollapsiblegroups and args.listclass then listcell:addClass(args.listclass) end
if args.liststyle then listcell:cssText(args.liststyle) end
if args['list' .. num .. 'style'] then listcell:cssText(args['list' .. num .. 'style']) end
if not args.groupwidth then listcell:css('width', '100%') end
if not args.withcollapsiblegroups and args['group'..num] then
listcell:css('text-align', 'left')
:css('border-left-width', '2px')
:css('border-left-style', 'solid')
else
listcell:attr('colspan',2)
end
listcell:tag('div')
:css('padding', listpadding)
:wikitext(args['list'..num])
local firstRow = false
if not hasrows then
firstRow = true
hasrows = true
_processImage(row, 'image')
end
_addGutter(navbox,not firstRow)
navbox:node( row )
rowspan = rowspan + 1
spacer = true
end
--- Processes all rows
local function processRows()
for i=1,#rownums do
processList(rownums[i])
end
if cimageleft then
cimageleft:attr('rowspan',rowspan)
end
if cimage then
cimage:attr('rowspan',rowspan)
end
end
------------------------------------------------
-- ARGUMENTS PREPROCESSOR
-- * Extracts arguments from frame and stores them in args table
-- * At the same time, checks for valid row numbers
------------------------------------------------
--- Preprocessor for the arguments.
-- Will fill up the args table with the parameters from the frame grouped by their type.
--
-- @param frame The frame passed to the Module.
local function preProcessArgs(frame)
local tmp = {}
if frame == mw.getCurrentFrame() then
tmp = frame:getParent().args
else
tmp = frame
end
-- Storage tables
local nums = {}
-- Loop over all the args
for k,v in pairs(tmp) do
-- Skip empty args, which are useless
if v ~= '' then
local cat,num = tostring(k):match('^(%a+)([1-9]%d*)$')
if cat == 'list' then
nums[num] = true
end
args[k] = v -- Simple copy
end
end
colspan = args.image and 3 or 2
if args.imageleft then colspan = colspan + 1 end
if args.titlegroup then colspan = colspan - 1 end
rowspan = 0
if args.evenodd == 'swap' then
alt = true
altgroup = true
end
for k, v in pairs(nums) do
rownums[#rownums+1] = tonumber(k)
end
table.sort(rownums)
end
------------------------------------------------
-- MAIN FUNCTIONS
------------------------------------------------
--- Processes the arguments to create the navbox.
--
-- @return A string with HTML that is the navbox.
local function _navbox()
-- Create the root HTML element
local trim = function(s)
return s and mw.ustring.gsub(s, "^%s*(.-)%s*$", "%1") or ''
end
local border = args.border or trim(args[1]) or ''
isChild = (border == 'child' or border == 'subgroup' or border == 'none')
if isChild then
navbox = mw.html.create('table')
navbox:addClass('navbox-subgroup')
:cssText(args.bodystyle)
:cssText(args.style)
else
navbox = mw.html.create('table')
navbox:addClass('navbox-inner')
:css('background', 'transparent')
:css('color', 'inherit')
end
navbox:addClass('nowraplinks')
:addClass(args.bodyclass)
:attr('cellspacing', '0')
:attr('data-expandtext', 'show')
:attr('data-collapsetext', 'hide')
:css('border-spacing', 0)
:cssText(args.innerstyle)
if args.title then
if args.state ~= 'plain' and args.stat ~= 'off' then
navbox:addClass('mw-collapsible')
navbox:addClass(args.state)
end
end
-- Process...
spacer = false
processTitle()
processAboveBelow('above')
processRows()
processAboveBelow('below')
-- Wrapper Table --
if not isChild then
local wrapper = mw.html.create('table')
wrapper:addClass('navbox')
:attr('cellspacing', '0')
:css('border-spacing', 0)
:cssText(args.bodystyle)
:cssText(args.style)
:tag('tr')
:tag('td')
:css('padding', '2px')
:node(navbox)
return tostring(wrapper)
else
local wrapper = mw.html.create('')
wrapper:wikitext('</div>')
wrapper:node(navbox)
wrapper:wikitext('<div>')
return tostring(wrapper)
end
end
--- Main module entry point.
-- To be called with {{#invoke:navbox|main}} or directly from another module.
--
-- @param frame The frame passed to the module via the #invoke. If called from another
-- module directly, this should be a table with the parameter definition.
function p.main(frame)
-- Save the arguments in a local variable so other functions can use them.
preProcessArgs(frame)
return _navbox()
end
return p