// Package renderer provides Treemap diagram rendering package renderer import ( "fmt" "strings" "mermaid-go/pkg/ast" ) // TreemapRenderer implements Treemap diagram rendering type TreemapRenderer struct{} // NewTreemapRenderer creates a new Treemap renderer func NewTreemapRenderer() *TreemapRenderer { return &TreemapRenderer{} } // Render renders a Treemap diagram to mermaid syntax func (r *TreemapRenderer) Render(diagram *ast.TreemapDiagram) (string, error) { var result strings.Builder // Start with treemap keyword result.WriteString("treemap\n") // Add title if present if diagram.Title != nil { result.WriteString(fmt.Sprintf(" title %s\n", *diagram.Title)) } // Render root node first if diagram.Root != nil { r.renderNode(&result, diagram.Root, 2) } // Render other nodes for _, node := range diagram.Nodes { if node != diagram.Root { r.renderNodeWithIndent(&result, node, 2) } } return result.String(), nil } // renderNode renders a single node func (r *TreemapRenderer) renderNode(builder *strings.Builder, node *ast.TreemapNode, indent int) { indentStr := strings.Repeat(" ", indent) // Render node with value if present if node.Value != nil { builder.WriteString(fmt.Sprintf("%s%s : %.2f\n", indentStr, node.Label, *node.Value)) } else { builder.WriteString(fmt.Sprintf("%s%s\n", indentStr, node.Label)) } // Render children for _, child := range node.Children { r.renderNode(builder, child, indent+1) } } // renderNodeWithIndent renders a node with proper indentation func (r *TreemapRenderer) renderNodeWithIndent(builder *strings.Builder, node *ast.TreemapNode, indent int) { r.renderNode(builder, node, indent) }