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

Нет описания правки
мНет описания правки
 
(не показана 1 промежуточная версия 1 участника)
Строка 1: Строка 1:
local prototypes = mw.loadData("Module:Meals Lookup/data")
local prototypes = mw.loadData("Module:Meals Lookup/data")
local chem = mw.loadData("Module:Chemistry Lookup/data")
local chem = mw.loadData("Module:Chemistry Lookup/data")
local tags = mw.loadData("Module:IanComradeBot/prototypes/entity tags.json/data")


local p = {}
local p = {}
Строка 8: Строка 9:
--#region universal
--#region universal


function table.containsv(table, value) -- FUCKING LUA
function table.containsv(t, value) -- FUCKING LUA
     -- containsv = contains value
     -- containsv = contains value
     for _, v in pairs(table) do
     for _, v in pairs(t) do
         if v == value then
         if v == value then
             return true
             return true
Строка 18: Строка 19:
end
end


function table.containsk(table, key) -- FUCKING LUA
function table.containsk(t, key) -- FUCKING LUA
     -- containsk = contains key
     -- containsk = contains key
     for k, _ in pairs(table) do
     for k, _ in pairs(t) do
         if k == key then
         if k == key then
             return true
             return true
Строка 28: Строка 29:
end
end


function table.length(table)
function table.length(t)
     local out = 0
     local out = 0
     for _ in pairs(table) do
     for _ in pairs(t) do
         out = out + 1
         out = out + 1
     end
     end
Строка 44: Строка 45:
     end
     end
     return false
     return false
end
-- Вспомогательная функция для обрезки пробелов
local function trim(s)
    return (s:gsub("^%s*(.-)%s*$", "%1"))
end
-- Функция проверки тегов рецепта по параметрам фильтрации
function p.recipePassesTags(frame, recipe)
    local productId = recipe["result"] or recipe["id"]
    local productTags = {}
    for _, entry in ipairs(tags) do
        if entry.id == productId then
            if entry.Tag and entry.Tag.tags then
                productTags = entry.Tag.tags
            end
            break
        end
    end
    -- Если заданы белый или чёрный списки, выполняем фильтрацию
    if frame.args.whiteListTags then
        local whitelist = {}
        for tag in string.gmatch(frame.args.whiteListTags, "([^,]+)") do
            table.insert(whitelist, trim(tag))
        end
        local found = false
        for _, wtag in ipairs(whitelist) do
            if table.containsv(productTags, wtag) then
                found = true
                break
            end
        end
        if not found then return false end
    elseif frame.args.blackListTags then
        local blacklist = {}
        for tag in string.gmatch(frame.args.blackListTags, "([^,]+)") do
            table.insert(blacklist, trim(tag))
        end
        for _, btag in ipairs(blacklist) do
            if table.containsv(productTags, btag) then
                return false
            end
        end
    end
    return true
end
-- Функция фильтрации набора рецептов
function p.filterRecipes(recipes, frame)
    local filtered = {}
    for id, recipe in pairs(recipes) do
        if p.recipePassesTags(frame, recipe) then
            filtered[id] = recipe
        end
    end
    return filtered
end
end


Строка 225: Строка 283:
function p.buildmicrowaverecipes(frame)
function p.buildmicrowaverecipes(frame)
     local out = ""
     local out = ""
     for id in pairs(getrecipesfromtype(frame, "microwaveRecipes")) do
     local recipes = p.filterRecipes(getrecipesfromtype(frame, "microwaveRecipes"), frame)
    for id, _ in pairs(recipes) do
         out = out .. frame:preprocess("{{#invoke:Meals Lookup|buildmicrowaverecipebox|" .. id .. "}}") .. "\n"
         out = out .. frame:preprocess("{{#invoke:Meals Lookup|buildmicrowaverecipebox|" .. id .. "}}") .. "\n"
     end
     end
Строка 254: Строка 313:
function p.buildslicerecipes(frame)
function p.buildslicerecipes(frame)
     local out = ""
     local out = ""
     for id in pairs(getrecipesfromtype(frame, "sliceableRecipes")) do
     local recipes = p.filterRecipes(getrecipesfromtype(frame, "sliceableRecipes"), frame)
    for id, _ in pairs(recipes) do
         out = out .. frame:preprocess("{{#invoke:Meals Lookup|buildslicerecipebox|" .. id .. "}}") .. "\n"
         out = out .. frame:preprocess("{{#invoke:Meals Lookup|buildslicerecipebox|" .. id .. "}}") .. "\n"
     end
     end
