aboutsummaryrefslogtreecommitdiff
path: root/mardown/ast_list.go
diff options
context:
space:
mode:
authorAnhgelus Morhtuuzh <william@herges.fr>2025-10-01 22:32:41 +0200
committerAnhgelus Morhtuuzh <william@herges.fr>2025-10-01 22:32:48 +0200
commitce480a18b865acc21eb6c36dea8fc27b08061603 (patch)
treef17625ac33ebde39f7c3188798b6a8fa9c9311eb /mardown/ast_list.go
parent1ce93d83321c751265e4207ebf6dc73a280482c6 (diff)
feat(markdown): support list
Diffstat (limited to 'mardown/ast_list.go')
-rw-r--r--mardown/ast_list.go77
1 files changed, 77 insertions, 0 deletions
diff --git a/mardown/ast_list.go b/mardown/ast_list.go
new file mode 100644
index 0000000..39be70c
--- /dev/null
+++ b/mardown/ast_list.go
@@ -0,0 +1,77 @@
+package mardown
+
+import (
+ "fmt"
+ "html/template"
+ "regexp"
+)
+
+var regexOrdered = regexp.MustCompile(`\d+\.`)
+
+type listType string
+
+const (
+ listUnordered listType = "ul"
+ listOrdered listType = "ol"
+)
+
+type astList struct {
+ tag listType
+ content []*astParagraph
+}
+
+func (a *astList) Eval() (template.HTML, error) {
+ var content template.HTML
+ for _, c := range a.content {
+ ct, err := c.Eval()
+ if err != nil {
+ return "", err
+ }
+ content += template.HTML(fmt.Sprintf("<li>%s</li>", trimSpace(ct)))
+ }
+ return template.HTML(fmt.Sprintf("<%s>%s</%s>", a.tag, content, a.tag)), nil
+}
+
+func list(lxs *lexers) (block, error) {
+ tree := new(astList)
+ current := lxs.Current().Value
+ tree.tag = detectListType(current)
+ if len(tree.tag) == 0 {
+ return paragraph(lxs, false)
+ }
+ n := 0
+ for lxs.Next() && n < 2 {
+ switch lxs.Current().Type {
+ case lexerBreak:
+ n++
+ case lexerList:
+ n = 0
+ tp := detectListType(lxs.Current().Value)
+ if tp != tree.tag {
+ lxs.Before() // because we dit not use it
+ return tree, nil
+ }
+ default:
+ n = 0
+ c, err := paragraph(lxs, true)
+ if err != nil {
+ return nil, err
+ }
+ tree.content = append(tree.content, c)
+ }
+ }
+ return tree, nil
+}
+
+func detectListType(val string) listType {
+ if []rune(val)[0] == '-' {
+ if len(val) > 1 {
+ return ""
+ }
+ return listUnordered
+ }
+ if !regexOrdered.MatchString(val) {
+ return ""
+ }
+ return listOrdered
+}