diff --git a/kernel/model/export.go b/kernel/model/export.go index fe6e71707..6d22d6dda 100644 --- a/kernel/model/export.go +++ b/kernel/model/export.go @@ -524,8 +524,19 @@ func ExportMarkdownHTML(id, savePath string, docx, merge bool) (name, dom string theme = Conf.Appearance.ThemeDark } srcs = []string{"icons", "themes/" + theme} + appearancePath := util.AppearancePath + if util.IsSymlinkPath(util.AppearancePath) { + // Support for symlinked theme folder when exporting HTML https://github.com/siyuan-note/siyuan/issues/9173 + var readErr error + appearancePath, readErr = filepath.EvalSymlinks(util.AppearancePath) + if nil != readErr { + logging.LogErrorf("readlink [%s] failed: %s", util.AppearancePath, readErr) + return + } + } + for _, src := range srcs { - from := filepath.Join(util.AppearancePath, src) + from := filepath.Join(appearancePath, src) to := filepath.Join(savePath, "appearance", src) if err := filelock.Copy(from, to); nil != err { logging.LogErrorf("copy appearance from [%s] to [%s] failed: %s", from, savePath, err) @@ -663,8 +674,18 @@ func ExportHTML(id, savePath string, pdf, image, keepFold, merge bool) (name, do theme = Conf.Appearance.ThemeDark } srcs = []string{"icons", "themes/" + theme} + appearancePath := util.AppearancePath + if util.IsSymlinkPath(util.AppearancePath) { + // Support for symlinked theme folder when exporting HTML https://github.com/siyuan-note/siyuan/issues/9173 + var readErr error + appearancePath, readErr = filepath.EvalSymlinks(util.AppearancePath) + if nil != readErr { + logging.LogErrorf("readlink [%s] failed: %s", util.AppearancePath, readErr) + return + } + } for _, src := range srcs { - from := filepath.Join(util.AppearancePath, src) + from := filepath.Join(appearancePath, src) to := filepath.Join(savePath, "appearance", src) if err := filelock.Copy(from, to); nil != err { logging.LogErrorf("copy appearance from [%s] to [%s] failed: %s", from, savePath, err) diff --git a/kernel/model/file.go b/kernel/model/file.go index d8531a06c..786eb3c0a 100644 --- a/kernel/model/file.go +++ b/kernel/model/file.go @@ -1058,7 +1058,8 @@ func GetHPathsByPaths(paths []string) (hPaths []string, err error) { continue } - hPaths = append(hPaths, box.Name+bt.HPath) + hpath := html.UnescapeString(bt.HPath) + hPaths = append(hPaths, util.EscapeHTML(box.Name)+hpath) } return } diff --git a/kernel/util/file.go b/kernel/util/file.go index e8ec1aed0..5f717553b 100644 --- a/kernel/util/file.go +++ b/kernel/util/file.go @@ -31,6 +31,14 @@ import ( "github.com/siyuan-note/logging" ) +func IsSymlinkPath(absPath string) bool { + fi, err := os.Lstat(absPath) + if nil != err { + return false + } + return 0 != fi.Mode()&os.ModeSymlink +} + func IsEmptyDir(p string) bool { if !gulu.File.IsDir(p) { return false diff --git a/kernel/util/working.go b/kernel/util/working.go index 77bc45485..6cc8cfd90 100644 --- a/kernel/util/working.go +++ b/kernel/util/working.go @@ -392,15 +392,10 @@ func initMime() { func GetDataAssetsAbsPath() (ret string) { ret = filepath.Join(DataDir, "assets") - var err error - stat, err := os.Lstat(ret) - if nil != err { - logging.LogErrorf("stat assets failed: %s", err) - return - } - if 0 != stat.Mode()&os.ModeSymlink { + if IsSymlinkPath(ret) { // 跟随符号链接 https://github.com/siyuan-note/siyuan/issues/5480 - ret, err = os.Readlink(ret) + var err error + ret, err = filepath.EvalSymlinks(ret) if nil != err { logging.LogErrorf("read assets link failed: %s", err) }