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,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]
|