| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293 |
- // Package renderer provides Gantt chart rendering
- package renderer
- import (
- "fmt"
- "strings"
- "mermaid-go/pkg/ast"
- )
- // GanttRenderer implements Gantt chart rendering
- type GanttRenderer struct{}
- // NewGanttRenderer creates a new Gantt renderer
- func NewGanttRenderer() *GanttRenderer {
- return &GanttRenderer{}
- }
- // Render renders a Gantt chart to mermaid syntax
- func (r *GanttRenderer) Render(diagram *ast.GanttDiagram) (string, error) {
- var result strings.Builder
- // Start with gantt declaration
- result.WriteString("gantt\n")
- // Add title if present
- if diagram.Title != nil {
- result.WriteString(fmt.Sprintf(" title %s\n", *diagram.Title))
- }
- // Add date format if present
- if diagram.DateFormat != "" {
- result.WriteString(fmt.Sprintf(" dateFormat %s\n", diagram.DateFormat))
- }
- // Add axis format if not default
- if diagram.AxisFormat != "" && diagram.AxisFormat != "%Y-%m-%d" {
- result.WriteString(fmt.Sprintf(" axisFormat %s\n", diagram.AxisFormat))
- }
- // Render sections and tasks
- if len(diagram.Sections) > 0 {
- for _, section := range diagram.Sections {
- result.WriteString(fmt.Sprintf(" section %s\n", section.Name))
- for _, task := range section.Tasks {
- r.renderTask(&result, task)
- }
- }
- } else {
- // Render tasks without sections
- for _, task := range diagram.Tasks {
- r.renderTask(&result, task)
- }
- }
- return result.String(), nil
- }
- // renderTask renders a single task
- func (r *GanttRenderer) renderTask(result *strings.Builder, task *ast.GanttTask) {
- result.WriteString(fmt.Sprintf(" %s : ", task.Name))
- // Add task data
- var taskData []string
- // Add dependencies first (task IDs)
- for _, dep := range task.Dependencies {
- taskData = append(taskData, dep)
- }
- // Add status if not default (only render explicit status)
- if task.Status != ast.GanttStatusActive {
- taskData = append(taskData, string(task.Status))
- }
- // Add start date
- if task.Start != nil {
- taskData = append(taskData, *task.Start)
- }
- // Add end date or duration
- if task.End != nil {
- taskData = append(taskData, *task.End)
- } else if task.Duration != nil {
- taskData = append(taskData, *task.Duration)
- }
- if len(taskData) > 0 {
- result.WriteString(strings.Join(taskData, " "))
- }
- result.WriteString("\n")
- }
|