@khanacademy/perseus 19.1.4 → 19.1.6
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/dist/components/graphie.d.ts +9 -1
- package/dist/es/index.js +255 -122
- package/dist/es/index.js.map +1 -1
- package/dist/index.js +261 -126
- package/dist/index.js.map +1 -1
- package/dist/interactive2/interactive-util.d.ts +1 -1
- package/dist/interactive2/movable-point-options.d.ts +5 -4
- package/dist/interactive2/movable.d.ts +90 -13
- package/dist/interactive2/types.d.ts +6 -0
- package/dist/util/graphie.d.ts +5 -0
- package/dist/widgets/expression.d.ts +4 -4
- package/package.json +11 -8
- package/.babelrc.js +0 -8
- package/.eslintrc.js +0 -12
- package/CHANGELOG.md +0 -1422
- package/src/__stories__/article-renderer.stories.tsx +0 -100
- package/src/__stories__/hints-renderer.stories.tsx +0 -55
- package/src/__stories__/server-item-renderer.stories.tsx +0 -44
- package/src/__testdata__/article-renderer.testdata.ts +0 -212
- package/src/__testdata__/graphie.testdata.ts +0 -51
- package/src/__testdata__/renderer.testdata.ts +0 -274
- package/src/__testdata__/server-item-renderer.testdata.ts +0 -171
- package/src/__tests__/__snapshots__/perseus-markdown.test.ts.snap +0 -507
- package/src/__tests__/__snapshots__/renderer.test.tsx.snap +0 -525
- package/src/__tests__/__snapshots__/server-item-renderer.test.tsx.snap +0 -285
- package/src/__tests__/a11y.test.ts +0 -303
- package/src/__tests__/article-renderer.test.tsx +0 -130
- package/src/__tests__/error-boundary.test.tsx +0 -76
- package/src/__tests__/extract-perseus-data.test.ts +0 -1027
- package/src/__tests__/init.test.ts +0 -10
- package/src/__tests__/jipt-paragraphs.test.ts +0 -32
- package/src/__tests__/mock-asset-loading-widget.tsx +0 -53
- package/src/__tests__/mock-widget.tsx +0 -33
- package/src/__tests__/perseus-markdown.test.ts +0 -764
- package/src/__tests__/renderability.test.ts +0 -480
- package/src/__tests__/renderer-api.test.tsx +0 -302
- package/src/__tests__/renderer.test.tsx +0 -1816
- package/src/__tests__/server-item-renderer.test.tsx +0 -582
- package/src/__tests__/test-items/image-item.ts +0 -24
- package/src/__tests__/test-items/input-number-1-item.ts +0 -26
- package/src/__tests__/test-items/input-number-2-item.ts +0 -38
- package/src/__tests__/test-items/table-item.ts +0 -29
- package/src/__tests__/tex-wrangler.test.ts +0 -82
- package/src/__tests__/util.test.ts +0 -40
- package/src/__tests__/widget-container.test.tsx +0 -126
- package/src/__tests__/widgets.test.ts +0 -91
- package/src/a11y.ts +0 -45
- package/src/all-widgets.ts +0 -9
- package/src/article-renderer.tsx +0 -237
- package/src/asset-context.ts +0 -30
- package/src/basic-widgets.ts +0 -16
- package/src/components/__stories__/button-group.stories.tsx +0 -55
- package/src/components/__stories__/fixed-to-responsive.stories.tsx +0 -141
- package/src/components/__stories__/graph.stories.tsx +0 -28
- package/src/components/__stories__/graphie.stories.tsx +0 -33
- package/src/components/__stories__/hud.stories.tsx +0 -35
- package/src/components/__stories__/icon.stories.tsx +0 -63
- package/src/components/__stories__/image-loader.stories.tsx +0 -63
- package/src/components/__stories__/info-tip.stories.tsx +0 -31
- package/src/components/__stories__/inline-icon.stories.tsx +0 -40
- package/src/components/__stories__/input-with-examples.stories.tsx +0 -53
- package/src/components/__stories__/lint.stories.tsx +0 -86
- package/src/components/__stories__/math-input.stories.tsx +0 -43
- package/src/components/__stories__/math-output.stories.tsx +0 -23
- package/src/components/__stories__/multi-button-group.stories.tsx +0 -66
- package/src/components/__stories__/number-input.stories.tsx +0 -41
- package/src/components/__stories__/prop-check-box.stories.tsx +0 -65
- package/src/components/__stories__/range-input.stories.tsx +0 -29
- package/src/components/__stories__/simple-keypad-input.stories.tsx +0 -27
- package/src/components/__stories__/sortable.stories.tsx +0 -77
- package/src/components/__stories__/stub-tag-editor.stories.tsx +0 -45
- package/src/components/__stories__/svg-image.stories.tsx +0 -74
- package/src/components/__stories__/tex.stories.tsx +0 -23
- package/src/components/__stories__/text-input.stories.tsx +0 -33
- package/src/components/__stories__/text-list-editor.stories.tsx +0 -32
- package/src/components/__stories__/tooltip.stories.tsx +0 -52
- package/src/components/__stories__/zoomable-tex.stories.tsx +0 -41
- package/src/components/__stories__/zoomable.stories.tsx +0 -49
- package/src/components/__testdata__/sorter.testdata.ts +0 -19
- package/src/components/__tests__/__snapshots__/sortable.test.tsx.snap +0 -163
- package/src/components/__tests__/__snapshots__/sorter.test.tsx.snap +0 -265
- package/src/components/__tests__/math-input.test.tsx +0 -147
- package/src/components/__tests__/number-input.test.tsx +0 -128
- package/src/components/__tests__/sortable.test.tsx +0 -269
- package/src/components/__tests__/sorter.test.tsx +0 -114
- package/src/components/__tests__/zoomable.test.tsx +0 -399
- package/src/components/button-group.tsx +0 -130
- package/src/components/constants.ts +0 -14
- package/src/components/fixed-to-responsive.tsx +0 -169
- package/src/components/graph.tsx +0 -444
- package/src/components/graphie-classes.ts +0 -153
- package/src/components/graphie-movables.ts +0 -338
- package/src/components/graphie.tsx +0 -392
- package/src/components/highlighting/highlightable-content.tsx +0 -240
- package/src/components/highlighting/highlights.ts +0 -207
- package/src/components/highlighting/ranges.ts +0 -304
- package/src/components/highlighting/types.ts +0 -73
- package/src/components/highlighting/ui/highlight-renderer.tsx +0 -172
- package/src/components/highlighting/ui/highlight-set-renderer.tsx +0 -185
- package/src/components/highlighting/ui/highlight-tooltip.tsx +0 -141
- package/src/components/highlighting/ui/highlighting-ui.tsx +0 -143
- package/src/components/highlighting/ui/selection-tracker.tsx +0 -186
- package/src/components/highlighting/ui/types.ts +0 -21
- package/src/components/highlighting/ui/util.ts +0 -165
- package/src/components/highlighting/word-indexer.tsx +0 -152
- package/src/components/hud.tsx +0 -167
- package/src/components/icon.tsx +0 -141
- package/src/components/image-loader.tsx +0 -177
- package/src/components/info-tip/info-tip.tsx +0 -144
- package/src/components/info-tip.tsx +0 -39
- package/src/components/inline-icon.tsx +0 -60
- package/src/components/input-with-examples.tsx +0 -249
- package/src/components/lint.tsx +0 -459
- package/src/components/math-input.tsx +0 -474
- package/src/components/math-output.tsx +0 -134
- package/src/components/multi-button-group.tsx +0 -135
- package/src/components/number-input.tsx +0 -249
- package/src/components/prop-check-box.tsx +0 -79
- package/src/components/range-input.tsx +0 -60
- package/src/components/simple-keypad-input.tsx +0 -88
- package/src/components/sortable.tsx +0 -958
- package/src/components/stub-tag-editor.tsx +0 -53
- package/src/components/svg-image.tsx +0 -779
- package/src/components/tex.tsx +0 -67
- package/src/components/text-input.tsx +0 -129
- package/src/components/text-list-editor.tsx +0 -166
- package/src/components/tooltip.tsx +0 -410
- package/src/components/visibility-observer/__stories__/visibility-observer.stories.tsx +0 -141
- package/src/components/visibility-observer/create-visibility-observer.ts +0 -108
- package/src/components/visibility-observer/get-scroll-parent.ts +0 -46
- package/src/components/visibility-observer/visibility-observer.tsx +0 -124
- package/src/components/zoomable-tex.tsx +0 -78
- package/src/components/zoomable.tsx +0 -304
- package/src/components.ts +0 -15
- package/src/definition-context.tsx +0 -59
- package/src/dependencies.ts +0 -40
- package/src/error-boundary.tsx +0 -70
- package/src/extra-widgets.ts +0 -75
- package/src/hint-renderer.tsx +0 -151
- package/src/hints-renderer.tsx +0 -372
- package/src/icon-paths.ts +0 -119
- package/src/index.ts +0 -171
- package/src/init.ts +0 -56
- package/src/interaction-tracker.ts +0 -62
- package/src/interactive2/__tests__/movable-mock.ts +0 -43
- package/src/interactive2/__tests__/movable-point.test.ts +0 -144
- package/src/interactive2/__tests__/movable.test.ts +0 -157
- package/src/interactive2/interactive-util.test.ts +0 -93
- package/src/interactive2/interactive-util.ts +0 -159
- package/src/interactive2/movable-helper-methods.ts +0 -166
- package/src/interactive2/movable-line-options.ts +0 -419
- package/src/interactive2/movable-line.ts +0 -307
- package/src/interactive2/movable-point-options.ts +0 -212
- package/src/interactive2/movable-point.tsx +0 -585
- package/src/interactive2/movable-polygon-options.ts +0 -389
- package/src/interactive2/movable-polygon.ts +0 -360
- package/src/interactive2/movable.ts +0 -279
- package/src/interactive2/objective_.ts +0 -79
- package/src/interactive2/types.ts +0 -2
- package/src/interactive2/wrapped-defaults.ts +0 -87
- package/src/interactive2/wrapped-ellipse.ts +0 -94
- package/src/interactive2/wrapped-line.ts +0 -116
- package/src/interactive2/wrapped-path.ts +0 -51
- package/src/interactive2.ts +0 -70
- package/src/item-version.ts +0 -10
- package/src/jipt-paragraphs.ts +0 -49
- package/src/jquery.mobile.vmouse.js +0 -545
- package/src/loading-context.ts +0 -21
- package/src/logging/log.test.ts +0 -39
- package/src/logging/log.ts +0 -97
- package/src/mixins/__tests__/widget-prop-denylist.test.ts +0 -21
- package/src/mixins/changeable.ts +0 -133
- package/src/mixins/editor-jsonify.ts +0 -13
- package/src/mixins/widget-jsonify-deprecated.ts +0 -23
- package/src/mixins/widget-prop-denylist.ts +0 -48
- package/src/multi-items/__stories__/multi-renderer.stories.tsx +0 -83
- package/src/multi-items/__testdata__/multi-renderer.testdata.ts +0 -172
- package/src/multi-items/__tests__/__snapshots__/multi-renderer.test.tsx.snap +0 -1164
- package/src/multi-items/__tests__/items.test.ts +0 -240
- package/src/multi-items/__tests__/multi-renderer.test.tsx +0 -914
- package/src/multi-items/__tests__/prop-type-builders.test.ts +0 -133
- package/src/multi-items/__tests__/shapes.test.ts +0 -43
- package/src/multi-items/__tests__/trees.test.ts +0 -317
- package/src/multi-items/item-types.ts +0 -56
- package/src/multi-items/items.ts +0 -176
- package/src/multi-items/multi-renderer.tsx +0 -569
- package/src/multi-items/prop-type-builders.ts +0 -106
- package/src/multi-items/shape-types.ts +0 -52
- package/src/multi-items/shapes.ts +0 -52
- package/src/multi-items/tree-types.ts +0 -47
- package/src/multi-items/trees.ts +0 -360
- package/src/multi-items.ts +0 -75
- package/src/perseus-api.tsx +0 -188
- package/src/perseus-env.ts +0 -27
- package/src/perseus-error.ts +0 -17
- package/src/perseus-markdown.tsx +0 -405
- package/src/perseus-types.ts +0 -1366
- package/src/perseus-version.ts +0 -9
- package/src/question-paragraph.tsx +0 -34
- package/src/renderability.ts +0 -109
- package/src/renderer.tsx +0 -2000
- package/src/server-item-renderer.tsx +0 -495
- package/src/sigfigs.ts +0 -490
- package/src/styles/articles.less +0 -749
- package/src/styles/constants.ts +0 -94
- package/src/styles/global-constants.ts +0 -343
- package/src/styles/global-styles.ts +0 -306
- package/src/styles/khan-exercise.css +0 -1468
- package/src/styles/media-queries.ts +0 -47
- package/src/styles/perseus-renderer.less +0 -732
- package/src/styles/shared.ts +0 -130
- package/src/styles/util.less +0 -47
- package/src/styles/variables.boostrap.less +0 -277
- package/src/styles/variables.less +0 -56
- package/src/styles/variables.shared.less +0 -340
- package/src/styles/widgets/categorizer.less +0 -38
- package/src/styles/widgets/dropdown.less +0 -3
- package/src/styles/widgets/expression.less +0 -65
- package/src/styles/widgets/graded-group.less +0 -36
- package/src/styles/widgets/grapher.less +0 -12
- package/src/styles/widgets/group.less +0 -19
- package/src/styles/widgets/image.less +0 -54
- package/src/styles/widgets/interactive-graph.less +0 -64
- package/src/styles/widgets/label-image.less +0 -57
- package/src/styles/widgets/matcher.less +0 -8
- package/src/styles/widgets/matrix.less +0 -126
- package/src/styles/widgets/measurer.less +0 -20
- package/src/styles/widgets/orderer.less +0 -98
- package/src/styles/widgets/passage.less +0 -154
- package/src/styles/widgets/plotter.less +0 -31
- package/src/styles/widgets/radio.less +0 -58
- package/src/styles/widgets/reaction-diagram.less +0 -35
- package/src/styles/widgets/sequence.less +0 -5
- package/src/styles/widgets/sortable.less +0 -113
- package/src/styles/widgets/table.less +0 -57
- package/src/styles/widgets/unit.less +0 -15
- package/src/tex-wrangler.ts +0 -182
- package/src/translation-linter.ts +0 -126
- package/src/traversal.ts +0 -138
- package/src/types.ts +0 -513
- package/src/util/a11y.ts +0 -23
- package/src/util/answer-types.test.ts +0 -114
- package/src/util/answer-types.ts +0 -876
- package/src/util/colors.ts +0 -93
- package/src/util/drawing-transform.test.ts +0 -67
- package/src/util/drawing-transform.ts +0 -102
- package/src/util/extract-perseus-data.ts +0 -539
- package/src/util/fix-passage-refs.ts +0 -121
- package/src/util/geometry.test.ts +0 -75
- package/src/util/geometry.ts +0 -312
- package/src/util/graph-bounds.ts +0 -23
- package/src/util/graph-utils.ts +0 -15
- package/src/util/graphie.test.ts +0 -1277
- package/src/util/graphie.ts +0 -1566
- package/src/util/interactive.ts +0 -4172
- package/src/util/interval.ts +0 -4
- package/src/util/katex-preprocess.ts +0 -14
- package/src/util/math.test.ts +0 -11
- package/src/util/math.ts +0 -294
- package/src/util/mobile-native-utils.test.ts +0 -22
- package/src/util/mobile-native-utils.ts +0 -12
- package/src/util/parse-perseus-json.test.ts +0 -10
- package/src/util/parse-perseus-json.ts +0 -13
- package/src/util/react-render.tsx +0 -27
- package/src/util/register-all-widgets-for-testing.ts +0 -13
- package/src/util/scroll-utils.ts +0 -155
- package/src/util/sizing-utils.ts +0 -46
- package/src/util/tex.ts +0 -73
- package/src/util/url-utils.ts +0 -34
- package/src/util.graphie.test.ts +0 -45
- package/src/util.graphie.ts +0 -59
- package/src/util.ts +0 -966
- package/src/version.ts +0 -10
- package/src/widget-container.tsx +0 -199
- package/src/widgets/__stories__/categorizer.stories.tsx +0 -14
- package/src/widgets/__stories__/cs-program.stories.tsx +0 -14
- package/src/widgets/__stories__/definition.stories.tsx +0 -114
- package/src/widgets/__stories__/dropdown.stories.tsx +0 -14
- package/src/widgets/__stories__/explanation.stories.tsx +0 -18
- package/src/widgets/__stories__/expression.stories.tsx +0 -145
- package/src/widgets/__stories__/graded-group-set.stories.tsx +0 -31
- package/src/widgets/__stories__/graded-group.stories.tsx +0 -31
- package/src/widgets/__stories__/grapher.stories.tsx +0 -46
- package/src/widgets/__stories__/group.stories.tsx +0 -14
- package/src/widgets/__stories__/iframe.stories.tsx +0 -14
- package/src/widgets/__stories__/image.stories.tsx +0 -85
- package/src/widgets/__stories__/input-number.stories.tsx +0 -101
- package/src/widgets/__stories__/interaction.stories.tsx +0 -14
- package/src/widgets/__stories__/interactive-graph.stories.tsx +0 -60
- package/src/widgets/__stories__/label-image.stories.tsx +0 -130
- package/src/widgets/__stories__/matcher.stories.tsx +0 -14
- package/src/widgets/__stories__/matrix.stories.tsx +0 -14
- package/src/widgets/__stories__/number-line.stories.tsx +0 -14
- package/src/widgets/__stories__/numeric-input.stories.tsx +0 -105
- package/src/widgets/__stories__/orderer.stories.tsx +0 -18
- package/src/widgets/__stories__/passage-ref.stories.tsx +0 -33
- package/src/widgets/__stories__/passage.stories.tsx +0 -39
- package/src/widgets/__stories__/plotter.stories.tsx +0 -27
- package/src/widgets/__stories__/radio.stories.tsx +0 -86
- package/src/widgets/__stories__/random-widgets.stories.tsx +0 -59
- package/src/widgets/__stories__/sorter.stories.tsx +0 -14
- package/src/widgets/__stories__/test-keypad-context-wrapper.tsx +0 -66
- package/src/widgets/__stories__/unit.stories.tsx +0 -28
- package/src/widgets/__stories__/video-transcript-link.stories.tsx +0 -23
- package/src/widgets/__stories__/video.stories.tsx +0 -22
- package/src/widgets/__testdata__/base-radio.testdata.ts +0 -21
- package/src/widgets/__testdata__/categorizer.testdata.ts +0 -89
- package/src/widgets/__testdata__/cs-program.testdata.ts +0 -27
- package/src/widgets/__testdata__/dropdown.testdata.ts +0 -71
- package/src/widgets/__testdata__/explanation.testdata.ts +0 -85
- package/src/widgets/__testdata__/expression.testdata.ts +0 -198
- package/src/widgets/__testdata__/graded-group-set.testdata.ts +0 -356
- package/src/widgets/__testdata__/graded-group.testdata.ts +0 -77
- package/src/widgets/__testdata__/grapher.testdata.ts +0 -374
- package/src/widgets/__testdata__/group.testdata.ts +0 -153
- package/src/widgets/__testdata__/iframe.testdata.ts +0 -35
- package/src/widgets/__testdata__/image.testdata.ts +0 -36
- package/src/widgets/__testdata__/input-number.testdata.ts +0 -72
- package/src/widgets/__testdata__/interaction.testdata.ts +0 -262
- package/src/widgets/__testdata__/interactive-graph-random.testdata.ts +0 -269
- package/src/widgets/__testdata__/interactive-graph.testdata.ts +0 -644
- package/src/widgets/__testdata__/label-image.testdata.ts +0 -308
- package/src/widgets/__testdata__/matcher.testdata.ts +0 -33
- package/src/widgets/__testdata__/matrix.testdata.ts +0 -28
- package/src/widgets/__testdata__/number-line.testdata.ts +0 -30
- package/src/widgets/__testdata__/numeric-input.testdata.ts +0 -265
- package/src/widgets/__testdata__/orderer.testdata.ts +0 -123
- package/src/widgets/__testdata__/passage-ref.testdata.ts +0 -101
- package/src/widgets/__testdata__/passage.testdata.ts +0 -95
- package/src/widgets/__testdata__/plotter.testdata.ts +0 -36
- package/src/widgets/__testdata__/radio.testdata.ts +0 -324
- package/src/widgets/__testdata__/randomizers.ts +0 -51
- package/src/widgets/__testdata__/sorter.testdata.ts +0 -19
- package/src/widgets/__testdata__/video.testdata.ts +0 -61
- package/src/widgets/__tests__/__snapshots__/categorizer.test.ts.snap +0 -940
- package/src/widgets/__tests__/__snapshots__/cs-program.test.ts.snap +0 -67
- package/src/widgets/__tests__/__snapshots__/definition.test.ts.snap +0 -97
- package/src/widgets/__tests__/__snapshots__/dropdown.test.ts.snap +0 -133
- package/src/widgets/__tests__/__snapshots__/explanation.test.ts.snap +0 -425
- package/src/widgets/__tests__/__snapshots__/graded-group-set-jipt.test.ts.snap +0 -729
- package/src/widgets/__tests__/__snapshots__/graded-group-set.test.ts.snap +0 -339
- package/src/widgets/__tests__/__snapshots__/graded-group.test.ts.snap +0 -801
- package/src/widgets/__tests__/__snapshots__/grapher.test.ts.snap +0 -2673
- package/src/widgets/__tests__/__snapshots__/group.test.tsx.snap +0 -1211
- package/src/widgets/__tests__/__snapshots__/iframe.test.ts.snap +0 -61
- package/src/widgets/__tests__/__snapshots__/image.test.ts.snap +0 -378
- package/src/widgets/__tests__/__snapshots__/input-number.test.ts.snap +0 -495
- package/src/widgets/__tests__/__snapshots__/interaction.test.ts.snap +0 -292
- package/src/widgets/__tests__/__snapshots__/interactive-graph.test.ts.snap +0 -2889
- package/src/widgets/__tests__/__snapshots__/matcher.test.tsx.snap +0 -883
- package/src/widgets/__tests__/__snapshots__/matrix.test.ts.snap +0 -514
- package/src/widgets/__tests__/__snapshots__/number-line.test.ts.snap +0 -814
- package/src/widgets/__tests__/__snapshots__/numeric-input.test.ts.snap +0 -470
- package/src/widgets/__tests__/__snapshots__/orderer.test.ts.snap +0 -243
- package/src/widgets/__tests__/__snapshots__/passage-ref.test.ts.snap +0 -434
- package/src/widgets/__tests__/__snapshots__/passage.test.tsx.snap +0 -1956
- package/src/widgets/__tests__/__snapshots__/plotter.test.tsx.snap +0 -827
- package/src/widgets/__tests__/__snapshots__/radio.test.ts.snap +0 -4237
- package/src/widgets/__tests__/__snapshots__/unit.test.tsx.snap +0 -20
- package/src/widgets/__tests__/__snapshots__/video.test.ts.snap +0 -153
- package/src/widgets/__tests__/categorizer.test.ts +0 -203
- package/src/widgets/__tests__/cs-program.test.ts +0 -43
- package/src/widgets/__tests__/definition.test.ts +0 -136
- package/src/widgets/__tests__/dropdown.test.ts +0 -105
- package/src/widgets/__tests__/explanation.test.ts +0 -198
- package/src/widgets/__tests__/expression-mobile.test.tsx +0 -363
- package/src/widgets/__tests__/expression.test.tsx +0 -484
- package/src/widgets/__tests__/graded-group-set-jipt.test.ts +0 -30
- package/src/widgets/__tests__/graded-group-set.test.ts +0 -288
- package/src/widgets/__tests__/graded-group.test.ts +0 -232
- package/src/widgets/__tests__/grapher.cypress.ts +0 -576
- package/src/widgets/__tests__/grapher.test.ts +0 -33
- package/src/widgets/__tests__/group.test.tsx +0 -510
- package/src/widgets/__tests__/iframe.test.ts +0 -45
- package/src/widgets/__tests__/image.test.ts +0 -62
- package/src/widgets/__tests__/input-number.test.ts +0 -354
- package/src/widgets/__tests__/interaction.test.ts +0 -31
- package/src/widgets/__tests__/interactive-graph.cypress.ts +0 -815
- package/src/widgets/__tests__/interactive-graph.test.ts +0 -106
- package/src/widgets/__tests__/matcher.test.tsx +0 -176
- package/src/widgets/__tests__/matrix.test.ts +0 -82
- package/src/widgets/__tests__/number-line.test.ts +0 -79
- package/src/widgets/__tests__/numeric-input.test.ts +0 -575
- package/src/widgets/__tests__/orderer.test.ts +0 -73
- package/src/widgets/__tests__/passage-ref.test.ts +0 -168
- package/src/widgets/__tests__/passage.test.tsx +0 -224
- package/src/widgets/__tests__/plotter.test.tsx +0 -69
- package/src/widgets/__tests__/radio/base-radio.test.tsx +0 -470
- package/src/widgets/__tests__/radio/choice-icon.test.tsx +0 -90
- package/src/widgets/__tests__/radio/choice.test.tsx +0 -310
- package/src/widgets/__tests__/radio/focus-ring.test.tsx +0 -22
- package/src/widgets/__tests__/radio/option-status.test.tsx +0 -77
- package/src/widgets/__tests__/radio.test.ts +0 -807
- package/src/widgets/__tests__/randomizers.test.ts +0 -53
- package/src/widgets/__tests__/renderQuestion.tsx +0 -101
- package/src/widgets/__tests__/unit.test.tsx +0 -168
- package/src/widgets/__tests__/video.test.ts +0 -69
- package/src/widgets/categorizer.tsx +0 -344
- package/src/widgets/cs-program.tsx +0 -227
- package/src/widgets/definition.tsx +0 -121
- package/src/widgets/deprecated-standin/__stories__/deprecated-standin.stories.tsx +0 -30
- package/src/widgets/deprecated-standin/__tests__/__snapshots__/deprecated-standin.test.ts.snap +0 -70
- package/src/widgets/deprecated-standin/__tests__/deprecated-standin.test.ts +0 -93
- package/src/widgets/deprecated-standin/index.tsx +0 -58
- package/src/widgets/dropdown.tsx +0 -142
- package/src/widgets/explanation.tsx +0 -317
- package/src/widgets/expression.tsx +0 -707
- package/src/widgets/graded-group-answer-bar.tsx +0 -142
- package/src/widgets/graded-group-set.tsx +0 -338
- package/src/widgets/graded-group.tsx +0 -471
- package/src/widgets/grapher/util.tsx +0 -799
- package/src/widgets/grapher.tsx +0 -660
- package/src/widgets/group.tsx +0 -195
- package/src/widgets/iframe.tsx +0 -195
- package/src/widgets/image.tsx +0 -312
- package/src/widgets/input-number.tsx +0 -412
- package/src/widgets/interaction/arrow-picker.tsx +0 -38
- package/src/widgets/interaction/color-picker.tsx +0 -69
- package/src/widgets/interaction/dash-picker.tsx +0 -45
- package/src/widgets/interaction/element-container.tsx +0 -100
- package/src/widgets/interaction.tsx +0 -826
- package/src/widgets/interactive-graph.tsx +0 -2597
- package/src/widgets/label-image/__stories__/answer-choices.stories.tsx +0 -91
- package/src/widgets/label-image/__stories__/answer-pill.stories.tsx +0 -62
- package/src/widgets/label-image/__stories__/marker.stories.tsx +0 -171
- package/src/widgets/label-image/__tests__/answer-pill.test.tsx +0 -75
- package/src/widgets/label-image/__tests__/hide-answers-toggle.test.tsx +0 -39
- package/src/widgets/label-image/answer-choices.tsx +0 -88
- package/src/widgets/label-image/answer-pill.tsx +0 -103
- package/src/widgets/label-image/hide-answers-toggle.tsx +0 -40
- package/src/widgets/label-image/marker.tsx +0 -268
- package/src/widgets/label-image/strings.ts +0 -5
- package/src/widgets/label-image/types.ts +0 -27
- package/src/widgets/label-image.test.ts +0 -928
- package/src/widgets/label-image.tsx +0 -819
- package/src/widgets/lights-puzzle.tsx +0 -359
- package/src/widgets/matcher.tsx +0 -298
- package/src/widgets/matrix.tsx +0 -634
- package/src/widgets/measurer.tsx +0 -222
- package/src/widgets/molecule/__tests__/layout.test.ts +0 -162
- package/src/widgets/molecule/__tests__/parser.test.ts +0 -155
- package/src/widgets/molecule/molecule-drawing.ts +0 -173
- package/src/widgets/molecule/molecule-layout.ts +0 -362
- package/src/widgets/molecule/smiles-parser.ts +0 -296
- package/src/widgets/molecule.tsx +0 -172
- package/src/widgets/number-line.tsx +0 -862
- package/src/widgets/numeric-input.tsx +0 -576
- package/src/widgets/orderer.tsx +0 -786
- package/src/widgets/passage/__tests__/passage-markdown.test.ts +0 -376
- package/src/widgets/passage/passage-markdown.tsx +0 -475
- package/src/widgets/passage-ref-target.tsx +0 -76
- package/src/widgets/passage-ref.tsx +0 -213
- package/src/widgets/passage.tsx +0 -582
- package/src/widgets/plotter.tsx +0 -1194
- package/src/widgets/radio/__stories__/base-radio.stories.tsx +0 -196
- package/src/widgets/radio/__stories__/choice-icon.stories.tsx +0 -166
- package/src/widgets/radio/__stories__/choice-none-above.stories.tsx +0 -40
- package/src/widgets/radio/__stories__/choice.stories.tsx +0 -137
- package/src/widgets/radio/__stories__/focus-ring.stories.tsx +0 -43
- package/src/widgets/radio/__stories__/option-status.stories.tsx +0 -103
- package/src/widgets/radio/base-radio.tsx +0 -511
- package/src/widgets/radio/choice-a11y-text.ts +0 -61
- package/src/widgets/radio/choice-icon/choice-icon.tsx +0 -218
- package/src/widgets/radio/choice-icon/cross-out-line.tsx +0 -51
- package/src/widgets/radio/choice-icon/shared-styles.ts +0 -15
- package/src/widgets/radio/choice-none-above.tsx +0 -56
- package/src/widgets/radio/choice.jsx.fixture.ts +0 -45
- package/src/widgets/radio/choice.tsx +0 -359
- package/src/widgets/radio/focus-ring.tsx +0 -57
- package/src/widgets/radio/option-status.tsx +0 -98
- package/src/widgets/radio/util.test.ts +0 -18
- package/src/widgets/radio/util.ts +0 -31
- package/src/widgets/radio/widget.tsx +0 -520
- package/src/widgets/radio.ts +0 -157
- package/src/widgets/reaction-diagram.tsx +0 -144
- package/src/widgets/sequence.tsx +0 -142
- package/src/widgets/simulator.tsx +0 -829
- package/src/widgets/sorter.tsx +0 -155
- package/src/widgets/table.tsx +0 -393
- package/src/widgets/unit.tsx +0 -374
- package/src/widgets/video-transcript-link.test.tsx +0 -213
- package/src/widgets/video-transcript-link.tsx +0 -84
- package/src/widgets/video.tsx +0 -135
- package/src/widgets.ts +0 -489
- package/src/zoom.ts +0 -555
- package/tsconfig-build.json +0 -26
- package/tsconfig-build.tsbuildinfo +0 -1
|
@@ -1,296 +0,0 @@
|
|
|
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 - 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 - TS2322 - Type 'string' is not assignable to type 'null'. | TS2531 - Object is possibly 'null'.
|
|
184
|
-
sym = match[1];
|
|
185
|
-
// @ts-expect-error - 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};
|
package/src/widgets/molecule.tsx
DELETED
|
@@ -1,172 +0,0 @@
|
|
|
1
|
-
/* eslint-disable react/no-unsafe */
|
|
2
|
-
import * as i18n from "@khanacademy/wonder-blocks-i18n";
|
|
3
|
-
import PropTypes from "prop-types";
|
|
4
|
-
import * as React from "react";
|
|
5
|
-
|
|
6
|
-
import draw from "./molecule/molecule-drawing";
|
|
7
|
-
import MoleculeLayout from "./molecule/molecule-layout";
|
|
8
|
-
import SmilesParser from "./molecule/smiles-parser";
|
|
9
|
-
|
|
10
|
-
import type {WidgetExports} from "../types";
|
|
11
|
-
|
|
12
|
-
const {layout} = MoleculeLayout;
|
|
13
|
-
const parse = SmilesParser.parse;
|
|
14
|
-
const ParseError = SmilesParser.ParseError;
|
|
15
|
-
|
|
16
|
-
const borderSize = 30;
|
|
17
|
-
|
|
18
|
-
export class Molecule extends React.Component<any, any> {
|
|
19
|
-
static propTypes = {
|
|
20
|
-
id: PropTypes.string.isRequired,
|
|
21
|
-
rotationAngle: PropTypes.number,
|
|
22
|
-
smiles: PropTypes.string,
|
|
23
|
-
};
|
|
24
|
-
|
|
25
|
-
state: any = {parsedSmiles: null, error: null};
|
|
26
|
-
|
|
27
|
-
// TODO(jangmi, CP-3288): Remove usage of `UNSAFE_componentWillMount`
|
|
28
|
-
UNSAFE_componentWillMount() {
|
|
29
|
-
this.stateFromSmiles(this.props.smiles);
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
componentDidMount() {
|
|
33
|
-
this.canvasRender();
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
UNSAFE_componentWillReceiveProps(nextProps: any) {
|
|
37
|
-
this.stateFromSmiles(nextProps.smiles);
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
componentDidUpdate() {
|
|
41
|
-
this.canvasRender();
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
stateFromSmiles: (arg1: any) => void = (smiles) => {
|
|
45
|
-
try {
|
|
46
|
-
this.setState({
|
|
47
|
-
// @ts-expect-error - TS2554 - Expected 2 arguments, but got 1.
|
|
48
|
-
parsedSmiles: parse(smiles),
|
|
49
|
-
error: null,
|
|
50
|
-
});
|
|
51
|
-
} catch (e: any) {
|
|
52
|
-
if (e instanceof ParseError) {
|
|
53
|
-
// @ts-expect-error - TS2339 - Property 'message' does not exist on type '{}'.
|
|
54
|
-
this.setState({error: e.message});
|
|
55
|
-
} else {
|
|
56
|
-
throw e;
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
};
|
|
60
|
-
|
|
61
|
-
setCanvasBounds: (arg1: any, arg2: any) => any = (canvas, items) => {
|
|
62
|
-
const xmax = Math.max(
|
|
63
|
-
...items.map((item) => (item.pos ? item.pos[0] : -Infinity)),
|
|
64
|
-
);
|
|
65
|
-
const ymax = Math.max(
|
|
66
|
-
...items.map((item) => (item.pos ? item.pos[1] : -Infinity)),
|
|
67
|
-
);
|
|
68
|
-
const xmin = Math.min(
|
|
69
|
-
...items.map((item) => (item.pos ? item.pos[0] : Infinity)),
|
|
70
|
-
);
|
|
71
|
-
const ymin = Math.min(
|
|
72
|
-
...items.map((item) => (item.pos ? item.pos[1] : Infinity)),
|
|
73
|
-
);
|
|
74
|
-
const width = xmax - xmin + 2 * borderSize;
|
|
75
|
-
const height = ymax - ymin + 2 * borderSize;
|
|
76
|
-
canvas.width = width;
|
|
77
|
-
canvas.height = height;
|
|
78
|
-
return [borderSize - xmin, borderSize - ymin];
|
|
79
|
-
};
|
|
80
|
-
|
|
81
|
-
canvasRender: () => void = () => {
|
|
82
|
-
// Since canvas drawing happens only through an imperative API, we sync
|
|
83
|
-
// up the component with the canvas here, which happens when the
|
|
84
|
-
// component mounts or updates.
|
|
85
|
-
if (!!this.state.error || !this.state.parsedSmiles) {
|
|
86
|
-
return;
|
|
87
|
-
}
|
|
88
|
-
const items = layout(this.state.parsedSmiles, this.props.rotationAngle);
|
|
89
|
-
// eslint-disable-next-line react/no-string-refs
|
|
90
|
-
const canvas = this.refs.canvas;
|
|
91
|
-
const translation = this.setCanvasBounds(canvas, items);
|
|
92
|
-
// @ts-expect-error - TS2339 - Property 'getContext' does not exist on type 'ReactInstance'.
|
|
93
|
-
const ctx = canvas.getContext("2d");
|
|
94
|
-
// @ts-expect-error - TS2339 - Property 'width' does not exist on type 'ReactInstance'. | TS2339 - Property 'height' does not exist on type 'ReactInstance'.
|
|
95
|
-
ctx.clearRect(0, 0, canvas.width, canvas.height);
|
|
96
|
-
ctx.save();
|
|
97
|
-
ctx.translate(translation[0], translation[1]);
|
|
98
|
-
draw(ctx, items);
|
|
99
|
-
ctx.restore();
|
|
100
|
-
};
|
|
101
|
-
|
|
102
|
-
render(): React.ReactNode {
|
|
103
|
-
// TODO(colin): escape the punctuation in the SMILES alt text for
|
|
104
|
-
// screen readers?
|
|
105
|
-
let content = (
|
|
106
|
-
<canvas
|
|
107
|
-
className="molecule-canvas"
|
|
108
|
-
id={this.props.id + "-molecule"}
|
|
109
|
-
// eslint-disable-next-line react/no-string-refs
|
|
110
|
-
ref="canvas"
|
|
111
|
-
>
|
|
112
|
-
{i18n.$_(
|
|
113
|
-
"A molecular structure drawing. SMILES notation: %(content)s",
|
|
114
|
-
{
|
|
115
|
-
content: this.props.smiles,
|
|
116
|
-
},
|
|
117
|
-
)}
|
|
118
|
-
</canvas>
|
|
119
|
-
);
|
|
120
|
-
if (this.state.error) {
|
|
121
|
-
content = <div className="error">{this.state.error}</div>;
|
|
122
|
-
}
|
|
123
|
-
return <div className="molecule-canvas">{content}</div>;
|
|
124
|
-
}
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
class MoleculeWidget extends React.Component<any> {
|
|
128
|
-
static propTypes = {
|
|
129
|
-
rotationAngle: PropTypes.number,
|
|
130
|
-
smiles: PropTypes.string,
|
|
131
|
-
widgetId: PropTypes.string,
|
|
132
|
-
};
|
|
133
|
-
|
|
134
|
-
static defaultProps: any = {rotationAngle: 0};
|
|
135
|
-
|
|
136
|
-
simpleValidate: (arg1: any) => any = () => {
|
|
137
|
-
return {type: "points", earned: 0, total: 0, message: null};
|
|
138
|
-
};
|
|
139
|
-
|
|
140
|
-
getUserInput: () => ReadonlyArray<ReadonlyArray<string>> = () => {
|
|
141
|
-
return [];
|
|
142
|
-
};
|
|
143
|
-
|
|
144
|
-
validate: (arg1: any, arg2: any) => any = (state, rubric) => {
|
|
145
|
-
// TODO(colin): this is here as part of the interface for a component.
|
|
146
|
-
// Figure out if there is something more appropriate that this should
|
|
147
|
-
// return.
|
|
148
|
-
return {
|
|
149
|
-
type: "points",
|
|
150
|
-
earned: 0,
|
|
151
|
-
total: 0,
|
|
152
|
-
message: null,
|
|
153
|
-
};
|
|
154
|
-
};
|
|
155
|
-
|
|
156
|
-
render(): React.ReactNode {
|
|
157
|
-
return (
|
|
158
|
-
<Molecule
|
|
159
|
-
id={this.props.widgetId}
|
|
160
|
-
smiles={this.props.smiles}
|
|
161
|
-
rotationAngle={this.props.rotationAngle}
|
|
162
|
-
/>
|
|
163
|
-
);
|
|
164
|
-
}
|
|
165
|
-
}
|
|
166
|
-
|
|
167
|
-
export default {
|
|
168
|
-
name: "molecule-renderer",
|
|
169
|
-
displayName: "Molecule renderer",
|
|
170
|
-
hidden: true,
|
|
171
|
-
widget: MoleculeWidget,
|
|
172
|
-
} as WidgetExports<typeof MoleculeWidget>;
|