From fc818c6511a80ead067586097c4053a3e22887d2 Mon Sep 17 00:00:00 2001
From: Daniel <845765@qq.com>
Date: Mon, 26 Jun 2023 18:31:30 +0800
Subject: [PATCH] :technologist: Improve kernel API `/api/convert/pandoc` Fix
https://github.com/siyuan-note/siyuan/issues/8619
---
API.md | 21 +++++++++++++--------
API_zh_CN.md | 19 +++++++++++--------
kernel/api/pandoc.go | 12 +++++++++++-
kernel/util/pandoc.go | 18 +++++++++++-------
4 files changed, 46 insertions(+), 24 deletions(-)
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
}