From a9092ce18d4f30c8344bef7f2af053b23f33d98e Mon Sep 17 00:00:00 2001 From: Daniel <845765@qq.com> Date: Fri, 19 Jan 2024 17:53:21 +0800 Subject: [PATCH] :bug: Repeated escaping in preview area when searching for matching doc blocks https://github.com/siyuan-note/siyuan/issues/10219 --- kernel/model/search.go | 7 +++++-- kernel/util/misc.go | 6 +++++- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/kernel/model/search.go b/kernel/model/search.go index 45345569d..eeeb7ea1a 100644 --- a/kernel/model/search.go +++ b/kernel/model/search.go @@ -1298,12 +1298,15 @@ func stringQuery(query string) string { func markReplaceSpan(n *ast.Node, unlinks *[]*ast.Node, keywords []string, markSpanDataType string, luteEngine *lute.Lute) bool { text := n.Content() if ast.NodeText == n.Type { - text = util.EscapeHTML(text) + escapedText := util.EscapeHTML(text) escapedKeywords := make([]string, len(keywords)) for i, keyword := range keywords { escapedKeywords[i] = util.EscapeHTML(keyword) } - text = search.EncloseHighlighting(text, escapedKeywords, search.GetMarkSpanStart(markSpanDataType), search.GetMarkSpanEnd(), Conf.Search.CaseSensitive, false) + hText := search.EncloseHighlighting(escapedText, escapedKeywords, search.GetMarkSpanStart(markSpanDataType), search.GetMarkSpanEnd(), Conf.Search.CaseSensitive, false) + if hText != escapedText { + text = hText + } n.Tokens = gulu.Str.ToBytes(text) if bytes.Contains(n.Tokens, []byte(search.MarkDataType)) { linkTree := parse.Inline("", n.Tokens, luteEngine.ParseOptions) diff --git a/kernel/util/misc.go b/kernel/util/misc.go index ef6623fcd..768a7bb18 100644 --- a/kernel/util/misc.go +++ b/kernel/util/misc.go @@ -43,7 +43,11 @@ func RemoveElem[T any](s []T, index int) []T { } func EscapeHTML(s string) string { - if strings.ContainsAny(s, "<>\"'") { + if strings.Contains(s, "&") { + return s + } + + if strings.ContainsAny(s, "<>\"'&") { return html.EscapeString(s) } return s