diff --git a/kernel/model/transaction.go b/kernel/model/transaction.go index 1057fed86..483c09c16 100644 --- a/kernel/model/transaction.go +++ b/kernel/model/transaction.go @@ -1222,6 +1222,12 @@ func (tx *Transaction) doInsert(operation *Operation) (ret *TxErr) { node.InsertAfter(remain) } node.InsertAfter(insertedNode) + + if treenode.IsUnderFoldedHeading(insertedNode) { + // 保持在标题下的折叠状态 + insertedNode.SetIALAttr("fold", "1") + insertedNode.SetIALAttr("heading-fold", "1") + } } else { node = treenode.GetNodeInTree(tree, operation.ParentID) if nil == node { @@ -1459,6 +1465,12 @@ func (tx *Transaction) doUpdate(operation *Operation) (ret *TxErr) { oldNode.InsertAfter(updatedNode) oldNode.Unlink() + if treenode.IsUnderFoldedHeading(updatedNode) { + // 保持在标题下的折叠状态 + updatedNode.SetIALAttr("fold", "1") + updatedNode.SetIALAttr("heading-fold", "1") + } + createdUpdated(updatedNode) tx.nodes[updatedNode.ID] = updatedNode diff --git a/kernel/treenode/heading.go b/kernel/treenode/heading.go index 78316fc44..b8b49cfd2 100644 --- a/kernel/treenode/heading.go +++ b/kernel/treenode/heading.go @@ -85,6 +85,20 @@ func GetHeadingFold(nodes []*ast.Node) (ret []*ast.Node) { return } +func IsUnderFoldedHeading(node *ast.Node) bool { + for n := node.Previous; nil != n; n = n.Previous { + if ast.NodeHeading == n.Type && "1" == n.IALAttr("fold") { + if ast.NodeHeading != node.Type { + return true + } + if n.HeadingLevel > node.HeadingLevel { + return true + } + } + } + return false +} + func HeadingChildren(heading *ast.Node) (ret []*ast.Node) { start := heading.Next if nil == start {