🎨 改进虚拟引用和反链提及搜索匹配 Fix https://github.com/siyuan-note/siyuan/issues/6600

This commit is contained in:
Liang Ding 2022-11-16 10:34:02 +08:00
parent d9e51448dc
commit e4f5690f02
No known key found for this signature in database
GPG key ID: 136F30F901A2231D

View file

@ -672,52 +672,25 @@ func markReplaceSpan(n *ast.Node, unlinks *[]*ast.Node, text string, keywords []
// markReplaceSpanWithSplit 用于处理虚拟引用和反链提及高亮。
func markReplaceSpanWithSplit(text string, keywords []string, replacementStart, replacementEnd string) (ret string) {
// 调用该函数前参数 keywords 必须使用 prepareMarkKeywords 函数进行预处理
tmp := search.EncloseHighlighting(text, keywords, replacementStart, replacementEnd, Conf.Search.CaseSensitive)
parts := strings.Split(tmp, replacementEnd)
buf := bytes.Buffer{}
for i := 0; i < len(parts); i++ {
if i >= len(parts)-1 {
buf.WriteString(parts[i])
break
}
parts := strings.Split(text, " ")
for i, part := range parts {
if "" == part {
if nextPart := parts[i+1]; 0 < len(nextPart) && lex.IsASCIILetter(nextPart[0]) {
// 取消已经高亮的部分
part := strings.ReplaceAll(parts[i], replacementStart, "")
buf.WriteString(part)
continue
}
var hitKeywords []string
for _, k := range keywords {
tmpPart := part
tmpK := k
if !Conf.Search.CaseSensitive {
tmpPart = strings.ToLower(part)
tmpK = strings.ToLower(k)
}
if gulu.Str.IsASCII(tmpK) {
if gulu.Str.IsASCII(tmpPart) {
if tmpPart == tmpK {
hitKeywords = append(hitKeywords, k)
}
} else {
if strings.Contains(tmpPart, tmpK) {
hitKeywords = append(hitKeywords, k)
}
}
} else {
if strings.Contains(tmpPart, tmpK) {
hitKeywords = append(hitKeywords, k)
}
}
}
if 0 < len(hitKeywords) {
parts[i] = search.EncloseHighlighting(part, hitKeywords, replacementStart, replacementEnd, Conf.Search.CaseSensitive)
}
}
ret = strings.Join(parts, " ")
if ret != text {
return
}
// 非 ASCII 文本并且不包含空格时再试试不分词匹配
if !gulu.Str.IsASCII(text) && !strings.Contains(text, " ") {
ret = search.EncloseHighlighting(text, keywords, replacementStart, replacementEnd, Conf.Search.CaseSensitive)
buf.WriteString(parts[i])
buf.WriteString(replacementEnd)
}
ret = buf.String()
return
}