@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,173 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Draw some text into a 2D canvas drawing context.
|
|
3
|
-
*
|
|
4
|
-
* Args:
|
|
5
|
-
* ctx: the 2D drawing context
|
|
6
|
-
* item: the rendering instruction for the text. Must look like: {
|
|
7
|
-
* type: "text",
|
|
8
|
-
* pos: [x, y],
|
|
9
|
-
* value: "some text to draw",
|
|
10
|
-
* }
|
|
11
|
-
*
|
|
12
|
-
*/
|
|
13
|
-
function drawText(ctx, item: any) {
|
|
14
|
-
if (item.value === null) {
|
|
15
|
-
return;
|
|
16
|
-
}
|
|
17
|
-
ctx.fillStyle = styles.fgColor;
|
|
18
|
-
ctx.font = styles.font;
|
|
19
|
-
ctx.fillText(
|
|
20
|
-
item.value,
|
|
21
|
-
item.pos[0] - styles.fontSizePx / 2 + 1,
|
|
22
|
-
item.pos[1] + styles.fontSizePx / 2,
|
|
23
|
-
);
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
/**
|
|
27
|
-
* Draw a double line into a 2D canvas drawing context.
|
|
28
|
-
*
|
|
29
|
-
* Apparently the way you do this is to stroke an extra-wide line in the
|
|
30
|
-
* foreground color and then a smaller line in the background color. 5:3
|
|
31
|
-
* foreground:background width looks reasonable for drawing chemical bonds.
|
|
32
|
-
*
|
|
33
|
-
* Args:
|
|
34
|
-
* ctx: the 2D drawing context
|
|
35
|
-
* item: the rendering instruction for the line. Must look like: {
|
|
36
|
-
* type: "line:double",
|
|
37
|
-
* startPos: [x, y],
|
|
38
|
-
* endPos: [x, y],
|
|
39
|
-
* }
|
|
40
|
-
*/
|
|
41
|
-
function drawDoubleLine(ctx: any, item: any) {
|
|
42
|
-
// Outer line that forms both of the bond lines.
|
|
43
|
-
let path = new Path2D();
|
|
44
|
-
ctx.lineWidth = 5 * styles.lineWidth;
|
|
45
|
-
ctx.strokeStyle = styles.fgColor;
|
|
46
|
-
path.moveTo(item.startPos[0], item.startPos[1]);
|
|
47
|
-
path.lineTo(item.endPos[0], item.endPos[1]);
|
|
48
|
-
ctx.stroke(path);
|
|
49
|
-
|
|
50
|
-
// Inner white line that separates the two bond lines.
|
|
51
|
-
path = new Path2D();
|
|
52
|
-
ctx.lineWidth = 3 * styles.lineWidth;
|
|
53
|
-
ctx.strokeStyle = styles.bgColor;
|
|
54
|
-
path.moveTo(item.startPos[0], item.startPos[1]);
|
|
55
|
-
path.lineTo(item.endPos[0], item.endPos[1]);
|
|
56
|
-
ctx.stroke(path);
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
/**
|
|
60
|
-
* Draw a triple line into a 2D canvas drawing context.
|
|
61
|
-
*
|
|
62
|
-
* Following the strategy for the double line, we stroke a very wide
|
|
63
|
-
* foreground-color line, then a medium background-color line, then a narrow
|
|
64
|
-
* foreground-color line.
|
|
65
|
-
*
|
|
66
|
-
* Args:
|
|
67
|
-
* ctx: the 2D drawing context
|
|
68
|
-
* item: the rendering instruction for the line. Must look like: {
|
|
69
|
-
* type: "line:triple",
|
|
70
|
-
* startPos: [x, y],
|
|
71
|
-
* endPos: [x, y],
|
|
72
|
-
* }
|
|
73
|
-
*/
|
|
74
|
-
function drawTripleLine(ctx: any, item: any) {
|
|
75
|
-
// TODO(colin): consolidate duplicated code from the three line drawing
|
|
76
|
-
// functions.
|
|
77
|
-
|
|
78
|
-
// Outer line that will form the two outer bond lines.
|
|
79
|
-
let path = new Path2D();
|
|
80
|
-
ctx.lineWidth = 7 * styles.lineWidth;
|
|
81
|
-
ctx.strokeStyle = styles.fgColor;
|
|
82
|
-
path.moveTo(item.startPos[0], item.startPos[1]);
|
|
83
|
-
path.lineTo(item.endPos[0], item.endPos[1]);
|
|
84
|
-
ctx.stroke(path);
|
|
85
|
-
|
|
86
|
-
// Middle white line that separates the bonds
|
|
87
|
-
path = new Path2D();
|
|
88
|
-
ctx.lineWidth = 5 * styles.lineWidth;
|
|
89
|
-
ctx.strokeStyle = styles.bgColor;
|
|
90
|
-
path.moveTo(item.startPos[0], item.startPos[1]);
|
|
91
|
-
path.lineTo(item.endPos[0], item.endPos[1]);
|
|
92
|
-
ctx.stroke(path);
|
|
93
|
-
|
|
94
|
-
// Inner line that forms the middle bond line.
|
|
95
|
-
drawLine(ctx, item);
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
/**
|
|
99
|
-
* Draw a single line into a 2D canvas drawing context
|
|
100
|
-
*
|
|
101
|
-
* Args:
|
|
102
|
-
* ctx: the 2D drawing context
|
|
103
|
-
* item: the rendering instruction for the line. Must look like: {
|
|
104
|
-
* type: "line:single",
|
|
105
|
-
* startPos: [x, y],
|
|
106
|
-
* endPos: [x, y],
|
|
107
|
-
* }
|
|
108
|
-
*/
|
|
109
|
-
function drawLine(ctx: any, item) {
|
|
110
|
-
const path = new Path2D();
|
|
111
|
-
ctx.lineWidth = styles.lineWidth;
|
|
112
|
-
ctx.strokeStyle = styles.fgColor;
|
|
113
|
-
path.moveTo(item.startPos[0], item.startPos[1]);
|
|
114
|
-
path.lineTo(item.endPos[0], item.endPos[1]);
|
|
115
|
-
ctx.stroke(path);
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
/**
|
|
119
|
-
* Lookup table that maps drawing instruction types to the functions that
|
|
120
|
-
* render them.
|
|
121
|
-
*/
|
|
122
|
-
const drawingFuncs = {
|
|
123
|
-
text: drawText,
|
|
124
|
-
"line:single": drawLine,
|
|
125
|
-
"line:double": drawDoubleLine,
|
|
126
|
-
"line:triple": drawTripleLine,
|
|
127
|
-
} as const;
|
|
128
|
-
|
|
129
|
-
/**
|
|
130
|
-
* Draw a single rendering instruction into a 2D canvas drawing context.
|
|
131
|
-
*/
|
|
132
|
-
function drawItem(ctx: any) {
|
|
133
|
-
return function (item: any) {
|
|
134
|
-
drawingFuncs[item.type](ctx, item);
|
|
135
|
-
};
|
|
136
|
-
}
|
|
137
|
-
|
|
138
|
-
/**
|
|
139
|
-
* Lookup table for drawing priorities.
|
|
140
|
-
*
|
|
141
|
-
* Types with lower priorities are drawn first.
|
|
142
|
-
*/
|
|
143
|
-
const ordering = {
|
|
144
|
-
"line:single": 0,
|
|
145
|
-
"line:double": 0,
|
|
146
|
-
"line:triple": 0,
|
|
147
|
-
text: 1,
|
|
148
|
-
} as const;
|
|
149
|
-
|
|
150
|
-
/**
|
|
151
|
-
* Sorting comparison function that orders rendering instructions according to
|
|
152
|
-
* their type's priority.
|
|
153
|
-
*/
|
|
154
|
-
function compareElements(item0: any, item1: any) {
|
|
155
|
-
return ordering[item0.type] - ordering[item1.type];
|
|
156
|
-
}
|
|
157
|
-
|
|
158
|
-
/**
|
|
159
|
-
* Draw an array of rendering instructions into a 2D canvas drawing context.
|
|
160
|
-
*/
|
|
161
|
-
function draw(ctx: any, items: Array<any>) {
|
|
162
|
-
items.sort(compareElements).forEach(drawItem(ctx));
|
|
163
|
-
}
|
|
164
|
-
|
|
165
|
-
const styles = {
|
|
166
|
-
bgColor: "rgb(255, 255, 255)",
|
|
167
|
-
fgColor: "rgb(0, 0, 0)",
|
|
168
|
-
fontSizePx: 12,
|
|
169
|
-
lineWidth: 1,
|
|
170
|
-
font: "12px sans",
|
|
171
|
-
} as const;
|
|
172
|
-
|
|
173
|
-
export default draw;
|
|
@@ -1,362 +0,0 @@
|
|
|
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
|
-
};
|