pie.go 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. // Package renderer provides rendering functionality for pie charts
  2. package renderer
  3. import (
  4. "fmt"
  5. "strings"
  6. "mermaid-go/pkg/ast"
  7. )
  8. // PieRenderer renders pie charts back to mermaid syntax
  9. type PieRenderer struct{}
  10. // NewPieRenderer creates a new pie renderer
  11. func NewPieRenderer() *PieRenderer {
  12. return &PieRenderer{}
  13. }
  14. // Render renders a pie chart to mermaid syntax
  15. func (r *PieRenderer) Render(diagram *ast.PieChart) (string, error) {
  16. var builder strings.Builder
  17. // Start with diagram declaration
  18. builder.WriteString("pie")
  19. // Add showData option if present
  20. if diagram.Config != nil {
  21. if showData, ok := diagram.Config["showData"]; ok && showData == true {
  22. builder.WriteString(" showData")
  23. }
  24. }
  25. builder.WriteString("\n")
  26. // Add title if present
  27. if diagram.Title != nil {
  28. builder.WriteString(fmt.Sprintf(" title %s\n", *diagram.Title))
  29. }
  30. // Render data slices
  31. for _, slice := range diagram.Data {
  32. // Determine if label needs quotes
  33. needsQuotes := strings.Contains(slice.Label, " ") ||
  34. strings.Contains(slice.Label, ":") ||
  35. strings.Contains(slice.Label, "\"")
  36. builder.WriteString(" ")
  37. if needsQuotes {
  38. builder.WriteString(fmt.Sprintf("\"%s\"", slice.Label))
  39. } else {
  40. builder.WriteString(slice.Label)
  41. }
  42. builder.WriteString(" : ")
  43. // Format value (remove .0 for whole numbers)
  44. if slice.Value == float64(int64(slice.Value)) {
  45. builder.WriteString(fmt.Sprintf("%.0f", slice.Value))
  46. } else {
  47. builder.WriteString(fmt.Sprintf("%g", slice.Value))
  48. }
  49. builder.WriteString("\n")
  50. }
  51. return builder.String(), nil
  52. }