| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172 |
- // Package renderer provides Mindmap diagram rendering
- package renderer
- import (
- "fmt"
- "strings"
- "mermaid-go/pkg/ast"
- )
- // MindmapRenderer implements Mindmap diagram rendering
- type MindmapRenderer struct{}
- // NewMindmapRenderer creates a new Mindmap renderer
- func NewMindmapRenderer() *MindmapRenderer {
- return &MindmapRenderer{}
- }
- // Render renders a Mindmap diagram to mermaid syntax
- func (r *MindmapRenderer) Render(diagram *ast.MindmapDiagram) (string, error) {
- var result strings.Builder
- // Start with mindmap keyword
- result.WriteString("mindmap\n")
- // Add title if present
- if diagram.Title != nil {
- result.WriteString(fmt.Sprintf(" title %s\n", *diagram.Title))
- }
- // Render root node
- if diagram.Root != nil {
- result.WriteString(" root ")
- r.renderNode(&result, diagram.Root, 2)
- result.WriteString("\n")
- }
- // Render other nodes
- for _, node := range diagram.Nodes {
- if node != diagram.Root {
- r.renderNodeWithIndent(&result, node, 2)
- result.WriteString("\n")
- }
- }
- return result.String(), nil
- }
- // renderNode renders a single node
- func (r *MindmapRenderer) renderNode(builder *strings.Builder, node *ast.MindmapNode, indent int) {
- indentStr := strings.Repeat(" ", indent)
- // Render node label
- builder.WriteString(node.Label)
- // Render children
- if len(node.Children) > 0 {
- builder.WriteString("\n")
- for _, child := range node.Children {
- builder.WriteString(indentStr)
- r.renderNode(builder, child, indent+1)
- builder.WriteString("\n")
- }
- }
- }
- // renderNodeWithIndent renders a node with proper indentation
- func (r *MindmapRenderer) renderNodeWithIndent(builder *strings.Builder, node *ast.MindmapNode, indent int) {
- indentStr := strings.Repeat(" ", indent)
- builder.WriteString(indentStr)
- r.renderNode(builder, node, indent)
- }
|