Module:OOOInfoBox
Documentation for this module may be created at Module:OOOInfoBox/doc
-- Module:OOOInfoBox
local DATA = require('Module:OOO/Data')
local p = {}
-- --- helpers ---------------------------------------------------------------
local function trim(s) return s and mw.text.trim(tostring(s)) or s end
local function pick(args, data, key)
local v = args[key]; if v and trim(v) ~= '' then return trim(v) end
v = data and data[key]; if v ~= nil and tostring(v) ~= '' then return v end
end
local function warn(msg)
return '<div class="mw-message-box mw-message-box-warning"><b>OOOInfoBox</b>: '..msg..'</div>'
end
local function render_image(name)
if not name or name == '' then return nil end
return string.format('[[File:%s|center|300px]]', mw.text.trim(name))
end
local function add_group(tbl, header, rows)
-- rows: { {label, value, tip}, ... }
local has = false
for _, r in ipairs(rows) do
local v = r[2]
if v ~= nil and tostring(v) ~= '' then has = true break end
end
if not has then return end
add_group_header(tbl, header)
for _, r in ipairs(rows) do
local label, value, tip = r[1], r[2], r[3]
if value ~= nil and tostring(value) ~= '' then
add_row(tbl, label, value, tip)
end
end
end
-- units
local U = {
m = ' m',
m2 = ' m<sup>2</sup>',
m3 = ' m<sup>3</sup>',
mw = ' MW',
kw = ' kW',
pmin = ' / min',
}
local function with_unit(v, unit)
if v == nil or v == '' then return nil end
return tostring(v) .. (unit or '')
end
-- label + tooltip
local function label_with_tip(label, tip)
if not tip or tip == '' then return label end
return string.format('<span title="%s">%s</span>', tip, label)
end
-- row builders
local function add_row(tbl, label, value, tip)
if value ~= nil and tostring(value) ~= '' then
local tr = tbl:tag('tr')
tr:tag('th'):wikitext(label_with_tip(label, tip))
tr:tag('td'):wikitext(value)
end
end
local function add_group_header(tbl, text)
local tr = tbl:tag('tr'):addClass('ooo-infobox__group')
tr:tag('th'):attr('colspan', '2'):wikitext(text)
end
-- --- main ------------------------------------------------------------------
function p.building(frame)
local parent = frame:getParent() or frame
local args = parent.args or {}
local out = mw.html.create('div')
out:wikitext(frame:extensionTag('templatestyles', '', { src = 'Template:OOOInfoBox/styles.css' }))
local domain = trim(args.type or args.domain or 'Buildings')
local art = trim(args.art or args.artNumber or args.id)
if not art or art == '' then
out:wikitext(warn('Use |art=ART_NUMBER (e.g. 400113).'))
return tostring(out)
end
local data = DATA.get(domain, art)
if not data then
out:wikitext(warn(('No record for %s:%s.'):format(domain, art)))
return tostring(out)
end
-- fields
local title = pick(args, data, 'displayName') or ('Item '..art)
local image = pick(args, data, 'image') or 'Icon SM AsphaltPlantV3.png'
local caption = pick(args, data, 'description') or pick(args, data, 'caption')
local box = mw.html.create('table'):addClass('ooo-infobox')
-- Title
box:tag('tr')
:tag('th')
:addClass('ooo-infobox__title')
:attr('colspan', '2')
:wikitext(title)
-- Image
local img = render_image(image)
if img then
box:tag('tr')
:tag('td')
:addClass('ooo-infobox__image')
:attr('colspan','2')
:wikitext(img)
end
if caption and caption ~= '' then
box:tag('tr')
:tag('td')
:addClass('ooo-infobox__caption')
:attr('colspan','2')
:wikitext(caption)
end
-- Basics
add_group(box, 'General', {
{'Category', pick(args, data, 'category')},
{'Subcategory',pick(args, data, 'subcategory')},
{'Price', pick(args, data, 'price')},
{'Art Number', art},
{'Domain', domain},
})
-- Performance (auto-hides if empty)
add_group(box, 'Performance', {
{'Throughput (m³/h)', pick(args, data, 'throughput_m3h')},
{'Capacity', pick(args, data, 'capacity')},
})
-- Power (keep separate from Performance; easy to add more later)
add_group(box, 'Power', {
{'Power (kW)', with_unit(pick(args, data, 'power_kw'), U.kw)},
-- Example for later: {'Generated (MW)', with_unit(pick(args, data, 'power_generated_mw'), U.mw)},
})
-- I/O (mergers/splitters etc.)
add_group(box, 'I/O', {
{'Conveyor inputs', pick(args, data, 'beltInputs')},
{'Conveyor outputs', pick(args, data, 'beltOutputs')},
{'Pipeline inputs', pick(args, data, 'pipeInputs')},
{'Pipeline outputs', pick(args, data, 'pipeOutputs')},
})
-- Dimensions: supports size={x,y,z} and compact/expanded modes
local sx, sy, sz
if data.size and type(data.size) == 'table' then
sx, sy, sz = data.size.x, data.size.y, data.size.z
end
local size_w = pick(args, data, 'size_width') or sx
local size_l = pick(args, data, 'size_length') or sy
local size_h = pick(args, data, 'size_height') or sz
local size_note = pick(args, data, 'size_note')
local dims_mode = (args.dimensions or ''):lower() -- "compact" or "expanded"
if dims_mode == '' then dims_mode = 'compact' end -- default: compact line
if dims_mode == 'compact' then
local function fmt(x) return x and tostring(x) or '' end
local compact = nil
if size_w or size_l or size_h then
compact = table.concat({fmt(size_w), '×', fmt(size_l), (size_h and '×' or ''), fmt(size_h)}, '')
compact = mw.text.trim(compact)
if compact ~= '' then compact = compact .. U.m end
end
add_group(box, 'Dimensions', {
{'Overall', compact, 'Width × Length × Height'},
{'Note', size_note},
})
else
add_group(box, 'Dimensions', {
{'Width', with_unit(size_w, U.m), 'Measured outer width'},
{'Length', with_unit(size_l, U.m), 'Measured outer length'},
{'Height', with_unit(size_h, U.m), 'Measured to highest point'},
(tonumber(size_w) and tonumber(size_l))
and {'Area', with_unit(tonumber(size_w)*tonumber(size_l), U.m2)}
or nil,
{'Note', size_note},
})
end
out:node(box)
return tostring(out)
end
return p