Module:OOOInfoBox: Difference between revisions
Appearance
No edit summary |
No edit summary Tag: Reverted |
||
Line 1: | Line 1: | ||
local p = {} | local p = {} | ||
-- | -- Try JSON first (Template:Docs.json), then Lua table (Module:DocsJSON) | ||
local function load_docs() | |||
local ok, data = pcall(mw.loadJsonData, 'Template:Docs.json') | |||
if ok and type(data) == 'table' then | |||
return data, 'Template:Docs.json (loadJsonData)' | |||
end | |||
local | local t = mw.title.new('Template:Docs.json') | ||
if t then | |||
local content = t:getContent() | |||
if content and content ~= '' then | |||
local ok2, tbl = pcall(mw.text.jsonDecode, content) | |||
local | if ok2 and type(tbl) == 'table' then | ||
return tbl, 'Template:Docs.json (jsonDecode)' | |||
end | |||
end | |||
end | |||
end | end | ||
local DOCS, SOURCE = load_docs() | |||
local | |||
local function | 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[key]; if v ~= nil and tostring(v) ~= '' then return v end | |||
end | end | ||
local function warn(msg) | |||
local function | return '<div class="mw-message-box mw-message-box-warning"><b>OOOInfoBox</b>: '..msg..'</div>' | ||
end | end | ||
-- | -- more forgiving key lookup + debug | ||
local function | local function find_record(art) | ||
-- direct lookups | |||
local | local rec = DOCS[art] or DOCS[tostring(tonumber(art) or art)] | ||
if rec then return rec end | |||
end | |||
-- trim/loose match on keys (handles stray spaces/non-visible chars) | |||
local art_trim = trim(art) | |||
for k, v in pairs(DOCS) do | |||
if trim(tostring(k)) == art_trim then | |||
return v | |||
end | |||
end | |||
return nil | |||
end | end | ||
function p.building(frame) | function p.building(frame) | ||
local args = frame:getParent().args or {} | |||
local art = trim(args.art or args.artNumber or args.id) | |||
if not art or art == '' then | |||
return warn('Use |art=ART_NUMBER (e.g. 400113).') | |||
end | |||
if type(DOCS) ~= 'table' or next(DOCS) == nil then | |||
return warn('Could not load data. Tried: '..(SOURCE or '(unknown)')..'.') | |||
end | |||
local data = find_record(art) | |||
if not data then | |||
-- show a few keys to diagnose quickly | |||
local samples, count = {}, 0 | |||
for k, _ in pairs(DOCS) do | |||
count = count + 1 | |||
if #samples < 5 then table.insert(samples, '"'..tostring(k)..'"') end | |||
end | |||
local sample_txt = (#samples > 0) and table.concat(samples, ', ') or '(no keys)' | |||
return warn(('Key "%s" not found in %s. Sample keys: %s (count: %d)') | |||
:format(art, SOURCE or '(unknown)', sample_txt, count)) | |||
end | |||
local box = mw.html.create('table'):addClass('infobox') | |||
local title = pick(args, data, 'displayName') or ('Item '..art) | |||
box:tag('tr'):tag('th'):attr('colspan','2'):wikitext(title) | |||
local function row(label, key, fixed) | |||
local v = fixed or pick(args, data, key) | |||
if v ~= nil and tostring(v) ~= '' then | |||
local tr = box:tag('tr') | |||
tr:tag('th'):wikitext(label) | |||
tr:tag('td'):wikitext(v) | |||
end | |||
end | |||
row('Art Number', nil, art) | |||
row('Type', 'type') | |||
row('Throughput (m³/h)', 'throughput_m3h') | |||
row('Power (kW)', 'power_kw') | |||
row('Capacity', 'capacity') | |||
box:wikitext('<!-- OOOInfoBox source: '..(SOURCE or 'unknown')..' -->') | |||
return tostring(box) | |||
end | end | ||
return p | return p |
Revision as of 06:26, 7 October 2025
Documentation for this module may be created at Module:OOOInfoBox/doc
local p = {}
-- Try JSON first (Template:Docs.json), then Lua table (Module:DocsJSON)
local function load_docs()
local ok, data = pcall(mw.loadJsonData, 'Template:Docs.json')
if ok and type(data) == 'table' then
return data, 'Template:Docs.json (loadJsonData)'
end
local t = mw.title.new('Template:Docs.json')
if t then
local content = t:getContent()
if content and content ~= '' then
local ok2, tbl = pcall(mw.text.jsonDecode, content)
if ok2 and type(tbl) == 'table' then
return tbl, 'Template:Docs.json (jsonDecode)'
end
end
end
end
local DOCS, SOURCE = load_docs()
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[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
-- more forgiving key lookup + debug
local function find_record(art)
-- direct lookups
local rec = DOCS[art] or DOCS[tostring(tonumber(art) or art)]
if rec then return rec end
-- trim/loose match on keys (handles stray spaces/non-visible chars)
local art_trim = trim(art)
for k, v in pairs(DOCS) do
if trim(tostring(k)) == art_trim then
return v
end
end
return nil
end
function p.building(frame)
local args = frame:getParent().args or {}
local art = trim(args.art or args.artNumber or args.id)
if not art or art == '' then
return warn('Use |art=ART_NUMBER (e.g. 400113).')
end
if type(DOCS) ~= 'table' or next(DOCS) == nil then
return warn('Could not load data. Tried: '..(SOURCE or '(unknown)')..'.')
end
local data = find_record(art)
if not data then
-- show a few keys to diagnose quickly
local samples, count = {}, 0
for k, _ in pairs(DOCS) do
count = count + 1
if #samples < 5 then table.insert(samples, '"'..tostring(k)..'"') end
end
local sample_txt = (#samples > 0) and table.concat(samples, ', ') or '(no keys)'
return warn(('Key "%s" not found in %s. Sample keys: %s (count: %d)')
:format(art, SOURCE or '(unknown)', sample_txt, count))
end
local box = mw.html.create('table'):addClass('infobox')
local title = pick(args, data, 'displayName') or ('Item '..art)
box:tag('tr'):tag('th'):attr('colspan','2'):wikitext(title)
local function row(label, key, fixed)
local v = fixed or pick(args, data, key)
if v ~= nil and tostring(v) ~= '' then
local tr = box:tag('tr')
tr:tag('th'):wikitext(label)
tr:tag('td'):wikitext(v)
end
end
row('Art Number', nil, art)
row('Type', 'type')
row('Throughput (m³/h)', 'throughput_m3h')
row('Power (kW)', 'power_kw')
row('Capacity', 'capacity')
box:wikitext('<!-- OOOInfoBox source: '..(SOURCE or 'unknown')..' -->')
return tostring(box)
end
return p