@doenet/doenetml 0.6.0-alpha1

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 (549) hide show
  1. package/.prettierrc +3 -0
  2. package/LICENSE +661 -0
  3. package/README.md +146 -0
  4. package/cypress/e2e/ActivityViewer/activityVariants.cy.js +1770 -0
  5. package/cypress/e2e/ActivityViewer/compiledActivity.cy.js +83 -0
  6. package/cypress/e2e/ActivityViewer/relationshipsAmongPages.cy.js +697 -0
  7. package/cypress/e2e/answerValidation/errorinnumbers.cy.js +2125 -0
  8. package/cypress/e2e/answerValidation/factoring.cy.js +1945 -0
  9. package/cypress/e2e/answerValidation/factoringOldAlgorithm.cy.js +892 -0
  10. package/cypress/e2e/answerValidation/functionanswers.cy.js +314 -0
  11. package/cypress/e2e/answerValidation/matchingpatterns.cy.js +287 -0
  12. package/cypress/e2e/answerValidation/matchpartial.cy.js +6711 -0
  13. package/cypress/e2e/answerValidation/pointlocation.cy.js +3989 -0
  14. package/cypress/e2e/answerValidation/symbolicequality.cy.js +1893 -0
  15. package/cypress/e2e/answerValidation/videoProgress.cy.js +210 -0
  16. package/cypress/e2e/assignNames/basiccopy.cy.js +2376 -0
  17. package/cypress/e2e/assignNames/collections.cy.js +9247 -0
  18. package/cypress/e2e/assignNames/selects.cy.js +105 -0
  19. package/cypress/e2e/assignNames/sequences.cy.js +1964 -0
  20. package/cypress/e2e/baseComponent/basecomponentproperties.cy.js +999 -0
  21. package/cypress/e2e/baseComponent/doenetMLtext.cy.js +427 -0
  22. package/cypress/e2e/chemistry/atom.cy.js +201 -0
  23. package/cypress/e2e/chemistry/ion.cy.js +608 -0
  24. package/cypress/e2e/chemistry/ioniccompound.cy.js +133 -0
  25. package/cypress/e2e/dynamicalsystem/cobwebpolyline.cy.js +2653 -0
  26. package/cypress/e2e/dynamicalsystem/equilibriumcurve.cy.js +311 -0
  27. package/cypress/e2e/dynamicalsystem/equilibriumline.cy.js +279 -0
  28. package/cypress/e2e/dynamicalsystem/equilibriumpoint.cy.js +283 -0
  29. package/cypress/e2e/dynamicalsystem/odesystem.cy.js +1834 -0
  30. package/cypress/e2e/equality/mathexpressions.cy.js +948 -0
  31. package/cypress/e2e/graphing/graphreferences.cy.js +978 -0
  32. package/cypress/e2e/graphing/graphreferences2.cy.js +615 -0
  33. package/cypress/e2e/linearAlgebra/eigenDecomposition.cy.js +401 -0
  34. package/cypress/e2e/tagSpecific/angle.cy.js +3898 -0
  35. package/cypress/e2e/tagSpecific/animatefromsequence.cy.js +2306 -0
  36. package/cypress/e2e/tagSpecific/answer.cy.js +31647 -0
  37. package/cypress/e2e/tagSpecific/bestfitline.cy.js +612 -0
  38. package/cypress/e2e/tagSpecific/blockquote.cy.js +30 -0
  39. package/cypress/e2e/tagSpecific/boolean.cy.js +742 -0
  40. package/cypress/e2e/tagSpecific/booleaninput.cy.js +1283 -0
  41. package/cypress/e2e/tagSpecific/booleanlist.cy.js +588 -0
  42. package/cypress/e2e/tagSpecific/booleanoperators.cy.js +596 -0
  43. package/cypress/e2e/tagSpecific/booleanoperatorsonmath.cy.js +498 -0
  44. package/cypress/e2e/tagSpecific/callaction.cy.js +2835 -0
  45. package/cypress/e2e/tagSpecific/choiceinput.cy.js +3205 -0
  46. package/cypress/e2e/tagSpecific/circle.cy.js +22036 -0
  47. package/cypress/e2e/tagSpecific/codeeditor.cy.js +1995 -0
  48. package/cypress/e2e/tagSpecific/collect.cy.js +5035 -0
  49. package/cypress/e2e/tagSpecific/componentsize.cy.js +502 -0
  50. package/cypress/e2e/tagSpecific/conditionalcontent.cy.js +3495 -0
  51. package/cypress/e2e/tagSpecific/contentBrowser.cy.js +335 -0
  52. package/cypress/e2e/tagSpecific/contentpicker.cy.js +261 -0
  53. package/cypress/e2e/tagSpecific/copy.cy.js +12627 -0
  54. package/cypress/e2e/tagSpecific/copy2.cy.js +5698 -0
  55. package/cypress/e2e/tagSpecific/curve.bezier.cy.js +12440 -0
  56. package/cypress/e2e/tagSpecific/curve.cy.js +1716 -0
  57. package/cypress/e2e/tagSpecific/curve.function.cy.js +1471 -0
  58. package/cypress/e2e/tagSpecific/curve.parametrized.cy.js +920 -0
  59. package/cypress/e2e/tagSpecific/document.cy.js +234 -0
  60. package/cypress/e2e/tagSpecific/endpoint.cy.js +197 -0
  61. package/cypress/e2e/tagSpecific/evaluate.cy.js +8895 -0
  62. package/cypress/e2e/tagSpecific/extract.cy.js +2282 -0
  63. package/cypress/e2e/tagSpecific/feedback.cy.js +2941 -0
  64. package/cypress/e2e/tagSpecific/function.cy.js +9450 -0
  65. package/cypress/e2e/tagSpecific/functioniterates.cy.js +1178 -0
  66. package/cypress/e2e/tagSpecific/functionoperators.cy.js +4047 -0
  67. package/cypress/e2e/tagSpecific/graph.cy.js +2491 -0
  68. package/cypress/e2e/tagSpecific/group.cy.js +683 -0
  69. package/cypress/e2e/tagSpecific/hint.cy.js +204 -0
  70. package/cypress/e2e/tagSpecific/image.cy.js +770 -0
  71. package/cypress/e2e/tagSpecific/integer.cy.js +206 -0
  72. package/cypress/e2e/tagSpecific/label.cy.js +800 -0
  73. package/cypress/e2e/tagSpecific/legend.cy.js +1001 -0
  74. package/cypress/e2e/tagSpecific/line.cy.js +12167 -0
  75. package/cypress/e2e/tagSpecific/linesegment.cy.js +4749 -0
  76. package/cypress/e2e/tagSpecific/lorem.cy.js +289 -0
  77. package/cypress/e2e/tagSpecific/map.cy.js +4476 -0
  78. package/cypress/e2e/tagSpecific/matchespattern.cy.js +693 -0
  79. package/cypress/e2e/tagSpecific/math.cy.js +10990 -0
  80. package/cypress/e2e/tagSpecific/mathdisplay.cy.js +2689 -0
  81. package/cypress/e2e/tagSpecific/mathinput.cy.js +15628 -0
  82. package/cypress/e2e/tagSpecific/mathinputgraph.cy.js +566 -0
  83. package/cypress/e2e/tagSpecific/mathlist.cy.js +4073 -0
  84. package/cypress/e2e/tagSpecific/mathoperators.cy.js +13851 -0
  85. package/cypress/e2e/tagSpecific/matrix.cy.js +8825 -0
  86. package/cypress/e2e/tagSpecific/matrixinput.cy.js +16277 -0
  87. package/cypress/e2e/tagSpecific/module.cy.js +1771 -0
  88. package/cypress/e2e/tagSpecific/number.cy.js +2221 -0
  89. package/cypress/e2e/tagSpecific/numberlist.cy.js +1285 -0
  90. package/cypress/e2e/tagSpecific/p.cy.js +72 -0
  91. package/cypress/e2e/tagSpecific/paginator.cy.js +2983 -0
  92. package/cypress/e2e/tagSpecific/parabola.cy.js +14331 -0
  93. package/cypress/e2e/tagSpecific/paragraphmarkup.cy.js +104 -0
  94. package/cypress/e2e/tagSpecific/periodicset.cy.js +1439 -0
  95. package/cypress/e2e/tagSpecific/piecewisefunction.cy.js +1055 -0
  96. package/cypress/e2e/tagSpecific/pluralize.cy.js +274 -0
  97. package/cypress/e2e/tagSpecific/point.cy.js +8895 -0
  98. package/cypress/e2e/tagSpecific/point2.cy.js +10259 -0
  99. package/cypress/e2e/tagSpecific/polygon.cy.js +5039 -0
  100. package/cypress/e2e/tagSpecific/polyline.cy.js +4704 -0
  101. package/cypress/e2e/tagSpecific/problem.cy.js +2768 -0
  102. package/cypress/e2e/tagSpecific/ray.cy.js +10770 -0
  103. package/cypress/e2e/tagSpecific/rectangle.cy.js +2143 -0
  104. package/cypress/e2e/tagSpecific/ref.cy.js +420 -0
  105. package/cypress/e2e/tagSpecific/regularPolygon.cy.js +1006 -0
  106. package/cypress/e2e/tagSpecific/regularPolygon2.cy.js +100 -0
  107. package/cypress/e2e/tagSpecific/regularPolygon3.cy.js +777 -0
  108. package/cypress/e2e/tagSpecific/samplerandomnumbers.cy.js +3619 -0
  109. package/cypress/e2e/tagSpecific/sectioning.cy.js +3530 -0
  110. package/cypress/e2e/tagSpecific/select.cy.js +5376 -0
  111. package/cypress/e2e/tagSpecific/selectfromsequence.cy.js +3846 -0
  112. package/cypress/e2e/tagSpecific/selectrandomnumbers.cy.js +2914 -0
  113. package/cypress/e2e/tagSpecific/sequence.cy.js +2093 -0
  114. package/cypress/e2e/tagSpecific/shuffle.cy.js +490 -0
  115. package/cypress/e2e/tagSpecific/sidebyside.cy.js +8057 -0
  116. package/cypress/e2e/tagSpecific/singlecharactercomponents.cy.js +72 -0
  117. package/cypress/e2e/tagSpecific/slider.cy.js +914 -0
  118. package/cypress/e2e/tagSpecific/solution.cy.js +109 -0
  119. package/cypress/e2e/tagSpecific/solveequations.cy.js +1026 -0
  120. package/cypress/e2e/tagSpecific/sort.cy.js +1685 -0
  121. package/cypress/e2e/tagSpecific/spreadsheet.cy.js +5971 -0
  122. package/cypress/e2e/tagSpecific/subsetofreals.cy.js +2725 -0
  123. package/cypress/e2e/tagSpecific/substitute.cy.js +2646 -0
  124. package/cypress/e2e/tagSpecific/tabular.cy.js +36 -0
  125. package/cypress/e2e/tagSpecific/text.cy.js +975 -0
  126. package/cypress/e2e/tagSpecific/textinput.cy.js +2177 -0
  127. package/cypress/e2e/tagSpecific/textlist.cy.js +369 -0
  128. package/cypress/e2e/tagSpecific/triangle.cy.js +1936 -0
  129. package/cypress/e2e/tagSpecific/triggerset.cy.js +2023 -0
  130. package/cypress/e2e/tagSpecific/updatevalue.cy.js +3288 -0
  131. package/cypress/e2e/tagSpecific/vector.cy.js +20183 -0
  132. package/cypress/e2e/tagSpecific/video.cy.js +612 -0
  133. package/cypress/e2e/tagSpecific/when.cy.js +202 -0
  134. package/cypress/e2e/variants/specifysinglevariant.cy.js +6726 -0
  135. package/cypress/e2e/variants/uniquevariants.cy.js +4846 -0
  136. package/cypress/fixtures/example.json +5 -0
  137. package/cypress/support/commands.js +32 -0
  138. package/cypress/support/e2e.js +31 -0
  139. package/cypress.config.js +18 -0
  140. package/docs/codeSnippet.jsx +11 -0
  141. package/docs/index.html +133 -0
  142. package/docs/index.jsx +138 -0
  143. package/docs/prism.css +3 -0
  144. package/index.html +14 -0
  145. package/index.js +21 -0
  146. package/media/answer_example.png +0 -0
  147. package/media/graph_example.png +0 -0
  148. package/media/graph_markup_example.png +0 -0
  149. package/package.json +83 -0
  150. package/public/favicon.ico +0 -0
  151. package/public/fonts/files/open-sans-v18-latin-700.woff +0 -0
  152. package/public/fonts/files/open-sans-v18-latin-700.woff2 +0 -0
  153. package/public/fonts/files/open-sans-v18-latin-700italic.woff +0 -0
  154. package/public/fonts/files/open-sans-v18-latin-700italic.woff2 +0 -0
  155. package/public/fonts/files/open-sans-v18-latin-italic.woff +0 -0
  156. package/public/fonts/files/open-sans-v18-latin-italic.woff2 +0 -0
  157. package/public/fonts/files/open-sans-v18-latin-light-italic.woff +0 -0
  158. package/public/fonts/files/open-sans-v18-latin-light-italic.woff2 +0 -0
  159. package/public/fonts/files/open-sans-v18-latin-light.woff +0 -0
  160. package/public/fonts/files/open-sans-v18-latin-light.woff2 +0 -0
  161. package/public/fonts/files/open-sans-v18-latin-regular.woff +0 -0
  162. package/public/fonts/files/open-sans-v18-latin-regular.woff2 +0 -0
  163. package/src/Core/ComponentTypes.js +426 -0
  164. package/src/Core/Core.js +11852 -0
  165. package/src/Core/CoreWorker.js +127 -0
  166. package/src/Core/Dependencies.js +8226 -0
  167. package/src/Core/Numerics.js +473 -0
  168. package/src/Core/ParameterStack.js +36 -0
  169. package/src/Core/ReadOnlyProxyHandler.js +41 -0
  170. package/src/Core/StateProxyHandler.js +88 -0
  171. package/src/Core/components/Aliases.js +67 -0
  172. package/src/Core/components/Angle.js +758 -0
  173. package/src/Core/components/AnimateFromSequence.js +922 -0
  174. package/src/Core/components/Answer.js +2087 -0
  175. package/src/Core/components/AsList.js +83 -0
  176. package/src/Core/components/AttractTo.js +245 -0
  177. package/src/Core/components/AttractToAngles.js +262 -0
  178. package/src/Core/components/AttractToConstraint.js +104 -0
  179. package/src/Core/components/AttractToGrid.js +315 -0
  180. package/src/Core/components/Award.js +906 -0
  181. package/src/Core/components/BestFitLine.js +318 -0
  182. package/src/Core/components/BezierControls.js +719 -0
  183. package/src/Core/components/BlockQuote.js +35 -0
  184. package/src/Core/components/Boolean.js +500 -0
  185. package/src/Core/components/BooleanInput.js +330 -0
  186. package/src/Core/components/BooleanList.js +396 -0
  187. package/src/Core/components/BooleanOperators.js +35 -0
  188. package/src/Core/components/BooleanOperatorsOfMath.js +148 -0
  189. package/src/Core/components/CallAction.js +261 -0
  190. package/src/Core/components/Caption.js +73 -0
  191. package/src/Core/components/Case.js +56 -0
  192. package/src/Core/components/Cell.js +439 -0
  193. package/src/Core/components/CellBlock.js +64 -0
  194. package/src/Core/components/Chart.js +795 -0
  195. package/src/Core/components/Choice.js +266 -0
  196. package/src/Core/components/ChoiceInput.js +1407 -0
  197. package/src/Core/components/Circle.js +2884 -0
  198. package/src/Core/components/CodeEditor.js +647 -0
  199. package/src/Core/components/CodeViewer.js +294 -0
  200. package/src/Core/components/CollaborateGroupSetup.js +46 -0
  201. package/src/Core/components/CollaborateGroups.js +119 -0
  202. package/src/Core/components/Collect.js +850 -0
  203. package/src/Core/components/Column.js +608 -0
  204. package/src/Core/components/ConditionalContent.js +468 -0
  205. package/src/Core/components/ConsiderAsResponses.js +49 -0
  206. package/src/Core/components/ConstrainTo.js +161 -0
  207. package/src/Core/components/ConstrainToAngles.js +244 -0
  208. package/src/Core/components/ConstrainToGraph.js +142 -0
  209. package/src/Core/components/ConstrainToGrid.js +175 -0
  210. package/src/Core/components/ConstraintUnion.js +119 -0
  211. package/src/Core/components/Constraints.js +497 -0
  212. package/src/Core/components/ContentBrowser.js +441 -0
  213. package/src/Core/components/ContentPicker.js +263 -0
  214. package/src/Core/components/ControlVectors.js +25 -0
  215. package/src/Core/components/Coords.js +63 -0
  216. package/src/Core/components/Copy.js +3412 -0
  217. package/src/Core/components/Curve.js +4130 -0
  218. package/src/Core/components/CustomAttribute.js +175 -0
  219. package/src/Core/components/DataFrame.js +357 -0
  220. package/src/Core/components/DiscreteSimulationResultList.js +342 -0
  221. package/src/Core/components/DiscreteSimulationResultPolyline.js +581 -0
  222. package/src/Core/components/Divisions.js +55 -0
  223. package/src/Core/components/Document.js +888 -0
  224. package/src/Core/components/Embed.js +65 -0
  225. package/src/Core/components/Endpoint.js +62 -0
  226. package/src/Core/components/Evaluate.js +321 -0
  227. package/src/Core/components/Extract.js +656 -0
  228. package/src/Core/components/Extrema.js +556 -0
  229. package/src/Core/components/Feedback.js +200 -0
  230. package/src/Core/components/FeedbackDefinitions.js +97 -0
  231. package/src/Core/components/Figure.js +148 -0
  232. package/src/Core/components/Footnote.js +73 -0
  233. package/src/Core/components/Function.js +5344 -0
  234. package/src/Core/components/FunctionIterates.js +306 -0
  235. package/src/Core/components/FunctionOperators.js +702 -0
  236. package/src/Core/components/Graph.js +1679 -0
  237. package/src/Core/components/Group.js +7 -0
  238. package/src/Core/components/HasSameFactoring.js +407 -0
  239. package/src/Core/components/Hint.js +241 -0
  240. package/src/Core/components/Image.js +524 -0
  241. package/src/Core/components/Indexing.js +79 -0
  242. package/src/Core/components/IntComma.js +64 -0
  243. package/src/Core/components/Integer.js +81 -0
  244. package/src/Core/components/Intersection.js +328 -0
  245. package/src/Core/components/Interval.js +29 -0
  246. package/src/Core/components/Label.js +492 -0
  247. package/src/Core/components/Latex.js +104 -0
  248. package/src/Core/components/Legend.js +329 -0
  249. package/src/Core/components/Line.js +2040 -0
  250. package/src/Core/components/LineSegment.js +882 -0
  251. package/src/Core/components/Lists.js +180 -0
  252. package/src/Core/components/Lorem.js +249 -0
  253. package/src/Core/components/MMeMen.js +377 -0
  254. package/src/Core/components/Map.js +873 -0
  255. package/src/Core/components/Markers.js +101 -0
  256. package/src/Core/components/MatchesPattern.js +339 -0
  257. package/src/Core/components/Math.js +2552 -0
  258. package/src/Core/components/MathInput.js +948 -0
  259. package/src/Core/components/MathList.js +828 -0
  260. package/src/Core/components/MathOperators.js +1286 -0
  261. package/src/Core/components/Matrix.js +497 -0
  262. package/src/Core/components/MatrixInput.js +3157 -0
  263. package/src/Core/components/MdMdnMrow.js +394 -0
  264. package/src/Core/components/Module.js +16 -0
  265. package/src/Core/components/Number.js +1031 -0
  266. package/src/Core/components/NumberList.js +550 -0
  267. package/src/Core/components/Option.js +24 -0
  268. package/src/Core/components/P.js +71 -0
  269. package/src/Core/components/Paginator.js +338 -0
  270. package/src/Core/components/Panel.js +126 -0
  271. package/src/Core/components/Parabola.js +1561 -0
  272. package/src/Core/components/ParagraphMarkup.js +59 -0
  273. package/src/Core/components/Pegboard.js +43 -0
  274. package/src/Core/components/PeriodicSet.js +291 -0
  275. package/src/Core/components/PiecewiseFunction.js +832 -0
  276. package/src/Core/components/Pluralize.js +198 -0
  277. package/src/Core/components/Point.js +1295 -0
  278. package/src/Core/components/Polygon.js +408 -0
  279. package/src/Core/components/Polyline.js +841 -0
  280. package/src/Core/components/RandomizedTextList.js +225 -0
  281. package/src/Core/components/Ray.js +1737 -0
  282. package/src/Core/components/Rectangle.js +1535 -0
  283. package/src/Core/components/Ref.js +350 -0
  284. package/src/Core/components/RegionBetweenCurveXAxis.js +124 -0
  285. package/src/Core/components/RegionHalfPlane.js +107 -0
  286. package/src/Core/components/RegularPolygon.js +2118 -0
  287. package/src/Core/components/RenderDoenetML.js +181 -0
  288. package/src/Core/components/Row.js +780 -0
  289. package/src/Core/components/SampleRandomNumbers.js +653 -0
  290. package/src/Core/components/Sectioning.js +303 -0
  291. package/src/Core/components/Select.js +947 -0
  292. package/src/Core/components/SelectFromSequence.js +1242 -0
  293. package/src/Core/components/SelectRandomNumbers.js +225 -0
  294. package/src/Core/components/Sequence.js +444 -0
  295. package/src/Core/components/Setup.js +53 -0
  296. package/src/Core/components/Shuffle.js +470 -0
  297. package/src/Core/components/SideBySide.js +2130 -0
  298. package/src/Core/components/SingleCharacterComponents.js +41 -0
  299. package/src/Core/components/Slider.js +819 -0
  300. package/src/Core/components/SolutionContainer.js +67 -0
  301. package/src/Core/components/Solutions.js +334 -0
  302. package/src/Core/components/SolveEquations.js +568 -0
  303. package/src/Core/components/Sort.js +398 -0
  304. package/src/Core/components/Sources.js +108 -0
  305. package/src/Core/components/Split.js +205 -0
  306. package/src/Core/components/Spreadsheet.js +1507 -0
  307. package/src/Core/components/StyleDefinitions.js +111 -0
  308. package/src/Core/components/SubsetOfReals.js +348 -0
  309. package/src/Core/components/SubsetOfRealsInput.js +1474 -0
  310. package/src/Core/components/Substitute.js +496 -0
  311. package/src/Core/components/SummaryStatistics.js +652 -0
  312. package/src/Core/components/Table.js +145 -0
  313. package/src/Core/components/Tabular.js +384 -0
  314. package/src/Core/components/Template.js +360 -0
  315. package/src/Core/components/Text.js +341 -0
  316. package/src/Core/components/TextInput.js +566 -0
  317. package/src/Core/components/TextList.js +442 -0
  318. package/src/Core/components/TextListFromString.js +137 -0
  319. package/src/Core/components/TextOperatorsOfMath.js +21 -0
  320. package/src/Core/components/Triangle.js +280 -0
  321. package/src/Core/components/TriggerSet.js +189 -0
  322. package/src/Core/components/TupleList.js +43 -0
  323. package/src/Core/components/UpdateValue.js +435 -0
  324. package/src/Core/components/VariantControl.js +36 -0
  325. package/src/Core/components/Vector.js +2478 -0
  326. package/src/Core/components/Verbatim.js +125 -0
  327. package/src/Core/components/Video.js +673 -0
  328. package/src/Core/components/When.js +198 -0
  329. package/src/Core/components/abstract/AngleListComponent.js +140 -0
  330. package/src/Core/components/abstract/BaseComponent.js +1496 -0
  331. package/src/Core/components/abstract/BlockComponent.js +5 -0
  332. package/src/Core/components/abstract/BooleanBaseOperator.js +88 -0
  333. package/src/Core/components/abstract/BooleanBaseOperatorOfMath.js +100 -0
  334. package/src/Core/components/abstract/BooleanBaseOperatorOneInput.js +44 -0
  335. package/src/Core/components/abstract/ComponentSize.js +789 -0
  336. package/src/Core/components/abstract/ComponentWithSelectableType.js +537 -0
  337. package/src/Core/components/abstract/CompositeComponent.js +142 -0
  338. package/src/Core/components/abstract/ConstraintComponent.js +19 -0
  339. package/src/Core/components/abstract/FunctionBaseOperator.js +680 -0
  340. package/src/Core/components/abstract/GraphicalComponent.js +56 -0
  341. package/src/Core/components/abstract/InlineComponent.js +5 -0
  342. package/src/Core/components/abstract/InlineRenderInlineChildren.js +63 -0
  343. package/src/Core/components/abstract/Input.js +192 -0
  344. package/src/Core/components/abstract/IntervalListComponent.js +218 -0
  345. package/src/Core/components/abstract/LineListComponent.js +114 -0
  346. package/src/Core/components/abstract/MathBaseOperator.js +631 -0
  347. package/src/Core/components/abstract/MathBaseOperatorOneInput.js +112 -0
  348. package/src/Core/components/abstract/PointListComponent.js +238 -0
  349. package/src/Core/components/abstract/SectioningComponent.js +1262 -0
  350. package/src/Core/components/abstract/SingleCharacterInline.js +23 -0
  351. package/src/Core/components/abstract/TextBaseOperatorOfMath.js +47 -0
  352. package/src/Core/components/abstract/TextOrInline.js +66 -0
  353. package/src/Core/components/abstract/VariableName.js +31 -0
  354. package/src/Core/components/abstract/VariableNameList.js +83 -0
  355. package/src/Core/components/abstract/VectorListComponent.js +235 -0
  356. package/src/Core/components/chemistry/Atom.js +910 -0
  357. package/src/Core/components/chemistry/ElectronConfiguration.js +36 -0
  358. package/src/Core/components/chemistry/Ion.js +684 -0
  359. package/src/Core/components/chemistry/IonicCompound.js +189 -0
  360. package/src/Core/components/chemistry/OrbitalDiagram.js +175 -0
  361. package/src/Core/components/chemistry/OrbitalDiagramInput.js +753 -0
  362. package/src/Core/components/chemistry/index.js +6 -0
  363. package/src/Core/components/commonsugar/breakstrings.js +627 -0
  364. package/src/Core/components/commonsugar/lists.js +177 -0
  365. package/src/Core/components/dynamicalSystems/CobwebPolyline.js +913 -0
  366. package/src/Core/components/dynamicalSystems/EquilibriumCurve.js +95 -0
  367. package/src/Core/components/dynamicalSystems/EquilibriumLine.js +93 -0
  368. package/src/Core/components/dynamicalSystems/EquilibriumPoint.js +93 -0
  369. package/src/Core/components/dynamicalSystems/ODESystem.js +943 -0
  370. package/src/Core/components/dynamicalSystems/index.js +5 -0
  371. package/src/Core/components/linearAlgebra/EigenDecomposition.js +294 -0
  372. package/src/Core/utils/array.js +30 -0
  373. package/src/Core/utils/booleanLogic.js +965 -0
  374. package/src/Core/utils/checkEquality.js +818 -0
  375. package/src/Core/utils/cid.js +29 -0
  376. package/src/Core/utils/componentInfoObjects.js +100 -0
  377. package/src/Core/utils/constraints.js +23 -0
  378. package/src/Core/utils/copy.js +572 -0
  379. package/src/Core/utils/deepFunctions.js +173 -0
  380. package/src/Core/utils/descendants.js +252 -0
  381. package/src/Core/utils/enumeration.js +234 -0
  382. package/src/Core/utils/feedback.js +84 -0
  383. package/src/Core/utils/function.js +1343 -0
  384. package/src/Core/utils/graphical.js +196 -0
  385. package/src/Core/utils/label.js +396 -0
  386. package/src/Core/utils/math.js +1056 -0
  387. package/src/Core/utils/naming.js +45 -0
  388. package/src/Core/utils/periodicSetEquality.js +403 -0
  389. package/src/Core/utils/randomNumbers.js +70 -0
  390. package/src/Core/utils/retrieveMedia.js +98 -0
  391. package/src/Core/utils/retrieveTextFile.js +140 -0
  392. package/src/Core/utils/returnAllPossibleVariants.js +73 -0
  393. package/src/Core/utils/rounding.js +316 -0
  394. package/src/Core/utils/sequence.js +754 -0
  395. package/src/Core/utils/serializedStateProcessing.js +4049 -0
  396. package/src/Core/utils/size.js +22 -0
  397. package/src/Core/utils/stateVariables.js +138 -0
  398. package/src/Core/utils/style.js +535 -0
  399. package/src/Core/utils/subset-of-reals.js +796 -0
  400. package/src/Core/utils/table.js +41 -0
  401. package/src/Core/utils/text.js +16 -0
  402. package/src/Core/utils/triggering.js +167 -0
  403. package/src/Core/utils/variants.js +477 -0
  404. package/src/DoenetML.css +308 -0
  405. package/src/DoenetML.jsx +201 -0
  406. package/src/Parser/doenet.grammar +90 -0
  407. package/src/Parser/doenet.js +33 -0
  408. package/src/Parser/doenet.terms.js +20 -0
  409. package/src/Parser/parser.js +266 -0
  410. package/src/Parser/tokens.js +129 -0
  411. package/src/Tools/CodeMirror.jsx +440 -0
  412. package/src/Tools/DarkmodeController.jsx +21 -0
  413. package/src/Tools/Footers/MathInputSelector.jsx +34 -0
  414. package/src/Tools/Footers/VirtualKeyboard.jsx +751 -0
  415. package/src/Tools/cypressTest/CypressTest.jsx +341 -0
  416. package/src/Tools/cypressTest/index.html +102 -0
  417. package/src/Tools/cypressTest/index.jsx +40 -0
  418. package/src/Viewer/ActivityViewer.jsx +1461 -0
  419. package/src/Viewer/PageViewer.jsx +1329 -0
  420. package/src/Viewer/renderers/alert.jsx +17 -0
  421. package/src/Viewer/renderers/angle.jsx +209 -0
  422. package/src/Viewer/renderers/answer.jsx +206 -0
  423. package/src/Viewer/renderers/asList.jsx +25 -0
  424. package/src/Viewer/renderers/blockQuote.jsx +41 -0
  425. package/src/Viewer/renderers/boolean.jsx +17 -0
  426. package/src/Viewer/renderers/booleanInput.css +105 -0
  427. package/src/Viewer/renderers/booleanInput.jsx +636 -0
  428. package/src/Viewer/renderers/button.jsx +369 -0
  429. package/src/Viewer/renderers/c.jsx +17 -0
  430. package/src/Viewer/renderers/callAction.jsx +18 -0
  431. package/src/Viewer/renderers/cell.jsx +59 -0
  432. package/src/Viewer/renderers/chart.jsx +83 -0
  433. package/src/Viewer/renderers/choiceInput.css +223 -0
  434. package/src/Viewer/renderers/choiceInput.jsx +535 -0
  435. package/src/Viewer/renderers/circle.jsx +990 -0
  436. package/src/Viewer/renderers/cobwebPolyline.jsx +442 -0
  437. package/src/Viewer/renderers/codeEditor.jsx +248 -0
  438. package/src/Viewer/renderers/codeViewer.jsx +105 -0
  439. package/src/Viewer/renderers/containerBlock.jsx +41 -0
  440. package/src/Viewer/renderers/containerInline.jsx +17 -0
  441. package/src/Viewer/renderers/contentBrowser.jsx +159 -0
  442. package/src/Viewer/renderers/contentPicker.jsx +160 -0
  443. package/src/Viewer/renderers/curve.jsx +1072 -0
  444. package/src/Viewer/renderers/ellipsis.jsx +17 -0
  445. package/src/Viewer/renderers/em.jsx +17 -0
  446. package/src/Viewer/renderers/embed.jsx +110 -0
  447. package/src/Viewer/renderers/feedback.jsx +74 -0
  448. package/src/Viewer/renderers/figure.jsx +131 -0
  449. package/src/Viewer/renderers/footnote.jsx +52 -0
  450. package/src/Viewer/renderers/graph.jsx +925 -0
  451. package/src/Viewer/renderers/hint.jsx +142 -0
  452. package/src/Viewer/renderers/image.jsx +581 -0
  453. package/src/Viewer/renderers/jsxgraph-distrib/jsxgraphcore.mjs +2 -0
  454. package/src/Viewer/renderers/jsxgraph-distrib/jsxgraphcore.mjs.map +1 -0
  455. package/src/Viewer/renderers/label.jsx +470 -0
  456. package/src/Viewer/renderers/legend.jsx +306 -0
  457. package/src/Viewer/renderers/line.jsx +511 -0
  458. package/src/Viewer/renderers/lineSegment.jsx +754 -0
  459. package/src/Viewer/renderers/list.jsx +111 -0
  460. package/src/Viewer/renderers/lq.jsx +12 -0
  461. package/src/Viewer/renderers/lsq.jsx +12 -0
  462. package/src/Viewer/renderers/math.jsx +582 -0
  463. package/src/Viewer/renderers/mathInput.css +10 -0
  464. package/src/Viewer/renderers/mathInput.jsx +425 -0
  465. package/src/Viewer/renderers/mathInputog.jsx +534 -0
  466. package/src/Viewer/renderers/mathList.jsx +39 -0
  467. package/src/Viewer/renderers/matrixInput.jsx +317 -0
  468. package/src/Viewer/renderers/mdash.jsx +12 -0
  469. package/src/Viewer/renderers/nbsp.jsx +12 -0
  470. package/src/Viewer/renderers/ndash.jsx +12 -0
  471. package/src/Viewer/renderers/number.jsx +454 -0
  472. package/src/Viewer/renderers/numberList.jsx +35 -0
  473. package/src/Viewer/renderers/orbitalDiagram.jsx +247 -0
  474. package/src/Viewer/renderers/orbitalDiagramInput.jsx +450 -0
  475. package/src/Viewer/renderers/p.jsx +38 -0
  476. package/src/Viewer/renderers/paginatorControls.jsx +41 -0
  477. package/src/Viewer/renderers/pegboard.jsx +239 -0
  478. package/src/Viewer/renderers/point.jsx +649 -0
  479. package/src/Viewer/renderers/polygon.jsx +612 -0
  480. package/src/Viewer/renderers/polyline.jsx +608 -0
  481. package/src/Viewer/renderers/pre.jsx +34 -0
  482. package/src/Viewer/renderers/q.jsx +17 -0
  483. package/src/Viewer/renderers/ray.jsx +410 -0
  484. package/src/Viewer/renderers/ref.jsx +149 -0
  485. package/src/Viewer/renderers/regionBetweenCurveXAxis.jsx +182 -0
  486. package/src/Viewer/renderers/renderDoenetML.jsx +56 -0
  487. package/src/Viewer/renderers/row.jsx +31 -0
  488. package/src/Viewer/renderers/rq.jsx +12 -0
  489. package/src/Viewer/renderers/rsq.jsx +12 -0
  490. package/src/Viewer/renderers/section.jsx +427 -0
  491. package/src/Viewer/renderers/sideBySide.jsx +80 -0
  492. package/src/Viewer/renderers/slider.jsx +800 -0
  493. package/src/Viewer/renderers/solution.jsx +134 -0
  494. package/src/Viewer/renderers/spreadsheet.jsx +83 -0
  495. package/src/Viewer/renderers/sq.jsx +17 -0
  496. package/src/Viewer/renderers/styles/global.css +14 -0
  497. package/src/Viewer/renderers/subsetOfRealsInput.jsx +392 -0
  498. package/src/Viewer/renderers/summaryStatistics.jsx +83 -0
  499. package/src/Viewer/renderers/table.jsx +78 -0
  500. package/src/Viewer/renderers/tabular.jsx +58 -0
  501. package/src/Viewer/renderers/tag.jsx +26 -0
  502. package/src/Viewer/renderers/text.jsx +439 -0
  503. package/src/Viewer/renderers/textInput.jsx +774 -0
  504. package/src/Viewer/renderers/textList.jsx +30 -0
  505. package/src/Viewer/renderers/triggerSet.jsx +52 -0
  506. package/src/Viewer/renderers/updateValue.jsx +30 -0
  507. package/src/Viewer/renderers/utils/css.js +13 -0
  508. package/src/Viewer/renderers/utils/graph.js +159 -0
  509. package/src/Viewer/renderers/utils/offGraphIndicators.js +91 -0
  510. package/src/Viewer/renderers/vector.jsx +678 -0
  511. package/src/Viewer/renderers/video.jsx +494 -0
  512. package/src/Viewer/useDoenetRenderer.jsx +128 -0
  513. package/src/main.jsx +16 -0
  514. package/src/media/fonts/files/open-sans-v18-latin-700.woff +0 -0
  515. package/src/media/fonts/files/open-sans-v18-latin-700.woff2 +0 -0
  516. package/src/media/fonts/files/open-sans-v18-latin-700italic.woff +0 -0
  517. package/src/media/fonts/files/open-sans-v18-latin-700italic.woff2 +0 -0
  518. package/src/media/fonts/files/open-sans-v18-latin-italic.woff +0 -0
  519. package/src/media/fonts/files/open-sans-v18-latin-italic.woff2 +0 -0
  520. package/src/media/fonts/files/open-sans-v18-latin-light-italic.woff +0 -0
  521. package/src/media/fonts/files/open-sans-v18-latin-light-italic.woff2 +0 -0
  522. package/src/media/fonts/files/open-sans-v18-latin-light.woff +0 -0
  523. package/src/media/fonts/files/open-sans-v18-latin-light.woff2 +0 -0
  524. package/src/media/fonts/files/open-sans-v18-latin-regular.woff +0 -0
  525. package/src/media/fonts/files/open-sans-v18-latin-regular.woff2 +0 -0
  526. package/src/test/testCode.doenet +26 -0
  527. package/src/test/testViewer.jsx +158 -0
  528. package/src/uiComponents/ActionButton.jsx +157 -0
  529. package/src/uiComponents/ActionButtonGroup.jsx +93 -0
  530. package/src/uiComponents/Button.jsx +160 -0
  531. package/src/uiComponents/ButtonGroup.jsx +56 -0
  532. package/src/uiComponents/ToggleButton.jsx +194 -0
  533. package/src/uiComponents/ToggleButtonGroup.jsx +77 -0
  534. package/src/utils/activityUtils.js +713 -0
  535. package/src/utils/array.js +17 -0
  536. package/src/utils/cid.js +34 -0
  537. package/src/utils/componentInfoObjects.js +89 -0
  538. package/src/utils/deepFunctions.js +165 -0
  539. package/src/utils/enumeration.js +226 -0
  540. package/src/utils/math.js +624 -0
  541. package/src/utils/naming.js +44 -0
  542. package/src/utils/retrieveTextFile.js +156 -0
  543. package/src/utils/returnAllPossibleVariants.js +81 -0
  544. package/src/utils/sequence.js +715 -0
  545. package/src/utils/serialize.js +29 -0
  546. package/src/utils/serializedStateProcessing.js +2587 -0
  547. package/src/utils/subset-of-reals.js +783 -0
  548. package/src/utils/url.js +19 -0
  549. package/vite.config.js +14 -0
