From ce480a18b865acc21eb6c36dea8fc27b08061603 Mon Sep 17 00:00:00 2001 From: Anhgelus Morhtuuzh Date: Wed, 1 Oct 2025 22:32:41 +0200 Subject: feat(markdown): support list --- mardown/ast_list.go | 77 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 77 insertions(+) create mode 100644 mardown/ast_list.go (limited to 'mardown/ast_list.go') 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("
  • %s
  • ", trimSpace(ct))) + } + return template.HTML(fmt.Sprintf("<%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 +} -- cgit v1.2.3