@instructure/canvas-rce 5.14.1 → 5.15.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +15 -0
- package/DEVELOPMENT.md +2 -2
- package/README.md +0 -8
- package/__tests__/common/indicate.test.js +84 -0
- package/__tests__/common/mimeClass.test.js +85 -0
- package/__tests__/module/contentInsertionUtils.test.js +52 -0
- package/__tests__/module/indicatorRegion.test.js +75 -0
- package/__tests__/module/normalizeLocale.test.js +46 -0
- package/__tests__/module/normalizeProps.test.js +51 -0
- package/__tests__/module/sanitizePlugins.test.js +48 -0
- package/__tests__/module/wrapInitCb.test.js +56 -0
- package/__tests__/rcs/api.test.js +819 -0
- package/{mocha-reporter-config.js → __tests__/sidebar/actions/all_files.test.js} +10 -9
- package/__tests__/sidebar/actions/data.test.js +196 -0
- package/__tests__/sidebar/actions/utils.js +44 -0
- package/{es/rce/__mocks__/_mockStudioPlayer.js → __tests__/sidebar/reducers/all_files.test.js} +12 -4
- package/babel.config.js +3 -1
- package/es/bridge/Bridge.js +18 -73
- package/es/bridge/index.js +1 -0
- package/es/canvasFileBrowser/FileBrowser.js +21 -77
- package/es/canvasFileBrowser/en-US.js +3 -6
- package/es/common/FlashAlert.js +15 -39
- package/es/common/browser.js +4 -2
- package/es/common/fileUrl.js +105 -64
- package/es/common/incremental-loading/LoadMoreButton.js +4 -4
- package/es/common/incremental-loading/LoadingIndicator.js +1 -2
- package/es/common/incremental-loading/LoadingStatus.js +5 -13
- package/es/common/incremental-loading/index.js +1 -0
- package/es/common/incremental-loading/useIncrementalLoading.js +1 -3
- package/es/common/indicate.js +16 -10
- package/es/common/mimeClass.js +3 -4
- package/es/common/natcompare.js +1 -4
- package/es/defaultTinymceConfig.js +5 -3
- package/es/elementDenylist.js +1 -0
- package/es/enhance-user-content/doc_previews.js +24 -35
- package/es/enhance-user-content/enhance_user_content.js +32 -67
- package/es/enhance-user-content/external_links.js +6 -9
- package/es/enhance-user-content/index.js +1 -0
- package/es/enhance-user-content/instructure_helper.js +22 -50
- package/es/enhance-user-content/jqueryish_funcs.js +8 -11
- package/es/enhance-user-content/mathml.js +48 -107
- package/es/enhance-user-content/media_comment_thumbnail.js +6 -25
- package/es/format-message.js +4 -5
- package/es/getThemeVars.js +8 -6
- package/es/getTranslations.js +1 -78
- package/es/index.d.ts +59 -0
- package/es/index.js +6 -6
- package/es/rce/AlertMessageArea.js +15 -16
- package/es/rce/DraggingBlocker.js +4 -2
- package/es/rce/KeyboardShortcutModal.js +3 -2
- package/es/rce/RCE.js +16 -17
- package/es/rce/RCEGlobals.js +12 -10
- package/es/rce/RCEVariants.js +29 -14
- package/es/rce/RCEWrapper.js +530 -641
- package/es/rce/RCEWrapper.utils.js +131 -0
- package/es/rce/RCEWrapperProps.js +9 -5
- package/es/rce/RceHtmlEditor.js +17 -19
- package/es/rce/ResizeHandle.js +4 -10
- package/es/rce/RestoreAutoSaveModal.js +1 -2
- package/es/rce/ShowOnFocusButton/index.js +2 -8
- package/es/rce/StatusBar.js +10 -44
- package/es/rce/alertHandler.js +1 -4
- package/es/rce/contentInsertion.js +36 -59
- package/es/rce/contentInsertionUtils.js +6 -8
- package/es/rce/contentRendering.js +13 -17
- package/es/rce/customEvents.js +1 -0
- package/es/rce/editorLanguage.js +23 -11
- package/es/rce/indicatorRegion.js +7 -7
- package/es/rce/normalizeLocale.js +5 -3
- package/es/rce/normalizeProps.js +7 -5
- package/es/rce/plugins/instructure-ui-icons/plugin.js +21 -3
- package/es/rce/plugins/instructure_color/clickCallback.js +82 -0
- package/es/rce/plugins/instructure_color/components/ColorPicker.js +294 -0
- package/es/rce/plugins/instructure_color/components/ColorPopup.js +67 -0
- package/es/rce/plugins/instructure_color/components/colorUtils.js +60 -0
- package/es/rce/plugins/instructure_color/plugin.js +40 -0
- package/es/rce/plugins/instructure_condensed_buttons/core/ListUtils.js +10 -3
- package/es/rce/plugins/instructure_condensed_buttons/plugin.js +1 -0
- package/es/rce/plugins/instructure_condensed_buttons/ui/alignment-button.js +1 -2
- package/es/rce/plugins/instructure_condensed_buttons/ui/directionality-button.js +3 -2
- package/es/rce/plugins/instructure_condensed_buttons/ui/indent-outdent-button.js +1 -0
- package/es/rce/plugins/instructure_condensed_buttons/ui/list-button.js +26 -25
- package/es/rce/plugins/instructure_condensed_buttons/ui/subscript-superscript-button.js +2 -3
- package/es/rce/plugins/instructure_documents/clickCallback.js +1 -0
- package/es/rce/plugins/instructure_documents/components/DocumentsPanel.js +1 -9
- package/es/rce/plugins/instructure_documents/components/Link.js +4 -20
- package/es/rce/plugins/instructure_documents/plugin.js +7 -14
- package/es/rce/plugins/instructure_equation/EquationEditorModal/advancedOnlySyntax.js +4 -2
- package/es/rce/plugins/instructure_equation/EquationEditorModal/advancedPreference.js +1 -2
- package/es/rce/plugins/instructure_equation/EquationEditorModal/index.js +17 -37
- package/es/rce/plugins/instructure_equation/EquationEditorModal/latexTextareaUtil.js +14 -15
- package/es/rce/plugins/instructure_equation/EquationEditorModal/parseLatex.js +6 -5
- package/es/rce/plugins/instructure_equation/EquationEditorModal/styles.js +4 -2
- package/es/rce/plugins/instructure_equation/EquationEditorToolbar/buttons.js +14 -8
- package/es/rce/plugins/instructure_equation/EquationEditorToolbar/index.js +13 -18
- package/es/rce/plugins/instructure_equation/MathIcon/index.js +4 -5
- package/es/rce/plugins/instructure_equation/MathIcon/svgs.js +1 -1
- package/es/rce/plugins/instructure_equation/clickCallback.js +2 -5
- package/es/rce/plugins/instructure_equation/mathlive/index.js +167 -16
- package/es/rce/plugins/instructure_equation/plugin.js +7 -10
- package/es/rce/plugins/instructure_fullscreen/plugin.js +1 -6
- package/es/rce/plugins/instructure_html_view/clickCallback.js +1 -0
- package/es/rce/plugins/instructure_html_view/plugin.js +5 -4
- package/es/rce/plugins/instructure_icon_maker/clickCallback.js +5 -8
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ColorSection.js +47 -51
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/CreateIconMakerForm.js +10 -10
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/Footer.js +11 -11
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/Group.js +6 -6
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/Header.js +8 -10
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/Course.js +32 -31
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/ImageOptions.js +24 -35
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/ImageSection.js +32 -32
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/ModeSelect.js +11 -11
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/MultiColor/index.js +16 -15
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/MultiColor/svg.js +1 -0
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/SVGList.js +11 -11
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/SVGThumbnail.js +9 -13
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/SingleColor/index.js +12 -13
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/SingleColor/svg.js +33 -80
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/Upload.js +34 -28
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/index.js +1 -0
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/propTypes.js +1 -0
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/utils.js +5 -5
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/Preview.js +7 -8
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ShapeSection.js +5 -7
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/TextSection.js +5 -10
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/index.js +1 -0
- package/es/rce/plugins/instructure_icon_maker/components/IconMakerTray.js +38 -60
- package/es/rce/plugins/instructure_icon_maker/components/SavedIconMakerList.js +4 -4
- package/es/rce/plugins/instructure_icon_maker/plugin.js +10 -14
- package/es/rce/plugins/instructure_icon_maker/reducers/imageSection.js +37 -38
- package/es/rce/plugins/instructure_icon_maker/reducers/svgSettings.js +24 -24
- package/es/rce/plugins/instructure_icon_maker/registerEditToolbar.js +2 -4
- package/es/rce/plugins/instructure_icon_maker/svg/constants.js +4 -3
- package/es/rce/plugins/instructure_icon_maker/svg/font.js +3 -1
- package/es/rce/plugins/instructure_icon_maker/svg/image.js +74 -90
- package/es/rce/plugins/instructure_icon_maker/svg/index.js +17 -24
- package/es/rce/plugins/instructure_icon_maker/svg/metadata.js +1 -0
- package/es/rce/plugins/instructure_icon_maker/svg/settings.js +48 -58
- package/es/rce/plugins/instructure_icon_maker/svg/shape.js +5 -54
- package/es/rce/plugins/instructure_icon_maker/svg/text.js +35 -124
- package/es/rce/plugins/instructure_icon_maker/svg/utils.js +3 -11
- package/es/rce/plugins/instructure_icon_maker/utils/IconMakerClose.js +4 -9
- package/es/rce/plugins/instructure_icon_maker/utils/IconMakerFormHasChanges.js +1 -15
- package/es/rce/plugins/instructure_icon_maker/utils/addIconMakerAttributes.js +3 -4
- package/es/rce/plugins/instructure_icon_maker/utils/iconValidation.js +2 -3
- package/es/rce/plugins/instructure_icon_maker/utils/iconsLabels.js +1 -0
- package/es/rce/plugins/instructure_icon_maker/utils/useDebouncedValue.js +12 -13
- package/es/rce/plugins/instructure_image/ImageEmbedOptions.js +9 -31
- package/es/rce/plugins/instructure_image/ImageList/Image.js +8 -14
- package/es/rce/plugins/instructure_image/ImageList/index.js +8 -10
- package/es/rce/plugins/instructure_image/ImageOptionsTray/TrayController.js +9 -31
- package/es/rce/plugins/instructure_image/ImageOptionsTray/index.js +6 -19
- package/es/rce/plugins/instructure_image/Images/index.js +1 -3
- package/es/rce/plugins/instructure_image/clickCallback.js +1 -0
- package/es/rce/plugins/instructure_image/plugin.js +14 -20
- package/es/rce/plugins/instructure_links/clickCallback.js +1 -0
- package/es/rce/plugins/instructure_links/components/AccordionSection.js +8 -8
- package/es/rce/plugins/instructure_links/components/CollectionPanel.js +1 -3
- package/es/rce/plugins/instructure_links/components/Link.js +68 -84
- package/es/rce/plugins/instructure_links/components/LinkOptionsDialog/LinkOptionsDialogController.js +2 -23
- package/es/rce/plugins/instructure_links/components/LinkOptionsDialog/index.js +3 -6
- package/es/rce/plugins/instructure_links/components/LinkOptionsTray/LinkOptionsTrayController.js +3 -20
- package/es/rce/plugins/instructure_links/components/LinkOptionsTray/index.js +3 -14
- package/es/rce/plugins/instructure_links/components/LinkSet.js +32 -57
- package/es/rce/plugins/instructure_links/components/LinksPanel.js +22 -10
- package/es/rce/plugins/instructure_links/components/NavigationPanel.js +7 -9
- package/es/rce/plugins/instructure_links/components/NoResults.js +7 -14
- package/es/rce/plugins/instructure_links/plugin.js +23 -49
- package/es/rce/plugins/instructure_links/validateURL.js +81 -36
- package/es/rce/plugins/instructure_media_embed/clickCallback.js +5 -9
- package/es/rce/plugins/instructure_media_embed/components/Embed.js +7 -7
- package/es/rce/plugins/instructure_media_embed/plugin.js +7 -3
- package/es/rce/plugins/instructure_paste/pasteMenuCommand.js +1 -5
- package/es/rce/plugins/instructure_paste/plugin.js +29 -33
- package/es/rce/plugins/instructure_rce_external_tools/ExternalToolsEnv.js +31 -79
- package/es/rce/plugins/instructure_rce_external_tools/RceToolWrapper.js +24 -83
- package/es/rce/plugins/instructure_rce_external_tools/components/ExternalToolDialog/ExternalToolDialog.js +39 -69
- package/es/rce/plugins/instructure_rce_external_tools/components/ExternalToolDialog/ExternalToolDialogModal.js +1 -2
- package/es/rce/plugins/instructure_rce_external_tools/components/ExternalToolDialog/ExternalToolDialogTray.js +1 -1
- package/es/rce/plugins/instructure_rce_external_tools/components/ExternalToolSelectionDialog/ExternalToolSelectionDialog.js +5 -14
- package/es/rce/plugins/instructure_rce_external_tools/components/ExternalToolSelectionDialog/ExternalToolSelectionItem.js +1 -2
- package/es/rce/plugins/instructure_rce_external_tools/components/util/ExpandoText.js +1 -0
- package/es/rce/plugins/instructure_rce_external_tools/components/util/ToolLaunchIframe.js +2 -1
- package/es/rce/plugins/instructure_rce_external_tools/constants.js +28 -0
- package/es/rce/plugins/instructure_rce_external_tools/dialog-helper.js +20 -6
- package/es/rce/plugins/instructure_rce_external_tools/helpers/tags.js +0 -2
- package/es/rce/plugins/instructure_rce_external_tools/jquery/jquery.dropdownList.js +129 -136
- package/es/rce/plugins/instructure_rce_external_tools/lti11-content-items/RceLti11ContentItem.js +110 -112
- package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/Lti13ContentItemJson.js +1 -0
- package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/RceLti13ContentItem.js +4 -21
- package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/models/BaseLinkContentItem.js +5 -19
- package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/models/HtmlFragmentContentItem.js +1 -6
- package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/models/ImageContentItem.js +1 -9
- package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/models/LinkContentItem.js +1 -1
- package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/models/ResourceLinkContentItem.js +3 -5
- package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/processEditorContentItems.js +23 -16
- package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/rceLti13ContentItemFromJson.js +3 -4
- package/es/rce/plugins/instructure_rce_external_tools/plugin.js +11 -20
- package/es/rce/plugins/instructure_rce_external_tools/util/addParentFrameContextToUrl.js +1 -1
- package/es/rce/plugins/instructure_rce_external_tools/util/externalToolsForToolbar.js +42 -0
- package/es/rce/plugins/instructure_record/AudioOptionsTray/TrayController.js +6 -35
- package/es/rce/plugins/instructure_record/AudioOptionsTray/index.js +13 -17
- package/es/rce/plugins/instructure_record/MediaPanel/index.js +1 -9
- package/es/rce/plugins/instructure_record/VideoOptionsTray/TrayController.js +16 -66
- package/es/rce/plugins/instructure_record/VideoOptionsTray/index.js +21 -35
- package/es/rce/plugins/instructure_record/clickCallback.js +32 -44
- package/es/rce/plugins/instructure_record/mediaTranslations.js +1 -0
- package/es/rce/plugins/instructure_record/plugin.js +11 -18
- package/es/rce/plugins/instructure_search_and_replace/clickCallback.js +4 -8
- package/es/rce/plugins/instructure_search_and_replace/components/FindReplaceTray.js +34 -51
- package/es/rce/plugins/instructure_search_and_replace/components/FindReplaceTrayController.js +12 -30
- package/es/rce/plugins/instructure_search_and_replace/getSelectionContext.js +2 -9
- package/es/rce/plugins/instructure_search_and_replace/plugin.js +2 -5
- package/es/rce/plugins/instructure_studio_media_options/plugin.js +1 -1
- package/es/rce/plugins/instructure_wordcount/clickCallback.js +5 -9
- package/es/rce/plugins/instructure_wordcount/components/WordCountModal.js +27 -37
- package/es/rce/plugins/instructure_wordcount/plugin.js +1 -0
- package/es/rce/plugins/instructure_wordcount/utils/countContent.js +4 -11
- package/es/rce/plugins/instructure_wordcount/utils/tableContent.js +6 -8
- package/es/rce/plugins/shared/CanvasContentTray.js +29 -63
- package/es/rce/plugins/shared/CheckerboardStyling.js +1 -1
- package/es/rce/plugins/shared/ColorInput.js +27 -39
- package/es/rce/plugins/shared/ConditionalTooltip.js +6 -6
- package/es/rce/plugins/shared/ContentSelection.js +29 -78
- package/es/rce/plugins/shared/DimensionUtils.js +3 -12
- package/es/rce/plugins/shared/DimensionsInput/DimensionInput.js +6 -6
- package/es/rce/plugins/shared/DimensionsInput/index.js +37 -15
- package/es/rce/plugins/shared/DimensionsInput/useDimensionsState.js +5 -29
- package/es/rce/plugins/shared/ErrorBoundary.js +2 -5
- package/es/rce/plugins/shared/EventUtils.js +2 -4
- package/es/rce/plugins/shared/Filter.js +8 -38
- package/es/rce/plugins/shared/FixedContentTray.js +16 -17
- package/es/rce/plugins/shared/ImageCropper/DirectionRegion.js +4 -12
- package/es/rce/plugins/shared/ImageCropper/Modal.js +16 -20
- package/es/rce/plugins/shared/ImageCropper/Preview.js +18 -24
- package/es/rce/plugins/shared/ImageCropper/constants.js +1 -0
- package/es/rce/plugins/shared/ImageCropper/controls/CustomNumberInput.js +10 -14
- package/es/rce/plugins/shared/ImageCropper/controls/ResetControls.js +4 -4
- package/es/rce/plugins/shared/ImageCropper/controls/RotationControls.js +5 -15
- package/es/rce/plugins/shared/ImageCropper/controls/ShapeControls.js +8 -11
- package/es/rce/plugins/shared/ImageCropper/controls/ZoomControls.js +5 -16
- package/es/rce/plugins/shared/ImageCropper/controls/index.js +5 -5
- package/es/rce/plugins/shared/ImageCropper/controls/useDebouncedNumericValue.js +16 -31
- package/es/rce/plugins/shared/ImageCropper/controls/utils.js +1 -2
- package/es/rce/plugins/shared/ImageCropper/imageCropUtils.js +19 -31
- package/es/rce/plugins/shared/ImageCropper/index.js +1 -0
- package/es/rce/plugins/shared/ImageCropper/propTypes.js +1 -0
- package/es/rce/plugins/shared/ImageCropper/reducers/imageCropper.js +15 -14
- package/es/rce/plugins/shared/ImageCropper/shape.js +1 -0
- package/es/rce/plugins/shared/ImageCropper/svg/index.js +1 -2
- package/es/rce/plugins/shared/ImageCropper/svg/shape.js +5 -22
- package/es/rce/plugins/shared/ImageCropper/svg/utils.js +3 -4
- package/es/rce/plugins/shared/ImageCropper/useKeyMouseEvents.js +20 -50
- package/es/rce/plugins/shared/ImageCropper/useMouseWheel.js +8 -10
- package/es/rce/plugins/shared/ImageOptionsForm.js +18 -20
- package/es/rce/plugins/shared/LinkDisplay.js +9 -11
- package/es/rce/plugins/shared/PreviewIcon.js +9 -15
- package/es/rce/plugins/shared/Previewable.js +1 -0
- package/es/rce/plugins/shared/RceFileBrowser.js +7 -10
- package/es/rce/plugins/shared/StoreContext.js +9 -12
- package/es/rce/plugins/shared/StudioLtiSupportUtils.js +15 -12
- package/es/rce/plugins/shared/UnknownFileTypePanel.js +1 -0
- package/es/rce/plugins/shared/Upload/CanvasContentPanel.js +19 -25
- package/es/rce/plugins/shared/Upload/CategoryProcessor.js +2 -3
- package/es/rce/plugins/shared/Upload/ComputerPanel.js +19 -40
- package/es/rce/plugins/shared/Upload/PanelFilter.js +10 -20
- package/es/rce/plugins/shared/Upload/SvgCategoryProcessor.js +4 -3
- package/es/rce/plugins/shared/Upload/UploadFile.js +32 -38
- package/es/rce/plugins/shared/Upload/UploadFileModal.js +37 -59
- package/es/rce/plugins/shared/Upload/UrlPanel.js +5 -5
- package/es/rce/plugins/shared/Upload/UsageRightsSelectBox.js +25 -36
- package/es/rce/plugins/shared/Upload/doFileUpload.js +10 -13
- package/es/rce/plugins/shared/Upload/index.js +1 -0
- package/es/rce/plugins/shared/ai_tools/AIResponseModal.js +8 -11
- package/es/rce/plugins/shared/ai_tools/AIToolsTray.js +19 -40
- package/es/rce/plugins/shared/ai_tools/aiicons.js +3 -2
- package/es/rce/plugins/shared/ai_tools/index.js +1 -0
- package/es/rce/plugins/shared/buildDownloadUrl.js +0 -2
- package/es/rce/plugins/shared/canvasContentUtils.js +7 -11
- package/es/rce/plugins/shared/compressionUtils.js +18 -28
- package/es/rce/plugins/shared/dateUtils.js +1 -1
- package/es/rce/plugins/shared/do-fetch-api-effect/defaultFetchOptions.js +4 -2
- package/es/rce/plugins/shared/do-fetch-api-effect/doFetchApi.js +18 -24
- package/es/rce/plugins/shared/do-fetch-api-effect/get-cookie.js +1 -1
- package/es/rce/plugins/shared/do-fetch-api-effect/index.js +1 -0
- package/es/rce/plugins/shared/do-fetch-api-effect/parse-link-header.js +6 -20
- package/es/rce/plugins/shared/do-fetch-api-effect/query-string-encoding.js +5 -3
- package/es/rce/plugins/shared/fileShape.js +4 -9
- package/es/rce/plugins/shared/fileTypeUtils.js +34 -47
- package/es/rce/plugins/shared/fileUtils.js +1 -2
- package/es/rce/plugins/shared/linkUtils.js +1 -16
- package/es/rce/plugins/shared/round.js +2 -2
- package/es/rce/plugins/shared/trayUtils.js +7 -3
- package/es/rce/plugins/shared/useDataUrl.js +13 -14
- package/es/rce/plugins/shared/useFilterSettings.js +3 -3
- package/es/rce/plugins/tinymce-a11y-checker/components/ColorField.js +4 -8
- package/es/rce/plugins/tinymce-a11y-checker/components/checker.js +12 -72
- package/es/rce/plugins/tinymce-a11y-checker/components/color-picker.js +1 -2
- package/es/rce/plugins/tinymce-a11y-checker/components/placeholder-svg.js +1 -0
- package/es/rce/plugins/tinymce-a11y-checker/components/pointer.js +1 -0
- package/es/rce/plugins/tinymce-a11y-checker/node-checker.js +2 -9
- package/es/rce/plugins/tinymce-a11y-checker/plugin.js +18 -24
- package/es/rce/plugins/tinymce-a11y-checker/rules/adjacent-links.js +3 -26
- package/es/rce/plugins/tinymce-a11y-checker/rules/headings-sequence.js +9 -38
- package/es/rce/plugins/tinymce-a11y-checker/rules/headings-start-at-h2.js +2 -7
- package/es/rce/plugins/tinymce-a11y-checker/rules/img-alt-filename.js +1 -2
- package/es/rce/plugins/tinymce-a11y-checker/rules/img-alt-length.js +1 -1
- package/es/rce/plugins/tinymce-a11y-checker/rules/img-alt.js +1 -2
- package/es/rce/plugins/tinymce-a11y-checker/rules/index.js +1 -0
- package/es/rce/plugins/tinymce-a11y-checker/rules/large-text-contrast.js +2 -6
- package/es/rce/plugins/tinymce-a11y-checker/rules/list-structure.js +5 -24
- package/es/rce/plugins/tinymce-a11y-checker/rules/paragraphs-for-headings.js +1 -3
- package/es/rce/plugins/tinymce-a11y-checker/rules/small-text-contrast.js +2 -8
- package/es/rce/plugins/tinymce-a11y-checker/rules/table-caption.js +1 -3
- package/es/rce/plugins/tinymce-a11y-checker/rules/table-header-scope.js +1 -2
- package/es/rce/plugins/tinymce-a11y-checker/rules/table-header.js +1 -9
- package/es/rce/plugins/tinymce-a11y-checker/utils/colors.js +1 -0
- package/es/rce/plugins/tinymce-a11y-checker/utils/describe.js +1 -7
- package/es/rce/plugins/tinymce-a11y-checker/utils/dom.js +3 -30
- package/es/rce/plugins/tinymce-a11y-checker/utils/indicate.js +18 -18
- package/es/rce/plugins/tinymce-a11y-checker/utils/rgb-hex.js +6 -12
- package/es/rce/plugins/tinymce-a11y-checker/utils/strings.js +1 -4
- package/es/rce/root.js +17 -16
- package/es/rce/sanitizePlugins.js +1 -3
- package/es/rce/style.js +1 -4
- package/es/rce/tinyRCE.js +14 -9
- package/es/rce/tinymce.oxide.content.min.css.js +1 -0
- package/es/rce/tinymce.oxide.skin.min.css.js +1 -0
- package/es/rce/transformContent.js +9 -11
- package/es/rce/types.js +1 -0
- package/es/rce/userOS.js +1 -1
- package/es/rce/wrapInitCb.js +50 -43
- package/es/rcs/api.js +100 -171
- package/es/rcs/buildError.js +8 -20
- package/es/rcs/fake.js +9 -20
- package/es/sidebar/actions/all_files.js +2 -0
- package/es/sidebar/actions/data.js +4 -7
- package/es/sidebar/actions/documents.js +19 -18
- package/es/sidebar/actions/files.js +21 -28
- package/es/sidebar/actions/filter.js +5 -5
- package/es/sidebar/actions/flickr.js +1 -1
- package/es/sidebar/actions/images.js +32 -37
- package/es/sidebar/actions/links.js +1 -0
- package/es/sidebar/actions/media.js +27 -28
- package/es/sidebar/actions/session.js +2 -5
- package/es/sidebar/actions/ui.js +1 -0
- package/es/sidebar/actions/upload.js +38 -74
- package/es/sidebar/containers/Sidebar.js +1 -2
- package/es/sidebar/containers/sidebarHandlers.js +9 -13
- package/es/sidebar/dragHtml.js +11 -5
- package/es/sidebar/reducers/all_files.js +5 -6
- package/es/sidebar/reducers/collection.js +12 -15
- package/es/sidebar/reducers/collections.js +6 -8
- package/es/sidebar/reducers/documents.js +7 -16
- package/es/sidebar/reducers/files.js +4 -6
- package/es/sidebar/reducers/filter.js +8 -23
- package/es/sidebar/reducers/flickr.js +10 -12
- package/es/sidebar/reducers/folder.js +16 -18
- package/es/sidebar/reducers/folders.js +4 -6
- package/es/sidebar/reducers/images.js +4 -16
- package/es/sidebar/reducers/index.js +3 -1
- package/es/sidebar/reducers/media.js +7 -16
- package/es/sidebar/reducers/newPageLinkExpanded.js +2 -5
- package/es/sidebar/reducers/noop.js +2 -2
- package/es/sidebar/reducers/rootFolderId.js +2 -5
- package/es/sidebar/reducers/session.js +4 -6
- package/es/sidebar/reducers/ui.js +6 -25
- package/es/sidebar/reducers/upload.js +16 -64
- package/es/sidebar/store/configureStore.js +1 -0
- package/es/sidebar/store/initialState.js +14 -26
- package/es/translations/locales/ab.js +1 -0
- package/es/translations/locales/ar.js +72 -8
- package/es/translations/locales/ca.js +72 -8
- package/es/translations/locales/cs.js +1 -0
- package/es/translations/locales/cs_CZ.js +1 -0
- package/es/translations/locales/cy.js +72 -8
- package/es/translations/locales/da-x-k12.js +72 -8
- package/es/translations/locales/da.js +72 -8
- package/es/translations/locales/da_DK.js +1 -0
- package/es/translations/locales/de.js +72 -8
- package/es/translations/locales/el.js +4 -0
- package/es/translations/locales/en-AU-x-unimelb.js +72 -8
- package/es/translations/locales/en-GB-x-ukhe.js +72 -8
- package/es/translations/locales/en.js +72 -8
- package/es/translations/locales/en_AU.js +72 -8
- package/es/translations/locales/en_CA.js +72 -8
- package/es/translations/locales/en_CY.js +72 -8
- package/es/translations/locales/en_GB.js +72 -8
- package/es/translations/locales/en_NZ.js +1 -0
- package/es/translations/locales/en_SE.js +1 -0
- package/es/translations/locales/en_US.js +1 -0
- package/es/translations/locales/es.js +72 -8
- package/es/translations/locales/es_ES.js +72 -8
- package/es/translations/locales/es_GT.js +1 -0
- package/es/translations/locales/fa_IR.js +7 -0
- package/es/translations/locales/fi.js +72 -8
- package/es/translations/locales/fr.js +72 -8
- package/es/translations/locales/fr_CA.js +73 -9
- package/es/translations/locales/ga.js +5 -13
- package/es/translations/locales/he.js +7 -0
- package/es/translations/locales/hi.js +72 -8
- package/es/translations/locales/ht.js +72 -8
- package/es/translations/locales/hu.js +7 -6
- package/es/translations/locales/hu_HU.js +1 -0
- package/es/translations/locales/hy.js +1 -0
- package/es/translations/locales/id.js +72 -8
- package/es/translations/locales/id_ID.js +1 -0
- package/es/translations/locales/is.js +72 -8
- package/es/translations/locales/it.js +72 -8
- package/es/translations/locales/ja.js +72 -8
- package/es/translations/locales/ko.js +1 -0
- package/es/translations/locales/ko_KR.js +1 -0
- package/es/translations/locales/lt.js +1 -0
- package/es/translations/locales/lt_LT.js +1 -0
- package/es/translations/locales/mi.js +72 -8
- package/es/translations/locales/mn_MN.js +1 -0
- package/es/translations/locales/ms.js +72 -8
- package/es/translations/locales/nb-x-k12.js +72 -8
- package/es/translations/locales/nb.js +72 -8
- package/es/translations/locales/nl.js +72 -8
- package/es/translations/locales/nl_NL.js +1 -0
- package/es/translations/locales/nn.js +7 -6
- package/es/translations/locales/pl.js +72 -8
- package/es/translations/locales/pt.js +72 -8
- package/es/translations/locales/pt_BR.js +72 -8
- package/es/translations/locales/ro.js +1 -0
- package/es/translations/locales/ru.js +72 -8
- package/es/translations/locales/se.js +1 -0
- package/es/translations/locales/sl.js +72 -8
- package/es/translations/locales/sv-x-k12.js +72 -8
- package/es/translations/locales/sv.js +72 -8
- package/es/translations/locales/sv_SE.js +1 -0
- package/es/translations/locales/tg.js +1 -0
- package/es/translations/locales/th.js +72 -8
- package/es/translations/locales/th_TH.js +1 -0
- package/es/translations/locales/tl_PH.js +1 -0
- package/es/translations/locales/tr.js +7 -0
- package/es/translations/locales/uk_UA.js +7 -0
- package/es/translations/locales/vi.js +72 -8
- package/es/translations/locales/vi_VN.js +1 -0
- package/es/translations/locales/zh-Hans.js +72 -8
- package/es/translations/locales/zh-Hant.js +72 -8
- package/es/translations/locales/zh.js +72 -8
- package/es/translations/locales/zh_HK.js +72 -8
- package/es/translations/locales/zh_TW.Big5.js +1 -0
- package/es/translations/locales/zh_TW.js +1 -0
- package/es/translations/tinymce/ar_SA.js +1 -0
- package/es/translations/tinymce/fi.js +1 -0
- package/es/translations/tinymce/ga.js +1 -0
- package/es/translations/tinymce/id.js +1 -0
- package/es/translations/tinymce/ru.js +1 -0
- package/es/translations/tinymce/ru_RU.js +1 -0
- package/es/translations/tinymce/sl.js +1 -0
- package/es/translations/tinymce/sr.js +1 -0
- package/es/translations/tinymce/th.js +1 -0
- package/es/translations/tinymce/uk_UA.js +1 -0
- package/es/translations/tinymce/vi_VN.js +1 -0
- package/es/util/TypedDict.js +4 -2
- package/es/util/elem-util.js +1 -1
- package/es/util/encrypted-storage.js +3 -13
- package/es/util/file-url-util.js +2 -7
- package/es/util/fullscreenHelpers.js +9 -9
- package/es/util/instui-icon-helper.js +4 -3
- package/es/util/loadingPlaceholder.js +39 -41
- package/es/util/simpleCache.js +1 -5
- package/es/util/string-util.js +1 -1
- package/es/util/textarea-editing-util.js +3 -7
- package/es/util/tinymce-plugin-util.js +0 -5
- package/es/util/url-util.js +20 -29
- package/eslint.config.js +250 -0
- package/jest.config.js +1 -1
- package/locales/en.json +190 -10
- package/package.json +78 -82
- package/scripts/build-canvas +2 -1
- package/scripts/build.js +4 -4
- package/scripts/installTranslations.js +7 -8
- package/testcafe/RCEWrapper.test.js +0 -1
- package/testcafe/StatusBar.test.js +0 -1
- package/testcafe/axe.test.js +3 -4
- package/testcafe/enhanceUserContent.test.js +0 -1
- package/tsconfig.json +21 -16
- package/{es/rce/__mocks__/styleMock.js → types/format-message-generate-id.d.ts} +6 -2
- package/{es/rce/plugins/shared/__mocks__/screenfull.js → types/js-beautify.d.ts} +4 -7
- package/.eslintrc +0 -45
- package/.prettierignore +0 -6
- package/es/rce/__mocks__/_mockCryptoEs.js +0 -124
- package/es/rce/__mocks__/tinymceReact.js +0 -55
- package/es/rce/plugins/tinymce-a11y-checker/rules/__mocks__/index.js +0 -53
|
@@ -15,6 +15,7 @@
|
|
|
15
15
|
* You should have received a copy of the GNU Affero General Public License along
|
|
16
16
|
* with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
17
17
|
*/
|
|
18
|
+
|
|
18
19
|
import React, { Component } from 'react';
|
|
19
20
|
import PropTypes from 'prop-types';
|
|
20
21
|
import { TextArea } from '@instructure/ui-text-area';
|
|
@@ -29,13 +30,14 @@ import formatMessage from '../../../../format-message';
|
|
|
29
30
|
import MemoizedEquationEditorToolbar from '../EquationEditorToolbar';
|
|
30
31
|
import { containsAdvancedSyntax } from './advancedOnlySyntax';
|
|
31
32
|
import * as advancedPreference from './advancedPreference';
|
|
32
|
-
import {
|
|
33
|
+
import { instuiPopupMountNodeFn } from '../../../../util/fullscreenHelpers';
|
|
33
34
|
import { css } from 'aphrodite';
|
|
34
35
|
import { MathJaxDirective, Mathml } from '../../../../enhance-user-content/mathml';
|
|
35
36
|
import styles from './styles';
|
|
36
|
-
import RCEGlobals from '../../../RCEGlobals';
|
|
37
|
-
// the relevant math fonts from mathlive
|
|
37
|
+
import RCEGlobals from '../../../RCEGlobals';
|
|
38
38
|
|
|
39
|
+
// Import the <math-field> container and all
|
|
40
|
+
// the relevant math fonts from mathlive
|
|
39
41
|
import '../mathlive';
|
|
40
42
|
import { insertTextIntoLatexTextarea } from './latexTextareaUtil';
|
|
41
43
|
export default class EquationEditorModal extends Component {
|
|
@@ -47,14 +49,10 @@ export default class EquationEditorModal extends Component {
|
|
|
47
49
|
};
|
|
48
50
|
this.previewElement = /*#__PURE__*/React.createRef();
|
|
49
51
|
this.advancedEditor = /*#__PURE__*/React.createRef();
|
|
50
|
-
|
|
51
52
|
this.executeCommand = (cmd, advancedCmd) => {
|
|
52
53
|
if (this.state.advanced) {
|
|
53
|
-
var _this$advancedEditor$;
|
|
54
|
-
|
|
55
54
|
const insertionText = advancedCmd || cmd;
|
|
56
|
-
const textarea =
|
|
57
|
-
|
|
55
|
+
const textarea = this.advancedEditor.current?._textarea;
|
|
58
56
|
if (textarea) {
|
|
59
57
|
insertTextIntoLatexTextarea(textarea, insertionText);
|
|
60
58
|
this.setState({
|
|
@@ -67,25 +65,20 @@ export default class EquationEditorModal extends Component {
|
|
|
67
65
|
});
|
|
68
66
|
}
|
|
69
67
|
};
|
|
70
|
-
|
|
71
68
|
this.handleModalCancel = () => {
|
|
72
69
|
this.props.onModalDismiss();
|
|
73
70
|
};
|
|
74
|
-
|
|
75
71
|
this.handleModalDone = () => {
|
|
76
72
|
const {
|
|
77
73
|
onModalDismiss,
|
|
78
74
|
onEquationSubmit
|
|
79
75
|
} = this.props;
|
|
80
76
|
const output = this.state.advanced ? this.state.workingFormula : this.getMathFiled();
|
|
81
|
-
|
|
82
77
|
if (output) {
|
|
83
78
|
onEquationSubmit(output);
|
|
84
79
|
}
|
|
85
|
-
|
|
86
80
|
onModalDismiss();
|
|
87
81
|
};
|
|
88
|
-
|
|
89
82
|
this.renderMathInAdvancedPreview = debounce(() => {
|
|
90
83
|
if (this.previewElement.current) {
|
|
91
84
|
this.previewElement.current.innerHTML = String.raw`\(${this.state.workingFormula}\)`;
|
|
@@ -95,7 +88,6 @@ export default class EquationEditorModal extends Component {
|
|
|
95
88
|
leading: false,
|
|
96
89
|
trailing: true
|
|
97
90
|
});
|
|
98
|
-
|
|
99
91
|
this.toggleAdvanced = () => {
|
|
100
92
|
this.setState(state => {
|
|
101
93
|
if (state.advanced) {
|
|
@@ -113,12 +105,10 @@ export default class EquationEditorModal extends Component {
|
|
|
113
105
|
});
|
|
114
106
|
this.setPreviewElementContent();
|
|
115
107
|
};
|
|
116
|
-
|
|
117
108
|
this.toggleAndUpdatePreference = () => {
|
|
118
109
|
this.toggleAdvanced();
|
|
119
110
|
advancedPreference.isSet() ? advancedPreference.remove() : advancedPreference.set();
|
|
120
111
|
};
|
|
121
|
-
|
|
122
112
|
this.registerBasicEditorListener = () => {
|
|
123
113
|
const basicEditor = document.querySelector('math-field');
|
|
124
114
|
basicEditor.addEventListener('input', e => {
|
|
@@ -130,11 +120,9 @@ export default class EquationEditorModal extends Component {
|
|
|
130
120
|
}
|
|
131
121
|
});
|
|
132
122
|
};
|
|
133
|
-
|
|
134
123
|
this.handleFieldRef = node => {
|
|
135
124
|
this.mathField = node;
|
|
136
125
|
};
|
|
137
|
-
|
|
138
126
|
this.renderFooter = () => {
|
|
139
127
|
return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(Button, {
|
|
140
128
|
"data-testid": "equation-editor-modal-cancel",
|
|
@@ -146,7 +134,6 @@ export default class EquationEditorModal extends Component {
|
|
|
146
134
|
color: "primary"
|
|
147
135
|
}, formatMessage('Done')));
|
|
148
136
|
};
|
|
149
|
-
|
|
150
137
|
this.renderToggle = () => {
|
|
151
138
|
const lockToggle = this.state.advanced && this.advancedModeOnly(this.state.workingFormula);
|
|
152
139
|
return /*#__PURE__*/React.createElement(ConditionalTooltip, {
|
|
@@ -162,17 +149,14 @@ export default class EquationEditorModal extends Component {
|
|
|
162
149
|
"data-testid": "advanced-toggle"
|
|
163
150
|
}));
|
|
164
151
|
};
|
|
165
|
-
|
|
166
152
|
this.render = () => {
|
|
167
|
-
var _RCEGlobals$getFeatur;
|
|
168
|
-
|
|
169
153
|
const {
|
|
170
154
|
onModalClose
|
|
171
155
|
} = this.props;
|
|
172
156
|
return /*#__PURE__*/React.createElement(Modal, {
|
|
173
157
|
"data-mce-component": true,
|
|
174
158
|
label: formatMessage('Equation Editor'),
|
|
175
|
-
mountNode:
|
|
159
|
+
mountNode: instuiPopupMountNodeFn,
|
|
176
160
|
onClose: onModalClose,
|
|
177
161
|
onDismiss: this.handleModalCancel,
|
|
178
162
|
open: true,
|
|
@@ -234,16 +218,15 @@ export default class EquationEditorModal extends Component {
|
|
|
234
218
|
}, /*#__PURE__*/React.createElement("span", {
|
|
235
219
|
"data-testid": "mathml-preview-element",
|
|
236
220
|
ref: this.previewElement,
|
|
237
|
-
className:
|
|
221
|
+
className: RCEGlobals.getFeatures()?.explicit_latex_typesetting ? MathJaxDirective.Process : null
|
|
238
222
|
})))), /*#__PURE__*/React.createElement(Modal.Footer, null, this.renderFooter()));
|
|
239
223
|
};
|
|
240
|
-
|
|
241
224
|
this.mathml = new Mathml(RCEGlobals.getFeatures(), RCEGlobals.getConfig());
|
|
242
225
|
}
|
|
243
|
-
|
|
244
226
|
// **************** //
|
|
245
227
|
// Helper functions //
|
|
246
228
|
// **************** //
|
|
229
|
+
|
|
247
230
|
insertNewRange() {
|
|
248
231
|
const {
|
|
249
232
|
editor,
|
|
@@ -260,15 +243,15 @@ export default class EquationEditorModal extends Component {
|
|
|
260
243
|
range.setEnd(startContainer, rightIndex);
|
|
261
244
|
editor.selection.setRng(range);
|
|
262
245
|
}
|
|
263
|
-
|
|
264
246
|
advancedModeOnly(latex) {
|
|
265
247
|
const normalizedLatex = latex.replace(/\s+/, '');
|
|
266
248
|
return containsAdvancedSyntax(normalizedLatex);
|
|
267
|
-
}
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
// ********* //
|
|
268
252
|
// Callbacks //
|
|
269
253
|
// ********* //
|
|
270
254
|
|
|
271
|
-
|
|
272
255
|
setPreviewElementContent() {
|
|
273
256
|
if (this.state.workingFormula) {
|
|
274
257
|
this.renderMathInAdvancedPreview();
|
|
@@ -277,6 +260,10 @@ export default class EquationEditorModal extends Component {
|
|
|
277
260
|
}
|
|
278
261
|
}
|
|
279
262
|
|
|
263
|
+
// ******************* //
|
|
264
|
+
// Rendering functions //
|
|
265
|
+
// ******************* //
|
|
266
|
+
|
|
280
267
|
componentDidMount() {
|
|
281
268
|
this.registerBasicEditorListener();
|
|
282
269
|
this.setPreviewElementContent();
|
|
@@ -284,33 +271,26 @@ export default class EquationEditorModal extends Component {
|
|
|
284
271
|
if (!this.state.advanced) this.setMathField(this.state.workingFormula);
|
|
285
272
|
this.insertNewRange();
|
|
286
273
|
}
|
|
287
|
-
|
|
288
274
|
componentDidUpdate(prevProps, prevState) {
|
|
289
275
|
if (this.state.workingFormula !== prevState.workingFormula) {
|
|
290
276
|
this.setPreviewElementContent();
|
|
291
277
|
}
|
|
292
278
|
}
|
|
293
|
-
|
|
294
279
|
stubMacros() {
|
|
295
|
-
var _this$mathField;
|
|
296
|
-
|
|
297
280
|
// Mathlive's macros exist for a different use case;
|
|
298
281
|
// we don't intend for our users to utilize them.
|
|
299
282
|
// This effectively disables all of them to prevent
|
|
300
283
|
// weird behaviors that users don't expect.
|
|
301
|
-
|
|
284
|
+
this.mathField?.setOptions({
|
|
302
285
|
macros: {}
|
|
303
286
|
});
|
|
304
287
|
}
|
|
305
|
-
|
|
306
288
|
setMathField(formula) {
|
|
307
289
|
this.mathField.setValue(formula);
|
|
308
290
|
}
|
|
309
|
-
|
|
310
291
|
getMathFiled() {
|
|
311
292
|
return this.mathField.getValue();
|
|
312
293
|
}
|
|
313
|
-
|
|
314
294
|
}
|
|
315
295
|
EquationEditorModal.debounceRate = 1000;
|
|
316
296
|
EquationEditorModal.propTypes = {
|
|
@@ -15,7 +15,9 @@
|
|
|
15
15
|
* You should have received a copy of the GNU Affero General Public License along
|
|
16
16
|
* with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
17
17
|
*/
|
|
18
|
+
|
|
18
19
|
import { performTextEditActionOnTextarea } from '../../../../util/textarea-editing-util';
|
|
20
|
+
|
|
19
21
|
/**
|
|
20
22
|
* Inserts text into a textarea for editing LaTeX, handling selection and focus management.
|
|
21
23
|
*
|
|
@@ -24,13 +26,11 @@ import { performTextEditActionOnTextarea } from '../../../../util/textarea-editi
|
|
|
24
26
|
* @param textarea
|
|
25
27
|
* @param insertionText
|
|
26
28
|
*/
|
|
27
|
-
|
|
28
29
|
export function insertTextIntoLatexTextarea(textarea, insertionText) {
|
|
29
30
|
var _textarea$value, _textarea$selectionSt, _textarea$selectionEn;
|
|
30
|
-
|
|
31
|
-
const
|
|
32
|
-
const
|
|
33
|
-
const selEnd = (_textarea$selectionEn = textarea === null || textarea === void 0 ? void 0 : textarea.selectionEnd) !== null && _textarea$selectionEn !== void 0 ? _textarea$selectionEn : selStart;
|
|
31
|
+
const currentText = (_textarea$value = textarea?.value) !== null && _textarea$value !== void 0 ? _textarea$value : '';
|
|
32
|
+
const selStart = (_textarea$selectionSt = textarea?.selectionStart) !== null && _textarea$selectionSt !== void 0 ? _textarea$selectionSt : currentText.length;
|
|
33
|
+
const selEnd = (_textarea$selectionEn = textarea?.selectionEnd) !== null && _textarea$selectionEn !== void 0 ? _textarea$selectionEn : selStart;
|
|
34
34
|
textarea.focus();
|
|
35
35
|
planInsertTextIntoLatexTextarea({
|
|
36
36
|
insertionText,
|
|
@@ -48,23 +48,24 @@ export function planInsertTextIntoLatexTextarea(args) {
|
|
|
48
48
|
selStart,
|
|
49
49
|
selEnd
|
|
50
50
|
} = args;
|
|
51
|
-
const selectedText = currentText.substring(selStart, selEnd);
|
|
52
|
-
// command in that case
|
|
51
|
+
const selectedText = currentText.substring(selStart, selEnd);
|
|
53
52
|
|
|
54
|
-
|
|
53
|
+
// Look for parameters ([] or {}) in the command text, because we'll want to wrap the current selection in the
|
|
54
|
+
// command in that case
|
|
55
|
+
const singleParamParts = insertionText.match(
|
|
56
|
+
// Match both [] and {}
|
|
55
57
|
/^(.*?\{)\s*(}.*)$|^(.*?\[)\s*(].*)$/);
|
|
56
|
-
const doubleParamParts = insertionText.match(
|
|
57
|
-
|
|
58
|
+
const doubleParamParts = insertionText.match(
|
|
59
|
+
// Match two sets of [] and/or {}
|
|
60
|
+
/^(?:(.*?\{)\s*(}.*?)|(.*?\[)\s*(].*?))(?:(.*?\{)\s*(}.*?)|(.*?\[)\s*(].*))$/
|
|
61
|
+
// 1 2 3 4 5 6 7 8
|
|
58
62
|
);
|
|
59
|
-
|
|
60
63
|
if (doubleParamParts) {
|
|
61
64
|
var _ref, _m$, _ref2, _m$2, _ref3, _m$3, _ref4, _m$4;
|
|
62
|
-
|
|
63
65
|
const m = doubleParamParts;
|
|
64
66
|
const before = (_ref = (_m$ = m[1]) !== null && _m$ !== void 0 ? _m$ : m[3]) !== null && _ref !== void 0 ? _ref : '';
|
|
65
67
|
const middle = ((_ref2 = (_m$2 = m[2]) !== null && _m$2 !== void 0 ? _m$2 : m[4]) !== null && _ref2 !== void 0 ? _ref2 : '') + ((_ref3 = (_m$3 = m[5]) !== null && _m$3 !== void 0 ? _m$3 : m[7]) !== null && _ref3 !== void 0 ? _ref3 : '');
|
|
66
68
|
const after = (_ref4 = (_m$4 = m[6]) !== null && _m$4 !== void 0 ? _m$4 : m[8]) !== null && _ref4 !== void 0 ? _ref4 : '';
|
|
67
|
-
|
|
68
69
|
if (selectedText.length) {
|
|
69
70
|
// When there is a selection with a double-parameter command, the selection should fill the first parameter
|
|
70
71
|
// and the cursor should be be placed in the second parameter
|
|
@@ -85,10 +86,8 @@ export function planInsertTextIntoLatexTextarea(args) {
|
|
|
85
86
|
}
|
|
86
87
|
} else if (singleParamParts) {
|
|
87
88
|
var _singleParamParts$, _singleParamParts$2;
|
|
88
|
-
|
|
89
89
|
const before = (_singleParamParts$ = singleParamParts[1]) !== null && _singleParamParts$ !== void 0 ? _singleParamParts$ : singleParamParts[3];
|
|
90
90
|
const after = (_singleParamParts$2 = singleParamParts[2]) !== null && _singleParamParts$2 !== void 0 ? _singleParamParts$2 : singleParamParts[4];
|
|
91
|
-
|
|
92
91
|
if (selectedText.length) {
|
|
93
92
|
// When there is a selection and only a single parameter, the selection should be used as the parameter
|
|
94
93
|
// and the cursor placed at the end of the command
|
|
@@ -15,6 +15,7 @@
|
|
|
15
15
|
* You should have received a copy of the GNU Affero General Public License along
|
|
16
16
|
* with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
17
17
|
*/
|
|
18
|
+
|
|
18
19
|
import { containsAdvancedSyntax } from './advancedOnlySyntax';
|
|
19
20
|
// Used to detect inline latex delimited like: \( ... \) OR $$ ... $$
|
|
20
21
|
const BOUNDARY_REGEX = /\\\((.+?)\\\)|\$\$(.+?)\$\$/g;
|
|
@@ -47,16 +48,17 @@ export const parseLatex = editor => {
|
|
|
47
48
|
const selection = editor.selection.getContent();
|
|
48
49
|
const selectionNode = editor.selection.getNode();
|
|
49
50
|
const editorRange = editor.selection.getRng();
|
|
50
|
-
const startContainer = editorRange
|
|
51
|
-
const wholeText = startContainer
|
|
51
|
+
const startContainer = editorRange?.startContainer;
|
|
52
|
+
const wholeText = startContainer?.wholeText;
|
|
52
53
|
|
|
54
|
+
// check if selection is inline latex
|
|
53
55
|
if (selection && selectionIsLatex(selection)) {
|
|
54
56
|
const latex = cleanLatex(selection);
|
|
55
57
|
return {
|
|
56
58
|
latex,
|
|
57
59
|
advancedOnly: containsAdvancedSyntax(latex)
|
|
58
60
|
};
|
|
59
|
-
} else if (
|
|
61
|
+
} else if (selectionNode?.tagName === 'IMG' && selectionNode?.classList.contains('equation_image')) {
|
|
60
62
|
// check if we launched modal from an equation image
|
|
61
63
|
try {
|
|
62
64
|
const src = new URL(selectionNode.src);
|
|
@@ -72,18 +74,17 @@ export const parseLatex = editor => {
|
|
|
72
74
|
}
|
|
73
75
|
} else if (wholeText) {
|
|
74
76
|
// check if the cursor was within inline latex when launched
|
|
77
|
+
|
|
75
78
|
// The `wholeText` value is not sufficient, since we could be dealing with
|
|
76
79
|
// a number of nested ranges. The `nodeValue` is the text in the range in
|
|
77
80
|
// which we have found the cursor.
|
|
78
81
|
const nodeValue = startContainer.nodeValue || '';
|
|
79
82
|
const cursor = editorRange.startOffset;
|
|
80
83
|
const parsedLatex = findLatex(nodeValue, cursor);
|
|
81
|
-
|
|
82
84
|
if (parsedLatex.latex) {
|
|
83
85
|
parsedLatex.startContainer = startContainer;
|
|
84
86
|
parsedLatex.advancedOnly = containsAdvancedSyntax(parsedLatex.latex);
|
|
85
87
|
}
|
|
86
|
-
|
|
87
88
|
return parsedLatex;
|
|
88
89
|
} else {
|
|
89
90
|
return {};
|
|
@@ -15,12 +15,14 @@
|
|
|
15
15
|
* You should have received a copy of the GNU Affero General Public License along
|
|
16
16
|
* with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
17
17
|
*/
|
|
18
|
+
|
|
18
19
|
import { StyleSheet } from 'aphrodite';
|
|
19
20
|
const cssRules = `#MathJax_MenuFrame {
|
|
20
21
|
z-index: 10000 !important;
|
|
21
|
-
}`;
|
|
22
|
-
// Manually adding z-index as head style
|
|
22
|
+
}`;
|
|
23
23
|
|
|
24
|
+
// Applying z-index for MathJax menu inside config shows the element but doesn't user interact with it.
|
|
25
|
+
// Manually adding z-index as head style
|
|
24
26
|
const style = document.createElement('style');
|
|
25
27
|
style.appendChild(document.createTextNode(cssRules));
|
|
26
28
|
document.head.appendChild(style);
|
|
@@ -15,9 +15,9 @@
|
|
|
15
15
|
* You should have received a copy of the GNU Affero General Public License along
|
|
16
16
|
* with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
17
17
|
*/
|
|
18
|
-
const formatMessage = require('../../../../format-message');
|
|
19
18
|
|
|
20
|
-
|
|
19
|
+
import formatMessage from '../../../../format-message';
|
|
20
|
+
export default [{
|
|
21
21
|
name: formatMessage('Basic'),
|
|
22
22
|
commands: [{
|
|
23
23
|
displayName: 'x_{\u2B1A}^{\\ }',
|
|
@@ -61,7 +61,8 @@ module.exports = [{
|
|
|
61
61
|
advancedCommand: '\\binom{ }{ }',
|
|
62
62
|
svgCommand: '\\binom{n}{m}',
|
|
63
63
|
label: formatMessage('Binomial Coefficient')
|
|
64
|
-
},
|
|
64
|
+
},
|
|
65
|
+
// TODO maybe re-add vector, after figuring out if it even works
|
|
65
66
|
{
|
|
66
67
|
command: 'f',
|
|
67
68
|
label: formatMessage('F (function)')
|
|
@@ -404,7 +405,8 @@ module.exports = [{
|
|
|
404
405
|
}, {
|
|
405
406
|
command: '\\ni',
|
|
406
407
|
label: formatMessage('Contains')
|
|
407
|
-
},
|
|
408
|
+
},
|
|
409
|
+
// TODO consider reenabling once mathlive supports it
|
|
408
410
|
// { command: '\\notni' },
|
|
409
411
|
{
|
|
410
412
|
command: '\\subset',
|
|
@@ -670,7 +672,8 @@ module.exports = [{
|
|
|
670
672
|
}, {
|
|
671
673
|
command: '\\spadesuit',
|
|
672
674
|
label: formatMessage('Spades (Suit)')
|
|
673
|
-
},
|
|
675
|
+
},
|
|
676
|
+
// TODO maybe readd caret, underscore once I figure out if they even worked
|
|
674
677
|
{
|
|
675
678
|
command: '\\backslash',
|
|
676
679
|
label: formatMessage('Backslash')
|
|
@@ -686,7 +689,8 @@ module.exports = [{
|
|
|
686
689
|
}, {
|
|
687
690
|
command: '\\hbar',
|
|
688
691
|
label: formatMessage('H Bar')
|
|
689
|
-
},
|
|
692
|
+
},
|
|
693
|
+
// TODO consider renabling if we can not get stuck in text mode
|
|
690
694
|
// { command: '\\text\\AA' },
|
|
691
695
|
{
|
|
692
696
|
command: '\\circ',
|
|
@@ -700,7 +704,8 @@ module.exports = [{
|
|
|
700
704
|
}, {
|
|
701
705
|
command: '\\neg',
|
|
702
706
|
label: formatMessage('Not (Negation)')
|
|
703
|
-
},
|
|
707
|
+
},
|
|
708
|
+
// TODO consider reenabling once mathlive supports it
|
|
704
709
|
// { command: '\\dots' },
|
|
705
710
|
{
|
|
706
711
|
command: '\\Re',
|
|
@@ -720,7 +725,8 @@ module.exports = [{
|
|
|
720
725
|
}, {
|
|
721
726
|
command: '^\\circ',
|
|
722
727
|
label: formatMessage('Degree Symbol')
|
|
723
|
-
},
|
|
728
|
+
},
|
|
729
|
+
// \\deg requires the gensymb package added to LaTex
|
|
724
730
|
{
|
|
725
731
|
command: '\\angle',
|
|
726
732
|
label: formatMessage('Angle')
|
|
@@ -15,6 +15,7 @@
|
|
|
15
15
|
* You should have received a copy of the GNU Affero General Public License along
|
|
16
16
|
* with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
17
17
|
*/
|
|
18
|
+
|
|
18
19
|
import React, { useState } from 'react';
|
|
19
20
|
import PropTypes from 'prop-types';
|
|
20
21
|
import { Tabs } from '@instructure/ui-tabs';
|
|
@@ -26,38 +27,34 @@ const buttonContainerStyle = {
|
|
|
26
27
|
marginBottom: '5px',
|
|
27
28
|
paddingRight: '5px'
|
|
28
29
|
};
|
|
29
|
-
|
|
30
30
|
function EquationEditorToolbar(props) {
|
|
31
31
|
const [selectedTab, setSelectedTab] = useState('Basic');
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
index
|
|
36
|
-
} = _ref;
|
|
32
|
+
const handleTabChange = (event, {
|
|
33
|
+
index
|
|
34
|
+
}) => {
|
|
37
35
|
setSelectedTab(buttons[index].name);
|
|
38
36
|
};
|
|
39
|
-
|
|
40
37
|
const renderTabPanel = section => /*#__PURE__*/React.createElement(Tabs.Panel, {
|
|
41
38
|
id: section.name,
|
|
42
39
|
key: section.name,
|
|
43
40
|
padding: "small small",
|
|
44
41
|
renderTitle: section.name,
|
|
45
42
|
isSelected: selectedTab === section.name
|
|
46
|
-
}, section.commands.map(
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
} = _ref2;
|
|
43
|
+
}, section.commands.map(({
|
|
44
|
+
displayName,
|
|
45
|
+
command,
|
|
46
|
+
advancedCommand,
|
|
47
|
+
label
|
|
48
|
+
}) => {
|
|
53
49
|
const name = displayName || command;
|
|
54
50
|
const icon = /*#__PURE__*/React.createElement(MathIcon, {
|
|
55
51
|
command: command
|
|
56
|
-
});
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
// I'm inlining styles here because for some reason the RCE plugin plays
|
|
57
55
|
// poorly with the way webpack is compiling styles, causing rules from a
|
|
58
56
|
// styles.css file to not show up. It would be nice to figure out how to
|
|
59
57
|
// fix this, though.
|
|
60
|
-
|
|
61
58
|
return /*#__PURE__*/React.createElement("div", {
|
|
62
59
|
style: buttonContainerStyle,
|
|
63
60
|
key: name
|
|
@@ -67,7 +64,6 @@ function EquationEditorToolbar(props) {
|
|
|
67
64
|
screenReaderLabel: `${label}, LaTeX: ${name}`
|
|
68
65
|
}));
|
|
69
66
|
}));
|
|
70
|
-
|
|
71
67
|
return /*#__PURE__*/React.createElement(Tabs, {
|
|
72
68
|
variant: "secondary",
|
|
73
69
|
onRequestTabChange: handleTabChange,
|
|
@@ -76,7 +72,6 @@ function EquationEditorToolbar(props) {
|
|
|
76
72
|
maxWidth: "42rem"
|
|
77
73
|
}, buttons.map(renderTabPanel));
|
|
78
74
|
}
|
|
79
|
-
|
|
80
75
|
EquationEditorToolbar.propTypes = {
|
|
81
76
|
executeCommand: PropTypes.func.isRequired
|
|
82
77
|
};
|
|
@@ -15,16 +15,15 @@
|
|
|
15
15
|
* You should have received a copy of the GNU Affero General Public License along
|
|
16
16
|
* with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
17
17
|
*/
|
|
18
|
+
|
|
18
19
|
import React from 'react';
|
|
19
20
|
import { string } from 'prop-types';
|
|
20
21
|
import { IconWarningLine } from '@instructure/ui-icons';
|
|
21
22
|
import { SVGIcon } from '@instructure/ui-svg-images';
|
|
22
23
|
import svgs from './svgs';
|
|
23
|
-
export default function MathIcon(
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
} = _ref;
|
|
27
|
-
|
|
24
|
+
export default function MathIcon({
|
|
25
|
+
command
|
|
26
|
+
}) {
|
|
28
27
|
if (command in svgs) {
|
|
29
28
|
return /*#__PURE__*/React.createElement(SVGIcon, {
|
|
30
29
|
src: svgs[command],
|
|
@@ -17,8 +17,8 @@
|
|
|
17
17
|
*/
|
|
18
18
|
|
|
19
19
|
/***** This is an auto-generated file. Please do not modify manually *****/
|
|
20
|
-
|
|
21
20
|
/************ If you need to update, run 'yarn generate-svgs' ************/
|
|
21
|
+
|
|
22
22
|
export default {
|
|
23
23
|
'_{\\placeholder{}}': '<svg style="vertical-align: -0.339ex" xmlns="http://www.w3.org/2000/svg" width="2.727ex" height="1.339ex" role="img" focusable="false" viewBox="0 -442 1205.1 592" xmlns:xlink="http://www.w3.org/1999/xlink"><defs><path id="MJX-1-TEX-I-1D465" d="M52 289Q59 331 106 386T222 442Q257 442 286 424T329 379Q371 442 430 442Q467 442 494 420T522 361Q522 332 508 314T481 292T458 288Q439 288 427 299T415 328Q415 374 465 391Q454 404 425 404Q412 404 406 402Q368 386 350 336Q290 115 290 78Q290 50 306 38T341 26Q378 26 414 59T463 140Q466 150 469 151T485 153H489Q504 153 504 145Q504 144 502 134Q486 77 440 33T333 -11Q263 -11 227 52Q186 -10 133 -10H127Q78 -10 57 16T35 71Q35 103 54 123T99 143Q142 143 142 101Q142 81 130 66T107 46T94 41L91 40Q91 39 97 36T113 29T132 26Q168 26 194 71Q203 87 217 139T245 247T261 313Q266 340 266 352Q266 380 251 392T217 404Q177 404 142 372T93 290Q91 281 88 280T72 278H58Q52 284 52 289Z"></path><path id="MJX-1-TEX-I-25FB" d="M71 0Q59 4 55 16V346L56 676Q64 686 70 689H709Q719 681 722 674V15Q719 10 709 1L390 0H71ZM682 40V649H95V40H682Z"></path></defs><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="msub"><g data-mml-node="mi"><use data-c="1D465" xlink:href="#MJX-1-TEX-I-1D465"></use></g><g data-mml-node="TeXAtom" transform="translate(605,-150) scale(0.707)" data-mjx-texclass="ORD"><g data-mml-node="mi"><use data-c="25FB" xlink:href="#MJX-1-TEX-I-25FB"></use></g></g></g></g></g></svg>',
|
|
24
24
|
'^{\\placeholder{}}': '<svg style="vertical-align: -0.025ex" xmlns="http://www.w3.org/2000/svg" width="2.727ex" height="2.062ex" role="img" focusable="false" viewBox="0 -900.2 1205.1 911.2" xmlns:xlink="http://www.w3.org/1999/xlink"><defs><path id="MJX-2-TEX-I-1D465" d="M52 289Q59 331 106 386T222 442Q257 442 286 424T329 379Q371 442 430 442Q467 442 494 420T522 361Q522 332 508 314T481 292T458 288Q439 288 427 299T415 328Q415 374 465 391Q454 404 425 404Q412 404 406 402Q368 386 350 336Q290 115 290 78Q290 50 306 38T341 26Q378 26 414 59T463 140Q466 150 469 151T485 153H489Q504 153 504 145Q504 144 502 134Q486 77 440 33T333 -11Q263 -11 227 52Q186 -10 133 -10H127Q78 -10 57 16T35 71Q35 103 54 123T99 143Q142 143 142 101Q142 81 130 66T107 46T94 41L91 40Q91 39 97 36T113 29T132 26Q168 26 194 71Q203 87 217 139T245 247T261 313Q266 340 266 352Q266 380 251 392T217 404Q177 404 142 372T93 290Q91 281 88 280T72 278H58Q52 284 52 289Z"></path><path id="MJX-2-TEX-I-25FB" d="M71 0Q59 4 55 16V346L56 676Q64 686 70 689H709Q719 681 722 674V15Q719 10 709 1L390 0H71ZM682 40V649H95V40H682Z"></path></defs><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="msup"><g data-mml-node="mi"><use data-c="1D465" xlink:href="#MJX-2-TEX-I-1D465"></use></g><g data-mml-node="TeXAtom" transform="translate(605,413) scale(0.707)" data-mjx-texclass="ORD"><g data-mml-node="mi"><use data-c="25FB" xlink:href="#MJX-2-TEX-I-25FB"></use></g></g></g></g></g></svg>',
|
|
@@ -15,6 +15,7 @@
|
|
|
15
15
|
* You should have received a copy of the GNU Affero General Public License along
|
|
16
16
|
* with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
17
17
|
*/
|
|
18
|
+
|
|
18
19
|
import React from 'react';
|
|
19
20
|
import ReactDOM from 'react-dom';
|
|
20
21
|
import Bridge from '../../../bridge';
|
|
@@ -25,23 +26,19 @@ export default function (ed, document, _trayProps) {
|
|
|
25
26
|
const rce = Bridge.activeEditor();
|
|
26
27
|
const EquationEditorModal = module.default;
|
|
27
28
|
let container = document.querySelector('.canvas-rce-equation-container');
|
|
28
|
-
|
|
29
29
|
if (!container) {
|
|
30
30
|
container = document.createElement('div');
|
|
31
31
|
container.className = 'canvas-rce-equation-container';
|
|
32
32
|
document.body.appendChild(container);
|
|
33
33
|
}
|
|
34
|
-
|
|
35
34
|
const handleDismiss = () => {
|
|
36
35
|
ReactDOM.unmountComponentAtNode(container);
|
|
37
36
|
ed.focus(false);
|
|
38
37
|
};
|
|
39
|
-
|
|
40
38
|
const handleSubmit = latex => {
|
|
41
39
|
rce.insertMathEquation(latex);
|
|
42
40
|
};
|
|
43
|
-
|
|
44
|
-
ReactDOM.render( /*#__PURE__*/React.createElement(EquationEditorModal, {
|
|
41
|
+
ReactDOM.render(/*#__PURE__*/React.createElement(EquationEditorModal, {
|
|
45
42
|
editor: ed,
|
|
46
43
|
onModalDismiss: handleDismiss,
|
|
47
44
|
onModalClose: handleDismiss,
|