🎨 支持合并子文档导出 Word/PDF https://github.com/siyuan-note/siyuan/issues/3219

This commit is contained in:
Liang Ding 2022-12-10 18:13:30 +08:00
parent 5b45ed0c67
commit b6d961f347
No known key found for this signature in database
GPG Key ID: 136F30F901A2231D

View File

@ -28,8 +28,10 @@ func mergeSubDocs(rootTree *parse.Tree) (ret *parse.Tree, err error) {
return return
} }
for i := 0; i < 1024; i++ { insertPoint := rootTree.Root.LastChild
if err = walkBlock(ret, rootBlock); nil != err { for {
i := 0
if err = walkBlock(insertPoint, rootBlock, i); nil != err {
return return
} }
@ -40,34 +42,42 @@ func mergeSubDocs(rootTree *parse.Tree) (ret *parse.Tree, err error) {
return return
} }
func walkBlock(tree *parse.Tree, block *Block) (err error) { func walkBlock(insertPoint *ast.Node, block *Block, level int) (err error) {
level++
for _, c := range block.Children { for _, c := range block.Children {
if err = walkBlock(tree, c); nil != err { if err = walkBlock(insertPoint, c, level); nil != err {
return return
} }
} }
for i := len(block.Children) - 1; -1 < i; i-- { for _, c := range block.Children {
c := block.Children[i] nodes, loadErr := loadTreeNodes(c.Box, c.Path, level)
nodes, loadErr := loadTreeNodes(c.Box, c.Path)
if nil != loadErr { if nil != loadErr {
return return
} }
for j := len(nodes) - 1; -1 < j; j-- { for j := len(nodes) - 1; -1 < j; j-- {
tree.Root.LastChild.InsertAfter(nodes[j]) insertPoint.InsertAfter(nodes[j])
} }
} }
block.Children = nil block.Children = nil
return return
} }
func loadTreeNodes(box string, p string) (ret []*ast.Node, err error) { func loadTreeNodes(box string, p string, level int) (ret []*ast.Node, err error) {
tree, err := LoadTree(box, p) tree, err := LoadTree(box, p)
if nil != err { if nil != err {
return return
} }
hLevel := level
if 6 < level {
hLevel = 6
}
heading := &ast.Node{Type: ast.NodeHeading, HeadingLevel: hLevel}
heading.AppendChild(&ast.Node{Type: ast.NodeText, Tokens: []byte(tree.Root.IALAttr("title"))})
tree.Root.PrependChild(heading)
for c := tree.Root.FirstChild; nil != c; c = c.Next { for c := tree.Root.FirstChild; nil != c; c = c.Next {
ret = append(ret, c) ret = append(ret, c)
} }