etassia 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/CHANGELOG.md +140 -0
- data/LICENSE +25 -0
- data/README.adoc +436 -0
- data/exe/etassia +7 -0
- data/lib/etassia/cli.rb +187 -0
- data/lib/etassia/commands/batch.rb +210 -0
- data/lib/etassia/commands/notation_loader.rb +22 -0
- data/lib/etassia/commands/render.rb +98 -0
- data/lib/etassia/commands/types.rb +33 -0
- data/lib/etassia/commands/version.rb +24 -0
- data/lib/etassia/corpus_type_names.rb +52 -0
- data/lib/etassia/diagram/architecture.rb +108 -0
- data/lib/etassia/diagram/base.rb +61 -0
- data/lib/etassia/diagram/block.rb +102 -0
- data/lib/etassia/diagram/c4.rb +337 -0
- data/lib/etassia/diagram/class_diagram.rb +466 -0
- data/lib/etassia/diagram/class_namespace.rb +17 -0
- data/lib/etassia/diagram/class_note.rb +17 -0
- data/lib/etassia/diagram/containment.rb +107 -0
- data/lib/etassia/diagram/er_diagram.rb +317 -0
- data/lib/etassia/diagram/error.rb +38 -0
- data/lib/etassia/diagram/flowchart.rb +419 -0
- data/lib/etassia/diagram/flowchart_label_text.rb +63 -0
- data/lib/etassia/diagram/gantt.rb +94 -0
- data/lib/etassia/diagram/generic_text.rb +30 -0
- data/lib/etassia/diagram/git_graph.rb +57 -0
- data/lib/etassia/diagram/info.rb +38 -0
- data/lib/etassia/diagram/kanban.rb +198 -0
- data/lib/etassia/diagram/mindmap.rb +71 -0
- data/lib/etassia/diagram/packet.rb +93 -0
- data/lib/etassia/diagram/pie.rb +115 -0
- data/lib/etassia/diagram/quadrant.rb +135 -0
- data/lib/etassia/diagram/radar.rb +65 -0
- data/lib/etassia/diagram/requirement.rb +168 -0
- data/lib/etassia/diagram/sankey.rb +217 -0
- data/lib/etassia/diagram/sequence.rb +299 -0
- data/lib/etassia/diagram/sequence_box.rb +18 -0
- data/lib/etassia/diagram/sequence_frame.rb +37 -0
- data/lib/etassia/diagram/sequence_frame_section.rb +23 -0
- data/lib/etassia/diagram/sequence_text.rb +69 -0
- data/lib/etassia/diagram/sequence_wrap.rb +23 -0
- data/lib/etassia/diagram/state_diagram.rb +282 -0
- data/lib/etassia/diagram/timeline.rb +183 -0
- data/lib/etassia/diagram/treemap.rb +95 -0
- data/lib/etassia/diagram/user_journey.rb +153 -0
- data/lib/etassia/diagram/xy_chart.rb +90 -0
- data/lib/etassia/diagram.rb +8 -0
- data/lib/etassia/diagram_registry.rb +34 -0
- data/lib/etassia/engine.rb +334 -0
- data/lib/etassia/error/diagram_type_error.rb +10 -0
- data/lib/etassia/error/layout_error.rb +12 -0
- data/lib/etassia/error/notation_registration_error.rb +10 -0
- data/lib/etassia/error/parse_error.rb +11 -0
- data/lib/etassia/error/pipeline_error.rb +10 -0
- data/lib/etassia/error/render_error.rb +12 -0
- data/lib/etassia/error/score_error.rb +12 -0
- data/lib/etassia/error.rb +10 -0
- data/lib/etassia/error_report.rb +69 -0
- data/lib/etassia/ir/data.rb +39 -0
- data/lib/etassia/ir/data_value.rb +35 -0
- data/lib/etassia/ir/dimension.rb +10 -0
- data/lib/etassia/ir/edge.rb +34 -0
- data/lib/etassia/ir/graph.rb +28 -0
- data/lib/etassia/ir/integrity.rb +80 -0
- data/lib/etassia/ir/item.rb +46 -0
- data/lib/etassia/ir/model.rb +56 -0
- data/lib/etassia/ir/node.rb +10 -0
- data/lib/etassia/ir/placement.rb +47 -0
- data/lib/etassia/ir/prepositioned.rb +25 -0
- data/lib/etassia/ir/prepositioned_item.rb +26 -0
- data/lib/etassia/ir/property_set.rb +43 -0
- data/lib/etassia/ir/scalar.rb +25 -0
- data/lib/etassia/ir/series.rb +10 -0
- data/lib/etassia/ir.rb +17 -0
- data/lib/etassia/js_math.rb +511 -0
- data/lib/etassia/js_number.rb +64 -0
- data/lib/etassia/layout/architecture.rb +1472 -0
- data/lib/etassia/layout/base.rb +276 -0
- data/lib/etassia/layout/block.rb +738 -0
- data/lib/etassia/layout/c4.rb +876 -0
- data/lib/etassia/layout/c4_boundary_metrics.rb +35 -0
- data/lib/etassia/layout/c4_bounds.rb +106 -0
- data/lib/etassia/layout/c4_intersection.rb +77 -0
- data/lib/etassia/layout/c4_placement.rb +135 -0
- data/lib/etassia/layout/c4_shape_metrics.rb +97 -0
- data/lib/etassia/layout/c4_shape_outline.rb +67 -0
- data/lib/etassia/layout/c4_stereotype.rb +30 -0
- data/lib/etassia/layout/c4_text.rb +54 -0
- data/lib/etassia/layout/class_cell_placement.rb +148 -0
- data/lib/etassia/layout/class_diagram.rb +1116 -0
- data/lib/etassia/layout/class_diagram_namespaces.rb +26 -0
- data/lib/etassia/layout/class_diagram_notes.rb +26 -0
- data/lib/etassia/layout/class_name_advances.rb +31 -0
- data/lib/etassia/layout/class_namespace_box.rb +21 -0
- data/lib/etassia/layout/class_namespace_nodes.rb +197 -0
- data/lib/etassia/layout/class_namespace_placement.rb +71 -0
- data/lib/etassia/layout/class_note.rb +44 -0
- data/lib/etassia/layout/class_note_nodes.rb +84 -0
- data/lib/etassia/layout/elk_notices.rb +48 -0
- data/lib/etassia/layout/elk_placement.rb +197 -0
- data/lib/etassia/layout/er_diagram.rb +1002 -0
- data/lib/etassia/layout/er_diagram_adjacency.rb +20 -0
- data/lib/etassia/layout/er_diagram_alignment.rb +72 -0
- data/lib/etassia/layout/er_diagram_compaction.rb +85 -0
- data/lib/etassia/layout/er_diagram_conflicts.rb +70 -0
- data/lib/etassia/layout/er_diagram_coordinates.rb +104 -0
- data/lib/etassia/layout/er_diagram_entity_size.rb +82 -0
- data/lib/etassia/layout/er_diagram_layering.rb +109 -0
- data/lib/etassia/layout/er_diagram_ordering.rb +143 -0
- data/lib/etassia/layout/er_diagram_placement.rb +163 -0
- data/lib/etassia/layout/er_diagram_placement_node.rb +22 -0
- data/lib/etassia/layout/error.rb +133 -0
- data/lib/etassia/layout/flowchart/brandes_koepf.rb +208 -0
- data/lib/etassia/layout/flowchart/cluster_reach.rb +70 -0
- data/lib/etassia/layout/flowchart/component_packing.rb +129 -0
- data/lib/etassia/layout/flowchart/directed_placement.rb +428 -0
- data/lib/etassia/layout/flowchart/edge_chains.rb +111 -0
- data/lib/etassia/layout/flowchart/edge_order.rb +34 -0
- data/lib/etassia/layout/flowchart/edge_router.rb +533 -0
- data/lib/etassia/layout/flowchart/label_backdrop_geometry.rb +62 -0
- data/lib/etassia/layout/flowchart/layer_spacing.rb +85 -0
- data/lib/etassia/layout/flowchart/level_edges.rb +74 -0
- data/lib/etassia/layout/flowchart/level_frame.rb +47 -0
- data/lib/etassia/layout/flowchart/minimum_rank_spacing.rb +74 -0
- data/lib/etassia/layout/flowchart/row_centering.rb +229 -0
- data/lib/etassia/layout/flowchart.rb +1290 -0
- data/lib/etassia/layout/gantt.rb +814 -0
- data/lib/etassia/layout/gantt_duration.rb +49 -0
- data/lib/etassia/layout/gantt_exclusions.rb +74 -0
- data/lib/etassia/layout/gantt_ticks.rb +165 -0
- data/lib/etassia/layout/git_graph.rb +1075 -0
- data/lib/etassia/layout/grid.rb +165 -0
- data/lib/etassia/layout/info.rb +113 -0
- data/lib/etassia/layout/kanban.rb +452 -0
- data/lib/etassia/layout/kanban_card_text.rb +95 -0
- data/lib/etassia/layout/mindmap.rb +425 -0
- data/lib/etassia/layout/mindmap_cose.rb +81 -0
- data/lib/etassia/layout/mindmap_cose_body.rb +93 -0
- data/lib/etassia/layout/mindmap_cose_geometry.rb +190 -0
- data/lib/etassia/layout/mindmap_cose_grid.rb +96 -0
- data/lib/etassia/layout/mindmap_cose_link.rb +42 -0
- data/lib/etassia/layout/mindmap_cose_relaxation.rb +166 -0
- data/lib/etassia/layout/mindmap_cose_seed.rb +93 -0
- data/lib/etassia/layout/mindmap_cose_wedge.rb +37 -0
- data/lib/etassia/layout/mindmap_node_size.rb +130 -0
- data/lib/etassia/layout/packet.rb +285 -0
- data/lib/etassia/layout/pie.rb +305 -0
- data/lib/etassia/layout/pie_legend.rb +64 -0
- data/lib/etassia/layout/pie_legend_entry.rb +21 -0
- data/lib/etassia/layout/quadrant.rb +402 -0
- data/lib/etassia/layout/radar.rb +442 -0
- data/lib/etassia/layout/requirement.rb +765 -0
- data/lib/etassia/layout/sankey.rb +501 -0
- data/lib/etassia/layout/scene.rb +18 -0
- data/lib/etassia/layout/sequence/actor_gaps.rb +151 -0
- data/lib/etassia/layout/sequence/box_shape.rb +23 -0
- data/lib/etassia/layout/sequence/creations.rb +73 -0
- data/lib/etassia/layout/sequence/frame_divider.rb +22 -0
- data/lib/etassia/layout/sequence/frame_placement.rb +424 -0
- data/lib/etassia/layout/sequence/frame_reader.rb +75 -0
- data/lib/etassia/layout/sequence/frame_shape.rb +45 -0
- data/lib/etassia/layout/sequence/geometry.rb +24 -0
- data/lib/etassia/layout/sequence/message_rows.rb +165 -0
- data/lib/etassia/layout/sequence/note.rb +16 -0
- data/lib/etassia/layout/sequence/note_box.rb +114 -0
- data/lib/etassia/layout/sequence/note_placement.rb +223 -0
- data/lib/etassia/layout/sequence/text_width.rb +69 -0
- data/lib/etassia/layout/sequence/text_wrap.rb +93 -0
- data/lib/etassia/layout/sequence.rb +936 -0
- data/lib/etassia/layout/state_diagram.rb +1277 -0
- data/lib/etassia/layout/timeline.rb +165 -0
- data/lib/etassia/layout/timeline_card.rb +142 -0
- data/lib/etassia/layout/timeline_flow.rb +164 -0
- data/lib/etassia/layout/timeline_line.rb +33 -0
- data/lib/etassia/layout/timeline_rounding.rb +19 -0
- data/lib/etassia/layout/timeline_text.rb +105 -0
- data/lib/etassia/layout/treemap.rb +303 -0
- data/lib/etassia/layout/treemap_placement.rb +52 -0
- data/lib/etassia/layout/treemap_squarify.rb +108 -0
- data/lib/etassia/layout/user_journey.rb +300 -0
- data/lib/etassia/layout/user_journey_face.rb +33 -0
- data/lib/etassia/layout/user_journey_face_geometry.rb +80 -0
- data/lib/etassia/layout/user_journey_geometry.rb +336 -0
- data/lib/etassia/layout/user_journey_legend.rb +84 -0
- data/lib/etassia/layout/xy_chart.rb +620 -0
- data/lib/etassia/layout.rb +19 -0
- data/lib/etassia/lint_debt_scoreboard.rb +219 -0
- data/lib/etassia/markdown_text/emphasis_simulator.rb +373 -0
- data/lib/etassia/markdown_text.rb +393 -0
- data/lib/etassia/notation/builtin.rb +39 -0
- data/lib/etassia/notation/entry.rb +15 -0
- data/lib/etassia/notation/mermaid/class_diagram_config.rb +42 -0
- data/lib/etassia/notation/mermaid/git_graph_config.rb +46 -0
- data/lib/etassia/notation/mermaid/ir_adapter.rb +27 -0
- data/lib/etassia/notation/mermaid/ir_adapters/architecture.rb +196 -0
- data/lib/etassia/notation/mermaid/ir_adapters/block.rb +138 -0
- data/lib/etassia/notation/mermaid/ir_adapters/c4.rb +258 -0
- data/lib/etassia/notation/mermaid/ir_adapters/class_diagram.rb +257 -0
- data/lib/etassia/notation/mermaid/ir_adapters/er_diagram.rb +220 -0
- data/lib/etassia/notation/mermaid/ir_adapters/error.rb +32 -0
- data/lib/etassia/notation/mermaid/ir_adapters/flowchart.rb +208 -0
- data/lib/etassia/notation/mermaid/ir_adapters/gantt.rb +236 -0
- data/lib/etassia/notation/mermaid/ir_adapters/git_graph.rb +186 -0
- data/lib/etassia/notation/mermaid/ir_adapters/info.rb +34 -0
- data/lib/etassia/notation/mermaid/ir_adapters/kanban.rb +110 -0
- data/lib/etassia/notation/mermaid/ir_adapters/mindmap.rb +76 -0
- data/lib/etassia/notation/mermaid/ir_adapters/packet.rb +51 -0
- data/lib/etassia/notation/mermaid/ir_adapters/pie.rb +71 -0
- data/lib/etassia/notation/mermaid/ir_adapters/quadrant.rb +116 -0
- data/lib/etassia/notation/mermaid/ir_adapters/radar.rb +142 -0
- data/lib/etassia/notation/mermaid/ir_adapters/requirement.rb +237 -0
- data/lib/etassia/notation/mermaid/ir_adapters/sankey.rb +74 -0
- data/lib/etassia/notation/mermaid/ir_adapters/sequence.rb +304 -0
- data/lib/etassia/notation/mermaid/ir_adapters/state_diagram.rb +225 -0
- data/lib/etassia/notation/mermaid/ir_adapters/timeline.rb +93 -0
- data/lib/etassia/notation/mermaid/ir_adapters/treemap.rb +143 -0
- data/lib/etassia/notation/mermaid/ir_adapters/user_journey.rb +127 -0
- data/lib/etassia/notation/mermaid/ir_adapters/xychart.rb +131 -0
- data/lib/etassia/notation/mermaid.rb +399 -0
- data/lib/etassia/notation/parsed.rb +31 -0
- data/lib/etassia/notation/plantuml/activity/arrow_head.rb +45 -0
- data/lib/etassia/notation/plantuml/activity/arrow_style.rb +53 -0
- data/lib/etassia/notation/plantuml/activity/bar_columns.rb +75 -0
- data/lib/etassia/notation/plantuml/activity/box.rb +60 -0
- data/lib/etassia/notation/plantuml/activity/builder.rb +77 -0
- data/lib/etassia/notation/plantuml/activity/canvas.rb +117 -0
- data/lib/etassia/notation/plantuml/activity/column_centres.rb +151 -0
- data/lib/etassia/notation/plantuml/activity/columns.rb +224 -0
- data/lib/etassia/notation/plantuml/activity/diagram.rb +35 -0
- data/lib/etassia/notation/plantuml/activity/edge.rb +35 -0
- data/lib/etassia/notation/plantuml/activity/edge_marks.rb +68 -0
- data/lib/etassia/notation/plantuml/activity/exits.rb +61 -0
- data/lib/etassia/notation/plantuml/activity/frame_marks.rb +116 -0
- data/lib/etassia/notation/plantuml/activity/lane_steps.rb +82 -0
- data/lib/etassia/notation/plantuml/activity/lane_titles.rb +46 -0
- data/lib/etassia/notation/plantuml/activity/layout.rb +50 -0
- data/lib/etassia/notation/plantuml/activity/legacy_parser.rb +181 -0
- data/lib/etassia/notation/plantuml/activity/legacy_row_gaps.rb +65 -0
- data/lib/etassia/notation/plantuml/activity/mark.rb +23 -0
- data/lib/etassia/notation/plantuml/activity/marks.rb +62 -0
- data/lib/etassia/notation/plantuml/activity/metrics.rb +169 -0
- data/lib/etassia/notation/plantuml/activity/new_parser/blocks.rb +166 -0
- data/lib/etassia/notation/plantuml/activity/new_parser.rb +177 -0
- data/lib/etassia/notation/plantuml/activity/node.rb +50 -0
- data/lib/etassia/notation/plantuml/activity/node_marks.rb +174 -0
- data/lib/etassia/notation/plantuml/activity/note.rb +27 -0
- data/lib/etassia/notation/plantuml/activity/parser.rb +51 -0
- data/lib/etassia/notation/plantuml/activity/placement.rb +327 -0
- data/lib/etassia/notation/plantuml/activity/ranking.rb +142 -0
- data/lib/etassia/notation/plantuml/activity/reach.rb +58 -0
- data/lib/etassia/notation/plantuml/activity/renderer.rb +220 -0
- data/lib/etassia/notation/plantuml/activity/route.rb +22 -0
- data/lib/etassia/notation/plantuml/activity/router.rb +308 -0
- data/lib/etassia/notation/plantuml/activity/row_gaps.rb +105 -0
- data/lib/etassia/notation/plantuml/activity/row_spread.rb +59 -0
- data/lib/etassia/notation/plantuml/activity/scene.rb +20 -0
- data/lib/etassia/notation/plantuml/activity/text.rb +36 -0
- data/lib/etassia/notation/plantuml/activity.rb +50 -0
- data/lib/etassia/notation/plantuml/arrow.rb +135 -0
- data/lib/etassia/notation/plantuml/caption.rb +50 -0
- data/lib/etassia/notation/plantuml/caption_layout.rb +97 -0
- data/lib/etassia/notation/plantuml/caption_rows.rb +67 -0
- data/lib/etassia/notation/plantuml/class_header.rb +178 -0
- data/lib/etassia/notation/plantuml/class_name.rb +51 -0
- data/lib/etassia/notation/plantuml/component.rb +37 -0
- data/lib/etassia/notation/plantuml/creole.rb +278 -0
- data/lib/etassia/notation/plantuml/creole_icons.rb +33 -0
- data/lib/etassia/notation/plantuml/diagram.rb +60 -0
- data/lib/etassia/notation/plantuml/diagram_builder.rb +442 -0
- data/lib/etassia/notation/plantuml/diagram_name.rb +51 -0
- data/lib/etassia/notation/plantuml/directives.rb +33 -0
- data/lib/etassia/notation/plantuml/drawing/box.rb +28 -0
- data/lib/etassia/notation/plantuml/drawing/face.rb +39 -0
- data/lib/etassia/notation/plantuml/drawing/pen.rb +105 -0
- data/lib/etassia/notation/plantuml/drawing/renderer.rb +36 -0
- data/lib/etassia/notation/plantuml/drawing/scene.rb +28 -0
- data/lib/etassia/notation/plantuml/drawing.rb +19 -0
- data/lib/etassia/notation/plantuml/ebnf/blocks.rb +272 -0
- data/lib/etassia/notation/plantuml/ebnf/layout.rb +117 -0
- data/lib/etassia/notation/plantuml/ebnf/model.rb +22 -0
- data/lib/etassia/notation/plantuml/ebnf/reader.rb +131 -0
- data/lib/etassia/notation/plantuml/ebnf.rb +34 -0
- data/lib/etassia/notation/plantuml/end_texts.rb +78 -0
- data/lib/etassia/notation/plantuml/entity.rb +54 -0
- data/lib/etassia/notation/plantuml/further.rb +38 -0
- data/lib/etassia/notation/plantuml/gantt/layout.rb +269 -0
- data/lib/etassia/notation/plantuml/gantt/reader.rb +210 -0
- data/lib/etassia/notation/plantuml/gantt/renderer.rb +81 -0
- data/lib/etassia/notation/plantuml/gantt.rb +34 -0
- data/lib/etassia/notation/plantuml/include/blocks.rb +66 -0
- data/lib/etassia/notation/plantuml/include/finder.rb +61 -0
- data/lib/etassia/notation/plantuml/include.rb +78 -0
- data/lib/etassia/notation/plantuml/ir_adapter/annotations.rb +40 -0
- data/lib/etassia/notation/plantuml/ir_adapter/links.rb +91 -0
- data/lib/etassia/notation/plantuml/ir_adapter/sink.rb +49 -0
- data/lib/etassia/notation/plantuml/ir_adapter/structure.rb +86 -0
- data/lib/etassia/notation/plantuml/ir_adapter.rb +32 -0
- data/lib/etassia/notation/plantuml/ir_reader/annotations.rb +51 -0
- data/lib/etassia/notation/plantuml/ir_reader/index.rb +49 -0
- data/lib/etassia/notation/plantuml/ir_reader/links.rb +133 -0
- data/lib/etassia/notation/plantuml/ir_reader/structure.rb +83 -0
- data/lib/etassia/notation/plantuml/ir_reader.rb +42 -0
- data/lib/etassia/notation/plantuml/junction.rb +20 -0
- data/lib/etassia/notation/plantuml/klass.rb +41 -0
- data/lib/etassia/notation/plantuml/label_clearance.rb +67 -0
- data/lib/etassia/notation/plantuml/layout.rb +2806 -0
- data/lib/etassia/notation/plantuml/member.rb +37 -0
- data/lib/etassia/notation/plantuml/member_icon.rb +87 -0
- data/lib/etassia/notation/plantuml/member_icon_elements.rb +91 -0
- data/lib/etassia/notation/plantuml/member_pitch.rb +76 -0
- data/lib/etassia/notation/plantuml/member_rule.rb +48 -0
- data/lib/etassia/notation/plantuml/network/grid.rb +170 -0
- data/lib/etassia/notation/plantuml/network/layout.rb +158 -0
- data/lib/etassia/notation/plantuml/network/model.rb +22 -0
- data/lib/etassia/notation/plantuml/network/placement.rb +64 -0
- data/lib/etassia/notation/plantuml/network/reader.rb +126 -0
- data/lib/etassia/notation/plantuml/network/shapes.rb +109 -0
- data/lib/etassia/notation/plantuml/network.rb +37 -0
- data/lib/etassia/notation/plantuml/node_graph/archimate.rb +49 -0
- data/lib/etassia/notation/plantuml/node_graph/box_reader.rb +86 -0
- data/lib/etassia/notation/plantuml/node_graph/cloud.rb +73 -0
- data/lib/etassia/notation/plantuml/node_graph/crows_foot.rb +85 -0
- data/lib/etassia/notation/plantuml/node_graph/curve.rb +66 -0
- data/lib/etassia/notation/plantuml/node_graph/data_reader.rb +77 -0
- data/lib/etassia/notation/plantuml/node_graph/data_shape.rb +39 -0
- data/lib/etassia/notation/plantuml/node_graph/detour.rb +98 -0
- data/lib/etassia/notation/plantuml/node_graph/edge.rb +26 -0
- data/lib/etassia/notation/plantuml/node_graph/entity_metrics.rb +49 -0
- data/lib/etassia/notation/plantuml/node_graph/entity_reader.rb +65 -0
- data/lib/etassia/notation/plantuml/node_graph/entity_shape.rb +111 -0
- data/lib/etassia/notation/plantuml/node_graph/figures.rb +92 -0
- data/lib/etassia/notation/plantuml/node_graph/frame_ports.rb +73 -0
- data/lib/etassia/notation/plantuml/node_graph/graph.rb +40 -0
- data/lib/etassia/notation/plantuml/node_graph/heads.rb +89 -0
- data/lib/etassia/notation/plantuml/node_graph/label_fan.rb +76 -0
- data/lib/etassia/notation/plantuml/node_graph/label_placer.rb +310 -0
- data/lib/etassia/notation/plantuml/node_graph/label_waypoint.rb +47 -0
- data/lib/etassia/notation/plantuml/node_graph/layout.rb +293 -0
- data/lib/etassia/notation/plantuml/node_graph/link.rb +78 -0
- data/lib/etassia/notation/plantuml/node_graph/macros.rb +39 -0
- data/lib/etassia/notation/plantuml/node_graph/metrics.rb +113 -0
- data/lib/etassia/notation/plantuml/node_graph/node.rb +44 -0
- data/lib/etassia/notation/plantuml/node_graph/note_tail.rb +58 -0
- data/lib/etassia/notation/plantuml/node_graph/packer.rb +126 -0
- data/lib/etassia/notation/plantuml/node_graph/parser.rb +309 -0
- data/lib/etassia/notation/plantuml/node_graph/paths.rb +48 -0
- data/lib/etassia/notation/plantuml/node_graph/ranking.rb +231 -0
- data/lib/etassia/notation/plantuml/node_graph/reader.rb +53 -0
- data/lib/etassia/notation/plantuml/node_graph/references.rb +38 -0
- data/lib/etassia/notation/plantuml/node_graph/renderer.rb +160 -0
- data/lib/etassia/notation/plantuml/node_graph/scene.rb +22 -0
- data/lib/etassia/notation/plantuml/node_graph/shapes.rb +302 -0
- data/lib/etassia/notation/plantuml/node_graph/skipped_ranks.rb +61 -0
- data/lib/etassia/notation/plantuml/node_graph/tab.rb +68 -0
- data/lib/etassia/notation/plantuml/node_graph/usecase_ellipse.rb +100 -0
- data/lib/etassia/notation/plantuml/node_graph.rb +38 -0
- data/lib/etassia/notation/plantuml/note.rb +27 -0
- data/lib/etassia/notation/plantuml/note_layout.rb +257 -0
- data/lib/etassia/notation/plantuml/note_outline.rb +68 -0
- data/lib/etassia/notation/plantuml/objects/map_rows.rb +46 -0
- data/lib/etassia/notation/plantuml/objects/reader.rb +208 -0
- data/lib/etassia/notation/plantuml/objects.rb +39 -0
- data/lib/etassia/notation/plantuml/package.rb +45 -0
- data/lib/etassia/notation/plantuml/package_color.rb +32 -0
- data/lib/etassia/notation/plantuml/package_frames.rb +178 -0
- data/lib/etassia/notation/plantuml/parser.rb +622 -0
- data/lib/etassia/notation/plantuml/portion_visibility.rb +91 -0
- data/lib/etassia/notation/plantuml/qualified_association_layout.rb +332 -0
- data/lib/etassia/notation/plantuml/qualifier_box.rb +78 -0
- data/lib/etassia/notation/plantuml/rank_chain.rb +527 -0
- data/lib/etassia/notation/plantuml/rank_hierarchy.rb +347 -0
- data/lib/etassia/notation/plantuml/relation.rb +103 -0
- data/lib/etassia/notation/plantuml/relation_label_separator.rb +199 -0
- data/lib/etassia/notation/plantuml/relation_path_points.rb +84 -0
- data/lib/etassia/notation/plantuml/renderer.rb +490 -0
- data/lib/etassia/notation/plantuml/scene.rb +134 -0
- data/lib/etassia/notation/plantuml/segment_box.rb +85 -0
- data/lib/etassia/notation/plantuml/sequence/activation.rb +28 -0
- data/lib/etassia/notation/plantuml/sequence/appearance.rb +71 -0
- data/lib/etassia/notation/plantuml/sequence/arrow_end.rb +23 -0
- data/lib/etassia/notation/plantuml/sequence/arrow_marks.rb +111 -0
- data/lib/etassia/notation/plantuml/sequence/arrow_style.rb +42 -0
- data/lib/etassia/notation/plantuml/sequence/arrow_syntax.rb +122 -0
- data/lib/etassia/notation/plantuml/sequence/bar_tracker.rb +59 -0
- data/lib/etassia/notation/plantuml/sequence/box.rb +23 -0
- data/lib/etassia/notation/plantuml/sequence/chrome.rb +60 -0
- data/lib/etassia/notation/plantuml/sequence/chrome_rows.rb +184 -0
- data/lib/etassia/notation/plantuml/sequence/create.rb +34 -0
- data/lib/etassia/notation/plantuml/sequence/delay.rb +19 -0
- data/lib/etassia/notation/plantuml/sequence/destroy.rb +20 -0
- data/lib/etassia/notation/plantuml/sequence/diagram.rb +86 -0
- data/lib/etassia/notation/plantuml/sequence/divider.rb +19 -0
- data/lib/etassia/notation/plantuml/sequence/edge.rb +53 -0
- data/lib/etassia/notation/plantuml/sequence/embedded.rb +77 -0
- data/lib/etassia/notation/plantuml/sequence/fill.rb +56 -0
- data/lib/etassia/notation/plantuml/sequence/fragment.rb +28 -0
- data/lib/etassia/notation/plantuml/sequence/fragment_shape.rb +138 -0
- data/lib/etassia/notation/plantuml/sequence/head_style.rb +43 -0
- data/lib/etassia/notation/plantuml/sequence/ir_adapter/blocks.rb +73 -0
- data/lib/etassia/notation/plantuml/sequence/ir_adapter/fills.rb +24 -0
- data/lib/etassia/notation/plantuml/sequence/ir_adapter/items.rb +48 -0
- data/lib/etassia/notation/plantuml/sequence/ir_adapter/messages.rb +62 -0
- data/lib/etassia/notation/plantuml/sequence/ir_adapter/participants.rb +42 -0
- data/lib/etassia/notation/plantuml/sequence/ir_adapter/settings.rb +54 -0
- data/lib/etassia/notation/plantuml/sequence/ir_adapter.rb +38 -0
- data/lib/etassia/notation/plantuml/sequence/ir_reader/blocks.rb +77 -0
- data/lib/etassia/notation/plantuml/sequence/ir_reader/fills.rb +27 -0
- data/lib/etassia/notation/plantuml/sequence/ir_reader/index.rb +36 -0
- data/lib/etassia/notation/plantuml/sequence/ir_reader/items.rb +35 -0
- data/lib/etassia/notation/plantuml/sequence/ir_reader/messages.rb +70 -0
- data/lib/etassia/notation/plantuml/sequence/ir_reader/participants.rb +42 -0
- data/lib/etassia/notation/plantuml/sequence/ir_reader/settings.rb +74 -0
- data/lib/etassia/notation/plantuml/sequence/ir_reader.rb +38 -0
- data/lib/etassia/notation/plantuml/sequence/keyword_defaults.rb +28 -0
- data/lib/etassia/notation/plantuml/sequence/layout.rb +1567 -0
- data/lib/etassia/notation/plantuml/sequence/message.rb +97 -0
- data/lib/etassia/notation/plantuml/sequence/message_wrap.rb +77 -0
- data/lib/etassia/notation/plantuml/sequence/note.rb +61 -0
- data/lib/etassia/notation/plantuml/sequence/note_fill.rb +35 -0
- data/lib/etassia/notation/plantuml/sequence/note_geometry.rb +126 -0
- data/lib/etassia/notation/plantuml/sequence/note_shape.rb +51 -0
- data/lib/etassia/notation/plantuml/sequence/numbered_label.rb +57 -0
- data/lib/etassia/notation/plantuml/sequence/numbering.rb +49 -0
- data/lib/etassia/notation/plantuml/sequence/outline.rb +204 -0
- data/lib/etassia/notation/plantuml/sequence/page_break.rb +17 -0
- data/lib/etassia/notation/plantuml/sequence/paint.rb +79 -0
- data/lib/etassia/notation/plantuml/sequence/parallel_message.rb +19 -0
- data/lib/etassia/notation/plantuml/sequence/parser.rb +844 -0
- data/lib/etassia/notation/plantuml/sequence/participant.rb +27 -0
- data/lib/etassia/notation/plantuml/sequence/picture.rb +29 -0
- data/lib/etassia/notation/plantuml/sequence/ref.rb +24 -0
- data/lib/etassia/notation/plantuml/sequence/ref_shape.rb +74 -0
- data/lib/etassia/notation/plantuml/sequence/refusals.rb +47 -0
- data/lib/etassia/notation/plantuml/sequence/renderer.rb +501 -0
- data/lib/etassia/notation/plantuml/sequence/scene.rb +200 -0
- data/lib/etassia/notation/plantuml/sequence/skin.rb +76 -0
- data/lib/etassia/notation/plantuml/sequence/spacing.rb +28 -0
- data/lib/etassia/notation/plantuml/sequence/style.rb +151 -0
- data/lib/etassia/notation/plantuml/sequence/tab_size.rb +42 -0
- data/lib/etassia/notation/plantuml/sequence/walker.rb +1190 -0
- data/lib/etassia/notation/plantuml/sequence.rb +47 -0
- data/lib/etassia/notation/plantuml/source_lines.rb +33 -0
- data/lib/etassia/notation/plantuml/state/axis_solver.rb +272 -0
- data/lib/etassia/notation/plantuml/state/cluster_padding.rb +75 -0
- data/lib/etassia/notation/plantuml/state/curve.rb +73 -0
- data/lib/etassia/notation/plantuml/state/dot_axis.rb +248 -0
- data/lib/etassia/notation/plantuml/state/extent.rb +42 -0
- data/lib/etassia/notation/plantuml/state/hierarchy.rb +355 -0
- data/lib/etassia/notation/plantuml/state/label_clearance.rb +148 -0
- data/lib/etassia/notation/plantuml/state/label_reach.rb +139 -0
- data/lib/etassia/notation/plantuml/state/layout.rb +173 -0
- data/lib/etassia/notation/plantuml/state/level_edges.rb +113 -0
- data/lib/etassia/notation/plantuml/state/look.rb +36 -0
- data/lib/etassia/notation/plantuml/state/note_shape.rb +73 -0
- data/lib/etassia/notation/plantuml/state/plane.rb +85 -0
- data/lib/etassia/notation/plantuml/state/ranking.rb +181 -0
- data/lib/etassia/notation/plantuml/state/reader.rb +310 -0
- data/lib/etassia/notation/plantuml/state/renderer.rb +253 -0
- data/lib/etassia/notation/plantuml/state/route_detour.rb +115 -0
- data/lib/etassia/notation/plantuml/state/route_geometry.rb +186 -0
- data/lib/etassia/notation/plantuml/state/routes.rb +196 -0
- data/lib/etassia/notation/plantuml/state/row.rb +88 -0
- data/lib/etassia/notation/plantuml/state/rows.rb +50 -0
- data/lib/etassia/notation/plantuml/state/stretch.rb +71 -0
- data/lib/etassia/notation/plantuml/state.rb +62 -0
- data/lib/etassia/notation/plantuml/stereotype_head.rb +58 -0
- data/lib/etassia/notation/plantuml/style/bound.rb +34 -0
- data/lib/etassia/notation/plantuml/style/colour.rb +41 -0
- data/lib/etassia/notation/plantuml/style/colour_names.rb +89 -0
- data/lib/etassia/notation/plantuml/style/defaults.rb +33 -0
- data/lib/etassia/notation/plantuml/style/inline.rb +56 -0
- data/lib/etassia/notation/plantuml/style/reader.rb +242 -0
- data/lib/etassia/notation/plantuml/style/sheet.rb +103 -0
- data/lib/etassia/notation/plantuml/style.rb +32 -0
- data/lib/etassia/notation/plantuml/style_reader.rb +160 -0
- data/lib/etassia/notation/plantuml/style_sheet.rb +27 -0
- data/lib/etassia/notation/plantuml/styled_relation_curve.rb +71 -0
- data/lib/etassia/notation/plantuml/timing/arrows.rb +81 -0
- data/lib/etassia/notation/plantuml/timing/axis.rb +100 -0
- data/lib/etassia/notation/plantuml/timing/layout.rb +172 -0
- data/lib/etassia/notation/plantuml/timing/model.rb +34 -0
- data/lib/etassia/notation/plantuml/timing/reader.rb +173 -0
- data/lib/etassia/notation/plantuml/timing/signals.rb +328 -0
- data/lib/etassia/notation/plantuml/timing.rb +38 -0
- data/lib/etassia/notation/plantuml/tree/layout.rb +276 -0
- data/lib/etassia/notation/plantuml/tree/mindmap_layout.rb +157 -0
- data/lib/etassia/notation/plantuml/tree/reader.rb +186 -0
- data/lib/etassia/notation/plantuml/tree/renderer.rb +67 -0
- data/lib/etassia/notation/plantuml/tree/role.rb +57 -0
- data/lib/etassia/notation/plantuml/tree/rules.rb +156 -0
- data/lib/etassia/notation/plantuml/tree/wbs_layout.rb +164 -0
- data/lib/etassia/notation/plantuml/tree.rb +41 -0
- data/lib/etassia/notation/plantuml/unsupported_construct_error.rb +39 -0
- data/lib/etassia/notation/plantuml/unsupported_constructs.rb +103 -0
- data/lib/etassia/notation/plantuml/usecase.rb +36 -0
- data/lib/etassia/notation/plantuml.rb +132 -0
- data/lib/etassia/notation/plantuml_data/boxes/frames.rb +101 -0
- data/lib/etassia/notation/plantuml_data/boxes/graph_layout.rb +348 -0
- data/lib/etassia/notation/plantuml_data/boxes/heads.rb +65 -0
- data/lib/etassia/notation/plantuml_data/boxes/highlights.rb +70 -0
- data/lib/etassia/notation/plantuml_data/boxes/inline_rows.rb +99 -0
- data/lib/etassia/notation/plantuml_data/boxes/json_reader.rb +24 -0
- data/lib/etassia/notation/plantuml_data/boxes/link_text.rb +94 -0
- data/lib/etassia/notation/plantuml_data/boxes/marks.rb +76 -0
- data/lib/etassia/notation/plantuml_data/boxes/ornaments.rb +130 -0
- data/lib/etassia/notation/plantuml_data/boxes/renderer.rb +95 -0
- data/lib/etassia/notation/plantuml_data/boxes/row_alignment.rb +58 -0
- data/lib/etassia/notation/plantuml_data/boxes/row_bend.rb +43 -0
- data/lib/etassia/notation/plantuml_data/boxes/scene.rb +27 -0
- data/lib/etassia/notation/plantuml_data/boxes/table.rb +56 -0
- data/lib/etassia/notation/plantuml_data/boxes/table_box.rb +355 -0
- data/lib/etassia/notation/plantuml_data/boxes/text.rb +101 -0
- data/lib/etassia/notation/plantuml_data/boxes/tree_builder.rb +82 -0
- data/lib/etassia/notation/plantuml_data/boxes/tree_layout.rb +82 -0
- data/lib/etassia/notation/plantuml_data/boxes/yaml_reader.rb +105 -0
- data/lib/etassia/notation/plantuml_data/openiconic.LICENSE +6 -0
- data/lib/etassia/notation/plantuml_data/openiconic.json +1 -0
- data/lib/etassia/notation/plantuml_data.rb +84 -0
- data/lib/etassia/notation/plantuml_salt/block.rb +80 -0
- data/lib/etassia/notation/plantuml_salt/box.rb +30 -0
- data/lib/etassia/notation/plantuml_salt/font_metrics.rb +28 -0
- data/lib/etassia/notation/plantuml_salt/grid_marks.rb +66 -0
- data/lib/etassia/notation/plantuml_salt/group_marks.rb +77 -0
- data/lib/etassia/notation/plantuml_salt/layout.rb +206 -0
- data/lib/etassia/notation/plantuml_salt/mark.rb +36 -0
- data/lib/etassia/notation/plantuml_salt/markup.rb +57 -0
- data/lib/etassia/notation/plantuml_salt/parser.rb +239 -0
- data/lib/etassia/notation/plantuml_salt/renderer.rb +138 -0
- data/lib/etassia/notation/plantuml_salt/row.rb +19 -0
- data/lib/etassia/notation/plantuml_salt/run.rb +34 -0
- data/lib/etassia/notation/plantuml_salt/scene.rb +23 -0
- data/lib/etassia/notation/plantuml_salt/scroll_marks.rb +94 -0
- data/lib/etassia/notation/plantuml_salt/tab_marks.rb +74 -0
- data/lib/etassia/notation/plantuml_salt/tree_marks.rb +127 -0
- data/lib/etassia/notation/plantuml_salt/widget.rb +40 -0
- data/lib/etassia/notation/plantuml_salt/widget_marks.rb +319 -0
- data/lib/etassia/notation/plantuml_salt.rb +66 -0
- data/lib/etassia/notation/plugin_failure.rb +42 -0
- data/lib/etassia/notation.rb +289 -0
- data/lib/etassia/parser/architecture.rb +25 -0
- data/lib/etassia/parser/atoms/delimited_run.rb +82 -0
- data/lib/etassia/parser/atoms/greedy_run.rb +116 -0
- data/lib/etassia/parser/atoms/joined.rb +47 -0
- data/lib/etassia/parser/atoms/trimmed_run.rb +47 -0
- data/lib/etassia/parser/base.rb +258 -0
- data/lib/etassia/parser/block.rb +32 -0
- data/lib/etassia/parser/builders/architecture.rb +135 -0
- data/lib/etassia/parser/builders/block.rb +288 -0
- data/lib/etassia/parser/builders/c4.rb +275 -0
- data/lib/etassia/parser/builders/capture_string.rb +17 -0
- data/lib/etassia/parser/builders/class_diagram.rb +539 -0
- data/lib/etassia/parser/builders/er_diagram.rb +308 -0
- data/lib/etassia/parser/builders/error.rb +51 -0
- data/lib/etassia/parser/builders/flowchart.rb +1150 -0
- data/lib/etassia/parser/builders/gantt.rb +267 -0
- data/lib/etassia/parser/builders/git_graph.rb +301 -0
- data/lib/etassia/parser/builders/info.rb +57 -0
- data/lib/etassia/parser/builders/kanban.rb +411 -0
- data/lib/etassia/parser/builders/mindmap.rb +271 -0
- data/lib/etassia/parser/builders/packet.rb +85 -0
- data/lib/etassia/parser/builders/pie.rb +105 -0
- data/lib/etassia/parser/builders/quadrant.rb +165 -0
- data/lib/etassia/parser/builders/radar.rb +157 -0
- data/lib/etassia/parser/builders/requirement.rb +230 -0
- data/lib/etassia/parser/builders/sankey.rb +142 -0
- data/lib/etassia/parser/builders/sequence.rb +431 -0
- data/lib/etassia/parser/builders/sequence_blocks.rb +117 -0
- data/lib/etassia/parser/builders/sequence_box_title.rb +57 -0
- data/lib/etassia/parser/builders/state_diagram.rb +364 -0
- data/lib/etassia/parser/builders/timeline.rb +133 -0
- data/lib/etassia/parser/builders/treemap.rb +138 -0
- data/lib/etassia/parser/builders/xy_chart.rb +148 -0
- data/lib/etassia/parser/c4.rb +37 -0
- data/lib/etassia/parser/class_diagram.rb +58 -0
- data/lib/etassia/parser/class_namespaces.rb +62 -0
- data/lib/etassia/parser/class_notes.rb +54 -0
- data/lib/etassia/parser/er_diagram.rb +28 -0
- data/lib/etassia/parser/error.rb +30 -0
- data/lib/etassia/parser/flowchart.rb +87 -0
- data/lib/etassia/parser/gantt.rb +43 -0
- data/lib/etassia/parser/git_graph.rb +106 -0
- data/lib/etassia/parser/grammars/architecture.rb +165 -0
- data/lib/etassia/parser/grammars/block.rb +190 -0
- data/lib/etassia/parser/grammars/c4.rb +229 -0
- data/lib/etassia/parser/grammars/class_diagram.rb +606 -0
- data/lib/etassia/parser/grammars/common.rb +107 -0
- data/lib/etassia/parser/grammars/er_diagram.rb +232 -0
- data/lib/etassia/parser/grammars/error.rb +32 -0
- data/lib/etassia/parser/grammars/flowchart.rb +1722 -0
- data/lib/etassia/parser/grammars/gantt.rb +198 -0
- data/lib/etassia/parser/grammars/git_graph.rb +234 -0
- data/lib/etassia/parser/grammars/info.rb +53 -0
- data/lib/etassia/parser/grammars/kanban.rb +417 -0
- data/lib/etassia/parser/grammars/mermaid_unicode_text.rb +108 -0
- data/lib/etassia/parser/grammars/mindmap.rb +220 -0
- data/lib/etassia/parser/grammars/packet.rb +71 -0
- data/lib/etassia/parser/grammars/pie.rb +128 -0
- data/lib/etassia/parser/grammars/quadrant.rb +202 -0
- data/lib/etassia/parser/grammars/radar.rb +158 -0
- data/lib/etassia/parser/grammars/requirement.rb +258 -0
- data/lib/etassia/parser/grammars/sankey.rb +104 -0
- data/lib/etassia/parser/grammars/sequence.rb +940 -0
- data/lib/etassia/parser/grammars/state_diagram.rb +382 -0
- data/lib/etassia/parser/grammars/timeline.rb +153 -0
- data/lib/etassia/parser/grammars/treemap.rb +122 -0
- data/lib/etassia/parser/grammars/xy_chart.rb +119 -0
- data/lib/etassia/parser/info.rb +32 -0
- data/lib/etassia/parser/kanban.rb +131 -0
- data/lib/etassia/parser/mermaid_shapes.rb +106 -0
- data/lib/etassia/parser/metadata_yaml.rb +452 -0
- data/lib/etassia/parser/mindmap.rb +92 -0
- data/lib/etassia/parser/native/builders/architecture.rb +103 -0
- data/lib/etassia/parser/native/builders/block.rb +68 -0
- data/lib/etassia/parser/native/builders/c4.rb +16 -0
- data/lib/etassia/parser/native/builders/class_diagram.rb +63 -0
- data/lib/etassia/parser/native/builders/er_diagram.rb +47 -0
- data/lib/etassia/parser/native/builders/flowchart.rb +58 -0
- data/lib/etassia/parser/native/builders/gantt.rb +35 -0
- data/lib/etassia/parser/native/builders/gitgraph.rb +35 -0
- data/lib/etassia/parser/native/builders/info.rb +30 -0
- data/lib/etassia/parser/native/builders/kanban.rb +37 -0
- data/lib/etassia/parser/native/builders/mindmap.rb +26 -0
- data/lib/etassia/parser/native/builders/packet.rb +63 -0
- data/lib/etassia/parser/native/builders/pie.rb +82 -0
- data/lib/etassia/parser/native/builders/quadrant.rb +27 -0
- data/lib/etassia/parser/native/builders/radar.rb +84 -0
- data/lib/etassia/parser/native/builders/requirement.rb +25 -0
- data/lib/etassia/parser/native/builders/sankey.rb +18 -0
- data/lib/etassia/parser/native/builders/sequence.rb +48 -0
- data/lib/etassia/parser/native/builders/state_diagram.rb +61 -0
- data/lib/etassia/parser/native/builders/timeline.rb +46 -0
- data/lib/etassia/parser/native/builders/treemap.rb +60 -0
- data/lib/etassia/parser/native/builders/user_journey.rb +83 -0
- data/lib/etassia/parser/native/builders/xy_chart.rb +94 -0
- data/lib/etassia/parser/native/declined.rb +12 -0
- data/lib/etassia/parser/native/mermaid.json +1 -0
- data/lib/etassia/parser/native/text.rb +31 -0
- data/lib/etassia/parser/native.rb +99 -0
- data/lib/etassia/parser/packet.rb +56 -0
- data/lib/etassia/parser/pie.rb +32 -0
- data/lib/etassia/parser/quadrant.rb +77 -0
- data/lib/etassia/parser/radar.rb +99 -0
- data/lib/etassia/parser/requirement.rb +32 -0
- data/lib/etassia/parser/sankey.rb +47 -0
- data/lib/etassia/parser/sequence.rb +34 -0
- data/lib/etassia/parser/state_diagram.rb +29 -0
- data/lib/etassia/parser/timeline.rb +40 -0
- data/lib/etassia/parser/treemap.rb +25 -0
- data/lib/etassia/parser/user_journey.rb +253 -0
- data/lib/etassia/parser/xy_chart.rb +98 -0
- data/lib/etassia/parser.rb +18 -0
- data/lib/etassia/renderer/architecture.rb +232 -0
- data/lib/etassia/renderer/architecture_edge_router.rb +379 -0
- data/lib/etassia/renderer/base.rb +295 -0
- data/lib/etassia/renderer/block.rb +157 -0
- data/lib/etassia/renderer/c4.rb +294 -0
- data/lib/etassia/renderer/class_diagram.rb +671 -0
- data/lib/etassia/renderer/er_diagram.rb +842 -0
- data/lib/etassia/renderer/error.rb +131 -0
- data/lib/etassia/renderer/flowchart.rb +315 -0
- data/lib/etassia/renderer/gantt.rb +177 -0
- data/lib/etassia/renderer/git_graph.rb +224 -0
- data/lib/etassia/renderer/info.rb +59 -0
- data/lib/etassia/renderer/kanban.rb +157 -0
- data/lib/etassia/renderer/line_break_text.rb +56 -0
- data/lib/etassia/renderer/markdown_text.rb +106 -0
- data/lib/etassia/renderer/mindmap.rb +290 -0
- data/lib/etassia/renderer/packet.rb +87 -0
- data/lib/etassia/renderer/pie.rb +113 -0
- data/lib/etassia/renderer/quadrant.rb +189 -0
- data/lib/etassia/renderer/radar.rb +191 -0
- data/lib/etassia/renderer/requirement.rb +209 -0
- data/lib/etassia/renderer/sankey.rb +114 -0
- data/lib/etassia/renderer/sequence/frame_drawing.rb +169 -0
- data/lib/etassia/renderer/sequence/note_drawing.rb +69 -0
- data/lib/etassia/renderer/sequence.rb +490 -0
- data/lib/etassia/renderer/state_diagram.rb +202 -0
- data/lib/etassia/renderer/timeline.rb +134 -0
- data/lib/etassia/renderer/timeline_palette.rb +18 -0
- data/lib/etassia/renderer/treemap/section_total.rb +33 -0
- data/lib/etassia/renderer/treemap.rb +128 -0
- data/lib/etassia/renderer/user_journey.rb +209 -0
- data/lib/etassia/renderer/xy_chart.rb +180 -0
- data/lib/etassia/renderer.rb +22 -0
- data/lib/etassia/runtime.rb +125 -0
- data/lib/etassia/source/frontmatter.rb +501 -0
- data/lib/etassia/source.rb +224 -0
- data/lib/etassia/svg/arrowhead.rb +205 -0
- data/lib/etassia/svg/circle.rb +19 -0
- data/lib/etassia/svg/document.rb +106 -0
- data/lib/etassia/svg/element.rb +209 -0
- data/lib/etassia/svg/ellipse.rb +23 -0
- data/lib/etassia/svg/escaping.rb +149 -0
- data/lib/etassia/svg/group.rb +64 -0
- data/lib/etassia/svg/line.rb +21 -0
- data/lib/etassia/svg/numbers.rb +53 -0
- data/lib/etassia/svg/path.rb +67 -0
- data/lib/etassia/svg/path_geometry.rb +378 -0
- data/lib/etassia/svg/polygon.rb +25 -0
- data/lib/etassia/svg/polyline.rb +28 -0
- data/lib/etassia/svg/rect.rb +34 -0
- data/lib/etassia/svg/style.rb +50 -0
- data/lib/etassia/svg/text.rb +181 -0
- data/lib/etassia/svg/tspan.rb +48 -0
- data/lib/etassia/svg.rb +38 -0
- data/lib/etassia/text_measurement/arial_advances.rb +122 -0
- data/lib/etassia/text_measurement/dejavu_advances.rb +111 -0
- data/lib/etassia/text_measurement/times_advances.rb +64 -0
- data/lib/etassia/text_measurement/trebuchet_advances.rb +53 -0
- data/lib/etassia/text_measurement/trebuchet_kerning.rb +29 -0
- data/lib/etassia/text_measurement.rb +198 -0
- data/lib/etassia/theme/builtin/dark.yml +229 -0
- data/lib/etassia/theme/builtin/default.yml +239 -0
- data/lib/etassia/theme/builtin/high_contrast.yml +231 -0
- data/lib/etassia/theme/builtin/light.yml +229 -0
- data/lib/etassia/theme/color_palette.rb +97 -0
- data/lib/etassia/theme/completion.rb +50 -0
- data/lib/etassia/theme/effect_styles.rb +34 -0
- data/lib/etassia/theme/registry.rb +45 -0
- data/lib/etassia/theme/shape_styles.rb +34 -0
- data/lib/etassia/theme/spacing_config.rb +30 -0
- data/lib/etassia/theme/typography.rb +40 -0
- data/lib/etassia/theme.rb +73 -0
- data/lib/etassia/version.rb +5 -0
- data/lib/etassia.rb +40 -0
- metadata +865 -0
|
@@ -0,0 +1,431 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative "capture_string"
|
|
4
|
+
require_relative "../../diagram/sequence"
|
|
5
|
+
require_relative "sequence_blocks"
|
|
6
|
+
|
|
7
|
+
module Etassia
|
|
8
|
+
module Parser
|
|
9
|
+
module Builders
|
|
10
|
+
# Transform for converting Parslet parse tree to Sequence diagram model.
|
|
11
|
+
#
|
|
12
|
+
# Converts the parse tree output from Grammars::Sequence into a
|
|
13
|
+
# fully-formed Diagram::Sequence object with participants, messages,
|
|
14
|
+
# notes, and activations.
|
|
15
|
+
class Sequence
|
|
16
|
+
include CaptureString
|
|
17
|
+
include SequenceBlocks
|
|
18
|
+
|
|
19
|
+
# Every arrow mmdc 11.12.0 renders, read off its own SVG: a line
|
|
20
|
+
# class (messageLine0/1 -> solid/dotted), a marker, and which end
|
|
21
|
+
# of the line carries it. The reversed spellings differ from their
|
|
22
|
+
# forward twin only in that last axis — `\\-` puts the same head
|
|
23
|
+
# mermaid gives `-\\` on the source end instead.
|
|
24
|
+
ARROW_STYLES = {
|
|
25
|
+
"->" => %w[solid none target],
|
|
26
|
+
"-->" => %w[dotted none target],
|
|
27
|
+
"->>" => %w[solid filled target],
|
|
28
|
+
"-->>" => %w[dotted filled target],
|
|
29
|
+
"-x" => %w[solid cross target],
|
|
30
|
+
"--x" => %w[dotted cross target],
|
|
31
|
+
"-X" => %w[solid cross target],
|
|
32
|
+
"--X" => %w[dotted cross target],
|
|
33
|
+
"-)" => %w[solid open target],
|
|
34
|
+
"--)" => %w[dotted open target],
|
|
35
|
+
"-|/" => %w[solid half_bottom target],
|
|
36
|
+
"--|/" => %w[dotted half_bottom target],
|
|
37
|
+
"-|\\" => %w[solid half_top target],
|
|
38
|
+
"--|\\" => %w[dotted half_top target],
|
|
39
|
+
"-//" => %w[solid stick_bottom target],
|
|
40
|
+
"--//" => %w[dotted stick_bottom target],
|
|
41
|
+
"-\\\\" => %w[solid stick_top target],
|
|
42
|
+
"--\\\\" => %w[dotted stick_top target],
|
|
43
|
+
"/|-" => %w[solid half_bottom source],
|
|
44
|
+
"/|--" => %w[dotted half_bottom source],
|
|
45
|
+
'\\|-' => %w[solid half_top source],
|
|
46
|
+
'\\|--' => %w[dotted half_top source],
|
|
47
|
+
"//-" => %w[solid stick_bottom source],
|
|
48
|
+
"//--" => %w[dotted stick_bottom source],
|
|
49
|
+
'\\\\-' => %w[solid stick_top source],
|
|
50
|
+
'\\\\--' => %w[dotted stick_top source],
|
|
51
|
+
"<<->>" => %w[solid filled both],
|
|
52
|
+
"<<-->>" => %w[dotted filled both],
|
|
53
|
+
}.freeze
|
|
54
|
+
|
|
55
|
+
STATEMENT_HANDLERS = [
|
|
56
|
+
[%i[participant], :add_participant_statement],
|
|
57
|
+
[%i[actor], :add_actor_statement],
|
|
58
|
+
[%i[destroy], :destroy_participant],
|
|
59
|
+
[%i[links], :link_participant],
|
|
60
|
+
[%i[from to arrow], :add_message],
|
|
61
|
+
[%i[position note_text], :add_note],
|
|
62
|
+
[%i[activate], :activate_participant],
|
|
63
|
+
[%i[deactivate], :deactivate_participant],
|
|
64
|
+
[%i[box_label], :process_box],
|
|
65
|
+
[%i[loop_label], :process_loop],
|
|
66
|
+
[%i[alt_label], :process_alt],
|
|
67
|
+
[%i[opt_label], :process_opt],
|
|
68
|
+
[%i[rect_label], :process_rect],
|
|
69
|
+
[%i[par_label], :process_par],
|
|
70
|
+
[%i[critical_label], :process_critical],
|
|
71
|
+
[%i[break_label], :process_break],
|
|
72
|
+
].freeze
|
|
73
|
+
private_constant :STATEMENT_HANDLERS
|
|
74
|
+
|
|
75
|
+
# The `type` of `@{ "type": "boundary" }` or `@{ type: boundary }`.
|
|
76
|
+
SHAPE_TYPE = /["']?type["']?\s*:\s*["']?([A-Za-z]+)/
|
|
77
|
+
private_constant :SHAPE_TYPE
|
|
78
|
+
|
|
79
|
+
# Transform parse tree into Sequence diagram.
|
|
80
|
+
#
|
|
81
|
+
# @param tree [Array, Hash] Parslet parse tree
|
|
82
|
+
# @return [Diagram::Sequence] the sequence diagram model
|
|
83
|
+
def apply(tree)
|
|
84
|
+
diagram = Diagram::Sequence.new
|
|
85
|
+
reset_state
|
|
86
|
+
|
|
87
|
+
# Tree is an array: [header, ...statements]
|
|
88
|
+
if tree.is_a?(Array)
|
|
89
|
+
tree.each do |item|
|
|
90
|
+
next if item[:header] # Skip header
|
|
91
|
+
|
|
92
|
+
process_statement(diagram, item)
|
|
93
|
+
end
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
diagram
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
private
|
|
100
|
+
|
|
101
|
+
# Called at the start of `apply`, so a builder is reusable across
|
|
102
|
+
# multiple `parse` calls without carrying state from the last one —
|
|
103
|
+
# a single place to add a new per-parse ivar.
|
|
104
|
+
def reset_state
|
|
105
|
+
@message_index = 0
|
|
106
|
+
@activations = {}
|
|
107
|
+
@pending_created = nil
|
|
108
|
+
@pending_destroyed = nil
|
|
109
|
+
@known_actor_ids = Set.new
|
|
110
|
+
reset_blocks
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
def process_statements(diagram, statements)
|
|
114
|
+
Array(statements).each do |stmt|
|
|
115
|
+
process_statement(diagram, stmt) if stmt.is_a?(Hash)
|
|
116
|
+
end
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
def process_statement(diagram, stmt)
|
|
120
|
+
# `create` applies on top of the `participant`/`actor` branch
|
|
121
|
+
# below, not instead of it (`create_statement` delegates to the
|
|
122
|
+
# same declaration rules, so both keys are set on one `stmt`) —
|
|
123
|
+
# checked here, before the dispatch below adds the participant,
|
|
124
|
+
# because the duplicate-id check needs the id to still be
|
|
125
|
+
# absent from `@known_actor_ids`.
|
|
126
|
+
register_created(actor_id(stmt[:id])) if stmt[:create]
|
|
127
|
+
entry = STATEMENT_HANDLERS.find do |keys, _handler|
|
|
128
|
+
keys.all? { |key| stmt[key] }
|
|
129
|
+
end
|
|
130
|
+
send(entry.last, diagram, stmt) if entry
|
|
131
|
+
end
|
|
132
|
+
|
|
133
|
+
def add_participant_statement(diagram, stmt)
|
|
134
|
+
add_participant(diagram, stmt, "participant")
|
|
135
|
+
end
|
|
136
|
+
|
|
137
|
+
def add_actor_statement(diagram, stmt)
|
|
138
|
+
add_participant(diagram, stmt, "actor")
|
|
139
|
+
end
|
|
140
|
+
|
|
141
|
+
def destroy_participant(_diagram, stmt)
|
|
142
|
+
register_destroyed(actor_id(stmt[:destroy]))
|
|
143
|
+
end
|
|
144
|
+
|
|
145
|
+
def link_participant(diagram, stmt)
|
|
146
|
+
ensure_participant(diagram, actor_id(stmt[:links]))
|
|
147
|
+
end
|
|
148
|
+
|
|
149
|
+
def activate_participant(diagram, stmt)
|
|
150
|
+
track_activation(diagram, actor_id(stmt[:activate]), true)
|
|
151
|
+
end
|
|
152
|
+
|
|
153
|
+
def deactivate_participant(diagram, stmt)
|
|
154
|
+
track_activation(diagram, actor_id(stmt[:deactivate]), false)
|
|
155
|
+
end
|
|
156
|
+
|
|
157
|
+
def add_participant(diagram, stmt, actor_type)
|
|
158
|
+
id = actor_id(stmt[:id])
|
|
159
|
+
@known_actor_ids << id
|
|
160
|
+
@box_ids&.push(id)
|
|
161
|
+
label = participant_label(id, stmt[:label])
|
|
162
|
+
known = diagram.find_participant(id)
|
|
163
|
+
shape = shape_type_of(stmt[:shape_metadata])
|
|
164
|
+
return update_participant(known, label, actor_type, shape) if known
|
|
165
|
+
|
|
166
|
+
diagram.participants << created_participant(
|
|
167
|
+
id, label, actor_type, shape, stmt
|
|
168
|
+
)
|
|
169
|
+
end
|
|
170
|
+
|
|
171
|
+
def created_participant(id, label, actor_type, shape, stmt)
|
|
172
|
+
participant(id, label, actor_type).tap do |item|
|
|
173
|
+
item.created = true if stmt[:create]
|
|
174
|
+
item.shape_type = shape
|
|
175
|
+
end
|
|
176
|
+
end
|
|
177
|
+
|
|
178
|
+
def shape_type_of(metadata)
|
|
179
|
+
SHAPE_TYPE.match(metadata.to_s)&.[](1)&.downcase
|
|
180
|
+
end
|
|
181
|
+
|
|
182
|
+
def participant_label(id, captured_label)
|
|
183
|
+
shown_id = Diagram::SequenceText.decode(id)
|
|
184
|
+
label = captured_label ? decoded_text(captured_label) : shown_id
|
|
185
|
+
label.empty? ? shown_id : label
|
|
186
|
+
end
|
|
187
|
+
|
|
188
|
+
def participant(id, label, actor_type)
|
|
189
|
+
Diagram::SequenceParticipant.new.tap do |item|
|
|
190
|
+
item.id = id
|
|
191
|
+
item.label = label
|
|
192
|
+
item.actor_type = actor_type
|
|
193
|
+
end
|
|
194
|
+
end
|
|
195
|
+
|
|
196
|
+
def update_participant(participant, label, actor_type, shape_type = nil)
|
|
197
|
+
participant.label = label unless label.empty?
|
|
198
|
+
participant.actor_type = actor_type
|
|
199
|
+
participant.shape_type = shape_type if shape_type
|
|
200
|
+
end
|
|
201
|
+
|
|
202
|
+
def add_message(diagram, stmt)
|
|
203
|
+
check_lifecycle!(stmt)
|
|
204
|
+
data = message_data(stmt)
|
|
205
|
+
ensure_participant(diagram, data[:from_id])
|
|
206
|
+
ensure_participant(diagram, data[:to_id])
|
|
207
|
+
handle_arrow_activation(diagram, data[:from_id], data[:to_id],
|
|
208
|
+
activation(stmt[:arrow]))
|
|
209
|
+
diagram.messages << sequence_message(data)
|
|
210
|
+
@message_index += 1
|
|
211
|
+
end
|
|
212
|
+
|
|
213
|
+
def message_data(stmt)
|
|
214
|
+
styles = ARROW_STYLES.fetch(
|
|
215
|
+
arrow_base(stmt[:arrow]), %w[solid filled target]
|
|
216
|
+
)
|
|
217
|
+
{
|
|
218
|
+
from_id: actor_id(stmt[:from]),
|
|
219
|
+
to_id: actor_id(stmt[:to]),
|
|
220
|
+
message_text: extract_text(stmt[:text]),
|
|
221
|
+
line_style: styles[0], head_style: styles[1], head_side: styles[2]
|
|
222
|
+
}
|
|
223
|
+
end
|
|
224
|
+
|
|
225
|
+
def sequence_message(data)
|
|
226
|
+
Diagram::SequenceMessage.new.tap do |message|
|
|
227
|
+
data.each do |attribute, value|
|
|
228
|
+
message.public_send("#{attribute}=", value)
|
|
229
|
+
end
|
|
230
|
+
end
|
|
231
|
+
end
|
|
232
|
+
|
|
233
|
+
# mermaid rejects a `create` whose id already belongs to an actor,
|
|
234
|
+
# whether that actor arrived by declaration, a message, a note or
|
|
235
|
+
# a `links` line — `@known_actor_ids` tracks exactly that set.
|
|
236
|
+
# `diagram.participants` is NOT the same set: `track_activation`
|
|
237
|
+
# also adds to it (for rendering an activated lifeline), but an
|
|
238
|
+
# `activate`/`deactivate` reference introduces no actor on
|
|
239
|
+
# mermaid's side, so it must not trip this check.
|
|
240
|
+
def register_created(id)
|
|
241
|
+
if @known_actor_ids.include?(id)
|
|
242
|
+
raise Parser::ParseError,
|
|
243
|
+
"It is not possible to have actors with the same id, " \
|
|
244
|
+
"even if one is destroyed before the next is created (#{id})."
|
|
245
|
+
end
|
|
246
|
+
|
|
247
|
+
@pending_created = id
|
|
248
|
+
end
|
|
249
|
+
|
|
250
|
+
def register_destroyed(id)
|
|
251
|
+
@pending_destroyed = id
|
|
252
|
+
end
|
|
253
|
+
|
|
254
|
+
# Ports mermaid's own `apply()` create/destroy check verbatim: a
|
|
255
|
+
# single pending slot per kind, checked and cleared on the very
|
|
256
|
+
# NEXT message — nothing else (a note, an activation, a nested
|
|
257
|
+
# block boundary) consumes or clears it. `create` takes priority
|
|
258
|
+
# over a still-pending `destroy`, matching mermaid's own
|
|
259
|
+
# `if (lastCreated) {...} else if (lastDestroyed) {...}`.
|
|
260
|
+
def check_lifecycle!(stmt)
|
|
261
|
+
to_id = actor_id(stmt[:to])
|
|
262
|
+
from_id = actor_id(stmt[:from])
|
|
263
|
+
if @pending_created
|
|
264
|
+
validate_created!(to_id)
|
|
265
|
+
@pending_created = nil
|
|
266
|
+
elsif @pending_destroyed
|
|
267
|
+
validate_destroyed!(from_id, to_id)
|
|
268
|
+
@pending_destroyed = nil
|
|
269
|
+
end
|
|
270
|
+
end
|
|
271
|
+
|
|
272
|
+
def validate_created!(to_id)
|
|
273
|
+
return if to_id == @pending_created
|
|
274
|
+
|
|
275
|
+
raise Parser::ParseError,
|
|
276
|
+
"The created participant #{@pending_created} does not " \
|
|
277
|
+
"have an associated creating message after its " \
|
|
278
|
+
"declaration. Please check the sequence diagram."
|
|
279
|
+
end
|
|
280
|
+
|
|
281
|
+
def validate_destroyed!(from_id, to_id)
|
|
282
|
+
return if [from_id, to_id].include?(@pending_destroyed)
|
|
283
|
+
|
|
284
|
+
raise Parser::ParseError,
|
|
285
|
+
"The destroyed participant #{@pending_destroyed} does " \
|
|
286
|
+
"not have an associated destroying message after its " \
|
|
287
|
+
"declaration. Please check the sequence diagram."
|
|
288
|
+
end
|
|
289
|
+
|
|
290
|
+
def arrow_base(arrow)
|
|
291
|
+
arrow[:arrow_base].to_s
|
|
292
|
+
end
|
|
293
|
+
|
|
294
|
+
def activation(arrow)
|
|
295
|
+
# Stripped: mermaid allows whitespace before the suffix, so the
|
|
296
|
+
# capture can arrive as " +" and never matched a bare "+".
|
|
297
|
+
arrow[:activation].to_s.strip
|
|
298
|
+
end
|
|
299
|
+
|
|
300
|
+
def handle_arrow_activation(diagram, from_id, to_id, suffix)
|
|
301
|
+
case suffix
|
|
302
|
+
when "+" then track_activation(diagram, to_id, true)
|
|
303
|
+
when "-" then track_activation(diagram, from_id, false)
|
|
304
|
+
end
|
|
305
|
+
end
|
|
306
|
+
|
|
307
|
+
def add_note(diagram, stmt)
|
|
308
|
+
participants = note_participants(stmt)
|
|
309
|
+
participants.each { |pid| ensure_participant(diagram, pid) }
|
|
310
|
+
diagram.notes << sequence_note(stmt, participants)
|
|
311
|
+
end
|
|
312
|
+
|
|
313
|
+
def note_position(position)
|
|
314
|
+
return "left_of" if position[:left_of]
|
|
315
|
+
return "right_of" if position[:right_of]
|
|
316
|
+
|
|
317
|
+
"over"
|
|
318
|
+
end
|
|
319
|
+
|
|
320
|
+
def note_participants(stmt)
|
|
321
|
+
captures = stmt[:participants]
|
|
322
|
+
captures = [captures] unless captures.is_a?(Array)
|
|
323
|
+
captures.map { |item| actor_id(item[:participant]) }
|
|
324
|
+
end
|
|
325
|
+
|
|
326
|
+
def sequence_note(stmt, participants)
|
|
327
|
+
Diagram::SequenceNote.new.tap do |note|
|
|
328
|
+
note.text = decoded_text(stmt[:note_text])
|
|
329
|
+
note.position = note_position(stmt[:position])
|
|
330
|
+
note.participant_ids = participants
|
|
331
|
+
note.message_index = @message_index
|
|
332
|
+
note.order = next_order
|
|
333
|
+
end
|
|
334
|
+
end
|
|
335
|
+
|
|
336
|
+
def track_activation(diagram, participant_id, activate)
|
|
337
|
+
ensure_participant(diagram, participant_id, track: false)
|
|
338
|
+
@activations[participant_id] ||= []
|
|
339
|
+
return open_activation(participant_id) if activate
|
|
340
|
+
|
|
341
|
+
close_activation(diagram, participant_id)
|
|
342
|
+
end
|
|
343
|
+
|
|
344
|
+
def open_activation(participant_id)
|
|
345
|
+
@activations[participant_id] << { start: @message_index }
|
|
346
|
+
end
|
|
347
|
+
|
|
348
|
+
def close_activation(diagram, participant_id)
|
|
349
|
+
active = @activations[participant_id].reverse.find do |item|
|
|
350
|
+
!item[:end]
|
|
351
|
+
end
|
|
352
|
+
refuse_inactive_participant(participant_id) unless active
|
|
353
|
+
active[:end] = @message_index
|
|
354
|
+
diagram.activations << activation_record(participant_id, active)
|
|
355
|
+
end
|
|
356
|
+
|
|
357
|
+
def refuse_inactive_participant(participant_id)
|
|
358
|
+
raise Parser::ParseError,
|
|
359
|
+
"Trying to deactivate an inactive participant " \
|
|
360
|
+
"(#{participant_id})"
|
|
361
|
+
end
|
|
362
|
+
|
|
363
|
+
def activation_record(participant_id, active)
|
|
364
|
+
Diagram::SequenceActivation.new.tap do |activation|
|
|
365
|
+
activation.participant_id = participant_id
|
|
366
|
+
activation.start_index = active[:start]
|
|
367
|
+
activation.end_index = active[:end]
|
|
368
|
+
end
|
|
369
|
+
end
|
|
370
|
+
|
|
371
|
+
# An actor name is a bounded run of text, so a name that abuts a
|
|
372
|
+
# comma, colon or arrow (`participant A `, `Note over A , B: n`)
|
|
373
|
+
# carries the surrounding whitespace into the capture. Every
|
|
374
|
+
# capture site normalises through here rather than duplicating
|
|
375
|
+
# `.strip`, because each is reachable from legal mermaid and each
|
|
376
|
+
# unstripped id creates a phantom duplicate participant.
|
|
377
|
+
#
|
|
378
|
+
# The id stays as written: mmdc keeps `participant EA` and
|
|
379
|
+
# `E#65;` as two actors and decodes only the text it draws.
|
|
380
|
+
def actor_id(slice) = slice.to_s.strip
|
|
381
|
+
|
|
382
|
+
# `track:` is false only from `track_activation`: an `activate`/
|
|
383
|
+
# `deactivate` reference introduces a participant for RENDERING
|
|
384
|
+
# (mermaid draws the lifeline either way), but not for mermaid's
|
|
385
|
+
# own actor bookkeeping — its `activeStart` record adds no actor,
|
|
386
|
+
# so `register_created`'s duplicate-id check must not see one
|
|
387
|
+
# either (measured against mermaid 11.16.1: `activate C\ncreate
|
|
388
|
+
# participant C\nA->>C: m` is accepted there).
|
|
389
|
+
def ensure_participant(diagram, participant_id, track: true)
|
|
390
|
+
@known_actor_ids << participant_id if track
|
|
391
|
+
|
|
392
|
+
return if diagram.find_participant(participant_id)
|
|
393
|
+
|
|
394
|
+
participant = Diagram::SequenceParticipant.new.tap do |p|
|
|
395
|
+
p.id = participant_id
|
|
396
|
+
p.label = Diagram::SequenceText.decode(participant_id)
|
|
397
|
+
p.actor_type = "participant"
|
|
398
|
+
end
|
|
399
|
+
|
|
400
|
+
diagram.participants << participant
|
|
401
|
+
end
|
|
402
|
+
|
|
403
|
+
# Message text is decoded later, by `SequenceText.display`, which
|
|
404
|
+
# also drops `wrap:` and turns `<br>` into a space; labels and notes
|
|
405
|
+
# have no later step.
|
|
406
|
+
def decoded_text(value)
|
|
407
|
+
Diagram::SequenceText.decode(extract_text(value))
|
|
408
|
+
end
|
|
409
|
+
|
|
410
|
+
# `message_text` is a Slice when non-empty and `[]` (Parslet's
|
|
411
|
+
# empty-repeat capture) when empty, so `[]` always means empty.
|
|
412
|
+
# It has to be recursed into rather than `.to_s`'d directly: the
|
|
413
|
+
# Hash arm receives `{message_text: []}`, and `[]` is truthy in
|
|
414
|
+
# Ruby, so a naive `value[:message_text].to_s` renders the literal
|
|
415
|
+
# two-character string "[]" instead of reaching the Array branch.
|
|
416
|
+
def extract_text(value)
|
|
417
|
+
case value
|
|
418
|
+
when Hash
|
|
419
|
+
if value[:string]
|
|
420
|
+
capture_string(value[:string])
|
|
421
|
+
else
|
|
422
|
+
extract_text(value[:message_text])
|
|
423
|
+
end
|
|
424
|
+
when Array then ""
|
|
425
|
+
else value.to_s
|
|
426
|
+
end.strip
|
|
427
|
+
end
|
|
428
|
+
end
|
|
429
|
+
end
|
|
430
|
+
end
|
|
431
|
+
end
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative "../../diagram/sequence_frame"
|
|
4
|
+
require_relative "../../diagram/sequence_box"
|
|
5
|
+
require_relative "sequence_box_title"
|
|
6
|
+
|
|
7
|
+
module Etassia
|
|
8
|
+
module Parser
|
|
9
|
+
module Builders
|
|
10
|
+
# Walks the control blocks and `box` groups of a sequence diagram,
|
|
11
|
+
# recording each as a frame or box on the model while the statements
|
|
12
|
+
# inside still go through `process_statements`.
|
|
13
|
+
#
|
|
14
|
+
# Each block rule names its statement list with `.as`, so the key is
|
|
15
|
+
# always present; the else/and/option continuations are a named
|
|
16
|
+
# `repeat` (an Array, possibly empty) of hashes that name theirs.
|
|
17
|
+
module SequenceBlocks
|
|
18
|
+
private
|
|
19
|
+
|
|
20
|
+
def reset_blocks
|
|
21
|
+
@open_frames = []
|
|
22
|
+
@event_order = 0
|
|
23
|
+
@box_ids = nil
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def process_box(diagram, stmt)
|
|
27
|
+
box = Diagram::SequenceBox.new(
|
|
28
|
+
**SequenceBoxTitle.split(decoded_text(stmt[:box_label])),
|
|
29
|
+
)
|
|
30
|
+
@box_ids = box.participant_ids
|
|
31
|
+
process_statements(diagram, stmt[:box_statements])
|
|
32
|
+
@box_ids = nil
|
|
33
|
+
diagram.boxes << box
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def process_loop(diagram, stmt)
|
|
37
|
+
within_frame(diagram, "loop", stmt[:loop_label]) do
|
|
38
|
+
process_statements(diagram, stmt[:loop_statements])
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def process_alt(diagram, stmt)
|
|
43
|
+
within_frame(diagram, "alt", stmt[:alt_label]) do
|
|
44
|
+
process_statements(diagram, stmt[:alt_statements])
|
|
45
|
+
process_sections(diagram, stmt[:else_blocks], "else")
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
def process_opt(diagram, stmt)
|
|
50
|
+
within_frame(diagram, "opt", stmt[:opt_label]) do
|
|
51
|
+
process_statements(diagram, stmt[:opt_statements])
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
def process_rect(diagram, stmt)
|
|
56
|
+
within_frame(diagram, "rect", stmt[:rect_label]) do
|
|
57
|
+
process_statements(diagram, stmt[:rect_statements])
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
def process_par(diagram, stmt)
|
|
62
|
+
within_frame(diagram, "par", stmt[:par_label]) do
|
|
63
|
+
process_statements(diagram, stmt[:par_statements])
|
|
64
|
+
process_sections(diagram, stmt[:and_blocks], "and")
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
def process_critical(diagram, stmt)
|
|
69
|
+
within_frame(diagram, "critical", stmt[:critical_label]) do
|
|
70
|
+
process_statements(diagram, stmt[:critical_statements])
|
|
71
|
+
process_sections(diagram, stmt[:option_blocks], "option")
|
|
72
|
+
end
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
def process_break(diagram, stmt)
|
|
76
|
+
within_frame(diagram, "break", stmt[:break_label]) do
|
|
77
|
+
process_statements(diagram, stmt[:break_statements])
|
|
78
|
+
end
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
def within_frame(diagram, kind, label)
|
|
82
|
+
frame = Diagram::SequenceFrame.new(
|
|
83
|
+
kind: kind, label: decoded_text(label),
|
|
84
|
+
start_index: @message_index, depth: @open_frames.length,
|
|
85
|
+
open_order: next_order
|
|
86
|
+
)
|
|
87
|
+
diagram.frames << frame
|
|
88
|
+
@open_frames.push(frame)
|
|
89
|
+
yield
|
|
90
|
+
close_frame(@open_frames.pop)
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
def close_frame(frame)
|
|
94
|
+
frame.end_index = @message_index
|
|
95
|
+
frame.close_order = next_order
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
def next_order
|
|
99
|
+
@event_order += 1
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
# Each continuation names its own label and statement keys
|
|
103
|
+
# (`else_label`/`else_statements`, `and_label`/...), all spelled
|
|
104
|
+
# `<kind>_label` and `<kind>_statements`.
|
|
105
|
+
def process_sections(diagram, blocks, kind)
|
|
106
|
+
blocks.each do |block|
|
|
107
|
+
@open_frames.last.sections << Diagram::SequenceFrameSection.new(
|
|
108
|
+
kind: kind, label: decoded_text(block[:"#{kind}_label"]),
|
|
109
|
+
start_index: @message_index, order: next_order
|
|
110
|
+
)
|
|
111
|
+
process_statements(diagram, block[:"#{kind}_statements"])
|
|
112
|
+
end
|
|
113
|
+
end
|
|
114
|
+
end
|
|
115
|
+
end
|
|
116
|
+
end
|
|
117
|
+
end
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Etassia
|
|
4
|
+
module Parser
|
|
5
|
+
module Builders
|
|
6
|
+
# Splits the text after `box` into colour and title the way mermaid
|
|
7
|
+
# does: a leading `rgb(...)`-style function or a CSS colour name is
|
|
8
|
+
# the colour; anything else (a hex code included) leaves the whole
|
|
9
|
+
# text as the title.
|
|
10
|
+
module SequenceBoxTitle
|
|
11
|
+
COLOR_FUNCTION = /\A((?:rgba?|hsla?)\s*\([^)]*\))\s*(.*)\z/m
|
|
12
|
+
COLOR_WORD = /\A(\w+)\s*(.*)\z/m
|
|
13
|
+
COLOR_NAMES = %w[
|
|
14
|
+
aliceblue antiquewhite aqua aquamarine azure beige bisque black
|
|
15
|
+
blanchedalmond blue blueviolet brown burlywood cadetblue chartreuse
|
|
16
|
+
chocolate coral cornflowerblue cornsilk crimson cyan darkblue
|
|
17
|
+
darkcyan darkgoldenrod darkgray darkgreen darkgrey darkkhaki
|
|
18
|
+
darkmagenta darkolivegreen darkorange darkorchid darkred darksalmon
|
|
19
|
+
darkseagreen darkslateblue darkslategray darkslategrey darkturquoise
|
|
20
|
+
darkviolet deeppink deepskyblue dimgray dimgrey dodgerblue
|
|
21
|
+
firebrick floralwhite forestgreen fuchsia gainsboro ghostwhite gold
|
|
22
|
+
goldenrod gray green greenyellow grey honeydew hotpink indianred
|
|
23
|
+
indigo ivory khaki lavender lavenderblush lawngreen lemonchiffon
|
|
24
|
+
lightblue lightcoral lightcyan lightgoldenrodyellow lightgray
|
|
25
|
+
lightgreen lightgrey lightpink lightsalmon lightseagreen
|
|
26
|
+
lightskyblue lightslategray lightslategrey lightsteelblue
|
|
27
|
+
lightyellow lime limegreen linen magenta maroon mediumaquamarine
|
|
28
|
+
mediumblue mediumorchid mediumpurple mediumseagreen mediumslateblue
|
|
29
|
+
mediumspringgreen mediumturquoise mediumvioletred midnightblue
|
|
30
|
+
mintcream mistyrose moccasin navajowhite navy oldlace olive
|
|
31
|
+
olivedrab orange orangered orchid palegoldenrod palegreen
|
|
32
|
+
paleturquoise palevioletred papayawhip peachpuff peru pink plum
|
|
33
|
+
powderblue purple rebeccapurple red rosybrown royalblue saddlebrown
|
|
34
|
+
salmon sandybrown seagreen seashell sienna silver skyblue slateblue
|
|
35
|
+
slategray slategrey snow springgreen steelblue tan teal thistle
|
|
36
|
+
tomato transparent turquoise violet wheat white whitesmoke yellow
|
|
37
|
+
yellowgreen
|
|
38
|
+
].freeze
|
|
39
|
+
|
|
40
|
+
# @param text [String] the text after `box`
|
|
41
|
+
# @return [Hash] `color:` (nil when absent) and `title:`
|
|
42
|
+
def self.split(text)
|
|
43
|
+
match = COLOR_FUNCTION.match(text) || named_color(text)
|
|
44
|
+
return { color: nil, title: text } unless match
|
|
45
|
+
|
|
46
|
+
{ color: match[1], title: match[2].strip }
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
def self.named_color(text)
|
|
50
|
+
match = COLOR_WORD.match(text)
|
|
51
|
+
match if match && COLOR_NAMES.include?(match[1].downcase)
|
|
52
|
+
end
|
|
53
|
+
private_class_method :named_color
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
end
|