From 1012d8b4866dc358c92f4862b385fa6f0a50cdcf Mon Sep 17 00:00:00 2001 From: Daniel <845765@qq.com> Date: Sun, 18 Jan 2026 20:50:41 +0800 Subject: [PATCH] :art: Built-in Pandoc export .docx template https://github.com/siyuan-note/siyuan/issues/16861 Signed-off-by: Daniel <845765@qq.com> --- app/electron-builder-darwin-arm64.yml | 2 ++ app/electron-builder-darwin.yml | 2 ++ app/electron-builder-linux-arm64.yml | 4 +++- app/electron-builder-linux.yml | 4 +++- app/electron-builder.yml | 2 ++ app/pandoc/pandoc-template.docx | Bin 0 -> 20197 bytes kernel/go.mod | 1 + kernel/go.sum | 2 ++ kernel/model/conf.go | 8 ++++++++ kernel/model/export.go | 8 +++++++- kernel/util/pandoc.go | 15 ++++++++++++++- 11 files changed, 44 insertions(+), 4 deletions(-) create mode 100644 app/pandoc/pandoc-template.docx diff --git a/app/electron-builder-darwin-arm64.yml b/app/electron-builder-darwin-arm64.yml index 47431d46c..37d792d15 100644 --- a/app/electron-builder-darwin-arm64.yml +++ b/app/electron-builder-darwin-arm64.yml @@ -64,3 +64,5 @@ extraResources: filter: "!**/{.DS_Store}" - from: "pandoc/pandoc-darwin-arm64.zip" to: "pandoc.zip" + - from: "pandoc/pandoc-template.docx" + to: "pandoc-template.docx" diff --git a/app/electron-builder-darwin.yml b/app/electron-builder-darwin.yml index db8dc11e5..9cedf2323 100644 --- a/app/electron-builder-darwin.yml +++ b/app/electron-builder-darwin.yml @@ -64,3 +64,5 @@ extraResources: filter: "!**/{.DS_Store}" - from: "pandoc/pandoc-darwin-amd64.zip" to: "pandoc.zip" + - from: "pandoc/pandoc-template.docx" + to: "pandoc-template.docx" diff --git a/app/electron-builder-linux-arm64.yml b/app/electron-builder-linux-arm64.yml index fda09074b..01faaebfe 100644 --- a/app/electron-builder-linux-arm64.yml +++ b/app/electron-builder-linux-arm64.yml @@ -67,4 +67,6 @@ extraResources: to: "appearance/fonts" filter: "!**/{.DS_Store}" - from: "pandoc/pandoc-linux-arm64.zip" - to: "pandoc.zip" \ No newline at end of file + to: "pandoc.zip" + - from: "pandoc/pandoc-template.docx" + to: "pandoc-template.docx" diff --git a/app/electron-builder-linux.yml b/app/electron-builder-linux.yml index 1e5d86b61..014c607ae 100644 --- a/app/electron-builder-linux.yml +++ b/app/electron-builder-linux.yml @@ -64,4 +64,6 @@ extraResources: to: "appearance/fonts" filter: "!**/{.DS_Store}" - from: "pandoc/pandoc-linux-amd64.zip" - to: "pandoc.zip" \ No newline at end of file + to: "pandoc.zip" + - from: "pandoc/pandoc-template.docx" + to: "pandoc-template.docx" diff --git a/app/electron-builder.yml b/app/electron-builder.yml index f5b455610..bc36976b4 100644 --- a/app/electron-builder.yml +++ b/app/electron-builder.yml @@ -71,3 +71,5 @@ extraResources: filter: "!**/{.DS_Store}" - from: "pandoc/pandoc-windows-amd64.zip" to: "pandoc.zip" + - from: "pandoc/pandoc-template.docx" + to: "pandoc-template.docx" diff --git a/app/pandoc/pandoc-template.docx b/app/pandoc/pandoc-template.docx new file mode 100644 index 0000000000000000000000000000000000000000..876688a405f862c2e685c75ca63ae75df3a7eb70 GIT binary patch literal 20197 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 Dj9l}R literal 0 HcmV?d00001 diff --git a/kernel/go.mod b/kernel/go.mod index c4161f972..33b692db8 100644 --- a/kernel/go.mod +++ b/kernel/go.mod @@ -44,6 +44,7 @@ require ( github.com/jaypipes/ghw v0.21.2 github.com/jinzhu/copier v0.4.0 github.com/json-iterator/go v1.1.12 + github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 github.com/klippa-app/go-pdfium v1.17.2 github.com/mattn/go-sqlite3 v2.0.3+incompatible github.com/mitchellh/go-ps v1.0.0 diff --git a/kernel/go.sum b/kernel/go.sum index df0a1e6ce..2dc52c264 100644 --- a/kernel/go.sum +++ b/kernel/go.sum @@ -262,6 +262,8 @@ github.com/juju/errors v1.0.0 h1:yiq7kjCLll1BiaRuNY53MGI0+EQ3rF6GB+wvboZDefM= github.com/juju/errors v1.0.0/go.mod h1:B5x9thDqx0wIMH3+aLIMP9HjItInYWObRovoCFM5Qe8= github.com/juju/loggo v0.0.0-20190526231331-6e530bcce5d8/go.mod h1:vgyd7OREkbtVEN/8IXZe5Ooef3LQePvuBm9UWj6ZL8U= github.com/juju/testing v0.0.0-20191001232224-ce9dec17d28b/go.mod h1:63prj8cnj0tU0S9OHjGJn+b1h0ZghCndfnbQolrYTwA= +github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 h1:Z9n2FFNUXsshfwJMBgNA0RU6/i7WVaAegv3PtuIHPMs= +github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8= github.com/klauspost/compress v1.4.1/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= github.com/klauspost/compress v1.18.2 h1:iiPHWW0YrcFgpBYhsA6D1+fqHssJscY/Tm/y2Uqnapk= github.com/klauspost/compress v1.18.2/go.mod h1:R0h/fSBs8DE4ENlcrlib3PsXS61voFxhIs2DeRhCvJ4= diff --git a/kernel/model/conf.go b/kernel/model/conf.go index bf76a5367..34dd01abc 100644 --- a/kernel/model/conf.go +++ b/kernel/model/conf.go @@ -1262,6 +1262,14 @@ func subscribeConfEvents() { eventbus.Subscribe(util.EvtConfPandocInitialized, func() { logging.LogInfof("pandoc initialized, set pandoc bin to [%s]", util.PandocBinPath) Conf.Export.PandocBin = util.PandocBinPath + + params := util.RemoveInvalid(Conf.Export.PandocParams) + if !strings.Contains(params, "--reference-doc") && "" != util.PandocTemplatePath { + params += " --reference-doc" + params += " \"" + util.PandocTemplatePath + "\"" + Conf.Export.PandocParams = strings.TrimSpace(params) + } + Conf.Save() }) } diff --git a/kernel/model/export.go b/kernel/model/export.go index 2b28e6064..07a68e185 100644 --- a/kernel/model/export.go +++ b/kernel/model/export.go @@ -45,6 +45,7 @@ import ( "github.com/emirpasic/gods/sets/hashset" "github.com/emirpasic/gods/stacks/linkedliststack" "github.com/imroc/req/v3" + shellquote "github.com/kballard/go-shellquote" "github.com/pdfcpu/pdfcpu/pkg/api" "github.com/pdfcpu/pdfcpu/pkg/font" "github.com/pdfcpu/pdfcpu/pkg/pdfcpu" @@ -773,7 +774,12 @@ func ExportDocx(id, savePath string, removeAssets, merge bool) (fullPath string, params := util.RemoveInvalid(Conf.Export.PandocParams) if "" != params { - args = append(args, strings.Split(params, " ")...) + customArgs, parseErr := shellquote.Split(params) + if nil != parseErr { + logging.LogErrorf("parse pandoc custom params [%s] failed: %s", params, parseErr) + } else { + args = append(args, customArgs...) + } } pandoc := exec.Command(Conf.Export.PandocBin, args...) diff --git a/kernel/util/pandoc.go b/kernel/util/pandoc.go index 2d9053789..d0e5d2085 100644 --- a/kernel/util/pandoc.go +++ b/kernel/util/pandoc.go @@ -101,7 +101,8 @@ func Pandoc(from, to, o, content string) (err error) { } var ( - PandocBinPath string // Pandoc 可执行文件路径 + PandocBinPath string // Pandoc 可执行文件路径 + PandocTemplatePath string // Pandoc Docx 模板文件路径 ) func InitPandoc() { @@ -128,6 +129,18 @@ func InitPandoc() { } } + PandocTemplatePath = filepath.Join(pandocDir, "pandoc-template.docx") + if !gulu.File.IsExist(PandocTemplatePath) { + PandocTemplatePath = filepath.Join(WorkingDir, "pandoc-template.docx") + if "dev" == Mode || !gulu.File.IsExist(PandocTemplatePath) { + PandocTemplatePath = filepath.Join(WorkingDir, "pandoc/pandoc-template.docx") + } + } + if !gulu.File.IsExist(PandocTemplatePath) { + PandocTemplatePath = "" + logging.LogWarnf("pandoc template file [%s] not found", PandocTemplatePath) + } + defer eventbus.Publish(EvtConfPandocInitialized) if gulu.OS.IsWindows() {