@peter.prib/renderengine 0.0.0-stage → 0.2.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.
- package/LICENSE +21 -0
- package/README.md +203 -2
- package/REFERENCE.md +2198 -0
- package/dist/renderengine-workspace.umd.js +46905 -0
- package/dist/renderengine.umd.js +42223 -0
- package/examples/archimate.html +66 -0
- package/examples/diagram-editor.html +51 -0
- package/package.json +65 -4
- package/src/BaseRenderer.js +57 -0
- package/src/CanvasRenderer.js +194 -0
- package/src/Mat4.js +111 -0
- package/src/OrbitCamera.js +57 -0
- package/src/RendererFactory.js +50 -0
- package/src/SVGRenderer.js +439 -0
- package/src/archimate.js +723 -0
- package/src/archimateArchiFormat.js +1693 -0
- package/src/archimateArchiTypes.js +72 -0
- package/src/archimateArchive.js +140 -0
- package/src/archimateCSV.js +127 -0
- package/src/archimateDrawio.js +182 -0
- package/src/archimateExchangeFormat.js +546 -0
- package/src/archimateRelationshipTable.js +93 -0
- package/src/archimateSpecializations.js +161 -0
- package/src/chartCatalog.js +589 -0
- package/src/charting/ArchimateDiagramEditor.js +1624 -0
- package/src/charting/ArchimateSpecializationSelector.js +134 -0
- package/src/charting/Axis.js +68 -0
- package/src/charting/CameraSeeder.js +30 -0
- package/src/charting/CatalogDialog.js +92 -0
- package/src/charting/Chart.js +37 -0
- package/src/charting/Chart3D.js +99 -0
- package/src/charting/ChartBox.js +80 -0
- package/src/charting/ChartData.js +27 -0
- package/src/charting/ChartRegistry.js +76 -0
- package/src/charting/CheckboxTreeSelector.js +304 -0
- package/src/charting/ColorField.js +107 -0
- package/src/charting/ColorPalette.js +88 -0
- package/src/charting/CommandHistory.js +176 -0
- package/src/charting/DataFilter.js +52 -0
- package/src/charting/Diagram.js +36 -0
- package/src/charting/Diagram3D.js +29 -0
- package/src/charting/DiagramClipboard.js +31 -0
- package/src/charting/DiagramEditor.js +3330 -0
- package/src/charting/DiagramEditorCommand.js +110 -0
- package/src/charting/DiagramEditorCommands.js +237 -0
- package/src/charting/DiagramEditorEdgeCommands.js +142 -0
- package/src/charting/DiagramEditorState.js +98 -0
- package/src/charting/DiagramRegistry.js +86 -0
- package/src/charting/DiagramTypeRegistry.js +326 -0
- package/src/charting/DiagramViewPropertiesDialog.js +46 -0
- package/src/charting/Edge.js +113 -0
- package/src/charting/ErrorBars.js +37 -0
- package/src/charting/FilterSystem.js +285 -0
- package/src/charting/FindReplaceDialog.js +139 -0
- package/src/charting/FormDialog.js +385 -0
- package/src/charting/Gauge.js +58 -0
- package/src/charting/Hierarchy.js +175 -0
- package/src/charting/HintPanel.js +86 -0
- package/src/charting/ImageSelector.js +148 -0
- package/src/charting/InteractionManager.js +725 -0
- package/src/charting/Legend.js +58 -0
- package/src/charting/MenuBar.js +62 -0
- package/src/charting/ModelFileFormat.js +115 -0
- package/src/charting/OrbitControls.js +77 -0
- package/src/charting/Palette.js +119 -0
- package/src/charting/PopupMenu.js +117 -0
- package/src/charting/PropertiesPanel.js +155 -0
- package/src/charting/PropertyListEditor.js +96 -0
- package/src/charting/PropertyLog.js +92 -0
- package/src/charting/SettingsCascade.js +93 -0
- package/src/charting/SettingsDialog.js +53 -0
- package/src/charting/SettingsManager.js +179 -0
- package/src/charting/SettingsViewPropertiesDialog.js +58 -0
- package/src/charting/ShapePaths.js +27 -0
- package/src/charting/Statistics.js +134 -0
- package/src/charting/TemplateCatalog.js +59 -0
- package/src/charting/TemplateLibrary.js +103 -0
- package/src/charting/TextStyle.js +168 -0
- package/src/charting/ViewFit.js +55 -0
- package/src/charting/ViewMenu.js +70 -0
- package/src/charting/ViewPropertiesDialog.js +77 -0
- package/src/charting/ViewTabStrip.js +81 -0
- package/src/charting/archimate/ArchiFileFormat.js +32 -0
- package/src/charting/archimate/ArchimateCanvasEditor.js +815 -0
- package/src/charting/archimate/ArchimateCsvFileFormat.js +35 -0
- package/src/charting/archimate/ArchimateEdge.js +137 -0
- package/src/charting/archimate/ArchimateElementTemplate.js +195 -0
- package/src/charting/archimate/ArchimatePalette.js +102 -0
- package/src/charting/archimate/CsvImportDialog.js +105 -0
- package/src/charting/archimate/CustomViewpoints.js +74 -0
- package/src/charting/archimate/DerivedEdge.js +29 -0
- package/src/charting/archimate/DrawioFileFormat.js +24 -0
- package/src/charting/archimate/ElementFilterRule.js +21 -0
- package/src/charting/archimate/ExchangeFileFormat.js +28 -0
- package/src/charting/archimate/ViewGroupTemplate.js +137 -0
- package/src/charting/archimate/ViewLineEdge.js +84 -0
- package/src/charting/archimate/ViewpointRule.js +45 -0
- package/src/charting/archimate/archimateFileFormats.js +12 -0
- package/src/charting/archimate/archimateNames.js +5 -0
- package/src/charting/archimate/csvMapping.js +122 -0
- package/src/charting/archimate/elementMenuItems.js +32 -0
- package/src/charting/archimate/elementProperties.js +146 -0
- package/src/charting/archimate/elementTypeChoices.js +7 -0
- package/src/charting/archimate/elementTypeGroups.js +19 -0
- package/src/charting/archimate/index.js +17 -0
- package/src/charting/archimate/specializationCatalogDialog.js +64 -0
- package/src/charting/archimate/typeGlyph.js +29 -0
- package/src/charting/arrangement/Arrangement.js +112 -0
- package/src/charting/arrangement/ArrangementCommand.js +29 -0
- package/src/charting/arrangement/BackgroundCommand.js +41 -0
- package/src/charting/arrangement/BackgroundGroup.js +18 -0
- package/src/charting/arrangement/GroupCommand.js +46 -0
- package/src/charting/arrangement/ItemGroup.js +62 -0
- package/src/charting/arrangement/LockCommand.js +32 -0
- package/src/charting/arrangement/UngroupCommand.js +27 -0
- package/src/charting/arrangement/alignment.js +88 -0
- package/src/charting/arrangement/arrangeMenuItems.js +25 -0
- package/src/charting/arrangement/index.js +11 -0
- package/src/charting/arrangement/layouts.js +233 -0
- package/src/charting/canvas/ArchiHint.js +78 -0
- package/src/charting/canvas/CanvasBoxKind.js +39 -0
- package/src/charting/canvas/CanvasPalette.js +49 -0
- package/src/charting/canvas/CanvasTemplateLibrary.js +61 -0
- package/src/charting/canvas/CanvasTemplateMenu.js +151 -0
- package/src/charting/canvas/EditHintCommand.js +28 -0
- package/src/charting/canvas/canvasBoxKinds.js +27 -0
- package/src/charting/canvas/canvasBoxMenuItems.js +40 -0
- package/src/charting/canvas/defaultCanvasTemplates.js +186 -0
- package/src/charting/canvas/diagramBoxKinds.js +12 -0
- package/src/charting/canvas/hintMenuItems.js +49 -0
- package/src/charting/charts/ArcGauge.js +55 -0
- package/src/charting/charts/AreaChart.js +71 -0
- package/src/charting/charts/BarChart.js +80 -0
- package/src/charting/charts/BarChart3D.js +56 -0
- package/src/charting/charts/BarChart3DOrbit.js +53 -0
- package/src/charting/charts/BarChartBase.js +70 -0
- package/src/charting/charts/BarGauge.js +42 -0
- package/src/charting/charts/BoxPlotChart.js +41 -0
- package/src/charting/charts/BubbleChart.js +99 -0
- package/src/charting/charts/BubbleChart3D.js +78 -0
- package/src/charting/charts/BulletGauge.js +87 -0
- package/src/charting/charts/CalendarHeatmapChart.js +204 -0
- package/src/charting/charts/CandlestickChart.js +54 -0
- package/src/charting/charts/ChordDiagram.js +130 -0
- package/src/charting/charts/DensityChart.js +73 -0
- package/src/charting/charts/DialGauge.js +65 -0
- package/src/charting/charts/DonutChart.js +15 -0
- package/src/charting/charts/FunnelChart.js +47 -0
- package/src/charting/charts/GanttChart.js +201 -0
- package/src/charting/charts/GaugeChart.js +175 -0
- package/src/charting/charts/GeoMapChart.js +146 -0
- package/src/charting/charts/GroupedBarChart.js +88 -0
- package/src/charting/charts/GroupedDistributionChart.js +70 -0
- package/src/charting/charts/HeatmapChart.js +80 -0
- package/src/charting/charts/HierarchyChart.js +39 -0
- package/src/charting/charts/HistogramChart.js +45 -0
- package/src/charting/charts/KpiTile.js +72 -0
- package/src/charting/charts/LagPlotChart.js +41 -0
- package/src/charting/charts/LineChart.js +124 -0
- package/src/charting/charts/MultiRingGauge.js +54 -0
- package/src/charting/charts/OutlineChart.js +95 -0
- package/src/charting/charts/ParallelCoordinatesChart.js +130 -0
- package/src/charting/charts/PieChart.js +56 -0
- package/src/charting/charts/PipeChart.js +88 -0
- package/src/charting/charts/PopulationPyramidChart.js +106 -0
- package/src/charting/charts/QQPlotChart.js +64 -0
- package/src/charting/charts/RadarChart.js +76 -0
- package/src/charting/charts/RadialBarChart.js +96 -0
- package/src/charting/charts/RingGauge.js +23 -0
- package/src/charting/charts/SankeyDiagram.js +174 -0
- package/src/charting/charts/ScatterChart.js +104 -0
- package/src/charting/charts/StackedAreaChart.js +15 -0
- package/src/charting/charts/StackedBarChart.js +33 -0
- package/src/charting/charts/StackedBarChart3DOrbit.js +58 -0
- package/src/charting/charts/StreamGraphChart.js +131 -0
- package/src/charting/charts/SunburstChart.js +57 -0
- package/src/charting/charts/ThermometerGauge.js +43 -0
- package/src/charting/charts/TreemapChart.js +54 -0
- package/src/charting/charts/ViolinChart.js +37 -0
- package/src/charting/charts/WaterfallChart.js +66 -0
- package/src/charting/charts/WordCloudChart.js +104 -0
- package/src/charting/diagramModel/AddViewCommand.js +33 -0
- package/src/charting/diagramModel/DiagramModel.js +39 -0
- package/src/charting/diagramModel/DiagramModelSearch.js +22 -0
- package/src/charting/diagramModel/DiagramView.js +50 -0
- package/src/charting/diagramModel/ModelHistory.js +43 -0
- package/src/charting/diagramModel/ModelReport.js +153 -0
- package/src/charting/diagramModel/ModelSearch.js +223 -0
- package/src/charting/diagramModel/RemoveViewCommand.js +25 -0
- package/src/charting/diagramModel/RenameViewCommand.js +21 -0
- package/src/charting/diagramModel/ReplaceTextCommand.js +25 -0
- package/src/charting/diagramModel/ViewSetChecker.js +34 -0
- package/src/charting/diagramModel/ViewSetModel.js +243 -0
- package/src/charting/diagramModel/index.js +6 -0
- package/src/charting/diagramModel/nameTransforms.js +29 -0
- package/src/charting/diagrams/ArchimateCommands.js +141 -0
- package/src/charting/diagrams/ArchimateDiagram.js +263 -0
- package/src/charting/diagrams/ArchimateModel.js +1155 -0
- package/src/charting/diagrams/ArchimateModelChecker.js +125 -0
- package/src/charting/diagrams/ArchimateModelReport.js +128 -0
- package/src/charting/diagrams/ArchimateModelSearch.js +41 -0
- package/src/charting/diagrams/ArchimateValidator.js +357 -0
- package/src/charting/diagrams/CanvasView.js +112 -0
- package/src/charting/diagrams/ContextMenu.js +37 -0
- package/src/charting/diagrams/DataModelDiagram.js +86 -0
- package/src/charting/diagrams/DataModelRelationshipStrategy.js +38 -0
- package/src/charting/diagrams/DerivedRelationships.js +102 -0
- package/src/charting/diagrams/EbnfDiagram.js +39 -0
- package/src/charting/diagrams/EdgeGeometry.js +553 -0
- package/src/charting/diagrams/EditViewItemCommand.js +128 -0
- package/src/charting/diagrams/ElementInstance.js +157 -0
- package/src/charting/diagrams/GraphDiagram.js +1340 -0
- package/src/charting/diagrams/GraphDiagram3D.js +152 -0
- package/src/charting/diagrams/GraphMetrics.js +81 -0
- package/src/charting/diagrams/GridOverlay.js +137 -0
- package/src/charting/diagrams/ImportRowsCommand.js +62 -0
- package/src/charting/diagrams/LabelHelper.js +108 -0
- package/src/charting/diagrams/MergeElementsCommand.js +101 -0
- package/src/charting/diagrams/NestInstanceCommand.js +34 -0
- package/src/charting/diagrams/NodeGeometry.js +158 -0
- package/src/charting/diagrams/PlaceItemsCommand.js +77 -0
- package/src/charting/diagrams/RadialLayout.js +101 -0
- package/src/charting/diagrams/RelationshipInstance.js +93 -0
- package/src/charting/diagrams/RemoveGroupFromViewCommand.js +28 -0
- package/src/charting/diagrams/RemoveLineCommand.js +27 -0
- package/src/charting/diagrams/ShowElementCommand.js +43 -0
- package/src/charting/diagrams/SvgCoordinate.js +17 -0
- package/src/charting/diagrams/SvgZoom.js +127 -0
- package/src/charting/diagrams/Tooltip.js +62 -0
- package/src/charting/diagrams/ViewConnectionInstance.js +102 -0
- package/src/charting/diagrams/ViewObjectInstance.js +56 -0
- package/src/charting/diagrams/commands/AddEdgeCommand.js +34 -0
- package/src/charting/diagrams/commands/AddNodeCommand.js +28 -0
- package/src/charting/diagrams/commands/AddWaypointCommand.js +27 -0
- package/src/charting/diagrams/commands/CreateFolderCommand.js +27 -0
- package/src/charting/diagrams/commands/DeleteEdgeCommand.js +30 -0
- package/src/charting/diagrams/commands/DeleteFolderCommand.js +47 -0
- package/src/charting/diagrams/commands/DeleteNodeCommand.js +35 -0
- package/src/charting/diagrams/commands/DeleteWaypointCommand.js +24 -0
- package/src/charting/diagrams/commands/GraphCommand.js +65 -0
- package/src/charting/diagrams/commands/InvertEdgeCommand.js +24 -0
- package/src/charting/diagrams/commands/MoveNodeCommand.js +44 -0
- package/src/charting/diagrams/commands/MoveWaypointCommand.js +27 -0
- package/src/charting/diagrams/commands/RenameEdgeCommand.js +23 -0
- package/src/charting/diagrams/commands/RenameFolderCommand.js +31 -0
- package/src/charting/diagrams/commands/RenameNodeCommand.js +27 -0
- package/src/charting/diagrams/commands/ResizeNodeCommand.js +46 -0
- package/src/charting/diagrams/commands/UpdateEdgeSideCommand.js +40 -0
- package/src/charting/diagrams/commands/index.js +17 -0
- package/src/charting/diagrams/duplicates.js +49 -0
- package/src/charting/diagrams/nesting.js +30 -0
- package/src/charting/diagrams/roadmap.js +77 -0
- package/src/charting/edgeMarkers/ArrowMarker.js +15 -0
- package/src/charting/edgeMarkers/CircleMarker.js +13 -0
- package/src/charting/edgeMarkers/CrowsFootMarker.js +16 -0
- package/src/charting/edgeMarkers/DiamondMarker.js +15 -0
- package/src/charting/edgeMarkers/EdgeMarker.js +34 -0
- package/src/charting/edgeMarkers/HalfArrowMarker.js +8 -0
- package/src/charting/edgeMarkers/HollowDiamondMarker.js +18 -0
- package/src/charting/edgeMarkers/HollowTriangleMarker.js +18 -0
- package/src/charting/edgeMarkers/OpenArrowMarker.js +17 -0
- package/src/charting/edgeMarkers/index.js +27 -0
- package/src/charting/edgeStyle/EdgeStyleCascade.js +22 -0
- package/src/charting/edgeStyle/EdgeStyleDialog.js +51 -0
- package/src/charting/edgeStyle/EdgeStyleSchema.js +43 -0
- package/src/charting/edgeStyle/SetStyleCommand.js +12 -0
- package/src/charting/edgeStyle/index.js +4 -0
- package/src/charting/emphasis/EmphasisRule.js +42 -0
- package/src/charting/emphasis/HighlightRule.js +24 -0
- package/src/charting/gauges/ArcTrack.js +51 -0
- package/src/charting/gauges/GaugeAnimation.js +51 -0
- package/src/charting/gauges/GaugeBands.js +48 -0
- package/src/charting/gauges/GaugeScale.js +87 -0
- package/src/charting/gauges/GaugeTrack.js +44 -0
- package/src/charting/gauges/GaugeValue.js +61 -0
- package/src/charting/gauges/HorizontalTrack.js +14 -0
- package/src/charting/gauges/LinearTrack.js +29 -0
- package/src/charting/gauges/Sparkline.js +42 -0
- package/src/charting/gauges/VerticalTrack.js +17 -0
- package/src/charting/glyphs/ArrowGlyph.js +21 -0
- package/src/charting/glyphs/BatteryGlyph.js +18 -0
- package/src/charting/glyphs/ChevronGlyph.js +18 -0
- package/src/charting/glyphs/CircleGlyph.js +15 -0
- package/src/charting/glyphs/CloudGlyph.js +19 -0
- package/src/charting/glyphs/ComponentGlyph.js +18 -0
- package/src/charting/glyphs/ConstraintGlyph.js +24 -0
- package/src/charting/glyphs/ContractBoxGlyph.js +10 -0
- package/src/charting/glyphs/CubeGlyph.js +19 -0
- package/src/charting/glyphs/CylinderGlyph.js +19 -0
- package/src/charting/glyphs/DashedDoubleArrowGlyph.js +11 -0
- package/src/charting/glyphs/DeviceGlyph.js +17 -0
- package/src/charting/glyphs/DiamondGlyph.js +17 -0
- package/src/charting/glyphs/DocumentGlyph.js +17 -0
- package/src/charting/glyphs/DoubleArrowGlyph.js +23 -0
- package/src/charting/glyphs/DoubleCircleGlyph.js +24 -0
- package/src/charting/glyphs/EllipseGlyph.js +18 -0
- package/src/charting/glyphs/FactoryGlyph.js +20 -0
- package/src/charting/glyphs/FlagGlyph.js +16 -0
- package/src/charting/glyphs/GapCircleGlyph.js +17 -0
- package/src/charting/glyphs/GearGlyph.js +37 -0
- package/src/charting/glyphs/Glyph.js +98 -0
- package/src/charting/glyphs/GroupingBoxGlyph.js +13 -0
- package/src/charting/glyphs/HalfCircleGlyph.js +22 -0
- package/src/charting/glyphs/HexagonGlyph.js +28 -0
- package/src/charting/glyphs/IconGlyph.js +22 -0
- package/src/charting/glyphs/ImageGlyph.js +16 -0
- package/src/charting/glyphs/JunctionGlyph.js +17 -0
- package/src/charting/glyphs/LollipopGlyph.js +22 -0
- package/src/charting/glyphs/MagnifierGlyph.js +17 -0
- package/src/charting/glyphs/NoteGlyph.js +33 -0
- package/src/charting/glyphs/ObjectBoxGlyph.js +21 -0
- package/src/charting/glyphs/OrJunctionGlyph.js +17 -0
- package/src/charting/glyphs/ParallelogramGlyph.js +20 -0
- package/src/charting/glyphs/PersonGlyph.js +23 -0
- package/src/charting/glyphs/PillGlyph.js +23 -0
- package/src/charting/glyphs/PinGlyph.js +18 -0
- package/src/charting/glyphs/PrincipleGlyph.js +23 -0
- package/src/charting/glyphs/ProductBoxGlyph.js +16 -0
- package/src/charting/glyphs/RectGlyph.js +15 -0
- package/src/charting/glyphs/RoundedBoxGlyph.js +13 -0
- package/src/charting/glyphs/StackGlyph.js +14 -0
- package/src/charting/glyphs/StepsGlyph.js +20 -0
- package/src/charting/glyphs/StickFigureGlyph.js +32 -0
- package/src/charting/glyphs/SystemSoftwareBoxGlyph.js +16 -0
- package/src/charting/glyphs/TabbedBoxGlyph.js +37 -0
- package/src/charting/glyphs/TargetGlyph.js +23 -0
- package/src/charting/glyphs/WavyBoxGlyph.js +17 -0
- package/src/charting/glyphs/WheelGlyph.js +28 -0
- package/src/charting/glyphs/drawGlyph.js +28 -0
- package/src/charting/glyphs/glyphSvg.js +55 -0
- package/src/charting/glyphs/index.js +109 -0
- package/src/charting/modelTree/AnalysisPanel.js +159 -0
- package/src/charting/modelTree/DiagramTabs.js +217 -0
- package/src/charting/modelTree/ModelTree.js +164 -0
- package/src/charting/modelTree/ModelTreePanel.js +914 -0
- package/src/charting/modelTree/TreeBuilder.js +238 -0
- package/src/charting/modelTree/TreeModeRegistry.js +51 -0
- package/src/charting/modelTree/TreeViewMode.js +110 -0
- package/src/charting/modelTree/buildFilterTrees.js +138 -0
- package/src/charting/modelTree/modes/FlatTreeMode.js +46 -0
- package/src/charting/modelTree/modes/LayerGroupedTreeMode.js +62 -0
- package/src/charting/modelTree/modes/TypeGroupedTreeMode.js +60 -0
- package/src/charting/modelTree/treeLayers.js +11 -0
- package/src/charting/report/reportHtml.js +82 -0
- package/src/charting/report/reportViewer.js +118 -0
- package/src/charting/shapes/CircleShape.js +19 -0
- package/src/charting/shapes/PathShape.js +17 -0
- package/src/charting/shapes/RectShape.js +20 -0
- package/src/charting/shapes/Shape.js +20 -0
- package/src/charting/shapes/ShapeFactory.js +23 -0
- package/src/charting/storage/LocalJsonStore.js +43 -0
- package/src/charting/templates/ActorTemplate.js +36 -0
- package/src/charting/templates/BoxTemplate.js +27 -0
- package/src/charting/templates/CircleTemplate.js +18 -0
- package/src/charting/templates/ClassTemplate.js +20 -0
- package/src/charting/templates/CloudTemplate.js +43 -0
- package/src/charting/templates/ComponentTemplate.js +19 -0
- package/src/charting/templates/CylinderTemplate.js +30 -0
- package/src/charting/templates/DataStoreTemplate.js +16 -0
- package/src/charting/templates/DiamondTemplate.js +10 -0
- package/src/charting/templates/DocumentTemplate.js +32 -0
- package/src/charting/templates/EllipseTemplate.js +15 -0
- package/src/charting/templates/FinalStateTemplate.js +12 -0
- package/src/charting/templates/GlyphTemplate.js +47 -0
- package/src/charting/templates/HexagonTemplate.js +17 -0
- package/src/charting/templates/LifelineTemplate.js +20 -0
- package/src/charting/templates/ManualInputTemplate.js +12 -0
- package/src/charting/templates/NoteTemplate.js +23 -0
- package/src/charting/templates/OctagonTemplate.js +7 -0
- package/src/charting/templates/PackageTemplate.js +25 -0
- package/src/charting/templates/ParallelogramTemplate.js +11 -0
- package/src/charting/templates/PentagonTemplate.js +5 -0
- package/src/charting/templates/PolygonTemplate.js +18 -0
- package/src/charting/templates/PredefinedProcessTemplate.js +13 -0
- package/src/charting/templates/RectangleTemplate.js +28 -0
- package/src/charting/templates/RegularPolygonTemplate.js +21 -0
- package/src/charting/templates/RoundedRectangleTemplate.js +5 -0
- package/src/charting/templates/StadiumTemplate.js +8 -0
- package/src/charting/templates/StarTemplate.js +17 -0
- package/src/charting/templates/SwimlaneTemplate.js +18 -0
- package/src/charting/templates/Template.js +208 -0
- package/src/charting/templates/TrapezoidTemplate.js +11 -0
- package/src/charting/templates/TriangleTemplate.js +12 -0
- package/src/charting/templates/index.js +31 -0
- package/src/charting/templates/outline.js +59 -0
- package/src/charting/templates/svg.js +19 -0
- package/src/charting/textToShapes.js +61 -0
- package/src/charting/toolbar/ToolbarButton.js +38 -0
- package/src/charting/toolbar/ToolbarCheckbox.js +31 -0
- package/src/charting/toolbar/ToolbarItem.js +19 -0
- package/src/charting/toolbar/ToolbarMenu.js +36 -0
- package/src/charting/toolbar/ToolbarSelect.js +38 -0
- package/src/charting/toolbar/ToolbarSeparator.js +7 -0
- package/src/charting/toolbar/ToolbarText.js +22 -0
- package/src/charting/toolbar/index.js +8 -0
- package/src/charting/toolbar/pickFile.js +14 -0
- package/src/charting/viewDecorations.js +85 -0
- package/src/charting/zOrder.js +57 -0
- package/src/csvTable.js +61 -0
- package/src/datamodel.js +122 -0
- package/src/datawindow/BoundedWindow.js +36 -0
- package/src/datawindow/FlatDataWindow.js +34 -0
- package/src/datawindow/GraphDataWindow.js +40 -0
- package/src/datawindow/GroupedSampleDataWindow.js +16 -0
- package/src/datawindow/SeriesDataWindow.js +42 -0
- package/src/datawindow/index.js +31 -0
- package/src/diagramCatalog.js +30 -0
- package/src/ebnfDiagram.js +57 -0
- package/src/ebnfParser.js +129 -0
- package/src/exportImage.js +233 -0
- package/src/index.js +2636 -0
- package/src/itIcons.js +84 -0
- package/src/kernelExpr.js +243 -0
- package/src/propertiesDialog.js +463 -0
- package/src/railroadDiagram.js +571 -0
- package/src/treeModeCatalog.js +16 -0
- package/src/workspace/ContextBus.js +79 -0
- package/src/workspace/EditorShell.js +67 -0
- package/src/workspace/Part.js +163 -0
- package/src/workspace/PartFactory.js +49 -0
- package/src/workspace/PartRegistry.js +86 -0
- package/src/workspace/Workspace.js +321 -0
- package/src/workspace/archimateServices.js +33 -0
- package/src/workspace/dom.js +120 -0
- package/src/workspace/index.js +75 -0
- package/src/workspace/layout/GridNode.js +280 -0
- package/src/workspace/layout/LayoutNode.js +89 -0
- package/src/workspace/layout/PartNode.js +77 -0
- package/src/workspace/layout/SplitNode.js +114 -0
- package/src/workspace/layout/TabsNode.js +191 -0
- package/src/workspace/layout/index.js +24 -0
- package/src/workspace/parts/AdapterPart.js +33 -0
- package/src/workspace/parts/ArchimateCanvasPart.js +345 -0
- package/src/workspace/parts/ArchimateEditorPart.js +79 -0
- package/src/workspace/parts/ChartPart.js +115 -0
- package/src/workspace/parts/ContentPart.js +34 -0
- package/src/workspace/parts/DetailPart.js +46 -0
- package/src/workspace/parts/DiagramEditorPart.js +135 -0
- package/src/workspace/parts/EditorPart.js +388 -0
- package/src/workspace/parts/HtmlPart.js +25 -0
- package/src/workspace/parts/ListPart.js +57 -0
- package/src/workspace/parts/ModelFile.js +187 -0
- package/src/workspace/parts/ModelsPart.js +135 -0
- package/src/workspace/styles.js +258 -0
- package/src/workspace/themes.js +96 -0
- package/src/workspace/workArea.js +413 -0
- package/src/workspace/workAreaModel.js +197 -0
- package/src/workspace.js +16 -0
- package/src/zip/ZipArchive.js +160 -0
- package/src/zip/crc32.js +25 -0
- package/src/zip/inflate.js +159 -0
package/src/datamodel.js
ADDED
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
// Copyright 2026 Jaroslav Peter Prib, Purveyor of Excellence
|
|
2
|
+
/**
|
|
3
|
+
* Data-modelling notation — deliberately its own file/OO module, same split
|
|
4
|
+
* as src/archimate.js: keeps this domain's vocabulary (levels, notation
|
|
5
|
+
* styles, cardinality) out of RenderEngine itself, queried through the
|
|
6
|
+
* `DataModelNotation` registry rather than flat string-keyed maps.
|
|
7
|
+
*
|
|
8
|
+
* **Three levels, one entity.** A conceptual/logical/physical data model
|
|
9
|
+
* isn't three unrelated diagrams — it's the same entities and relationships
|
|
10
|
+
* shown at increasing fidelity. `dataModelDiagram` (see RenderEngine)
|
|
11
|
+
* expresses that as ONE entity object carrying per-level detail
|
|
12
|
+
* (`entity.logical.attributes`, `entity.physical.attributes`, ...) under a
|
|
13
|
+
* shared `name`/`description` — the same "object" (level-agnostic identity)
|
|
14
|
+
* vs "visual/detail" (this level's own presentation) split archimateDiagram
|
|
15
|
+
* already draws between an element and its diagram — with `options.level`
|
|
16
|
+
* picking which one's on screen. That's the cross-mapping: switching level
|
|
17
|
+
* re-renders the SAME entities/relationships, not a second, separately
|
|
18
|
+
* maintained diagram, so a conceptual entity, its logical attributes, and
|
|
19
|
+
* its physical column types can never drift out of correspondence.
|
|
20
|
+
*
|
|
21
|
+
* **Three notations, one cardinality vocabulary.** A relationship's
|
|
22
|
+
* cardinality at each end is stored once, as a UML-style multiplicity
|
|
23
|
+
* string (`'0..1'|'1'|'0..*'|'*'|'1..*'`) — CARDINALITIES below — and each
|
|
24
|
+
* `NotationStyle` renders it its own way: Chen turns the relationship
|
|
25
|
+
* itself into a diamond-shaped node with a plain text label ('1'/'N') on
|
|
26
|
+
* each connecting edge; Crow's Foot renders it as an arrowhead-style glyph
|
|
27
|
+
* at the entity end (fork for "many", tick for "one", circle for
|
|
28
|
+
* "optional" — see the `crowsfoot-*` markers in SVGRenderer.js); UML shows
|
|
29
|
+
* the multiplicity string itself as a text label near that end
|
|
30
|
+
* (`edge.sourceLabel`/`targetLabel`, a plain graphDiagram feature, not
|
|
31
|
+
* data-model-specific). None of these are pixel-perfect renditions of the
|
|
32
|
+
* real notations' full rule set (Chen's own attribute-oval convention,
|
|
33
|
+
* every crow's-foot optionality combination, UML's aggregation/composition
|
|
34
|
+
* diamonds) — they're a representative, genuinely-readable version of each,
|
|
35
|
+
* the same calibration archimateDiagram's own icons use.
|
|
36
|
+
*/
|
|
37
|
+
|
|
38
|
+
/** One data-modelling abstraction level. See DataModelNotation.levels(). */
|
|
39
|
+
export class DataModelLevel {
|
|
40
|
+
constructor(name, description) {
|
|
41
|
+
this.name = name;
|
|
42
|
+
this.description = description;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/** The canonical cardinality vocabulary every NotationStyle renders
|
|
47
|
+
* differently — UML-style multiplicity strings, since they're the only one
|
|
48
|
+
* of the three notations expressive enough to BE the canonical form
|
|
49
|
+
* without losing information (Chen/Crow's Foot each collapse some of these
|
|
50
|
+
* distinctions on purpose). */
|
|
51
|
+
const CARDINALITIES = new Set(['0..1', '1', '0..*', '*', '1..*']);
|
|
52
|
+
|
|
53
|
+
function chenCardinalityLabel(cardinality) {
|
|
54
|
+
return cardinality === '1' || cardinality === '0..1' ? '1' : 'N';
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
const CROWSFOOT_ARROWHEADS = {
|
|
58
|
+
'1': 'crowsfoot-one',
|
|
59
|
+
'0..1': 'crowsfoot-one-optional',
|
|
60
|
+
'1..*': 'crowsfoot-many-mandatory',
|
|
61
|
+
'0..*': 'crowsfoot-many',
|
|
62
|
+
'*': 'crowsfoot-many',
|
|
63
|
+
};
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* One drawing technique for entities/relationships — Chen, Crow's Foot, or
|
|
67
|
+
* UML (class-diagram style). `entityShape` picks the graphDiagram node shape
|
|
68
|
+
* (`'rect'` for a plain box, `'table'` for a header + attribute-rows card);
|
|
69
|
+
* `relationshipAsNode` (Chen only) turns a relationship into its own
|
|
70
|
+
* diamond-shaped node with two plain edges instead of one direct edge;
|
|
71
|
+
* `cardinalityArrowhead`/`cardinalityLabel` (each `(cardinality) => value or
|
|
72
|
+
* undefined`) pick how a relationship's own cardinality at one end renders
|
|
73
|
+
* — at most one of the two is ever set for a given notation, the other
|
|
74
|
+
* always returns undefined.
|
|
75
|
+
*/
|
|
76
|
+
export class NotationStyle {
|
|
77
|
+
constructor(name, { entityShape, relationshipAsNode, cardinalityArrowhead, cardinalityLabel }) {
|
|
78
|
+
this.name = name;
|
|
79
|
+
this.entityShape = entityShape;
|
|
80
|
+
this.relationshipAsNode = relationshipAsNode;
|
|
81
|
+
this.cardinalityArrowhead = cardinalityArrowhead;
|
|
82
|
+
this.cardinalityLabel = cardinalityLabel;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
const LEVELS = {
|
|
87
|
+
conceptual: new DataModelLevel('conceptual', 'Entities and their relationships only — no attributes, no keys, no types.'),
|
|
88
|
+
logical: new DataModelLevel('logical', 'Attributes and keys, still database-agnostic — no column types or engine specifics.'),
|
|
89
|
+
physical: new DataModelLevel('physical', 'Real column types, keys, and constraints as they exist in an actual database.'),
|
|
90
|
+
};
|
|
91
|
+
|
|
92
|
+
const NOTATIONS = {
|
|
93
|
+
chen: new NotationStyle('chen', {
|
|
94
|
+
entityShape: 'rect',
|
|
95
|
+
relationshipAsNode: true,
|
|
96
|
+
cardinalityArrowhead: () => undefined,
|
|
97
|
+
cardinalityLabel: chenCardinalityLabel,
|
|
98
|
+
}),
|
|
99
|
+
crowsfoot: new NotationStyle('crowsfoot', {
|
|
100
|
+
entityShape: 'table',
|
|
101
|
+
relationshipAsNode: false,
|
|
102
|
+
cardinalityArrowhead: (cardinality) => CROWSFOOT_ARROWHEADS[cardinality],
|
|
103
|
+
cardinalityLabel: () => undefined,
|
|
104
|
+
}),
|
|
105
|
+
uml: new NotationStyle('uml', {
|
|
106
|
+
entityShape: 'table',
|
|
107
|
+
relationshipAsNode: false,
|
|
108
|
+
cardinalityArrowhead: () => undefined,
|
|
109
|
+
cardinalityLabel: (cardinality) => cardinality,
|
|
110
|
+
}),
|
|
111
|
+
};
|
|
112
|
+
|
|
113
|
+
export const DataModelNotation = {
|
|
114
|
+
levels() { return Object.values(LEVELS); },
|
|
115
|
+
levelNames() { return Object.keys(LEVELS); },
|
|
116
|
+
level(name) { return LEVELS[name]; },
|
|
117
|
+
notations() { return Object.values(NOTATIONS); },
|
|
118
|
+
notationNames() { return Object.keys(NOTATIONS); },
|
|
119
|
+
notation(name) { return NOTATIONS[name] || NOTATIONS.crowsfoot; },
|
|
120
|
+
isCardinality(value) { return CARDINALITIES.has(value); },
|
|
121
|
+
cardinalities() { return [...CARDINALITIES]; },
|
|
122
|
+
};
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Abstract base for "own a bounded collection, push one more item, drop the
|
|
3
|
+
* oldest once past a cap" — the one behavior every streamable chart data
|
|
4
|
+
* shape shares, however differently each stores its collection(s). See
|
|
5
|
+
* ARCHITECTURE.md's "Data windows — streaming" section for the concrete
|
|
6
|
+
* subtypes and why each exists as its own class rather than a branch here.
|
|
7
|
+
*/
|
|
8
|
+
export class BoundedWindow {
|
|
9
|
+
constructor({ max = 0 } = {}) {
|
|
10
|
+
this.max = max;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Template method: append via `_append`, then trim via `_trim` — but only
|
|
15
|
+
* when `max` is truthy, so `max: 0` means "unbounded" without every
|
|
16
|
+
* subclass needing its own guard.
|
|
17
|
+
* @returns {*} the window's current `data` after the push.
|
|
18
|
+
*/
|
|
19
|
+
push(...args) {
|
|
20
|
+
this._append(...args);
|
|
21
|
+
if (this.max) this._trim();
|
|
22
|
+
return this.data;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
_append() {
|
|
26
|
+
throw new Error('_append must be implemented by a subclass');
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
_trim() {
|
|
30
|
+
throw new Error('_trim must be implemented by a subclass');
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
get data() {
|
|
34
|
+
throw new Error('data must be implemented by a subclass');
|
|
35
|
+
}
|
|
36
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { BoundedWindow } from './BoundedWindow.js';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* A single flat array of points — the shape behind `bar`, `pie`, `scatter`,
|
|
5
|
+
* `bubble`, `candlestick`, `funnel`, `waterfall`, `histogram`, `qq`, `lag`,
|
|
6
|
+
* `treemap`, `sunburst`, `outline`, `stackedBar`, `bar3D`, `bubble3D` (see
|
|
7
|
+
* `streamShape: 'flat'` in `chartCatalog.js`). One new record is appended to
|
|
8
|
+
* the outer array per push; trimming drops the oldest records FIFO.
|
|
9
|
+
*/
|
|
10
|
+
export class FlatDataWindow extends BoundedWindow {
|
|
11
|
+
constructor(initialData, options = {}) {
|
|
12
|
+
super(options);
|
|
13
|
+
this._data = initialData;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
get data() {
|
|
17
|
+
return this._data;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* @param {*|function(Array):*} pointOrFactory A literal point, or a
|
|
22
|
+
* function of the current data array — needed by shapes like
|
|
23
|
+
* `candlestick`, where the next bar continues from the previous bar's
|
|
24
|
+
* `close`.
|
|
25
|
+
*/
|
|
26
|
+
_append(pointOrFactory) {
|
|
27
|
+
const point = typeof pointOrFactory === 'function' ? pointOrFactory(this._data) : pointOrFactory;
|
|
28
|
+
this._data = [...this._data, point];
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
_trim() {
|
|
32
|
+
this._data = this._data.slice(-this.max);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { BoundedWindow } from './BoundedWindow.js';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* A nodes+edges pair — the shape behind `graphDiagram`/`graphDiagram3D`.
|
|
5
|
+
* Not a `CHART_CATALOG` entry (see ARCHITECTURE.md), so it isn't dispatched
|
|
6
|
+
* through `createDataWindow`/`streamShape`; `RenderEngine.addGraphNode`
|
|
7
|
+
* constructs it directly. Trimming drops the oldest nodes FIFO, then any
|
|
8
|
+
* edge left dangling off a removed node — dropping nodes without this would
|
|
9
|
+
* leave edges pointing at ids that no longer exist.
|
|
10
|
+
*/
|
|
11
|
+
export class GraphDataWindow extends BoundedWindow {
|
|
12
|
+
constructor({ nodes, edges }, options = {}) {
|
|
13
|
+
super(options);
|
|
14
|
+
this._nodes = nodes;
|
|
15
|
+
this._edges = edges;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
get data() {
|
|
19
|
+
return { nodes: this._nodes, edges: this._edges };
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
get nodes() {
|
|
23
|
+
return this._nodes;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
get edges() {
|
|
27
|
+
return this._edges;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
_append(node, newEdges = []) {
|
|
31
|
+
this._nodes = [...this._nodes, node];
|
|
32
|
+
this._edges = [...this._edges, ...newEdges];
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
_trim() {
|
|
36
|
+
this._nodes = this._nodes.slice(-this.max);
|
|
37
|
+
const keepIds = new Set(this._nodes.map((n) => n.id));
|
|
38
|
+
this._edges = this._edges.filter((e) => keepIds.has(e.source) && keepIds.has(e.target));
|
|
39
|
+
}
|
|
40
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { SeriesDataWindow } from './SeriesDataWindow.js';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Same storage shape as `SeriesDataWindow` (`Array<{label, values:[]}>`) but
|
|
5
|
+
* only ONE randomly-chosen group grows per push — the shape behind
|
|
6
|
+
* `boxPlot`, `density`, `violin` (see `streamShape: 'grouped-sample'` in
|
|
7
|
+
* `chartCatalog.js`). A new sample observation belongs to one group, unlike
|
|
8
|
+
* `line`/`area`/`pipe`'s shared time axis where every series advances
|
|
9
|
+
* together — the entire behavioral difference from the base class is which
|
|
10
|
+
* indices get targeted, so that's the only method this subclass overrides.
|
|
11
|
+
*/
|
|
12
|
+
export class GroupedSampleDataWindow extends SeriesDataWindow {
|
|
13
|
+
_targetIndices() {
|
|
14
|
+
return this._data.length ? [Math.floor(Math.random() * this._data.length)] : [];
|
|
15
|
+
}
|
|
16
|
+
}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { BoundedWindow } from './BoundedWindow.js';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* `Array<{name|label, values:[]}>` — the shape behind `line`, `area`, `pipe`
|
|
5
|
+
* (see `streamShape: 'series'` in `chartCatalog.js`). Every targeted series'
|
|
6
|
+
* own `values` grows by one point per push; the outer array (series count)
|
|
7
|
+
* is never trimmed by `max`, only each series' own `values`.
|
|
8
|
+
*
|
|
9
|
+
* `_targetIndices()` is the one seam a subtype overrides — see
|
|
10
|
+
* `GroupedSampleDataWindow`, which is this same storage shape but grows
|
|
11
|
+
* exactly one random series per push instead of all of them.
|
|
12
|
+
*/
|
|
13
|
+
export class SeriesDataWindow extends BoundedWindow {
|
|
14
|
+
constructor(initialData, options = {}) {
|
|
15
|
+
super(options);
|
|
16
|
+
this._data = initialData;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
get data() {
|
|
20
|
+
return this._data;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/** Which series indices receive the new point this push. Default: all of them. */
|
|
24
|
+
_targetIndices() {
|
|
25
|
+
return this._data.map((_, i) => i);
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* @param {*|function(object,number,Array):*} pointOrFactory A literal
|
|
30
|
+
* point (used for every targeted series), or a factory called once per
|
|
31
|
+
* targeted series as `(series, index, data)`.
|
|
32
|
+
*/
|
|
33
|
+
_append(pointOrFactory) {
|
|
34
|
+
const make = typeof pointOrFactory === 'function' ? pointOrFactory : () => pointOrFactory;
|
|
35
|
+
const targets = new Set(this._targetIndices());
|
|
36
|
+
this._data = this._data.map((s, i) => (targets.has(i) ? { ...s, values: [...s.values, make(s, i, this._data)] } : s));
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
_trim() {
|
|
40
|
+
this._data = this._data.map((s) => ({ ...s, values: s.values.slice(-this.max) }));
|
|
41
|
+
}
|
|
42
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `createDataWindow` is the Strategy/Factory that turns a `CHART_CATALOG`
|
|
3
|
+
* entry's `streamShape` into the right window instance — adding a future
|
|
4
|
+
* shape is one new class (see the others in this directory) plus one map
|
|
5
|
+
* entry here, not a new branch scattered through `RenderEngine`.
|
|
6
|
+
*/
|
|
7
|
+
import { FlatDataWindow } from './FlatDataWindow.js';
|
|
8
|
+
import { SeriesDataWindow } from './SeriesDataWindow.js';
|
|
9
|
+
import { GroupedSampleDataWindow } from './GroupedSampleDataWindow.js';
|
|
10
|
+
|
|
11
|
+
export { BoundedWindow } from './BoundedWindow.js';
|
|
12
|
+
export { FlatDataWindow, SeriesDataWindow, GroupedSampleDataWindow };
|
|
13
|
+
export { GraphDataWindow } from './GraphDataWindow.js';
|
|
14
|
+
|
|
15
|
+
const WINDOW_CLASSES = {
|
|
16
|
+
flat: FlatDataWindow,
|
|
17
|
+
series: SeriesDataWindow,
|
|
18
|
+
'grouped-sample': GroupedSampleDataWindow,
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* @param {string} streamShape One of `CHART_CATALOG`'s `streamShape` values.
|
|
23
|
+
* @param {*} initialData The chart's current data array.
|
|
24
|
+
* @param {{max?: number}} [options]
|
|
25
|
+
* @returns {import('./BoundedWindow.js').BoundedWindow|null} `null` for
|
|
26
|
+
* `'none'` (or any other unrecognized shape) — not streamable.
|
|
27
|
+
*/
|
|
28
|
+
export function createDataWindow(streamShape, initialData, options) {
|
|
29
|
+
const Ctor = WINDOW_CLASSES[streamShape];
|
|
30
|
+
return Ctor ? new Ctor(initialData, options) : null;
|
|
31
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Single source of truth for "what diagram types does RenderEngine support".
|
|
3
|
+
*
|
|
4
|
+
* Mirrors src/chartCatalog.js: the registry is the object-oriented lookup
|
|
5
|
+
* layer over the flat catalog, and `getDiagramCatalogEntry` is the legacy-style
|
|
6
|
+
* helper kept for backward compatibility.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import { DiagramRegistry } from './charting/DiagramRegistry.js';
|
|
10
|
+
import { GraphDiagram } from './charting/diagrams/GraphDiagram.js';
|
|
11
|
+
import { GraphDiagram3D } from './charting/diagrams/GraphDiagram3D.js';
|
|
12
|
+
import { ArchimateDiagram } from './charting/diagrams/ArchimateDiagram.js';
|
|
13
|
+
import { DataModelDiagram } from './charting/diagrams/DataModelDiagram.js';
|
|
14
|
+
import { EbnfDiagram } from './charting/diagrams/EbnfDiagram.js';
|
|
15
|
+
|
|
16
|
+
export const DIAGRAM_CATALOG = [
|
|
17
|
+
{ key: 'graph', method: 'graphDiagram', DiagramClass: GraphDiagram },
|
|
18
|
+
{ key: 'graph3d', method: 'graphDiagram3D', DiagramClass: GraphDiagram3D },
|
|
19
|
+
{ key: 'archimate', method: 'archimateDiagram', DiagramClass: ArchimateDiagram },
|
|
20
|
+
{ key: 'dataModel', method: 'dataModelDiagram', DiagramClass: DataModelDiagram },
|
|
21
|
+
{ key: 'ebnf', method: 'ebnfDiagram', DiagramClass: EbnfDiagram },
|
|
22
|
+
];
|
|
23
|
+
|
|
24
|
+
/** Canonical registry instance seeded with the built-in diagram types. */
|
|
25
|
+
export const diagramRegistry = new DiagramRegistry(DIAGRAM_CATALOG);
|
|
26
|
+
|
|
27
|
+
/** Look up one catalog entry by key, or undefined if the key is unknown. */
|
|
28
|
+
export function getDiagramCatalogEntry(key) {
|
|
29
|
+
return diagramRegistry.get(key);
|
|
30
|
+
}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
// Converts an already-parsed EBNF AST (the shape sibling project `bnfengine`
|
|
2
|
+
// produces — see its `_parseExpression`/`_parseTokens`) into a
|
|
3
|
+
// railroadDiagram.js Diagram-node tree, for rendering via
|
|
4
|
+
// RenderEngine.railroadDiagram()/.ebnfDiagram(). Rendering only — this file
|
|
5
|
+
// does no text parsing of its own, by design; it consumes a tree that was
|
|
6
|
+
// already built elsewhere.
|
|
7
|
+
//
|
|
8
|
+
// bnfengine's 7 node shapes (confirmed by reading its parser source, not
|
|
9
|
+
// guessed):
|
|
10
|
+
// Terminal {type:'Terminal', value}
|
|
11
|
+
// NonTerminal {type:'NonTerminal', value}
|
|
12
|
+
// Sequence {type:'Sequence', items:[...]}
|
|
13
|
+
// Choice {type:'Choice', options:[...]}
|
|
14
|
+
// Optional {type:'Optional', content} -- from [ ... ]
|
|
15
|
+
// Repetition {type:'Repetition', content} -- from { ... }
|
|
16
|
+
// Group {type:'Group', content} -- from ( ... )
|
|
17
|
+
|
|
18
|
+
import { Sequence, Choice, Optional, ZeroOrMore, Terminal, NonTerminal } from './railroadDiagram.js';
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* @param {object} node A bnfengine-shaped EBNF AST node (see file header).
|
|
22
|
+
* @returns {object} The equivalent railroadDiagram.js Diagram-tree node.
|
|
23
|
+
* @throws {Error} for an unrecognized `node.type`.
|
|
24
|
+
*/
|
|
25
|
+
export function ebnfAstToDiagram(node) {
|
|
26
|
+
switch (node.type) {
|
|
27
|
+
case 'Terminal':
|
|
28
|
+
return Terminal(node.value);
|
|
29
|
+
case 'NonTerminal':
|
|
30
|
+
return NonTerminal(node.value);
|
|
31
|
+
case 'Sequence':
|
|
32
|
+
return Sequence(...node.items.map(ebnfAstToDiagram));
|
|
33
|
+
case 'Choice':
|
|
34
|
+
// The leading `normal` arg picks the "straight line" alternative
|
|
35
|
+
// in the original upstream railroad-diagrams library, but this
|
|
36
|
+
// simplified port's own Choice format() never reads it (only
|
|
37
|
+
// `.items` drives layout) — 0 is passed for clarity, not
|
|
38
|
+
// because it has any effect today.
|
|
39
|
+
return Choice(0, ...node.options.map(ebnfAstToDiagram));
|
|
40
|
+
case 'Optional':
|
|
41
|
+
return Optional(ebnfAstToDiagram(node.content));
|
|
42
|
+
case 'Repetition':
|
|
43
|
+
// bnfengine's own executor has no working semantics for `{...}`
|
|
44
|
+
// to confirm against (a separate, pre-existing bug in its
|
|
45
|
+
// interpreter, irrelevant to this adapter, which only reads the
|
|
46
|
+
// parse-tree shape) — mapped to the standard ISO/EBNF reading of
|
|
47
|
+
// curly-brace repetition: zero-or-more.
|
|
48
|
+
return ZeroOrMore(ebnfAstToDiagram(node.content));
|
|
49
|
+
case 'Group':
|
|
50
|
+
// Pure grouping/precedence — parentheses have no railroad-diagram
|
|
51
|
+
// visual of their own; the tree nesting already captures what
|
|
52
|
+
// they mean, so this is transparent (no wrapper node).
|
|
53
|
+
return ebnfAstToDiagram(node.content);
|
|
54
|
+
default:
|
|
55
|
+
throw new Error(`ebnfAstToDiagram: unknown EBNF AST node type "${node.type}"`);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
// Parses a small, standard EBNF grammar-rule text (matching common railroad-
|
|
2
|
+
// diagram reference notation, e.g.
|
|
3
|
+
// `DOUBLE ::= ( [0-9]+ ( '.' [0-9]* )? | '.' [0-9]+ ) EXPONENT`) into the
|
|
4
|
+
// same AST shape ebnfDiagram.js's `ebnfAstToDiagram` already consumes (see
|
|
5
|
+
// that file's own header for the full node-shape reference). Deliberately
|
|
6
|
+
// not built on bnfengine's own parser: confirmed by reading its source
|
|
7
|
+
// directly that it has no support at all for postfix ?/*/+ quantifiers —
|
|
8
|
+
// every such character becomes its own stray Terminal literal instead of
|
|
9
|
+
// being interpreted — disqualifying, since those quantifiers are exactly
|
|
10
|
+
// what most real grammar rules need.
|
|
11
|
+
//
|
|
12
|
+
// Grammar:
|
|
13
|
+
// statement := (IDENT '::=')? alternation
|
|
14
|
+
// alternation := sequence ('|' sequence)*
|
|
15
|
+
// sequence := factor+
|
|
16
|
+
// factor := atom ('?' | '*' | '+')?
|
|
17
|
+
// atom := STRING | BRACKET | IDENT | '(' alternation ')'
|
|
18
|
+
// STRING := "'" [^']* "'" | '"' [^"]* '"'
|
|
19
|
+
// BRACKET := '[' [^\]]* ']' -- a character class, e.g.
|
|
20
|
+
// [0-9] — a literal, not a
|
|
21
|
+
// rule reference
|
|
22
|
+
// IDENT := [A-Za-z_][A-Za-z0-9_-]* -- a bare word is a
|
|
23
|
+
// NONTERMINAL (rule
|
|
24
|
+
// reference)
|
|
25
|
+
|
|
26
|
+
const TOKEN_RE = /::=|[|?*+()]|'[^']*'|"[^"]*"|\[[^\]]*\]|[A-Za-z_][A-Za-z0-9_-]*/y;
|
|
27
|
+
|
|
28
|
+
/** @private Splits `text` into a flat token array, skipping whitespace. */
|
|
29
|
+
function tokenize(text) {
|
|
30
|
+
const tokens = [];
|
|
31
|
+
let pos = 0;
|
|
32
|
+
while (pos < text.length) {
|
|
33
|
+
while (pos < text.length && /\s/.test(text[pos])) pos++;
|
|
34
|
+
if (pos >= text.length) break;
|
|
35
|
+
TOKEN_RE.lastIndex = pos;
|
|
36
|
+
const m = TOKEN_RE.exec(text);
|
|
37
|
+
if (!m || m.index !== pos) {
|
|
38
|
+
throw new Error(`parseEbnf: unexpected character at position ${pos}: "${text[pos]}"`);
|
|
39
|
+
}
|
|
40
|
+
tokens.push(m[0]);
|
|
41
|
+
pos = TOKEN_RE.lastIndex;
|
|
42
|
+
}
|
|
43
|
+
return tokens;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/** @private Recursive-descent parse over an already-tokenized array. */
|
|
47
|
+
function parseTokens(tokens) {
|
|
48
|
+
let i = 0;
|
|
49
|
+
const peek = () => tokens[i];
|
|
50
|
+
const next = () => tokens[i++];
|
|
51
|
+
const expect = (tok) => {
|
|
52
|
+
if (tokens[i] !== tok) throw new Error(`parseEbnf: expected "${tok}" but got "${tokens[i] ?? '<end of input>'}"`);
|
|
53
|
+
i++;
|
|
54
|
+
};
|
|
55
|
+
|
|
56
|
+
function parseStatement() {
|
|
57
|
+
let name = null;
|
|
58
|
+
if (tokens[i + 1] === '::=' && /^[A-Za-z_]/.test(tokens[i] || '')) {
|
|
59
|
+
name = next();
|
|
60
|
+
expect('::=');
|
|
61
|
+
}
|
|
62
|
+
const ast = parseAlternation();
|
|
63
|
+
if (i < tokens.length) throw new Error(`parseEbnf: unexpected trailing token "${tokens[i]}"`);
|
|
64
|
+
return { name, ast };
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
function parseAlternation() {
|
|
68
|
+
const branches = [parseSequence()];
|
|
69
|
+
while (peek() === '|') { next(); branches.push(parseSequence()); }
|
|
70
|
+
return branches.length === 1 ? branches[0] : { type: 'Choice', options: branches };
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
function parseSequence() {
|
|
74
|
+
const factors = [parseFactor()];
|
|
75
|
+
while (peek() && peek() !== '|' && peek() !== ')') factors.push(parseFactor());
|
|
76
|
+
return factors.length === 1 ? factors[0] : { type: 'Sequence', items: factors };
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
function parseFactor() {
|
|
80
|
+
const atom = parseAtom();
|
|
81
|
+
const q = peek();
|
|
82
|
+
if (q === '?') { next(); return { type: 'Optional', content: atom }; }
|
|
83
|
+
if (q === '*') { next(); return { type: 'Repetition', content: atom }; }
|
|
84
|
+
// `+` (one-or-more) desugars to "one mandatory pass, then zero-or-
|
|
85
|
+
// more more" — reuses only Sequence/Repetition (both already fixed
|
|
86
|
+
// and verified this session) instead of a dedicated OneOrMore AST
|
|
87
|
+
// node, which would resurrect railroadDiagram.js's own
|
|
88
|
+
// FORMATTERS.OneOrMore — still carrying its original, never
|
|
89
|
+
// exercised or fixed, likely-broken arc geometry (nothing used it
|
|
90
|
+
// before this parser existed).
|
|
91
|
+
if (q === '+') { next(); return { type: 'Sequence', items: [atom, { type: 'Repetition', content: atom }] }; }
|
|
92
|
+
return atom;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
function parseAtom() {
|
|
96
|
+
const tok = next();
|
|
97
|
+
if (tok === undefined) throw new Error('parseEbnf: unexpected end of input');
|
|
98
|
+
if (tok === '(') {
|
|
99
|
+
const inner = parseAlternation();
|
|
100
|
+
expect(')');
|
|
101
|
+
return inner;
|
|
102
|
+
}
|
|
103
|
+
if ((tok[0] === "'" && tok[tok.length - 1] === "'") || (tok[0] === '"' && tok[tok.length - 1] === '"')) {
|
|
104
|
+
return { type: 'Terminal', value: tok.slice(1, -1) };
|
|
105
|
+
}
|
|
106
|
+
if (tok[0] === '[' && tok[tok.length - 1] === ']') {
|
|
107
|
+
return { type: 'Terminal', value: tok };
|
|
108
|
+
}
|
|
109
|
+
if (/^[A-Za-z_][A-Za-z0-9_-]*$/.test(tok)) {
|
|
110
|
+
return { type: 'NonTerminal', value: tok };
|
|
111
|
+
}
|
|
112
|
+
throw new Error(`parseEbnf: unexpected token "${tok}"`);
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
return parseStatement();
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
/**
|
|
119
|
+
* @param {string} text EBNF rule text, e.g. `DOUBLE ::= [0-9]+ ('.' [0-9]*)?`.
|
|
120
|
+
* @returns {{name: string|null, ast: object}} `name` is the leading
|
|
121
|
+
* `IDENT ::=` rule name if present, else `null`. `ast` is the same
|
|
122
|
+
* bnfengine-shaped node tree `ebnfAstToDiagram` consumes.
|
|
123
|
+
* @throws {Error} on malformed input, with a position/token in the message.
|
|
124
|
+
*/
|
|
125
|
+
export function parseEbnf(text) {
|
|
126
|
+
const tokens = tokenize(text);
|
|
127
|
+
if (tokens.length === 0) throw new Error('parseEbnf: empty input');
|
|
128
|
+
return parseTokens(tokens);
|
|
129
|
+
}
|