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

Нет описания правки
мНет описания правки
 
(не показано 40 промежуточных версий 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 = {}
     for type, recipes in pairs(tabl) do
     for type, recipes in pairs(tabl) do
         out[type]= {}
         out[type] = {}
         for recipeId, recipe in pairs(recipes) do
         for recipeId, recipe in pairs(recipes) do
             if string.match(recipeId, str) then
             if string.match(recipeId, str) then
Строка 101: Строка 178:
end
end


function getotherrecipes(frame, tabl, str)
-- same as above, but returns recipes that *does not* match given pattern
function getotherrecipes(frame, tabl, str) -- should not be invoked
     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
         if not table.containsk(out, type) then
             out[type]= {}
             out[type] = {}
         end
         end
         for recipeId, recipe in pairs(recipes) do
         for recipeId, recipe in pairs(recipes) do
Строка 117: Строка 195:
     return out
     return out
end
end


function p.imageslist(frame)
function p.imageslist(frame)
Строка 152: Строка 229:
end
end


function p.buildeverything(frame)
function p.buildeverything(frame) -- old code compatibility
    return p.buildeverythingnew(frame)
end
 
function p.buildeverythingold(frame)
     local out = ""
     local out = ""
     out = out .. p.buildmicrowaverecipes(frame)
     out = out .. p.buildmicrowaverecipes(frame)
Строка 202: Строка 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
Строка 231: Строка 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
Строка 259: Строка 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
Строка 288: Строка 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
Строка 318: Строка 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
Строка 341: Строка 427:
     local recipe = p.chemicals[id]
     local recipe = p.chemicals[id]
     local input = buildreagents(frame, getchemicalreagents(recipe))
     local input = buildreagents(frame, getchemicalreagents(recipe))
   
 
     local results = {}
     local results = {}
     for _, v in pairs(recipe["effects"]) do
     for _, v in pairs(recipe["effects"]) do
    table.insert(results, v.description)
        table.insert(results, v.description)
     end
     end
   
 
     local result = table.concat(results, "\n")
     local result = table.concat(results, "\n")
   
 
     out = frame:preprocess("{{Recipe Box" ..
     out = frame:preprocess("{{Recipe Box" ..
         "|component-1=" .. input ..
         "|component-1=" .. input ..
Строка 359: Строка 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
Строка 368: Строка 455:


--#region dishes
--#region dishes
function p.soups(frame)
 
function p.buildrecipeboxuniversal(frame, idtable)
     local out = ""
     local out = ""
    for type, recipes in pairs(idtable) do
        -- INTRUDER ALERT: SHITCODE IS IN THE BASE
        local id = ""
        if type == "microwaveRecipes" and not table.isempty(recipes) then
            do
                for n, recipe in pairs(recipes) do
                    if p.recipePassesTags(frame, recipe) then
                        id = recipe["id"]
                        out = out ..
                        frame:preprocess("{{#invoke:Meals Lookup|buildmicrowaverecipebox|" .. id .. "}}") .. "\n"
                    end
                end
            end
        elseif type == "mixableRecipes" and not table.isempty(recipes) then
            do
                for n, recipe in pairs(recipes) do
                    if p.recipePassesTags(frame, recipe) then
                        id = recipe["id"]
                        out = out .. frame:preprocess("{{#invoke:Meals Lookup|buildmixablerecipebox|" .. id .. "}}") .. "\n"
                    end
                end
            end
        elseif type == "sliceableRecipes" and not table.isempty(recipes) then
            do
                for n, recipe in pairs(recipes) do
                    if p.recipePassesTags(frame, recipe) then
                        id = recipe["id"]
                        out = out .. frame:preprocess("{{#invoke:Meals Lookup|buildslicerecipebox|" .. id .. "}}") .. "\n"
                    end
                end
            end
        elseif type == "grindableRecipes" and not table.isempty(recipes) then
            do
                for n, recipe in pairs(recipes) do
                    if p.recipePassesTags(frame, recipe) then
                        id = recipe["id"]
                        out = out .. frame:preprocess("{{#invoke:Meals Lookup|buildgrindrecipebox|" .. id .. "}}") .. "\n"
                    end
                end
            end
        elseif type == "heatableRecipes" and not table.isempty(recipes) then
            do
                for n, recipe in pairs(recipes) do
                    if p.recipePassesTags(frame, recipe) then
                        id = recipe["id"]
                        out = out .. frame:preprocess("{{#invoke:Meals Lookup|buildheatrecipebox|" .. id .. "}}") .. "\n"
                    end
                end
            end
        elseif type == "toolmadeRecipes" and not table.isempty(recipes) then
            do
                for n, recipe in pairs(recipes) do
                    if p.recipePassesTags(frame, recipe) then
                        id = recipe["id"]
                        out = out .. frame:preprocess("{{#invoke:Meals Lookup|buildtoolmaderecipebox|" .. id .. "}}") .. "\n"
                    end
                end
            end
        end
    end
    return out
end
-- you should not use this for building recipes inside lua
function p.buildnamedrecipes(frame) -- {{#invoke:Meals Lookup|buildnamedrecipes|[Pattern1 | Pattern2 | Pattern3 | ...]}}
    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
Строка 391: Строка 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
Строка 406: Строка 575:
end
end


-- function p.tests2(frame)
--#endregion
--    local out = ""
 
--    for type, recipes in pairs(getrecipesbyname(frame, "[Dd]ough")) do
--#region newdishestest
--         out = out .. type .. "("
 
--        for k, r in pairs(recipes) do
-- returns recipes which id is matched by pattern
--            out = out .. " " .. k .. ":" .. r["id"]
function getrecipesbynamenew(frame, tabl, str) -- should not be invoked
--         end
     local out = {}
--         out = out .. ")"
    for rtype, recipes in pairs(tabl) do
--     end
        for recipeId, recipe in pairs(recipes) do
--     return out
            out[rtype] = out[rtype] or {}
-- end
            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 tablo = p.meals
    for _, patt in pairs(frame.args) do
        local ids = getrecipesbynamenew(frame, tablo, patt)
        out = out .. p.buildrecipeboxuniversal(frame, ids)
    end
    return out
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


return p
return p