info.go 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. // Package renderer provides Info diagram rendering
  2. package renderer
  3. import (
  4. "fmt"
  5. "strings"
  6. "mermaid-go/pkg/ast"
  7. )
  8. // InfoRenderer implements Info diagram rendering
  9. type InfoRenderer struct{}
  10. // NewInfoRenderer creates a new Info renderer
  11. func NewInfoRenderer() *InfoRenderer {
  12. return &InfoRenderer{}
  13. }
  14. // Render renders an Info diagram to mermaid syntax
  15. func (r *InfoRenderer) Render(diagram *ast.InfoDiagram) (string, error) {
  16. var result strings.Builder
  17. // Start with info keyword
  18. result.WriteString("info\n")
  19. // Add title if present
  20. if diagram.Title != nil {
  21. result.WriteString(fmt.Sprintf(" title %s\n", *diagram.Title))
  22. }
  23. // Render groups first
  24. for _, group := range diagram.Groups {
  25. result.WriteString(fmt.Sprintf(" group %s\n", group.Label))
  26. for _, item := range group.Items {
  27. result.WriteString(fmt.Sprintf(" %s", item.Label))
  28. if item.Type != "" {
  29. result.WriteString(fmt.Sprintf(" %s", item.Type))
  30. }
  31. if item.Value != nil {
  32. result.WriteString(fmt.Sprintf(" : %s", *item.Value))
  33. }
  34. result.WriteString("\n")
  35. }
  36. }
  37. // Render standalone items
  38. for _, item := range diagram.Items {
  39. result.WriteString(fmt.Sprintf(" %s", item.Label))
  40. if item.Type != "" {
  41. result.WriteString(fmt.Sprintf(" %s", item.Type))
  42. }
  43. if item.Value != nil {
  44. result.WriteString(fmt.Sprintf(" : %s", *item.Value))
  45. }
  46. result.WriteString("\n")
  47. }
  48. return result.String(), nil
  49. }