aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--mardown/ast.go9
-rw-r--r--mardown/ast_modifier.go3
-rw-r--r--mardown/ast_paragraph.go9
-rw-r--r--mardown/ast_quote.go80
-rw-r--r--mardown/ast_test.go21
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)
+ }
}