| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245 |
- package parser
- import (
- "fmt"
- "mermaid-go/pkg/ast"
- "mermaid-go/pkg/detector"
- )
- // MermaidParser is the main parser that can handle all diagram types
- type MermaidParser struct {
- detector *detector.DetectorRegistry
- }
- // NewMermaidParser creates a new main parser
- func NewMermaidParser() *MermaidParser {
- return &MermaidParser{
- detector: detector.NewDetectorRegistry(),
- }
- }
- // Parse parses mermaid text and returns the appropriate diagram AST
- func (p *MermaidParser) Parse(input string) (ast.Diagram, error) {
- // First, detect the diagram type
- diagramType := p.detector.DetectDiagramType(input)
- switch diagramType {
- case detector.DiagramTypeSequence:
- return p.parseSequence(input)
- case detector.DiagramTypeState, detector.DiagramTypeStateV2:
- return p.parseState(input)
- case detector.DiagramTypeFlowchart:
- return p.parseFlowchart(input)
- case detector.DiagramTypeClass:
- return p.parseClass(input)
- case detector.DiagramTypeER:
- return p.parseER(input)
- case detector.DiagramTypeGantt:
- return p.parseGantt(input)
- case detector.DiagramTypePie:
- return p.parsePie(input)
- case detector.DiagramTypeGit:
- return p.parseGit(input)
- case detector.DiagramTypeUserJourney:
- return p.parseUserJourney(input)
- case detector.DiagramTypeTimeline:
- return p.parseTimeline(input)
- case detector.DiagramTypeMindmap:
- return p.parseMindmap(input)
- case detector.DiagramTypeKanban:
- return p.parseKanban(input)
- case detector.DiagramTypeSankey:
- return p.parseSankey(input)
- case detector.DiagramTypeXYChart:
- return p.parseXYChart(input)
- case detector.DiagramTypeQuadrant:
- return p.parseQuadrant(input)
- case detector.DiagramTypeRequirement:
- return p.parseRequirement(input)
- case detector.DiagramTypeBlock:
- return p.parseBlock(input)
- case detector.DiagramTypeC4:
- return p.parseC4(input)
- case detector.DiagramTypeC4Context:
- return p.parseC4(input)
- case detector.DiagramTypeC4Container:
- return p.parseC4(input)
- case detector.DiagramTypeC4Component:
- return p.parseC4(input)
- case detector.DiagramTypeC4Dynamic:
- return p.parseC4(input)
- case detector.DiagramTypeC4Deployment:
- return p.parseC4(input)
- case detector.DiagramTypeArchitecture:
- return p.parseArchitecture(input)
- case detector.DiagramTypeRadar:
- return p.parseRadar(input)
- case detector.DiagramTypeTreemap:
- return p.parseTreemap(input)
- case detector.DiagramTypePacket:
- return p.parsePacket(input)
- case detector.DiagramTypeInfo:
- return p.parseInfo(input)
- case detector.DiagramTypeOrganization:
- return p.parseOrganization(input)
- case detector.DiagramTypeBPMN:
- return p.parseBPMN(input)
- default:
- return nil, fmt.Errorf("unsupported diagram type: %s", diagramType)
- }
- }
- // GetDiagramType returns the detected diagram type without parsing
- func (p *MermaidParser) GetDiagramType(input string) detector.DiagramType {
- return p.detector.DetectDiagramType(input)
- }
- // parseSequence parses sequence diagrams
- func (p *MermaidParser) parseSequence(input string) (ast.Diagram, error) {
- parser := NewSequenceParser()
- return parser.Parse(input)
- }
- // parseState parses state diagrams
- func (p *MermaidParser) parseState(input string) (ast.Diagram, error) {
- parser := NewStateParser()
- return parser.Parse(input)
- }
- // parseFlowchart parses flowcharts
- func (p *MermaidParser) parseFlowchart(input string) (ast.Diagram, error) {
- parser := NewParser()
- return parser.Parse(input)
- }
- // parseClass parses class diagrams
- func (p *MermaidParser) parseClass(input string) (ast.Diagram, error) {
- parser := NewClassParser()
- return parser.Parse(input)
- }
- // parseER parses ER diagrams
- func (p *MermaidParser) parseER(input string) (ast.Diagram, error) {
- parser := NewERParser()
- return parser.Parse(input)
- }
- // parseGantt parses Gantt charts
- func (p *MermaidParser) parseGantt(input string) (ast.Diagram, error) {
- parser := NewGanttParser()
- return parser.Parse(input)
- }
- // parsePie parses pie charts
- func (p *MermaidParser) parsePie(input string) (ast.Diagram, error) {
- parser := NewPieParser()
- return parser.Parse(input)
- }
- // parseGit parses git graphs
- func (p *MermaidParser) parseGit(input string) (ast.Diagram, error) {
- parser := NewGitParser()
- return parser.Parse(input)
- }
- // parseUserJourney parses user journey diagrams
- func (p *MermaidParser) parseUserJourney(input string) (ast.Diagram, error) {
- parser := NewJourneyParser()
- return parser.Parse(input)
- }
- // parseTimeline parses timeline diagrams
- func (p *MermaidParser) parseTimeline(input string) (ast.Diagram, error) {
- parser := NewTimelineParser()
- return parser.Parse(input)
- }
- // parseMindmap parses mindmaps
- func (p *MermaidParser) parseMindmap(input string) (ast.Diagram, error) {
- parser := NewMindmapParser()
- return parser.Parse(input)
- }
- // parseKanban parses kanban diagrams
- func (p *MermaidParser) parseKanban(input string) (ast.Diagram, error) {
- parser := NewKanbanParser()
- return parser.Parse(input)
- }
- // parseSankey parses Sankey diagrams
- func (p *MermaidParser) parseSankey(input string) (ast.Diagram, error) {
- parser := NewSankeyParser()
- return parser.Parse(input)
- }
- // parseXYChart parses XY charts
- func (p *MermaidParser) parseXYChart(input string) (ast.Diagram, error) {
- parser := NewXYChartParser()
- return parser.Parse(input)
- }
- // parseQuadrant parses quadrant charts
- func (p *MermaidParser) parseQuadrant(input string) (ast.Diagram, error) {
- parser := NewQuadrantParser()
- return parser.Parse(input)
- }
- // parseRequirement parses requirement diagrams (placeholder implementation)
- func (p *MermaidParser) parseRequirement(input string) (ast.Diagram, error) {
- // TODO: Implement requirement diagram parser
- return nil, fmt.Errorf("requirement diagram parsing not yet implemented")
- }
- // parseBlock parses block diagrams (placeholder implementation)
- func (p *MermaidParser) parseBlock(input string) (ast.Diagram, error) {
- // TODO: Implement block diagram parser
- return nil, fmt.Errorf("block diagram parsing not yet implemented")
- }
- // parseC4 parses C4 diagrams
- func (p *MermaidParser) parseC4(input string) (ast.Diagram, error) {
- parser := NewC4Parser()
- return parser.Parse(input)
- }
- // parseArchitecture parses architecture diagrams
- func (p *MermaidParser) parseArchitecture(input string) (ast.Diagram, error) {
- parser := NewArchitectureParser()
- return parser.Parse(input)
- }
- // parseRadar parses radar charts
- func (p *MermaidParser) parseRadar(input string) (ast.Diagram, error) {
- parser := NewRadarParser()
- return parser.Parse(input)
- }
- // parseTreemap parses treemaps
- func (p *MermaidParser) parseTreemap(input string) (ast.Diagram, error) {
- parser := NewTreemapParser()
- return parser.Parse(input)
- }
- // parsePacket parses packet diagrams
- func (p *MermaidParser) parsePacket(input string) (ast.Diagram, error) {
- parser := NewPacketParser()
- return parser.Parse(input)
- }
- // parseInfo parses info diagrams
- func (p *MermaidParser) parseInfo(input string) (ast.Diagram, error) {
- parser := NewInfoParser()
- return parser.Parse(input)
- }
- // parseOrganization parses organization charts
- func (p *MermaidParser) parseOrganization(input string) (ast.Diagram, error) {
- parser := NewOrganizationParser()
- return parser.Parse(input)
- }
- // parseBPMN parses BPMN diagrams
- func (p *MermaidParser) parseBPMN(input string) (ast.Diagram, error) {
- parser := NewBPMNParser()
- return parser.Parse(input)
- }
|