Строка 282: Строка 342:
function p.buildgrindrecipes(frame)
function p.buildgrindrecipes(frame)
     local out = ""
     local out = ""
     for id in pairs(getrecipesfromtype(frame, "grindableRecipes")) do
     local recipes = p.filterRecipes(getrecipesfromtype(frame, "grindableRecipes"), frame)
    for id, _ in pairs(recipes) do
         out = out .. frame:preprocess("{{#invoke:Meals Lookup|buildgrindrecipebox|" .. id .. "}}") .. "\n"
         out = out .. frame:preprocess("{{#invoke:Meals Lookup|buildgrindrecipebox|" .. id .. "}}") .. "\n"
     end
     end
Строка 311: Строка 372:
function p.buildheatrecipes(frame)
function p.buildheatrecipes(frame)
     local out = ""
     local out = ""
     for id in pairs(getrecipesfromtype(frame, "heatableRecipes")) do
     local recipes = p.filterRecipes(getrecipesfromtype(frame, "heatableRecipes"), frame)
    for id, _ in pairs(recipes) do
         out = out .. frame:preprocess("{{#invoke:Meals Lookup|buildheatrecipebox|" .. id .. "}}") .. "\n"
         out = out .. frame:preprocess("{{#invoke:Meals Lookup|buildheatrecipebox|" .. id .. "}}") .. "\n"
     end
     end
Строка 341: Строка 403:
function p.buildtoolmaderecipes(frame)
function p.buildtoolmaderecipes(frame)
     local out = ""
     local out = ""
     for id in pairs(getrecipesfromtype(frame, "toolmadeRecipes")) do
     local recipes = p.filterRecipes(getrecipesfromtype(frame, "toolmadeRecipes"), frame)
    for id, _ in pairs(recipes) do
         out = out .. frame:preprocess("{{#invoke:Meals Lookup|buildtoolmaderecipebox|" .. id .. "}}") .. "\n"
         out = out .. frame:preprocess("{{#invoke:Meals Lookup|buildtoolmaderecipebox|" .. id .. "}}") .. "\n"
     end
     end
Строка 382: Строка 445:
function p.buildixablerecipes(frame)
function p.buildixablerecipes(frame)
     local out = ""
     local out = ""
     for id in pairs(getrecipesfromtype(frame, "mixableRecipes")) do
     local recipes = p.filterRecipes(getrecipesfromtype(frame, "mixableRecipes"), frame)
    for id, _ in pairs(recipes) do
         out = out .. frame:preprocess("{{#invoke:Meals Lookup|buildmixablerecipebox|" .. id .. "}}") .. "\n"
         out = out .. frame:preprocess("{{#invoke:Meals Lookup|buildmixablerecipebox|" .. id .. "}}") .. "\n"
     end
     end
Строка 400: Строка 464:
             do
             do
                 for n, recipe in pairs(recipes) do
                 for n, recipe in pairs(recipes) do
                     id = recipe["id"]
                     if p.recipePassesTags(frame, recipe) then
                    out = out ..
                        id = recipe["id"]
                    frame:preprocess("{{#invoke:Meals Lookup|buildmicrowaverecipebox|" .. id .. "}}") .. "\n"
                        out = out ..
                        frame:preprocess("{{#invoke:Meals Lookup|buildmicrowaverecipebox|" .. id .. "}}") .. "\n"
                    end
                 end
                 end
             end
             end
Строка 408: Строка 474:
             do
             do
                 for n, recipe in pairs(recipes) do
                 for n, recipe in pairs(recipes) do
                     id = recipe["id"]
                     if p.recipePassesTags(frame, recipe) then
                    out = out .. frame:preprocess("{{#invoke:Meals Lookup|buildmixablerecipebox|" .. id .. "}}") .. "\n"
                        id = recipe["id"]
                        out = out .. frame:preprocess("{{#invoke:Meals Lookup|buildmixablerecipebox|" .. id .. "}}") .. "\n"
                    end
                 end
                 end
             end
             end
Строка 415: Строка 483:
             do
             do
                 for n, recipe in pairs(recipes) do
                 for n, recipe in pairs(recipes) do
                     id = recipe["id"]
                     if p.recipePassesTags(frame, recipe) then
                    out = out .. frame:preprocess("{{#invoke:Meals Lookup|buildslicerecipebox|" .. id .. "}}") .. "\n"
                        id = recipe["id"]
                        out = out .. frame:preprocess("{{#invoke:Meals Lookup|buildslicerecipebox|" .. id .. "}}") .. "\n"
                    end
                 end
                 end
             end
             end
