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