GithubHelp home page GithubHelp logo

rmm5t / liquidmetal Goto Github PK

View Code? Open in Web Editor NEW
294.0 9.0 25.0 46 KB

:sweat_drops::metal: A mimetic poly-alloy of the Quicksilver scoring algorithm, essentially LiquidMetal. </Schwarzenegger Voice>

License: MIT License

JavaScript 65.54% HTML 34.46%
fuzzy-matching fuzzy-search javascript

liquidmetal's Introduction

LiquidMetal

A mimetic poly-alloy of the Quicksilver scoring algorithm, essentially LiquidMetal. </Schwarzenegger Voice>

Flex matching short abbreviations against longer strings is a boon in productivity for typists. Applications like Quicksilver, Alfred, LaunchBar, and Launchy 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:

<script src="liquidmetal.js" type="text/javascript"></script>

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.8

All scores fall between a range of 0.0 (no match) to 1.0 (perfect match).

Inspired By

Why?

  • To satisfy my own requirements for the 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 (@rmm5t)

License

MIT License

liquidmetal's People

Contributors

ratbeard avatar rich-harris avatar rmm5t avatar shelhamer avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

liquidmetal's Issues

Just a heads up in JS style

You iterate over arrays using for-in which is not only bad practice but breaks as soon another script extends Array.prototype.

You lowerCase chars and split them, you can iterate over a String using its length attribute.

Otherwise, inspiring idea for a search algorithm.

publish to npm

Would you mind publishing liquidmetal to npm? Looks like everything is ready (package.json with a proper main field, cjs export in the library itself).

Thanks!

Just wondering...FYI

in the _scoreAll you add scores to allScores and then return if abbrIndex = abbrev.length ... at this point can you not return a boolean and check this at the end of the while statement. if it is true then break out and keep returning all the way back to the top. Am I missing something? This would make it much quicker

Liquidmetal takes up to 680mb memory when searching a long list

Hi,

I have a ~3000 items list with average item size of 50 characters.
When searching several times for items that are not in the list, especially when copy pasting in the search box, the whole tab becomes laggy and end up crashing.

Chrome timeline shows that memory usage goes up to 680mb.

Bump bower package version

Hello,

The version published to bower doesn't include the module checking (86ca6b2), so I had to copy/paste liquidmetal.js directly from here. Would be nice to get it fixed. ๐Ÿ˜„

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.