local HtmlBuilder = require('Module:HtmlBuilder')
local Navbar navbar = require('Module:Navbar')._navbar
 
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")    	if mw.ustring.find(s, '^[#*:;]') or mw.ustring.find(s, '^{|') then        		return '\n' .. s    	else        		return s    	end
end
local function _sidebar(args)
    	local root = HtmlBuilder.create()	local child = args.child and mw.text.trim(args.child) == 'tableyes')    		if not child then    		root = root        			.tag('table')			.addClass('vertical-navbox')        			.addClass(args.wraplinks ~= 'true' and 'nowraplinks')        			.addClass(args.bodyclass or args.class)        			.attr('cellspacing', args.cellspacing or 5)        			.attr('cellpadding', args.cellpadding or 0)        			.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)			if args.outertitle then			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			if args.topimage then			local imageCell = root.tag('tr').tag('td')						imageCell				.addClass(args.topimageclass)				.css('padding', '0.4em 0')				.cssText(args.topimagestyle)				.wikitext(args.topimage)						if args.topcaption then				imageCell					.tag('div')						.css('padding-top', '0.2em')						.css('line-height', '1.2em')						.cssText(args.topcaptionstyle)						.wikitext(args.topcaption)			end		end				if args.pretitle then			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
    if args.outertitle then        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
    	if args.topimage title then        local imageCell = 		if child then			root.tag('tr').tag('td')                imageCell            .addClass(args.topimageclass)            .css('padding', '0.4em 0')            .cssText(args.topimagestyle)            				.wikitext(args.topimagetitle)                if args.topcaption then            imageCell                				.tag('div')                    .css('padding-top/th', '0.2em'{unclosed = true})                    				.csstag('line-height/tr', '1.2em')                    .cssText(args.topcaptionstyle{unclosed = true})                    .wikitext(args.topcaption)        end    end    		else    if args.pretitle then        			root            				.tag('tr')                					.tag('tdth')                    						.addClass(args.pretitleclasstitleclass)                    						.cssText(args.basestyle)                    						.css('padding', '0.2em 0.4em 0.2em')						.css('padding-top', args.topimage pretitle and '0)						.2emcss('font-size' or , '0.4em145%')                    						.css('line-height', '1.2em')                    						.cssText(args.pretitlestyletitlestyle)                    						.wikitext(args.pretitletitle)    		end	end
    	if args.title image then        		local imageCell = root            .tag('tr')                .tag('thtd')                    				imageCell			.addClass(args.titleclassimageclass)			.css('padding', '0.2em 0 0.4em')                    			.cssText(args.basestyleimagestyle)			.wikitext(args.image)					if args.caption then			imageCell				.tag('div')                    					.css('padding-top', '0.2em 0')					.4em 0css('line-height', '1.2em')                    					.cssText(args.captionstyle)					.wikitext(args.caption)		end	end		if args.above then		root			.tag('tr')				.csstag('padding-toptd', )					.addClass(args.pretitle and 0aboveclass)                    					.css('font-sizepadding', '145%0.3em 0.4em 0.3em')                    					.css('linefont-heightweight', '1.2embold')                    					.cssText(args.titlestyleabovestyle)					.newline()  -- newline required for bullet-points to work                    					.wikitext(args.titleabove)    	end
    if args.image then        	local imageCell rowNums = root.tag('tr').tag('td'){}                imageCell            .addClass	for k, v in pairs(args.imageclass)do            .css('padding		k = ', '0.2em 0 0.4em')k            .cssText		local num = k:match(args.imagestyle)            .wikitext'^heading(args.image%d+)                    if args.caption then            imageCell                .tag('div$')                    .cssor k:match('padding-top', '0.2em^content(%d+)$')                    		if num then table.cssinsert('line-height'rowNums, '1.2em')                    .cssTexttonumber(args.captionstylenum)                    .wikitext(args.caption)        end    	end        if args.above then        root            	table.tagsort('tr'rowNums)                .tag	-- remove duplicates from the list ('td')                    e.addClass(argsg.aboveclass3 will be duplicated if both heading3 and content3 are specified)                    .css('padding'	for i = #rowNums, 1, '0.3em 0.4em 0.3em')-1 do                    .css('font		if rowNums[i] == rowNums[i -weight', 'bold')1] then                    			table.cssTextremove(args.abovestylerowNums, i)                    .newline()      -- newline required for bullet-points to work                    .wikitext(args.above)		end    	end
    local rowNums = {}    	for ki, v num in pairsipairs(argsrowNums) do        k 		local heading = args['heading' .. knum]		if heading then			root        local num = k:match				.tag('^heading(%d+)$tr') or k:match					.tag('^contentth')						.addClass(%d+args.headingclass)$						.css('padding', '0.1em')        if num then table						.cssText(args.basestyle)						.insertcssText(rowNums, tonumberargs.headingstyle)						.cssText(args['heading' .. num.. 'style'])						.newline()						.wikitext(heading) 		end    end				local content = args['content' .. num]		if content then			root    table				.sorttag(rowNums'tr')    -- remove duplicates from the list 					.tag(e'td')						.gaddClass(args. 3 will be duplicated if both heading3 and content3 are specifiedcontentclass)    for i = #rowNums						.css('padding', 1, -1 do'0 0.1em 0.4em')						.cssText(args.contentstyle)        if rowNums						.cssText(args[i'content' .. num .. 'style'] == rowNums[i - 1] then)						.newline()						.wikitext(content)						.done()            table					.removenewline(rowNums)  -- Without a linebreak after the </td>, i)a nested list like "* {{hlist| ...}}" doesn't parse correctly.        		end    	end
    for i, num in ipairs(rowNums) do        local heading = 	if args['heading' .. num]        if heading below then            		root                			.tag('tr')                    				.tag('thtd')                        					.addClass(args.headingclassbelowclass)                        					.css('padding', '0.1em')                        3em 0.cssText(args.basestyle)                        .cssText(args.headingstyle)                        .cssText(args['heading' .. num .. 'style'])                        .wikitext(heading)        end                local content = args['content' .. num]        if content then            root                .tag('tr')                    4em 0.tag('td3em')                        .addClass(args.contentclass)                        					.css('paddingfont-weight', '0 0.1em 0.4embold')                        					.cssText(args.contentstylebelowstyle)                        .cssText(args['content' .. num .. 'style'])                        					.newline()                        					.wikitext(content)                        .done()                    args.newline(below)  -- Without a linebreak after the </td>, a nested list like "* {{hlist| ...}}" doesn't parse correctly.        end    	end
    	if not child then		local navbarArg = args.below navbar or args.tnavbar		if navbarArg ~= 'none' and navbarArg ~= 'off' then        			root            				.tag('tr')                					.tag('td')                    .addClass(args.belowclass)                    						.css('paddingtext-align', '0.3em 0.4em 0.3emright')                    						.css('font-weightsize', 'bold115%')                    						.cssText(args.belowstylenavbarstyle or args.tnavbarstyle)                    						.wikitext(navbar{							args.newlinename or mw.title.getCurrentTitle().fullText,                    							mini = 1,							fontstyle = args.wikitext(navbarfontstyle or args.belowtnavbarfontstyle						})    		end	end
    local navbarArg = args.navbar or args.tnavbar    if navbarArg ~= 'none' and navbarArg ~= 'off' then        root            .tag('tr')                .tag('td')                    .css('text-align', 'right')                    .css('font-size', '115%')                    .cssText(args.navbarstyle or args.tnavbarstyle)                    .wikitext(Navbar.navbar({                        args.name or mw.title.getCurrentTitle().fullText,                        mini = 1,                        fontstyle = args.navbarfontstyle or args.tnavbarfontstyle                    }))    end         	return tostring(root)
end
function _collapsibleSidebar(args)
    	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.navbarstyle = 'padding-top: 0.6em;' .. (args.navbarstyle or args.tnavbarstyle or '')    	    	local contentArgs = {}    	    	for k, v in pairs(args) do        		local num = ('' .. k):match('^list(%d+)$')        		if num then             			local expand = args.expanded and (args.expanded == 'all' or args.expanded == args['list' .. num .. 'name'])            			            			local row = HtmlBuilder.create('div')            			row                				.addClass('NavFrame')                				.addClass((not expand) and 'collapsed')                				.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)        		end    	end
    	for k, v in pairs(contentArgs) do        		args[k] = v    	end    	    	return _sidebar(args)
end
                      					  
function makeWrapper(func)
    	return function(frame)        		local origArgs        		if frame == mw.getCurrentFrame() then            			-- We're being called via #invoke. If the invoking template passed any args, use            			-- them. Otherwise, use the args that were passed into the template.            			origArgs = frame:getParent().args            			for k, v in pairs(frame.args) do                				origArgs = frame.args                				break            			end        		else            			-- We're being called from another module or from the debug console, so assume            			-- the args are passed in directly.            			origArgs = frame        		end     	         		-- ParserFunctions considers the empty string to be false, so to preserve the previous         		-- behavior of the template, change any empty arguments to nil, so Lua will consider        		-- them false too.        		local args = {}        		for k, v in pairs(origArgs) do            			if v ~= '' then                				args[k] = v            			end        		end     	         		return func(args)    	end
end
return {
    	sidebar = makeWrapper(_sidebar),    	collapsible = makeWrapper(_collapsibleSidebar)
}