mirror of
https://github.com/siyuan-note/siyuan.git
synced 2026-01-10 02:38:50 +01:00
🎨 Supports exporting a code block as a file https://github.com/siyuan-note/siyuan/pull/16774
Signed-off-by: Daniel <845765@qq.com>
This commit is contained in:
parent
7221367334
commit
58bb751cd4
3 changed files with 68 additions and 0 deletions
|
|
@ -37,6 +37,29 @@ import (
|
|||
"github.com/siyuan-note/siyuan/kernel/util"
|
||||
)
|
||||
|
||||
func exportCodeBlock(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)
|
||||
filePath, err := model.ExportCodeBlock(id)
|
||||
if err != nil {
|
||||
ret.Code = 1
|
||||
ret.Msg = err.Error()
|
||||
ret.Data = map[string]interface{}{"closeTimeout": 7000}
|
||||
return
|
||||
}
|
||||
|
||||
ret.Data = map[string]interface{}{
|
||||
"path": filePath,
|
||||
}
|
||||
}
|
||||
|
||||
func exportAttributeView(c *gin.Context) {
|
||||
ret := gulu.Ret.NewResult()
|
||||
defer c.JSON(http.StatusOK, ret)
|
||||
|
|
|
|||
|
|
@ -340,6 +340,7 @@ func ServeAPI(ginServer *gin.Engine) {
|
|||
ginServer.Handle("POST", "/api/export/exportRTF", model.CheckAuth, model.CheckAdminRole, exportRTF)
|
||||
ginServer.Handle("POST", "/api/export/exportEPUB", model.CheckAuth, model.CheckAdminRole, exportEPUB)
|
||||
ginServer.Handle("POST", "/api/export/exportAttributeView", model.CheckAuth, model.CheckAdminRole, exportAttributeView)
|
||||
ginServer.Handle("POST", "/api/export/exportCodeBlock", model.CheckAuth, model.CheckAdminRole, exportCodeBlock)
|
||||
|
||||
ginServer.Handle("POST", "/api/import/importStdMd", model.CheckAuth, model.CheckAdminRole, model.CheckReadonly, importStdMd)
|
||||
ginServer.Handle("POST", "/api/import/importZipMd", model.CheckAuth, model.CheckAdminRole, model.CheckReadonly, importZipMd)
|
||||
|
|
|
|||
|
|
@ -61,6 +61,50 @@ import (
|
|||
"github.com/siyuan-note/siyuan/kernel/util"
|
||||
)
|
||||
|
||||
func ExportCodeBlock(blockID string) (filePath string, err error) {
|
||||
// Supports exporting a code block as a file https://github.com/siyuan-note/siyuan/pull/16774
|
||||
|
||||
tree, _ := LoadTreeByBlockID(blockID)
|
||||
if nil == tree {
|
||||
err = ErrBlockNotFound
|
||||
return
|
||||
}
|
||||
|
||||
node := treenode.GetNodeInTree(tree, blockID)
|
||||
if nil == node {
|
||||
err = ErrBlockNotFound
|
||||
return
|
||||
}
|
||||
|
||||
if ast.NodeCodeBlock != node.Type {
|
||||
err = errors.New("not a code block")
|
||||
return
|
||||
}
|
||||
|
||||
code := node.ChildByType(ast.NodeCodeBlockCode)
|
||||
if nil == code {
|
||||
err = errors.New("code block has no code node")
|
||||
return
|
||||
}
|
||||
|
||||
name := tree.Root.IALAttr("title") + "-" + util.CurrentTimeSecondsStr() + ".txt"
|
||||
name = util.FilterFileName(name)
|
||||
exportFolder := filepath.Join(util.TempDir, "export", "code")
|
||||
if err = os.MkdirAll(exportFolder, 0755); err != nil {
|
||||
logging.LogErrorf("create export temp folder failed: %s", err)
|
||||
return
|
||||
}
|
||||
|
||||
writePath := filepath.Join(exportFolder, name)
|
||||
err = filelock.WriteFile(writePath, code.Tokens)
|
||||
if nil != err {
|
||||
return
|
||||
}
|
||||
|
||||
filePath = "/export/code/" + url.PathEscape(name)
|
||||
return
|
||||
}
|
||||
|
||||
func ExportAv2CSV(avID, blockID string) (zipPath string, err error) {
|
||||
// Database block supports export as CSV https://github.com/siyuan-note/siyuan/issues/10072
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue