aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAnhgelus Morhtuuzh <william@herges.fr>2025-09-30 20:23:51 +0200
committerAnhgelus Morhtuuzh <william@herges.fr>2025-09-30 20:23:51 +0200
commitf5607e75f98d50dfd0496cfd5a76bc0d905403f7 (patch)
tree1e882186e69c881f418583d06dac089169078c04
parent1d524762bc56950a85aa748aa873901621741dc7 (diff)
refactor(markdown): use paragraph for header
-rw-r--r--mardown/ast.go6
-rw-r--r--mardown/ast_header.go32
-rw-r--r--mardown/ast_paragraph.go18
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