diff --git a/API.md b/API.md index 9806b5cc8..cf8a907f5 100644 --- a/API.md +++ b/API.md @@ -470,7 +470,8 @@ View API token in Settings - About, request header: `Authorization: T * `"/assets/sub/"`: workspace/data/assets/sub/ folder Under normal circumstances, it is recommended to use the first method, which is stored in the assets folder - of the workspace, putting in a subdirectory has some side effects, please refer to the assets chapter of the user guide. + of the workspace, putting in a subdirectory has some side effects, please refer to the assets chapter of the user + guide. * `file[]`: Uploaded file list * Return value @@ -829,9 +830,9 @@ View API token in Settings - About, request header: `Authorization: T } ``` - * `fromID`: Def block ID - * `toID`: Target block ID - * `refIDs`: Ref block IDs point to def block ID, optional, if not specified, all ref block IDs will be transferred + * `fromID`: Def block ID + * `toID`: Target block ID + * `refIDs`: Ref block IDs point to def block ID, optional, if not specified, all ref block IDs will be transferred * Return value ```json @@ -1041,8 +1042,8 @@ View API token in Settings - About, request header: `Authorization: T "newPath": "/data/assets/test-20230523085812-k3o9t32.png" } ``` - * `path`: the file path under the workspace path - * `newPath`: the new file path under the workspace path + * `path`: the file path under the workspace path + * `newPath`: the new file path under the workspace path * Return value ```json @@ -1119,7 +1120,7 @@ View API token in Settings - About, request header: `Authorization: T * `/api/convert/pandoc` * Working directory - * Executing the pandoc command will set the working directory to `workspace/temp/convert/pandoc/` + * Executing the pandoc command will set the working directory to `workspace/temp/convert/pandoc/${dir}` * API [`Put file`](#put-file) can be used to write the file to be converted to this directory first * Then call the API for conversion, and the converted file will also be written to this directory * Finally, call the API [`Get file`](#get-file) to get the converted file @@ -1129,6 +1130,7 @@ View API token in Settings - About, request header: `Authorization: T ```json { + "dir": "test", "args": [ "--to", "markdown_strict-raw_html", "foo.epub", @@ -1144,9 +1146,12 @@ View API token in Settings - About, request header: `Authorization: T { "code": 0, "msg": "", - "data": null + "data": { + "path": "/temp/convert/pandoc/test" + } } ``` + * `path`: the path under the workspace ## Notification diff --git a/API_zh_CN.md b/API_zh_CN.md index 14ba56064..b92555012 100644 --- a/API_zh_CN.md +++ b/API_zh_CN.md @@ -822,9 +822,9 @@ } ``` - * `fromID`:定义块 ID - * `toID`:目标块 ID - * `refIDs`:指向定义块 ID 的引用所在块 ID,可选,如果不指定,所有指向定义块 ID 的引用块 ID 都会被转移 + * `fromID`:定义块 ID + * `toID`:目标块 ID + * `refIDs`:指向定义块 ID 的引用所在块 ID,可选,如果不指定,所有指向定义块 ID 的引用块 ID 都会被转移 * 返回值 ```json @@ -835,7 +835,6 @@ } ``` - ## 属性 ### 设置块属性 @@ -1035,8 +1034,8 @@ "newPath": "/data/assets/test-20230523085812-k3o9t32.png" } ``` - * `path`:工作空间路径下的文件路径 - * `newPath`:新的文件路径 + * `path`:工作空间路径下的文件路径 + * `newPath`:新的文件路径 * 返回值 ```json @@ -1113,7 +1112,7 @@ * `/api/convert/pandoc` * 工作目录 - * 执行调用 pandoc 命令时工作目录会被设置在 `工作空间/temp/convert/pandoc/` 下 + * 执行调用 pandoc 命令时工作目录会被设置在 `工作空间/temp/convert/pandoc/${test}` 下 * 可先通过 API [`写入文件`](#写入文件) 将待转换文件写入该目录 * 然后再调用该 API 进行转换,转换后的文件也会被写入该目录 * 最后调用 API [`获取文件`](#获取文件) 获取转换后的文件内容 @@ -1123,6 +1122,7 @@ ```json { + "dir": "test", "args": [ "--to", "markdown_strict-raw_html", "foo.epub", @@ -1138,9 +1138,12 @@ { "code": 0, "msg": "", - "data": null + "data": { + "path": "/temp/convert/pandoc/test" + } } ``` + * `path`:工作空间下的路径 ## 通知 diff --git a/kernel/api/pandoc.go b/kernel/api/pandoc.go index da4c5c8c8..d55a399ec 100644 --- a/kernel/api/pandoc.go +++ b/kernel/api/pandoc.go @@ -33,17 +33,27 @@ func pandoc(c *gin.Context) { return } + dir := gulu.Rand.String(7) + dirArg := arg["dir"] + if nil != dirArg { + dir = dirArg.(string) + } + pandocArgs := arg["args"].([]interface{}) var args []string for _, v := range pandocArgs { args = append(args, v.(string)) } - err := util.ConvertPandoc(args...) + path, err := util.ConvertPandoc(dir, args...) if nil != err { ret.Code = -1 ret.Msg = err.Error() return } + + ret.Data = map[string]interface{}{ + "path": path, + } return } diff --git a/kernel/util/pandoc.go b/kernel/util/pandoc.go index fb958c63b..5dbc58de1 100644 --- a/kernel/util/pandoc.go +++ b/kernel/util/pandoc.go @@ -29,24 +29,28 @@ import ( "github.com/siyuan-note/logging" ) -func ConvertPandoc(args ...string) (err error) { +func ConvertPandoc(dir string, args ...string) (path string, err error) { if "" == PandocBinPath || ContainerStd != Container { - return errors.New("not found executable pandoc") + err = errors.New("not found executable pandoc") + return } pandoc := exec.Command(PandocBinPath, args...) gulu.CmdAttr(pandoc) - dir := filepath.Join(WorkspaceDir, "temp", "convert", "pandoc", gulu.Rand.String(7)) - if err = os.MkdirAll(dir, 0755); nil != err { - logging.LogErrorf("mkdir [%s] failed: [%s]", dir, err) + path = filepath.Join("temp", "convert", "pandoc", dir) + absPath := filepath.Join(WorkspaceDir, path) + if err = os.MkdirAll(absPath, 0755); nil != err { + logging.LogErrorf("mkdir [%s] failed: [%s]", absPath, err) return } - pandoc.Dir = dir + pandoc.Dir = absPath output, err := pandoc.CombinedOutput() if nil != err { - logging.LogErrorf("pandoc convert output [%s]", string(output)) + err = errors.Join(err, errors.New(string(output))) + logging.LogErrorf("pandoc convert output failed: %s", err) return } + path = "/" + filepath.ToSlash(path) return }