From 9e5734cf76585705e259ae6c3585980ce8b994c1 Mon Sep 17 00:00:00 2001 From: Anhgelus Morhtuuzh Date: Tue, 30 Sep 2025 23:18:20 +0200 Subject: feat(markdown): code block and better handle of inline code --- mardown/ast_code.go | 66 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 66 insertions(+) create mode 100644 mardown/ast_code.go (limited to 'mardown/ast_code.go') diff --git a/mardown/ast_code.go b/mardown/ast_code.go new file mode 100644 index 0000000..7edd6ba --- /dev/null +++ b/mardown/ast_code.go @@ -0,0 +1,66 @@ +package mardown + +import ( + "errors" + "fmt" + "html/template" +) + +var ( + ErrUnknownCodeType = errors.New("unkown code type") + ErrInvalidCodeFormat = errors.New("invalid code format") + ErrInvalidCodeBlockPosition = errors.Join(ErrInvalidParagraph, errors.New("invalid code block position")) +) + +type codeType uint + +const ( + codeOneLine codeType = 1 + codeMultiLine codeType = 2 +) + +type astCode struct { + content string + before string + codeType codeType +} + +func (a *astCode) Eval() (template.HTML, error) { + switch a.codeType { + case codeOneLine: + return template.HTML(fmt.Sprintf("%s", template.HTMLEscapeString(a.content))), nil + case codeMultiLine: + return template.HTML(fmt.Sprintf("
%s
", template.HTMLEscapeString(a.content))), nil + default: + return "", ErrUnknownCodeType + } +} + +func code(lxs *lexers) (*astCode, error) { + tree := new(astCode) + current := lxs.Current().Value + if len(current) == 3 { + tree.codeType = codeMultiLine + } else if len(current) == 1 { + tree.codeType = codeOneLine + } else { + return nil, ErrInvalidCodeFormat + } + started := false + for lxs.Next() && lxs.Current().Value != current { + if lxs.Current().Type == lexerBreak { + if tree.codeType == codeOneLine { + return nil, ErrInvalidCodeFormat + } + if !started { + started = true + } + } + if started || tree.codeType == codeOneLine { + tree.content += lxs.Current().Value + } else { + tree.before += lxs.Current().Value + } + } + return tree, nil +} -- cgit v1.2.3