aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--markdown/ast_external_test.go2
-rw-r--r--markdown/ast_test.go2
-rw-r--r--markdown/lexer.go41
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("![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 = `
<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&#39;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&#39;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
+ // mid
+ case "](":
+ return true
+ // end
+ case ")":
+ return true
+ default:
+ return false
+ }
+}