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,462 @@
1
+ = Treemap diagrams
2
+ :toc:
3
+ :toclevels: 3
4
+
5
+ == Overview
6
+
7
+ Treemap diagrams in Sirena visualize hierarchical data using nested
8
+ rectangles. Each branch of the hierarchy is represented by a rectangle,
9
+ which is then subdivided by rectangles representing its children. The area
10
+ of each rectangle is proportional to a specified value dimension.
11
+
12
+ Treemap diagrams are useful for:
13
+
14
+ * Visualizing hierarchical data structures
15
+ * Displaying proportional relationships
16
+ * Showing nested categories and subcategories
17
+ * Analyzing file system structures
18
+ * Representing organizational hierarchies
19
+ * Displaying budget allocations
20
+
21
+ == Syntax specification
22
+
23
+ === Diagram declaration
24
+
25
+ Treemap diagrams are declared using either the `treemap` or `treemap-beta`
26
+ keyword:
27
+
28
+ [source,mermaid]
29
+ ----
30
+ treemap
31
+ <diagram-content>
32
+ ----
33
+
34
+ Or:
35
+
36
+ [source,mermaid]
37
+ ----
38
+ treemap-beta
39
+ <diagram-content>
40
+ ----
41
+
42
+ === Node definitions
43
+
44
+ Nodes represent elements in the hierarchy:
45
+
46
+ [source,mermaid]
47
+ ----
48
+ "Node Label"
49
+ "Child Node": value
50
+ ----
51
+
52
+ Where:
53
+
54
+ * Indentation (4 spaces) indicates parent-child relationships
55
+ * Labels are enclosed in double quotes
56
+ * Leaf nodes (endpoints) have numeric values
57
+ * Branch nodes (containers) contain other nodes
58
+
59
+ ==== Branch nodes
60
+
61
+ Branch nodes contain other nodes but don't have values:
62
+
63
+ [source,mermaid]
64
+ ----
65
+ treemap
66
+ "Category A"
67
+ "Item A1": 10
68
+ "Item A2": 20
69
+ ----
70
+
71
+ ==== Leaf nodes
72
+
73
+ Leaf nodes are endpoints with numeric values:
74
+
75
+ [source,mermaid]
76
+ ----
77
+ treemap
78
+ "Root"
79
+ "Leaf 1": 100
80
+ "Leaf 2": 200
81
+ ----
82
+
83
+ ==== Value separators
84
+
85
+ Values can be separated by either colon `:` or comma `,`:
86
+
87
+ [source,mermaid]
88
+ ----
89
+ treemap
90
+ "Root"
91
+ "With colon": 100
92
+ "With comma" , 200
93
+ ----
94
+
95
+ === Hierarchical structure
96
+
97
+ Use indentation to create nested hierarchies:
98
+
99
+ [source,mermaid]
100
+ ----
101
+ treemap-beta
102
+ "Level 1"
103
+ "Level 2"
104
+ "Level 3": 10
105
+ "Level 3B": 15
106
+ "Level 2B"
107
+ "Level 3C": 20
108
+ ----
109
+
110
+ Each level of indentation (4 spaces) represents one level deeper in the
111
+ hierarchy.
112
+
113
+ === Styling
114
+
115
+ ==== CSS classes
116
+
117
+ Nodes can be assigned CSS classes for custom styling:
118
+
119
+ [source,mermaid]
120
+ ----
121
+ treemap-beta
122
+ "Main"
123
+ "Important Node":::important
124
+ "Child": 10
125
+ "Secondary": 5:::secondary
126
+ ----
127
+
128
+ ==== Class definitions
129
+
130
+ Define custom styles with `classDef`:
131
+
132
+ [source,mermaid]
133
+ ----
134
+ treemap-beta
135
+ "Root"
136
+ "Important": 100:::important
137
+
138
+ classDef important fill:#f96,stroke:#333,stroke-width:2px;
139
+ classDef secondary fill:#6cf,stroke:#333,stroke-dasharray:5 5;
140
+ ----
141
+
142
+ === Metadata
143
+
144
+ ==== Title
145
+
146
+ Add a title to the diagram:
147
+
148
+ [source,mermaid]
149
+ ----
150
+ treemap
151
+ title Sales by Category
152
+ "Products"
153
+ "Electronics": 5000
154
+ "Clothing": 3000
155
+ ----
156
+
157
+ ==== Accessibility
158
+
159
+ Add accessibility metadata:
160
+
161
+ [source,mermaid]
162
+ ----
163
+ treemap
164
+ title My Treemap
165
+ accTitle: Accessible Title
166
+ accDescr: This is an accessible description
167
+ "Root"
168
+ "Child": 100
169
+ ----
170
+
171
+ == Examples
172
+
173
+ === Basic hierarchy
174
+
175
+ .Simple two-level treemap
176
+ [example]
177
+ ====
178
+ [source,mermaid]
179
+ ----
180
+ treemap
181
+ "Category A"
182
+ "Item A1": 10
183
+ "Item A2": 20
184
+ "Category B"
185
+ "Item B1": 15
186
+ "Item B2": 25
187
+ ----
188
+
189
+ This creates a treemap with:
190
+
191
+ * Two root categories (A and B)
192
+ * Each category containing two items
193
+ * Items sized proportionally to their values
194
+ ====
195
+
196
+ === Multi-level hierarchy
197
+
198
+ .Deep nested structure
199
+ [example]
200
+ ====
201
+ [source,mermaid]
202
+ ----
203
+ treemap-beta
204
+ "Level 1"
205
+ "Level 2A"
206
+ "Level 3A": 10
207
+ "Level 3B": 15
208
+ "Level 2B"
209
+ "Level 3C": 20
210
+ "Level 3D"
211
+ "Level 4A": 5
212
+ "Level 4B": 5
213
+ ----
214
+
215
+ This demonstrates:
216
+
217
+ * Four levels of nesting
218
+ * Mixed depth (some branches deeper than others)
219
+ * Proportional sizing at each level
220
+ ====
221
+
222
+ === File system visualization
223
+
224
+ .Disk space usage
225
+ [example]
226
+ ====
227
+ [source,mermaid]
228
+ ----
229
+ treemap
230
+ title Disk Space Usage
231
+ "Documents"
232
+ "Work": 250
233
+ "Personal": 180
234
+ "Archives": 500
235
+ "Media"
236
+ "Photos": 1200
237
+ "Videos": 3500
238
+ "Music": 450
239
+ "Applications"
240
+ "Development": 800
241
+ "Productivity": 350
242
+ "Games": 1500
243
+ ----
244
+
245
+ This shows:
246
+
247
+ * File system hierarchy
248
+ * Proportional space usage
249
+ * Multiple root folders
250
+ * Different category sizes
251
+ ====
252
+
253
+ === Budget allocation
254
+
255
+ .Department budget
256
+ [example]
257
+ ====
258
+ [source,mermaid]
259
+ ----
260
+ treemap-beta
261
+ title 2024 Budget Allocation
262
+ "Operations"
263
+ "Salaries": 500000
264
+ "Infrastructure": 200000
265
+ "Supplies": 50000
266
+ "Research"
267
+ "Equipment": 150000
268
+ "Personnel": 300000
269
+ "Materials": 75000
270
+ "Marketing"
271
+ "Advertising": 180000
272
+ "Events": 120000
273
+ "Digital": 90000
274
+ ----
275
+
276
+ This demonstrates:
277
+
278
+ * Budget breakdown by department
279
+ * Sub-category allocation
280
+ * Clear title for context
281
+ * Proportional visualization
282
+ ====
283
+
284
+ === With custom styling
285
+
286
+ .Styled treemap with priorities
287
+ [example]
288
+ ====
289
+ [source,mermaid]
290
+ ----
291
+ treemap-beta
292
+ title Project Tasks
293
+ "Development"
294
+ "Critical":::high
295
+ "Bug Fixes": 40
296
+ "Security": 30
297
+ "Normal"
298
+ "Features": 50
299
+ "Refactoring": 20
300
+ "Documentation":::low
301
+ "API Docs": 15
302
+ "User Guide": 25
303
+
304
+ classDef high fill:#f96,stroke:#333,stroke-width:3px;
305
+ classDef low fill:#6cf,stroke:#333,stroke-dasharray:5 5;
306
+ ----
307
+
308
+ This shows:
309
+
310
+ * Custom CSS classes for priority levels
311
+ * Styled rectangles for visual emphasis
312
+ * Mixed styled and default nodes
313
+ ====
314
+
315
+ == Features
316
+
317
+ === Proportional sizing
318
+
319
+ Node areas are automatically calculated proportional to their values or the
320
+ sum of their children's values.
321
+
322
+ === Automatic color coding
323
+
324
+ Nodes at different depth levels receive different colors automatically for
325
+ visual distinction.
326
+
327
+ === Hierarchical layout
328
+
329
+ The layout algorithm automatically positions nodes based on their hierarchy
330
+ and proportional values.
331
+
332
+ === Value aggregation
333
+
334
+ Parent nodes automatically calculate their total value from their children.
335
+
336
+ == Limitations
337
+
338
+ === Currently not supported
339
+
340
+ The following features are not yet supported in Sirena:
341
+
342
+ * Custom layout algorithms (squarify, slice-and-dice, etc.)
343
+ * Interactive drill-down
344
+ * Tooltips or hover effects
345
+ * Custom color schemes beyond CSS classes
346
+ * Percentage labels
347
+ * Click events
348
+
349
+ === Known issues
350
+
351
+ * Very long labels may be truncated
352
+ * Deep hierarchies (>4 levels) may become difficult to read
353
+ * Small values may produce tiny rectangles
354
+
355
+ == Best practices
356
+
357
+ === Use meaningful labels
358
+
359
+ Give nodes clear, descriptive labels:
360
+
361
+ [source,mermaid]
362
+ ----
363
+ %% Good
364
+ treemap
365
+ "Revenue by Product"
366
+ "Software Licenses": 50000
367
+ "Consulting Services": 30000
368
+
369
+ %% Less clear
370
+ treemap
371
+ "Data"
372
+ "A": 50000
373
+ "B": 30000
374
+ ----
375
+
376
+ === Include titles
377
+
378
+ Always add a title for context:
379
+
380
+ [source,mermaid]
381
+ ----
382
+ %% Good
383
+ treemap
384
+ title Q4 Sales by Region
385
+ ...
386
+
387
+ %% Missing context
388
+ treemap
389
+ ...
390
+ ----
391
+
392
+ === Balance depth
393
+
394
+ Avoid extremely deep hierarchies:
395
+
396
+ [source,mermaid]
397
+ ----
398
+ %% Good - 3 levels
399
+ treemap
400
+ "Continent"
401
+ "Country"
402
+ "City": 1000
403
+
404
+ %% Hard to visualize - 6+ levels
405
+ treemap
406
+ "Level 1"
407
+ "Level 2"
408
+ "Level 3"
409
+ "Level 4"
410
+ "Level 5"
411
+ "Level 6": 10
412
+ ----
413
+
414
+ === Use appropriate values
415
+
416
+ Ensure values are meaningful and proportional:
417
+
418
+ [source,mermaid]
419
+ ----
420
+ %% Good - represents actual data
421
+ treemap
422
+ "Sales"
423
+ "North": 15000
424
+ "South": 12000
425
+ "East": 18000
426
+
427
+ %% Misleading - arbitrary values
428
+ treemap
429
+ "Sales"
430
+ "North": 1
431
+ "South": 1
432
+ "East": 1
433
+ ----
434
+
435
+ === Group related items
436
+
437
+ Organize nodes logically:
438
+
439
+ [source,mermaid]
440
+ ----
441
+ %% Good - logical grouping
442
+ treemap
443
+ "Company"
444
+ "Engineering"
445
+ "Frontend": 25
446
+ "Backend": 30
447
+ "Sales"
448
+ "Direct": 40
449
+ "Channel": 35
450
+
451
+ %% Confusing - mixed grouping
452
+ treemap
453
+ "Company"
454
+ "Frontend": 25
455
+ "Sales": 40
456
+ "Backend": 30
457
+ ----
458
+
459
+ == Related documentation
460
+
461
+ * <<index.adoc#,Diagram types overview>>
462
+ * link:https://mermaid.js.org/syntax/treemap.html[Official Mermaid treemap documentation]