Editing Module:Sidebar
Warning: You are not logged in. Your IP address will be publicly visible if you make any edits. If you log in or create an account, your edits will be attributed to your username, along with other benefits.
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 2: | Line 2: | ||
-- This module implements {{Sidebar}} | -- This module implements {{Sidebar}} | ||
-- | -- | ||
− | + | ||
− | |||
local p = {} | local p = {} | ||
− | + | ||
− | local getArgs = require('Module: | + | local getArgs |
+ | local HtmlBuilder = require('Module:HtmlBuilder') | ||
local navbar = require('Module:Navbar')._navbar | local navbar = require('Module:Navbar')._navbar | ||
− | + | ||
local function trimAndAddAutomaticNewline(s) | local function trimAndAddAutomaticNewline(s) | ||
− | -- For compatibility with the original {{sidebar with collapsible lists}} | + | -- For compatibility with the original {{sidebar with collapsible lists}} |
-- implementation, which passed some parameters through {{#if}} to trim | -- implementation, which passed some parameters through {{#if}} to trim | ||
-- their whitespace. This also triggered the automatic newline behavior. | -- their whitespace. This also triggered the automatic newline behavior. | ||
Line 22: | Line 22: | ||
end | end | ||
− | function | + | local function _sidebar(args) |
− | + | local root = HtmlBuilder.create() | |
− | |||
− | |||
− | local root = | ||
local child = args.child and mw.text.trim(args.child) == 'yes' | local child = args.child and mw.text.trim(args.child) == 'yes' | ||
− | + | ||
if not child then | if not child then | ||
root = root | root = root | ||
− | + | .tag('table') | |
− | + | .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) | ||
+ | |||
if args.outertitle then | if args.outertitle then | ||
root | 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 | end | ||
− | + | ||
if args.topimage then | if args.topimage then | ||
− | local imageCell = root | + | local imageCell = root.tag('tr').tag('td') |
− | + | ||
imageCell | imageCell | ||
− | + | .addClass(args.topimageclass) | |
− | + | .css('padding', '0.4em 0') | |
− | + | .cssText(args.topimagestyle) | |
− | + | .wikitext(args.topimage) | |
− | + | ||
if args.topcaption then | if args.topcaption then | ||
imageCell | imageCell | ||
− | + | .tag('div') | |
− | + | .css('padding-top', '0.2em') | |
− | + | .css('line-height', '1.2em') | |
− | + | .cssText(args.topcaptionstyle) | |
− | + | .wikitext(args.topcaption) | |
end | end | ||
end | end | ||
− | + | ||
if args.pretitle then | if args.pretitle then | ||
root | 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 | end | ||
Line 96: | Line 95: | ||
if child then | if child then | ||
root | root | ||
− | + | .wikitext(args.title) | |
− | + | .tag('/th', {unclosed = true}) | |
+ | .tag('/tr', {unclosed = true}) | ||
else | else | ||
root | 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.title) | |
end | end | ||
end | end | ||
if args.image then | if args.image then | ||
− | local imageCell = root | + | local imageCell = root.tag('tr').tag('td') |
− | + | ||
imageCell | imageCell | ||
− | + | .addClass(args.imageclass) | |
− | + | .css('padding', '0.2em 0 0.4em') | |
− | + | .cssText(args.imagestyle) | |
− | + | .wikitext(args.image) | |
− | + | ||
if args.caption then | if args.caption then | ||
imageCell | imageCell | ||
− | + | .tag('div') | |
− | + | .css('padding-top', '0.2em') | |
− | + | .css('line-height', '1.2em') | |
− | + | .cssText(args.captionstyle) | |
− | + | .wikitext(args.caption) | |
end | end | ||
end | end | ||
− | + | ||
if args.above then | if args.above then | ||
root | root | ||
− | + | .tag('tr') | |
− | + | .tag('td') | |
− | + | .addClass(args.aboveclass) | |
− | + | .css('padding', '0.3em 0.4em 0.3em') | |
− | + | .css('font-weight', 'bold') | |
− | + | .cssText(args.abovestyle) | |
− | + | .newline() -- newline required for bullet-points to work | |
− | + | .wikitext(args.above) | |
end | end | ||
Line 162: | Line 162: | ||
if heading then | if heading then | ||
root | root | ||
− | + | .tag('tr') | |
− | + | .tag('th') | |
− | + | .addClass(args.headingclass) | |
− | + | .css('padding', '0.1em') | |
− | + | .cssText(args.basestyle) | |
− | + | .cssText(args.headingstyle) | |
− | + | .cssText(args['heading' .. num .. 'style']) | |
− | + | .newline() | |
− | + | .wikitext(heading) | |
end | end | ||
− | + | ||
local content = args['content' .. num] | local content = args['content' .. num] | ||
if content then | if content then | ||
root | root | ||
− | + | .tag('tr') | |
− | + | .tag('td') | |
− | + | .addClass(args.contentclass) | |
− | + | .css('padding', '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 | ||
end | end | ||
Line 191: | Line 191: | ||
if args.below then | if args.below then | ||
root | 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 | end | ||
if not child then | if not child then | ||
local navbarArg = args.navbar or args.tnavbar | local navbarArg = args.navbar or args.tnavbar | ||
− | if navbarArg ~= 'none' and navbarArg ~= 'off' | + | if navbarArg ~= 'none' and navbarArg ~= 'off' then |
root | root | ||
− | + | .tag('tr') | |
− | + | .tag('td') | |
− | + | .css('text-align', 'right') | |
− | + | .css('font-size', '115%') | |
− | + | .cssText(args.navbarstyle or args.tnavbarstyle) | |
− | + | .wikitext(navbar{ | |
args.name, | args.name, | ||
mini = 1, | mini = 1, | ||
Line 221: | Line 221: | ||
end | end | ||
− | function | + | function _collapsibleSidebar(args) |
− | |||
− | |||
args.abovestyle = 'border-top: 1px solid #aaa; border-bottom: 1px solid #aaa;' .. (args.abovestyle or '') | args.abovestyle = 'border-top: 1px solid #aaa; border-bottom: 1px solid #aaa;' .. (args.abovestyle or '') | ||
args.belowstyle = 'border-top: 1px solid #aaa; border-bottom: 1px solid #aaa;' .. (args.belowstyle or '') | args.belowstyle = 'border-top: 1px solid #aaa; border-bottom: 1px solid #aaa;' .. (args.belowstyle or '') | ||
args.navbarstyle = 'padding-top: 0.6em;' .. (args.navbarstyle or args.tnavbarstyle or '') | args.navbarstyle = 'padding-top: 0.6em;' .. (args.navbarstyle or args.tnavbarstyle or '') | ||
− | + | ||
− | |||
− | |||
− | |||
local contentArgs = {} | local contentArgs = {} | ||
− | + | ||
for k, v in pairs(args) do | for k, v in pairs(args) do | ||
− | local num = | + | local num = ('' .. k):match('^list(%d+)$') |
− | if num then | + | if num then |
local expand = args.expanded and (args.expanded == 'all' or args.expanded == args['list' .. num .. 'name']) | local expand = args.expanded and (args.expanded == 'all' or args.expanded == args['list' .. num .. 'name']) | ||
− | + | ||
− | local row = | + | local row = HtmlBuilder.create('div') |
row | row | ||
− | + | .addClass('NavFrame') | |
− | + | .addClass((not expand) and 'collapsed') | |
− | + | .css('border', 'none') | |
− | + | .css('padding', 0) | |
− | + | .cssText(args.listframestyle) | |
− | + | .cssText(args['list' .. num .. 'framestyle']) | |
− | + | .tag('div') | |
− | + | .addClass('NavHead') | |
− | + | .addClass(args.listtitleclass) | |
− | + | .css('font-size', '105%') | |
− | + | .css('background', 'transparent') | |
− | + | .css('text-align', '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-size', '105%') | |
− | + | .css('padding', '0.2em 0 0.4em') | |
− | + | .css('text-align', 'center') | |
− | + | .cssText(args.liststyle) | |
− | + | .cssText(args['list' .. num .. 'style']) | |
− | + | .wikitext(trimAndAddAutomaticNewline(args['list' .. num])) | |
− | + | ||
contentArgs['content' .. num] = tostring(row) | contentArgs['content' .. num] = tostring(row) | ||
end | end | ||
Line 275: | Line 270: | ||
args[k] = v | args[k] = v | ||
end | end | ||
− | + | ||
− | return | + | return _sidebar(args) |
+ | end | ||
+ | |||
+ | function makeWrapper(func) | ||
+ | return function(frame) | ||
+ | if not getArgs then | ||
+ | getArgs = require('Module:Arguments').getArgs | ||
+ | end | ||
+ | return func(getArgs(frame)) | ||
+ | end | ||
end | end | ||
− | return | + | return { |
+ | sidebar = makeWrapper(_sidebar), | ||
+ | collapsible = makeWrapper(_collapsibleSidebar) | ||
+ | } |