Module:Sidebar: Difference between revisions
Jump to navigation
Jump to search
Content added Content deleted
m (1 revision) |
en>Frietjes (update from sandbox per discussion on talk page) |
||
Line 2: | Line 2: | ||
-- This module implements {{Sidebar}} |
-- This module implements {{Sidebar}} |
||
-- |
-- |
||
require('Module:No globals') |
|||
local p = {} |
local p = {} |
||
local getArgs |
local getArgs = require('Module:Arguments').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 |
||
local function |
local function hasSubgroup(s) |
||
if mw.ustring.find(s, 'vertical%-navbox%-subgroup') then |
|||
⚫ | |||
return true |
|||
else |
|||
return false |
|||
⚫ | |||
⚫ | |||
function p.sidebar(frame, args) |
|||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
local child = args.child and mw.text.trim(args.child) == 'yes' |
local child = args.child and mw.text.trim(args.child) == 'yes' |
||
root = root:tag('table') |
|||
if not child then |
if not child then |
||
root |
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('clear', (args.float == 'none' and 'both') or args.float or 'right') |
|||
:css('border', '1px solid #aaa') |
|||
⚫ | |||
.css('margin', args.float == 'left' and '0 1.0em 1.0em 0' or '0 0 1.0em 1.0em') |
|||
:css('border-spacing', '0.4em 0') |
|||
:css('text-align', 'center') |
|||
:css('line-height', '1.4em') |
|||
:css('font-size', '88%') |
|||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
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 |
||
else |
|||
root |
|||
:addClass('vertical-navbox-subgroup') |
|||
⚫ | |||
:css('margin', '0px') |
|||
:css('border-spacing', '0px') |
|||
:addClass(args.bodyclass or args.class) |
|||
:cssText(args.bodystyle or args.style) |
|||
end |
end |
||
Line 95: | Line 111: | ||
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 176: | ||
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', hasSubgroup(content) and '0.1em 0 0.2em' 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 |
||
end |
end |
||
Line 191: | Line 205: | ||
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' then |
if navbarArg ~= 'none' and navbarArg ~= 'off' and (args.name or frame:getParent():getTitle():gsub('/sandbox$', '') ~= 'Template:Sidebar') 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 218: | Line 232: | ||
end |
end |
||
return tostring(root) |
return tostring(root) .. (child and '[[Category:Pages using sidebar with the child parameter]]' or '') |
||
end |
end |
||
function |
function p.collapsible(frame) |
||
local args = getArgs(frame) |
|||
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 '') |
||
if not args.name and frame:getParent():getTitle():gsub('/sandbox$', '') == 'Template:Sidebar with collapsible lists' then |
|||
args.navbar = 'none' |
|||
end |
|||
local contentArgs = {} |
local contentArgs = {} |
||
for k, v in pairs(args) do |
for k, v in pairs(args) do |
||
local num = |
local num = string.match(k, '^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 = mw.html.create('div') |
||
row |
row |
||
:addClass('NavFrame') |
|||
:addClass((not expand) and 'collapsed' or nil) |
|||
: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 270: | Line 289: | ||
args[k] = v |
args[k] = v |
||
end |
end |
||
return |
return p.sidebar(frame, args) |
||
⚫ | |||
function makeWrapper(func) |
|||
return function(frame) |
|||
⚫ | |||
getArgs = require('Module:Arguments').getArgs |
|||
⚫ | |||
⚫ | |||
⚫ | |||
end |
end |
||
return |
return p |
||
sidebar = makeWrapper(_sidebar), |
|||
collapsible = makeWrapper(_collapsibleSidebar) |
|||
} |