diff --git a/kernel/api/extension.go b/kernel/api/extension.go index d1055774f..efe39b969 100644 --- a/kernel/api/extension.go +++ b/kernel/api/extension.go @@ -123,7 +123,12 @@ func extensionCopy(c *gin.Context) { } luteEngine := util.NewLute() - luteEngine.SetHTMLTag2TextMark(true) + luteEngine.SetSup(true) + luteEngine.SetSub(true) + luteEngine.SetMark(true) + luteEngine.SetGFMStrikethrough(true) + luteEngine.SetInlineAsterisk(true) + luteEngine.SetInlineUnderscore(true) var md string var withMath bool if nil != form.Value["href"] { @@ -175,16 +180,19 @@ func extensionCopy(c *gin.Context) { } } + var tree *parse.Tree if "" == md { - md, withMath, _ = model.HTML2Markdown(dom, luteEngine) + tree, withMath = model.HTML2Tree(dom, luteEngine) + if nil == tree { + md, withMath, _ = model.HTML2Markdown(dom, luteEngine) + if withMath { + luteEngine.SetInlineMath(true) + } + tree = parse.Parse("", []byte(md), luteEngine.ParseOptions) + } } - md = strings.TrimSpace(md) - 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 { if !entering { return ast.WalkContinue diff --git a/kernel/api/lute.go b/kernel/api/lute.go index dea10fc0e..ff88a053a 100644 --- a/kernel/api/lute.go +++ b/kernel/api/lute.go @@ -58,7 +58,12 @@ func html2BlockDOM(c *gin.Context) { dom := arg["dom"].(string) luteEngine := util.NewLute() - luteEngine.SetHTMLTag2TextMark(true) + luteEngine.SetSup(true) + luteEngine.SetSub(true) + luteEngine.SetMark(true) + luteEngine.SetGFMStrikethrough(true) + luteEngine.SetInlineAsterisk(true) + luteEngine.SetInlineUnderscore(true) markdown, withMath, err := model.HTML2Markdown(dom, luteEngine) if err != nil { ret.Data = "Failed to convert" diff --git a/kernel/model/import.go b/kernel/model/import.go index bb6e43d3c..7c52b3d30 100644 --- a/kernel/model/import.go +++ b/kernel/model/import.go @@ -54,8 +54,21 @@ import ( ) func HTML2Markdown(htmlStr string, luteEngine *lute.Lute) (markdown string, withMath bool, err error) { + tree, withMath := HTML2Tree(htmlStr, luteEngine) + + var formatted []byte + renderer := render.NewFormatRenderer(tree, luteEngine.RenderOptions) + for nodeType, rendererFunc := range luteEngine.HTML2MdRendererFuncs { + renderer.ExtRendererFuncs[nodeType] = rendererFunc + } + formatted = renderer.Render() + markdown = gulu.Str.FromBytes(formatted) + return +} + +func HTML2Tree(htmlStr string, luteEngine *lute.Lute) (tree *parse.Tree, withMath bool) { assetDirPath := filepath.Join(util.DataDir, "assets") - tree := luteEngine.HTML2Tree(htmlStr) + tree = luteEngine.HTML2Tree(htmlStr) ast.Walk(tree.Root, func(n *ast.Node, entering bool) ast.WalkStatus { if !entering { return ast.WalkContinue @@ -79,19 +92,11 @@ func HTML2Markdown(htmlStr string, luteEngine *lute.Lute) (markdown string, with dest := n.TokensStr() if strings.HasPrefix(dest, "data:image") && strings.Contains(dest, ";base64,") { - processBase64Img(n, dest, assetDirPath, err) + processBase64Img(n, dest, assetDirPath) return ast.WalkContinue } return ast.WalkContinue }) - - var formatted []byte - renderer := render.NewFormatRenderer(tree, luteEngine.RenderOptions) - for nodeType, rendererFunc := range luteEngine.HTML2MdRendererFuncs { - renderer.ExtRendererFuncs[nodeType] = rendererFunc - } - formatted = renderer.Render() - markdown = gulu.Str.FromBytes(formatted) return } @@ -836,7 +841,7 @@ func ImportFromLocalPath(boxID, localPath string, toPath string) (err error) { } if strings.HasPrefix(dest, "data:image") && strings.Contains(dest, ";base64,") { - processBase64Img(n, dest, assetDirPath, err) + processBase64Img(n, dest, assetDirPath) return ast.WalkContinue } @@ -953,7 +958,7 @@ func ImportFromLocalPath(boxID, localPath string, toPath string) (err error) { } if strings.HasPrefix(dest, "data:image") && strings.Contains(dest, ";base64,") { - processBase64Img(n, dest, assetDirPath, err) + processBase64Img(n, dest, assetDirPath) return ast.WalkContinue } @@ -1046,7 +1051,7 @@ func parseStdMd(markdown []byte) (ret *parse.Tree, yfmRootID, yfmTitle, yfmUpdat return } -func processBase64Img(n *ast.Node, dest string, assetDirPath string, err error) { +func processBase64Img(n *ast.Node, dest string, assetDirPath string) { base64TmpDir := filepath.Join(util.TempDir, "base64") os.MkdirAll(base64TmpDir, 0755) @@ -1110,7 +1115,7 @@ func processBase64Img(n *ast.Node, dest string, assetDirPath string, err error) tmpFile.Close() assetTargetPath := filepath.Join(assetDirPath, name) - if err = filelock.Copy(tmp, assetTargetPath); err != nil { + if err := filelock.Copy(tmp, assetTargetPath); err != nil { logging.LogErrorf("copy asset from [%s] to [%s] failed: %s", tmp, assetTargetPath, err) return }