etassia 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/CHANGELOG.md +140 -0
- data/LICENSE +25 -0
- data/README.adoc +436 -0
- data/exe/etassia +7 -0
- data/lib/etassia/cli.rb +187 -0
- data/lib/etassia/commands/batch.rb +210 -0
- data/lib/etassia/commands/notation_loader.rb +22 -0
- data/lib/etassia/commands/render.rb +98 -0
- data/lib/etassia/commands/types.rb +33 -0
- data/lib/etassia/commands/version.rb +24 -0
- data/lib/etassia/corpus_type_names.rb +52 -0
- data/lib/etassia/diagram/architecture.rb +108 -0
- data/lib/etassia/diagram/base.rb +61 -0
- data/lib/etassia/diagram/block.rb +102 -0
- data/lib/etassia/diagram/c4.rb +337 -0
- data/lib/etassia/diagram/class_diagram.rb +466 -0
- data/lib/etassia/diagram/class_namespace.rb +17 -0
- data/lib/etassia/diagram/class_note.rb +17 -0
- data/lib/etassia/diagram/containment.rb +107 -0
- data/lib/etassia/diagram/er_diagram.rb +317 -0
- data/lib/etassia/diagram/error.rb +38 -0
- data/lib/etassia/diagram/flowchart.rb +419 -0
- data/lib/etassia/diagram/flowchart_label_text.rb +63 -0
- data/lib/etassia/diagram/gantt.rb +94 -0
- data/lib/etassia/diagram/generic_text.rb +30 -0
- data/lib/etassia/diagram/git_graph.rb +57 -0
- data/lib/etassia/diagram/info.rb +38 -0
- data/lib/etassia/diagram/kanban.rb +198 -0
- data/lib/etassia/diagram/mindmap.rb +71 -0
- data/lib/etassia/diagram/packet.rb +93 -0
- data/lib/etassia/diagram/pie.rb +115 -0
- data/lib/etassia/diagram/quadrant.rb +135 -0
- data/lib/etassia/diagram/radar.rb +65 -0
- data/lib/etassia/diagram/requirement.rb +168 -0
- data/lib/etassia/diagram/sankey.rb +217 -0
- data/lib/etassia/diagram/sequence.rb +299 -0
- data/lib/etassia/diagram/sequence_box.rb +18 -0
- data/lib/etassia/diagram/sequence_frame.rb +37 -0
- data/lib/etassia/diagram/sequence_frame_section.rb +23 -0
- data/lib/etassia/diagram/sequence_text.rb +69 -0
- data/lib/etassia/diagram/sequence_wrap.rb +23 -0
- data/lib/etassia/diagram/state_diagram.rb +282 -0
- data/lib/etassia/diagram/timeline.rb +183 -0
- data/lib/etassia/diagram/treemap.rb +95 -0
- data/lib/etassia/diagram/user_journey.rb +153 -0
- data/lib/etassia/diagram/xy_chart.rb +90 -0
- data/lib/etassia/diagram.rb +8 -0
- data/lib/etassia/diagram_registry.rb +34 -0
- data/lib/etassia/engine.rb +334 -0
- data/lib/etassia/error/diagram_type_error.rb +10 -0
- data/lib/etassia/error/layout_error.rb +12 -0
- data/lib/etassia/error/notation_registration_error.rb +10 -0
- data/lib/etassia/error/parse_error.rb +11 -0
- data/lib/etassia/error/pipeline_error.rb +10 -0
- data/lib/etassia/error/render_error.rb +12 -0
- data/lib/etassia/error/score_error.rb +12 -0
- data/lib/etassia/error.rb +10 -0
- data/lib/etassia/error_report.rb +69 -0
- data/lib/etassia/ir/data.rb +39 -0
- data/lib/etassia/ir/data_value.rb +35 -0
- data/lib/etassia/ir/dimension.rb +10 -0
- data/lib/etassia/ir/edge.rb +34 -0
- data/lib/etassia/ir/graph.rb +28 -0
- data/lib/etassia/ir/integrity.rb +80 -0
- data/lib/etassia/ir/item.rb +46 -0
- data/lib/etassia/ir/model.rb +56 -0
- data/lib/etassia/ir/node.rb +10 -0
- data/lib/etassia/ir/placement.rb +47 -0
- data/lib/etassia/ir/prepositioned.rb +25 -0
- data/lib/etassia/ir/prepositioned_item.rb +26 -0
- data/lib/etassia/ir/property_set.rb +43 -0
- data/lib/etassia/ir/scalar.rb +25 -0
- data/lib/etassia/ir/series.rb +10 -0
- data/lib/etassia/ir.rb +17 -0
- data/lib/etassia/js_math.rb +511 -0
- data/lib/etassia/js_number.rb +64 -0
- data/lib/etassia/layout/architecture.rb +1472 -0
- data/lib/etassia/layout/base.rb +276 -0
- data/lib/etassia/layout/block.rb +738 -0
- data/lib/etassia/layout/c4.rb +876 -0
- data/lib/etassia/layout/c4_boundary_metrics.rb +35 -0
- data/lib/etassia/layout/c4_bounds.rb +106 -0
- data/lib/etassia/layout/c4_intersection.rb +77 -0
- data/lib/etassia/layout/c4_placement.rb +135 -0
- data/lib/etassia/layout/c4_shape_metrics.rb +97 -0
- data/lib/etassia/layout/c4_shape_outline.rb +67 -0
- data/lib/etassia/layout/c4_stereotype.rb +30 -0
- data/lib/etassia/layout/c4_text.rb +54 -0
- data/lib/etassia/layout/class_cell_placement.rb +148 -0
- data/lib/etassia/layout/class_diagram.rb +1116 -0
- data/lib/etassia/layout/class_diagram_namespaces.rb +26 -0
- data/lib/etassia/layout/class_diagram_notes.rb +26 -0
- data/lib/etassia/layout/class_name_advances.rb +31 -0
- data/lib/etassia/layout/class_namespace_box.rb +21 -0
- data/lib/etassia/layout/class_namespace_nodes.rb +197 -0
- data/lib/etassia/layout/class_namespace_placement.rb +71 -0
- data/lib/etassia/layout/class_note.rb +44 -0
- data/lib/etassia/layout/class_note_nodes.rb +84 -0
- data/lib/etassia/layout/elk_notices.rb +48 -0
- data/lib/etassia/layout/elk_placement.rb +197 -0
- data/lib/etassia/layout/er_diagram.rb +1002 -0
- data/lib/etassia/layout/er_diagram_adjacency.rb +20 -0
- data/lib/etassia/layout/er_diagram_alignment.rb +72 -0
- data/lib/etassia/layout/er_diagram_compaction.rb +85 -0
- data/lib/etassia/layout/er_diagram_conflicts.rb +70 -0
- data/lib/etassia/layout/er_diagram_coordinates.rb +104 -0
- data/lib/etassia/layout/er_diagram_entity_size.rb +82 -0
- data/lib/etassia/layout/er_diagram_layering.rb +109 -0
- data/lib/etassia/layout/er_diagram_ordering.rb +143 -0
- data/lib/etassia/layout/er_diagram_placement.rb +163 -0
- data/lib/etassia/layout/er_diagram_placement_node.rb +22 -0
- data/lib/etassia/layout/error.rb +133 -0
- data/lib/etassia/layout/flowchart/brandes_koepf.rb +208 -0
- data/lib/etassia/layout/flowchart/cluster_reach.rb +70 -0
- data/lib/etassia/layout/flowchart/component_packing.rb +129 -0
- data/lib/etassia/layout/flowchart/directed_placement.rb +428 -0
- data/lib/etassia/layout/flowchart/edge_chains.rb +111 -0
- data/lib/etassia/layout/flowchart/edge_order.rb +34 -0
- data/lib/etassia/layout/flowchart/edge_router.rb +533 -0
- data/lib/etassia/layout/flowchart/label_backdrop_geometry.rb +62 -0
- data/lib/etassia/layout/flowchart/layer_spacing.rb +85 -0
- data/lib/etassia/layout/flowchart/level_edges.rb +74 -0
- data/lib/etassia/layout/flowchart/level_frame.rb +47 -0
- data/lib/etassia/layout/flowchart/minimum_rank_spacing.rb +74 -0
- data/lib/etassia/layout/flowchart/row_centering.rb +229 -0
- data/lib/etassia/layout/flowchart.rb +1290 -0
- data/lib/etassia/layout/gantt.rb +814 -0
- data/lib/etassia/layout/gantt_duration.rb +49 -0
- data/lib/etassia/layout/gantt_exclusions.rb +74 -0
- data/lib/etassia/layout/gantt_ticks.rb +165 -0
- data/lib/etassia/layout/git_graph.rb +1075 -0
- data/lib/etassia/layout/grid.rb +165 -0
- data/lib/etassia/layout/info.rb +113 -0
- data/lib/etassia/layout/kanban.rb +452 -0
- data/lib/etassia/layout/kanban_card_text.rb +95 -0
- data/lib/etassia/layout/mindmap.rb +425 -0
- data/lib/etassia/layout/mindmap_cose.rb +81 -0
- data/lib/etassia/layout/mindmap_cose_body.rb +93 -0
- data/lib/etassia/layout/mindmap_cose_geometry.rb +190 -0
- data/lib/etassia/layout/mindmap_cose_grid.rb +96 -0
- data/lib/etassia/layout/mindmap_cose_link.rb +42 -0
- data/lib/etassia/layout/mindmap_cose_relaxation.rb +166 -0
- data/lib/etassia/layout/mindmap_cose_seed.rb +93 -0
- data/lib/etassia/layout/mindmap_cose_wedge.rb +37 -0
- data/lib/etassia/layout/mindmap_node_size.rb +130 -0
- data/lib/etassia/layout/packet.rb +285 -0
- data/lib/etassia/layout/pie.rb +305 -0
- data/lib/etassia/layout/pie_legend.rb +64 -0
- data/lib/etassia/layout/pie_legend_entry.rb +21 -0
- data/lib/etassia/layout/quadrant.rb +402 -0
- data/lib/etassia/layout/radar.rb +442 -0
- data/lib/etassia/layout/requirement.rb +765 -0
- data/lib/etassia/layout/sankey.rb +501 -0
- data/lib/etassia/layout/scene.rb +18 -0
- data/lib/etassia/layout/sequence/actor_gaps.rb +151 -0
- data/lib/etassia/layout/sequence/box_shape.rb +23 -0
- data/lib/etassia/layout/sequence/creations.rb +73 -0
- data/lib/etassia/layout/sequence/frame_divider.rb +22 -0
- data/lib/etassia/layout/sequence/frame_placement.rb +424 -0
- data/lib/etassia/layout/sequence/frame_reader.rb +75 -0
- data/lib/etassia/layout/sequence/frame_shape.rb +45 -0
- data/lib/etassia/layout/sequence/geometry.rb +24 -0
- data/lib/etassia/layout/sequence/message_rows.rb +165 -0
- data/lib/etassia/layout/sequence/note.rb +16 -0
- data/lib/etassia/layout/sequence/note_box.rb +114 -0
- data/lib/etassia/layout/sequence/note_placement.rb +223 -0
- data/lib/etassia/layout/sequence/text_width.rb +69 -0
- data/lib/etassia/layout/sequence/text_wrap.rb +93 -0
- data/lib/etassia/layout/sequence.rb +936 -0
- data/lib/etassia/layout/state_diagram.rb +1277 -0
- data/lib/etassia/layout/timeline.rb +165 -0
- data/lib/etassia/layout/timeline_card.rb +142 -0
- data/lib/etassia/layout/timeline_flow.rb +164 -0
- data/lib/etassia/layout/timeline_line.rb +33 -0
- data/lib/etassia/layout/timeline_rounding.rb +19 -0
- data/lib/etassia/layout/timeline_text.rb +105 -0
- data/lib/etassia/layout/treemap.rb +303 -0
- data/lib/etassia/layout/treemap_placement.rb +52 -0
- data/lib/etassia/layout/treemap_squarify.rb +108 -0
- data/lib/etassia/layout/user_journey.rb +300 -0
- data/lib/etassia/layout/user_journey_face.rb +33 -0
- data/lib/etassia/layout/user_journey_face_geometry.rb +80 -0
- data/lib/etassia/layout/user_journey_geometry.rb +336 -0
- data/lib/etassia/layout/user_journey_legend.rb +84 -0
- data/lib/etassia/layout/xy_chart.rb +620 -0
- data/lib/etassia/layout.rb +19 -0
- data/lib/etassia/lint_debt_scoreboard.rb +219 -0
- data/lib/etassia/markdown_text/emphasis_simulator.rb +373 -0
- data/lib/etassia/markdown_text.rb +393 -0
- data/lib/etassia/notation/builtin.rb +39 -0
- data/lib/etassia/notation/entry.rb +15 -0
- data/lib/etassia/notation/mermaid/class_diagram_config.rb +42 -0
- data/lib/etassia/notation/mermaid/git_graph_config.rb +46 -0
- data/lib/etassia/notation/mermaid/ir_adapter.rb +27 -0
- data/lib/etassia/notation/mermaid/ir_adapters/architecture.rb +196 -0
- data/lib/etassia/notation/mermaid/ir_adapters/block.rb +138 -0
- data/lib/etassia/notation/mermaid/ir_adapters/c4.rb +258 -0
- data/lib/etassia/notation/mermaid/ir_adapters/class_diagram.rb +257 -0
- data/lib/etassia/notation/mermaid/ir_adapters/er_diagram.rb +220 -0
- data/lib/etassia/notation/mermaid/ir_adapters/error.rb +32 -0
- data/lib/etassia/notation/mermaid/ir_adapters/flowchart.rb +208 -0
- data/lib/etassia/notation/mermaid/ir_adapters/gantt.rb +236 -0
- data/lib/etassia/notation/mermaid/ir_adapters/git_graph.rb +186 -0
- data/lib/etassia/notation/mermaid/ir_adapters/info.rb +34 -0
- data/lib/etassia/notation/mermaid/ir_adapters/kanban.rb +110 -0
- data/lib/etassia/notation/mermaid/ir_adapters/mindmap.rb +76 -0
- data/lib/etassia/notation/mermaid/ir_adapters/packet.rb +51 -0
- data/lib/etassia/notation/mermaid/ir_adapters/pie.rb +71 -0
- data/lib/etassia/notation/mermaid/ir_adapters/quadrant.rb +116 -0
- data/lib/etassia/notation/mermaid/ir_adapters/radar.rb +142 -0
- data/lib/etassia/notation/mermaid/ir_adapters/requirement.rb +237 -0
- data/lib/etassia/notation/mermaid/ir_adapters/sankey.rb +74 -0
- data/lib/etassia/notation/mermaid/ir_adapters/sequence.rb +304 -0
- data/lib/etassia/notation/mermaid/ir_adapters/state_diagram.rb +225 -0
- data/lib/etassia/notation/mermaid/ir_adapters/timeline.rb +93 -0
- data/lib/etassia/notation/mermaid/ir_adapters/treemap.rb +143 -0
- data/lib/etassia/notation/mermaid/ir_adapters/user_journey.rb +127 -0
- data/lib/etassia/notation/mermaid/ir_adapters/xychart.rb +131 -0
- data/lib/etassia/notation/mermaid.rb +399 -0
- data/lib/etassia/notation/parsed.rb +31 -0
- data/lib/etassia/notation/plantuml/activity/arrow_head.rb +45 -0
- data/lib/etassia/notation/plantuml/activity/arrow_style.rb +53 -0
- data/lib/etassia/notation/plantuml/activity/bar_columns.rb +75 -0
- data/lib/etassia/notation/plantuml/activity/box.rb +60 -0
- data/lib/etassia/notation/plantuml/activity/builder.rb +77 -0
- data/lib/etassia/notation/plantuml/activity/canvas.rb +117 -0
- data/lib/etassia/notation/plantuml/activity/column_centres.rb +151 -0
- data/lib/etassia/notation/plantuml/activity/columns.rb +224 -0
- data/lib/etassia/notation/plantuml/activity/diagram.rb +35 -0
- data/lib/etassia/notation/plantuml/activity/edge.rb +35 -0
- data/lib/etassia/notation/plantuml/activity/edge_marks.rb +68 -0
- data/lib/etassia/notation/plantuml/activity/exits.rb +61 -0
- data/lib/etassia/notation/plantuml/activity/frame_marks.rb +116 -0
- data/lib/etassia/notation/plantuml/activity/lane_steps.rb +82 -0
- data/lib/etassia/notation/plantuml/activity/lane_titles.rb +46 -0
- data/lib/etassia/notation/plantuml/activity/layout.rb +50 -0
- data/lib/etassia/notation/plantuml/activity/legacy_parser.rb +181 -0
- data/lib/etassia/notation/plantuml/activity/legacy_row_gaps.rb +65 -0
- data/lib/etassia/notation/plantuml/activity/mark.rb +23 -0
- data/lib/etassia/notation/plantuml/activity/marks.rb +62 -0
- data/lib/etassia/notation/plantuml/activity/metrics.rb +169 -0
- data/lib/etassia/notation/plantuml/activity/new_parser/blocks.rb +166 -0
- data/lib/etassia/notation/plantuml/activity/new_parser.rb +177 -0
- data/lib/etassia/notation/plantuml/activity/node.rb +50 -0
- data/lib/etassia/notation/plantuml/activity/node_marks.rb +174 -0
- data/lib/etassia/notation/plantuml/activity/note.rb +27 -0
- data/lib/etassia/notation/plantuml/activity/parser.rb +51 -0
- data/lib/etassia/notation/plantuml/activity/placement.rb +327 -0
- data/lib/etassia/notation/plantuml/activity/ranking.rb +142 -0
- data/lib/etassia/notation/plantuml/activity/reach.rb +58 -0
- data/lib/etassia/notation/plantuml/activity/renderer.rb +220 -0
- data/lib/etassia/notation/plantuml/activity/route.rb +22 -0
- data/lib/etassia/notation/plantuml/activity/router.rb +308 -0
- data/lib/etassia/notation/plantuml/activity/row_gaps.rb +105 -0
- data/lib/etassia/notation/plantuml/activity/row_spread.rb +59 -0
- data/lib/etassia/notation/plantuml/activity/scene.rb +20 -0
- data/lib/etassia/notation/plantuml/activity/text.rb +36 -0
- data/lib/etassia/notation/plantuml/activity.rb +50 -0
- data/lib/etassia/notation/plantuml/arrow.rb +135 -0
- data/lib/etassia/notation/plantuml/caption.rb +50 -0
- data/lib/etassia/notation/plantuml/caption_layout.rb +97 -0
- data/lib/etassia/notation/plantuml/caption_rows.rb +67 -0
- data/lib/etassia/notation/plantuml/class_header.rb +178 -0
- data/lib/etassia/notation/plantuml/class_name.rb +51 -0
- data/lib/etassia/notation/plantuml/component.rb +37 -0
- data/lib/etassia/notation/plantuml/creole.rb +278 -0
- data/lib/etassia/notation/plantuml/creole_icons.rb +33 -0
- data/lib/etassia/notation/plantuml/diagram.rb +60 -0
- data/lib/etassia/notation/plantuml/diagram_builder.rb +442 -0
- data/lib/etassia/notation/plantuml/diagram_name.rb +51 -0
- data/lib/etassia/notation/plantuml/directives.rb +33 -0
- data/lib/etassia/notation/plantuml/drawing/box.rb +28 -0
- data/lib/etassia/notation/plantuml/drawing/face.rb +39 -0
- data/lib/etassia/notation/plantuml/drawing/pen.rb +105 -0
- data/lib/etassia/notation/plantuml/drawing/renderer.rb +36 -0
- data/lib/etassia/notation/plantuml/drawing/scene.rb +28 -0
- data/lib/etassia/notation/plantuml/drawing.rb +19 -0
- data/lib/etassia/notation/plantuml/ebnf/blocks.rb +272 -0
- data/lib/etassia/notation/plantuml/ebnf/layout.rb +117 -0
- data/lib/etassia/notation/plantuml/ebnf/model.rb +22 -0
- data/lib/etassia/notation/plantuml/ebnf/reader.rb +131 -0
- data/lib/etassia/notation/plantuml/ebnf.rb +34 -0
- data/lib/etassia/notation/plantuml/end_texts.rb +78 -0
- data/lib/etassia/notation/plantuml/entity.rb +54 -0
- data/lib/etassia/notation/plantuml/further.rb +38 -0
- data/lib/etassia/notation/plantuml/gantt/layout.rb +269 -0
- data/lib/etassia/notation/plantuml/gantt/reader.rb +210 -0
- data/lib/etassia/notation/plantuml/gantt/renderer.rb +81 -0
- data/lib/etassia/notation/plantuml/gantt.rb +34 -0
- data/lib/etassia/notation/plantuml/include/blocks.rb +66 -0
- data/lib/etassia/notation/plantuml/include/finder.rb +61 -0
- data/lib/etassia/notation/plantuml/include.rb +78 -0
- data/lib/etassia/notation/plantuml/ir_adapter/annotations.rb +40 -0
- data/lib/etassia/notation/plantuml/ir_adapter/links.rb +91 -0
- data/lib/etassia/notation/plantuml/ir_adapter/sink.rb +49 -0
- data/lib/etassia/notation/plantuml/ir_adapter/structure.rb +86 -0
- data/lib/etassia/notation/plantuml/ir_adapter.rb +32 -0
- data/lib/etassia/notation/plantuml/ir_reader/annotations.rb +51 -0
- data/lib/etassia/notation/plantuml/ir_reader/index.rb +49 -0
- data/lib/etassia/notation/plantuml/ir_reader/links.rb +133 -0
- data/lib/etassia/notation/plantuml/ir_reader/structure.rb +83 -0
- data/lib/etassia/notation/plantuml/ir_reader.rb +42 -0
- data/lib/etassia/notation/plantuml/junction.rb +20 -0
- data/lib/etassia/notation/plantuml/klass.rb +41 -0
- data/lib/etassia/notation/plantuml/label_clearance.rb +67 -0
- data/lib/etassia/notation/plantuml/layout.rb +2806 -0
- data/lib/etassia/notation/plantuml/member.rb +37 -0
- data/lib/etassia/notation/plantuml/member_icon.rb +87 -0
- data/lib/etassia/notation/plantuml/member_icon_elements.rb +91 -0
- data/lib/etassia/notation/plantuml/member_pitch.rb +76 -0
- data/lib/etassia/notation/plantuml/member_rule.rb +48 -0
- data/lib/etassia/notation/plantuml/network/grid.rb +170 -0
- data/lib/etassia/notation/plantuml/network/layout.rb +158 -0
- data/lib/etassia/notation/plantuml/network/model.rb +22 -0
- data/lib/etassia/notation/plantuml/network/placement.rb +64 -0
- data/lib/etassia/notation/plantuml/network/reader.rb +126 -0
- data/lib/etassia/notation/plantuml/network/shapes.rb +109 -0
- data/lib/etassia/notation/plantuml/network.rb +37 -0
- data/lib/etassia/notation/plantuml/node_graph/archimate.rb +49 -0
- data/lib/etassia/notation/plantuml/node_graph/box_reader.rb +86 -0
- data/lib/etassia/notation/plantuml/node_graph/cloud.rb +73 -0
- data/lib/etassia/notation/plantuml/node_graph/crows_foot.rb +85 -0
- data/lib/etassia/notation/plantuml/node_graph/curve.rb +66 -0
- data/lib/etassia/notation/plantuml/node_graph/data_reader.rb +77 -0
- data/lib/etassia/notation/plantuml/node_graph/data_shape.rb +39 -0
- data/lib/etassia/notation/plantuml/node_graph/detour.rb +98 -0
- data/lib/etassia/notation/plantuml/node_graph/edge.rb +26 -0
- data/lib/etassia/notation/plantuml/node_graph/entity_metrics.rb +49 -0
- data/lib/etassia/notation/plantuml/node_graph/entity_reader.rb +65 -0
- data/lib/etassia/notation/plantuml/node_graph/entity_shape.rb +111 -0
- data/lib/etassia/notation/plantuml/node_graph/figures.rb +92 -0
- data/lib/etassia/notation/plantuml/node_graph/frame_ports.rb +73 -0
- data/lib/etassia/notation/plantuml/node_graph/graph.rb +40 -0
- data/lib/etassia/notation/plantuml/node_graph/heads.rb +89 -0
- data/lib/etassia/notation/plantuml/node_graph/label_fan.rb +76 -0
- data/lib/etassia/notation/plantuml/node_graph/label_placer.rb +310 -0
- data/lib/etassia/notation/plantuml/node_graph/label_waypoint.rb +47 -0
- data/lib/etassia/notation/plantuml/node_graph/layout.rb +293 -0
- data/lib/etassia/notation/plantuml/node_graph/link.rb +78 -0
- data/lib/etassia/notation/plantuml/node_graph/macros.rb +39 -0
- data/lib/etassia/notation/plantuml/node_graph/metrics.rb +113 -0
- data/lib/etassia/notation/plantuml/node_graph/node.rb +44 -0
- data/lib/etassia/notation/plantuml/node_graph/note_tail.rb +58 -0
- data/lib/etassia/notation/plantuml/node_graph/packer.rb +126 -0
- data/lib/etassia/notation/plantuml/node_graph/parser.rb +309 -0
- data/lib/etassia/notation/plantuml/node_graph/paths.rb +48 -0
- data/lib/etassia/notation/plantuml/node_graph/ranking.rb +231 -0
- data/lib/etassia/notation/plantuml/node_graph/reader.rb +53 -0
- data/lib/etassia/notation/plantuml/node_graph/references.rb +38 -0
- data/lib/etassia/notation/plantuml/node_graph/renderer.rb +160 -0
- data/lib/etassia/notation/plantuml/node_graph/scene.rb +22 -0
- data/lib/etassia/notation/plantuml/node_graph/shapes.rb +302 -0
- data/lib/etassia/notation/plantuml/node_graph/skipped_ranks.rb +61 -0
- data/lib/etassia/notation/plantuml/node_graph/tab.rb +68 -0
- data/lib/etassia/notation/plantuml/node_graph/usecase_ellipse.rb +100 -0
- data/lib/etassia/notation/plantuml/node_graph.rb +38 -0
- data/lib/etassia/notation/plantuml/note.rb +27 -0
- data/lib/etassia/notation/plantuml/note_layout.rb +257 -0
- data/lib/etassia/notation/plantuml/note_outline.rb +68 -0
- data/lib/etassia/notation/plantuml/objects/map_rows.rb +46 -0
- data/lib/etassia/notation/plantuml/objects/reader.rb +208 -0
- data/lib/etassia/notation/plantuml/objects.rb +39 -0
- data/lib/etassia/notation/plantuml/package.rb +45 -0
- data/lib/etassia/notation/plantuml/package_color.rb +32 -0
- data/lib/etassia/notation/plantuml/package_frames.rb +178 -0
- data/lib/etassia/notation/plantuml/parser.rb +622 -0
- data/lib/etassia/notation/plantuml/portion_visibility.rb +91 -0
- data/lib/etassia/notation/plantuml/qualified_association_layout.rb +332 -0
- data/lib/etassia/notation/plantuml/qualifier_box.rb +78 -0
- data/lib/etassia/notation/plantuml/rank_chain.rb +527 -0
- data/lib/etassia/notation/plantuml/rank_hierarchy.rb +347 -0
- data/lib/etassia/notation/plantuml/relation.rb +103 -0
- data/lib/etassia/notation/plantuml/relation_label_separator.rb +199 -0
- data/lib/etassia/notation/plantuml/relation_path_points.rb +84 -0
- data/lib/etassia/notation/plantuml/renderer.rb +490 -0
- data/lib/etassia/notation/plantuml/scene.rb +134 -0
- data/lib/etassia/notation/plantuml/segment_box.rb +85 -0
- data/lib/etassia/notation/plantuml/sequence/activation.rb +28 -0
- data/lib/etassia/notation/plantuml/sequence/appearance.rb +71 -0
- data/lib/etassia/notation/plantuml/sequence/arrow_end.rb +23 -0
- data/lib/etassia/notation/plantuml/sequence/arrow_marks.rb +111 -0
- data/lib/etassia/notation/plantuml/sequence/arrow_style.rb +42 -0
- data/lib/etassia/notation/plantuml/sequence/arrow_syntax.rb +122 -0
- data/lib/etassia/notation/plantuml/sequence/bar_tracker.rb +59 -0
- data/lib/etassia/notation/plantuml/sequence/box.rb +23 -0
- data/lib/etassia/notation/plantuml/sequence/chrome.rb +60 -0
- data/lib/etassia/notation/plantuml/sequence/chrome_rows.rb +184 -0
- data/lib/etassia/notation/plantuml/sequence/create.rb +34 -0
- data/lib/etassia/notation/plantuml/sequence/delay.rb +19 -0
- data/lib/etassia/notation/plantuml/sequence/destroy.rb +20 -0
- data/lib/etassia/notation/plantuml/sequence/diagram.rb +86 -0
- data/lib/etassia/notation/plantuml/sequence/divider.rb +19 -0
- data/lib/etassia/notation/plantuml/sequence/edge.rb +53 -0
- data/lib/etassia/notation/plantuml/sequence/embedded.rb +77 -0
- data/lib/etassia/notation/plantuml/sequence/fill.rb +56 -0
- data/lib/etassia/notation/plantuml/sequence/fragment.rb +28 -0
- data/lib/etassia/notation/plantuml/sequence/fragment_shape.rb +138 -0
- data/lib/etassia/notation/plantuml/sequence/head_style.rb +43 -0
- data/lib/etassia/notation/plantuml/sequence/ir_adapter/blocks.rb +73 -0
- data/lib/etassia/notation/plantuml/sequence/ir_adapter/fills.rb +24 -0
- data/lib/etassia/notation/plantuml/sequence/ir_adapter/items.rb +48 -0
- data/lib/etassia/notation/plantuml/sequence/ir_adapter/messages.rb +62 -0
- data/lib/etassia/notation/plantuml/sequence/ir_adapter/participants.rb +42 -0
- data/lib/etassia/notation/plantuml/sequence/ir_adapter/settings.rb +54 -0
- data/lib/etassia/notation/plantuml/sequence/ir_adapter.rb +38 -0
- data/lib/etassia/notation/plantuml/sequence/ir_reader/blocks.rb +77 -0
- data/lib/etassia/notation/plantuml/sequence/ir_reader/fills.rb +27 -0
- data/lib/etassia/notation/plantuml/sequence/ir_reader/index.rb +36 -0
- data/lib/etassia/notation/plantuml/sequence/ir_reader/items.rb +35 -0
- data/lib/etassia/notation/plantuml/sequence/ir_reader/messages.rb +70 -0
- data/lib/etassia/notation/plantuml/sequence/ir_reader/participants.rb +42 -0
- data/lib/etassia/notation/plantuml/sequence/ir_reader/settings.rb +74 -0
- data/lib/etassia/notation/plantuml/sequence/ir_reader.rb +38 -0
- data/lib/etassia/notation/plantuml/sequence/keyword_defaults.rb +28 -0
- data/lib/etassia/notation/plantuml/sequence/layout.rb +1567 -0
- data/lib/etassia/notation/plantuml/sequence/message.rb +97 -0
- data/lib/etassia/notation/plantuml/sequence/message_wrap.rb +77 -0
- data/lib/etassia/notation/plantuml/sequence/note.rb +61 -0
- data/lib/etassia/notation/plantuml/sequence/note_fill.rb +35 -0
- data/lib/etassia/notation/plantuml/sequence/note_geometry.rb +126 -0
- data/lib/etassia/notation/plantuml/sequence/note_shape.rb +51 -0
- data/lib/etassia/notation/plantuml/sequence/numbered_label.rb +57 -0
- data/lib/etassia/notation/plantuml/sequence/numbering.rb +49 -0
- data/lib/etassia/notation/plantuml/sequence/outline.rb +204 -0
- data/lib/etassia/notation/plantuml/sequence/page_break.rb +17 -0
- data/lib/etassia/notation/plantuml/sequence/paint.rb +79 -0
- data/lib/etassia/notation/plantuml/sequence/parallel_message.rb +19 -0
- data/lib/etassia/notation/plantuml/sequence/parser.rb +844 -0
- data/lib/etassia/notation/plantuml/sequence/participant.rb +27 -0
- data/lib/etassia/notation/plantuml/sequence/picture.rb +29 -0
- data/lib/etassia/notation/plantuml/sequence/ref.rb +24 -0
- data/lib/etassia/notation/plantuml/sequence/ref_shape.rb +74 -0
- data/lib/etassia/notation/plantuml/sequence/refusals.rb +47 -0
- data/lib/etassia/notation/plantuml/sequence/renderer.rb +501 -0
- data/lib/etassia/notation/plantuml/sequence/scene.rb +200 -0
- data/lib/etassia/notation/plantuml/sequence/skin.rb +76 -0
- data/lib/etassia/notation/plantuml/sequence/spacing.rb +28 -0
- data/lib/etassia/notation/plantuml/sequence/style.rb +151 -0
- data/lib/etassia/notation/plantuml/sequence/tab_size.rb +42 -0
- data/lib/etassia/notation/plantuml/sequence/walker.rb +1190 -0
- data/lib/etassia/notation/plantuml/sequence.rb +47 -0
- data/lib/etassia/notation/plantuml/source_lines.rb +33 -0
- data/lib/etassia/notation/plantuml/state/axis_solver.rb +272 -0
- data/lib/etassia/notation/plantuml/state/cluster_padding.rb +75 -0
- data/lib/etassia/notation/plantuml/state/curve.rb +73 -0
- data/lib/etassia/notation/plantuml/state/dot_axis.rb +248 -0
- data/lib/etassia/notation/plantuml/state/extent.rb +42 -0
- data/lib/etassia/notation/plantuml/state/hierarchy.rb +355 -0
- data/lib/etassia/notation/plantuml/state/label_clearance.rb +148 -0
- data/lib/etassia/notation/plantuml/state/label_reach.rb +139 -0
- data/lib/etassia/notation/plantuml/state/layout.rb +173 -0
- data/lib/etassia/notation/plantuml/state/level_edges.rb +113 -0
- data/lib/etassia/notation/plantuml/state/look.rb +36 -0
- data/lib/etassia/notation/plantuml/state/note_shape.rb +73 -0
- data/lib/etassia/notation/plantuml/state/plane.rb +85 -0
- data/lib/etassia/notation/plantuml/state/ranking.rb +181 -0
- data/lib/etassia/notation/plantuml/state/reader.rb +310 -0
- data/lib/etassia/notation/plantuml/state/renderer.rb +253 -0
- data/lib/etassia/notation/plantuml/state/route_detour.rb +115 -0
- data/lib/etassia/notation/plantuml/state/route_geometry.rb +186 -0
- data/lib/etassia/notation/plantuml/state/routes.rb +196 -0
- data/lib/etassia/notation/plantuml/state/row.rb +88 -0
- data/lib/etassia/notation/plantuml/state/rows.rb +50 -0
- data/lib/etassia/notation/plantuml/state/stretch.rb +71 -0
- data/lib/etassia/notation/plantuml/state.rb +62 -0
- data/lib/etassia/notation/plantuml/stereotype_head.rb +58 -0
- data/lib/etassia/notation/plantuml/style/bound.rb +34 -0
- data/lib/etassia/notation/plantuml/style/colour.rb +41 -0
- data/lib/etassia/notation/plantuml/style/colour_names.rb +89 -0
- data/lib/etassia/notation/plantuml/style/defaults.rb +33 -0
- data/lib/etassia/notation/plantuml/style/inline.rb +56 -0
- data/lib/etassia/notation/plantuml/style/reader.rb +242 -0
- data/lib/etassia/notation/plantuml/style/sheet.rb +103 -0
- data/lib/etassia/notation/plantuml/style.rb +32 -0
- data/lib/etassia/notation/plantuml/style_reader.rb +160 -0
- data/lib/etassia/notation/plantuml/style_sheet.rb +27 -0
- data/lib/etassia/notation/plantuml/styled_relation_curve.rb +71 -0
- data/lib/etassia/notation/plantuml/timing/arrows.rb +81 -0
- data/lib/etassia/notation/plantuml/timing/axis.rb +100 -0
- data/lib/etassia/notation/plantuml/timing/layout.rb +172 -0
- data/lib/etassia/notation/plantuml/timing/model.rb +34 -0
- data/lib/etassia/notation/plantuml/timing/reader.rb +173 -0
- data/lib/etassia/notation/plantuml/timing/signals.rb +328 -0
- data/lib/etassia/notation/plantuml/timing.rb +38 -0
- data/lib/etassia/notation/plantuml/tree/layout.rb +276 -0
- data/lib/etassia/notation/plantuml/tree/mindmap_layout.rb +157 -0
- data/lib/etassia/notation/plantuml/tree/reader.rb +186 -0
- data/lib/etassia/notation/plantuml/tree/renderer.rb +67 -0
- data/lib/etassia/notation/plantuml/tree/role.rb +57 -0
- data/lib/etassia/notation/plantuml/tree/rules.rb +156 -0
- data/lib/etassia/notation/plantuml/tree/wbs_layout.rb +164 -0
- data/lib/etassia/notation/plantuml/tree.rb +41 -0
- data/lib/etassia/notation/plantuml/unsupported_construct_error.rb +39 -0
- data/lib/etassia/notation/plantuml/unsupported_constructs.rb +103 -0
- data/lib/etassia/notation/plantuml/usecase.rb +36 -0
- data/lib/etassia/notation/plantuml.rb +132 -0
- data/lib/etassia/notation/plantuml_data/boxes/frames.rb +101 -0
- data/lib/etassia/notation/plantuml_data/boxes/graph_layout.rb +348 -0
- data/lib/etassia/notation/plantuml_data/boxes/heads.rb +65 -0
- data/lib/etassia/notation/plantuml_data/boxes/highlights.rb +70 -0
- data/lib/etassia/notation/plantuml_data/boxes/inline_rows.rb +99 -0
- data/lib/etassia/notation/plantuml_data/boxes/json_reader.rb +24 -0
- data/lib/etassia/notation/plantuml_data/boxes/link_text.rb +94 -0
- data/lib/etassia/notation/plantuml_data/boxes/marks.rb +76 -0
- data/lib/etassia/notation/plantuml_data/boxes/ornaments.rb +130 -0
- data/lib/etassia/notation/plantuml_data/boxes/renderer.rb +95 -0
- data/lib/etassia/notation/plantuml_data/boxes/row_alignment.rb +58 -0
- data/lib/etassia/notation/plantuml_data/boxes/row_bend.rb +43 -0
- data/lib/etassia/notation/plantuml_data/boxes/scene.rb +27 -0
- data/lib/etassia/notation/plantuml_data/boxes/table.rb +56 -0
- data/lib/etassia/notation/plantuml_data/boxes/table_box.rb +355 -0
- data/lib/etassia/notation/plantuml_data/boxes/text.rb +101 -0
- data/lib/etassia/notation/plantuml_data/boxes/tree_builder.rb +82 -0
- data/lib/etassia/notation/plantuml_data/boxes/tree_layout.rb +82 -0
- data/lib/etassia/notation/plantuml_data/boxes/yaml_reader.rb +105 -0
- data/lib/etassia/notation/plantuml_data/openiconic.LICENSE +6 -0
- data/lib/etassia/notation/plantuml_data/openiconic.json +1 -0
- data/lib/etassia/notation/plantuml_data.rb +84 -0
- data/lib/etassia/notation/plantuml_salt/block.rb +80 -0
- data/lib/etassia/notation/plantuml_salt/box.rb +30 -0
- data/lib/etassia/notation/plantuml_salt/font_metrics.rb +28 -0
- data/lib/etassia/notation/plantuml_salt/grid_marks.rb +66 -0
- data/lib/etassia/notation/plantuml_salt/group_marks.rb +77 -0
- data/lib/etassia/notation/plantuml_salt/layout.rb +206 -0
- data/lib/etassia/notation/plantuml_salt/mark.rb +36 -0
- data/lib/etassia/notation/plantuml_salt/markup.rb +57 -0
- data/lib/etassia/notation/plantuml_salt/parser.rb +239 -0
- data/lib/etassia/notation/plantuml_salt/renderer.rb +138 -0
- data/lib/etassia/notation/plantuml_salt/row.rb +19 -0
- data/lib/etassia/notation/plantuml_salt/run.rb +34 -0
- data/lib/etassia/notation/plantuml_salt/scene.rb +23 -0
- data/lib/etassia/notation/plantuml_salt/scroll_marks.rb +94 -0
- data/lib/etassia/notation/plantuml_salt/tab_marks.rb +74 -0
- data/lib/etassia/notation/plantuml_salt/tree_marks.rb +127 -0
- data/lib/etassia/notation/plantuml_salt/widget.rb +40 -0
- data/lib/etassia/notation/plantuml_salt/widget_marks.rb +319 -0
- data/lib/etassia/notation/plantuml_salt.rb +66 -0
- data/lib/etassia/notation/plugin_failure.rb +42 -0
- data/lib/etassia/notation.rb +289 -0
- data/lib/etassia/parser/architecture.rb +25 -0
- data/lib/etassia/parser/atoms/delimited_run.rb +82 -0
- data/lib/etassia/parser/atoms/greedy_run.rb +116 -0
- data/lib/etassia/parser/atoms/joined.rb +47 -0
- data/lib/etassia/parser/atoms/trimmed_run.rb +47 -0
- data/lib/etassia/parser/base.rb +258 -0
- data/lib/etassia/parser/block.rb +32 -0
- data/lib/etassia/parser/builders/architecture.rb +135 -0
- data/lib/etassia/parser/builders/block.rb +288 -0
- data/lib/etassia/parser/builders/c4.rb +275 -0
- data/lib/etassia/parser/builders/capture_string.rb +17 -0
- data/lib/etassia/parser/builders/class_diagram.rb +539 -0
- data/lib/etassia/parser/builders/er_diagram.rb +308 -0
- data/lib/etassia/parser/builders/error.rb +51 -0
- data/lib/etassia/parser/builders/flowchart.rb +1150 -0
- data/lib/etassia/parser/builders/gantt.rb +267 -0
- data/lib/etassia/parser/builders/git_graph.rb +301 -0
- data/lib/etassia/parser/builders/info.rb +57 -0
- data/lib/etassia/parser/builders/kanban.rb +411 -0
- data/lib/etassia/parser/builders/mindmap.rb +271 -0
- data/lib/etassia/parser/builders/packet.rb +85 -0
- data/lib/etassia/parser/builders/pie.rb +105 -0
- data/lib/etassia/parser/builders/quadrant.rb +165 -0
- data/lib/etassia/parser/builders/radar.rb +157 -0
- data/lib/etassia/parser/builders/requirement.rb +230 -0
- data/lib/etassia/parser/builders/sankey.rb +142 -0
- data/lib/etassia/parser/builders/sequence.rb +431 -0
- data/lib/etassia/parser/builders/sequence_blocks.rb +117 -0
- data/lib/etassia/parser/builders/sequence_box_title.rb +57 -0
- data/lib/etassia/parser/builders/state_diagram.rb +364 -0
- data/lib/etassia/parser/builders/timeline.rb +133 -0
- data/lib/etassia/parser/builders/treemap.rb +138 -0
- data/lib/etassia/parser/builders/xy_chart.rb +148 -0
- data/lib/etassia/parser/c4.rb +37 -0
- data/lib/etassia/parser/class_diagram.rb +58 -0
- data/lib/etassia/parser/class_namespaces.rb +62 -0
- data/lib/etassia/parser/class_notes.rb +54 -0
- data/lib/etassia/parser/er_diagram.rb +28 -0
- data/lib/etassia/parser/error.rb +30 -0
- data/lib/etassia/parser/flowchart.rb +87 -0
- data/lib/etassia/parser/gantt.rb +43 -0
- data/lib/etassia/parser/git_graph.rb +106 -0
- data/lib/etassia/parser/grammars/architecture.rb +165 -0
- data/lib/etassia/parser/grammars/block.rb +190 -0
- data/lib/etassia/parser/grammars/c4.rb +229 -0
- data/lib/etassia/parser/grammars/class_diagram.rb +606 -0
- data/lib/etassia/parser/grammars/common.rb +107 -0
- data/lib/etassia/parser/grammars/er_diagram.rb +232 -0
- data/lib/etassia/parser/grammars/error.rb +32 -0
- data/lib/etassia/parser/grammars/flowchart.rb +1722 -0
- data/lib/etassia/parser/grammars/gantt.rb +198 -0
- data/lib/etassia/parser/grammars/git_graph.rb +234 -0
- data/lib/etassia/parser/grammars/info.rb +53 -0
- data/lib/etassia/parser/grammars/kanban.rb +417 -0
- data/lib/etassia/parser/grammars/mermaid_unicode_text.rb +108 -0
- data/lib/etassia/parser/grammars/mindmap.rb +220 -0
- data/lib/etassia/parser/grammars/packet.rb +71 -0
- data/lib/etassia/parser/grammars/pie.rb +128 -0
- data/lib/etassia/parser/grammars/quadrant.rb +202 -0
- data/lib/etassia/parser/grammars/radar.rb +158 -0
- data/lib/etassia/parser/grammars/requirement.rb +258 -0
- data/lib/etassia/parser/grammars/sankey.rb +104 -0
- data/lib/etassia/parser/grammars/sequence.rb +940 -0
- data/lib/etassia/parser/grammars/state_diagram.rb +382 -0
- data/lib/etassia/parser/grammars/timeline.rb +153 -0
- data/lib/etassia/parser/grammars/treemap.rb +122 -0
- data/lib/etassia/parser/grammars/xy_chart.rb +119 -0
- data/lib/etassia/parser/info.rb +32 -0
- data/lib/etassia/parser/kanban.rb +131 -0
- data/lib/etassia/parser/mermaid_shapes.rb +106 -0
- data/lib/etassia/parser/metadata_yaml.rb +452 -0
- data/lib/etassia/parser/mindmap.rb +92 -0
- data/lib/etassia/parser/native/builders/architecture.rb +103 -0
- data/lib/etassia/parser/native/builders/block.rb +68 -0
- data/lib/etassia/parser/native/builders/c4.rb +16 -0
- data/lib/etassia/parser/native/builders/class_diagram.rb +63 -0
- data/lib/etassia/parser/native/builders/er_diagram.rb +47 -0
- data/lib/etassia/parser/native/builders/flowchart.rb +58 -0
- data/lib/etassia/parser/native/builders/gantt.rb +35 -0
- data/lib/etassia/parser/native/builders/gitgraph.rb +35 -0
- data/lib/etassia/parser/native/builders/info.rb +30 -0
- data/lib/etassia/parser/native/builders/kanban.rb +37 -0
- data/lib/etassia/parser/native/builders/mindmap.rb +26 -0
- data/lib/etassia/parser/native/builders/packet.rb +63 -0
- data/lib/etassia/parser/native/builders/pie.rb +82 -0
- data/lib/etassia/parser/native/builders/quadrant.rb +27 -0
- data/lib/etassia/parser/native/builders/radar.rb +84 -0
- data/lib/etassia/parser/native/builders/requirement.rb +25 -0
- data/lib/etassia/parser/native/builders/sankey.rb +18 -0
- data/lib/etassia/parser/native/builders/sequence.rb +48 -0
- data/lib/etassia/parser/native/builders/state_diagram.rb +61 -0
- data/lib/etassia/parser/native/builders/timeline.rb +46 -0
- data/lib/etassia/parser/native/builders/treemap.rb +60 -0
- data/lib/etassia/parser/native/builders/user_journey.rb +83 -0
- data/lib/etassia/parser/native/builders/xy_chart.rb +94 -0
- data/lib/etassia/parser/native/declined.rb +12 -0
- data/lib/etassia/parser/native/mermaid.json +1 -0
- data/lib/etassia/parser/native/text.rb +31 -0
- data/lib/etassia/parser/native.rb +99 -0
- data/lib/etassia/parser/packet.rb +56 -0
- data/lib/etassia/parser/pie.rb +32 -0
- data/lib/etassia/parser/quadrant.rb +77 -0
- data/lib/etassia/parser/radar.rb +99 -0
- data/lib/etassia/parser/requirement.rb +32 -0
- data/lib/etassia/parser/sankey.rb +47 -0
- data/lib/etassia/parser/sequence.rb +34 -0
- data/lib/etassia/parser/state_diagram.rb +29 -0
- data/lib/etassia/parser/timeline.rb +40 -0
- data/lib/etassia/parser/treemap.rb +25 -0
- data/lib/etassia/parser/user_journey.rb +253 -0
- data/lib/etassia/parser/xy_chart.rb +98 -0
- data/lib/etassia/parser.rb +18 -0
- data/lib/etassia/renderer/architecture.rb +232 -0
- data/lib/etassia/renderer/architecture_edge_router.rb +379 -0
- data/lib/etassia/renderer/base.rb +295 -0
- data/lib/etassia/renderer/block.rb +157 -0
- data/lib/etassia/renderer/c4.rb +294 -0
- data/lib/etassia/renderer/class_diagram.rb +671 -0
- data/lib/etassia/renderer/er_diagram.rb +842 -0
- data/lib/etassia/renderer/error.rb +131 -0
- data/lib/etassia/renderer/flowchart.rb +315 -0
- data/lib/etassia/renderer/gantt.rb +177 -0
- data/lib/etassia/renderer/git_graph.rb +224 -0
- data/lib/etassia/renderer/info.rb +59 -0
- data/lib/etassia/renderer/kanban.rb +157 -0
- data/lib/etassia/renderer/line_break_text.rb +56 -0
- data/lib/etassia/renderer/markdown_text.rb +106 -0
- data/lib/etassia/renderer/mindmap.rb +290 -0
- data/lib/etassia/renderer/packet.rb +87 -0
- data/lib/etassia/renderer/pie.rb +113 -0
- data/lib/etassia/renderer/quadrant.rb +189 -0
- data/lib/etassia/renderer/radar.rb +191 -0
- data/lib/etassia/renderer/requirement.rb +209 -0
- data/lib/etassia/renderer/sankey.rb +114 -0
- data/lib/etassia/renderer/sequence/frame_drawing.rb +169 -0
- data/lib/etassia/renderer/sequence/note_drawing.rb +69 -0
- data/lib/etassia/renderer/sequence.rb +490 -0
- data/lib/etassia/renderer/state_diagram.rb +202 -0
- data/lib/etassia/renderer/timeline.rb +134 -0
- data/lib/etassia/renderer/timeline_palette.rb +18 -0
- data/lib/etassia/renderer/treemap/section_total.rb +33 -0
- data/lib/etassia/renderer/treemap.rb +128 -0
- data/lib/etassia/renderer/user_journey.rb +209 -0
- data/lib/etassia/renderer/xy_chart.rb +180 -0
- data/lib/etassia/renderer.rb +22 -0
- data/lib/etassia/runtime.rb +125 -0
- data/lib/etassia/source/frontmatter.rb +501 -0
- data/lib/etassia/source.rb +224 -0
- data/lib/etassia/svg/arrowhead.rb +205 -0
- data/lib/etassia/svg/circle.rb +19 -0
- data/lib/etassia/svg/document.rb +106 -0
- data/lib/etassia/svg/element.rb +209 -0
- data/lib/etassia/svg/ellipse.rb +23 -0
- data/lib/etassia/svg/escaping.rb +149 -0
- data/lib/etassia/svg/group.rb +64 -0
- data/lib/etassia/svg/line.rb +21 -0
- data/lib/etassia/svg/numbers.rb +53 -0
- data/lib/etassia/svg/path.rb +67 -0
- data/lib/etassia/svg/path_geometry.rb +378 -0
- data/lib/etassia/svg/polygon.rb +25 -0
- data/lib/etassia/svg/polyline.rb +28 -0
- data/lib/etassia/svg/rect.rb +34 -0
- data/lib/etassia/svg/style.rb +50 -0
- data/lib/etassia/svg/text.rb +181 -0
- data/lib/etassia/svg/tspan.rb +48 -0
- data/lib/etassia/svg.rb +38 -0
- data/lib/etassia/text_measurement/arial_advances.rb +122 -0
- data/lib/etassia/text_measurement/dejavu_advances.rb +111 -0
- data/lib/etassia/text_measurement/times_advances.rb +64 -0
- data/lib/etassia/text_measurement/trebuchet_advances.rb +53 -0
- data/lib/etassia/text_measurement/trebuchet_kerning.rb +29 -0
- data/lib/etassia/text_measurement.rb +198 -0
- data/lib/etassia/theme/builtin/dark.yml +229 -0
- data/lib/etassia/theme/builtin/default.yml +239 -0
- data/lib/etassia/theme/builtin/high_contrast.yml +231 -0
- data/lib/etassia/theme/builtin/light.yml +229 -0
- data/lib/etassia/theme/color_palette.rb +97 -0
- data/lib/etassia/theme/completion.rb +50 -0
- data/lib/etassia/theme/effect_styles.rb +34 -0
- data/lib/etassia/theme/registry.rb +45 -0
- data/lib/etassia/theme/shape_styles.rb +34 -0
- data/lib/etassia/theme/spacing_config.rb +30 -0
- data/lib/etassia/theme/typography.rb +40 -0
- data/lib/etassia/theme.rb +73 -0
- data/lib/etassia/version.rb +5 -0
- data/lib/etassia.rb +40 -0
- metadata +865 -0
|
@@ -0,0 +1,417 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative "common"
|
|
4
|
+
require_relative "../atoms/greedy_run"
|
|
5
|
+
require_relative "../atoms/joined"
|
|
6
|
+
|
|
7
|
+
module Etassia
|
|
8
|
+
module Parser
|
|
9
|
+
module Grammars
|
|
10
|
+
# Parslet grammar for Kanban diagrams
|
|
11
|
+
class Kanban < Common
|
|
12
|
+
rule(:diagram) do
|
|
13
|
+
space_run >>
|
|
14
|
+
header >>
|
|
15
|
+
content_line.repeat(0).as(:lines) >>
|
|
16
|
+
line_space_run
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
rule(:header) do
|
|
20
|
+
str("kanban") >> (newline | eof)
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
# Nothing but blank and comment lines up to the end of the source.
|
|
24
|
+
rule(:blank_lines_left) do
|
|
25
|
+
(newline >> blank_text_run.maybe >> line_space_run >> eof) | eof
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
# The lines that capture nothing, taken as ONE slice. Parslet folds a
|
|
29
|
+
# repetition of plain slices with `Slice#+`, which is quadratic, so
|
|
30
|
+
# every repetition of such lines goes through `Joined`. A line that
|
|
31
|
+
# captures (an item or a modifier) breaks the run and is never joined.
|
|
32
|
+
rule(:blank_run) do
|
|
33
|
+
Atoms::Joined.new(
|
|
34
|
+
(empty_line | comment_line | no_op_modifier_line).repeat(1),
|
|
35
|
+
)
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
# Only blank and comment lines: an empty `:::` is not one of them, and
|
|
39
|
+
# `empty_class_modifier` looks ahead through this rule.
|
|
40
|
+
rule(:blank_text_run) do
|
|
41
|
+
Atoms::Joined.new((empty_line | comment_line).repeat(1))
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
rule(:content_line) do
|
|
45
|
+
blank_run | modifier_line | item_line
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
rule(:empty_line) do
|
|
49
|
+
line_space_run >> newline
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
# Overrides Common's char-at-a-time `comment` with the bounded
|
|
53
|
+
# `GreedyRun` scan (see atoms/greedy_run.rb) so a long `%%` line
|
|
54
|
+
# cannot hang this grammar; `.maybe` covers the empty-body `%%` case,
|
|
55
|
+
# since GreedyRun itself errors on a zero-length match.
|
|
56
|
+
#
|
|
57
|
+
# The body stops at U+2028/U+2029, where mermaid's lexer `.*` stops.
|
|
58
|
+
# Carriage returns never reach the grammar: the parser turns them
|
|
59
|
+
# into line feeds first, as mermaid does.
|
|
60
|
+
rule(:comment) do
|
|
61
|
+
str("%%") >> Atoms::GreedyRun.new('[^\n\u2028\u2029]').maybe
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
# A line holding only a `%%` comment (corpus 032). Mermaid strips
|
|
65
|
+
# such a line, up to its line feed, before lexing - so unlike a
|
|
66
|
+
# trailing comment, its body runs through U+2028/U+2029 too. It
|
|
67
|
+
# captures nothing, the same way empty_line doesn't -
|
|
68
|
+
# Builders::Kanban's `rule(lines: subtree(:lines))` filters any
|
|
69
|
+
# non-Hash entry out of the lines array.
|
|
70
|
+
rule(:comment_line) do
|
|
71
|
+
line_space_run >> str("%%") >> str("{").absent? >>
|
|
72
|
+
Atoms::GreedyRun.new('[^\n]').maybe >> (newline | eof)
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
# How every item and modifier line ends: optional
|
|
76
|
+
# whitespace, an optional trailing `%%` comment, then the line
|
|
77
|
+
# break. After a closing delimiter (`]`, `)`, `}`) the comment needs
|
|
78
|
+
# no space (`root[Root]%% c`); after a bare id `%%` is part of the
|
|
79
|
+
# label, which `bare_item` refuses. Whitespace is mermaid's `\s`,
|
|
80
|
+
# not Common's ASCII `space`.
|
|
81
|
+
rule(:line_end) do
|
|
82
|
+
(hspace_run >> comment >> comment_end) |
|
|
83
|
+
(line_space_run >> (newline | eof))
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
# The comment body stops at U+2028/U+2029. Mermaid refuses one
|
|
87
|
+
# unless only blanks and comments follow it to the end of the input.
|
|
88
|
+
rule(:comment_end) do
|
|
89
|
+
newline | eof |
|
|
90
|
+
(line_sep >> line_space_run >>
|
|
91
|
+
(blank_lines_left | (comment_line_start >> blank_lines_left)))
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
rule(:comment_line_start) do
|
|
95
|
+
str("%%") >> str("{").absent? >>
|
|
96
|
+
Atoms::GreedyRun.new('[^\n]').maybe
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
rule(:item_line) do
|
|
100
|
+
Atoms::GreedyRun.new("[ ]", min: 0).as(:indent) >>
|
|
101
|
+
item >>
|
|
102
|
+
line_end
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
# An empty `::icon()` decorates nothing and may sit anywhere. An
|
|
106
|
+
# empty `:::` swallows its own line break in mermaid's lexer, so the
|
|
107
|
+
# next item would be joined onto it: it is accepted only when
|
|
108
|
+
# nothing but blank or comment lines follow (measured against mmdc
|
|
109
|
+
# 11.12.0).
|
|
110
|
+
rule(:no_op_modifier_line) do
|
|
111
|
+
space_run >>
|
|
112
|
+
((icon_keyword >> str(")") >> line_end) | empty_class_modifier)
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
rule(:empty_class_modifier) do
|
|
116
|
+
str(":::") >> blank_lines_left.present?
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
# A standalone `::icon(...)` or `:::classes` line applies to the
|
|
120
|
+
# PREVIOUS item rather than declaring one of its own - mermaid's
|
|
121
|
+
# kanban shorthand for attaching an icon or classes without going
|
|
122
|
+
# through `@{ ... }` metadata. Mirrors mindmap.rb's
|
|
123
|
+
# `node_with_icon` / `node_with_class`, the existing precedent for
|
|
124
|
+
# this exact shorthand in this grammar family; `Builders::Kanban`
|
|
125
|
+
# applies it to the last item the same way mindmap's `TreeBuilder`
|
|
126
|
+
# applies it to the last node.
|
|
127
|
+
rule(:modifier_line) do
|
|
128
|
+
space_run.as(:indent) >> (icon_modifier | class_modifier) >> line_end
|
|
129
|
+
end
|
|
130
|
+
|
|
131
|
+
rule(:icon_keyword) do
|
|
132
|
+
str("::") >> match["iI"] >> match["cC"] >> match["oO"] >>
|
|
133
|
+
match["nN"] >> str("(")
|
|
134
|
+
end
|
|
135
|
+
|
|
136
|
+
rule(:icon_modifier) do
|
|
137
|
+
icon_keyword >>
|
|
138
|
+
Atoms::GreedyRun.new("[^)]").as(:icon) >>
|
|
139
|
+
str(")")
|
|
140
|
+
end
|
|
141
|
+
|
|
142
|
+
# The body stops where mermaid's `.+` does, at a line break or
|
|
143
|
+
# U+2028/U+2029; `%%` inside it is class text.
|
|
144
|
+
rule(:class_modifier) do
|
|
145
|
+
str(":::") >>
|
|
146
|
+
Atoms::GreedyRun.new('[^\n\u2028\u2029]').as(:classes)
|
|
147
|
+
end
|
|
148
|
+
|
|
149
|
+
# An item can be either a column or a card. The label is optional:
|
|
150
|
+
# mermaid accepts a bare id, with or without trailing metadata.
|
|
151
|
+
#
|
|
152
|
+
# Named alternation branches rather than folding the bracket label
|
|
153
|
+
# into one rule as a `.maybe`.
|
|
154
|
+
# `bare_item` is the most permissive branch and must stay last, or a
|
|
155
|
+
# later branch that also starts with an identifier would never be
|
|
156
|
+
# reached. `shaped_item` and `labelled_item` both require a specific
|
|
157
|
+
# delimiter (`(` or `[`) right after the id, so their relative order
|
|
158
|
+
# does not matter - Parslet fails one and tries the next without
|
|
159
|
+
# consuming input. `unlabelled_shaped_item` opens on `(`, something
|
|
160
|
+
# an identifier can never start with, so it stays reachable
|
|
161
|
+
# wherever it sits. Naming the branches keeps the order explicit
|
|
162
|
+
# rather than implied, which is how the other grammars in this
|
|
163
|
+
# directory are written - see `mindmap.rb`'s `node` rule.
|
|
164
|
+
rule(:item) do
|
|
165
|
+
reserved_token.absent? >>
|
|
166
|
+
(labelled_item | shaped_item | unlabelled_shaped_item |
|
|
167
|
+
bare_item) >>
|
|
168
|
+
metadata.maybe.as(:metadata)
|
|
169
|
+
end
|
|
170
|
+
|
|
171
|
+
# `kanban` is the diagram's own header token, and mermaid reserves it
|
|
172
|
+
# as a node name: it refuses `kanban`, `Kanban` and `KANBAN`, bare or
|
|
173
|
+
# carrying a bracket label, as a column or as a card. Only the whole
|
|
174
|
+
# word is taken - `kanbanBoard` and `mykanban` are legal ids. Measured
|
|
175
|
+
# against mmdc 11.12.0.
|
|
176
|
+
#
|
|
177
|
+
# No other keyword is reserved. The tokens checked are listed once,
|
|
178
|
+
# in the spec that pins them - see the 'reserves no other keyword'
|
|
179
|
+
# example in spec/etassia/parser/kanban_spec.rb.
|
|
180
|
+
rule(:reserved_token) do
|
|
181
|
+
kanban_keyword >> match["a-zA-Z0-9_"].absent?
|
|
182
|
+
end
|
|
183
|
+
|
|
184
|
+
# Parslet's `str` is case-sensitive and it offers no case-insensitive
|
|
185
|
+
# literal, so the keyword is spelled out character by character.
|
|
186
|
+
rule(:kanban_keyword) do
|
|
187
|
+
match["kK"] >> match["aA"] >> match["nN"] >>
|
|
188
|
+
match["bB"] >> match["aA"] >> match["nN"]
|
|
189
|
+
end
|
|
190
|
+
|
|
191
|
+
# Common's `identifier` repeats a one-character match, which Parslet
|
|
192
|
+
# folds with `Slice#+`: quadratic in the length of the id.
|
|
193
|
+
rule(:identifier) do
|
|
194
|
+
match["a-zA-Z_"] >> Atoms::GreedyRun.new("[a-zA-Z0-9_]", min: 0)
|
|
195
|
+
end
|
|
196
|
+
|
|
197
|
+
rule(:labelled_item) do
|
|
198
|
+
identifier.as(:id) >>
|
|
199
|
+
lbracket >>
|
|
200
|
+
labelled_item_text >>
|
|
201
|
+
rbracket
|
|
202
|
+
end
|
|
203
|
+
|
|
204
|
+
# Try the quoted form first: a quoted bracket label may contain `[`/`]`
|
|
205
|
+
# literally, so the unquoted fallback below (which stops at the first
|
|
206
|
+
# `]`) must not run against a quoted body. A markdown-string body
|
|
207
|
+
# (`"`text`"`) is refused in both alternatives, as `round_text` does:
|
|
208
|
+
# mermaid renders it as markdown and Etassia has no markdown renderer.
|
|
209
|
+
rule(:labelled_item_text) do
|
|
210
|
+
empty_quoted_fragments >>
|
|
211
|
+
((str('"') >> markdown_string_body.absent? >>
|
|
212
|
+
Atoms::GreedyRun.new('[^"]').as(:text) >> str('"')) |
|
|
213
|
+
((str('"') >> markdown_string_body).absent? >>
|
|
214
|
+
Atoms::GreedyRun.new('[^\]]').as(:text))) >>
|
|
215
|
+
empty_quoted_fragments
|
|
216
|
+
end
|
|
217
|
+
|
|
218
|
+
# mermaid's lexer drops an empty quoted fragment (`""` or an empty
|
|
219
|
+
# markdown string) beside the label text: `root[""a]` and
|
|
220
|
+
# `root["a"""]` are both `a`, while `root[""]` with no text-bearing
|
|
221
|
+
# fragment is refused.
|
|
222
|
+
rule(:empty_quoted_fragment) do
|
|
223
|
+
str('"``"') | str('""')
|
|
224
|
+
end
|
|
225
|
+
|
|
226
|
+
rule(:empty_quoted_fragments) do
|
|
227
|
+
Atoms::Joined.new(empty_quoted_fragment.repeat)
|
|
228
|
+
end
|
|
229
|
+
|
|
230
|
+
# Round shape with an id: id(text) - mermaid's rounded-node syntax,
|
|
231
|
+
# the same shorthand flowchart's `shape_rounded` parses. Etassia's
|
|
232
|
+
# kanban renderer always draws a rounded rect for every item
|
|
233
|
+
# regardless of source syntax (see Renderer::Kanban#render_column
|
|
234
|
+
# and #render_card), so the delimiter is parsed only to recover the
|
|
235
|
+
# label - no separate shape field is modeled, matching how the
|
|
236
|
+
# bracket label above works.
|
|
237
|
+
rule(:shaped_item) do
|
|
238
|
+
identifier.as(:id) >>
|
|
239
|
+
lparen >>
|
|
240
|
+
round_text >>
|
|
241
|
+
rparen
|
|
242
|
+
end
|
|
243
|
+
|
|
244
|
+
# Round shape with no id: (text). Mermaid auto-assigns an id here;
|
|
245
|
+
# BoardBuilder does too, deterministically - see
|
|
246
|
+
# Builders::Kanban::BoardBuilder#resolve_id.
|
|
247
|
+
rule(:unlabelled_shaped_item) do
|
|
248
|
+
lparen >>
|
|
249
|
+
round_text >>
|
|
250
|
+
rparen
|
|
251
|
+
end
|
|
252
|
+
|
|
253
|
+
# Text inside a round shape - id(text) or (text). A quoted body is
|
|
254
|
+
# tried first so it can contain an unescaped `)`, mermaid's own
|
|
255
|
+
# rule for `Todo (urgent)`, and the surrounding quotes are excluded
|
|
256
|
+
# from the capture rather than kept as literal characters - mermaid
|
|
257
|
+
# strips them too. Falls back to the plain, unquoted body when the
|
|
258
|
+
# first character isn't a `"`. Mirrors `square_shape` in
|
|
259
|
+
# mindmap.rb, the existing precedent for quoted content inside a
|
|
260
|
+
# bracketed shape in this grammar family.
|
|
261
|
+
#
|
|
262
|
+
# The unquoted body excludes `(`, `)`, `]` and `}` - mermaid's own
|
|
263
|
+
# lexer treats all four as node-shape delimiters even unquoted
|
|
264
|
+
# mid-label, and rejects a body carrying one (measured against mmdc
|
|
265
|
+
# 11.12.0). `[` and `{` are not delimiters to it there and stay
|
|
266
|
+
# literal, so they are not excluded - both parse in mermaid.
|
|
267
|
+
#
|
|
268
|
+
# A quoted body that itself opens and closes with a backtick -
|
|
269
|
+
# `"`text`"` - is mermaid's separate markdown-string syntax: it
|
|
270
|
+
# strips the backtick pair and renders the content through
|
|
271
|
+
# markdown, formatting included (`col("`Hi **urgent**`")` draws
|
|
272
|
+
# `Hi <strong>urgent</strong>` in mmdc 11.12.0). Etassia has no
|
|
273
|
+
# markdown renderer anywhere in the codebase, so matching this as
|
|
274
|
+
# an ordinary quoted body would keep the backticks as literal text
|
|
275
|
+
# and silently draw something mermaid does not. Refused instead,
|
|
276
|
+
# the same way an empty or unterminated quoted body is refused
|
|
277
|
+
# below, rather than half-supporting a shape nothing here
|
|
278
|
+
# understands.
|
|
279
|
+
rule(:round_text) do
|
|
280
|
+
empty_quoted_fragments >>
|
|
281
|
+
((str('"') >> markdown_string_body.absent? >>
|
|
282
|
+
Atoms::GreedyRun.new('[^"]').as(:text) >> str('"')) |
|
|
283
|
+
(str('"').absent? >>
|
|
284
|
+
Atoms::GreedyRun.new('[^()\]}]').as(:text))) >>
|
|
285
|
+
empty_quoted_fragments
|
|
286
|
+
end
|
|
287
|
+
|
|
288
|
+
rule(:markdown_string_body) do
|
|
289
|
+
str("`") >> Atoms::GreedyRun.new('[^"`]', min: 0) >>
|
|
290
|
+
str("`") >> str('"')
|
|
291
|
+
end
|
|
292
|
+
|
|
293
|
+
# Deliberately just an identifier. Mermaid also accepts a bare label
|
|
294
|
+
# containing spaces, but widening this to free text would swallow
|
|
295
|
+
# `root(Root)` and `:::hot` as literal labels, turning unsupported
|
|
296
|
+
# constructs into silently wrong output instead of parse failures.
|
|
297
|
+
# `identifier` also refuses a leading digit, so `1col` fails to parse
|
|
298
|
+
# while `col1` and `_col` are accepted.
|
|
299
|
+
# Trailing `%%`, or trailing JavaScript whitespace beyond space and
|
|
300
|
+
# tab, is part of a bare id's literal label in mermaid, so it is
|
|
301
|
+
# refused here rather than dropped by `line_end`.
|
|
302
|
+
rule(:bare_item) do
|
|
303
|
+
identifier.as(:id) >>
|
|
304
|
+
(space_run >> (str("%%") | line_space)).absent?
|
|
305
|
+
end
|
|
306
|
+
|
|
307
|
+
LINE_SPACE_CHARS = '\t\v\f\x20\u00A0\u1680' \
|
|
308
|
+
'\u2000-\u200A\u2028\u2029\u202F\u205F\u3000\uFEFF'
|
|
309
|
+
HSPACE_CHARS = '\t\v\f\x20\u00A0\u1680' \
|
|
310
|
+
'\u2000-\u200A\u202F\u205F\u3000\uFEFF'
|
|
311
|
+
private_constant :LINE_SPACE_CHARS, :HSPACE_CHARS
|
|
312
|
+
|
|
313
|
+
rule(:line_space) { match[LINE_SPACE_CHARS] }
|
|
314
|
+
rule(:line_sep) { match['\u2028\u2029'] }
|
|
315
|
+
|
|
316
|
+
# Whitespace runs go through `GreedyRun`: Parslet's own
|
|
317
|
+
# `line_space.repeat` is quadratic in the length of the run.
|
|
318
|
+
rule(:line_space_run) do
|
|
319
|
+
Atoms::GreedyRun.new("[#{LINE_SPACE_CHARS}]", min: 0)
|
|
320
|
+
end
|
|
321
|
+
|
|
322
|
+
rule(:space_run) { Atoms::GreedyRun.new("[ \\t]", min: 0) }
|
|
323
|
+
|
|
324
|
+
rule(:hspace_run) do
|
|
325
|
+
Atoms::GreedyRun.new("[#{HSPACE_CHARS}]", min: 0)
|
|
326
|
+
end
|
|
327
|
+
|
|
328
|
+
# Metadata: @{ key: 'value', key2: 'value2' } - or newline-separated
|
|
329
|
+
# with no commas (corpus 038). The body is captured RAW, as
|
|
330
|
+
# `flowchart.rb`'s `node_metadata` does, and handed to a YAML engine
|
|
331
|
+
# in the builder (`MetadataYaml`): a grammar rule cannot express
|
|
332
|
+
# "block vs flow, decided by whether a newline appears ANYWHERE in
|
|
333
|
+
# the body" without reimplementing a YAML lexer.
|
|
334
|
+
#
|
|
335
|
+
# `metadata_entries` is the grammar seam: its default is that raw
|
|
336
|
+
# capture, and a subclass that overrides it controls the tree
|
|
337
|
+
# `metadata` holds. The builder reads only `:body` from it, so an
|
|
338
|
+
# override that drops `:body` gives the item no metadata.
|
|
339
|
+
rule(:metadata) do
|
|
340
|
+
str("@") >> space_run >> lbrace >> metadata_entries >> rbrace
|
|
341
|
+
end
|
|
342
|
+
|
|
343
|
+
# An unmatched `"` is not body text - mermaid's lexer stays in its
|
|
344
|
+
# string state to the end of the block and refuses the source.
|
|
345
|
+
# A caret is not body text either: mermaid takes the run between
|
|
346
|
+
# the braces with `[^}^"]+`, so a `^` outside a quoted value ends
|
|
347
|
+
# the block early.
|
|
348
|
+
rule(:metadata_body) do
|
|
349
|
+
Atoms::Joined.new(
|
|
350
|
+
(Atoms::GreedyRun.new('[^"}^\n]') | blank_line_run |
|
|
351
|
+
metadata_comment_line | metadata_quoted | newline).repeat,
|
|
352
|
+
)
|
|
353
|
+
end
|
|
354
|
+
|
|
355
|
+
# Every line break that another one follows; the last stays for
|
|
356
|
+
# `metadata_comment_line`, which opens on a line break.
|
|
357
|
+
rule(:blank_line_run) do
|
|
358
|
+
Atoms::GreedyRun.new('\r?\n(?=\r?\n)')
|
|
359
|
+
end
|
|
360
|
+
|
|
361
|
+
# Mermaid strips comment lines before the metadata lexer sees them.
|
|
362
|
+
rule(:metadata_comment_line) do
|
|
363
|
+
newline >> line_space_run >> str("%%") >> str("{").absent? >>
|
|
364
|
+
Atoms::GreedyRun.new('[^\r\n]')
|
|
365
|
+
end
|
|
366
|
+
|
|
367
|
+
# A double-quoted run is skipped whole so a brace inside it is text,
|
|
368
|
+
# mirroring flowchart.rb's `metadata_quoted`. A comment line inside
|
|
369
|
+
# it is still a comment: mermaid strips those before lexing.
|
|
370
|
+
rule(:metadata_quoted) do
|
|
371
|
+
str('"') >>
|
|
372
|
+
(metadata_comment_line | Atoms::GreedyRun.new('[^"\n]') |
|
|
373
|
+
newline).repeat >>
|
|
374
|
+
str('"')
|
|
375
|
+
end
|
|
376
|
+
|
|
377
|
+
# The next 5 rules are public methods released in etassia 0.1.0: do
|
|
378
|
+
# not delete or rename them outside a major version. Only
|
|
379
|
+
# `metadata_entries` is on the parse path; the other four are
|
|
380
|
+
# building blocks a subclass may use inside its own override.
|
|
381
|
+
rule(:metadata_entries) do
|
|
382
|
+
metadata_body.as(:body)
|
|
383
|
+
end
|
|
384
|
+
|
|
385
|
+
rule(:metadata_entry) do
|
|
386
|
+
metadata_key.as(:key) >>
|
|
387
|
+
space_run >>
|
|
388
|
+
colon >>
|
|
389
|
+
space_run >>
|
|
390
|
+
metadata_value.as(:value)
|
|
391
|
+
end
|
|
392
|
+
|
|
393
|
+
rule(:metadata_key) do
|
|
394
|
+
match["a-zA-Z_"] >> Atoms::GreedyRun.new("[a-zA-Z0-9_]", min: 0)
|
|
395
|
+
end
|
|
396
|
+
|
|
397
|
+
rule(:metadata_value) do
|
|
398
|
+
quoted_string | single_quoted_string | unquoted_value
|
|
399
|
+
end
|
|
400
|
+
|
|
401
|
+
# Captured as :unquoted, not :string, so an override of
|
|
402
|
+
# `metadata_entries` can tell an unquoted scalar from a quoted one.
|
|
403
|
+
#
|
|
404
|
+
# `.`, `+` and `~` are in the set because js-yaml reads them and
|
|
405
|
+
# mermaid draws them: `0.0`, `+0`, `~` and `.nan` are values it
|
|
406
|
+
# resolves falsy, and `1.5` and `+7` values it keeps. Without them
|
|
407
|
+
# the whole line failed to parse. None of the three ends a value -
|
|
408
|
+
# a comma or a closing brace does - so the rule stays unambiguous.
|
|
409
|
+
rule(:unquoted_value) do
|
|
410
|
+
Atoms::GreedyRun.new('[a-zA-Z0-9_\-.+~]').as(:unquoted)
|
|
411
|
+
end
|
|
412
|
+
|
|
413
|
+
root(:diagram)
|
|
414
|
+
end
|
|
415
|
+
end
|
|
416
|
+
end
|
|
417
|
+
end
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Etassia
|
|
4
|
+
module Parser
|
|
5
|
+
module Grammars
|
|
6
|
+
# The characters mermaid lexes as UNICODE_TEXT — the letters a
|
|
7
|
+
# flowchart id may hold outside ASCII.
|
|
8
|
+
#
|
|
9
|
+
# Copied from the flowchart lexer in mmdc 11.12.0, the pinned
|
|
10
|
+
# oracle, where it is a table frozen at Unicode 6.1. It is one
|
|
11
|
+
# character class body, ready to hand to `match[]`. The source
|
|
12
|
+
# spells it as 61 alternated classes; they are flattened into one
|
|
13
|
+
# here and nothing else is changed. To regenerate against a newer
|
|
14
|
+
# mmdc, read mermaid/dist/mermaid.js, find the regexp literal
|
|
15
|
+
# holding \u00AA, and flatten its alternatives the same way.
|
|
16
|
+
#
|
|
17
|
+
# Ruby's \p{L} is not a stand-in for it. Comparing the two over
|
|
18
|
+
# the BMP, \p{L} takes hundreds of codepoints this table does not —
|
|
19
|
+
# `ࢳ` arrived in Unicode 8 and `ᲀ` in Unicode 9 — and refuses 2
|
|
20
|
+
# that it does, U+1885 and U+1886. The count moves with Ruby's
|
|
21
|
+
# Unicode version; those two exceptions do not.
|
|
22
|
+
MERMAID_UNICODE_TEXT =
|
|
23
|
+
'\u00AA\u00B5\u00BA\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02C1' \
|
|
24
|
+
'\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376' \
|
|
25
|
+
'\u0377\u037A-\u037D\u0386\u0388-\u038A\u038C\u038E-\u03A1' \
|
|
26
|
+
'\u03A3-\u03F5\u03F7-\u0481\u048A-\u0527\u0531-\u0556\u0559' \
|
|
27
|
+
'\u0561-\u0587\u05D0-\u05EA\u05F0-\u05F2\u0620-\u064A\u066E' \
|
|
28
|
+
'\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE\u06EF' \
|
|
29
|
+
'\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1' \
|
|
30
|
+
'\u07CA-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824' \
|
|
31
|
+
'\u0828\u0840-\u0858\u08A0\u08A2-\u08AC\u0904-\u0939\u093D' \
|
|
32
|
+
'\u0950\u0958-\u0961\u0971-\u0977\u0979-\u097F\u0985-\u098C' \
|
|
33
|
+
'\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9' \
|
|
34
|
+
'\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1' \
|
|
35
|
+
'\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32' \
|
|
36
|
+
'\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E' \
|
|
37
|
+
'\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8' \
|
|
38
|
+
'\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0' \
|
|
39
|
+
'\u0AE1\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30' \
|
|
40
|
+
'\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61' \
|
|
41
|
+
'\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99' \
|
|
42
|
+
'\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA' \
|
|
43
|
+
'\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28' \
|
|
44
|
+
'\u0C2A-\u0C33\u0C35-\u0C39\u0C3D\u0C58\u0C59\u0C60\u0C61' \
|
|
45
|
+
'\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3' \
|
|
46
|
+
'\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2' \
|
|
47
|
+
'\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D60' \
|
|
48
|
+
'\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB' \
|
|
49
|
+
'\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46' \
|
|
50
|
+
'\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97' \
|
|
51
|
+
'\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB' \
|
|
52
|
+
'\u0EAD-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6' \
|
|
53
|
+
'\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C' \
|
|
54
|
+
'\u1000-\u102A\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065' \
|
|
55
|
+
'\u1066\u106E-\u1070\u1075-\u1081\u108E\u10A0-\u10C5\u10C7' \
|
|
56
|
+
'\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256' \
|
|
57
|
+
'\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0' \
|
|
58
|
+
'\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6' \
|
|
59
|
+
'\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F' \
|
|
60
|
+
'\u13A0-\u13F4\u1401-\u166C\u166F-\u167F\u1681-\u169A' \
|
|
61
|
+
'\u16A0-\u16EA\u1700-\u170C\u170E-\u1711\u1720-\u1731' \
|
|
62
|
+
'\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7' \
|
|
63
|
+
'\u17DC\u1820-\u1877\u1880-\u18A8\u18AA\u18B0-\u18F5' \
|
|
64
|
+
'\u1900-\u191C\u1950-\u196D\u1970-\u1974\u1980-\u19AB' \
|
|
65
|
+
'\u19C1-\u19C7\u1A00-\u1A16\u1A20-\u1A54\u1AA7\u1B05-\u1B33' \
|
|
66
|
+
'\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF\u1BBA-\u1BE5' \
|
|
67
|
+
'\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1CE9-\u1CEC' \
|
|
68
|
+
'\u1CEE-\u1CF1\u1CF5\u1CF6\u1D00-\u1DBF\u1E00-\u1F15' \
|
|
69
|
+
'\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59' \
|
|
70
|
+
'\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE' \
|
|
71
|
+
'\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB' \
|
|
72
|
+
'\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F' \
|
|
73
|
+
'\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D' \
|
|
74
|
+
'\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F' \
|
|
75
|
+
'\u2145-\u2149\u214E\u2183\u2184\u2C00-\u2C2E\u2C30-\u2C5E' \
|
|
76
|
+
'\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2D00-\u2D25\u2D27' \
|
|
77
|
+
'\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6' \
|
|
78
|
+
'\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6' \
|
|
79
|
+
'\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005\u3006' \
|
|
80
|
+
'\u3031-\u3035\u303B\u303C\u3041-\u3096\u309D-\u309F' \
|
|
81
|
+
'\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D\u3131-\u318E' \
|
|
82
|
+
'\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FCC' \
|
|
83
|
+
'\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A' \
|
|
84
|
+
'\uA62B\uA640-\uA66E\uA67F-\uA697\uA6A0-\uA6E5\uA717-\uA71F' \
|
|
85
|
+
'\uA722-\uA788\uA78B-\uA78E\uA790-\uA793\uA7A0-\uA7AA' \
|
|
86
|
+
'\uA7F8-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822' \
|
|
87
|
+
'\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA90A-\uA925' \
|
|
88
|
+
'\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uAA00-\uAA28' \
|
|
89
|
+
'\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA80-\uAAAF' \
|
|
90
|
+
'\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD' \
|
|
91
|
+
'\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E' \
|
|
92
|
+
'\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uABC0-\uABE2' \
|
|
93
|
+
'\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D' \
|
|
94
|
+
'\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28' \
|
|
95
|
+
'\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44' \
|
|
96
|
+
'\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7' \
|
|
97
|
+
'\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF21-\uFF3A' \
|
|
98
|
+
'\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF' \
|
|
99
|
+
'\uFFD2-\uFFD7\uFFDA-\uFFDC'
|
|
100
|
+
|
|
101
|
+
# Read unqualified from `Grammars::Flowchart`, which this module
|
|
102
|
+
# lexically encloses, so marking it private costs that reader
|
|
103
|
+
# nothing. `mermaid_shapes.rb:104` does the same with its own
|
|
104
|
+
# mmdc-derived table.
|
|
105
|
+
private_constant :MERMAID_UNICODE_TEXT
|
|
106
|
+
end
|
|
107
|
+
end
|
|
108
|
+
end
|