ਮੌਡਿਊਲ:Sidebar

This module implements the templates {{sidebar}} and {{sidebar with collapsible lists}}. See the individual template pages for documentation.


require('strict')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 sortfor 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 '' endfor _, pattern in ipairs (cfg.i18n.pattern.uncategorized_conversion_titles) doif title.text:match(pattern) then return '' endendfor key, _ in pairs(args) doif mw.ustring.find(key, cfg.i18n.pattern.style_conversion) or key == 'width' thenreturn cfg.i18n.category.conversionendendend--[[For compatibility with the original {{sidebar with collapsible lists}}implementation, which passed some parameters through {{#if}} to trim theirwhitespace. 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, '^{|') thenreturn '\n' .. selsereturn sendend--[[Finds whether a sidebar has a subgroup sidebar.]]local function hasSubgroup(s)if mw.ustring.find(s, cfg.i18n.pattern.subgroup) thenreturn trueelsereturn falseendendlocal function has_navbar(navbar_mode, sidebar_name)return navbar_mode ~= cfg.i18n.navbar_none andnavbar_mode ~= cfg.i18n.navbar_off and(sidebar_name ormw.getCurrentFrame():getParent():getTitle():gsub(cfg.i18n.pattern.sandbox, '') ~=cfg.i18n.title_not_to_add_navbar)endlocal function has_list_class(args, htmlclass)local patterns = {'^' .. htmlclass .. '$','%s' .. htmlclass .. '$','^' .. htmlclass .. '%s','%s' .. htmlclass .. '%s'}for arg, value in pairs(args) doif type(arg) == 'string' and mw.ustring.find(arg, 'class') thenfor _, pattern in ipairs(patterns) doif mw.ustring.find(args[arg] or '', pattern) thenreturn trueendendendendreturn falseend-- there are a lot of list classes in the wild, so we add their TemplateStyleslocal function add_list_styles(args)local frame = mw.getCurrentFrame()local function add_list_templatestyles(htmlclass, templatestyles)if has_list_class(args, htmlclass) thenreturn frame:extensionTag{name = 'templatestyles', args = { src = templatestyles }}elsereturn ''endendlocal plainlist_styles = add_list_templatestyles('plainlist', cfg.i18n.plainlist_templatestyles)local hlist_styles = add_list_templatestyles('hlist', cfg.i18n.hlist_templatestyles)-- a second workaround for [[phab:T303378]]-- when that issue is fixed, we can actually use has_navbar not to emit the-- tag here if we wantif has_navbar(args.navbar, args.name) and hlist_styles == '' thenhlist_styles = frame:extensionTag{name = 'templatestyles', args = { src = cfg.i18n.hlist_templatestyles}}end-- hlist -> plainlist is best-effort to preserve old Common.css ordering. [hlist_note]return hlist_styles .. plainlist_stylesend-- work around [[phab:T303378]]-- for each arg: find all the templatestyles strip markers, insert them into a-- table. then remove all templatestyles markers from the arglocal function move_hiding_templatestyles(args)local gfind = string.gfindlocal gsub = string.gsublocal templatestyles_markers = {}local strip_marker_pattern = '(\127[^\127]*UNIQ%-%-templatestyles%-%x+%-QINU[^\127]*\127)'for k, arg in pairs(args) dofor marker in gfind(arg, strip_marker_pattern) dotable.insert(templatestyles_markers, marker)endargs[k] = gsub(arg, strip_marker_pattern, '')endreturn templatestyles_markersend--[[Main sidebar function. Takes the frame, args, and an optional collapsibleClass.The collapsibleClass is and should be used only for sidebars with collapsiblelists, as in p.collapsible.]]function p.sidebar(frame, args, collapsibleClass)if not args thenargs = getArgs(frame)endlocal hiding_templatestyles = table.concat(move_hiding_templatestyles(args))local root = mw.html.create()local child = args.child and mw.text.trim(args.child) == cfg.i18n.child_yesroot = root:tag('table')if not child thenroot :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 thenroot:tag('caption'):addClass(cfg.i18n.class.outer_title):addClass(args.outertitleclass):cssText(args.outertitlestyle):wikitext(args.outertitle)endif args.topimage thenlocal 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 thenimageCell:tag('div'):addClass(cfg.i18n.class.top_caption):cssText(args.topcaptionstyle):wikitext(args.topcaption)endendif args.pretitle thenroot:tag('tr'):tag('td'):addClass(args.topimage and cfg.i18n.class.pretitle_with_top_imageor cfg.i18n.class.pretitle):addClass(args.pretitleclass):cssText(args.basestyle):cssText(args.pretitlestyle):wikitext(args.pretitle)endelseroot:addClass(cfg.i18n.class.subgroup):addClass(args.bodyclass or args.class):cssText(args.bodystyle or args.style)endif args.title thenif child thenroot:wikitext(args.title)elseroot:tag('tr'):tag('th'):addClass(args.pretitle and cfg.i18n.class.title_with_pretitleor cfg.i18n.class.title):addClass(args.titleclass):cssText(args.basestyle):cssText(args.titlestyle):wikitext(args.title)endendif args.image thenlocal imageCell = root:tag('tr'):tag('td')imageCell:addClass(cfg.i18n.class.image):addClass(args.imageclass):cssText(args.imagestyle):wikitext(args.image)if args.caption thenimageCell:tag('div'):addClass(cfg.i18n.class.caption):cssText(args.captionstyle):wikitext(args.caption)endendif args.above thenroot: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)endlocal rowNums = {}for k, v in pairs(args) dok = '' .. klocal num = k:match('^heading(%d+)$') or k:match('^content(%d+)$')if num then table.insert(rowNums, tonumber(num)) endendtable.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 doif rowNums[i] == rowNums[i - 1] thentable.remove(rowNums, i)endendfor i, num in ipairs(rowNums) dolocal heading = args['heading' .. num]if heading thenroot: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)endlocal content = args['content' .. num]if content thenroot:tag('tr'):tag('td'):addClass(hasSubgroup(content) and cfg.i18n.class.content_with_subgroupor 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()endendif args.below thenroot:tag('tr'):tag('td'):addClass(cfg.i18n.class.below):addClass(args.belowclass):cssText(args.belowstyle):newline():wikitext(args.below)endif not child and has_navbar(args.navbar, args.name) thenroot:tag('tr'):tag('td'):addClass(cfg.i18n.class.navbar):cssText(args.navbarstyle):wikitext(require('Module:Navbar')._navbar{args.name,mini = 1,fontstyle = args.navbarfontstyle})endlocal base_templatestyles = frame:extensionTag{name = 'templatestyles', args = { src = cfg.i18n.templatestyles }}local templatestyles = ''if args['templatestyles'] and args['templatestyles'] ~= '' thentemplatestyles = frame:extensionTag{name = 'templatestyles', args = { src = args['templatestyles'] }}endlocal child_templatestyles = ''if args['child templatestyles'] and args['child templatestyles'] ~= '' thenchild_templatestyles = frame:extensionTag{name = 'templatestyles', args = { src = args['child templatestyles'] }}endlocal grandchild_templatestyles = ''if args['grandchild templatestyles'] and args['grandchild templatestyles'] ~= '' thengrandchild_templatestyles = frame:extensionTag{name = 'templatestyles', args = { src = args['grandchild templatestyles'] }}endreturn table.concat({add_list_styles(args), -- see [hlist_note] above about orderingbase_templatestyles,templatestyles,child_templatestyles,grandchild_templatestyles,hiding_templatestyles,tostring(root),(child and cfg.i18n.category.child or ''),categorizeTemplatesWithInlineStyles(args)})endlocal function list_title(args, is_centered_list_titles, num)local title_text = trimAndAddAutomaticNewline(args['list' .. num .. 'title']or cfg.i18n.default_list_title)local titleif is_centered_list_titles then-- collapsible can be finicky, so provide some CSS/HTML to supporttitle = mw.html.create('div'):addClass(cfg.i18n.class.list_title_centered):wikitext(title_text)elsetitle = mw.html.create():wikitext(title_text)endlocal 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_containerend--[[Main entry point for sidebar with collapsible lists.Does the work of creating the collapsible lists themselves and including theminto the args.]]function p.collapsible(frame)local args = getArgs(frame)if not args.name andframe:getParent():getTitle():gsub(cfg.i18n.pattern.collapse_sandbox, '') ==cfg.i18n.collapse_title_not_to_add_navbar thenargs.navbar = cfg.i18n.navbar_noneendlocal contentArgs = {}local is_centered_list_titles = falseif args['centered list titles'] and args['centered list titles'] ~= '' thenis_centered_list_titles = trueendfor k, v in pairs(args) dolocal num = string.match(k, '^list(%d+)$')if num thenlocal 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)endendfor k, v in pairs(contentArgs) doargs[k] = vendreturn p.sidebar(frame, args, cfg.i18n.class.collapse)endreturn p
🔥 Top keywords: ਮੁੱਖ ਸਫ਼ਾਪੰਜਾਬ ਦੇ ਮੇਲੇ ਅਤੇ ਤਿਓੁਹਾਰਪੰਜਾਬੀ ਲੋਕ ਖੇਡਾਂਪੰਜਾਬੀ ਸੱਭਿਆਚਾਰਪੰਜਾਬ ਦੇ ਲੋਕ-ਨਾਚਭਾਈ ਵੀਰ ਸਿੰਘਪੰਜਾਬੀ ਕੱਪੜੇਗੁਰੂ ਨਾਨਕਸੁਰਜੀਤ ਪਾਤਰਖ਼ਾਸ:ਖੋਜੋਅੰਮ੍ਰਿਤਾ ਪ੍ਰੀਤਮਪੰਜਾਬ ਦੀਆਂ ਵਿਰਾਸਤੀ ਖੇਡਾਂਵਿਆਹ ਦੀਆਂ ਰਸਮਾਂਪੰਜਾਬੀ ਤਿਓਹਾਰਵਿਸਾਖੀਪੰਜਾਬੀ ਭਾਸ਼ਾਗੁਰੂ ਹਰਿਗੋਬਿੰਦਗੁਰੂ ਅਰਜਨਹਰਿਮੰਦਰ ਸਾਹਿਬਭਗਤ ਸਿੰਘਪੰਜਾਬੀ ਭੋਜਨ ਸੱਭਿਆਚਾਰਪੰਜਾਬ, ਭਾਰਤਛਪਾਰ ਦਾ ਮੇਲਾਪੰਜਾਬੀ ਰੀਤੀ ਰਿਵਾਜਗੁਰੂ ਅਮਰਦਾਸਹੇਮਕੁੰਟ ਸਾਹਿਬਵਹਿਮ ਭਰਮਗੁਰੂ ਗੋਬਿੰਦ ਸਿੰਘਗੁਰੂ ਤੇਗ ਬਹਾਦਰਪੰਜਾਬੀ ਲੋਕ ਬੋਲੀਆਂਜਪੁਜੀ ਸਾਹਿਬਗੁਰੂ ਅੰਗਦਗੁਰੂ ਗ੍ਰੰਥ ਸਾਹਿਬਸ਼ਿਵ ਕੁਮਾਰ ਬਟਾਲਵੀਪੰਜਾਬੀ ਮੁਹਾਵਰੇ ਅਤੇ ਅਖਾਣਭੰਗੜਾ (ਨਾਚ)ਪੰਜਾਬੀ ਲਈ ਸਾਹਿਤ ਅਕਾਦਮੀ ਇਨਾਮ ਜੇਤੂਆਂ ਦੀ ਸੂਚੀਰਣਜੀਤ ਸਿੰਘਦਿਵਾਲੀ