diff --git a/kernel/api/extension.go b/kernel/api/extension.go index d8aa3e63f..7e9b259a3 100644 --- a/kernel/api/extension.go +++ b/kernel/api/extension.go @@ -121,10 +121,12 @@ func extensionCopy(c *gin.Context) { uploaded[oName] = "assets/" + fName } - luteEngine := util.NewStdLute() - md, _ := model.HTML2Markdown(dom) + md, withMath, _ := model.HTML2Markdown(dom) md = strings.TrimSpace(md) - + luteEngine := util.NewStdLute() + if withMath { + luteEngine.SetInlineMath(true) + } var unlinks []*ast.Node tree := parse.Parse("", []byte(md), luteEngine.ParseOptions) ast.Walk(tree.Root, func(n *ast.Node, entering bool) ast.WalkStatus { @@ -153,7 +155,8 @@ func extensionCopy(c *gin.Context) { md, _ = lute.FormatNodeSync(tree.Root, luteEngine.ParseOptions, luteEngine.RenderOptions) ret.Data = map[string]interface{}{ - "md": md, + "md": md, + "withMath": withMath, } ret.Msg = model.Conf.Language(72) } diff --git a/kernel/api/filetree.go b/kernel/api/filetree.go index 4ff87dc56..84e112f95 100644 --- a/kernel/api/filetree.go +++ b/kernel/api/filetree.go @@ -677,7 +677,13 @@ func createDocWithMd(c *gin.Context) { hPath = "/" + hPath } - id, err := model.CreateWithMarkdown(notebook, hPath, markdown, parentID, id) + withMath := false + withMathArg := arg["withMath"] + if nil != withMathArg { + withMath = withMathArg.(bool) + } + + id, err := model.CreateWithMarkdown(notebook, hPath, markdown, parentID, id, withMath) if nil != err { ret.Code = -1 ret.Msg = err.Error() diff --git a/kernel/api/lute.go b/kernel/api/lute.go index 34d0feaf7..db2ee54ed 100644 --- a/kernel/api/lute.go +++ b/kernel/api/lute.go @@ -57,13 +57,17 @@ func html2BlockDOM(c *gin.Context) { } dom := arg["dom"].(string) - markdown, err := model.HTML2Markdown(dom) + markdown, withMath, err := model.HTML2Markdown(dom) if nil != err { ret.Data = "Failed to convert" return } luteEngine := util.NewLute() + if withMath { + luteEngine.SetInlineMath(true) + } + var unlinks []*ast.Node tree := parse.Parse("", []byte(markdown), luteEngine.ParseOptions) ast.Walk(tree.Root, func(n *ast.Node, entering bool) ast.WalkStatus { diff --git a/kernel/model/file.go b/kernel/model/file.go index e5b73b027..62d8ca02a 100644 --- a/kernel/model/file.go +++ b/kernel/model/file.go @@ -1138,7 +1138,7 @@ func CreateDocByMd(boxID, p, title, md string, sorts []string) (tree *parse.Tree return } -func CreateWithMarkdown(boxID, hPath, md, parentID, id string) (retID string, err error) { +func CreateWithMarkdown(boxID, hPath, md, parentID, id string, withMath bool) (retID string, err error) { createDocLock.Lock() defer createDocLock.Unlock() @@ -1150,6 +1150,9 @@ func CreateWithMarkdown(boxID, hPath, md, parentID, id string) (retID string, er WaitForWritingFiles() luteEngine := util.NewLute() + if withMath { + luteEngine.SetInlineMath(true) + } dom := luteEngine.Md2BlockDOM(md, false) retID, err = createDocsByHPath(box.ID, hPath, dom, parentID, id) WaitForWritingFiles() diff --git a/kernel/model/import.go b/kernel/model/import.go index 3c933a77e..4ff0c6df3 100644 --- a/kernel/model/import.go +++ b/kernel/model/import.go @@ -55,12 +55,21 @@ import ( "github.com/siyuan-note/siyuan/kernel/util" ) -func HTML2Markdown(htmlStr string) (markdown string, err error) { +func HTML2Markdown(htmlStr string) (markdown string, withMath bool, err error) { assetDirPath := filepath.Join(util.DataDir, "assets") luteEngine := util.NewLute() tree := luteEngine.HTML2Tree(htmlStr) ast.Walk(tree.Root, func(n *ast.Node, entering bool) ast.WalkStatus { - if !entering || ast.NodeLinkDest != n.Type { + if !entering { + return ast.WalkContinue + } + + if ast.NodeInlineMath == n.Type { + withMath = true + return ast.WalkContinue + } + + if ast.NodeLinkDest != n.Type { return ast.WalkContinue }