@khanacademy/perseus 2.1.0 → 4.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.babelrc.js +1 -1
- package/.eslintrc.js +1 -0
- package/CHANGELOG.md +22 -0
- package/dist/__tests__/mock-asset-loading-widget.d.ts +59 -0
- package/dist/__tests__/mock-asset-loading-widget.js.flow +70 -0
- package/dist/__tests__/mock-widget.d.ts +30 -0
- package/dist/__tests__/mock-widget.js.flow +39 -0
- package/dist/__tests__/test-items/image-item.d.ts +14 -0
- package/dist/__tests__/test-items/image-item.js.flow +20 -0
- package/dist/__tests__/test-items/input-number-1-item.d.ts +9 -0
- package/dist/__tests__/test-items/input-number-1-item.js.flow +15 -0
- package/dist/__tests__/test-items/input-number-2-item.d.ts +9 -0
- package/dist/__tests__/test-items/input-number-2-item.js.flow +15 -0
- package/dist/__tests__/test-items/table-item.d.ts +9 -0
- package/dist/__tests__/test-items/table-item.js.flow +15 -0
- package/dist/a11y.d.ts +5 -0
- package/dist/a11y.js.flow +11 -0
- package/dist/all-widgets.d.ts +22 -0
- package/dist/all-widgets.js.flow +33 -0
- package/dist/article-renderer.d.ts +54 -0
- package/dist/article-renderer.js.flow +69 -0
- package/dist/asset-context.d.ts +14 -0
- package/dist/asset-context.js.flow +15 -0
- package/dist/basic-widgets.d.ts +22 -0
- package/dist/basic-widgets.js.flow +33 -0
- package/dist/components/button-group.d.ts +27 -0
- package/dist/components/button-group.js.flow +33 -0
- package/dist/components/constants.d.ts +7 -0
- package/dist/components/constants.js.flow +13 -0
- package/dist/components/fixed-to-responsive.d.ts +2 -0
- package/dist/components/fixed-to-responsive.js.flow +8 -0
- package/dist/components/graph.d.ts +44 -0
- package/dist/components/graph.js.flow +52 -0
- package/dist/components/graphie-classes.d.ts +13 -0
- package/dist/components/graphie-classes.js.flow +19 -0
- package/dist/components/graphie-movables.d.ts +16 -0
- package/dist/components/graphie-movables.js.flow +22 -0
- package/dist/components/graphie.d.ts +44 -0
- package/dist/components/graphie.js.flow +56 -0
- package/dist/components/highlighting/highlightable-content.d.ts +39 -0
- package/dist/components/highlighting/highlightable-content.js.flow +59 -0
- package/dist/components/highlighting/highlights.d.ts +30 -0
- package/dist/components/highlighting/highlights.js.flow +54 -0
- package/dist/components/highlighting/ranges.d.ts +42 -0
- package/dist/components/highlighting/ranges.js.flow +60 -0
- package/dist/components/highlighting/types.d.ts +64 -0
- package/dist/components/highlighting/types.js.flow +70 -0
- package/dist/components/highlighting/ui/highlight-renderer.d.ts +34 -0
- package/dist/components/highlighting/ui/highlight-renderer.js.flow +45 -0
- package/dist/components/highlighting/ui/highlight-set-renderer.d.ts +34 -0
- package/dist/components/highlighting/ui/highlight-set-renderer.js.flow +44 -0
- package/dist/components/highlighting/ui/highlight-tooltip.d.ts +16 -0
- package/dist/components/highlighting/ui/highlight-tooltip.js.flow +24 -0
- package/dist/components/highlighting/ui/highlighting-ui.d.ts +19 -0
- package/dist/components/highlighting/ui/highlighting-ui.js.flow +30 -0
- package/dist/components/highlighting/ui/selection-tracker.d.ts +47 -0
- package/dist/components/highlighting/ui/selection-tracker.js.flow +56 -0
- package/dist/components/highlighting/ui/types.d.ts +13 -0
- package/dist/components/highlighting/ui/types.js.flow +22 -0
- package/dist/components/highlighting/ui/util.d.ts +28 -0
- package/dist/components/highlighting/ui/util.js.flow +42 -0
- package/dist/components/highlighting/word-indexer.d.ts +28 -0
- package/dist/components/highlighting/word-indexer.js.flow +21 -0
- package/dist/components/hud.d.ts +15 -0
- package/dist/components/hud.js.flow +21 -0
- package/dist/components/icon.d.ts +56 -0
- package/dist/components/icon.js.flow +31 -0
- package/dist/components/image-loader.d.ts +52 -0
- package/dist/components/image-loader.js.flow +49 -0
- package/dist/components/info-tip/info-tip.d.ts +14 -0
- package/dist/components/info-tip/info-tip.js.flow +20 -0
- package/dist/components/info-tip.d.ts +18 -0
- package/dist/components/info-tip.js.flow +18 -0
- package/dist/components/inline-icon.d.ts +10 -0
- package/dist/components/inline-icon.js.flow +16 -0
- package/dist/components/input-with-examples.d.ts +52 -0
- package/dist/components/input-with-examples.js.flow +58 -0
- package/dist/components/lint.d.ts +23 -0
- package/dist/components/lint.js.flow +29 -0
- package/dist/components/math-input.d.ts +40 -0
- package/dist/components/math-input.js.flow +46 -0
- package/dist/components/math-output.d.ts +23 -0
- package/dist/components/math-output.js.flow +29 -0
- package/dist/components/multi-button-group.d.ts +29 -0
- package/dist/components/multi-button-group.js.flow +35 -0
- package/dist/components/number-input.d.ts +34 -0
- package/dist/components/number-input.js.flow +42 -0
- package/dist/components/prop-check-box.d.ts +2 -0
- package/dist/components/prop-check-box.js.flow +8 -0
- package/dist/components/range-input.d.ts +14 -0
- package/dist/components/range-input.js.flow +20 -0
- package/dist/components/simple-keypad-input.d.ts +19 -0
- package/dist/components/simple-keypad-input.js.flow +16 -0
- package/dist/components/sortable.d.ts +68 -0
- package/dist/components/sortable.js.flow +78 -0
- package/dist/components/stub-tag-editor.d.ts +25 -0
- package/dist/components/stub-tag-editor.js.flow +18 -0
- package/dist/components/svg-image.d.ts +74 -0
- package/dist/components/svg-image.js.flow +83 -0
- package/dist/components/tex-buttons.d.ts +20 -0
- package/dist/components/tex-buttons.js.flow +26 -0
- package/dist/components/tex.d.ts +25 -0
- package/dist/components/tex.js.flow +25 -0
- package/dist/components/text-input.d.ts +33 -0
- package/dist/components/text-input.js.flow +39 -0
- package/dist/components/text-list-editor.d.ts +16 -0
- package/dist/components/text-list-editor.js.flow +22 -0
- package/dist/components/tooltip.d.ts +32 -0
- package/dist/components/tooltip.js.flow +38 -0
- package/dist/components/visibility-observer/create-visibility-observer.d.ts +34 -0
- package/dist/components/visibility-observer/create-visibility-observer.js.flow +23 -0
- package/dist/components/visibility-observer/get-scroll-parent.d.ts +1 -0
- package/dist/components/visibility-observer/get-scroll-parent.js.flow +7 -0
- package/dist/components/visibility-observer/visibility-observer.d.ts +31 -0
- package/dist/components/visibility-observer/visibility-observer.js.flow +36 -0
- package/dist/components/zoomable-tex.d.ts +18 -0
- package/dist/components/zoomable-tex.js.flow +18 -0
- package/dist/components/zoomable.d.ts +64 -0
- package/dist/components/zoomable.js.flow +70 -0
- package/dist/components.d.ts +16 -0
- package/dist/components.js.flow +22 -0
- package/dist/definition-context.d.ts +21 -0
- package/dist/definition-context.js.flow +25 -0
- package/dist/dependencies.d.ts +3 -0
- package/dist/dependencies.js.flow +9 -0
- package/dist/error-boundary.d.ts +13 -0
- package/dist/error-boundary.js.flow +21 -0
- package/dist/es/index.js +23239 -26937
- package/dist/es/index.js.map +1 -1
- package/dist/extra-widgets.d.ts +22 -0
- package/dist/extra-widgets.js.flow +33 -0
- package/dist/hint-renderer.d.ts +23 -0
- package/dist/hint-renderer.js.flow +32 -0
- package/dist/hints-renderer.d.ts +29 -0
- package/dist/hints-renderer.js.flow +41 -0
- package/dist/icon-paths.d.ts +117 -0
- package/dist/icon-paths.js.flow +123 -0
- package/dist/index.d.ts +103 -2
- package/dist/index.js +13063 -16571
- package/dist/index.js.flow +133 -2
- package/dist/index.js.map +1 -1
- package/dist/init.d.ts +14 -0
- package/dist/init.js.flow +20 -0
- package/dist/interaction-tracker.d.ts +23 -0
- package/dist/interaction-tracker.js.flow +33 -0
- package/dist/interactive2/__tests__/movable-mock.d.ts +5 -0
- package/dist/interactive2/__tests__/movable-mock.js.flow +11 -0
- package/dist/interactive2/interactive-util.d.ts +31 -0
- package/dist/interactive2/interactive-util.js.flow +50 -0
- package/dist/interactive2/movable-helper-methods.d.ts +9 -0
- package/dist/interactive2/movable-helper-methods.js.flow +15 -0
- package/dist/interactive2/movable-line-options.d.ts +34 -0
- package/dist/interactive2/movable-line-options.js.flow +44 -0
- package/dist/interactive2/movable-line.d.ts +2 -0
- package/dist/interactive2/movable-line.js.flow +8 -0
- package/dist/interactive2/movable-point-options.d.ts +34 -0
- package/dist/interactive2/movable-point-options.js.flow +44 -0
- package/dist/interactive2/movable-point.d.ts +2 -0
- package/dist/interactive2/movable-point.js.flow +8 -0
- package/dist/interactive2/movable-polygon-options.d.ts +40 -0
- package/dist/interactive2/movable-polygon-options.js.flow +47 -0
- package/dist/interactive2/movable-polygon.d.ts +2 -0
- package/dist/interactive2/movable-polygon.js.flow +8 -0
- package/dist/interactive2/movable.d.ts +2 -0
- package/dist/interactive2/movable.js.flow +8 -0
- package/dist/interactive2/objective_.d.ts +13 -0
- package/dist/interactive2/objective_.js.flow +25 -0
- package/dist/interactive2/types.d.ts +2 -0
- package/dist/interactive2/types.js.flow +8 -0
- package/dist/interactive2/wrapped-defaults.d.ts +5 -0
- package/dist/interactive2/wrapped-defaults.js.flow +11 -0
- package/dist/interactive2/wrapped-ellipse.d.ts +3 -0
- package/dist/interactive2/wrapped-ellipse.js.flow +14 -0
- package/dist/interactive2/wrapped-line.d.ts +3 -0
- package/dist/interactive2/wrapped-line.js.flow +14 -0
- package/dist/interactive2/wrapped-path.d.ts +3 -0
- package/dist/interactive2/wrapped-path.js.flow +13 -0
- package/dist/interactive2.d.ts +10 -0
- package/dist/interactive2.js.flow +16 -0
- package/dist/item-renderer.d.ts +117 -0
- package/dist/item-renderer.js.flow +136 -0
- package/dist/item-version.d.ts +4 -0
- package/dist/item-version.js.flow +11 -0
- package/dist/jipt-paragraphs.d.ts +8 -0
- package/dist/jipt-paragraphs.js.flow +14 -0
- package/dist/keypad-context.d.ts +20 -0
- package/dist/keypad-context.js.flow +18 -0
- package/dist/loading-context.d.ts +14 -0
- package/dist/loading-context.js.flow +12 -0
- package/dist/logging/log.d.ts +55 -0
- package/dist/logging/log.js.flow +62 -0
- package/dist/mixins/changeable.d.ts +30 -0
- package/dist/mixins/changeable.js.flow +33 -0
- package/dist/mixins/editor-jsonify.d.ts +4 -0
- package/dist/mixins/editor-jsonify.js.flow +10 -0
- package/dist/mixins/provide-keypad.d.ts +36 -0
- package/dist/mixins/provide-keypad.js.flow +33 -0
- package/dist/mixins/widget-jsonify-deprecated.d.ts +5 -0
- package/dist/mixins/widget-jsonify-deprecated.js.flow +11 -0
- package/dist/mixins/widget-prop-denylist.d.ts +14 -0
- package/dist/mixins/widget-prop-denylist.js.flow +20 -0
- package/dist/multi-items/item-types.d.ts +32 -0
- package/dist/multi-items/items.d.ts +53 -0
- package/dist/multi-items/items.js.flow +66 -0
- package/dist/multi-items/multi-renderer.d.ts +152 -0
- package/dist/multi-items/multi-renderer.js.flow +213 -0
- package/dist/multi-items/prop-type-builders.d.ts +20 -0
- package/dist/multi-items/prop-type-builders.js.flow +22 -0
- package/dist/multi-items/shape-types.d.ts +47 -0
- package/dist/multi-items/shape-types.js.flow +60 -0
- package/dist/multi-items/shapes.d.ts +23 -0
- package/dist/multi-items/shapes.js.flow +25 -0
- package/dist/multi-items/tree-types.d.ts +34 -0
- package/dist/multi-items/tree-types.js.flow +45 -0
- package/dist/multi-items/trees.d.ts +146 -0
- package/dist/multi-items/trees.js.flow +147 -0
- package/dist/multi-items.d.ts +73 -0
- package/dist/multi-items.js.flow +36 -0
- package/dist/perseus-api.d.ts +128 -0
- package/dist/perseus-api.js.flow +139 -0
- package/dist/perseus-env.d.ts +3 -0
- package/dist/perseus-env.js.flow +6 -0
- package/dist/perseus-error.d.ts +11 -0
- package/dist/perseus-error.js.flow +16 -0
- package/dist/perseus-markdown.d.ts +11 -0
- package/dist/perseus-markdown.js.flow +20 -0
- package/dist/perseus-types.d.ts +776 -0
- package/dist/perseus-types.js.flow +1032 -0
- package/dist/question-paragraph.d.ts +11 -0
- package/dist/question-paragraph.js.flow +17 -0
- package/dist/renderability.d.ts +10 -0
- package/dist/renderability.js.flow +19 -0
- package/dist/renderer.d.ts +254 -0
- package/dist/renderer.js.flow +327 -0
- package/dist/server-item-renderer.d.ts +113 -0
- package/dist/server-item-renderer.js.flow +136 -0
- package/dist/sigfigs.d.ts +32 -0
- package/dist/sigfigs.js.flow +41 -0
- package/dist/styles/constants.d.ts +56 -0
- package/dist/styles/constants.js.flow +62 -0
- package/dist/styles/global-constants.d.ts +342 -0
- package/dist/styles/global-constants.js.flow +348 -0
- package/dist/styles/global-styles.d.ts +47 -0
- package/dist/styles/global-styles.js.flow +53 -0
- package/dist/styles/media-queries.d.ts +29 -0
- package/dist/styles/media-queries.js.flow +35 -0
- package/dist/styles/shared.d.ts +3 -0
- package/dist/styles/shared.js.flow +9 -0
- package/dist/tex-wrangler.d.ts +7 -0
- package/dist/tex-wrangler.js.flow +13 -0
- package/dist/translation-linter.d.ts +21 -0
- package/dist/translation-linter.js.flow +32 -0
- package/dist/traversal.d.ts +15 -0
- package/dist/traversal.js.flow +26 -0
- package/dist/types.d.ts +262 -0
- package/dist/types.js.flow +337 -0
- package/dist/util/a11y.d.ts +3 -0
- package/dist/util/a11y.js.flow +9 -0
- package/dist/util/answer-types.d.ts +34 -0
- package/dist/util/answer-types.js.flow +49 -0
- package/dist/util/colors.d.ts +89 -0
- package/dist/util/colors.js.flow +95 -0
- package/dist/util/fix-passage-refs.d.ts +2 -0
- package/dist/util/fix-passage-refs.js.flow +8 -0
- package/dist/util/graph-utils.d.ts +12 -0
- package/dist/util/graph-utils.js.flow +9 -0
- package/dist/util/graphie.d.ts +2 -0
- package/dist/util/graphie.js.flow +8 -0
- package/dist/util/interactive.d.ts +9 -0
- package/dist/util/interactive.js.flow +9 -0
- package/dist/util/katex-preprocess.d.ts +6 -0
- package/dist/util/katex-preprocess.js.flow +12 -0
- package/dist/util/math.d.ts +28 -0
- package/dist/util/math.js.flow +62 -0
- package/dist/util/mobile-native-utils.d.ts +7 -0
- package/dist/util/mobile-native-utils.js.flow +12 -0
- package/dist/util/react-render.d.ts +2 -0
- package/dist/util/react-render.js.flow +12 -0
- package/dist/util/register-all-widgets-for-testing.d.ts +1 -0
- package/dist/util/register-all-widgets-for-testing.js.flow +7 -0
- package/dist/util/scroll-utils.d.ts +10 -0
- package/dist/util/scroll-utils.js.flow +19 -0
- package/dist/util/sizing-utils.d.ts +9 -0
- package/dist/util/sizing-utils.js.flow +20 -0
- package/dist/util/tex.d.ts +6 -0
- package/dist/util/tex.js.flow +17 -0
- package/dist/util/url-utils.d.ts +6 -0
- package/dist/util/url-utils.js.flow +11 -0
- package/dist/util.d.ts +247 -0
- package/dist/util.js.flow +320 -0
- package/dist/version.d.ts +11 -0
- package/dist/version.js.flow +17 -0
- package/dist/widget-container.d.ts +27 -0
- package/dist/widget-container.js.flow +33 -0
- package/dist/widgets/__tests__/renderQuestion.d.ts +13 -0
- package/dist/widgets/__tests__/renderQuestion.js.flow +28 -0
- package/dist/widgets/categorizer.d.ts +55 -0
- package/dist/widgets/categorizer.js.flow +70 -0
- package/dist/widgets/cs-program.d.ts +48 -0
- package/dist/widgets/cs-program.js.flow +54 -0
- package/dist/widgets/definition.d.ts +42 -0
- package/dist/widgets/definition.js.flow +57 -0
- package/dist/widgets/dropdown.d.ts +51 -0
- package/dist/widgets/dropdown.js.flow +63 -0
- package/dist/widgets/explanation.d.ts +49 -0
- package/dist/widgets/explanation.js.flow +58 -0
- package/dist/widgets/expression.d.ts +90 -0
- package/dist/widgets/expression.js.flow +115 -0
- package/dist/widgets/graded-group-answer-bar.d.ts +13 -0
- package/dist/widgets/graded-group-answer-bar.js.flow +24 -0
- package/dist/widgets/graded-group-set.d.ts +52 -0
- package/dist/widgets/graded-group-set.js.flow +65 -0
- package/dist/widgets/graded-group.d.ts +66 -0
- package/dist/widgets/graded-group.js.flow +78 -0
- package/dist/widgets/grapher/util.d.ts +19 -0
- package/dist/widgets/grapher/util.js.flow +38 -0
- package/dist/widgets/grapher.d.ts +63 -0
- package/dist/widgets/grapher.js.flow +93 -0
- package/dist/widgets/group.d.ts +51 -0
- package/dist/widgets/group.js.flow +60 -0
- package/dist/widgets/iframe.d.ts +52 -0
- package/dist/widgets/iframe.js.flow +53 -0
- package/dist/widgets/image.d.ts +59 -0
- package/dist/widgets/image.js.flow +73 -0
- package/dist/widgets/input-number.d.ts +75 -0
- package/dist/widgets/input-number.js.flow +94 -0
- package/dist/widgets/interaction/arrow-picker.d.ts +12 -0
- package/dist/widgets/interaction/arrow-picker.js.flow +21 -0
- package/dist/widgets/interaction/color-picker.d.ts +14 -0
- package/dist/widgets/interaction/color-picker.js.flow +23 -0
- package/dist/widgets/interaction/dash-picker.d.ts +12 -0
- package/dist/widgets/interaction/dash-picker.js.flow +21 -0
- package/dist/widgets/interaction/element-container.d.ts +21 -0
- package/dist/widgets/interaction/element-container.js.flow +33 -0
- package/dist/widgets/interaction.d.ts +51 -0
- package/dist/widgets/interaction.js.flow +60 -0
- package/dist/widgets/interactive-graph.d.ts +180 -0
- package/dist/widgets/interactive-graph.js.flow +242 -0
- package/dist/widgets/label-image/answer-choices.d.ts +51 -0
- package/dist/widgets/label-image/answer-choices.js.flow +55 -0
- package/dist/widgets/label-image/marker.d.ts +28 -0
- package/dist/widgets/label-image/marker.js.flow +33 -0
- package/dist/widgets/label-image/types.d.ts +14 -0
- package/dist/widgets/label-image/types.js.flow +23 -0
- package/dist/widgets/label-image.d.ts +113 -0
- package/dist/widgets/label-image.js.flow +142 -0
- package/dist/widgets/lights-puzzle.d.ts +47 -0
- package/dist/widgets/lights-puzzle.js.flow +58 -0
- package/dist/widgets/matcher.d.ts +82 -0
- package/dist/widgets/matcher.js.flow +101 -0
- package/dist/widgets/matrix.d.ts +65 -0
- package/dist/widgets/matrix.js.flow +80 -0
- package/dist/widgets/measurer.d.ts +21 -0
- package/dist/widgets/measurer.js.flow +30 -0
- package/dist/widgets/molecule/molecule-drawing.d.ts +5 -0
- package/dist/widgets/molecule/molecule-drawing.js.flow +11 -0
- package/dist/widgets/molecule/molecule-layout.d.ts +82 -0
- package/dist/widgets/molecule/molecule-layout.js.flow +96 -0
- package/dist/widgets/molecule/smiles-parser.d.ts +19 -0
- package/dist/widgets/molecule/smiles-parser.js.flow +26 -0
- package/dist/widgets/molecule.d.ts +51 -0
- package/dist/widgets/molecule.js.flow +60 -0
- package/dist/widgets/number-line.d.ts +90 -0
- package/dist/widgets/number-line.js.flow +102 -0
- package/dist/widgets/numeric-input.d.ts +80 -0
- package/dist/widgets/numeric-input.js.flow +109 -0
- package/dist/widgets/orderer.d.ts +69 -0
- package/dist/widgets/orderer.js.flow +81 -0
- package/dist/widgets/passage/passage-markdown.d.ts +22 -0
- package/dist/widgets/passage/passage-markdown.js.flow +33 -0
- package/dist/widgets/passage-ref-target.d.ts +41 -0
- package/dist/widgets/passage-ref-target.js.flow +52 -0
- package/dist/widgets/passage-ref.d.ts +65 -0
- package/dist/widgets/passage-ref.js.flow +85 -0
- package/dist/widgets/passage.d.ts +125 -0
- package/dist/widgets/passage.js.flow +157 -0
- package/dist/widgets/plotter.d.ts +68 -0
- package/dist/widgets/plotter.js.flow +78 -0
- package/dist/widgets/radio/base-radio.d.ts +38 -0
- package/dist/widgets/radio/base-radio.js.flow +44 -0
- package/dist/widgets/radio/choice-a11y-text.d.ts +2 -0
- package/dist/widgets/radio/choice-a11y-text.js.flow +14 -0
- package/dist/widgets/radio/choice-icon/choice-icon.d.ts +16 -0
- package/dist/widgets/radio/choice-icon/choice-icon.js.flow +22 -0
- package/dist/widgets/radio/choice-icon/cross-out-line.d.ts +9 -0
- package/dist/widgets/radio/choice-icon/cross-out-line.js.flow +16 -0
- package/dist/widgets/radio/choice-icon/shared-styles.d.ts +5 -0
- package/dist/widgets/radio/choice-icon/shared-styles.js.flow +11 -0
- package/dist/widgets/radio/choice-none-above.d.ts +6 -0
- package/dist/widgets/radio/choice-none-above.js.flow +16 -0
- package/dist/widgets/radio/choice.d.ts +23 -0
- package/dist/widgets/radio/choice.js.flow +32 -0
- package/dist/widgets/radio/choice.jsx.fixture.d.ts +1 -0
- package/dist/widgets/radio/choice.jsx.fixture.js.flow +7 -0
- package/dist/widgets/radio/focus-ring.d.ts +12 -0
- package/dist/widgets/radio/focus-ring.js.flow +15 -0
- package/dist/widgets/radio/option-status.d.ts +17 -0
- package/dist/widgets/radio/option-status.js.flow +16 -0
- package/dist/widgets/radio/util.d.ts +6 -0
- package/dist/widgets/radio/util.js.flow +12 -0
- package/dist/widgets/radio/widget.d.ts +62 -0
- package/dist/widgets/radio/widget.js.flow +80 -0
- package/dist/widgets/radio.d.ts +22 -0
- package/dist/widgets/radio.js.flow +31 -0
- package/dist/widgets/reaction-diagram.d.ts +37 -0
- package/dist/widgets/reaction-diagram.js.flow +46 -0
- package/dist/widgets/sequence.d.ts +79 -0
- package/dist/widgets/sequence.js.flow +100 -0
- package/dist/widgets/simulator.d.ts +89 -0
- package/dist/widgets/simulator.js.flow +106 -0
- package/dist/widgets/sorter.d.ts +82 -0
- package/dist/widgets/sorter.js.flow +101 -0
- package/dist/widgets/table.d.ts +56 -0
- package/dist/widgets/table.js.flow +67 -0
- package/dist/widgets/transformer.d.ts +94 -0
- package/dist/widgets/transformer.js.flow +127 -0
- package/dist/widgets/unit.d.ts +77 -0
- package/dist/widgets/unit.js.flow +93 -0
- package/dist/widgets/video-transcript-link.d.ts +12 -0
- package/dist/widgets/video-transcript-link.js.flow +15 -0
- package/dist/widgets/video.d.ts +48 -0
- package/dist/widgets/video.js.flow +57 -0
- package/dist/widgets.d.ts +73 -0
- package/dist/widgets.js.flow +108 -0
- package/dist/zoom.d.ts +1 -0
- package/dist/zoom.js.flow +7 -0
- package/package.json +8 -8
- package/src/__stories__/hints-renderer.stories.tsx +58 -0
- package/src/__stories__/item-renderer.stories.tsx +29 -0
- package/src/__stories__/server-item-renderer.stories.tsx +29 -0
- package/src/__testdata__/graphie.testdata.ts +51 -0
- package/src/__testdata__/item-renderer.testdata.ts +160 -0
- package/src/__testdata__/renderer.testdata.ts +122 -0
- package/src/__tests__/a11y.test.ts +303 -0
- package/src/__tests__/item-renderer.test.tsx +891 -0
- package/src/__tests__/jipt-paragraphs.test.ts +32 -0
- package/src/__tests__/mock-asset-loading-widget.tsx +56 -0
- package/src/__tests__/mock-widget.tsx +33 -0
- package/src/__tests__/perseus-markdown.test.ts +764 -0
- package/src/__tests__/renderability.test.ts +480 -0
- package/src/__tests__/renderer-api.test.tsx +328 -0
- package/src/__tests__/renderer.test.tsx +1802 -0
- package/src/__tests__/server-item-renderer.test.tsx +518 -0
- package/src/__tests__/test-items/image-item.ts +24 -0
- package/src/__tests__/test-items/input-number-1-item.ts +26 -0
- package/src/__tests__/test-items/input-number-2-item.ts +38 -0
- package/src/__tests__/test-items/table-item.ts +29 -0
- package/src/__tests__/tex-wrangler.test.ts +82 -0
- package/src/__tests__/util.test.ts +40 -0
- package/src/a11y.ts +45 -0
- package/src/all-widgets.ts +9 -0
- package/src/article-renderer.tsx +215 -0
- package/src/asset-context.ts +30 -0
- package/src/basic-widgets.ts +16 -0
- package/src/components/__stories__/button-group.stories.tsx +59 -0
- package/src/components/__stories__/fixed-to-responsive.stories.tsx +143 -0
- package/src/components/__stories__/graph.stories.tsx +30 -0
- package/src/components/__stories__/graphie.stories.tsx +35 -0
- package/src/components/__stories__/hud.stories.tsx +39 -0
- package/src/components/__stories__/icon.stories.tsx +63 -0
- package/src/components/__stories__/image-loader.stories.tsx +62 -0
- package/src/components/__stories__/info-tip.stories.tsx +35 -0
- package/src/components/__stories__/inline-icon.stories.tsx +44 -0
- package/src/components/__stories__/input-with-examples.stories.tsx +57 -0
- package/src/components/__stories__/lint.stories.tsx +51 -0
- package/src/components/__stories__/math-input.stories.tsx +34 -0
- package/src/components/__stories__/math-output.stories.tsx +25 -0
- package/src/components/__stories__/multi-button-group.stories.tsx +70 -0
- package/src/components/__stories__/number-input.stories.tsx +43 -0
- package/src/components/__stories__/prop-check-box.stories.tsx +65 -0
- package/src/components/__stories__/range-input.stories.tsx +31 -0
- package/src/components/__stories__/simple-keypad-input.stories.tsx +29 -0
- package/src/components/__stories__/sortable.stories.tsx +77 -0
- package/src/components/__stories__/stub-tag-editor.stories.tsx +49 -0
- package/src/components/__stories__/svg-image.stories.tsx +82 -0
- package/src/components/__stories__/tex.stories.tsx +25 -0
- package/src/components/__stories__/text-buttons.stories.tsx +66 -0
- package/src/components/__stories__/text-input.stories.tsx +39 -0
- package/src/components/__stories__/text-list-editor.stories.tsx +34 -0
- package/src/components/__stories__/zoomable-tex.stories.tsx +39 -0
- package/src/components/__stories__/zoomable.stories.tsx +43 -0
- package/src/components/__testdata__/sorter.testdata.ts +19 -0
- package/src/components/__tests__/number-input.test.tsx +128 -0
- package/src/components/__tests__/sortable.test.tsx +234 -0
- package/src/components/__tests__/sorter.test.tsx +111 -0
- package/src/components/__tests__/zoomable.test.tsx +399 -0
- package/src/components/button-group.tsx +130 -0
- package/src/components/constants.ts +14 -0
- package/src/components/fixed-to-responsive.tsx +165 -0
- package/src/components/graph.tsx +421 -0
- package/src/components/graphie-classes.ts +153 -0
- package/src/components/graphie-movables.ts +338 -0
- package/src/components/graphie.tsx +357 -0
- package/src/components/highlighting/highlightable-content.tsx +243 -0
- package/src/components/highlighting/highlights.ts +207 -0
- package/src/components/highlighting/ranges.ts +304 -0
- package/src/components/highlighting/types.ts +73 -0
- package/src/components/highlighting/ui/highlight-renderer.tsx +175 -0
- package/src/components/highlighting/ui/highlight-set-renderer.tsx +188 -0
- package/src/components/highlighting/ui/highlight-tooltip.tsx +141 -0
- package/src/components/highlighting/ui/highlighting-ui.tsx +153 -0
- package/src/components/highlighting/ui/selection-tracker.tsx +189 -0
- package/src/components/highlighting/ui/types.ts +21 -0
- package/src/components/highlighting/ui/util.ts +165 -0
- package/src/components/highlighting/word-indexer.tsx +156 -0
- package/src/components/hud.tsx +178 -0
- package/src/components/icon.tsx +140 -0
- package/src/components/image-loader.tsx +176 -0
- package/src/components/info-tip/info-tip.tsx +144 -0
- package/src/components/info-tip.tsx +40 -0
- package/src/components/inline-icon.tsx +77 -0
- package/src/components/input-with-examples.tsx +249 -0
- package/src/components/lint.tsx +453 -0
- package/src/components/math-input.tsx +299 -0
- package/src/components/math-output.tsx +128 -0
- package/src/components/multi-button-group.tsx +135 -0
- package/src/components/number-input.tsx +250 -0
- package/src/components/prop-check-box.tsx +80 -0
- package/src/components/range-input.tsx +60 -0
- package/src/components/simple-keypad-input.tsx +88 -0
- package/src/components/sortable.tsx +914 -0
- package/src/components/stub-tag-editor.tsx +53 -0
- package/src/components/svg-image.tsx +777 -0
- package/src/components/tex-buttons.tsx +321 -0
- package/src/components/tex.tsx +67 -0
- package/src/components/text-input.tsx +128 -0
- package/src/components/text-list-editor.tsx +169 -0
- package/src/components/tooltip.tsx +392 -0
- package/src/components/visibility-observer/__stories__/visibility-observer.stories.tsx +143 -0
- package/src/components/visibility-observer/create-visibility-observer.ts +108 -0
- package/src/components/visibility-observer/get-scroll-parent.ts +46 -0
- package/src/components/visibility-observer/visibility-observer.tsx +124 -0
- package/src/components/zoomable-tex.tsx +78 -0
- package/src/components/zoomable.tsx +300 -0
- package/src/components.ts +16 -0
- package/src/definition-context.tsx +60 -0
- package/src/dependencies.ts +21 -0
- package/src/error-boundary.tsx +50 -0
- package/src/extra-widgets.ts +75 -0
- package/src/hint-renderer.tsx +149 -0
- package/src/hints-renderer.tsx +377 -0
- package/src/icon-paths.ts +119 -0
- package/src/index.ts +158 -0
- package/src/init.ts +54 -0
- package/src/interaction-tracker.ts +61 -0
- package/src/interactive2/__tests__/movable-mock.ts +43 -0
- package/src/interactive2/__tests__/movable-point.test.ts +145 -0
- package/src/interactive2/interactive-util.ts +155 -0
- package/src/interactive2/movable-helper-methods.ts +161 -0
- package/src/interactive2/movable-line-options.ts +419 -0
- package/src/interactive2/movable-line.ts +318 -0
- package/src/interactive2/movable-point-options.ts +212 -0
- package/src/interactive2/movable-point.tsx +593 -0
- package/src/interactive2/movable-polygon-options.ts +390 -0
- package/src/interactive2/movable-polygon.ts +368 -0
- package/src/interactive2/movable.ts +275 -0
- package/src/interactive2/objective_.ts +79 -0
- package/src/interactive2/types.ts +2 -0
- package/src/interactive2/wrapped-defaults.ts +87 -0
- package/src/interactive2/wrapped-ellipse.ts +94 -0
- package/src/interactive2/wrapped-line.ts +116 -0
- package/src/interactive2/wrapped-path.ts +51 -0
- package/src/interactive2.ts +73 -0
- package/src/item-renderer.tsx +514 -0
- package/src/item-version.ts +10 -0
- package/src/jipt-paragraphs.ts +49 -0
- package/src/jquery.mobile.vmouse.js +0 -1
- package/src/keypad-context.ts +34 -0
- package/src/loading-context.ts +21 -0
- package/src/logging/log.test.ts +39 -0
- package/src/logging/log.ts +97 -0
- package/src/mixins/__tests__/widget-prop-denylist.test.ts +21 -0
- package/src/mixins/changeable.ts +133 -0
- package/src/mixins/editor-jsonify.ts +13 -0
- package/src/mixins/provide-keypad.tsx +144 -0
- package/src/mixins/widget-jsonify-deprecated.ts +23 -0
- package/src/mixins/widget-prop-denylist.ts +48 -0
- package/src/multi-items/__stories__/multi-renderer.stories.tsx +87 -0
- package/src/multi-items/__testdata__/multi-renderer.testdata.ts +172 -0
- package/src/multi-items/__tests__/items.test.ts +250 -0
- package/src/multi-items/__tests__/multi-renderer.test.tsx +910 -0
- package/src/multi-items/__tests__/prop-type-builders.test.ts +133 -0
- package/src/multi-items/__tests__/shapes.test.ts +43 -0
- package/src/multi-items/__tests__/trees.test.ts +325 -0
- package/src/multi-items/item-types.js.flow +55 -0
- package/src/multi-items/item-types.ts +56 -0
- package/src/multi-items/items.ts +176 -0
- package/src/multi-items/multi-renderer.tsx +564 -0
- package/src/multi-items/prop-type-builders.ts +106 -0
- package/src/multi-items/shape-types.ts +52 -0
- package/src/multi-items/shapes.ts +52 -0
- package/src/multi-items/tree-types.ts +47 -0
- package/src/multi-items/trees.ts +360 -0
- package/src/multi-items.ts +75 -0
- package/src/perseus-api.tsx +188 -0
- package/src/perseus-env.ts +27 -0
- package/src/perseus-error.ts +17 -0
- package/src/perseus-markdown.tsx +407 -0
- package/src/perseus-types.ts +1474 -0
- package/src/question-paragraph.tsx +29 -0
- package/src/renderability.ts +109 -0
- package/src/renderer.tsx +1992 -0
- package/src/server-item-renderer.tsx +465 -0
- package/src/sigfigs.ts +490 -0
- package/src/styles/constants.ts +94 -0
- package/src/styles/global-constants.ts +343 -0
- package/src/styles/global-styles.ts +306 -0
- package/src/styles/media-queries.ts +47 -0
- package/src/styles/shared.ts +130 -0
- package/src/tex-wrangler.ts +182 -0
- package/src/translation-linter.ts +126 -0
- package/src/traversal.ts +138 -0
- package/src/types.ts +468 -0
- package/src/util/a11y.ts +23 -0
- package/src/util/answer-types.test.ts +114 -0
- package/src/util/answer-types.ts +876 -0
- package/src/util/colors.ts +93 -0
- package/src/util/fix-passage-refs.ts +121 -0
- package/src/util/graph-utils.ts +15 -0
- package/src/util/graphie.ts +1617 -0
- package/src/util/interactive.ts +4191 -0
- package/src/util/katex-preprocess.ts +14 -0
- package/src/util/math.ts +289 -0
- package/src/util/mobile-native-utils.test.ts +22 -0
- package/src/util/mobile-native-utils.ts +12 -0
- package/src/util/react-render.tsx +27 -0
- package/src/util/register-all-widgets-for-testing.ts +11 -0
- package/src/util/scroll-utils.ts +155 -0
- package/src/util/sizing-utils.ts +46 -0
- package/src/util/tex.ts +208 -0
- package/src/util/url-utils.ts +34 -0
- package/src/util.ts +1003 -0
- package/src/version.ts +11 -0
- package/src/widget-container.tsx +175 -0
- package/src/widgets/__stories__/categorizer.stories.tsx +14 -0
- package/src/widgets/__stories__/cs-program.stories.tsx +14 -0
- package/src/widgets/__stories__/definition.stories.tsx +111 -0
- package/src/widgets/__stories__/dropdown.stories.tsx +14 -0
- package/src/widgets/__stories__/explanation.stories.tsx +18 -0
- package/src/widgets/__stories__/expression.stories.tsx +29 -0
- package/src/widgets/__stories__/graded-group-set.stories.tsx +31 -0
- package/src/widgets/__stories__/graded-group.stories.tsx +31 -0
- package/src/widgets/__stories__/grapher.stories.tsx +60 -0
- package/src/widgets/__stories__/group.stories.tsx +14 -0
- package/src/widgets/__stories__/iframe.stories.tsx +14 -0
- package/src/widgets/__stories__/image.stories.tsx +61 -0
- package/src/widgets/__stories__/input-number.stories.tsx +110 -0
- package/src/widgets/__stories__/interaction.stories.tsx +14 -0
- package/src/widgets/__stories__/interactive-graph.stories.tsx +60 -0
- package/src/widgets/__stories__/matcher.stories.tsx +14 -0
- package/src/widgets/__stories__/matrix.stories.tsx +14 -0
- package/src/widgets/__stories__/number-line.stories.tsx +14 -0
- package/src/widgets/__stories__/numeric-input.stories.tsx +107 -0
- package/src/widgets/__stories__/on-screen-keypad.stories.tsx +120 -0
- package/src/widgets/__stories__/orderer.stories.tsx +14 -0
- package/src/widgets/__stories__/passage-ref.stories.tsx +22 -0
- package/src/widgets/__stories__/passage.stories.tsx +32 -0
- package/src/widgets/__stories__/radio.stories.tsx +88 -0
- package/src/widgets/__stories__/sorter.stories.tsx +14 -0
- package/src/widgets/__stories__/transformer.stories.tsx +14 -0
- package/src/widgets/__stories__/unit.stories.tsx +30 -0
- package/src/widgets/__stories__/video-transcript-link.stories.tsx +27 -0
- package/src/widgets/__stories__/video.stories.tsx +14 -0
- package/src/widgets/__testdata__/base-radio.testdata.ts +21 -0
- package/src/widgets/__testdata__/categorizer.testdata.ts +49 -0
- package/src/widgets/__testdata__/cs-program.testdata.ts +27 -0
- package/src/widgets/__testdata__/dropdown.testdata.ts +33 -0
- package/src/widgets/__testdata__/explanation.testdata.ts +55 -0
- package/src/widgets/__testdata__/expression.testdata.ts +94 -0
- package/src/widgets/__testdata__/graded-group-set.testdata.ts +356 -0
- package/src/widgets/__testdata__/graded-group.testdata.ts +77 -0
- package/src/widgets/__testdata__/grapher.testdata.ts +374 -0
- package/src/widgets/__testdata__/group.testdata.ts +155 -0
- package/src/widgets/__testdata__/iframe.testdata.ts +35 -0
- package/src/widgets/__testdata__/image.testdata.ts +36 -0
- package/src/widgets/__testdata__/input-number.testdata.ts +72 -0
- package/src/widgets/__testdata__/interaction.testdata.ts +262 -0
- package/src/widgets/__testdata__/interactive-graph.testdata.ts +644 -0
- package/src/widgets/__testdata__/matcher.testdata.ts +33 -0
- package/src/widgets/__testdata__/matrix.testdata.ts +28 -0
- package/src/widgets/__testdata__/number-line.testdata.ts +30 -0
- package/src/widgets/__testdata__/numeric-input.testdata.ts +266 -0
- package/src/widgets/__testdata__/orderer.testdata.ts +57 -0
- package/src/widgets/__testdata__/passage-ref.testdata.ts +101 -0
- package/src/widgets/__testdata__/passage.testdata.ts +95 -0
- package/src/widgets/__testdata__/radio.testdata.ts +261 -0
- package/src/widgets/__testdata__/sorter.testdata.ts +19 -0
- package/src/widgets/__testdata__/transformer.testdata.ts +108 -0
- package/src/widgets/__testdata__/video.testdata.ts +21 -0
- package/src/widgets/__tests__/__snapshots__/input-number.test.ts.snap +497 -0
- package/src/widgets/__tests__/__snapshots__/unit.test.tsx.snap +20 -0
- package/src/widgets/__tests__/categorizer.test.ts +203 -0
- package/src/widgets/__tests__/cs-program.test.ts +43 -0
- package/src/widgets/__tests__/definition.test.ts +136 -0
- package/src/widgets/__tests__/dropdown.test.ts +105 -0
- package/src/widgets/__tests__/explanation.test.ts +198 -0
- package/src/widgets/__tests__/expression.test.ts +431 -0
- package/src/widgets/__tests__/graded-group-set-jipt.test.ts +30 -0
- package/src/widgets/__tests__/graded-group-set.test.ts +288 -0
- package/src/widgets/__tests__/graded-group.test.ts +232 -0
- package/src/widgets/__tests__/grapher.cypress.ts +576 -0
- package/src/widgets/__tests__/grapher.test.ts +33 -0
- package/src/widgets/__tests__/group.test.tsx +512 -0
- package/src/widgets/__tests__/iframe.test.ts +45 -0
- package/src/widgets/__tests__/image.test.ts +62 -0
- package/src/widgets/__tests__/input-number.test.ts +354 -0
- package/src/widgets/__tests__/interaction.test.ts +31 -0
- package/src/widgets/__tests__/interactive-graph.cypress.ts +815 -0
- package/src/widgets/__tests__/interactive-graph.test.ts +106 -0
- package/src/widgets/__tests__/matcher.test.tsx +152 -0
- package/src/widgets/__tests__/matrix.test.ts +82 -0
- package/src/widgets/__tests__/number-line.test.ts +79 -0
- package/src/widgets/__tests__/numeric-input.test.ts +502 -0
- package/src/widgets/__tests__/orderer.test.ts +73 -0
- package/src/widgets/__tests__/passage-ref.test.ts +168 -0
- package/src/widgets/__tests__/passage.test.tsx +224 -0
- package/src/widgets/__tests__/radio/base-radio.test.tsx +470 -0
- package/src/widgets/__tests__/radio/choice-icon.test.tsx +90 -0
- package/src/widgets/__tests__/radio/choice.test.tsx +310 -0
- package/src/widgets/__tests__/radio/focus-ring.test.tsx +23 -0
- package/src/widgets/__tests__/radio/option-status.test.tsx +77 -0
- package/src/widgets/__tests__/radio.test.ts +807 -0
- package/src/widgets/__tests__/renderQuestion.tsx +77 -0
- package/src/widgets/__tests__/unit.test.tsx +168 -0
- package/src/widgets/__tests__/video.test.ts +53 -0
- package/src/widgets/categorizer.tsx +343 -0
- package/src/widgets/cs-program.tsx +227 -0
- package/src/widgets/definition.tsx +121 -0
- package/src/widgets/dropdown.tsx +142 -0
- package/src/widgets/explanation.tsx +317 -0
- package/src/widgets/expression.tsx +647 -0
- package/src/widgets/graded-group-answer-bar.tsx +142 -0
- package/src/widgets/graded-group-set.tsx +296 -0
- package/src/widgets/graded-group.tsx +466 -0
- package/src/widgets/grapher/util.tsx +803 -0
- package/src/widgets/grapher.tsx +674 -0
- package/src/widgets/group.tsx +196 -0
- package/src/widgets/iframe.tsx +195 -0
- package/src/widgets/image.tsx +309 -0
- package/src/widgets/input-number.tsx +413 -0
- package/src/widgets/interaction/arrow-picker.tsx +38 -0
- package/src/widgets/interaction/color-picker.tsx +69 -0
- package/src/widgets/interaction/dash-picker.tsx +45 -0
- package/src/widgets/interaction/element-container.tsx +101 -0
- package/src/widgets/interaction.tsx +826 -0
- package/src/widgets/interactive-graph.tsx +2921 -0
- package/src/widgets/label-image/__stories__/answer-choices.stories.tsx +98 -0
- package/src/widgets/label-image/__stories__/marker.stories.tsx +181 -0
- package/src/widgets/label-image/answer-choices.tsx +300 -0
- package/src/widgets/label-image/marker.tsx +364 -0
- package/src/widgets/label-image/types.ts +26 -0
- package/src/widgets/label-image.test.ts +840 -0
- package/src/widgets/label-image.tsx +849 -0
- package/src/widgets/lights-puzzle.tsx +359 -0
- package/src/widgets/matcher.tsx +278 -0
- package/src/widgets/matrix.tsx +637 -0
- package/src/widgets/measurer.tsx +217 -0
- package/src/widgets/molecule/__tests__/layout.test.ts +162 -0
- package/src/widgets/molecule/__tests__/parser.test.ts +155 -0
- package/src/widgets/molecule/molecule-drawing.ts +173 -0
- package/src/widgets/molecule/molecule-layout.ts +362 -0
- package/src/widgets/molecule/smiles-parser.ts +296 -0
- package/src/widgets/molecule.tsx +172 -0
- package/src/widgets/number-line.tsx +864 -0
- package/src/widgets/numeric-input.tsx +563 -0
- package/src/widgets/orderer.tsx +788 -0
- package/src/widgets/passage/__tests__/passage-markdown.test.ts +376 -0
- package/src/widgets/passage/passage-markdown.tsx +475 -0
- package/src/widgets/passage-ref-target.tsx +73 -0
- package/src/widgets/passage-ref.tsx +215 -0
- package/src/widgets/passage.tsx +584 -0
- package/src/widgets/plotter.tsx +1204 -0
- package/src/widgets/radio/__stories__/base-radio.stories.tsx +204 -0
- package/src/widgets/radio/__stories__/choice-icon.stories.tsx +168 -0
- package/src/widgets/radio/__stories__/choice-none-above.stories.tsx +40 -0
- package/src/widgets/radio/__stories__/choice.stories.tsx +137 -0
- package/src/widgets/radio/__stories__/focus-ring.stories.tsx +43 -0
- package/src/widgets/radio/__stories__/option-status.stories.tsx +105 -0
- package/src/widgets/radio/base-radio.tsx +509 -0
- package/src/widgets/radio/choice-a11y-text.ts +61 -0
- package/src/widgets/radio/choice-icon/choice-icon.tsx +217 -0
- package/src/widgets/radio/choice-icon/cross-out-line.tsx +53 -0
- package/src/widgets/radio/choice-icon/shared-styles.ts +15 -0
- package/src/widgets/radio/choice-none-above.tsx +56 -0
- package/src/widgets/radio/choice.jsx.fixture.ts +45 -0
- package/src/widgets/radio/choice.tsx +358 -0
- package/src/widgets/radio/focus-ring.tsx +57 -0
- package/src/widgets/radio/option-status.tsx +100 -0
- package/src/widgets/radio/util.test.ts +18 -0
- package/src/widgets/radio/util.ts +31 -0
- package/src/widgets/radio/widget.tsx +521 -0
- package/src/widgets/radio.ts +157 -0
- package/src/widgets/reaction-diagram.tsx +144 -0
- package/src/widgets/sequence.tsx +137 -0
- package/src/widgets/simulator.tsx +831 -0
- package/src/widgets/sorter.tsx +154 -0
- package/src/widgets/table.tsx +393 -0
- package/src/widgets/transformer.tsx +2951 -0
- package/src/widgets/unit.tsx +374 -0
- package/src/widgets/video-transcript-link.test.tsx +213 -0
- package/src/widgets/video-transcript-link.tsx +84 -0
- package/src/widgets/video.tsx +124 -0
- package/src/widgets.ts +444 -0
- package/src/zoom.ts +558 -0
- package/tsconfig.json +25 -0
- package/tsconfig.tsbuildinfo +1 -0
- package/src/__stories__/hints-renderer.stories.jsx +0 -60
- package/src/__stories__/item-renderer.stories.jsx +0 -27
- package/src/__stories__/server-item-renderer.stories.jsx +0 -27
- package/src/__testdata__/graphie_testdata.js +0 -53
- package/src/__testdata__/item-renderer_testdata.js +0 -161
- package/src/__testdata__/renderer_testdata.js +0 -123
- package/src/__tests__/a11y_test.jsx +0 -304
- package/src/__tests__/item-renderer_test.jsx +0 -892
- package/src/__tests__/jipt-paragraphs_test.js +0 -34
- package/src/__tests__/mock-asset-loading-widget.jsx +0 -57
- package/src/__tests__/mock-widget.jsx +0 -35
- package/src/__tests__/perseus-markdown_test.jsx +0 -747
- package/src/__tests__/renderability_test.jsx +0 -481
- package/src/__tests__/renderer-api_test.jsx +0 -309
- package/src/__tests__/renderer_test.jsx +0 -1792
- package/src/__tests__/server-item-renderer_test.jsx +0 -516
- package/src/__tests__/test-items/image-item.js +0 -25
- package/src/__tests__/test-items/input-number-1-item.js +0 -27
- package/src/__tests__/test-items/input-number-2-item.js +0 -39
- package/src/__tests__/test-items/table-item.js +0 -30
- package/src/__tests__/tex-wrangler_test.js +0 -83
- package/src/__tests__/util_test.js +0 -41
- package/src/a11y.js +0 -46
- package/src/all-widgets.js +0 -9
- package/src/article-renderer.jsx +0 -214
- package/src/asset-context.js +0 -30
- package/src/basic-widgets.js +0 -13
- package/src/components/__stories__/button-group.stories.jsx +0 -61
- package/src/components/__stories__/fixed-to-responsive.stories.jsx +0 -132
- package/src/components/__stories__/graph.stories.jsx +0 -27
- package/src/components/__stories__/graphie.stories.jsx +0 -32
- package/src/components/__stories__/hud.stories.jsx +0 -36
- package/src/components/__stories__/icon.stories.jsx +0 -56
- package/src/components/__stories__/image-loader.stories.jsx +0 -60
- package/src/components/__stories__/info-tip.stories.jsx +0 -33
- package/src/components/__stories__/inline-icon.stories.jsx +0 -39
- package/src/components/__stories__/input-with-examples.stories.jsx +0 -52
- package/src/components/__stories__/lint.stories.jsx +0 -40
- package/src/components/__stories__/math-input.stories.jsx +0 -29
- package/src/components/__stories__/math-output.stories.jsx +0 -24
- package/src/components/__stories__/multi-button-group.stories.jsx +0 -69
- package/src/components/__stories__/number-input.stories.jsx +0 -42
- package/src/components/__stories__/prop-check-box.stories.jsx +0 -62
- package/src/components/__stories__/range-input.stories.jsx +0 -28
- package/src/components/__stories__/simple-keypad-input.stories.jsx +0 -28
- package/src/components/__stories__/sortable.stories.jsx +0 -73
- package/src/components/__stories__/stub-tag-editor.stories.jsx +0 -44
- package/src/components/__stories__/svg-image.stories.jsx +0 -71
- package/src/components/__stories__/tex.stories.jsx +0 -24
- package/src/components/__stories__/text-buttons.stories.jsx +0 -51
- package/src/components/__stories__/text-input.stories.jsx +0 -34
- package/src/components/__stories__/text-list-editor.stories.jsx +0 -33
- package/src/components/__stories__/zoomable-tex.stories.jsx +0 -39
- package/src/components/__stories__/zoomable.stories.jsx +0 -40
- package/src/components/__testdata__/sorter_testdata.js +0 -20
- package/src/components/__tests__/number-input_test.jsx +0 -112
- package/src/components/__tests__/sortable_test.jsx +0 -234
- package/src/components/__tests__/sorter_test.jsx +0 -111
- package/src/components/__tests__/zoomable_test.jsx +0 -388
- package/src/components/button-group.jsx +0 -131
- package/src/components/constants.js +0 -15
- package/src/components/fixed-to-responsive.jsx +0 -165
- package/src/components/graph.jsx +0 -413
- package/src/components/graphie-classes.jsx +0 -148
- package/src/components/graphie-movables.jsx +0 -342
- package/src/components/graphie.jsx +0 -353
- package/src/components/highlighting/highlightable-content.jsx +0 -245
- package/src/components/highlighting/highlights.js +0 -208
- package/src/components/highlighting/ranges.js +0 -299
- package/src/components/highlighting/types.js +0 -73
- package/src/components/highlighting/ui/highlight-renderer.jsx +0 -179
- package/src/components/highlighting/ui/highlight-set-renderer.jsx +0 -190
- package/src/components/highlighting/ui/highlight-tooltip.jsx +0 -143
- package/src/components/highlighting/ui/highlighting-ui.jsx +0 -163
- package/src/components/highlighting/ui/selection-tracker.jsx +0 -184
- package/src/components/highlighting/ui/types.js +0 -21
- package/src/components/highlighting/ui/util.js +0 -166
- package/src/components/highlighting/word-indexer.jsx +0 -155
- package/src/components/hud.jsx +0 -179
- package/src/components/icon.jsx +0 -149
- package/src/components/image-loader.jsx +0 -175
- package/src/components/info-tip/info-tip.jsx +0 -146
- package/src/components/info-tip.jsx +0 -38
- package/src/components/inline-icon.jsx +0 -81
- package/src/components/input-with-examples.jsx +0 -248
- package/src/components/lint.jsx +0 -455
- package/src/components/math-input.jsx +0 -293
- package/src/components/math-output.jsx +0 -128
- package/src/components/multi-button-group.jsx +0 -137
- package/src/components/number-input.jsx +0 -253
- package/src/components/prop-check-box.jsx +0 -80
- package/src/components/range-input.jsx +0 -61
- package/src/components/simple-keypad-input.jsx +0 -88
- package/src/components/sortable.jsx +0 -872
- package/src/components/stub-tag-editor.jsx +0 -54
- package/src/components/svg-image.jsx +0 -765
- package/src/components/tex-buttons.jsx +0 -320
- package/src/components/tex.jsx +0 -70
- package/src/components/text-input.jsx +0 -133
- package/src/components/text-list-editor.jsx +0 -157
- package/src/components/tooltip.jsx +0 -392
- package/src/components/visibility-observer/__stories__/visibility-observer.stories.jsx +0 -140
- package/src/components/visibility-observer/get-scroll-parent.js +0 -45
- package/src/components/visibility-observer/visibility-observer.js +0 -109
- package/src/components/visibility-observer/visibility-observer.jsx +0 -123
- package/src/components/zoomable-tex.jsx +0 -70
- package/src/components/zoomable.jsx +0 -294
- package/src/components.js +0 -17
- package/src/definition-context.js +0 -59
- package/src/dependencies.js +0 -22
- package/src/error-boundary.jsx +0 -48
- package/src/extra-widgets.js +0 -75
- package/src/hint-renderer.jsx +0 -155
- package/src/hints-renderer.jsx +0 -367
- package/src/icon-paths.js +0 -120
- package/src/index.js +0 -159
- package/src/init.js +0 -49
- package/src/interaction-tracker.js +0 -60
- package/src/interactive2/__tests__/movable-mock.js +0 -48
- package/src/interactive2/__tests__/movable-point_test.js +0 -146
- package/src/interactive2/interactive-util.js +0 -152
- package/src/interactive2/movable-helper-methods.js +0 -160
- package/src/interactive2/movable-line-options.js +0 -392
- package/src/interactive2/movable-line.js +0 -322
- package/src/interactive2/movable-point-options.js +0 -190
- package/src/interactive2/movable-point.jsx +0 -597
- package/src/interactive2/movable-polygon-options.js +0 -351
- package/src/interactive2/movable-polygon.js +0 -368
- package/src/interactive2/movable.js +0 -273
- package/src/interactive2/objective_.js +0 -79
- package/src/interactive2/types.js +0 -3
- package/src/interactive2/wrapped-defaults.js +0 -86
- package/src/interactive2/wrapped-ellipse.js +0 -86
- package/src/interactive2/wrapped-line.js +0 -109
- package/src/interactive2/wrapped-path.js +0 -47
- package/src/interactive2.js +0 -91
- package/src/item-renderer.jsx +0 -514
- package/src/item-version.js +0 -12
- package/src/jipt-paragraphs.js +0 -52
- package/src/keypad-context.js +0 -33
- package/src/loading-context.js +0 -20
- package/src/logging/log.js +0 -107
- package/src/logging/log_test.js +0 -41
- package/src/mixins/__tests__/widget-prop-denylist_test.js +0 -23
- package/src/mixins/changeable.jsx +0 -115
- package/src/mixins/editor-jsonify.jsx +0 -13
- package/src/mixins/provide-keypad.jsx +0 -131
- package/src/mixins/widget-jsonify-deprecated.jsx +0 -23
- package/src/mixins/widget-prop-denylist.js +0 -49
- package/src/multi-items/__stories__/multi-renderer.stories.js +0 -88
- package/src/multi-items/__testdata__/multi-renderer_testdata.js +0 -174
- package/src/multi-items/__tests__/items_test.js +0 -245
- package/src/multi-items/__tests__/multi-renderer_test.js +0 -903
- package/src/multi-items/__tests__/prop-type-builders_test.js +0 -134
- package/src/multi-items/__tests__/shapes_test.js +0 -44
- package/src/multi-items/__tests__/trees_test.js +0 -316
- package/src/multi-items/items.js +0 -176
- package/src/multi-items/multi-renderer.jsx +0 -543
- package/src/multi-items/prop-type-builders.js +0 -105
- package/src/multi-items/shape-types.js +0 -47
- package/src/multi-items/shapes.js +0 -53
- package/src/multi-items/tree-types.js +0 -42
- package/src/multi-items/trees.js +0 -345
- package/src/multi-items.js +0 -76
- package/src/perseus-api.jsx +0 -221
- package/src/perseus-env.js +0 -26
- package/src/perseus-error.js +0 -19
- package/src/perseus-markdown.jsx +0 -408
- package/src/perseus-types.js +0 -1471
- package/src/question-paragraph.jsx +0 -30
- package/src/renderability.jsx +0 -108
- package/src/renderer.jsx +0 -1937
- package/src/server-item-renderer.jsx +0 -467
- package/src/sigfigs.jsx +0 -492
- package/src/styles/constants.js +0 -96
- package/src/styles/global-constants.js +0 -344
- package/src/styles/global-styles.js +0 -307
- package/src/styles/media-queries.js +0 -48
- package/src/styles/shared.js +0 -132
- package/src/tex-wrangler.js +0 -176
- package/src/translation-linter.js +0 -125
- package/src/traversal.jsx +0 -141
- package/src/types.js +0 -488
- package/src/util/a11y.js +0 -24
- package/src/util/answer-types.js +0 -861
- package/src/util/answer-types_test.js +0 -115
- package/src/util/colors.js +0 -94
- package/src/util/fix-passage-refs.jsx +0 -122
- package/src/util/graph-utils.js +0 -16
- package/src/util/graphie.js +0 -1586
- package/src/util/interactive.js +0 -4078
- package/src/util/katex-preprocess.js +0 -16
- package/src/util/math.js +0 -289
- package/src/util/mobile-native-utils.js +0 -14
- package/src/util/mobile-native-utils_test.js +0 -24
- package/src/util/react-render.js +0 -27
- package/src/util/register-all-widgets-for-testing.js +0 -12
- package/src/util/scroll-utils.js +0 -162
- package/src/util/sizing-utils.js +0 -46
- package/src/util/tex.js +0 -203
- package/src/util/url-utils.js +0 -36
- package/src/util.js +0 -984
- package/src/version.js +0 -11
- package/src/widget-container.jsx +0 -178
- package/src/widgets/__stories__/categorizer.stories.jsx +0 -15
- package/src/widgets/__stories__/cs-program.stories.jsx +0 -15
- package/src/widgets/__stories__/definition.stories.jsx +0 -108
- package/src/widgets/__stories__/dropdown.stories.jsx +0 -15
- package/src/widgets/__stories__/explanation.stories.jsx +0 -19
- package/src/widgets/__stories__/expression.stories.jsx +0 -26
- package/src/widgets/__stories__/graded-group-set.stories.jsx +0 -32
- package/src/widgets/__stories__/graded-group.stories.jsx +0 -32
- package/src/widgets/__stories__/grapher.stories.jsx +0 -47
- package/src/widgets/__stories__/group.stories.jsx +0 -15
- package/src/widgets/__stories__/iframe.stories.jsx +0 -15
- package/src/widgets/__stories__/image.stories.jsx +0 -62
- package/src/widgets/__stories__/input-number.stories.jsx +0 -102
- package/src/widgets/__stories__/interaction.stories.jsx +0 -15
- package/src/widgets/__stories__/interactive-graph.stories.jsx +0 -61
- package/src/widgets/__stories__/matcher.stories.jsx +0 -15
- package/src/widgets/__stories__/matrix.stories.jsx +0 -15
- package/src/widgets/__stories__/number-line.stories.jsx +0 -15
- package/src/widgets/__stories__/numeric-input.stories.jsx +0 -106
- package/src/widgets/__stories__/on-screen-keypad.stories.jsx +0 -118
- package/src/widgets/__stories__/orderer.stories.jsx +0 -15
- package/src/widgets/__stories__/passage-ref.stories.jsx +0 -23
- package/src/widgets/__stories__/passage.stories.jsx +0 -27
- package/src/widgets/__stories__/radio.stories.jsx +0 -90
- package/src/widgets/__stories__/sorter.stories.jsx +0 -15
- package/src/widgets/__stories__/transformer.stories.jsx +0 -15
- package/src/widgets/__stories__/unit.stories.jsx +0 -45
- package/src/widgets/__stories__/video-transcript-link.stories.jsx +0 -24
- package/src/widgets/__stories__/video.stories.jsx +0 -15
- package/src/widgets/__testdata__/base-radio_testdata.js +0 -22
- package/src/widgets/__testdata__/categorizer_testdata.js +0 -50
- package/src/widgets/__testdata__/cs-program_testdata.js +0 -28
- package/src/widgets/__testdata__/dropdown_testdata.js +0 -34
- package/src/widgets/__testdata__/explanation_testdata.js +0 -56
- package/src/widgets/__testdata__/expression_testdata.js +0 -95
- package/src/widgets/__testdata__/graded-group-set_testdata.js +0 -358
- package/src/widgets/__testdata__/graded-group_testdata.js +0 -79
- package/src/widgets/__testdata__/grapher_testdata.js +0 -376
- package/src/widgets/__testdata__/group_testdata.js +0 -156
- package/src/widgets/__testdata__/iframe_testdata.js +0 -36
- package/src/widgets/__testdata__/image_testdata.js +0 -38
- package/src/widgets/__testdata__/input-number_testdata.js +0 -73
- package/src/widgets/__testdata__/interaction_testdata.js +0 -264
- package/src/widgets/__testdata__/interactive-graph_testdata.js +0 -646
- package/src/widgets/__testdata__/matcher_testdata.js +0 -34
- package/src/widgets/__testdata__/matrix_testdata.js +0 -29
- package/src/widgets/__testdata__/number-line_testdata.js +0 -31
- package/src/widgets/__testdata__/numeric-input_testdata.js +0 -266
- package/src/widgets/__testdata__/orderer_testdata.js +0 -58
- package/src/widgets/__testdata__/passage-ref_testdata.js +0 -103
- package/src/widgets/__testdata__/passage_testdata.js +0 -96
- package/src/widgets/__testdata__/radio_testdata.js +0 -262
- package/src/widgets/__testdata__/sorter_testdata.js +0 -20
- package/src/widgets/__testdata__/transformer_testdata.js +0 -109
- package/src/widgets/__testdata__/video_testdata.js +0 -22
- package/src/widgets/__tests__/__snapshots__/expression_test.jsx.snap +0 -38
- package/src/widgets/__tests__/__snapshots__/input-number_test.jsx.snap +0 -978
- package/src/widgets/__tests__/categorizer_test.jsx +0 -205
- package/src/widgets/__tests__/cs-program_test.jsx +0 -45
- package/src/widgets/__tests__/definition_test.js +0 -137
- package/src/widgets/__tests__/dropdown_test.jsx +0 -106
- package/src/widgets/__tests__/explanation_test.js +0 -199
- package/src/widgets/__tests__/expression_test.jsx +0 -439
- package/src/widgets/__tests__/graded-group-set-jipt_test.jsx +0 -32
- package/src/widgets/__tests__/graded-group-set_test.jsx +0 -290
- package/src/widgets/__tests__/graded-group_test.jsx +0 -233
- package/src/widgets/__tests__/grapher.cypress.jsx +0 -546
- package/src/widgets/__tests__/grapher_test.jsx +0 -35
- package/src/widgets/__tests__/group_test.jsx +0 -512
- package/src/widgets/__tests__/iframe_test.jsx +0 -47
- package/src/widgets/__tests__/image_test.jsx +0 -65
- package/src/widgets/__tests__/input-number_test.jsx +0 -360
- package/src/widgets/__tests__/interaction_test.jsx +0 -33
- package/src/widgets/__tests__/interactive-graph.cypress.jsx +0 -777
- package/src/widgets/__tests__/interactive-graph_test.jsx +0 -105
- package/src/widgets/__tests__/matcher_test.jsx +0 -157
- package/src/widgets/__tests__/matrix_test.jsx +0 -84
- package/src/widgets/__tests__/number-line_test.jsx +0 -81
- package/src/widgets/__tests__/numeric-input_test.jsx +0 -514
- package/src/widgets/__tests__/orderer_test.jsx +0 -75
- package/src/widgets/__tests__/passage-ref_test.jsx +0 -166
- package/src/widgets/__tests__/passage_test.jsx +0 -212
- package/src/widgets/__tests__/radio/base-radio_test.jsx +0 -443
- package/src/widgets/__tests__/radio/choice-icon_test.jsx +0 -91
- package/src/widgets/__tests__/radio/choice_test.jsx +0 -311
- package/src/widgets/__tests__/radio/focus-ring_test.jsx +0 -23
- package/src/widgets/__tests__/radio/option-status_test.jsx +0 -65
- package/src/widgets/__tests__/radio_test.jsx +0 -810
- package/src/widgets/__tests__/renderQuestion.jsx +0 -66
- package/src/widgets/__tests__/unit_test.jsx +0 -144
- package/src/widgets/__tests__/video_test.jsx +0 -55
- package/src/widgets/categorizer.jsx +0 -343
- package/src/widgets/cs-program.jsx +0 -227
- package/src/widgets/definition.jsx +0 -121
- package/src/widgets/dropdown.jsx +0 -141
- package/src/widgets/explanation.jsx +0 -315
- package/src/widgets/expression.jsx +0 -652
- package/src/widgets/graded-group-answer-bar.jsx +0 -152
- package/src/widgets/graded-group-set.jsx +0 -296
- package/src/widgets/graded-group.jsx +0 -453
- package/src/widgets/grapher/util.jsx +0 -806
- package/src/widgets/grapher.jsx +0 -663
- package/src/widgets/group.jsx +0 -195
- package/src/widgets/iframe.jsx +0 -198
- package/src/widgets/image.jsx +0 -310
- package/src/widgets/input-number.jsx +0 -412
- package/src/widgets/interaction/arrow-picker.jsx +0 -39
- package/src/widgets/interaction/color-picker.jsx +0 -69
- package/src/widgets/interaction/dash-picker.jsx +0 -46
- package/src/widgets/interaction/element-container.jsx +0 -97
- package/src/widgets/interaction.jsx +0 -742
- package/src/widgets/interactive-graph.jsx +0 -2820
- package/src/widgets/label-image/__stories__/answer-choices.stories.jsx +0 -93
- package/src/widgets/label-image/__stories__/marker.stories.jsx +0 -172
- package/src/widgets/label-image/answer-choices.jsx +0 -311
- package/src/widgets/label-image/marker.jsx +0 -365
- package/src/widgets/label-image/types.js +0 -33
- package/src/widgets/label-image.jsx +0 -841
- package/src/widgets/label-image_test.js +0 -840
- package/src/widgets/lights-puzzle.jsx +0 -356
- package/src/widgets/matcher.jsx +0 -274
- package/src/widgets/matrix.jsx +0 -632
- package/src/widgets/measurer.jsx +0 -215
- package/src/widgets/molecule/__tests__/layout_test.jsx +0 -159
- package/src/widgets/molecule/__tests__/parser_test.jsx +0 -142
- package/src/widgets/molecule/molecule-drawing.jsx +0 -175
- package/src/widgets/molecule/molecule-layout.jsx +0 -367
- package/src/widgets/molecule/smiles-parser.jsx +0 -300
- package/src/widgets/molecule.jsx +0 -172
- package/src/widgets/number-line.jsx +0 -858
- package/src/widgets/numeric-input.jsx +0 -553
- package/src/widgets/orderer.jsx +0 -756
- package/src/widgets/passage/__tests__/passage-markdown_test.jsx +0 -373
- package/src/widgets/passage/passage-markdown.jsx +0 -472
- package/src/widgets/passage-ref-target.jsx +0 -73
- package/src/widgets/passage-ref.jsx +0 -214
- package/src/widgets/passage.jsx +0 -576
- package/src/widgets/plotter.jsx +0 -1198
- package/src/widgets/radio/__stories__/base-radio.stories.jsx +0 -189
- package/src/widgets/radio/__stories__/choice-icon.stories.jsx +0 -166
- package/src/widgets/radio/__stories__/choice-none-above.stories.jsx +0 -41
- package/src/widgets/radio/__stories__/choice.stories.jsx +0 -138
- package/src/widgets/radio/__stories__/focus-ring.stories.jsx +0 -44
- package/src/widgets/radio/__stories__/option-status.stories.jsx +0 -104
- package/src/widgets/radio/base-radio.jsx +0 -494
- package/src/widgets/radio/choice-a11y-text.js +0 -62
- package/src/widgets/radio/choice-icon/choice-icon.jsx +0 -214
- package/src/widgets/radio/choice-icon/cross-out-line.jsx +0 -52
- package/src/widgets/radio/choice-icon/shared-styles.js +0 -16
- package/src/widgets/radio/choice-none-above.jsx +0 -63
- package/src/widgets/radio/choice.jsx +0 -382
- package/src/widgets/radio/choice.jsx.fixture.js +0 -46
- package/src/widgets/radio/focus-ring.jsx +0 -58
- package/src/widgets/radio/option-status.jsx +0 -98
- package/src/widgets/radio/util.js +0 -32
- package/src/widgets/radio/util_test.js +0 -19
- package/src/widgets/radio/widget.jsx +0 -515
- package/src/widgets/radio.jsx +0 -155
- package/src/widgets/reaction-diagram.jsx +0 -137
- package/src/widgets/sequence.jsx +0 -143
- package/src/widgets/simulator.jsx +0 -806
- package/src/widgets/sorter.jsx +0 -149
- package/src/widgets/table.jsx +0 -397
- package/src/widgets/transformer.jsx +0 -2876
- package/src/widgets/unit.jsx +0 -372
- package/src/widgets/video-transcript-link.jsx +0 -84
- package/src/widgets/video-transcript-link_test.js +0 -211
- package/src/widgets/video.jsx +0 -126
- package/src/widgets.js +0 -431
- package/src/zoom.js +0 -539
- /package/{src/multi-items/item-types.js → dist/multi-items/item-types.js.flow} +0 -0
- /package/dist/{strings.js → strings} +0 -0
- /package/src/__tests__/__snapshots__/{item-renderer_test.jsx.snap → item-renderer.test.tsx.snap} +0 -0
- /package/src/__tests__/__snapshots__/{perseus-markdown_test.jsx.snap → perseus-markdown.test.ts.snap} +0 -0
- /package/src/__tests__/__snapshots__/{renderer_test.jsx.snap → renderer.test.tsx.snap} +0 -0
- /package/src/__tests__/__snapshots__/{server-item-renderer_test.jsx.snap → server-item-renderer.test.tsx.snap} +0 -0
- /package/src/components/__tests__/__snapshots__/{sortable_test.jsx.snap → sortable.test.tsx.snap} +0 -0
- /package/src/components/__tests__/__snapshots__/{sorter_test.jsx.snap → sorter.test.tsx.snap} +0 -0
- /package/src/multi-items/__tests__/__snapshots__/{multi-renderer_test.js.snap → multi-renderer.test.tsx.snap} +0 -0
- /package/src/widgets/__tests__/__snapshots__/{categorizer_test.jsx.snap → categorizer.test.ts.snap} +0 -0
- /package/src/widgets/__tests__/__snapshots__/{cs-program_test.jsx.snap → cs-program.test.ts.snap} +0 -0
- /package/src/widgets/__tests__/__snapshots__/{definition_test.js.snap → definition.test.ts.snap} +0 -0
- /package/src/widgets/__tests__/__snapshots__/{dropdown_test.jsx.snap → dropdown.test.ts.snap} +0 -0
- /package/src/widgets/__tests__/__snapshots__/{explanation_test.js.snap → explanation.test.ts.snap} +0 -0
- /package/src/widgets/__tests__/__snapshots__/{graded-group-set-jipt_test.jsx.snap → graded-group-set-jipt.test.ts.snap} +0 -0
- /package/src/widgets/__tests__/__snapshots__/{graded-group-set_test.jsx.snap → graded-group-set.test.ts.snap} +0 -0
- /package/src/widgets/__tests__/__snapshots__/{graded-group_test.jsx.snap → graded-group.test.ts.snap} +0 -0
- /package/src/widgets/__tests__/__snapshots__/{grapher_test.jsx.snap → grapher.test.ts.snap} +0 -0
- /package/src/widgets/__tests__/__snapshots__/{group_test.jsx.snap → group.test.tsx.snap} +0 -0
- /package/src/widgets/__tests__/__snapshots__/{iframe_test.jsx.snap → iframe.test.ts.snap} +0 -0
- /package/src/widgets/__tests__/__snapshots__/{image_test.jsx.snap → image.test.ts.snap} +0 -0
- /package/src/widgets/__tests__/__snapshots__/{interaction_test.jsx.snap → interaction.test.ts.snap} +0 -0
- /package/src/widgets/__tests__/__snapshots__/{interactive-graph_test.jsx.snap → interactive-graph.test.ts.snap} +0 -0
- /package/src/widgets/__tests__/__snapshots__/{matcher_test.jsx.snap → matcher.test.tsx.snap} +0 -0
- /package/src/widgets/__tests__/__snapshots__/{matrix_test.jsx.snap → matrix.test.ts.snap} +0 -0
- /package/src/widgets/__tests__/__snapshots__/{number-line_test.jsx.snap → number-line.test.ts.snap} +0 -0
- /package/src/widgets/__tests__/__snapshots__/{numeric-input_test.jsx.snap → numeric-input.test.ts.snap} +0 -0
- /package/src/widgets/__tests__/__snapshots__/{orderer_test.jsx.snap → orderer.test.ts.snap} +0 -0
- /package/src/widgets/__tests__/__snapshots__/{passage-ref_test.jsx.snap → passage-ref.test.ts.snap} +0 -0
- /package/src/widgets/__tests__/__snapshots__/{passage_test.jsx.snap → passage.test.tsx.snap} +0 -0
- /package/src/widgets/__tests__/__snapshots__/{radio_test.jsx.snap → radio.test.ts.snap} +0 -0
- /package/src/widgets/__tests__/__snapshots__/{video_test.jsx.snap → video.test.ts.snap} +0 -0
|
@@ -0,0 +1,362 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A molecule layout engine.
|
|
3
|
+
*
|
|
4
|
+
* This module transforms the SMILES syntax tree into a set of rendering
|
|
5
|
+
* instructions. A rendering instruction is an object indicating what type of
|
|
6
|
+
* thing to render (e.g. text or line), where to render it, and any other style
|
|
7
|
+
* properties needed.
|
|
8
|
+
*
|
|
9
|
+
* For instance, an oxygen atom might be rendered as
|
|
10
|
+
* {type: "text", value: "O", pos: [0, 0], idx: "1,0"}
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
// Default length of the bond. This currently corresponds directly to pixels
|
|
14
|
+
// in the renderer, but we may want this just to be arbitrary in the future.
|
|
15
|
+
const bondLength = 30;
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Compute a coordinate by moving an angle and length from an origin point.
|
|
19
|
+
*
|
|
20
|
+
* Args:
|
|
21
|
+
* origin: a list of the [x, y] coordinates of the origin
|
|
22
|
+
* angle: an angle in degrees from the origin, following the typical
|
|
23
|
+
* convention of +x axis = 0 degrees, +y axis = 90 degrees.
|
|
24
|
+
* length: the distance to the new point
|
|
25
|
+
* Return:
|
|
26
|
+
* a two-element list containing the [x, y] coordinates of the point.
|
|
27
|
+
*/
|
|
28
|
+
function polarAdd(origin: any, angle, length) {
|
|
29
|
+
const x = origin[0];
|
|
30
|
+
const y = origin[1];
|
|
31
|
+
return [
|
|
32
|
+
x + Math.cos((angle * 2 * Math.PI) / 360) * length,
|
|
33
|
+
y + -1.0 * Math.sin((angle * 2 * Math.PI) / 360) * length,
|
|
34
|
+
];
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Compute the layout for a single atom.
|
|
39
|
+
*
|
|
40
|
+
* Args:
|
|
41
|
+
* atom: the atom node for which layout is being created, as returned from
|
|
42
|
+
* convertTree; the computed position of this atom is added to this
|
|
43
|
+
* object in place, in addition to being returned in the layout
|
|
44
|
+
* instruction.
|
|
45
|
+
* TODO(colin): refactor so that we don't need to modify this in place
|
|
46
|
+
* atoms: the list of all atoms, as returned from convertTree, used to
|
|
47
|
+
* position this atom appropriately relative to its neighbors
|
|
48
|
+
* bonds: the list of all bonds, as returned from convertTree, used to
|
|
49
|
+
* determine the geometry based on bond type
|
|
50
|
+
* rotationAngle: a constant rotation for the whole molecule (in degrees)
|
|
51
|
+
*
|
|
52
|
+
* Return:
|
|
53
|
+
* a rendering instruction for the atom, containing a type (text), the text
|
|
54
|
+
* to render, the position, and the atom index
|
|
55
|
+
*/
|
|
56
|
+
function atomLayout(
|
|
57
|
+
atom: any,
|
|
58
|
+
atoms: any,
|
|
59
|
+
bonds: ReadonlyArray<any>,
|
|
60
|
+
rotationAngle: number,
|
|
61
|
+
): any {
|
|
62
|
+
let textValue = atom.symbol;
|
|
63
|
+
if (textValue === "C" && Object.keys(atoms).length !== 1) {
|
|
64
|
+
// By convention, don't render the C for carbon in a chain.
|
|
65
|
+
textValue = null;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
if (atom.idx === "1,0") {
|
|
69
|
+
// The first atom is special-cased because there are no neighbors for
|
|
70
|
+
// relative positioning.
|
|
71
|
+
const pos = [0, 0];
|
|
72
|
+
atom.pos = pos;
|
|
73
|
+
// Conventionally, molecules are rendered where the first bond is not
|
|
74
|
+
// horizontal, but at a 30 degree angle, so subtract 30 degrees for the
|
|
75
|
+
// first atom's direction.
|
|
76
|
+
atom.baseAngle = -30 + rotationAngle;
|
|
77
|
+
return {type: "text", value: textValue, pos: pos, idx: atom.idx};
|
|
78
|
+
}
|
|
79
|
+
// If we're an atom with any other index than the case just handled, we're
|
|
80
|
+
// guaranteed to have a neighbor who has a defined position.
|
|
81
|
+
const prevPositionedAtom =
|
|
82
|
+
atoms[
|
|
83
|
+
atom.connections.find(function (c) {
|
|
84
|
+
return atoms[c].pos;
|
|
85
|
+
})
|
|
86
|
+
];
|
|
87
|
+
|
|
88
|
+
// Find this atom's index in the previous atom's connections
|
|
89
|
+
const myIndex = prevPositionedAtom.connections.indexOf(atom.idx);
|
|
90
|
+
|
|
91
|
+
let baseAngleIncrement = 60;
|
|
92
|
+
let angleIncrement = 120;
|
|
93
|
+
if (prevPositionedAtom.connections.length === 4) {
|
|
94
|
+
// By convention, if an atom has 4 bonds, we represent it with 90
|
|
95
|
+
// degree angles in 2D, even though it would have tetrahedral geometry
|
|
96
|
+
// with ~110 degree angles in 3D.
|
|
97
|
+
angleIncrement = 90;
|
|
98
|
+
baseAngleIncrement = 90;
|
|
99
|
+
} else if (
|
|
100
|
+
bonds.find(
|
|
101
|
+
(bond) => bond.bondType === "triple" && bond.to === atom.idx,
|
|
102
|
+
) ||
|
|
103
|
+
bonds.find(
|
|
104
|
+
(bond) =>
|
|
105
|
+
bond.bondType === "triple" &&
|
|
106
|
+
bond.to === prevPositionedAtom.idx,
|
|
107
|
+
)
|
|
108
|
+
) {
|
|
109
|
+
// Triple bonds have a bond angle of 180 degrees, so don't change the
|
|
110
|
+
// direction in which we made the previous bond.
|
|
111
|
+
angleIncrement = 0;
|
|
112
|
+
baseAngleIncrement = 0;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
let angle = 0;
|
|
116
|
+
const idxPath = prevPositionedAtom.idx.split(":");
|
|
117
|
+
const lastAtomIdx = idxPath[idxPath.length - 1].split(",")[0];
|
|
118
|
+
|
|
119
|
+
// Conventionally, a single chain of atoms is rendered as a zig-zag pattern
|
|
120
|
+
// with 120 degree angles. This means we need to flip the angle every
|
|
121
|
+
// other atom. The parser ensures that indices always alternate odd-even,
|
|
122
|
+
// including taking into account branch points.
|
|
123
|
+
// TODO(colin): don't depend on the parser's indexing scheme and just track
|
|
124
|
+
// this entirely in the layout engine.
|
|
125
|
+
if (parseInt(lastAtomIdx) % 2 !== 0) {
|
|
126
|
+
angle =
|
|
127
|
+
prevPositionedAtom.baseAngle -
|
|
128
|
+
(baseAngleIncrement - angleIncrement * myIndex);
|
|
129
|
+
} else {
|
|
130
|
+
angle =
|
|
131
|
+
prevPositionedAtom.baseAngle +
|
|
132
|
+
(baseAngleIncrement - angleIncrement * myIndex);
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
const pos = polarAdd(prevPositionedAtom.pos, angle, bondLength);
|
|
136
|
+
|
|
137
|
+
atom.pos = pos;
|
|
138
|
+
atom.baseAngle = angle;
|
|
139
|
+
|
|
140
|
+
return {type: "text", value: textValue, pos: pos, idx: atom.idx};
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
/**
|
|
144
|
+
* Get the start and end position for a bond connecting two atoms.
|
|
145
|
+
*
|
|
146
|
+
* If we have non-carbon atoms that render with explicit letters connected by a
|
|
147
|
+
* bond, we don't want the line for the bond to extend into the lettering for
|
|
148
|
+
* the atom.
|
|
149
|
+
*
|
|
150
|
+
* This function returns the start and end positions of the bond's line, taking
|
|
151
|
+
* into account that one or both end points might need to be moved to make room
|
|
152
|
+
* for text.
|
|
153
|
+
*
|
|
154
|
+
* TODO(colin): this makes assumptions about the relative sizes of the length
|
|
155
|
+
* of a bond and the text. Think about alternate ways to represent this that
|
|
156
|
+
* might not have that problem.
|
|
157
|
+
*/
|
|
158
|
+
function maybeShrinkLines(fromAtom: any, toAtom) {
|
|
159
|
+
const shrinkFactor = 0.25;
|
|
160
|
+
let fromPos = [fromAtom.pos[0], fromAtom.pos[1]];
|
|
161
|
+
let toPos = [toAtom.pos[0], toAtom.pos[1]];
|
|
162
|
+
if (fromAtom.symbol !== "C") {
|
|
163
|
+
fromPos = [
|
|
164
|
+
toAtom.pos[0] -
|
|
165
|
+
(1 - shrinkFactor) * (toAtom.pos[0] - fromAtom.pos[0]),
|
|
166
|
+
toAtom.pos[1] -
|
|
167
|
+
(1 - shrinkFactor) * (toAtom.pos[1] - fromAtom.pos[1]),
|
|
168
|
+
];
|
|
169
|
+
}
|
|
170
|
+
if (toAtom.symbol !== "C") {
|
|
171
|
+
// For carbon atoms, conventionally we don't draw any letter, so this
|
|
172
|
+
// special cases drawing the bond lines all the way to the point where
|
|
173
|
+
// they meet.
|
|
174
|
+
toPos = [
|
|
175
|
+
fromAtom.pos[0] -
|
|
176
|
+
(1 - shrinkFactor) * (fromAtom.pos[0] - toAtom.pos[0]),
|
|
177
|
+
fromAtom.pos[1] -
|
|
178
|
+
(1 - shrinkFactor) * (fromAtom.pos[1] - toAtom.pos[1]),
|
|
179
|
+
];
|
|
180
|
+
}
|
|
181
|
+
return [fromPos, toPos];
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
/**
|
|
185
|
+
* Compute the layout for a bond between two atoms.
|
|
186
|
+
*
|
|
187
|
+
* Args:
|
|
188
|
+
* bond: the bond node for which the layout is being computed, as returned
|
|
189
|
+
* by convertTree
|
|
190
|
+
* atoms: the list of all atoms returned by convertTree, which should
|
|
191
|
+
* already have been processed for layout and thus have positions set
|
|
192
|
+
*
|
|
193
|
+
* Return:
|
|
194
|
+
* a rendering instruction for the bond containing a type
|
|
195
|
+
* (line:{single,double,triple}) and the line's endpoints
|
|
196
|
+
*/
|
|
197
|
+
function bondLayout(bond: any, atoms: any): any {
|
|
198
|
+
const fromAtom = atoms[bond.from];
|
|
199
|
+
const toAtom = atoms[bond.to];
|
|
200
|
+
const startAndEndPos = maybeShrinkLines(fromAtom, toAtom);
|
|
201
|
+
return {
|
|
202
|
+
type: "line:" + bond.bondType,
|
|
203
|
+
startPos: startAndEndPos[0],
|
|
204
|
+
endPos: startAndEndPos[1],
|
|
205
|
+
};
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
/**
|
|
209
|
+
* Convert an array of atom indices to a single string unique identifier.
|
|
210
|
+
*
|
|
211
|
+
* For linear molecules, or for atoms in the main chain, this will just be the
|
|
212
|
+
* atom index, something like "0,1". For branched molecules, however, we
|
|
213
|
+
* uniquely identify atoms by an array of atoms where the branching happened,
|
|
214
|
+
* followed by the index in the current branch (like ["0,1", "1,2", "1,1"]).
|
|
215
|
+
* This function just joins the parts with a colon so that we can have nice
|
|
216
|
+
* object keys that still track the series of branches to get to an atom, which
|
|
217
|
+
* is guaranteed to be a unique identifier.
|
|
218
|
+
*
|
|
219
|
+
*/
|
|
220
|
+
function idxString(idx) {
|
|
221
|
+
return idx.join(":");
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
/**
|
|
225
|
+
* Convert the parse tree output by the parser into an ordered list of atoms
|
|
226
|
+
* and bonds to render.
|
|
227
|
+
*
|
|
228
|
+
* Args:
|
|
229
|
+
* atoms: the output list of atoms that we're in the process of building.
|
|
230
|
+
* This should be the empty list if not being called recursively.
|
|
231
|
+
* bonds: the output list of bonds that we're in the process of building.
|
|
232
|
+
* This should be the empty list if not being called recursively.
|
|
233
|
+
* tree: the parse tree generated by the SMILES parser module.
|
|
234
|
+
*
|
|
235
|
+
* Return:
|
|
236
|
+
* the final value of atoms and bonds, which are lists of all the atom
|
|
237
|
+
* nodes and bond nodes, respectively, that need to be rendered.
|
|
238
|
+
*/
|
|
239
|
+
function convertTree(atoms: any, bonds: any, tree: any): [any, any] {
|
|
240
|
+
if (tree === null) {
|
|
241
|
+
return [atoms, bonds];
|
|
242
|
+
}
|
|
243
|
+
if (tree.type === "atom") {
|
|
244
|
+
const treeIdx = idxString(tree.idx);
|
|
245
|
+
atoms[treeIdx] = {idx: treeIdx, symbol: tree.symbol, connections: []};
|
|
246
|
+
if (tree.bonds) {
|
|
247
|
+
tree.bonds.forEach(function (b) {
|
|
248
|
+
const toIdx = idxString(b.to.idx);
|
|
249
|
+
atoms[treeIdx].connections.push(toIdx);
|
|
250
|
+
bonds.push({from: treeIdx, to: toIdx, bondType: b.bondType});
|
|
251
|
+
convertTree(atoms, bonds, b.to);
|
|
252
|
+
atoms[toIdx].connections.push(treeIdx);
|
|
253
|
+
});
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
return [atoms, bonds];
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
/**
|
|
260
|
+
* Recursively process the queue of atoms that need to have layout computed.
|
|
261
|
+
*
|
|
262
|
+
* Args:
|
|
263
|
+
* outputs: the array of atom rendering instructions we're in the process
|
|
264
|
+
* of building. This should be the empty array if not being called
|
|
265
|
+
* recursively.
|
|
266
|
+
* atomProcessingQueue: the array of unique identifier strings (see the
|
|
267
|
+
* comment for idxString for more information about these) of atoms
|
|
268
|
+
* currently in line to be processed. When not being called
|
|
269
|
+
* recursively, this should be a array with a single element, the
|
|
270
|
+
* unique identifier of the first atom in the structure ("1,0" in the
|
|
271
|
+
* current scheme).
|
|
272
|
+
* atoms: the array of all atom nodes to be rendered, as returned by
|
|
273
|
+
* convertTree
|
|
274
|
+
* bonds: the array of all bond nodes to be rendered, as returned by
|
|
275
|
+
* convertTree
|
|
276
|
+
*
|
|
277
|
+
* Return:
|
|
278
|
+
* an array of rendering instructions for all the atoms in the molecule
|
|
279
|
+
*/
|
|
280
|
+
function atomLayoutHelper(
|
|
281
|
+
outputs,
|
|
282
|
+
atomProcessingQueue,
|
|
283
|
+
atoms,
|
|
284
|
+
bonds,
|
|
285
|
+
rotationAngle,
|
|
286
|
+
) {
|
|
287
|
+
if (atomProcessingQueue.length === 0) {
|
|
288
|
+
return outputs;
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
const queuedAtomIdx = atomProcessingQueue.shift();
|
|
292
|
+
const atom = atoms[queuedAtomIdx];
|
|
293
|
+
atom.connections.forEach(function (c) {
|
|
294
|
+
if (!atoms[c].pos) {
|
|
295
|
+
atomProcessingQueue.push(c);
|
|
296
|
+
}
|
|
297
|
+
});
|
|
298
|
+
return atomLayoutHelper(
|
|
299
|
+
outputs.concat(atomLayout(atom, atoms, bonds, rotationAngle)),
|
|
300
|
+
atomProcessingQueue,
|
|
301
|
+
atoms,
|
|
302
|
+
bonds,
|
|
303
|
+
rotationAngle,
|
|
304
|
+
);
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
/**
|
|
308
|
+
* Recursively process the queue of bonds that need to have layout computed.
|
|
309
|
+
*
|
|
310
|
+
* Args:
|
|
311
|
+
* outputs: the array of bond rendering instructions we're in the process
|
|
312
|
+
* of building. This should be the empty array or the array of all
|
|
313
|
+
* atom rendering instructions if not being called recursively.
|
|
314
|
+
* atoms: the array of all atom nodes to be rendered, as returned by
|
|
315
|
+
* convertTree
|
|
316
|
+
* bonds: the array of all bond nodes to be rendered, as returned by
|
|
317
|
+
* convertTree
|
|
318
|
+
*
|
|
319
|
+
* Return:
|
|
320
|
+
* an array of rendering instructions for all the bonds in the molecule
|
|
321
|
+
* concatenated to the initial value of outputs
|
|
322
|
+
*/
|
|
323
|
+
function bondLayoutHelper(outputs: Array<any>, atoms, bonds: any) {
|
|
324
|
+
if (bonds.length === 0) {
|
|
325
|
+
return outputs;
|
|
326
|
+
}
|
|
327
|
+
return bondLayoutHelper(
|
|
328
|
+
outputs.concat(bondLayout(bonds[0], atoms)),
|
|
329
|
+
atoms,
|
|
330
|
+
bonds.slice(1),
|
|
331
|
+
);
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
/**
|
|
335
|
+
* Compute an array of rendering instructions from the parse tree of a molecule.
|
|
336
|
+
*
|
|
337
|
+
* Args:
|
|
338
|
+
* tree: the parse tree as returned by the SMILES parser module
|
|
339
|
+
* rotationAngle: a global rotation (in degrees) to be applied to the whole
|
|
340
|
+
* molecule; this is manually adjustable in the widget.
|
|
341
|
+
*
|
|
342
|
+
* Return:
|
|
343
|
+
* an array of rendering instructions for all the atoms and bonds in the
|
|
344
|
+
* molecule suitable for processing by the renderer
|
|
345
|
+
*/
|
|
346
|
+
function layout(tree: any, rotationAngle: any): any {
|
|
347
|
+
const converted = convertTree({}, [], tree);
|
|
348
|
+
const atoms = converted[0];
|
|
349
|
+
const bonds = converted[1];
|
|
350
|
+
const outputs = atomLayoutHelper([], ["1,0"], atoms, bonds, rotationAngle);
|
|
351
|
+
return bondLayoutHelper(outputs, atoms, bonds);
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
export default {
|
|
355
|
+
layout: layout,
|
|
356
|
+
// The remainder are exported for testing and are not intended for external
|
|
357
|
+
// use.
|
|
358
|
+
_atomLayout: atomLayout,
|
|
359
|
+
_bondLayout: bondLayout,
|
|
360
|
+
_bondLength: bondLength,
|
|
361
|
+
_convertTree: convertTree,
|
|
362
|
+
};
|
|
@@ -0,0 +1,296 @@
|
|
|
1
|
+
// Regexp defining characters that are valid SMILES characters that this parser
|
|
2
|
+
// can parse. In addition to serving as a sort of validation, this also keeps
|
|
3
|
+
// out unimplemented features (like cycles and stereochemistry), which use
|
|
4
|
+
// additional characters.
|
|
5
|
+
const smilesRe = new RegExp("^[A-Za-z\\[\\]()=#+-]*$");
|
|
6
|
+
|
|
7
|
+
// Regexp defining what characters are valid as atom names. This includes
|
|
8
|
+
// common 1-character elements, Cl and Br for convenience, and the open
|
|
9
|
+
// bracket, which can be used to include anything as an atom name.
|
|
10
|
+
const atomRe = new RegExp("^(Cl|Br|[CONPSFBI]|\\[)");
|
|
11
|
+
|
|
12
|
+
function ParseError(message: string) {
|
|
13
|
+
// @ts-expect-error [FEI-5003] - TS2683 - 'this' implicitly has type 'any' because it does not have a type annotation.
|
|
14
|
+
this.message = message;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Perform a functional update of a possibly nested object.
|
|
19
|
+
*
|
|
20
|
+
* Args:
|
|
21
|
+
* obj: an object, will not be modified
|
|
22
|
+
* keylist: a list of keys whose values will be updated in the object.
|
|
23
|
+
* This represents a path to a value inside nested objects. For
|
|
24
|
+
* example, if keylist == ["a", "b", "c"], then a new object is
|
|
25
|
+
* returned with obj["a"]["b"]["c"] updated. Note that if any of the
|
|
26
|
+
* keys is not already present, this will insert {} as a default value
|
|
27
|
+
* for that key.
|
|
28
|
+
* val: the new value to associate with the keypath
|
|
29
|
+
*
|
|
30
|
+
* Return: a new object, which is a shallow copy of the original with the value
|
|
31
|
+
* at the specified keypath replaced.
|
|
32
|
+
*/
|
|
33
|
+
function _mset(obj, keylist, val) {
|
|
34
|
+
const k0 = keylist[0];
|
|
35
|
+
const rest = keylist.slice(1);
|
|
36
|
+
let newObj;
|
|
37
|
+
if (Array.isArray(obj)) {
|
|
38
|
+
newObj = [...obj];
|
|
39
|
+
} else {
|
|
40
|
+
newObj = {...(obj || {})};
|
|
41
|
+
}
|
|
42
|
+
let newVal = val;
|
|
43
|
+
if (rest.length > 0) {
|
|
44
|
+
newVal = _mset(newObj[k0], rest, val);
|
|
45
|
+
}
|
|
46
|
+
newObj[k0] = newVal;
|
|
47
|
+
return newObj;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* Perform a functional increment of a value in a nested object.
|
|
52
|
+
*
|
|
53
|
+
* Args:
|
|
54
|
+
* obj: an object; this will not be modified
|
|
55
|
+
* keylist: a list of keys representing a path into a nested object. (See
|
|
56
|
+
* `_mset` for examples.)
|
|
57
|
+
*
|
|
58
|
+
* Return:
|
|
59
|
+
* an object that is a shallow copy of obj, with the value at the specified
|
|
60
|
+
* path incremeneted.
|
|
61
|
+
*/
|
|
62
|
+
function _inc(obj, keylist: Array<number | string>) {
|
|
63
|
+
const val = keylist.reduce(function (acc, elt) {
|
|
64
|
+
return acc[elt];
|
|
65
|
+
}, obj);
|
|
66
|
+
|
|
67
|
+
return _mset(obj, keylist, val + 1);
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
function validate(smiles) {
|
|
71
|
+
return smilesRe.test(smiles);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* Parse a bond modifier character, updating the context object so that the
|
|
76
|
+
* next bond created has this modifier.
|
|
77
|
+
*/
|
|
78
|
+
function parseBondModifier(smiles: any, ctx) {
|
|
79
|
+
const firstChar = smiles[0];
|
|
80
|
+
const rest = smiles.slice(1);
|
|
81
|
+
if (firstChar === "=") {
|
|
82
|
+
return parse(rest, _mset(ctx, ["bond", "bondType"], "double"));
|
|
83
|
+
}
|
|
84
|
+
if (firstChar === "#") {
|
|
85
|
+
return parse(rest, _mset(ctx, ["bond", "bondType"], "triple"));
|
|
86
|
+
}
|
|
87
|
+
throw new ParseError("Invalid character: " + firstChar);
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/**
|
|
91
|
+
* Slice the input string, removing a parenthesized expression.
|
|
92
|
+
* (Will handle nested parentheses.)
|
|
93
|
+
*
|
|
94
|
+
* parenStack should be a list containing any open parentheses already
|
|
95
|
+
* encountered. (Usually, this will be ["("])
|
|
96
|
+
*/
|
|
97
|
+
function sliceFromMatchingCloseParen(smiles: any, parenStack: Array<any>) {
|
|
98
|
+
if (parenStack.length === 0) {
|
|
99
|
+
return smiles;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
if (smiles === "") {
|
|
103
|
+
throw new ParseError("Mismatched parentheses");
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
const firstChar = smiles[0];
|
|
107
|
+
const rest = smiles.slice(1);
|
|
108
|
+
|
|
109
|
+
if (firstChar === "(") {
|
|
110
|
+
return sliceFromMatchingCloseParen(rest, parenStack.concat(firstChar));
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
if (firstChar === ")") {
|
|
114
|
+
return sliceFromMatchingCloseParen(rest, parenStack.slice(1));
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
return sliceFromMatchingCloseParen(rest, parenStack);
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
/**
|
|
121
|
+
* Parse a branch, as indicated by the presence of a parenthesized experession.
|
|
122
|
+
*
|
|
123
|
+
* This returns a list of all branches (including the continuation of the
|
|
124
|
+
* backbone) that should be added to the previous atom's bond list.
|
|
125
|
+
*/
|
|
126
|
+
function parseParenthesizedExpression(smiles: any, ctx: any) {
|
|
127
|
+
const firstChar = smiles[0];
|
|
128
|
+
const rest = smiles.slice(1);
|
|
129
|
+
if (firstChar === "(") {
|
|
130
|
+
let newCtx = {...ctx, parens: ctx.parens + "("};
|
|
131
|
+
// increment the branch index
|
|
132
|
+
newCtx = _inc(ctx, ["idx", ctx.idx.length - 1, 1]);
|
|
133
|
+
|
|
134
|
+
let inBranchIdx = -1;
|
|
135
|
+
if (ctx.idx[ctx.idx.length - 1][0] % 2 === 0) {
|
|
136
|
+
// HACK(colin): this is so that we preserve the odd/even series in
|
|
137
|
+
// indices in branches; the layout engine uses this to select
|
|
138
|
+
// angles, and if we don't do this, editing one part of a molecule
|
|
139
|
+
// can cause another to flop around oddly.
|
|
140
|
+
// TODO(colin): this should just start at 0 all the time, and the
|
|
141
|
+
// layout engine should figure out continuity.
|
|
142
|
+
inBranchIdx = 0;
|
|
143
|
+
}
|
|
144
|
+
const parenCtx = {
|
|
145
|
+
...newCtx,
|
|
146
|
+
idx: newCtx.idx.concat([[inBranchIdx, 0]]),
|
|
147
|
+
parens: newCtx.parens.concat("("),
|
|
148
|
+
} as const;
|
|
149
|
+
const parenExpr = parse(rest, parenCtx);
|
|
150
|
+
const remainder = parse(
|
|
151
|
+
sliceFromMatchingCloseParen(rest, ["("]),
|
|
152
|
+
newCtx,
|
|
153
|
+
);
|
|
154
|
+
return [parenExpr].concat(remainder);
|
|
155
|
+
}
|
|
156
|
+
if (firstChar === ")") {
|
|
157
|
+
if (ctx.parens[ctx.parens.length - 1] !== "(") {
|
|
158
|
+
throw new ParseError("Mismatched parentheses");
|
|
159
|
+
}
|
|
160
|
+
return null;
|
|
161
|
+
}
|
|
162
|
+
throw new ParseError("Invalid bare character: " + firstChar);
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
/**
|
|
166
|
+
* Get the symbol of the next atom in the molecule.
|
|
167
|
+
*
|
|
168
|
+
* Return a 2-element list containing that symbol and the remainder of the
|
|
169
|
+
* molecule.
|
|
170
|
+
*/
|
|
171
|
+
function readAtomSymbol(smiles: any, _ctx) {
|
|
172
|
+
let sym = null;
|
|
173
|
+
let rest = null;
|
|
174
|
+
if (smiles[0] === "[") {
|
|
175
|
+
const closingIdx = smiles.indexOf("]");
|
|
176
|
+
if (closingIdx === -1) {
|
|
177
|
+
return ["", smiles];
|
|
178
|
+
}
|
|
179
|
+
sym = smiles.slice(1, closingIdx);
|
|
180
|
+
rest = smiles.slice(closingIdx + 1);
|
|
181
|
+
} else {
|
|
182
|
+
const match = atomRe.exec(smiles);
|
|
183
|
+
// @ts-expect-error [FEI-5003] - TS2322 - Type 'string' is not assignable to type 'null'. | TS2531 - Object is possibly 'null'.
|
|
184
|
+
sym = match[1];
|
|
185
|
+
// @ts-expect-error [FEI-5003] - TS2531 - Object is possibly 'null'.
|
|
186
|
+
rest = smiles.slice(sym.length);
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
return [sym, rest];
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
/**
|
|
193
|
+
* Parse the next atom in the molecule, returning an atom object if this is the
|
|
194
|
+
* first atom in the molecule, or a bond object with this atom as the
|
|
195
|
+
* destination of the bond if this is not the first atom.
|
|
196
|
+
*/
|
|
197
|
+
function parseAtom(smiles, ctx) {
|
|
198
|
+
const symbolInfo = readAtomSymbol(smiles, ctx);
|
|
199
|
+
const atom = symbolInfo[0];
|
|
200
|
+
if (atom === "") {
|
|
201
|
+
return ["error", "Unable to parse bracketed atom."];
|
|
202
|
+
}
|
|
203
|
+
const rest = symbolInfo[1];
|
|
204
|
+
|
|
205
|
+
// Atoms are indexed by a list of two-element lists. In each two-element
|
|
206
|
+
// list, the first element is the atom counter, and the second element is
|
|
207
|
+
// the branch counter. Branches are 1-indexed so that the main chain of
|
|
208
|
+
// the molecule can be indicated by 0. Atoms may be either 0- or
|
|
209
|
+
// 1-indexed, defaulting to 1, to maintain a alternating pattern of
|
|
210
|
+
// odd/even indices. So, for example, if an atom has a branch off the main
|
|
211
|
+
// chain, and its atom index is x, then the indices of atoms are:
|
|
212
|
+
// Atom where branch occurs: [[x, 0]]
|
|
213
|
+
// First atom in the branch: [[x, 1], [1, 0]] (assuming x is even)
|
|
214
|
+
// Next atom in the main chain: [[x + 1, 0]]
|
|
215
|
+
|
|
216
|
+
// increment the atom counter and reset the branch counter
|
|
217
|
+
const newCtx = _mset(
|
|
218
|
+
ctx,
|
|
219
|
+
["idx", ctx.idx.length - 1],
|
|
220
|
+
[1 + ctx.idx[ctx.idx.length - 1][0], 0],
|
|
221
|
+
);
|
|
222
|
+
let restOfMolecule = parse(
|
|
223
|
+
rest,
|
|
224
|
+
_mset(newCtx, ["bond", "bondType"], "single"),
|
|
225
|
+
);
|
|
226
|
+
if (!Array.isArray(restOfMolecule) && !!restOfMolecule) {
|
|
227
|
+
//TODO(colin): fix this awkwardness.
|
|
228
|
+
restOfMolecule = [restOfMolecule];
|
|
229
|
+
}
|
|
230
|
+
const atomObj = {
|
|
231
|
+
type: "atom",
|
|
232
|
+
symbol: atom,
|
|
233
|
+
bonds: restOfMolecule,
|
|
234
|
+
idx: newCtx.idx,
|
|
235
|
+
} as const;
|
|
236
|
+
if (ctx.bond) {
|
|
237
|
+
return {
|
|
238
|
+
type: "bond",
|
|
239
|
+
bondType: ctx.bond.bondType,
|
|
240
|
+
to: atomObj,
|
|
241
|
+
};
|
|
242
|
+
}
|
|
243
|
+
return atomObj;
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
function startsWithAtom(s: any) {
|
|
247
|
+
return atomRe.test(s);
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
function isModifierChar(s: any) {
|
|
251
|
+
return s === "=" || s === "#";
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
/**
|
|
255
|
+
* Parse a SMILES string to an internal tree representation.
|
|
256
|
+
*
|
|
257
|
+
* Args:
|
|
258
|
+
* smiles [string]: a string representing the molecule.
|
|
259
|
+
*
|
|
260
|
+
* Returns: the parse tree (see top-of file docstring for details).
|
|
261
|
+
*
|
|
262
|
+
* Throws:
|
|
263
|
+
* ParseError: if the input is not valid SMILES or contains features not
|
|
264
|
+
* yet implemented.
|
|
265
|
+
*/
|
|
266
|
+
function parse(smiles: any, ctx: any): any {
|
|
267
|
+
if (!validate(smiles)) {
|
|
268
|
+
throw new ParseError("Invalid input.");
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
if (!smiles || smiles.length === 0) {
|
|
272
|
+
return null;
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
if (startsWithAtom(smiles)) {
|
|
276
|
+
return parseAtom(
|
|
277
|
+
smiles,
|
|
278
|
+
ctx || {
|
|
279
|
+
idx: [[0, 0]],
|
|
280
|
+
parens: [],
|
|
281
|
+
stack: [],
|
|
282
|
+
bondModifiers: [],
|
|
283
|
+
},
|
|
284
|
+
);
|
|
285
|
+
}
|
|
286
|
+
if (isModifierChar(smiles[0])) {
|
|
287
|
+
// TODO(colin): add a better error message in the case where the input
|
|
288
|
+
// is invalid and starts with a modifier character?
|
|
289
|
+
return parseBondModifier(smiles, ctx);
|
|
290
|
+
}
|
|
291
|
+
// TODO(colin): add additional cases for unimplemented bits of SMILES
|
|
292
|
+
// syntax.
|
|
293
|
+
return parseParenthesizedExpression(smiles, ctx);
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
export default {parse: parse, ParseError: ParseError};
|