diff options
| -rw-r--r-- | mardown/ast.go | 6 | ||||
| -rw-r--r-- | mardown/ast_external.go | 141 | ||||
| -rw-r--r-- | mardown/ast_external_test.go | 31 | ||||
| -rw-r--r-- | mardown/ast_modifier.go | 6 | ||||
| -rw-r--r-- | mardown/ast_paragraph.go | 7 |
5 files changed, 187 insertions, 4 deletions
diff --git a/mardown/ast.go b/mardown/ast.go index 3794ff1..ed4d1f8 100644 --- a/mardown/ast.go +++ b/mardown/ast.go @@ -37,7 +37,7 @@ func (t *tree) String() string { func ast(lxs *lexers) (*tree, error) { tr := new(tree) - newLine := false + newLine := true for lxs.Next() { b, err := getBlock(lxs, newLine) if err != nil { @@ -64,8 +64,8 @@ func getBlock(lxs *lexers, newLine bool) (block, error) { b, err = header(lxs) } case lexerExternal: - if newLine && lxs.Current().Value == "!" { - //TODO: handle + if newLine && lxs.Current().Value == " { + return "", "", "", false + } + lxs.Before() // because we called Next + first = s + s = "" + next = true + } else { + if lxs.Current().Value != ")" { + return "", "", "", false + } + if maxBreak == 1 { + return first, s, "", true + } + end = s + s = "" + } + default: + n = 0 + s += lxs.Current().Value + } + } + if maxBreak == 1 { + return "", "", "", false + } + return first, end, s, true +} + +func reset(lxs *lexers, start int) block { + lxs.current = start + return astLiteral(lxs.Current().Value) +} diff --git a/mardown/ast_external_test.go b/mardown/ast_external_test.go new file mode 100644 index 0000000..fc0597d --- /dev/null +++ b/mardown/ast_external_test.go @@ -0,0 +1,31 @@ +package mardown + +import "testing" + +func TestExternal(t *testing.T) { + lxs := lex("[content](href)") + tree, err := ast(lxs) + if err != nil { + t.Fatal(err) + } + got, err := tree.Eval() + if err != nil { + t.Fatal(err) + } + if string(got) != `<p><a href="href">content</a></p>` { + t.Errorf("invalid value, got %s", got) + } + + lxs = lex("") + tree, err = ast(lxs) + if err != nil { + t.Fatal(err) + } + got, err = tree.Eval() + if err != nil { + t.Fatal(err) + } + if string(got) != `<figure><img alt="image alt" src="image src"></figure>` { + t.Errorf("invalid value, got %s", got) + } +} diff --git a/mardown/ast_modifier.go b/mardown/ast_modifier.go index 13cd91d..bd04b28 100644 --- a/mardown/ast_modifier.go +++ b/mardown/ast_modifier.go @@ -117,6 +117,12 @@ func modifier(lxs *lexers) (*astModifier, error) { case lexerExternal: if lxs.Current().Value == "!" { s += lxs.Current().Value + } else { + ext, err := external(lxs) + if err != nil { + return nil, err + } + mod.content = append(mod.content, ext) } default: return nil, ErrInvalidTypeInModifier diff --git a/mardown/ast_paragraph.go b/mardown/ast_paragraph.go index ee71794..44b5dd9 100644 --- a/mardown/ast_paragraph.go +++ b/mardown/ast_paragraph.go @@ -68,8 +68,13 @@ func paragraph(lxs *lexers, oneLine bool) (*astParagraph, error) { n = 0 if lxs.Current().Value == "!" { tree.content = append(tree.content, astLiteral(lxs.Current().Value)) + } else { + ext, err := external(lxs) + if err != nil { + return nil, err + } + tree.content = append(tree.content, ext) } - //TODO: handle case lexerCode: n = 0 b, err := code(lxs) |
