mirror of
https://github.com/siyuan-note/siyuan.git
synced 2025-12-27 11:58:49 +01:00
Merge remote-tracking branch 'origin/dev' into dev
This commit is contained in:
commit
a2cb3fad38
6 changed files with 218 additions and 41 deletions
|
|
@ -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"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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": "不支持重命名"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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": "不支持重命名"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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{}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue