Allow special search filters by groups

Using <optional name>:groups=<group_name1,group_name2,...>
This commit is contained in:
Jean-Patrick Guerrero 2019-03-01 19:02:22 +01:00
parent 92daae3e95
commit eb2a81b8b5

View File

@ -24,9 +24,12 @@ local ESC = M.formspec_escape
local S = M.get_translator("craftguide") local S = M.get_translator("craftguide")
local maxn, sort, concat, insert, copy = local maxn, sort, concat, insert, copy =
table.maxn, table.sort, table.concat, table.insert, table.copy table.maxn, table.sort, table.concat, table.insert,
local fmt, find, match, sub, split = table.copy
string.format, string.find, string.match, string.sub, string.split
local fmt, find, match, sub, split, lower =
string.format, string.find, string.match, string.sub,
string.split, string.lower
local min, max, floor, ceil = math.min, math.max, math.floor, math.ceil local min, max, floor, ceil = math.min, math.max, math.floor, math.ceil
local pairs, next, unpack = pairs, next, unpack local pairs, next, unpack = pairs, next, unpack
@ -249,29 +252,6 @@ local function get_item_usages(item)
return usages return usages
end end
local function item_in_inv(item, inv_items)
local inv_items_size = #inv_items
if sub(item, 1, 6) == "group:" then
local groups = extract_groups(item)
for i = 1, inv_items_size do
local inv_item = reg_items[inv_items[i]]
if inv_item then
local item_groups = inv_item.groups
if item_has_groups(item_groups, groups) then
return true
end
end
end
else
for i = 1, inv_items_size do
if inv_items[i] == item then
return true
end
end
end
end
local function get_filtered_items(player) local function get_filtered_items(player)
local items, c = {}, 0 local items, c = {}, 0
@ -681,9 +661,34 @@ local function search(data)
for i = 1, #data.items_raw do for i = 1, #data.items_raw do
local item = data.items_raw[i] local item = data.items_raw[i]
local desc = reg_items[item].description:lower() local def = reg_items[item]
local desc = lower(def.description)
if find(item .. desc, filter, 1, true) then local to_add
local search_in = item .. desc
local subfilter, search_groups, group_filters =
match(filter, "(.*)(:groups=)([%w_,]+)$")
if search_groups then
local groups = split(group_filters, ",")
local has_groups = true
for j = 1, #groups do
local group = groups[j]
if not def.groups[group] then
has_groups = nil
break
end
end
if has_groups then
to_add = not subfilter or find(search_in, subfilter, 1, true)
end
else
to_add = find(search_in, filter, 1, true)
end
if to_add then
c = c + 1 c = c + 1
filtered_list[c] = item filtered_list[c] = item
end end
@ -795,7 +800,7 @@ local function on_receive_fields(player, fields)
elseif (fields.key_enter_field == "filter" or fields.search) and elseif (fields.key_enter_field == "filter" or fields.search) and
fields.filter ~= "" then fields.filter ~= "" then
local fltr = fields.filter:lower() local fltr = lower(fields.filter)
if data.filter == fltr then if data.filter == fltr then
return return
end end
@ -993,6 +998,29 @@ else
end end
if progressive_mode then if progressive_mode then
local function item_in_inv(item, inv_items)
local inv_items_size = #inv_items
if sub(item, 1, 6) == "group:" then
local groups = extract_groups(item)
for i = 1, inv_items_size do
local inv_item = reg_items[inv_items[i]]
if inv_item then
local item_groups = inv_item.groups
if item_has_groups(item_groups, groups) then
return true
end
end
end
else
for i = 1, inv_items_size do
if inv_items[i] == item then
return true
end
end
end
end
local function recipe_in_inv(recipe, inv_items) local function recipe_in_inv(recipe, inv_items)
for _, item in pairs(recipe.items) do for _, item in pairs(recipe.items) do
if not item_in_inv(item, inv_items) then if not item_in_inv(item, inv_items) then