// Package renderer provides rendering functionality for pie charts package renderer import ( "fmt" "strings" "mermaid-go/pkg/ast" ) // PieRenderer renders pie charts back to mermaid syntax type PieRenderer struct{} // NewPieRenderer creates a new pie renderer func NewPieRenderer() *PieRenderer { return &PieRenderer{} } // Render renders a pie chart to mermaid syntax func (r *PieRenderer) Render(diagram *ast.PieChart) (string, error) { var builder strings.Builder // Start with diagram declaration builder.WriteString("pie") // Add showData option if present if diagram.Config != nil { if showData, ok := diagram.Config["showData"]; ok && showData == true { builder.WriteString(" showData") } } builder.WriteString("\n") // Add title if present if diagram.Title != nil { builder.WriteString(fmt.Sprintf(" title %s\n", *diagram.Title)) } // Render data slices for _, slice := range diagram.Data { // Determine if label needs quotes needsQuotes := strings.Contains(slice.Label, " ") || strings.Contains(slice.Label, ":") || strings.Contains(slice.Label, "\"") builder.WriteString(" ") if needsQuotes { builder.WriteString(fmt.Sprintf("\"%s\"", slice.Label)) } else { builder.WriteString(slice.Label) } builder.WriteString(" : ") // Format value (remove .0 for whole numbers) if slice.Value == float64(int64(slice.Value)) { builder.WriteString(fmt.Sprintf("%.0f", slice.Value)) } else { builder.WriteString(fmt.Sprintf("%g", slice.Value)) } builder.WriteString("\n") } return builder.String(), nil }