diff --git a/app/src/menus/commonMenuItem.ts b/app/src/menus/commonMenuItem.ts index 5dd348180..fa4e0ca22 100644 --- a/app/src/menus/commonMenuItem.ts +++ b/app/src/menus/commonMenuItem.ts @@ -700,6 +700,17 @@ export const exportMd = (id: string) => { openByMobile(response.data.zip); }); } + }, { + label: "ODT", + click: () => { + const msgId = showMessage(window.siyuan.languages.exporting, -1); + fetchPost("/api/export/exportODT", { + id, + }, response => { + hideMessage(msgId); + openByMobile(response.data.zip); + }); + } }, ] } diff --git a/kernel/api/export.go b/kernel/api/export.go index 1b0f8df61..5ff7f3a09 100644 --- a/kernel/api/export.go +++ b/kernel/api/export.go @@ -31,6 +31,23 @@ import ( "github.com/siyuan-note/siyuan/kernel/util" ) +func exportODT(c *gin.Context) { + ret := gulu.Ret.NewResult() + defer c.JSON(http.StatusOK, ret) + + arg, ok := util.JsonArg(c, ret) + if !ok { + return + } + + id := arg["id"].(string) + name, zipPath := model.ExportPandocConvertZip(id, "odt", ".odt") + ret.Data = map[string]interface{}{ + "name": name, + "zip": zipPath, + } +} + func exportMediaWiki(c *gin.Context) { ret := gulu.Ret.NewResult() defer c.JSON(http.StatusOK, ret) diff --git a/kernel/api/router.go b/kernel/api/router.go index 0977dfc31..9168a757a 100644 --- a/kernel/api/router.go +++ b/kernel/api/router.go @@ -251,6 +251,7 @@ func ServeAPI(ginServer *gin.Engine) { ginServer.Handle("POST", "/api/export/exportOPML", model.CheckAuth, exportOPML) ginServer.Handle("POST", "/api/export/exportOrgMode", model.CheckAuth, exportOrgMode) ginServer.Handle("POST", "/api/export/exportMediaWiki", model.CheckAuth, exportMediaWiki) + ginServer.Handle("POST", "/api/export/exportODT", model.CheckAuth, exportODT) ginServer.Handle("POST", "/api/import/importStdMd", model.CheckAuth, model.CheckReadonly, importStdMd) ginServer.Handle("POST", "/api/import/importData", model.CheckAuth, model.CheckReadonly, importData) diff --git a/kernel/model/export.go b/kernel/model/export.go index c61ba3d25..bba3074c1 100644 --- a/kernel/model/export.go +++ b/kernel/model/export.go @@ -2029,15 +2029,17 @@ func exportPandocConvertZip(boxID, baseFolderName string, docPaths []string, } // 调用 Pandoc 进行格式转换 - output, err := util.Pandoc(pandocFrom, pandocTo, md) + output, err := util.Pandoc(pandocFrom, pandocTo, writePath, md) if nil != err { logging.LogErrorf("pandoc failed: %s", err) continue } - if err := gulu.File.WriteFileSafer(writePath, gulu.Str.ToBytes(output), 0644); nil != err { - logging.LogErrorf("write export markdown file [%s] failed: %s", writePath, err) - continue + if "odt" != pandocTo && "epub" != pandocTo && "rtf" != pandocTo { + if err := gulu.File.WriteFileSafer(writePath, gulu.Str.ToBytes(output), 0644); nil != err { + logging.LogErrorf("write export markdown file [%s] failed: %s", writePath, err) + continue + } } // 解析导出后的标准 Markdown,汇总 assets diff --git a/kernel/util/pandoc.go b/kernel/util/pandoc.go index 46660e790..0daec3d48 100644 --- a/kernel/util/pandoc.go +++ b/kernel/util/pandoc.go @@ -26,7 +26,7 @@ import ( "github.com/siyuan-note/logging" ) -func Pandoc(from, to, content string) (ret string, err error) { +func Pandoc(from, to, o, content string) (ret string, err error) { if "" == from || "" == to || "md" == to { ret = content return @@ -37,6 +37,10 @@ func Pandoc(from, to, content string) (ret string, err error) { "--to", to, } + if "" != o { + args = append(args, "-o", o) + } + pandoc := exec.Command(PandocBinPath, args...) gulu.CmdAttr(pandoc) pandoc.Stdin = bytes.NewBufferString(content)