package blocks import ( "fmt" "html" ) // MediaValue represents a rich media object for template substitution. // Implements fmt.Stringer to render a full tag when used directly. type MediaValue struct { Src string // Full URL path (e.g., "/media/uuid/webp.webp") Alt string // Alt text from media library Filename string // Original filename Width int // Image width in pixels Height int // Image height in pixels } // String renders the default tag representation. func (m MediaValue) String() string { attrs := fmt.Sprintf(`src="%s" alt="%s" class="w-full h-auto"`, html.EscapeString(m.Src), html.EscapeString(m.Alt)) if m.Width > 0 && m.Height > 0 { attrs += fmt.Sprintf(` width="%d" height="%d"`, m.Width, m.Height) } return fmt.Sprintf(``, attrs) } // RenderWithClass renders the tag with custom CSS classes. func (m MediaValue) RenderWithClass(class string) string { attrs := fmt.Sprintf(`src="%s" alt="%s" class="%s"`, html.EscapeString(m.Src), html.EscapeString(m.Alt), html.EscapeString(class)) if m.Width > 0 && m.Height > 0 { attrs += fmt.Sprintf(` width="%d" height="%d"`, m.Width, m.Height) } return fmt.Sprintf(``, attrs) } // TemplateRenderer is the interface for rendering pongo2/Jinja2-style templates. // The CMS registers an implementation at startup. type TemplateRenderer interface { RenderTemplate(tmpl string, data map[string]any) (string, error) ProcessIcons(html string) string } // templateRenderer holds the registered template renderer. var templateRenderer TemplateRenderer // RegisterTemplateRenderer sets the global template renderer. // Called by the CMS at startup to provide pongo2 rendering. func RegisterTemplateRenderer(r TemplateRenderer) { templateRenderer = r } // RenderTemplate renders a pongo2/Jinja2-style template string with the given data. // Returns the rendered HTML or an error. Falls back to a no-op if no renderer is registered. func RenderTemplate(tmpl string, data map[string]any) (string, error) { if templateRenderer == nil { // No renderer registered — return template as-is (no variable substitution) return tmpl, nil } return templateRenderer.RenderTemplate(tmpl, data) } // ProcessIcons processes ::pack:name:: icon syntax in HTML. // Returns the HTML with icons replaced, or the original if no renderer is registered. func ProcessIcons(htmlStr string) string { if templateRenderer == nil { return htmlStr } return templateRenderer.ProcessIcons(htmlStr) }