Open main menu

Changes

Module:Sidebar

749 bytes added, 01:33, 10 September 2019
m
28 revisions imported
-- This module implements {{Sidebar}}
--
require('Module:No globals') 
local p = {}
local HtmlBuilder = require('Module:HtmlBuilder')
local Navbar = require('Module:Navbar')
local function _sidebar(args)
local root = HtmlBuilder.create('table')
root
.addClass('vertical-navbox')
.addClass(args.wraplinks ~= 'true' and 'nowraplinks')
.addClass(args.bodyclass or args.class)
.attr('cellspacing', args.cellspacing or 5)
.attr('cellpadding', args.cellpadding or 0)
.css('float', args.float or 'right')
.css('clear', (args.float == 'none' and 'both') or args.float or 'right')
.css('width', args.width or '22.0em')
.css('margin', args.float == 'left' and '0 1.0em 1.0em 0' or '0 0 1.0em 1.0em')
.css('background', '#f9f9f9')
.css('border', '1px solid #aaa')
.css('padding', '0.2em')
.css('border-spacing', '0.4em 0')
.css('text-align', 'center')
.css('line-height', '1.4em')
.css('font-size', '88%')
.cssText(args.bodystyle or args.style)
local getArgs = require('Module:Arguments').getArgslocal navbar = require('Module:Navbar')._navbar local function trimAndAddAutomaticNewline(s) -- For compatibility with the original {{sidebar with collapsible lists}} -- implementation, which passed some parameters through {{#if}} to trim -- their whitespace. This also triggered the automatic newline behavior. -- ([[meta:Help:Newlines and spaces#Automatic newline]]) s = mw.ustring.gsub(s, "^%s*(.-)%s*$", "%1") if mw.ustring.find(s, '^[#*:;]') or mw.ustring.find(s, '^{|') then return '\n' .. s else return s endend local function hasSubgroup(s) if mw.ustring.find(s, 'vertical%-navbox%-subgroup') then return true else return false endend function p.sidebar(frame, args) if not args then args = getArgs(frame) end local root = mw.html.create() local child = args.child and mw.text.trim(args.child) == 'yes'  root = root:tag('table') if not child then root :addClass('vertical-navbox') :addClass(args.wraplinks ~= 'true' and 'nowraplinks' or nil) :addClass(args.bodyclass or args.class) :css('float', args.float or 'right') :css('clear', (args.float == 'none' and 'both') or args.float or 'right') :css('width', args.width or '22.0em') :css('margin', args.float == 'left' and '0 1.0em 1.0em 0' or '0 0 1.0em 1.0em') :css('background', '#f9f9f9') :css('border', '1px solid #aaa') :css('padding', '0.2em') :css('border-spacing', '0.4em 0') :css('text-align', 'center') :css('line-height', '1.4em') :css('font-size', '88%') :cssText(args.bodystyle or args.style)  if args.outertitle then root . :tag('caption') . :addClass(args.outertitleclass) . :css('padding-bottom', '0.2em') . :css('font-size', '125%') . :css('line-height', '1.2em') . :css('font-weight', 'bold') :cssText(args.outertitlestyle) :wikitext(args.outertitle) end  if args.topimage then local imageCell = root:tag('tr'):tag('td')  imageCell :addClass(args.topimageclass) :css('padding', '0.4em 0') :cssText(args.topimagestyle) :wikitext(args.topimage)  if args.topcaption then imageCell :tag('div') :css('padding-top', '0.2em') :css('line-height', '1.2em') :cssText(args.outertitlestyletopcaptionstyle) :wikitext(args.topcaption) end end  if args.pretitle then root :tag('tr') :tag('td') :addClass(args.pretitleclass) :cssText(args.basestyle) :css('padding-top', args.topimage and '0.2em' or '0.4em') :css('line-height', '1.2em') :cssText(args.pretitlestyle) :wikitext(args.pretitle) end else root :addClass('vertical-navbox-subgroup') :css('width', '100%') :css('margin', '0px') :css('border-spacing', '0px') :addClass(args.bodyclass or args.class) :cssText(args.bodystyle or args.style) end  if args.title then if child then root :wikitext(args.title) else root :tag('tr') :tag('th') :addClass(args.titleclass) :cssText(args.basestyle) :css('padding', '0.2em 0.4em 0.2em') :css('padding-top', args.pretitle and 0) :css('font-size', '145%') :css('line-height', '1.2em') :cssText(args.titlestyle) :wikitext(args.outertitletitle) end end  if args.image then local imageCell = root:tag('tr'):tag('td')  imageCell :addClass(args.imageclass) :css('padding', '0.2em 0 0.4em') :cssText(args.imagestyle) :wikitext(args.image)
if args.topimage caption then local imageCell = root.tag('tr').tag('td') imageCell .addClass(args.topimageclass) .css('padding', '0.4em 0') .cssText(args.topimagestyle) .wikitext(args.topimage) if args.topcaption then imageCell . :tag('div') . :css('padding-top', '0.2em') . :css('line-height', '1.2em') . :cssText(args.topcaptionstylecaptionstyle) . :wikitext(args.topcaptioncaption) end end if args.pretitle then root .tag('tr') .tag('td') .addClass(args.pretitleclass) .cssText(args.basestyle) .css('padding-top', args.topimage and '0.2em' or '0.4em') .css('line-height', '1.2em') .cssText(args.pretitlestyle) .wikitext(args.pretitle) end
if args.title above then root . :tag('tr') . :tag('thtd') . :addClass(args.titleclassaboveclass) .cssText(args.basestyle) . :css('padding', '0.2em 3em 0.4em 0.2em3em') .css('padding-top', args.pretitle and 0) . :css('font-sizeweight', '145%bold') .css :cssText('line-height', '1args.2em'abovestyle) .cssText :newline(args.titlestyle)-- newline required for bullet-points to work . :wikitext(args.titleabove) end
if args.image then local imageCell rowNums = root.tag('tr').tag('td'){} imageCell .addClass for k, v in pairs(args.imageclass)do .css('padding k = ', '0.2em 0 0.4em')k .cssText local num = k:match(args.imagestyle) .wikitext'^heading(args.image%d+) if args.caption then imageCell .tag('div$') .cssor k:match('padding-top', '0.2em^content(%d+)$') if num then table.cssinsert('line-height'rowNums, '1.2em') .cssTexttonumber(args.captionstylenum) .wikitext(args.caption) end end if args.above then root table.tagsort('tr'rowNums) .tag -- remove duplicates from the list ('td') e.addClass(argsg.aboveclass3 will be duplicated if both heading3 and content3 are specified) .css('padding' for i = #rowNums, 1, '0.3em 0.4em 0.3em')-1 do .css('font if rowNums[i] == rowNums[i -weight', 'bold')1] then table.cssTextremove(args.abovestylerowNums, i) .newline() -- newline required for bullet-points to work .wikitext(args.above) end end
local rowNums = {} for ki, v num in pairsipairs(argsrowNums) do k local heading = args['heading' .. knum] if heading then root local num = k :matchtag('^heading(%d+)$tr') or k :matchtag('^content(%d+)$th') if num then table :addClass(args.insertheadingclass) :css(rowNums'padding', tonumber(num)'0.1em') end end table :cssText(args.sort(rowNumsbasestyle) -- remove duplicates from the list :cssText(eargs.g. 3 will be duplicated if both heading3 and content3 are specifiedheadingstyle) for i = #rowNums, 1, -1 do if rowNums :cssText(args[i'heading' .. num .. 'style'] == rowNums[i - 1] then) table.remove :newline(rowNums, i) end :wikitext(heading) end
for i, num in ipairs(rowNums) do local heading content = args['headingcontent' .. num] if heading content then root . :tag('tr') . :tag('thtd') . :addClass(args.headingclasscontentclass) . :css('padding', '0.1em') .cssText(args.basestyle) .cssTexthasSubgroup(args.headingstyle) .cssText(args['heading' .. num .. 'style']) .wikitext(heading) end local content = args['content' .. num] if content then root .tag('tr') .tag(and 'td') 0.addClass(args.contentclass) 1em 0 0.css('padding2em', or '0 0.1em 0.4em') . :cssText(args.contentstyle) . :cssText(args['content' .. num .. 'style']) . :newline() . :wikitext(content) :done() :newline() -- Without a linebreak after the </td>, a nested list like "* {{hlist| ...}}" doesn't parse correctly. end end
if args.below then root . :tag('tr') . :tag('td') . :addClass(args.belowclass) . :css('padding', '0.3em 0.4em 0.3em') . :css('font-weight', 'bold') . :cssText(args.belowstyle) . :newline() . :wikitext(args.below) end
if not child then local navbarArg = args.navbar or args.tnavbar if navbarArg ~= 'none' and navbarArg ~= 'off' and (args.name or frame:getParent():getTitle():gsub('/sandbox$', '') ~= 'Template:Sidebar') then root . :tag('tr') . :tag('td') . :css('text-align', 'right') . :css('font-size', '115%') . :cssText(args.navbarstyle or args.tnavbarstyle) . :wikitext(Navbar.navbar({ args.name or mw.title.getCurrentTitle().fullText, mini = 1, fontstyle = args.navbarfontstyle or args.tnavbarfontstyle })) end end
return tostring(root) .. (child and '[[Category:Pages using sidebar with the child parameter]]' or '')
end
function p.sidebarcollapsible(frame) local origArgsargs = getArgs(frame)  if frame args.abovestyle == mw'border-top: 1px solid #aaa; border-bottom: 1px solid #aaa;' ..getCurrentFrame(args.abovestyle or '') then args.belowstyle = 'border-top: 1px solid #aaa; border- Webottom: 1px solid #aaa;'re being called via #invoke. If the invoking template passed any . (args, use.belowstyle or '') args.navbarstyle = 'padding-- themtop: 0.6em;' .. (args. Otherwise, use the navbarstyle or args that were passed into the template.tnavbarstyle or '') origArgs = if not args.name and frame:getParent():getTitle():gsub('/sandbox$', '') == 'Template:Sidebar with collapsible lists' then args.argsnavbar = 'none' end  local contentArgs = {}  for k, v in pairs(frame.args) do origArgs local num = string.match(k, '^list(%d+)$') if num then local expand = frameargs.expanded and (args.expanded == 'all' or args.expanded == args['list' .. num .. 'name'])  break local row = mw.html.create('div') end row else :addClass('NavFrame') -- We :addClass((not expand) and 'collapsed're being called from another module or from the debug consolenil) :css('border', so assume'none') -- the :css('padding', 0) :cssText(args.listframestyle) :cssText(args are passed in directly['list' .. num ..'framestyle']) origArgs = frame :tag('div') end :addClass('NavHead') :addClass(args.listtitleclass) :css('font-size', '105%') :css('background', 'transparent') :css('text- ParserFunctions considers the empty string to be falsealign', so to preserve the previous 'left') :cssText(args.basestyle) :cssText(args.listtitlestyle) :cssText(args['list' .. num .. 'titlestyle']) :wikitext(trimAndAddAutomaticNewline(args['list' .. num .. 'title'] or 'List')) :done() :tag('div') :addClass('NavContent') :addClass(args.listclass) :addClass(args['list' .. num .. 'class']) :css('font-- behavior of the templatesize', change any empty arguments to nil'105%') :css('padding', so Lua will consider'0.2em 0 0.4em') :css('text-- them false tooalign', 'center') :cssText(args.liststyle) :cssText(args['list' .. num ..'style']) local :wikitext(trimAndAddAutomaticNewline(args ['list' .. num]))  contentArgs['content' .. num] = {}tostring(row) end end  for k, v in pairs(origArgscontentArgs) do if v ~= '' then args[k] = v end end return _sidebarp.sidebar(frame, args)
end
return p