diff options
Diffstat (limited to 'markdown')
| -rw-r--r-- | markdown/ast_external_test.go | 2 | ||||
| -rw-r--r-- | markdown/ast_test.go | 2 | ||||
| -rw-r--r-- | 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) != `<p><a href="href">content</a></p>` { t.Errorf("invalid value, got %s", got) + t.Logf("lexer %s", lxs.String()) } lxs = lex("") 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 = ` <ul><li>hehe</li></ul> <figure> <img alt="Ceci est ma pfp :3" src="https://cdn.anhgelus.world/pfp.jpg"> -<figcaption><a href="https://now.anhgelus.world/">Ma pfp</a> hehe :D Elle est <b>magnifique</b>, n'est-ce pas ?</figcaption> +<figcaption><a href="https://now.anhgelus.world/" target="_blank" rel="noreferer">Ma pfp</a> hehe :D Elle est <b>magnifique</b>, n'est-ce pas ?</figcaption> </figure> ` 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 + default: + return false + } +} |
