diff options
| -rw-r--r-- | mardown/ast.go | 9 | ||||
| -rw-r--r-- | mardown/ast_modifier.go | 3 | ||||
| -rw-r--r-- | mardown/ast_paragraph.go | 9 | ||||
| -rw-r--r-- | mardown/ast_quote.go | 80 | ||||
| -rw-r--r-- | mardown/ast_test.go | 21 |
5 files changed, 117 insertions, 5 deletions
diff --git a/mardown/ast.go b/mardown/ast.go index 298b313..eaafee6 100644 --- a/mardown/ast.go +++ b/mardown/ast.go @@ -42,7 +42,9 @@ func ast(lxs *lexers) (*tree, error) { if err != nil { return nil, err } - tr.blocks = append(tr.blocks, b) + if b != nil { + tr.blocks = append(tr.blocks, b) + } if !lxs.Finished() { newLine = lxs.Current().Type == lexerBreak } @@ -67,6 +69,11 @@ func getBlock(lxs *lexers, newLine bool) (block, error) { b, err = paragraph(lxs, false) } case lexerQuote: + if newLine { + b, err = quote(lxs) + } else { + b, err = paragraph(lxs, false) + } case lexerCode: if newLine && len(lxs.Current().Value) == 3 { //TODO: handle diff --git a/mardown/ast_modifier.go b/mardown/ast_modifier.go index a9039ce..80552e2 100644 --- a/mardown/ast_modifier.go +++ b/mardown/ast_modifier.go @@ -73,6 +73,9 @@ func modifier(lxs *lexers) (*astModifier, error) { modInside.content = append(modInside.content, astLiteral(s)) s = "" modInside = modInside.parent + case lexerBreak: + lxs.current-- // because we did not use it + return mod, nil default: return nil, ErrInvalidTypeInModifier } diff --git a/mardown/ast_paragraph.go b/mardown/ast_paragraph.go index 24b7057..6149c30 100644 --- a/mardown/ast_paragraph.go +++ b/mardown/ast_paragraph.go @@ -44,21 +44,24 @@ func paragraph(lxs *lexers, oneLine bool) (*astParagraph, error) { switch lxs.Current().Type { case lexerBreak: n++ - case lexerLiteral, lexerHeader: + case lexerLiteral, lexerHeader, lexerQuote: + n = 0 tree.content = append(tree.content, astLiteral(lxs.Current().Value)) case lexerModifier: + n = 0 mod, err := modifier(lxs) if err != nil { return nil, err } tree.content = append(tree.content, mod) - case lexerQuote: - //TODO: handle case lexerEscape: + n = 0 //TODO: handle case lexerExternal: + n = 0 //TODO: handle case lexerCode: + n = 0 if len(lxs.Current().Value) == 3 { if n == 0 { return nil, ErrInvalidCodeBlockPosition diff --git a/mardown/ast_quote.go b/mardown/ast_quote.go new file mode 100644 index 0000000..9647500 --- /dev/null +++ b/mardown/ast_quote.go @@ -0,0 +1,80 @@ +package mardown + +import ( + "fmt" + "html/template" + "strings" +) + +type astQuote struct { + quote []*astParagraph + source []*astParagraph +} + +func (a *astQuote) Eval() (template.HTML, error) { + var quote template.HTML + for _, c := range a.quote { + ct, err := c.Eval() + if err != nil { + return "", err + } + quote += ct + } + quote = template.HTML(strings.TrimSpace(string(quote))) + quote = template.HTML(fmt.Sprintf("<blockquote>%s</blockquote>", quote)) + var source template.HTML + for _, c := range a.source { + ct, err := c.Eval() + if err != nil { + return "", err + } + source += ct + } + source = template.HTML(strings.TrimSpace(string(source))) + return template.HTML(fmt.Sprintf(`<div class="quote">%s<p>%s</p></div>`, quote, source)), nil +} + +func quote(lxs *lexers) (*astQuote, error) { + tree := new(astQuote) + n := 0 + quoteContinue := true + source := false + for lxs.Next() && n < 2 { + switch lxs.Current().Type { + case lexerBreak: + n++ + quoteContinue = false + case lexerQuote: + n = 0 + if source { + // because the code did not use it + lxs.current-- + return tree, nil + } + quoteContinue = true + case lexerLiteral, lexerModifier, lexerCode: + n = 0 + if !quoteContinue { + source = true + } + p, err := paragraph(lxs, true) + lxs.current-- // because we call the next twice here + if err != nil { + return nil, err + } + + if !source { + tree.quote = append(tree.quote, p) + } else { + tree.source = append(tree.source, p) + } + n++ + quoteContinue = false + default: + // because the code did not use it + lxs.current-- + return tree, nil + } + } + return tree, nil +} diff --git a/mardown/ast_test.go b/mardown/ast_test.go index b270b18..d9033c2 100644 --- a/mardown/ast_test.go +++ b/mardown/ast_test.go @@ -17,7 +17,9 @@ func TestAst(t *testing.T) { t.Errorf("failed, got %s", c) t.Logf("lxs: %s\ntree: %s", lxs, tree) } - content = "***bon*soir**" + content = ` +***bon*soir** +` lxs = lex(content) tree, err = ast(lxs) if err != nil { @@ -45,4 +47,21 @@ func TestAst(t *testing.T) { t.Errorf("failed, got %s", c) t.Logf("lxs: %s\ntree: %s", lxs, tree) } + content = ` +> Bonsoir, je suis un **code** +avec une source +` + lxs = lex(content) + tree, err = ast(lxs) + if err != nil { + t.Fatal(err) + } + c, err = tree.Eval() + if err != nil { + t.Fatal(err) + } + if c != `<div class="quote"><blockquote>Bonsoir, je suis un <b>code</b></blockquote><p>avec une source</p></div>` { + t.Errorf("failed, got %s", c) + t.Logf("lxs: %s\ntree: %s", lxs, tree) + } } |
