Для документации этого модуля может быть создана страница Модуль:ChemCard/doc
local data = mw.loadData("Module:ChemCard/data")
local p = {}
p.chem = data.chem or {}
p.react = data.react or {}
p.groupDirection = data.groupDirection or {}
local function safe(val, default)
if val == nil then return default end
return val
end
local function textcolor(bg)
local r = tonumber(bg:sub(2,3),16)
local g = tonumber(bg:sub(4,5),16)
local b = tonumber(bg:sub(6,7),16)
local lum = math.sqrt(0.241*r*r + 0.691*g*g + 0.068*b*b)
if lum > 100 then return "#000" else return "#FFF" end
end
function p.card(frame)
local key = frame.args[1]
local chem = p.chem[key]
if not chem then return "" end
local bg = safe(chem.bg, "#101010")
local border = safe(chem.border, "#777777")
local color = safe(chem.color, "#FFFFFF")
local name = safe(chem.name, "Unknown")
local desc = safe(chem.desc, "")
local out = '<div class="chem-card" style="background:'..bg..'; border:2px solid '..border..'; padding:8px; border-radius:8px; margin:4px;">'
out = out .. '<div class="chem-card-header" style="color:'..color..'; font-weight:700; font-size:1.1em; margin-bottom:4px;">'..name..'</div>'
out = out .. '<div class="chem-card-desc" style="font-size:0.9em; margin-bottom:4px;">'..desc..'</div>'
if chem.recipes and #chem.recipes > 0 then
out = out .. '<div class="chem-card-recipes" style="font-size:0.85em; margin-top:4px;">'
for _, r in ipairs(chem.recipes) do
local react = p.react[r]
if react then
out = out .. '<b>Реакция:</b> '
local comps = {}
for k,v in pairs(react.reactants) do
table.insert(comps, k.." ["..v.amount.."]")
end
out = out .. table.concat(comps," + ") .. " → "
local results = {}
for k,v in pairs(react.products) do
table.insert(results, k.." ["..v.."]")
end
out = out .. table.concat(results," + ") .. "<br>"
if react.effects then
local effs = {}
for _, e in pairs(react.effects) do
table.insert(effs, e.name.." ("..e.amount..")")
end
out = out .. '<i>Эффекты:</i> '..table.concat(effs,", ")..'<br>'
end
end
end
out = out .. '</div>'
end
out = out .. '</div>'
return out
end
function p.list(frame)
local group = frame.args[1]
local out = '<div class="chem-cards-container">'
for k,chem in pairs(p.chem) do
if not group or chem.group == group then
out = out .. p.card({args={k}})
end
end
out = out .. '</div>'
return out
end
return p