diff --git a/kernel/model/block.go b/kernel/model/block.go index 0d805e647..b8b8b2124 100644 --- a/kernel/model/block.go +++ b/kernel/model/block.go @@ -55,6 +55,7 @@ type Block struct { Children []*Block `json:"children"` Depth int `json:"depth"` Count int `json:"count"` + Sort int `json:"sort"` } func (block *Block) IsContainerBlock() bool { diff --git a/kernel/model/search.go b/kernel/model/search.go index 33a3ee1b6..f60132beb 100644 --- a/kernel/model/search.go +++ b/kernel/model/search.go @@ -22,6 +22,7 @@ import ( "fmt" "path" "regexp" + "sort" "strconv" "strings" "time" @@ -344,20 +345,39 @@ func FullTextSearchBlock(query string, boxes, paths []string, types map[string]b case 1: // 按文档分组 rootMap := map[string]bool{} var rootIDs []string + sorts := map[string]int{} for _, b := range blocks { if _, ok := rootMap[b.RootID]; !ok { rootMap[b.RootID] = true rootIDs = append(rootIDs, b.RootID) + tree, _ := loadTreeByBlockID(b.RootID) + if nil == tree { + continue + } + + sort := 0 + ast.Walk(tree.Root, func(n *ast.Node, entering bool) ast.WalkStatus { + if !entering || !n.IsBlock() { + return ast.WalkContinue + } + + sorts[n.ID] = sort + sort++ + return ast.WalkContinue + }) } } + sqlRoots := sql.GetBlocks(rootIDs) roots := fromSQLBlocks(&sqlRoots, "", beforeLen) for _, root := range roots { for _, b := range blocks { + b.Sort = sorts[b.ID] if b.RootID == root.ID { root.Children = append(root.Children, b) } } + sort.Slice(root.Children, func(i, j int) bool { return root.Children[i].Sort < root.Children[j].Sort }) } ret = roots default: @@ -729,6 +749,7 @@ func fromSQLBlock(sqlBlock *sql.Block, terms string, beforeLen int) (block *Bloc Markdown: markdown, Type: treenode.FromAbbrType(sqlBlock.Type), SubType: sqlBlock.SubType, + Sort: sqlBlock.Sort, } if "" != sqlBlock.IAL { block.IAL = map[string]string{}