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

Нет описания правки
мНет описания правки
 
(не показаны 32 промежуточные версии 2 участников)
Строка 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
Строка 26: Строка 27:
     end
     end
     return false
     return false
end
function table.length(t)
    local out = 0
    for _ in pairs(t) do
        out = out + 1
    end
    return out
end
function table.isempty(t)
    local count = table.length(t)
    if count == 0 then
        do
            return true
        end
    end
    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


Строка 88: Строка 164:
end
end


-- returns recipes which id is matched by pattern
function getrecipesbyname(frame, tabl, str) -- should not be inviked
function getrecipesbyname(frame, tabl, str) -- should not be inviked
     local out = {}
     local out = {}
Строка 101: Строка 178:
end
end


-- same as above, but returns recipes that *does not* match given pattern
function getotherrecipes(frame, tabl, str) -- should not be invoked
function getotherrecipes(frame, tabl, str) -- should not be invoked
     local out = {}
     local out = {}
Строка 205: Строка 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
Строка 234: Строка 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
Строка 262: Строка 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
Строка 291: Строка 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
Строка 321: Строка 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
Строка 362: Строка 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
Строка 373: Строка 457:


function p.buildrecipeboxuniversal(frame, idtable)
function p.buildrecipeboxuniversal(frame, idtable)
     local out = "startd\n"
     local out = ""
     for type, recipes in pairs(idtable) do
     for type, recipes in pairs(idtable) do
         -- INTRUDER ALERT: SHITCODE IS IN THE BASE
         -- INTRUDER ALERT: SHITCODE IS IN THE BASE
         if type == "microwaveRecipes" and not next(recipes) == nil then
        local id = ""
         if type == "microwaveRecipes" and not table.isempty(recipes) then
             do
             do
                 for id, _ in pairs(recipes) do
                 for n, recipe in pairs(recipes) do
                     out = out .. id
                     if p.recipePassesTags(frame, recipe) then
                    out = out .. frame:preprocess("{{#invoke:Meals Lookup|buildmicrowaverecipebox|" .. id .. "}}") .. "\n"
                        id = recipe["id"]
                        out = out ..
                        frame:preprocess("{{#invoke:Meals Lookup|buildmicrowaverecipebox|" .. id .. "}}") .. "\n"
                    end
                 end
                 end
             end
             end
         elseif type == "mixableRecipes" and not next(recipes) == nil then
         elseif type == "mixableRecipes" and not table.isempty(recipes) then
             do
             do
                 for id, _ in pairs(recipes) do
                 for n, recipe in pairs(recipes) do
                     out = out .. 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
         elseif type == "sliceableRecipes" and not next(recipes) == nil then
         elseif type == "sliceableRecipes" and not table.isempty(recipes) then
             do
             do
                 for id, _ in pairs(recipes) do
                 for n, recipe in pairs(recipes) do
                     out = out .. 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
         elseif type == "grindableRecipes" and not next(recipes) == nil then
         elseif type == "grindableRecipes" and not table.isempty(recipes) then
             do
             do
                 for id, _ in pairs(recipes) do
                 for n, recipe in pairs(recipes) do
                     out = out .. 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
         elseif type == "heatableRecipes" and not next(recipes) == nil then
         elseif type == "heatableRecipes" and not table.isempty(recipes) then
             do
             do
                 for id, _ in pairs(recipes) do
                 for n, recipe in pairs(recipes) do
                     out = out .. 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
         elseif type == "toolmadeRecipes" and not next(recipes) == nil then
         elseif type == "toolmadeRecipes" and not table.isempty(recipes) then
             do
             do
                 for id, _ in pairs(recipes) do
                 for n, recipe in pairs(recipes) do
                     out = out .. 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
         end
         end
     end
     end
    out = out .. "endd"
     return out
     return out
end
end


