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.
- checksums.yaml +7 -0
- data/.github/workflows/build_deploy.yml +59 -0
- data/.github/workflows/links.yml +85 -0
- data/.github/workflows/rake.yml +15 -0
- data/.github/workflows/release.yml +27 -0
- data/.gitignore +68 -0
- data/.rspec +3 -0
- data/.rubocop.yml +14 -0
- data/.rubocop_todo.yml +70 -0
- data/ARCHITECTURE.md +744 -0
- data/Gemfile +12 -0
- data/LICENSE +25 -0
- data/README.adoc +357 -0
- data/Rakefile +11 -0
- data/docs/.gitignore +1 -0
- data/docs/Gemfile +13 -0
- data/docs/_config.yml +182 -0
- data/docs/_diagram_types/architecture-diagram.adoc +314 -0
- data/docs/_diagram_types/block-diagram.adoc +345 -0
- data/docs/_diagram_types/c4-diagram.adoc +559 -0
- data/docs/_diagram_types/class-diagram.adoc +816 -0
- data/docs/_diagram_types/er-diagram.adoc +719 -0
- data/docs/_diagram_types/error-diagram.adoc +114 -0
- data/docs/_diagram_types/examples/flowchart-examples.adoc +29 -0
- data/docs/_diagram_types/flowchart.adoc +488 -0
- data/docs/_diagram_types/gantt-chart.adoc +502 -0
- data/docs/_diagram_types/git-graph.adoc +600 -0
- data/docs/_diagram_types/index.adoc +192 -0
- data/docs/_diagram_types/info-diagram.adoc +103 -0
- data/docs/_diagram_types/kanban-diagram.adoc +262 -0
- data/docs/_diagram_types/mindmap.adoc +603 -0
- data/docs/_diagram_types/packet-diagram.adoc +378 -0
- data/docs/_diagram_types/pie-chart.adoc +335 -0
- data/docs/_diagram_types/quadrant-chart.adoc +406 -0
- data/docs/_diagram_types/radar-chart.adoc +528 -0
- data/docs/_diagram_types/requirement-diagram.adoc +416 -0
- data/docs/_diagram_types/sankey-diagram.adoc +357 -0
- data/docs/_diagram_types/sequence-diagram.adoc +664 -0
- data/docs/_diagram_types/state-diagram.adoc +658 -0
- data/docs/_diagram_types/timeline.adoc +352 -0
- data/docs/_diagram_types/treemap-diagram.adoc +462 -0
- data/docs/_diagram_types/user-journey.adoc +602 -0
- data/docs/_features/index.adoc +129 -0
- data/docs/_guides/cli-reference.adoc +203 -0
- data/docs/_guides/index.adoc +56 -0
- data/docs/_guides/installation.adoc +100 -0
- data/docs/_guides/quick-start.adoc +132 -0
- data/docs/_pages/comparison.adoc +441 -0
- data/docs/_pages/compatibility.adoc +300 -0
- data/docs/_pages/index.adoc +39 -0
- data/docs/_references/index.adoc +103 -0
- data/docs/_tutorials/index.adoc +57 -0
- data/docs/index.adoc +166 -0
- data/docs/lychee.toml +54 -0
- data/examples/.gitignore +10 -0
- data/examples/README.adoc +196 -0
- data/examples/README.md +64 -0
- data/examples/architecture/01-basic-services.mmd +9 -0
- data/examples/architecture/01-basic-services.svg +37 -0
- data/examples/architecture/02-service-groups.mmd +16 -0
- data/examples/architecture/02-service-groups.svg +55 -0
- data/examples/architecture/README.adoc +79 -0
- data/examples/block/01-basic-blocks.mmd +13 -0
- data/examples/block/01-basic-blocks.svg +44 -0
- data/examples/block/02-block-shapes.mmd +13 -0
- data/examples/block/02-block-shapes.svg +47 -0
- data/examples/block/README.adoc +85 -0
- data/examples/c4/01-context-diagram.mmd +10 -0
- data/examples/c4/01-context-diagram.svg +45 -0
- data/examples/c4/02-container-diagram.mmd +24 -0
- data/examples/c4/02-container-diagram.svg +105 -0
- data/examples/c4/README.adoc +92 -0
- data/examples/class_diagram/01-basic-classes.mmd +61 -0
- data/examples/class_diagram/01-basic-classes.svg +117 -0
- data/examples/class_diagram/02-relationships.mmd +61 -0
- data/examples/class_diagram/02-relationships.svg +129 -0
- data/examples/class_diagram/README.adoc +93 -0
- data/examples/er_diagram/01-basic-entities.mmd +64 -0
- data/examples/er_diagram/01-basic-entities.svg +5 -0
- data/examples/er_diagram/02-cardinality.mmd +57 -0
- data/examples/er_diagram/02-cardinality.svg +125 -0
- data/examples/er_diagram/README.adoc +88 -0
- data/examples/error/01-basic-error.mmd +1 -0
- data/examples/error/01-basic-error.svg +13 -0
- data/examples/error/02-error-display.mmd +1 -0
- data/examples/error/02-error-display.svg +13 -0
- data/examples/error/README.adoc +71 -0
- data/examples/error_message_example.svg +13 -0
- data/examples/flowchart/00-original.mmd +13 -0
- data/examples/flowchart/00-original.svg +5 -0
- data/examples/flowchart/01-basic-flow.mmd +7 -0
- data/examples/flowchart/01-basic-flow.svg +52 -0
- data/examples/flowchart/01-basic-flow.yml +13 -0
- data/examples/flowchart/02*.svg +87 -0
- data/examples/flowchart/02-node-shapes.mmd +9 -0
- data/examples/flowchart/02-node-shapes.svg +33 -0
- data/examples/flowchart/03-edge-types.mmd +7 -0
- data/examples/flowchart/03-edge-types.svg +53 -0
- data/examples/flowchart/04-subgraphs.mmd +9 -0
- data/examples/flowchart/04-subgraphs.svg +33 -0
- data/examples/flowchart/05-styling.mmd +9 -0
- data/examples/flowchart/05-styling.svg +33 -0
- data/examples/flowchart/06-complex-flow.mmd +8 -0
- data/examples/flowchart/06-complex-flow.svg +59 -0
- data/examples/flowchart/README.adoc +167 -0
- data/examples/gantt/01-simple-timeline.* +14 -0
- data/examples/gantt/01-simple-timeline.mmd +6 -0
- data/examples/gantt/01-simple-timeline.svg +26 -0
- data/examples/gantt/02-task-dependencies.mmd +6 -0
- data/examples/gantt/02-task-dependencies.svg +26 -0
- data/examples/gantt/README.adoc +86 -0
- data/examples/git_graph/01-linear-history.mmd +12 -0
- data/examples/git_graph/01-linear-history.svg +26 -0
- data/examples/git_graph/02-branching.mmd +12 -0
- data/examples/git_graph/02-branching.svg +26 -0
- data/examples/git_graph/README.adoc +73 -0
- data/examples/info/02-showinfo.mmd +1 -0
- data/examples/info/02-showinfo.svg +10 -0
- data/examples/info/README.adoc +58 -0
- data/examples/info_showinfo_example.svg +10 -0
- data/examples/kanban/01-simple-board.mmd +8 -0
- data/examples/kanban/01-simple-board.svg +43 -0
- data/examples/kanban/02-workflow.mmd +8 -0
- data/examples/kanban/02-workflow.svg +43 -0
- data/examples/kanban/README.adoc +79 -0
- data/examples/mindmap/01-simple-tree.mmd +19 -0
- data/examples/mindmap/01-simple-tree.svg +61 -0
- data/examples/mindmap/02-knowledge-map.mmd +19 -0
- data/examples/mindmap/02-knowledge-map.svg +61 -0
- data/examples/mindmap/README.adoc +77 -0
- data/examples/packet/01-basic-packet.* +17 -0
- data/examples/packet/01-basic-packet.mmd +4 -0
- data/examples/packet/01-basic-packet.svg +82 -0
- data/examples/packet/README.adoc +58 -0
- data/examples/pie/01-simple-chart.mmd +5 -0
- data/examples/pie/01-simple-chart.svg +17 -0
- data/examples/pie/02-labeled-slices.mmd +6 -0
- data/examples/pie/02-labeled-slices.svg +19 -0
- data/examples/pie/README.adoc +75 -0
- data/examples/quadrant/01-basic-quadrant.mmd +13 -0
- data/examples/quadrant/01-basic-quadrant.svg +33 -0
- data/examples/quadrant/02-positioned-items.mmd +14 -0
- data/examples/quadrant/02-positioned-items.svg +35 -0
- data/examples/quadrant/README.adoc +84 -0
- data/examples/radar/01-simple-radar.* +5 -0
- data/examples/radar/01-simple-radar.mmd +3 -0
- data/examples/radar/01-simple-radar.svg +25 -0
- data/examples/radar/02-multiple-curves.mmd +4 -0
- data/examples/radar/02-multiple-curves.svg +43 -0
- data/examples/radar/README.adoc +75 -0
- data/examples/requirement/01-basic-requirements.mmd +23 -0
- data/examples/requirement/01-basic-requirements.svg +49 -0
- data/examples/requirement/02-risk-levels.mmd +23 -0
- data/examples/requirement/02-risk-levels.svg +49 -0
- data/examples/requirement/README.adoc +85 -0
- data/examples/sankey/01-simple-flow.mmd +7 -0
- data/examples/sankey/01-simple-flow.svg +34 -0
- data/examples/sankey/02-multi-stage.mmd +11 -0
- data/examples/sankey/02-multi-stage.svg +44 -0
- data/examples/sankey/README.adoc +74 -0
- data/examples/sequence/01-basic-sequence.mmd +27 -0
- data/examples/sequence/01-basic-sequence.svg +5 -0
- data/examples/sequence/02-activations.mmd +17 -0
- data/examples/sequence/02-activations.svg +78 -0
- data/examples/sequence/README.adoc +86 -0
- data/examples/state_diagram/01-simple-states.mmd +29 -0
- data/examples/state_diagram/01-simple-states.svg +5 -0
- data/examples/state_diagram/02-composite.mmd +19 -0
- data/examples/state_diagram/02-composite.svg +81 -0
- data/examples/state_diagram/README.adoc +90 -0
- data/examples/timeline/01-simple-timeline.mmd +11 -0
- data/examples/timeline/01-simple-timeline.svg +36 -0
- data/examples/timeline/02-periods.mmd +15 -0
- data/examples/timeline/02-periods.svg +47 -0
- data/examples/timeline/README.adoc +78 -0
- data/examples/treemap/01-basic-treemap.mmd +12 -0
- data/examples/treemap/01-basic-treemap.svg +59 -0
- data/examples/treemap/README.adoc +59 -0
- data/examples/user_journey/01-simple-journey.mmd +23 -0
- data/examples/user_journey/01-simple-journey.svg +5 -0
- data/examples/user_journey/02-multi-actor.mmd +18 -0
- data/examples/user_journey/02-multi-actor.svg +129 -0
- data/examples/user_journey/README.adoc +81 -0
- data/examples/xychart/01-line-chart.mmd +5 -0
- data/examples/xychart/01-line-chart.svg +43 -0
- data/examples/xychart/02-bar-chart.mmd +7 -0
- data/examples/xychart/02-bar-chart.svg +48 -0
- data/examples/xychart/README.adoc +80 -0
- data/exe/sirena +7 -0
- data/lib/sirena/cli.rb +138 -0
- data/lib/sirena/commands/batch.rb +117 -0
- data/lib/sirena/commands/render.rb +80 -0
- data/lib/sirena/commands/types.rb +29 -0
- data/lib/sirena/commands/version.rb +24 -0
- data/lib/sirena/diagram/architecture.rb +46 -0
- data/lib/sirena/diagram/base.rb +61 -0
- data/lib/sirena/diagram/block.rb +81 -0
- data/lib/sirena/diagram/c4.rb +328 -0
- data/lib/sirena/diagram/class_diagram.rb +385 -0
- data/lib/sirena/diagram/er_diagram.rb +238 -0
- data/lib/sirena/diagram/error.rb +38 -0
- data/lib/sirena/diagram/flowchart.rb +160 -0
- data/lib/sirena/diagram/gantt.rb +71 -0
- data/lib/sirena/diagram/git_graph.rb +36 -0
- data/lib/sirena/diagram/info.rb +38 -0
- data/lib/sirena/diagram/kanban.rb +178 -0
- data/lib/sirena/diagram/mindmap.rb +54 -0
- data/lib/sirena/diagram/packet.rb +79 -0
- data/lib/sirena/diagram/pie.rb +115 -0
- data/lib/sirena/diagram/quadrant.rb +138 -0
- data/lib/sirena/diagram/radar.rb +52 -0
- data/lib/sirena/diagram/requirement.rb +133 -0
- data/lib/sirena/diagram/sankey.rb +217 -0
- data/lib/sirena/diagram/sequence.rb +242 -0
- data/lib/sirena/diagram/state_diagram.rb +237 -0
- data/lib/sirena/diagram/timeline.rb +171 -0
- data/lib/sirena/diagram/treemap.rb +84 -0
- data/lib/sirena/diagram/user_journey.rb +149 -0
- data/lib/sirena/diagram/xy_chart.rb +76 -0
- data/lib/sirena/diagram.rb +8 -0
- data/lib/sirena/diagram_registry.rb +101 -0
- data/lib/sirena/engine.rb +292 -0
- data/lib/sirena/parser/architecture.rb +41 -0
- data/lib/sirena/parser/base.rb +41 -0
- data/lib/sirena/parser/block.rb +72 -0
- data/lib/sirena/parser/c4.rb +53 -0
- data/lib/sirena/parser/class_diagram.rb +63 -0
- data/lib/sirena/parser/er_diagram.rb +40 -0
- data/lib/sirena/parser/error.rb +49 -0
- data/lib/sirena/parser/flowchart.rb +71 -0
- data/lib/sirena/parser/gantt.rb +60 -0
- data/lib/sirena/parser/git_graph.rb +95 -0
- data/lib/sirena/parser/grammars/architecture.rb +145 -0
- data/lib/sirena/parser/grammars/block.rb +190 -0
- data/lib/sirena/parser/grammars/c4.rb +226 -0
- data/lib/sirena/parser/grammars/class_diagram.rb +284 -0
- data/lib/sirena/parser/grammars/common.rb +84 -0
- data/lib/sirena/parser/grammars/er_diagram.rb +114 -0
- data/lib/sirena/parser/grammars/error.rb +40 -0
- data/lib/sirena/parser/grammars/flowchart.rb +298 -0
- data/lib/sirena/parser/grammars/gantt.rb +252 -0
- data/lib/sirena/parser/grammars/git_graph.rb +167 -0
- data/lib/sirena/parser/grammars/info.rb +58 -0
- data/lib/sirena/parser/grammars/kanban.rb +83 -0
- data/lib/sirena/parser/grammars/mindmap.rb +115 -0
- data/lib/sirena/parser/grammars/packet.rb +73 -0
- data/lib/sirena/parser/grammars/pie.rb +128 -0
- data/lib/sirena/parser/grammars/quadrant.rb +199 -0
- data/lib/sirena/parser/grammars/radar.rb +150 -0
- data/lib/sirena/parser/grammars/requirement.rb +188 -0
- data/lib/sirena/parser/grammars/sankey.rb +104 -0
- data/lib/sirena/parser/grammars/sequence.rb +247 -0
- data/lib/sirena/parser/grammars/state_diagram.rb +172 -0
- data/lib/sirena/parser/grammars/timeline.rb +142 -0
- data/lib/sirena/parser/grammars/treemap.rb +120 -0
- data/lib/sirena/parser/grammars/xy_chart.rb +120 -0
- data/lib/sirena/parser/info.rb +49 -0
- data/lib/sirena/parser/kanban.rb +97 -0
- data/lib/sirena/parser/mindmap.rb +106 -0
- data/lib/sirena/parser/packet.rb +76 -0
- data/lib/sirena/parser/pie.rb +49 -0
- data/lib/sirena/parser/quadrant.rb +57 -0
- data/lib/sirena/parser/radar.rb +104 -0
- data/lib/sirena/parser/requirement.rb +70 -0
- data/lib/sirena/parser/sankey.rb +64 -0
- data/lib/sirena/parser/sequence.rb +51 -0
- data/lib/sirena/parser/state_diagram.rb +69 -0
- data/lib/sirena/parser/timeline.rb +57 -0
- data/lib/sirena/parser/transforms/architecture.rb +97 -0
- data/lib/sirena/parser/transforms/block.rb +254 -0
- data/lib/sirena/parser/transforms/c4.rb +347 -0
- data/lib/sirena/parser/transforms/class_diagram.rb +352 -0
- data/lib/sirena/parser/transforms/er_diagram.rb +169 -0
- data/lib/sirena/parser/transforms/error.rb +58 -0
- data/lib/sirena/parser/transforms/flowchart.rb +293 -0
- data/lib/sirena/parser/transforms/gantt.rb +215 -0
- data/lib/sirena/parser/transforms/git_graph.rb +160 -0
- data/lib/sirena/parser/transforms/info.rb +58 -0
- data/lib/sirena/parser/transforms/kanban.rb +176 -0
- data/lib/sirena/parser/transforms/mindmap.rb +227 -0
- data/lib/sirena/parser/transforms/packet.rb +63 -0
- data/lib/sirena/parser/transforms/pie.rb +143 -0
- data/lib/sirena/parser/transforms/quadrant.rb +177 -0
- data/lib/sirena/parser/transforms/radar.rb +126 -0
- data/lib/sirena/parser/transforms/requirement.rb +272 -0
- data/lib/sirena/parser/transforms/sankey.rb +122 -0
- data/lib/sirena/parser/transforms/sequence.rb +342 -0
- data/lib/sirena/parser/transforms/state_diagram.rb +292 -0
- data/lib/sirena/parser/transforms/timeline.rb +177 -0
- data/lib/sirena/parser/transforms/treemap.rb +81 -0
- data/lib/sirena/parser/transforms/xy_chart.rb +132 -0
- data/lib/sirena/parser/treemap.rb +98 -0
- data/lib/sirena/parser/user_journey.rb +120 -0
- data/lib/sirena/parser/xy_chart.rb +114 -0
- data/lib/sirena/parser.rb +8 -0
- data/lib/sirena/renderer/architecture.rb +251 -0
- data/lib/sirena/renderer/base.rb +251 -0
- data/lib/sirena/renderer/block.rb +286 -0
- data/lib/sirena/renderer/c4.rb +490 -0
- data/lib/sirena/renderer/class_diagram.rb +499 -0
- data/lib/sirena/renderer/er_diagram.rb +417 -0
- data/lib/sirena/renderer/error.rb +131 -0
- data/lib/sirena/renderer/flowchart.rb +301 -0
- data/lib/sirena/renderer/gantt.rb +331 -0
- data/lib/sirena/renderer/git_graph.rb +368 -0
- data/lib/sirena/renderer/info.rb +93 -0
- data/lib/sirena/renderer/kanban.rb +295 -0
- data/lib/sirena/renderer/mindmap.rb +396 -0
- data/lib/sirena/renderer/packet.rb +239 -0
- data/lib/sirena/renderer/pie.rb +235 -0
- data/lib/sirena/renderer/quadrant.rb +292 -0
- data/lib/sirena/renderer/radar.rb +323 -0
- data/lib/sirena/renderer/requirement.rb +371 -0
- data/lib/sirena/renderer/sankey.rb +255 -0
- data/lib/sirena/renderer/sequence.rb +424 -0
- data/lib/sirena/renderer/state_diagram.rb +328 -0
- data/lib/sirena/renderer/timeline.rb +304 -0
- data/lib/sirena/renderer/treemap.rb +152 -0
- data/lib/sirena/renderer/user_journey.rb +331 -0
- data/lib/sirena/renderer/xy_chart.rb +452 -0
- data/lib/sirena/renderer.rb +8 -0
- data/lib/sirena/svg/circle.rb +41 -0
- data/lib/sirena/svg/document.rb +103 -0
- data/lib/sirena/svg/element.rb +65 -0
- data/lib/sirena/svg/ellipse.rb +33 -0
- data/lib/sirena/svg/group.rb +71 -0
- data/lib/sirena/svg/line.rb +49 -0
- data/lib/sirena/svg/path.rb +76 -0
- data/lib/sirena/svg/polygon.rb +43 -0
- data/lib/sirena/svg/polyline.rb +35 -0
- data/lib/sirena/svg/rect.rb +57 -0
- data/lib/sirena/svg/style.rb +44 -0
- data/lib/sirena/svg/text.rb +72 -0
- data/lib/sirena/svg.rb +19 -0
- data/lib/sirena/text_measurement.rb +71 -0
- data/lib/sirena/theme/builtin/dark.yml +70 -0
- data/lib/sirena/theme/builtin/default.yml +80 -0
- data/lib/sirena/theme/builtin/high_contrast.yml +70 -0
- data/lib/sirena/theme/builtin/light.yml +70 -0
- data/lib/sirena/theme/color_palette.rb +48 -0
- data/lib/sirena/theme/effect_styles.rb +28 -0
- data/lib/sirena/theme/registry.rb +41 -0
- data/lib/sirena/theme/shape_styles.rb +28 -0
- data/lib/sirena/theme/spacing_config.rb +24 -0
- data/lib/sirena/theme/typography.rb +30 -0
- data/lib/sirena/theme.rb +69 -0
- data/lib/sirena/transform/architecture.rb +273 -0
- data/lib/sirena/transform/base.rb +199 -0
- data/lib/sirena/transform/block.rb +215 -0
- data/lib/sirena/transform/c4.rb +288 -0
- data/lib/sirena/transform/class_diagram.rb +296 -0
- data/lib/sirena/transform/er_diagram.rb +204 -0
- data/lib/sirena/transform/error.rb +39 -0
- data/lib/sirena/transform/flowchart.rb +161 -0
- data/lib/sirena/transform/gantt.rb +253 -0
- data/lib/sirena/transform/git_graph.rb +283 -0
- data/lib/sirena/transform/info.rb +39 -0
- data/lib/sirena/transform/kanban.rb +180 -0
- data/lib/sirena/transform/mindmap.rb +251 -0
- data/lib/sirena/transform/packet.rb +185 -0
- data/lib/sirena/transform/pie.rb +62 -0
- data/lib/sirena/transform/quadrant.rb +167 -0
- data/lib/sirena/transform/radar.rb +227 -0
- data/lib/sirena/transform/requirement.rb +233 -0
- data/lib/sirena/transform/sankey.rb +212 -0
- data/lib/sirena/transform/sequence.rb +143 -0
- data/lib/sirena/transform/state_diagram.rb +228 -0
- data/lib/sirena/transform/timeline.rb +139 -0
- data/lib/sirena/transform/treemap.rb +120 -0
- data/lib/sirena/transform/user_journey.rb +207 -0
- data/lib/sirena/transform/xy_chart.rb +273 -0
- data/lib/sirena/transform.rb +8 -0
- data/lib/sirena/version.rb +5 -0
- data/lib/sirena.rb +328 -0
- data/lib/tasks/benchmark.rake +532 -0
- data/lib/tasks/examples.rake +468 -0
- data/lib/tasks/generate_mermaid_fixtures.rake +363 -0
- data/lib/tasks/mermaid_fixtures.rake +46 -0
- data/scripts/extract_mermaid_tests.rb +493 -0
- data/scripts/rename_to_sirena.rb +73 -0
- data/sirena.gemspec +47 -0
- 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
|