Module:Sidebar: Difference between revisions
From Zoophilia Wiki
Jump to navigationJump to search
m 31 revisions imported |
en>Izno and here |
||
Line 3: | Line 3: | ||
-- | -- | ||
require('Module:No globals') | require('Module:No globals') | ||
local cfg = mw.loadData('Module:Sidebar/configuration') | |||
local p = {} | local p = {} | ||
local getArgs = require('Module:Arguments').getArgs | local getArgs = require('Module:Arguments').getArgs | ||
--[[ | |||
Categorizes calling templates and modules with a 'style' parameter of any sort | |||
for tracking to convert to TemplateStyles. | |||
TODO after a long cleanup: Catch sidebars in other namespaces than Template and Module. | |||
TODO would probably want to remove /log and /archive as CS1 does | |||
]] | |||
local function categorizeTemplatesWithInlineStyles(args) | |||
local title = mw.title.getCurrentTitle() | |||
if title.namespace ~= 10 and title.namespace ~= 828 then return '' end | |||
for _, pattern in ipairs (cfg.i18n.pattern.uncategorized_conversion_titles) do | |||
if title.text:match(pattern) then return '' end | |||
end | |||
for key, _ in pairs(args) do | |||
if mw.ustring.find(key, cfg.i18n.pattern.style_conversion) or key == 'width' then | |||
return cfg.i18n.category.conversion | |||
end | |||
end | |||
end | |||
--[[ | |||
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. | |||
]] | |||
-- See ([[meta:Help:Newlines and spaces#Automatic newline]]) | |||
local function trimAndAddAutomaticNewline(s) | local function trimAndAddAutomaticNewline(s) | ||
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 22: | Line 45: | ||
end | end | ||
--[[ | |||
Finds whether a sidebar has a subgroup sidebar. | |||
]] | |||
local function hasSubgroup(s) | local function hasSubgroup(s) | ||
if mw.ustring.find(s, | if mw.ustring.find(s, cfg.i18n.pattern.subgroup) then | ||
return true | return true | ||
else | else | ||
Line 30: | Line 56: | ||
end | end | ||
function p.sidebar(frame, args) | --[[ | ||
Main sidebar function. Takes the frame, args, and an optional collapsibleClass. | |||
The collapsibleClass is and should be used only for sidebars with collapsible | |||
lists, as in p.collapsible. | |||
]] | |||
function p.sidebar(frame, args, collapsibleClass) | |||
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) == cfg.i18n.child_yes | ||
root = root:tag('table') | root = root:tag('table') | ||
if not child then | if not child then | ||
root | root | ||
:addClass(' | :addClass(cfg.i18n.class.sidebar) | ||
:addClass(args.wraplinks | -- force collapsibleclass to be sidebar-collapse otherwise output nothing | ||
:addClass(collapsibleClass == cfg.i18n.class.collapse and cfg.i18n.class.collapse or nil) | |||
:addClass('nomobile') | |||
:addClass(args.float == cfg.i18n.float_none and cfg.i18n.class.float_none or nil) | |||
:addClass(args.float == cfg.i18n.float_left and cfg.i18n.class.float_left or nil) | |||
:addClass(args.wraplinks == cfg.i18n.wrap_true and cfg.i18n.class.wraplinks or nil) | |||
:addClass(args.bodyclass or args.class) | :addClass(args.bodyclass or args.class) | ||
:css('width', args.width or nil) | |||
:css('width', args.width or | |||
:cssText(args.bodystyle or args.style) | :cssText(args.bodystyle or args.style) | ||
Line 59: | Line 85: | ||
root | root | ||
:tag('caption') | :tag('caption') | ||
:addClass(cfg.i18n.class.outer_title) | |||
:addClass(args.outertitleclass) | :addClass(args.outertitleclass) | ||
:cssText(args.outertitlestyle) | :cssText(args.outertitlestyle) | ||
:wikitext(args.outertitle) | :wikitext(args.outertitle) | ||
Line 72: | Line 95: | ||
imageCell | imageCell | ||
:addClass(cfg.i18n.class.top_image) | |||
:addClass(args.topimageclass) | :addClass(args.topimageclass) | ||
:cssText(args.topimagestyle) | :cssText(args.topimagestyle) | ||
:wikitext(args.topimage) | :wikitext(args.topimage) | ||
Line 80: | Line 103: | ||
imageCell | imageCell | ||
:tag('div') | :tag('div') | ||
: | :addClass(cfg.i18n.class.top_caption) | ||
:cssText(args.topcaptionstyle) | :cssText(args.topcaptionstyle) | ||
:wikitext(args.topcaption) | :wikitext(args.topcaption) | ||
Line 91: | Line 113: | ||
:tag('tr') | :tag('tr') | ||
:tag('td') | :tag('td') | ||
:addClass(args.topimage and cfg.i18n.class.pretitle_with_top_image | |||
or cfg.i18n.class.pretitle) | |||
:addClass(args.pretitleclass) | :addClass(args.pretitleclass) | ||
:cssText(args.basestyle) | :cssText(args.basestyle) | ||
:cssText(args.pretitlestyle) | :cssText(args.pretitlestyle) | ||
:wikitext(args.pretitle) | :wikitext(args.pretitle) | ||
Line 100: | Line 122: | ||
else | else | ||
root | root | ||
:addClass( | :addClass(cfg.i18n.class.subgroup) | ||
: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 116: | Line 135: | ||
:tag('tr') | :tag('tr') | ||
:tag('th') | :tag('th') | ||
:addClass(args.pretitle and cfg.i18n.class.title_with_pretitle | |||
or cfg.i18n.class.title) | |||
:addClass(args.titleclass) | :addClass(args.titleclass) | ||
:cssText(args.basestyle) | :cssText(args.basestyle) | ||
:cssText(args.titlestyle) | :cssText(args.titlestyle) | ||
:wikitext(args.title) | :wikitext(args.title) | ||
Line 131: | Line 148: | ||
imageCell | imageCell | ||
:addClass(cfg.i18n.class.image) | |||
:addClass(args.imageclass) | :addClass(args.imageclass) | ||
:cssText(args.imagestyle) | :cssText(args.imagestyle) | ||
:wikitext(args.image) | :wikitext(args.image) | ||
Line 139: | Line 156: | ||
imageCell | imageCell | ||
:tag('div') | :tag('div') | ||
: | :addClass(cfg.i18n.class.caption) | ||
:cssText(args.captionstyle) | :cssText(args.captionstyle) | ||
:wikitext(args.caption) | :wikitext(args.caption) | ||
Line 150: | Line 166: | ||
:tag('tr') | :tag('tr') | ||
:tag('td') | :tag('td') | ||
:addClass(cfg.i18n.class.above) | |||
:addClass(args.aboveclass) | :addClass(args.aboveclass) | ||
:cssText(args.abovestyle) | :cssText(args.abovestyle) | ||
:newline() -- newline required for bullet-points to work | :newline() -- newline required for bullet-points to work | ||
Line 165: | Line 180: | ||
end | end | ||
table.sort(rowNums) | table.sort(rowNums) | ||
-- remove duplicates from the list (e.g. 3 will be duplicated if both heading3 and content3 are specified) | -- 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 178: | Line 194: | ||
:tag('tr') | :tag('tr') | ||
:tag('th') | :tag('th') | ||
:addClass(cfg.i18n.class.heading) | |||
:addClass(args.headingclass) | :addClass(args.headingclass) | ||
: | :addClass(args['heading' .. num .. 'class']) | ||
:cssText(args.basestyle) | :cssText(args.basestyle) | ||
:cssText(args.headingstyle) | :cssText(args.headingstyle) | ||
Line 192: | Line 209: | ||
:tag('tr') | :tag('tr') | ||
:tag('td') | :tag('td') | ||
:addClass(hasSubgroup(content) and cfg.i18n.class.content_with_subgroup | |||
or cfg.i18n.class.content) | |||
:addClass(args.contentclass) | :addClass(args.contentclass) | ||
: | :addClass(args['content' .. num .. 'class']) | ||
:cssText(args.contentstyle) | :cssText(args.contentstyle) | ||
:cssText(args['content' .. num .. 'style']) | :cssText(args['content' .. num .. 'style']) | ||
Line 199: | Line 218: | ||
:wikitext(content) | :wikitext(content) | ||
:done() | :done() | ||
-- Without a linebreak after the </td>, a nested list like | |||
-- "* {{hlist| ...}}" doesn't parse correctly. | |||
:newline() | |||
end | end | ||
end | end | ||
Line 207: | Line 228: | ||
:tag('tr') | :tag('tr') | ||
:tag('td') | :tag('td') | ||
:addClass(cfg.i18n.class.below) | |||
:addClass(args.belowclass) | :addClass(args.belowclass) | ||
:cssText(args.belowstyle) | :cssText(args.belowstyle) | ||
:newline() | :newline() | ||
Line 216: | Line 236: | ||
if not child then | if not child then | ||
if args.navbar ~= cfg.i18n.navbar_none and args.navbar ~= cfg.i18n.navbar_off and | |||
(args.name or frame:getParent():getTitle():gsub(cfg.i18n.pattern.sandbox, '') ~= | |||
cfg.i18n.title_not_to_add_navbar) then | |||
root | root | ||
:tag('tr') | :tag('tr') | ||
:tag('td') | :tag('td') | ||
: | :addClass(cfg.i18n.class.navbar) | ||
:cssText(args.navbarstyle) | |||
:cssText(args.navbarstyle | :wikitext(require('Module:Navbar')._navbar{ | ||
:wikitext( | |||
args.name, | args.name, | ||
mini = 1, | mini = 1, | ||
fontstyle = args.navbarfontstyle | fontstyle = args.navbarfontstyle | ||
}) | }) | ||
end | end | ||
end | end | ||
local base_templatestyles = frame:extensionTag{ | |||
name = 'templatestyles', args = { src = cfg.i18n.templatestyles } | |||
} | |||
local templatestyles = '' | |||
if args['templatestyles'] and args['templatestyles'] ~= '' then | |||
templatestyles = frame:extensionTag{ | |||
name = 'templatestyles', args = { src = args['templatestyles'] } | |||
} | |||
end | |||
local child_templatestyles = '' | |||
if args['child templatestyles'] and args['child templatestyles'] ~= '' then | |||
child_templatestyles = frame:extensionTag{ | |||
name = 'templatestyles', args = { src = args['child templatestyles'] } | |||
} | |||
end | |||
local grandchild_templatestyles = '' | |||
if args['grandchild templatestyles'] and args['grandchild templatestyles'] ~= '' then | |||
grandchild_templatestyles = frame:extensionTag{ | |||
name = 'templatestyles', args = { src = args['grandchild templatestyles'] } | |||
} | |||
end | |||
return table.concat({ | |||
base_templatestyles, | |||
templatestyles, | |||
child_templatestyles, | |||
grandchild_templatestyles, | |||
tostring(root), | |||
(child and cfg.i18n.category.child or ''), | |||
categorizeTemplatesWithInlineStyles(args) | |||
}) | |||
end | |||
local function list_title(args, is_centered_list_titles, num) | |||
local title_text = trimAndAddAutomaticNewline(args['list' .. num .. 'title'] | |||
or cfg.i18n.default_list_title) | |||
local title | |||
if is_centered_list_titles then | |||
-- collapsible can be finicky, so provide some CSS/HTML to support | |||
title = mw.html.create('div') | |||
:addClass(cfg.i18n.class.list_title_centered) | |||
:wikitext(title_text) | |||
else | |||
title = mw.html.create() | |||
:wikitext(title_text) | |||
end | |||
local title_container = mw.html.create('div') | |||
:addClass(cfg.i18n.class.list_title) | |||
-- don't /need/ a listnumtitleclass because you can do | |||
-- .templateclass .listnumclass .sidebar-list-title | |||
:addClass(args.listtitleclass) | |||
:cssText(args.basestyle) | |||
:cssText(args.listtitlestyle) | |||
:cssText(args['list' .. num .. 'titlestyle']) | |||
:node(title) | |||
:done() | |||
return title_container | |||
end | end | ||
--[[ | |||
Main entry point for sidebar with collapsible lists. | |||
Does the work of creating the collapsible lists themselves and including them | |||
into the args. | |||
]] | |||
function p.collapsible(frame) | function p.collapsible(frame) | ||
local args = getArgs(frame) | local args = getArgs(frame) | ||
if not args.name and | |||
frame:getParent():getTitle():gsub(cfg.i18n.pattern.collapse_sandbox, '') == | |||
cfg.i18n.collapse_title_not_to_add_navbar then | |||
args.navbar = cfg.i18n.navbar_none | |||
if not args.name and frame:getParent():getTitle():gsub( | |||
args.navbar = | |||
end | end | ||
local contentArgs = {} | local contentArgs = {} | ||
local is_centered_list_titles | |||
if args['centered list titles'] and args['centered list titles'] ~= '' then | |||
is_centered_list_titles = true | |||
else | |||
is_centered_list_titles = false | |||
end | |||
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 (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 = mw.html.create('div') | local row = mw.html.create('div') | ||
row | row | ||
:addClass(' | :addClass(cfg.i18n.class.list) | ||
:addClass((not expand) and 'collapsed' or nil) | :addClass('mw-collapsible') | ||
: | :addClass((not expand) and 'mw-collapsed' or nil) | ||
:addClass(args['list' .. num .. 'class']) | |||
:cssText(args.listframestyle) | :cssText(args.listframestyle) | ||
:cssText(args['list' .. num .. 'framestyle']) | :cssText(args['list' .. num .. 'framestyle']) | ||
:node(list_title(args, is_centered_list_titles, num)) | |||
:tag('div') | :tag('div') | ||
:addClass( | :addClass(cfg.i18n.class.list_content) | ||
:addClass | :addClass('mw-collapsible-content') | ||
-- don't /need/ a listnumstyleclass because you can do | |||
-- .templatename .listnumclass .sidebar-list | |||
:addClass(args.listclass) | :addClass(args.listclass) | ||
:cssText(args.liststyle) | :cssText(args.liststyle) | ||
:cssText(args['list' .. num .. 'style']) | :cssText(args['list' .. num .. 'style']) | ||
Line 290: | Line 372: | ||
end | end | ||
return p.sidebar(frame, args) | return p.sidebar(frame, args, cfg.i18n.class.collapse) | ||
end | end | ||
return p | return p |
Revision as of 17:51, 22 March 2021
This Lua module is used on 234,000+ pages. To avoid major disruption and server load, any changes should be tested in the module's /sandbox or /testcases subpages, or in your own module sandbox. The tested changes can be added to this page in a single edit. Consider discussing changes on the talk page before implementing them. |
This module is subject to page protection. It is a highly visible module in use by a very large number of pages, or is substituted very frequently. Because vandalism or mistakes would affect many pages, and even trivial editing might cause substantial load on the servers, it is protected from editing. |
This module implements the templates {{sidebar}} and {{sidebar with collapsible lists}}. See the individual template pages for documentation.
--
-- This module implements {{Sidebar}}
--
require('Module:No globals')
local cfg = mw.loadData('Module:Sidebar/configuration')
local p = {}
local getArgs = require('Module:Arguments').getArgs
--[[
Categorizes calling templates and modules with a 'style' parameter of any sort
for tracking to convert to TemplateStyles.
TODO after a long cleanup: Catch sidebars in other namespaces than Template and Module.
TODO would probably want to remove /log and /archive as CS1 does
]]
local function categorizeTemplatesWithInlineStyles(args)
local title = mw.title.getCurrentTitle()
if title.namespace ~= 10 and title.namespace ~= 828 then return '' end
for _, pattern in ipairs (cfg.i18n.pattern.uncategorized_conversion_titles) do
if title.text:match(pattern) then return '' end
end
for key, _ in pairs(args) do
if mw.ustring.find(key, cfg.i18n.pattern.style_conversion) or key == 'width' then
return cfg.i18n.category.conversion
end
end
end
--[[
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.
]]
-- See ([[meta:Help:Newlines and spaces#Automatic newline]])
local function trimAndAddAutomaticNewline(s)
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
end
end
--[[
Finds whether a sidebar has a subgroup sidebar.
]]
local function hasSubgroup(s)
if mw.ustring.find(s, cfg.i18n.pattern.subgroup) then
return true
else
return false
end
end
--[[
Main sidebar function. Takes the frame, args, and an optional collapsibleClass.
The collapsibleClass is and should be used only for sidebars with collapsible
lists, as in p.collapsible.
]]
function p.sidebar(frame, args, collapsibleClass)
if not args then
args = getArgs(frame)
end
local root = mw.html.create()
local child = args.child and mw.text.trim(args.child) == cfg.i18n.child_yes
root = root:tag('table')
if not child then
root
:addClass(cfg.i18n.class.sidebar)
-- force collapsibleclass to be sidebar-collapse otherwise output nothing
:addClass(collapsibleClass == cfg.i18n.class.collapse and cfg.i18n.class.collapse or nil)
:addClass('nomobile')
:addClass(args.float == cfg.i18n.float_none and cfg.i18n.class.float_none or nil)
:addClass(args.float == cfg.i18n.float_left and cfg.i18n.class.float_left or nil)
:addClass(args.wraplinks == cfg.i18n.wrap_true and cfg.i18n.class.wraplinks or nil)
:addClass(args.bodyclass or args.class)
:css('width', args.width or nil)
:cssText(args.bodystyle or args.style)
if args.outertitle then
root
:tag('caption')
:addClass(cfg.i18n.class.outer_title)
:addClass(args.outertitleclass)
:cssText(args.outertitlestyle)
:wikitext(args.outertitle)
end
if args.topimage then
local imageCell = root:tag('tr'):tag('td')
imageCell
:addClass(cfg.i18n.class.top_image)
:addClass(args.topimageclass)
:cssText(args.topimagestyle)
:wikitext(args.topimage)
if args.topcaption then
imageCell
:tag('div')
:addClass(cfg.i18n.class.top_caption)
:cssText(args.topcaptionstyle)
:wikitext(args.topcaption)
end
end
if args.pretitle then
root
:tag('tr')
:tag('td')
:addClass(args.topimage and cfg.i18n.class.pretitle_with_top_image
or cfg.i18n.class.pretitle)
:addClass(args.pretitleclass)
:cssText(args.basestyle)
:cssText(args.pretitlestyle)
:wikitext(args.pretitle)
end
else
root
:addClass(cfg.i18n.class.subgroup)
: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.pretitle and cfg.i18n.class.title_with_pretitle
or cfg.i18n.class.title)
:addClass(args.titleclass)
:cssText(args.basestyle)
:cssText(args.titlestyle)
:wikitext(args.title)
end
end
if args.image then
local imageCell = root:tag('tr'):tag('td')
imageCell
:addClass(cfg.i18n.class.image)
:addClass(args.imageclass)
:cssText(args.imagestyle)
:wikitext(args.image)
if args.caption then
imageCell
:tag('div')
:addClass(cfg.i18n.class.caption)
:cssText(args.captionstyle)
:wikitext(args.caption)
end
end
if args.above then
root
:tag('tr')
:tag('td')
:addClass(cfg.i18n.class.above)
:addClass(args.aboveclass)
:cssText(args.abovestyle)
:newline() -- newline required for bullet-points to work
:wikitext(args.above)
end
local rowNums = {}
for k, v in pairs(args) do
k = '' .. k
local num = k:match('^heading(%d+)$') or k:match('^content(%d+)$')
if num then table.insert(rowNums, tonumber(num)) end
end
table.sort(rowNums)
-- remove duplicates from the list (e.g. 3 will be duplicated if both heading3
-- and content3 are specified)
for i = #rowNums, 1, -1 do
if rowNums[i] == rowNums[i - 1] then
table.remove(rowNums, i)
end
end
for i, num in ipairs(rowNums) do
local heading = args['heading' .. num]
if heading then
root
:tag('tr')
:tag('th')
:addClass(cfg.i18n.class.heading)
:addClass(args.headingclass)
:addClass(args['heading' .. num .. 'class'])
:cssText(args.basestyle)
:cssText(args.headingstyle)
:cssText(args['heading' .. num .. 'style'])
:newline()
:wikitext(heading)
end
local content = args['content' .. num]
if content then
root
:tag('tr')
:tag('td')
:addClass(hasSubgroup(content) and cfg.i18n.class.content_with_subgroup
or cfg.i18n.class.content)
:addClass(args.contentclass)
:addClass(args['content' .. num .. 'class'])
:cssText(args.contentstyle)
:cssText(args['content' .. num .. 'style'])
:newline()
:wikitext(content)
:done()
-- Without a linebreak after the </td>, a nested list like
-- "* {{hlist| ...}}" doesn't parse correctly.
:newline()
end
end
if args.below then
root
:tag('tr')
:tag('td')
:addClass(cfg.i18n.class.below)
:addClass(args.belowclass)
:cssText(args.belowstyle)
:newline()
:wikitext(args.below)
end
if not child then
if args.navbar ~= cfg.i18n.navbar_none and args.navbar ~= cfg.i18n.navbar_off and
(args.name or frame:getParent():getTitle():gsub(cfg.i18n.pattern.sandbox, '') ~=
cfg.i18n.title_not_to_add_navbar) then
root
:tag('tr')
:tag('td')
:addClass(cfg.i18n.class.navbar)
:cssText(args.navbarstyle)
:wikitext(require('Module:Navbar')._navbar{
args.name,
mini = 1,
fontstyle = args.navbarfontstyle
})
end
end
local base_templatestyles = frame:extensionTag{
name = 'templatestyles', args = { src = cfg.i18n.templatestyles }
}
local templatestyles = ''
if args['templatestyles'] and args['templatestyles'] ~= '' then
templatestyles = frame:extensionTag{
name = 'templatestyles', args = { src = args['templatestyles'] }
}
end
local child_templatestyles = ''
if args['child templatestyles'] and args['child templatestyles'] ~= '' then
child_templatestyles = frame:extensionTag{
name = 'templatestyles', args = { src = args['child templatestyles'] }
}
end
local grandchild_templatestyles = ''
if args['grandchild templatestyles'] and args['grandchild templatestyles'] ~= '' then
grandchild_templatestyles = frame:extensionTag{
name = 'templatestyles', args = { src = args['grandchild templatestyles'] }
}
end
return table.concat({
base_templatestyles,
templatestyles,
child_templatestyles,
grandchild_templatestyles,
tostring(root),
(child and cfg.i18n.category.child or ''),
categorizeTemplatesWithInlineStyles(args)
})
end
local function list_title(args, is_centered_list_titles, num)
local title_text = trimAndAddAutomaticNewline(args['list' .. num .. 'title']
or cfg.i18n.default_list_title)
local title
if is_centered_list_titles then
-- collapsible can be finicky, so provide some CSS/HTML to support
title = mw.html.create('div')
:addClass(cfg.i18n.class.list_title_centered)
:wikitext(title_text)
else
title = mw.html.create()
:wikitext(title_text)
end
local title_container = mw.html.create('div')
:addClass(cfg.i18n.class.list_title)
-- don't /need/ a listnumtitleclass because you can do
-- .templateclass .listnumclass .sidebar-list-title
:addClass(args.listtitleclass)
:cssText(args.basestyle)
:cssText(args.listtitlestyle)
:cssText(args['list' .. num .. 'titlestyle'])
:node(title)
:done()
return title_container
end
--[[
Main entry point for sidebar with collapsible lists.
Does the work of creating the collapsible lists themselves and including them
into the args.
]]
function p.collapsible(frame)
local args = getArgs(frame)
if not args.name and
frame:getParent():getTitle():gsub(cfg.i18n.pattern.collapse_sandbox, '') ==
cfg.i18n.collapse_title_not_to_add_navbar then
args.navbar = cfg.i18n.navbar_none
end
local contentArgs = {}
local is_centered_list_titles
if args['centered list titles'] and args['centered list titles'] ~= '' then
is_centered_list_titles = true
else
is_centered_list_titles = false
end
for k, v in pairs(args) do
local num = string.match(k, '^list(%d+)$')
if num then
local expand = args.expanded and
(args.expanded == 'all' or args.expanded == args['list' .. num .. 'name'])
local row = mw.html.create('div')
row
:addClass(cfg.i18n.class.list)
:addClass('mw-collapsible')
:addClass((not expand) and 'mw-collapsed' or nil)
:addClass(args['list' .. num .. 'class'])
:cssText(args.listframestyle)
:cssText(args['list' .. num .. 'framestyle'])
:node(list_title(args, is_centered_list_titles, num))
:tag('div')
:addClass(cfg.i18n.class.list_content)
:addClass('mw-collapsible-content')
-- don't /need/ a listnumstyleclass because you can do
-- .templatename .listnumclass .sidebar-list
:addClass(args.listclass)
:cssText(args.liststyle)
:cssText(args['list' .. num .. 'style'])
:wikitext(trimAndAddAutomaticNewline(args['list' .. num]))
contentArgs['content' .. num] = tostring(row)
end
end
for k, v in pairs(contentArgs) do
args[k] = v
end
return p.sidebar(frame, args, cfg.i18n.class.collapse)
end
return p