@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 formatMessage from '../format-message';
|
|
19
20
|
import { showFlashAlert } from '../common/FlashAlert';
|
|
20
21
|
import { isPreviewable, loadDocPreview, removeLoadingImage, showLoadingImage } from './doc_previews';
|
|
@@ -23,57 +24,47 @@ import { parseUrlOrNull } from '../util/url-util';
|
|
|
23
24
|
const youTubeRegEx = /^https?:\/\/(www\.youtube\.com\/watch.*v(=|\/)|youtu\.be\/)([^&#]*)/;
|
|
24
25
|
export function youTubeID(path) {
|
|
25
26
|
const match = path.match(youTubeRegEx);
|
|
26
|
-
|
|
27
27
|
if (match && match[match.length - 1]) {
|
|
28
28
|
return match[match.length - 1];
|
|
29
29
|
}
|
|
30
|
-
|
|
31
30
|
return null;
|
|
32
31
|
}
|
|
33
32
|
export function getTld(hostname) {
|
|
34
33
|
hostname = (hostname || '').split(':')[0];
|
|
35
34
|
const parts = hostname.split('.'),
|
|
36
|
-
|
|
35
|
+
length = parts.length;
|
|
37
36
|
return (length > 1 ? [parts[length - 2], parts[length - 1]] : parts).join('.');
|
|
38
37
|
}
|
|
39
|
-
export function isExternalLink(element) {
|
|
40
|
-
let canvasOrigin = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : window.location.origin;
|
|
38
|
+
export function isExternalLink(element, canvasOrigin = window.location.origin) {
|
|
41
39
|
let canvasHost;
|
|
42
|
-
|
|
43
40
|
try {
|
|
44
41
|
canvasHost = new URL(canvasOrigin).hostname;
|
|
45
42
|
} catch (_ex) {
|
|
46
43
|
canvasHost = window.location.hostname;
|
|
47
44
|
}
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
45
|
+
const href = element.getAttribute('href');
|
|
46
|
+
// if a browser doesnt support <a>.hostname then just dont mark anything as external, better to not get false positives.
|
|
51
47
|
return !!(href && href.length && !href.match(/^(mailto\:|javascript\:)/) && element.hostname && getTld(element.hostname) !== getTld(canvasHost));
|
|
52
48
|
}
|
|
53
|
-
export function showFilePreview(event) {
|
|
54
|
-
var _event$target, _event$currentTarget;
|
|
55
|
-
|
|
56
|
-
let opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
|
|
49
|
+
export function showFilePreview(event, opts = {}) {
|
|
57
50
|
event.stopPropagation();
|
|
58
51
|
const {
|
|
59
52
|
canvasOrigin,
|
|
60
53
|
disableGooglePreviews
|
|
61
|
-
} = {
|
|
54
|
+
} = {
|
|
55
|
+
...opts
|
|
62
56
|
};
|
|
63
57
|
let target = null;
|
|
64
|
-
|
|
65
|
-
if ((_event$target = event.target) !== null && _event$target !== void 0 && _event$target.href) {
|
|
58
|
+
if (event.target?.href) {
|
|
66
59
|
target = event.target;
|
|
67
|
-
} else if (
|
|
60
|
+
} else if (event.currentTarget?.href) {
|
|
68
61
|
target = event.currentTarget;
|
|
69
62
|
} else {
|
|
70
63
|
return;
|
|
71
64
|
}
|
|
72
|
-
|
|
73
65
|
if (target.classList.contains('no_preview')) {
|
|
74
66
|
return;
|
|
75
67
|
}
|
|
76
|
-
|
|
77
68
|
if (target.classList.contains('inline_disabled') || target.classList.contains('preview_in_overlay')) {
|
|
78
69
|
showFilePreviewInOverlay(event, canvasOrigin);
|
|
79
70
|
} else {
|
|
@@ -81,45 +72,37 @@ export function showFilePreview(event) {
|
|
|
81
72
|
}
|
|
82
73
|
}
|
|
83
74
|
export function showFilePreviewInOverlay(event, canvasOrigin) {
|
|
84
|
-
var _event$target2, _event$currentTarget2, _target;
|
|
85
|
-
|
|
86
75
|
let target = null;
|
|
87
|
-
|
|
88
|
-
if ((_event$target2 = event.target) !== null && _event$target2 !== void 0 && _event$target2.href) {
|
|
76
|
+
if (event.target?.href) {
|
|
89
77
|
target = event.target;
|
|
90
|
-
} else if (
|
|
78
|
+
} else if (event.currentTarget?.href) {
|
|
91
79
|
target = event.currentTarget;
|
|
92
80
|
}
|
|
93
|
-
|
|
94
|
-
const matches = (_target = target) === null || _target === void 0 ? void 0 : _target.href.match(/\/files\/(\d+~\d+|\d+)/);
|
|
95
|
-
|
|
81
|
+
const matches = target?.href.match(/\/files\/(\d+~\d+|\d+)/);
|
|
96
82
|
if (matches) {
|
|
97
83
|
if (event.ctrlKey || event.altKey || event.metaKey || event.shiftKey) {
|
|
98
84
|
// if any modifier keys are pressed, do the browser default thing
|
|
99
85
|
return;
|
|
100
86
|
}
|
|
101
|
-
|
|
102
87
|
event.preventDefault();
|
|
103
88
|
const url = new URL(target.href);
|
|
104
|
-
const verifier = url
|
|
105
|
-
const access_token = url
|
|
106
|
-
const instfs_id = url
|
|
89
|
+
const verifier = url?.searchParams.get('verifier');
|
|
90
|
+
const access_token = url?.searchParams.get('access_token');
|
|
91
|
+
const instfs_id = url?.searchParams.get('instfs_id');
|
|
107
92
|
const file_id = matches[1];
|
|
108
93
|
const params = {
|
|
109
94
|
subject: 'preview_file',
|
|
110
95
|
file_id
|
|
111
96
|
};
|
|
112
97
|
if (verifier) params.verifier = verifier;
|
|
113
|
-
|
|
114
98
|
if (access_token && instfs_id) {
|
|
115
99
|
params.access_token = access_token;
|
|
116
100
|
params.instfs_id = instfs_id;
|
|
117
|
-
}
|
|
101
|
+
}
|
|
102
|
+
// TODO:
|
|
118
103
|
// 1. what window should we be using
|
|
119
104
|
// 2. is that the right origin?
|
|
120
105
|
// 3. this is temporary until we can decouple the file previewer from canvas
|
|
121
|
-
|
|
122
|
-
|
|
123
106
|
window.top.postMessage(params, canvasOrigin);
|
|
124
107
|
}
|
|
125
108
|
}
|
|
@@ -128,21 +111,19 @@ export function showFilePreviewInline(event, canvasOrigin, disableGooglePreviews
|
|
|
128
111
|
// if any modifier keys are pressed, do the browser default thing
|
|
129
112
|
return;
|
|
130
113
|
}
|
|
131
|
-
|
|
132
114
|
event.preventDefault();
|
|
133
115
|
const $link = event.currentTarget || event.target;
|
|
134
|
-
|
|
135
116
|
if ($link.getAttribute('aria-expanded') === 'true') {
|
|
136
117
|
// close the preview by clicking the "Minimize File Preview" link
|
|
137
118
|
const $preview = document.getElementById($link.getAttribute('aria-controls'));
|
|
138
119
|
$preview.querySelector('.hide_file_preview_link').click();
|
|
139
120
|
return;
|
|
140
121
|
}
|
|
141
|
-
|
|
142
122
|
showLoadingImage($link);
|
|
143
123
|
fetch($link.getAttribute('href').replace(/\/(download|preview)/, '') // download as part of the path
|
|
144
124
|
.replace(/wrap=1&?/, '') // wrap=1 as part of the query_string
|
|
145
|
-
.replace(/[?&]$/, ''),
|
|
125
|
+
.replace(/[?&]$/, ''),
|
|
126
|
+
// any trailing chars if wrap=1 was at the end
|
|
146
127
|
{
|
|
147
128
|
method: 'GET',
|
|
148
129
|
headers: {
|
|
@@ -156,16 +137,11 @@ export function showFilePreviewInline(event, canvasOrigin, disableGooglePreviews
|
|
|
156
137
|
const attachment = data && data.attachment;
|
|
157
138
|
removeLoadingImage($link);
|
|
158
139
|
let canvadoc_session_url = attachment.canvadoc_session_url;
|
|
159
|
-
|
|
160
140
|
if (attachment && (!disableGooglePreviews && isPreviewable(attachment.content_type) || canvadoc_session_url)) {
|
|
161
141
|
$link.setAttribute('aria-expanded', 'true');
|
|
162
|
-
|
|
163
142
|
if (canvasOrigin && canvadoc_session_url !== null) {
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
canvadoc_session_url = (_parseUrlOrNull = parseUrlOrNull(canvadoc_session_url, canvasOrigin)) === null || _parseUrlOrNull === void 0 ? void 0 : _parseUrlOrNull.toString();
|
|
143
|
+
canvadoc_session_url = parseUrlOrNull(canvadoc_session_url, canvasOrigin)?.toString();
|
|
167
144
|
}
|
|
168
|
-
|
|
169
145
|
const $div = document.querySelector(`[id="${$link.getAttribute('aria-controls')}"]`);
|
|
170
146
|
$div.style.display = 'block';
|
|
171
147
|
loadDocPreview($div, {
|
|
@@ -185,7 +161,6 @@ export function showFilePreviewInline(event, canvasOrigin, disableGooglePreviews
|
|
|
185
161
|
resetInlinePreview($link, $div);
|
|
186
162
|
});
|
|
187
163
|
$div.prepend($minimizeLink);
|
|
188
|
-
|
|
189
164
|
if (Object.prototype.hasOwnProperty.call(event, 'originalEvent')) {
|
|
190
165
|
// Only focus this link if the open preview link was initiated by a real browser event
|
|
191
166
|
// If it was triggered by our auto_open stuff it shouldn't focus here.
|
|
@@ -196,19 +171,16 @@ export function showFilePreviewInline(event, canvasOrigin, disableGooglePreviews
|
|
|
196
171
|
showFlashAlert({
|
|
197
172
|
message: formatMessage('Failed getting file contents'),
|
|
198
173
|
type: 'error'
|
|
199
|
-
});
|
|
200
|
-
|
|
174
|
+
});
|
|
201
175
|
console.error(ex);
|
|
202
176
|
resetInlinePreview($link);
|
|
203
177
|
removeLoadingImage($link);
|
|
204
178
|
});
|
|
205
179
|
}
|
|
206
|
-
|
|
207
180
|
function resetInlinePreview($link, $previewContainer) {
|
|
208
181
|
$link.setAttribute('aria-expanded', 'false');
|
|
209
182
|
show($link);
|
|
210
183
|
$link.focus();
|
|
211
|
-
|
|
212
184
|
if ($previewContainer) {
|
|
213
185
|
$previewContainer.innerHTML = '';
|
|
214
186
|
$previewContainer.style.display = 'none';
|
|
@@ -15,30 +15,29 @@
|
|
|
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
|
export function hidden(elem) {
|
|
19
20
|
const width = elem.offsetWidth,
|
|
20
|
-
|
|
21
|
+
height = elem.offsetHeight;
|
|
21
22
|
return width === 0 && height === 0;
|
|
22
23
|
}
|
|
23
24
|
export function visible(elem) {
|
|
24
25
|
return !hidden(elem);
|
|
25
|
-
}
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
// start: the element where we start
|
|
26
29
|
// selector: find an ancestor to elem that matches this
|
|
27
30
|
// context: optional DOM element within which the matching element may be found
|
|
28
|
-
|
|
29
31
|
export function closest(start, selector, context) {
|
|
30
32
|
const upperbound = context || document.body;
|
|
31
33
|
let elem = start;
|
|
32
|
-
|
|
33
34
|
while (elem) {
|
|
34
35
|
if (elem.matches(selector)) {
|
|
35
36
|
return elem;
|
|
36
37
|
}
|
|
37
|
-
|
|
38
38
|
if (elem === upperbound) {
|
|
39
39
|
return null;
|
|
40
40
|
}
|
|
41
|
-
|
|
42
41
|
elem = elem.parentElement;
|
|
43
42
|
}
|
|
44
43
|
}
|
|
@@ -51,7 +50,9 @@ export function show(elem) {
|
|
|
51
50
|
}
|
|
52
51
|
export function capitalize(word) {
|
|
53
52
|
return word.replace(/^./, letter => letter.toUpperCase());
|
|
54
|
-
}
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
// this implementation of get|setData does not
|
|
55
56
|
// deal with elements being recreated in the dom
|
|
56
57
|
// but that seems to be OK
|
|
57
58
|
//
|
|
@@ -59,9 +60,7 @@ export function capitalize(word) {
|
|
|
59
60
|
// from canvas, there is other code that expects to use
|
|
60
61
|
// jquery data saved in enhanceUserContent, but if not
|
|
61
62
|
// so something useful anyway.
|
|
62
|
-
|
|
63
63
|
/* eslint-disable no-undef */
|
|
64
|
-
|
|
65
64
|
export function setData(elem, key, value) {
|
|
66
65
|
if (typeof $ !== 'undefined') {
|
|
67
66
|
$(elem).data(key, value);
|
|
@@ -74,11 +73,9 @@ export function getData(elem, key) {
|
|
|
74
73
|
if (typeof $ !== 'undefined') {
|
|
75
74
|
return $(elem).data(key);
|
|
76
75
|
}
|
|
77
|
-
|
|
78
76
|
if (elem.data && key in elem.data) {
|
|
79
77
|
return elem.data[key];
|
|
80
78
|
}
|
|
81
|
-
|
|
82
79
|
return elem.getAttribute(`data-${key}`);
|
|
83
80
|
}
|
|
84
81
|
/* eslint-enable no-undef */
|
|
@@ -15,11 +15,13 @@
|
|
|
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
|
const MathJaxDirective = Object.freeze({
|
|
19
20
|
Ignore: 'mathjax_ignore',
|
|
20
21
|
Process: 'mathjax_process'
|
|
21
|
-
});
|
|
22
|
+
});
|
|
22
23
|
|
|
24
|
+
// configure MathJax to use 'color' extension fo LaTeX coding
|
|
23
25
|
const localConfig = {
|
|
24
26
|
TeX: {
|
|
25
27
|
extensions: ['autoload-all.js']
|
|
@@ -47,34 +49,23 @@ const localConfig = {
|
|
|
47
49
|
showMathMenu: true,
|
|
48
50
|
messageStyle: 'none'
|
|
49
51
|
};
|
|
50
|
-
|
|
51
52
|
class Mathml {
|
|
52
|
-
constructor() {
|
|
53
|
-
let features = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
|
54
|
-
let config = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
|
|
53
|
+
constructor(features = {}, config = {}) {
|
|
55
54
|
this._features = features;
|
|
56
55
|
this._config = config;
|
|
57
56
|
}
|
|
58
|
-
|
|
59
|
-
loadMathJax() {
|
|
60
|
-
let configFile = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'TeX-MML-AM_SVG';
|
|
61
|
-
let cb = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;
|
|
62
|
-
|
|
57
|
+
loadMathJax(configFile = 'TeX-MML-AM_SVG', cb = null) {
|
|
63
58
|
if (this.preventMathJax()) {
|
|
64
59
|
return;
|
|
65
60
|
}
|
|
66
|
-
|
|
67
61
|
if (!this.isMathJaxLoaded()) {
|
|
68
|
-
var _this$_features, _this$_config;
|
|
69
|
-
|
|
70
62
|
// Statically declare this in the localConfig above as part of MAT-1219
|
|
71
|
-
if (
|
|
63
|
+
if (this._features?.explicit_latex_typesetting) {
|
|
72
64
|
localConfig.elements = document.getElementsByClassName(MathJaxDirective.Process);
|
|
73
65
|
localConfig.tex2jax.processClass = MathJaxDirective.Process;
|
|
74
66
|
}
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
67
|
+
const locale = this._config?.locale || 'en';
|
|
68
|
+
// signal local config to mathjax as it loads
|
|
78
69
|
window.MathJax = localConfig;
|
|
79
70
|
if (window.MathJaxIsLoading) return;
|
|
80
71
|
window.MathJaxIsLoading = true;
|
|
@@ -85,40 +76,31 @@ class Mathml {
|
|
|
85
76
|
script.onerror = reject;
|
|
86
77
|
script.async = true;
|
|
87
78
|
script.src = `//cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.7/MathJax.js?config=${configFile}&locale=${locale}`;
|
|
88
|
-
});
|
|
89
|
-
|
|
79
|
+
});
|
|
90
80
|
scriptPromise.then(() => {
|
|
91
|
-
var _this$_features2;
|
|
92
|
-
|
|
93
81
|
window.MathJax.Hub.Register.StartupHook('MathMenu Ready', function () {
|
|
94
82
|
// get the mathjax context menu above the rce's equation editor
|
|
95
83
|
window.MathJax.Menu.BGSTYLE['z-index'] = 2000;
|
|
96
84
|
});
|
|
97
85
|
window.MathJax.Hub.Register.StartupHook('End Config', function () {
|
|
98
86
|
// wait until MathJAx is configured before calling the callback
|
|
99
|
-
cb
|
|
87
|
+
cb?.();
|
|
100
88
|
});
|
|
101
|
-
|
|
102
|
-
if ((_this$_features2 = this._features) !== null && _this$_features2 !== void 0 && _this$_features2.new_math_equation_handling) {
|
|
89
|
+
if (this._features?.new_math_equation_handling) {
|
|
103
90
|
window.MathJax.Hub.Register.MessageHook('Begin PreProcess', function (message) {
|
|
104
91
|
mathImageHelper.catchEquationImages(message[1]);
|
|
105
92
|
});
|
|
106
93
|
window.MathJax.Hub.Register.MessageHook('Math Processing Error', function (message) {
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
if ((_elem$parentElement = elem.parentElement) !== null && _elem$parentElement !== void 0 && _elem$parentElement.classList.contains('math_equation_latex')) {
|
|
112
|
-
var _elem$parentElement$p;
|
|
113
|
-
|
|
94
|
+
const elem = Array.isArray(message[1]) ? message[1][0] : message[1];
|
|
95
|
+
// ".math_equation_latex" is the elem we added for MathJax to typeset the image equation
|
|
96
|
+
if (elem.parentElement?.classList.contains('math_equation_latex')) {
|
|
114
97
|
// The equation we image we were trying to replace and failed is up 1 and back 1.
|
|
115
98
|
// If we remove its "mathjaxified" attribute, the "End Math" handler
|
|
116
99
|
// won't remove it from the DOM.
|
|
117
|
-
if (
|
|
100
|
+
if (elem.parentElement.previousElementSibling?.hasAttribute('mathjaxified')) {
|
|
118
101
|
elem.parentElement.previousElementSibling.removeAttribute('mathjaxified');
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
|
|
102
|
+
}
|
|
103
|
+
// remove the "math processing error" mathjax output.
|
|
122
104
|
elem.parentElement.remove();
|
|
123
105
|
}
|
|
124
106
|
});
|
|
@@ -144,15 +126,15 @@ class Mathml {
|
|
|
144
126
|
element.remove();
|
|
145
127
|
});
|
|
146
128
|
});
|
|
147
|
-
}
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
// leaving this here so I don't have to keep looking up how to see all messages
|
|
148
132
|
// window.MathJax.Hub.Startup.signal.Interest(function (message) {
|
|
149
133
|
// console.log('>>> MathJax startup:', message)
|
|
150
134
|
// })
|
|
151
135
|
// window.MathJax.Hub.signal.Interest(function(message) {
|
|
152
136
|
// console.log('>>> MathJax signal', message)
|
|
153
137
|
// })
|
|
154
|
-
|
|
155
|
-
|
|
156
138
|
delete window.MathJaxIsLoading;
|
|
157
139
|
});
|
|
158
140
|
} else {
|
|
@@ -161,116 +143,95 @@ class Mathml {
|
|
|
161
143
|
// something has changed on the page and needs to get pulled into the MathJax ecosystem
|
|
162
144
|
// window.MathJax.Hub.Reprocess([document.body])
|
|
163
145
|
window.MathJax.Hub.Queue(['Typeset', window.MathJax.Hub]);
|
|
164
|
-
cb
|
|
146
|
+
cb?.();
|
|
165
147
|
}
|
|
166
148
|
}
|
|
167
|
-
|
|
168
149
|
preventMathJax() {
|
|
169
150
|
return /(?:rubrics|\/files)/.test(window.location.pathname);
|
|
170
151
|
}
|
|
171
|
-
|
|
172
152
|
isMathOnPage() {
|
|
173
153
|
return this.isMathInElement(document.body);
|
|
174
154
|
}
|
|
175
|
-
|
|
176
155
|
isMathInElement(elem) {
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
if ((elem === null || elem === void 0 ? void 0 : elem.getAttribute('data-testid')) === 'mathml-preview-element') {
|
|
156
|
+
if (elem?.getAttribute('data-testid') === 'mathml-preview-element') {
|
|
180
157
|
return true;
|
|
181
158
|
}
|
|
182
|
-
|
|
183
|
-
if ((_this$_features3 = this._features) !== null && _this$_features3 !== void 0 && _this$_features3.new_math_equation_handling) {
|
|
159
|
+
if (this._features?.new_math_equation_handling) {
|
|
184
160
|
// handle the change from image + hidden mathml to mathjax formatted latex
|
|
185
161
|
if (elem.querySelector('.math_equation_latex,.math_equation_mml')) {
|
|
186
162
|
return true;
|
|
187
163
|
}
|
|
188
|
-
|
|
189
164
|
if (elem.querySelector('img.equation_image')) {
|
|
190
165
|
return true;
|
|
191
|
-
}
|
|
192
|
-
// looking for mathjax's opening delimiters
|
|
193
|
-
|
|
166
|
+
}
|
|
194
167
|
|
|
168
|
+
// look for latex the user may have entered w/o the equation editor by
|
|
169
|
+
// looking for mathjax's opening delimiters
|
|
195
170
|
if (/(?:\$\$|\\\()/.test(elem.textContent)) {
|
|
196
171
|
return true;
|
|
197
172
|
}
|
|
198
173
|
}
|
|
199
|
-
|
|
200
174
|
const mathElements = elem.getElementsByTagName('math');
|
|
201
|
-
|
|
202
175
|
for (let i = 0; i < mathElements.length; i++) {
|
|
203
176
|
const el = mathElements[i];
|
|
204
|
-
|
|
205
177
|
if (el.offsetParent !== null && !el.closest('.hidden-readable') && !el.closest('.MJX_Assistive_MathML') // already mathjax'd
|
|
206
178
|
) {
|
|
207
179
|
return true;
|
|
208
180
|
}
|
|
209
181
|
}
|
|
210
|
-
|
|
211
182
|
return false;
|
|
212
183
|
}
|
|
213
|
-
|
|
214
184
|
get mathJaxGenerated() {
|
|
215
185
|
return /^MathJax|MJX/;
|
|
216
|
-
}
|
|
217
|
-
|
|
186
|
+
}
|
|
218
187
|
|
|
188
|
+
// elements to ignore selector
|
|
219
189
|
get ignore_list() {
|
|
220
190
|
return '#header,#mobile-header,#left-side,#quiz-elapsed-time,.ui-menu-carat';
|
|
221
191
|
}
|
|
222
|
-
|
|
223
192
|
isMathJaxIgnored(elem) {
|
|
224
|
-
var _this$_features4, _elem$parentElement2;
|
|
225
|
-
|
|
226
193
|
if (!elem) return true;
|
|
227
|
-
|
|
228
|
-
if ((_this$_features4 = this._features) !== null && _this$_features4 !== void 0 && _this$_features4.explicit_latex_typesetting && !elem.classList.contains(MathJaxDirective.Process)) {
|
|
194
|
+
if (this._features?.explicit_latex_typesetting && !elem.classList.contains(MathJaxDirective.Process)) {
|
|
229
195
|
return true;
|
|
230
|
-
}
|
|
231
|
-
|
|
196
|
+
}
|
|
232
197
|
|
|
233
|
-
|
|
198
|
+
// ignore disconnected elements
|
|
199
|
+
if (!document.body.contains(elem)) return true;
|
|
234
200
|
|
|
235
|
-
|
|
201
|
+
// check if elem is in the ignore list
|
|
202
|
+
if (elem.parentElement?.querySelector(this.ignore_list) === elem) {
|
|
236
203
|
return true;
|
|
237
|
-
}
|
|
238
|
-
|
|
204
|
+
}
|
|
239
205
|
|
|
206
|
+
// check if elem is a child of something we're ignoring
|
|
240
207
|
while (elem !== document.body) {
|
|
241
208
|
// child of ignored element?
|
|
242
209
|
if (elem.classList.contains(MathJaxDirective.Ignore)) {
|
|
243
210
|
return true;
|
|
244
|
-
}
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
// // child of MathJax generated element?
|
|
245
214
|
// if (
|
|
246
215
|
// this.mathJaxGenerated.test(elem.id) ||
|
|
247
216
|
// this.mathJaxGenerated.test(elem.getAttribute('class'))
|
|
248
217
|
// ) {
|
|
249
218
|
// return true
|
|
250
219
|
// }
|
|
251
|
-
|
|
252
|
-
|
|
253
220
|
elem = elem.parentElement;
|
|
254
221
|
}
|
|
255
|
-
|
|
256
222
|
return false;
|
|
257
|
-
}
|
|
258
|
-
|
|
223
|
+
}
|
|
259
224
|
|
|
225
|
+
// legacy api
|
|
260
226
|
isMathMLOnPage() {
|
|
261
227
|
return this.isMathOnPage();
|
|
262
228
|
}
|
|
263
|
-
|
|
264
229
|
isMathJaxLoaded() {
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
return !!((_window$MathJax = window.MathJax) !== null && _window$MathJax !== void 0 && _window$MathJax.Hub);
|
|
230
|
+
return !!window.MathJax?.Hub;
|
|
268
231
|
}
|
|
269
|
-
|
|
270
232
|
shouldProcess(elem) {
|
|
271
233
|
return this.isMathInElement(elem) && !this.isMathJaxIgnored(elem);
|
|
272
234
|
}
|
|
273
|
-
|
|
274
235
|
processNewMathInElem(elem) {
|
|
275
236
|
if (this.shouldProcess(elem)) {
|
|
276
237
|
if (this.isMathJaxLoaded()) {
|
|
@@ -280,53 +241,43 @@ class Mathml {
|
|
|
280
241
|
}
|
|
281
242
|
}
|
|
282
243
|
}
|
|
244
|
+
|
|
283
245
|
/*
|
|
284
246
|
* elem: string with elementId or en elem object
|
|
285
247
|
*/
|
|
286
|
-
|
|
287
|
-
|
|
288
248
|
reloadElement(elem) {
|
|
289
249
|
if (this.isMathJaxLoaded()) {
|
|
290
250
|
window.MathJax.Hub.Queue(['Typeset', window.MathJax.Hub, elem]);
|
|
291
251
|
}
|
|
292
252
|
}
|
|
293
|
-
|
|
294
253
|
static get processNewMathEventName() {
|
|
295
254
|
return 'process-new-math';
|
|
296
255
|
}
|
|
297
|
-
|
|
298
256
|
}
|
|
299
|
-
|
|
300
257
|
const mathImageHelper = {
|
|
301
258
|
getImageEquationText(img) {
|
|
302
259
|
let equation_text;
|
|
303
260
|
const src = img.getAttribute('src');
|
|
304
|
-
|
|
305
261
|
if (src) {
|
|
306
262
|
try {
|
|
307
263
|
const url = new URL(src, 'http://localhost'); // we don't care about the host
|
|
308
|
-
|
|
309
264
|
const srceq = url.pathname.split('/equation_images/')[1];
|
|
310
|
-
|
|
311
265
|
if (srceq) {
|
|
312
266
|
equation_text = decodeURIComponent(decodeURIComponent(srceq));
|
|
313
267
|
}
|
|
314
|
-
} catch (_ex) {
|
|
268
|
+
} catch (_ex) {
|
|
269
|
+
// If we failed to parse the src URL, something is wrong.
|
|
315
270
|
}
|
|
316
271
|
}
|
|
317
|
-
|
|
318
272
|
return equation_text;
|
|
319
273
|
},
|
|
320
|
-
|
|
321
274
|
catchEquationImages(refnode) {
|
|
322
|
-
refnode = Array.isArray(refnode) ? refnode[0] : refnode;
|
|
323
|
-
|
|
275
|
+
refnode = Array.isArray(refnode) ? refnode[0] : refnode;
|
|
276
|
+
// find equation images and replace with inline LaTeX
|
|
324
277
|
const eqimgs = refnode.querySelectorAll('img.equation_image');
|
|
325
|
-
|
|
326
278
|
if (eqimgs.length > 0) {
|
|
327
279
|
eqimgs.forEach(img => {
|
|
328
280
|
const equation_text = this.getImageEquationText(img);
|
|
329
|
-
|
|
330
281
|
if (equation_text) {
|
|
331
282
|
img.setAttribute('mathjaxified', '');
|
|
332
283
|
const mathtex = document.createElement('span');
|
|
@@ -334,7 +285,6 @@ const mathImageHelper = {
|
|
|
334
285
|
mathtex.setAttribute('style', img.getAttribute('style'));
|
|
335
286
|
mathtex.textContent = `\\(${equation_text}\\)`;
|
|
336
287
|
mathtex.style.maxWidth = '';
|
|
337
|
-
|
|
338
288
|
if (img.nextSibling) {
|
|
339
289
|
img.parentElement.insertBefore(mathtex, img.nextSibling);
|
|
340
290
|
} else {
|
|
@@ -345,7 +295,6 @@ const mathImageHelper = {
|
|
|
345
295
|
return true;
|
|
346
296
|
}
|
|
347
297
|
},
|
|
348
|
-
|
|
349
298
|
removeStrayEquationImages(refnode) {
|
|
350
299
|
const eqimgs = refnode.querySelectorAll('img.equation_image');
|
|
351
300
|
eqimgs.forEach(img => {
|
|
@@ -354,37 +303,30 @@ const mathImageHelper = {
|
|
|
354
303
|
}
|
|
355
304
|
});
|
|
356
305
|
},
|
|
357
|
-
|
|
358
306
|
nearlyInfiniteStyleFix(elem) {
|
|
359
307
|
elem.querySelectorAll('[style*=clip], [style*=vertical-align]').forEach(e => {
|
|
360
308
|
let changed = false;
|
|
361
309
|
let s = e.getAttribute('style');
|
|
362
310
|
const r = e.style.clip;
|
|
363
|
-
|
|
364
311
|
if (/[\d.]+e\+?\d/.test(r)) {
|
|
365
312
|
// e.g. "rect(1e+07em, -9.999e+06em, -1e+07em, -999.997em)"
|
|
366
313
|
s = s.replace(/clip: rect[^;]+;/, '');
|
|
367
314
|
changed = true;
|
|
368
315
|
}
|
|
369
|
-
|
|
370
316
|
const v = e.style.verticalAlign;
|
|
371
|
-
|
|
372
317
|
if (Math.abs(parseFloat(v)) > 10000) {
|
|
373
318
|
// 10000 is a ridiculously large number
|
|
374
319
|
s = s.replace(/vertical-align[^;]+;/, '');
|
|
375
320
|
changed = true;
|
|
376
321
|
}
|
|
377
|
-
|
|
378
322
|
if (changed) {
|
|
379
323
|
e.setAttribute('style', s);
|
|
380
324
|
}
|
|
381
325
|
});
|
|
382
326
|
}
|
|
383
|
-
|
|
384
327
|
};
|
|
385
|
-
|
|
386
328
|
function handleNewMath(event) {
|
|
387
|
-
if (event
|
|
329
|
+
if (event?.detail) {
|
|
388
330
|
const {
|
|
389
331
|
features,
|
|
390
332
|
config,
|
|
@@ -394,6 +336,5 @@ function handleNewMath(event) {
|
|
|
394
336
|
mathml.processNewMathInElem(target);
|
|
395
337
|
}
|
|
396
338
|
}
|
|
397
|
-
|
|
398
339
|
window.addEventListener(Mathml.processNewMathEventName, handleNewMath);
|
|
399
340
|
export { Mathml, mathImageHelper, MathJaxDirective };
|