Merge pull request #660 from adamharrison/improved-heuristic

Improved heuristic to pay more attention to string length.
This commit is contained in:
Adam 2021-11-12 17:47:46 -05:00 committed by GitHub
commit 0db3648966
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 18 additions and 42 deletions

View File

@ -591,56 +591,32 @@ static int f_exec(lua_State *L) {
return 0; return 0;
} }
static int f_fuzzy_match(lua_State *L) { static int f_fuzzy_match(lua_State *L) {
size_t strLen, ptnLen; size_t strLen, ptnLen;
const char *str = luaL_checklstring(L, 1, &strLen); const char *str = luaL_checklstring(L, 1, &strLen);
const char *ptn = luaL_checklstring(L, 2, &ptnLen); const char *ptn = luaL_checklstring(L, 2, &ptnLen);
bool files = false; // If true match things *backwards*. This allows for better matching on filenames than the above
if (lua_gettop(L) > 2 && lua_isboolean(L,3))
files = lua_toboolean(L, 3);
int score = 0;
int run = 0;
// Match things *backwards*. This allows for better matching on filenames than the above
// function. For example, in the lite project, opening "renderer" has lib/font_render/build.sh // function. For example, in the lite project, opening "renderer" has lib/font_render/build.sh
// as the first result, rather than src/renderer.c. Clearly that's wrong. // as the first result, rather than src/renderer.c. Clearly that's wrong.
if (files) { bool files = lua_gettop(L) > 2 && lua_isboolean(L,3) && lua_toboolean(L, 3);
const char* strEnd = str + strLen - 1; int score = 0, run = 0, increment = files ? -1 : 1;
const char* ptnEnd = ptn + ptnLen - 1; const char* strTarget = files ? str + strLen - 1 : str;
while (strEnd >= str && ptnEnd >= ptn) { const char* ptnTarget = files ? ptn + ptnLen - 1 : ptn;
while (*strEnd == ' ') { strEnd--; } while (strTarget >= str && ptnTarget >= ptn && *strTarget && *ptnTarget) {
while (*ptnEnd == ' ') { ptnEnd--; } while (strTarget >= str && *strTarget == ' ') { strTarget += increment; }
if (tolower(*strEnd) == tolower(*ptnEnd)) { while (ptnTarget >= ptn && *ptnTarget == ' ') { ptnTarget += increment; }
score += run * 10 - (*strEnd != *ptnEnd); if (tolower(*strTarget) == tolower(*ptnTarget)) {
run++; score += run * 10 - (*strTarget != *ptnTarget);
ptnEnd--; run++;
} else { ptnTarget += increment;
score -= 10; } else {
run = 0; score -= 10;
} run = 0;
strEnd--;
} }
if (ptnEnd >= ptn) { return 0; } strTarget += increment;
} else {
while (*str && *ptn) {
while (*str == ' ') { str++; }
while (*ptn == ' ') { ptn++; }
if (tolower(*str) == tolower(*ptn)) {
score += run * 10 - (*str != *ptn);
run++;
ptn++;
} else {
score -= 10;
run = 0;
}
str++;
}
if (*ptn) { return 0; }
} }
if (ptnTarget >= ptn && *ptnTarget) { return 0; }
lua_pushnumber(L, score - (int)strLen); lua_pushnumber(L, score - (int)strLen * 10);
return 1; return 1;
} }