From bce210d75a4552c5b144a5760ace4950c198f046 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?William=20Herg=C3=A8s?= Date: Sun, 5 Oct 2025 15:33:45 +0200 Subject: feat(markdown): smarter lexer for external --- markdown/ast_external_test.go | 2 ++ markdown/ast_test.go | 2 +- markdown/lexer.go | 41 ++++++++++++++++++++++++++++++----------- 3 files changed, 33 insertions(+), 12 deletions(-) diff --git a/markdown/ast_external_test.go b/markdown/ast_external_test.go index 19abf29..f3ac976 100644 --- a/markdown/ast_external_test.go +++ b/markdown/ast_external_test.go @@ -14,11 +14,13 @@ func TestExternal(t *testing.T) { } if string(got) != `

content

` { t.Errorf("invalid value, got %s", got) + t.Logf("lexer %s", lxs.String()) } lxs = lex("![image alt](image src)") tree, err = ast(lxs) if err != nil { + t.Logf("lexer %s", lxs.String()) t.Fatal(err) } got, err = tree.Eval(nil) diff --git a/markdown/ast_test.go b/markdown/ast_test.go index 62a1d23..ff11b1e 100644 --- a/markdown/ast_test.go +++ b/markdown/ast_test.go @@ -41,7 +41,7 @@ var parsed = `
Ceci est ma pfp :3 -
Ma pfp hehe :D Elle est magnifique, n'est-ce pas ?
+
Ma pfp hehe :D Elle est magnifique, n'est-ce pas ?
` diff --git a/markdown/lexer.go b/markdown/lexer.go index 651e3aa..d5c0f5f 100644 --- a/markdown/lexer.go +++ b/markdown/lexer.go @@ -65,8 +65,11 @@ func lex(s string) *lexers { var lexs []lexer var currentType lexerType var previous string - fn := func(c rune, t lexerType) { - if currentType != t && len(previous) > 0 { + fn := func(c rune, t lexerType, validate func(rune) bool) { + if validate == nil { + validate = func(r rune) bool { return true } + } + if (currentType != t || !validate(c)) && len(previous) > 0 { lexs = append(lexs, lexer{Type: currentType, Value: previous}) previous = "" } @@ -78,7 +81,7 @@ func lex(s string) *lexers { runes := []rune(s) for i, c := range runes { if literalNext { - fn(c, lexerLiteral) + fn(c, lexerLiteral, nil) literalNext = false continue } @@ -89,7 +92,7 @@ func lex(s string) *lexers { switch c { case '*', '_': if c == '*' && newLine && i < len(runes)-1 && runes[i+1] == ' ' { - fn(c, lexerList) + fn(c, lexerList, nil) } else { if (currentType != lexerModifier && len(previous) > 0) || (len(previous) > 0 && []rune(previous)[0] != c) || @@ -103,25 +106,25 @@ func lex(s string) *lexers { newLine = false case '`': newLine = false - fn(c, lexerCode) + fn(c, lexerCode, nil) case '\n': newLine = true - fn(c, lexerBreak) + fn(c, lexerBreak, nil) case '#': newLine = false - fn(c, lexerHeader) + fn(c, lexerHeader, nil) case '>': newLine = false - fn(c, lexerQuote) + fn(c, lexerQuote, nil) case '[', ']', '(', ')', '!': newLine = false - fn(c, lexerExternal) + fn(c, lexerExternal, func(c rune) bool { return validExternal(previous + string(c)) }) case '-', '1', '2', '3', '4', '5', '6', '7', '8', '9', '.': newLine = false - fn(c, lexerList) + fn(c, lexerList, nil) default: newLine = false - fn(c, lexerLiteral) + fn(c, lexerLiteral, nil) } } if len(previous) > 0 { @@ -130,3 +133,19 @@ func lex(s string) *lexers { lxs.lexers = lexs return lxs } + +func validExternal(s string) bool { + switch s { + // start + case "![", "[": + return true + // mid + case "](": + return true + // end + case ")": + return true + default: + return false + } +} -- cgit v1.2.3