forked from minetest-mods/craftguide
Improve search filter accuracy
This commit is contained in:
parent
35b2ecfdc1
commit
8b4ef8a4b7
30
init.lua
30
init.lua
|
@ -1083,6 +1083,16 @@ craftguide.register_craft_type("digging_chance", {
|
||||||
icon = "default_tool_mesepick.png",
|
icon = "default_tool_mesepick.png",
|
||||||
})
|
})
|
||||||
|
|
||||||
|
local function sfind(str, filter)
|
||||||
|
if filter == "" then
|
||||||
|
return 0
|
||||||
|
end
|
||||||
|
|
||||||
|
if find(str, filter, 1, true) then
|
||||||
|
return #str - #filter
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
local function search(data)
|
local function search(data)
|
||||||
local filter = data.filter
|
local filter = data.filter
|
||||||
|
|
||||||
|
@ -1091,7 +1101,7 @@ local function search(data)
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
local opt = "^(.-)%+([%w_]*)=*([%w_,]*)"
|
local opt = "^(.-)%+([%w_]+)=([%w_,]+)"
|
||||||
local search_filter = next(search_filters) and match(filter, opt)
|
local search_filter = next(search_filters) and match(filter, opt)
|
||||||
local filters = {}
|
local filters = {}
|
||||||
|
|
||||||
|
@ -1104,30 +1114,28 @@ local function search(data)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
local filtered_list, c = {}, 0
|
local filtered_list, order, c = {}, {}, 0
|
||||||
|
|
||||||
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 def = reg_items[item]
|
local def = reg_items[item]
|
||||||
local desc = (def and def.description) and lower(def.description) or ""
|
local desc = (def and def.description) and lower(def.description) or ""
|
||||||
local search_in = fmt("%s %s", item, desc)
|
|
||||||
local to_add
|
local to_add
|
||||||
|
|
||||||
if search_filter then
|
if search_filter then
|
||||||
for filter_name, values in pairs(filters) do
|
for filter_name, values in pairs(filters) do
|
||||||
if values then
|
local func = search_filters[filter_name]
|
||||||
local func = search_filters[filter_name]
|
to_add = func(item, values) and (search_filter == "" or
|
||||||
to_add = func(item, values) and (search_filter == "" or
|
(sfind(item, search_filter) or sfind(desc, search_filter)))
|
||||||
find(search_in, search_filter, 1, true))
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
to_add = find(search_in, filter, 1, true)
|
to_add = sfind(item, filter) or sfind(desc, filter)
|
||||||
end
|
end
|
||||||
|
|
||||||
if to_add then
|
if to_add then
|
||||||
c = c + 1
|
c = c + 1
|
||||||
filtered_list[c] = item
|
filtered_list[c] = item
|
||||||
|
order[item] = to_add
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -1140,6 +1148,10 @@ local function search(data)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
sort(filtered_list, function(a, b)
|
||||||
|
return order[a] < order[b]
|
||||||
|
end)
|
||||||
|
|
||||||
data.items = filtered_list
|
data.items = filtered_list
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user