Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/rmm5t/liquidmetal
:sweat_drops::metal: A mimetic poly-alloy of the Quicksilver scoring algorithm, essentially LiquidMetal. </Schwarzenegger Voice>
https://github.com/rmm5t/liquidmetal
fuzzy-matching fuzzy-search javascript
Last synced: about 5 hours ago
JSON representation
:sweat_drops::metal: A mimetic poly-alloy of the Quicksilver scoring algorithm, essentially LiquidMetal. </Schwarzenegger Voice>
- Host: GitHub
- URL: https://github.com/rmm5t/liquidmetal
- Owner: rmm5t
- License: mit
- Created: 2009-02-06T00:16:49.000Z (almost 16 years ago)
- Default Branch: master
- Last Pushed: 2020-06-17T02:10:02.000Z (over 4 years ago)
- Last Synced: 2024-05-01T12:24:17.747Z (7 months ago)
- Topics: fuzzy-matching, fuzzy-search, javascript
- Language: JavaScript
- Homepage:
- Size: 44.9 KB
- Stars: 292
- Watchers: 9
- Forks: 25
- Open Issues: 1
-
Metadata Files:
- Readme: README.markdown
- Funding: .github/FUNDING.yml
- License: LICENSE.txt
Awesome Lists containing this project
- awesome-tiny-js - liquidmetal - Quicksilver algorithm, prioritizes matches at start of word for command abbreviations (e.g. `gp` -> `git push`). One string at a time. <img align="top" height="24" src="./img/liquidmetal.svg"> (Text Search / Fuzzy search)
README
# LiquidMetal
[A mimetic poly-alloy](https://youtu.be/Fa4Jq7gJvZ0) of the Quicksilver
scoring algorithm, essentially LiquidMetal. ``Flex matching short abbreviations against longer strings is a boon in
productivity for typists. Applications like
[Quicksilver](http://www.qsapp.com/), [Alfred](http://www.alfredapp.com/),
[LaunchBar](http://www.obdev.at/products/launchbar/index.html), and
[Launchy](http://www.launchy.net/) have made this method of keyboard entry a
popular one. It's time to bring this same functionality to web controls.
LiquidMetal makes scoring long strings against abbreviations easy.## Usage
Include the library:
Score any string against an abbreviation:
LiquidMetal.score("FooBar", "foo") //=> 0.950
LiquidMetal.score("FooBar", "fb") //=> 0.917
LiquidMetal.score("Foo Bar", "fb") //=> 0.929
LiquidMetal.score("Foo Bar", "baz") //=> 0.0
LiquidMetal.score("Foo Bar", "") //=> 0.8All scores fall between a range of 0.0 (no match) to 1.0 (perfect match).
## Inspired By
* [Quicksilver](http://code.google.com/p/blacktree-alchemy/) and its [scoreForAbbreviation algorithm](http://code.google.com/p/blacktree-alchemy/source/browse/trunk/Crucible/Code/NSString_BLTRExtensions.m#61) by Alcor
* [Quicksilver.js](http://rails-oceania.googlecode.com/svn/lachiecox/qs_score/trunk/qs_score.js) by [Lachie Cox](http://smartbomb.com.au/2008/02/11/quicksilver-javascript)## Why?
* To satisfy my own requirements for the
[jquery.flexselect](http://rmm5t.github.io/jquery-flexselect) plugin
* The Quicksilver algorithm doesn't give proper weight to abbreviations that
match the first character of the scored string.
* The Quicksilver algorithm is extremely slow for certain length
string/abbreviation combinations because of its use of recursion. While
slightly slower for shorter length string/abbreviation combinations,
LiquidMetal outperforms the Quicksilver algorithm by orders of magnitude under
other conditions.
* The javascript version of the Quicksilver algorithm (Quicksilver.js) is case
sensitive and doesn't give added weight to camel case strings; whereas,
LiquidMetal is case insensitive and does give added weight to uppercase
letters in camel case strings.## Todo
* More tests
* Consider tweaking the scores for "trailing" characters
* Improve implementation of highest score matching (LiquidMetal
currently returns the highest scoring match for an abbreviation,
but is inefficient)
* See if it's possible to tune the performance further## Author
[Ryan McGeary](http://ryan.mcgeary.org) ([@rmm5t](http://twitter.com/rmm5t))
## License
[MIT License](https://rmm5t.mit-license.org/)