From feb4d7e0cdbd2e7269e19d31e4aeedc7d4ffb2b3 Mon Sep 17 00:00:00 2001 From: Daniel <845765@qq.com> Date: Mon, 22 May 2023 11:06:28 +0800 Subject: [PATCH] :art: Blocks below other non-folded headings are no longer moved when moving a folded heading Fix https://github.com/siyuan-note/siyuan/issues/8321 --- kernel/model/transaction.go | 5 +++++ kernel/treenode/heading.go | 9 +++++++++ 2 files changed, 14 insertions(+) diff --git a/kernel/model/transaction.go b/kernel/model/transaction.go index 09dc75ae0..9ceda2f83 100644 --- a/kernel/model/transaction.go +++ b/kernel/model/transaction.go @@ -257,7 +257,10 @@ func (tx *Transaction) doMove(operation *Operation) (ret *TxErr) { var headingChildren []*ast.Node if isMovingFoldHeading := ast.NodeHeading == srcNode.Type && "1" == srcNode.IALAttr("fold"); isMovingFoldHeading { headingChildren = treenode.HeadingChildren(srcNode) + // Blocks below other non-folded headings are no longer moved when moving a folded heading https://github.com/siyuan-note/siyuan/issues/8321 + headingChildren = treenode.GetHeadingFold(headingChildren) } + var srcEmptyList *ast.Node if ast.NodeListItem == srcNode.Type && srcNode.Parent.FirstChild == srcNode && srcNode.Parent.LastChild == srcNode { // 列表中唯一的列表项被移除后,该列表就为空了 @@ -290,6 +293,8 @@ func (tx *Transaction) doMove(operation *Operation) (ret *TxErr) { if ast.NodeHeading == targetNode.Type && "1" == targetNode.IALAttr("fold") { targetChildren := treenode.HeadingChildren(targetNode) + targetChildren = treenode.GetHeadingFold(targetChildren) + if l := len(targetChildren); 0 < l { targetNode = targetChildren[l-1] } diff --git a/kernel/treenode/heading.go b/kernel/treenode/heading.go index 1f50f8597..641dbfc84 100644 --- a/kernel/treenode/heading.go +++ b/kernel/treenode/heading.go @@ -72,6 +72,15 @@ func IsInFoldedHeading(node, currentHeading *ast.Node) bool { return IsInFoldedHeading(heading, currentHeading) } +func GetHeadingFold(nodes []*ast.Node) (ret []*ast.Node) { + for _, n := range nodes { + if "1" == n.IALAttr("heading-fold") { + ret = append(ret, n) + } + } + return +} + func HeadingChildren(heading *ast.Node) (ret []*ast.Node) { start := heading.Next if nil == start {