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 | ||
local function hasSubgroup(s) | local function hasSubgroup(s) | ||
if mw.ustring.find(s, | if mw.ustring.find(s, 'vertical%-navbox%-subgroup') then | ||
return true | return true | ||
else | else | ||
Line 53: | Line 30: | ||
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' | ||
root = root:tag('table') | root = root:tag('table') | ||
if not child then | if not child then | ||
root | root | ||
:addClass( | :addClass('vertical-navbox') | ||
:addClass(args.wraplinks ~= 'true' and 'nowraplinks' or nil) | |||
: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', '#f8f9fa') | |||
: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 59: | ||
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 72: | ||
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 80: | ||
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 91: | ||
: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) | ||
Line 196: | Line 100: | ||
else | else | ||
root | root | ||
:addClass( | :addClass('vertical-navbox-subgroup') | ||
:css('width', '100%') | |||
:css('margin', '0px') | |||
:css('border-spacing', '0px') | |||
:addClass(args.bodyclass or args.class) | :addClass(args.bodyclass or args.class) | ||
:cssText(args.bodystyle or args.style) | :cssText(args.bodystyle or args.style) | ||
Line 209: | Line 116: | ||
: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 131: | ||
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 139: | ||
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 150: | ||
: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 165: | ||
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 178: | ||
: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 192: | ||
:tag('tr') | :tag('tr') | ||
:tag('td') | :tag('td') | ||
:addClass(args.contentclass) | :addClass(args.contentclass) | ||
: | :css('padding', hasSubgroup(content) and '0.1em 0 0.2em' or '0 0.1em 0.4em') | ||
:cssText(args.contentstyle) | :cssText(args.contentstyle) | ||
:cssText(args['content' .. num .. 'style']) | :cssText(args['content' .. num .. 'style']) | ||
Line 292: | Line 199: | ||
: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 207: | ||
: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 215: | ||
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) .. (child and '[[Category:Pages using sidebar with the child parameter]]' or '') | ||
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 290: | ||
end | end | ||
return p.sidebar(frame, args | return p.sidebar(frame, args) | ||
end | end | ||
return p | return p |