diff options
| author | Junegunn Choi <junegunn.c@gmail.com> | 2024-08-13 11:19:54 +0900 |
|---|---|---|
| committer | Junegunn Choi <junegunn.c@gmail.com> | 2024-08-29 17:08:23 +0900 |
| commit | 6a67712944bbba3bfbb04e6ad02f7ae7d55cd238 (patch) | |
| tree | 90e9c6c6d4655f26b76f29c73bcc67786ea1f0f1 /src/algo | |
| parent | e8a690928db0acf8c3eb6887fe92c58fdc3ab167 (diff) | |
| download | fzf-6a67712944bbba3bfbb04e6ad02f7ae7d55cd238.tar.gz | |
Implement exact-boundary match type
Close #3963
Diffstat (limited to 'src/algo')
| -rw-r--r-- | src/algo/algo.go | 19 |
1 files changed, 18 insertions, 1 deletions
diff --git a/src/algo/algo.go b/src/algo/algo.go index c85ec82e..a02a0a81 100644 --- a/src/algo/algo.go +++ b/src/algo/algo.go @@ -798,6 +798,14 @@ func FuzzyMatchV1(caseSensitive bool, normalize bool, forward bool, text *util.C // The solution is much cheaper since there is only one possible alignment of // the pattern. func ExactMatchNaive(caseSensitive bool, normalize bool, forward bool, text *util.Chars, pattern []rune, withPos bool, slab *util.Slab) (Result, *[]int) { + return exactMatchNaive(caseSensitive, normalize, forward, false, text, pattern, withPos, slab) +} + +func ExactMatchBoundary(caseSensitive bool, normalize bool, forward bool, text *util.Chars, pattern []rune, withPos bool, slab *util.Slab) (Result, *[]int) { + return exactMatchNaive(caseSensitive, normalize, forward, true, text, pattern, withPos, slab) +} + +func exactMatchNaive(caseSensitive bool, normalize bool, forward bool, boundaryCheck bool, text *util.Chars, pattern []rune, withPos bool, slab *util.Slab) (Result, *[]int) { if len(pattern) == 0 { return Result{0, 0, 0}, nil } @@ -832,10 +840,19 @@ func ExactMatchNaive(caseSensitive bool, normalize bool, forward bool, text *uti } pidx_ := indexAt(pidx, lenPattern, forward) pchar := pattern[pidx_] - if pchar == char { + ok := pchar == char + if ok { if pidx_ == 0 { bonus = bonusAt(text, index_) } + if boundaryCheck { + ok = bonus >= bonusBoundary + if ok && pidx_ == len(pattern)-1 { + ok = index_ == lenRunes-1 || charClassOf(text.Get(index_+1)) <= charDelimiter + } + } + } + if ok { pidx++ if pidx == lenPattern { if bonus > bestBonus { |
