diff --git a/internal/builder/convert.go b/internal/builder/convert.go
index d8125b9..12831b3 100644
--- a/internal/builder/convert.go
+++ b/internal/builder/convert.go
@@ -1,6 +1,7 @@
package builder
import (
+ "bytes"
"fmt"
"io"
"os"
@@ -59,14 +60,18 @@ func renderImage(w io.Writer, node *ast.Image, entering bool, next *ast.Text) {
// here before the opening img tag
if entering {
fmt.Fprintf(w, "
\n")
- fmt.Fprintf(w, `

`, node.Destination, node.Title)
+ fmt.Fprintf(w, `

0 {
- // handle rendering Literal as markdown here
md := []byte(next.Literal)
- html := convertEmbedded(md)
+ html, doc := convertEmbedded(md)
+ altText := extractPlainText(md, doc)
+ fmt.Fprintf(w, ` alt="%s">`, altText)
// TODO: render inside a special div?
// is this necessary since this is all inside image-container anyways?
fmt.Fprintf(w, `
%s`, html)
+ } else {
+ //
+ io.WriteString(w, ">")
}
} else {
// if it's the closing img tag
@@ -128,17 +133,34 @@ func htmlRenderHook(w io.Writer, node ast.Node, entering bool) (ast.WalkStatus,
// convertEmbedded renders markdown as HTML
// but does NOT render images
-func convertEmbedded(md []byte) []byte {
+// also returns document AST
+func convertEmbedded(md []byte) ([]byte, *ast.Node) {
p := parser.NewWithExtensions(parser.CommonExtensions)
+ doc := p.Parse(md)
htmlFlags := html.CommonFlags | html.HrefTargetBlank
opts := html.RendererOptions{Flags: htmlFlags}
opts.RenderNodeHook = htmlRenderHookNoImage
r := html.NewRenderer(opts)
- htmlText := markdown.ToHTML(md, p, r)
- return htmlText
+ html := markdown.Render(doc, r)
+ return html, &doc
}
func newZonaRenderer(opts html.RendererOptions) *html.Renderer {
opts.RenderNodeHook = htmlRenderHook
return html.NewRenderer(opts)
}
+
+// ExtractPlainText walks the AST and extracts plain text from the Markdown input.
+func extractPlainText(md []byte, doc *ast.Node) string {
+ var buffer bytes.Buffer
+
+ // Walk the AST and extract text nodes
+ ast.WalkFunc(*doc, func(node ast.Node, entering bool) ast.WalkStatus {
+ if textNode, ok := node.(*ast.Text); ok && entering {
+ buffer.Write(textNode.Literal) // Append the text content
+ }
+ return ast.GoToNext
+ })
+
+ return buffer.String()
+}