Editing Module:Sidebar
Appearance
The edit can be undone. Please check the comparison below to verify that this is what you want to do, and then publish the changes below to finish undoing the edit.
Latest revision | Your text | ||
Line 1: | Line 1: | ||
require | -- | ||
-- This module implements {{Sidebar}} | |||
-- | |||
require('Module:No globals') | |||
local p = {} | local p = {} | ||
local getArgs = require('Module:Arguments').getArgs | local getArgs = require('Module:Arguments').getArgs | ||
local navbar = require('Module:Navbar')._navbar | |||
local function trimAndAddAutomaticNewline(s) | 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") | s = mw.ustring.gsub(s, "^%s*(.-)%s*$", "%1") | ||
if mw.ustring.find(s, '^[#*:;]') or mw.ustring.find(s, '^{|') then | if mw.ustring.find(s, '^[#*:;]') or mw.ustring.find(s, '^{|') then | ||
Line 42: | Line 22: | ||
end | end | ||
function p.sidebar(frame, args) | |||
function p.sidebar(frame, args | |||
if not args then | if not args then | ||
args = getArgs(frame) | args = getArgs(frame) | ||
end | end | ||
local root = mw.html.create() | local root = mw.html.create() | ||
local child = args.child and mw.text.trim(args.child) == | local child = args.child and mw.text.trim(args.child) == 'yes' | ||
if not child then | if not child then | ||
root | root = root | ||
:tag('table') | |||
:addClass('vertical-navbox') | |||
:addClass(args.wraplinks ~= 'true' and 'nowraplinks' or nil) | |||
: | |||
:addClass( | |||
:addClass(args.wraplinks ~= | |||
:addClass(args.bodyclass or args.class) | :addClass(args.bodyclass or args.class) | ||
:css('width', args.width or | :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) | :cssText(args.bodystyle or args.style) | ||
Line 159: | Line 51: | ||
root | root | ||
:tag('caption') | :tag('caption') | ||
:addClass(args.outertitleclass) | :addClass(args.outertitleclass) | ||
:css('padding-bottom', '0.2em') | |||
:css('font-size', '125%') | |||
:css('line-height', '1.2em') | |||
:css('font-weight', 'bold') | |||
:cssText(args.outertitlestyle) | :cssText(args.outertitlestyle) | ||
:wikitext(args.outertitle) | :wikitext(args.outertitle) | ||
Line 169: | Line 64: | ||
imageCell | imageCell | ||
:addClass(args.topimageclass) | :addClass(args.topimageclass) | ||
:css('padding', '0.4em 0') | |||
:cssText(args.topimagestyle) | :cssText(args.topimagestyle) | ||
:wikitext(args.topimage) | :wikitext(args.topimage) | ||
Line 177: | Line 72: | ||
imageCell | imageCell | ||
:tag('div') | :tag('div') | ||
: | :css('padding-top', '0.2em') | ||
:css('line-height', '1.2em') | |||
:cssText(args.topcaptionstyle) | :cssText(args.topcaptionstyle) | ||
:wikitext(args.topcaption) | :wikitext(args.topcaption) | ||
Line 187: | Line 83: | ||
:tag('tr') | :tag('tr') | ||
:tag('td') | :tag('td') | ||
:addClass(args.pretitleclass) | :addClass(args.pretitleclass) | ||
:cssText(args.basestyle) | :cssText(args.basestyle) | ||
:css('padding-top', args.topimage and '0.2em' or '0.4em') | |||
:css('line-height', '1.2em') | |||
:cssText(args.pretitlestyle) | :cssText(args.pretitlestyle) | ||
:wikitext(args.pretitle) | :wikitext(args.pretitle) | ||
end | end | ||
end | end | ||
Line 205: | Line 97: | ||
root | root | ||
:wikitext(args.title) | :wikitext(args.title) | ||
:wikitext('</th></tr>') -- @todo replace this with unclosed again once mw.html gets it | |||
else | else | ||
root | root | ||
:tag('tr') | :tag('tr') | ||
:tag('th') | :tag('th') | ||
:addClass(args.titleclass) | :addClass(args.titleclass) | ||
:cssText(args.basestyle) | :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) | :cssText(args.titlestyle) | ||
:wikitext(args.title) | :wikitext(args.title) | ||
Line 222: | Line 117: | ||
imageCell | imageCell | ||
:addClass(args.imageclass) | :addClass(args.imageclass) | ||
:css('padding', '0.2em 0 0.4em') | |||
:cssText(args.imagestyle) | :cssText(args.imagestyle) | ||
:wikitext(args.image) | :wikitext(args.image) | ||
Line 230: | Line 125: | ||
imageCell | imageCell | ||
:tag('div') | :tag('div') | ||
: | :css('padding-top', '0.2em') | ||
:css('line-height', '1.2em') | |||
:cssText(args.captionstyle) | :cssText(args.captionstyle) | ||
:wikitext(args.caption) | :wikitext(args.caption) | ||
Line 240: | Line 136: | ||
:tag('tr') | :tag('tr') | ||
:tag('td') | :tag('td') | ||
:addClass(args.aboveclass) | :addClass(args.aboveclass) | ||
:css('padding', '0.3em 0.4em 0.3em') | |||
:css('font-weight', 'bold') | |||
:cssText(args.abovestyle) | :cssText(args.abovestyle) | ||
:newline() -- newline required for bullet-points to work | :newline() -- newline required for bullet-points to work | ||
Line 254: | Line 151: | ||
end | end | ||
table.sort(rowNums) | table.sort(rowNums) | ||
-- remove duplicates from the list (e.g. 3 will be duplicated if both heading3 | -- remove duplicates from the list (e.g. 3 will be duplicated if both heading3 and content3 are specified) | ||
for i = #rowNums, 1, -1 do | for i = #rowNums, 1, -1 do | ||
if rowNums[i] == rowNums[i - 1] then | if rowNums[i] == rowNums[i - 1] then | ||
Line 268: | Line 164: | ||
:tag('tr') | :tag('tr') | ||
:tag('th') | :tag('th') | ||
:addClass(args.headingclass) | :addClass(args.headingclass) | ||
: | :css('padding', '0.1em') | ||
:cssText(args.basestyle) | :cssText(args.basestyle) | ||
:cssText(args.headingstyle) | :cssText(args.headingstyle) | ||
Line 283: | Line 178: | ||
:tag('tr') | :tag('tr') | ||
:tag('td') | :tag('td') | ||
:addClass(args.contentclass) | :addClass(args.contentclass) | ||
: | :css('padding', '0 0.1em 0.4em') | ||
:cssText(args.contentstyle) | :cssText(args.contentstyle) | ||
:cssText(args['content' .. num .. 'style']) | :cssText(args['content' .. num .. 'style']) | ||
Line 292: | Line 185: | ||
:wikitext(content) | :wikitext(content) | ||
:done() | :done() | ||
:newline() -- Without a linebreak after the </td>, a nested list like "* {{hlist| ...}}" doesn't parse correctly. | |||
end | end | ||
end | end | ||
Line 302: | Line 193: | ||
:tag('tr') | :tag('tr') | ||
:tag('td') | :tag('td') | ||
:addClass(args.belowclass) | :addClass(args.belowclass) | ||
:css('padding', '0.3em 0.4em 0.3em') | |||
:css('font-weight', 'bold') | |||
:cssText(args.belowstyle) | :cssText(args.belowstyle) | ||
:newline() | :newline() | ||
Line 309: | Line 201: | ||
end | end | ||
if not child | 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{ | |||
args.name, | |||
mini = 1, | |||
fontstyle = args.navbarfontstyle or args.tnavbarfontstyle | |||
}) | |||
end | |||
end | end | ||
return | return tostring(root) | ||
end | end | ||
function p.collapsible(frame) | function p.collapsible(frame) | ||
local args = getArgs(frame) | local args = getArgs(frame) | ||
if not args.name and | |||
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.navbar = | args.navbarstyle = 'padding-top: 0.6em;' .. (args.navbarstyle or args.tnavbarstyle or '') | ||
if not args.name and frame:getParent():getTitle():gsub('/sandbox$', '') == 'Template:Sidebar with collapsible lists' then | |||
args.navbar = 'none' | |||
end | end | ||
local contentArgs = {} | local contentArgs = {} | ||
for k, v in pairs(args) do | for k, v in pairs(args) do | ||
local num = string.match(k, '^list(%d+)$') | local num = string.match(k, '^list(%d+)$') | ||
if num then | if num then | ||
local expand = args.expanded and | local expand = args.expanded and (args.expanded == 'all' or args.expanded == args['list' .. num .. 'name']) | ||
local row = mw.html.create('div') | local row = mw.html.create('div') | ||
row | row | ||
:addClass('NavFrame') | |||
:addClass(' | :addClass((not expand) and 'collapsed' or nil) | ||
:addClass((not expand) and ' | :css('border', 'none') | ||
: | :css('padding', 0) | ||
:cssText(args.listframestyle) | :cssText(args.listframestyle) | ||
:cssText(args['list' .. num .. 'framestyle']) | :cssText(args['list' .. num .. 'framestyle']) | ||
:tag('div') | :tag('div') | ||
:addClass( | :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.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.liststyle) | ||
:cssText(args['list' .. num .. 'style']) | :cssText(args['list' .. num .. 'style']) | ||
Line 443: | Line 276: | ||
end | end | ||
return p.sidebar(frame, args | return p.sidebar(frame, args) | ||
end | end | ||
return p | return p |