diff options
| author | Anhgelus Morhtuuzh <william@herges.fr> | 2025-10-02 11:05:30 +0200 |
|---|---|---|
| committer | Anhgelus Morhtuuzh <william@herges.fr> | 2025-10-02 11:05:30 +0200 |
| commit | c176f81dc60d558edfe626ac805a0173c12f317d (patch) | |
| tree | 59706257e2e8b30b6dcec9ed609c5ff676524a5b | |
| parent | 597e15a5cde4127105ce7a6109d52491d6976be7 (diff) | |
feat(markdown): support * as unordered list
| -rw-r--r-- | mardown/ast_list.go | 6 | ||||
| -rw-r--r-- | mardown/ast_list_test.go | 2 | ||||
| -rw-r--r-- | mardown/lexer.go | 30 | ||||
| -rw-r--r-- | mardown/lexer_test.go | 4 |
4 files changed, 31 insertions, 11 deletions
diff --git a/mardown/ast_list.go b/mardown/ast_list.go index 39be70c..8eb451a 100644 --- a/mardown/ast_list.go +++ b/mardown/ast_list.go @@ -34,8 +34,7 @@ func (a *astList) Eval() (template.HTML, error) { func list(lxs *lexers) (block, error) { tree := new(astList) - current := lxs.Current().Value - tree.tag = detectListType(current) + tree.tag = detectListType(lxs.Current().Value) if len(tree.tag) == 0 { return paragraph(lxs, false) } @@ -64,7 +63,8 @@ func list(lxs *lexers) (block, error) { } func detectListType(val string) listType { - if []rune(val)[0] == '-' { + first := []rune(val)[0] + if first == '-' || first == '*' { if len(val) > 1 { return "" } diff --git a/mardown/ast_list_test.go b/mardown/ast_list_test.go index 895e439..6736223 100644 --- a/mardown/ast_list_test.go +++ b/mardown/ast_list_test.go @@ -8,6 +8,7 @@ import ( var rw = ` - item A - item B +* item C 1. item 1 2. item 2 @@ -17,6 +18,7 @@ var expected = ` <ul> <li>item A</li> <li>item B</li> +<li>item C</li> </ul> <ol> <li>item 1</li> diff --git a/mardown/lexer.go b/mardown/lexer.go index 52e5788..c4ff988 100644 --- a/mardown/lexer.go +++ b/mardown/lexer.go @@ -73,8 +73,10 @@ func lex(s string) *lexers { currentType = t previous += string(c) } + newLine := true literalNext := false - for _, c := range []rune(s) { + runes := []rune(s) + for i, c := range runes { if literalNext { fn(c, lexerLiteral) literalNext = false @@ -86,27 +88,39 @@ func lex(s string) *lexers { } switch c { case '*', '_': - if (currentType != lexerModifier && len(previous) > 0) || - (len(previous) > 0 && []rune(previous)[0] != c) || - len(previous) >= 3 { - lexs = append(lexs, lexer{Type: currentType, Value: previous}) - previous = "" + if c == '*' && newLine && i < len(runes)-1 && runes[i+1] == ' ' { + fn(c, lexerList) + } else { + if (currentType != lexerModifier && len(previous) > 0) || + (len(previous) > 0 && []rune(previous)[0] != c) || + len(previous) >= 3 { + lexs = append(lexs, lexer{Type: currentType, Value: previous}) + previous = "" + } + currentType = lexerModifier + previous += string(c) } - currentType = lexerModifier - previous += string(c) + newLine = false case '`': + newLine = false fn(c, lexerCode) case '\n': + newLine = true fn(c, lexerBreak) case '#': + newLine = false fn(c, lexerHeader) case '>': + newLine = false fn(c, lexerQuote) case '[', ']', '(', ')', '!': + newLine = false fn(c, lexerExternal) case '-', '1', '2', '3', '4', '5', '6', '7', '8', '9', '.': + newLine = false fn(c, lexerList) default: + newLine = false fn(c, lexerLiteral) } } diff --git a/mardown/lexer_test.go b/mardown/lexer_test.go index 8fe81cc..3ef87cc 100644 --- a/mardown/lexer_test.go +++ b/mardown/lexer_test.go @@ -23,4 +23,8 @@ func TestLex(t *testing.T) { if lxs.String() != `Lexers[literal(Xxx_DarkEmperor_xxX) ]` { t.Errorf("invalid lex, got %s", lxs) } + lxs = lex(`* list`) + if lxs.String() != `Lexers[list(*) literal( list) ]` { + t.Errorf("invalid lex, got %s", lxs) + } } |
