Merge remote-tracking branch 'origin/dev' into dev

This commit is contained in:
Vanessa 2022-07-15 11:22:26 +08:00
commit a2cb3fad38
6 changed files with 218 additions and 41 deletions

View file

@ -5,7 +5,7 @@
"id": "20200924100744-br924ar",
"title": "Assets",
"type": "doc",
"updated": "20220715092808"
"updated": "20220715105117"
},
"Children": [
{
@ -625,7 +625,7 @@
"ListData": {},
"Properties": {
"id": "20220503122349-o26mvnq",
"updated": "20220715092808"
"updated": "20220715105117"
},
"Children": [
{
@ -650,23 +650,7 @@
"Children": [
{
"Type": "NodeText",
"Data": "When deleting the notebook, in order to ensure that cross-notebook asset references work properly, the "
},
{
"Type": "NodeText",
"Data": "assets"
},
{
"Type": "NodeText",
"Data": " under the notebook will be copied to the global "
},
{
"Type": "NodeText",
"Data": "assets"
},
{
"Type": "NodeText",
"Data": " in batches"
"Data": "When deleting the notebook, in order to ensure that cross-notebook asset references work properly, the assets under the notebook will be copied to the global assets in batches"
}
]
}
@ -694,19 +678,7 @@
"Children": [
{
"Type": "NodeText",
"Data": "Does not support viewing notebook-level "
},
{
"Type": "NodeText",
"Data": "assets"
},
{
"Type": "NodeText",
"Data": " history in "
},
{
"Type": "NodeText",
"Data": "data history"
"Data": "Does not support viewing notebook-level assets history in data history"
}
]
}
@ -721,7 +693,7 @@
},
"Properties": {
"id": "20220715092756-f5azf15",
"updated": "20220715092808"
"updated": "20220715105117"
},
"Children": [
{
@ -729,7 +701,7 @@
"Type": "NodeParagraph",
"Properties": {
"id": "20220715092756-4bzibji",
"updated": "20220715092808"
"updated": "20220715105117"
},
"Children": [
{
@ -755,6 +727,34 @@
]
}
]
},
{
"ID": "20220715105056-8d652vx",
"Type": "NodeListItem",
"ListData": {
"BulletChar": 42,
"Marker": "Kg=="
},
"Properties": {
"id": "20220715105056-8d652vx",
"updated": "20220715105100"
},
"Children": [
{
"ID": "20220715105056-a6p3fg7",
"Type": "NodeParagraph",
"Properties": {
"id": "20220715105056-a6p3fg7",
"updated": "20220715105100"
},
"Children": [
{
"Type": "NodeText",
"Data": "Dose not support rename"
}
]
}
]
}
]
}

View file

@ -5,7 +5,7 @@
"id": "20200915214115-42b8zma",
"title": "资源文件",
"type": "doc",
"updated": "20220715092726"
"updated": "20220715105016"
},
"Children": [
{
@ -547,7 +547,7 @@
"ListData": {},
"Properties": {
"id": "20220503121213-afjyt05",
"updated": "20220715092726"
"updated": "20220715105016"
},
"Children": [
{
@ -572,7 +572,15 @@
"Children": [
{
"Type": "NodeText",
"Data": "删除该笔记本时,为保证跨笔记本资源文件引用正常工作,该笔记本下的资源文件会被批量复制到全局 assets 中"
"Data": "删除该笔记本时,为保证跨笔记本资源文件引用正常工作,该笔记本下的资源文件会被批量复制到全局 "
},
{
"Type": "NodeText",
"Data": "assets"
},
{
"Type": "NodeText",
"Data": " 中"
}
]
}
@ -661,6 +669,34 @@
]
}
]
},
{
"ID": "20220715105014-5jfe0bz",
"Type": "NodeListItem",
"ListData": {
"BulletChar": 42,
"Marker": "Kg=="
},
"Properties": {
"id": "20220715105014-5jfe0bz",
"updated": "20220715105016"
},
"Children": [
{
"ID": "20220715105014-3r1es71",
"Type": "NodeParagraph",
"Properties": {
"id": "20220715105014-3r1es71",
"updated": "20220715105016"
},
"Children": [
{
"Type": "NodeText",
"Data": "不支持重命名"
}
]
}
]
}
]
}

View file

@ -4,7 +4,7 @@
"Properties": {
"id": "20211226123038-4umgpxy",
"title": "資料文件",
"updated": "20220715092951"
"updated": "20220715105038"
},
"Children": [
{
@ -554,7 +554,7 @@
"ListData": {},
"Properties": {
"id": "20220503122338-jmr7c2k",
"updated": "20220715092938"
"updated": "20220715105038"
},
"Children": [
{
@ -579,7 +579,15 @@
"Children": [
{
"Type": "NodeText",
"Data": "刪除該筆記本時,為保證跨筆記本資料文件引用正常工作,該筆記本下的資料文件會被批量複製到全局 assets 中"
"Data": "刪除該筆記本時,為保證跨筆記本資料文件引用正常工作,該筆記本下的資料文件會被批量複製到全局 "
},
{
"Type": "NodeText",
"Data": "assets"
},
{
"Type": "NodeText",
"Data": " 中"
}
]
}
@ -607,7 +615,15 @@
"Children": [
{
"Type": "NodeText",
"Data": "不支持在數據歷史中查看筆記本級資料文件歷史"
"Data": "不支持在"
},
{
"Type": "NodeText",
"Data": "數據歷史"
},
{
"Type": "NodeText",
"Data": "中查看筆記本級資料文件歷史"
}
]
}
@ -660,6 +676,34 @@
]
}
]
},
{
"ID": "20220715105038-bwu5wmg",
"Type": "NodeListItem",
"ListData": {
"BulletChar": 42,
"Marker": "Kg=="
},
"Properties": {
"id": "20220715105038-bwu5wmg",
"updated": "20220715105038"
},
"Children": [
{
"ID": "20220715105038-mmy9v15",
"Type": "NodeParagraph",
"Properties": {
"id": "20220715105038-mmy9v15",
"updated": "20220715105038"
},
"Children": [
{
"Type": "NodeText",
"Data": "不支持重命名"
}
]
}
]
}
]
}

