summaryrefslogtreecommitdiff
path: root/src/algo
diff options
context:
space:
mode:
authorJunegunn Choi <junegunn.c@gmail.com>2017-01-09 09:52:17 +0900
committerJunegunn Choi <junegunn.c@gmail.com>2017-01-09 09:52:17 +0900
commita16d8f66a99ae365a57d114d5ee7d0a7ebc4cf5f (patch)
treea03c5b7bd5582695a7b02c828117c44e4a771e26 /src/algo
parent45793d75c2d168d51be3578b8d785159ec81ff92 (diff)
downloadfzf-a16d8f66a99ae365a57d114d5ee7d0a7ebc4cf5f.tar.gz
Normalize pattern string before passing it to Algo function
Diffstat (limited to 'src/algo')
-rw-r--r--src/algo/algo.go38
-rw-r--r--src/algo/normalize.go16
2 files changed, 19 insertions, 35 deletions
diff --git a/src/algo/algo.go b/src/algo/algo.go
index 2a3bc9d3..ac6c66d5 100644
--- a/src/algo/algo.go
+++ b/src/algo/algo.go
@@ -246,21 +246,9 @@ func normalizeRune(r rune) rune {
return r
}
-func normalizeRunes(runes []rune) []rune {
- ret := make([]rune, len(runes))
- copy(ret, runes)
- for idx, r := range runes {
- if r < 0x00C0 || r > 0x2184 {
- continue
- }
- n := normalized[r]
- if n > 0 {
- ret[idx] = normalized[r]
- }
- }
- return ret
-}
-
+// Algo functions make two assumptions
+// 1. "pattern" is given in lowercase if "caseSensitive" is false
+// 2. "pattern" is already normalized if "normalize" is true
type Algo func(caseSensitive bool, normalize bool, forward bool, input util.Chars, pattern []rune, withPos bool, slab *util.Slab) (Result, *[]int)
func FuzzyMatchV2(caseSensitive bool, normalize bool, forward bool, input util.Chars, pattern []rune, withPos bool, slab *util.Slab) (Result, *[]int) {
@@ -283,10 +271,6 @@ func FuzzyMatchV2(caseSensitive bool, normalize bool, forward bool, input util.C
return FuzzyMatchV1(caseSensitive, normalize, forward, input, pattern, withPos, slab)
}
- if normalize {
- pattern = normalizeRunes(pattern)
- }
-
// Reuse pre-allocated integer slice to avoid unnecessary sweeping of garbages
offset16 := 0
offset32 := 0
@@ -539,10 +523,6 @@ func FuzzyMatchV1(caseSensitive bool, normalize bool, forward bool, text util.Ch
lenRunes := text.Length()
lenPattern := len(pattern)
- if normalize {
- pattern = normalizeRunes(pattern)
- }
-
for index := 0; index < lenRunes; index++ {
char := text.Get(indexAt(index, lenRunes, forward))
// This is considerably faster than blindly applying strings.ToLower to the
@@ -626,10 +606,6 @@ func ExactMatchNaive(caseSensitive bool, normalize bool, forward bool, text util
return Result{-1, -1, 0}, nil
}
- if normalize {
- pattern = normalizeRunes(pattern)
- }
-
// For simplicity, only look at the bonus at the first character position
pidx := 0
bestPos, bonus, bestBonus := -1, int16(0), int16(-1)
@@ -693,10 +669,6 @@ func PrefixMatch(caseSensitive bool, normalize bool, forward bool, text util.Cha
return Result{-1, -1, 0}, nil
}
- if normalize {
- pattern = normalizeRunes(pattern)
- }
-
for index, r := range pattern {
char := text.Get(index)
if !caseSensitive {
@@ -726,10 +698,6 @@ func SuffixMatch(caseSensitive bool, normalize bool, forward bool, text util.Cha
return Result{-1, -1, 0}, nil
}
- if normalize {
- pattern = normalizeRunes(pattern)
- }
-
for index, r := range pattern {
char := text.Get(index + diff)
if !caseSensitive {
diff --git a/src/algo/normalize.go b/src/algo/normalize.go
index 1168a646..7a496441 100644
--- a/src/algo/normalize.go
+++ b/src/algo/normalize.go
@@ -406,3 +406,19 @@ var normalized map[rune]rune = map[rune]rune{
0x028F: 'Y', // , LATIN LETTER SMALL CAPITAL
0x1D22: 'Z', // , LATIN LETTER SMALL CAPITAL
}
+
+// NormalizeRunes normalizes latin script letters
+func NormalizeRunes(runes []rune) []rune {
+ ret := make([]rune, len(runes))
+ copy(ret, runes)
+ for idx, r := range runes {
+ if r < 0x00C0 || r > 0x2184 {
+ continue
+ }
+ n := normalized[r]
+ if n > 0 {
+ ret[idx] = normalized[r]
+ }
+ }
+ return ret
+}