Dantes (обсуждение | вклад) Нет описания правки Метка: отменено |
Dantes (обсуждение | вклад) Нет описания правки Метка: отменено |
||
| Строка 1: | Строка 1: | ||
local | local data = mw.loadData("Module:ChemCard/data") | ||
local p = {} | local p = {} | ||
p.chem = | p.chem = data.chem or {} | ||
p.react = | p.react = data.react or {} | ||
p.groupDirection = | p.groupDirection = data.groupDirection or {} | ||
local function safe(val, default) | local function safe(val, default) | ||
if val == nil then return default end | if val == nil then return default end | ||
return val | 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 | end | ||
| Строка 21: | Строка 23: | ||
local chem = p.chem[key] | local chem = p.chem[key] | ||
if not chem then return "" end | if not chem then return "" end | ||
local bg = safe(chem.bg, "#101010") | local bg = safe(chem.bg, "#101010") | ||
local border = safe(chem.border, "# | local border = safe(chem.border, "#777777") | ||
local color = safe(chem.color, "# | 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;">' | 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;">'.. | 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 | |||
out = out .. '<div class="chem-card-recipes" style="margin- | if chem.recipes and #chem.recipes > 0 then | ||
for _, | out = out .. '<div class="chem-card-recipes" style="font-size:0.85em; margin-top:4px;">' | ||
local | for _, r in ipairs(chem.recipes) do | ||
local react = p.react[r] | |||
if | if react then | ||
out = out .. '<b> | out = out .. '<b>Реакция:</b> ' | ||
for | local comps = {} | ||
for k,v in pairs(react.reactants) do | |||
table.insert(comps, k.." ["..v.amount.."]") | |||
end | end | ||
out = out .. | out = out .. table.concat(comps," + ") .. " → " | ||
for | local results = {} | ||
for k,v in pairs(react.products) do | |||
local | 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 | end | ||
end | end | ||
out = out .. '</div>' | out = out .. '</div>' | ||
end | 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 | ||
end | end | ||
out = out .. '</div>' | out = out .. '</div>' | ||
return out | return out | ||
Версия от 08:08, 11 ноября 2025
Для документации этого модуля может быть создана страница Модуль: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