| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889 |
- // Package renderer provides rendering functionality for ER diagrams
- package renderer
- import (
- "fmt"
- "strings"
- "mermaid-go/pkg/ast"
- )
- // ERRenderer renders ER diagrams back to mermaid syntax
- type ERRenderer struct{}
- // NewERRenderer creates a new ER renderer
- func NewERRenderer() *ERRenderer {
- return &ERRenderer{}
- }
- // Render renders an ER diagram to mermaid syntax
- func (r *ERRenderer) Render(diagram *ast.ERDiagram) (string, error) {
- var builder strings.Builder
- // Start with diagram declaration
- builder.WriteString("erDiagram\n")
- // Add title if present
- if diagram.Title != nil {
- builder.WriteString(fmt.Sprintf(" title %s\n", *diagram.Title))
- }
- // Note: ERDiagram doesn't have a Direction field in the existing structure
- // Direction support could be added to the AST if needed
- // Render entities with attributes
- for _, entity := range diagram.Entities {
- if len(entity.Attributes) > 0 {
- builder.WriteString(" ")
- builder.WriteString(entity.Name)
- builder.WriteString(" {\n")
- for _, attr := range entity.Attributes {
- builder.WriteString(" ")
- builder.WriteString(attr.Type)
- builder.WriteString(" ")
- builder.WriteString(attr.Name)
- // Add key if present
- if attr.Key != nil {
- builder.WriteString(" ")
- builder.WriteString(string(*attr.Key))
- }
- // Add comment if present
- if attr.Comment != nil {
- builder.WriteString(" \"")
- builder.WriteString(*attr.Comment)
- builder.WriteString("\"")
- }
- builder.WriteString("\n")
- }
- builder.WriteString(" }\n")
- }
- }
- // Render relationships
- for _, rel := range diagram.Relations {
- builder.WriteString(" ")
- builder.WriteString(rel.From)
- builder.WriteString(" ")
- builder.WriteString(string(rel.Type))
- builder.WriteString(" ")
- builder.WriteString(rel.To)
- if rel.Label != nil {
- builder.WriteString(" : ")
- if strings.Contains(*rel.Label, " ") {
- builder.WriteString(fmt.Sprintf("\"%s\"", *rel.Label))
- } else {
- builder.WriteString(*rel.Label)
- }
- }
- builder.WriteString("\n")
- }
- return builder.String(), nil
- }
|