123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102 |
- // SiYuan - Refactor your thinking
- // Copyright (c) 2020-present, b3log.org
- //
- // This program is free software: you can redistribute it and/or modify
- // it under the terms of the GNU Affero General Public License as published by
- // the Free Software Foundation, either version 3 of the License, or
- // (at your option) any later version.
- //
- // This program is distributed in the hope that it will be useful,
- // but WITHOUT ANY WARRANTY; without even the implied warranty of
- // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- // GNU Affero General Public License for more details.
- //
- // You should have received a copy of the GNU Affero General Public License
- // along with this program. If not, see <https://www.gnu.org/licenses/>.
- package cache
- import (
- "io/fs"
- "path/filepath"
- "strings"
- "sync"
- "time"
- "github.com/siyuan-note/filelock"
- "github.com/siyuan-note/logging"
- "github.com/siyuan-note/siyuan/kernel/util"
- )
- type Asset struct {
- HName string `json:"hName"`
- Path string `json:"path"`
- Updated int64 `json:"updated"`
- }
- var assetsCache = map[string]*Asset{}
- var assetsLock = sync.Mutex{}
- func GetAssets() (ret map[string]*Asset) {
- assetsLock.Lock()
- defer assetsLock.Unlock()
- ret = map[string]*Asset{}
- for k, v := range assetsCache {
- ret[k] = v
- }
- return
- }
- func RemoveAsset(path string) {
- assetsLock.Lock()
- defer assetsLock.Unlock()
- delete(assetsCache, path)
- }
- func ExistAsset(path string) (ret bool) {
- assetsLock.Lock()
- defer assetsLock.Unlock()
- _, ret = assetsCache[path]
- return
- }
- func LoadAssets() {
- defer logging.Recover()
- start := time.Now()
- assetsLock.Lock()
- defer assetsLock.Unlock()
- assetsCache = map[string]*Asset{}
- assets := util.GetDataAssetsAbsPath()
- filelock.Walk(assets, func(path string, info fs.FileInfo, err error) error {
- if nil == info {
- return err
- }
- if info.IsDir() {
- if strings.HasPrefix(info.Name(), ".") {
- return filepath.SkipDir
- }
- return nil
- }
- if strings.HasSuffix(info.Name(), ".sya") || strings.HasPrefix(info.Name(), ".") || filelock.IsHidden(path) {
- return nil
- }
- hName := util.RemoveID(info.Name())
- path = "assets" + filepath.ToSlash(strings.TrimPrefix(path, assets))
- assetsCache[path] = &Asset{
- HName: hName,
- Path: path,
- Updated: info.ModTime().Unix(),
- }
- return nil
- })
- elapsed := time.Since(start)
- if 2000 < elapsed.Milliseconds() {
- logging.LogInfof("loaded assets [%.2fs]", elapsed.Seconds())
- }
- }
|