Module:Sandbox/User:The Gaffer/Modules/Infobox Switch

Documentation for this module may be created at Module:Sandbox/User:The Gaffer/Modules/Infobox Switch/doc

local p = {}

local yn = require('Module:Yesno')
local hc = require('Module:Paramtest').has_content

-- Module access point for infobox switch
p._infobox_switch = function(args)
	-- Prepare content list from arguments
	local contents = {}
	local i = 1
	while args['item'..i] do
		table.insert(contents, { text = args['text'..i] or ('Item '..i),
					content = '\n' .. args['item'..i],
					id = args['switch_id'..i] or i})
		i = i + 1
	end
	
	-- Create the main table structure for the infobox switch
	local structure = mw.html.create('table')
		:addClass('infobox-switch')
		:tag('caption')
		:done();
				
	-- Create the div for the buttons inside the caption		
	local buttons = structure:tag('div')
		:attr('data-default-index', 1)

	-- Add buttons for each item in contents
	for i, v in ipairs(contents) do
		buttons:tag('button')
			:addClass('button')
			:attr('data-switch-index', i)
			:attr('data-switch-anchor', '#section' ..i)
			:wikitext(v.text)
			:done()
	end
	
	local content_body = structure:tag('tbody')
    local default_content = contents[1]  -- Assuming default index is 1
    if default_content then
        local row = content_body:tag('tr')
        row:tag('td')
            :attr('data-attr-param', 'param1')
            :wikitext(default_content.content)
            :done()
        row:done()
    end
    
    -- Create the hidden resources section that contains all switchable content
    local resources_div = structure:tag('div')
        :addClass('infobox-switch-resources')

    -- Add each content section to the resources div
    for i, v in ipairs(contents) do
        local param_div = resources_div:tag('div')
            :attr('data-attr-param', 'param1')

        param_div:tag('div')
            :attr('data-attr-index', i)
            :wikitext(v.content)
            :done()

        param_div:done()
    end

    -- Return the complete HTML structure
    return tostring(structure)
end

-- Public function to be called by templates
p.infobox_switch = function(frame)
    local html_output = p._infobox_switch(frame:getParent().args)
    -- Use frame:extensionTag() to wrap the HTML in a div and ensure it is treated as raw HTML
    return frame:extensionTag('div', html_output, { contentmodel = 'html' })
end


return p