From 1fcf79b8596285773ebba2fd56c9b14e11c6e2c1 Mon Sep 17 00:00:00 2001 From: Liang Ding Date: Fri, 30 Sep 2022 11:50:28 +0800 Subject: [PATCH] =?UTF-8?q?:sparkles:=20=E7=BC=96=E8=BE=91=E5=99=A8?= =?UTF-8?q?=E5=BC=8F=E5=8F=8D=E9=93=BE=E9=9D=A2=E6=9D=BF=20https://github.?= =?UTF-8?q?com/siyuan-note/siyuan/issues/3565?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- kernel/model/backlink.go | 89 +++++++++++++++++++++++++++++++++++----- 1 file changed, 79 insertions(+), 10 deletions(-) diff --git a/kernel/model/backlink.go b/kernel/model/backlink.go index 23e52365a..ee289e544 100644 --- a/kernel/model/backlink.go +++ b/kernel/model/backlink.go @@ -26,7 +26,6 @@ import ( "strings" "github.com/88250/gulu" - "github.com/88250/lute" "github.com/88250/lute/ast" "github.com/88250/lute/parse" "github.com/emirpasic/gods/sets/hashset" @@ -279,17 +278,87 @@ func GetBacklinkDoc(defID, refTreeID string) (ret []*Backlink) { logging.LogErrorf("load ref tree [%s] failed: %s", refTreeID, err) return } - linkPaths := toSubTree(linkRefs, keyword) - for _, link := range linkPaths { - for _, c := range link.Children { - n := treenode.GetNodeInTree(refTree, c.ID) - dom := lute.RenderNodeBlockDOM(n, luteEngine.ParseOptions, luteEngine.RenderOptions) - ret = append(ret, &Backlink{ - DOM: dom, - BlockPaths: buildBlockBreadcrumb(n), - }) + + for _, linkRef := range linkRefs { + n := treenode.GetNodeInTree(refTree, linkRef.ID) + if nil == n { + continue } + + var renderNodes []*ast.Node + if ast.NodeListItem == n.Type { + if nil == n.FirstChild { + continue + } + + c := n.FirstChild + if 3 == n.ListData.Typ { + c = n.FirstChild.Next + } + + expand := true + for liFirstBlockSpan := c.FirstChild; nil != liFirstBlockSpan; liFirstBlockSpan = liFirstBlockSpan.Next { + if treenode.IsBlockRef(liFirstBlockSpan) { + continue + } + if "" != strings.TrimSpace(liFirstBlockSpan.Text()) { + expand = false + break + } + } + + renderNodes = append(renderNodes, n) + if !expand { + var unlinks []*ast.Node + for cc := c.Next; nil != cc; cc = cc.Next { + unlinks = append(unlinks, cc) + } + for _, unlink := range unlinks { + unlink.Unlink() + } + } + } else if ast.NodeHeading == n.Type { + c := n.FirstChild + if nil == c { + continue + } + + expand := true + for headingFirstSpan := c; nil != headingFirstSpan; headingFirstSpan = headingFirstSpan.Next { + if treenode.IsBlockRef(headingFirstSpan) { + continue + } + if "" != strings.TrimSpace(headingFirstSpan.Text()) { + expand = false + break + } + } + + renderNodes = append(renderNodes, n) + if !expand { + var unlinks []*ast.Node + for cc := n.Next; nil != cc; cc = cc.Next { + unlinks = append(unlinks, cc) + } + for _, unlink := range unlinks { + unlink.Unlink() + } + + } else { + cc := treenode.HeadingChildren(n) + renderNodes = append(renderNodes, cc...) + } + } else { + renderNodes = append(renderNodes, n) + } + + dom := renderBlockDOMByNodes(renderNodes, luteEngine) + ret = append(ret, &Backlink{ + DOM: dom, + BlockPaths: buildBlockBreadcrumb(n), + }) } + return }