// 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") }