@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,947 @@
1
+ import CompositeComponent from "./abstract/CompositeComponent";
2
+ import {
3
+ enumerateSelectionCombinations,
4
+ enumerateCombinations,
5
+ } from "../utils/enumeration";
6
+ import { deepClone } from "../utils/deepFunctions";
7
+ import {
8
+ markToCreateAllUniqueNames,
9
+ processAssignNames,
10
+ } from "../utils/serializedStateProcessing";
11
+ import { returnGroupIntoComponentTypeSeparatedBySpacesOutsideParens } from "./commonsugar/lists";
12
+ import { gatherVariantComponents } from "../utils/variants";
13
+
14
+ export default class Select extends CompositeComponent {
15
+ static componentType = "select";
16
+
17
+ // static assignNewNamespaceToAllChildrenExcept = Object.keys(this.createAttributesObject()).map(x => x.toLowerCase());
18
+ static assignNamesToReplacements = true;
19
+
20
+ static createsVariants = true;
21
+
22
+ static includeBlankStringChildren = true;
23
+ static removeBlankStringChildrenPostSugar = true;
24
+
25
+ static createAttributesObject() {
26
+ let attributes = super.createAttributesObject();
27
+ attributes.assignNamesSkip = {
28
+ createPrimitiveOfType: "number",
29
+ };
30
+ attributes.numToSelect = {
31
+ createComponentOfType: "integer",
32
+ createStateVariable: "numToSelect",
33
+ defaultValue: 1,
34
+ public: true,
35
+ };
36
+ attributes.withReplacement = {
37
+ createComponentOfType: "boolean",
38
+ createStateVariable: "withReplacement",
39
+ defaultValue: false,
40
+ public: true,
41
+ };
42
+ attributes.type = {
43
+ createPrimitiveOfType: "string",
44
+ };
45
+ attributes.addLevelToAssignNames = {
46
+ createPrimitiveOfType: "boolean",
47
+ createStateVariable: "addLevelToAssignNames",
48
+ defaultValue: false,
49
+ };
50
+
51
+ return attributes;
52
+ }
53
+
54
+ static returnSugarInstructions() {
55
+ let sugarInstructions = super.returnSugarInstructions();
56
+
57
+ function breakStringsMacrosIntoOptionsBySpaces({
58
+ matchedChildren,
59
+ componentAttributes,
60
+ componentInfoObjects,
61
+ }) {
62
+ // only if all children are strings or macros
63
+ if (
64
+ !matchedChildren.every(
65
+ (child) =>
66
+ typeof child === "string" ||
67
+ child.doenetAttributes?.createdFromMacro,
68
+ )
69
+ ) {
70
+ return { success: false };
71
+ }
72
+
73
+ let type;
74
+ if (componentAttributes.type) {
75
+ type = componentAttributes.type;
76
+ } else {
77
+ type = "math";
78
+ }
79
+
80
+ if (!["math", "text", "number", "boolean"].includes(type)) {
81
+ console.warn(`Invalid type ${type}`);
82
+ type = "math";
83
+ }
84
+
85
+ // break any string by white space and wrap pieces with option and type
86
+ let groupIntoComponentTypesSeparatedBySpaces =
87
+ returnGroupIntoComponentTypeSeparatedBySpacesOutsideParens({
88
+ componentType: type,
89
+ forceComponentType: true,
90
+ });
91
+ let result = groupIntoComponentTypesSeparatedBySpaces({
92
+ matchedChildren,
93
+ componentInfoObjects,
94
+ });
95
+
96
+ if (result.success) {
97
+ let newChildren = result.newChildren.map((child) => ({
98
+ componentType: "option",
99
+ children: [child],
100
+ }));
101
+
102
+ let newAttributes = {
103
+ addLevelToAssignNames: {
104
+ primitive: true,
105
+ },
106
+ };
107
+
108
+ return {
109
+ success: true,
110
+ newChildren,
111
+ newAttributes,
112
+ };
113
+ } else {
114
+ return { success: false };
115
+ }
116
+ }
117
+
118
+ sugarInstructions.push({
119
+ replacementFunction: breakStringsMacrosIntoOptionsBySpaces,
120
+ });
121
+
122
+ return sugarInstructions;
123
+ }
124
+
125
+ static returnChildGroups() {
126
+ return [
127
+ {
128
+ group: "options",
129
+ componentTypes: ["option"],
130
+ },
131
+ ];
132
+ }
133
+
134
+ static returnStateVariableDefinitions() {
135
+ let stateVariableDefinitions = super.returnStateVariableDefinitions();
136
+
137
+ stateVariableDefinitions.variants = {
138
+ returnDependencies: () => ({
139
+ variants: {
140
+ dependencyType: "variants",
141
+ },
142
+ }),
143
+ definition: function ({ dependencyValues }) {
144
+ return { setValue: { variants: dependencyValues.variants } };
145
+ },
146
+ };
147
+
148
+ stateVariableDefinitions.currentVariantName = {
149
+ returnDependencies: ({ sharedParameters }) => ({
150
+ variantName: {
151
+ dependencyType: "value",
152
+ value: sharedParameters.variantName,
153
+ },
154
+ }),
155
+ definition: ({ dependencyValues }) => ({
156
+ setValue: { currentVariantName: dependencyValues.variantName },
157
+ }),
158
+ };
159
+
160
+ stateVariableDefinitions.allVariantNames = {
161
+ returnDependencies: ({ sharedParameters }) => ({
162
+ allVariantNames: {
163
+ dependencyType: "value",
164
+ value: sharedParameters.allVariantNames,
165
+ },
166
+ }),
167
+ definition: ({ dependencyValues }) => ({
168
+ setValue: { allVariantNames: dependencyValues.allVariantNames },
169
+ }),
170
+ };
171
+
172
+ stateVariableDefinitions.nOptions = {
173
+ additionalStateVariablesDefined: ["optionChildren"],
174
+ returnDependencies: () => ({
175
+ optionChildren: {
176
+ dependencyType: "child",
177
+ childGroups: ["options"],
178
+ variableNames: ["selectForVariants", "selectWeight"],
179
+ },
180
+ }),
181
+ definition({ dependencyValues }) {
182
+ return {
183
+ setValue: {
184
+ optionChildren: dependencyValues.optionChildren,
185
+ nOptions: dependencyValues.optionChildren.length,
186
+ },
187
+ };
188
+ },
189
+ };
190
+
191
+ stateVariableDefinitions.availableVariants = {
192
+ returnDependencies: () => ({
193
+ optionChildren: {
194
+ dependencyType: "stateVariable",
195
+ variableName: "optionChildren",
196
+ },
197
+ numToSelect: {
198
+ dependencyType: "stateVariable",
199
+ variableName: "numToSelect",
200
+ },
201
+ allVariantNames: {
202
+ dependencyType: "stateVariable",
203
+ variableName: "allVariantNames",
204
+ },
205
+ }),
206
+ definition: function ({ dependencyValues }) {
207
+ let availableVariants = {};
208
+ for (let [
209
+ ind,
210
+ optionChild,
211
+ ] of dependencyValues.optionChildren.entries()) {
212
+ for (let variantName of optionChild.stateValues.selectForVariants) {
213
+ let variantLower = variantName.toLowerCase();
214
+ if (availableVariants[variantLower] === undefined) {
215
+ availableVariants[variantLower] = [];
216
+ }
217
+ availableVariants[variantLower].push(ind + 1);
218
+ }
219
+ }
220
+
221
+ for (let variantName in availableVariants) {
222
+ if (
223
+ availableVariants[variantName].length !==
224
+ dependencyValues.numToSelect
225
+ ) {
226
+ throw Error(
227
+ "Invalid variant name for select. Variant name " +
228
+ variantName +
229
+ " appears in " +
230
+ availableVariants[variantName].length +
231
+ " options but number to select is " +
232
+ numToSelect,
233
+ );
234
+ }
235
+ }
236
+
237
+ if (Object.keys(availableVariants).length > 0) {
238
+ // if have at least one variant specified,
239
+ // then require that all possible variants have a variant specified
240
+ for (let variantName of dependencyValues.allVariantNames) {
241
+ if (!(variantName in availableVariants)) {
242
+ throw Error(
243
+ "Some variants are specified for select but no options are specified for possible variant name: " +
244
+ variantName,
245
+ );
246
+ }
247
+ }
248
+ for (let variantName in availableVariants) {
249
+ if (!dependencyValues.allVariantNames.includes(variantName)) {
250
+ throw Error(
251
+ "Variant name " +
252
+ variantName +
253
+ " that is specified for select is not a possible variant name.",
254
+ );
255
+ }
256
+ }
257
+ }
258
+
259
+ return {
260
+ setValue: { availableVariants },
261
+ };
262
+ },
263
+ };
264
+
265
+ stateVariableDefinitions.selectedIndices = {
266
+ immutable: true,
267
+ hasEssential: true,
268
+ shadowVariable: true,
269
+ returnDependencies: ({ sharedParameters }) => ({
270
+ numToSelect: {
271
+ dependencyType: "stateVariable",
272
+ variableName: "numToSelect",
273
+ },
274
+ withReplacement: {
275
+ dependencyType: "stateVariable",
276
+ variableName: "withReplacement",
277
+ },
278
+ optionChildren: {
279
+ dependencyType: "stateVariable",
280
+ variableName: "optionChildren",
281
+ },
282
+ nOptions: {
283
+ dependencyType: "stateVariable",
284
+ variableName: "nOptions",
285
+ },
286
+ currentVariantName: {
287
+ dependencyType: "stateVariable",
288
+ variableName: "currentVariantName",
289
+ },
290
+ variants: {
291
+ dependencyType: "stateVariable",
292
+ variableName: "variants",
293
+ },
294
+ availableVariants: {
295
+ dependencyType: "stateVariable",
296
+ variableName: "availableVariants",
297
+ },
298
+ variantRng: {
299
+ dependencyType: "value",
300
+ value: sharedParameters.variantRng,
301
+ doNotProxy: true,
302
+ },
303
+ }),
304
+ definition: function ({ dependencyValues }) {
305
+ // console.log(`definition of selected Indices`)
306
+ // console.log(dependencyValues);
307
+
308
+ if (
309
+ !(dependencyValues.numToSelect >= 1) ||
310
+ dependencyValues.nOptions === 0
311
+ ) {
312
+ return {
313
+ setEssentialValue: { selectedIndices: [] },
314
+ setValue: { selectedIndices: [] },
315
+ };
316
+ }
317
+
318
+ // if desiredIndices is specfied, use those
319
+ if (
320
+ dependencyValues.variants &&
321
+ dependencyValues.variants.desiredVariant !== undefined
322
+ ) {
323
+ let desiredIndices = dependencyValues.variants.desiredVariant.indices;
324
+ if (desiredIndices !== undefined) {
325
+ if (desiredIndices.length !== dependencyValues.numToSelect) {
326
+ throw Error(
327
+ "Number of indices specified for select must match number to select",
328
+ );
329
+ }
330
+ desiredIndices = desiredIndices.map(Number);
331
+ if (!desiredIndices.every(Number.isInteger)) {
332
+ throw Error("All indices specified for select must be integers");
333
+ }
334
+ let n = dependencyValues.nOptions;
335
+ desiredIndices = desiredIndices.map(
336
+ (x) => ((((x - 1) % n) + n) % n) + 1,
337
+ );
338
+
339
+ return {
340
+ setEssentialValue: { selectedIndices: desiredIndices },
341
+ setValue: { selectedIndices: desiredIndices },
342
+ };
343
+ }
344
+ }
345
+
346
+ // first check if have a variant for which options are specified
347
+ let variantOptions =
348
+ dependencyValues.availableVariants[
349
+ dependencyValues.currentVariantName
350
+ ];
351
+
352
+ if (variantOptions !== undefined) {
353
+ if (dependencyValues.numToSelect > 1) {
354
+ // shallow copy to remove proxy so can shuffle
355
+ variantOptions = [...variantOptions];
356
+
357
+ // first shuffle the array of indices
358
+ // https://stackoverflow.com/a/12646864
359
+ for (let i = dependencyValues.numToSelect - 1; i > 0; i--) {
360
+ const rand = dependencyValues.variantRng();
361
+ const j = Math.floor(rand * (i + 1));
362
+ [variantOptions[i], variantOptions[j]] = [
363
+ variantOptions[j],
364
+ variantOptions[i],
365
+ ];
366
+ }
367
+ }
368
+ return {
369
+ setEssentialValue: { selectedIndices: variantOptions },
370
+ setValue: { selectedIndices: variantOptions },
371
+ };
372
+ }
373
+
374
+ let selectedIndices = [];
375
+
376
+ let numberUniqueRequired = 1;
377
+ if (!dependencyValues.withReplacement) {
378
+ numberUniqueRequired = dependencyValues.numToSelect;
379
+ }
380
+
381
+ if (numberUniqueRequired > dependencyValues.nOptions) {
382
+ throw Error(
383
+ "Cannot select " +
384
+ numberUniqueRequired +
385
+ " components from only " +
386
+ dependencyValues.nOptions,
387
+ );
388
+ }
389
+
390
+ // normalize selectWeights to sum to 1
391
+ let selectWeightByChild = dependencyValues.optionChildren.map(
392
+ (x) => x.stateValues.selectWeight,
393
+ );
394
+ let totalWeight = selectWeightByChild.reduce((a, c) => a + c);
395
+ selectWeightByChild = selectWeightByChild.map((x) => x / totalWeight);
396
+
397
+ //https://stackoverflow.com/a/44081700
398
+ let cumulativeWeights = selectWeightByChild.reduce(
399
+ (a, x, i) => [...a, x + (a[i - 1] || 0)],
400
+ [],
401
+ );
402
+ let indsRemaining = [...Array(cumulativeWeights.length).keys()].map(
403
+ (x) => x + 1,
404
+ );
405
+
406
+ for (let ind = 0; ind < dependencyValues.numToSelect; ind++) {
407
+ // random number in [0, 1)
408
+ let rand = dependencyValues.variantRng();
409
+
410
+ // find largest index where cumulativeWeight is larger than rand
411
+ // using binary search
412
+ let start = -1,
413
+ end = cumulativeWeights.length - 1;
414
+ while (start < end - 1) {
415
+ let mid = Math.floor((start + end) / 2); // mid point
416
+ if (cumulativeWeights[mid] > rand) {
417
+ end = mid;
418
+ } else {
419
+ start = mid;
420
+ }
421
+ }
422
+
423
+ let selectedInd = indsRemaining[end];
424
+ selectedIndices.push(selectedInd);
425
+
426
+ if (
427
+ !dependencyValues.withReplacement &&
428
+ ind < dependencyValues.numToSelect - 1
429
+ ) {
430
+ // remove selected index and renormalize weights
431
+ selectWeightByChild.splice(end, 1);
432
+ indsRemaining.splice(end, 1);
433
+ totalWeight = selectWeightByChild.reduce((a, c) => a + c);
434
+ selectWeightByChild = selectWeightByChild.map(
435
+ (x) => x / totalWeight,
436
+ );
437
+ cumulativeWeights = selectWeightByChild.reduce(
438
+ (a, x, i) => [...a, x + (a[i - 1] || 0)],
439
+ [],
440
+ );
441
+ }
442
+ }
443
+
444
+ return {
445
+ setEssentialValue: { selectedIndices },
446
+ setValue: { selectedIndices },
447
+ };
448
+ },
449
+ };
450
+
451
+ stateVariableDefinitions.isVariantComponent = {
452
+ returnDependencies: () => ({}),
453
+ definition: () => ({ setValue: { isVariantComponent: true } }),
454
+ };
455
+
456
+ stateVariableDefinitions.generatedVariantInfo = {
457
+ providePreviousValuesInDefinition: true,
458
+ returnDependencies: ({ componentInfoObjects }) => ({
459
+ selectedIndices: {
460
+ dependencyType: "stateVariable",
461
+ variableName: "selectedIndices",
462
+ },
463
+ variantDescendants: {
464
+ dependencyType: "descendant",
465
+ componentTypes: Object.keys(
466
+ componentInfoObjects.componentTypesCreatingVariants,
467
+ ),
468
+ variableNames: ["isVariantComponent", "generatedVariantInfo"],
469
+ useReplacementsForComposites: true,
470
+ recurseToMatchedChildren: false,
471
+ variablesOptional: true,
472
+ includeNonActiveChildren: true,
473
+ ignoreReplacementsOfEncounteredComposites: true,
474
+ },
475
+ }),
476
+ definition({ dependencyValues, componentName, previousValues }) {
477
+ let generatedVariantInfo = {
478
+ indices: dependencyValues.selectedIndices,
479
+ meta: { createdBy: componentName },
480
+ };
481
+
482
+ let subvariants = (generatedVariantInfo.subvariants = []);
483
+
484
+ for (let descendant of dependencyValues.variantDescendants) {
485
+ if (descendant.stateValues.isVariantComponent) {
486
+ subvariants.push(descendant.stateValues.generatedVariantInfo);
487
+ } else if (descendant.stateValues.generatedVariantInfo) {
488
+ subvariants.push(
489
+ ...descendant.stateValues.generatedVariantInfo.subvariants,
490
+ );
491
+ }
492
+ }
493
+
494
+ for (let [ind, subvar] of subvariants.entries()) {
495
+ if (!subvar.subvariants && previousValues.generatedVariantInfo) {
496
+ // check if previously had subvariants
497
+ let previousSubvariants =
498
+ previousValues.generatedVariantInfo.subvariants;
499
+ if (previousSubvariants[ind].subvariants) {
500
+ subvariants[ind] = Object.assign({}, subvariants[ind]);
501
+ subvariants[ind].subvariants =
502
+ previousSubvariants[ind].subvariants;
503
+ }
504
+ }
505
+ }
506
+
507
+ return { setValue: { generatedVariantInfo } };
508
+ },
509
+ };
510
+
511
+ stateVariableDefinitions.readyToExpandWhenResolved = {
512
+ returnDependencies: () => ({
513
+ selectedIndices: {
514
+ dependencyType: "stateVariable",
515
+ variableName: "selectedIndices",
516
+ },
517
+ }),
518
+ definition() {
519
+ return {
520
+ setValue: { readyToExpandWhenResolved: true },
521
+ };
522
+ },
523
+ };
524
+
525
+ return stateVariableDefinitions;
526
+ }
527
+
528
+ static async createSerializedReplacements({
529
+ component,
530
+ components,
531
+ componentInfoObjects,
532
+ }) {
533
+ // console.log(`create serialized replacements for ${component.componentName}`);
534
+
535
+ let replacements = [];
536
+
537
+ let optionChildren = await component.stateValues.optionChildren;
538
+
539
+ for (let selectedIndex of await component.stateValues.selectedIndices) {
540
+ let selectedChildName = optionChildren[selectedIndex - 1].componentName;
541
+
542
+ let selectedChild = components[selectedChildName];
543
+
544
+ let serializedGrandchildren = deepClone(
545
+ await selectedChild.stateValues.serializedChildren,
546
+ );
547
+ let serializedChild = {
548
+ componentType: "option",
549
+ state: { rendered: true },
550
+ doenetAttributes: Object.assign({}, selectedChild.doenetAttributes),
551
+ children: serializedGrandchildren,
552
+ originalName: selectedChildName,
553
+ };
554
+
555
+ if (selectedChild.attributes.newNamespace) {
556
+ serializedChild.attributes = { newNamespace: { primitive: true } };
557
+ }
558
+
559
+ replacements.push(serializedChild);
560
+ }
561
+
562
+ let descendantVariantComponents = gatherVariantComponents({
563
+ serializedComponents: replacements,
564
+ componentInfoObjects,
565
+ });
566
+
567
+ // if subvariants were specified, add those the corresponding descendants
568
+ if (component.variants && component.variants.desiredVariant !== undefined) {
569
+ let desiredVariant = component.variants.desiredVariant;
570
+ if (
571
+ desiredVariant !== undefined &&
572
+ desiredVariant.subvariants !== undefined
573
+ ) {
574
+ for (let ind in desiredVariant.subvariants) {
575
+ let subvariant = desiredVariant.subvariants[ind];
576
+ let variantComponent = descendantVariantComponents[ind];
577
+ if (variantComponent === undefined) {
578
+ break;
579
+ }
580
+ variantComponent.variants.desiredVariant = subvariant;
581
+ }
582
+ }
583
+ }
584
+
585
+ let newNamespace = component.attributes.newNamespace?.primitive;
586
+
587
+ let assignNames = component.doenetAttributes.assignNames;
588
+
589
+ if (assignNames && (await component.stateValues.addLevelToAssignNames)) {
590
+ assignNames = assignNames.map((x) => [x]);
591
+ }
592
+
593
+ for (let rep of replacements) {
594
+ if (!rep.attributes?.newNamespace?.primitive && rep.children) {
595
+ markToCreateAllUniqueNames(rep.children);
596
+ }
597
+ }
598
+
599
+ let newReplacements = [];
600
+
601
+ for (let [ind, rep] of replacements.entries()) {
602
+ let processResult = processAssignNames({
603
+ assignNames,
604
+ serializedComponents: [rep],
605
+ parentName: component.componentName,
606
+ parentCreatesNewNamespace: newNamespace,
607
+ componentInfoObjects,
608
+ indOffset: ind,
609
+ });
610
+
611
+ newReplacements.push(processResult.serializedComponents[0]);
612
+ }
613
+
614
+ return { replacements: newReplacements };
615
+ }
616
+
617
+ static calculateReplacementChanges() {
618
+ return [];
619
+ }
620
+
621
+ static determineNumberOfUniqueVariants({
622
+ serializedComponent,
623
+ componentInfoObjects,
624
+ }) {
625
+ let numberOfVariants = serializedComponent.variants?.numberOfVariants;
626
+
627
+ if (numberOfVariants !== undefined) {
628
+ return { success: true, numberOfVariants };
629
+ }
630
+
631
+ let numToSelect = 1,
632
+ withReplacement = false;
633
+
634
+ let numToSelectComponent =
635
+ serializedComponent.attributes.numToSelect?.component;
636
+ if (numToSelectComponent) {
637
+ // only implemented if have an integer with a single string child
638
+ if (
639
+ numToSelectComponent.componentType === "integer" &&
640
+ numToSelectComponent.children?.length === 1 &&
641
+ typeof numToSelectComponent.children[0] === "string"
642
+ ) {
643
+ numToSelect = Number(numToSelectComponent.children[0]);
644
+
645
+ if (!(Number.isInteger(numToSelect) && numToSelect >= 0)) {
646
+ console.log(
647
+ `cannot determine unique variants of selectFromSequence as numToSelect isn't a non-negative integer.`,
648
+ );
649
+ return { success: false };
650
+ }
651
+ } else {
652
+ console.log(
653
+ `cannot determine unique variants of selectFromSequence as numToSelect isn't constant number.`,
654
+ );
655
+ return { success: false };
656
+ }
657
+ }
658
+
659
+ let withReplacementComponent =
660
+ serializedComponent.attributes.withReplacement?.component;
661
+ if (withReplacementComponent) {
662
+ // only implemented if have an boolean with a boolean value or a single string child
663
+ if (withReplacementComponent.componentType === "boolean") {
664
+ if (
665
+ withReplacementComponent.children?.length === 1 &&
666
+ typeof withReplacementComponent.children[0] === "string"
667
+ ) {
668
+ withReplacement =
669
+ withReplacementComponent.children[0].toLowerCase() === "true";
670
+ } else if (
671
+ (withReplacementComponent.children === undefined ||
672
+ withReplacementComponent.children.length === 0) &&
673
+ typeof withReplacementComponent.state?.value === "boolean"
674
+ ) {
675
+ withReplacement = withReplacementComponent.state.value;
676
+ } else {
677
+ console.log(
678
+ `cannot determine unique variants of selectFromSequence as withReplacement isn't constant boolean.`,
679
+ );
680
+ return { success: false };
681
+ }
682
+ } else {
683
+ console.log(
684
+ `cannot determine unique variants of selectFromSequence as withReplacement isn't constant boolean.`,
685
+ );
686
+ return { success: false };
687
+ }
688
+ }
689
+
690
+ for (let child of serializedComponent.children) {
691
+ if (
692
+ child.attributes?.selectWeight ||
693
+ child.attributes?.selectForVariants
694
+ ) {
695
+ // uniqueVariants disabled if have a child with selectWeight or selectForVariants specified
696
+ console.log(
697
+ `Unique variants for select disabled if have an option with selectWeight or selectForVariants specified`,
698
+ );
699
+ return { success: false };
700
+ }
701
+ }
702
+
703
+ if (serializedComponent.variants === undefined) {
704
+ serializedComponent.variants = {};
705
+ }
706
+
707
+ let descendantVariantComponents = gatherVariantComponents({
708
+ serializedComponents: serializedComponent.children,
709
+ componentInfoObjects,
710
+ });
711
+
712
+ serializedComponent.variants.descendantVariantComponents =
713
+ descendantVariantComponents;
714
+
715
+ let numberOfVariantsByChild = [];
716
+ for (let descendant of descendantVariantComponents) {
717
+ let descendantClass =
718
+ componentInfoObjects.allComponentClasses[descendant.componentType];
719
+ let result = descendantClass.determineNumberOfUniqueVariants({
720
+ serializedComponent: descendant,
721
+ componentInfoObjects,
722
+ });
723
+ if (!result.success) {
724
+ return { success: false };
725
+ }
726
+ numberOfVariantsByChild.push(result.numberOfVariants);
727
+ }
728
+
729
+ let uniqueVariantData = {
730
+ numberOfVariantsByChild,
731
+ numToSelect,
732
+ withReplacement,
733
+ };
734
+
735
+ if (numberOfVariantsByChild.length === 0) {
736
+ numberOfVariants = 1;
737
+ } else if (withReplacement || numToSelect === 1) {
738
+ let numberOfOptionsPerSelection = numberOfVariantsByChild.reduce(
739
+ (a, c) => a + c,
740
+ );
741
+ numberOfVariants = Math.pow(numberOfOptionsPerSelection, numToSelect);
742
+ } else {
743
+ let numChildren = numberOfVariantsByChild.length;
744
+
745
+ if (numToSelect > numChildren) {
746
+ return { success: false };
747
+ }
748
+
749
+ let firstNumber = numberOfVariantsByChild[0];
750
+ let allSameNumber = numberOfVariantsByChild
751
+ .slice(1)
752
+ .every((x) => x === firstNumber);
753
+
754
+ if (allSameNumber) {
755
+ let numberOfPermutations = numChildren;
756
+ for (let n = numChildren - 1; n > numChildren - numToSelect; n--) {
757
+ numberOfPermutations *= n;
758
+ }
759
+ numberOfVariants =
760
+ numberOfPermutations * Math.pow(firstNumber, numToSelect);
761
+ } else {
762
+ // have select without replacement where options have different numbers of variants
763
+ numberOfVariants = countOptions(numberOfVariantsByChild, numToSelect);
764
+ }
765
+ }
766
+
767
+ serializedComponent.variants.numberOfVariants = numberOfVariants;
768
+ serializedComponent.variants.uniqueVariants = true;
769
+ serializedComponent.variants.uniqueVariantData = uniqueVariantData;
770
+
771
+ return {
772
+ success: true,
773
+ numberOfVariants,
774
+ };
775
+ }
776
+
777
+ static getUniqueVariant({
778
+ serializedComponent,
779
+ variantIndex,
780
+ componentInfoObjects,
781
+ }) {
782
+ let numberOfVariants = serializedComponent.variants?.numberOfVariants;
783
+ if (numberOfVariants === undefined) {
784
+ return { success: false };
785
+ }
786
+
787
+ if (
788
+ !Number.isInteger(variantIndex) ||
789
+ variantIndex < 1 ||
790
+ variantIndex > numberOfVariants
791
+ ) {
792
+ return { success: false };
793
+ }
794
+
795
+ let uniqueVariantData = serializedComponent.variants.uniqueVariantData;
796
+ let numberOfVariantsByChild = uniqueVariantData.numberOfVariantsByChild;
797
+ let numToSelect = uniqueVariantData.numToSelect;
798
+ let withReplacement = uniqueVariantData.withReplacement;
799
+ let numChildren = serializedComponent.children.length;
800
+ let childrenToSelect = serializedComponent.children;
801
+
802
+ if (numberOfVariantsByChild.length === 0) {
803
+ return { success: true, desiredVariant: { indices: [] } };
804
+ }
805
+
806
+ let combinations;
807
+
808
+ if (numToSelect === 1) {
809
+ combinations = [...Array(numChildren).keys()].map((x) => [x]);
810
+ } else {
811
+ combinations = enumerateSelectionCombinations({
812
+ numberOfIndices: numToSelect,
813
+ numberOfOptions: numChildren,
814
+ // maxNumber: variantIndex,
815
+ withReplacement: withReplacement,
816
+ });
817
+ }
818
+
819
+ // console.log(combinations);
820
+
821
+ let numberOfCombinations = combinations.length;
822
+
823
+ // for each combination, determine the number of possibilities
824
+ let combinationsAvailable = combinations.map((x) => ({
825
+ combination: x,
826
+ numberOfPossibilities: x.reduce(
827
+ (a, c) => a * numberOfVariantsByChild[c],
828
+ 1,
829
+ ),
830
+ }));
831
+
832
+ // console.log(combinationsAvailable);
833
+ // console.log(numberOfVariantsByChild);
834
+
835
+ // The variants, in order, will
836
+ // select the first possibility from each combination
837
+ // followed by the second possibility, etc.
838
+ // When the possibilities from the combination are exhausted
839
+ // skip that combination
840
+
841
+ let combinationsLeft = [...Array(numberOfCombinations).keys()];
842
+ let possibilitiesUsed = 0;
843
+ let nCombinationsLeft = combinationsLeft.length;
844
+ let combinationIndexSelected, variantIndexOfSelected;
845
+
846
+ let variantIndexLeft = variantIndex - 1;
847
+
848
+ while (nCombinationsLeft > 0) {
849
+ // find minimum number of possibilities in those that are left
850
+
851
+ let minNumPos = combinationsLeft
852
+ .map((ind) => combinationsAvailable[ind])
853
+ .reduce((a, c) => Math.min(a, c.numberOfPossibilities), Infinity);
854
+
855
+ let chunksize = minNumPos - possibilitiesUsed;
856
+
857
+ if (variantIndexLeft < chunksize * nCombinationsLeft) {
858
+ // won't exhaust the possibilities for any combination
859
+ combinationIndexSelected =
860
+ combinationsLeft[variantIndexLeft % nCombinationsLeft];
861
+ variantIndexOfSelected =
862
+ possibilitiesUsed +
863
+ Math.floor(variantIndexLeft / nCombinationsLeft) +
864
+ 1;
865
+ break;
866
+ } else {
867
+ possibilitiesUsed += chunksize;
868
+ variantIndexLeft -= chunksize * nCombinationsLeft;
869
+ combinationsLeft = combinationsLeft.filter(
870
+ (ind) =>
871
+ combinationsAvailable[ind].numberOfPossibilities >
872
+ possibilitiesUsed,
873
+ );
874
+ nCombinationsLeft = combinationsLeft.length;
875
+ }
876
+ }
877
+
878
+ // console.log("combinationIndexSelected: ", combinationIndexSelected)
879
+ // console.log("variantIndexOfSelected: ", variantIndexOfSelected)
880
+
881
+ let selectedCombination = combinations[combinationIndexSelected];
882
+ // console.log("selectedCombination: ", selectedCombination)
883
+
884
+ let indicesForEachChild = enumerateCombinations({
885
+ numberOfOptionsByIndex: selectedCombination.map(
886
+ (x) => numberOfVariantsByChild[x],
887
+ ),
888
+ maxNumber: variantIndexOfSelected,
889
+ })[variantIndexOfSelected - 1].map((x) => x + 1);
890
+
891
+ // console.log("indicesForEachChild: " + indicesForEachChild)
892
+
893
+ // for each selected child, find the descendant variant components
894
+ // and map the variant number (index) of that child
895
+ // to the indices of those descendant variant components
896
+
897
+ let subvariants = [];
898
+
899
+ let haveNontrivialSubvariants = false;
900
+ for (let [ind, childNum] of selectedCombination.entries()) {
901
+ if (numberOfVariantsByChild[childNum] > 1) {
902
+ let child = childrenToSelect[childNum];
903
+ let compClass =
904
+ componentInfoObjects.allComponentClasses[child.componentType];
905
+ let result = compClass.getUniqueVariant({
906
+ serializedComponent: child,
907
+ variantIndex: indicesForEachChild[ind],
908
+ componentInfoObjects,
909
+ });
910
+ if (!result.success) {
911
+ return { success: false };
912
+ }
913
+ subvariants.push(result.desiredVariant);
914
+ haveNontrivialSubvariants = true;
915
+ } else {
916
+ subvariants.push({});
917
+ }
918
+ }
919
+
920
+ let desiredVariant = { indices: selectedCombination.map((x) => x + 1) };
921
+ if (haveNontrivialSubvariants) {
922
+ desiredVariant.subvariants = subvariants;
923
+ }
924
+ return { success: true, desiredVariant: desiredVariant };
925
+ }
926
+ }
927
+
928
+ // counts the number of options (including permutations)
929
+ // where you can select numItems from numOptionsByItem (without replacement)
930
+ // and each select gets multiplied by the total number of options of that selection
931
+ let countOptions = function (numOptionsByItem, numItems) {
932
+ if (numItems === 0) {
933
+ return 0;
934
+ }
935
+ if (numItems === 1) {
936
+ // if select just one item, simply add up all the different options
937
+ return numOptionsByItem.reduce((a, c) => a + c);
938
+ }
939
+ let numOptions = 0;
940
+ for (let ind in numOptionsByItem) {
941
+ let num = numOptionsByItem[ind];
942
+ let rest = [...numOptionsByItem];
943
+ rest.splice(ind, 1); // remove selected item
944
+ numOptions += num * countOptions(rest, numItems - 1);
945
+ }
946
+ return numOptions;
947
+ };