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