Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/phrogz/liqr
Substring filtering for Lua
https://github.com/phrogz/liqr
Last synced: 19 days ago
JSON representation
Substring filtering for Lua
- Host: GitHub
- URL: https://github.com/phrogz/liqr
- Owner: Phrogz
- License: mit
- Created: 2020-06-01T14:38:56.000Z (over 4 years ago)
- Default Branch: master
- Last Pushed: 2020-06-05T16:06:33.000Z (over 4 years ago)
- Last Synced: 2024-11-01T07:24:37.307Z (2 months ago)
- Language: Lua
- Size: 16.6 KB
- Stars: 1
- Watchers: 2
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# Liqr
Substring filtering for Lua.In general, sequential matches and matches at word boundaries—including the boundaries
of capital letters appearing in camelCaseDescriptors—are prioritized over spread out,
mid-word matches.## Matching a Single String
```lua
local liqr = require('liqr')local score, matches = liqr.match('Fissile Pitched Birch Oxtail', 'ill')
print(score)
--> 0.55 Lower scores are better
--> 0.0 indicates an exact case-insensitive matchinspect(matches)
--> {
--> {first=5, last=6}, "il" characters in "Fissile"
--> {first=28, last=28} "l" character in "Oxtail"
--> }-- A failed match returns only a score of infinity
local score, matches = liqr.match('dog', 'cat')
print(score, matches)
--> inf nil
```## Filtering and Sorting a List of Results
```lua
local menu = {
{id=1, label='Topside Betake Bejewel Mouth'},
{id=2, label='Indigent Wapiti Mail'},
{id=3, label='Fissile Pitched Birch Oxtail'},
{id=4, label='Pithy Crumpet Monster'},
{id=5, label='Britches Courier Small'},
{id=6, label='Lagrange Exemplar Raisin Clang'},
{id=7, label='Zoo Beam Diluvium Tourist'},
{id=8, label='Taffy Town'},
{id=9, label='Outwash Author Infer Flamingo'},
}-- Simply finding the names of the matching items
-- The optional third parameter indicates that the items are tables, and matches against this key
-- With no third parameter `tostring()` is invoked on each list entry to find the string to match against
local results = liqr.filter(menu, 'cr', 'label')
for i,match in ipairs(results) do
print(i, menu[match.originalIndex].label)
end
--> 1 Pithy Crumpet Monster
--> 2 Britches Courier Small List
--> 3 Fissile Pitched Birch Oxtail-- Showing the data available in the results
local results = liqr.filter(menu, 'bea', 'label')
--> {
--> {score=0.15, originalIndex=7, matches={{first=5, last=7}},
--> bits={{match=false, str="Zoo "},
--> {match=true, str="Bea"},
--> {match=false, str="m Diluvium Tourist"}}},
-->
--> {score=0.4, originalIndex=1, matches={{first=9, last=10}, {first=12, last=12}},
--> bits={{match=false, str="Topside "},
--> {match=true, str="Be"},
--> {match=false, str="t"},
--> {match=true, str="a"},
--> {match=false, str="ke Bejewel Mouth"}}},
-->
--> {score=0.55, originalIndex=5, matches={{first=1, last=1}, {first=7, last=7}, {first=20, last=20}},
--> bits={{match=true, str="B"},
--> {match=false, str="ritch"},
--> {match=true, str="e"},
--> {match=false, str="s Courier Sm"},
--> {match=true, str="a"},
--> {match=false, str="ll"}}}}
--> }-- Showing how to concatenate the `bits` to construct a string that highlights the matches
local function showTop5(search)
for i,result in ipairs(liqr.filter(menu, search, 'label')) do
if i>5 then break end
local uppercasedMatches = {}
for i,bit in ipairs(result.bits) do
uppercasedMatches[i] = bit.match and bit.str:upper() or bit.str:lower()
end
print(table.concat(uppercasedMatches))
end
endshowTop5('t')
--> Topside betake bejewel mouth
--> Taffy town
--> zoo beam diluvium Tourist
--> briTches courier small list
--> piThy crumpet monstershowTop5('tt')
--> Taffy Town
--> Topside beTake bejewel mouth
--> zoo beam diluvium TourisT
--> briTches courier small lisT
--> piThy crumpeT monstershowTop5('ttown')
--> Taffy TOWN
```