| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566 |
- // 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)
- }
|