treemap.go 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. // Package renderer provides Treemap diagram rendering
  2. package renderer
  3. import (
  4. "fmt"
  5. "strings"
  6. "mermaid-go/pkg/ast"
  7. )
  8. // TreemapRenderer implements Treemap diagram rendering
  9. type TreemapRenderer struct{}
  10. // NewTreemapRenderer creates a new Treemap renderer
  11. func NewTreemapRenderer() *TreemapRenderer {
  12. return &TreemapRenderer{}
  13. }
  14. // Render renders a Treemap diagram to mermaid syntax
  15. func (r *TreemapRenderer) Render(diagram *ast.TreemapDiagram) (string, error) {
  16. var result strings.Builder
  17. // Start with treemap keyword
  18. result.WriteString("treemap\n")
  19. // Add title if present
  20. if diagram.Title != nil {
  21. result.WriteString(fmt.Sprintf(" title %s\n", *diagram.Title))
  22. }
  23. // Render root node first
  24. if diagram.Root != nil {
  25. r.renderNode(&result, diagram.Root, 2)
  26. }
  27. // Render other nodes
  28. for _, node := range diagram.Nodes {
  29. if node != diagram.Root {
  30. r.renderNodeWithIndent(&result, node, 2)
  31. }
  32. }
  33. return result.String(), nil
  34. }
  35. // renderNode renders a single node
  36. func (r *TreemapRenderer) renderNode(builder *strings.Builder, node *ast.TreemapNode, indent int) {
  37. indentStr := strings.Repeat(" ", indent)
  38. // Render node with value if present
  39. if node.Value != nil {
  40. builder.WriteString(fmt.Sprintf("%s%s : %.2f\n", indentStr, node.Label, *node.Value))
  41. } else {
  42. builder.WriteString(fmt.Sprintf("%s%s\n", indentStr, node.Label))
  43. }
  44. // Render children
  45. for _, child := range node.Children {
  46. r.renderNode(builder, child, indent+1)
  47. }
  48. }
  49. // renderNodeWithIndent renders a node with proper indentation
  50. func (r *TreemapRenderer) renderNodeWithIndent(builder *strings.Builder, node *ast.TreemapNode, indent int) {
  51. r.renderNode(builder, node, indent)
  52. }