sirena 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (382) hide show
  1. checksums.yaml +7 -0
  2. data/.github/workflows/build_deploy.yml +59 -0
  3. data/.github/workflows/links.yml +85 -0
  4. data/.github/workflows/rake.yml +15 -0
  5. data/.github/workflows/release.yml +27 -0
  6. data/.gitignore +68 -0
  7. data/.rspec +3 -0
  8. data/.rubocop.yml +14 -0
  9. data/.rubocop_todo.yml +70 -0
  10. data/ARCHITECTURE.md +744 -0
  11. data/Gemfile +12 -0
  12. data/LICENSE +25 -0
  13. data/README.adoc +357 -0
  14. data/Rakefile +11 -0
  15. data/docs/.gitignore +1 -0
  16. data/docs/Gemfile +13 -0
  17. data/docs/_config.yml +182 -0
  18. data/docs/_diagram_types/architecture-diagram.adoc +314 -0
  19. data/docs/_diagram_types/block-diagram.adoc +345 -0
  20. data/docs/_diagram_types/c4-diagram.adoc +559 -0
  21. data/docs/_diagram_types/class-diagram.adoc +816 -0
  22. data/docs/_diagram_types/er-diagram.adoc +719 -0
  23. data/docs/_diagram_types/error-diagram.adoc +114 -0
  24. data/docs/_diagram_types/examples/flowchart-examples.adoc +29 -0
  25. data/docs/_diagram_types/flowchart.adoc +488 -0
  26. data/docs/_diagram_types/gantt-chart.adoc +502 -0
  27. data/docs/_diagram_types/git-graph.adoc +600 -0
  28. data/docs/_diagram_types/index.adoc +192 -0
  29. data/docs/_diagram_types/info-diagram.adoc +103 -0
  30. data/docs/_diagram_types/kanban-diagram.adoc +262 -0
  31. data/docs/_diagram_types/mindmap.adoc +603 -0
  32. data/docs/_diagram_types/packet-diagram.adoc +378 -0
  33. data/docs/_diagram_types/pie-chart.adoc +335 -0
  34. data/docs/_diagram_types/quadrant-chart.adoc +406 -0
  35. data/docs/_diagram_types/radar-chart.adoc +528 -0
  36. data/docs/_diagram_types/requirement-diagram.adoc +416 -0
  37. data/docs/_diagram_types/sankey-diagram.adoc +357 -0
  38. data/docs/_diagram_types/sequence-diagram.adoc +664 -0
  39. data/docs/_diagram_types/state-diagram.adoc +658 -0
  40. data/docs/_diagram_types/timeline.adoc +352 -0
  41. data/docs/_diagram_types/treemap-diagram.adoc +462 -0
  42. data/docs/_diagram_types/user-journey.adoc +602 -0
  43. data/docs/_features/index.adoc +129 -0
  44. data/docs/_guides/cli-reference.adoc +203 -0
  45. data/docs/_guides/index.adoc +56 -0
  46. data/docs/_guides/installation.adoc +100 -0
  47. data/docs/_guides/quick-start.adoc +132 -0
  48. data/docs/_pages/comparison.adoc +441 -0
  49. data/docs/_pages/compatibility.adoc +300 -0
  50. data/docs/_pages/index.adoc +39 -0
  51. data/docs/_references/index.adoc +103 -0
  52. data/docs/_tutorials/index.adoc +57 -0
  53. data/docs/index.adoc +166 -0
  54. data/docs/lychee.toml +54 -0
  55. data/examples/.gitignore +10 -0
  56. data/examples/README.adoc +196 -0
  57. data/examples/README.md +64 -0
  58. data/examples/architecture/01-basic-services.mmd +9 -0
  59. data/examples/architecture/01-basic-services.svg +37 -0
  60. data/examples/architecture/02-service-groups.mmd +16 -0
  61. data/examples/architecture/02-service-groups.svg +55 -0
  62. data/examples/architecture/README.adoc +79 -0
  63. data/examples/block/01-basic-blocks.mmd +13 -0
  64. data/examples/block/01-basic-blocks.svg +44 -0
  65. data/examples/block/02-block-shapes.mmd +13 -0
  66. data/examples/block/02-block-shapes.svg +47 -0
  67. data/examples/block/README.adoc +85 -0
  68. data/examples/c4/01-context-diagram.mmd +10 -0
  69. data/examples/c4/01-context-diagram.svg +45 -0
  70. data/examples/c4/02-container-diagram.mmd +24 -0
  71. data/examples/c4/02-container-diagram.svg +105 -0
  72. data/examples/c4/README.adoc +92 -0
  73. data/examples/class_diagram/01-basic-classes.mmd +61 -0
  74. data/examples/class_diagram/01-basic-classes.svg +117 -0
  75. data/examples/class_diagram/02-relationships.mmd +61 -0
  76. data/examples/class_diagram/02-relationships.svg +129 -0
  77. data/examples/class_diagram/README.adoc +93 -0
  78. data/examples/er_diagram/01-basic-entities.mmd +64 -0
  79. data/examples/er_diagram/01-basic-entities.svg +5 -0
  80. data/examples/er_diagram/02-cardinality.mmd +57 -0
  81. data/examples/er_diagram/02-cardinality.svg +125 -0
  82. data/examples/er_diagram/README.adoc +88 -0
  83. data/examples/error/01-basic-error.mmd +1 -0
  84. data/examples/error/01-basic-error.svg +13 -0
  85. data/examples/error/02-error-display.mmd +1 -0
  86. data/examples/error/02-error-display.svg +13 -0
  87. data/examples/error/README.adoc +71 -0
  88. data/examples/error_message_example.svg +13 -0
  89. data/examples/flowchart/00-original.mmd +13 -0
  90. data/examples/flowchart/00-original.svg +5 -0
  91. data/examples/flowchart/01-basic-flow.mmd +7 -0
  92. data/examples/flowchart/01-basic-flow.svg +52 -0
  93. data/examples/flowchart/01-basic-flow.yml +13 -0
  94. data/examples/flowchart/02*.svg +87 -0
  95. data/examples/flowchart/02-node-shapes.mmd +9 -0
  96. data/examples/flowchart/02-node-shapes.svg +33 -0
  97. data/examples/flowchart/03-edge-types.mmd +7 -0
  98. data/examples/flowchart/03-edge-types.svg +53 -0
  99. data/examples/flowchart/04-subgraphs.mmd +9 -0
  100. data/examples/flowchart/04-subgraphs.svg +33 -0
  101. data/examples/flowchart/05-styling.mmd +9 -0
  102. data/examples/flowchart/05-styling.svg +33 -0
  103. data/examples/flowchart/06-complex-flow.mmd +8 -0
  104. data/examples/flowchart/06-complex-flow.svg +59 -0
  105. data/examples/flowchart/README.adoc +167 -0
  106. data/examples/gantt/01-simple-timeline.* +14 -0
  107. data/examples/gantt/01-simple-timeline.mmd +6 -0
  108. data/examples/gantt/01-simple-timeline.svg +26 -0
  109. data/examples/gantt/02-task-dependencies.mmd +6 -0
  110. data/examples/gantt/02-task-dependencies.svg +26 -0
  111. data/examples/gantt/README.adoc +86 -0
  112. data/examples/git_graph/01-linear-history.mmd +12 -0
  113. data/examples/git_graph/01-linear-history.svg +26 -0
  114. data/examples/git_graph/02-branching.mmd +12 -0
  115. data/examples/git_graph/02-branching.svg +26 -0
  116. data/examples/git_graph/README.adoc +73 -0
  117. data/examples/info/02-showinfo.mmd +1 -0
  118. data/examples/info/02-showinfo.svg +10 -0
  119. data/examples/info/README.adoc +58 -0
  120. data/examples/info_showinfo_example.svg +10 -0
  121. data/examples/kanban/01-simple-board.mmd +8 -0
  122. data/examples/kanban/01-simple-board.svg +43 -0
  123. data/examples/kanban/02-workflow.mmd +8 -0
  124. data/examples/kanban/02-workflow.svg +43 -0
  125. data/examples/kanban/README.adoc +79 -0
  126. data/examples/mindmap/01-simple-tree.mmd +19 -0
  127. data/examples/mindmap/01-simple-tree.svg +61 -0
  128. data/examples/mindmap/02-knowledge-map.mmd +19 -0
  129. data/examples/mindmap/02-knowledge-map.svg +61 -0
  130. data/examples/mindmap/README.adoc +77 -0
  131. data/examples/packet/01-basic-packet.* +17 -0
  132. data/examples/packet/01-basic-packet.mmd +4 -0
  133. data/examples/packet/01-basic-packet.svg +82 -0
  134. data/examples/packet/README.adoc +58 -0
  135. data/examples/pie/01-simple-chart.mmd +5 -0
  136. data/examples/pie/01-simple-chart.svg +17 -0
  137. data/examples/pie/02-labeled-slices.mmd +6 -0
  138. data/examples/pie/02-labeled-slices.svg +19 -0
  139. data/examples/pie/README.adoc +75 -0
  140. data/examples/quadrant/01-basic-quadrant.mmd +13 -0
  141. data/examples/quadrant/01-basic-quadrant.svg +33 -0
  142. data/examples/quadrant/02-positioned-items.mmd +14 -0
  143. data/examples/quadrant/02-positioned-items.svg +35 -0
  144. data/examples/quadrant/README.adoc +84 -0
  145. data/examples/radar/01-simple-radar.* +5 -0
  146. data/examples/radar/01-simple-radar.mmd +3 -0
  147. data/examples/radar/01-simple-radar.svg +25 -0
  148. data/examples/radar/02-multiple-curves.mmd +4 -0
  149. data/examples/radar/02-multiple-curves.svg +43 -0
  150. data/examples/radar/README.adoc +75 -0
  151. data/examples/requirement/01-basic-requirements.mmd +23 -0
  152. data/examples/requirement/01-basic-requirements.svg +49 -0
  153. data/examples/requirement/02-risk-levels.mmd +23 -0
  154. data/examples/requirement/02-risk-levels.svg +49 -0
  155. data/examples/requirement/README.adoc +85 -0
  156. data/examples/sankey/01-simple-flow.mmd +7 -0
  157. data/examples/sankey/01-simple-flow.svg +34 -0
  158. data/examples/sankey/02-multi-stage.mmd +11 -0
  159. data/examples/sankey/02-multi-stage.svg +44 -0
  160. data/examples/sankey/README.adoc +74 -0
  161. data/examples/sequence/01-basic-sequence.mmd +27 -0
  162. data/examples/sequence/01-basic-sequence.svg +5 -0
  163. data/examples/sequence/02-activations.mmd +17 -0
  164. data/examples/sequence/02-activations.svg +78 -0
  165. data/examples/sequence/README.adoc +86 -0
  166. data/examples/state_diagram/01-simple-states.mmd +29 -0
  167. data/examples/state_diagram/01-simple-states.svg +5 -0
  168. data/examples/state_diagram/02-composite.mmd +19 -0
  169. data/examples/state_diagram/02-composite.svg +81 -0
  170. data/examples/state_diagram/README.adoc +90 -0
  171. data/examples/timeline/01-simple-timeline.mmd +11 -0
  172. data/examples/timeline/01-simple-timeline.svg +36 -0
  173. data/examples/timeline/02-periods.mmd +15 -0
  174. data/examples/timeline/02-periods.svg +47 -0
  175. data/examples/timeline/README.adoc +78 -0
  176. data/examples/treemap/01-basic-treemap.mmd +12 -0
  177. data/examples/treemap/01-basic-treemap.svg +59 -0
  178. data/examples/treemap/README.adoc +59 -0
  179. data/examples/user_journey/01-simple-journey.mmd +23 -0
  180. data/examples/user_journey/01-simple-journey.svg +5 -0
  181. data/examples/user_journey/02-multi-actor.mmd +18 -0
  182. data/examples/user_journey/02-multi-actor.svg +129 -0
  183. data/examples/user_journey/README.adoc +81 -0
  184. data/examples/xychart/01-line-chart.mmd +5 -0
  185. data/examples/xychart/01-line-chart.svg +43 -0
  186. data/examples/xychart/02-bar-chart.mmd +7 -0
  187. data/examples/xychart/02-bar-chart.svg +48 -0
  188. data/examples/xychart/README.adoc +80 -0
  189. data/exe/sirena +7 -0
  190. data/lib/sirena/cli.rb +138 -0
  191. data/lib/sirena/commands/batch.rb +117 -0
  192. data/lib/sirena/commands/render.rb +80 -0
  193. data/lib/sirena/commands/types.rb +29 -0
  194. data/lib/sirena/commands/version.rb +24 -0
  195. data/lib/sirena/diagram/architecture.rb +46 -0
  196. data/lib/sirena/diagram/base.rb +61 -0
  197. data/lib/sirena/diagram/block.rb +81 -0
  198. data/lib/sirena/diagram/c4.rb +328 -0
  199. data/lib/sirena/diagram/class_diagram.rb +385 -0
  200. data/lib/sirena/diagram/er_diagram.rb +238 -0
  201. data/lib/sirena/diagram/error.rb +38 -0
  202. data/lib/sirena/diagram/flowchart.rb +160 -0
  203. data/lib/sirena/diagram/gantt.rb +71 -0
  204. data/lib/sirena/diagram/git_graph.rb +36 -0
  205. data/lib/sirena/diagram/info.rb +38 -0
  206. data/lib/sirena/diagram/kanban.rb +178 -0
  207. data/lib/sirena/diagram/mindmap.rb +54 -0
  208. data/lib/sirena/diagram/packet.rb +79 -0
  209. data/lib/sirena/diagram/pie.rb +115 -0
  210. data/lib/sirena/diagram/quadrant.rb +138 -0
  211. data/lib/sirena/diagram/radar.rb +52 -0
  212. data/lib/sirena/diagram/requirement.rb +133 -0
  213. data/lib/sirena/diagram/sankey.rb +217 -0
  214. data/lib/sirena/diagram/sequence.rb +242 -0
  215. data/lib/sirena/diagram/state_diagram.rb +237 -0
  216. data/lib/sirena/diagram/timeline.rb +171 -0
  217. data/lib/sirena/diagram/treemap.rb +84 -0
  218. data/lib/sirena/diagram/user_journey.rb +149 -0
  219. data/lib/sirena/diagram/xy_chart.rb +76 -0
  220. data/lib/sirena/diagram.rb +8 -0
  221. data/lib/sirena/diagram_registry.rb +101 -0
  222. data/lib/sirena/engine.rb +292 -0
  223. data/lib/sirena/parser/architecture.rb +41 -0
  224. data/lib/sirena/parser/base.rb +41 -0
  225. data/lib/sirena/parser/block.rb +72 -0
  226. data/lib/sirena/parser/c4.rb +53 -0
  227. data/lib/sirena/parser/class_diagram.rb +63 -0
  228. data/lib/sirena/parser/er_diagram.rb +40 -0
  229. data/lib/sirena/parser/error.rb +49 -0
  230. data/lib/sirena/parser/flowchart.rb +71 -0
  231. data/lib/sirena/parser/gantt.rb +60 -0
  232. data/lib/sirena/parser/git_graph.rb +95 -0
  233. data/lib/sirena/parser/grammars/architecture.rb +145 -0
  234. data/lib/sirena/parser/grammars/block.rb +190 -0
  235. data/lib/sirena/parser/grammars/c4.rb +226 -0
  236. data/lib/sirena/parser/grammars/class_diagram.rb +284 -0
  237. data/lib/sirena/parser/grammars/common.rb +84 -0
  238. data/lib/sirena/parser/grammars/er_diagram.rb +114 -0
  239. data/lib/sirena/parser/grammars/error.rb +40 -0
  240. data/lib/sirena/parser/grammars/flowchart.rb +298 -0
  241. data/lib/sirena/parser/grammars/gantt.rb +252 -0
  242. data/lib/sirena/parser/grammars/git_graph.rb +167 -0
  243. data/lib/sirena/parser/grammars/info.rb +58 -0
  244. data/lib/sirena/parser/grammars/kanban.rb +83 -0
  245. data/lib/sirena/parser/grammars/mindmap.rb +115 -0
  246. data/lib/sirena/parser/grammars/packet.rb +73 -0
  247. data/lib/sirena/parser/grammars/pie.rb +128 -0
  248. data/lib/sirena/parser/grammars/quadrant.rb +199 -0
  249. data/lib/sirena/parser/grammars/radar.rb +150 -0
  250. data/lib/sirena/parser/grammars/requirement.rb +188 -0
  251. data/lib/sirena/parser/grammars/sankey.rb +104 -0
  252. data/lib/sirena/parser/grammars/sequence.rb +247 -0
  253. data/lib/sirena/parser/grammars/state_diagram.rb +172 -0
  254. data/lib/sirena/parser/grammars/timeline.rb +142 -0
  255. data/lib/sirena/parser/grammars/treemap.rb +120 -0
  256. data/lib/sirena/parser/grammars/xy_chart.rb +120 -0
  257. data/lib/sirena/parser/info.rb +49 -0
  258. data/lib/sirena/parser/kanban.rb +97 -0
  259. data/lib/sirena/parser/mindmap.rb +106 -0
  260. data/lib/sirena/parser/packet.rb +76 -0
  261. data/lib/sirena/parser/pie.rb +49 -0
  262. data/lib/sirena/parser/quadrant.rb +57 -0
  263. data/lib/sirena/parser/radar.rb +104 -0
  264. data/lib/sirena/parser/requirement.rb +70 -0
  265. data/lib/sirena/parser/sankey.rb +64 -0
  266. data/lib/sirena/parser/sequence.rb +51 -0
  267. data/lib/sirena/parser/state_diagram.rb +69 -0
  268. data/lib/sirena/parser/timeline.rb +57 -0
  269. data/lib/sirena/parser/transforms/architecture.rb +97 -0
  270. data/lib/sirena/parser/transforms/block.rb +254 -0
  271. data/lib/sirena/parser/transforms/c4.rb +347 -0
  272. data/lib/sirena/parser/transforms/class_diagram.rb +352 -0
  273. data/lib/sirena/parser/transforms/er_diagram.rb +169 -0
  274. data/lib/sirena/parser/transforms/error.rb +58 -0
  275. data/lib/sirena/parser/transforms/flowchart.rb +293 -0
  276. data/lib/sirena/parser/transforms/gantt.rb +215 -0
  277. data/lib/sirena/parser/transforms/git_graph.rb +160 -0
  278. data/lib/sirena/parser/transforms/info.rb +58 -0
  279. data/lib/sirena/parser/transforms/kanban.rb +176 -0
  280. data/lib/sirena/parser/transforms/mindmap.rb +227 -0
  281. data/lib/sirena/parser/transforms/packet.rb +63 -0
  282. data/lib/sirena/parser/transforms/pie.rb +143 -0
  283. data/lib/sirena/parser/transforms/quadrant.rb +177 -0
  284. data/lib/sirena/parser/transforms/radar.rb +126 -0
  285. data/lib/sirena/parser/transforms/requirement.rb +272 -0
  286. data/lib/sirena/parser/transforms/sankey.rb +122 -0
  287. data/lib/sirena/parser/transforms/sequence.rb +342 -0
  288. data/lib/sirena/parser/transforms/state_diagram.rb +292 -0
  289. data/lib/sirena/parser/transforms/timeline.rb +177 -0
  290. data/lib/sirena/parser/transforms/treemap.rb +81 -0
  291. data/lib/sirena/parser/transforms/xy_chart.rb +132 -0
  292. data/lib/sirena/parser/treemap.rb +98 -0
  293. data/lib/sirena/parser/user_journey.rb +120 -0
  294. data/lib/sirena/parser/xy_chart.rb +114 -0
  295. data/lib/sirena/parser.rb +8 -0
  296. data/lib/sirena/renderer/architecture.rb +251 -0
  297. data/lib/sirena/renderer/base.rb +251 -0
  298. data/lib/sirena/renderer/block.rb +286 -0
  299. data/lib/sirena/renderer/c4.rb +490 -0
  300. data/lib/sirena/renderer/class_diagram.rb +499 -0
  301. data/lib/sirena/renderer/er_diagram.rb +417 -0
  302. data/lib/sirena/renderer/error.rb +131 -0
  303. data/lib/sirena/renderer/flowchart.rb +301 -0
  304. data/lib/sirena/renderer/gantt.rb +331 -0
  305. data/lib/sirena/renderer/git_graph.rb +368 -0
  306. data/lib/sirena/renderer/info.rb +93 -0
  307. data/lib/sirena/renderer/kanban.rb +295 -0
  308. data/lib/sirena/renderer/mindmap.rb +396 -0
  309. data/lib/sirena/renderer/packet.rb +239 -0
  310. data/lib/sirena/renderer/pie.rb +235 -0
  311. data/lib/sirena/renderer/quadrant.rb +292 -0
  312. data/lib/sirena/renderer/radar.rb +323 -0
  313. data/lib/sirena/renderer/requirement.rb +371 -0
  314. data/lib/sirena/renderer/sankey.rb +255 -0
  315. data/lib/sirena/renderer/sequence.rb +424 -0
  316. data/lib/sirena/renderer/state_diagram.rb +328 -0
  317. data/lib/sirena/renderer/timeline.rb +304 -0
  318. data/lib/sirena/renderer/treemap.rb +152 -0
  319. data/lib/sirena/renderer/user_journey.rb +331 -0
  320. data/lib/sirena/renderer/xy_chart.rb +452 -0
  321. data/lib/sirena/renderer.rb +8 -0
  322. data/lib/sirena/svg/circle.rb +41 -0
  323. data/lib/sirena/svg/document.rb +103 -0
  324. data/lib/sirena/svg/element.rb +65 -0
  325. data/lib/sirena/svg/ellipse.rb +33 -0
  326. data/lib/sirena/svg/group.rb +71 -0
  327. data/lib/sirena/svg/line.rb +49 -0
  328. data/lib/sirena/svg/path.rb +76 -0
  329. data/lib/sirena/svg/polygon.rb +43 -0
  330. data/lib/sirena/svg/polyline.rb +35 -0
  331. data/lib/sirena/svg/rect.rb +57 -0
  332. data/lib/sirena/svg/style.rb +44 -0
  333. data/lib/sirena/svg/text.rb +72 -0
  334. data/lib/sirena/svg.rb +19 -0
  335. data/lib/sirena/text_measurement.rb +71 -0
  336. data/lib/sirena/theme/builtin/dark.yml +70 -0
  337. data/lib/sirena/theme/builtin/default.yml +80 -0
  338. data/lib/sirena/theme/builtin/high_contrast.yml +70 -0
  339. data/lib/sirena/theme/builtin/light.yml +70 -0
  340. data/lib/sirena/theme/color_palette.rb +48 -0
  341. data/lib/sirena/theme/effect_styles.rb +28 -0
  342. data/lib/sirena/theme/registry.rb +41 -0
  343. data/lib/sirena/theme/shape_styles.rb +28 -0
  344. data/lib/sirena/theme/spacing_config.rb +24 -0
  345. data/lib/sirena/theme/typography.rb +30 -0
  346. data/lib/sirena/theme.rb +69 -0
  347. data/lib/sirena/transform/architecture.rb +273 -0
  348. data/lib/sirena/transform/base.rb +199 -0
  349. data/lib/sirena/transform/block.rb +215 -0
  350. data/lib/sirena/transform/c4.rb +288 -0
  351. data/lib/sirena/transform/class_diagram.rb +296 -0
  352. data/lib/sirena/transform/er_diagram.rb +204 -0
  353. data/lib/sirena/transform/error.rb +39 -0
  354. data/lib/sirena/transform/flowchart.rb +161 -0
  355. data/lib/sirena/transform/gantt.rb +253 -0
  356. data/lib/sirena/transform/git_graph.rb +283 -0
  357. data/lib/sirena/transform/info.rb +39 -0
  358. data/lib/sirena/transform/kanban.rb +180 -0
  359. data/lib/sirena/transform/mindmap.rb +251 -0
  360. data/lib/sirena/transform/packet.rb +185 -0
  361. data/lib/sirena/transform/pie.rb +62 -0
  362. data/lib/sirena/transform/quadrant.rb +167 -0
  363. data/lib/sirena/transform/radar.rb +227 -0
  364. data/lib/sirena/transform/requirement.rb +233 -0
  365. data/lib/sirena/transform/sankey.rb +212 -0
  366. data/lib/sirena/transform/sequence.rb +143 -0
  367. data/lib/sirena/transform/state_diagram.rb +228 -0
  368. data/lib/sirena/transform/timeline.rb +139 -0
  369. data/lib/sirena/transform/treemap.rb +120 -0
  370. data/lib/sirena/transform/user_journey.rb +207 -0
  371. data/lib/sirena/transform/xy_chart.rb +273 -0
  372. data/lib/sirena/transform.rb +8 -0
  373. data/lib/sirena/version.rb +5 -0
  374. data/lib/sirena.rb +328 -0
  375. data/lib/tasks/benchmark.rake +532 -0
  376. data/lib/tasks/examples.rake +468 -0
  377. data/lib/tasks/generate_mermaid_fixtures.rake +363 -0
  378. data/lib/tasks/mermaid_fixtures.rake +46 -0
  379. data/scripts/extract_mermaid_tests.rb +493 -0
  380. data/scripts/rename_to_sirena.rb +73 -0
  381. data/sirena.gemspec +47 -0
  382. metadata +529 -0
