diff options
| author | Anhgelus Morhtuuzh <william@herges.fr> | 2025-09-30 20:23:51 +0200 |
|---|---|---|
| committer | Anhgelus Morhtuuzh <william@herges.fr> | 2025-09-30 20:23:51 +0200 |
| commit | f5607e75f98d50dfd0496cfd5a76bc0d905403f7 (patch) | |
| tree | 1e882186e69c881f418583d06dac089169078c04 | |
| parent | 1d524762bc56950a85aa748aa873901621741dc7 (diff) | |
refactor(markdown): use paragraph for header
| -rw-r--r-- | mardown/ast.go | 6 | ||||
| -rw-r--r-- | mardown/ast_header.go | 32 | ||||
| -rw-r--r-- | mardown/ast_paragraph.go | 18 |
3 files changed, 28 insertions, 28 deletions
diff --git a/mardown/ast.go b/mardown/ast.go index 602d21e..731dea9 100644 --- a/mardown/ast.go +++ b/mardown/ast.go @@ -39,7 +39,11 @@ func getBlock(lxs lexers, newLine bool) (block, error) { var err error switch lxs.Current().Type { case lexerHeader: - b, err = header(lxs) + if !newLine { + b, err = paragraph(lxs, false) + } else { + b, err = header(lxs) + } case lexerExternal: if newLine && lxs.Current().Value == "!" { //TODO: handle diff --git a/mardown/ast_header.go b/mardown/ast_header.go index 7c997d5..07d7e1c 100644 --- a/mardown/ast_header.go +++ b/mardown/ast_header.go @@ -10,7 +10,7 @@ var ErrInvalidHeader = errors.New("invalid header") type astHeader struct { level uint - content []block + content *astParagraph } func (a *astHeader) Eval() (template.HTML, error) { @@ -18,33 +18,19 @@ func (a *astHeader) Eval() (template.HTML, error) { return "", ErrInvalidHeader } var content template.HTML - for _, b := range a.content { - c, err := b.Eval() - if err != nil { - return "", err - } - content += c + content, err := a.content.Eval() + if err != nil { + return "", err } - return template.HTML(fmt.Sprintf("<h%d>%s<h%d>", a.level, content, a.level)), nil + return template.HTML(fmt.Sprintf("<h%d>%s</h%d>", a.level, content, a.level)), nil } func header(lxs lexers) (block, error) { b := &astHeader{level: uint(len(lxs.Current().Value))} - for lxs.Next() && lxs.Current().Type != lexerBreak { - bl, err := getBlock(lxs) - if err != nil { - return nil, err - } - // if this is a header, just consider it as literal # - if h, ok := bl.(*astHeader); ok { - var s string - for range h.level { - s += "#" - } - b.content = append(b.content, astLiteral(s)) - b.content = append(b.content, h.content...) - } - b.content = append(b.content, bl) + var err error + b.content, err = paragraph(lxs, true) + if err != nil { + return nil, err } return b, nil } diff --git a/mardown/ast_paragraph.go b/mardown/ast_paragraph.go index 3ebc519..04f2086 100644 --- a/mardown/ast_paragraph.go +++ b/mardown/ast_paragraph.go @@ -2,6 +2,7 @@ package mardown import ( "errors" + "fmt" "html/template" ) @@ -12,6 +13,7 @@ var ( type astParagraph struct { content []block + oneLine bool } func (a *astParagraph) Eval() (template.HTML, error) { @@ -23,18 +25,26 @@ func (a *astParagraph) Eval() (template.HTML, error) { } content += ct } - return content, nil + if a.oneLine { + return content, nil + } + return template.HTML(fmt.Sprintf("<p>%s</p>", content)), nil } -func paragraph(lxs lexers) (block, error) { +func paragraph(lxs lexers, oneLine bool) (*astParagraph, error) { tree := new(astParagraph) + tree.oneLine = oneLine + maxBreak := 2 + if oneLine { + maxBreak = 1 + } n := 0 lxs.current-- // because we do not use it before the next - for lxs.Next() && n < 2 { + for lxs.Next() && n < maxBreak { switch lxs.Current().Type { case lexerBreak: n++ - case lexerLiteral: + case lexerLiteral, lexerHeader: tree.content = append(tree.content, astLiteral(lxs.Current().Value)) case lexerModifier: //TODO: handle |
