@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
package/src/widgets/passage.tsx
DELETED
|
@@ -1,582 +0,0 @@
|
|
|
1
|
-
import {linterContextDefault} from "@khanacademy/perseus-linter";
|
|
2
|
-
import * as i18n from "@khanacademy/wonder-blocks-i18n";
|
|
3
|
-
import {StyleSheet, css} from "aphrodite";
|
|
4
|
-
import $ from "jquery";
|
|
5
|
-
import * as React from "react";
|
|
6
|
-
import * as ReactDOM from "react-dom";
|
|
7
|
-
import _ from "underscore";
|
|
8
|
-
|
|
9
|
-
import HighlightableContent from "../components/highlighting/highlightable-content";
|
|
10
|
-
import {getDependencies} from "../dependencies";
|
|
11
|
-
import Renderer from "../renderer";
|
|
12
|
-
|
|
13
|
-
import PassageMarkdown from "./passage/passage-markdown";
|
|
14
|
-
|
|
15
|
-
import type {ParseState} from "./passage/passage-markdown";
|
|
16
|
-
import type {SerializedHighlightSet} from "../components/highlighting/types";
|
|
17
|
-
import type {ChangeableProps} from "../mixins/changeable";
|
|
18
|
-
import type {
|
|
19
|
-
PerseusPassageWidgetOptions,
|
|
20
|
-
PerseusWidget,
|
|
21
|
-
} from "../perseus-types";
|
|
22
|
-
import type {PerseusScore, WidgetExports, WidgetProps} from "../types";
|
|
23
|
-
import type {SingleASTNode} from "@khanacademy/simple-markdown";
|
|
24
|
-
|
|
25
|
-
// A fake paragraph to measure the line height of the passage,
|
|
26
|
-
// so we can adapt to browser zoom
|
|
27
|
-
export class LineHeightMeasurer extends React.Component<Record<any, any>> {
|
|
28
|
-
_line: HTMLDivElement | null | undefined;
|
|
29
|
-
|
|
30
|
-
measureLineHeight(): number {
|
|
31
|
-
if (!this._line) {
|
|
32
|
-
return 0;
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
return this._line.clientHeight;
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
render(): React.ReactNode {
|
|
39
|
-
return (
|
|
40
|
-
<div className={css(styles.measurer)} aria-hidden="true">
|
|
41
|
-
<div ref={(ref) => (this._line = ref)} className="paragraph">
|
|
42
|
-
Line Height Measurement
|
|
43
|
-
</div>
|
|
44
|
-
</div>
|
|
45
|
-
);
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
const styles = StyleSheet.create({
|
|
50
|
-
measurer: {
|
|
51
|
-
position: "absolute",
|
|
52
|
-
top: 0,
|
|
53
|
-
left: 0,
|
|
54
|
-
visibility: "hidden",
|
|
55
|
-
// keep from blocking text selection
|
|
56
|
-
zIndex: -1,
|
|
57
|
-
},
|
|
58
|
-
});
|
|
59
|
-
|
|
60
|
-
type UserInput = null;
|
|
61
|
-
|
|
62
|
-
type Rubric = PerseusPassageWidgetOptions;
|
|
63
|
-
|
|
64
|
-
// The result of the `transform` function (end of this file)
|
|
65
|
-
type RenderProps = {
|
|
66
|
-
passageTitle: PerseusPassageWidgetOptions["passageTitle"];
|
|
67
|
-
passageText: PerseusPassageWidgetOptions["passageText"];
|
|
68
|
-
footnotes: PerseusPassageWidgetOptions["footnotes"];
|
|
69
|
-
showLineNumbers: PerseusPassageWidgetOptions["showLineNumbers"];
|
|
70
|
-
};
|
|
71
|
-
|
|
72
|
-
type FindWidgetsCallback = (id: string, widgetInfo: PerseusWidget) => boolean;
|
|
73
|
-
|
|
74
|
-
type PassageProps = ChangeableProps &
|
|
75
|
-
WidgetProps<RenderProps, Rubric> & {
|
|
76
|
-
findWidgets: (arg1: FindWidgetsCallback) => ReadonlyArray<Passage>;
|
|
77
|
-
highlights: SerializedHighlightSet;
|
|
78
|
-
};
|
|
79
|
-
|
|
80
|
-
type DefaultPassageProps = {
|
|
81
|
-
passageTitle: PassageProps["passageTitle"];
|
|
82
|
-
passageText: PassageProps["passageText"];
|
|
83
|
-
footnotes: PassageProps["footnotes"];
|
|
84
|
-
showLineNumbers: PassageProps["showLineNumbers"];
|
|
85
|
-
highlights: PassageProps["highlights"];
|
|
86
|
-
linterContext: PassageProps["linterContext"];
|
|
87
|
-
};
|
|
88
|
-
|
|
89
|
-
type PassageState = {
|
|
90
|
-
nLines: number | null | undefined;
|
|
91
|
-
startLineNumbersAfter: number;
|
|
92
|
-
stylesAreApplied: boolean;
|
|
93
|
-
};
|
|
94
|
-
|
|
95
|
-
// Information about a passage reference, used in inter-widgets.
|
|
96
|
-
export type Reference = {
|
|
97
|
-
startLine: number;
|
|
98
|
-
endLine: number;
|
|
99
|
-
content: string | null | undefined;
|
|
100
|
-
};
|
|
101
|
-
|
|
102
|
-
export class Passage extends React.Component<PassageProps, PassageState> {
|
|
103
|
-
_contentRef: HTMLDivElement | null | undefined;
|
|
104
|
-
_lineHeightMeasurerRef: LineHeightMeasurer | null | undefined;
|
|
105
|
-
// @ts-expect-error - TS2564 - Property '_onResize' has no initializer and is not definitely assigned in the constructor.
|
|
106
|
-
_onResize: () => Record<any, any>;
|
|
107
|
-
// @ts-expect-error - TS2564 - Property '_stylesAppiedTimer' has no initializer and is not definitely assigned in the constructor.
|
|
108
|
-
_stylesAppiedTimer: number;
|
|
109
|
-
|
|
110
|
-
static defaultProps: DefaultPassageProps = {
|
|
111
|
-
passageTitle: "",
|
|
112
|
-
passageText: "",
|
|
113
|
-
footnotes: "",
|
|
114
|
-
showLineNumbers: true,
|
|
115
|
-
highlights: {},
|
|
116
|
-
linterContext: linterContextDefault,
|
|
117
|
-
};
|
|
118
|
-
|
|
119
|
-
state: PassageState = {
|
|
120
|
-
nLines: null,
|
|
121
|
-
startLineNumbersAfter: 0,
|
|
122
|
-
stylesAreApplied: false,
|
|
123
|
-
};
|
|
124
|
-
|
|
125
|
-
componentDidMount() {
|
|
126
|
-
this._updateState();
|
|
127
|
-
|
|
128
|
-
// @ts-expect-error - TS2322 - Type '(() => void) & Cancelable' is not assignable to type '() => Record<any, any>'.
|
|
129
|
-
this._onResize = _.throttle(() => {
|
|
130
|
-
// If we're rendering JIPT text, we won't have line numbers or a
|
|
131
|
-
// line height measurer, so skip handling this resize.
|
|
132
|
-
if (this.shouldRenderJipt()) {
|
|
133
|
-
return;
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
// Remeasure the line height on resize, because the only line
|
|
137
|
-
// height changes we expect are subpixel changes when the user
|
|
138
|
-
// zooms in/out, and the only way to listen for zoom events is to
|
|
139
|
-
// listen for resize events.
|
|
140
|
-
this._lineHeightMeasurerRef?.measureLineHeight();
|
|
141
|
-
this._updateState();
|
|
142
|
-
}, 500);
|
|
143
|
-
window.addEventListener("resize", this._onResize);
|
|
144
|
-
|
|
145
|
-
// Wait for Aphrodite styles (which are guaranteed to apply after one
|
|
146
|
-
// tick), then set state.
|
|
147
|
-
//
|
|
148
|
-
// This flag is used to set the `enabled` prop of the
|
|
149
|
-
// `HighlightableContent` component. That way, we only show highlights
|
|
150
|
-
// once styles are ready, and they're measured with the correct
|
|
151
|
-
// position.
|
|
152
|
-
//
|
|
153
|
-
// HACK(mdr): It's not really the Passage's Aphrodite styles that are
|
|
154
|
-
// causing bad measures, but more so the Khan Academy Test Prep
|
|
155
|
-
// app's Aphrodite styles. We would ideally instead offer the
|
|
156
|
-
// embedding application an API to signal that the app's layout has
|
|
157
|
-
// changed in a way that affects the Renderer... but, for now, just
|
|
158
|
-
// hardcode this hack into here.
|
|
159
|
-
// TODO(somewhatabstract): Use WB timing
|
|
160
|
-
// eslint-disable-next-line no-restricted-syntax
|
|
161
|
-
this._stylesAppiedTimer = window.setTimeout(() => {
|
|
162
|
-
this.setState({stylesAreApplied: true});
|
|
163
|
-
}, 0);
|
|
164
|
-
}
|
|
165
|
-
|
|
166
|
-
shouldComponentUpdate(
|
|
167
|
-
nextProps: PassageProps,
|
|
168
|
-
nextState: PassageState,
|
|
169
|
-
): any | boolean {
|
|
170
|
-
return (
|
|
171
|
-
!_.isEqual(this.props, nextProps) ||
|
|
172
|
-
!_.isEqual(this.state, nextState)
|
|
173
|
-
);
|
|
174
|
-
}
|
|
175
|
-
|
|
176
|
-
componentDidUpdate() {
|
|
177
|
-
this._updateState();
|
|
178
|
-
}
|
|
179
|
-
|
|
180
|
-
componentWillUnmount() {
|
|
181
|
-
window.removeEventListener("resize", this._onResize);
|
|
182
|
-
// eslint-disable-next-line no-restricted-syntax
|
|
183
|
-
clearTimeout(this._stylesAppiedTimer);
|
|
184
|
-
}
|
|
185
|
-
|
|
186
|
-
_handleSerializedHighlightsUpdate: (
|
|
187
|
-
serializedHighlights: SerializedHighlightSet,
|
|
188
|
-
) => void = (serializedHighlights: SerializedHighlightSet) => {
|
|
189
|
-
this.props.onChange({highlights: serializedHighlights});
|
|
190
|
-
};
|
|
191
|
-
|
|
192
|
-
/**
|
|
193
|
-
* Line numbering
|
|
194
|
-
*
|
|
195
|
-
* These functions support passage line numbering, which is non-trivial
|
|
196
|
-
* because we manually measure lines to support resizing as well as
|
|
197
|
-
* continuing line numbers from previous passages.
|
|
198
|
-
*/
|
|
199
|
-
|
|
200
|
-
_updateState() {
|
|
201
|
-
// If we're rendering JIPT text, we're not rendering line numbers so we
|
|
202
|
-
// don't need to update this state.
|
|
203
|
-
if (this.shouldRenderJipt()) {
|
|
204
|
-
return;
|
|
205
|
-
}
|
|
206
|
-
|
|
207
|
-
this.setState({
|
|
208
|
-
nLines: this._measureLines(),
|
|
209
|
-
startLineNumbersAfter: this._getInitialLineNumber(),
|
|
210
|
-
});
|
|
211
|
-
}
|
|
212
|
-
|
|
213
|
-
_measureLines(): number {
|
|
214
|
-
const renderer = ReactDOM.findDOMNode(this._contentRef);
|
|
215
|
-
// @ts-expect-error - TS2769 - No overload matches this call. | TS2339 - Property 'height' does not exist on type 'JQueryStatic'.
|
|
216
|
-
const contentsHeight: number = $(renderer).height();
|
|
217
|
-
const lineHeight = this._getLineHeight();
|
|
218
|
-
const nLines = Math.round(contentsHeight / lineHeight);
|
|
219
|
-
return nLines;
|
|
220
|
-
}
|
|
221
|
-
|
|
222
|
-
_getInitialLineNumber(): number {
|
|
223
|
-
let isPassageBeforeThisPassage = true;
|
|
224
|
-
const passagesBeforeUs = this.props.findWidgets((id, widgetInfo) => {
|
|
225
|
-
if (widgetInfo.type !== "passage") {
|
|
226
|
-
return false;
|
|
227
|
-
}
|
|
228
|
-
if (id === this.props.widgetId) {
|
|
229
|
-
isPassageBeforeThisPassage = false;
|
|
230
|
-
}
|
|
231
|
-
return isPassageBeforeThisPassage;
|
|
232
|
-
});
|
|
233
|
-
|
|
234
|
-
return passagesBeforeUs
|
|
235
|
-
.map((passageWidget) => {
|
|
236
|
-
return passageWidget.getLineCount();
|
|
237
|
-
})
|
|
238
|
-
.reduce((a, b) => a + b, 0);
|
|
239
|
-
}
|
|
240
|
-
|
|
241
|
-
_getLineHeight(): number {
|
|
242
|
-
return this._lineHeightMeasurerRef?.measureLineHeight() || 0;
|
|
243
|
-
}
|
|
244
|
-
|
|
245
|
-
getLineCount(): number {
|
|
246
|
-
if (this.state.nLines != null) {
|
|
247
|
-
return this.state.nLines;
|
|
248
|
-
}
|
|
249
|
-
return this._measureLines();
|
|
250
|
-
}
|
|
251
|
-
|
|
252
|
-
/**
|
|
253
|
-
* Passage refs
|
|
254
|
-
*
|
|
255
|
-
* These are functions to support the passage refs inter-widgets feature
|
|
256
|
-
* where other widgets can fetch the line numbers of a reference inside of
|
|
257
|
-
* a passage.
|
|
258
|
-
*
|
|
259
|
-
* todo(matthewc): The refs are created by PassageMarkdown's refStart and refEnd,
|
|
260
|
-
* somehow bubbling up to Passage's `this.refs`. This runs against
|
|
261
|
-
* current best practices for refs by using string refs, but also
|
|
262
|
-
* by breaking our expectation of explicit data flow.
|
|
263
|
-
*/
|
|
264
|
-
|
|
265
|
-
_getStartRefLineNumber(referenceNumber: number): number | null | undefined {
|
|
266
|
-
const refRef = PassageMarkdown.START_REF_PREFIX + referenceNumber;
|
|
267
|
-
const ref = this.refs[refRef];
|
|
268
|
-
if (!ref) {
|
|
269
|
-
return null;
|
|
270
|
-
}
|
|
271
|
-
|
|
272
|
-
// @ts-expect-error - TS2769 - No overload matches this call.
|
|
273
|
-
const $ref = $(ReactDOM.findDOMNode(ref));
|
|
274
|
-
// We really care about the first text after the ref, not the
|
|
275
|
-
// ref element itself:
|
|
276
|
-
// @ts-expect-error - TS2339 - Property 'next' does not exist on type 'JQueryStatic'.
|
|
277
|
-
let $refText = $ref.next();
|
|
278
|
-
if ($refText.length === 0) {
|
|
279
|
-
// But if there are no elements after the ref, just
|
|
280
|
-
// use the ref itself.
|
|
281
|
-
$refText = $ref;
|
|
282
|
-
}
|
|
283
|
-
const vPos = $refText.offset().top;
|
|
284
|
-
|
|
285
|
-
return (
|
|
286
|
-
this.state.startLineNumbersAfter +
|
|
287
|
-
1 +
|
|
288
|
-
this._convertPosToLineNumber(vPos)
|
|
289
|
-
);
|
|
290
|
-
}
|
|
291
|
-
|
|
292
|
-
_getEndRefLineNumber(referenceNumber: number): number | null | undefined {
|
|
293
|
-
const refRef = PassageMarkdown.END_REF_PREFIX + referenceNumber;
|
|
294
|
-
const ref = this.refs[refRef];
|
|
295
|
-
if (!ref) {
|
|
296
|
-
return null;
|
|
297
|
-
}
|
|
298
|
-
|
|
299
|
-
// @ts-expect-error - TS2769 - No overload matches this call.
|
|
300
|
-
const $ref = $(ReactDOM.findDOMNode(ref));
|
|
301
|
-
// We really care about the last text before the ref, not the
|
|
302
|
-
// ref element itself:
|
|
303
|
-
// @ts-expect-error - TS2339 - Property 'prev' does not exist on type 'JQueryStatic'.
|
|
304
|
-
let $refText = $ref.prev();
|
|
305
|
-
if ($refText.length === 0) {
|
|
306
|
-
// But if there are no elements before the ref, just
|
|
307
|
-
// use the ref itself.
|
|
308
|
-
$refText = $ref;
|
|
309
|
-
}
|
|
310
|
-
const height: number = $refText.height();
|
|
311
|
-
const vPos: number = $refText.offset().top;
|
|
312
|
-
|
|
313
|
-
let line = this._convertPosToLineNumber(vPos + height);
|
|
314
|
-
if (height === 0) {
|
|
315
|
-
// If the element before the end ref span was the start
|
|
316
|
-
// ref span, it might have 0 height. This is obviously not
|
|
317
|
-
// the intended use case, but we should handle it gracefully.
|
|
318
|
-
// If this is the case, then the "bottom" of our element is
|
|
319
|
-
// actually the top of the line we're on, so we need to add
|
|
320
|
-
// one to the line number.
|
|
321
|
-
line += 1;
|
|
322
|
-
}
|
|
323
|
-
|
|
324
|
-
return this.state.startLineNumbersAfter + line;
|
|
325
|
-
}
|
|
326
|
-
|
|
327
|
-
_convertPosToLineNumber(absoluteVPos: number): number {
|
|
328
|
-
const content = ReactDOM.findDOMNode(this._contentRef);
|
|
329
|
-
// @ts-expect-error - TS2769 - No overload matches this call. | TS2339 - Property 'offset' does not exist on type 'JQueryStatic'.
|
|
330
|
-
const relativeVPos = absoluteVPos - $(content).offset().top;
|
|
331
|
-
const lineHeight = this._getLineHeight();
|
|
332
|
-
|
|
333
|
-
const line = Math.round(relativeVPos / lineHeight);
|
|
334
|
-
return line;
|
|
335
|
-
}
|
|
336
|
-
|
|
337
|
-
_getRefContent(referenceNumber: number): string | null | undefined {
|
|
338
|
-
const refRef = PassageMarkdown.START_REF_PREFIX + referenceNumber;
|
|
339
|
-
const ref = this.refs[refRef];
|
|
340
|
-
if (!ref) {
|
|
341
|
-
return null;
|
|
342
|
-
}
|
|
343
|
-
// @ts-expect-error - TS2339 - Property 'getRefContent' does not exist on type 'ReactInstance'.
|
|
344
|
-
return ref.getRefContent();
|
|
345
|
-
}
|
|
346
|
-
|
|
347
|
-
getReference(referenceNumber: number): Reference | null | undefined {
|
|
348
|
-
const refStartLine = this._getStartRefLineNumber(referenceNumber);
|
|
349
|
-
const refEndLine = this._getEndRefLineNumber(referenceNumber);
|
|
350
|
-
if (refStartLine == null || refEndLine == null) {
|
|
351
|
-
return null;
|
|
352
|
-
}
|
|
353
|
-
const refContent = this._getRefContent(referenceNumber);
|
|
354
|
-
|
|
355
|
-
return {
|
|
356
|
-
startLine: refStartLine,
|
|
357
|
-
endLine: refEndLine,
|
|
358
|
-
content: refContent,
|
|
359
|
-
};
|
|
360
|
-
}
|
|
361
|
-
|
|
362
|
-
/**
|
|
363
|
-
* Misc functions
|
|
364
|
-
*
|
|
365
|
-
* These are misc widget functions used for the widget API
|
|
366
|
-
*/
|
|
367
|
-
|
|
368
|
-
getUserInput(): UserInput {
|
|
369
|
-
return null;
|
|
370
|
-
}
|
|
371
|
-
|
|
372
|
-
simpleValidate(rubric: Rubric): PerseusScore {
|
|
373
|
-
return Passage.validate(this.getUserInput(), rubric);
|
|
374
|
-
}
|
|
375
|
-
|
|
376
|
-
/* eslint-disable react/sort-comp */
|
|
377
|
-
static validate(state: UserInput, rubric: Rubric): PerseusScore {
|
|
378
|
-
return {
|
|
379
|
-
type: "points",
|
|
380
|
-
earned: 0,
|
|
381
|
-
total: 0,
|
|
382
|
-
message: null,
|
|
383
|
-
};
|
|
384
|
-
}
|
|
385
|
-
/* eslint-enable react/sort-comp */
|
|
386
|
-
|
|
387
|
-
/**
|
|
388
|
-
* Rendering
|
|
389
|
-
*
|
|
390
|
-
* Functions to render the passage widget.
|
|
391
|
-
*/
|
|
392
|
-
|
|
393
|
-
_renderInstructions(parseState: ParseState): React.ReactElement<any> {
|
|
394
|
-
const firstQuestionNumber = parseState.firstQuestionRef;
|
|
395
|
-
const firstSentenceRef = parseState.firstSentenceRef;
|
|
396
|
-
|
|
397
|
-
let instructions = "";
|
|
398
|
-
if (firstQuestionNumber) {
|
|
399
|
-
instructions += i18n._(
|
|
400
|
-
"The symbol %(questionSymbol)s indicates that question " +
|
|
401
|
-
"%(questionNumber)s references this portion of the " +
|
|
402
|
-
"passage.",
|
|
403
|
-
{
|
|
404
|
-
questionSymbol: "[[" + firstQuestionNumber + "]]",
|
|
405
|
-
questionNumber: firstQuestionNumber,
|
|
406
|
-
},
|
|
407
|
-
);
|
|
408
|
-
}
|
|
409
|
-
if (firstSentenceRef) {
|
|
410
|
-
instructions += i18n._(
|
|
411
|
-
" The symbol %(sentenceSymbol)s indicates that the " +
|
|
412
|
-
"following sentence is referenced in a question.",
|
|
413
|
-
{
|
|
414
|
-
sentenceSymbol: "[" + firstSentenceRef + "]",
|
|
415
|
-
},
|
|
416
|
-
);
|
|
417
|
-
}
|
|
418
|
-
const parsedInstructions = PassageMarkdown.parse(instructions);
|
|
419
|
-
return (
|
|
420
|
-
<div className="perseus-widget-passage-instructions">
|
|
421
|
-
{PassageMarkdown.output(parsedInstructions)}
|
|
422
|
-
</div>
|
|
423
|
-
);
|
|
424
|
-
}
|
|
425
|
-
|
|
426
|
-
shouldRenderJipt(): boolean {
|
|
427
|
-
// Mostly copied from `renderer.jsx`. If we're doing JIPT, we want to
|
|
428
|
-
// render our content differently.
|
|
429
|
-
const {JIPT} = getDependencies();
|
|
430
|
-
return JIPT.useJIPT && this.props.passageText.indexOf("crwdns") !== -1;
|
|
431
|
-
}
|
|
432
|
-
|
|
433
|
-
_renderContent(parsed: Array<SingleASTNode>): React.ReactElement<any> {
|
|
434
|
-
// Wait until Aphrodite styles are applied before enabling highlights,
|
|
435
|
-
// so that we measure the correct positions.
|
|
436
|
-
const enabled = this.state.stylesAreApplied;
|
|
437
|
-
|
|
438
|
-
// Highlights are read-only in review mode.
|
|
439
|
-
const editable = !this.props.reviewModeRubric;
|
|
440
|
-
return (
|
|
441
|
-
<HighlightableContent
|
|
442
|
-
editable={editable}
|
|
443
|
-
enabled={enabled}
|
|
444
|
-
onSerializedHighlightsUpdate={
|
|
445
|
-
this._handleSerializedHighlightsUpdate
|
|
446
|
-
}
|
|
447
|
-
serializedHighlights={this.props.highlights}
|
|
448
|
-
>
|
|
449
|
-
<div ref={(ref) => (this._contentRef = ref)}>
|
|
450
|
-
<LineHeightMeasurer
|
|
451
|
-
ref={(ref) => (this._lineHeightMeasurerRef = ref)}
|
|
452
|
-
/>
|
|
453
|
-
{PassageMarkdown.output(parsed)}
|
|
454
|
-
</div>
|
|
455
|
-
</HighlightableContent>
|
|
456
|
-
);
|
|
457
|
-
}
|
|
458
|
-
|
|
459
|
-
_hasFootnotes(): boolean {
|
|
460
|
-
const rawContent = this.props.footnotes;
|
|
461
|
-
const isEmpty = /^\s*$/.test(rawContent);
|
|
462
|
-
return !isEmpty;
|
|
463
|
-
}
|
|
464
|
-
|
|
465
|
-
_renderFootnotes(): React.ReactNode {
|
|
466
|
-
const rawContent = this.props.footnotes;
|
|
467
|
-
const parsed = PassageMarkdown.parse(rawContent);
|
|
468
|
-
return PassageMarkdown.output(parsed);
|
|
469
|
-
}
|
|
470
|
-
|
|
471
|
-
render(): React.ReactNode {
|
|
472
|
-
let lineNumbers: ReadonlyArray<React.ReactNode>;
|
|
473
|
-
const nLines = this.state.nLines;
|
|
474
|
-
if (this.props.showLineNumbers && nLines) {
|
|
475
|
-
// lineN is the line number in the current passage
|
|
476
|
-
// lineAt is the actual line number across multiple passages
|
|
477
|
-
lineNumbers = _.range(1, nLines + 1).map((lineN) => {
|
|
478
|
-
const lineAt = lineN + this.state.startLineNumbersAfter;
|
|
479
|
-
if (lineAt === 4) {
|
|
480
|
-
// we leave a space in i18n to disambiguate translations, see TP-5392
|
|
481
|
-
// I18N: a label next to a reading passage to denote the line number
|
|
482
|
-
const translatedLine = i18n._("Line ");
|
|
483
|
-
return (
|
|
484
|
-
<span key="line-marker" className="line-marker">
|
|
485
|
-
{translatedLine}
|
|
486
|
-
</span>
|
|
487
|
-
);
|
|
488
|
-
}
|
|
489
|
-
return <span key={lineN}>{lineAt}</span>;
|
|
490
|
-
});
|
|
491
|
-
}
|
|
492
|
-
|
|
493
|
-
const parseState: ParseState = PassageMarkdown.getInitialParseState();
|
|
494
|
-
|
|
495
|
-
// Replace the vertical double quote characters quoting text with
|
|
496
|
-
// an unicode left and right double quote characters. This would
|
|
497
|
-
// avoid rendering right or left unicode double quotes on both
|
|
498
|
-
// ends of a sentence wrapped by double quotes.
|
|
499
|
-
const re = /("{1})([^"]*)("{1})/g;
|
|
500
|
-
const doubleQuoteParsedContent = this.props.passageText.replace(
|
|
501
|
-
re,
|
|
502
|
-
"\u201c$2\u201d",
|
|
503
|
-
);
|
|
504
|
-
const parsedContent = PassageMarkdown.parse(
|
|
505
|
-
doubleQuoteParsedContent,
|
|
506
|
-
parseState,
|
|
507
|
-
);
|
|
508
|
-
// Check if the title has any non-empty text in it.
|
|
509
|
-
const hasTitle = /\S/.test(this.props.passageTitle);
|
|
510
|
-
|
|
511
|
-
return (
|
|
512
|
-
<div>
|
|
513
|
-
<div className="perseus-widget-passage-container">
|
|
514
|
-
{this._renderInstructions(parseState)}
|
|
515
|
-
<div className="perseus-widget-passage">
|
|
516
|
-
{hasTitle && (
|
|
517
|
-
<h3 className="passage-title">
|
|
518
|
-
<Renderer
|
|
519
|
-
content={this.props.passageTitle}
|
|
520
|
-
linterContext={this.props.linterContext}
|
|
521
|
-
/>
|
|
522
|
-
</h3>
|
|
523
|
-
)}
|
|
524
|
-
{/* @ts-expect-error - TS2454 - Variable 'lineNumbers' is used before being assigned. */}
|
|
525
|
-
{lineNumbers && (
|
|
526
|
-
<div className="line-numbers" aria-hidden={true}>
|
|
527
|
-
{lineNumbers}
|
|
528
|
-
</div>
|
|
529
|
-
)}
|
|
530
|
-
{!hasTitle && (
|
|
531
|
-
<h3 className="perseus-sr-only">
|
|
532
|
-
{i18n._("Beginning of reading passage.")}
|
|
533
|
-
</h3>
|
|
534
|
-
)}
|
|
535
|
-
<div className="passage-text">
|
|
536
|
-
{this.shouldRenderJipt() ? (
|
|
537
|
-
// If we're in JIPT mode, just pass off our
|
|
538
|
-
// content to a <Renderer /> which knows how
|
|
539
|
-
// to handle rendering JIPT text.
|
|
540
|
-
<Renderer content={this.props.passageText} />
|
|
541
|
-
) : (
|
|
542
|
-
this._renderContent(parsedContent)
|
|
543
|
-
)}
|
|
544
|
-
</div>
|
|
545
|
-
{this._hasFootnotes() && [
|
|
546
|
-
<h4
|
|
547
|
-
key="footnote-start"
|
|
548
|
-
className="perseus-sr-only"
|
|
549
|
-
>
|
|
550
|
-
{i18n._(
|
|
551
|
-
"Beginning of reading passage footnotes.",
|
|
552
|
-
)}
|
|
553
|
-
</h4>,
|
|
554
|
-
<div key="footnotes" className="footnotes">
|
|
555
|
-
{this._renderFootnotes()}
|
|
556
|
-
</div>,
|
|
557
|
-
]}
|
|
558
|
-
<div className="perseus-sr-only">
|
|
559
|
-
{i18n._("End of reading passage.")}
|
|
560
|
-
</div>
|
|
561
|
-
</div>
|
|
562
|
-
</div>
|
|
563
|
-
</div>
|
|
564
|
-
);
|
|
565
|
-
}
|
|
566
|
-
}
|
|
567
|
-
|
|
568
|
-
export default {
|
|
569
|
-
name: "passage",
|
|
570
|
-
displayName: "Passage (SAT only)",
|
|
571
|
-
widget: Passage,
|
|
572
|
-
transform: (editorProps: any): RenderProps => {
|
|
573
|
-
return _.pick(
|
|
574
|
-
editorProps,
|
|
575
|
-
"passageTitle",
|
|
576
|
-
"passageText",
|
|
577
|
-
"footnotes",
|
|
578
|
-
"showLineNumbers",
|
|
579
|
-
);
|
|
580
|
-
},
|
|
581
|
-
isLintable: true,
|
|
582
|
-
} as WidgetExports<typeof Passage>;
|