diff --git a/kernel/model/assets.go b/kernel/model/assets.go index 4423b4848..c29bf3085 100644 --- a/kernel/model/assets.go +++ b/kernel/model/assets.go @@ -446,21 +446,32 @@ func UnusedAssets() (ret []string) { if nil != err { return } + luteEngine := NewLute() for _, notebook := range notebooks { notebookAbsPath := filepath.Join(util.DataDir, notebook.ID) - trees := loadTrees(notebookAbsPath) dests := map[string]bool{} - for _, tree := range trees { - for _, d := range assetsLinkDestsInTree(tree) { - dests[d] = true - } - - if titleImgPath := treenode.GetDocTitleImgPath(tree.Root); "" != titleImgPath { - // 题头图计入 - if !sql.IsAssetLinkDest([]byte(titleImgPath)) { + pages := pagedPaths(notebookAbsPath, 20) + for _, paths := range pages { + var trees []*parse.Tree + for _, localPath := range paths { + tree, loadTreeErr := loadTree(localPath, luteEngine) + if nil != loadTreeErr { continue } - dests[titleImgPath] = true + trees = append(trees, tree) + } + for _, tree := range trees { + for _, d := range assetsLinkDestsInTree(tree) { + dests[d] = true + } + + if titleImgPath := treenode.GetDocTitleImgPath(tree.Root); "" != titleImgPath { + // 题头图计入 + if !sql.IsAssetLinkDest([]byte(titleImgPath)) { + continue + } + dests[titleImgPath] = true + } } } diff --git a/kernel/model/tree.go b/kernel/model/tree.go index a247e6fdc..ddefc82aa 100644 --- a/kernel/model/tree.go +++ b/kernel/model/tree.go @@ -22,6 +22,7 @@ import ( "path/filepath" "strings" + "github.com/88250/lute" "github.com/88250/lute/parse" "github.com/88250/protyle" "github.com/siyuan-note/filelock" @@ -30,8 +31,9 @@ import ( "github.com/siyuan-note/siyuan/kernel/util" ) -func loadTrees(localPath string) (ret []*parse.Tree) { - luteEngine := NewLute() +func pagedPaths(localPath string, pageSize int) (ret map[int][]string) { + ret = map[int][]string{} + page := 1 filepath.Walk(localPath, func(path string, info fs.FileInfo, err error) error { if info.IsDir() && strings.HasPrefix(info.Name(), ".") { return filepath.SkipDir @@ -41,23 +43,30 @@ func loadTrees(localPath string) (ret []*parse.Tree) { return nil } - data, err := filelock.NoLockFileRead(path) - if nil != err { - util.LogErrorf("get data [path=%s] failed: %s", path, err) - return nil + ret[page] = append(ret[page], path) + if pageSize <= len(ret[page]) { + page++ } - - tree, err := protyle.ParseJSONWithoutFix(luteEngine, data) - if nil != err { - util.LogErrorf("parse json to tree [%s] failed: %s", path, err) - return nil - } - ret = append(ret, tree) return nil }) return } +func loadTree(localPath string, luteEngine *lute.Lute) (ret *parse.Tree, err error) { + data, err := filelock.NoLockFileRead(localPath) + if nil != err { + util.LogErrorf("get data [path=%s] failed: %s", localPath, err) + return + } + + ret, err = protyle.ParseJSONWithoutFix(luteEngine, data) + if nil != err { + util.LogErrorf("parse json to tree [%s] failed: %s", localPath, err) + return + } + return +} + var ErrBoxNotFound = errors.New("notebook not found") var ErrBlockNotFound = errors.New("block not found") var ErrTreeNotFound = errors.New("tree not found")