Строка 422: Строка 492:
             do
             do
                 for n, recipe in pairs(recipes) do
                 for n, recipe in pairs(recipes) do
                     id = recipe["id"]
                     if p.recipePassesTags(frame, recipe) then
                    out = out .. frame:preprocess("{{#invoke:Meals Lookup|buildgrindrecipebox|" .. id .. "}}") .. "\n"
                        id = recipe["id"]
                        out = out .. frame:preprocess("{{#invoke:Meals Lookup|buildgrindrecipebox|" .. id .. "}}") .. "\n"
                    end
                 end
                 end
             end
             end
Строка 429: Строка 501:
             do
             do
                 for n, recipe in pairs(recipes) do
                 for n, recipe in pairs(recipes) do
                     id = recipe["id"]
                     if p.recipePassesTags(frame, recipe) then
                    out = out .. frame:preprocess("{{#invoke:Meals Lookup|buildheatrecipebox|" .. id .. "}}") .. "\n"
                        id = recipe["id"]
                        out = out .. frame:preprocess("{{#invoke:Meals Lookup|buildheatrecipebox|" .. id .. "}}") .. "\n"
                    end
                 end
                 end
             end
             end
Строка 436: Строка 510:
             do
             do
                 for n, recipe in pairs(recipes) do
                 for n, recipe in pairs(recipes) do
                     id = recipe["id"]
                     if p.recipePassesTags(frame, recipe) then
                    out = out .. frame:preprocess("{{#invoke:Meals Lookup|buildtoolmaderecipebox|" .. id .. "}}") .. "\n"
                        id = recipe["id"]
                        out = out .. frame:preprocess("{{#invoke:Meals Lookup|buildtoolmaderecipebox|" .. id .. "}}") .. "\n"
                    end
                 end
                 end
             end
             end
Строка 498: Строка 574:
     return out
     return out
end
end


--#endregion
--#endregion
Строка 505: Строка 580:


-- returns recipes which id is matched by pattern
-- returns recipes which id is matched by pattern
function getrecipesbynamenew(frame, tabl, str) -- should not be inviked
function getrecipesbynamenew(frame, tabl, str) -- should not be invoked
     local out = {}
     local out = {}
     for rtype, recipes in pairs(tabl) do
     for rtype, recipes in pairs(tabl) do
         for recipeId, recipe in pairs(recipes) do
         for recipeId, recipe in pairs(recipes) do
             out[rtype] = {}
             out[rtype] = out[rtype] or {}
             if type(str) == "table" then do
             if type(str) == "table" then
                 for _, patt in pairs(str) do
                 for _, patt in pairs(str) do
                     if string.match(recipeId, patt) and not table.containsv(recipe) then
                     if string.match(recipeId, patt) and not table.containsv(recipe) then
Строка 516: Строка 591:
                     end
                     end
                 end
                 end
             end else do
             else
                 if string.match(recipeId, str) then
                 if string.match(recipeId, str) then
                     table.insert(out[rtype], recipe)
                     table.insert(out[rtype], recipe)
                 end
                 end
             end
             end
        end
         end
         end
     end
     end
Строка 531: Строка 605:
     local out = {}
     local out = {}
     for type, recipes in pairs(tabl) do
     for type, recipes in pairs(tabl) do
         if not table.containsk(out, type) then
         out[type] = out[type] or {}
            out[type] = {}
        end
         for recipeId, recipe in pairs(recipes) do
         for recipeId, recipe in pairs(recipes) do
             if not string.match(recipeId, str) then
             if not string.match(recipeId, str) then
Строка 566: Строка 638:
     return out
     return out
end
end


--#endregion
--#endregion
-- tests.
function p.tests1(frame)
    local out = ""
    local tablo = p.meals
    for _, patt in pairs(frame.args) do
        for type, recipes in pairs(getotherrecipes(frame, tablo, patt)) do
            out = out .. type .. "("
            for k, r in pairs(recipes) do
                out = out .. " " .. k .. ":" .. r["id"]
            end
            out = out .. ")"
        end
    end
    return out
end
function p.tests2(frame)
    local out = ""
    local tablo = p.meals
    for _, patt in pairs(frame.args) do
        for type, recipes in pairs(getrecipesbyname(frame, tablo, patt)) do
            out = out .. type .. "("
            for k, r in pairs(recipes) do
                out = out .. " " .. k .. ":" .. r["id"]
            end
            out = out .. ")"
        end
    end
    return out
end
function p.test3(frame, tabl, str) -- should not be inviked
    local out = {}
    for microwaveRecipes, recipes in pairs(tabl) do
        out[microwaveRecipes] = {}
        for recipeId, recipe in pairs(recipes) do
            if string.match(recipeId, str) then
                table.insert(out[microwaveRecipes], recipe)
            end
        end
    end
    return out
end


return p
return p