@@ -0,0 +1,406 @@
1
+ = Quadrant Chart
2
+ :toc:
3
+ :toclevels: 3
4
+
5
+ == General
6
+
7
+ Quadrant charts visualize data points across four quadrants based on two axes. They are useful for categorizing items based on two independent variables, such as priority matrices, portfolio analysis, or strategic planning.
8
+
9
+ The quadrant chart implementation in Sirena follows the established 7-file Parslet architecture pattern, ensuring consistency with other diagram types.
10
+
11
+ == Architecture
12
+
13
+ === Components
14
+
15
+ The quadrant chart implementation consists of seven main components:
16
+
17
+ . **Diagram Model** ([`lib/sirena/diagram/quadrant.rb`](lib/sirena/diagram/quadrant.rb:1))
18
+ * `QuadrantChart` - Main diagram model
19
+ * `QuadrantPoint` - Individual data point with coordinates and styling
20
+
21
+ . **Parslet Grammar** ([`lib/sirena/parser/grammars/quadrant.rb`](lib/sirena/parser/grammars/quadrant.rb:1))
22
+ * Parses `quadrantChart` keyword
23
+ * Axis definitions with labels
24
+ * Quadrant labels (quadrant-1 through quadrant-4)
25
+ * Data points with [x, y] coordinates
26
+ * Point styling (radius, color, stroke)
27
+
28
+ . **Transform** ([`lib/sirena/parser/transforms/quadrant.rb`](lib/sirena/parser/transforms/quadrant.rb:1))
29
+ * Converts parse tree to QuadrantChart model
30
+ * Extracts title, axes, quadrant labels, and points
31
+
32
+ . **Parser** ([`lib/sirena/parser/quadrant.rb`](lib/sirena/parser/quadrant.rb:1))
33
+ * Orchestrates grammar and transform
34
+ * Provides error handling
35
+
36
+ . **Layout Transform** ([`lib/sirena/transform/quadrant.rb`](lib/sirena/transform/quadrant.rb:1))
37
+ * Calculates 2x2 grid layout
38
+ * Converts normalized coordinates (0-1) to SVG coordinates
39
+ * Positions points in 2D space
40
+
41
+ . **Renderer** ([`lib/sirena/renderer/quadrant.rb`](lib/sirena/renderer/quadrant.rb:1))
42
+ * Draws quadrant grid with colored backgrounds
43
+ * Renders center axes
44
+ * Adds axis labels and quadrant names
45
+ * Renders data points as circles with labels
46
+
47
+ . **Tests** ([`spec/sirena/parser/quadrant_spec.rb`](spec/sirena/parser/quadrant_spec.rb:1))
48
+ * Parser tests with 17 examples
49
+ * 10 fixture files from Mermaid test suite
50
+
51
+ === Data Flow
52
+
53
+ [source]
54
+ ----
55
+ Mermaid Source
56
+
57
+ Grammar (Parslet) → Parse Tree
58
+
59
+ Transform → QuadrantChart Model
60
+
61
+ Layout Transform → Graph Structure with SVG Coordinates
62
+
63
+ Renderer → SVG Document
64
+ ----
65
+
66
+ == Syntax
67
+
68
+ === Basic Structure
69
+
70
+ [source,mermaid]
71
+ ----
72
+ quadrantChart
73
+ title Chart Title
74
+ x-axis Low Value --> High Value
75
+ y-axis Low Impact --> High Impact
76
+ quadrant-1 Label for Top Right
77
+ quadrant-2 Label for Top Left
78
+ quadrant-3 Label for Bottom Left
79
+ quadrant-4 Label for Bottom Right
80
+ Item A: [0.3, 0.6]
81
+ Item B: [0.7, 0.8]
82
+ ----
83
+
84
+ === Quadrant Numbering
85
+
86
+ Quadrants are numbered 1-4:
87
+
88
+ * **Quadrant 1**: Top-right (x ≥ 0.5, y ≥ 0.5)
89
+ * **Quadrant 2**: Top-left (x < 0.5, y ≥ 0.5)
90
+ * **Quadrant 3**: Bottom-left (x < 0.5, y < 0.5)
91
+ * **Quadrant 4**: Bottom-right (x ≥ 0.5, y < 0.5)
92
+
93
+ === Coordinates
94
+
95
+ Data points use normalized coordinates in the range [0.0, 1.0]:
96
+
97
+ * X-axis: 0.0 (left) to 1.0 (right)
98
+ * Y-axis: 0.0 (bottom) to 1.0 (top)
99
+
100
+ [example]
101
+ ====
102
+ [source,mermaid]
103
+ ----
104
+ quadrantChart
105
+ x-axis Left --> Right
106
+ y-axis Bottom --> Top
107
+ Point A: [0.2, 0.8] # Top-left area
108
+ Point B: [0.8, 0.2] # Bottom-right area
109
+ ----
110
+ ====
111
+
112
+ == Features
113
+
114
+ === Title Declaration
115
+
116
+ Add a title to the chart using the `title` keyword.
117
+
118
+ .Adding a title
119
+ [example]
120
+ ====
121
+ [source,mermaid]
122
+ ----
123
+ quadrantChart
124
+ title Product Analysis Matrix
125
+ x-axis Low Cost --> High Cost
126
+ y-axis Low Value --> High Value
127
+ ----
128
+ ====
129
+
130
+ === Axis Labels
131
+
132
+ Define axis labels with start and end labels using the arrow syntax `-->`.
133
+
134
+ .Defining axis labels
135
+ [example]
136
+ ====
137
+ [source,mermaid]
138
+ ----
139
+ quadrantChart
140
+ x-axis Low Reach --> High Reach
141
+ y-axis Low Engagement --> High Engagement
142
+ ----
143
+ ====
144
+
145
+ .Using quoted labels with special characters
146
+ [example]
147
+ ====
148
+ [source,mermaid]
149
+ ----
150
+ quadrantChart
151
+ x-axis "Low Cost ❤" --> "High Cost"
152
+ y-axis "Low Value" --> "High Value"
153
+ ----
154
+ ====
155
+
156
+ === Quadrant Labels
157
+
158
+ Label each of the four quadrants using `quadrant-1` through `quadrant-4`.
159
+
160
+ .Setting quadrant labels
161
+ [example]
162
+ ====
163
+ [source,mermaid]
164
+ ----
165
+ quadrantChart
166
+ x-axis Left --> Right
167
+ y-axis Bottom --> Top
168
+ quadrant-1 Quick Wins
169
+ quadrant-2 Major Projects
170
+ quadrant-3 Fill Ins
171
+ quadrant-4 Hard Slogs
172
+ ----
173
+ ====
174
+
175
+ === Data Points
176
+
177
+ Add data points with normalized [x, y] coordinates.
178
+
179
+ .Basic data points
180
+ [example]
181
+ ====
182
+ [source,mermaid]
183
+ ----
184
+ quadrantChart
185
+ x-axis Left --> Right
186
+ y-axis Bottom --> Top
187
+ Campaign A: [0.3, 0.6]
188
+ Campaign B: [0.45, 0.23]
189
+ Campaign C: [0.57, 0.69]
190
+ ----
191
+ ====
192
+
193
+ === Point Styling
194
+
195
+ Customize point appearance with styling parameters.
196
+
197
+ .Point with radius
198
+ [example]
199
+ ====
200
+ [source,mermaid]
201
+ ----
202
+ quadrantChart
203
+ x-axis Left --> Right
204
+ y-axis Bottom --> Top
205
+ Product A: [0.5, 0.5] radius: 10
206
+ ----
207
+ ====
208
+
209
+ .Point with color and radius
210
+ [example]
211
+ ====
212
+ [source,mermaid]
213
+ ----
214
+ quadrantChart
215
+ x-axis Left --> Right
216
+ y-axis Bottom --> Top
217
+ Product B: [0.3, 0.7] radius: 8, color: #ff0000
218
+ ----
219
+ ====
220
+
221
+ .Point with all styling options
222
+ [example]
223
+ ====
224
+ [source,mermaid]
225
+ ----
226
+ quadrantChart
227
+ x-axis Left --> Right
228
+ y-axis Bottom --> Top
229
+ Product D: [0.1, 0.9] radius: 10, color: #ff0000, stroke-color: #00ff00, stroke-width: 3px
230
+ ----
231
+ ====
232
+
233
+ Available styling parameters:
234
+
235
+ radius:: Size of the point circle (default: 6)
236
+ color:: Fill color of the point (hex or named color)
237
+ stroke-color:: Border color of the point
238
+ stroke-width:: Width of the point border (can include "px" suffix)
239
+
240
+ == Complete Example
241
+
242
+ .Campaign reach and engagement analysis
243
+ [example]
244
+ ====
245
+ [source,mermaid]
246
+ ----
247
+ quadrantChart
248
+ title Reach and engagement of campaigns
249
+ x-axis Low Reach --> High Reach
250
+ y-axis Low Engagement --> High Engagement
251
+ quadrant-1 We should expand
252
+ quadrant-2 Need to promote
253
+ quadrant-3 Re-evaluate
254
+ quadrant-4 May be improved
255
+ Campaign A: [0.3, 0.6]
256
+ Campaign B: [0.45, 0.23]
257
+ Campaign C: [0.57, 0.69]
258
+ Campaign D: [0.78, 0.34]
259
+ Campaign E: [0.40, 0.34]
260
+ Campaign F: [0.35, 0.78]
261
+ ----
262
+
263
+ This produces a quadrant chart with:
264
+
265
+ * A title at the top
266
+ * X-axis labeled from "Low Reach" to "High Reach"
267
+ * Y-axis labeled from "Low Engagement" to "High Engagement"
268
+ * Four labeled quadrants with colored backgrounds
269
+ * Six campaign data points positioned by their coordinates
270
+ ====
271
+
272
+ == Theming
273
+
274
+ The quadrant chart renderer integrates with Sirena's theme system.
275
+
276
+ === Configurable Colors
277
+
278
+ The following theme colors are used:
279
+
280
+ label_text:: Text color for labels and titles
281
+ grid_line:: Color for axis lines and quadrant borders
282
+ node_stroke:: Default stroke color for points
283
+ primary:: Default color for Quadrant 1 points
284
+ secondary:: Default color for Quadrant 2 points
285
+ accent:: Default color for Quadrant 3 points
286
+ success:: Default color for Quadrant 4 points
287
+
288
+ === Typography
289
+
290
+ The renderer uses theme typography settings:
291
+
292
+ font_family:: Font family for all text
293
+ font_size_large:: Size for chart title (default: 18)
294
+ font_size_normal:: Size for quadrant labels (default: 14)
295
+ font_size_small:: Size for axis labels and point labels (default: 11-12)
296
+
297
+ === Quadrant Background Colors
298
+
299
+ Default quadrant colors (can be overridden in theme):
300
+
301
+ * Quadrant 1 (top-right): `#e3f2fd` (light blue)
302
+ * Quadrant 2 (top-left): `#fff3e0` (light orange)
303
+ * Quadrant 3 (bottom-left): `#f3e5f5` (light purple)
304
+ * Quadrant 4 (bottom-right): `#e8f5e9` (light green)
305
+
306
+ == Implementation Notes
307
+
308
+ === Model Architecture
309
+
310
+ The [`QuadrantChart`](lib/sirena/diagram/quadrant.rb:81) class inherits from [`Diagram::Base`](lib/sirena/diagram/base.rb:1) and uses Lutaml::Model for serialization.
311
+
312
+ Key methods:
313
+
314
+ * [`diagram_type`](lib/sirena/diagram/quadrant.rb:112) - Returns `:quadrant`
315
+ * [`valid?`](lib/sirena/diagram/quadrant.rb:123) - Validates all points
316
+ * [`points_by_quadrant`](lib/sirena/diagram/quadrant.rb:134) - Groups points by quadrant
317
+
318
+ The [`QuadrantPoint`](lib/sirena/diagram/quadrant.rb:12) class provides:
319
+
320
+ * [`valid?`](lib/sirena/diagram/quadrant.rb:37) - Ensures coordinates are in [0,1] range
321
+ * [`quadrant`](lib/sirena/diagram/quadrant.rb:53) - Determines which quadrant (1-4) the point is in
322
+
323
+ === Grammar Rules
324
+
325
+ The Parslet grammar in [`lib/sirena/parser/grammars/quadrant.rb`](lib/sirena/parser/grammars/quadrant.rb:1) handles:
326
+
327
+ * Optional title declarations
328
+ * X-axis and Y-axis with quoted or unquoted labels
329
+ * Quadrant labels (quadrant-1 through quadrant-4)
330
+ * Data points with coordinates and optional styling
331
+ * Class definitions (for future styling support)
332
+ * Comments
333
+
334
+ === Coordinate System
335
+
336
+ The transform converts normalized coordinates (0-1) to SVG coordinates:
337
+
338
+ * X-axis: `svg_x = margin + (x * chart_width)`
339
+ * Y-axis: `svg_y = margin + ((1.0 - y) * chart_height)` (inverted for SVG)
340
+
341
+ Default dimensions:
342
+
343
+ * Width: 800px
344
+ * Height: 600px
345
+ * Margin: 80px
346
+ * Chart area: 640x440px
347
+
348
+ === SVG Structure
349
+
350
+ The renderer creates SVG elements in this order:
351
+
352
+ . Title (if present)
353
+ . Quadrant background rectangles
354
+ . Center axis lines (vertical and horizontal)
355
+ . Axis labels (x-left, x-right, y-bottom, y-top)
356
+ . Quadrant labels
357
+ . Data points (circles)
358
+ . Point labels (text)
359
+
360
+ == Testing
361
+
362
+ The implementation includes comprehensive tests:
363
+
364
+ === Parser Tests
365
+
366
+ 17 test examples covering:
367
+
368
+ * Simple quadrant charts
369
+ * Multiple points
370
+ * Point styling parameters
371
+ * Quoted axis labels
372
+ * Minimal diagrams
373
+ * Quadrant determination
374
+ * All 10 Mermaid fixture files
375
+
376
+ Run tests with:
377
+
378
+ [source,shell]
379
+ ----
380
+ bundle exec rspec spec/sirena/parser/quadrant_spec.rb
381
+ ----
382
+
383
+ === Test Coverage
384
+
385
+ * ✅ All 10 Mermaid fixtures parse successfully
386
+ * ✅ All 10 fixtures render to valid SVG
387
+ * ✅ Point coordinates validated (0-1 range)
388
+ * ✅ Quadrant assignment correct for all points
389
+ * ✅ Styling parameters extracted properly
390
+
391
+ == Known Limitations
392
+
393
+ . Class definitions (`classDef`) are parsed but not yet applied to rendering
394
+ . Point labels may overlap if points are close together
395
+ . No automatic label positioning to avoid overlaps
396
+ . Fixed canvas dimensions (800x600)
397
+
398
+ == Future Enhancements
399
+
400
+ . Apply `classDef` styles to points
401
+ . Smart label positioning to avoid overlaps
402
+ . Configurable canvas dimensions
403
+ . Interactive tooltips for points
404
+ . Legend support
405
+ . Grid lines within quadrants
406
+ . Data value display on hover