@instructure/canvas-rce 5.14.0 → 5.14.2
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 +33 -0
- package/DEVELOPMENT.md +1 -1
- 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/__tests__/sidebar/reducers/all_files.test.js +28 -0
- package/babel.config.js +3 -1
- package/build.sh +7 -7
- package/es/bridge/Bridge.js +8 -56
- package/es/bridge/index.js +1 -0
- package/es/canvasFileBrowser/FileBrowser.js +12 -59
- package/es/canvasFileBrowser/en-US.js +3 -6
- package/es/common/FlashAlert.js +7 -28
- package/es/common/browser.js +4 -2
- package/es/common/fileUrl.js +104 -59
- package/es/common/incremental-loading/LoadMoreButton.js +1 -0
- package/es/common/incremental-loading/LoadingIndicator.js +1 -2
- package/es/common/incremental-loading/LoadingStatus.js +1 -2
- package/es/common/incremental-loading/index.js +1 -0
- package/es/common/incremental-loading/useIncrementalLoading.js +1 -3
- package/es/common/indicate.js +15 -8
- 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 +17 -28
- package/es/enhance-user-content/enhance_user_content.js +28 -60
- package/es/enhance-user-content/external_links.js +5 -8
- package/es/enhance-user-content/index.js +1 -0
- package/es/enhance-user-content/instructure_helper.js +25 -38
- package/es/enhance-user-content/jqueryish_funcs.js +8 -11
- package/es/enhance-user-content/mathml.js +35 -82
- package/es/enhance-user-content/media_comment_thumbnail.js +5 -17
- package/es/format-message.js +3 -4
- package/es/getThemeVars.js +8 -6
- package/es/getTranslations.js +1 -78
- package/es/index.js +3 -1
- package/es/rce/AlertMessageArea.js +1 -1
- package/es/rce/DraggingBlocker.js +4 -2
- package/es/rce/KeyboardShortcutModal.js +1 -0
- package/es/rce/RCE.js +12 -11
- package/es/rce/RCEGlobals.js +12 -10
- package/es/rce/RCEVariants.js +27 -10
- package/es/rce/RCEWrapper.js +167 -386
- package/es/rce/RCEWrapperProps.js +8 -3
- package/es/rce/RceHtmlEditor.js +5 -8
- package/es/rce/ResizeHandle.js +3 -8
- package/es/rce/RestoreAutoSaveModal.js +1 -2
- package/es/rce/ShowOnFocusButton/index.js +0 -6
- package/es/rce/StatusBar.js +8 -37
- package/es/rce/alertHandler.js +1 -4
- package/es/rce/contentInsertion.js +35 -57
- package/es/rce/contentInsertionUtils.js +6 -8
- package/es/rce/contentRendering.js +7 -12
- package/es/rce/customEvents.js +1 -0
- package/es/rce/editorLanguage.js +22 -10
- package/es/rce/indicatorRegion.js +6 -5
- package/es/rce/normalizeLocale.js +5 -3
- package/es/rce/normalizeProps.js +3 -1
- package/es/rce/plugins/instructure-ui-icons/plugin.js +21 -3
- package/es/rce/plugins/instructure_color/clickCallback.js +84 -0
- package/es/rce/plugins/instructure_color/components/ColorPicker.js +299 -0
- package/es/rce/plugins/instructure_color/components/ColorPopup.js +68 -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 +22 -15
- package/es/rce/plugins/instructure_condensed_buttons/ui/subscript-superscript-button.js +1 -2
- 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 +3 -18
- 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 +12 -29
- package/es/rce/plugins/instructure_equation/EquationEditorModal/latexTextareaUtil.js +11 -12
- package/es/rce/plugins/instructure_equation/EquationEditorModal/parseLatex.js +4 -3
- package/es/rce/plugins/instructure_equation/EquationEditorModal/styles.js +4 -2
- package/es/rce/plugins/instructure_equation/EquationEditorToolbar/buttons.js +13 -7
- package/es/rce/plugins/instructure_equation/EquationEditorToolbar/index.js +4 -7
- package/es/rce/plugins/instructure_equation/MathIcon/index.js +1 -1
- 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 +1 -1
- package/es/rce/plugins/instructure_equation/plugin.js +7 -10
- package/es/rce/plugins/instructure_fullscreen/plugin.js +3 -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 +2 -4
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ColorSection.js +1 -2
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/CreateIconMakerForm.js +1 -0
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/Footer.js +1 -0
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/Group.js +1 -0
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/Header.js +1 -2
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/Course.js +25 -22
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/ImageOptions.js +7 -11
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/ImageSection.js +27 -23
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/ModeSelect.js +5 -4
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/MultiColor/index.js +11 -9
- 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 +5 -4
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/SVGThumbnail.js +1 -3
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/SingleColor/index.js +7 -7
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/SingleColor/svg.js +1 -0
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/Upload.js +27 -20
- 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 +1 -0
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/Preview.js +4 -4
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ShapeSection.js +1 -2
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/TextSection.js +1 -5
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/index.js +1 -0
- package/es/rce/plugins/instructure_icon_maker/components/IconMakerTray.js +18 -33
- 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 +1 -3
- 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 +69 -83
- package/es/rce/plugins/instructure_icon_maker/svg/index.js +11 -15
- package/es/rce/plugins/instructure_icon_maker/svg/metadata.js +1 -0
- package/es/rce/plugins/instructure_icon_maker/svg/settings.js +32 -39
- package/es/rce/plugins/instructure_icon_maker/svg/shape.js +1 -49
- package/es/rce/plugins/instructure_icon_maker/svg/text.js +7 -92
- package/es/rce/plugins/instructure_icon_maker/svg/utils.js +1 -7
- package/es/rce/plugins/instructure_icon_maker/utils/IconMakerClose.js +2 -6
- 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 +1 -1
- 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 +6 -24
- package/es/rce/plugins/instructure_image/ImageList/Image.js +1 -6
- package/es/rce/plugins/instructure_image/ImageList/index.js +1 -2
- package/es/rce/plugins/instructure_image/ImageOptionsTray/TrayController.js +7 -27
- package/es/rce/plugins/instructure_image/ImageOptionsTray/index.js +3 -16
- 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 +13 -18
- package/es/rce/plugins/instructure_links/clickCallback.js +1 -0
- package/es/rce/plugins/instructure_links/components/AccordionSection.js +1 -0
- package/es/rce/plugins/instructure_links/components/CollectionPanel.js +1 -3
- package/es/rce/plugins/instructure_links/components/Link.js +7 -19
- package/es/rce/plugins/instructure_links/components/LinkOptionsDialog/LinkOptionsDialogController.js +1 -21
- package/es/rce/plugins/instructure_links/components/LinkOptionsDialog/index.js +1 -4
- package/es/rce/plugins/instructure_links/components/LinkOptionsTray/LinkOptionsTrayController.js +3 -20
- package/es/rce/plugins/instructure_links/components/LinkOptionsTray/index.js +1 -12
- package/es/rce/plugins/instructure_links/components/LinkSet.js +4 -20
- package/es/rce/plugins/instructure_links/components/LinksPanel.js +1 -2
- package/es/rce/plugins/instructure_links/components/NavigationPanel.js +7 -9
- package/es/rce/plugins/instructure_links/components/NoResults.js +1 -7
- package/es/rce/plugins/instructure_links/plugin.js +17 -40
- package/es/rce/plugins/instructure_links/validateURL.js +81 -36
- package/es/rce/plugins/instructure_media_embed/clickCallback.js +2 -5
- package/es/rce/plugins/instructure_media_embed/components/Embed.js +1 -0
- 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 +27 -29
- package/es/rce/plugins/instructure_rce_external_tools/ExternalToolsEnv.js +14 -53
- package/es/rce/plugins/instructure_rce_external_tools/RceToolWrapper.js +21 -49
- package/es/rce/plugins/instructure_rce_external_tools/components/ExternalToolDialog/ExternalToolDialog.js +11 -42
- 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 +2 -10
- 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 +19 -4
- 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 +130 -136
- package/es/rce/plugins/instructure_rce_external_tools/lti11-content-items/RceLti11ContentItem.js +100 -95
- 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 +2 -19
- package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/models/BaseLinkContentItem.js +1 -14
- 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 +18 -10
- package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/rceLti13ContentItemFromJson.js +4 -4
- package/es/rce/plugins/instructure_rce_external_tools/plugin.js +7 -16
- package/es/rce/plugins/instructure_rce_external_tools/util/addParentFrameContextToUrl.js +1 -1
- package/es/rce/plugins/instructure_record/AudioOptionsTray/TrayController.js +1 -25
- package/es/rce/plugins/instructure_record/AudioOptionsTray/index.js +1 -4
- package/es/rce/plugins/instructure_record/MediaPanel/index.js +1 -9
- package/es/rce/plugins/instructure_record/VideoOptionsTray/TrayController.js +8 -51
- package/es/rce/plugins/instructure_record/VideoOptionsTray/index.js +4 -17
- package/es/rce/plugins/instructure_record/clickCallback.js +7 -15
- 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 +2 -5
- package/es/rce/plugins/instructure_search_and_replace/components/FindReplaceTray.js +20 -35
- package/es/rce/plugins/instructure_search_and_replace/components/FindReplaceTrayController.js +3 -18
- package/es/rce/plugins/instructure_search_and_replace/getSelectionContext.js +2 -9
- package/es/rce/plugins/instructure_search_and_replace/plugin.js +1 -3
- package/es/rce/plugins/instructure_studio_media_options/plugin.js +1 -1
- package/es/rce/plugins/instructure_wordcount/clickCallback.js +2 -5
- package/es/rce/plugins/instructure_wordcount/components/WordCountModal.js +1 -4
- package/es/rce/plugins/instructure_wordcount/plugin.js +1 -0
- package/es/rce/plugins/instructure_wordcount/utils/countContent.js +1 -8
- package/es/rce/plugins/instructure_wordcount/utils/tableContent.js +1 -0
- package/es/rce/plugins/shared/CanvasContentTray.js +43 -63
- package/es/rce/plugins/shared/CheckerboardStyling.js +1 -1
- package/es/rce/plugins/shared/ColorInput.js +5 -14
- package/es/rce/plugins/shared/ConditionalTooltip.js +1 -0
- package/es/rce/plugins/shared/ContentSelection.js +17 -58
- package/es/rce/plugins/shared/DimensionUtils.js +1 -8
- 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 +1 -3
- package/es/rce/plugins/shared/Filter.js +8 -38
- package/es/rce/plugins/shared/FixedContentTray.js +3 -3
- package/es/rce/plugins/shared/ImageCropper/DirectionRegion.js +1 -8
- package/es/rce/plugins/shared/ImageCropper/Modal.js +4 -7
- package/es/rce/plugins/shared/ImageCropper/Preview.js +7 -11
- package/es/rce/plugins/shared/ImageCropper/constants.js +1 -0
- package/es/rce/plugins/shared/ImageCropper/controls/CustomNumberInput.js +2 -5
- package/es/rce/plugins/shared/ImageCropper/controls/ResetControls.js +1 -0
- package/es/rce/plugins/shared/ImageCropper/controls/RotationControls.js +1 -10
- package/es/rce/plugins/shared/ImageCropper/controls/ShapeControls.js +1 -0
- package/es/rce/plugins/shared/ImageCropper/controls/ZoomControls.js +1 -11
- package/es/rce/plugins/shared/ImageCropper/controls/index.js +1 -0
- package/es/rce/plugins/shared/ImageCropper/controls/useDebouncedNumericValue.js +3 -16
- package/es/rce/plugins/shared/ImageCropper/controls/utils.js +1 -2
- package/es/rce/plugins/shared/ImageCropper/imageCropUtils.js +1 -10
- 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 +1 -17
- package/es/rce/plugins/shared/ImageCropper/svg/utils.js +1 -0
- package/es/rce/plugins/shared/ImageCropper/useKeyMouseEvents.js +19 -46
- package/es/rce/plugins/shared/ImageCropper/useMouseWheel.js +8 -10
- package/es/rce/plugins/shared/ImageOptionsForm.js +1 -2
- package/es/rce/plugins/shared/LinkDisplay.js +1 -2
- package/es/rce/plugins/shared/PreviewIcon.js +1 -6
- package/es/rce/plugins/shared/Previewable.js +1 -0
- package/es/rce/plugins/shared/RceFileBrowser.js +5 -7
- package/es/rce/plugins/shared/StoreContext.js +1 -2
- package/es/rce/plugins/shared/StudioLtiSupportUtils.js +10 -6
- package/es/rce/plugins/shared/UnknownFileTypePanel.js +1 -0
- package/es/rce/plugins/shared/Upload/CanvasContentPanel.js +13 -18
- package/es/rce/plugins/shared/Upload/CategoryProcessor.js +1 -1
- package/es/rce/plugins/shared/Upload/ComputerPanel.js +8 -26
- package/es/rce/plugins/shared/Upload/PanelFilter.js +3 -12
- package/es/rce/plugins/shared/Upload/SvgCategoryProcessor.js +4 -3
- package/es/rce/plugins/shared/Upload/UploadFile.js +15 -18
- package/es/rce/plugins/shared/Upload/UploadFileModal.js +9 -25
- package/es/rce/plugins/shared/Upload/UrlPanel.js +1 -0
- package/es/rce/plugins/shared/Upload/UsageRightsSelectBox.js +7 -12
- package/es/rce/plugins/shared/Upload/doFileUpload.js +4 -6
- package/es/rce/plugins/shared/Upload/index.js +1 -0
- package/es/rce/plugins/shared/ai_tools/AIResponseModal.js +1 -3
- package/es/rce/plugins/shared/ai_tools/AIToolsTray.js +6 -24
- package/es/rce/plugins/shared/ai_tools/aiicons.js +1 -0
- 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 +6 -9
- package/es/rce/plugins/shared/compressionUtils.js +1 -8
- 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 +7 -10
- 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 +32 -42
- 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 +1 -0
- package/es/rce/plugins/shared/trayUtils.js +4 -3
- package/es/rce/plugins/shared/useDataUrl.js +9 -9
- package/es/rce/plugins/shared/useFilterSettings.js +3 -3
- package/es/rce/plugins/tinymce-a11y-checker/components/ColorField.js +2 -6
- package/es/rce/plugins/tinymce-a11y-checker/components/checker.js +5 -63
- 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 +1 -6
- package/es/rce/plugins/tinymce-a11y-checker/plugin.js +4 -7
- 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 +1 -5
- 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 +1 -4
- 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 +1 -6
- 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 +1 -26
- package/es/rce/plugins/tinymce-a11y-checker/utils/indicate.js +16 -15
- package/es/rce/plugins/tinymce-a11y-checker/utils/rgb-hex.js +7 -10
- package/es/rce/plugins/tinymce-a11y-checker/utils/strings.js +1 -4
- package/es/rce/root.js +9 -8
- package/es/rce/sanitizePlugins.js +1 -3
- package/es/rce/style.js +1 -4
- package/es/rce/tinyRCE.js +13 -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 +8 -10
- 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 +61 -116
- package/es/rcs/buildError.js +5 -17
- package/es/rcs/fake.js +4 -13
- package/es/sidebar/actions/all_files.js +2 -0
- package/es/sidebar/actions/data.js +4 -7
- package/es/sidebar/actions/documents.js +9 -6
- package/es/sidebar/actions/files.js +3 -6
- package/es/sidebar/actions/filter.js +1 -0
- package/es/sidebar/actions/flickr.js +1 -1
- package/es/sidebar/actions/images.js +12 -11
- package/es/sidebar/actions/links.js +1 -0
- package/es/sidebar/actions/media.js +12 -10
- package/es/sidebar/actions/session.js +1 -3
- package/es/sidebar/actions/ui.js +1 -0
- package/es/sidebar/actions/upload.js +14 -39
- package/es/sidebar/containers/Sidebar.js +1 -2
- package/es/sidebar/containers/sidebarHandlers.js +3 -1
- package/es/sidebar/dragHtml.js +5 -3
- package/es/sidebar/reducers/all_files.js +4 -3
- package/es/sidebar/reducers/collection.js +12 -13
- package/es/sidebar/reducers/collections.js +5 -5
- package/es/sidebar/reducers/documents.js +6 -13
- package/es/sidebar/reducers/files.js +3 -3
- package/es/sidebar/reducers/filter.js +1 -8
- package/es/sidebar/reducers/flickr.js +9 -9
- package/es/sidebar/reducers/folder.js +15 -15
- package/es/sidebar/reducers/folders.js +3 -3
- package/es/sidebar/reducers/images.js +3 -13
- package/es/sidebar/reducers/index.js +3 -1
- package/es/sidebar/reducers/media.js +6 -13
- package/es/sidebar/reducers/newPageLinkExpanded.js +1 -2
- package/es/sidebar/reducers/noop.js +1 -0
- package/es/sidebar/reducers/rootFolderId.js +1 -2
- package/es/sidebar/reducers/session.js +3 -3
- package/es/sidebar/reducers/ui.js +3 -16
- package/es/sidebar/reducers/upload.js +8 -40
- package/es/sidebar/store/configureStore.js +1 -0
- package/es/sidebar/store/initialState.js +13 -24
- package/es/translations/locales/ab.js +1 -0
- package/es/translations/locales/ar.js +67 -9
- package/es/translations/locales/ca.js +67 -9
- package/es/translations/locales/cs.js +1 -0
- package/es/translations/locales/cs_CZ.js +1 -0
- package/es/translations/locales/cy.js +67 -9
- package/es/translations/locales/da-x-k12.js +67 -9
- package/es/translations/locales/da.js +67 -9
- package/es/translations/locales/da_DK.js +1 -0
- package/es/translations/locales/de.js +67 -9
- package/es/translations/locales/el.js +4 -0
- package/es/translations/locales/en-AU-x-unimelb.js +67 -9
- package/es/translations/locales/en-GB-x-ukhe.js +67 -9
- package/es/translations/locales/en.js +72 -8
- package/es/translations/locales/en_AU.js +67 -9
- package/es/translations/locales/en_CA.js +67 -9
- package/es/translations/locales/en_CY.js +67 -9
- package/es/translations/locales/en_GB.js +67 -9
- 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 +67 -9
- package/es/translations/locales/es_ES.js +67 -9
- package/es/translations/locales/es_GT.js +1 -0
- package/es/translations/locales/fa_IR.js +7 -0
- package/es/translations/locales/fi.js +67 -9
- package/es/translations/locales/fr.js +67 -9
- package/es/translations/locales/fr_CA.js +68 -10
- package/es/translations/locales/ga.js +5 -13
- package/es/translations/locales/he.js +7 -0
- package/es/translations/locales/hi.js +67 -9
- package/es/translations/locales/ht.js +67 -9
- 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 +67 -9
- package/es/translations/locales/id_ID.js +1 -0
- package/es/translations/locales/is.js +67 -9
- package/es/translations/locales/it.js +67 -9
- package/es/translations/locales/ja.js +67 -9
- 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 +67 -9
- package/es/translations/locales/mn_MN.js +1 -0
- package/es/translations/locales/ms.js +67 -9
- package/es/translations/locales/nb-x-k12.js +67 -9
- package/es/translations/locales/nb.js +67 -9
- package/es/translations/locales/nl.js +67 -9
- package/es/translations/locales/nl_NL.js +1 -0
- package/es/translations/locales/nn.js +7 -6
- package/es/translations/locales/pl.js +67 -9
- package/es/translations/locales/pt.js +67 -9
- package/es/translations/locales/pt_BR.js +67 -9
- package/es/translations/locales/ro.js +1 -0
- package/es/translations/locales/ru.js +67 -9
- package/es/translations/locales/se.js +1 -0
- package/es/translations/locales/sl.js +67 -9
- package/es/translations/locales/sv-x-k12.js +67 -9
- package/es/translations/locales/sv.js +67 -9
- package/es/translations/locales/sv_SE.js +1 -0
- package/es/translations/locales/tg.js +1 -0
- package/es/translations/locales/th.js +67 -9
- 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 +67 -9
- package/es/translations/locales/vi_VN.js +1 -0
- package/es/translations/locales/zh-Hans.js +67 -9
- package/es/translations/locales/zh-Hant.js +67 -9
- package/es/translations/locales/zh.js +67 -9
- package/es/translations/locales/zh_HK.js +67 -9
- 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/encrypted-storage.js +3 -13
- package/es/util/file-url-util.js +1 -6
- package/es/util/fullscreenHelpers.js +4 -1
- package/es/util/instui-icon-helper.js +4 -3
- package/es/util/loadingPlaceholder.js +38 -39
- package/es/util/simpleCache.js +0 -3
- 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 +16 -25
- package/eslint.config.js +239 -0
- package/jest.config.js +1 -1
- package/package.json +77 -82
- package/scripts/build-canvas +2 -1
- package/scripts/build.js +4 -4
- package/scripts/publish_to_npm.sh +1 -1
- 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 +20 -15
- package/.eslintrc +0 -45
- package/.prettierignore +0 -6
- package/es/common/components/FileTree/File.js +0 -64
- package/es/common/components/FileTree/Folder.js +0 -110
- package/es/common/components/FileTree/index.js +0 -84
- package/es/common/components/FileTree/styles.js +0 -72
- package/es/common/components/Loading.js +0 -83
|
@@ -15,8 +15,10 @@
|
|
|
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 { changeTag } from '../utils/dom';
|
|
21
|
+
|
|
20
22
|
/* Headings Sequence rule
|
|
21
23
|
* this rule is ensuring that heading tags (H1-H6) are layed out in sequential
|
|
22
24
|
* order for organizing your site.
|
|
@@ -40,106 +42,81 @@ const isHtag = elem => {
|
|
|
40
42
|
H6: true
|
|
41
43
|
};
|
|
42
44
|
return elem && allHTags[elem.tagName] === true;
|
|
43
|
-
};
|
|
44
|
-
|
|
45
|
+
};
|
|
45
46
|
|
|
47
|
+
// gets the H tag that is furthest down in the tree from elem(inclusive)
|
|
46
48
|
const getHighestOrderHForElem = elem => {
|
|
47
49
|
const allHForElem = Array.prototype.slice.call(elem.querySelectorAll('H1,H2,H3,H4,H5,H6'));
|
|
48
|
-
|
|
49
50
|
if (allHForElem.length > 0) {
|
|
50
51
|
return allHForElem.reverse()[0];
|
|
51
52
|
}
|
|
52
|
-
|
|
53
53
|
if (isHtag(elem)) {
|
|
54
54
|
return elem;
|
|
55
55
|
}
|
|
56
|
-
|
|
57
56
|
return undefined;
|
|
58
|
-
};
|
|
59
|
-
// elem
|
|
60
|
-
|
|
57
|
+
};
|
|
61
58
|
|
|
59
|
+
// gets all siblings of elem that come before the elem ordered by nearest to
|
|
60
|
+
// elem
|
|
62
61
|
const getPrevSiblings = elem => {
|
|
63
62
|
const ret = [];
|
|
64
|
-
|
|
65
63
|
if (!elem || !elem.parentElement || !elem.parentElement.children) {
|
|
66
64
|
return ret;
|
|
67
65
|
}
|
|
68
|
-
|
|
69
66
|
const sibs = elem.parentElement.children;
|
|
70
|
-
|
|
71
67
|
for (let i = 0; i < sibs.length; i++) {
|
|
72
68
|
if (sibs[i] === elem) {
|
|
73
69
|
break;
|
|
74
70
|
}
|
|
75
|
-
|
|
76
71
|
ret.unshift(sibs[i]);
|
|
77
72
|
}
|
|
78
|
-
|
|
79
73
|
return ret;
|
|
80
74
|
};
|
|
81
|
-
|
|
82
75
|
const searchPrevSiblings = elem => {
|
|
83
76
|
const sibs = getPrevSiblings(elem);
|
|
84
77
|
let ret;
|
|
85
|
-
|
|
86
78
|
for (let i = 0; i < sibs.length; i++) {
|
|
87
79
|
ret = getHighestOrderHForElem(sibs[i]);
|
|
88
|
-
|
|
89
80
|
if (ret) {
|
|
90
81
|
break;
|
|
91
82
|
}
|
|
92
83
|
}
|
|
93
|
-
|
|
94
84
|
return ret;
|
|
95
85
|
};
|
|
96
|
-
|
|
97
86
|
const _walkUpTree = elem => {
|
|
98
87
|
let ret;
|
|
99
|
-
|
|
100
88
|
if (!elem || elem.tagName === 'BODY') {
|
|
101
89
|
return undefined;
|
|
102
90
|
}
|
|
103
|
-
|
|
104
91
|
if (isHtag(elem)) {
|
|
105
92
|
return elem;
|
|
106
93
|
}
|
|
107
|
-
|
|
108
94
|
ret = searchPrevSiblings(elem);
|
|
109
|
-
|
|
110
95
|
if (!ret) {
|
|
111
96
|
ret = _walkUpTree(elem.parentElement);
|
|
112
97
|
}
|
|
113
|
-
|
|
114
98
|
return ret;
|
|
115
99
|
};
|
|
116
|
-
|
|
117
100
|
const walkUpTree = elem => {
|
|
118
101
|
let ret = searchPrevSiblings(elem);
|
|
119
|
-
|
|
120
102
|
if (!ret) {
|
|
121
103
|
ret = _walkUpTree(elem.parentElement);
|
|
122
104
|
}
|
|
123
|
-
|
|
124
105
|
return ret;
|
|
125
106
|
};
|
|
126
|
-
|
|
127
107
|
const getPriorHeading = elem => {
|
|
128
108
|
return walkUpTree(elem);
|
|
129
|
-
};
|
|
130
|
-
|
|
109
|
+
};
|
|
131
110
|
|
|
111
|
+
// a valid prior H tag is greater or equal to one less than current
|
|
132
112
|
const getValidHeadings = elem => {
|
|
133
113
|
const hNum = +elem.tagName.substring(1);
|
|
134
114
|
const ret = {};
|
|
135
|
-
|
|
136
115
|
for (let i = hNum - 1; i <= 6; i++) {
|
|
137
116
|
ret[`H${i}`] = true;
|
|
138
117
|
}
|
|
139
|
-
|
|
140
118
|
return ret;
|
|
141
119
|
};
|
|
142
|
-
|
|
143
120
|
export default {
|
|
144
121
|
id: 'headings-sequence',
|
|
145
122
|
test: elem => {
|
|
@@ -150,18 +127,14 @@ export default {
|
|
|
150
127
|
H5: true,
|
|
151
128
|
H6: true
|
|
152
129
|
};
|
|
153
|
-
|
|
154
130
|
if (testTags[elem.tagName] !== true) {
|
|
155
131
|
return true;
|
|
156
132
|
}
|
|
157
|
-
|
|
158
133
|
const validHeadings = getValidHeadings(elem);
|
|
159
134
|
const priorHeading = getPriorHeading(elem);
|
|
160
|
-
|
|
161
135
|
if (priorHeading) {
|
|
162
136
|
return validHeadings[priorHeading.tagName];
|
|
163
137
|
}
|
|
164
|
-
|
|
165
138
|
return true;
|
|
166
139
|
},
|
|
167
140
|
data: _elem => {
|
|
@@ -178,7 +151,6 @@ export default {
|
|
|
178
151
|
if (!data || !data.action || data.action === 'nothing') {
|
|
179
152
|
return elem;
|
|
180
153
|
}
|
|
181
|
-
|
|
182
154
|
switch (data.action) {
|
|
183
155
|
case 'elem':
|
|
184
156
|
{
|
|
@@ -186,7 +158,6 @@ export default {
|
|
|
186
158
|
const hIdx = priorH ? +priorH.tagName.substring(1) : 0;
|
|
187
159
|
return changeTag(elem, `H${hIdx + 1}`);
|
|
188
160
|
}
|
|
189
|
-
|
|
190
161
|
case 'modify':
|
|
191
162
|
{
|
|
192
163
|
return changeTag(elem, 'p');
|
|
@@ -15,17 +15,16 @@
|
|
|
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 { changeTag } from '../utils/dom';
|
|
19
20
|
import formatMessage from '../../../../format-message';
|
|
20
21
|
export default {
|
|
21
22
|
id: 'headings-start-at-h2',
|
|
22
23
|
test: function (elem) {
|
|
23
24
|
let config = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
|
|
24
|
-
|
|
25
25
|
if (config.disableHeadingsStartAtH2) {
|
|
26
26
|
return true;
|
|
27
27
|
}
|
|
28
|
-
|
|
29
28
|
return elem.tagName !== 'H1';
|
|
30
29
|
},
|
|
31
30
|
data: _elem => {
|
|
@@ -48,14 +47,11 @@ export default {
|
|
|
48
47
|
if (!data || !data.action) {
|
|
49
48
|
return elem;
|
|
50
49
|
}
|
|
51
|
-
|
|
52
50
|
switch (data.action) {
|
|
53
51
|
case 'nothing':
|
|
54
52
|
return elem;
|
|
55
|
-
|
|
56
53
|
case 'elem-only':
|
|
57
54
|
return changeTag(elem, 'h2');
|
|
58
|
-
|
|
59
55
|
case 'modify':
|
|
60
56
|
return changeTag(elem, 'p');
|
|
61
57
|
}
|
|
@@ -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
|
const FILENAMELIKE = /[^\s]+(.*?).(jpg|jpeg|png|gif|svg|bmp|webp)$/i;
|
|
20
21
|
export default {
|
|
@@ -23,7 +24,6 @@ export default {
|
|
|
23
24
|
if (elem.tagName !== 'IMG') {
|
|
24
25
|
return true;
|
|
25
26
|
}
|
|
26
|
-
|
|
27
27
|
const alt = elem.hasAttribute('alt') ? elem.getAttribute('alt') : null;
|
|
28
28
|
const isDecorative = alt !== null && alt.replace(/\s/g, '') === '';
|
|
29
29
|
return !FILENAMELIKE.test(alt) || isDecorative;
|
|
@@ -53,7 +53,6 @@ export default {
|
|
|
53
53
|
elem.setAttribute('alt', data.alt);
|
|
54
54
|
elem.removeAttribute('role');
|
|
55
55
|
}
|
|
56
|
-
|
|
57
56
|
return elem;
|
|
58
57
|
},
|
|
59
58
|
message: () => formatMessage('Image filenames should not be used as the alt attribute describing the image content.'),
|
|
@@ -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
|
const MAX_ALT_LENGTH = 120;
|
|
20
21
|
export default {
|
|
@@ -24,7 +25,6 @@ export default {
|
|
|
24
25
|
if (elem.tagName !== 'IMG') {
|
|
25
26
|
return true;
|
|
26
27
|
}
|
|
27
|
-
|
|
28
28
|
const alt = elem.getAttribute('alt');
|
|
29
29
|
return alt == null || alt.length <= MAX_ALT_LENGTH;
|
|
30
30
|
},
|
|
@@ -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
|
export default {
|
|
20
21
|
id: 'img-alt',
|
|
@@ -22,7 +23,6 @@ export default {
|
|
|
22
23
|
if (elem.tagName !== 'IMG') {
|
|
23
24
|
return true;
|
|
24
25
|
}
|
|
25
|
-
|
|
26
26
|
const alt = elem.hasAttribute('alt') ? elem.getAttribute('alt') : null;
|
|
27
27
|
return alt !== null;
|
|
28
28
|
},
|
|
@@ -51,7 +51,6 @@ export default {
|
|
|
51
51
|
elem.setAttribute('alt', data.alt);
|
|
52
52
|
elem.removeAttribute('role');
|
|
53
53
|
}
|
|
54
|
-
|
|
55
54
|
return elem;
|
|
56
55
|
},
|
|
57
56
|
message: () => formatMessage('Images should include an alt attribute describing the image content.'),
|
|
@@ -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 imgAlt from './img-alt';
|
|
19
20
|
import imgAltFilename from './img-alt-filename';
|
|
20
21
|
import tableCaption from './table-caption';
|
|
@@ -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 contrast from 'wcag-element-contrast';
|
|
20
21
|
import smallTextContrast from './small-text-contrast';
|
|
@@ -25,20 +26,16 @@ export default {
|
|
|
25
26
|
let config = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
|
|
26
27
|
const disabled = config.disableContrastCheck == true;
|
|
27
28
|
const noText = !hasTextNode(elem);
|
|
28
|
-
|
|
29
29
|
if (disabled || noText || onlyContainsLink(elem) || !contrast.isLargeText(elem)) {
|
|
30
30
|
return true;
|
|
31
31
|
}
|
|
32
|
-
|
|
33
32
|
for (let e = elem; e; e = e.parentElement) {
|
|
34
33
|
const bgimage = window.getComputedStyle(e).getPropertyValue('background-image');
|
|
35
|
-
|
|
36
34
|
if (bgimage !== 'none' && bgimage !== '') {
|
|
37
35
|
// ignore background images and gradients
|
|
38
36
|
return true;
|
|
39
37
|
}
|
|
40
38
|
}
|
|
41
|
-
|
|
42
39
|
return contrast(elem);
|
|
43
40
|
},
|
|
44
41
|
data: smallTextContrast.data,
|
|
@@ -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 formatMessage from '../../../../format-message';
|
|
20
|
+
|
|
19
21
|
/**
|
|
20
22
|
* Handles:
|
|
21
23
|
* * list item
|
|
@@ -30,59 +32,46 @@ const orderedChars = ['[A-Z]', '[a-z]', '[0-9]'].map(pattern => pattern + '{1,4}
|
|
|
30
32
|
const bulletMarkers = ['*', '-'].map(c => '\\' + c).join('|');
|
|
31
33
|
const orderedMarkers = ['.', ')'].map(c => '\\' + c).join('|');
|
|
32
34
|
const listLikeRegex = new RegExp(`^\\s*(?:(?:[${bulletMarkers}])|(?:(${orderedChars})[${orderedMarkers}]))\\s+`);
|
|
33
|
-
|
|
34
35
|
const isTextList = elem => elem.tagName === 'P' && listLikeRegex.test(elem.textContent);
|
|
35
|
-
|
|
36
36
|
const cleanListItem = elem => {
|
|
37
37
|
if (elem.nodeType === Node.TEXT_NODE) {
|
|
38
38
|
elem.textContent = elem.textContent.replace(listLikeRegex, '');
|
|
39
39
|
return true;
|
|
40
40
|
}
|
|
41
|
-
|
|
42
41
|
for (const childElement of elem.childNodes) {
|
|
43
42
|
const found = cleanListItem(childElement);
|
|
44
43
|
if (found) return true;
|
|
45
44
|
}
|
|
46
|
-
|
|
47
45
|
return false;
|
|
48
46
|
};
|
|
49
|
-
|
|
50
47
|
const moveContents = (from, to) => {
|
|
51
48
|
while (from.firstChild) to.appendChild(from.firstChild);
|
|
52
49
|
};
|
|
53
|
-
|
|
54
50
|
const splitParagraphsByBreak = paragraph => {
|
|
55
51
|
const appended = [];
|
|
56
52
|
let child = paragraph.firstChild;
|
|
57
|
-
|
|
58
53
|
while (child) {
|
|
59
54
|
const currentParent = appended[appended.length - 1];
|
|
60
|
-
|
|
61
55
|
if (child.tagName === 'BR') {
|
|
62
56
|
appended.push(document.createElement('p'));
|
|
63
57
|
child = child.nextSibling;
|
|
64
58
|
continue;
|
|
65
59
|
}
|
|
66
|
-
|
|
67
60
|
if (currentParent) currentParent.appendChild(child);
|
|
68
61
|
child = child.nextSibling;
|
|
69
62
|
}
|
|
70
|
-
|
|
71
63
|
const nextNode = paragraph.nextSibling;
|
|
72
64
|
appended.forEach(newParagraph => {
|
|
73
65
|
paragraph.parentNode.insertBefore(newParagraph, nextNode);
|
|
74
66
|
});
|
|
75
67
|
};
|
|
76
|
-
|
|
77
68
|
export default {
|
|
78
69
|
id: 'list-structure',
|
|
79
|
-
|
|
80
70
|
test(elem) {
|
|
81
71
|
const isList = isTextList(elem);
|
|
82
72
|
const isFirst = elem.previousElementSibling ? !isTextList(elem.previousElementSibling) : true;
|
|
83
73
|
return !(isList && isFirst);
|
|
84
74
|
},
|
|
85
|
-
|
|
86
75
|
data: elem => {
|
|
87
76
|
const match = elem.textContent.match(listLikeRegex);
|
|
88
77
|
return {
|
|
@@ -95,21 +84,16 @@ export default {
|
|
|
95
84
|
checkbox: true,
|
|
96
85
|
dataKey: 'formatAsList'
|
|
97
86
|
}],
|
|
98
|
-
|
|
99
87
|
update(elem, data) {
|
|
100
88
|
const rootElem = elem.parentNode;
|
|
101
|
-
|
|
102
89
|
if (data.formatAsList) {
|
|
103
90
|
const isOrdered = Boolean(data.orderedStart);
|
|
104
91
|
const listContainer = document.createElement(isOrdered ? 'ol' : 'ul');
|
|
105
|
-
|
|
106
92
|
if (isOrdered) {
|
|
107
93
|
listContainer.setAttribute('type', data.orderedStart);
|
|
108
94
|
listContainer.setAttribute('start', data.orderedStart);
|
|
109
95
|
}
|
|
110
|
-
|
|
111
96
|
let cursor = elem;
|
|
112
|
-
|
|
113
97
|
while (cursor) {
|
|
114
98
|
if (!isTextList(cursor)) break;
|
|
115
99
|
const nextIsOrdered = Boolean(cursor.textContent.match(listLikeRegex)[1]);
|
|
@@ -118,25 +102,22 @@ export default {
|
|
|
118
102
|
const li = document.createElement('li');
|
|
119
103
|
listContainer.appendChild(li);
|
|
120
104
|
moveContents(cursor, li);
|
|
121
|
-
const nextSibling = cursor.nextElementSibling;
|
|
122
|
-
// Skip elem because elem is replaced later.
|
|
105
|
+
const nextSibling = cursor.nextElementSibling;
|
|
123
106
|
|
|
107
|
+
// Remove the now empty siblings
|
|
108
|
+
// Skip elem because elem is replaced later.
|
|
124
109
|
if (cursor !== elem) cursor.parentNode.removeChild(cursor);
|
|
125
110
|
cursor = nextSibling;
|
|
126
111
|
cleanListItem(li);
|
|
127
112
|
}
|
|
128
|
-
|
|
129
113
|
rootElem.replaceChild(listContainer, elem);
|
|
130
114
|
return listContainer;
|
|
131
115
|
}
|
|
132
|
-
|
|
133
116
|
return elem;
|
|
134
117
|
},
|
|
135
|
-
|
|
136
118
|
rootNode(elem) {
|
|
137
119
|
return elem.parentNode;
|
|
138
120
|
},
|
|
139
|
-
|
|
140
121
|
message: () => formatMessage('Lists should be formatted as lists.'),
|
|
141
122
|
why: () => formatMessage('When markup is used that visually formats items as a list but does not indicate the list relationship, users may have difficulty in navigating the information.'),
|
|
142
123
|
link: 'https://www.w3.org/TR/2016/NOTE-WCAG20-TECHS-20161007/H48',
|
|
@@ -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 { changeTag } from '../utils/dom';
|
|
20
21
|
const MAX_HEADING_LENGTH = 120;
|
|
@@ -33,7 +34,6 @@ export default {
|
|
|
33
34
|
if (!IS_HEADING[elem.tagName]) {
|
|
34
35
|
return true;
|
|
35
36
|
}
|
|
36
|
-
|
|
37
37
|
return elem.textContent.length <= MAX_HEADING_LENGTH;
|
|
38
38
|
},
|
|
39
39
|
data: _elem => {
|
|
@@ -48,11 +48,9 @@ export default {
|
|
|
48
48
|
}],
|
|
49
49
|
update: (elem, data) => {
|
|
50
50
|
let ret = elem;
|
|
51
|
-
|
|
52
51
|
if (data.change) {
|
|
53
52
|
ret = changeTag(elem, 'p');
|
|
54
53
|
}
|
|
55
|
-
|
|
56
54
|
return ret;
|
|
57
55
|
},
|
|
58
56
|
message: () => formatMessage('Headings should not contain more than 120 characters.'),
|
|
@@ -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 contrast from 'wcag-element-contrast';
|
|
20
21
|
import { onlyContainsLink, createStyleString, splitStyleAttribute, hasTextNode } from '../utils/dom';
|
|
@@ -27,20 +28,16 @@ export default {
|
|
|
27
28
|
let config = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
|
|
28
29
|
const disabled = config.disableContrastCheck == true;
|
|
29
30
|
const noText = !hasTextNode(elem);
|
|
30
|
-
|
|
31
31
|
if (disabled || noText || onlyContainsLink(elem) || contrast.isLargeText(elem)) {
|
|
32
32
|
return true;
|
|
33
33
|
}
|
|
34
|
-
|
|
35
34
|
for (let e = elem; e; e = e.parentElement) {
|
|
36
35
|
const bgimage = window.getComputedStyle(e).getPropertyValue('background-image');
|
|
37
|
-
|
|
38
36
|
if (bgimage !== 'none' && bgimage !== '') {
|
|
39
37
|
// ignore background images and gradients
|
|
40
38
|
return true;
|
|
41
39
|
}
|
|
42
40
|
}
|
|
43
|
-
|
|
44
41
|
return contrast(elem);
|
|
45
42
|
},
|
|
46
43
|
data: elem => {
|
|
@@ -58,13 +55,11 @@ export default {
|
|
|
58
55
|
update: (elem, data) => {
|
|
59
56
|
elem.style.color = data.color;
|
|
60
57
|
const styles = splitStyleAttribute(elem.getAttribute('data-mce-style') || '');
|
|
61
|
-
|
|
62
58
|
if (data && data.color && data.color.indexOf('#') < 0) {
|
|
63
59
|
styles.color = `#${rgbHex(data.color)}`;
|
|
64
60
|
} else {
|
|
65
61
|
styles.color = data.color;
|
|
66
62
|
}
|
|
67
|
-
|
|
68
63
|
elem.setAttribute('data-mce-style', createStyleString(styles));
|
|
69
64
|
return elem;
|
|
70
65
|
},
|
|
@@ -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 { prepend } from '../utils/dom';
|
|
20
21
|
export default {
|
|
@@ -23,7 +24,6 @@ export default {
|
|
|
23
24
|
if (elem.tagName !== 'TABLE') {
|
|
24
25
|
return true;
|
|
25
26
|
}
|
|
26
|
-
|
|
27
27
|
const caption = elem.querySelector('caption');
|
|
28
28
|
return !!caption && caption.textContent.replace(/\s/g, '') !== '';
|
|
29
29
|
},
|
|
@@ -38,12 +38,10 @@ export default {
|
|
|
38
38
|
}],
|
|
39
39
|
update: (elem, data) => {
|
|
40
40
|
let caption = elem.querySelector('caption');
|
|
41
|
-
|
|
42
41
|
if (!caption) {
|
|
43
42
|
caption = elem.ownerDocument.createElement('caption');
|
|
44
43
|
prepend(elem, caption);
|
|
45
44
|
}
|
|
46
|
-
|
|
47
45
|
caption.textContent = data.caption;
|
|
48
46
|
return elem;
|
|
49
47
|
},
|
|
@@ -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
|
const VALID_SCOPES = ['row', 'col', 'rowgroup', 'colgroup'];
|
|
20
21
|
export default {
|
|
@@ -23,7 +24,6 @@ export default {
|
|
|
23
24
|
if (elem.tagName !== 'TH') {
|
|
24
25
|
return true;
|
|
25
26
|
}
|
|
26
|
-
|
|
27
27
|
return VALID_SCOPES.indexOf(elem.getAttribute('scope')) !== -1;
|
|
28
28
|
},
|
|
29
29
|
data: elem => {
|
|
@@ -42,7 +42,6 @@ export default {
|
|
|
42
42
|
} else {
|
|
43
43
|
elem.setAttribute('scope', data.scope);
|
|
44
44
|
}
|
|
45
|
-
|
|
46
45
|
return elem;
|
|
47
46
|
},
|
|
48
47
|
message: () => formatMessage('Tables headers should specify scope.'),
|
|
@@ -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 { changeTag } from '../utils/dom';
|
|
20
21
|
const _forEach = Array.prototype.forEach;
|
|
@@ -24,7 +25,6 @@ export default {
|
|
|
24
25
|
if (elem.tagName !== 'TABLE') {
|
|
25
26
|
return true;
|
|
26
27
|
}
|
|
27
|
-
|
|
28
28
|
return elem.querySelector('th');
|
|
29
29
|
},
|
|
30
30
|
data: _elem => {
|
|
@@ -41,37 +41,29 @@ export default {
|
|
|
41
41
|
_forEach.call(elem.querySelectorAll('th'), th => {
|
|
42
42
|
changeTag(th, 'td');
|
|
43
43
|
});
|
|
44
|
-
|
|
45
44
|
if (data.header === 'none') {
|
|
46
45
|
return elem;
|
|
47
46
|
}
|
|
48
|
-
|
|
49
47
|
const row = data.header === 'row' || data.header === 'both';
|
|
50
48
|
const col = data.header === 'col' || data.header === 'both';
|
|
51
49
|
const tableRows = elem.querySelectorAll('tr');
|
|
52
|
-
|
|
53
50
|
for (let i = 0; i < tableRows.length; ++i) {
|
|
54
51
|
if (i === 0 && row) {
|
|
55
52
|
_forEach.call(tableRows[i].querySelectorAll('td'), td => {
|
|
56
53
|
const th = changeTag(td, 'th');
|
|
57
54
|
th.setAttribute('scope', 'col');
|
|
58
55
|
});
|
|
59
|
-
|
|
60
56
|
continue;
|
|
61
57
|
}
|
|
62
|
-
|
|
63
58
|
if (!col) {
|
|
64
59
|
break;
|
|
65
60
|
}
|
|
66
|
-
|
|
67
61
|
const td = tableRows[i].querySelector('td');
|
|
68
|
-
|
|
69
62
|
if (td) {
|
|
70
63
|
const th = changeTag(td, 'th');
|
|
71
64
|
th.setAttribute('scope', 'row');
|
|
72
65
|
}
|
|
73
66
|
}
|
|
74
|
-
|
|
75
67
|
return elem;
|
|
76
68
|
},
|
|
77
69
|
message: () => formatMessage('Tables should include at least one header.'),
|
|
@@ -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
|
export function stringifyRGBA(rgba) {
|
|
19
20
|
return `rgba(${rgba.r}, ${rgba.g}, ${rgba.b}, ${rgba.a})`;
|
|
20
21
|
}
|
|
@@ -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 * as strings from './strings';
|
|
20
21
|
const WORD_COUNT = 4;
|
|
@@ -22,33 +23,27 @@ export default function describe(elem) {
|
|
|
22
23
|
if (!elem || !elem.tagName) {
|
|
23
24
|
return null;
|
|
24
25
|
}
|
|
25
|
-
|
|
26
26
|
switch (elem.tagName) {
|
|
27
27
|
case 'IMG':
|
|
28
28
|
return formatMessage('Image with filename {file}', {
|
|
29
29
|
file: strings.filename(elem.src)
|
|
30
30
|
});
|
|
31
|
-
|
|
32
31
|
case 'TABLE':
|
|
33
32
|
return formatMessage('Table starting with {start}', {
|
|
34
33
|
start: strings.firstWords(elem.textContent, WORD_COUNT)
|
|
35
34
|
});
|
|
36
|
-
|
|
37
35
|
case 'A':
|
|
38
36
|
return formatMessage('Link with text starting with {start}', {
|
|
39
37
|
start: strings.firstWords(elem.textContent, WORD_COUNT)
|
|
40
38
|
});
|
|
41
|
-
|
|
42
39
|
case 'P':
|
|
43
40
|
return formatMessage('Paragraph starting with {start}', {
|
|
44
41
|
start: strings.firstWords(elem.textContent, WORD_COUNT)
|
|
45
42
|
});
|
|
46
|
-
|
|
47
43
|
case 'TH':
|
|
48
44
|
return formatMessage('Table header starting with {start}', {
|
|
49
45
|
start: strings.firstWords(elem.textContent, WORD_COUNT)
|
|
50
46
|
});
|
|
51
|
-
|
|
52
47
|
case 'H1':
|
|
53
48
|
case 'H2':
|
|
54
49
|
case 'H3':
|
|
@@ -57,7 +52,6 @@ export default function describe(elem) {
|
|
|
57
52
|
return formatMessage('Heading starting with {start}', {
|
|
58
53
|
start: strings.firstWords(elem.textContent, WORD_COUNT)
|
|
59
54
|
});
|
|
60
|
-
|
|
61
55
|
default:
|
|
62
56
|
return formatMessage('Element starting with {start}', {
|
|
63
57
|
start: strings.firstWords(elem.textContent, WORD_COUNT)
|