@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.
Files changed (451) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +203 -2
  3. package/REFERENCE.md +2198 -0
  4. package/dist/renderengine-workspace.umd.js +46905 -0
  5. package/dist/renderengine.umd.js +42223 -0
  6. package/examples/archimate.html +66 -0
  7. package/examples/diagram-editor.html +51 -0
  8. package/package.json +65 -4
  9. package/src/BaseRenderer.js +57 -0
  10. package/src/CanvasRenderer.js +194 -0
  11. package/src/Mat4.js +111 -0
  12. package/src/OrbitCamera.js +57 -0
  13. package/src/RendererFactory.js +50 -0
  14. package/src/SVGRenderer.js +439 -0
  15. package/src/archimate.js +723 -0
  16. package/src/archimateArchiFormat.js +1693 -0
  17. package/src/archimateArchiTypes.js +72 -0
  18. package/src/archimateArchive.js +140 -0
  19. package/src/archimateCSV.js +127 -0
  20. package/src/archimateDrawio.js +182 -0
  21. package/src/archimateExchangeFormat.js +546 -0
  22. package/src/archimateRelationshipTable.js +93 -0
  23. package/src/archimateSpecializations.js +161 -0
  24. package/src/chartCatalog.js +589 -0
  25. package/src/charting/ArchimateDiagramEditor.js +1624 -0
  26. package/src/charting/ArchimateSpecializationSelector.js +134 -0
  27. package/src/charting/Axis.js +68 -0
  28. package/src/charting/CameraSeeder.js +30 -0
  29. package/src/charting/CatalogDialog.js +92 -0
  30. package/src/charting/Chart.js +37 -0
  31. package/src/charting/Chart3D.js +99 -0
  32. package/src/charting/ChartBox.js +80 -0
  33. package/src/charting/ChartData.js +27 -0
  34. package/src/charting/ChartRegistry.js +76 -0
  35. package/src/charting/CheckboxTreeSelector.js +304 -0
  36. package/src/charting/ColorField.js +107 -0
  37. package/src/charting/ColorPalette.js +88 -0
  38. package/src/charting/CommandHistory.js +176 -0
  39. package/src/charting/DataFilter.js +52 -0
  40. package/src/charting/Diagram.js +36 -0
  41. package/src/charting/Diagram3D.js +29 -0
  42. package/src/charting/DiagramClipboard.js +31 -0
  43. package/src/charting/DiagramEditor.js +3330 -0
  44. package/src/charting/DiagramEditorCommand.js +110 -0
  45. package/src/charting/DiagramEditorCommands.js +237 -0
  46. package/src/charting/DiagramEditorEdgeCommands.js +142 -0
  47. package/src/charting/DiagramEditorState.js +98 -0
  48. package/src/charting/DiagramRegistry.js +86 -0
  49. package/src/charting/DiagramTypeRegistry.js +326 -0
  50. package/src/charting/DiagramViewPropertiesDialog.js +46 -0
  51. package/src/charting/Edge.js +113 -0
  52. package/src/charting/ErrorBars.js +37 -0
  53. package/src/charting/FilterSystem.js +285 -0
  54. package/src/charting/FindReplaceDialog.js +139 -0
  55. package/src/charting/FormDialog.js +385 -0
  56. package/src/charting/Gauge.js +58 -0
  57. package/src/charting/Hierarchy.js +175 -0
  58. package/src/charting/HintPanel.js +86 -0
  59. package/src/charting/ImageSelector.js +148 -0
  60. package/src/charting/InteractionManager.js +725 -0
  61. package/src/charting/Legend.js +58 -0
  62. package/src/charting/MenuBar.js +62 -0
  63. package/src/charting/ModelFileFormat.js +115 -0
  64. package/src/charting/OrbitControls.js +77 -0
  65. package/src/charting/Palette.js +119 -0
  66. package/src/charting/PopupMenu.js +117 -0
  67. package/src/charting/PropertiesPanel.js +155 -0
  68. package/src/charting/PropertyListEditor.js +96 -0
  69. package/src/charting/PropertyLog.js +92 -0
  70. package/src/charting/SettingsCascade.js +93 -0
  71. package/src/charting/SettingsDialog.js +53 -0
  72. package/src/charting/SettingsManager.js +179 -0
  73. package/src/charting/SettingsViewPropertiesDialog.js +58 -0
  74. package/src/charting/ShapePaths.js +27 -0
  75. package/src/charting/Statistics.js +134 -0
  76. package/src/charting/TemplateCatalog.js +59 -0
  77. package/src/charting/TemplateLibrary.js +103 -0
  78. package/src/charting/TextStyle.js +168 -0
  79. package/src/charting/ViewFit.js +55 -0
  80. package/src/charting/ViewMenu.js +70 -0
  81. package/src/charting/ViewPropertiesDialog.js +77 -0
  82. package/src/charting/ViewTabStrip.js +81 -0
  83. package/src/charting/archimate/ArchiFileFormat.js +32 -0
  84. package/src/charting/archimate/ArchimateCanvasEditor.js +815 -0
  85. package/src/charting/archimate/ArchimateCsvFileFormat.js +35 -0
  86. package/src/charting/archimate/ArchimateEdge.js +137 -0
  87. package/src/charting/archimate/ArchimateElementTemplate.js +195 -0
  88. package/src/charting/archimate/ArchimatePalette.js +102 -0
  89. package/src/charting/archimate/CsvImportDialog.js +105 -0
  90. package/src/charting/archimate/CustomViewpoints.js +74 -0
  91. package/src/charting/archimate/DerivedEdge.js +29 -0
  92. package/src/charting/archimate/DrawioFileFormat.js +24 -0
  93. package/src/charting/archimate/ElementFilterRule.js +21 -0
  94. package/src/charting/archimate/ExchangeFileFormat.js +28 -0
  95. package/src/charting/archimate/ViewGroupTemplate.js +137 -0
  96. package/src/charting/archimate/ViewLineEdge.js +84 -0
  97. package/src/charting/archimate/ViewpointRule.js +45 -0
  98. package/src/charting/archimate/archimateFileFormats.js +12 -0
  99. package/src/charting/archimate/archimateNames.js +5 -0
  100. package/src/charting/archimate/csvMapping.js +122 -0
  101. package/src/charting/archimate/elementMenuItems.js +32 -0
  102. package/src/charting/archimate/elementProperties.js +146 -0
  103. package/src/charting/archimate/elementTypeChoices.js +7 -0
  104. package/src/charting/archimate/elementTypeGroups.js +19 -0
  105. package/src/charting/archimate/index.js +17 -0
  106. package/src/charting/archimate/specializationCatalogDialog.js +64 -0
  107. package/src/charting/archimate/typeGlyph.js +29 -0
  108. package/src/charting/arrangement/Arrangement.js +112 -0
  109. package/src/charting/arrangement/ArrangementCommand.js +29 -0
  110. package/src/charting/arrangement/BackgroundCommand.js +41 -0
  111. package/src/charting/arrangement/BackgroundGroup.js +18 -0
  112. package/src/charting/arrangement/GroupCommand.js +46 -0
  113. package/src/charting/arrangement/ItemGroup.js +62 -0
  114. package/src/charting/arrangement/LockCommand.js +32 -0
  115. package/src/charting/arrangement/UngroupCommand.js +27 -0
  116. package/src/charting/arrangement/alignment.js +88 -0
  117. package/src/charting/arrangement/arrangeMenuItems.js +25 -0
  118. package/src/charting/arrangement/index.js +11 -0
  119. package/src/charting/arrangement/layouts.js +233 -0
  120. package/src/charting/canvas/ArchiHint.js +78 -0
  121. package/src/charting/canvas/CanvasBoxKind.js +39 -0
  122. package/src/charting/canvas/CanvasPalette.js +49 -0
  123. package/src/charting/canvas/CanvasTemplateLibrary.js +61 -0
  124. package/src/charting/canvas/CanvasTemplateMenu.js +151 -0
  125. package/src/charting/canvas/EditHintCommand.js +28 -0
  126. package/src/charting/canvas/canvasBoxKinds.js +27 -0
  127. package/src/charting/canvas/canvasBoxMenuItems.js +40 -0
  128. package/src/charting/canvas/defaultCanvasTemplates.js +186 -0
  129. package/src/charting/canvas/diagramBoxKinds.js +12 -0
  130. package/src/charting/canvas/hintMenuItems.js +49 -0
  131. package/src/charting/charts/ArcGauge.js +55 -0
  132. package/src/charting/charts/AreaChart.js +71 -0
  133. package/src/charting/charts/BarChart.js +80 -0
  134. package/src/charting/charts/BarChart3D.js +56 -0
  135. package/src/charting/charts/BarChart3DOrbit.js +53 -0
  136. package/src/charting/charts/BarChartBase.js +70 -0
  137. package/src/charting/charts/BarGauge.js +42 -0
  138. package/src/charting/charts/BoxPlotChart.js +41 -0
  139. package/src/charting/charts/BubbleChart.js +99 -0
  140. package/src/charting/charts/BubbleChart3D.js +78 -0
  141. package/src/charting/charts/BulletGauge.js +87 -0
  142. package/src/charting/charts/CalendarHeatmapChart.js +204 -0
  143. package/src/charting/charts/CandlestickChart.js +54 -0
  144. package/src/charting/charts/ChordDiagram.js +130 -0
  145. package/src/charting/charts/DensityChart.js +73 -0
  146. package/src/charting/charts/DialGauge.js +65 -0
  147. package/src/charting/charts/DonutChart.js +15 -0
  148. package/src/charting/charts/FunnelChart.js +47 -0
  149. package/src/charting/charts/GanttChart.js +201 -0
  150. package/src/charting/charts/GaugeChart.js +175 -0
  151. package/src/charting/charts/GeoMapChart.js +146 -0
  152. package/src/charting/charts/GroupedBarChart.js +88 -0
  153. package/src/charting/charts/GroupedDistributionChart.js +70 -0
  154. package/src/charting/charts/HeatmapChart.js +80 -0
  155. package/src/charting/charts/HierarchyChart.js +39 -0
  156. package/src/charting/charts/HistogramChart.js +45 -0
  157. package/src/charting/charts/KpiTile.js +72 -0
  158. package/src/charting/charts/LagPlotChart.js +41 -0
  159. package/src/charting/charts/LineChart.js +124 -0
  160. package/src/charting/charts/MultiRingGauge.js +54 -0
  161. package/src/charting/charts/OutlineChart.js +95 -0
  162. package/src/charting/charts/ParallelCoordinatesChart.js +130 -0
  163. package/src/charting/charts/PieChart.js +56 -0
  164. package/src/charting/charts/PipeChart.js +88 -0
  165. package/src/charting/charts/PopulationPyramidChart.js +106 -0
  166. package/src/charting/charts/QQPlotChart.js +64 -0
  167. package/src/charting/charts/RadarChart.js +76 -0
  168. package/src/charting/charts/RadialBarChart.js +96 -0
  169. package/src/charting/charts/RingGauge.js +23 -0
  170. package/src/charting/charts/SankeyDiagram.js +174 -0
  171. package/src/charting/charts/ScatterChart.js +104 -0
  172. package/src/charting/charts/StackedAreaChart.js +15 -0
  173. package/src/charting/charts/StackedBarChart.js +33 -0
  174. package/src/charting/charts/StackedBarChart3DOrbit.js +58 -0
  175. package/src/charting/charts/StreamGraphChart.js +131 -0
  176. package/src/charting/charts/SunburstChart.js +57 -0
  177. package/src/charting/charts/ThermometerGauge.js +43 -0
  178. package/src/charting/charts/TreemapChart.js +54 -0
  179. package/src/charting/charts/ViolinChart.js +37 -0
  180. package/src/charting/charts/WaterfallChart.js +66 -0
  181. package/src/charting/charts/WordCloudChart.js +104 -0
  182. package/src/charting/diagramModel/AddViewCommand.js +33 -0
  183. package/src/charting/diagramModel/DiagramModel.js +39 -0
  184. package/src/charting/diagramModel/DiagramModelSearch.js +22 -0
  185. package/src/charting/diagramModel/DiagramView.js +50 -0
  186. package/src/charting/diagramModel/ModelHistory.js +43 -0
  187. package/src/charting/diagramModel/ModelReport.js +153 -0
  188. package/src/charting/diagramModel/ModelSearch.js +223 -0
  189. package/src/charting/diagramModel/RemoveViewCommand.js +25 -0
  190. package/src/charting/diagramModel/RenameViewCommand.js +21 -0
  191. package/src/charting/diagramModel/ReplaceTextCommand.js +25 -0
  192. package/src/charting/diagramModel/ViewSetChecker.js +34 -0
  193. package/src/charting/diagramModel/ViewSetModel.js +243 -0
  194. package/src/charting/diagramModel/index.js +6 -0
  195. package/src/charting/diagramModel/nameTransforms.js +29 -0
  196. package/src/charting/diagrams/ArchimateCommands.js +141 -0
  197. package/src/charting/diagrams/ArchimateDiagram.js +263 -0
  198. package/src/charting/diagrams/ArchimateModel.js +1155 -0
  199. package/src/charting/diagrams/ArchimateModelChecker.js +125 -0
  200. package/src/charting/diagrams/ArchimateModelReport.js +128 -0
  201. package/src/charting/diagrams/ArchimateModelSearch.js +41 -0
  202. package/src/charting/diagrams/ArchimateValidator.js +357 -0
  203. package/src/charting/diagrams/CanvasView.js +112 -0
  204. package/src/charting/diagrams/ContextMenu.js +37 -0
  205. package/src/charting/diagrams/DataModelDiagram.js +86 -0
  206. package/src/charting/diagrams/DataModelRelationshipStrategy.js +38 -0
  207. package/src/charting/diagrams/DerivedRelationships.js +102 -0
  208. package/src/charting/diagrams/EbnfDiagram.js +39 -0
  209. package/src/charting/diagrams/EdgeGeometry.js +553 -0
  210. package/src/charting/diagrams/EditViewItemCommand.js +128 -0
  211. package/src/charting/diagrams/ElementInstance.js +157 -0
  212. package/src/charting/diagrams/GraphDiagram.js +1340 -0
  213. package/src/charting/diagrams/GraphDiagram3D.js +152 -0
  214. package/src/charting/diagrams/GraphMetrics.js +81 -0
  215. package/src/charting/diagrams/GridOverlay.js +137 -0
  216. package/src/charting/diagrams/ImportRowsCommand.js +62 -0
  217. package/src/charting/diagrams/LabelHelper.js +108 -0
  218. package/src/charting/diagrams/MergeElementsCommand.js +101 -0
  219. package/src/charting/diagrams/NestInstanceCommand.js +34 -0
  220. package/src/charting/diagrams/NodeGeometry.js +158 -0
  221. package/src/charting/diagrams/PlaceItemsCommand.js +77 -0
  222. package/src/charting/diagrams/RadialLayout.js +101 -0
  223. package/src/charting/diagrams/RelationshipInstance.js +93 -0
  224. package/src/charting/diagrams/RemoveGroupFromViewCommand.js +28 -0
  225. package/src/charting/diagrams/RemoveLineCommand.js +27 -0
  226. package/src/charting/diagrams/ShowElementCommand.js +43 -0
  227. package/src/charting/diagrams/SvgCoordinate.js +17 -0
  228. package/src/charting/diagrams/SvgZoom.js +127 -0
  229. package/src/charting/diagrams/Tooltip.js +62 -0
  230. package/src/charting/diagrams/ViewConnectionInstance.js +102 -0
  231. package/src/charting/diagrams/ViewObjectInstance.js +56 -0
  232. package/src/charting/diagrams/commands/AddEdgeCommand.js +34 -0
  233. package/src/charting/diagrams/commands/AddNodeCommand.js +28 -0
  234. package/src/charting/diagrams/commands/AddWaypointCommand.js +27 -0
  235. package/src/charting/diagrams/commands/CreateFolderCommand.js +27 -0
  236. package/src/charting/diagrams/commands/DeleteEdgeCommand.js +30 -0
  237. package/src/charting/diagrams/commands/DeleteFolderCommand.js +47 -0
  238. package/src/charting/diagrams/commands/DeleteNodeCommand.js +35 -0
  239. package/src/charting/diagrams/commands/DeleteWaypointCommand.js +24 -0
  240. package/src/charting/diagrams/commands/GraphCommand.js +65 -0
  241. package/src/charting/diagrams/commands/InvertEdgeCommand.js +24 -0
  242. package/src/charting/diagrams/commands/MoveNodeCommand.js +44 -0
  243. package/src/charting/diagrams/commands/MoveWaypointCommand.js +27 -0
  244. package/src/charting/diagrams/commands/RenameEdgeCommand.js +23 -0
  245. package/src/charting/diagrams/commands/RenameFolderCommand.js +31 -0
  246. package/src/charting/diagrams/commands/RenameNodeCommand.js +27 -0
  247. package/src/charting/diagrams/commands/ResizeNodeCommand.js +46 -0
  248. package/src/charting/diagrams/commands/UpdateEdgeSideCommand.js +40 -0
  249. package/src/charting/diagrams/commands/index.js +17 -0
  250. package/src/charting/diagrams/duplicates.js +49 -0
  251. package/src/charting/diagrams/nesting.js +30 -0
  252. package/src/charting/diagrams/roadmap.js +77 -0
  253. package/src/charting/edgeMarkers/ArrowMarker.js +15 -0
  254. package/src/charting/edgeMarkers/CircleMarker.js +13 -0
  255. package/src/charting/edgeMarkers/CrowsFootMarker.js +16 -0
  256. package/src/charting/edgeMarkers/DiamondMarker.js +15 -0
  257. package/src/charting/edgeMarkers/EdgeMarker.js +34 -0
  258. package/src/charting/edgeMarkers/HalfArrowMarker.js +8 -0
  259. package/src/charting/edgeMarkers/HollowDiamondMarker.js +18 -0
  260. package/src/charting/edgeMarkers/HollowTriangleMarker.js +18 -0
  261. package/src/charting/edgeMarkers/OpenArrowMarker.js +17 -0
  262. package/src/charting/edgeMarkers/index.js +27 -0
  263. package/src/charting/edgeStyle/EdgeStyleCascade.js +22 -0
  264. package/src/charting/edgeStyle/EdgeStyleDialog.js +51 -0
  265. package/src/charting/edgeStyle/EdgeStyleSchema.js +43 -0
  266. package/src/charting/edgeStyle/SetStyleCommand.js +12 -0
  267. package/src/charting/edgeStyle/index.js +4 -0
  268. package/src/charting/emphasis/EmphasisRule.js +42 -0
  269. package/src/charting/emphasis/HighlightRule.js +24 -0
  270. package/src/charting/gauges/ArcTrack.js +51 -0
  271. package/src/charting/gauges/GaugeAnimation.js +51 -0
  272. package/src/charting/gauges/GaugeBands.js +48 -0
  273. package/src/charting/gauges/GaugeScale.js +87 -0
  274. package/src/charting/gauges/GaugeTrack.js +44 -0
  275. package/src/charting/gauges/GaugeValue.js +61 -0
  276. package/src/charting/gauges/HorizontalTrack.js +14 -0
  277. package/src/charting/gauges/LinearTrack.js +29 -0
  278. package/src/charting/gauges/Sparkline.js +42 -0
  279. package/src/charting/gauges/VerticalTrack.js +17 -0
  280. package/src/charting/glyphs/ArrowGlyph.js +21 -0
  281. package/src/charting/glyphs/BatteryGlyph.js +18 -0
  282. package/src/charting/glyphs/ChevronGlyph.js +18 -0
  283. package/src/charting/glyphs/CircleGlyph.js +15 -0
  284. package/src/charting/glyphs/CloudGlyph.js +19 -0
  285. package/src/charting/glyphs/ComponentGlyph.js +18 -0
  286. package/src/charting/glyphs/ConstraintGlyph.js +24 -0
  287. package/src/charting/glyphs/ContractBoxGlyph.js +10 -0
  288. package/src/charting/glyphs/CubeGlyph.js +19 -0
  289. package/src/charting/glyphs/CylinderGlyph.js +19 -0
  290. package/src/charting/glyphs/DashedDoubleArrowGlyph.js +11 -0
  291. package/src/charting/glyphs/DeviceGlyph.js +17 -0
  292. package/src/charting/glyphs/DiamondGlyph.js +17 -0
  293. package/src/charting/glyphs/DocumentGlyph.js +17 -0
  294. package/src/charting/glyphs/DoubleArrowGlyph.js +23 -0
  295. package/src/charting/glyphs/DoubleCircleGlyph.js +24 -0
  296. package/src/charting/glyphs/EllipseGlyph.js +18 -0
  297. package/src/charting/glyphs/FactoryGlyph.js +20 -0
  298. package/src/charting/glyphs/FlagGlyph.js +16 -0
  299. package/src/charting/glyphs/GapCircleGlyph.js +17 -0
  300. package/src/charting/glyphs/GearGlyph.js +37 -0
  301. package/src/charting/glyphs/Glyph.js +98 -0
  302. package/src/charting/glyphs/GroupingBoxGlyph.js +13 -0
  303. package/src/charting/glyphs/HalfCircleGlyph.js +22 -0
  304. package/src/charting/glyphs/HexagonGlyph.js +28 -0
  305. package/src/charting/glyphs/IconGlyph.js +22 -0
  306. package/src/charting/glyphs/ImageGlyph.js +16 -0
  307. package/src/charting/glyphs/JunctionGlyph.js +17 -0
  308. package/src/charting/glyphs/LollipopGlyph.js +22 -0
  309. package/src/charting/glyphs/MagnifierGlyph.js +17 -0
  310. package/src/charting/glyphs/NoteGlyph.js +33 -0
  311. package/src/charting/glyphs/ObjectBoxGlyph.js +21 -0
  312. package/src/charting/glyphs/OrJunctionGlyph.js +17 -0
  313. package/src/charting/glyphs/ParallelogramGlyph.js +20 -0
  314. package/src/charting/glyphs/PersonGlyph.js +23 -0
  315. package/src/charting/glyphs/PillGlyph.js +23 -0
  316. package/src/charting/glyphs/PinGlyph.js +18 -0
  317. package/src/charting/glyphs/PrincipleGlyph.js +23 -0
  318. package/src/charting/glyphs/ProductBoxGlyph.js +16 -0
  319. package/src/charting/glyphs/RectGlyph.js +15 -0
  320. package/src/charting/glyphs/RoundedBoxGlyph.js +13 -0
  321. package/src/charting/glyphs/StackGlyph.js +14 -0
  322. package/src/charting/glyphs/StepsGlyph.js +20 -0
  323. package/src/charting/glyphs/StickFigureGlyph.js +32 -0
  324. package/src/charting/glyphs/SystemSoftwareBoxGlyph.js +16 -0
  325. package/src/charting/glyphs/TabbedBoxGlyph.js +37 -0
  326. package/src/charting/glyphs/TargetGlyph.js +23 -0
  327. package/src/charting/glyphs/WavyBoxGlyph.js +17 -0
  328. package/src/charting/glyphs/WheelGlyph.js +28 -0
  329. package/src/charting/glyphs/drawGlyph.js +28 -0
  330. package/src/charting/glyphs/glyphSvg.js +55 -0
  331. package/src/charting/glyphs/index.js +109 -0
  332. package/src/charting/modelTree/AnalysisPanel.js +159 -0
  333. package/src/charting/modelTree/DiagramTabs.js +217 -0
  334. package/src/charting/modelTree/ModelTree.js +164 -0
  335. package/src/charting/modelTree/ModelTreePanel.js +914 -0
  336. package/src/charting/modelTree/TreeBuilder.js +238 -0
  337. package/src/charting/modelTree/TreeModeRegistry.js +51 -0
  338. package/src/charting/modelTree/TreeViewMode.js +110 -0
  339. package/src/charting/modelTree/buildFilterTrees.js +138 -0
  340. package/src/charting/modelTree/modes/FlatTreeMode.js +46 -0
  341. package/src/charting/modelTree/modes/LayerGroupedTreeMode.js +62 -0
  342. package/src/charting/modelTree/modes/TypeGroupedTreeMode.js +60 -0
  343. package/src/charting/modelTree/treeLayers.js +11 -0
  344. package/src/charting/report/reportHtml.js +82 -0
  345. package/src/charting/report/reportViewer.js +118 -0
  346. package/src/charting/shapes/CircleShape.js +19 -0
  347. package/src/charting/shapes/PathShape.js +17 -0
  348. package/src/charting/shapes/RectShape.js +20 -0
  349. package/src/charting/shapes/Shape.js +20 -0
  350. package/src/charting/shapes/ShapeFactory.js +23 -0
  351. package/src/charting/storage/LocalJsonStore.js +43 -0
  352. package/src/charting/templates/ActorTemplate.js +36 -0
  353. package/src/charting/templates/BoxTemplate.js +27 -0
  354. package/src/charting/templates/CircleTemplate.js +18 -0
  355. package/src/charting/templates/ClassTemplate.js +20 -0
  356. package/src/charting/templates/CloudTemplate.js +43 -0
  357. package/src/charting/templates/ComponentTemplate.js +19 -0
  358. package/src/charting/templates/CylinderTemplate.js +30 -0
  359. package/src/charting/templates/DataStoreTemplate.js +16 -0
  360. package/src/charting/templates/DiamondTemplate.js +10 -0
  361. package/src/charting/templates/DocumentTemplate.js +32 -0
  362. package/src/charting/templates/EllipseTemplate.js +15 -0
  363. package/src/charting/templates/FinalStateTemplate.js +12 -0
  364. package/src/charting/templates/GlyphTemplate.js +47 -0
  365. package/src/charting/templates/HexagonTemplate.js +17 -0
  366. package/src/charting/templates/LifelineTemplate.js +20 -0
  367. package/src/charting/templates/ManualInputTemplate.js +12 -0
  368. package/src/charting/templates/NoteTemplate.js +23 -0
  369. package/src/charting/templates/OctagonTemplate.js +7 -0
  370. package/src/charting/templates/PackageTemplate.js +25 -0
  371. package/src/charting/templates/ParallelogramTemplate.js +11 -0
  372. package/src/charting/templates/PentagonTemplate.js +5 -0
  373. package/src/charting/templates/PolygonTemplate.js +18 -0
  374. package/src/charting/templates/PredefinedProcessTemplate.js +13 -0
  375. package/src/charting/templates/RectangleTemplate.js +28 -0
  376. package/src/charting/templates/RegularPolygonTemplate.js +21 -0
  377. package/src/charting/templates/RoundedRectangleTemplate.js +5 -0
  378. package/src/charting/templates/StadiumTemplate.js +8 -0
  379. package/src/charting/templates/StarTemplate.js +17 -0
  380. package/src/charting/templates/SwimlaneTemplate.js +18 -0
  381. package/src/charting/templates/Template.js +208 -0
  382. package/src/charting/templates/TrapezoidTemplate.js +11 -0
  383. package/src/charting/templates/TriangleTemplate.js +12 -0
  384. package/src/charting/templates/index.js +31 -0
  385. package/src/charting/templates/outline.js +59 -0
  386. package/src/charting/templates/svg.js +19 -0
  387. package/src/charting/textToShapes.js +61 -0
  388. package/src/charting/toolbar/ToolbarButton.js +38 -0
  389. package/src/charting/toolbar/ToolbarCheckbox.js +31 -0
  390. package/src/charting/toolbar/ToolbarItem.js +19 -0
  391. package/src/charting/toolbar/ToolbarMenu.js +36 -0
  392. package/src/charting/toolbar/ToolbarSelect.js +38 -0
  393. package/src/charting/toolbar/ToolbarSeparator.js +7 -0
  394. package/src/charting/toolbar/ToolbarText.js +22 -0
  395. package/src/charting/toolbar/index.js +8 -0
  396. package/src/charting/toolbar/pickFile.js +14 -0
  397. package/src/charting/viewDecorations.js +85 -0
  398. package/src/charting/zOrder.js +57 -0
  399. package/src/csvTable.js +61 -0
  400. package/src/datamodel.js +122 -0
  401. package/src/datawindow/BoundedWindow.js +36 -0
  402. package/src/datawindow/FlatDataWindow.js +34 -0
  403. package/src/datawindow/GraphDataWindow.js +40 -0
  404. package/src/datawindow/GroupedSampleDataWindow.js +16 -0
  405. package/src/datawindow/SeriesDataWindow.js +42 -0
  406. package/src/datawindow/index.js +31 -0
  407. package/src/diagramCatalog.js +30 -0
  408. package/src/ebnfDiagram.js +57 -0
  409. package/src/ebnfParser.js +129 -0
  410. package/src/exportImage.js +233 -0
  411. package/src/index.js +2636 -0
  412. package/src/itIcons.js +84 -0
  413. package/src/kernelExpr.js +243 -0
  414. package/src/propertiesDialog.js +463 -0
  415. package/src/railroadDiagram.js +571 -0
  416. package/src/treeModeCatalog.js +16 -0
  417. package/src/workspace/ContextBus.js +79 -0
  418. package/src/workspace/EditorShell.js +67 -0
  419. package/src/workspace/Part.js +163 -0
  420. package/src/workspace/PartFactory.js +49 -0
  421. package/src/workspace/PartRegistry.js +86 -0
  422. package/src/workspace/Workspace.js +321 -0
  423. package/src/workspace/archimateServices.js +33 -0
  424. package/src/workspace/dom.js +120 -0
  425. package/src/workspace/index.js +75 -0
  426. package/src/workspace/layout/GridNode.js +280 -0
  427. package/src/workspace/layout/LayoutNode.js +89 -0
  428. package/src/workspace/layout/PartNode.js +77 -0
  429. package/src/workspace/layout/SplitNode.js +114 -0
  430. package/src/workspace/layout/TabsNode.js +191 -0
  431. package/src/workspace/layout/index.js +24 -0
  432. package/src/workspace/parts/AdapterPart.js +33 -0
  433. package/src/workspace/parts/ArchimateCanvasPart.js +345 -0
  434. package/src/workspace/parts/ArchimateEditorPart.js +79 -0
  435. package/src/workspace/parts/ChartPart.js +115 -0
  436. package/src/workspace/parts/ContentPart.js +34 -0
  437. package/src/workspace/parts/DetailPart.js +46 -0
  438. package/src/workspace/parts/DiagramEditorPart.js +135 -0
  439. package/src/workspace/parts/EditorPart.js +388 -0
  440. package/src/workspace/parts/HtmlPart.js +25 -0
  441. package/src/workspace/parts/ListPart.js +57 -0
  442. package/src/workspace/parts/ModelFile.js +187 -0
  443. package/src/workspace/parts/ModelsPart.js +135 -0
  444. package/src/workspace/styles.js +258 -0
  445. package/src/workspace/themes.js +96 -0
  446. package/src/workspace/workArea.js +413 -0
  447. package/src/workspace/workAreaModel.js +197 -0
  448. package/src/workspace.js +16 -0
  449. package/src/zip/ZipArchive.js +160 -0
  450. package/src/zip/crc32.js +25 -0
  451. package/src/zip/inflate.js +159 -0
@@ -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
+ }