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,378 @@
1
+ = Packet diagrams
2
+ :toc:
3
+ :toclevels: 3
4
+
5
+ == Overview
6
+
7
+ Packet diagrams in Sirena visualize network packet structures and protocol formats. They show how data is organized within network packets, including field layouts, bit ranges, and data organization across multiple rows.
8
+
9
+ Packet diagrams are useful for:
10
+
11
+ * Documenting network protocol specifications
12
+ * Visualizing packet header structures
13
+ * Teaching network communication concepts
14
+ * Analyzing packet formats and field layouts
15
+ * Designing new network protocols
16
+ * Understanding data transmission formats
17
+
18
+ == Syntax specification
19
+
20
+ === Diagram declaration
21
+
22
+ Packet diagrams are declared using the `packet-beta` keyword:
23
+
24
+ [source,mermaid]
25
+ ----
26
+ packet-beta
27
+ <diagram-content>
28
+ ----
29
+
30
+ === Title
31
+
32
+ Packets can have a descriptive title:
33
+
34
+ [source,mermaid]
35
+ ----
36
+ packet-beta
37
+ title TCP Header Structure
38
+ ----
39
+
40
+ === Field definitions
41
+
42
+ Fields represent segments of the packet with bit ranges:
43
+
44
+ [source,mermaid]
45
+ ----
46
+ bit_start-bit_end: "Field Label"
47
+ ----
48
+
49
+ Where:
50
+
51
+ * `bit_start` - The starting bit position (0-based)
52
+ * `bit_end` - The ending bit position (inclusive)
53
+ * `Field Label` - Descriptive label for the field
54
+
55
+ ==== Bit range format
56
+
57
+ Bit ranges use the format `start-end`:
58
+
59
+ [source,mermaid]
60
+ ----
61
+ packet-beta
62
+ 0-7: "Source Port"
63
+ 8-15: "Destination Port"
64
+ 16-31: "Sequence Number"
65
+ ----
66
+
67
+ This defines:
68
+
69
+ * Bits 0-7 (8 bits): Source Port
70
+ * Bits 8-15 (8 bits): Destination Port
71
+ * Bits 16-31 (16 bits): Sequence Number
72
+
73
+ == Examples
74
+
75
+ === Basic packet structure
76
+
77
+ .Simple 32-bit packet
78
+ [example]
79
+ ====
80
+ [source,mermaid]
81
+ ----
82
+ packet-beta
83
+ title Hello world
84
+ 0-10: "hello"
85
+ ----
86
+
87
+ This creates a simple packet with:
88
+
89
+ * A title
90
+ * One field spanning bits 0-10
91
+ ====
92
+
93
+ === TCP header structure
94
+
95
+ .TCP packet header
96
+ [example]
97
+ ====
98
+ [source,mermaid]
99
+ ----
100
+ packet-beta
101
+ title TCP Header
102
+ 0-15: "Source Port"
103
+ 16-31: "Destination Port"
104
+ 32-63: "Sequence Number"
105
+ 64-95: "Acknowledgment Number"
106
+ 96-99: "Data Offset"
107
+ 100-105: "Reserved"
108
+ 106: "URG"
109
+ 107: "ACK"
110
+ 108: "PSH"
111
+ 109: "RST"
112
+ 110: "SYN"
113
+ 111: "FIN"
114
+ 112-127: "Window Size"
115
+ 128-143: "Checksum"
116
+ 144-159: "Urgent Pointer"
117
+ ----
118
+
119
+ This demonstrates:
120
+
121
+ * Standard TCP header fields
122
+ * Mix of different field sizes
123
+ * Single-bit flags (URG, ACK, etc.)
124
+ * Multi-byte fields (ports, sequence numbers)
125
+ ====
126
+
127
+ === IP packet header
128
+
129
+ .IPv4 packet header
130
+ [example]
131
+ ====
132
+ [source,mermaid]
133
+ ----
134
+ packet-beta
135
+ title IPv4 Header
136
+ 0-3: "Version"
137
+ 4-7: "IHL"
138
+ 8-13: "DSCP"
139
+ 14-15: "ECN"
140
+ 16-31: "Total Length"
141
+ 32-47: "Identification"
142
+ 48-50: "Flags"
143
+ 51-63: "Fragment Offset"
144
+ 64-71: "Time to Live"
145
+ 72-79: "Protocol"
146
+ 80-95: "Header Checksum"
147
+ 96-127: "Source IP Address"
148
+ 128-159: "Destination IP Address"
149
+ ----
150
+
151
+ This shows:
152
+
153
+ * IPv4 header structure
154
+ * Various field sizes from 2 bits to 32 bits
155
+ * Standard network protocol layout
156
+ ====
157
+
158
+ === UDP packet
159
+
160
+ .UDP datagram structure
161
+ [example]
162
+ ====
163
+ [source,mermaid]
164
+ ----
165
+ packet-beta
166
+ title UDP Datagram
167
+ 0-15: "Source Port"
168
+ 16-31: "Destination Port"
169
+ 32-47: "Length"
170
+ 48-63: "Checksum"
171
+ 64-95: "Data (first 32 bits)"
172
+ ----
173
+
174
+ This demonstrates:
175
+
176
+ * Simple UDP header
177
+ * Data section indicator
178
+ * Standard 32-bit row layout
179
+ ====
180
+
181
+ === Ethernet frame
182
+
183
+ .Ethernet frame structure
184
+ [example]
185
+ ====
186
+ [source,mermaid]
187
+ ----
188
+ packet-beta
189
+ title Ethernet Frame
190
+ 0-47: "Destination MAC"
191
+ 48-95: "Source MAC"
192
+ 96-111: "EtherType"
193
+ 112-143: "Payload (start)"
194
+ ----
195
+
196
+ This shows:
197
+
198
+ * MAC address fields (48 bits each)
199
+ * EtherType field
200
+ * Payload beginning
201
+ ====
202
+
203
+ == Features
204
+
205
+ === Flexible field sizes
206
+
207
+ Fields can span any number of bits:
208
+
209
+ [source,mermaid]
210
+ ----
211
+ packet-beta
212
+ 0-0: "Single bit"
213
+ 1-8: "8 bits"
214
+ 9-40: "32 bits"
215
+ 41-104: "64 bits"
216
+ ----
217
+
218
+ === Multi-row layout
219
+
220
+ Packets automatically wrap to multiple rows (typically 32 bits per row):
221
+
222
+ [source,mermaid]
223
+ ----
224
+ packet-beta
225
+ 0-31: "Row 1"
226
+ 32-63: "Row 2"
227
+ 64-95: "Row 3"
228
+ ----
229
+
230
+ === Automatic bit numbering
231
+
232
+ Bit positions are automatically labeled in the diagram for easy reference.
233
+
234
+ === Empty labels
235
+
236
+ Fields can have empty labels if needed:
237
+
238
+ [source,mermaid]
239
+ ----
240
+ packet-beta
241
+ 0-7: ""
242
+ 8-15: "Used Field"
243
+ ----
244
+
245
+ == Limitations
246
+
247
+ === Currently not supported
248
+
249
+ The following features are not yet supported in Sirena:
250
+
251
+ * Custom row widths (fixed at 32 bits per row)
252
+ * Color customization for specific fields
253
+ * Field descriptions beyond labels
254
+ * Nested or hierarchical field structures
255
+ * Variable-length fields
256
+ * Click events or interactive elements
257
+
258
+ === Known issues
259
+
260
+ * Very long field labels may be truncated
261
+ * Packets with many fields may become large
262
+ * Single-bit fields in crowded areas may be hard to read
263
+
264
+ == Best practices
265
+
266
+ === Use descriptive field names
267
+
268
+ Give fields clear, technical names:
269
+
270
+ [source,mermaid]
271
+ ----
272
+ %% Good
273
+ packet-beta
274
+ 0-3: "Version"
275
+ 4-7: "Header Length"
276
+
277
+ %% Less clear
278
+ packet-beta
279
+ 0-3: "V"
280
+ 4-7: "HL"
281
+ ----
282
+
283
+ === Include title for context
284
+
285
+ Always include a title identifying the packet type:
286
+
287
+ [source,mermaid]
288
+ ----
289
+ %% Good
290
+ packet-beta
291
+ title TCP Segment
292
+ ...
293
+
294
+ %% Missing context
295
+ packet-beta
296
+ 0-15: "Port"
297
+ ----
298
+
299
+ === Follow protocol standards
300
+
301
+ For standard protocols, use official field names:
302
+
303
+ [source,mermaid]
304
+ ----
305
+ %% Good - standard TCP terminology
306
+ packet-beta
307
+ title TCP Header
308
+ 0-15: "Source Port"
309
+ 16-31: "Destination Port"
310
+
311
+ %% Confusing - non-standard names
312
+ packet-beta
313
+ title TCP
314
+ 0-15: "From Port"
315
+ 16-31: "To Port"
316
+ ----
317
+
318
+ === Organize fields logically
319
+
320
+ Order fields as they appear in the actual packet:
321
+
322
+ [source,mermaid]
323
+ ----
324
+ %% Good - sequential order
325
+ packet-beta
326
+ 0-15: "Field A"
327
+ 16-31: "Field B"
328
+ 32-47: "Field C"
329
+
330
+ %% Confusing - out of order
331
+ packet-beta
332
+ 32-47: "Field C"
333
+ 0-15: "Field A"
334
+ 16-31: "Field B"
335
+ ----
336
+
337
+ === Document all header fields
338
+
339
+ Include all relevant header fields for completeness:
340
+
341
+ [source,mermaid]
342
+ ----
343
+ %% Good - complete header
344
+ packet-beta
345
+ title UDP Header
346
+ 0-15: "Source Port"
347
+ 16-31: "Destination Port"
348
+ 32-47: "Length"
349
+ 48-63: "Checksum"
350
+
351
+ %% Incomplete
352
+ packet-beta
353
+ title UDP Header
354
+ 0-15: "Source Port"
355
+ 16-31: "Destination Port"
356
+ ----
357
+
358
+ === Use standard bit numbering
359
+
360
+ Start from 0 and follow protocol specifications:
361
+
362
+ [source,mermaid]
363
+ ----
364
+ %% Good - standard 0-based numbering
365
+ packet-beta
366
+ 0-7: "First byte"
367
+ 8-15: "Second byte"
368
+
369
+ %% Confusing - 1-based
370
+ packet-beta
371
+ 1-8: "First byte"
372
+ 9-16: "Second byte"
373
+ ----
374
+
375
+ == Related documentation
376
+
377
+ * <<index.adoc#,Diagram types overview>>
378
+ * link:https://mermaid.js.org/syntax/packet.html[Official Mermaid packet documentation]
@@ -0,0 +1,335 @@
1
+ = Pie Chart Diagrams
2
+ :toc:
3
+ :toclevels: 3
4
+
5
+ == General
6
+
7
+ Pie chart diagrams visualize proportional data as circular segments. Each slice represents a portion of the whole, making it easy to see relative sizes and distributions at a glance.
8
+
9
+ The pie chart implementation in Sirena follows the established Parslet architecture with full support for:
10
+
11
+ * Multiple data slices with labels and values
12
+ * Optional title display
13
+ * Optional data value display (`showData` flag)
14
+ * Accessibility features (accTitle, accDescr)
15
+ * Decimal and negative values
16
+ * Theme integration for colors
17
+ * Case-insensitive syntax
18
+
19
+ == Architecture
20
+
21
+ The pie chart implementation consists of:
22
+
23
+ * [`Diagram::Pie`](../lib/sirena/diagram/pie.rb) - Model classes for pie charts
24
+ * [`Parser::Grammars::Pie`](../lib/sirena/parser/grammars/pie.rb) - Parslet grammar
25
+ * [`Parser::Transforms::Pie`](../lib/sirena/parser/transforms/pie.rb) - Parse tree transformer
26
+ * [`Parser::PieParser`](../lib/sirena/parser/pie.rb) - Main parser
27
+ * [`Transform::PieTransform`](../lib/sirena/transform/pie.rb) - Layout transformer
28
+ * [`Renderer::PieRenderer`](../lib/sirena/renderer/pie.rb) - SVG renderer
29
+
30
+ == Syntax
31
+
32
+ === Basic pie chart
33
+
34
+ The simplest pie chart requires only the `pie` keyword and data entries:
35
+
36
+ [source,mermaid]
37
+ ----
38
+ pie
39
+ "Apples" : 42
40
+ "Oranges" : 58
41
+ ----
42
+
43
+ === Pie chart with title
44
+
45
+ Add a title using the `title` keyword in the header:
46
+
47
+ [source,mermaid]
48
+ ----
49
+ pie title Sales Distribution
50
+ "Product A" : 45
51
+ "Product B" : 30
52
+ "Product C" : 25
53
+ ----
54
+
55
+ === Pie chart with data values displayed
56
+
57
+ Use the `showData` flag to display percentage values on labels:
58
+
59
+ [source,mermaid]
60
+ ----
61
+ pie showData
62
+ "Category A" : 100
63
+ "Category B" : 50
64
+ ----
65
+
66
+ Where,
67
+
68
+ `showData`:: Optional flag that enables display of data values and percentages on the chart.
69
+
70
+ === Data entries
71
+
72
+ Each data entry consists of a quoted label, colon, and numeric value:
73
+
74
+ [source,mermaid]
75
+ ----
76
+ pie
77
+ "Label Text" : 42.5
78
+ "Another Label" : 57.5
79
+ ----
80
+
81
+ Where,
82
+
83
+ `"Label Text"`:: The label for the slice, must be in quotes (single or double).
84
+ `value`:: Numeric value (integer or decimal), can be negative.
85
+
86
+ === Accessibility features
87
+
88
+ [[accessibility-features]]
89
+ ==== General
90
+
91
+ Pie charts support accessibility attributes for screen readers:
92
+
93
+ [source,mermaid]
94
+ ----
95
+ pie title Quarterly Report
96
+ accTitle: Q1-Q4 Sales Data
97
+ accDescr: Sales distribution across four quarters
98
+ "Q1" : 25
99
+ "Q2" : 30
100
+ "Q3" : 20
101
+ "Q4" : 25
102
+ ----
103
+
104
+ Where,
105
+
106
+ `accTitle`:: Accessible title for screen readers (single line).
107
+ `accDescr`:: Accessible description for screen readers.
108
+
109
+ ==== Multi-line descriptions
110
+
111
+ Accessibility descriptions can span multiple lines using braces:
112
+
113
+ [source,mermaid]
114
+ ----
115
+ pie title Annual Sales
116
+ accDescr {
117
+ This chart shows the annual sales distribution
118
+ across different product categories for 2024
119
+ }
120
+ "Electronics" : 40
121
+ "Clothing" : 35
122
+ "Food" : 25
123
+ ----
124
+
125
+ === Comments
126
+
127
+ Comments are supported using `%%`:
128
+
129
+ [source,mermaid]
130
+ ----
131
+ pie
132
+ %% This is a comment
133
+ "Item 1" : 60
134
+ %% Another comment
135
+ "Item 2" : 40
136
+ ----
137
+
138
+ == Model Structure
139
+
140
+ The pie chart uses a hierarchical model structure:
141
+
142
+ [source]
143
+ ----
144
+ Diagram::Pie
145
+ ├── title (String, optional)
146
+ ├── show_data (Boolean, default: false)
147
+ ├── acc_title (String, optional)
148
+ ├── acc_description (String, optional)
149
+ └── slices (Array<PieSlice>)
150
+ └── PieSlice
151
+ ├── label (String)
152
+ └── value (Float)
153
+ ----
154
+
155
+ .Example of a pie chart model with assigned values
156
+ ====
157
+ [source]
158
+ ----
159
+ Pie
160
+ ├── title = "Sales Report"
161
+ ├── show_data = true
162
+ ├── slices
163
+ │ ├── PieSlice
164
+ │ │ ├── label = "Product A"
165
+ │ │ └── value = 45.0
166
+ │ ├── PieSlice
167
+ │ │ ├── label = "Product B"
168
+ │ │ └── value = 30.0
169
+ │ └── PieSlice
170
+ │ ├── label = "Product C"
171
+ │ └── value = 25.0
172
+ └── total_value = 100.0
173
+ ----
174
+ ====
175
+
176
+ == Rendering
177
+
178
+ === Layout calculation
179
+
180
+ The renderer calculates:
181
+
182
+ 1. **Percentages**: Each slice's percentage of the total
183
+ 2. **Angles**: Each slice's angle in degrees (0-360)
184
+ 3. **Positions**: Label positions around the circle
185
+ 4. **Colors**: Colors from theme or default palette
186
+
187
+ .Angle calculation
188
+ ====
189
+ Given slices with values [45, 30, 25]:
190
+
191
+ * Total value: 100
192
+ * Slice 1: (45/100) × 360° = 162°
193
+ * Slice 2: (30/100) × 360° = 108°
194
+ * Slice 3: (25/100) × 360° = 90°
195
+ ====
196
+
197
+ === SVG generation
198
+
199
+ The renderer creates:
200
+
201
+ * SVG path elements for each pie slice
202
+ * Text elements for labels
203
+ * Optional title text
204
+ * Optional percentage/value display
205
+
206
+ == Theme Integration
207
+
208
+ Pie charts use theme colors for slices and text:
209
+
210
+ [source,yaml]
211
+ ----
212
+ colors:
213
+ pie_slice_0: "#4472C4" # First slice color
214
+ pie_slice_1: "#ED7D31" # Second slice color
215
+ # ... additional slice colors
216
+ label_text: "#000000" # Label text color
217
+ node_stroke: "#ffffff" # Slice border color
218
+ ----
219
+
220
+ If theme doesn't specify pie slice colors, the renderer uses a default color palette that cycles through 12 colors.
221
+
222
+ == Advanced Features
223
+
224
+ === Decimal values
225
+
226
+ Pie charts support decimal values for precise proportions:
227
+
228
+ [source,mermaid]
229
+ ----
230
+ pie title Market Share
231
+ "Company A" : 42.7
232
+ "Company B" : 31.2
233
+ "Company C" : 26.1
234
+ ----
235
+
236
+ === Negative values
237
+
238
+ Negative values are allowed (though uncommon in pie charts):
239
+
240
+ [source,mermaid]
241
+ ----
242
+ pie
243
+ "Profit" : 100
244
+ "Loss" : -20
245
+ ----
246
+
247
+ === Empty diagrams
248
+
249
+ Empty pie charts (for testing) are valid:
250
+
251
+ [source,mermaid]
252
+ ----
253
+ pie
254
+ ----
255
+
256
+ === Case-insensitive syntax
257
+
258
+ The pie keyword is case-insensitive and accepts variants:
259
+
260
+ [source,mermaid]
261
+ ----
262
+ pie # lowercase
263
+ Pie # capitalized
264
+ pie chart # with 'chart' suffix
265
+ Pie Chart # fully capitalized
266
+ ----
267
+
268
+ == Examples
269
+
270
+ === Simple distribution
271
+
272
+ [source,mermaid]
273
+ ----
274
+ pie title Browser Usage
275
+ "Chrome" : 65
276
+ "Firefox" : 20
277
+ "Safari" : 10
278
+ "Others" : 5
279
+ ----
280
+
281
+ === Detailed report with data display
282
+
283
+ [source,mermaid]
284
+ ----
285
+ pie showData title Q4 Revenue by Region
286
+ "North America" : 45.2
287
+ "Europe" : 28.7
288
+ "Asia Pacific" : 18.3
289
+ "Latin America" : 5.4
290
+ "Other" : 2.4
291
+ ----
292
+
293
+ === Accessible chart
294
+
295
+ [source,mermaid]
296
+ ----
297
+ pie title Department Budget Allocation
298
+ accTitle: 2024 Budget Distribution
299
+ accDescr {
300
+ Budget allocation across departments.
301
+ Engineering receives the largest share at 40%
302
+ }
303
+ "Engineering" : 40
304
+ "Marketing" : 25
305
+ "Sales" : 20
306
+ "Operations" : 15
307
+ ----
308
+
309
+ == Testing
310
+
311
+ The pie chart implementation includes:
312
+
313
+ * 49 Mermaid test fixtures (100% passing)
314
+ * 13 RSpec tests covering all features
315
+ * Parser, transform, and renderer tests
316
+ * Edge case handling (empty diagrams, negative values, etc.)
317
+
318
+ Run tests with:
319
+
320
+ [source,shell]
321
+ ----
322
+ bundle exec rspec spec/sirena/parser/pie_spec.rb
323
+ ----
324
+
325
+ == Limitations
326
+
327
+ * Very small slices (< 1%) may have overlapping labels
328
+ * Extremely long labels may extend beyond the SVG bounds
329
+ * The renderer uses a fixed circular layout (no 3D or exploded slices)
330
+
331
+ == See Also
332
+
333
+ * link:index.adoc[Documentation Index]
334
+ * link:../lib/sirena/diagram/pie.rb[Pie Diagram Model]
335
+ * link:../lib/sirena/renderer/pie.rb[Pie Renderer]