Jump to content

📢 Please make sure to read our Style Guide before editing. For questions, suggestions, or technical issues, please contact Noah.

Module:Infobox: Difference between revisions

From CrabCraft Wiki
Adds custom infobox colour
m fixed little naming error
 
(3 intermediate revisions by the same user not shown)
Line 32: Line 32:
local args = frame:getParent().args
local args = frame:getParent().args
args = filter_sections(args)
args = filter_sections(args)
local section_colour = args[1]
local data_args = args[2]
local out = {}
local out = {}


table.insert(out,
table.insert(out,'{| class="infobox"')
  '{| class="infobox"'
    .. ' style="'
      .. 'width:300px; '
      .. 'float:right; '
      .. 'margin:0 0 0.5em 0.5em; '
      .. 'border:1px solid #aaa; '
      .. 'border-collapse:separate; '
      .. 'border-spacing:0.5em;'
    .. '"'
)
      
      
local function add_title(data)
local function add_title(data)
if not data then return end
if not data then return end
table.insert(out, '|-\n! colspan="2" style="font-size:120%; background:#F4BB44;" | ' .. data)
table.insert(out, '|-\n! class="infobox-title" colspan="2" | ' .. data)
end
end
local function add_section(data)
local function add_section(data)
if not data then return end
if not data then return end
table.insert(out, '|-\n! colspan="2" style="background: ' .. section_colour .. ';" | ' .. data)
table.insert(out, '|-\n! class="infobox-section" colspan="2" | ' .. data)
end
end


local function add_field(label, data)
local function add_field(label, data)
if not data then return end
if not data then return end
    local left  = 'style="width:50%; text-align:left; font-weight:bold; vertical-align:top;" | ' .. label
    local left  = 'class="infobox-leftfield" | ' .. label
    local right = 'style="width:50%; text-align:left; vertical-align:top;"       | ' .. data
    local right = 'class="infobox-rightfield" | ' .. data
    table.insert(out, '|-\n|'..left..'||'..right)
    table.insert(out, '|-\n|'..left..'||'..right)
end
end
Line 69: Line 56:
local function add_image(data)
local function add_image(data)
if not data then return end
if not data then return end
table.insert(out, '|-\n| colspan="2" style="text-align:center;" | ' .. data)
table.insert(out, '|-\n| class="infobox-image" colspan="2" | ' .. data)
end
end
for i, comp in ipairs(data_args) do
for i, comp in ipairs(args) do
if comp[1] == 't' then add_title(comp[2])
if comp[1] == 't' then add_title(comp[2])
elseif comp[1] == 's' then add_section(comp[2])
elseif comp[1] == 's' then add_section(comp[2])

Latest revision as of 20:35, 23 June 2025

Documentation for this module may be created at Module:Infobox/doc

local p = {}

local function filter_sections(components)
	local out = {}
	local buffer = {}
	local has_fields = false
	
	for i, comp in ipairs(components) do
		if comp[1] == 's' then
			if has_fields then
				for _, c in ipairs(buffer) do table.insert(out, c) end
			end
			buffer = { comp }
			has_fields = false
		elseif comp[1] == 'f' then
			if comp[3] and comp[3] ~= '' then
				has_fields = true
				table.insert(buffer, comp)
			end
		else
			table.insert(out, comp)
		end
	end
	
	if buffer[1][1] ~= "s" or #buffer > 1 then 
		for _, c in ipairs(buffer) do table.insert(out, c) end
	end
	return out
end

function p.infobox(frame)
	local args = frame:getParent().args
	args = filter_sections(args)
	local out = {}

	table.insert(out,'{| class="infobox"')
    
	local function add_title(data)
		if not data then return end
		table.insert(out, '|-\n! class="infobox-title" colspan="2" | ' .. data)
	end
	
	local function add_section(data)
		if not data then return end
		table.insert(out, '|-\n! class="infobox-section" colspan="2" | ' .. data)
	end

	local function add_field(label, data)
		if not data then return end
	    local left  = 'class="infobox-leftfield" | ' .. label
	    local right = 'class="infobox-rightfield" | ' .. data
	    table.insert(out, '|-\n|'..left..'||'..right)
	end

	
	local function add_image(data)
		if not data then return end
		table.insert(out, '|-\n| class="infobox-image" colspan="2" | ' .. data)
	end
	
	for i, comp in ipairs(args) do
		if comp[1] == 't' then add_title(comp[2])
		elseif comp[1] == 's' then add_section(comp[2])
		elseif comp[1] == 'f' then add_field(comp[2], comp[3])
		elseif comp[1] == 'i' then add_image(comp[2])
		end
	end

	table.insert(out, '|}')

	return table.concat(out, '\n')
end

return p