main.go 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245
  1. package parser
  2. import (
  3. "fmt"
  4. "mermaid-go/pkg/ast"
  5. "mermaid-go/pkg/detector"
  6. )
  7. // MermaidParser is the main parser that can handle all diagram types
  8. type MermaidParser struct {
  9. detector *detector.DetectorRegistry
  10. }
  11. // NewMermaidParser creates a new main parser
  12. func NewMermaidParser() *MermaidParser {
  13. return &MermaidParser{
  14. detector: detector.NewDetectorRegistry(),
  15. }
  16. }
  17. // Parse parses mermaid text and returns the appropriate diagram AST
  18. func (p *MermaidParser) Parse(input string) (ast.Diagram, error) {
  19. // First, detect the diagram type
  20. diagramType := p.detector.DetectDiagramType(input)
  21. switch diagramType {
  22. case detector.DiagramTypeSequence:
  23. return p.parseSequence(input)
  24. case detector.DiagramTypeState, detector.DiagramTypeStateV2:
  25. return p.parseState(input)
  26. case detector.DiagramTypeFlowchart:
  27. return p.parseFlowchart(input)
  28. case detector.DiagramTypeClass:
  29. return p.parseClass(input)
  30. case detector.DiagramTypeER:
  31. return p.parseER(input)
  32. case detector.DiagramTypeGantt:
  33. return p.parseGantt(input)
  34. case detector.DiagramTypePie:
  35. return p.parsePie(input)
  36. case detector.DiagramTypeGit:
  37. return p.parseGit(input)
  38. case detector.DiagramTypeUserJourney:
  39. return p.parseUserJourney(input)
  40. case detector.DiagramTypeTimeline:
  41. return p.parseTimeline(input)
  42. case detector.DiagramTypeMindmap:
  43. return p.parseMindmap(input)
  44. case detector.DiagramTypeKanban:
  45. return p.parseKanban(input)
  46. case detector.DiagramTypeSankey:
  47. return p.parseSankey(input)
  48. case detector.DiagramTypeXYChart:
  49. return p.parseXYChart(input)
  50. case detector.DiagramTypeQuadrant:
  51. return p.parseQuadrant(input)
  52. case detector.DiagramTypeRequirement:
  53. return p.parseRequirement(input)
  54. case detector.DiagramTypeBlock:
  55. return p.parseBlock(input)
  56. case detector.DiagramTypeC4:
  57. return p.parseC4(input)
  58. case detector.DiagramTypeC4Context:
  59. return p.parseC4(input)
  60. case detector.DiagramTypeC4Container:
  61. return p.parseC4(input)
  62. case detector.DiagramTypeC4Component:
  63. return p.parseC4(input)
  64. case detector.DiagramTypeC4Dynamic:
  65. return p.parseC4(input)
  66. case detector.DiagramTypeC4Deployment:
  67. return p.parseC4(input)
  68. case detector.DiagramTypeArchitecture:
  69. return p.parseArchitecture(input)
  70. case detector.DiagramTypeRadar:
  71. return p.parseRadar(input)
  72. case detector.DiagramTypeTreemap:
  73. return p.parseTreemap(input)
  74. case detector.DiagramTypePacket:
  75. return p.parsePacket(input)
  76. case detector.DiagramTypeInfo:
  77. return p.parseInfo(input)
  78. case detector.DiagramTypeOrganization:
  79. return p.parseOrganization(input)
  80. case detector.DiagramTypeBPMN:
  81. return p.parseBPMN(input)
  82. default:
  83. return nil, fmt.Errorf("unsupported diagram type: %s", diagramType)
  84. }
  85. }
  86. // GetDiagramType returns the detected diagram type without parsing
  87. func (p *MermaidParser) GetDiagramType(input string) detector.DiagramType {
  88. return p.detector.DetectDiagramType(input)
  89. }
  90. // parseSequence parses sequence diagrams
  91. func (p *MermaidParser) parseSequence(input string) (ast.Diagram, error) {
  92. parser := NewSequenceParser()
  93. return parser.Parse(input)
  94. }
  95. // parseState parses state diagrams
  96. func (p *MermaidParser) parseState(input string) (ast.Diagram, error) {
  97. parser := NewStateParser()
  98. return parser.Parse(input)
  99. }
  100. // parseFlowchart parses flowcharts
  101. func (p *MermaidParser) parseFlowchart(input string) (ast.Diagram, error) {
  102. parser := NewParser()
  103. return parser.Parse(input)
  104. }
  105. // parseClass parses class diagrams
  106. func (p *MermaidParser) parseClass(input string) (ast.Diagram, error) {
  107. parser := NewClassParser()
  108. return parser.Parse(input)
  109. }
  110. // parseER parses ER diagrams
  111. func (p *MermaidParser) parseER(input string) (ast.Diagram, error) {
  112. parser := NewERParser()
  113. return parser.Parse(input)
  114. }
  115. // parseGantt parses Gantt charts
  116. func (p *MermaidParser) parseGantt(input string) (ast.Diagram, error) {
  117. parser := NewGanttParser()
  118. return parser.Parse(input)
  119. }
  120. // parsePie parses pie charts
  121. func (p *MermaidParser) parsePie(input string) (ast.Diagram, error) {
  122. parser := NewPieParser()
  123. return parser.Parse(input)
  124. }
  125. // parseGit parses git graphs
  126. func (p *MermaidParser) parseGit(input string) (ast.Diagram, error) {
  127. parser := NewGitParser()
  128. return parser.Parse(input)
  129. }
  130. // parseUserJourney parses user journey diagrams
  131. func (p *MermaidParser) parseUserJourney(input string) (ast.Diagram, error) {
  132. parser := NewJourneyParser()
  133. return parser.Parse(input)
  134. }
  135. // parseTimeline parses timeline diagrams
  136. func (p *MermaidParser) parseTimeline(input string) (ast.Diagram, error) {
  137. parser := NewTimelineParser()
  138. return parser.Parse(input)
  139. }
  140. // parseMindmap parses mindmaps
  141. func (p *MermaidParser) parseMindmap(input string) (ast.Diagram, error) {
  142. parser := NewMindmapParser()
  143. return parser.Parse(input)
  144. }
  145. // parseKanban parses kanban diagrams
  146. func (p *MermaidParser) parseKanban(input string) (ast.Diagram, error) {
  147. parser := NewKanbanParser()
  148. return parser.Parse(input)
  149. }
  150. // parseSankey parses Sankey diagrams
  151. func (p *MermaidParser) parseSankey(input string) (ast.Diagram, error) {
  152. parser := NewSankeyParser()
  153. return parser.Parse(input)
  154. }
  155. // parseXYChart parses XY charts
  156. func (p *MermaidParser) parseXYChart(input string) (ast.Diagram, error) {
  157. parser := NewXYChartParser()
  158. return parser.Parse(input)
  159. }
  160. // parseQuadrant parses quadrant charts
  161. func (p *MermaidParser) parseQuadrant(input string) (ast.Diagram, error) {
  162. parser := NewQuadrantParser()
  163. return parser.Parse(input)
  164. }
  165. // parseRequirement parses requirement diagrams (placeholder implementation)
  166. func (p *MermaidParser) parseRequirement(input string) (ast.Diagram, error) {
  167. // TODO: Implement requirement diagram parser
  168. return nil, fmt.Errorf("requirement diagram parsing not yet implemented")
  169. }
  170. // parseBlock parses block diagrams (placeholder implementation)
  171. func (p *MermaidParser) parseBlock(input string) (ast.Diagram, error) {
  172. // TODO: Implement block diagram parser
  173. return nil, fmt.Errorf("block diagram parsing not yet implemented")
  174. }
  175. // parseC4 parses C4 diagrams
  176. func (p *MermaidParser) parseC4(input string) (ast.Diagram, error) {
  177. parser := NewC4Parser()
  178. return parser.Parse(input)
  179. }
  180. // parseArchitecture parses architecture diagrams
  181. func (p *MermaidParser) parseArchitecture(input string) (ast.Diagram, error) {
  182. parser := NewArchitectureParser()
  183. return parser.Parse(input)
  184. }
  185. // parseRadar parses radar charts
  186. func (p *MermaidParser) parseRadar(input string) (ast.Diagram, error) {
  187. parser := NewRadarParser()
  188. return parser.Parse(input)
  189. }
  190. // parseTreemap parses treemaps
  191. func (p *MermaidParser) parseTreemap(input string) (ast.Diagram, error) {
  192. parser := NewTreemapParser()
  193. return parser.Parse(input)
  194. }
  195. // parsePacket parses packet diagrams
  196. func (p *MermaidParser) parsePacket(input string) (ast.Diagram, error) {
  197. parser := NewPacketParser()
  198. return parser.Parse(input)
  199. }
  200. // parseInfo parses info diagrams
  201. func (p *MermaidParser) parseInfo(input string) (ast.Diagram, error) {
  202. parser := NewInfoParser()
  203. return parser.Parse(input)
  204. }
  205. // parseOrganization parses organization charts
  206. func (p *MermaidParser) parseOrganization(input string) (ast.Diagram, error) {
  207. parser := NewOrganizationParser()
  208. return parser.Parse(input)
  209. }
  210. // parseBPMN parses BPMN diagrams
  211. func (p *MermaidParser) parseBPMN(input string) (ast.Diagram, error) {
  212. parser := NewBPMNParser()
  213. return parser.Parse(input)
  214. }