From 6d79c35452183c7c95b523835a2a3a463bb6e91b Mon Sep 17 00:00:00 2001 From: Liang Ding Date: Tue, 10 Jan 2023 23:33:59 +0800 Subject: [PATCH] =?UTF-8?q?:art:=20=E5=8F=8D=E9=93=BE=E9=9D=A2=E6=9D=BF?= =?UTF-8?q?=E6=94=AF=E6=8C=81=E8=BF=87=E6=BB=A4=E5=85=B3=E9=94=AE=E5=AD=97?= =?UTF-8?q?=E9=AB=98=E4=BA=AE=20https://github.com/siyuan-note/siyuan/issu?= =?UTF-8?q?es/7028?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- kernel/model/backlink.go | 38 ++++++++++++++------------------------ 1 file changed, 14 insertions(+), 24 deletions(-) diff --git a/kernel/model/backlink.go b/kernel/model/backlink.go index 2d7ddd7f5..2fd61ce5c 100644 --- a/kernel/model/backlink.go +++ b/kernel/model/backlink.go @@ -27,7 +27,6 @@ import ( "github.com/88250/gulu" "github.com/88250/lute" "github.com/88250/lute/ast" - "github.com/88250/lute/lex" "github.com/88250/lute/parse" "github.com/emirpasic/gods/sets/hashset" "github.com/facette/natsort" @@ -110,6 +109,7 @@ func GetBackmentionDoc(defID, refTreeID, keyword string) (ret []*Backlink) { } func GetBacklinkDoc(defID, refTreeID, keyword string) (ret []*Backlink) { + keyword = strings.TrimSpace(keyword) ret = []*Backlink{} sqlBlock := sql.GetBlock(defID) if nil == sqlBlock { @@ -135,13 +135,17 @@ func GetBacklinkDoc(defID, refTreeID, keyword string) (ret []*Backlink) { luteEngine := NewLute() for _, linkRef := range linkRefs { - backlink := buildBacklink(linkRef.ID, refTree, nil, luteEngine) + var keywords []string + if "" != keyword { + keywords = append(keywords, keyword) + } + backlink := buildBacklink(linkRef.ID, refTree, keywords, luteEngine) ret = append(ret, backlink) } return } -func buildBacklink(refID string, refTree *parse.Tree, mentionKeywords []string, luteEngine *lute.Lute) (ret *Backlink) { +func buildBacklink(refID string, refTree *parse.Tree, keywords []string, luteEngine *lute.Lute) (ret *Backlink) { n := treenode.GetNodeInTree(refTree, refID) if nil == n { return @@ -149,37 +153,23 @@ func buildBacklink(refID string, refTree *parse.Tree, mentionKeywords []string, renderNodes, expand := getBacklinkRenderNodes(n) - if 0 < len(mentionKeywords) { + if 0 < len(keywords) { for _, renderNode := range renderNodes { var unlinks []*ast.Node + ast.Walk(renderNode, func(n *ast.Node, entering bool) ast.WalkStatus { if !entering { return ast.WalkContinue } - if ast.NodeText == n.Type { - text := string(n.Tokens) - newText := markReplaceSpanWithSplit(text, mentionKeywords, getMarkSpanStart(searchMarkDataType), getMarkSpanEnd()) - if text == newText { - return ast.WalkContinue - } - n.Tokens = gulu.Str.ToBytes(newText) - if bytes.Contains(n.Tokens, []byte("search-mark")) { - n.Tokens = lex.EscapeMarkers(n.Tokens) - linkTree := parse.Inline("", n.Tokens, luteEngine.ParseOptions) - var children []*ast.Node - for c := linkTree.Root.FirstChild.FirstChild; nil != c; c = c.Next { - children = append(children, c) - } - for _, c := range children { - n.InsertBefore(c) - } - unlinks = append(unlinks, n) - return ast.WalkContinue - } + if n.IsBlock() { + return ast.WalkContinue } + + markReplaceSpan(n, &unlinks, keywords, searchMarkDataType, luteEngine) return ast.WalkContinue }) + for _, unlink := range unlinks { unlink.Unlink() }