Module:RecipeLoader: Difference between revisions
Jump to navigation
Jump to search
No edit summary |
No edit summary |
||
(28 intermediate revisions by the same user not shown) | |||
Line 1: | Line 1: | ||
local p = {} | local p = {} | ||
-- | local function normalizeArray(tbl) | ||
local function | local result = {} | ||
if not tbl then return result end | |||
for k, v in pairs(tbl) do | |||
-- Каждая строка тоже может быть ассоциативной таблицей | |||
if type(v) == "table" then | |||
local name = v[1] or v.name or v["1"] | |||
local count = v[2] or v.count or v["2"] or 1 | |||
table.insert(result, {name, count}) | |||
end | |||
end | |||
table.sort(result, function(a,b) return tostring(a[1]) < tostring(b[1]) end) | |||
return result | |||
end | |||
local function splitCamelCase(str) | |||
str = str:gsub("_", " ") | |||
-- "IronPlate" → "Iron Plate" | |||
str = str:gsub("(%l)(%u)", "%1 %2") | |||
-- "Uranium235" → "Uranium 235" | |||
str = str:gsub("(%a)(%d)", "%1 %2") | |||
-- "235Plate" → "235 Plate" | |||
str = str:gsub("(%d)(%a)", "%1 %2") | |||
return str | |||
end | |||
local function renderRecipeInput(recipe) | |||
local inputs = rnormalizeArray(ecipe.input) | |||
local tableNode = mw.html.create("table") | local tableNode = mw.html.create("table") | ||
:addClass(" | :addClass("recipe-table") | ||
local str = '' | |||
if #inputs > 0 then | |||
for _, ing in ipairs(inputs) do | |||
str = "|-\n| " .. str .. string.format("[[File:T_%s.png|22px]]", ing[1]) .. string.format("[[%s]] × %s", splitCamelCase(ing[1]), tostring(ing[2])) .. "\n" | |||
end | |||
else | |||
str = str .. "—" | |||
end | |||
return str | |||
end | |||
local function renderRecipe(recipe) | |||
local inputs = normalizeArray(recipe.input) | |||
local outputs = normalizeArray(recipe.output) | |||
local ticks = recipe.ticks or recipe.time or "" | |||
local | local tableNode = mw.html.create("table") | ||
:addClass("recipe-table") | |||
-- Заголовок с иконкой результата | |||
local title = recipe.name or "(no name)" | |||
if outputs[1] and outputs[1][1] then | |||
tableNode:tag("caption") | |||
:wikitext(string.format("[[File:T_%s.png|20px]] %s", | |||
outputs[1][1], | |||
splitCamelCase(title))) | |||
else | |||
tableNode:tag("caption"):wikitext(splitCamelCase(title)) | |||
end | |||
-- Input | |||
tableNode:tag("tr"):tag("th"):attr("colspan", 2):wikitext("Input") | |||
local | if #inputs > 0 then | ||
tr:tag("td"):wikitext(string.format("[[%s]] | for _, ing in ipairs(inputs) do | ||
local tr = tableNode:tag("tr") | |||
tr:tag("td"):wikitext("") | tr:tag("td"):wikitext(string.format("[[File:T_%s.png|22px]]", ing[1])) | ||
tr:tag("td"):wikitext(string.format("[[%s]] × %s", | |||
splitCamelCase(ing[1]), | |||
tostring(ing[2]))) | |||
end | end | ||
else | |||
tableNode:tag("tr"):tag("td"):attr("colspan", 2):wikitext("—") | |||
end | |||
-- Output | |||
tableNode:tag("tr"):tag("th"):attr("colspan", 2):wikitext("Output") | |||
local | if #outputs > 0 then | ||
tr:tag("td"):wikitext(string.format("[[%s]] | for _, res in ipairs(outputs) do | ||
local tr = tableNode:tag("tr") | |||
tr:tag("td"):wikitext("") | tr:tag("td"):wikitext(string.format("[[File:T_%s.png|22px]]", res[1])) | ||
tr:tag("td"):wikitext(string.format("[[%s]] × %s", | |||
splitCamelCase(res[1]), | |||
tostring(res[2]))) | |||
end | end | ||
else | |||
tableNode:tag("tr"):tag("td"):attr("colspan", 2):wikitext("—") | |||
end | |||
-- Time | |||
tableNode:tag("tr"):tag("th"):attr("colspan", 2):wikitext("Time") | |||
tableNode:tag("tr") | |||
:tag("td"):attr("colspan", 2) | |||
:css("text-align", "center") | |||
:wikitext(tostring(ticks/20.0) .. " sec") | |||
return tableNode | return tableNode | ||
end | end | ||
function p.getInput(frame) | |||
function p. | |||
local dictName = frame.args[1] | local dictName = frame.args[1] | ||
if not dictName | if not dictName then | ||
return "❌ Missing | return "❌ Missing parameter: dictName" | ||
end | end | ||
local success, recipes = pcall(mw.loadData, "Module:" .. dictName) | local success, recipes = pcall(mw.loadData, "Module:" .. dictName) | ||
if not success or type(recipes) ~= "table" then | if not success or type(recipes) ~= "table" then | ||
return " | return "" | ||
end | end | ||
return | return renderRecipeInput(recipes[1]) | ||
end | end | ||
Line 79: | Line 119: | ||
if not dictName then | if not dictName then | ||
return "❌ Missing parameter: | return "❌ Missing parameter: dictName" | ||
end | end | ||
local success, recipes = pcall(mw.loadData, "Module:" .. dictName) | local success, recipes = pcall(mw.loadData, "Module:" .. dictName) | ||
if not success or type(recipes) ~= "table" then | if not success or type(recipes) ~= "table" then | ||
return " | return "" | ||
end | end | ||
Line 90: | Line 130: | ||
for _, recipe in ipairs(recipes) do | for _, recipe in ipairs(recipes) do | ||
html:node(renderRecipe(recipe)) | html:node(renderRecipe(recipe)) | ||
end | end |
Latest revision as of 10:08, 2 August 2025
Documentation for this module may be created at Module:RecipeLoader/doc
local p = {}
local function normalizeArray(tbl)
local result = {}
if not tbl then return result end
for k, v in pairs(tbl) do
-- Каждая строка тоже может быть ассоциативной таблицей
if type(v) == "table" then
local name = v[1] or v.name or v["1"]
local count = v[2] or v.count or v["2"] or 1
table.insert(result, {name, count})
end
end
table.sort(result, function(a,b) return tostring(a[1]) < tostring(b[1]) end)
return result
end
local function splitCamelCase(str)
str = str:gsub("_", " ")
-- "IronPlate" → "Iron Plate"
str = str:gsub("(%l)(%u)", "%1 %2")
-- "Uranium235" → "Uranium 235"
str = str:gsub("(%a)(%d)", "%1 %2")
-- "235Plate" → "235 Plate"
str = str:gsub("(%d)(%a)", "%1 %2")
return str
end
local function renderRecipeInput(recipe)
local inputs = rnormalizeArray(ecipe.input)
local tableNode = mw.html.create("table")
:addClass("recipe-table")
local str = ''
if #inputs > 0 then
for _, ing in ipairs(inputs) do
str = "|-\n| " .. str .. string.format("[[File:T_%s.png|22px]]", ing[1]) .. string.format("[[%s]] × %s", splitCamelCase(ing[1]), tostring(ing[2])) .. "\n"
end
else
str = str .. "—"
end
return str
end
local function renderRecipe(recipe)
local inputs = normalizeArray(recipe.input)
local outputs = normalizeArray(recipe.output)
local ticks = recipe.ticks or recipe.time or ""
local tableNode = mw.html.create("table")
:addClass("recipe-table")
-- Заголовок с иконкой результата
local title = recipe.name or "(no name)"
if outputs[1] and outputs[1][1] then
tableNode:tag("caption")
:wikitext(string.format("[[File:T_%s.png|20px]] %s",
outputs[1][1],
splitCamelCase(title)))
else
tableNode:tag("caption"):wikitext(splitCamelCase(title))
end
-- Input
tableNode:tag("tr"):tag("th"):attr("colspan", 2):wikitext("Input")
if #inputs > 0 then
for _, ing in ipairs(inputs) do
local tr = tableNode:tag("tr")
tr:tag("td"):wikitext(string.format("[[File:T_%s.png|22px]]", ing[1]))
tr:tag("td"):wikitext(string.format("[[%s]] × %s",
splitCamelCase(ing[1]),
tostring(ing[2])))
end
else
tableNode:tag("tr"):tag("td"):attr("colspan", 2):wikitext("—")
end
-- Output
tableNode:tag("tr"):tag("th"):attr("colspan", 2):wikitext("Output")
if #outputs > 0 then
for _, res in ipairs(outputs) do
local tr = tableNode:tag("tr")
tr:tag("td"):wikitext(string.format("[[File:T_%s.png|22px]]", res[1]))
tr:tag("td"):wikitext(string.format("[[%s]] × %s",
splitCamelCase(res[1]),
tostring(res[2])))
end
else
tableNode:tag("tr"):tag("td"):attr("colspan", 2):wikitext("—")
end
-- Time
tableNode:tag("tr"):tag("th"):attr("colspan", 2):wikitext("Time")
tableNode:tag("tr")
:tag("td"):attr("colspan", 2)
:css("text-align", "center")
:wikitext(tostring(ticks/20.0) .. " sec")
return tableNode
end
function p.getInput(frame)
local dictName = frame.args[1]
if not dictName then
return "❌ Missing parameter: dictName"
end
local success, recipes = pcall(mw.loadData, "Module:" .. dictName)
if not success or type(recipes) ~= "table" then
return ""
end
return renderRecipeInput(recipes[1])
end
-- Вывод всех рецептов из словаря
function p.getAll(frame)
local dictName = frame.args[1]
if not dictName then
return "❌ Missing parameter: dictName"
end
local success, recipes = pcall(mw.loadData, "Module:" .. dictName)
if not success or type(recipes) ~= "table" then
return ""
end
local html = mw.html.create()
for _, recipe in ipairs(recipes) do
html:node(renderRecipe(recipe))
end
return tostring(html)
end
return p