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,148 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "parslet"
|
|
4
|
+
|
|
5
|
+
module Etassia
|
|
6
|
+
module Parser
|
|
7
|
+
module Builders
|
|
8
|
+
# Transform for XY Chart diagrams
|
|
9
|
+
class XyChart < Parslet::Transform
|
|
10
|
+
# Transform title (from grammar: {:title=>{:string=>"..."}} )
|
|
11
|
+
rule(title: { string: simple(:title) }) do
|
|
12
|
+
{ type: :title, title: title.to_s }
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
# Transform values - keep as-is for now, will determine numeric vs
|
|
16
|
+
# categorical later
|
|
17
|
+
rule(value: simple(:v)) do
|
|
18
|
+
# Try to convert to number if it looks numeric, otherwise keep as
|
|
19
|
+
# string
|
|
20
|
+
str = v.to_s
|
|
21
|
+
if str.match?(/^\d+(\.\d+)?$/)
|
|
22
|
+
str.to_f
|
|
23
|
+
else
|
|
24
|
+
str
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
# Transform X-axis with label
|
|
29
|
+
rule(x_label: { string: simple(:label) }, x_values: subtree(:values)) do
|
|
30
|
+
{
|
|
31
|
+
type: :x_axis,
|
|
32
|
+
label: label.to_s,
|
|
33
|
+
values: Array(values),
|
|
34
|
+
}
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
rule(x_values: subtree(:values)) do
|
|
38
|
+
{
|
|
39
|
+
type: :x_axis,
|
|
40
|
+
label: nil,
|
|
41
|
+
values: Array(values),
|
|
42
|
+
}
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
# Transform Y-axis with label
|
|
46
|
+
rule(
|
|
47
|
+
y_label: { string: simple(:label) },
|
|
48
|
+
y_min: simple(:min),
|
|
49
|
+
y_max: simple(:max),
|
|
50
|
+
) do
|
|
51
|
+
{
|
|
52
|
+
type: :y_axis,
|
|
53
|
+
label: label.to_s,
|
|
54
|
+
min: min.to_s.to_f,
|
|
55
|
+
max: max.to_s.to_f,
|
|
56
|
+
}
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
rule(y_min: simple(:min), y_max: simple(:max)) do
|
|
60
|
+
{
|
|
61
|
+
type: :y_axis,
|
|
62
|
+
label: nil,
|
|
63
|
+
min: min.to_s.to_f,
|
|
64
|
+
max: max.to_s.to_f,
|
|
65
|
+
}
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
# Transform line dataset
|
|
69
|
+
rule(line_values: subtree(:values)) do
|
|
70
|
+
{
|
|
71
|
+
type: :dataset,
|
|
72
|
+
chart_type: :line,
|
|
73
|
+
label: "Line",
|
|
74
|
+
values: Array(values),
|
|
75
|
+
}
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
# Transform bar dataset
|
|
79
|
+
rule(bar_values: subtree(:values)) do
|
|
80
|
+
{
|
|
81
|
+
type: :dataset,
|
|
82
|
+
chart_type: :bar,
|
|
83
|
+
label: "Bar",
|
|
84
|
+
values: Array(values),
|
|
85
|
+
}
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
# Transform named dataset
|
|
89
|
+
rule(
|
|
90
|
+
dataset_label: { string: simple(:label) },
|
|
91
|
+
dataset_values: subtree(:values),
|
|
92
|
+
) do
|
|
93
|
+
{
|
|
94
|
+
type: :dataset,
|
|
95
|
+
chart_type: :line,
|
|
96
|
+
label: label.to_s,
|
|
97
|
+
values: Array(values),
|
|
98
|
+
}
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
# Transform the entire diagram
|
|
102
|
+
rule(statements: subtree(:statements)) do
|
|
103
|
+
XyChart.build(statements)
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
def self.build(statements)
|
|
107
|
+
result = {
|
|
108
|
+
title: nil,
|
|
109
|
+
x_axis: nil,
|
|
110
|
+
y_axis: nil,
|
|
111
|
+
datasets: [],
|
|
112
|
+
}
|
|
113
|
+
Array(statements).grep(Hash).each do |statement|
|
|
114
|
+
apply_statement(result, statement)
|
|
115
|
+
end
|
|
116
|
+
result
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
def self.apply_statement(result, statement)
|
|
120
|
+
case statement[:type]
|
|
121
|
+
when :title
|
|
122
|
+
result[:title] = statement[:title]
|
|
123
|
+
when :x_axis
|
|
124
|
+
result[:x_axis] = axis_values(statement, :values)
|
|
125
|
+
when :y_axis
|
|
126
|
+
result[:y_axis] = axis_values(statement, :min, :max)
|
|
127
|
+
when :dataset
|
|
128
|
+
result[:datasets] << dataset(statement)
|
|
129
|
+
end
|
|
130
|
+
end
|
|
131
|
+
|
|
132
|
+
def self.axis_values(statement, *keys)
|
|
133
|
+
keys.each_with_object(label: statement[:label]) do |key, values|
|
|
134
|
+
values[key] = statement[key]
|
|
135
|
+
end
|
|
136
|
+
end
|
|
137
|
+
|
|
138
|
+
def self.dataset(statement)
|
|
139
|
+
{
|
|
140
|
+
chart_type: statement[:chart_type],
|
|
141
|
+
label: statement[:label],
|
|
142
|
+
values: statement[:values],
|
|
143
|
+
}
|
|
144
|
+
end
|
|
145
|
+
end
|
|
146
|
+
end
|
|
147
|
+
end
|
|
148
|
+
end
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative "base"
|
|
4
|
+
require_relative "grammars/c4"
|
|
5
|
+
require_relative "builders/c4"
|
|
6
|
+
require_relative "native/builders/c4"
|
|
7
|
+
require_relative "../diagram/c4"
|
|
8
|
+
|
|
9
|
+
module Etassia
|
|
10
|
+
module Parser
|
|
11
|
+
# C4 parser for Mermaid C4 diagram syntax.
|
|
12
|
+
#
|
|
13
|
+
# Uses Parslet grammar-based parsing to handle C4 diagram syntax including
|
|
14
|
+
# elements, relationships, and boundaries.
|
|
15
|
+
#
|
|
16
|
+
# Parses C4 diagrams with support for:
|
|
17
|
+
# - Multiple C4 levels (Context, Container, Component, Dynamic, Deployment)
|
|
18
|
+
# - Person, System, Container, Component elements
|
|
19
|
+
# - External variants (_Ext suffix)
|
|
20
|
+
# - Database and Queue variants (SystemDb, ContainerQueue, etc.)
|
|
21
|
+
# - Relationships (Rel, BiRel)
|
|
22
|
+
# - Boundaries (Enterprise_Boundary, System_Boundary, Boundary)
|
|
23
|
+
# - Nested boundaries
|
|
24
|
+
# - Element attributes (sprite, link, tags)
|
|
25
|
+
# - Layout configuration
|
|
26
|
+
#
|
|
27
|
+
# @example Parse a simple C4 Context diagram
|
|
28
|
+
# parser = C4.new
|
|
29
|
+
# source = "C4Context\ntitle My System\nPerson(user, \"User\")"
|
|
30
|
+
# diagram = parser.parse(source)
|
|
31
|
+
class C4 < Base
|
|
32
|
+
grammar Grammars::C4
|
|
33
|
+
builder Builders::C4
|
|
34
|
+
native :c4, builder: Native::Builders::C4
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
end
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative "base"
|
|
4
|
+
require_relative "grammars/class_diagram"
|
|
5
|
+
require_relative "builders/class_diagram"
|
|
6
|
+
require_relative "class_notes"
|
|
7
|
+
require_relative "class_namespaces"
|
|
8
|
+
require_relative "native/builders/class_diagram"
|
|
9
|
+
require_relative "../diagram/class_diagram"
|
|
10
|
+
|
|
11
|
+
module Etassia
|
|
12
|
+
module Parser
|
|
13
|
+
# Class diagram parser for Mermaid class diagram syntax.
|
|
14
|
+
#
|
|
15
|
+
# Parses class diagrams with support for:
|
|
16
|
+
# - Class declarations with stereotypes
|
|
17
|
+
# - Attributes with visibility modifiers
|
|
18
|
+
# - Methods with parameters and return types
|
|
19
|
+
# - Relationships (inheritance, composition, aggregation, association)
|
|
20
|
+
# - Generic types (e.g., List~String~)
|
|
21
|
+
# - Namespaces
|
|
22
|
+
# - Cardinality labels
|
|
23
|
+
#
|
|
24
|
+
# @example Parse a simple class diagram
|
|
25
|
+
# parser = ClassDiagram.new
|
|
26
|
+
# diagram = parser.parse("classDiagram\nAnimal <|-- Dog")
|
|
27
|
+
class ClassDiagram < Base
|
|
28
|
+
native :class_diagram, builder: Native::Builders::ClassDiagram
|
|
29
|
+
|
|
30
|
+
# Parses class diagram source into a ClassDiagram model.
|
|
31
|
+
#
|
|
32
|
+
# @param source [String] the Mermaid class diagram source
|
|
33
|
+
# @return [Diagram::ClassDiagram] the parsed class diagram
|
|
34
|
+
# @raise [ParseError] if syntax is invalid
|
|
35
|
+
def parse(source)
|
|
36
|
+
native_diagram(source) || ruby_diagram(source)
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
private
|
|
40
|
+
|
|
41
|
+
def ruby_diagram(source)
|
|
42
|
+
tree = parse_with_grammar(Grammars::ClassDiagram.new, source)
|
|
43
|
+
diagram = Builders::ClassDiagram.new.apply(tree, source)
|
|
44
|
+
diagram.notes = ClassNotes.collect(tree, diagram)
|
|
45
|
+
diagram.namespaces = ClassNamespaces.collect(tree, diagram)
|
|
46
|
+
diagram
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
# The native builder also collects the notes and namespaces, and
|
|
50
|
+
# reads member text back from the source.
|
|
51
|
+
def native_diagram(source)
|
|
52
|
+
entry, builder = self.class.native
|
|
53
|
+
tree = Native.parse(entry, source)
|
|
54
|
+
tree && builder.new.apply(tree, source)
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
end
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative "../diagram/class_namespace"
|
|
4
|
+
|
|
5
|
+
module Etassia
|
|
6
|
+
module Parser
|
|
7
|
+
# Collects the `namespace Name { ... }` blocks of a class diagram parse
|
|
8
|
+
# tree, with the ids of the classes the builder created inside each.
|
|
9
|
+
class ClassNamespaces
|
|
10
|
+
ID_KEYS = %i[class_id from_id to_id].freeze
|
|
11
|
+
|
|
12
|
+
# @param tree [Array<Hash>] the class diagram parse tree
|
|
13
|
+
# @param diagram [Diagram::ClassDiagram] the built diagram
|
|
14
|
+
# @return [Array<Diagram::ClassNamespace>] one per distinct name, in
|
|
15
|
+
# source order
|
|
16
|
+
def self.collect(tree, diagram)
|
|
17
|
+
new(diagram).collect(tree)
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def initialize(diagram)
|
|
21
|
+
@ids = diagram.entities.map(&:id)
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def collect(tree)
|
|
25
|
+
blocks = Array(tree).select do |item|
|
|
26
|
+
item.is_a?(Hash) && item[:namespace_keyword]
|
|
27
|
+
end
|
|
28
|
+
grouped = blocks.group_by { |block| block[:namespace_name].to_s }
|
|
29
|
+
claim_last(grouped.map { |name, group| namespace(name, group) })
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
private
|
|
33
|
+
|
|
34
|
+
def namespace(name, blocks)
|
|
35
|
+
ids = blocks.flat_map { |block| member_ids(block) }
|
|
36
|
+
Diagram::ClassNamespace.new(name: name, class_ids: ids.uniq)
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def member_ids(block)
|
|
40
|
+
Array(block[:namespace_body]).flat_map do |statement|
|
|
41
|
+
ID_KEYS.filter_map { |key| known(statement[key]) }
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
def known(slice)
|
|
46
|
+
return unless slice
|
|
47
|
+
|
|
48
|
+
id = slice.to_s.delete("`")
|
|
49
|
+
id if @ids.include?(id)
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
# mmdc gives a class one parent: the last namespace that lists it.
|
|
53
|
+
def claim_last(namespaces)
|
|
54
|
+
namespaces.reverse_each.with_object([]) do |item, claimed|
|
|
55
|
+
item.class_ids -= claimed
|
|
56
|
+
claimed.concat(item.class_ids)
|
|
57
|
+
end
|
|
58
|
+
namespaces
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
end
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative "../diagram/class_note"
|
|
4
|
+
|
|
5
|
+
module Etassia
|
|
6
|
+
module Parser
|
|
7
|
+
# Collects the `note` statements of a class diagram parse tree.
|
|
8
|
+
#
|
|
9
|
+
# The class builder drops them, so they are read from the tree beside it.
|
|
10
|
+
class ClassNotes
|
|
11
|
+
LINE_BREAK = %r{<br\s*/?>}i
|
|
12
|
+
|
|
13
|
+
# @param tree [Array<Hash>] the class diagram parse tree
|
|
14
|
+
# @param diagram [Diagram::ClassDiagram] the built diagram, for the
|
|
15
|
+
# ids a `note for` can point at
|
|
16
|
+
# @return [Array<Diagram::ClassNote>] the notes in source order
|
|
17
|
+
def self.collect(tree, diagram)
|
|
18
|
+
new(diagram).collect(tree)
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def initialize(diagram)
|
|
22
|
+
@ids = diagram.entities.map(&:id)
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def collect(tree)
|
|
26
|
+
Array(tree).filter_map do |statement|
|
|
27
|
+
next unless statement.is_a?(Hash) && statement[:note_text]
|
|
28
|
+
|
|
29
|
+
Diagram::ClassNote.new(text: note_text(statement[:note_text]),
|
|
30
|
+
target_id: target(statement[:note_for]))
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
private
|
|
35
|
+
|
|
36
|
+
# mmdc renders the text as HTML: a <br> starts a new line and any
|
|
37
|
+
# other tag shows as its content. A literal backslash-n stays text.
|
|
38
|
+
def note_text(slice)
|
|
39
|
+
text = slice.to_s.strip.sub(/\A"(.*)"\z/m, '\1')
|
|
40
|
+
text.gsub(LINE_BREAK, "\n").gsub(/<[^>]*>/, "")
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def target(slice)
|
|
44
|
+
return unless slice
|
|
45
|
+
|
|
46
|
+
name = slice.to_s.delete("`")
|
|
47
|
+
return name if @ids.include?(name)
|
|
48
|
+
|
|
49
|
+
matches = @ids.select { |id| id.end_with?(".#{name}") }
|
|
50
|
+
matches.first if matches.one?
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
end
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative "base"
|
|
4
|
+
require_relative "../diagram/er_diagram"
|
|
5
|
+
require_relative "grammars/er_diagram"
|
|
6
|
+
require_relative "builders/er_diagram"
|
|
7
|
+
require_relative "native/builders/er_diagram"
|
|
8
|
+
|
|
9
|
+
module Etassia
|
|
10
|
+
module Parser
|
|
11
|
+
# ER diagram parser for Mermaid ER diagram syntax.
|
|
12
|
+
#
|
|
13
|
+
# Parses ER diagrams with support for:
|
|
14
|
+
# - Entity declarations with attributes
|
|
15
|
+
# - Attribute types and key markers (PK, FK, UK)
|
|
16
|
+
# - Relationships with cardinality notation
|
|
17
|
+
# - Identifying and non-identifying relationships
|
|
18
|
+
#
|
|
19
|
+
# @example Parse a simple ER diagram
|
|
20
|
+
# parser = ErDiagram.new
|
|
21
|
+
# diagram = parser.parse("erDiagram\nCUSTOMER ||--o{ ORDER : places")
|
|
22
|
+
class ErDiagram < Base
|
|
23
|
+
grammar Grammars::ErDiagram
|
|
24
|
+
builder Builders::ErDiagram
|
|
25
|
+
native :er_diagram, builder: Native::Builders::ErDiagram
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative "base"
|
|
4
|
+
require_relative "grammars/error"
|
|
5
|
+
require_relative "builders/error"
|
|
6
|
+
require_relative "../diagram/error"
|
|
7
|
+
|
|
8
|
+
module Etassia
|
|
9
|
+
module Parser
|
|
10
|
+
# Error diagram parser for Mermaid error diagram syntax.
|
|
11
|
+
#
|
|
12
|
+
# Uses Parslet grammar-based parsing to handle simple error diagrams.
|
|
13
|
+
#
|
|
14
|
+
# Parses error diagrams with support for:
|
|
15
|
+
# - Basic error keyword
|
|
16
|
+
# - Optional error message text
|
|
17
|
+
#
|
|
18
|
+
# @example Parse a simple error diagram
|
|
19
|
+
# parser = Error.new
|
|
20
|
+
# diagram = parser.parse("error")
|
|
21
|
+
#
|
|
22
|
+
# @example Parse error diagram with message
|
|
23
|
+
# parser = Error.new
|
|
24
|
+
# diagram = parser.parse("Error Diagrams")
|
|
25
|
+
class Error < Base
|
|
26
|
+
grammar Grammars::Error
|
|
27
|
+
builder Builders::Error
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative "base"
|
|
4
|
+
require_relative "grammars/flowchart"
|
|
5
|
+
require_relative "builders/flowchart"
|
|
6
|
+
require_relative "native/builders/flowchart"
|
|
7
|
+
require_relative "../diagram/flowchart"
|
|
8
|
+
|
|
9
|
+
module Etassia
|
|
10
|
+
module Parser
|
|
11
|
+
# Flowchart parser for Mermaid flowchart syntax.
|
|
12
|
+
#
|
|
13
|
+
# Parses flowchart diagrams with support for:
|
|
14
|
+
# - Multiple node shapes (rectangle, rounded, rhombus, circle, etc.)
|
|
15
|
+
# - Multiple edge types (arrow, line, dotted, etc.)
|
|
16
|
+
# - Node labels with special characters
|
|
17
|
+
# - Edge chaining (A --> B --> C)
|
|
18
|
+
# - Subgraphs
|
|
19
|
+
# - Styling directives
|
|
20
|
+
# - Direction specification (TD, LR, etc.)
|
|
21
|
+
#
|
|
22
|
+
# @example Parse a simple flowchart
|
|
23
|
+
# parser = Flowchart.new
|
|
24
|
+
# diagram = parser.parse("graph TD\nA[Start]-->B[End]")
|
|
25
|
+
class Flowchart < Base
|
|
26
|
+
native :flowchart, builder: Native::Builders::Flowchart
|
|
27
|
+
|
|
28
|
+
# Parses flowchart source into a Flowchart diagram model.
|
|
29
|
+
#
|
|
30
|
+
# @param source [String] the Mermaid flowchart source
|
|
31
|
+
# @return [Diagram::Flowchart] the parsed flowchart
|
|
32
|
+
# @raise [ParseError] if syntax is invalid
|
|
33
|
+
def parse(source)
|
|
34
|
+
# A lone CR is folded before the grammar sees it; the shared
|
|
35
|
+
# helper owns the parse and the failure message.
|
|
36
|
+
source = normalize_line_ends(source)
|
|
37
|
+
native_diagram(source) ||
|
|
38
|
+
Builders::Flowchart.new.apply(parse_tree(source))
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
private
|
|
42
|
+
|
|
43
|
+
# The native engine recurses per nested box as well and can run
|
|
44
|
+
# out of stack before the Parslet grammar does. The Ruby path then
|
|
45
|
+
# answers, with its own "nests too deeply" error.
|
|
46
|
+
def native_diagram(source)
|
|
47
|
+
super
|
|
48
|
+
rescue SystemStackError
|
|
49
|
+
nil
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
# A deeply nested diagram runs the grammar past the stack. mmdc
|
|
53
|
+
# renders 220 nested subgraphs and we refuse them, which is a gap —
|
|
54
|
+
# but letting a StackError out of a parse is not a gap, it is a
|
|
55
|
+
# crash in whatever called us.
|
|
56
|
+
#
|
|
57
|
+
# Only the grammar is wrapped. Both halves recurse, but the grammar
|
|
58
|
+
# spends far more stack per nested box, so on a source anyone can
|
|
59
|
+
# write it is the one that gives out first — measured here just
|
|
60
|
+
# under 190 nested boxes, a tree the transform then walks without
|
|
61
|
+
# trouble. A runaway recursion in the transform therefore stays
|
|
62
|
+
# visible instead of being reported as a diagram that nests too
|
|
63
|
+
# deeply. The depth moves with the stack the process was given, and
|
|
64
|
+
# a tree built by hand rather than parsed can still outrun the
|
|
65
|
+
# transform; neither changes which one a real source reaches first.
|
|
66
|
+
#
|
|
67
|
+
# @param source [String] the source with line ends already folded
|
|
68
|
+
# @return [Hash, Array] the parse tree
|
|
69
|
+
def parse_tree(source)
|
|
70
|
+
parse_with_grammar(Grammars::Flowchart.new, source)
|
|
71
|
+
rescue SystemStackError
|
|
72
|
+
raise ParseError, "Diagram nests too deeply to parse."
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
# mermaid folds a CRLF and a lone CR into a newline before it reads
|
|
76
|
+
# anything, so a bare `\r` ends a line, a comment and an accTitle's
|
|
77
|
+
# text. The grammar's `newline` knows `\n` and `\r\n` only, and a
|
|
78
|
+
# lone `\r` used to throw away a diagram mmdc draws.
|
|
79
|
+
#
|
|
80
|
+
# @param source [String] the Mermaid flowchart source
|
|
81
|
+
# @return [String] the source with every line end as `\n`
|
|
82
|
+
def normalize_line_ends(source)
|
|
83
|
+
source.gsub(/\r\n?/, "\n")
|
|
84
|
+
end
|
|
85
|
+
end
|
|
86
|
+
end
|
|
87
|
+
end
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative "base"
|
|
4
|
+
require_relative "grammars/gantt"
|
|
5
|
+
require_relative "builders/gantt"
|
|
6
|
+
require_relative "native/builders/gantt"
|
|
7
|
+
require_relative "../diagram/gantt"
|
|
8
|
+
|
|
9
|
+
module Etassia
|
|
10
|
+
module Parser
|
|
11
|
+
# Gantt chart parser for Mermaid gantt diagram syntax.
|
|
12
|
+
#
|
|
13
|
+
# Uses Parslet grammar-based parsing to handle Gantt chart syntax
|
|
14
|
+
# with sections, tasks, dependencies, and timeline configuration.
|
|
15
|
+
#
|
|
16
|
+
# Parses Gantt charts with support for:
|
|
17
|
+
# - Title and date format declarations
|
|
18
|
+
# - Axis formatting and tick intervals
|
|
19
|
+
# - Excludes (weekends, weekdays, specific dates)
|
|
20
|
+
# - Section grouping
|
|
21
|
+
# - Tasks with dates, durations, and dependencies
|
|
22
|
+
# - Task status tags (done, active, crit, milestone)
|
|
23
|
+
# - Click handlers for interactivity
|
|
24
|
+
# - Accessibility features (accTitle, accDescr)
|
|
25
|
+
# - Comments
|
|
26
|
+
#
|
|
27
|
+
# @example Parse a simple Gantt chart
|
|
28
|
+
# parser = Gantt.new
|
|
29
|
+
# diagram = parser.parse(<<~GANTT)
|
|
30
|
+
# gantt
|
|
31
|
+
# title Project Timeline
|
|
32
|
+
# dateFormat YYYY-MM-DD
|
|
33
|
+
# section Planning
|
|
34
|
+
# Task 1 :a1, 2024-01-01, 30d
|
|
35
|
+
# Task 2 :after a1, 20d
|
|
36
|
+
# GANTT
|
|
37
|
+
class Gantt < Base
|
|
38
|
+
grammar Grammars::Gantt
|
|
39
|
+
builder Builders::Gantt
|
|
40
|
+
native :gantt, builder: Native::Builders::Gantt
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
end
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative "base"
|
|
4
|
+
require_relative "grammars/git_graph"
|
|
5
|
+
require_relative "builders/git_graph"
|
|
6
|
+
require_relative "native/builders/gitgraph"
|
|
7
|
+
require_relative "../diagram/git_graph"
|
|
8
|
+
|
|
9
|
+
module Etassia
|
|
10
|
+
module Parser
|
|
11
|
+
# Git Graph parser for Mermaid gitGraph diagram syntax.
|
|
12
|
+
#
|
|
13
|
+
# Uses Parslet grammar-based parsing to handle git graph syntax
|
|
14
|
+
# with commits, branches, merges, and cherry-picks.
|
|
15
|
+
#
|
|
16
|
+
# Parses git graphs with support for:
|
|
17
|
+
# - Commit declarations with id, type, and tag
|
|
18
|
+
# - Branch creation with optional order
|
|
19
|
+
# - Checkout/switch operations
|
|
20
|
+
# - Merge operations
|
|
21
|
+
# - Cherry-pick operations
|
|
22
|
+
# - Commit types (NORMAL, REVERSE, HIGHLIGHT)
|
|
23
|
+
#
|
|
24
|
+
# @example Parse a simple git graph
|
|
25
|
+
# parser = GitGraph.new
|
|
26
|
+
# source = <<~MERMAID
|
|
27
|
+
# gitGraph
|
|
28
|
+
# commit id: "Initial"
|
|
29
|
+
# branch develop
|
|
30
|
+
# checkout develop
|
|
31
|
+
# commit id: "Feature"
|
|
32
|
+
# checkout main
|
|
33
|
+
# merge develop
|
|
34
|
+
# MERMAID
|
|
35
|
+
# diagram = parser.parse(source)
|
|
36
|
+
class GitGraph < Base
|
|
37
|
+
native :gitgraph, builder: Native::Builders::GitGraph
|
|
38
|
+
|
|
39
|
+
COMMIT_ATTRIBUTES = %i[
|
|
40
|
+
id message type tag tags branch_name parent_ids is_merge merge_branch
|
|
41
|
+
is_cherry_pick cherry_pick_parent
|
|
42
|
+
].freeze
|
|
43
|
+
BRANCH_ATTRIBUTES = %i[
|
|
44
|
+
name order parent_branch created_at_commit
|
|
45
|
+
].freeze
|
|
46
|
+
|
|
47
|
+
# Parses git graph diagram source into a GitGraph model.
|
|
48
|
+
#
|
|
49
|
+
# @param source [String] the Mermaid git graph diagram source
|
|
50
|
+
# @return [Diagram::GitGraph] the parsed git graph diagram
|
|
51
|
+
# @raise [ParseError] if syntax is invalid
|
|
52
|
+
def parse(source, main_branch_name: "main")
|
|
53
|
+
result, orientation =
|
|
54
|
+
native_result(source, main_branch_name) ||
|
|
55
|
+
ruby_result(source, main_branch_name)
|
|
56
|
+
create_diagram(result, orientation)
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
private
|
|
60
|
+
|
|
61
|
+
# The native path's graph data and orientation, or nil when it
|
|
62
|
+
# declines.
|
|
63
|
+
def native_result(source, main_branch_name)
|
|
64
|
+
entry, builder = self.class.native
|
|
65
|
+
tree = Native.parse(entry, source)
|
|
66
|
+
tree && builder.new.apply(tree, main_branch_name: main_branch_name)
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
def ruby_result(source, main_branch_name)
|
|
70
|
+
tree = parse_with_grammar(Grammars::GitGraph.new, source)
|
|
71
|
+
result = Builders::GitGraph.build(
|
|
72
|
+
tree[:statements], main_branch_name: main_branch_name
|
|
73
|
+
)
|
|
74
|
+
[result, tree.fetch(:direction, "LR").to_s]
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
def create_diagram(result, orientation)
|
|
78
|
+
diagram = Diagram::GitGraph.new(
|
|
79
|
+
orientation: orientation,
|
|
80
|
+
main_branch_name: result[:main_branch_name],
|
|
81
|
+
acc_title: result[:acc_title],
|
|
82
|
+
acc_description: result[:acc_description],
|
|
83
|
+
)
|
|
84
|
+
append_commits(diagram, result[:commits])
|
|
85
|
+
append_branches(diagram, result[:branches])
|
|
86
|
+
diagram
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
def append_commits(diagram, commits)
|
|
90
|
+
commits.each { |data| diagram.commits << build_commit(data) }
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
def build_commit(data)
|
|
94
|
+
Diagram::GitGraph::Commit.new(**data.slice(*COMMIT_ATTRIBUTES))
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
def append_branches(diagram, branches)
|
|
98
|
+
branches.each { |data| diagram.branches << build_branch(data) }
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
def build_branch(data)
|
|
102
|
+
Diagram::GitGraph::Branch.new(**data.slice(*BRANCH_ATTRIBUTES))
|
|
103
|
+
end
|
|
104
|
+
end
|
|
105
|
+
end
|
|
106
|
+
end
|