@@ -0,0 +1,173 @@
1
+ import me from "math-expressions";
2
+ import subsets from "./subset-of-reals";
3
+
4
+ // from https://stackoverflow.com/a/40293777
5
+ export function deepClone(obj, BaseComponent, hash) {
6
+ // Do not try to clone primitives or functions
7
+ if (Object(obj) !== obj || obj instanceof Function) return obj;
8
+
9
+ // Do not try to clone Doenet components
10
+ if (BaseComponent !== undefined && obj instanceof BaseComponent) return obj;
11
+
12
+ if (obj instanceof me.class || obj instanceof subsets.Subset) {
13
+ return obj.copy();
14
+ }
15
+
16
+ if (hash === undefined) {
17
+ hash = new WeakMap();
18
+ }
19
+
20
+ if (Array.isArray(obj)) {
21
+ return [...obj.map((x) => deepClone(x, BaseComponent, hash))];
22
+ }
23
+
24
+ // seem to get empty object a lot, so short circuit it
25
+ if (obj.constructor === Object && Object.entries(obj).length === 0) {
26
+ return {};
27
+ }
28
+
29
+ if (hash.has(obj)) return hash.get(obj); // Cyclic reference
30
+ try {
31
+ // Try to run constructor (without arguments, as we don't know them)
32
+ var result = new obj.constructor();
33
+ } catch (e) {
34
+ // Constructor failed, create object without running the constructor
35
+ result = Object.create(Object.getPrototypeOf(obj));
36
+ }
37
+ // Optional: support for some standard constructors (extend as desired)
38
+ if (obj instanceof Map)
39
+ Array.from(obj, ([key, val]) =>
40
+ result.set(
41
+ deepClone(key, BaseComponent, hash),
42
+ deepClone(val, BaseComponent, hash),
43
+ ),
44
+ );
45
+ else if (obj instanceof Set) {
46
+ // result.values = result.values.bind(result);
47
+ Array.from(obj, (key) => result.add(deepClone(key, BaseComponent, hash)));
48
+ }
49
+ // Register in hash
50
+ hash.set(obj, result);
51
+ // Clone and assign enumerable own properties recursively
52
+ return Object.assign(
53
+ result,
54
+ ...Object.keys(obj).map((key) => ({
55
+ [key]: deepClone(obj[key], BaseComponent, hash),
56
+ })),
57
+ );
58
+ }
59
+
60
+ // based on https://stackoverflow.com/a/1144249
61
+ export function deepCompare(a, b, BaseComponent) {
62
+ var leftChain, rightChain;
63
+
64
+ function compare2Objects(x, y) {
65
+ var p;
66
+
67
+ // remember that NaN === NaN returns false
68
+ if (Number.isNaN(x) && Number.isNaN(y)) {
69
+ return true;
70
+ }
71
+
72
+ if (x === y) {
73
+ return true;
74
+ }
75
+
76
+ // if components, equal if same component name
77
+ if (
78
+ BaseComponent !== undefined &&
79
+ x instanceof BaseComponent &&
80
+ y instanceof BaseComponent
81
+ ) {
82
+ return x.componentName === y.componentName;
83
+ }
84
+
85
+ // if math-expressions, equal if exact same syntax tree
86
+ if (x instanceof me.class && y instanceof me.class) {
87
+ return compare2Objects(x.tree, y.tree);
88
+ }
89
+
90
+ // Works in case when functions are created in constructor.
91
+ // Comparing dates is a common scenario. Another built-ins?
92
+ // We can even handle functions passed across iframes
93
+ if (
94
+ (typeof x === "function" && typeof y === "function") ||
95
+ (x instanceof Date && y instanceof Date) ||
96
+ (x instanceof RegExp && y instanceof RegExp) ||
97
+ (x instanceof String && y instanceof String) ||
98
+ (x instanceof Number && y instanceof Number)
99
+ ) {
100
+ return x.toString() === y.toString();
101
+ }
102
+
103
+ // At last checking prototypes as good as we can
104
+ if (!(x instanceof Object && y instanceof Object)) {
105
+ return false;
106
+ }
107
+
108
+ if (x.isPrototypeOf(y) || y.isPrototypeOf(x)) {
109
+ return false;
110
+ }
111
+
112
+ if (x.constructor !== y.constructor) {
113
+ return false;
114
+ }
115
+
116
+ if (x.prototype !== y.prototype) {
117
+ return false;
118
+ }
119
+
120
+ // Check for infinitive linking loops
121
+ if (leftChain.indexOf(x) > -1 || rightChain.indexOf(y) > -1) {
122
+ return false;
123
+ }
124
+
125
+ // Quick checking of one object being a subset of another.
126
+ for (p in y) {
127
+ if (y.hasOwnProperty(p) !== x.hasOwnProperty(p)) {
128
+ return false;
129
+ } else if (typeof y[p] !== typeof x[p]) {
130
+ return false;
131
+ }
132
+ }
133
+
134
+ for (p in x) {
135
+ if (y.hasOwnProperty(p) !== x.hasOwnProperty(p)) {
136
+ return false;
137
+ } else if (typeof y[p] !== typeof x[p]) {
138
+ return false;
139
+ }
140
+
141
+ switch (typeof x[p]) {
142
+ case "object":
143
+ case "function":
144
+ leftChain.push(x);
145
+ rightChain.push(y);
146
+
147
+ if (!compare2Objects(x[p], y[p])) {
148
+ // console.log(`false because objects weren't equal`);
149
+ // console.log(x[p])
150
+ // console.log(y[p])
151
+ return false;
152
+ }
153
+
154
+ leftChain.pop();
155
+ rightChain.pop();
156
+ break;
157
+
158
+ default:
159
+ if (x[p] !== y[p] && !(Number.isNaN(x[p]) && Number.isNaN(y[p]))) {
160
+ return false;
161
+ }
162
+ break;
163
+ }
164
+ }
165
+
166
+ return true;
167
+ }
168
+
169
+ leftChain = [];
170
+ rightChain = [];
171
+
172
+ return compare2Objects(a, b);
173
+ }
@@ -0,0 +1,252 @@
1
+ export function gatherDescendants({
2
+ ancestor,
3
+ descendantTypes,
4
+ recurseToMatchedChildren = true,
5
+ useReplacementsForComposites = false,
6
+ includeNonActiveChildren = false,
7
+ skipOverAdapters = false,
8
+ ignoreReplacementsOfMatchedComposites = false,
9
+ ignoreReplacementsOfEncounteredComposites = false,
10
+ init = true,
11
+ componentInfoObjects,
12
+ }) {
13
+ // Note: ignoreReplacementsOfEncounteredComposites means ignore replacements
14
+ // of all composites except copies of external content
15
+
16
+ let matchChildToTypes = (child) =>
17
+ descendantTypes.some((ct) =>
18
+ componentInfoObjects.isInheritedComponentType({
19
+ inheritedComponentType: child.componentType,
20
+ baseComponentType: ct,
21
+ }),
22
+ );
23
+
24
+ let childrenToCheck = [];
25
+
26
+ if (
27
+ useReplacementsForComposites &&
28
+ componentInfoObjects.isInheritedComponentType({
29
+ inheritedComponentType: ancestor.componentType,
30
+ baseComponentType: "_composite",
31
+ })
32
+ ) {
33
+ if (init) {
34
+ // if not init, parent will also be checked.
35
+ // Since replacements will be children of parent,
36
+ // don't need to gather them here
37
+ childrenToCheck.push(
38
+ ...replacementsForComposites({
39
+ composite: ancestor,
40
+ componentInfoObjects,
41
+ includeComposites: includeNonActiveChildren,
42
+ }).filter((x) => typeof x === "object"),
43
+ );
44
+ }
45
+ } else {
46
+ // add children in the order of allChildren ordered
47
+ for (let childName of ancestor.allChildrenOrdered) {
48
+ let childObj = ancestor.allChildren[childName];
49
+ let child;
50
+ let childIsActive = false;
51
+ let childIsAdapter = false;
52
+ if (childObj) {
53
+ child = childObj.component;
54
+ if (child.adaptedFrom) {
55
+ childIsAdapter = true;
56
+ }
57
+ if (ancestor.activeChildren.includes(child)) {
58
+ childIsActive = true;
59
+ }
60
+ } else {
61
+ // must have a placeholder
62
+ // look in activeChildren
63
+ // include the placedholders adapted into the activeChildren
64
+ for (let aChild of ancestor.activeChildren) {
65
+ if (aChild.placeholderInd === childName) {
66
+ child = aChild;
67
+ childIsActive = true;
68
+ if (
69
+ typeof childName === "string" &&
70
+ childName.substring(childName.length - 5, childName.length) ===
71
+ "adapt"
72
+ ) {
73
+ childIsAdapter = true;
74
+ }
75
+ break;
76
+ } else if (
77
+ aChild.adaptedFrom &&
78
+ achild.adaptedFrom.placeholderInd === childName
79
+ ) {
80
+ child = aChild.adaptedFrom;
81
+ break;
82
+ }
83
+ }
84
+ }
85
+
86
+ if (child) {
87
+ if (childIsAdapter && skipOverAdapters) {
88
+ if (!childrenToCheck.includes(child.adaptedFrom)) {
89
+ childrenToCheck.push(child.adaptedFrom);
90
+ }
91
+ } else if (childIsActive || includeNonActiveChildren) {
92
+ childrenToCheck.push(child);
93
+ }
94
+ }
95
+ }
96
+ }
97
+
98
+ if (
99
+ ignoreReplacementsOfMatchedComposites ||
100
+ ignoreReplacementsOfEncounteredComposites
101
+ ) {
102
+ // first check if have matched any composites, so can ignore their replacements
103
+ let namesToIgnore = [];
104
+ for (let child of childrenToCheck) {
105
+ let checkChildForReplacements = matchChildToTypes(child);
106
+ if (
107
+ ignoreReplacementsOfEncounteredComposites &&
108
+ !checkChildForReplacements
109
+ ) {
110
+ // we explicitly will not ignore replacements of copies of external content
111
+ checkChildForReplacements = !(
112
+ child.componentType === "copy" && child.doenetAttributes.copiedURI
113
+ );
114
+ }
115
+ if (
116
+ checkChildForReplacements &&
117
+ componentInfoObjects.isInheritedComponentType({
118
+ inheritedComponentType: child.componentType,
119
+ baseComponentType: "_composite",
120
+ })
121
+ ) {
122
+ namesToIgnore = [
123
+ ...namesToIgnore,
124
+ ...replacementsForComposites({
125
+ composite: child,
126
+ componentInfoObjects,
127
+ includeComposites: true,
128
+ })
129
+ .filter((x) => typeof x === "object")
130
+ .map((x) => (x.componentName ? x.componentName : x.placeholderInd)),
131
+ ];
132
+ }
133
+ }
134
+
135
+ if (namesToIgnore.length > 0) {
136
+ childrenToCheck = childrenToCheck.filter(
137
+ (x) =>
138
+ !(
139
+ namesToIgnore.includes(x.componentName) ||
140
+ namesToIgnore.includes(x.placeholderInd)
141
+ ),
142
+ );
143
+ }
144
+ }
145
+
146
+ let descendants = [];
147
+
148
+ for (let child of childrenToCheck) {
149
+ let matchedChild = matchChildToTypes(child);
150
+ if (matchedChild) {
151
+ descendants.push({
152
+ componentName: child.componentName
153
+ ? child.componentName
154
+ : child.placeholderInd,
155
+ componentType: child.componentType,
156
+ });
157
+ }
158
+
159
+ if (
160
+ (!matchedChild || recurseToMatchedChildren) &&
161
+ child.placeholderInd === undefined
162
+ ) {
163
+ // recurse
164
+ let additionalDescendants = gatherDescendants({
165
+ ancestor: child,
166
+ descendantTypes,
167
+ recurseToMatchedChildren,
168
+ useReplacementsForComposites,
169
+ includeNonActiveChildren,
170
+ skipOverAdapters,
171
+ ignoreReplacementsOfMatchedComposites,
172
+ ignoreReplacementsOfEncounteredComposites,
173
+ init: false,
174
+ componentInfoObjects,
175
+ });
176
+ descendants.push(...additionalDescendants);
177
+ }
178
+ }
179
+
180
+ return descendants;
181
+ }
182
+
183
+ function replacementsForComposites({
184
+ composite,
185
+ includeComposites = false,
186
+ componentInfoObjects,
187
+ }) {
188
+ let replacements = [];
189
+
190
+ if (composite.replacements) {
191
+ let originalReplacements;
192
+ if (composite.replacementsToWithhold) {
193
+ let numReplacements =
194
+ composite.replacements.length - composite.replacementsToWithhold;
195
+ originalReplacements = composite.replacements.slice(0, numReplacements);
196
+ } else {
197
+ originalReplacements = composite.replacements;
198
+ }
199
+
200
+ for (let replacement of originalReplacements) {
201
+ if (
202
+ componentInfoObjects.isInheritedComponentType({
203
+ inheritedComponentType: replacement.componentType,
204
+ baseComponentType: "_composite",
205
+ })
206
+ ) {
207
+ if (includeComposites) {
208
+ replacements.push(replacement);
209
+ }
210
+ replacements.push(
211
+ ...replacementsForComposites({
212
+ composite: replacement,
213
+ componentInfoObjects,
214
+ includeComposites,
215
+ }),
216
+ );
217
+ } else {
218
+ replacements.push(replacement);
219
+ }
220
+ }
221
+ }
222
+
223
+ return replacements;
224
+ }
225
+
226
+ export function ancestorsIncludingComposites(comp, components) {
227
+ if (comp.ancestors === undefined || comp.ancestors.length === 0) {
228
+ return [];
229
+ }
230
+
231
+ let comps = [comp.ancestors[0].componentName];
232
+
233
+ let parent = components[comp.ancestors[0].componentName];
234
+ if (parent) {
235
+ comps.push(...ancestorsIncludingComposites(parent, components));
236
+ }
237
+
238
+ if (comp.replacementOf) {
239
+ comps.push(comp.replacementOf.componentName);
240
+ let replacementAs = ancestorsIncludingComposites(
241
+ comp.replacementOf,
242
+ components,
243
+ );
244
+ for (let a of replacementAs) {
245
+ if (!comps.includes(a)) {
246
+ comps.push(a);
247
+ }
248
+ }
249
+ }
250
+
251
+ return comps;
252
+ }
@@ -0,0 +1,234 @@
1
+ import me from "math-expressions";
2
+
3
+ // Enumerates the unique combinations of repeeated selecting an index
4
+ // from the same set of options, with or without replacement
5
+ // The number of options to choose from is numberOfOptions
6
+ // so that each index is an integer between 0 and numberOfOptions-1
7
+ // The number of indices to choose for each combination is numberOfIndices.
8
+ // Begins with combinations that contain distinct indices, if possible
9
+ // Returns a maximum of maxNumber
10
+ export function enumerateSelectionCombinations({
11
+ numberOfIndices,
12
+ numberOfOptions,
13
+ maxNumber = Infinity,
14
+ withReplacement = false,
15
+ skipZero = false, // for case when generating offsets but without replacement
16
+ }) {
17
+ if (numberOfIndices === 1) {
18
+ let options = [...Array(numberOfOptions).keys()];
19
+ // remove zero
20
+ options = options.slice(1);
21
+ if (!skipZero) {
22
+ // but put 0 last (so in recursion where the numbers are offsets, repeated combination is last)
23
+ options = [...options, 0];
24
+ }
25
+ options = options.slice(0, maxNumber);
26
+ // convert to array of arrays
27
+ options = options.map((x) => [x]);
28
+ return options;
29
+ }
30
+
31
+ let allOffsetsCombinations = enumerateSelectionCombinations({
32
+ numberOfIndices: numberOfIndices - 1,
33
+ numberOfOptions: numberOfOptions,
34
+ maxNumber,
35
+ withReplacement,
36
+ skipZero: !withReplacement,
37
+ });
38
+
39
+ let results = [];
40
+ let numberSoFar = 0;
41
+ for (let offsets of allOffsetsCombinations) {
42
+ for (let ind0 = 1; ind0 <= numberOfOptions; ind0++) {
43
+ let combination = [
44
+ ind0 % numberOfOptions,
45
+ ...offsets.map((x) => (ind0 + x) % numberOfOptions),
46
+ ];
47
+ if (skipZero && combination.includes(0)) {
48
+ continue;
49
+ }
50
+ results.push(combination);
51
+ numberSoFar++;
52
+ if (numberSoFar >= maxNumber) {
53
+ return results;
54
+ }
55
+ }
56
+ }
57
+
58
+ return results;
59
+ }
60
+
61
+ // Enumerate the unique combinations of picking a set of indices
62
+ // The number of possible options for each index is given
63
+ // by the array numberOfOptionsByIndex
64
+ // whose length gives the total number of options
65
+ // Returns an array of arrays, where each array gives an index for each option
66
+ // Returns at most maxNumber of combinations
67
+ export function enumerateCombinations({
68
+ numberOfOptionsByIndex,
69
+ maxNumber = Infinity,
70
+ }) {
71
+ let numberOfIndices = numberOfOptionsByIndex.length;
72
+
73
+ if (numberOfIndices === 0) {
74
+ return [];
75
+ }
76
+
77
+ let gcds = [];
78
+ for (let ind1 = 0; ind1 < numberOfIndices; ind1++) {
79
+ let g = [];
80
+ for (let ind2 = 0; ind2 < ind1; ind2++) {
81
+ g.push(
82
+ me.math.gcd(numberOfOptionsByIndex[ind1], numberOfOptionsByIndex[ind2]),
83
+ );
84
+ }
85
+ gcds.push(g);
86
+ }
87
+
88
+ // flatten and take max
89
+ let maxGCD = gcds
90
+ .reduce((a, c) => [...c, ...a], [])
91
+ .reduce((a, c) => Math.max(a, c), 1);
92
+
93
+ // if maxGCD is one, then can just sequentially pick the same component for each index
94
+ // (mod the size)
95
+ // and we encounter every possibility
96
+ if (maxGCD === 1) {
97
+ let totalCombinations = numberOfOptionsByIndex.reduce((a, c) => a * c);
98
+ totalCombinations = Math.min(totalCombinations, maxNumber);
99
+ let results = [];
100
+ for (let ind = 0; ind < totalCombinations; ind++) {
101
+ let r = numberOfOptionsByIndex.map((x) => ind % x);
102
+ results.push(r);
103
+ }
104
+ return results;
105
+ }
106
+
107
+ // if have two indices, then run sequentially for lcm,
108
+ // then shift second index and run sequentially for another lcm
109
+ // if continue gcd times, will have all combinations
110
+ if (numberOfIndices === 2) {
111
+ let gcd = maxGCD;
112
+ let lcm = me.math.lcm(...numberOfOptionsByIndex);
113
+
114
+ let results = [];
115
+ let numberSoFar = 0;
116
+ for (let offset = 0; offset < gcd; offset++) {
117
+ for (let ind = 0; ind < lcm; ind++) {
118
+ let r = [
119
+ ind % numberOfOptionsByIndex[0],
120
+ (ind + offset) % numberOfOptionsByIndex[1],
121
+ ];
122
+ results.push(r);
123
+ numberSoFar++;
124
+ if (numberSoFar >= maxNumber) {
125
+ return results;
126
+ }
127
+ }
128
+ }
129
+ return results;
130
+ }
131
+
132
+ // if have more than 2 indices and gcd isn't one
133
+ // then combine two together (which can treat with above case)
134
+ // and recurse with the result that has one fewer index
135
+ // (will need to splice together final result)
136
+
137
+ // will combine the first pair encountered that, along with gcd > 1,
138
+ // has the smallest least common multiple
139
+ let lcms = [];
140
+ for (let ind1 = 0; ind1 < numberOfIndices; ind1++) {
141
+ let m = [];
142
+ for (let ind2 = 0; ind2 < ind1; ind2++) {
143
+ if (gcds[ind1][ind2] > 1) {
144
+ m.push(
145
+ me.math.lcm(
146
+ numberOfOptionsByIndex[ind1],
147
+ numberOfOptionsByIndex[ind2],
148
+ ),
149
+ );
150
+ } else {
151
+ m.push(null); // be sure to skip those with gcd == 1
152
+ }
153
+ }
154
+ lcms.push(m);
155
+ }
156
+
157
+ // flatten and take min, filering out the nulls
158
+ let minLCM = lcms
159
+ .reduce((a, c) => [...c, ...a], [])
160
+ .filter((x) => x !== null)
161
+ .reduce((a, c) => Math.min(a, c), Infinity);
162
+
163
+ // find indices where minimum occurs
164
+ let matchInds;
165
+
166
+ for (let ind1 = 0; ind1 < numberOfIndices; ind1++) {
167
+ for (let ind2 = 0; ind2 < ind1; ind2++) {
168
+ if (lcms[ind1][ind2] === minLCM) {
169
+ matchInds = [ind2, ind1]; // want lowest index first
170
+ break;
171
+ }
172
+ }
173
+ if (matchInds) {
174
+ break;
175
+ }
176
+ }
177
+
178
+ // create new options of just the matched results
179
+ let n0 = numberOfOptionsByIndex[matchInds[0]];
180
+ let n1 = numberOfOptionsByIndex[matchInds[1]];
181
+
182
+ let innerOptions = [n0, n1];
183
+
184
+ // create new options where replace matched results with single one
185
+ // that has number of options set equal to the total number of inner options (n1*n2)
186
+ let outerOptions = [...numberOfOptionsByIndex];
187
+ outerOptions[matchInds[0]] = n0 * n1; // replace first with total number of combinations
188
+ outerOptions.splice(matchInds[1], 1); // delete second matched ind
189
+
190
+ let outerResult = enumerateCombinations({
191
+ numberOfOptionsByIndex: outerOptions,
192
+ maxNumber: maxNumber,
193
+ });
194
+ let innerResult = enumerateCombinations({
195
+ numberOfOptionsByIndex: innerOptions,
196
+ maxNumber: maxNumber,
197
+ });
198
+
199
+ // to splice back together
200
+ // - replace the combined entry (which is at the lower index)
201
+ // with the first inner result
202
+ // - insert in the second inner result at the larger index
203
+ for (let r of outerResult) {
204
+ let ires = innerResult[r[matchInds[0]]];
205
+ r.splice(matchInds[0], 1, ires[0]);
206
+ r.splice(matchInds[1], 0, ires[1]);
207
+ }
208
+
209
+ return outerResult;
210
+ }
211
+
212
+ // from https://stackoverflow.com/a/20871714
213
+ export function enumeratePermutations({ values, maxNumber }) {
214
+ let result = [];
215
+
216
+ const permute = (arr, m = []) => {
217
+ if (arr.length === 0) {
218
+ result.push(m);
219
+ } else {
220
+ for (let i = 0; i < arr.length; i++) {
221
+ let curr = arr.slice();
222
+ let next = curr.splice(i, 1);
223
+ permute(curr.slice(), m.concat(next));
224
+ if (result.length >= maxNumber) {
225
+ return;
226
+ }
227
+ }
228
+ }
229
+ };
230
+
231
+ permute(values);
232
+
233
+ return result;
234
+ }