URim (обсуждение | вклад) (фикс grindable и toolmade) |
URim (обсуждение | вклад) (попытка фикс, добавление якоря в шаблон) |
||
Строка 1: | Строка 1: | ||
local p = {} | local p = {} | ||
Строка 124: | Строка 125: | ||
for recipeId, recipe in pairs(recipes[recipeType]) do | for recipeId, recipe in pairs(recipes[recipeType]) do | ||
local templateArgs = {} | local templateArgs = {} | ||
-- Определяем resultId для якоря | |||
local resultId = recipe.result or recipeId -- Используем result, если он есть, иначе recipeId | |||
-- Добавляем id в аргументы шаблона | |||
templateArgs.id = resultId | |||
-- Обработка для microwaveRecipes | -- Обработка для microwaveRecipes | ||
Строка 157: | Строка 164: | ||
-- Формируем аргументы для шаблона | -- Формируем аргументы для шаблона | ||
templateArgs | templateArgs.result = result .. " " .. resultImage | ||
templateArgs.solids = table.concat(solidsList, ", ") or "Нет ингредиентов" | |||
templateArgs.reagents = table.concat(reagentsList, ", ") or "Нет реагентов" | |||
templateArgs.time = recipe.time or "Нет данных" | |||
-- Обработка для sliceableRecipes | -- Обработка для sliceableRecipes | ||
Строка 179: | Строка 184: | ||
local count = recipe.count or "Нет данных" | local count = recipe.count or "Нет данных" | ||
templateArgs | templateArgs.input = input .. " " .. inputImage | ||
templateArgs.result = result .. " " .. resultImage | |||
templateArgs.count = count | |||
-- Обработка для grindableRecipes | -- Обработка для grindableRecipes | ||
Строка 204: | Строка 207: | ||
end | end | ||
templateArgs | templateArgs.input = input .. " " .. inputImage | ||
templateArgs.result = table.concat(resultList, ", ") or "Нет результата" | |||
-- Обработка для heatableRecipes | -- Обработка для heatableRecipes | ||
Строка 224: | Строка 225: | ||
local minTemp = recipe.minTemp or "Нет данных" | local minTemp = recipe.minTemp or "Нет данных" | ||
templateArgs | templateArgs.input = input .. " " .. inputImage | ||
templateArgs.result = result .. " " .. resultImage | |||
templateArgs.minTemp = minTemp | |||
-- Обработка для toolmadeRecipes | -- Обработка для toolmadeRecipes | ||
Строка 248: | Строка 247: | ||
local toolImage = toolData.image or "" | local toolImage = toolData.image or "" | ||
templateArgs | templateArgs.input = input .. " " .. inputImage | ||
templateArgs.result = result .. " " .. resultImage | |||
templateArgs.tool = tool .. " " .. toolImage | |||
end | end | ||
-- Генерация строки таблицы с использованием шаблона | -- Генерация строки таблицы с использованием шаблона |
Версия от 16:18, 10 марта 2025
Для документации этого модуля может быть создана страница Модуль:TableOfRecipes/doc
local p = {} -- Кэш для хранения данных о рецептах local recipeCache = nil -- Кэш для хранения данных о химических веществах local chemCache = nil -- Кэш для перевода идентификаторов local translationCache = {} -- Функция для логирования local function log(message) mw.log("DEBUG: " .. message) end -- Функция для загрузки данных о рецептах из JSON-файла local function loadRecipes() if recipeCache then return recipeCache end local success, data = pcall(function() return mw.text.jsonDecode(mw.title.new("User:CapybaraBot/mealrecipes_prototypes.json"):getContent()) end) if success and type(data) == "table" then recipeCache = data return data else log("Ошибка при загрузке JSON (mealrecipes_prototypes.json): " .. tostring(data)) return {} end end -- Функция для загрузки данных о химических веществах из JSON-файла local function loadChemPrototypes() if chemCache then return chemCache end local success, data = pcall(function() return mw.text.jsonDecode(mw.title.new("User:CapybaraBot/chem_prototypes.json"):getContent()) end) if success and type(data) == "table" then chemCache = data return data else log("Ошибка при загрузке JSON (chem_prototypes.json): " .. tostring(data)) return {} end end -- Функция для перевода ID с использованием Module:Entity Lookup (для твердых веществ) local function translateID(frame, id) if translationCache[id] then return translationCache[id] end local translatedName = frame:callParserFunction{ name = '#invoke', args = { 'Entity_Lookup', 'getname', id } } if translatedName then translationCache[id] = { name = translatedName, image = string.format("[[Файл:%s.png|32px]]", id) } else translationCache[id] = { name = id, -- Если перевод не найден, возвращаем исходный ID image = "" } end return translationCache[id] end -- Функция для перевода реагента (жидкого вещества) из chem_prototypes.json local function translateReagent(reagentId) local chemData = loadChemPrototypes() if chemData[reagentId] and chemData[reagentId].name then return chemData[reagentId].name else return reagentId -- Если перевод не найден, возвращаем исходный ID end end -- Функция для создания хэш-таблицы с результатами рецептов local function createRecipeResultLookup(recipes) local lookup = {} for recipeType, recipeList in pairs(recipes) do for recipeId, recipe in pairs(recipeList) do if recipe.result then lookup[recipe.result] = true end end end return lookup end -- Функция для создания ссылки на строку таблицы local function createLinkToRow(ingredientId, ingredientName) return string.format("[[#%s|%s]]", ingredientId, ingredientName) end -- Основная функция для генерации таблицы с рецептами p.fillRecipeTable = function(frame) local args = frame.args local recipeType = args.recipeType or "microwaveRecipes" local templateName = args.template or "RecipeRow" local out = "" -- Загрузка данных о рецептах local recipes = loadRecipes() if not recipes or not recipes[recipeType] then return "Ошибка: данные о рецептах не загружены или тип рецептов не найден." end -- Создаем хэш-таблицу для быстрой проверки результатов рецептов local recipeResultLookup = createRecipeResultLookup(recipes) -- Перебираем рецепты без сортировки for recipeId, recipe in pairs(recipes[recipeType]) do local templateArgs = {} -- Определяем resultId для якоря local resultId = recipe.result or recipeId -- Используем result, если он есть, иначе recipeId -- Добавляем id в аргументы шаблона templateArgs.id = resultId -- Обработка для microwaveRecipes if recipeType == "microwaveRecipes" then -- Переводим результат local resultData = translateID(frame, recipe.result) local result = resultData.name or "Нет результата" local resultImage = resultData.image or "" -- Формируем список ингредиентов (solids) local solidsList = {} if recipe.solids and type(recipe.solids) == "table" then for solidId, amount in pairs(recipe.solids) do local solidData = translateID(frame, solidId) local ingredientName = solidData.name local ingredientImage = solidData.image -- Проверяем, можно ли приготовить ингредиент if recipeResultLookup[solidId] then ingredientName = createLinkToRow(solidId, ingredientName) end table.insert(solidsList, string.format("%s %s (%d)", ingredientName, ingredientImage, amount)) end end -- Формируем список реагентов (reagents) local reagentsList = {} if recipe.reagents and type(recipe.reagents) == "table" then for reagentId, amount in pairs(recipe.reagents) do local reagentName = translateReagent(reagentId) table.insert(reagentsList, string.format("%s (%d)", reagentName, amount)) end end -- Формируем аргументы для шаблона templateArgs.result = result .. " " .. resultImage templateArgs.solids = table.concat(solidsList, ", ") or "Нет ингредиентов" templateArgs.reagents = table.concat(reagentsList, ", ") or "Нет реагентов" templateArgs.time = recipe.time or "Нет данных" -- Обработка для sliceableRecipes elseif recipeType == "sliceableRecipes" then local inputData = translateID(frame, recipe.input) local input = inputData.name or "Нет входного элемента" local inputImage = inputData.image or "" -- Проверяем, можно ли приготовить input if recipeResultLookup[recipe.input] then input = createLinkToRow(recipe.input, input) end local resultData = translateID(frame, recipe.result) local result = resultData.name or "Нет результата" local resultImage = resultData.image or "" local count = recipe.count or "Нет данных" templateArgs.input = input .. " " .. inputImage templateArgs.result = result .. " " .. resultImage templateArgs.count = count -- Обработка для grindableRecipes elseif recipeType == "grindableRecipes" then local inputData = translateID(frame, recipe.input) local input = inputData.name or "Нет входного элемента" local inputImage = inputData.image or "" -- Проверяем, можно ли приготовить input if recipeResultLookup[recipe.input] then input = createLinkToRow(recipe.input, input) end local resultList = {} if recipe.result and type(recipe.result) == "table" then for reagentId, amount in pairs(recipe.result) do local reagentName = translateReagent(reagentId) table.insert(resultList, string.format("%s (%d)", reagentName, amount)) end end templateArgs.input = input .. " " .. inputImage templateArgs.result = table.concat(resultList, ", ") or "Нет результата" -- Обработка для heatableRecipes elseif recipeType == "heatableRecipes" then local inputData = translateID(frame, recipe.input) local input = inputData.name or "Нет входного элемента" local inputImage = inputData.image or "" -- Проверяем, можно ли приготовить input if recipeResultLookup[recipe.input] then input = createLinkToRow(recipe.input, input) end local resultData = translateID(frame, recipe.result) local result = resultData.name or "Нет результата" local resultImage = resultData.image or "" local minTemp = recipe.minTemp or "Нет данных" templateArgs.input = input .. " " .. inputImage templateArgs.result = result .. " " .. resultImage templateArgs.minTemp = minTemp -- Обработка для toolmadeRecipes elseif recipeType == "toolmadeRecipes" then local inputData = translateID(frame, recipe.input) local input = inputData.name or "Нет входного элемента" local inputImage = inputData.image or "" -- Проверяем, можно ли приготовить input if recipeResultLookup[recipe.input] then input = createLinkToRow(recipe.input, input) end local resultData = translateID(frame, recipe.result) local result = resultData.name or "Нет результата" local resultImage = resultData.image or "" local toolData = translateID(frame, recipe.tool) local tool = toolData.name or "Нет инструмента" local toolImage = toolData.image or "" templateArgs.input = input .. " " .. inputImage templateArgs.result = result .. " " .. resultImage templateArgs.tool = tool .. " " .. toolImage end -- Генерация строки таблицы с использованием шаблона out = out .. frame:expandTemplate{ title = templateName, args = templateArgs } .. "\n" end return out end return p