mindmap.go 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. // Package renderer provides Mindmap diagram rendering
  2. package renderer
  3. import (
  4. "fmt"
  5. "strings"
  6. "mermaid-go/pkg/ast"
  7. )
  8. // MindmapRenderer implements Mindmap diagram rendering
  9. type MindmapRenderer struct{}
  10. // NewMindmapRenderer creates a new Mindmap renderer
  11. func NewMindmapRenderer() *MindmapRenderer {
  12. return &MindmapRenderer{}
  13. }
  14. // Render renders a Mindmap diagram to mermaid syntax
  15. func (r *MindmapRenderer) Render(diagram *ast.MindmapDiagram) (string, error) {
  16. var result strings.Builder
  17. // Start with mindmap keyword
  18. result.WriteString("mindmap\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
  24. if diagram.Root != nil {
  25. result.WriteString(" root ")
  26. r.renderNode(&result, diagram.Root, 2)
  27. result.WriteString("\n")
  28. }
  29. // Render other nodes
  30. for _, node := range diagram.Nodes {
  31. if node != diagram.Root {
  32. r.renderNodeWithIndent(&result, node, 2)
  33. result.WriteString("\n")
  34. }
  35. }
  36. return result.String(), nil
  37. }
  38. // renderNode renders a single node
  39. func (r *MindmapRenderer) renderNode(builder *strings.Builder, node *ast.MindmapNode, indent int) {
  40. indentStr := strings.Repeat(" ", indent)
  41. // Render node label
  42. builder.WriteString(node.Label)
  43. // Render children
  44. if len(node.Children) > 0 {
  45. builder.WriteString("\n")
  46. for _, child := range node.Children {
  47. builder.WriteString(indentStr)
  48. r.renderNode(builder, child, indent+1)
  49. builder.WriteString("\n")
  50. }
  51. }
  52. }
  53. // renderNodeWithIndent renders a node with proper indentation
  54. func (r *MindmapRenderer) renderNodeWithIndent(builder *strings.Builder, node *ast.MindmapNode, indent int) {
  55. indentStr := strings.Repeat(" ", indent)
  56. builder.WriteString(indentStr)
  57. r.renderNode(builder, node, indent)
  58. }