Модуль:ChemCard: различия между версиями

Материал из Space Stories Wiki
Нет описания правки
Метка: отменено
Нет описания правки
Метка: отменено
Строка 1: Строка 1:
local prototypes = mw.loadData("Module:Chemistry Lookup/data")
local data = mw.loadData("Module:ChemCard/data")


local p = {}
local p = {}
p.chem = prototypes.chem
p.chem = data.chem or {}
p.react = prototypes.react
p.react = data.react or {}
p.groupDirection = prototypes.groupDirection
p.groupDirection = data.groupDirection or {}
 
local function tablelength(T)
  local count = 0
  for _ in pairs(T) do count = count + 1 end
  return count
end


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, "#777")
local border = safe(chem.border, "#777777")
local color = safe(chem.color, "#FFF")
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;">'..safe(chem.name,"Unknown")..'</div>'
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 tablelength(chem.recipes) > 0 then
 
out = out .. '<div class="chem-card-recipes" style="margin-bottom:4px;"><b>Рецепты:</b><br>'
if chem.recipes and #chem.recipes > 0 then
for _, recipe in pairs(chem.recipes) do
out = out .. '<div class="chem-card-recipes" style="font-size:0.85em; margin-top:4px;">'
local reactid = recipe.id or ""
for _, r in ipairs(chem.recipes) do
local reactdata = p.react[reactid]
local react = p.react[r]
if reactdata then
if react then
out = out .. '<b>Ингредиенты:</b> '
out = out .. '<b>Реакция:</b> '
for i, ing in pairs(reactdata.reactants) do
local comps = {}
local iname = safe(ing.name, "Unknown")
for k,v in pairs(react.reactants) do
local iamount = safe(ing.amount, 1)
table.insert(comps, k.." ["..v.amount.."]")
out = out .. iname .. " [" .. iamount .. "]"
if i<#reactdata.reactants then out = out .. ", " end
end
end
out = out .. '<br><b>Продукты:</b> '
out = out .. table.concat(comps," + ") .. " → "
for i, prod in pairs(reactdata.products) do
local results = {}
local pname = safe(prod.name, "Unknown")
for k,v in pairs(react.products) do
local pamount = safe(prod.amount, 1)
table.insert(results, k.." ["..v.."]")
out = out .. pname .. " [" .. pamount .. "]"
end
if i<#reactdata.products then out = out .. ", " 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
out = out .. '<br><hr style="border:1px solid #444;">'
end
end
end
end
out = out .. '</div>'
out = out .. '</div>'
end
end
 
if chem.metabolisms and tablelength(chem.metabolisms) > 0 then
out = out .. '</div>'
out = out .. '<div class="chem-card-effects" style="margin-bottom:4px;"><b>Эффекты:</b><br>'
return out
for k, met in pairs(chem.metabolisms) do
end
for _, e in pairs(met.effects) do
 
out = out .. safe(e.description,"") .. "<br>"
function p.list(frame)
end
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>'
end
end
out = out .. '<div class="chem-card-desc" style="font-size:0.9em;">'..safe(chem.desc,"")..'</div>'
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