diff options
author | Junegunn Choi <junegunn.c@gmail.com> | 2020-07-28 13:06:57 +0900 |
---|---|---|
committer | Junegunn Choi <junegunn.c@gmail.com> | 2020-07-28 13:06:57 +0900 |
commit | f092e4038fd1344bcd0a7c11f7ab7355734f7275 (patch) | |
tree | d2247550c1cf0452366e135cfbda252134016f3e /src/pattern.go | |
parent | aa5dae391b1e0de23996ddebeda7d15041d1ad0b (diff) |
Smart match of accented characters
Fix #1618
Diffstat (limited to 'src/pattern.go')
-rw-r--r-- | src/pattern.go | 12 |
1 files changed, 9 insertions, 3 deletions
diff --git a/src/pattern.go b/src/pattern.go index 4880d6e9..56dc830f 100644 --- a/src/pattern.go +++ b/src/pattern.go @@ -33,6 +33,7 @@ type term struct { inv bool text []rune caseSensitive bool + normalize bool } // String returns the string representation of a term. @@ -128,6 +129,8 @@ func BuildPattern(fuzzy bool, fuzzyAlgo algo.Algo, extended bool, caseMode Case, } } else { lowerString := strings.ToLower(asString) + normalize = normalize && + lowerString == string(algo.NormalizeRunes([]rune(lowerString))) caseSensitive = caseMode == CaseRespect || caseMode == CaseSmart && lowerString != asString if !caseSensitive { @@ -173,6 +176,8 @@ func parseTerms(fuzzy bool, caseMode Case, normalize bool, str string) []termSet lowerText := strings.ToLower(text) caseSensitive := caseMode == CaseRespect || caseMode == CaseSmart && text != lowerText + normalizeTerm := normalize && + lowerText == string(algo.NormalizeRunes([]rune(lowerText))) if !caseSensitive { text = lowerText } @@ -222,14 +227,15 @@ func parseTerms(fuzzy bool, caseMode Case, normalize bool, str string) []termSet set = termSet{} } textRunes := []rune(text) - if normalize { + if normalizeTerm { textRunes = algo.NormalizeRunes(textRunes) } set = append(set, term{ typ: typ, inv: inv, text: textRunes, - caseSensitive: caseSensitive}) + caseSensitive: caseSensitive, + normalize: normalizeTerm}) switchSet = true } } @@ -360,7 +366,7 @@ func (p *Pattern) extendedMatch(item *Item, withPos bool, slab *util.Slab) ([]Of matched := false for _, term := range termSet { pfun := p.procFun[term.typ] - off, score, pos := p.iter(pfun, input, term.caseSensitive, p.normalize, p.forward, term.text, withPos, slab) + off, score, pos := p.iter(pfun, input, term.caseSensitive, term.normalize, p.forward, term.text, withPos, slab) if sidx := off[0]; sidx >= 0 { if term.inv { continue |