View file

@ -28,6 +28,26 @@ import (
"github.com/siyuan-note/siyuan/kernel/util"
)
func renameAsset(c *gin.Context) {
ret := gulu.Ret.NewResult()
defer c.JSON(http.StatusOK, ret)
arg, ok := util.JsonArg(c, ret)
if !ok {
return
}
oldPath := arg["oldPath"].(string)
newName := arg["newName"].(string)
err := model.RenameAsset(oldPath, newName)
if nil != err {
ret.Code = -1
ret.Msg = err.Error()
ret.Data = map[string]interface{}{"closeTimeout": 5000}
return
}
}
func getDocImageAssets(c *gin.Context) {
ret := gulu.Ret.NewResult()
defer c.JSON(http.StatusOK, ret)

View file

@ -185,6 +185,7 @@ func ServeAPI(ginServer *gin.Engine) {
ginServer.Handle("POST", "/api/asset/removeUnusedAsset", model.CheckAuth, model.CheckReadonly, removeUnusedAsset)
ginServer.Handle("POST", "/api/asset/removeUnusedAssets", model.CheckAuth, model.CheckReadonly, removeUnusedAssets)
ginServer.Handle("POST", "/api/asset/getDocImageAssets", model.CheckAuth, model.CheckReadonly, getDocImageAssets)
ginServer.Handle("POST", "/api/asset/renameAsset", model.CheckAuth, model.CheckReadonly, renameAsset)
ginServer.Handle("POST", "/api/export/batchExportMd", model.CheckAuth, batchExportMd)
ginServer.Handle("POST", "/api/export/exportMd", model.CheckAuth, exportMd)

View file

@ -34,6 +34,7 @@ import (
"github.com/88250/gulu"
"github.com/88250/lute/ast"
"github.com/88250/lute/parse"
"github.com/88250/protyle"
"github.com/gabriel-vasile/mimetype"
"github.com/siyuan-note/filelock"
"github.com/siyuan-note/httpclient"
@ -443,6 +444,81 @@ func RemoveUnusedAsset(p string) (ret string) {
return
}
func RenameAsset(oldPath, newName string) (err error) {
util.PushEndlessProgress(Conf.Language(110))
defer util.PushClearProgress()
notebooks, err := ListNotebooks()
if nil != err {
return
}
newName = strings.TrimSpace(newName)
newName = gulu.Str.RemoveInvisible(newName)
if path.Base(oldPath) == newName {
return
}
if "" == newName {
return
}
if !gulu.File.IsValidFilename(newName) {
err = errors.New(Conf.Language(151))
return
}
newPath := util.AssetName(newName)
if err = gulu.File.Copy(filepath.Join(util.DataDir, oldPath), filepath.Join(util.DataDir, newPath)); nil != err {
util.LogErrorf("copy asset [%s] failed: %s", oldPath, err)
return
}
luteEngine := NewLute()
for _, notebook := range notebooks {
pages := pagedPaths(filepath.Join(util.DataDir, notebook.ID), 32)
for _, paths := range pages {
for _, treeAbsPath := range paths {
data, readErr := filelock.NoLockFileRead(treeAbsPath)
if nil != readErr {
util.LogErrorf("get data [path=%s] failed: %s", treeAbsPath, readErr)
err = readErr
return
}
if !bytes.Contains(data, []byte(oldPath)) {
return
}
data = bytes.Replace(data, []byte(oldPath), []byte(newPath), -1)
if writeErr := filelock.NoLockFileWrite(treeAbsPath, data); nil != writeErr {
util.LogErrorf("write data [path=%s] failed: %s", treeAbsPath, writeErr)
err = writeErr
return
}
tree, parseErr := protyle.ParseJSONWithoutFix(luteEngine, data)
if nil != parseErr {
util.LogErrorf("parse json to tree [%s] failed: %s", treeAbsPath, parseErr)
err = parseErr
return
}
treenode.ReindexBlockTree(tree)
sql.UpsertTreeQueue(tree)
util.PushEndlessProgress(fmt.Sprintf(Conf.Language(111), tree.Root.IALAttr("title")))
}
}
}
IncSync()
util.PushEndlessProgress(Conf.Language(113))
sql.WaitForWritingDatabase()
util.ReloadUI()
return
}
func UnusedAssets() (ret []string) {
ret = []string{}