🎨 Improve the behavior of Jump to parent block in lists https://github.com/siyuan-note/siyuan/issues/16516

Signed-off-by: Daniel <845765@qq.com>
This commit is contained in:
Daniel 2025-12-16 11:36:41 +08:00
parent 43d2654213
commit 3e9bd1547c
No known key found for this signature in database
GPG key ID: 86211BA83DF03017

View file

@ -206,66 +206,80 @@ func GetBlockSiblingID(id string) (parent, previous, next string) {
return return
} }
if nil != current.Parent && ast.NodeListItem == current.Parent.Type { if !current.ParentIs(ast.NodeList) { // 当前块不在列表内的情况
current = current.Parent parentBlock := treenode.ParentBlock(current)
} if nil != parentBlock {
parent = parentBlock.ID
parentBlock := treenode.ParentBlock(current) if nil != parentBlock.Previous {
if nil == parentBlock { previous = parentBlock.Previous.ID
return
}
parent = parentBlock.ID
if ast.NodeDocument == parentBlock.Type {
parent = treenode.FirstLeafBlock(parentBlock).ID
if nil != current.Previous && current.Previous.IsBlock() {
previous = current.Previous.ID
if flb := treenode.FirstChildBlock(current.Previous); nil != flb {
previous = flb.ID
} }
} if nil != parentBlock.Next {
next = parentBlock.Next.ID
if nil != current.Next && current.Next.IsBlock() {
next = current.Next.ID
if flb := treenode.FirstChildBlock(current.Next); nil != flb {
next = flb.ID
} }
} }
return return
} }
parentCount := 0 if ast.NodeListItem != current.Type && ast.NodeList != current.Parent.Type { // 当前块是列表内的块,但不是列表项或列表的情况
for ; nil != parentBlock; parentBlock = treenode.ParentBlock(parentBlock) { var listParent, listParent2 *ast.Node
if ast.NodeDocument == parentBlock.Type { listParentCount := 0
break for parentBlock := treenode.ParentBlock(current); nil != parentBlock; parentBlock = treenode.ParentBlock(parentBlock) {
} if ast.NodeListItem == parentBlock.Type {
listParentCount++
if ast.NodeList == parentBlock.Type || ast.NodeBlockquote == parentBlock.Type || ast.NodeSuperBlock == parentBlock.Type || ast.NodeCallout == parentBlock.Type { if 1 < listParentCount {
parentCount++ listParent2 = parentBlock
continue break
} }
listParent = parentBlock
if ast.NodeListItem == parentBlock.Type { continue
if 1 > parentCount {
parentBlock = treenode.ParentBlock(parentBlock)
} }
}
if 1 == listParentCount { // 列表只有一层的情况
if nil != listParent {
parent = listParent.ID
previous, next = getPreNext(listParent)
}
return
}
parent = listParent2.ID
previous, next = getPreNext(listParent)
return
}
if ast.NodeListItem == current.Type {
// 当前块是列表项的情况
parentBlock := treenode.ParentBlock(current)
if nil != parentBlock {
parentBlock = treenode.ParentBlock(parentBlock) parentBlock = treenode.ParentBlock(parentBlock)
} }
break if nil != parentBlock {
} parent = parentBlock.ID
if ast.NodeDocument == parentBlock.Type { previous, next = getPreNext(current)
parentBlock = treenode.FirstLeafBlock(parentBlock) }
parent = parentBlock.ID return
} else {
parent = parentBlock.ID
} }
if nil != parentBlock.Previous { // 当前块是列表的情况
previous = parentBlock.Previous.ID parentBlock := treenode.ParentBlock(current)
if nil != parentBlock {
parent = parentBlock.ID
previous, next = getPreNext(current)
return
} }
if nil != parentBlock.Next { return
next = parentBlock.Next.ID }
func getPreNext(parent *ast.Node) (previous, next string) {
if nil != parent {
if nil != parent.Previous {
previous = parent.Previous.ID
}
if nil != parent.Next {
next = parent.Next.ID
}
return
} }
return return
} }