diff options
| author | Anhgelus Morhtuuzh <william@herges.fr> | 2025-10-01 22:32:41 +0200 |
|---|---|---|
| committer | Anhgelus Morhtuuzh <william@herges.fr> | 2025-10-01 22:32:48 +0200 |
| commit | ce480a18b865acc21eb6c36dea8fc27b08061603 (patch) | |
| tree | f17625ac33ebde39f7c3188798b6a8fa9c9311eb /mardown/ast_list.go | |
| parent | 1ce93d83321c751265e4207ebf6dc73a280482c6 (diff) | |
feat(markdown): support list
Diffstat (limited to 'mardown/ast_list.go')
| -rw-r--r-- | mardown/ast_list.go | 77 |
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 +} |
