Module:OOOInfoBox: Difference between revisions
Appearance
No edit summary |
No edit summary |
||
Line 1: | Line 1: | ||
-- Module:OOOInfoBox | |||
local DATA = require('Module:OOO/Data') | local DATA = require('Module:OOO/Data') | ||
local p = {} | local p = {} | ||
-- --- helpers --------------------------------------------------------------- | |||
local function trim(s) return s and mw.text.trim(tostring(s)) or s end | local function trim(s) return s and mw.text.trim(tostring(s)) or s end | ||
Line 7: | Line 10: | ||
v = data and data[key]; if v ~= nil and tostring(v) ~= '' then return v end | v = data and data[key]; if v ~= nil and tostring(v) ~= '' then return v end | ||
end | end | ||
local function warn(msg) | local function warn(msg) | ||
return '<div class="mw-message-box mw-message-box-warning"><b>OOOInfoBox</b>: '..msg..'</div>' | return '<div class="mw-message-box mw-message-box-warning"><b>OOOInfoBox</b>: '..msg..'</div>' | ||
end | 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 | |||
-- 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) | function p.building(frame) | ||
Line 16: | Line 59: | ||
local args = parent.args or {} | local args = parent.args or {} | ||
local out = mw.html.create('div') | |||
local domain = trim(args.type or args.domain or 'Buildings') | 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) | local art = trim(args.art or args.artNumber or args.id) | ||
if not art or art == '' then | if not art or art == '' then | ||
out:wikitext(warn('Use |art=ART_NUMBER (e.g. 400113).')) | |||
return tostring(out) | |||
end | end | ||
local data = DATA.get(domain, art) | local data = DATA.get(domain, art) | ||
if not data then | if not data then | ||
out:wikitext(warn(('No record for %s:%s.'):format(domain, art))) | |||
return tostring(out) | |||
end | end | ||
-- | -- fields | ||
local | local title = pick(args, data, 'displayName') or ('Item '..art) | ||
local | 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_row(box, 'Domain', domain) | |||
add_row(box, 'Art Number', art) | |||
add_row(box, 'Type', pick(args, data, 'type')) | |||
-- Performance / Power | |||
add_group_header(box, 'Performance') | |||
add_row(box, 'Throughput (m³/h)', pick(args, data, 'throughput_m3h')) | |||
add_row(box, 'Power (kW)', with_unit(pick(args, data, 'power_kw'), U.kw)) | |||
add_row(box, 'Capacity', pick(args, data, 'capacity')) | |||
-- I/O (mergers/splitters etc.) | |||
local belt_in = pick(args, data, 'beltInputs') | |||
local belt_out = pick(args, data, 'beltOutputs') | |||
local pipe_in = pick(args, data, 'pipeInputs') | |||
local pipe_out = pick(args, data, 'pipeOutputs') | |||
if belt_in or belt_out or pipe_in or pipe_out then | |||
add_group_header(box, 'I/O') | |||
add_row(box, 'Conveyor inputs', belt_in) | |||
add_row(box, 'Conveyor outputs', belt_out) | |||
add_row(box, 'Pipeline inputs', pipe_in) | |||
add_row(box, 'Pipeline outputs', pipe_out) | |||
end | |||
-- Dimensions (with tiny tooltip like their wiki) | |||
local size_w = pick(args, data, 'size_width') | |||
local size_l = pick(args, data, 'size_length') | |||
local size_h = pick(args, data, 'size_height') | |||
local size_note = pick(args, data, 'size_note') | |||
if size_w or size_l or size_h or size_note then | |||
add_group_header(box, 'Dimensions') | |||
add_row(box, 'Width', with_unit(size_w, U.m), 'Measured outer width') | |||
add_row(box, 'Length', with_unit(size_l, U.m), 'Measured outer length') | |||
add_row(box, 'Height', with_unit(size_h, U.m), 'Measured to highest point') | |||
if tonumber(size_w) and tonumber(size_l) then | |||
local area = tonumber(size_w) * tonumber(size_l) | |||
add_row(box, 'Area', with_unit(area, U.m2)) | |||
end | end | ||
add_row(box, 'Note', size_note) | |||
end | end | ||
out:node(box) | |||
return tostring(out) | |||
return tostring( | |||
end | end | ||
return p | return p |
Revision as of 20:43, 6 October 2025
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
-- 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_row(box, 'Domain', domain)
add_row(box, 'Art Number', art)
add_row(box, 'Type', pick(args, data, 'type'))
-- Performance / Power
add_group_header(box, 'Performance')
add_row(box, 'Throughput (m³/h)', pick(args, data, 'throughput_m3h'))
add_row(box, 'Power (kW)', with_unit(pick(args, data, 'power_kw'), U.kw))
add_row(box, 'Capacity', pick(args, data, 'capacity'))
-- I/O (mergers/splitters etc.)
local belt_in = pick(args, data, 'beltInputs')
local belt_out = pick(args, data, 'beltOutputs')
local pipe_in = pick(args, data, 'pipeInputs')
local pipe_out = pick(args, data, 'pipeOutputs')
if belt_in or belt_out or pipe_in or pipe_out then
add_group_header(box, 'I/O')
add_row(box, 'Conveyor inputs', belt_in)
add_row(box, 'Conveyor outputs', belt_out)
add_row(box, 'Pipeline inputs', pipe_in)
add_row(box, 'Pipeline outputs', pipe_out)
end
-- Dimensions (with tiny tooltip like their wiki)
local size_w = pick(args, data, 'size_width')
local size_l = pick(args, data, 'size_length')
local size_h = pick(args, data, 'size_height')
local size_note = pick(args, data, 'size_note')
if size_w or size_l or size_h or size_note then
add_group_header(box, 'Dimensions')
add_row(box, 'Width', with_unit(size_w, U.m), 'Measured outer width')
add_row(box, 'Length', with_unit(size_l, U.m), 'Measured outer length')
add_row(box, 'Height', with_unit(size_h, U.m), 'Measured to highest point')
if tonumber(size_w) and tonumber(size_l) then
local area = tonumber(size_w) * tonumber(size_l)
add_row(box, 'Area', with_unit(area, U.m2))
end
add_row(box, 'Note', size_note)
end
out:node(box)
return tostring(out)
end
return p