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
data/lib/etassia/cli.rb
ADDED
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "thor"
|
|
4
|
+
|
|
5
|
+
module Etassia
|
|
6
|
+
# Command-line interface for etassia.
|
|
7
|
+
#
|
|
8
|
+
# Provides commands for rendering diagrams to SVG and
|
|
9
|
+
# managing diagram types.
|
|
10
|
+
class Cli < Thor
|
|
11
|
+
def self.exit_on_failure?
|
|
12
|
+
true
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
desc "render [FILE]", "Render a diagram to SVG"
|
|
16
|
+
long_desc <<~DESC
|
|
17
|
+
Renders a diagram from FILE or stdin to SVG format.
|
|
18
|
+
|
|
19
|
+
If FILE is not provided or is "-", reads from stdin.
|
|
20
|
+
Output is written to stdout by default, or to the file specified
|
|
21
|
+
with --output.
|
|
22
|
+
|
|
23
|
+
Examples:
|
|
24
|
+
etassia render diagram.mmd
|
|
25
|
+
etassia render diagram.mmd --output diagram.svg
|
|
26
|
+
etassia render diagram.mmd --theme dark
|
|
27
|
+
etassia render diagram.mmd --theme /path/to/custom-theme.yml
|
|
28
|
+
cat diagram.mmd | etassia render
|
|
29
|
+
etassia render --verbose diagram.mmd
|
|
30
|
+
etassia render --notation mermaid diagram.txt
|
|
31
|
+
etassia render --require ./my_notation.rb diagram.my
|
|
32
|
+
DESC
|
|
33
|
+
method_option :output,
|
|
34
|
+
aliases: "-o",
|
|
35
|
+
type: :string,
|
|
36
|
+
desc: "Output file path (default: stdout)"
|
|
37
|
+
method_option :format,
|
|
38
|
+
aliases: "-f",
|
|
39
|
+
type: :string,
|
|
40
|
+
default: "svg",
|
|
41
|
+
desc: "Output format (only svg supported)"
|
|
42
|
+
method_option :theme,
|
|
43
|
+
aliases: "-t",
|
|
44
|
+
type: :string,
|
|
45
|
+
desc: "Theme name or path to theme file " \
|
|
46
|
+
"(default, dark, light, high_contrast)"
|
|
47
|
+
method_option :verbose,
|
|
48
|
+
aliases: "-v",
|
|
49
|
+
type: :boolean,
|
|
50
|
+
default: false,
|
|
51
|
+
desc: "Enable verbose output"
|
|
52
|
+
method_option :notation,
|
|
53
|
+
type: :string,
|
|
54
|
+
desc: "Notation to use (default: detected from the " \
|
|
55
|
+
"file extension, then the source)"
|
|
56
|
+
method_option :require,
|
|
57
|
+
aliases: "-r",
|
|
58
|
+
type: :string,
|
|
59
|
+
repeatable: true,
|
|
60
|
+
desc: "Load a notation file before rendering " \
|
|
61
|
+
"(repeatable, like ruby -r)"
|
|
62
|
+
def render(file = "-")
|
|
63
|
+
require_relative "commands/render"
|
|
64
|
+
Commands::RenderCommand.new(file, options).run
|
|
65
|
+
rescue *EXHAUSTION_ERRORS, StandardError => e
|
|
66
|
+
# `RenderCommand#run` builds the theme (a hostile `--theme` YAML
|
|
67
|
+
# file) and reads the input file BEFORE `Engine#render` is ever
|
|
68
|
+
# called, so both sit outside the engine's own widened rescue.
|
|
69
|
+
# `EXHAUSTION_ERRORS` are not `StandardError`, so without naming
|
|
70
|
+
# them here the CLI process goes down raw instead of printing an
|
|
71
|
+
# error and exiting 1, exactly like an unguarded `batch` used to.
|
|
72
|
+
handle_error(e)
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
desc "types", "List supported diagram types"
|
|
76
|
+
long_desc <<~DESC
|
|
77
|
+
Lists all diagram types currently supported by etassia.
|
|
78
|
+
|
|
79
|
+
Examples:
|
|
80
|
+
etassia types
|
|
81
|
+
etassia types --require ./my_notation.rb
|
|
82
|
+
DESC
|
|
83
|
+
method_option :require,
|
|
84
|
+
aliases: "-r",
|
|
85
|
+
type: :string,
|
|
86
|
+
repeatable: true,
|
|
87
|
+
desc: "Load a notation file first (repeatable, like ruby -r)"
|
|
88
|
+
def types
|
|
89
|
+
require_relative "commands/types"
|
|
90
|
+
Commands::TypesCommand.new(options).run
|
|
91
|
+
rescue StandardError => e
|
|
92
|
+
handle_error(e)
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
desc "batch", "Batch render multiple diagrams"
|
|
96
|
+
long_desc <<~DESC
|
|
97
|
+
Renders all diagrams in a directory to SVG format.
|
|
98
|
+
|
|
99
|
+
Recursively finds every file with a registered notation's extension
|
|
100
|
+
(or only --notation's) in the input directory and generates
|
|
101
|
+
corresponding SVG files in the output directory.
|
|
102
|
+
|
|
103
|
+
Examples:
|
|
104
|
+
etassia batch --input docs/diagrams --output docs/images
|
|
105
|
+
etassia batch -i diagrams -o output --theme dark
|
|
106
|
+
etassia batch -i docs -o output -v
|
|
107
|
+
etassia batch -i docs -o output --notation mermaid
|
|
108
|
+
DESC
|
|
109
|
+
method_option :input,
|
|
110
|
+
aliases: "-i",
|
|
111
|
+
type: :string,
|
|
112
|
+
default: ".",
|
|
113
|
+
desc: "Input directory or file"
|
|
114
|
+
method_option :output,
|
|
115
|
+
aliases: "-o",
|
|
116
|
+
type: :string,
|
|
117
|
+
default: "output",
|
|
118
|
+
desc: "Output directory"
|
|
119
|
+
method_option :theme,
|
|
120
|
+
aliases: "-t",
|
|
121
|
+
type: :string,
|
|
122
|
+
desc: "Theme name or path to theme file"
|
|
123
|
+
method_option :verbose,
|
|
124
|
+
aliases: "-v",
|
|
125
|
+
type: :boolean,
|
|
126
|
+
default: false,
|
|
127
|
+
desc: "Enable verbose output"
|
|
128
|
+
method_option :notation,
|
|
129
|
+
type: :string,
|
|
130
|
+
desc: "Notation to use (default: detected from the " \
|
|
131
|
+
"file extension, then the source)"
|
|
132
|
+
method_option :require,
|
|
133
|
+
aliases: "-r",
|
|
134
|
+
type: :string,
|
|
135
|
+
repeatable: true,
|
|
136
|
+
desc: "Load a notation file before rendering " \
|
|
137
|
+
"(repeatable, like ruby -r)"
|
|
138
|
+
def batch
|
|
139
|
+
require_relative "commands/batch"
|
|
140
|
+
command = Commands::BatchCommand.new(options)
|
|
141
|
+
command.run
|
|
142
|
+
exit 1 unless command.success?
|
|
143
|
+
rescue StandardError => e
|
|
144
|
+
handle_error(e)
|
|
145
|
+
end
|
|
146
|
+
|
|
147
|
+
desc "version", "Show etassia version"
|
|
148
|
+
long_desc <<~DESC
|
|
149
|
+
Displays the current version of etassia.
|
|
150
|
+
|
|
151
|
+
Examples:
|
|
152
|
+
etassia version
|
|
153
|
+
DESC
|
|
154
|
+
def version
|
|
155
|
+
require_relative "commands/version"
|
|
156
|
+
Commands::VersionCommand.new(options).run
|
|
157
|
+
rescue StandardError => e
|
|
158
|
+
handle_error(e)
|
|
159
|
+
end
|
|
160
|
+
|
|
161
|
+
# Make version available as --version flag
|
|
162
|
+
map %w[--version -V] => :version
|
|
163
|
+
|
|
164
|
+
private
|
|
165
|
+
|
|
166
|
+
# Handles errors and exits with appropriate code.
|
|
167
|
+
#
|
|
168
|
+
# @param error [StandardError, SystemStackError, NoMemoryError]
|
|
169
|
+
# the error to handle
|
|
170
|
+
# @return [void]
|
|
171
|
+
def handle_error(error)
|
|
172
|
+
warn "Error: #{error.message}"
|
|
173
|
+
report_verbose_error(error) if options[:verbose]
|
|
174
|
+
exit 1
|
|
175
|
+
end
|
|
176
|
+
|
|
177
|
+
def report_verbose_error(error)
|
|
178
|
+
# `backtrace` is nil when the VM fails an allocation before it can
|
|
179
|
+
# even build one -- `NoMemoryError` from `File.read` or a hostile
|
|
180
|
+
# `--theme` reaches this method through the rescue above, and
|
|
181
|
+
# `--verbose` on that failure must not itself crash the CLI.
|
|
182
|
+
warn error.backtrace&.join("\n")
|
|
183
|
+
diagnostics = ErrorReport.cause_diagnostics(error)
|
|
184
|
+
warn diagnostics unless diagnostics.empty?
|
|
185
|
+
end
|
|
186
|
+
end
|
|
187
|
+
end
|
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "fileutils"
|
|
4
|
+
require_relative "notation_loader"
|
|
5
|
+
|
|
6
|
+
module Etassia
|
|
7
|
+
module Commands
|
|
8
|
+
# Batch command for rendering multiple diagrams.
|
|
9
|
+
#
|
|
10
|
+
# Processes entire directories of diagram files and generates
|
|
11
|
+
# corresponding SVG output files.
|
|
12
|
+
class BatchCommand
|
|
13
|
+
attr_reader :options
|
|
14
|
+
|
|
15
|
+
def initialize(options = {})
|
|
16
|
+
@options = options
|
|
17
|
+
@stats = { success: 0, failed: 0, errors: [] }
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
# Execute the batch rendering command.
|
|
21
|
+
#
|
|
22
|
+
# @return [void]
|
|
23
|
+
def run
|
|
24
|
+
input_path = options[:input] || "."
|
|
25
|
+
output_path = options[:output] || "output"
|
|
26
|
+
print_header(input_path, output_path)
|
|
27
|
+
NotationLoader.load_all(options[:require])
|
|
28
|
+
files = find_diagram_files(input_path)
|
|
29
|
+
return print_empty(input_path) if files.empty?
|
|
30
|
+
|
|
31
|
+
render_batch(files, input_path, output_path)
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
# Whether every item rendered without error. Checked after #run, not
|
|
35
|
+
# returned by it: #run's own contract (print the summary, survive a
|
|
36
|
+
# bad file) is unrelated to whether the caller should exit non-zero,
|
|
37
|
+
# and a boolean return on a method named `run` reads as a lie about
|
|
38
|
+
# what it does.
|
|
39
|
+
#
|
|
40
|
+
# @return [Boolean] true if nothing failed (including a run that
|
|
41
|
+
# found no files at all)
|
|
42
|
+
def success?
|
|
43
|
+
@stats[:failed].zero?
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
private
|
|
47
|
+
|
|
48
|
+
def render_batch(files, input_path, output_path)
|
|
49
|
+
print_file_count(files)
|
|
50
|
+
FileUtils.mkdir_p(output_path)
|
|
51
|
+
process_files(files, input_path, output_path)
|
|
52
|
+
print_summary
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
def print_header(input_path, output_path)
|
|
56
|
+
puts "Etassia Batch Renderer"
|
|
57
|
+
puts "=" * 60
|
|
58
|
+
puts "Input: #{input_path}"
|
|
59
|
+
puts "Output: #{output_path}"
|
|
60
|
+
puts "Theme: #{options[:theme] || 'default'}"
|
|
61
|
+
puts
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
def print_empty(input_path)
|
|
65
|
+
puts "No diagram files found in: #{input_path}"
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
def print_file_count(files)
|
|
69
|
+
puts "Found #{files.length} diagram files"
|
|
70
|
+
puts
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
def process_files(files, input_path, output_path)
|
|
74
|
+
files.each_with_index do |file, index|
|
|
75
|
+
process_file(file, input_path, output_path, index + 1, files.length)
|
|
76
|
+
end
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
def find_diagram_files(path)
|
|
80
|
+
if File.directory?(path)
|
|
81
|
+
extensions = batch_extensions
|
|
82
|
+
Dir.glob(File.join(path, "**", "*")).select do |file|
|
|
83
|
+
File.file?(file) && extensions.include?(File.extname(file).downcase)
|
|
84
|
+
end
|
|
85
|
+
elsif File.file?(path)
|
|
86
|
+
[path]
|
|
87
|
+
else
|
|
88
|
+
[]
|
|
89
|
+
end
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
# Every registered notation's extensions, or only `--notation`'s.
|
|
93
|
+
def batch_extensions
|
|
94
|
+
return Notation.extensions unless options[:notation]
|
|
95
|
+
|
|
96
|
+
Notation.fetch(options[:notation]).extensions
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
# Only a registered extension is swapped; any other name is kept.
|
|
100
|
+
def output_name(relative)
|
|
101
|
+
extension = File.extname(relative)
|
|
102
|
+
return relative unless Notation.extensions.include?(extension.downcase)
|
|
103
|
+
|
|
104
|
+
"#{relative.delete_suffix(extension)}.svg"
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
# `-i` names either a directory or a single file (`find_mermaid_files`
|
|
108
|
+
# accepts both, and it's documented on the CLI). The directory case
|
|
109
|
+
# strips `input_base` off the front of `file` to get a path relative
|
|
110
|
+
# to it; a single file IS `input_base`, so that same subtraction
|
|
111
|
+
# leaves '', turning `output_file` into the output directory itself.
|
|
112
|
+
def relative_path_for(file, input_base)
|
|
113
|
+
return File.basename(file) if File.file?(input_base)
|
|
114
|
+
|
|
115
|
+
file.sub(/^#{Regexp.escape(input_base)}\/?/, "")
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
def process_file(file, input_base, output_base, current, total)
|
|
119
|
+
relative = relative_path_for(file, input_base)
|
|
120
|
+
output_file = File.join(output_base, output_name(relative))
|
|
121
|
+
print "[#{current}/#{total}] #{relative}... "
|
|
122
|
+
process_render(file, output_file, relative)
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
def process_render(file, output_file, relative)
|
|
126
|
+
render_file(file, output_file)
|
|
127
|
+
record_success
|
|
128
|
+
rescue *Etassia::EXHAUSTION_ERRORS, StandardError => e
|
|
129
|
+
record_failure(relative, e)
|
|
130
|
+
end
|
|
131
|
+
|
|
132
|
+
def render_file(file, output_file)
|
|
133
|
+
# Raw bytes, as `RenderCommand#read_input` reads them: a text-mode
|
|
134
|
+
# read would apply the locale's encodings before `Source` sees it.
|
|
135
|
+
source = File.binread(file)
|
|
136
|
+
svg = Etassia.render(source, **render_options(file))
|
|
137
|
+
FileUtils.mkdir_p(File.dirname(output_file))
|
|
138
|
+
File.binwrite(output_file, svg)
|
|
139
|
+
end
|
|
140
|
+
|
|
141
|
+
def render_options(file)
|
|
142
|
+
{
|
|
143
|
+
theme: options[:theme], verbose: options[:verbose], path: file,
|
|
144
|
+
notation: options[:notation]
|
|
145
|
+
}
|
|
146
|
+
end
|
|
147
|
+
|
|
148
|
+
def record_success
|
|
149
|
+
@stats[:success] += 1
|
|
150
|
+
puts "✅"
|
|
151
|
+
end
|
|
152
|
+
|
|
153
|
+
def record_failure(relative, error)
|
|
154
|
+
@stats[:failed] += 1
|
|
155
|
+
@stats[:errors] << { file: relative, error: error.message }
|
|
156
|
+
puts "❌ #{error.class.name}"
|
|
157
|
+
print_verbose_failure(error) if options[:verbose]
|
|
158
|
+
end
|
|
159
|
+
|
|
160
|
+
def print_verbose_failure(error)
|
|
161
|
+
puts " #{error.message}"
|
|
162
|
+
# Printed, never stored: `@stats[:errors]` outlives the whole run,
|
|
163
|
+
# and a cause's trace is what must not accumulate there.
|
|
164
|
+
diagnostics = Etassia::ErrorReport.cause_diagnostics(error)
|
|
165
|
+
return if diagnostics.empty?
|
|
166
|
+
|
|
167
|
+
puts diagnostics.lines.map { |line| " #{line}" }.join
|
|
168
|
+
end
|
|
169
|
+
|
|
170
|
+
def print_summary
|
|
171
|
+
print_summary_header
|
|
172
|
+
print_summary_counts
|
|
173
|
+
print_errors if @stats[:failed].positive?
|
|
174
|
+
print_success_rate
|
|
175
|
+
end
|
|
176
|
+
|
|
177
|
+
def print_summary_header
|
|
178
|
+
puts "\n#{'=' * 60}"
|
|
179
|
+
puts "BATCH RENDERING SUMMARY"
|
|
180
|
+
puts "=" * 60
|
|
181
|
+
end
|
|
182
|
+
|
|
183
|
+
def print_summary_counts
|
|
184
|
+
puts "✅ Success: #{@stats[:success]}"
|
|
185
|
+
puts "❌ Failed: #{@stats[:failed]}"
|
|
186
|
+
puts " Total: #{@stats[:success] + @stats[:failed]}"
|
|
187
|
+
end
|
|
188
|
+
|
|
189
|
+
def print_errors
|
|
190
|
+
puts "\nErrors:"
|
|
191
|
+
@stats[:errors].first(5).each do |error|
|
|
192
|
+
puts " #{error[:file]}: #{error[:error].lines.first.strip}"
|
|
193
|
+
end
|
|
194
|
+
print_extra_error_count
|
|
195
|
+
puts "\nUse --verbose to see full error details"
|
|
196
|
+
end
|
|
197
|
+
|
|
198
|
+
def print_extra_error_count
|
|
199
|
+
return unless @stats[:errors].length > 5
|
|
200
|
+
|
|
201
|
+
puts " ... and #{@stats[:errors].length - 5} more errors"
|
|
202
|
+
end
|
|
203
|
+
|
|
204
|
+
def print_success_rate
|
|
205
|
+
rate = (@stats[:success].to_f / (@stats[:success] + @stats[:failed]))
|
|
206
|
+
puts "\nSuccess rate: #{(rate * 100).round(1)}%"
|
|
207
|
+
end
|
|
208
|
+
end
|
|
209
|
+
end
|
|
210
|
+
end
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Etassia
|
|
4
|
+
module Commands
|
|
5
|
+
# Loads the files named by `--require`, exactly as `ruby -r` would: a
|
|
6
|
+
# notation registers itself while its file loads.
|
|
7
|
+
module NotationLoader
|
|
8
|
+
module_function
|
|
9
|
+
|
|
10
|
+
# @param features [Array<String>, String, nil] feature names or paths
|
|
11
|
+
# @return [void]
|
|
12
|
+
# @raise [ArgumentError] when a feature cannot be loaded
|
|
13
|
+
def load_all(features)
|
|
14
|
+
Array(features).each do |feature|
|
|
15
|
+
require feature
|
|
16
|
+
rescue LoadError
|
|
17
|
+
raise ArgumentError, "Cannot load notation: #{feature}"
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative "notation_loader"
|
|
4
|
+
|
|
5
|
+
module Etassia
|
|
6
|
+
module Commands
|
|
7
|
+
# Command to render diagrams to SVG.
|
|
8
|
+
class RenderCommand
|
|
9
|
+
attr_reader :file, :options
|
|
10
|
+
|
|
11
|
+
# Creates a new render command.
|
|
12
|
+
#
|
|
13
|
+
# @param file [String] input file path or '-' for stdin
|
|
14
|
+
# @param options [Hash] command options
|
|
15
|
+
def initialize(file, options = {})
|
|
16
|
+
@file = file
|
|
17
|
+
@options = options
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
# Executes the render command.
|
|
21
|
+
#
|
|
22
|
+
# @return [void]
|
|
23
|
+
def run
|
|
24
|
+
validate_format!
|
|
25
|
+
|
|
26
|
+
NotationLoader.load_all(options[:require])
|
|
27
|
+
write_output(render_source(read_input))
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
private
|
|
31
|
+
|
|
32
|
+
def render_source(source)
|
|
33
|
+
engine = Engine.new(verbose: options[:verbose], theme: options[:theme])
|
|
34
|
+
engine.render(source, path: path_hint, notation: options[:notation])
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
# The extension is a notation hint, so only a real file offers one.
|
|
38
|
+
def path_hint
|
|
39
|
+
file unless file == "-" || file.nil?
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
# Validates the output format option.
|
|
43
|
+
#
|
|
44
|
+
# @return [void]
|
|
45
|
+
# @raise [ArgumentError] if format is not supported
|
|
46
|
+
def validate_format!
|
|
47
|
+
return if options[:format] == "svg"
|
|
48
|
+
|
|
49
|
+
raise ArgumentError,
|
|
50
|
+
"Unsupported format: #{options[:format]}. " \
|
|
51
|
+
"Only SVG format is currently supported."
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
# Reads input from file or stdin.
|
|
55
|
+
#
|
|
56
|
+
# Text-mode reads tag their result with the locale's encoding and, under
|
|
57
|
+
# `ruby -E ext:int`, transcode it first. The bytes are read raw instead
|
|
58
|
+
# and `Source` reads them as UTF-8, as mmdc does; otherwise a UTF-8 file
|
|
59
|
+
# under `LC_ALL=en_US.ISO8859-1` is drawn as mojibake.
|
|
60
|
+
#
|
|
61
|
+
# @return [String] Mermaid source code
|
|
62
|
+
def read_input
|
|
63
|
+
if file == "-" || file.nil?
|
|
64
|
+
$stdin.binmode.read
|
|
65
|
+
else
|
|
66
|
+
File.binread(file)
|
|
67
|
+
end
|
|
68
|
+
rescue Errno::ENOENT
|
|
69
|
+
raise ArgumentError, "File not found: #{file}"
|
|
70
|
+
rescue Errno::EACCES
|
|
71
|
+
raise ArgumentError, "Permission denied: #{file}"
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
# Writes output to file or stdout.
|
|
75
|
+
#
|
|
76
|
+
# @param svg [String] SVG content
|
|
77
|
+
# @return [void]
|
|
78
|
+
def write_output(svg)
|
|
79
|
+
if options[:output]
|
|
80
|
+
File.binwrite(options[:output], svg)
|
|
81
|
+
puts "SVG written to #{options[:output]}" if options[:verbose]
|
|
82
|
+
else
|
|
83
|
+
print_svg(svg)
|
|
84
|
+
end
|
|
85
|
+
rescue Errno::EACCES
|
|
86
|
+
raise ArgumentError,
|
|
87
|
+
"Permission denied writing to: #{options[:output]}"
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
# UTF-8 to UTF-8, so the stream does not transcode to the locale's
|
|
91
|
+
# encoding, or raise on a character it lacks.
|
|
92
|
+
def print_svg(svg)
|
|
93
|
+
$stdout.set_encoding(Encoding::UTF_8, Encoding::UTF_8)
|
|
94
|
+
$stdout.write(svg, "\n")
|
|
95
|
+
end
|
|
96
|
+
end
|
|
97
|
+
end
|
|
98
|
+
end
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative "notation_loader"
|
|
4
|
+
|
|
5
|
+
module Etassia
|
|
6
|
+
module Commands
|
|
7
|
+
# Command to list supported diagram types.
|
|
8
|
+
class TypesCommand
|
|
9
|
+
attr_reader :options
|
|
10
|
+
|
|
11
|
+
# Creates a new types command.
|
|
12
|
+
#
|
|
13
|
+
# @param options [Hash] command options
|
|
14
|
+
def initialize(options = {})
|
|
15
|
+
@options = options
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
# Executes the types command.
|
|
19
|
+
#
|
|
20
|
+
# @return [void]
|
|
21
|
+
def run
|
|
22
|
+
NotationLoader.load_all(options[:require])
|
|
23
|
+
puts "Supported diagram types:"
|
|
24
|
+
|
|
25
|
+
Notation.plugins.each do |notation|
|
|
26
|
+
puts
|
|
27
|
+
puts "#{notation.id}:"
|
|
28
|
+
notation.types.each { |type| puts " #{type}" }
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
end
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Etassia
|
|
4
|
+
module Commands
|
|
5
|
+
# Command to display the gem version.
|
|
6
|
+
class VersionCommand
|
|
7
|
+
attr_reader :options
|
|
8
|
+
|
|
9
|
+
# Creates a new version command.
|
|
10
|
+
#
|
|
11
|
+
# @param options [Hash] command options
|
|
12
|
+
def initialize(options = {})
|
|
13
|
+
@options = options
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
# Executes the version command.
|
|
17
|
+
#
|
|
18
|
+
# @return [void]
|
|
19
|
+
def run
|
|
20
|
+
puts "etassia version #{Etassia::VERSION}"
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Etassia
|
|
4
|
+
# The one table relating spec/mermaid directory names to the type symbols
|
|
5
|
+
# in {Etassia::Notation::Mermaid::TYPES}. A directory with no registered
|
|
6
|
+
# type (diagrams that must fail detection) maps to nil.
|
|
7
|
+
#
|
|
8
|
+
# Read by {Etassia::DiagramRegistry.corpus_directories} and by
|
|
9
|
+
# Etassia::Corpus.registry_type in tasks/corpus.rake. One directory names
|
|
10
|
+
# each type.
|
|
11
|
+
module CorpusTypeNames
|
|
12
|
+
DIRECTORIES = {
|
|
13
|
+
"architecture" => :architecture,
|
|
14
|
+
"block" => :block,
|
|
15
|
+
"c4" => :c4,
|
|
16
|
+
"class_diagram" => :class_diagram,
|
|
17
|
+
"er_diagram" => :er_diagram,
|
|
18
|
+
"error" => :error,
|
|
19
|
+
"flowchart" => :flowchart,
|
|
20
|
+
"gantt" => :gantt,
|
|
21
|
+
"gitgraph" => :git_graph,
|
|
22
|
+
"info" => :info,
|
|
23
|
+
"kanban" => :kanban,
|
|
24
|
+
"mindmap" => :mindmap,
|
|
25
|
+
"packet" => :packet,
|
|
26
|
+
"pie" => :pie,
|
|
27
|
+
"quadrant" => :quadrant,
|
|
28
|
+
"radar" => :radar,
|
|
29
|
+
"requirement" => :requirement,
|
|
30
|
+
"sankey" => :sankey,
|
|
31
|
+
"sequence" => :sequence,
|
|
32
|
+
"state_diagram" => :state_diagram,
|
|
33
|
+
"timeline" => :timeline,
|
|
34
|
+
"treemap" => :treemap,
|
|
35
|
+
"unknown" => nil,
|
|
36
|
+
"user_journey" => :user_journey,
|
|
37
|
+
"xychart" => :xychart,
|
|
38
|
+
}.freeze
|
|
39
|
+
|
|
40
|
+
class << self
|
|
41
|
+
# @return [Symbol, nil] the registry type for a corpus directory
|
|
42
|
+
def registry_type(directory)
|
|
43
|
+
DIRECTORIES[directory]
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
# @return [Array<String>] corpus directories holding a registry type
|
|
47
|
+
def directories_for(type)
|
|
48
|
+
DIRECTORIES.select { |_, name| name == type }.keys
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
end
|