function p.soups(frame)
-- you should not use this for building recipes inside lua
function p.buildnamedrecipes(frame) -- {{#invoke:Meals Lookup|buildnamedrecipes|[Pattern1 | Pattern2 | Pattern3 | ...]}}
     local out = ""
     local out = ""
    local tablo = p.meals
    for _, patt in pairs(frame.args) do
        local ids = getrecipesbyname(frame, tablo, patt)
        out = out .. p.buildrecipeboxuniversal(frame, ids)
    end
     return out
     return out
end
end


--#endregion
-- same as buildnamedrecipes, but instead builds recipes that does not match the pattern
 
function p.buildotherrecipes(frame) -- {{#invoke:Meals Lookup|buildotherrecipes|[Pattern1 | Pattern2 | Pattern3 | ...]}}
    local out = ""
    local tablo = p.meals
    for _, patt in pairs(frame.args) do
        local ids = getotherrecipes(frame, tablo, patt)
        out = out .. p.buildrecipeboxuniversal(frame, ids)
    end
    return out
end


-- tests.
-- builds recipes list but does not constructs it, for debug purposes
function p.tests1(frame)
function p.getrecipeslist(frame)
     local out = ""
     local out = ""
     local tablo = p.meals
     local tablo = p.meals
     for _, patt in pairs(frame.args) do
     for _, patt in pairs(frame.args) do
         for type, recipes in pairs(getotherrecipes(frame, tablo, patt)) do
         for type, recipes in pairs(getrecipesbyname(frame, tablo, patt)) do
             out = out .. type .. "("
             out = out .. type .. "("
             for k, r in pairs(recipes) do
             for k, r in pairs(recipes) do
Строка 448: Строка 559:
end
end


function p.tests2(frame)
-- same as getrecipeslist, but instead returns recipes that does not match the pattern
function p.getotherrecipeslist(frame)
     local out = ""
     local out = ""
     local tablo = p.meals
     local tablo = p.meals
     for _, patt in pairs(frame.args) do
     for _, patt in pairs(frame.args) do
         for type, recipes in pairs(getrecipesbyname(frame, tablo, patt)) do
         for type, recipes in pairs(getotherrecipes(frame, tablo, patt)) do
             out = out .. type .. "("
             out = out .. type .. "("
             for k, r in pairs(recipes) do
             for k, r in pairs(recipes) do
Строка 463: Строка 575:
end
end


function p.tests3(frame)
--#endregion
 
--#region newdishestest
 
-- returns recipes which id is matched by pattern
function getrecipesbynamenew(frame, tabl, str) -- should not be invoked
    local out = {}
    for rtype, recipes in pairs(tabl) do
        for recipeId, recipe in pairs(recipes) do
            out[rtype] = out[rtype] or {}
            if type(str) == "table" then
                for _, patt in pairs(str) do
                    if string.match(recipeId, patt) and not table.containsv(recipe) then
                        table.insert(out[rtype], recipe)
                    end
                end
            else
                if string.match(recipeId, str) then
                    table.insert(out[rtype], recipe)
                end
            end
        end
    end
    return out
end
 
-- same as above, but returns recipes that *does not* match given pattern
function getotherrecipesnew(frame, tabl, str) -- should not be invoked
    local out = {}
    for type, recipes in pairs(tabl) do
        out[type] = out[type] or {}
        for recipeId, recipe in pairs(recipes) do
            if not string.match(recipeId, str) then
                if not table.containsv(out[type], recipe) then
                    table.insert(out[type], recipe)
                end
            end
        end
    end
    return out
end
 
-- you should not use this for building recipes inside lua
function p.buildnamedrecipesnew(frame) -- {{#invoke:Meals Lookup|buildnamedrecipes|[Pattern1 | Pattern2 | Pattern3 | ...]}}
     local out = ""
     local out = ""
     local tablo = p.meals
     local tablo = p.meals
     for _, patt in pairs(frame.args) do
     for _, patt in pairs(frame.args) do
         local ids = getrecipesbyname(frame, tablo, patt)
         local ids = getrecipesbynamenew(frame, tablo, patt)
        for k, v in pairs(ids) do
            for kk, vv in pairs(v) do
                out = out .. kk .. "\n"
            end
        end
         out = out .. p.buildrecipeboxuniversal(frame, ids)
         out = out .. p.buildrecipeboxuniversal(frame, ids)
     end
     end
Строка 478: Строка 628:
end
end


-- same as buildnamedrecipes, but instead builds recipes that does not match the pattern
function p.buildotherrecipesnew(frame) -- {{#invoke:Meals Lookup|buildotherrecipes|[Pattern1 | Pattern2 | Pattern3 | ...]}}
    local out = ""
    local tablo = p.meals
    for _, patt in pairs(frame.args) do
        local ids = getotherrecipesnew(frame, tablo, patt)
        out = out .. p.buildrecipeboxuniversal(frame, ids)
    end
    return out
end


 
--#endregion
-- function p.tests2(frame)
--    local out = ""
--    for type, recipes in pairs(getrecipesbyname(frame, "[Dd]ough")) do
--        out = out .. type .. "("
--        for k, r in pairs(recipes) do
--            out = out .. " " .. k .. ":" .. r["id"]
--        end
--        out = out .. ")"
--    end
--    return out
-- end


return p
return p