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,393 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "kramdown"
|
|
4
|
+
require_relative "markdown_text/emphasis_simulator"
|
|
5
|
+
|
|
6
|
+
module Etassia
|
|
7
|
+
# Parses mermaid's markdown subset used inside diagram label text: bold,
|
|
8
|
+
# italic (nestable either order, including `***both***`), a
|
|
9
|
+
# backslash-escaped marker staying literal, and a literal newline as a
|
|
10
|
+
# hard line break — even inside an open bold/italic run. Nothing else.
|
|
11
|
+
# Delegates to `kramdown` (private `Parser` below), restricted to
|
|
12
|
+
# `:paragraph`/`:blank_line` and `:emphasis`/`:escaped_chars` only.
|
|
13
|
+
#
|
|
14
|
+
# Layer-neutral (no SVG/XML): shared by `Layout::Kanban` (sizing) and
|
|
15
|
+
# `Renderer::MarkdownText` (rendering), so `transform/` never has to
|
|
16
|
+
# require anything under `renderer/`.
|
|
17
|
+
module MarkdownText
|
|
18
|
+
# One styled run of text. `bold` and `italic` are independent booleans
|
|
19
|
+
# rather than a single "style" enum because nesting (`**bold *and
|
|
20
|
+
# italic* end**`) produces a run that is both at once.
|
|
21
|
+
Run = Data.define(:text, :bold, :italic)
|
|
22
|
+
|
|
23
|
+
# A run of text with neither `*` nor `_` can never come back styled
|
|
24
|
+
# (`Parser`'s only span parsers are `:emphasis`/`:escaped_chars`), so
|
|
25
|
+
# `parse_lines` skips kramdown entirely for such text below.
|
|
26
|
+
#
|
|
27
|
+
# kramdown's `:emphasis` parser backtracks on a marker that fails to
|
|
28
|
+
# find a well-flanked close, and the backtracking cost is driven by
|
|
29
|
+
# how many `*`/`_` characters are packed TOGETHER, not by the label's
|
|
30
|
+
# total length. Do not swap this back to a length-based cap: an
|
|
31
|
+
# ordinary long label with one bold word costs nothing, while a short
|
|
32
|
+
# label packed with markers is the expensive case this bounds. See
|
|
33
|
+
# this constant's spec for the measured cost curve.
|
|
34
|
+
MAX_EMPHASIS_MARKERS = 30
|
|
35
|
+
|
|
36
|
+
# A backstop independent of `MAX_EMPHASIS_MARKERS` above, for parse
|
|
37
|
+
# tree size rather than backtracking cost: kramdown's per-character
|
|
38
|
+
# cost is linear once marker density is low, so this only keeps one
|
|
39
|
+
# label from building an arbitrarily large AST.
|
|
40
|
+
MAX_PARSEABLE_LENGTH = 10_000
|
|
41
|
+
|
|
42
|
+
# The only two characters that can ever start an `:emphasis` span
|
|
43
|
+
# under `Parser` (see `MAX_EMPHASIS_MARKERS` above) — matches
|
|
44
|
+
# kramdown's own `Emphasis::EMPHASIS_START`. `\` (the
|
|
45
|
+
# `:escaped_chars` trigger) doesn't need its own check here: text
|
|
46
|
+
# with a backslash but no `*`/`_` has nothing an escape could ever
|
|
47
|
+
# act on differently from plain literal text.
|
|
48
|
+
EMPHASIS_MARKER = /[*_]/
|
|
49
|
+
|
|
50
|
+
# The only two block types `parse_lines` knows how to walk — anything
|
|
51
|
+
# else in the parsed tree means the whole label falls back to
|
|
52
|
+
# `literal_lines`. See the `root.children.any?` guard in `parse_lines`.
|
|
53
|
+
PLAIN_BLOCK_TYPES = %i[p blank].freeze
|
|
54
|
+
|
|
55
|
+
# The visible-character budget both `Renderer::Kanban#render_card_text`
|
|
56
|
+
# (via `Renderer::MarkdownText`) and `Layout::Kanban#rendered_line_count`
|
|
57
|
+
# truncate a card's parsed lines to (via `truncate_runs`). Shared here
|
|
58
|
+
# so the two layers can never drift: sizing from the raw text's newline
|
|
59
|
+
# count instead of this module's own truncated line count diverges once
|
|
60
|
+
# a card crosses the budget, since the renderer silently drops the
|
|
61
|
+
# excess lines.
|
|
62
|
+
CARD_TEXT_CHAR_BUDGET = 25
|
|
63
|
+
|
|
64
|
+
module_function
|
|
65
|
+
|
|
66
|
+
# Splits text on hard line breaks and parses each line's markup.
|
|
67
|
+
#
|
|
68
|
+
# Parsed as one kramdown document, not split then parsed line by
|
|
69
|
+
# line: kramdown keeps an embedded `\n` literally inside whatever
|
|
70
|
+
# span it falls in (including an open bold/italic run), so
|
|
71
|
+
# `**a\nb**` stays one bold span. `split_on_hard_breaks` turns those
|
|
72
|
+
# embedded breaks into the line-array shape callers expect.
|
|
73
|
+
#
|
|
74
|
+
# @param text [String] raw label text, markers and literal newlines
|
|
75
|
+
# @return [Array<Array<Run>>] one run array per line
|
|
76
|
+
def parse_lines(text)
|
|
77
|
+
raw = normalized_text(text)
|
|
78
|
+
return [[]] if raw.empty?
|
|
79
|
+
return literal_lines(raw) if literal_only?(raw)
|
|
80
|
+
|
|
81
|
+
root, = Parser.parse(raw)
|
|
82
|
+
return literal_lines(raw) unless plain_blocks?(root)
|
|
83
|
+
return literal_lines(raw) if unsafe_emphasis_divergence?(raw, root)
|
|
84
|
+
|
|
85
|
+
parsed_lines(root)
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
def normalized_text(text)
|
|
89
|
+
raw = text.to_s
|
|
90
|
+
raw = transcode_binary_to_utf8(raw) if raw.encoding == Encoding::ASCII_8BIT
|
|
91
|
+
raw.valid_encoding? ? raw : raw.scrub
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
def literal_only?(raw)
|
|
95
|
+
!raw.match?(EMPHASIS_MARKER) ||
|
|
96
|
+
raw.length > MAX_PARSEABLE_LENGTH ||
|
|
97
|
+
real_marker_count(raw) > MAX_EMPHASIS_MARKERS ||
|
|
98
|
+
unsafe_escaped_delimiter_interaction?(raw) ||
|
|
99
|
+
unsafe_delimiter_run_structure?(raw)
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
# A line led by a tab or 4+ spaces produces a bare `:text` block. Any
|
|
103
|
+
# such unexpected block makes the whole label literal, avoiding tree
|
|
104
|
+
# fragmentation and marker loss.
|
|
105
|
+
def plain_blocks?(root)
|
|
106
|
+
root.children.all? { |block| PLAIN_BLOCK_TYPES.include?(block.type) }
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
# Blank blocks contribute no lines because mmdc's paragraph margins are
|
|
110
|
+
# zero; only paragraph contents are flattened.
|
|
111
|
+
def parsed_lines(root)
|
|
112
|
+
root.children.select { |block| block.type == :p }.flat_map do |block|
|
|
113
|
+
runs = flatten_runs(block, bold: false, italic: false)
|
|
114
|
+
split_on_hard_breaks(runs)
|
|
115
|
+
end
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
# `ASCII-8BIT` always reports `valid_encoding? == true`, so the
|
|
119
|
+
# `raw.scrub unless raw.valid_encoding?` guard below never fires for
|
|
120
|
+
# it and kramdown's own `String#encode` raises
|
|
121
|
+
# `Encoding::UndefinedConversionError` on a non-ASCII byte instead.
|
|
122
|
+
# Do not widen this past ASCII-8BIT: other encodings (e.g.
|
|
123
|
+
# ISO-8859-1) report `valid_encoding?` meaningfully already.
|
|
124
|
+
#
|
|
125
|
+
# @param raw [String]
|
|
126
|
+
# @return [String]
|
|
127
|
+
# @api private
|
|
128
|
+
def transcode_binary_to_utf8(raw)
|
|
129
|
+
raw.encode(Encoding::UTF_8, invalid: :replace, undef: :replace)
|
|
130
|
+
end
|
|
131
|
+
|
|
132
|
+
# The `MAX_EMPHASIS_MARKERS`/`MAX_PARSEABLE_LENGTH` fallback, and
|
|
133
|
+
# also the path ordinary marker-free text takes: every literal
|
|
134
|
+
# `\n`-delimited line becomes one unstyled run. Paragraphs (2+
|
|
135
|
+
# consecutive `\n`s) are split out first and concatenated with no
|
|
136
|
+
# separator lines, matching mmdc's zero-margin paragraph CSS — do
|
|
137
|
+
# not split on every `\n` without that distinction, or a blank-line
|
|
138
|
+
# gap produces a spurious empty line.
|
|
139
|
+
#
|
|
140
|
+
# @api private
|
|
141
|
+
def literal_lines(raw)
|
|
142
|
+
raw.split(/\n{2,}/, -1).flat_map do |paragraph|
|
|
143
|
+
next [] if paragraph.empty?
|
|
144
|
+
|
|
145
|
+
paragraph.split("\n", -1).map do |line|
|
|
146
|
+
line.empty? ? [] : [Run.new(text: line, bold: false, italic: false)]
|
|
147
|
+
end
|
|
148
|
+
end
|
|
149
|
+
end
|
|
150
|
+
|
|
151
|
+
# Counts only the `*`/`_` markers that can reach `:emphasis`: an
|
|
152
|
+
# escaped marker is consumed by `:escaped_chars` first as one
|
|
153
|
+
# fixed-cost substitution, so it never touches the backtracking
|
|
154
|
+
# `MAX_EMPHASIS_MARKERS` bounds. Do not count raw `*`/`_`
|
|
155
|
+
# occurrences, or an escaped-heavy label trips the cap for nothing.
|
|
156
|
+
# Strips exactly what kramdown's `ESCAPED_CHARS` regex would
|
|
157
|
+
# consume, so this can't drift from `Parser` on a kramdown upgrade.
|
|
158
|
+
#
|
|
159
|
+
# @param raw [String]
|
|
160
|
+
# @return [Integer]
|
|
161
|
+
# @api private
|
|
162
|
+
def real_marker_count(raw)
|
|
163
|
+
raw.gsub(::Kramdown::Parser::Kramdown::ESCAPED_CHARS, "").count("*_")
|
|
164
|
+
end
|
|
165
|
+
|
|
166
|
+
# True when an escaped marker leaves a lone (length-1) unescaped
|
|
167
|
+
# marker behind it, later meeting a same-character run of a
|
|
168
|
+
# DIFFERENT length — kramdown and `marked` resolve that mismatch
|
|
169
|
+
# differently, risking a WRONG render, so this falls back to
|
|
170
|
+
# `literal_lines`. See this method's spec for the pinned corpus of
|
|
171
|
+
# unsafe vs. safe shapes. Escaped-chars matches are blanked with a
|
|
172
|
+
# placeholder (not deleted) so `next_run` can only match a REAL run.
|
|
173
|
+
#
|
|
174
|
+
# @param raw [String]
|
|
175
|
+
# @return [Boolean]
|
|
176
|
+
# @api private
|
|
177
|
+
def unsafe_escaped_delimiter_interaction?(raw)
|
|
178
|
+
raw.scan(::Kramdown::Parser::Kramdown::ESCAPED_CHARS) do
|
|
179
|
+
marker = ::Regexp.last_match(1)
|
|
180
|
+
next unless %w[* _].include?(marker)
|
|
181
|
+
|
|
182
|
+
after = raw[::Regexp.last_match.end(0)..]
|
|
183
|
+
return true if unsafe_following_runs?(after, marker)
|
|
184
|
+
end
|
|
185
|
+
|
|
186
|
+
false
|
|
187
|
+
end
|
|
188
|
+
|
|
189
|
+
def unsafe_following_runs?(after, marker)
|
|
190
|
+
pattern = /#{Regexp.escape(marker)}+/
|
|
191
|
+
orphan = after[/\A#{pattern}/]
|
|
192
|
+
return false unless orphan&.length == 1
|
|
193
|
+
|
|
194
|
+
region = after[orphan.length..]
|
|
195
|
+
.gsub(::Kramdown::Parser::Kramdown::ESCAPED_CHARS, " ")
|
|
196
|
+
following = region[pattern]
|
|
197
|
+
following && following.length != 1
|
|
198
|
+
end
|
|
199
|
+
|
|
200
|
+
# kramdown's emphasis grammar disagrees with `marked`'s on some valid
|
|
201
|
+
# short labels. Falls back to `literal_lines` for two unsafe
|
|
202
|
+
# delimiter-run SHAPES (a third, general check runs later; see
|
|
203
|
+
# `unsafe_emphasis_divergence?`): A) 4+ of the same marker character
|
|
204
|
+
# in a row, C) a NESTED length-1 wrap of both markers (`_*...*_`,
|
|
205
|
+
# not a SEQUENTIAL `*a*_b_`, which must stay safe).
|
|
206
|
+
#
|
|
207
|
+
# @param raw [String]
|
|
208
|
+
# @return [Boolean]
|
|
209
|
+
# @api private
|
|
210
|
+
def unsafe_delimiter_run_structure?(raw)
|
|
211
|
+
blanked = raw.gsub(::Kramdown::Parser::Kramdown::ESCAPED_CHARS, " ")
|
|
212
|
+
|
|
213
|
+
return true if blanked.scan(/\*+|_+/).any? { |run| run.length >= 4 }
|
|
214
|
+
|
|
215
|
+
nested_delimiter_wrap?(blanked)
|
|
216
|
+
end
|
|
217
|
+
|
|
218
|
+
# Guard C above: a single `_` immediately opening a single `*` (or the
|
|
219
|
+
# reverse), with the matching closes mirroring the nesting later in
|
|
220
|
+
# the string — as opposed to one span's close immediately followed by
|
|
221
|
+
# the next span's open (sequential, safe).
|
|
222
|
+
#
|
|
223
|
+
# @param blanked [String]
|
|
224
|
+
# @return [Boolean]
|
|
225
|
+
# @api private
|
|
226
|
+
def nested_delimiter_wrap?(blanked)
|
|
227
|
+
blanked.match?(/(?<!_)_(?!_)\*(?!\*).*?(?<!\*)\*(?!\*)(?<!_)_(?!_)/) ||
|
|
228
|
+
blanked.match?(/(?<!\*)\*(?!\*)_(?!_).*?(?<!_)_(?!_)(?<!\*)\*(?!\*)/)
|
|
229
|
+
end
|
|
230
|
+
|
|
231
|
+
# Predicts what real `marked` would produce per paragraph (via
|
|
232
|
+
# `EmphasisSimulator`) and compares it to kramdown's actual parse;
|
|
233
|
+
# falls back to `literal_lines` on any divergence. Requires
|
|
234
|
+
# `parse_lines`'s earlier non-`:p`/non-`:blank` guard already in
|
|
235
|
+
# place (paragraphs are matched to `:p` blocks positionally). Strips
|
|
236
|
+
# each paragraph first, matching kramdown's own block-level trim.
|
|
237
|
+
#
|
|
238
|
+
# @param raw [String]
|
|
239
|
+
# @param root [Kramdown::Element] the parsed root, from `Parser.parse`
|
|
240
|
+
# @return [Boolean]
|
|
241
|
+
# @api private
|
|
242
|
+
def unsafe_emphasis_divergence?(raw, root)
|
|
243
|
+
paragraphs = raw.split(/\n{2,}/, -1).reject(&:empty?)
|
|
244
|
+
p_blocks = root.children.select { |block| block.type == :p }
|
|
245
|
+
return true if paragraphs.length != p_blocks.length
|
|
246
|
+
|
|
247
|
+
paragraphs.zip(p_blocks).any? do |paragraph, block|
|
|
248
|
+
emphasis_runs_differ?(paragraph, block)
|
|
249
|
+
end
|
|
250
|
+
end
|
|
251
|
+
|
|
252
|
+
def emphasis_runs_differ?(paragraph, block)
|
|
253
|
+
runs = flatten_runs(block, bold: false, italic: false)
|
|
254
|
+
EmphasisSimulator.coalesce_runs(runs) !=
|
|
255
|
+
EmphasisSimulator.simulate(paragraph.strip)
|
|
256
|
+
end
|
|
257
|
+
|
|
258
|
+
# Walks one `:p` block's children into a flat run list: nesting is
|
|
259
|
+
# represented by the returned runs' bold/italic flags, not by any
|
|
260
|
+
# tree structure the caller has to walk. A run's `text` may still
|
|
261
|
+
# contain an embedded `\n` at this point — `split_on_hard_breaks`
|
|
262
|
+
# resolves that afterward, once the whole block's styling has been
|
|
263
|
+
# flattened out.
|
|
264
|
+
#
|
|
265
|
+
# @api private
|
|
266
|
+
def flatten_runs(node, bold:, italic:)
|
|
267
|
+
node.children.flat_map do |child|
|
|
268
|
+
flatten_child(child, bold: bold, italic: italic)
|
|
269
|
+
end
|
|
270
|
+
end
|
|
271
|
+
|
|
272
|
+
# Unknown span types degrade to literal text under the active style.
|
|
273
|
+
def flatten_child(child, bold:, italic:)
|
|
274
|
+
case child.type
|
|
275
|
+
when :text
|
|
276
|
+
[Run.new(text: child.value, bold: bold, italic: italic)]
|
|
277
|
+
when :strong
|
|
278
|
+
flatten_runs(child, bold: true, italic: italic)
|
|
279
|
+
when :em
|
|
280
|
+
flatten_runs(child, bold: bold, italic: true)
|
|
281
|
+
else
|
|
282
|
+
[Run.new(text: literal_text_of(child), bold: bold, italic: italic)]
|
|
283
|
+
end
|
|
284
|
+
end
|
|
285
|
+
|
|
286
|
+
# Extracts a node's literal text regardless of shape: a leaf node
|
|
287
|
+
# (kramdown's own `:text`, or the fallback `:text` block
|
|
288
|
+
# `parse_lines`'s `else` produces for a line no active block parser
|
|
289
|
+
# claims) carries it directly as `value`; a structural node with none
|
|
290
|
+
# carries it on its children instead, so recurse into those.
|
|
291
|
+
#
|
|
292
|
+
# @api private
|
|
293
|
+
def literal_text_of(node)
|
|
294
|
+
return node.value if node.value.is_a?(String)
|
|
295
|
+
|
|
296
|
+
node.children.map { |child| literal_text_of(child) }.join
|
|
297
|
+
end
|
|
298
|
+
|
|
299
|
+
# Splits a flat run list on embedded `\n`s into line arrays, keeping
|
|
300
|
+
# each half's bold/italic flags — so a run that broke mid-span still
|
|
301
|
+
# carries its styling on both sides of the break.
|
|
302
|
+
#
|
|
303
|
+
# @api private
|
|
304
|
+
def split_on_hard_breaks(runs)
|
|
305
|
+
lines = [[]]
|
|
306
|
+
|
|
307
|
+
runs.each do |run|
|
|
308
|
+
run.text.split("\n", -1).each_with_index do |part, index|
|
|
309
|
+
lines << [] if index.positive?
|
|
310
|
+
lines.last << run.with(text: part) unless part.empty?
|
|
311
|
+
end
|
|
312
|
+
end
|
|
313
|
+
|
|
314
|
+
lines
|
|
315
|
+
end
|
|
316
|
+
|
|
317
|
+
# `kramdown`, restricted to exactly the block and span parsers this
|
|
318
|
+
# subset needs (documented extension point: subclassing and
|
|
319
|
+
# reassigning `@block_parsers`/`@span_parsers`). `:escaped_chars`
|
|
320
|
+
# sits alongside `:emphasis` rather than being left out — without it
|
|
321
|
+
# a bare backslash passes through as literal text while the `*...*`
|
|
322
|
+
# on either side of it still pairs up as a real emphasis span,
|
|
323
|
+
# wrongly italicizing an escaped marker's surrounding text.
|
|
324
|
+
#
|
|
325
|
+
# @api private
|
|
326
|
+
class Parser < ::Kramdown::Parser::Kramdown
|
|
327
|
+
def initialize(source, options)
|
|
328
|
+
super
|
|
329
|
+
@block_parsers = %i[blank_line paragraph]
|
|
330
|
+
@span_parsers = %i[emphasis escaped_chars]
|
|
331
|
+
end
|
|
332
|
+
end
|
|
333
|
+
private_constant :Parser
|
|
334
|
+
|
|
335
|
+
# Truncates markdown-parsed lines to at most `max_length` visible
|
|
336
|
+
# (post-markup) characters, cutting on run boundaries rather than
|
|
337
|
+
# mid-marker. A run within the FIRST line may be cut partway through
|
|
338
|
+
# with "..." appended; a later line (one that only exists because of
|
|
339
|
+
# a hard line break) is kept whole or dropped whole, never cut
|
|
340
|
+
# partway through.
|
|
341
|
+
#
|
|
342
|
+
# @param lines [Array<Array<Run>>]
|
|
343
|
+
# @param max_length [Integer] maximum visible characters to keep
|
|
344
|
+
# @return [Array<Array<Run>>]
|
|
345
|
+
def truncate_runs(lines, max_length)
|
|
346
|
+
result = []
|
|
347
|
+
append_lines_within_budget(lines, max_length, result)
|
|
348
|
+
result
|
|
349
|
+
end
|
|
350
|
+
|
|
351
|
+
def append_lines_within_budget(lines, budget, result)
|
|
352
|
+
lines.each_with_index do |runs, line_index|
|
|
353
|
+
line_length = runs.sum { |run| run.text.length }
|
|
354
|
+
if line_length > budget
|
|
355
|
+
result << truncate_line(runs, budget) if line_index.zero?
|
|
356
|
+
break
|
|
357
|
+
end
|
|
358
|
+
result << runs
|
|
359
|
+
budget -= line_length
|
|
360
|
+
end
|
|
361
|
+
end
|
|
362
|
+
|
|
363
|
+
# Cuts a single line's runs to `budget` visible characters, trimming
|
|
364
|
+
# whole runs from the end and appending "..." to the run that
|
|
365
|
+
# crosses the boundary. The 3-character ellipsis cost is reserved
|
|
366
|
+
# against `budget` up front, once — reserving it per-run instead
|
|
367
|
+
# undercounts, letting the total come out over `budget`.
|
|
368
|
+
#
|
|
369
|
+
# @param runs [Array<Run>]
|
|
370
|
+
# @param budget [Integer] visible characters, ellipsis included
|
|
371
|
+
# @return [Array<Run>]
|
|
372
|
+
# @api private
|
|
373
|
+
def truncate_line(runs, budget)
|
|
374
|
+
remaining = [budget - 3, 0].max
|
|
375
|
+
kept = []
|
|
376
|
+
runs.each do |run|
|
|
377
|
+
remaining = append_truncated_run(kept, run, remaining)
|
|
378
|
+
break unless remaining
|
|
379
|
+
end
|
|
380
|
+
kept
|
|
381
|
+
end
|
|
382
|
+
|
|
383
|
+
def append_truncated_run(kept, run, remaining)
|
|
384
|
+
if run.text.length <= remaining
|
|
385
|
+
kept << run
|
|
386
|
+
remaining - run.text.length
|
|
387
|
+
else
|
|
388
|
+
kept << run.with(text: "#{run.text[0, remaining]}...")
|
|
389
|
+
nil
|
|
390
|
+
end
|
|
391
|
+
end
|
|
392
|
+
end
|
|
393
|
+
end
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
# Internal manifest: loads every built-in component of the Mermaid
|
|
4
|
+
# diagram types in Notation::Mermaid::TYPES. Not public API; its contents
|
|
5
|
+
# may change in any release.
|
|
6
|
+
|
|
7
|
+
# Load modules in dependency order
|
|
8
|
+
require_relative "../js_number"
|
|
9
|
+
require_relative "../source"
|
|
10
|
+
require_relative "../text_measurement"
|
|
11
|
+
require_relative "../layout/grid"
|
|
12
|
+
require_relative "../diagram_registry"
|
|
13
|
+
require_relative "mermaid"
|
|
14
|
+
require_relative "../theme"
|
|
15
|
+
require_relative "../theme/registry"
|
|
16
|
+
require_relative "../svg"
|
|
17
|
+
require_relative "../parser"
|
|
18
|
+
require_relative "../diagram"
|
|
19
|
+
require_relative "../layout"
|
|
20
|
+
require_relative "../renderer"
|
|
21
|
+
require_relative "../notation"
|
|
22
|
+
require_relative "../engine"
|
|
23
|
+
|
|
24
|
+
# Initialize theme registry with built-in themes
|
|
25
|
+
Etassia::Theme::Registry.load_builtin_themes
|
|
26
|
+
|
|
27
|
+
# Parser, layout and renderer files are named after the type's class
|
|
28
|
+
# (`XyChart` -> `xy_chart.rb`); the lookups in Parser.for and friends find
|
|
29
|
+
# the classes these files define.
|
|
30
|
+
layers = %w[parser layout renderer]
|
|
31
|
+
Etassia::Notation::Mermaid::TYPES.each do |type, row|
|
|
32
|
+
name = row[:name] || type.to_s.split("_").map(&:capitalize).join
|
|
33
|
+
file = name.gsub(/([a-z\d])([A-Z])/, '\\1_\\2').downcase
|
|
34
|
+
layers.each { |layer| require_relative "../#{layer}/#{file}" }
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
Etassia::Notation.register(Etassia::Notation::Mermaid)
|
|
38
|
+
require_relative "plantuml_salt"
|
|
39
|
+
require_relative "plantuml_data"
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Etassia
|
|
4
|
+
module Notation
|
|
5
|
+
# A registered plugin and the extensions it declared at registration.
|
|
6
|
+
class Entry
|
|
7
|
+
attr_reader :plugin, :extensions
|
|
8
|
+
|
|
9
|
+
def initialize(plugin, extensions)
|
|
10
|
+
@plugin = plugin
|
|
11
|
+
@extensions = extensions
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
end
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "psych"
|
|
4
|
+
|
|
5
|
+
module Etassia
|
|
6
|
+
module Notation
|
|
7
|
+
module Mermaid
|
|
8
|
+
# Reads the Mermaid init setting that changes Class Diagram geometry:
|
|
9
|
+
# the diagram-wide `fontFamily`, which sizes every class box.
|
|
10
|
+
module ClassDiagramConfig
|
|
11
|
+
INIT = /\A%%\{\s*init\s*:\s*(?<payload>.*)\s*\}%%\z/im
|
|
12
|
+
private_constant :INIT
|
|
13
|
+
|
|
14
|
+
module_function
|
|
15
|
+
|
|
16
|
+
# @return [String, nil] the last init directive's `fontFamily`
|
|
17
|
+
def font_family(directives)
|
|
18
|
+
directives.reverse_each do |directive|
|
|
19
|
+
family = family_of(directive)
|
|
20
|
+
return family if family
|
|
21
|
+
end
|
|
22
|
+
nil
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def family_of(directive)
|
|
26
|
+
match = INIT.match(directive)
|
|
27
|
+
return unless match
|
|
28
|
+
|
|
29
|
+
config = Psych.safe_load(
|
|
30
|
+
match[:payload], permitted_classes: [],
|
|
31
|
+
permitted_symbols: [], aliases: false
|
|
32
|
+
)
|
|
33
|
+
family = config["fontFamily"] if config.is_a?(Hash)
|
|
34
|
+
family.to_s.strip unless family.to_s.strip.empty?
|
|
35
|
+
rescue Psych::Exception
|
|
36
|
+
nil
|
|
37
|
+
end
|
|
38
|
+
private_class_method :family_of
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
end
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "psych"
|
|
4
|
+
|
|
5
|
+
module Etassia
|
|
6
|
+
module Notation
|
|
7
|
+
module Mermaid
|
|
8
|
+
# Reads the one Mermaid init setting that changes Git Graph semantics.
|
|
9
|
+
module GitGraphConfig
|
|
10
|
+
INIT = /\A%%\{\s*init\s*:\s*(?<payload>.*)\s*\}%%\z/im
|
|
11
|
+
private_constant :INIT
|
|
12
|
+
|
|
13
|
+
module_function
|
|
14
|
+
|
|
15
|
+
def main_branch_name(directives)
|
|
16
|
+
directives.reverse_each do |directive|
|
|
17
|
+
name = branch_name(directive)
|
|
18
|
+
return name if name
|
|
19
|
+
end
|
|
20
|
+
"main"
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def branch_name(directive)
|
|
24
|
+
match = INIT.match(directive)
|
|
25
|
+
return unless match
|
|
26
|
+
|
|
27
|
+
config = directive_config(match[:payload])
|
|
28
|
+
name = config.dig("gitGraph", "mainBranchName") if
|
|
29
|
+
config.is_a?(Hash)
|
|
30
|
+
name.to_s unless name.nil? || name.to_s.empty?
|
|
31
|
+
rescue Psych::Exception
|
|
32
|
+
nil
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def directive_config(payload)
|
|
36
|
+
Psych.safe_load(
|
|
37
|
+
payload, permitted_classes: [],
|
|
38
|
+
permitted_symbols: [], aliases: false
|
|
39
|
+
)
|
|
40
|
+
end
|
|
41
|
+
private_class_method :directive_config
|
|
42
|
+
private_class_method :branch_name
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
end
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Etassia
|
|
4
|
+
module Notation
|
|
5
|
+
module Mermaid
|
|
6
|
+
# Moves private Mermaid parse models onto the shared IR one type at a
|
|
7
|
+
# time. Types without a migrated adapter keep their private model until
|
|
8
|
+
# their own vertical lands.
|
|
9
|
+
module IRAdapter
|
|
10
|
+
module_function
|
|
11
|
+
|
|
12
|
+
def call(type, diagram)
|
|
13
|
+
row = Mermaid::TYPES[type]
|
|
14
|
+
return diagram unless row&.fetch(:ir_adapter, false)
|
|
15
|
+
|
|
16
|
+
require_relative "ir_adapters/#{type}"
|
|
17
|
+
IRAdapters.const_get(class_name(type, row), false).call(diagram)
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def class_name(type, row)
|
|
21
|
+
row[:name] || type.to_s.split("_").map(&:capitalize).join
|
|
22
|
+
end
|
|
23
|
+
private_class_method :class_name
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|