aboutsummaryrefslogtreecommitdiff
path: root/mardown/ast_quote.go
diff options
context:
space:
mode:
authorAnhgelus Morhtuuzh <william@herges.fr>2025-09-30 22:35:31 +0200
committerAnhgelus Morhtuuzh <william@herges.fr>2025-09-30 22:35:31 +0200
commit7b2b9d312791fcf6f49a350f6887a2019d2730f7 (patch)
treef932a1f941c927e83fe144aa4d164996bd9db870 /mardown/ast_quote.go
parent0426dfc21a0808a25404d3f03d36d1ce4e2efde7 (diff)
feat(markdown): quote
Diffstat (limited to 'mardown/ast_quote.go')
-rw-r--r--mardown/ast_quote.go80
1 files changed, 80 insertions, 0 deletions
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
+}