🎨 Improve asset src decoding when importing markdown https://github.com/siyuan-note/siyuan/issues/14117

This commit is contained in:
Daniel 2025-02-17 11:49:39 +08:00
parent 2a4531194c
commit 4669752e14
No known key found for this signature in database
GPG Key ID: 86211BA83DF03017

View File

@ -721,7 +721,7 @@ func ImportFromLocalPath(boxID, localPath string, toPath string) (err error) {
hPathsIDs := map[string]string{} hPathsIDs := map[string]string{}
idPaths := map[string]string{} idPaths := map[string]string{}
moveIDs := map[string]string{} moveIDs := map[string]string{}
assetsDone := map[string]string{}
if gulu.File.IsDir(localPath) { // 导入文件夹 if gulu.File.IsDir(localPath) { // 导入文件夹
// 收集所有资源文件 // 收集所有资源文件
assets := map[string]string{} assets := map[string]string{}
@ -744,7 +744,6 @@ func ImportFromLocalPath(boxID, localPath string, toPath string) (err error) {
}) })
targetPaths := map[string]string{} targetPaths := map[string]string{}
assetsDone := map[string]string{}
count := 0 count := 0
// md 转换 sy // md 转换 sy
filelock.Walk(localPath, func(currentPath string, d fs.DirEntry, err error) error { filelock.Walk(localPath, func(currentPath string, d fs.DirEntry, err error) error {
@ -866,15 +865,11 @@ func ImportFromLocalPath(boxID, localPath string, toPath string) (err error) {
return ast.WalkContinue return ast.WalkContinue
} }
absolutePath := filepath.Join(currentDir, dest)
newAbsolutePath := absolutePath
decodedDest := string(html.DecodeDestination([]byte(dest))) decodedDest := string(html.DecodeDestination([]byte(dest)))
if decodedDest != dest { if decodedDest != dest {
dest = decodedDest dest = decodedDest
newAbsolutePath = filepath.Join(currentDir, dest)
gulu.File.Copy(absolutePath, newAbsolutePath)
} }
absolutePath := filepath.Join(currentDir, dest)
if ast.NodeLinkDest == n.Type { if ast.NodeLinkDest == n.Type {
n.Tokens = []byte(dest) n.Tokens = []byte(dest)
@ -889,36 +884,29 @@ func ImportFromLocalPath(boxID, localPath string, toPath string) (err error) {
return ast.WalkContinue return ast.WalkContinue
} }
if !gulu.File.IsExist(newAbsolutePath) { if !gulu.File.IsExist(absolutePath) {
return ast.WalkContinue return ast.WalkContinue
} }
absDest := filepath.Join(currentDir, dest) existName := assetsDone[absolutePath]
fullPath, exist := assets[absDest] var name string
if !exist { if "" == existName {
absDest = filepath.Join(currentDir, string(html.DecodeDestination([]byte(dest)))) name = filepath.Base(absolutePath)
name = util.FilterUploadFileName(name)
name = util.AssetName(name)
assetTargetPath := filepath.Join(assetDirPath, name)
if err = filelock.Copy(absolutePath, assetTargetPath); err != nil {
logging.LogErrorf("copy asset from [%s] to [%s] failed: %s", absolutePath, assetTargetPath, err)
return ast.WalkContinue
}
assetsDone[absolutePath] = name
} else {
name = existName
} }
fullPath, exist = assets[absDest] if ast.NodeLinkDest == n.Type {
if exist { n.Tokens = []byte("assets/" + name)
existName := assetsDone[absDest] } else {
var name string n.TextMarkAHref = "assets/" + name
if "" == existName {
name = filepath.Base(fullPath)
name = util.AssetName(name)
assetTargetPath := filepath.Join(assetDirPath, name)
if err = filelock.Copy(fullPath, assetTargetPath); err != nil {
logging.LogErrorf("copy asset from [%s] to [%s] failed: %s", fullPath, assetTargetPath, err)
return ast.WalkContinue
}
assetsDone[absDest] = name
} else {
name = existName
}
if ast.NodeLinkDest == n.Type {
n.Tokens = []byte("assets/" + name)
} else {
n.TextMarkAHref = "assets/" + name
}
} }
return ast.WalkContinue return ast.WalkContinue
}) })
@ -1000,15 +988,11 @@ func ImportFromLocalPath(boxID, localPath string, toPath string) (err error) {
return ast.WalkContinue return ast.WalkContinue
} }
absolutePath := filepath.Join(filepath.Dir(localPath), dest)
newAbsolutePath := absolutePath
decodedDest := string(html.DecodeDestination([]byte(dest))) decodedDest := string(html.DecodeDestination([]byte(dest)))
if decodedDest != dest { if decodedDest != dest {
dest = decodedDest dest = decodedDest
newAbsolutePath = filepath.Join(filepath.Dir(localPath), dest)
gulu.File.Copy(absolutePath, newAbsolutePath)
} }
absolutePath := filepath.Join(filepath.Dir(localPath), dest)
if ast.NodeLinkDest == n.Type { if ast.NodeLinkDest == n.Type {
n.Tokens = []byte(dest) n.Tokens = []byte(dest)
@ -1023,16 +1007,24 @@ func ImportFromLocalPath(boxID, localPath string, toPath string) (err error) {
return ast.WalkContinue return ast.WalkContinue
} }
if !gulu.File.IsExist(newAbsolutePath) { if !gulu.File.IsExist(absolutePath) {
return ast.WalkContinue return ast.WalkContinue
} }
name := filepath.Base(newAbsolutePath) existName := assetsDone[absolutePath]
name = util.AssetName(name) var name string
assetTargetPath := filepath.Join(assetDirPath, name) if "" == existName {
if err = filelock.Copy(newAbsolutePath, assetTargetPath); err != nil { name = filepath.Base(absolutePath)
logging.LogErrorf("copy asset from [%s] to [%s] failed: %s", newAbsolutePath, assetTargetPath, err) name = util.FilterUploadFileName(name)
return ast.WalkContinue name = util.AssetName(name)
assetTargetPath := filepath.Join(assetDirPath, name)
if err = filelock.Copy(absolutePath, assetTargetPath); err != nil {
logging.LogErrorf("copy asset from [%s] to [%s] failed: %s", absolutePath, assetTargetPath, err)
return ast.WalkContinue
}
assetsDone[absolutePath] = name
} else {
name = existName
} }
if ast.NodeLinkDest == n.Type { if ast.NodeLinkDest == n.Type {
n.Tokens = []byte("assets/" + name) n.Tokens = []byte("assets/" + name)