diff --git a/app/src/menus/navigation.ts b/app/src/menus/navigation.ts index 2baf07323..0dd95a2f9 100644 --- a/app/src/menus/navigation.ts +++ b/app/src/menus/navigation.ts @@ -335,7 +335,7 @@ export const initNavigationMenu = (app: App, liElement: HTMLElement) => { icon: "iconMarkdown", click: () => { const msgId = showMessage(window.siyuan.languages.exporting, -1); - fetchPost("/api/export/batchExportMd", { + fetchPost("/api/export/exportNotebookMd", { notebook: notebookId, path: "/" }, response => { diff --git a/kernel/api/export.go b/kernel/api/export.go index ba1d01a3c..0b78a8794 100644 --- a/kernel/api/export.go +++ b/kernel/api/export.go @@ -307,7 +307,7 @@ func exportResources(c *gin.Context) { } } -func batchExportMd(c *gin.Context) { +func exportNotebookMd(c *gin.Context) { ret := gulu.Ret.NewResult() defer c.JSON(http.StatusOK, ret) @@ -318,13 +318,35 @@ func batchExportMd(c *gin.Context) { notebook := arg["notebook"].(string) p := arg["path"].(string) - zipPath := model.BatchExportMarkdown(notebook, p) + zipPath := model.ExportNotebookMarkdown(notebook, p) ret.Data = map[string]interface{}{ "name": path.Base(zipPath), "zip": zipPath, } } +func exportMds(c *gin.Context) { + ret := gulu.Ret.NewResult() + defer c.JSON(http.StatusOK, ret) + + arg, ok := util.JsonArg(c, ret) + if !ok { + return + } + + idsArg := arg["ids"].([]interface{}) + var ids []string + for _, id := range idsArg { + ids = append(ids, id.(string)) + } + + name, zipPath := model.BatchExportPandocConvertZip(ids, "", ".md") + ret.Data = map[string]interface{}{ + "name": name, + "zip": zipPath, + } +} + func exportMd(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 adcffed98..6b993d57c 100644 --- a/kernel/api/router.go +++ b/kernel/api/router.go @@ -277,7 +277,8 @@ func ServeAPI(ginServer *gin.Engine) { ginServer.Handle("POST", "/api/asset/fullReindexAssetContent", model.CheckAuth, model.CheckAdminRole, model.CheckReadonly, fullReindexAssetContent) ginServer.Handle("POST", "/api/asset/statAsset", model.CheckAuth, model.CheckAdminRole, statAsset) - ginServer.Handle("POST", "/api/export/batchExportMd", model.CheckAuth, model.CheckAdminRole, batchExportMd) + ginServer.Handle("POST", "/api/export/exportNotebookMd", model.CheckAuth, model.CheckAdminRole, exportNotebookMd) + ginServer.Handle("POST", "/api/export/exportMds", model.CheckAuth, model.CheckAdminRole, exportMds) ginServer.Handle("POST", "/api/export/exportMd", model.CheckAuth, model.CheckAdminRole, exportMd) ginServer.Handle("POST", "/api/export/exportSY", model.CheckAuth, model.CheckAdminRole, exportSY) ginServer.Handle("POST", "/api/export/exportNotebookSY", model.CheckAuth, model.CheckAdminRole, exportNotebookSY) diff --git a/kernel/model/export.go b/kernel/model/export.go index 181e9e0ab..d9f405cd7 100644 --- a/kernel/model/export.go +++ b/kernel/model/export.go @@ -1382,6 +1382,29 @@ func ExportStdMarkdown(id string) string { Conf.Export.AddTitle, nil) } +func BatchExportPandocConvertZip(ids []string, pandocTo, ext string) (name, zipPath string) { + block := treenode.GetBlockTree(ids[0]) + box := Conf.Box(block.BoxID) + baseFolderName := path.Base(block.HPath) + if "." == baseFolderName { + baseFolderName = path.Base(block.Path) + } + var docPaths []string + + bts := treenode.GetBlockTrees(ids) + for _, bt := range bts { + docFiles := box.ListFiles(strings.TrimSuffix(bt.Path, ".sy")) + for _, docFile := range docFiles { + docPaths = append(docPaths, docFile.path) + } + } + docPaths = util.FilterSelfChildDocs(docPaths) + + zipPath = exportPandocConvertZip(false, box.ID, baseFolderName, docPaths, "gfm+footnotes+hard_line_breaks", pandocTo, ext) + name = strings.TrimSuffix(filepath.Base(block.Path), ".sy") + return +} + func ExportPandocConvertZip(id, pandocTo, ext string) (name, zipPath string) { block := treenode.GetBlockTree(id) if nil == block { @@ -1406,7 +1429,7 @@ func ExportPandocConvertZip(id, pandocTo, ext string) (name, zipPath string) { return } -func BatchExportMarkdown(boxID, folderPath string) (zipPath string) { +func ExportNotebookMarkdown(boxID, folderPath string) (zipPath string) { box := Conf.Box(boxID) var baseFolderName string