From 07d0ce1e9128a4598e97ce30a9eb0cfd47c05318 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?William=20Herg=C3=A8s?= Date: Thu, 25 Dec 2025 16:25:11 +0100 Subject: refactor(markdown): simplify paragraph parsing --- markdown/ast_paragraph.go | 61 +++++++++++++++++++---------------------------- markdown/ast_test.go | 2 +- 2 files changed, 25 insertions(+), 38 deletions(-) diff --git a/markdown/ast_paragraph.go b/markdown/ast_paragraph.go index 30fd4a1..6bad197 100644 --- a/markdown/ast_paragraph.go +++ b/markdown/ast_paragraph.go @@ -51,16 +51,10 @@ func paragraph(lxs *lexers, oneLine bool) (*astParagraph, *ParseError) { maxBreak = 1 } n := 0 - asLiteral := func(conv func(s string) block) { - s := lxs.Current().Value - // replace line break by space - if n > 0 && len(tree.content) != 0 { - tree.content = append(tree.content, astBreak{}) - } - tree.content = append(tree.content, conv(s)) - } lxs.Before() // because we do not use it before the next for lxs.Next() && n < maxBreak { + var err *ParseError + var b block switch lxs.Current().Type { case lexerBreak: n += len(lxs.Current().Value) @@ -69,45 +63,46 @@ func paragraph(lxs *lexers, oneLine bool) (*astParagraph, *ParseError) { lxs.Before() // because we did not use it return tree, nil } - asLiteral(toAstLiteral) + b = astLiteral(lxs.Current().Value) case lexerLiteral, lexerHeading: - asLiteral(toAstLiteral) + b = astLiteral(lxs.Current().Value) case lexerReplace: - asLiteral(toAstReplacer) + b = astReplacer(lxs.Current().Value) case lexerModifier: - // replace line break by space - if n > 0 { - tree.content = append(tree.content, astLiteral(" ")) - } - mod, err := modifier(lxs) - if err != nil { - return nil, &ParseError{lxs: *lxs, internal: err} + var e error + b, e = modifier(lxs) + if e != nil { + err = &ParseError{lxs: *lxs, internal: e} } - tree.content = append(tree.content, mod) case lexerExternal: if n > 0 && lxs.Current().Value == "![" { lxs.Before() // because we did not use it return tree, nil } if lxs.Current().Value != "[" { - asLiteral(toAstLiteral) + b = astLiteral(lxs.Current().Value) } else { - ext, err := external(lxs) - if err != nil { - return nil, err - } - tree.content = append(tree.content, ext) + b, err = external(lxs) } case lexerCode: if len(lxs.Current().Value) > 1 { - return nil, &ParseError{lxs: *lxs, internal: ErrInvalidCodeBlockPosition} + err = &ParseError{lxs: *lxs, internal: ErrInvalidCodeBlockPosition} + } else { + b, err = code(lxs) } - b, err := code(lxs) - if err != nil { - return nil, err + } + + if err != nil { + return nil, err + } + + if b != nil { + if n > 0 && len(tree.content) != 0 { + tree.content = append(tree.content, astBreak{}) } tree.content = append(tree.content, b) } + if lxs.Current().Type != lexerBreak { n = 0 } @@ -122,16 +117,8 @@ func (a astLiteral) Eval(_ *Option) (template.HTML, *ParseError) { return template.HTML(template.HTMLEscapeString(string(a))), nil } -func toAstLiteral(s string) block { - return astLiteral(s) -} - type astReplacer string func (a astReplacer) Eval(opt *Option) (template.HTML, *ParseError) { return template.HTML(opt.Replaces[[]rune(a)[0]]), nil } - -func toAstReplacer(s string) block { - return astReplacer(s) -} diff --git a/markdown/ast_test.go b/markdown/ast_test.go index c0c7fb3..5e5a4f9 100644 --- a/markdown/ast_test.go +++ b/markdown/ast_test.go @@ -69,7 +69,7 @@ func testWithOptions(opt *Option, input, expected string) func(*testing.T) { t.Parallel() got, err := Parse(input, opt) if err != nil { - t.Fatal(err) + t.Fatal(err.Pretty()) } if string(got) != expected { t.Errorf("invalid value, got %s", got) -- cgit v1.2.3