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
checksums.yaml
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
---
|
|
2
|
+
SHA256:
|
|
3
|
+
metadata.gz: be665730fc261fe2a5fd476832ef35e9d408a972e57d8c8fac4e45449865e027
|
|
4
|
+
data.tar.gz: 9a93797f0daa0959869f5b0341363abf7238a2e039ab018dab823e9e5310169e
|
|
5
|
+
SHA512:
|
|
6
|
+
metadata.gz: 0fbb0a385089dcabdf9b0a546b5166345d53bf0cee02af4f2681f55c17cda756567eafd7ba1cd8a9b57b5e7d1847e5c6f92fbeb2c7081476f856e5abe160bd4b
|
|
7
|
+
data.tar.gz: 4a721df6f52a1372cc29de33beca2f0e961b6276dcdbfd4aa3e30d2cb387e8c6ec53e57711f011874eeba8ec036d1a29aba983b5c60a57257777d9583ad0ffab
|
data/CHANGELOG.md
ADDED
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All releasable changes to Etassia are recorded here. The contract each version
|
|
4
|
+
number makes is in [VERSIONING.md](VERSIONING.md).
|
|
5
|
+
|
|
6
|
+
## Format
|
|
7
|
+
|
|
8
|
+
- Sections are `## [Unreleased]` first, then `## [X.Y.Z] - YYYY-MM-DD`, newest
|
|
9
|
+
first.
|
|
10
|
+
- Inside a section, bullets sit under `### Added`, `### Changed`,
|
|
11
|
+
`### Deprecated`, `### Removed`, `### Fixed` or `### Security`.
|
|
12
|
+
- A change is releasable when it alters what a user of `Etassia.render`,
|
|
13
|
+
`Engine#render` or the CLI can observe. Refactors, specs and CI are not
|
|
14
|
+
entries.
|
|
15
|
+
- **Releasable version**: the release preflight
|
|
16
|
+
(`scripts/check_changelog.rb <next_version>`) passes only when a dated
|
|
17
|
+
`## [X.Y.Z]` section exists for the version being cut and holds at least one
|
|
18
|
+
bullet under a category above. Before dispatching a release, a
|
|
19
|
+
changelog-only PR renames `[Unreleased]` to `[X.Y.Z] - date` and adds a
|
|
20
|
+
fresh empty `[Unreleased]`. No PR changes `lib/etassia/version.rb`.
|
|
21
|
+
|
|
22
|
+
## [Unreleased]
|
|
23
|
+
|
|
24
|
+
### Added
|
|
25
|
+
|
|
26
|
+
- `Etassia.render` uses the Rust runtime of the optional `etassia-native` gem
|
|
27
|
+
when it is installed, with the same SVG bytes, and renders in Ruby when it
|
|
28
|
+
is missing or cannot answer. `ETASSIA_RUNTIME=auto|ruby|rust` selects it.
|
|
29
|
+
- PlantUML `!include FILE[!SELECTOR]`, `!includesub FILE!NAME` and
|
|
30
|
+
`!startsub`/`!endsub` are expanded. Files are read beside the source's
|
|
31
|
+
`path:` (or `base_dir:`) and then in `include_path:` or
|
|
32
|
+
`PLANTUML_INCLUDE_PATH`, never outside those directories. A file that cannot
|
|
33
|
+
be read raises `Etassia::Notation::PlantUML::Include::Error`.
|
|
34
|
+
|
|
35
|
+
### Changed
|
|
36
|
+
|
|
37
|
+
- Etassia now requires Ruby 3.3 or newer and elkrb `~> 2.0`. elkrb 2 itself
|
|
38
|
+
requires Ruby 3.3.
|
|
39
|
+
|
|
40
|
+
## [0.2.0] - 2026-10-16
|
|
41
|
+
|
|
42
|
+
### Added
|
|
43
|
+
|
|
44
|
+
- Added a notation registry, API notation selection, and CLI `--notation` /
|
|
45
|
+
repeatable `--require` options for loading notation plugins.
|
|
46
|
+
- Added bundled PlantUML class and sequence rendering, available by loading
|
|
47
|
+
`etassia/notation/plantuml`.
|
|
48
|
+
- Added `today:` for reproducible date-sensitive rendering and
|
|
49
|
+
`layout_engine:` for selecting the supported layout placement.
|
|
50
|
+
|
|
51
|
+
### Changed
|
|
52
|
+
|
|
53
|
+
- Etassia now requires Ruby 3.2 or newer, elkrb `~> 1.0`, lutaml-model
|
|
54
|
+
`~> 0.8.0`, kramdown `~> 2.5` and plurimath-parslet `~> 3.0`.
|
|
55
|
+
- `etassia batch` discovers every registered notation's extensions, continues
|
|
56
|
+
after individual file failures, and exits 1 when any input failed.
|
|
57
|
+
- #62 renamed most of the gem's parser, renderer, layout and diagram-model
|
|
58
|
+
classes. Every rename below is a plain name change: nothing was removed
|
|
59
|
+
except where a row says so.
|
|
60
|
+
|
|
61
|
+
- Diagram model classes (`Etassia::Diagram`):
|
|
62
|
+
|
|
63
|
+
| Old name | New name |
|
|
64
|
+
| --- | --- |
|
|
65
|
+
| `Diagram::GanttChart` | `Diagram::Gantt` |
|
|
66
|
+
| `Diagram::QuadrantChart` | `Diagram::Quadrant` |
|
|
67
|
+
| `Diagram::RadarChart` | `Diagram::Radar` |
|
|
68
|
+
| `Diagram::ArchitectureDiagram` | `Diagram::Architecture` |
|
|
69
|
+
| `Diagram::ArchitectureDiagram::Group` | `Diagram::Architecture::Group` |
|
|
70
|
+
| `Diagram::ArchitectureDiagram::Service` | `Diagram::Architecture::Service` |
|
|
71
|
+
| `Diagram::ArchitectureDiagram::Edge` | `Diagram::Architecture::Edge` |
|
|
72
|
+
| `Diagram::SankeyDiagram` | `Diagram::Sankey` |
|
|
73
|
+
| `Diagram::PacketDiagram` | `Diagram::Packet` |
|
|
74
|
+
| `Diagram::TreemapDiagram` | `Diagram::Treemap` |
|
|
75
|
+
| `Diagram::XYChart` | `Diagram::XyChart` |
|
|
76
|
+
| `Diagram::BlockDiagram` | `Diagram::Block` |
|
|
77
|
+
| `Diagram::Block` (single block) | `Diagram::BlockNode` |
|
|
78
|
+
| `Diagram::RequirementDiagram` | `Diagram::Requirement` |
|
|
79
|
+
| `Diagram::Requirement` (single requirement) | `Diagram::RequirementNode` |
|
|
80
|
+
|
|
81
|
+
The last two pairs each reuse a name: the old per-item class moves aside so
|
|
82
|
+
the whole-diagram class can take its plain name.
|
|
83
|
+
|
|
84
|
+
- Parser classes (`Etassia::Parser`): every class ending in `Parser` dropped
|
|
85
|
+
that suffix, e.g. `Parser::FlowchartParser` -> `Parser::Flowchart`. Applies
|
|
86
|
+
to `Block`, `C4`, `ClassDiagram`, `ErDiagram`, `Error`, `Flowchart`,
|
|
87
|
+
`Gantt`, `GitGraph`, `Info`, `Kanban`, `Mindmap`, `Packet`, `Pie`,
|
|
88
|
+
`Quadrant`, `Radar`, `Requirement`, `Sankey`, `Sequence`, `StateDiagram`,
|
|
89
|
+
`Timeline`, `Treemap`, `UserJourney`. `Parser::XYChartParser` became
|
|
90
|
+
`Parser::XyChart` (suffix dropped and capitalization changed).
|
|
91
|
+
`Parser::Architecture` already had a plain name and did not change.
|
|
92
|
+
`Parser::Grammars::XYChart` became `Parser::Grammars::XyChart`
|
|
93
|
+
(capitalization only; every other grammar class kept its name).
|
|
94
|
+
|
|
95
|
+
- Renderer classes (`Etassia::Renderer`): every class ending in `Renderer`
|
|
96
|
+
dropped that suffix, e.g. `Renderer::FlowchartRenderer` ->
|
|
97
|
+
`Renderer::Flowchart`. Applies to `Architecture`, `Block`, `C4`,
|
|
98
|
+
`ClassDiagram`, `ErDiagram`, `Error`, `Flowchart`, `Gantt`, `Info`, `Pie`,
|
|
99
|
+
`Quadrant`, `Requirement`, `Sankey`, `Sequence`, `StateDiagram`,
|
|
100
|
+
`Timeline`, `UserJourney`. `Renderer::XYChart` became `Renderer::XyChart`
|
|
101
|
+
(capitalization only).
|
|
102
|
+
|
|
103
|
+
- The `Etassia::Transform` module was renamed to `Etassia::Layout`, and every
|
|
104
|
+
class ending in `Transform` dropped that suffix at the same time, e.g.
|
|
105
|
+
`Transform::FlowchartTransform` -> `Layout::Flowchart`. Applies to
|
|
106
|
+
`Architecture`, `Block`, `C4`, `ClassDiagram`, `ErDiagram`, `Error`,
|
|
107
|
+
`Flowchart`, `Gantt`, `Info`, `Pie`, `Quadrant`, `Requirement`, `Sankey`,
|
|
108
|
+
`Sequence`, `StateDiagram`, `Timeline`, `UserJourney`. Classes that already
|
|
109
|
+
had a plain name only moved namespace: `Transform::GitGraph`,
|
|
110
|
+
`Transform::Kanban`, `Transform::Mindmap`, `Transform::Packet`,
|
|
111
|
+
`Transform::Radar`, `Transform::Treemap`, `Transform::Base` became
|
|
112
|
+
`Layout::GitGraph`, `Layout::Kanban`, `Layout::Mindmap`, `Layout::Packet`,
|
|
113
|
+
`Layout::Radar`, `Layout::Treemap`, `Layout::Base`.
|
|
114
|
+
`Transform::XYChart` became `Layout::XyChart` (namespace and
|
|
115
|
+
capitalization). `Transform::TransformError` was removed; its replacement
|
|
116
|
+
is `Etassia::Layout::LayoutError`.
|
|
117
|
+
|
|
118
|
+
- The `Etassia::Parser::Transforms` module was renamed to
|
|
119
|
+
`Etassia::Parser::Builders`; class names inside it did not change, e.g.
|
|
120
|
+
`Parser::Transforms::Flowchart` -> `Parser::Builders::Flowchart`,
|
|
121
|
+
`Parser::Transforms::Kanban::BoardBuilder` ->
|
|
122
|
+
`Parser::Builders::Kanban::BoardBuilder`. `Parser::Transforms::XYChart`
|
|
123
|
+
became `Parser::Builders::XyChart` (capitalization only, on top of the
|
|
124
|
+
namespace rename).
|
|
125
|
+
|
|
126
|
+
### Fixed
|
|
127
|
+
|
|
128
|
+
- Render every Mermaid case recorded as valid by the pinned oracle in the
|
|
129
|
+
committed compatibility corpus.
|
|
130
|
+
- Emit well-formed UTF-8 SVG for every committed rendered conformance case,
|
|
131
|
+
including escaped text and non-UTF-8 process locales.
|
|
132
|
+
- Report invalid input, unknown CLI values, and source-triggered stack or heap
|
|
133
|
+
exhaustion through Etassia's error and exit-status contracts instead of
|
|
134
|
+
leaking raw VM failures or failing silently.
|
|
135
|
+
- Honor theme typography, paint and palette roles across the supported
|
|
136
|
+
Mermaid diagrams, including partial custom themes completed from defaults.
|
|
137
|
+
|
|
138
|
+
## [0.1.0]
|
|
139
|
+
|
|
140
|
+
Initial tagged version (`v0.1.0`), released before this changelog existed.
|
data/LICENSE
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
BSD 2-Clause License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2024, Ribose Inc.
|
|
4
|
+
All rights reserved.
|
|
5
|
+
|
|
6
|
+
Redistribution and use in source and binary forms, with or without
|
|
7
|
+
modification, are permitted provided that the following conditions are met:
|
|
8
|
+
|
|
9
|
+
1. Redistributions of source code must retain the above copyright notice, this
|
|
10
|
+
list of conditions and the following disclaimer.
|
|
11
|
+
|
|
12
|
+
2. Redistributions in binary form must reproduce the above copyright notice,
|
|
13
|
+
this list of conditions and the following disclaimer in the documentation
|
|
14
|
+
and/or other materials provided with the distribution.
|
|
15
|
+
|
|
16
|
+
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
17
|
+
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
18
|
+
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
19
|
+
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
|
20
|
+
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
21
|
+
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
|
22
|
+
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
|
23
|
+
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
|
24
|
+
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
25
|
+
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
data/README.adoc
ADDED
|
@@ -0,0 +1,436 @@
|
|
|
1
|
+
= Etassia
|
|
2
|
+
|
|
3
|
+
image:https://img.shields.io/gem/v/etassia.svg[RubyGems Version,link=https://rubygems.org/gems/etassia]
|
|
4
|
+
image:https://img.shields.io/github/license/claricle/etassia.svg[License,link=https://github.com/claricle/etassia/blob/main/LICENSE]
|
|
5
|
+
image:https://github.com/claricle/etassia/actions/workflows/rake.yml/badge.svg["Build",link=https://github.com/claricle/etassia/actions/workflows/rake.yml]
|
|
6
|
+
|
|
7
|
+
== Purpose
|
|
8
|
+
|
|
9
|
+
Etassia is a pure Ruby interpreter of commonly-used diagram generation languages
|
|
10
|
+
into SVG format.
|
|
11
|
+
|
|
12
|
+
Etassia currently supports the following diagram definition syntaxes:
|
|
13
|
+
|
|
14
|
+
// * PlantUML - the text-based UML diagramming language defined by PlantUML
|
|
15
|
+
* Mermaid - the text-based diagramming language defined in mermaid-js
|
|
16
|
+
|
|
17
|
+
Etassia aims to provide high compatibility with the original tools while offering
|
|
18
|
+
a pure Ruby implementation that can be easily integrated into Ruby-based
|
|
19
|
+
workflows and tools.
|
|
20
|
+
|
|
21
|
+
NOTE: The name "Etassia" is derived from "Siren", a mythological creature known
|
|
22
|
+
for its enchanting songs that lure sailors, as its usage in multiple languages
|
|
23
|
+
refer to mermaids.
|
|
24
|
+
|
|
25
|
+
== Implementation notes
|
|
26
|
+
|
|
27
|
+
The library follows strict object-oriented principles with a model-driven
|
|
28
|
+
architecture. Most diagram models use `Lutaml::Model`, but not all data
|
|
29
|
+
structures do: six diagram classes (`PacketField`, `RadarAxis`, `RadarCurve`,
|
|
30
|
+
`TreemapNode`, `XYAxis`, `XYDataset`) are plain Ruby classes. Six diagram types
|
|
31
|
+
(flowchart, class, state, ER, Sankey, timeline) lay out to a typed
|
|
32
|
+
`Layout::Scene`; the other types still build a graph or legacy layout
|
|
33
|
+
structure. See link:ARCHITECTURE.md[] for the stages.
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
== Features
|
|
37
|
+
|
|
38
|
+
=== Diagram language support
|
|
39
|
+
|
|
40
|
+
Mermaid defines a set of diagram type languages for composing different diagram
|
|
41
|
+
types.
|
|
42
|
+
|
|
43
|
+
Etassia registers 24 diagram types. 23 are Mermaid input languages; the 24th is
|
|
44
|
+
`error`, the fallback Mermaid.js renders when its own parsing fails. Mermaid's
|
|
45
|
+
ZenUML is not registered. Per-type compatibility with real Mermaid.js input
|
|
46
|
+
varies (see below).
|
|
47
|
+
|
|
48
|
+
// === PlantUML diagram types
|
|
49
|
+
|
|
50
|
+
=== Mermaid diagram types
|
|
51
|
+
|
|
52
|
+
Etassia registers 24 Mermaid diagram types end-to-end (parser, transform, and
|
|
53
|
+
renderer). Registration is not the same as full compatibility: the
|
|
54
|
+
per-type pass rates against the mermaid-js corpus are generated from
|
|
55
|
+
`scoreboard/corpus.json` onto the
|
|
56
|
+
https://claricle.github.io/etassia/pages/compatibility/[compatibility page].
|
|
57
|
+
|
|
58
|
+
* **Flowchart** - Directional graphs with various node shapes and edge types
|
|
59
|
+
* **Sequence diagram** - Message flows between participants over time
|
|
60
|
+
* **Class diagram** - UML class relationships and hierarchies
|
|
61
|
+
* **State diagram** - State machine transitions and hierarchies
|
|
62
|
+
* **Entity-relationship diagram** - Database schema relationships
|
|
63
|
+
* **User journey** - User interaction flows with satisfaction levels
|
|
64
|
+
* **Gantt chart** - Project timelines and task dependencies
|
|
65
|
+
* **Pie chart** - Proportional data visualization
|
|
66
|
+
* **Quadrant chart** - 2D data point categorization
|
|
67
|
+
* **Requirement diagram** - Requirements and their relationships
|
|
68
|
+
* **Git graph** - Git branching and commit history
|
|
69
|
+
* **Mindmap** - Hierarchical mind mapping
|
|
70
|
+
* **Timeline** - Event sequences over time
|
|
71
|
+
* **Sankey diagram** - Flow quantities between nodes
|
|
72
|
+
* **XY chart** - Line and bar charts with axes
|
|
73
|
+
* **Block diagram** - Block-based architecture diagrams
|
|
74
|
+
* **Packet diagram** - Network packet structure
|
|
75
|
+
* **C4 diagram** - Software architecture contexts and containers
|
|
76
|
+
* **Architecture diagram** - Service and component architecture
|
|
77
|
+
* **Kanban board** - Workflow status tracking
|
|
78
|
+
* **Radar chart** - Multi-dimensional data comparison
|
|
79
|
+
* **Treemap** - Hierarchical data as nested rectangles
|
|
80
|
+
* **Error diagram** - Error message display
|
|
81
|
+
* **Info diagram** - Information display
|
|
82
|
+
|
|
83
|
+
See link:examples/README.adoc[] for working examples of all diagram types.
|
|
84
|
+
|
|
85
|
+
=== Core capabilities
|
|
86
|
+
|
|
87
|
+
* **Pure Ruby implementation** - No JavaScript dependencies
|
|
88
|
+
* **Parslet-based parsing** - Declarative grammars with line and column in parse errors
|
|
89
|
+
* **SVG output** - Standards-compliant SVG 1.2
|
|
90
|
+
* **Theme support** - 4 built-in themes, custom theme support
|
|
91
|
+
* **Auto-detection** - Automatic diagram type detection
|
|
92
|
+
* **Batch processing** - Process multiple diagrams at once
|
|
93
|
+
* **CLI tool** - Command-line interface for standalone usage
|
|
94
|
+
* **Programmatic API** - Ruby library for custom workflows
|
|
95
|
+
* **Metanorma-oriented SVG** - Self-contained SVG for embedding in Metanorma
|
|
96
|
+
documents; flowchart, sequence, class, pie and Gantt renders pass
|
|
97
|
+
`svg_conform`'s `:metanorma` conformance check with zero errors (checked
|
|
98
|
+
directly against `SvgConform.validate`; `spec/etassia/svg_conformance_spec.rb`
|
|
99
|
+
runs this on every suite run against shipped examples, reference
|
|
100
|
+
fixtures, and the mermaid corpus)
|
|
101
|
+
|
|
102
|
+
== Installation
|
|
103
|
+
|
|
104
|
+
=== Via RubyGems
|
|
105
|
+
|
|
106
|
+
Add Etassia to your Gemfile:
|
|
107
|
+
|
|
108
|
+
[source,ruby]
|
|
109
|
+
----
|
|
110
|
+
gem 'etassia'
|
|
111
|
+
----
|
|
112
|
+
|
|
113
|
+
Then execute:
|
|
114
|
+
|
|
115
|
+
[source,shell]
|
|
116
|
+
----
|
|
117
|
+
bundle install
|
|
118
|
+
----
|
|
119
|
+
|
|
120
|
+
Or install it directly:
|
|
121
|
+
|
|
122
|
+
[source,shell]
|
|
123
|
+
----
|
|
124
|
+
gem install etassia
|
|
125
|
+
----
|
|
126
|
+
|
|
127
|
+
=== Requirements
|
|
128
|
+
|
|
129
|
+
Ruby 3.3 or higher.
|
|
130
|
+
|
|
131
|
+
|
|
132
|
+
== Quick start
|
|
133
|
+
|
|
134
|
+
=== Command-line usage
|
|
135
|
+
|
|
136
|
+
Render a single Mermaid diagram to SVG:
|
|
137
|
+
|
|
138
|
+
[source,shell]
|
|
139
|
+
----
|
|
140
|
+
etassia render diagram.mmd -o output.svg
|
|
141
|
+
----
|
|
142
|
+
|
|
143
|
+
Create a PlantUML class diagram in `diagram.puml`:
|
|
144
|
+
|
|
145
|
+
----
|
|
146
|
+
@startuml
|
|
147
|
+
class User
|
|
148
|
+
class Account
|
|
149
|
+
User --> Account : owns
|
|
150
|
+
@enduml
|
|
151
|
+
----
|
|
152
|
+
|
|
153
|
+
Then render it by loading the bundled notation:
|
|
154
|
+
|
|
155
|
+
----
|
|
156
|
+
etassia render --require etassia/notation/plantuml diagram.puml -o output.svg
|
|
157
|
+
----
|
|
158
|
+
|
|
159
|
+
The same notation renders PlantUML sequence diagrams. Create
|
|
160
|
+
`sequence.puml`:
|
|
161
|
+
|
|
162
|
+
----
|
|
163
|
+
@startuml
|
|
164
|
+
Alice -> Bob : hello
|
|
165
|
+
Bob --> Alice : hi
|
|
166
|
+
@enduml
|
|
167
|
+
----
|
|
168
|
+
|
|
169
|
+
Then render it the same way:
|
|
170
|
+
|
|
171
|
+
----
|
|
172
|
+
etassia render --require etassia/notation/plantuml sequence.puml -o sequence.svg
|
|
173
|
+
----
|
|
174
|
+
|
|
175
|
+
Render all Mermaid files in a directory:
|
|
176
|
+
|
|
177
|
+
[source,shell]
|
|
178
|
+
----
|
|
179
|
+
etassia batch -i input_dir/ -o output_dir/
|
|
180
|
+
----
|
|
181
|
+
|
|
182
|
+
List all supported diagram types:
|
|
183
|
+
|
|
184
|
+
[source,shell]
|
|
185
|
+
----
|
|
186
|
+
etassia types
|
|
187
|
+
----
|
|
188
|
+
|
|
189
|
+
=== Programmatic usage
|
|
190
|
+
|
|
191
|
+
Use Etassia in your Ruby code:
|
|
192
|
+
|
|
193
|
+
[source,ruby]
|
|
194
|
+
----
|
|
195
|
+
require 'etassia'
|
|
196
|
+
|
|
197
|
+
# Render from a string
|
|
198
|
+
mermaid_code = <<~MERMAID
|
|
199
|
+
graph TD
|
|
200
|
+
A[Start] --> B[Process]
|
|
201
|
+
B --> C[End]
|
|
202
|
+
MERMAID
|
|
203
|
+
|
|
204
|
+
svg = Etassia.render(mermaid_code)
|
|
205
|
+
File.write('output.svg', svg)
|
|
206
|
+
|
|
207
|
+
# Render from a file
|
|
208
|
+
svg = Etassia.render(File.read('diagram.mmd'))
|
|
209
|
+
File.write('output.svg', svg)
|
|
210
|
+
|
|
211
|
+
# Pick a built-in theme
|
|
212
|
+
svg = Etassia.render(mermaid_code, theme: 'dark')
|
|
213
|
+
----
|
|
214
|
+
|
|
215
|
+
==== Optional Rust runtime
|
|
216
|
+
|
|
217
|
+
When the optional `etassia-native` gem (the Rust runtime from
|
|
218
|
+
https://github.com/claricle/etassia-rs[claricle/etassia-rs]) is installed,
|
|
219
|
+
`Etassia.render` with no options renders Mermaid sources through it. The SVG
|
|
220
|
+
bytes are the same as the Ruby pipeline's. Without the gem, for an
|
|
221
|
+
option-bearing render, for a diagram type the Rust runtime has not ported, or
|
|
222
|
+
when it reports an error, Etassia renders in Ruby, so errors are always the
|
|
223
|
+
Ruby exceptions. `etassia-native` is not a dependency of this gem.
|
|
224
|
+
|
|
225
|
+
`ETASSIA_RUNTIME` selects the runtime: `auto` (default), `ruby` (never use
|
|
226
|
+
Rust) or `rust` (raise `Etassia::Engine::PipelineError` instead of falling back).
|
|
227
|
+
|
|
228
|
+
=== Examples
|
|
229
|
+
|
|
230
|
+
Browse link:examples/README.adoc[] for 53 example sources across all 24
|
|
231
|
+
diagram types; 52 have a tracked SVG (one `.beta.mmd` source does not render yet).
|
|
232
|
+
|
|
233
|
+
== Documentation
|
|
234
|
+
|
|
235
|
+
Documentation is available at the
|
|
236
|
+
https://claricle.github.io/etassia[Etassia Documentation Site].
|
|
237
|
+
|
|
238
|
+
=== Quick links
|
|
239
|
+
|
|
240
|
+
* https://claricle.github.io/etassia/pages/comparison/[Tool Comparison] - Compare Etassia with Mermaid.js, PlantUML, and Graphviz
|
|
241
|
+
* https://claricle.github.io/etassia/pages/compatibility/[Mermaid.js Compatibility] - Detailed syntax compatibility matrix
|
|
242
|
+
* https://claricle.github.io/etassia/diagram_types/[Diagram Types Reference] - Complete syntax reference for all 24 diagram types
|
|
243
|
+
|
|
244
|
+
=== Documentation Structure
|
|
245
|
+
|
|
246
|
+
The documentation uses a 6-collection architecture:
|
|
247
|
+
|
|
248
|
+
. **Core Topics** - Compatibility and comparison
|
|
249
|
+
. **Tutorials** - Step-by-step learning paths
|
|
250
|
+
. **Guides** - Task-oriented how-to documentation
|
|
251
|
+
. **Diagram Types** - Complete reference for all 24 diagram types with examples
|
|
252
|
+
. **Features** - Detailed capability documentation
|
|
253
|
+
. **References** - Reference index
|
|
254
|
+
|
|
255
|
+
See the https://claricle.github.io/etassia[documentation site] for the complete guide.
|
|
256
|
+
|
|
257
|
+
|
|
258
|
+
== Architecture
|
|
259
|
+
|
|
260
|
+
=== General
|
|
261
|
+
|
|
262
|
+
Etassia implements a pipeline architecture that transforms Mermaid source
|
|
263
|
+
code through distinct processing stages, each with clear responsibilities and
|
|
264
|
+
well-defined interfaces.
|
|
265
|
+
|
|
266
|
+
**All parsers use Parslet**, a powerful PEG (Parsing Expression Grammar) library
|
|
267
|
+
that provides composability and declarative grammars. The 3-layer Parslet
|
|
268
|
+
architecture (Grammar → Builder → Parser) is not universal: 10 of the 26 files
|
|
269
|
+
under `lib/etassia/parser/builders/` subclass `Parslet::Transform`, the rest are
|
|
270
|
+
plain classes or helpers, and User Journey builds its
|
|
271
|
+
model directly in the parser.
|
|
272
|
+
|
|
273
|
+
Layout uses a built-in fallback grid (`Layout::Grid`) by default. Flowcharts
|
|
274
|
+
can be placed by the elkrb gem instead with `layout_engine: :elk`. Etassia is a pure Ruby
|
|
275
|
+
implementation with no JavaScript dependencies, generating standards-compliant
|
|
276
|
+
SVG 1.2 output suitable for direct integration with Metanorma documentation
|
|
277
|
+
frameworks.
|
|
278
|
+
|
|
279
|
+
.Etassia processing pipeline
|
|
280
|
+
[source]
|
|
281
|
+
----
|
|
282
|
+
Mermaid Syntax Input (String)
|
|
283
|
+
│
|
|
284
|
+
▼
|
|
285
|
+
┌─────────┐
|
|
286
|
+
│ Parser │ Parslet Grammar → Transform → Parser
|
|
287
|
+
└────┬────┘ (3-layer architecture)
|
|
288
|
+
│
|
|
289
|
+
▼
|
|
290
|
+
┌───────────┐
|
|
291
|
+
│ Diagram │ Lutaml::Model AST
|
|
292
|
+
│ Model │ (Flowchart, Sequence, etc.)
|
|
293
|
+
└─────┬─────┘
|
|
294
|
+
│
|
|
295
|
+
▼
|
|
296
|
+
┌───────────┐
|
|
297
|
+
│Transform │ Diagram → Graph Conversion
|
|
298
|
+
│ Layer │
|
|
299
|
+
└─────┬─────┘
|
|
300
|
+
│
|
|
301
|
+
▼
|
|
302
|
+
┌───────────┐
|
|
303
|
+
│ Layout │ Position Computation
|
|
304
|
+
│ Engine │ (Node positions, edge routes)
|
|
305
|
+
└─────┬─────┘
|
|
306
|
+
│
|
|
307
|
+
▼
|
|
308
|
+
┌───────────┐
|
|
309
|
+
│ SVG │ Graph → SVG Conversion
|
|
310
|
+
│ Renderer │
|
|
311
|
+
└─────┬─────┘
|
|
312
|
+
│
|
|
313
|
+
▼
|
|
314
|
+
┌───────────┐
|
|
315
|
+
│ SVG │ Lutaml::Model Structure
|
|
316
|
+
│ Builder │
|
|
317
|
+
└─────┬─────┘
|
|
318
|
+
│
|
|
319
|
+
▼
|
|
320
|
+
SVG XML Output (String)
|
|
321
|
+
----
|
|
322
|
+
|
|
323
|
+
.Component relationships
|
|
324
|
+
[source]
|
|
325
|
+
----
|
|
326
|
+
Etassia (Root Module)
|
|
327
|
+
│
|
|
328
|
+
├── Engine (Orchestrator)
|
|
329
|
+
│ ├── coordinates overall flow
|
|
330
|
+
│ ├── delegates to Parser
|
|
331
|
+
│ ├── delegates to Transform
|
|
332
|
+
│ └── delegates to Renderer
|
|
333
|
+
│
|
|
334
|
+
├── Parser (Parslet-based Syntax Analysis)
|
|
335
|
+
│ ├── Grammars (Parslet rules)
|
|
336
|
+
│ ├── Transforms (tree conversion)
|
|
337
|
+
│ └── produces Diagram Models
|
|
338
|
+
│
|
|
339
|
+
├── Diagram (Domain Models)
|
|
340
|
+
│ ├── Architecture
|
|
341
|
+
│ ├── Block
|
|
342
|
+
│ ├── C4
|
|
343
|
+
│ ├── ClassDiagram
|
|
344
|
+
│ ├── ErDiagram
|
|
345
|
+
│ ├── Error
|
|
346
|
+
│ ├── Flowchart
|
|
347
|
+
│ ├── Gantt
|
|
348
|
+
│ ├── GitGraph
|
|
349
|
+
│ ├── Info
|
|
350
|
+
│ ├── Kanban
|
|
351
|
+
│ ├── Mindmap
|
|
352
|
+
│ ├── Packet
|
|
353
|
+
│ ├── Pie
|
|
354
|
+
│ ├── Quadrant
|
|
355
|
+
│ ├── Radar
|
|
356
|
+
│ ├── Requirement
|
|
357
|
+
│ ├── Sankey
|
|
358
|
+
│ ├── Sequence
|
|
359
|
+
│ ├── StateDiagram
|
|
360
|
+
│ ├── Timeline
|
|
361
|
+
│ ├── Treemap
|
|
362
|
+
│ ├── UserJourney
|
|
363
|
+
│ └── XyChart
|
|
364
|
+
│
|
|
365
|
+
├── Transform (Model Conversion)
|
|
366
|
+
│ └── diagram-specific converters
|
|
367
|
+
│
|
|
368
|
+
├── Renderer (SVG Generation)
|
|
369
|
+
│ └── diagram-specific renderers
|
|
370
|
+
│
|
|
371
|
+
├── Svg (SVG Models)
|
|
372
|
+
│ ├── Document, Element, Group
|
|
373
|
+
│ ├── Path, Text, Rect
|
|
374
|
+
│ └── Circle, Line, Polygon
|
|
375
|
+
│
|
|
376
|
+
└── DiagramRegistry (Type Registration)
|
|
377
|
+
└── maps types to handlers
|
|
378
|
+
----
|
|
379
|
+
|
|
380
|
+
=== Parslet-based parser architecture
|
|
381
|
+
|
|
382
|
+
All 24 implemented diagram types use Parslet for grammar parsing, but only 10 of
|
|
383
|
+
the 26 files under `lib/etassia/parser/builders/` subclass `Parslet::Transform`. Where the 3-layer pattern is
|
|
384
|
+
followed it looks like this:
|
|
385
|
+
|
|
386
|
+
. **Layer 1: Grammar** (Parslet::Parser) - Defines syntax rules using Parslet
|
|
387
|
+
DSL, parses text into intermediate tree structures
|
|
388
|
+
. **Layer 2: Builder** (Parslet::Transform) - Converts intermediate trees to
|
|
389
|
+
typed Diagram models using pattern matching
|
|
390
|
+
. **Layer 3: Parser** - Orchestrates Grammar and Transform, provides public API
|
|
391
|
+
|
|
392
|
+
Several types deviate: `lib/etassia/parser/builders/architecture.rb` and
|
|
393
|
+
`lib/etassia/parser/builders/class_diagram.rb` (among other builders under
|
|
394
|
+
`lib/etassia/parser/builders/`) are plain Ruby classes rather than
|
|
395
|
+
`Parslet::Transform` subclasses, and `Etassia::Parser::UserJourney#parse`
|
|
396
|
+
builds its diagram model directly from the parse tree without a separate
|
|
397
|
+
Transform layer.
|
|
398
|
+
|
|
399
|
+
This architecture provides:
|
|
400
|
+
|
|
401
|
+
* **Line and column in parse errors** (for example `Parse error at line 9, column 8`)
|
|
402
|
+
* **Composability** through shared grammar rules across diagram types
|
|
403
|
+
* **Maintainability** via declarative, self-documenting syntax rules
|
|
404
|
+
* **Typed models** (Lutaml::Model) for most diagram types
|
|
405
|
+
|
|
406
|
+
See link:ARCHITECTURE.md[] for detailed architecture documentation.
|
|
407
|
+
|
|
408
|
+
== Test coverage
|
|
409
|
+
|
|
410
|
+
=== General
|
|
411
|
+
|
|
412
|
+
Etassia's test suite exercises the extracted mermaid-js corpus (`spec/mermaid/`)
|
|
413
|
+
across all registered diagram types. The `mermaid:validate` rake task
|
|
414
|
+
(`tasks/generate_mermaid_fixtures.rake`) checks only that
|
|
415
|
+
`Etassia.render` runs without raising on each corpus source; it does not
|
|
416
|
+
compare output against mermaid-cli reference SVGs. Comparison against
|
|
417
|
+
mermaid-cli-generated reference output is a separate, optional task
|
|
418
|
+
(`rake mermaid:compare`, not run in CI or the default suite) — see
|
|
419
|
+
"Mermaid-js compatibility validation" below.
|
|
420
|
+
|
|
421
|
+
=== Mermaid-js compatibility validation
|
|
422
|
+
|
|
423
|
+
`spec/fixtures_mermaid/` contains 847 unique mmdc-generated reference SVGs
|
|
424
|
+
(each duplicated into a `correct/` subdirectory, so a naive file count reads
|
|
425
|
+
~1,694); no automated spec currently compares rendered output against them.
|
|
426
|
+
|
|
427
|
+
// === PlantUML compatibility validation
|
|
428
|
+
|
|
429
|
+
// Etassia includes a large number of PlantUML compatibility test cases to ensure
|
|
430
|
+
// seamless integration with PlantUML syntax for supported diagram types.
|
|
431
|
+
|
|
432
|
+
== Copyright and license
|
|
433
|
+
|
|
434
|
+
Copyright Ribose.
|
|
435
|
+
|
|
436
|
+
This software is licensed under the BSD-2-Clause license.
|