From 7884b6271894946335afbfd7f7d7be7db52415f7 Mon Sep 17 00:00:00 2001 From: Daniel <845765@qq.com> Date: Thu, 28 Nov 2024 13:06:25 +0800 Subject: [PATCH] :art: Improve exporting block ref https://github.com/siyuan-note/siyuan/issues/13283 --- kernel/model/export.go | 57 +++++++++++++++++++++++++++--------------- 1 file changed, 37 insertions(+), 20 deletions(-) diff --git a/kernel/model/export.go b/kernel/model/export.go index 6b34d27b772..bd82bf72c5e 100644 --- a/kernel/model/export.go +++ b/kernel/model/export.go @@ -2148,25 +2148,32 @@ func exportTree(tree *parse.Tree, wysiwyg, keepFold, avHiddenCol bool, if 4 == blockRefMode { // 块引转脚注 unlinks = nil - if footnotesDefBlock := resolveFootnotesDefs(&refFootnotes, ret.Root.ID, blockRefTextLeft, blockRefTextRight); nil != footnotesDefBlock { + if footnotesDefBlock := resolveFootnotesDefs(&refFootnotes, ret, currentTreeNodeIDs, blockRefTextLeft, blockRefTextRight); nil != footnotesDefBlock { // 如果是聚焦导出,可能存在没有使用的脚注定义块,在这里进行清理 // Improve focus export conversion of block refs to footnotes https://github.com/siyuan-note/siyuan/issues/10647 - footnotesRefs := ret.Root.ChildrenByType(ast.NodeFootnotesRef) - for footnotesDef := footnotesDefBlock.FirstChild; nil != footnotesDef; footnotesDef = footnotesDef.Next { - exist := false - for _, ref := range footnotesRefs { - if ref.FootnotesRefId == footnotesDef.FootnotesRefId { - exist = true - break - } - } - if !exist { - unlinks = append(unlinks, footnotesDef) - } - } - for _, n := range unlinks { - n.Unlink() - } + //footnotesRefs := ret.Root.ChildrenByType(ast.NodeFootnotesRef) + //for _, ref := range footnotesRefs { + // ast.Walk(ref, func(n *ast.Node, entering bool) ast.WalkStatus { + // if !entering { + // return ast.WalkContinue + // } + // + // if treenode.IsBlockRef(n) { + // refIDsInfnDefs[n.TextMarkBlockRefID] = true + // } + // return ast.WalkContinue + // }) + //} + // + //for footnotesDef := footnotesDefBlock.FirstChild; nil != footnotesDef; footnotesDef = footnotesDef.Next { + // exist := refIDsInfnDefs[footnotesDef.ID] + // if !exist { + // unlinks = append(unlinks, footnotesDef) + // } + //} + //for _, n := range unlinks { + // n.Unlink() + //} ret.Root.AppendChild(footnotesDefBlock) } @@ -2600,7 +2607,7 @@ func exportTree(tree *parse.Tree, wysiwyg, keepFold, avHiddenCol bool, return ret } -func resolveFootnotesDefs(refFootnotes *[]*refAsFootnotes, rootID string, blockRefTextLeft, blockRefTextRight string) (footnotesDefBlock *ast.Node) { +func resolveFootnotesDefs(refFootnotes *[]*refAsFootnotes, currentTree *parse.Tree, currentTreeNodeIDs map[string]bool, blockRefTextLeft, blockRefTextRight string) (footnotesDefBlock *ast.Node) { if 1 > len(*refFootnotes) { return nil } @@ -2617,7 +2624,7 @@ func resolveFootnotesDefs(refFootnotes *[]*refAsFootnotes, rootID string, blockR var nodes []*ast.Node if ast.NodeHeading == defNode.Type { nodes = append(nodes, defNode) - if rootID != docID { + if currentTree.ID != docID { // 同文档块引转脚注缩略定义考虑容器块和标题块 https://github.com/siyuan-note/siyuan/issues/5917 children := treenode.HeadingChildren(defNode) nodes = append(nodes, children...) @@ -2648,6 +2655,16 @@ func resolveFootnotesDefs(refFootnotes *[]*refAsFootnotes, rootID string, blockR n.InsertBefore(&ast.Node{Type: ast.NodeText, Tokens: []byte(blockRefTextLeft + f.refAnchorText + blockRefTextRight)}) n.InsertBefore(&ast.Node{Type: ast.NodeFootnotesRef, Tokens: []byte("^" + f.refNum), FootnotesRefId: f.refNum, FootnotesRefLabel: []byte("^" + f.refNum)}) unlinks = append(unlinks, n) + } else { + if isNodeInTree(defID, currentTree) { + if currentTreeNodeIDs[defID] { + // 当前文档内不转换脚注,直接使用锚点哈希 https://github.com/siyuan-note/siyuan/issues/13283 + n.TextMarkType = "a" + n.TextMarkTextContent = blockRefTextLeft + n.TextMarkTextContent + blockRefTextRight + n.TextMarkAHref = "#" + defID + return ast.WalkSkipChildren + } + } } return ast.WalkSkipChildren } else if ast.NodeBlockQueryEmbed == n.Type { @@ -2698,7 +2715,7 @@ func resolveFootnotesDefs(refFootnotes *[]*refAsFootnotes, rootID string, blockR } docID := strings.TrimSuffix(path.Base(n.Path), ".sy") - if rootID == docID { + if currentTree.ID == docID { // 同文档块引转脚注缩略定义 https://github.com/siyuan-note/siyuan/issues/3299 if text := sql.GetRefText(n.ID); 64 < utf8.RuneCountInString(text) { var unlinkChildren []*ast.Node