@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.
- package/.prettierrc +3 -0
- package/LICENSE +661 -0
- package/README.md +146 -0
- package/cypress/e2e/ActivityViewer/activityVariants.cy.js +1770 -0
- package/cypress/e2e/ActivityViewer/compiledActivity.cy.js +83 -0
- package/cypress/e2e/ActivityViewer/relationshipsAmongPages.cy.js +697 -0
- package/cypress/e2e/answerValidation/errorinnumbers.cy.js +2125 -0
- package/cypress/e2e/answerValidation/factoring.cy.js +1945 -0
- package/cypress/e2e/answerValidation/factoringOldAlgorithm.cy.js +892 -0
- package/cypress/e2e/answerValidation/functionanswers.cy.js +314 -0
- package/cypress/e2e/answerValidation/matchingpatterns.cy.js +287 -0
- package/cypress/e2e/answerValidation/matchpartial.cy.js +6711 -0
- package/cypress/e2e/answerValidation/pointlocation.cy.js +3989 -0
- package/cypress/e2e/answerValidation/symbolicequality.cy.js +1893 -0
- package/cypress/e2e/answerValidation/videoProgress.cy.js +210 -0
- package/cypress/e2e/assignNames/basiccopy.cy.js +2376 -0
- package/cypress/e2e/assignNames/collections.cy.js +9247 -0
- package/cypress/e2e/assignNames/selects.cy.js +105 -0
- package/cypress/e2e/assignNames/sequences.cy.js +1964 -0
- package/cypress/e2e/baseComponent/basecomponentproperties.cy.js +999 -0
- package/cypress/e2e/baseComponent/doenetMLtext.cy.js +427 -0
- package/cypress/e2e/chemistry/atom.cy.js +201 -0
- package/cypress/e2e/chemistry/ion.cy.js +608 -0
- package/cypress/e2e/chemistry/ioniccompound.cy.js +133 -0
- package/cypress/e2e/dynamicalsystem/cobwebpolyline.cy.js +2653 -0
- package/cypress/e2e/dynamicalsystem/equilibriumcurve.cy.js +311 -0
- package/cypress/e2e/dynamicalsystem/equilibriumline.cy.js +279 -0
- package/cypress/e2e/dynamicalsystem/equilibriumpoint.cy.js +283 -0
- package/cypress/e2e/dynamicalsystem/odesystem.cy.js +1834 -0
- package/cypress/e2e/equality/mathexpressions.cy.js +948 -0
- package/cypress/e2e/graphing/graphreferences.cy.js +978 -0
- package/cypress/e2e/graphing/graphreferences2.cy.js +615 -0
- package/cypress/e2e/linearAlgebra/eigenDecomposition.cy.js +401 -0
- package/cypress/e2e/tagSpecific/angle.cy.js +3898 -0
- package/cypress/e2e/tagSpecific/animatefromsequence.cy.js +2306 -0
- package/cypress/e2e/tagSpecific/answer.cy.js +31647 -0
- package/cypress/e2e/tagSpecific/bestfitline.cy.js +612 -0
- package/cypress/e2e/tagSpecific/blockquote.cy.js +30 -0
- package/cypress/e2e/tagSpecific/boolean.cy.js +742 -0
- package/cypress/e2e/tagSpecific/booleaninput.cy.js +1283 -0
- package/cypress/e2e/tagSpecific/booleanlist.cy.js +588 -0
- package/cypress/e2e/tagSpecific/booleanoperators.cy.js +596 -0
- package/cypress/e2e/tagSpecific/booleanoperatorsonmath.cy.js +498 -0
- package/cypress/e2e/tagSpecific/callaction.cy.js +2835 -0
- package/cypress/e2e/tagSpecific/choiceinput.cy.js +3205 -0
- package/cypress/e2e/tagSpecific/circle.cy.js +22036 -0
- package/cypress/e2e/tagSpecific/codeeditor.cy.js +1995 -0
- package/cypress/e2e/tagSpecific/collect.cy.js +5035 -0
- package/cypress/e2e/tagSpecific/componentsize.cy.js +502 -0
- package/cypress/e2e/tagSpecific/conditionalcontent.cy.js +3495 -0
- package/cypress/e2e/tagSpecific/contentBrowser.cy.js +335 -0
- package/cypress/e2e/tagSpecific/contentpicker.cy.js +261 -0
- package/cypress/e2e/tagSpecific/copy.cy.js +12627 -0
- package/cypress/e2e/tagSpecific/copy2.cy.js +5698 -0
- package/cypress/e2e/tagSpecific/curve.bezier.cy.js +12440 -0
- package/cypress/e2e/tagSpecific/curve.cy.js +1716 -0
- package/cypress/e2e/tagSpecific/curve.function.cy.js +1471 -0
- package/cypress/e2e/tagSpecific/curve.parametrized.cy.js +920 -0
- package/cypress/e2e/tagSpecific/document.cy.js +234 -0
- package/cypress/e2e/tagSpecific/endpoint.cy.js +197 -0
- package/cypress/e2e/tagSpecific/evaluate.cy.js +8895 -0
- package/cypress/e2e/tagSpecific/extract.cy.js +2282 -0
- package/cypress/e2e/tagSpecific/feedback.cy.js +2941 -0
- package/cypress/e2e/tagSpecific/function.cy.js +9450 -0
- package/cypress/e2e/tagSpecific/functioniterates.cy.js +1178 -0
- package/cypress/e2e/tagSpecific/functionoperators.cy.js +4047 -0
- package/cypress/e2e/tagSpecific/graph.cy.js +2491 -0
- package/cypress/e2e/tagSpecific/group.cy.js +683 -0
- package/cypress/e2e/tagSpecific/hint.cy.js +204 -0
- package/cypress/e2e/tagSpecific/image.cy.js +770 -0
- package/cypress/e2e/tagSpecific/integer.cy.js +206 -0
- package/cypress/e2e/tagSpecific/label.cy.js +800 -0
- package/cypress/e2e/tagSpecific/legend.cy.js +1001 -0
- package/cypress/e2e/tagSpecific/line.cy.js +12167 -0
- package/cypress/e2e/tagSpecific/linesegment.cy.js +4749 -0
- package/cypress/e2e/tagSpecific/lorem.cy.js +289 -0
- package/cypress/e2e/tagSpecific/map.cy.js +4476 -0
- package/cypress/e2e/tagSpecific/matchespattern.cy.js +693 -0
- package/cypress/e2e/tagSpecific/math.cy.js +10990 -0
- package/cypress/e2e/tagSpecific/mathdisplay.cy.js +2689 -0
- package/cypress/e2e/tagSpecific/mathinput.cy.js +15628 -0
- package/cypress/e2e/tagSpecific/mathinputgraph.cy.js +566 -0
- package/cypress/e2e/tagSpecific/mathlist.cy.js +4073 -0
- package/cypress/e2e/tagSpecific/mathoperators.cy.js +13851 -0
- package/cypress/e2e/tagSpecific/matrix.cy.js +8825 -0
- package/cypress/e2e/tagSpecific/matrixinput.cy.js +16277 -0
- package/cypress/e2e/tagSpecific/module.cy.js +1771 -0
- package/cypress/e2e/tagSpecific/number.cy.js +2221 -0
- package/cypress/e2e/tagSpecific/numberlist.cy.js +1285 -0
- package/cypress/e2e/tagSpecific/p.cy.js +72 -0
- package/cypress/e2e/tagSpecific/paginator.cy.js +2983 -0
- package/cypress/e2e/tagSpecific/parabola.cy.js +14331 -0
- package/cypress/e2e/tagSpecific/paragraphmarkup.cy.js +104 -0
- package/cypress/e2e/tagSpecific/periodicset.cy.js +1439 -0
- package/cypress/e2e/tagSpecific/piecewisefunction.cy.js +1055 -0
- package/cypress/e2e/tagSpecific/pluralize.cy.js +274 -0
- package/cypress/e2e/tagSpecific/point.cy.js +8895 -0
- package/cypress/e2e/tagSpecific/point2.cy.js +10259 -0
- package/cypress/e2e/tagSpecific/polygon.cy.js +5039 -0
- package/cypress/e2e/tagSpecific/polyline.cy.js +4704 -0
- package/cypress/e2e/tagSpecific/problem.cy.js +2768 -0
- package/cypress/e2e/tagSpecific/ray.cy.js +10770 -0
- package/cypress/e2e/tagSpecific/rectangle.cy.js +2143 -0
- package/cypress/e2e/tagSpecific/ref.cy.js +420 -0
- package/cypress/e2e/tagSpecific/regularPolygon.cy.js +1006 -0
- package/cypress/e2e/tagSpecific/regularPolygon2.cy.js +100 -0
- package/cypress/e2e/tagSpecific/regularPolygon3.cy.js +777 -0
- package/cypress/e2e/tagSpecific/samplerandomnumbers.cy.js +3619 -0
- package/cypress/e2e/tagSpecific/sectioning.cy.js +3530 -0
- package/cypress/e2e/tagSpecific/select.cy.js +5376 -0
- package/cypress/e2e/tagSpecific/selectfromsequence.cy.js +3846 -0
- package/cypress/e2e/tagSpecific/selectrandomnumbers.cy.js +2914 -0
- package/cypress/e2e/tagSpecific/sequence.cy.js +2093 -0
- package/cypress/e2e/tagSpecific/shuffle.cy.js +490 -0
- package/cypress/e2e/tagSpecific/sidebyside.cy.js +8057 -0
- package/cypress/e2e/tagSpecific/singlecharactercomponents.cy.js +72 -0
- package/cypress/e2e/tagSpecific/slider.cy.js +914 -0
- package/cypress/e2e/tagSpecific/solution.cy.js +109 -0
- package/cypress/e2e/tagSpecific/solveequations.cy.js +1026 -0
- package/cypress/e2e/tagSpecific/sort.cy.js +1685 -0
- package/cypress/e2e/tagSpecific/spreadsheet.cy.js +5971 -0
- package/cypress/e2e/tagSpecific/subsetofreals.cy.js +2725 -0
- package/cypress/e2e/tagSpecific/substitute.cy.js +2646 -0
- package/cypress/e2e/tagSpecific/tabular.cy.js +36 -0
- package/cypress/e2e/tagSpecific/text.cy.js +975 -0
- package/cypress/e2e/tagSpecific/textinput.cy.js +2177 -0
- package/cypress/e2e/tagSpecific/textlist.cy.js +369 -0
- package/cypress/e2e/tagSpecific/triangle.cy.js +1936 -0
- package/cypress/e2e/tagSpecific/triggerset.cy.js +2023 -0
- package/cypress/e2e/tagSpecific/updatevalue.cy.js +3288 -0
- package/cypress/e2e/tagSpecific/vector.cy.js +20183 -0
- package/cypress/e2e/tagSpecific/video.cy.js +612 -0
- package/cypress/e2e/tagSpecific/when.cy.js +202 -0
- package/cypress/e2e/variants/specifysinglevariant.cy.js +6726 -0
- package/cypress/e2e/variants/uniquevariants.cy.js +4846 -0
- package/cypress/fixtures/example.json +5 -0
- package/cypress/support/commands.js +32 -0
- package/cypress/support/e2e.js +31 -0
- package/cypress.config.js +18 -0
- package/docs/codeSnippet.jsx +11 -0
- package/docs/index.html +133 -0
- package/docs/index.jsx +138 -0
- package/docs/prism.css +3 -0
- package/index.html +14 -0
- package/index.js +21 -0
- package/media/answer_example.png +0 -0
- package/media/graph_example.png +0 -0
- package/media/graph_markup_example.png +0 -0
- package/package.json +83 -0
- package/public/favicon.ico +0 -0
- package/public/fonts/files/open-sans-v18-latin-700.woff +0 -0
- package/public/fonts/files/open-sans-v18-latin-700.woff2 +0 -0
- package/public/fonts/files/open-sans-v18-latin-700italic.woff +0 -0
- package/public/fonts/files/open-sans-v18-latin-700italic.woff2 +0 -0
- package/public/fonts/files/open-sans-v18-latin-italic.woff +0 -0
- package/public/fonts/files/open-sans-v18-latin-italic.woff2 +0 -0
- package/public/fonts/files/open-sans-v18-latin-light-italic.woff +0 -0
- package/public/fonts/files/open-sans-v18-latin-light-italic.woff2 +0 -0
- package/public/fonts/files/open-sans-v18-latin-light.woff +0 -0
- package/public/fonts/files/open-sans-v18-latin-light.woff2 +0 -0
- package/public/fonts/files/open-sans-v18-latin-regular.woff +0 -0
- package/public/fonts/files/open-sans-v18-latin-regular.woff2 +0 -0
- package/src/Core/ComponentTypes.js +426 -0
- package/src/Core/Core.js +11852 -0
- package/src/Core/CoreWorker.js +127 -0
- package/src/Core/Dependencies.js +8226 -0
- package/src/Core/Numerics.js +473 -0
- package/src/Core/ParameterStack.js +36 -0
- package/src/Core/ReadOnlyProxyHandler.js +41 -0
- package/src/Core/StateProxyHandler.js +88 -0
- package/src/Core/components/Aliases.js +67 -0
- package/src/Core/components/Angle.js +758 -0
- package/src/Core/components/AnimateFromSequence.js +922 -0
- package/src/Core/components/Answer.js +2087 -0
- package/src/Core/components/AsList.js +83 -0
- package/src/Core/components/AttractTo.js +245 -0
- package/src/Core/components/AttractToAngles.js +262 -0
- package/src/Core/components/AttractToConstraint.js +104 -0
- package/src/Core/components/AttractToGrid.js +315 -0
- package/src/Core/components/Award.js +906 -0
- package/src/Core/components/BestFitLine.js +318 -0
- package/src/Core/components/BezierControls.js +719 -0
- package/src/Core/components/BlockQuote.js +35 -0
- package/src/Core/components/Boolean.js +500 -0
- package/src/Core/components/BooleanInput.js +330 -0
- package/src/Core/components/BooleanList.js +396 -0
- package/src/Core/components/BooleanOperators.js +35 -0
- package/src/Core/components/BooleanOperatorsOfMath.js +148 -0
- package/src/Core/components/CallAction.js +261 -0
- package/src/Core/components/Caption.js +73 -0
- package/src/Core/components/Case.js +56 -0
- package/src/Core/components/Cell.js +439 -0
- package/src/Core/components/CellBlock.js +64 -0
- package/src/Core/components/Chart.js +795 -0
- package/src/Core/components/Choice.js +266 -0
- package/src/Core/components/ChoiceInput.js +1407 -0
- package/src/Core/components/Circle.js +2884 -0
- package/src/Core/components/CodeEditor.js +647 -0
- package/src/Core/components/CodeViewer.js +294 -0
- package/src/Core/components/CollaborateGroupSetup.js +46 -0
- package/src/Core/components/CollaborateGroups.js +119 -0
- package/src/Core/components/Collect.js +850 -0
- package/src/Core/components/Column.js +608 -0
- package/src/Core/components/ConditionalContent.js +468 -0
- package/src/Core/components/ConsiderAsResponses.js +49 -0
- package/src/Core/components/ConstrainTo.js +161 -0
- package/src/Core/components/ConstrainToAngles.js +244 -0
- package/src/Core/components/ConstrainToGraph.js +142 -0
- package/src/Core/components/ConstrainToGrid.js +175 -0
- package/src/Core/components/ConstraintUnion.js +119 -0
- package/src/Core/components/Constraints.js +497 -0
- package/src/Core/components/ContentBrowser.js +441 -0
- package/src/Core/components/ContentPicker.js +263 -0
- package/src/Core/components/ControlVectors.js +25 -0
- package/src/Core/components/Coords.js +63 -0
- package/src/Core/components/Copy.js +3412 -0
- package/src/Core/components/Curve.js +4130 -0
- package/src/Core/components/CustomAttribute.js +175 -0
- package/src/Core/components/DataFrame.js +357 -0
- package/src/Core/components/DiscreteSimulationResultList.js +342 -0
- package/src/Core/components/DiscreteSimulationResultPolyline.js +581 -0
- package/src/Core/components/Divisions.js +55 -0
- package/src/Core/components/Document.js +888 -0
- package/src/Core/components/Embed.js +65 -0
- package/src/Core/components/Endpoint.js +62 -0
- package/src/Core/components/Evaluate.js +321 -0
- package/src/Core/components/Extract.js +656 -0
- package/src/Core/components/Extrema.js +556 -0
- package/src/Core/components/Feedback.js +200 -0
- package/src/Core/components/FeedbackDefinitions.js +97 -0
- package/src/Core/components/Figure.js +148 -0
- package/src/Core/components/Footnote.js +73 -0
- package/src/Core/components/Function.js +5344 -0
- package/src/Core/components/FunctionIterates.js +306 -0
- package/src/Core/components/FunctionOperators.js +702 -0
- package/src/Core/components/Graph.js +1679 -0
- package/src/Core/components/Group.js +7 -0
- package/src/Core/components/HasSameFactoring.js +407 -0
- package/src/Core/components/Hint.js +241 -0
- package/src/Core/components/Image.js +524 -0
- package/src/Core/components/Indexing.js +79 -0
- package/src/Core/components/IntComma.js +64 -0
- package/src/Core/components/Integer.js +81 -0
- package/src/Core/components/Intersection.js +328 -0
- package/src/Core/components/Interval.js +29 -0
- package/src/Core/components/Label.js +492 -0
- package/src/Core/components/Latex.js +104 -0
- package/src/Core/components/Legend.js +329 -0
- package/src/Core/components/Line.js +2040 -0
- package/src/Core/components/LineSegment.js +882 -0
- package/src/Core/components/Lists.js +180 -0
- package/src/Core/components/Lorem.js +249 -0
- package/src/Core/components/MMeMen.js +377 -0
- package/src/Core/components/Map.js +873 -0
- package/src/Core/components/Markers.js +101 -0
- package/src/Core/components/MatchesPattern.js +339 -0
- package/src/Core/components/Math.js +2552 -0
- package/src/Core/components/MathInput.js +948 -0
- package/src/Core/components/MathList.js +828 -0
- package/src/Core/components/MathOperators.js +1286 -0
- package/src/Core/components/Matrix.js +497 -0
- package/src/Core/components/MatrixInput.js +3157 -0
- package/src/Core/components/MdMdnMrow.js +394 -0
- package/src/Core/components/Module.js +16 -0
- package/src/Core/components/Number.js +1031 -0
- package/src/Core/components/NumberList.js +550 -0
- package/src/Core/components/Option.js +24 -0
- package/src/Core/components/P.js +71 -0
- package/src/Core/components/Paginator.js +338 -0
- package/src/Core/components/Panel.js +126 -0
- package/src/Core/components/Parabola.js +1561 -0
- package/src/Core/components/ParagraphMarkup.js +59 -0
- package/src/Core/components/Pegboard.js +43 -0
- package/src/Core/components/PeriodicSet.js +291 -0
- package/src/Core/components/PiecewiseFunction.js +832 -0
- package/src/Core/components/Pluralize.js +198 -0
- package/src/Core/components/Point.js +1295 -0
- package/src/Core/components/Polygon.js +408 -0
- package/src/Core/components/Polyline.js +841 -0
- package/src/Core/components/RandomizedTextList.js +225 -0
- package/src/Core/components/Ray.js +1737 -0
- package/src/Core/components/Rectangle.js +1535 -0
- package/src/Core/components/Ref.js +350 -0
- package/src/Core/components/RegionBetweenCurveXAxis.js +124 -0
- package/src/Core/components/RegionHalfPlane.js +107 -0
- package/src/Core/components/RegularPolygon.js +2118 -0
- package/src/Core/components/RenderDoenetML.js +181 -0
- package/src/Core/components/Row.js +780 -0
- package/src/Core/components/SampleRandomNumbers.js +653 -0
- package/src/Core/components/Sectioning.js +303 -0
- package/src/Core/components/Select.js +947 -0
- package/src/Core/components/SelectFromSequence.js +1242 -0
- package/src/Core/components/SelectRandomNumbers.js +225 -0
- package/src/Core/components/Sequence.js +444 -0
- package/src/Core/components/Setup.js +53 -0
- package/src/Core/components/Shuffle.js +470 -0
- package/src/Core/components/SideBySide.js +2130 -0
- package/src/Core/components/SingleCharacterComponents.js +41 -0
- package/src/Core/components/Slider.js +819 -0
- package/src/Core/components/SolutionContainer.js +67 -0
- package/src/Core/components/Solutions.js +334 -0
- package/src/Core/components/SolveEquations.js +568 -0
- package/src/Core/components/Sort.js +398 -0
- package/src/Core/components/Sources.js +108 -0
- package/src/Core/components/Split.js +205 -0
- package/src/Core/components/Spreadsheet.js +1507 -0
- package/src/Core/components/StyleDefinitions.js +111 -0
- package/src/Core/components/SubsetOfReals.js +348 -0
- package/src/Core/components/SubsetOfRealsInput.js +1474 -0
- package/src/Core/components/Substitute.js +496 -0
- package/src/Core/components/SummaryStatistics.js +652 -0
- package/src/Core/components/Table.js +145 -0
- package/src/Core/components/Tabular.js +384 -0
- package/src/Core/components/Template.js +360 -0
- package/src/Core/components/Text.js +341 -0
- package/src/Core/components/TextInput.js +566 -0
- package/src/Core/components/TextList.js +442 -0
- package/src/Core/components/TextListFromString.js +137 -0
- package/src/Core/components/TextOperatorsOfMath.js +21 -0
- package/src/Core/components/Triangle.js +280 -0
- package/src/Core/components/TriggerSet.js +189 -0
- package/src/Core/components/TupleList.js +43 -0
- package/src/Core/components/UpdateValue.js +435 -0
- package/src/Core/components/VariantControl.js +36 -0
- package/src/Core/components/Vector.js +2478 -0
- package/src/Core/components/Verbatim.js +125 -0
- package/src/Core/components/Video.js +673 -0
- package/src/Core/components/When.js +198 -0
- package/src/Core/components/abstract/AngleListComponent.js +140 -0
- package/src/Core/components/abstract/BaseComponent.js +1496 -0
- package/src/Core/components/abstract/BlockComponent.js +5 -0
- package/src/Core/components/abstract/BooleanBaseOperator.js +88 -0
- package/src/Core/components/abstract/BooleanBaseOperatorOfMath.js +100 -0
- package/src/Core/components/abstract/BooleanBaseOperatorOneInput.js +44 -0
- package/src/Core/components/abstract/ComponentSize.js +789 -0
- package/src/Core/components/abstract/ComponentWithSelectableType.js +537 -0
- package/src/Core/components/abstract/CompositeComponent.js +142 -0
- package/src/Core/components/abstract/ConstraintComponent.js +19 -0
- package/src/Core/components/abstract/FunctionBaseOperator.js +680 -0
- package/src/Core/components/abstract/GraphicalComponent.js +56 -0
- package/src/Core/components/abstract/InlineComponent.js +5 -0
- package/src/Core/components/abstract/InlineRenderInlineChildren.js +63 -0
- package/src/Core/components/abstract/Input.js +192 -0
- package/src/Core/components/abstract/IntervalListComponent.js +218 -0
- package/src/Core/components/abstract/LineListComponent.js +114 -0
- package/src/Core/components/abstract/MathBaseOperator.js +631 -0
- package/src/Core/components/abstract/MathBaseOperatorOneInput.js +112 -0
- package/src/Core/components/abstract/PointListComponent.js +238 -0
- package/src/Core/components/abstract/SectioningComponent.js +1262 -0
- package/src/Core/components/abstract/SingleCharacterInline.js +23 -0
- package/src/Core/components/abstract/TextBaseOperatorOfMath.js +47 -0
- package/src/Core/components/abstract/TextOrInline.js +66 -0
- package/src/Core/components/abstract/VariableName.js +31 -0
- package/src/Core/components/abstract/VariableNameList.js +83 -0
- package/src/Core/components/abstract/VectorListComponent.js +235 -0
- package/src/Core/components/chemistry/Atom.js +910 -0
- package/src/Core/components/chemistry/ElectronConfiguration.js +36 -0
- package/src/Core/components/chemistry/Ion.js +684 -0
- package/src/Core/components/chemistry/IonicCompound.js +189 -0
- package/src/Core/components/chemistry/OrbitalDiagram.js +175 -0
- package/src/Core/components/chemistry/OrbitalDiagramInput.js +753 -0
- package/src/Core/components/chemistry/index.js +6 -0
- package/src/Core/components/commonsugar/breakstrings.js +627 -0
- package/src/Core/components/commonsugar/lists.js +177 -0
- package/src/Core/components/dynamicalSystems/CobwebPolyline.js +913 -0
- package/src/Core/components/dynamicalSystems/EquilibriumCurve.js +95 -0
- package/src/Core/components/dynamicalSystems/EquilibriumLine.js +93 -0
- package/src/Core/components/dynamicalSystems/EquilibriumPoint.js +93 -0
- package/src/Core/components/dynamicalSystems/ODESystem.js +943 -0
- package/src/Core/components/dynamicalSystems/index.js +5 -0
- package/src/Core/components/linearAlgebra/EigenDecomposition.js +294 -0
- package/src/Core/utils/array.js +30 -0
- package/src/Core/utils/booleanLogic.js +965 -0
- package/src/Core/utils/checkEquality.js +818 -0
- package/src/Core/utils/cid.js +29 -0
- package/src/Core/utils/componentInfoObjects.js +100 -0
- package/src/Core/utils/constraints.js +23 -0
- package/src/Core/utils/copy.js +572 -0
- package/src/Core/utils/deepFunctions.js +173 -0
- package/src/Core/utils/descendants.js +252 -0
- package/src/Core/utils/enumeration.js +234 -0
- package/src/Core/utils/feedback.js +84 -0
- package/src/Core/utils/function.js +1343 -0
- package/src/Core/utils/graphical.js +196 -0
- package/src/Core/utils/label.js +396 -0
- package/src/Core/utils/math.js +1056 -0
- package/src/Core/utils/naming.js +45 -0
- package/src/Core/utils/periodicSetEquality.js +403 -0
- package/src/Core/utils/randomNumbers.js +70 -0
- package/src/Core/utils/retrieveMedia.js +98 -0
- package/src/Core/utils/retrieveTextFile.js +140 -0
- package/src/Core/utils/returnAllPossibleVariants.js +73 -0
- package/src/Core/utils/rounding.js +316 -0
- package/src/Core/utils/sequence.js +754 -0
- package/src/Core/utils/serializedStateProcessing.js +4049 -0
- package/src/Core/utils/size.js +22 -0
- package/src/Core/utils/stateVariables.js +138 -0
- package/src/Core/utils/style.js +535 -0
- package/src/Core/utils/subset-of-reals.js +796 -0
- package/src/Core/utils/table.js +41 -0
- package/src/Core/utils/text.js +16 -0
- package/src/Core/utils/triggering.js +167 -0
- package/src/Core/utils/variants.js +477 -0
- package/src/DoenetML.css +308 -0
- package/src/DoenetML.jsx +201 -0
- package/src/Parser/doenet.grammar +90 -0
- package/src/Parser/doenet.js +33 -0
- package/src/Parser/doenet.terms.js +20 -0
- package/src/Parser/parser.js +266 -0
- package/src/Parser/tokens.js +129 -0
- package/src/Tools/CodeMirror.jsx +440 -0
- package/src/Tools/DarkmodeController.jsx +21 -0
- package/src/Tools/Footers/MathInputSelector.jsx +34 -0
- package/src/Tools/Footers/VirtualKeyboard.jsx +751 -0
- package/src/Tools/cypressTest/CypressTest.jsx +341 -0
- package/src/Tools/cypressTest/index.html +102 -0
- package/src/Tools/cypressTest/index.jsx +40 -0
- package/src/Viewer/ActivityViewer.jsx +1461 -0
- package/src/Viewer/PageViewer.jsx +1329 -0
- package/src/Viewer/renderers/alert.jsx +17 -0
- package/src/Viewer/renderers/angle.jsx +209 -0
- package/src/Viewer/renderers/answer.jsx +206 -0
- package/src/Viewer/renderers/asList.jsx +25 -0
- package/src/Viewer/renderers/blockQuote.jsx +41 -0
- package/src/Viewer/renderers/boolean.jsx +17 -0
- package/src/Viewer/renderers/booleanInput.css +105 -0
- package/src/Viewer/renderers/booleanInput.jsx +636 -0
- package/src/Viewer/renderers/button.jsx +369 -0
- package/src/Viewer/renderers/c.jsx +17 -0
- package/src/Viewer/renderers/callAction.jsx +18 -0
- package/src/Viewer/renderers/cell.jsx +59 -0
- package/src/Viewer/renderers/chart.jsx +83 -0
- package/src/Viewer/renderers/choiceInput.css +223 -0
- package/src/Viewer/renderers/choiceInput.jsx +535 -0
- package/src/Viewer/renderers/circle.jsx +990 -0
- package/src/Viewer/renderers/cobwebPolyline.jsx +442 -0
- package/src/Viewer/renderers/codeEditor.jsx +248 -0
- package/src/Viewer/renderers/codeViewer.jsx +105 -0
- package/src/Viewer/renderers/containerBlock.jsx +41 -0
- package/src/Viewer/renderers/containerInline.jsx +17 -0
- package/src/Viewer/renderers/contentBrowser.jsx +159 -0
- package/src/Viewer/renderers/contentPicker.jsx +160 -0
- package/src/Viewer/renderers/curve.jsx +1072 -0
- package/src/Viewer/renderers/ellipsis.jsx +17 -0
- package/src/Viewer/renderers/em.jsx +17 -0
- package/src/Viewer/renderers/embed.jsx +110 -0
- package/src/Viewer/renderers/feedback.jsx +74 -0
- package/src/Viewer/renderers/figure.jsx +131 -0
- package/src/Viewer/renderers/footnote.jsx +52 -0
- package/src/Viewer/renderers/graph.jsx +925 -0
- package/src/Viewer/renderers/hint.jsx +142 -0
- package/src/Viewer/renderers/image.jsx +581 -0
- package/src/Viewer/renderers/jsxgraph-distrib/jsxgraphcore.mjs +2 -0
- package/src/Viewer/renderers/jsxgraph-distrib/jsxgraphcore.mjs.map +1 -0
- package/src/Viewer/renderers/label.jsx +470 -0
- package/src/Viewer/renderers/legend.jsx +306 -0
- package/src/Viewer/renderers/line.jsx +511 -0
- package/src/Viewer/renderers/lineSegment.jsx +754 -0
- package/src/Viewer/renderers/list.jsx +111 -0
- package/src/Viewer/renderers/lq.jsx +12 -0
- package/src/Viewer/renderers/lsq.jsx +12 -0
- package/src/Viewer/renderers/math.jsx +582 -0
- package/src/Viewer/renderers/mathInput.css +10 -0
- package/src/Viewer/renderers/mathInput.jsx +425 -0
- package/src/Viewer/renderers/mathInputog.jsx +534 -0
- package/src/Viewer/renderers/mathList.jsx +39 -0
- package/src/Viewer/renderers/matrixInput.jsx +317 -0
- package/src/Viewer/renderers/mdash.jsx +12 -0
- package/src/Viewer/renderers/nbsp.jsx +12 -0
- package/src/Viewer/renderers/ndash.jsx +12 -0
- package/src/Viewer/renderers/number.jsx +454 -0
- package/src/Viewer/renderers/numberList.jsx +35 -0
- package/src/Viewer/renderers/orbitalDiagram.jsx +247 -0
- package/src/Viewer/renderers/orbitalDiagramInput.jsx +450 -0
- package/src/Viewer/renderers/p.jsx +38 -0
- package/src/Viewer/renderers/paginatorControls.jsx +41 -0
- package/src/Viewer/renderers/pegboard.jsx +239 -0
- package/src/Viewer/renderers/point.jsx +649 -0
- package/src/Viewer/renderers/polygon.jsx +612 -0
- package/src/Viewer/renderers/polyline.jsx +608 -0
- package/src/Viewer/renderers/pre.jsx +34 -0
- package/src/Viewer/renderers/q.jsx +17 -0
- package/src/Viewer/renderers/ray.jsx +410 -0
- package/src/Viewer/renderers/ref.jsx +149 -0
- package/src/Viewer/renderers/regionBetweenCurveXAxis.jsx +182 -0
- package/src/Viewer/renderers/renderDoenetML.jsx +56 -0
- package/src/Viewer/renderers/row.jsx +31 -0
- package/src/Viewer/renderers/rq.jsx +12 -0
- package/src/Viewer/renderers/rsq.jsx +12 -0
- package/src/Viewer/renderers/section.jsx +427 -0
- package/src/Viewer/renderers/sideBySide.jsx +80 -0
- package/src/Viewer/renderers/slider.jsx +800 -0
- package/src/Viewer/renderers/solution.jsx +134 -0
- package/src/Viewer/renderers/spreadsheet.jsx +83 -0
- package/src/Viewer/renderers/sq.jsx +17 -0
- package/src/Viewer/renderers/styles/global.css +14 -0
- package/src/Viewer/renderers/subsetOfRealsInput.jsx +392 -0
- package/src/Viewer/renderers/summaryStatistics.jsx +83 -0
- package/src/Viewer/renderers/table.jsx +78 -0
- package/src/Viewer/renderers/tabular.jsx +58 -0
- package/src/Viewer/renderers/tag.jsx +26 -0
- package/src/Viewer/renderers/text.jsx +439 -0
- package/src/Viewer/renderers/textInput.jsx +774 -0
- package/src/Viewer/renderers/textList.jsx +30 -0
- package/src/Viewer/renderers/triggerSet.jsx +52 -0
- package/src/Viewer/renderers/updateValue.jsx +30 -0
- package/src/Viewer/renderers/utils/css.js +13 -0
- package/src/Viewer/renderers/utils/graph.js +159 -0
- package/src/Viewer/renderers/utils/offGraphIndicators.js +91 -0
- package/src/Viewer/renderers/vector.jsx +678 -0
- package/src/Viewer/renderers/video.jsx +494 -0
- package/src/Viewer/useDoenetRenderer.jsx +128 -0
- package/src/main.jsx +16 -0
- package/src/media/fonts/files/open-sans-v18-latin-700.woff +0 -0
- package/src/media/fonts/files/open-sans-v18-latin-700.woff2 +0 -0
- package/src/media/fonts/files/open-sans-v18-latin-700italic.woff +0 -0
- package/src/media/fonts/files/open-sans-v18-latin-700italic.woff2 +0 -0
- package/src/media/fonts/files/open-sans-v18-latin-italic.woff +0 -0
- package/src/media/fonts/files/open-sans-v18-latin-italic.woff2 +0 -0
- package/src/media/fonts/files/open-sans-v18-latin-light-italic.woff +0 -0
- package/src/media/fonts/files/open-sans-v18-latin-light-italic.woff2 +0 -0
- package/src/media/fonts/files/open-sans-v18-latin-light.woff +0 -0
- package/src/media/fonts/files/open-sans-v18-latin-light.woff2 +0 -0
- package/src/media/fonts/files/open-sans-v18-latin-regular.woff +0 -0
- package/src/media/fonts/files/open-sans-v18-latin-regular.woff2 +0 -0
- package/src/test/testCode.doenet +26 -0
- package/src/test/testViewer.jsx +158 -0
- package/src/uiComponents/ActionButton.jsx +157 -0
- package/src/uiComponents/ActionButtonGroup.jsx +93 -0
- package/src/uiComponents/Button.jsx +160 -0
- package/src/uiComponents/ButtonGroup.jsx +56 -0
- package/src/uiComponents/ToggleButton.jsx +194 -0
- package/src/uiComponents/ToggleButtonGroup.jsx +77 -0
- package/src/utils/activityUtils.js +713 -0
- package/src/utils/array.js +17 -0
- package/src/utils/cid.js +34 -0
- package/src/utils/componentInfoObjects.js +89 -0
- package/src/utils/deepFunctions.js +165 -0
- package/src/utils/enumeration.js +226 -0
- package/src/utils/math.js +624 -0
- package/src/utils/naming.js +44 -0
- package/src/utils/retrieveTextFile.js +156 -0
- package/src/utils/returnAllPossibleVariants.js +81 -0
- package/src/utils/sequence.js +715 -0
- package/src/utils/serialize.js +29 -0
- package/src/utils/serializedStateProcessing.js +2587 -0
- package/src/utils/subset-of-reals.js +783 -0
- package/src/utils/url.js +19 -0
- 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
|
+
}
|