diff options
| author | Anhgelus Morhtuuzh <william@herges.fr> | 2025-10-02 12:03:06 +0200 |
|---|---|---|
| committer | Anhgelus Morhtuuzh <william@herges.fr> | 2025-10-02 12:03:15 +0200 |
| commit | cdb0a541554aa4a16fc71b6425225e8c603c83b8 (patch) | |
| tree | 283fb876c55647235c2990cc42ed04e199f448f1 /mardown/ast_external.go | |
| parent | c176f81dc60d558edfe626ac805a0173c12f317d (diff) | |
feat(markdown): support external link and image (without source)
Diffstat (limited to 'mardown/ast_external.go')
| -rw-r--r-- | mardown/ast_external.go | 141 |
1 files changed, 141 insertions, 0 deletions
diff --git a/mardown/ast_external.go b/mardown/ast_external.go new file mode 100644 index 0000000..87fb880 --- /dev/null +++ b/mardown/ast_external.go @@ -0,0 +1,141 @@ +package mardown + +import ( + "fmt" + "html/template" +) + +type astLink struct { + content block + href block +} + +func (a *astLink) Eval() (template.HTML, error) { + content, err := a.content.Eval() + if err != nil { + return "", err + } + href, err := a.href.Eval() + if err != nil { + return "", err + } + return template.HTML(fmt.Sprintf(`<a href="%s">%s</a>`, href, content)), nil +} + +type astImage struct { + alt block + src block + source *astParagraph +} + +func (a *astImage) Eval() (template.HTML, error) { + alt, err := a.alt.Eval() + if err != nil { + return "", err + } + src, err := a.src.Eval() + if err != nil { + return "", err + } + if a.source == nil { + return template.HTML(fmt.Sprintf(`<figure><img alt="%s" src="%s"></figure>`, alt, src)), nil + } + source, err := a.source.Eval() + if err != nil { + return "", err + } + return template.HTML(fmt.Sprintf(`<figure><img alt="%s" src="%s"><figcaption>%s</figcaption></figure>`, alt, src, source)), nil +} + +func external(lxs *lexers) (block, error) { + tp := lxs.Current().Value + if !lxs.Next() { + return astLiteral(tp), nil + } + lxs.Before() // because we call Next + var b block + var err error + switch tp { + case " { + 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) +} |
