mirror of
https://github.com/siyuan-note/siyuan.git
synced 2025-12-20 08:30:12 +01:00
🎨 Attribute View number column format https://github.com/siyuan-note/siyuan/issues/8764
This commit is contained in:
parent
7d992ce175
commit
afb698d1fe
4 changed files with 61 additions and 11 deletions
|
|
@ -17,6 +17,12 @@
|
||||||
package model
|
package model
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"io/fs"
|
||||||
|
"os"
|
||||||
|
"path/filepath"
|
||||||
|
"strings"
|
||||||
|
"sync"
|
||||||
|
|
||||||
"github.com/88250/gulu"
|
"github.com/88250/gulu"
|
||||||
"github.com/88250/lute/ast"
|
"github.com/88250/lute/ast"
|
||||||
"github.com/siyuan-note/eventbus"
|
"github.com/siyuan-note/eventbus"
|
||||||
|
|
@ -25,11 +31,48 @@ import (
|
||||||
"github.com/siyuan-note/siyuan/kernel/sql"
|
"github.com/siyuan-note/siyuan/kernel/sql"
|
||||||
"github.com/siyuan-note/siyuan/kernel/task"
|
"github.com/siyuan-note/siyuan/kernel/task"
|
||||||
"github.com/siyuan-note/siyuan/kernel/util"
|
"github.com/siyuan-note/siyuan/kernel/util"
|
||||||
"io/fs"
|
|
||||||
"path/filepath"
|
|
||||||
"strings"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
|
var assetContentSearcher = NewAssetsSearcher()
|
||||||
|
|
||||||
|
func IndexAssetContent(absPath string) {
|
||||||
|
assetsDir := util.GetDataAssetsAbsPath()
|
||||||
|
|
||||||
|
ext := strings.ToLower(filepath.Ext(absPath))
|
||||||
|
parser, found := assetContentSearcher.Parsers[ext]
|
||||||
|
if !found {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
result := parser.Parse(absPath)
|
||||||
|
if nil == result {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
info, err := os.Stat(absPath)
|
||||||
|
if nil != err {
|
||||||
|
logging.LogErrorf("stat [%s] failed: %s", absPath, err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
p := "assets" + filepath.ToSlash(strings.TrimPrefix(absPath, assetsDir))
|
||||||
|
|
||||||
|
assetContents := []*sql.AssetContent{
|
||||||
|
{
|
||||||
|
ID: ast.NewNodeID(),
|
||||||
|
Name: filepath.Base(p),
|
||||||
|
Ext: filepath.Ext(p),
|
||||||
|
Path: p,
|
||||||
|
Size: info.Size(),
|
||||||
|
Updated: info.ModTime().Unix(),
|
||||||
|
Content: result.Content,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
sql.DeleteAssetContentsByPathQueue(p)
|
||||||
|
sql.IndexAssetContentsQueue(assetContents)
|
||||||
|
}
|
||||||
|
|
||||||
func ReindexAssetContent() {
|
func ReindexAssetContent() {
|
||||||
task.AppendTask(task.AssetContentDatabaseIndexFull, fullReindexAssetContent)
|
task.AppendTask(task.AssetContentDatabaseIndexFull, fullReindexAssetContent)
|
||||||
return
|
return
|
||||||
|
|
@ -39,8 +82,7 @@ func fullReindexAssetContent() {
|
||||||
util.PushMsg(Conf.Language(216), 7*1000)
|
util.PushMsg(Conf.Language(216), 7*1000)
|
||||||
sql.InitAssetContentDatabase(true)
|
sql.InitAssetContentDatabase(true)
|
||||||
|
|
||||||
assetsSearch := NewAssetsSearcher()
|
assetContentSearcher.FullIndex()
|
||||||
assetsSearch.Index()
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -59,12 +101,13 @@ var (
|
||||||
)
|
)
|
||||||
|
|
||||||
type AssetsSearcher struct {
|
type AssetsSearcher struct {
|
||||||
AssetsDir string
|
|
||||||
Parsers map[string]AssetParser
|
Parsers map[string]AssetParser
|
||||||
|
|
||||||
|
lock *sync.Mutex
|
||||||
}
|
}
|
||||||
|
|
||||||
func (searcher *AssetsSearcher) Index() {
|
func (searcher *AssetsSearcher) FullIndex() {
|
||||||
assetsDir := searcher.AssetsDir
|
assetsDir := util.GetDataAssetsAbsPath()
|
||||||
if !gulu.File.IsDir(assetsDir) {
|
if !gulu.File.IsDir(assetsDir) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
@ -116,10 +159,11 @@ func (searcher *AssetsSearcher) Index() {
|
||||||
|
|
||||||
func NewAssetsSearcher() *AssetsSearcher {
|
func NewAssetsSearcher() *AssetsSearcher {
|
||||||
return &AssetsSearcher{
|
return &AssetsSearcher{
|
||||||
AssetsDir: util.GetDataAssetsAbsPath(),
|
|
||||||
Parsers: map[string]AssetParser{
|
Parsers: map[string]AssetParser{
|
||||||
".txt": &TxtAssetParser{},
|
".txt": &TxtAssetParser{},
|
||||||
},
|
},
|
||||||
|
|
||||||
|
lock: &sync.Mutex{},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -87,6 +87,9 @@ func watchAssets() {
|
||||||
|
|
||||||
// 重新缓存资源文件,以便使用 /资源 搜索
|
// 重新缓存资源文件,以便使用 /资源 搜索
|
||||||
go cache.LoadAssets()
|
go cache.LoadAssets()
|
||||||
|
|
||||||
|
// 索引资源文件内容
|
||||||
|
IndexAssetContent(lastEvent.Name)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
|
|
|
||||||
|
|
@ -59,6 +59,9 @@ func watchAssets() {
|
||||||
|
|
||||||
// 重新缓存资源文件,以便使用 /资源 搜索
|
// 重新缓存资源文件,以便使用 /资源 搜索
|
||||||
go cache.LoadAssets()
|
go cache.LoadAssets()
|
||||||
|
|
||||||
|
// 索引资源文件内容
|
||||||
|
IndexAssetContent(event.Path)
|
||||||
case err, ok := <-assetsWatcher.Error:
|
case err, ok := <-assetsWatcher.Error:
|
||||||
if !ok {
|
if !ok {
|
||||||
return
|
return
|
||||||
|
|
|
||||||
|
|
@ -111,7 +111,7 @@ func execAssetContentOp(op *assetContentDBQueueOperation, tx *sql.Tx, context ma
|
||||||
switch op.action {
|
switch op.action {
|
||||||
case "index":
|
case "index":
|
||||||
err = insertAssetContents(tx, op.assetContents, context)
|
err = insertAssetContents(tx, op.assetContents, context)
|
||||||
case "delete":
|
case "deletePath":
|
||||||
err = deleteAssetContentsByPath(tx, op.path, context)
|
err = deleteAssetContentsByPath(tx, op.path, context)
|
||||||
default:
|
default:
|
||||||
msg := fmt.Sprintf("unknown asset content operation [%s]", op.action)
|
msg := fmt.Sprintf("unknown asset content operation [%s]", op.action)
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue