@instructure/canvas-rce 5.14.1 → 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.
Files changed (481) hide show
  1. package/CHANGELOG.md +5 -0
  2. package/DEVELOPMENT.md +1 -1
  3. package/README.md +0 -8
  4. package/__tests__/common/indicate.test.js +84 -0
  5. package/__tests__/common/mimeClass.test.js +85 -0
  6. package/__tests__/module/contentInsertionUtils.test.js +52 -0
  7. package/__tests__/module/indicatorRegion.test.js +75 -0
  8. package/__tests__/module/normalizeLocale.test.js +46 -0
  9. package/__tests__/module/normalizeProps.test.js +51 -0
  10. package/__tests__/module/sanitizePlugins.test.js +48 -0
  11. package/__tests__/module/wrapInitCb.test.js +56 -0
  12. package/__tests__/rcs/api.test.js +819 -0
  13. package/{mocha-reporter-config.js → __tests__/sidebar/actions/all_files.test.js} +10 -9
  14. package/__tests__/sidebar/actions/data.test.js +196 -0
  15. package/__tests__/sidebar/actions/utils.js +44 -0
  16. package/{es/rce/plugins/shared/__mocks__/screenfull.js → __tests__/sidebar/reducers/all_files.test.js} +10 -6
  17. package/babel.config.js +3 -1
  18. package/es/bridge/Bridge.js +8 -56
  19. package/es/bridge/index.js +1 -0
  20. package/es/canvasFileBrowser/FileBrowser.js +12 -59
  21. package/es/canvasFileBrowser/en-US.js +3 -6
  22. package/es/common/FlashAlert.js +7 -28
  23. package/es/common/browser.js +4 -2
  24. package/es/common/fileUrl.js +104 -59
  25. package/es/common/incremental-loading/LoadMoreButton.js +1 -0
  26. package/es/common/incremental-loading/LoadingIndicator.js +1 -2
  27. package/es/common/incremental-loading/LoadingStatus.js +1 -2
  28. package/es/common/incremental-loading/index.js +1 -0
  29. package/es/common/incremental-loading/useIncrementalLoading.js +1 -3
  30. package/es/common/indicate.js +15 -8
  31. package/es/common/mimeClass.js +3 -4
  32. package/es/common/natcompare.js +1 -4
  33. package/es/defaultTinymceConfig.js +5 -3
  34. package/es/elementDenylist.js +1 -0
  35. package/es/enhance-user-content/doc_previews.js +17 -28
  36. package/es/enhance-user-content/enhance_user_content.js +28 -60
  37. package/es/enhance-user-content/external_links.js +5 -8
  38. package/es/enhance-user-content/index.js +1 -0
  39. package/es/enhance-user-content/instructure_helper.js +12 -34
  40. package/es/enhance-user-content/jqueryish_funcs.js +8 -11
  41. package/es/enhance-user-content/mathml.js +35 -82
  42. package/es/enhance-user-content/media_comment_thumbnail.js +5 -17
  43. package/es/format-message.js +3 -4
  44. package/es/getThemeVars.js +8 -6
  45. package/es/getTranslations.js +1 -78
  46. package/es/index.js +3 -1
  47. package/es/rce/AlertMessageArea.js +1 -1
  48. package/es/rce/DraggingBlocker.js +4 -2
  49. package/es/rce/KeyboardShortcutModal.js +1 -0
  50. package/es/rce/RCE.js +12 -11
  51. package/es/rce/RCEGlobals.js +12 -10
  52. package/es/rce/RCEVariants.js +27 -10
  53. package/es/rce/RCEWrapper.js +167 -386
  54. package/es/rce/RCEWrapperProps.js +8 -3
  55. package/es/rce/RceHtmlEditor.js +5 -8
  56. package/es/rce/ResizeHandle.js +3 -8
  57. package/es/rce/RestoreAutoSaveModal.js +1 -2
  58. package/es/rce/ShowOnFocusButton/index.js +0 -6
  59. package/es/rce/StatusBar.js +8 -37
  60. package/es/rce/alertHandler.js +1 -4
  61. package/es/rce/contentInsertion.js +35 -57
  62. package/es/rce/contentInsertionUtils.js +6 -8
  63. package/es/rce/contentRendering.js +7 -12
  64. package/es/rce/customEvents.js +1 -0
  65. package/es/rce/editorLanguage.js +22 -10
  66. package/es/rce/indicatorRegion.js +6 -5
  67. package/es/rce/normalizeLocale.js +5 -3
  68. package/es/rce/normalizeProps.js +3 -1
  69. package/es/rce/plugins/instructure-ui-icons/plugin.js +21 -3
  70. package/es/rce/plugins/instructure_color/clickCallback.js +84 -0
  71. package/es/rce/plugins/instructure_color/components/ColorPicker.js +299 -0
  72. package/es/rce/plugins/instructure_color/components/ColorPopup.js +68 -0
  73. package/es/rce/plugins/instructure_color/components/colorUtils.js +60 -0
  74. package/es/rce/plugins/instructure_color/plugin.js +40 -0
  75. package/es/rce/plugins/instructure_condensed_buttons/core/ListUtils.js +10 -3
  76. package/es/rce/plugins/instructure_condensed_buttons/plugin.js +1 -0
  77. package/es/rce/plugins/instructure_condensed_buttons/ui/alignment-button.js +1 -2
  78. package/es/rce/plugins/instructure_condensed_buttons/ui/directionality-button.js +3 -2
  79. package/es/rce/plugins/instructure_condensed_buttons/ui/indent-outdent-button.js +1 -0
  80. package/es/rce/plugins/instructure_condensed_buttons/ui/list-button.js +22 -15
  81. package/es/rce/plugins/instructure_condensed_buttons/ui/subscript-superscript-button.js +1 -2
  82. package/es/rce/plugins/instructure_documents/clickCallback.js +1 -0
  83. package/es/rce/plugins/instructure_documents/components/DocumentsPanel.js +1 -9
  84. package/es/rce/plugins/instructure_documents/components/Link.js +3 -18
  85. package/es/rce/plugins/instructure_documents/plugin.js +7 -14
  86. package/es/rce/plugins/instructure_equation/EquationEditorModal/advancedOnlySyntax.js +4 -2
  87. package/es/rce/plugins/instructure_equation/EquationEditorModal/advancedPreference.js +1 -2
  88. package/es/rce/plugins/instructure_equation/EquationEditorModal/index.js +12 -29
  89. package/es/rce/plugins/instructure_equation/EquationEditorModal/latexTextareaUtil.js +11 -12
  90. package/es/rce/plugins/instructure_equation/EquationEditorModal/parseLatex.js +4 -3
  91. package/es/rce/plugins/instructure_equation/EquationEditorModal/styles.js +4 -2
  92. package/es/rce/plugins/instructure_equation/EquationEditorToolbar/buttons.js +13 -7
  93. package/es/rce/plugins/instructure_equation/EquationEditorToolbar/index.js +4 -7
  94. package/es/rce/plugins/instructure_equation/MathIcon/index.js +1 -1
  95. package/es/rce/plugins/instructure_equation/MathIcon/svgs.js +1 -1
  96. package/es/rce/plugins/instructure_equation/clickCallback.js +2 -5
  97. package/es/rce/plugins/instructure_equation/mathlive/index.js +1 -1
  98. package/es/rce/plugins/instructure_equation/plugin.js +7 -10
  99. package/es/rce/plugins/instructure_fullscreen/plugin.js +3 -6
  100. package/es/rce/plugins/instructure_html_view/clickCallback.js +1 -0
  101. package/es/rce/plugins/instructure_html_view/plugin.js +5 -4
  102. package/es/rce/plugins/instructure_icon_maker/clickCallback.js +2 -4
  103. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ColorSection.js +1 -2
  104. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/CreateIconMakerForm.js +1 -0
  105. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/Footer.js +1 -0
  106. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/Group.js +1 -0
  107. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/Header.js +1 -2
  108. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/Course.js +25 -22
  109. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/ImageOptions.js +7 -11
  110. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/ImageSection.js +27 -23
  111. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/ModeSelect.js +5 -4
  112. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/MultiColor/index.js +11 -9
  113. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/MultiColor/svg.js +1 -0
  114. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/SVGList.js +5 -4
  115. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/SVGThumbnail.js +1 -3
  116. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/SingleColor/index.js +7 -7
  117. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/SingleColor/svg.js +1 -0
  118. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/Upload.js +27 -20
  119. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/index.js +1 -0
  120. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/propTypes.js +1 -0
  121. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/utils.js +1 -0
  122. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/Preview.js +4 -4
  123. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ShapeSection.js +1 -2
  124. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/TextSection.js +1 -5
  125. package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/index.js +1 -0
  126. package/es/rce/plugins/instructure_icon_maker/components/IconMakerTray.js +18 -33
  127. package/es/rce/plugins/instructure_icon_maker/components/SavedIconMakerList.js +4 -4
  128. package/es/rce/plugins/instructure_icon_maker/plugin.js +10 -14
  129. package/es/rce/plugins/instructure_icon_maker/reducers/imageSection.js +37 -38
  130. package/es/rce/plugins/instructure_icon_maker/reducers/svgSettings.js +24 -24
  131. package/es/rce/plugins/instructure_icon_maker/registerEditToolbar.js +1 -3
  132. package/es/rce/plugins/instructure_icon_maker/svg/constants.js +4 -3
  133. package/es/rce/plugins/instructure_icon_maker/svg/font.js +3 -1
  134. package/es/rce/plugins/instructure_icon_maker/svg/image.js +69 -83
  135. package/es/rce/plugins/instructure_icon_maker/svg/index.js +11 -15
  136. package/es/rce/plugins/instructure_icon_maker/svg/metadata.js +1 -0
  137. package/es/rce/plugins/instructure_icon_maker/svg/settings.js +32 -39
  138. package/es/rce/plugins/instructure_icon_maker/svg/shape.js +1 -49
  139. package/es/rce/plugins/instructure_icon_maker/svg/text.js +7 -92
  140. package/es/rce/plugins/instructure_icon_maker/svg/utils.js +1 -7
  141. package/es/rce/plugins/instructure_icon_maker/utils/IconMakerClose.js +2 -6
  142. package/es/rce/plugins/instructure_icon_maker/utils/IconMakerFormHasChanges.js +1 -15
  143. package/es/rce/plugins/instructure_icon_maker/utils/addIconMakerAttributes.js +3 -4
  144. package/es/rce/plugins/instructure_icon_maker/utils/iconValidation.js +1 -1
  145. package/es/rce/plugins/instructure_icon_maker/utils/iconsLabels.js +1 -0
  146. package/es/rce/plugins/instructure_icon_maker/utils/useDebouncedValue.js +12 -13
  147. package/es/rce/plugins/instructure_image/ImageEmbedOptions.js +6 -24
  148. package/es/rce/plugins/instructure_image/ImageList/Image.js +1 -6
  149. package/es/rce/plugins/instructure_image/ImageList/index.js +1 -2
  150. package/es/rce/plugins/instructure_image/ImageOptionsTray/TrayController.js +7 -27
  151. package/es/rce/plugins/instructure_image/ImageOptionsTray/index.js +3 -16
  152. package/es/rce/plugins/instructure_image/Images/index.js +1 -3
  153. package/es/rce/plugins/instructure_image/clickCallback.js +1 -0
  154. package/es/rce/plugins/instructure_image/plugin.js +13 -18
  155. package/es/rce/plugins/instructure_links/clickCallback.js +1 -0
  156. package/es/rce/plugins/instructure_links/components/AccordionSection.js +1 -0
  157. package/es/rce/plugins/instructure_links/components/CollectionPanel.js +1 -3
  158. package/es/rce/plugins/instructure_links/components/Link.js +7 -19
  159. package/es/rce/plugins/instructure_links/components/LinkOptionsDialog/LinkOptionsDialogController.js +1 -21
  160. package/es/rce/plugins/instructure_links/components/LinkOptionsDialog/index.js +1 -4
  161. package/es/rce/plugins/instructure_links/components/LinkOptionsTray/LinkOptionsTrayController.js +3 -20
  162. package/es/rce/plugins/instructure_links/components/LinkOptionsTray/index.js +1 -12
  163. package/es/rce/plugins/instructure_links/components/LinkSet.js +4 -20
  164. package/es/rce/plugins/instructure_links/components/LinksPanel.js +1 -2
  165. package/es/rce/plugins/instructure_links/components/NavigationPanel.js +7 -9
  166. package/es/rce/plugins/instructure_links/components/NoResults.js +1 -7
  167. package/es/rce/plugins/instructure_links/plugin.js +17 -40
  168. package/es/rce/plugins/instructure_links/validateURL.js +81 -36
  169. package/es/rce/plugins/instructure_media_embed/clickCallback.js +2 -5
  170. package/es/rce/plugins/instructure_media_embed/components/Embed.js +1 -0
  171. package/es/rce/plugins/instructure_media_embed/plugin.js +7 -3
  172. package/es/rce/plugins/instructure_paste/pasteMenuCommand.js +1 -5
  173. package/es/rce/plugins/instructure_paste/plugin.js +27 -29
  174. package/es/rce/plugins/instructure_rce_external_tools/ExternalToolsEnv.js +14 -53
  175. package/es/rce/plugins/instructure_rce_external_tools/RceToolWrapper.js +21 -49
  176. package/es/rce/plugins/instructure_rce_external_tools/components/ExternalToolDialog/ExternalToolDialog.js +11 -42
  177. package/es/rce/plugins/instructure_rce_external_tools/components/ExternalToolDialog/ExternalToolDialogModal.js +1 -2
  178. package/es/rce/plugins/instructure_rce_external_tools/components/ExternalToolDialog/ExternalToolDialogTray.js +1 -1
  179. package/es/rce/plugins/instructure_rce_external_tools/components/ExternalToolSelectionDialog/ExternalToolSelectionDialog.js +2 -10
  180. package/es/rce/plugins/instructure_rce_external_tools/components/ExternalToolSelectionDialog/ExternalToolSelectionItem.js +1 -2
  181. package/es/rce/plugins/instructure_rce_external_tools/components/util/ExpandoText.js +1 -0
  182. package/es/rce/plugins/instructure_rce_external_tools/components/util/ToolLaunchIframe.js +2 -1
  183. package/es/rce/{__mocks__/_mockStudioPlayer.js → plugins/instructure_rce_external_tools/constants.js} +11 -3
  184. package/es/rce/plugins/instructure_rce_external_tools/dialog-helper.js +19 -4
  185. package/es/rce/plugins/instructure_rce_external_tools/helpers/tags.js +0 -2
  186. package/es/rce/plugins/instructure_rce_external_tools/jquery/jquery.dropdownList.js +130 -136
  187. package/es/rce/plugins/instructure_rce_external_tools/lti11-content-items/RceLti11ContentItem.js +100 -95
  188. package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/Lti13ContentItemJson.js +1 -0
  189. package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/RceLti13ContentItem.js +2 -19
  190. package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/models/BaseLinkContentItem.js +1 -14
  191. package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/models/HtmlFragmentContentItem.js +1 -6
  192. package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/models/ImageContentItem.js +1 -9
  193. package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/models/LinkContentItem.js +1 -1
  194. package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/models/ResourceLinkContentItem.js +3 -5
  195. package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/processEditorContentItems.js +18 -10
  196. package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/rceLti13ContentItemFromJson.js +4 -4
  197. package/es/rce/plugins/instructure_rce_external_tools/plugin.js +7 -16
  198. package/es/rce/plugins/instructure_rce_external_tools/util/addParentFrameContextToUrl.js +1 -1
  199. package/es/rce/plugins/instructure_record/AudioOptionsTray/TrayController.js +1 -25
  200. package/es/rce/plugins/instructure_record/AudioOptionsTray/index.js +1 -4
  201. package/es/rce/plugins/instructure_record/MediaPanel/index.js +1 -9
  202. package/es/rce/plugins/instructure_record/VideoOptionsTray/TrayController.js +8 -51
  203. package/es/rce/plugins/instructure_record/VideoOptionsTray/index.js +4 -17
  204. package/es/rce/plugins/instructure_record/clickCallback.js +7 -15
  205. package/es/rce/plugins/instructure_record/mediaTranslations.js +1 -0
  206. package/es/rce/plugins/instructure_record/plugin.js +11 -18
  207. package/es/rce/plugins/instructure_search_and_replace/clickCallback.js +2 -5
  208. package/es/rce/plugins/instructure_search_and_replace/components/FindReplaceTray.js +20 -35
  209. package/es/rce/plugins/instructure_search_and_replace/components/FindReplaceTrayController.js +3 -18
  210. package/es/rce/plugins/instructure_search_and_replace/getSelectionContext.js +2 -9
  211. package/es/rce/plugins/instructure_search_and_replace/plugin.js +1 -3
  212. package/es/rce/plugins/instructure_studio_media_options/plugin.js +1 -1
  213. package/es/rce/plugins/instructure_wordcount/clickCallback.js +2 -5
  214. package/es/rce/plugins/instructure_wordcount/components/WordCountModal.js +1 -4
  215. package/es/rce/plugins/instructure_wordcount/plugin.js +1 -0
  216. package/es/rce/plugins/instructure_wordcount/utils/countContent.js +1 -8
  217. package/es/rce/plugins/instructure_wordcount/utils/tableContent.js +1 -0
  218. package/es/rce/plugins/shared/CanvasContentTray.js +22 -49
  219. package/es/rce/plugins/shared/CheckerboardStyling.js +1 -1
  220. package/es/rce/plugins/shared/ColorInput.js +5 -14
  221. package/es/rce/plugins/shared/ConditionalTooltip.js +1 -0
  222. package/es/rce/plugins/shared/ContentSelection.js +17 -58
  223. package/es/rce/plugins/shared/DimensionUtils.js +1 -8
  224. package/es/rce/plugins/shared/DimensionsInput/DimensionInput.js +6 -6
  225. package/es/rce/plugins/shared/DimensionsInput/index.js +37 -15
  226. package/es/rce/plugins/shared/DimensionsInput/useDimensionsState.js +5 -29
  227. package/es/rce/plugins/shared/ErrorBoundary.js +2 -5
  228. package/es/rce/plugins/shared/EventUtils.js +1 -3
  229. package/es/rce/plugins/shared/Filter.js +8 -38
  230. package/es/rce/plugins/shared/FixedContentTray.js +3 -3
  231. package/es/rce/plugins/shared/ImageCropper/DirectionRegion.js +1 -8
  232. package/es/rce/plugins/shared/ImageCropper/Modal.js +4 -7
  233. package/es/rce/plugins/shared/ImageCropper/Preview.js +7 -11
  234. package/es/rce/plugins/shared/ImageCropper/constants.js +1 -0
  235. package/es/rce/plugins/shared/ImageCropper/controls/CustomNumberInput.js +2 -5
  236. package/es/rce/plugins/shared/ImageCropper/controls/ResetControls.js +1 -0
  237. package/es/rce/plugins/shared/ImageCropper/controls/RotationControls.js +1 -10
  238. package/es/rce/plugins/shared/ImageCropper/controls/ShapeControls.js +1 -0
  239. package/es/rce/plugins/shared/ImageCropper/controls/ZoomControls.js +1 -11
  240. package/es/rce/plugins/shared/ImageCropper/controls/index.js +1 -0
  241. package/es/rce/plugins/shared/ImageCropper/controls/useDebouncedNumericValue.js +3 -16
  242. package/es/rce/plugins/shared/ImageCropper/controls/utils.js +1 -2
  243. package/es/rce/plugins/shared/ImageCropper/imageCropUtils.js +1 -10
  244. package/es/rce/plugins/shared/ImageCropper/index.js +1 -0
  245. package/es/rce/plugins/shared/ImageCropper/propTypes.js +1 -0
  246. package/es/rce/plugins/shared/ImageCropper/reducers/imageCropper.js +15 -14
  247. package/es/rce/plugins/shared/ImageCropper/shape.js +1 -0
  248. package/es/rce/plugins/shared/ImageCropper/svg/index.js +1 -2
  249. package/es/rce/plugins/shared/ImageCropper/svg/shape.js +1 -17
  250. package/es/rce/plugins/shared/ImageCropper/svg/utils.js +1 -0
  251. package/es/rce/plugins/shared/ImageCropper/useKeyMouseEvents.js +19 -46
  252. package/es/rce/plugins/shared/ImageCropper/useMouseWheel.js +8 -10
  253. package/es/rce/plugins/shared/ImageOptionsForm.js +1 -2
  254. package/es/rce/plugins/shared/LinkDisplay.js +1 -2
  255. package/es/rce/plugins/shared/PreviewIcon.js +1 -6
  256. package/es/rce/plugins/shared/Previewable.js +1 -0
  257. package/es/rce/plugins/shared/RceFileBrowser.js +5 -7
  258. package/es/rce/plugins/shared/StoreContext.js +1 -2
  259. package/es/rce/plugins/shared/StudioLtiSupportUtils.js +10 -6
  260. package/es/rce/plugins/shared/UnknownFileTypePanel.js +1 -0
  261. package/es/rce/plugins/shared/Upload/CanvasContentPanel.js +13 -18
  262. package/es/rce/plugins/shared/Upload/CategoryProcessor.js +1 -1
  263. package/es/rce/plugins/shared/Upload/ComputerPanel.js +8 -26
  264. package/es/rce/plugins/shared/Upload/PanelFilter.js +3 -12
  265. package/es/rce/plugins/shared/Upload/SvgCategoryProcessor.js +4 -3
  266. package/es/rce/plugins/shared/Upload/UploadFile.js +15 -18
  267. package/es/rce/plugins/shared/Upload/UploadFileModal.js +9 -25
  268. package/es/rce/plugins/shared/Upload/UrlPanel.js +1 -0
  269. package/es/rce/plugins/shared/Upload/UsageRightsSelectBox.js +7 -12
  270. package/es/rce/plugins/shared/Upload/doFileUpload.js +4 -6
  271. package/es/rce/plugins/shared/Upload/index.js +1 -0
  272. package/es/rce/plugins/shared/ai_tools/AIResponseModal.js +1 -3
  273. package/es/rce/plugins/shared/ai_tools/AIToolsTray.js +6 -24
  274. package/es/rce/plugins/shared/ai_tools/aiicons.js +1 -0
  275. package/es/rce/plugins/shared/ai_tools/index.js +1 -0
  276. package/es/rce/plugins/shared/buildDownloadUrl.js +0 -2
  277. package/es/rce/plugins/shared/canvasContentUtils.js +6 -9
  278. package/es/rce/plugins/shared/compressionUtils.js +1 -8
  279. package/es/rce/plugins/shared/dateUtils.js +1 -1
  280. package/es/rce/plugins/shared/do-fetch-api-effect/defaultFetchOptions.js +4 -2
  281. package/es/rce/plugins/shared/do-fetch-api-effect/doFetchApi.js +7 -10
  282. package/es/rce/plugins/shared/do-fetch-api-effect/index.js +1 -0
  283. package/es/rce/plugins/shared/do-fetch-api-effect/parse-link-header.js +6 -20
  284. package/es/rce/plugins/shared/do-fetch-api-effect/query-string-encoding.js +5 -3
  285. package/es/rce/plugins/shared/fileShape.js +4 -9
  286. package/es/rce/plugins/shared/fileTypeUtils.js +32 -42
  287. package/es/rce/plugins/shared/fileUtils.js +1 -2
  288. package/es/rce/plugins/shared/linkUtils.js +1 -16
  289. package/es/rce/plugins/shared/round.js +1 -0
  290. package/es/rce/plugins/shared/trayUtils.js +4 -3
  291. package/es/rce/plugins/shared/useDataUrl.js +9 -9
  292. package/es/rce/plugins/shared/useFilterSettings.js +3 -3
  293. package/es/rce/plugins/tinymce-a11y-checker/components/ColorField.js +2 -6
  294. package/es/rce/plugins/tinymce-a11y-checker/components/checker.js +5 -63
  295. package/es/rce/plugins/tinymce-a11y-checker/components/color-picker.js +1 -2
  296. package/es/rce/plugins/tinymce-a11y-checker/components/placeholder-svg.js +1 -0
  297. package/es/rce/plugins/tinymce-a11y-checker/components/pointer.js +1 -0
  298. package/es/rce/plugins/tinymce-a11y-checker/node-checker.js +1 -6
  299. package/es/rce/plugins/tinymce-a11y-checker/plugin.js +4 -7
  300. package/es/rce/plugins/tinymce-a11y-checker/rules/adjacent-links.js +3 -26
  301. package/es/rce/plugins/tinymce-a11y-checker/rules/headings-sequence.js +9 -38
  302. package/es/rce/plugins/tinymce-a11y-checker/rules/headings-start-at-h2.js +1 -5
  303. package/es/rce/plugins/tinymce-a11y-checker/rules/img-alt-filename.js +1 -2
  304. package/es/rce/plugins/tinymce-a11y-checker/rules/img-alt-length.js +1 -1
  305. package/es/rce/plugins/tinymce-a11y-checker/rules/img-alt.js +1 -2
  306. package/es/rce/plugins/tinymce-a11y-checker/rules/index.js +1 -0
  307. package/es/rce/plugins/tinymce-a11y-checker/rules/large-text-contrast.js +1 -4
  308. package/es/rce/plugins/tinymce-a11y-checker/rules/list-structure.js +5 -24
  309. package/es/rce/plugins/tinymce-a11y-checker/rules/paragraphs-for-headings.js +1 -3
  310. package/es/rce/plugins/tinymce-a11y-checker/rules/small-text-contrast.js +1 -6
  311. package/es/rce/plugins/tinymce-a11y-checker/rules/table-caption.js +1 -3
  312. package/es/rce/plugins/tinymce-a11y-checker/rules/table-header-scope.js +1 -2
  313. package/es/rce/plugins/tinymce-a11y-checker/rules/table-header.js +1 -9
  314. package/es/rce/plugins/tinymce-a11y-checker/utils/colors.js +1 -0
  315. package/es/rce/plugins/tinymce-a11y-checker/utils/describe.js +1 -7
  316. package/es/rce/plugins/tinymce-a11y-checker/utils/dom.js +1 -26
  317. package/es/rce/plugins/tinymce-a11y-checker/utils/indicate.js +16 -15
  318. package/es/rce/plugins/tinymce-a11y-checker/utils/rgb-hex.js +7 -10
  319. package/es/rce/plugins/tinymce-a11y-checker/utils/strings.js +1 -4
  320. package/es/rce/root.js +9 -8
  321. package/es/rce/sanitizePlugins.js +1 -3
  322. package/es/rce/style.js +1 -4
  323. package/es/rce/tinyRCE.js +13 -9
  324. package/es/rce/tinymce.oxide.content.min.css.js +1 -0
  325. package/es/rce/tinymce.oxide.skin.min.css.js +1 -0
  326. package/es/rce/transformContent.js +8 -10
  327. package/es/rce/types.js +1 -0
  328. package/es/rce/userOS.js +1 -1
  329. package/es/rce/wrapInitCb.js +50 -43
  330. package/es/rcs/api.js +61 -116
  331. package/es/rcs/buildError.js +5 -17
  332. package/es/rcs/fake.js +4 -13
  333. package/es/sidebar/actions/all_files.js +2 -0
  334. package/es/sidebar/actions/data.js +4 -7
  335. package/es/sidebar/actions/documents.js +9 -6
  336. package/es/sidebar/actions/files.js +3 -6
  337. package/es/sidebar/actions/filter.js +1 -0
  338. package/es/sidebar/actions/flickr.js +1 -1
  339. package/es/sidebar/actions/images.js +12 -11
  340. package/es/sidebar/actions/links.js +1 -0
  341. package/es/sidebar/actions/media.js +12 -10
  342. package/es/sidebar/actions/session.js +1 -3
  343. package/es/sidebar/actions/ui.js +1 -0
  344. package/es/sidebar/actions/upload.js +14 -39
  345. package/es/sidebar/containers/Sidebar.js +1 -2
  346. package/es/sidebar/containers/sidebarHandlers.js +3 -1
  347. package/es/sidebar/dragHtml.js +5 -3
  348. package/es/sidebar/reducers/all_files.js +4 -3
  349. package/es/sidebar/reducers/collection.js +12 -13
  350. package/es/sidebar/reducers/collections.js +5 -5
  351. package/es/sidebar/reducers/documents.js +6 -13
  352. package/es/sidebar/reducers/files.js +3 -3
  353. package/es/sidebar/reducers/filter.js +1 -8
  354. package/es/sidebar/reducers/flickr.js +9 -9
  355. package/es/sidebar/reducers/folder.js +15 -15
  356. package/es/sidebar/reducers/folders.js +3 -3
  357. package/es/sidebar/reducers/images.js +3 -13
  358. package/es/sidebar/reducers/index.js +3 -1
  359. package/es/sidebar/reducers/media.js +6 -13
  360. package/es/sidebar/reducers/newPageLinkExpanded.js +1 -2
  361. package/es/sidebar/reducers/noop.js +1 -0
  362. package/es/sidebar/reducers/rootFolderId.js +1 -2
  363. package/es/sidebar/reducers/session.js +3 -3
  364. package/es/sidebar/reducers/ui.js +3 -16
  365. package/es/sidebar/reducers/upload.js +8 -40
  366. package/es/sidebar/store/configureStore.js +1 -0
  367. package/es/sidebar/store/initialState.js +13 -24
  368. package/es/translations/locales/ab.js +1 -0
  369. package/es/translations/locales/ar.js +67 -9
  370. package/es/translations/locales/ca.js +67 -9
  371. package/es/translations/locales/cs.js +1 -0
  372. package/es/translations/locales/cs_CZ.js +1 -0
  373. package/es/translations/locales/cy.js +67 -9
  374. package/es/translations/locales/da-x-k12.js +67 -9
  375. package/es/translations/locales/da.js +67 -9
  376. package/es/translations/locales/da_DK.js +1 -0
  377. package/es/translations/locales/de.js +67 -9
  378. package/es/translations/locales/el.js +4 -0
  379. package/es/translations/locales/en-AU-x-unimelb.js +67 -9
  380. package/es/translations/locales/en-GB-x-ukhe.js +67 -9
  381. package/es/translations/locales/en.js +72 -8
  382. package/es/translations/locales/en_AU.js +67 -9
  383. package/es/translations/locales/en_CA.js +67 -9
  384. package/es/translations/locales/en_CY.js +67 -9
  385. package/es/translations/locales/en_GB.js +67 -9
  386. package/es/translations/locales/en_NZ.js +1 -0
  387. package/es/translations/locales/en_SE.js +1 -0
  388. package/es/translations/locales/en_US.js +1 -0
  389. package/es/translations/locales/es.js +67 -9
  390. package/es/translations/locales/es_ES.js +67 -9
  391. package/es/translations/locales/es_GT.js +1 -0
  392. package/es/translations/locales/fa_IR.js +7 -0
  393. package/es/translations/locales/fi.js +67 -9
  394. package/es/translations/locales/fr.js +67 -9
  395. package/es/translations/locales/fr_CA.js +68 -10
  396. package/es/translations/locales/ga.js +5 -13
  397. package/es/translations/locales/he.js +7 -0
  398. package/es/translations/locales/hi.js +67 -9
  399. package/es/translations/locales/ht.js +67 -9
  400. package/es/translations/locales/hu.js +7 -6
  401. package/es/translations/locales/hu_HU.js +1 -0
  402. package/es/translations/locales/hy.js +1 -0
  403. package/es/translations/locales/id.js +67 -9
  404. package/es/translations/locales/id_ID.js +1 -0
  405. package/es/translations/locales/is.js +67 -9
  406. package/es/translations/locales/it.js +67 -9
  407. package/es/translations/locales/ja.js +67 -9
  408. package/es/translations/locales/ko.js +1 -0
  409. package/es/translations/locales/ko_KR.js +1 -0
  410. package/es/translations/locales/lt.js +1 -0
  411. package/es/translations/locales/lt_LT.js +1 -0
  412. package/es/translations/locales/mi.js +67 -9
  413. package/es/translations/locales/mn_MN.js +1 -0
  414. package/es/translations/locales/ms.js +67 -9
  415. package/es/translations/locales/nb-x-k12.js +67 -9
  416. package/es/translations/locales/nb.js +67 -9
  417. package/es/translations/locales/nl.js +67 -9
  418. package/es/translations/locales/nl_NL.js +1 -0
  419. package/es/translations/locales/nn.js +7 -6
  420. package/es/translations/locales/pl.js +67 -9
  421. package/es/translations/locales/pt.js +67 -9
  422. package/es/translations/locales/pt_BR.js +67 -9
  423. package/es/translations/locales/ro.js +1 -0
  424. package/es/translations/locales/ru.js +67 -9
  425. package/es/translations/locales/se.js +1 -0
  426. package/es/translations/locales/sl.js +67 -9
  427. package/es/translations/locales/sv-x-k12.js +67 -9
  428. package/es/translations/locales/sv.js +67 -9
  429. package/es/translations/locales/sv_SE.js +1 -0
  430. package/es/translations/locales/tg.js +1 -0
  431. package/es/translations/locales/th.js +67 -9
  432. package/es/translations/locales/th_TH.js +1 -0
  433. package/es/translations/locales/tl_PH.js +1 -0
  434. package/es/translations/locales/tr.js +7 -0
  435. package/es/translations/locales/uk_UA.js +7 -0
  436. package/es/translations/locales/vi.js +67 -9
  437. package/es/translations/locales/vi_VN.js +1 -0
  438. package/es/translations/locales/zh-Hans.js +67 -9
  439. package/es/translations/locales/zh-Hant.js +67 -9
  440. package/es/translations/locales/zh.js +67 -9
  441. package/es/translations/locales/zh_HK.js +67 -9
  442. package/es/translations/locales/zh_TW.Big5.js +1 -0
  443. package/es/translations/locales/zh_TW.js +1 -0
  444. package/es/translations/tinymce/ar_SA.js +1 -0
  445. package/es/translations/tinymce/fi.js +1 -0
  446. package/es/translations/tinymce/ga.js +1 -0
  447. package/es/translations/tinymce/id.js +1 -0
  448. package/es/translations/tinymce/ru.js +1 -0
  449. package/es/translations/tinymce/ru_RU.js +1 -0
  450. package/es/translations/tinymce/sl.js +1 -0
  451. package/es/translations/tinymce/sr.js +1 -0
  452. package/es/translations/tinymce/th.js +1 -0
  453. package/es/translations/tinymce/uk_UA.js +1 -0
  454. package/es/translations/tinymce/vi_VN.js +1 -0
  455. package/es/util/TypedDict.js +4 -2
  456. package/es/util/encrypted-storage.js +3 -13
  457. package/es/util/file-url-util.js +1 -6
  458. package/es/util/fullscreenHelpers.js +4 -1
  459. package/es/util/instui-icon-helper.js +4 -3
  460. package/es/util/loadingPlaceholder.js +38 -39
  461. package/es/util/simpleCache.js +0 -3
  462. package/es/util/string-util.js +1 -1
  463. package/es/util/textarea-editing-util.js +3 -7
  464. package/es/util/tinymce-plugin-util.js +0 -5
  465. package/es/util/url-util.js +16 -25
  466. package/eslint.config.js +239 -0
  467. package/jest.config.js +1 -1
  468. package/package.json +76 -81
  469. package/scripts/build-canvas +2 -1
  470. package/scripts/build.js +4 -4
  471. package/testcafe/RCEWrapper.test.js +0 -1
  472. package/testcafe/StatusBar.test.js +0 -1
  473. package/testcafe/axe.test.js +3 -4
  474. package/testcafe/enhanceUserContent.test.js +0 -1
  475. package/tsconfig.json +20 -15
  476. package/.eslintrc +0 -45
  477. package/.prettierignore +0 -6
  478. package/es/rce/__mocks__/_mockCryptoEs.js +0 -124
  479. package/es/rce/__mocks__/styleMock.js +0 -18
  480. package/es/rce/__mocks__/tinymceReact.js +0 -55
  481. package/es/rce/plugins/tinymce-a11y-checker/rules/__mocks__/index.js +0 -53
@@ -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
- }; // gets the H tag that is furthest down in the tree from elem(inclusive)
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
- }; // gets all siblings of elem that come before the elem ordered by nearest to
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
- }; // a valid prior H tag is greater or equal to one less than current
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; // Remove the now empty siblings
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)