Модуль:Meals Lookup: различия между версиями
Mhamster (обсуждение | вклад) INCOMING!!!! |
Pok (обсуждение | вклад) мНет описания правки |
||
| (не показано 39 промежуточных версий 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( | function table.containsv(t, value) -- FUCKING LUA | ||
-- containsv = contains value | -- containsv = contains value | ||
for _, v in pairs( | 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( | function table.containsk(t, key) -- FUCKING LUA | ||
-- containsk = contains key | -- containsk = contains key | ||
for k, _ in pairs( | 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 = "" | ||
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 = "" | ||
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 = "" | ||
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 = "" | ||
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 = "" | ||
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 = "" | ||
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 | ||
| Строка 374: | Строка 458: | ||
function p.buildrecipeboxuniversal(frame, idtable) | function p.buildrecipeboxuniversal(frame, idtable) | ||
local out = "" | local out = "" | ||
for type, | for type, recipes in pairs(idtable) do | ||
-- INTRUDER ALERT: SHITCODE IS IN THE BASE | -- INTRUDER ALERT: SHITCODE IS IN THE BASE | ||
if type == "microwaveRecipes" then | local id = "" | ||
if type == "microwaveRecipes" and not table.isempty(recipes) then | |||
do | do | ||
for | for n, recipe in pairs(recipes) do | ||
out = out .. | if p.recipePassesTags(frame, recipe) then | ||
id = recipe["id"] | |||
out = out .. | |||
frame:preprocess("{{#invoke:Meals Lookup|buildmicrowaverecipebox|" .. id .. "}}") .. "\n" | |||
end | |||
end | end | ||
end | end | ||
elseif type == "mixableRecipes" then | elseif type == "mixableRecipes" and not table.isempty(recipes) then | ||
do | do | ||
for | for n, recipe in pairs(recipes) do | ||
out = out .. frame:preprocess("{{#invoke:Meals Lookup|buildmixablerecipebox|" .. id .. "}}") .. "\n" | if p.recipePassesTags(frame, recipe) then | ||
id = recipe["id"] | |||
out = out .. frame:preprocess("{{#invoke:Meals Lookup|buildmixablerecipebox|" .. id .. "}}") .. "\n" | |||
end | |||
end | end | ||
end | end | ||
elseif type == "sliceableRecipes" then | elseif type == "sliceableRecipes" and not table.isempty(recipes) then | ||
do | do | ||
for | for n, recipe in pairs(recipes) do | ||
out = out .. frame:preprocess("{{#invoke:Meals Lookup|buildslicerecipebox|" .. id .. "}}") .. "\n" | if p.recipePassesTags(frame, recipe) then | ||
id = recipe["id"] | |||
out = out .. frame:preprocess("{{#invoke:Meals Lookup|buildslicerecipebox|" .. id .. "}}") .. "\n" | |||
end | |||
end | end | ||
end | end | ||
elseif type == "grindableRecipes" then | elseif type == "grindableRecipes" and not table.isempty(recipes) then | ||
do | do | ||
for | for n, recipe in pairs(recipes) do | ||
out = out .. frame:preprocess("{{#invoke:Meals Lookup|buildgrindrecipebox|" .. id .. "}}") .. "\n" | if p.recipePassesTags(frame, recipe) then | ||
id = recipe["id"] | |||
out = out .. frame:preprocess("{{#invoke:Meals Lookup|buildgrindrecipebox|" .. id .. "}}") .. "\n" | |||
end | |||
end | end | ||
end | end | ||
elseif type == "heatableRecipes" then | elseif type == "heatableRecipes" and not table.isempty(recipes) then | ||
do | do | ||
for | for n, recipe in pairs(recipes) do | ||
out = out .. frame:preprocess("{{#invoke:Meals Lookup|buildheatrecipebox|" .. id .. "}}") .. "\n" | if p.recipePassesTags(frame, recipe) then | ||
id = recipe["id"] | |||
out = out .. frame:preprocess("{{#invoke:Meals Lookup|buildheatrecipebox|" .. id .. "}}") .. "\n" | |||
end | |||
end | end | ||
end | end | ||
elseif type == "toolmadeRecipes" then | elseif type == "toolmadeRecipes" and not table.isempty(recipes) then | ||
do | do | ||
for | for n, recipe in pairs(recipes) do | ||
out = out .. frame:preprocess("{{#invoke:Meals Lookup|buildtoolmaderecipebox|" .. id .. "}}") .. "\n" | if p.recipePassesTags(frame, recipe) then | ||
id = recipe["id"] | |||
out = out .. frame:preprocess("{{#invoke:Meals Lookup|buildtoolmaderecipebox|" .. id .. "}}") .. "\n" | |||
end | |||
end | end | ||
end | end | ||
| Строка 418: | Строка 521: | ||
end | end | ||
function p. | -- 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 | ||
--# | -- 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 | |||
-- | -- builds recipes list but does not constructs it, for debug purposes | ||
function p. | 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( | 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 | ||
| Строка 442: | Строка 559: | ||
end | end | ||
function p. | -- 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( | 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 | ||
| Строка 457: | Строка 575: | ||
end | end | ||
function p. | --#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 = | local ids = getrecipesbynamenew(frame, tablo, patt) | ||
out = out .. p.buildrecipeboxuniversal(frame, ids) | out = out .. p.buildrecipeboxuniversal(frame, ids) | ||
end | end | ||
| Строка 467: | Строка 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 | |||
-- | |||
return p | return p | ||