|
|
| Строка 1: |
Строка 1: |
| | | return function() return 'MIMO' end |
| 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 в аргументы шаблона (кроме grindableRecipes)
| |
| if recipeType ~= "grindableRecipes" then
| |
| templateArgs.id = resultId
| |
| end
| |
| | |
| -- Обработка для 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, "</br>") or "Нет ингредиентов"
| |
| templateArgs.reagents = table.concat(reagentsList, "</br>") 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, "</br>") 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
| |