milo: better matching
This commit is contained in:
@@ -1,5 +1,6 @@
|
|||||||
local Config = require('config')
|
local Config = require('config')
|
||||||
local Event = require('event')
|
local Event = require('event')
|
||||||
|
local fuzzy = require('fuzzyMatch')
|
||||||
local Sound = require('sound')
|
local Sound = require('sound')
|
||||||
local Socket = require('socket')
|
local Socket = require('socket')
|
||||||
local sync = require('sync').sync
|
local sync = require('sync').sync
|
||||||
@@ -29,7 +30,6 @@ local displayModes = {
|
|||||||
|
|
||||||
local page = UI.Page {
|
local page = UI.Page {
|
||||||
menuBar = UI.MenuBar {
|
menuBar = UI.MenuBar {
|
||||||
y = 1, height = 1,
|
|
||||||
buttons = {
|
buttons = {
|
||||||
{
|
{
|
||||||
text = 'Refresh',
|
text = 'Refresh',
|
||||||
@@ -300,21 +300,37 @@ end
|
|||||||
|
|
||||||
function page:applyFilter()
|
function page:applyFilter()
|
||||||
local function filterItems(t, filter, displayMode)
|
local function filterItems(t, filter, displayMode)
|
||||||
if filter or displayMode > 0 then
|
self.grid.sortColumn = context.state.sortColumn or 'count'
|
||||||
|
self.grid.inverseSort = context.state.inverseSort
|
||||||
|
|
||||||
|
if filter then
|
||||||
local r = { }
|
local r = { }
|
||||||
if filter then
|
filter = filter:lower()
|
||||||
filter = filter:lower()
|
self.grid.sortColumn = 'score'
|
||||||
end
|
self.grid.inverseSort = true
|
||||||
|
|
||||||
for _,v in pairs(t) do
|
for _,v in pairs(t) do
|
||||||
if not filter or string.find(v.lname, filter, 1, true) then
|
v.score = fuzzy(v.lname, filter)
|
||||||
if filter or --displayMode == 0 or
|
if v.score > 0 then
|
||||||
displayMode == 1 and v.count > 0 then
|
if v.count > 0 then
|
||||||
table.insert(r, v)
|
v.score = v.score + 1
|
||||||
end
|
end
|
||||||
|
table.insert(r, v)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
return r
|
||||||
|
|
||||||
|
elseif displayMode > 0 then
|
||||||
|
local r = { }
|
||||||
|
|
||||||
|
for _,v in pairs(t) do
|
||||||
|
if v.count > 0 then
|
||||||
|
table.insert(r, v)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
return r
|
return r
|
||||||
end
|
end
|
||||||
|
|
||||||
return t
|
return t
|
||||||
end
|
end
|
||||||
local t = filterItems(self.items, self.filter, context.state.displayMode)
|
local t = filterItems(self.items, self.filter, context.state.displayMode)
|
||||||
|
|||||||
22
milo/apis/fuzzyMatch.lua
Normal file
22
milo/apis/fuzzyMatch.lua
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
-- Based on Squid's fuzzy search
|
||||||
|
-- https://github.com/SquidDev-CC/artist/blob/vnext/artist/lib/match.lua
|
||||||
|
--
|
||||||
|
-- not very fuzzy anymore
|
||||||
|
|
||||||
|
local SCORE_WEIGHT = 1000
|
||||||
|
local LEADING_LETTER_PENALTY = -3
|
||||||
|
local LEADING_LETTER_PENALTY_MAX = -9
|
||||||
|
|
||||||
|
local _find = string.find
|
||||||
|
|
||||||
|
return function(str_lower, ptrn_lower)
|
||||||
|
local score = 0
|
||||||
|
|
||||||
|
local start = _find(str_lower, ptrn_lower, 1, true)
|
||||||
|
if start then
|
||||||
|
-- All letters before the current one are considered leading, so add them to our penalty
|
||||||
|
score = SCORE_WEIGHT + math.max(LEADING_LETTER_PENALTY * (start - 1), LEADING_LETTER_PENALTY_MAX)
|
||||||
|
end
|
||||||
|
|
||||||
|
return score
|
||||||
|
end
|
||||||
Reference in New Issue
Block a user