roosterjs-content-model-plugins 9.4.1 → 9.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (536) hide show
  1. package/README.md +10 -10
  2. package/lib/autoFormat/hyphen/transformHyphen.d.ts +2 -2
  3. package/lib/autoFormat/hyphen/transformHyphen.js.map +1 -1
  4. package/lib/autoFormat/link/createLinkAfterSpace.d.ts +2 -2
  5. package/lib/autoFormat/link/createLinkAfterSpace.js.map +1 -1
  6. package/lib/autoFormat/list/keyboardListTrigger.d.ts +2 -2
  7. package/lib/autoFormat/list/keyboardListTrigger.js.map +1 -1
  8. package/lib/autoFormat/numbers/transformFraction.d.ts +2 -2
  9. package/lib/autoFormat/numbers/transformFraction.js.map +1 -1
  10. package/lib/autoFormat/numbers/transformOrdinals.d.ts +2 -2
  11. package/lib/autoFormat/numbers/transformOrdinals.js.map +1 -1
  12. package/lib/customReplace/CustomReplacePlugin.d.ts +2 -2
  13. package/lib/customReplace/CustomReplacePlugin.js.map +1 -1
  14. package/lib/edit/EditPlugin.d.ts +10 -0
  15. package/lib/edit/EditPlugin.js +39 -0
  16. package/lib/edit/EditPlugin.js.map +1 -1
  17. package/lib/edit/deleteSteps/deleteAllSegmentBefore.js +2 -1
  18. package/lib/edit/deleteSteps/deleteAllSegmentBefore.js.map +1 -1
  19. package/lib/edit/deleteSteps/deleteCollapsedSelection.js +5 -4
  20. package/lib/edit/deleteSteps/deleteCollapsedSelection.js.map +1 -1
  21. package/lib/edit/deleteSteps/deleteEmptyQuote.js +33 -29
  22. package/lib/edit/deleteSteps/deleteEmptyQuote.js.map +1 -1
  23. package/lib/edit/deleteSteps/deleteWordSelection.js +1 -1
  24. package/lib/edit/deleteSteps/deleteWordSelection.js.map +1 -1
  25. package/lib/edit/handleKeyboardEventCommon.d.ts +2 -2
  26. package/lib/edit/handleKeyboardEventCommon.js.map +1 -1
  27. package/lib/edit/inputSteps/handleEnterOnList.js +32 -56
  28. package/lib/edit/inputSteps/handleEnterOnList.js.map +1 -1
  29. package/lib/edit/inputSteps/handleEnterOnParagraph.d.ts +5 -0
  30. package/lib/edit/inputSteps/handleEnterOnParagraph.js +22 -0
  31. package/lib/edit/inputSteps/handleEnterOnParagraph.js.map +1 -0
  32. package/lib/edit/keyboardDelete.js +1 -1
  33. package/lib/edit/keyboardDelete.js.map +1 -1
  34. package/lib/edit/keyboardEnter.d.ts +5 -0
  35. package/lib/edit/keyboardEnter.js +44 -0
  36. package/lib/edit/keyboardEnter.js.map +1 -0
  37. package/lib/edit/keyboardInput.js +4 -18
  38. package/lib/edit/keyboardInput.js.map +1 -1
  39. package/lib/edit/keyboardTab.js.map +1 -1
  40. package/lib/edit/tabUtils/handleTabOnList.d.ts +2 -2
  41. package/lib/edit/tabUtils/handleTabOnList.js.map +1 -1
  42. package/lib/edit/tabUtils/handleTabOnParagraph.d.ts +2 -2
  43. package/lib/edit/tabUtils/handleTabOnParagraph.js +9 -7
  44. package/lib/edit/tabUtils/handleTabOnParagraph.js.map +1 -1
  45. package/lib/edit/tabUtils/handleTabOnTable.d.ts +2 -2
  46. package/lib/edit/tabUtils/handleTabOnTable.js.map +1 -1
  47. package/lib/edit/tabUtils/handleTabOnTableCell.d.ts +2 -2
  48. package/lib/edit/tabUtils/handleTabOnTableCell.js +5 -4
  49. package/lib/edit/tabUtils/handleTabOnTableCell.js.map +1 -1
  50. package/lib/edit/utils/getLeafSiblingBlock.d.ts +5 -5
  51. package/lib/edit/utils/getLeafSiblingBlock.js.map +1 -1
  52. package/lib/edit/utils/splitParagraph.d.ts +9 -0
  53. package/lib/edit/utils/splitParagraph.js +29 -0
  54. package/lib/edit/utils/splitParagraph.js.map +1 -0
  55. package/lib/imageEdit/Cropper/createImageCropper.d.ts +10 -0
  56. package/lib/imageEdit/Cropper/createImageCropper.js +80 -0
  57. package/lib/imageEdit/Cropper/createImageCropper.js.map +1 -0
  58. package/lib/imageEdit/Cropper/cropperContext.d.ts +8 -0
  59. package/lib/imageEdit/Cropper/cropperContext.js +73 -0
  60. package/lib/imageEdit/Cropper/cropperContext.js.map +1 -0
  61. package/lib/imageEdit/ImageEditPlugin.d.ts +66 -0
  62. package/lib/imageEdit/ImageEditPlugin.js +328 -0
  63. package/lib/imageEdit/ImageEditPlugin.js.map +1 -0
  64. package/lib/imageEdit/Resizer/createImageResizer.d.ts +12 -0
  65. package/lib/imageEdit/Resizer/createImageResizer.js +89 -0
  66. package/lib/imageEdit/Resizer/createImageResizer.js.map +1 -0
  67. package/lib/imageEdit/Resizer/resizerContext.d.ts +8 -0
  68. package/lib/imageEdit/Resizer/resizerContext.js +61 -0
  69. package/lib/imageEdit/Resizer/resizerContext.js.map +1 -0
  70. package/lib/imageEdit/Resizer/updateSideHandlesVisibility.d.ts +4 -0
  71. package/lib/imageEdit/Resizer/updateSideHandlesVisibility.js +17 -0
  72. package/lib/imageEdit/Resizer/updateSideHandlesVisibility.js.map +1 -0
  73. package/lib/imageEdit/Rotator/createImageRotator.d.ts +6 -0
  74. package/lib/imageEdit/Rotator/createImageRotator.js +76 -0
  75. package/lib/imageEdit/Rotator/createImageRotator.js.map +1 -0
  76. package/lib/imageEdit/Rotator/rotatorContext.d.ts +8 -0
  77. package/lib/imageEdit/Rotator/rotatorContext.js +36 -0
  78. package/lib/imageEdit/Rotator/rotatorContext.js.map +1 -0
  79. package/lib/imageEdit/Rotator/updateRotateHandle.d.ts +7 -0
  80. package/lib/imageEdit/Rotator/updateRotateHandle.js +55 -0
  81. package/lib/imageEdit/Rotator/updateRotateHandle.js.map +1 -0
  82. package/lib/imageEdit/constants/constants.d.ts +73 -0
  83. package/lib/imageEdit/constants/constants.js +81 -0
  84. package/lib/imageEdit/constants/constants.js.map +1 -0
  85. package/lib/imageEdit/types/DragAndDropContext.d.ts +39 -0
  86. package/lib/imageEdit/types/DragAndDropContext.js +3 -0
  87. package/lib/imageEdit/types/DragAndDropContext.js.map +1 -0
  88. package/lib/imageEdit/types/GeneratedImageSize.d.ts +33 -0
  89. package/lib/imageEdit/types/GeneratedImageSize.js +3 -0
  90. package/lib/imageEdit/types/GeneratedImageSize.js.map +1 -0
  91. package/lib/imageEdit/types/ImageEditElementClass.d.ts +30 -0
  92. package/lib/imageEdit/types/ImageEditElementClass.js +35 -0
  93. package/lib/imageEdit/types/ImageEditElementClass.js.map +1 -0
  94. package/lib/imageEdit/types/ImageEditOptions.d.ts +55 -0
  95. package/lib/imageEdit/types/ImageEditOptions.js +3 -0
  96. package/lib/imageEdit/types/ImageEditOptions.js.map +1 -0
  97. package/lib/imageEdit/types/ImageHtmlOptions.d.ts +18 -0
  98. package/lib/imageEdit/types/ImageHtmlOptions.js +3 -0
  99. package/lib/imageEdit/types/ImageHtmlOptions.js.map +1 -0
  100. package/lib/imageEdit/utils/applyChange.d.ts +12 -0
  101. package/lib/imageEdit/utils/applyChange.js +77 -0
  102. package/lib/imageEdit/utils/applyChange.js.map +1 -0
  103. package/lib/imageEdit/utils/canRegenerateImage.d.ts +8 -0
  104. package/lib/imageEdit/utils/canRegenerateImage.js +32 -0
  105. package/lib/imageEdit/utils/canRegenerateImage.js.map +1 -0
  106. package/lib/imageEdit/utils/checkEditInfoState.d.ts +41 -0
  107. package/lib/imageEdit/utils/checkEditInfoState.js +54 -0
  108. package/lib/imageEdit/utils/checkEditInfoState.js.map +1 -0
  109. package/lib/imageEdit/utils/createImageWrapper.d.ts +18 -0
  110. package/lib/imageEdit/utils/createImageWrapper.js +87 -0
  111. package/lib/imageEdit/utils/createImageWrapper.js.map +1 -0
  112. package/lib/imageEdit/utils/doubleCheckResize.d.ts +12 -0
  113. package/lib/imageEdit/utils/doubleCheckResize.js +36 -0
  114. package/lib/imageEdit/utils/doubleCheckResize.js.map +1 -0
  115. package/lib/imageEdit/utils/generateDataURL.d.ts +13 -0
  116. package/lib/imageEdit/utils/generateDataURL.js +50 -0
  117. package/lib/imageEdit/utils/generateDataURL.js.map +1 -0
  118. package/lib/imageEdit/utils/generateImageSize.d.ts +15 -0
  119. package/lib/imageEdit/utils/generateImageSize.js +46 -0
  120. package/lib/imageEdit/utils/generateImageSize.js.map +1 -0
  121. package/lib/imageEdit/utils/getDropAndDragHelpers.d.ts +10 -0
  122. package/lib/imageEdit/utils/getDropAndDragHelpers.js +24 -0
  123. package/lib/imageEdit/utils/getDropAndDragHelpers.js.map +1 -0
  124. package/lib/imageEdit/utils/getHTMLImageOptions.d.ts +7 -0
  125. package/lib/imageEdit/utils/getHTMLImageOptions.js +22 -0
  126. package/lib/imageEdit/utils/getHTMLImageOptions.js.map +1 -0
  127. package/lib/imageEdit/utils/getSelectedContentModelImage.d.ts +5 -0
  128. package/lib/imageEdit/utils/getSelectedContentModelImage.js +16 -0
  129. package/lib/imageEdit/utils/getSelectedContentModelImage.js.map +1 -0
  130. package/lib/imageEdit/utils/imageEditUtils.d.ts +39 -0
  131. package/lib/imageEdit/utils/imageEditUtils.js +102 -0
  132. package/lib/imageEdit/utils/imageEditUtils.js.map +1 -0
  133. package/lib/imageEdit/utils/updateHandleCursor.d.ts +7 -0
  134. package/lib/imageEdit/utils/updateHandleCursor.js +34 -0
  135. package/lib/imageEdit/utils/updateHandleCursor.js.map +1 -0
  136. package/lib/imageEdit/utils/updateImageEditInfo.d.ts +10 -0
  137. package/lib/imageEdit/utils/updateImageEditInfo.js +49 -0
  138. package/lib/imageEdit/utils/updateImageEditInfo.js.map +1 -0
  139. package/lib/imageEdit/utils/updateWrapper.d.ts +6 -0
  140. package/lib/imageEdit/utils/updateWrapper.js +87 -0
  141. package/lib/imageEdit/utils/updateWrapper.js.map +1 -0
  142. package/lib/index.d.ts +2 -1
  143. package/lib/index.js +3 -3
  144. package/lib/index.js.map +1 -1
  145. package/lib/paste/DefaultSanitizers.d.ts +10 -0
  146. package/lib/paste/DefaultSanitizers.js +25 -0
  147. package/lib/paste/DefaultSanitizers.js.map +1 -0
  148. package/lib/paste/PastePlugin.d.ts +4 -2
  149. package/lib/paste/PastePlugin.js +26 -1
  150. package/lib/paste/PastePlugin.js.map +1 -1
  151. package/lib/paste/WordDesktop/processPastedContentFromWordDesktop.js +13 -0
  152. package/lib/paste/WordDesktop/processPastedContentFromWordDesktop.js.map +1 -1
  153. package/lib/paste/utils/chainSanitizerCallback.d.ts +9 -0
  154. package/lib/paste/utils/chainSanitizerCallback.js +36 -0
  155. package/lib/paste/utils/chainSanitizerCallback.js.map +1 -0
  156. package/lib/picker/getQueryString.d.ts +2 -2
  157. package/lib/picker/getQueryString.js.map +1 -1
  158. package/lib/pluginUtils/splitTextSegment.d.ts +2 -2
  159. package/lib/pluginUtils/splitTextSegment.js.map +1 -1
  160. package/lib/tableEdit/editors/TableEditor.d.ts +3 -0
  161. package/lib/tableEdit/editors/TableEditor.js +4 -0
  162. package/lib/tableEdit/editors/TableEditor.js.map +1 -1
  163. package/lib/tableEdit/editors/features/CellResizer.d.ts +39 -1
  164. package/lib/tableEdit/editors/features/CellResizer.js +27 -11
  165. package/lib/tableEdit/editors/features/CellResizer.js.map +1 -1
  166. package/lib/tableEdit/editors/features/TableInserter.d.ts +17 -0
  167. package/lib/tableEdit/editors/features/TableInserter.js +6 -1
  168. package/lib/tableEdit/editors/features/TableInserter.js.map +1 -1
  169. package/lib/tableEdit/editors/features/TableMover.d.ts +2 -2
  170. package/lib/tableEdit/editors/features/TableMover.js +4 -4
  171. package/lib/tableEdit/editors/features/TableMover.js.map +1 -1
  172. package/lib/tableEdit/editors/features/TableResizer.d.ts +40 -1
  173. package/lib/tableEdit/editors/features/TableResizer.js +25 -7
  174. package/lib/tableEdit/editors/features/TableResizer.js.map +1 -1
  175. package/lib/tableEdit/editors/utils/getTableFromContentModel.d.ts +2 -2
  176. package/lib/tableEdit/editors/utils/getTableFromContentModel.js.map +1 -1
  177. package/lib-amd/autoFormat/hyphen/transformHyphen.d.ts +2 -2
  178. package/lib-amd/autoFormat/hyphen/transformHyphen.js.map +1 -1
  179. package/lib-amd/autoFormat/link/createLinkAfterSpace.d.ts +2 -2
  180. package/lib-amd/autoFormat/link/createLinkAfterSpace.js.map +1 -1
  181. package/lib-amd/autoFormat/list/keyboardListTrigger.d.ts +2 -2
  182. package/lib-amd/autoFormat/list/keyboardListTrigger.js.map +1 -1
  183. package/lib-amd/autoFormat/numbers/transformFraction.d.ts +2 -2
  184. package/lib-amd/autoFormat/numbers/transformFraction.js.map +1 -1
  185. package/lib-amd/autoFormat/numbers/transformOrdinals.d.ts +2 -2
  186. package/lib-amd/autoFormat/numbers/transformOrdinals.js.map +1 -1
  187. package/lib-amd/customReplace/CustomReplacePlugin.d.ts +2 -2
  188. package/lib-amd/customReplace/CustomReplacePlugin.js.map +1 -1
  189. package/lib-amd/edit/EditPlugin.d.ts +10 -0
  190. package/lib-amd/edit/EditPlugin.js +38 -1
  191. package/lib-amd/edit/EditPlugin.js.map +1 -1
  192. package/lib-amd/edit/deleteSteps/deleteAllSegmentBefore.js +2 -1
  193. package/lib-amd/edit/deleteSteps/deleteAllSegmentBefore.js.map +1 -1
  194. package/lib-amd/edit/deleteSteps/deleteCollapsedSelection.js +5 -4
  195. package/lib-amd/edit/deleteSteps/deleteCollapsedSelection.js.map +1 -1
  196. package/lib-amd/edit/deleteSteps/deleteEmptyQuote.js +33 -30
  197. package/lib-amd/edit/deleteSteps/deleteEmptyQuote.js.map +1 -1
  198. package/lib-amd/edit/deleteSteps/deleteWordSelection.js +1 -1
  199. package/lib-amd/edit/deleteSteps/deleteWordSelection.js.map +1 -1
  200. package/lib-amd/edit/handleKeyboardEventCommon.d.ts +2 -2
  201. package/lib-amd/edit/handleKeyboardEventCommon.js.map +1 -1
  202. package/lib-amd/edit/inputSteps/handleEnterOnList.js +32 -57
  203. package/lib-amd/edit/inputSteps/handleEnterOnList.js.map +1 -1
  204. package/lib-amd/edit/inputSteps/handleEnterOnParagraph.d.ts +5 -0
  205. package/lib-amd/edit/inputSteps/handleEnterOnParagraph.js +22 -0
  206. package/lib-amd/edit/inputSteps/handleEnterOnParagraph.js.map +1 -0
  207. package/lib-amd/edit/keyboardDelete.js +1 -1
  208. package/lib-amd/edit/keyboardDelete.js.map +1 -1
  209. package/lib-amd/edit/keyboardEnter.d.ts +5 -0
  210. package/lib-amd/edit/keyboardEnter.js +42 -0
  211. package/lib-amd/edit/keyboardEnter.js.map +1 -0
  212. package/lib-amd/edit/keyboardInput.js +5 -17
  213. package/lib-amd/edit/keyboardInput.js.map +1 -1
  214. package/lib-amd/edit/keyboardTab.js.map +1 -1
  215. package/lib-amd/edit/tabUtils/handleTabOnList.d.ts +2 -2
  216. package/lib-amd/edit/tabUtils/handleTabOnList.js.map +1 -1
  217. package/lib-amd/edit/tabUtils/handleTabOnParagraph.d.ts +2 -2
  218. package/lib-amd/edit/tabUtils/handleTabOnParagraph.js +9 -7
  219. package/lib-amd/edit/tabUtils/handleTabOnParagraph.js.map +1 -1
  220. package/lib-amd/edit/tabUtils/handleTabOnTable.d.ts +2 -2
  221. package/lib-amd/edit/tabUtils/handleTabOnTable.js.map +1 -1
  222. package/lib-amd/edit/tabUtils/handleTabOnTableCell.d.ts +2 -2
  223. package/lib-amd/edit/tabUtils/handleTabOnTableCell.js +5 -4
  224. package/lib-amd/edit/tabUtils/handleTabOnTableCell.js.map +1 -1
  225. package/lib-amd/edit/utils/getLeafSiblingBlock.d.ts +5 -5
  226. package/lib-amd/edit/utils/getLeafSiblingBlock.js.map +1 -1
  227. package/lib-amd/edit/utils/splitParagraph.d.ts +9 -0
  228. package/lib-amd/edit/utils/splitParagraph.js +29 -0
  229. package/lib-amd/edit/utils/splitParagraph.js.map +1 -0
  230. package/lib-amd/imageEdit/Cropper/createImageCropper.d.ts +10 -0
  231. package/lib-amd/imageEdit/Cropper/createImageCropper.js +78 -0
  232. package/lib-amd/imageEdit/Cropper/createImageCropper.js.map +1 -0
  233. package/lib-amd/imageEdit/Cropper/cropperContext.d.ts +8 -0
  234. package/lib-amd/imageEdit/Cropper/cropperContext.js +73 -0
  235. package/lib-amd/imageEdit/Cropper/cropperContext.js.map +1 -0
  236. package/lib-amd/imageEdit/ImageEditPlugin.d.ts +66 -0
  237. package/lib-amd/imageEdit/ImageEditPlugin.js +315 -0
  238. package/lib-amd/imageEdit/ImageEditPlugin.js.map +1 -0
  239. package/lib-amd/imageEdit/Resizer/createImageResizer.d.ts +12 -0
  240. package/lib-amd/imageEdit/Resizer/createImageResizer.js +86 -0
  241. package/lib-amd/imageEdit/Resizer/createImageResizer.js.map +1 -0
  242. package/lib-amd/imageEdit/Resizer/resizerContext.d.ts +8 -0
  243. package/lib-amd/imageEdit/Resizer/resizerContext.js +61 -0
  244. package/lib-amd/imageEdit/Resizer/resizerContext.js.map +1 -0
  245. package/lib-amd/imageEdit/Resizer/updateSideHandlesVisibility.d.ts +4 -0
  246. package/lib-amd/imageEdit/Resizer/updateSideHandlesVisibility.js +19 -0
  247. package/lib-amd/imageEdit/Resizer/updateSideHandlesVisibility.js.map +1 -0
  248. package/lib-amd/imageEdit/Rotator/createImageRotator.d.ts +6 -0
  249. package/lib-amd/imageEdit/Rotator/createImageRotator.js +74 -0
  250. package/lib-amd/imageEdit/Rotator/createImageRotator.js.map +1 -0
  251. package/lib-amd/imageEdit/Rotator/rotatorContext.d.ts +8 -0
  252. package/lib-amd/imageEdit/Rotator/rotatorContext.js +36 -0
  253. package/lib-amd/imageEdit/Rotator/rotatorContext.js.map +1 -0
  254. package/lib-amd/imageEdit/Rotator/updateRotateHandle.d.ts +7 -0
  255. package/lib-amd/imageEdit/Rotator/updateRotateHandle.js +56 -0
  256. package/lib-amd/imageEdit/Rotator/updateRotateHandle.js.map +1 -0
  257. package/lib-amd/imageEdit/constants/constants.d.ts +73 -0
  258. package/lib-amd/imageEdit/constants/constants.js +83 -0
  259. package/lib-amd/imageEdit/constants/constants.js.map +1 -0
  260. package/lib-amd/imageEdit/types/DragAndDropContext.d.ts +39 -0
  261. package/lib-amd/imageEdit/types/DragAndDropContext.js +5 -0
  262. package/lib-amd/imageEdit/types/DragAndDropContext.js.map +1 -0
  263. package/lib-amd/imageEdit/types/GeneratedImageSize.d.ts +33 -0
  264. package/lib-amd/imageEdit/types/GeneratedImageSize.js +5 -0
  265. package/lib-amd/imageEdit/types/GeneratedImageSize.js.map +1 -0
  266. package/lib-amd/imageEdit/types/ImageEditElementClass.d.ts +30 -0
  267. package/lib-amd/imageEdit/types/ImageEditElementClass.js +37 -0
  268. package/lib-amd/imageEdit/types/ImageEditElementClass.js.map +1 -0
  269. package/lib-amd/imageEdit/types/ImageEditOptions.d.ts +55 -0
  270. package/lib-amd/imageEdit/types/ImageEditOptions.js +5 -0
  271. package/lib-amd/imageEdit/types/ImageEditOptions.js.map +1 -0
  272. package/lib-amd/imageEdit/types/ImageHtmlOptions.d.ts +18 -0
  273. package/lib-amd/imageEdit/types/ImageHtmlOptions.js +5 -0
  274. package/lib-amd/imageEdit/types/ImageHtmlOptions.js.map +1 -0
  275. package/lib-amd/imageEdit/utils/applyChange.d.ts +12 -0
  276. package/lib-amd/imageEdit/utils/applyChange.js +75 -0
  277. package/lib-amd/imageEdit/utils/applyChange.js.map +1 -0
  278. package/lib-amd/imageEdit/utils/canRegenerateImage.d.ts +8 -0
  279. package/lib-amd/imageEdit/utils/canRegenerateImage.js +34 -0
  280. package/lib-amd/imageEdit/utils/canRegenerateImage.js.map +1 -0
  281. package/lib-amd/imageEdit/utils/checkEditInfoState.d.ts +41 -0
  282. package/lib-amd/imageEdit/utils/checkEditInfoState.js +55 -0
  283. package/lib-amd/imageEdit/utils/checkEditInfoState.js.map +1 -0
  284. package/lib-amd/imageEdit/utils/createImageWrapper.d.ts +18 -0
  285. package/lib-amd/imageEdit/utils/createImageWrapper.js +86 -0
  286. package/lib-amd/imageEdit/utils/createImageWrapper.js.map +1 -0
  287. package/lib-amd/imageEdit/utils/doubleCheckResize.d.ts +12 -0
  288. package/lib-amd/imageEdit/utils/doubleCheckResize.js +38 -0
  289. package/lib-amd/imageEdit/utils/doubleCheckResize.js.map +1 -0
  290. package/lib-amd/imageEdit/utils/generateDataURL.d.ts +13 -0
  291. package/lib-amd/imageEdit/utils/generateDataURL.js +51 -0
  292. package/lib-amd/imageEdit/utils/generateDataURL.js.map +1 -0
  293. package/lib-amd/imageEdit/utils/generateImageSize.d.ts +15 -0
  294. package/lib-amd/imageEdit/utils/generateImageSize.js +48 -0
  295. package/lib-amd/imageEdit/utils/generateImageSize.js.map +1 -0
  296. package/lib-amd/imageEdit/utils/getDropAndDragHelpers.d.ts +10 -0
  297. package/lib-amd/imageEdit/utils/getDropAndDragHelpers.js +24 -0
  298. package/lib-amd/imageEdit/utils/getDropAndDragHelpers.js.map +1 -0
  299. package/lib-amd/imageEdit/utils/getHTMLImageOptions.d.ts +7 -0
  300. package/lib-amd/imageEdit/utils/getHTMLImageOptions.js +23 -0
  301. package/lib-amd/imageEdit/utils/getHTMLImageOptions.js.map +1 -0
  302. package/lib-amd/imageEdit/utils/getSelectedContentModelImage.d.ts +5 -0
  303. package/lib-amd/imageEdit/utils/getSelectedContentModelImage.js +17 -0
  304. package/lib-amd/imageEdit/utils/getSelectedContentModelImage.js.map +1 -0
  305. package/lib-amd/imageEdit/utils/imageEditUtils.d.ts +39 -0
  306. package/lib-amd/imageEdit/utils/imageEditUtils.js +103 -0
  307. package/lib-amd/imageEdit/utils/imageEditUtils.js.map +1 -0
  308. package/lib-amd/imageEdit/utils/updateHandleCursor.d.ts +7 -0
  309. package/lib-amd/imageEdit/utils/updateHandleCursor.js +36 -0
  310. package/lib-amd/imageEdit/utils/updateHandleCursor.js.map +1 -0
  311. package/lib-amd/imageEdit/utils/updateImageEditInfo.d.ts +10 -0
  312. package/lib-amd/imageEdit/utils/updateImageEditInfo.js +48 -0
  313. package/lib-amd/imageEdit/utils/updateImageEditInfo.js.map +1 -0
  314. package/lib-amd/imageEdit/utils/updateWrapper.d.ts +6 -0
  315. package/lib-amd/imageEdit/utils/updateWrapper.js +82 -0
  316. package/lib-amd/imageEdit/utils/updateWrapper.js.map +1 -0
  317. package/lib-amd/index.d.ts +2 -1
  318. package/lib-amd/index.js +3 -3
  319. package/lib-amd/index.js.map +1 -1
  320. package/lib-amd/paste/DefaultSanitizers.d.ts +10 -0
  321. package/lib-amd/paste/DefaultSanitizers.js +27 -0
  322. package/lib-amd/paste/DefaultSanitizers.js.map +1 -0
  323. package/lib-amd/paste/PastePlugin.d.ts +4 -2
  324. package/lib-amd/paste/PastePlugin.js +24 -2
  325. package/lib-amd/paste/PastePlugin.js.map +1 -1
  326. package/lib-amd/paste/WordDesktop/processPastedContentFromWordDesktop.js +13 -0
  327. package/lib-amd/paste/WordDesktop/processPastedContentFromWordDesktop.js.map +1 -1
  328. package/lib-amd/paste/utils/chainSanitizerCallback.d.ts +9 -0
  329. package/lib-amd/paste/utils/chainSanitizerCallback.js +38 -0
  330. package/lib-amd/paste/utils/chainSanitizerCallback.js.map +1 -0
  331. package/lib-amd/picker/getQueryString.d.ts +2 -2
  332. package/lib-amd/picker/getQueryString.js.map +1 -1
  333. package/lib-amd/pluginUtils/splitTextSegment.d.ts +2 -2
  334. package/lib-amd/pluginUtils/splitTextSegment.js.map +1 -1
  335. package/lib-amd/tableEdit/editors/TableEditor.d.ts +3 -0
  336. package/lib-amd/tableEdit/editors/TableEditor.js +4 -0
  337. package/lib-amd/tableEdit/editors/TableEditor.js.map +1 -1
  338. package/lib-amd/tableEdit/editors/features/CellResizer.d.ts +39 -1
  339. package/lib-amd/tableEdit/editors/features/CellResizer.js +27 -11
  340. package/lib-amd/tableEdit/editors/features/CellResizer.js.map +1 -1
  341. package/lib-amd/tableEdit/editors/features/TableInserter.d.ts +17 -0
  342. package/lib-amd/tableEdit/editors/features/TableInserter.js +6 -1
  343. package/lib-amd/tableEdit/editors/features/TableInserter.js.map +1 -1
  344. package/lib-amd/tableEdit/editors/features/TableMover.d.ts +2 -2
  345. package/lib-amd/tableEdit/editors/features/TableMover.js +4 -4
  346. package/lib-amd/tableEdit/editors/features/TableMover.js.map +1 -1
  347. package/lib-amd/tableEdit/editors/features/TableResizer.d.ts +40 -1
  348. package/lib-amd/tableEdit/editors/features/TableResizer.js +25 -7
  349. package/lib-amd/tableEdit/editors/features/TableResizer.js.map +1 -1
  350. package/lib-amd/tableEdit/editors/utils/getTableFromContentModel.d.ts +2 -2
  351. package/lib-amd/tableEdit/editors/utils/getTableFromContentModel.js.map +1 -1
  352. package/lib-mjs/autoFormat/hyphen/transformHyphen.d.ts +2 -2
  353. package/lib-mjs/autoFormat/hyphen/transformHyphen.js.map +1 -1
  354. package/lib-mjs/autoFormat/link/createLinkAfterSpace.d.ts +2 -2
  355. package/lib-mjs/autoFormat/link/createLinkAfterSpace.js.map +1 -1
  356. package/lib-mjs/autoFormat/list/keyboardListTrigger.d.ts +2 -2
  357. package/lib-mjs/autoFormat/list/keyboardListTrigger.js.map +1 -1
  358. package/lib-mjs/autoFormat/numbers/transformFraction.d.ts +2 -2
  359. package/lib-mjs/autoFormat/numbers/transformFraction.js.map +1 -1
  360. package/lib-mjs/autoFormat/numbers/transformOrdinals.d.ts +2 -2
  361. package/lib-mjs/autoFormat/numbers/transformOrdinals.js.map +1 -1
  362. package/lib-mjs/customReplace/CustomReplacePlugin.d.ts +2 -2
  363. package/lib-mjs/customReplace/CustomReplacePlugin.js.map +1 -1
  364. package/lib-mjs/edit/EditPlugin.d.ts +10 -0
  365. package/lib-mjs/edit/EditPlugin.js +39 -0
  366. package/lib-mjs/edit/EditPlugin.js.map +1 -1
  367. package/lib-mjs/edit/deleteSteps/deleteAllSegmentBefore.js +3 -2
  368. package/lib-mjs/edit/deleteSteps/deleteAllSegmentBefore.js.map +1 -1
  369. package/lib-mjs/edit/deleteSteps/deleteCollapsedSelection.js +5 -4
  370. package/lib-mjs/edit/deleteSteps/deleteCollapsedSelection.js.map +1 -1
  371. package/lib-mjs/edit/deleteSteps/deleteEmptyQuote.js +34 -30
  372. package/lib-mjs/edit/deleteSteps/deleteEmptyQuote.js.map +1 -1
  373. package/lib-mjs/edit/deleteSteps/deleteWordSelection.js +2 -2
  374. package/lib-mjs/edit/deleteSteps/deleteWordSelection.js.map +1 -1
  375. package/lib-mjs/edit/handleKeyboardEventCommon.d.ts +2 -2
  376. package/lib-mjs/edit/handleKeyboardEventCommon.js.map +1 -1
  377. package/lib-mjs/edit/inputSteps/handleEnterOnList.js +33 -57
  378. package/lib-mjs/edit/inputSteps/handleEnterOnList.js.map +1 -1
  379. package/lib-mjs/edit/inputSteps/handleEnterOnParagraph.d.ts +5 -0
  380. package/lib-mjs/edit/inputSteps/handleEnterOnParagraph.js +18 -0
  381. package/lib-mjs/edit/inputSteps/handleEnterOnParagraph.js.map +1 -0
  382. package/lib-mjs/edit/keyboardDelete.js +1 -1
  383. package/lib-mjs/edit/keyboardDelete.js.map +1 -1
  384. package/lib-mjs/edit/keyboardEnter.d.ts +5 -0
  385. package/lib-mjs/edit/keyboardEnter.js +40 -0
  386. package/lib-mjs/edit/keyboardEnter.js.map +1 -0
  387. package/lib-mjs/edit/keyboardInput.js +4 -18
  388. package/lib-mjs/edit/keyboardInput.js.map +1 -1
  389. package/lib-mjs/edit/keyboardTab.js.map +1 -1
  390. package/lib-mjs/edit/tabUtils/handleTabOnList.d.ts +2 -2
  391. package/lib-mjs/edit/tabUtils/handleTabOnList.js.map +1 -1
  392. package/lib-mjs/edit/tabUtils/handleTabOnParagraph.d.ts +2 -2
  393. package/lib-mjs/edit/tabUtils/handleTabOnParagraph.js +9 -7
  394. package/lib-mjs/edit/tabUtils/handleTabOnParagraph.js.map +1 -1
  395. package/lib-mjs/edit/tabUtils/handleTabOnTable.d.ts +2 -2
  396. package/lib-mjs/edit/tabUtils/handleTabOnTable.js.map +1 -1
  397. package/lib-mjs/edit/tabUtils/handleTabOnTableCell.d.ts +2 -2
  398. package/lib-mjs/edit/tabUtils/handleTabOnTableCell.js +6 -5
  399. package/lib-mjs/edit/tabUtils/handleTabOnTableCell.js.map +1 -1
  400. package/lib-mjs/edit/utils/getLeafSiblingBlock.d.ts +5 -5
  401. package/lib-mjs/edit/utils/getLeafSiblingBlock.js.map +1 -1
  402. package/lib-mjs/edit/utils/splitParagraph.d.ts +9 -0
  403. package/lib-mjs/edit/utils/splitParagraph.js +25 -0
  404. package/lib-mjs/edit/utils/splitParagraph.js.map +1 -0
  405. package/lib-mjs/imageEdit/Cropper/createImageCropper.d.ts +10 -0
  406. package/lib-mjs/imageEdit/Cropper/createImageCropper.js +75 -0
  407. package/lib-mjs/imageEdit/Cropper/createImageCropper.js.map +1 -0
  408. package/lib-mjs/imageEdit/Cropper/cropperContext.d.ts +8 -0
  409. package/lib-mjs/imageEdit/Cropper/cropperContext.js +70 -0
  410. package/lib-mjs/imageEdit/Cropper/cropperContext.js.map +1 -0
  411. package/lib-mjs/imageEdit/ImageEditPlugin.d.ts +66 -0
  412. package/lib-mjs/imageEdit/ImageEditPlugin.js +325 -0
  413. package/lib-mjs/imageEdit/ImageEditPlugin.js.map +1 -0
  414. package/lib-mjs/imageEdit/Resizer/createImageResizer.d.ts +12 -0
  415. package/lib-mjs/imageEdit/Resizer/createImageResizer.js +85 -0
  416. package/lib-mjs/imageEdit/Resizer/createImageResizer.js.map +1 -0
  417. package/lib-mjs/imageEdit/Resizer/resizerContext.d.ts +8 -0
  418. package/lib-mjs/imageEdit/Resizer/resizerContext.js +58 -0
  419. package/lib-mjs/imageEdit/Resizer/resizerContext.js.map +1 -0
  420. package/lib-mjs/imageEdit/Resizer/updateSideHandlesVisibility.d.ts +4 -0
  421. package/lib-mjs/imageEdit/Resizer/updateSideHandlesVisibility.js +13 -0
  422. package/lib-mjs/imageEdit/Resizer/updateSideHandlesVisibility.js.map +1 -0
  423. package/lib-mjs/imageEdit/Rotator/createImageRotator.d.ts +6 -0
  424. package/lib-mjs/imageEdit/Rotator/createImageRotator.js +72 -0
  425. package/lib-mjs/imageEdit/Rotator/createImageRotator.js.map +1 -0
  426. package/lib-mjs/imageEdit/Rotator/rotatorContext.d.ts +8 -0
  427. package/lib-mjs/imageEdit/Rotator/rotatorContext.js +33 -0
  428. package/lib-mjs/imageEdit/Rotator/rotatorContext.js.map +1 -0
  429. package/lib-mjs/imageEdit/Rotator/updateRotateHandle.d.ts +7 -0
  430. package/lib-mjs/imageEdit/Rotator/updateRotateHandle.js +51 -0
  431. package/lib-mjs/imageEdit/Rotator/updateRotateHandle.js.map +1 -0
  432. package/lib-mjs/imageEdit/constants/constants.d.ts +73 -0
  433. package/lib-mjs/imageEdit/constants/constants.js +78 -0
  434. package/lib-mjs/imageEdit/constants/constants.js.map +1 -0
  435. package/lib-mjs/imageEdit/types/DragAndDropContext.d.ts +39 -0
  436. package/lib-mjs/imageEdit/types/DragAndDropContext.js +2 -0
  437. package/lib-mjs/imageEdit/types/DragAndDropContext.js.map +1 -0
  438. package/lib-mjs/imageEdit/types/GeneratedImageSize.d.ts +33 -0
  439. package/lib-mjs/imageEdit/types/GeneratedImageSize.js +2 -0
  440. package/lib-mjs/imageEdit/types/GeneratedImageSize.js.map +1 -0
  441. package/lib-mjs/imageEdit/types/ImageEditElementClass.d.ts +30 -0
  442. package/lib-mjs/imageEdit/types/ImageEditElementClass.js +32 -0
  443. package/lib-mjs/imageEdit/types/ImageEditElementClass.js.map +1 -0
  444. package/lib-mjs/imageEdit/types/ImageEditOptions.d.ts +55 -0
  445. package/lib-mjs/imageEdit/types/ImageEditOptions.js +2 -0
  446. package/lib-mjs/imageEdit/types/ImageEditOptions.js.map +1 -0
  447. package/lib-mjs/imageEdit/types/ImageHtmlOptions.d.ts +18 -0
  448. package/lib-mjs/imageEdit/types/ImageHtmlOptions.js +2 -0
  449. package/lib-mjs/imageEdit/types/ImageHtmlOptions.js.map +1 -0
  450. package/lib-mjs/imageEdit/utils/applyChange.d.ts +12 -0
  451. package/lib-mjs/imageEdit/utils/applyChange.js +73 -0
  452. package/lib-mjs/imageEdit/utils/applyChange.js.map +1 -0
  453. package/lib-mjs/imageEdit/utils/canRegenerateImage.d.ts +8 -0
  454. package/lib-mjs/imageEdit/utils/canRegenerateImage.js +28 -0
  455. package/lib-mjs/imageEdit/utils/canRegenerateImage.js.map +1 -0
  456. package/lib-mjs/imageEdit/utils/checkEditInfoState.d.ts +41 -0
  457. package/lib-mjs/imageEdit/utils/checkEditInfoState.js +50 -0
  458. package/lib-mjs/imageEdit/utils/checkEditInfoState.js.map +1 -0
  459. package/lib-mjs/imageEdit/utils/createImageWrapper.d.ts +18 -0
  460. package/lib-mjs/imageEdit/utils/createImageWrapper.js +83 -0
  461. package/lib-mjs/imageEdit/utils/createImageWrapper.js.map +1 -0
  462. package/lib-mjs/imageEdit/utils/doubleCheckResize.d.ts +12 -0
  463. package/lib-mjs/imageEdit/utils/doubleCheckResize.js +32 -0
  464. package/lib-mjs/imageEdit/utils/doubleCheckResize.js.map +1 -0
  465. package/lib-mjs/imageEdit/utils/generateDataURL.d.ts +13 -0
  466. package/lib-mjs/imageEdit/utils/generateDataURL.js +46 -0
  467. package/lib-mjs/imageEdit/utils/generateDataURL.js.map +1 -0
  468. package/lib-mjs/imageEdit/utils/generateImageSize.d.ts +15 -0
  469. package/lib-mjs/imageEdit/utils/generateImageSize.js +42 -0
  470. package/lib-mjs/imageEdit/utils/generateImageSize.js.map +1 -0
  471. package/lib-mjs/imageEdit/utils/getDropAndDragHelpers.d.ts +10 -0
  472. package/lib-mjs/imageEdit/utils/getDropAndDragHelpers.js +20 -0
  473. package/lib-mjs/imageEdit/utils/getDropAndDragHelpers.js.map +1 -0
  474. package/lib-mjs/imageEdit/utils/getHTMLImageOptions.d.ts +7 -0
  475. package/lib-mjs/imageEdit/utils/getHTMLImageOptions.js +18 -0
  476. package/lib-mjs/imageEdit/utils/getHTMLImageOptions.js.map +1 -0
  477. package/lib-mjs/imageEdit/utils/getSelectedContentModelImage.d.ts +5 -0
  478. package/lib-mjs/imageEdit/utils/getSelectedContentModelImage.js +12 -0
  479. package/lib-mjs/imageEdit/utils/getSelectedContentModelImage.js.map +1 -0
  480. package/lib-mjs/imageEdit/utils/imageEditUtils.d.ts +39 -0
  481. package/lib-mjs/imageEdit/utils/imageEditUtils.js +91 -0
  482. package/lib-mjs/imageEdit/utils/imageEditUtils.js.map +1 -0
  483. package/lib-mjs/imageEdit/utils/updateHandleCursor.d.ts +7 -0
  484. package/lib-mjs/imageEdit/utils/updateHandleCursor.js +30 -0
  485. package/lib-mjs/imageEdit/utils/updateHandleCursor.js.map +1 -0
  486. package/lib-mjs/imageEdit/utils/updateImageEditInfo.d.ts +10 -0
  487. package/lib-mjs/imageEdit/utils/updateImageEditInfo.js +44 -0
  488. package/lib-mjs/imageEdit/utils/updateImageEditInfo.js.map +1 -0
  489. package/lib-mjs/imageEdit/utils/updateWrapper.d.ts +6 -0
  490. package/lib-mjs/imageEdit/utils/updateWrapper.js +83 -0
  491. package/lib-mjs/imageEdit/utils/updateWrapper.js.map +1 -0
  492. package/lib-mjs/index.d.ts +2 -1
  493. package/lib-mjs/index.js +1 -1
  494. package/lib-mjs/index.js.map +1 -1
  495. package/lib-mjs/paste/DefaultSanitizers.d.ts +10 -0
  496. package/lib-mjs/paste/DefaultSanitizers.js +21 -0
  497. package/lib-mjs/paste/DefaultSanitizers.js.map +1 -0
  498. package/lib-mjs/paste/PastePlugin.d.ts +4 -2
  499. package/lib-mjs/paste/PastePlugin.js +27 -2
  500. package/lib-mjs/paste/PastePlugin.js.map +1 -1
  501. package/lib-mjs/paste/WordDesktop/processPastedContentFromWordDesktop.js +13 -0
  502. package/lib-mjs/paste/WordDesktop/processPastedContentFromWordDesktop.js.map +1 -1
  503. package/lib-mjs/paste/utils/chainSanitizerCallback.d.ts +9 -0
  504. package/lib-mjs/paste/utils/chainSanitizerCallback.js +32 -0
  505. package/lib-mjs/paste/utils/chainSanitizerCallback.js.map +1 -0
  506. package/lib-mjs/picker/getQueryString.d.ts +2 -2
  507. package/lib-mjs/picker/getQueryString.js.map +1 -1
  508. package/lib-mjs/pluginUtils/splitTextSegment.d.ts +2 -2
  509. package/lib-mjs/pluginUtils/splitTextSegment.js.map +1 -1
  510. package/lib-mjs/tableEdit/editors/TableEditor.d.ts +3 -0
  511. package/lib-mjs/tableEdit/editors/TableEditor.js +4 -0
  512. package/lib-mjs/tableEdit/editors/TableEditor.js.map +1 -1
  513. package/lib-mjs/tableEdit/editors/features/CellResizer.d.ts +39 -1
  514. package/lib-mjs/tableEdit/editors/features/CellResizer.js +27 -14
  515. package/lib-mjs/tableEdit/editors/features/CellResizer.js.map +1 -1
  516. package/lib-mjs/tableEdit/editors/features/TableInserter.d.ts +17 -0
  517. package/lib-mjs/tableEdit/editors/features/TableInserter.js +5 -0
  518. package/lib-mjs/tableEdit/editors/features/TableInserter.js.map +1 -1
  519. package/lib-mjs/tableEdit/editors/features/TableMover.d.ts +2 -2
  520. package/lib-mjs/tableEdit/editors/features/TableMover.js +5 -5
  521. package/lib-mjs/tableEdit/editors/features/TableMover.js.map +1 -1
  522. package/lib-mjs/tableEdit/editors/features/TableResizer.d.ts +40 -1
  523. package/lib-mjs/tableEdit/editors/features/TableResizer.js +25 -10
  524. package/lib-mjs/tableEdit/editors/features/TableResizer.js.map +1 -1
  525. package/lib-mjs/tableEdit/editors/utils/getTableFromContentModel.d.ts +2 -2
  526. package/lib-mjs/tableEdit/editors/utils/getTableFromContentModel.js.map +1 -1
  527. package/package.json +5 -5
  528. package/lib/pluginUtils/Rect/getDOMInsertPointRect.d.ts +0 -7
  529. package/lib/pluginUtils/Rect/getDOMInsertPointRect.js +0 -57
  530. package/lib/pluginUtils/Rect/getDOMInsertPointRect.js.map +0 -1
  531. package/lib-amd/pluginUtils/Rect/getDOMInsertPointRect.d.ts +0 -7
  532. package/lib-amd/pluginUtils/Rect/getDOMInsertPointRect.js +0 -58
  533. package/lib-amd/pluginUtils/Rect/getDOMInsertPointRect.js.map +0 -1
  534. package/lib-mjs/pluginUtils/Rect/getDOMInsertPointRect.d.ts +0 -7
  535. package/lib-mjs/pluginUtils/Rect/getDOMInsertPointRect.js +0 -53
  536. package/lib-mjs/pluginUtils/Rect/getDOMInsertPointRect.js.map +0 -1
@@ -1,8 +1,11 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.PastePlugin = void 0;
4
+ var tslib_1 = require("tslib");
4
5
  var addParser_1 = require("./utils/addParser");
5
6
  var roosterjs_content_model_dom_1 = require("roosterjs-content-model-dom");
7
+ var chainSanitizerCallback_1 = require("./utils/chainSanitizerCallback");
8
+ var DefaultSanitizers_1 = require("./DefaultSanitizers");
6
9
  var deprecatedColorParser_1 = require("./utils/deprecatedColorParser");
7
10
  var getPasteSource_1 = require("./pasteSourceValidations/getPasteSource");
8
11
  var linkParser_1 = require("./utils/linkParser");
@@ -24,8 +27,15 @@ var PastePlugin = /** @class */ (function () {
24
27
  * @param unknownTagReplacement Replace solution of unknown tags, default behavior is to replace with SPAN
25
28
  * @param allowExcelNoBorderTable Allow table copied from Excel without border
26
29
  */
27
- function PastePlugin(allowExcelNoBorderTable) {
30
+ function PastePlugin(allowExcelNoBorderTable, domToModelForSanitizing) {
31
+ if (domToModelForSanitizing === void 0) { domToModelForSanitizing = {
32
+ styleSanitizers: DefaultSanitizers_1.DefaultSanitizers,
33
+ additionalAllowedTags: [],
34
+ additionalDisallowedTags: [],
35
+ attributeSanitizers: {},
36
+ }; }
28
37
  this.allowExcelNoBorderTable = allowExcelNoBorderTable;
38
+ this.domToModelForSanitizing = domToModelForSanitizing;
29
39
  this.editor = null;
30
40
  }
31
41
  /**
@@ -95,6 +105,21 @@ var PastePlugin = /** @class */ (function () {
95
105
  (0, addParser_1.addParser)(event.domToModelOption, 'block', blockElementParser);
96
106
  (0, addParser_1.addParser)(event.domToModelOption, 'listLevel', blockElementParser);
97
107
  }
108
+ this.setEventSanitizers(event);
109
+ };
110
+ PastePlugin.prototype.setEventSanitizers = function (event) {
111
+ var _a, _b;
112
+ if (this.domToModelForSanitizing) {
113
+ var _c = this.domToModelForSanitizing, styleSanitizers_1 = _c.styleSanitizers, attributeSanitizers_1 = _c.attributeSanitizers, additionalAllowedTags = _c.additionalAllowedTags, additionalDisallowedTags = _c.additionalDisallowedTags;
114
+ (0, roosterjs_content_model_dom_1.getObjectKeys)(styleSanitizers_1).forEach(function (key) {
115
+ return (0, chainSanitizerCallback_1.chainSanitizerCallback)(event.domToModelOption.styleSanitizers, key, styleSanitizers_1[key]);
116
+ });
117
+ (0, roosterjs_content_model_dom_1.getObjectKeys)(attributeSanitizers_1).forEach(function (key) {
118
+ return (0, chainSanitizerCallback_1.chainSanitizerCallback)(event.domToModelOption.attributeSanitizers, key, attributeSanitizers_1[key]);
119
+ });
120
+ (_a = event.domToModelOption.additionalAllowedTags).push.apply(_a, (0, tslib_1.__spreadArray)([], (0, tslib_1.__read)(additionalAllowedTags), false));
121
+ (_b = event.domToModelOption.additionalDisallowedTags).push.apply(_b, (0, tslib_1.__spreadArray)([], (0, tslib_1.__read)(additionalDisallowedTags), false));
122
+ }
98
123
  };
99
124
  return PastePlugin;
100
125
  }());
@@ -1 +1 @@
1
- {"version":3,"file":"PastePlugin.js","sourceRoot":"","sources":["../../../../packages/roosterjs-content-model-plugins/lib/paste/PastePlugin.ts"],"names":[],"mappings":"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","sourcesContent":["import { addParser } from './utils/addParser';\nimport { BorderKeys } from 'roosterjs-content-model-dom';\nimport { deprecatedBorderColorParser } from './utils/deprecatedColorParser';\nimport { getPasteSource } from './pasteSourceValidations/getPasteSource';\nimport { parseLink } from './utils/linkParser';\nimport { PastePropertyNames } from './pasteSourceValidations/constants';\nimport { processPastedContentFromExcel } from './Excel/processPastedContentFromExcel';\nimport { processPastedContentFromPowerPoint } from './PowerPoint/processPastedContentFromPowerPoint';\nimport { processPastedContentFromWordDesktop } from './WordDesktop/processPastedContentFromWordDesktop';\nimport { processPastedContentWacComponents } from './WacComponents/processPastedContentWacComponents';\nimport type {\n BorderFormat,\n ContentModelBlockFormat,\n ContentModelTableCellFormat,\n EditorPlugin,\n FormatParser,\n IEditor,\n PluginEvent,\n} from 'roosterjs-content-model-types';\n\n/**\n * Paste plugin, handles BeforePaste event and reformat some special content, including:\n * 1. Content copied from Word\n * 2. Content copied from Excel\n * 3. Content copied from Word Online or OneNote Online\n * 4. Content copied from Power Point\n */\nexport class PastePlugin implements EditorPlugin {\n private editor: IEditor | null = null;\n\n /**\n * Construct a new instance of Paste class\n * @param unknownTagReplacement Replace solution of unknown tags, default behavior is to replace with SPAN\n * @param allowExcelNoBorderTable Allow table copied from Excel without border\n */\n constructor(private allowExcelNoBorderTable?: boolean) {}\n\n /**\n * Get name of this plugin\n */\n getName() {\n return 'Paste';\n }\n\n /**\n * The first method that editor will call to a plugin when editor is initializing.\n * It will pass in the editor instance, plugin should take this chance to save the\n * editor reference so that it can call to any editor method or format API later.\n * @param editor The editor object\n */\n initialize(editor: IEditor) {\n this.editor = editor;\n }\n\n /**\n * The last method that editor will call to a plugin before it is disposed.\n * Plugin can take this chance to clear the reference to editor. After this method is\n * called, plugin should not call to any editor method since it will result in error.\n */\n dispose() {\n this.editor = null;\n }\n\n /**\n * Core method for a plugin. Once an event happens in editor, editor will call this\n * method of each plugin to handle the event as long as the event is not handled\n * exclusively by another plugin.\n * @param event The event to handle:\n */\n onPluginEvent(event: PluginEvent) {\n if (!this.editor || event.eventType != 'beforePaste') {\n return;\n }\n\n if (!event.domToModelOption) {\n return;\n }\n\n const pasteSource = getPasteSource(event, false);\n const pasteType = event.pasteType;\n\n switch (pasteSource) {\n case 'wordDesktop':\n processPastedContentFromWordDesktop(event, this.editor.getTrustedHTMLHandler());\n break;\n case 'wacComponents':\n processPastedContentWacComponents(event);\n break;\n case 'excelOnline':\n case 'excelDesktop':\n if (pasteType === 'normal' || pasteType === 'mergeFormat') {\n // Handle HTML copied from Excel\n processPastedContentFromExcel(\n event,\n this.editor.getTrustedHTMLHandler(),\n this.allowExcelNoBorderTable\n );\n }\n break;\n case 'googleSheets':\n event.domToModelOption.additionalAllowedTags.push(\n PastePropertyNames.GOOGLE_SHEET_NODE_NAME as Lowercase<string>\n );\n break;\n case 'powerPointDesktop':\n processPastedContentFromPowerPoint(event, this.editor.getTrustedHTMLHandler());\n break;\n }\n\n addParser(event.domToModelOption, 'link', parseLink);\n addParser(event.domToModelOption, 'tableCell', deprecatedBorderColorParser);\n addParser(event.domToModelOption, 'tableCell', tableBorderParser);\n addParser(event.domToModelOption, 'table', deprecatedBorderColorParser);\n\n if (pasteType === 'mergeFormat') {\n addParser(event.domToModelOption, 'block', blockElementParser);\n addParser(event.domToModelOption, 'listLevel', blockElementParser);\n }\n }\n}\n\n/**\n * For block elements that have background color style, remove the background color when user selects the merge current format\n * paste option\n */\nconst blockElementParser: FormatParser<ContentModelBlockFormat> = (\n format: ContentModelBlockFormat,\n element: HTMLElement\n) => {\n if (element.style.backgroundColor) {\n delete format.backgroundColor;\n }\n};\n\nconst ElementBorderKeys = new Map<\n keyof BorderFormat,\n {\n c: keyof CSSStyleDeclaration;\n s: keyof CSSStyleDeclaration;\n w: keyof CSSStyleDeclaration;\n }\n>([\n ['borderTop', { w: 'borderTopWidth', s: 'borderTopStyle', c: 'borderTopColor' }],\n ['borderRight', { w: 'borderRightWidth', s: 'borderRightStyle', c: 'borderRightColor' }],\n ['borderBottom', { w: 'borderBottomWidth', s: 'borderBottomStyle', c: 'borderBottomColor' }],\n ['borderLeft', { w: 'borderLeftWidth', s: 'borderLeftStyle', c: 'borderLeftColor' }],\n]);\n\nfunction tableBorderParser(format: ContentModelTableCellFormat, element: HTMLElement): void {\n BorderKeys.forEach(key => {\n if (!format[key]) {\n const styleSet = ElementBorderKeys.get(key);\n if (\n styleSet &&\n element.style[styleSet.w] &&\n element.style[styleSet.s] &&\n !element.style[styleSet.c]\n ) {\n format[key] = `${element.style[styleSet.w]} ${element.style[styleSet.s]}`;\n }\n }\n });\n}\n"]}
1
+ {"version":3,"file":"PastePlugin.js","sourceRoot":"","sources":["../../../../packages/roosterjs-content-model-plugins/lib/paste/PastePlugin.ts"],"names":[],"mappings":"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","sourcesContent":["import { addParser } from './utils/addParser';\nimport { BorderKeys, getObjectKeys } from 'roosterjs-content-model-dom';\nimport { chainSanitizerCallback } from './utils/chainSanitizerCallback';\nimport { DefaultSanitizers } from './DefaultSanitizers';\nimport { deprecatedBorderColorParser } from './utils/deprecatedColorParser';\nimport { getPasteSource } from './pasteSourceValidations/getPasteSource';\nimport { parseLink } from './utils/linkParser';\nimport { PastePropertyNames } from './pasteSourceValidations/constants';\nimport { processPastedContentFromExcel } from './Excel/processPastedContentFromExcel';\nimport { processPastedContentFromPowerPoint } from './PowerPoint/processPastedContentFromPowerPoint';\nimport { processPastedContentFromWordDesktop } from './WordDesktop/processPastedContentFromWordDesktop';\nimport { processPastedContentWacComponents } from './WacComponents/processPastedContentWacComponents';\nimport type {\n BeforePasteEvent,\n BorderFormat,\n ContentModelBlockFormat,\n ContentModelTableCellFormat,\n DomToModelOptionForSanitizing,\n EditorPlugin,\n FormatParser,\n IEditor,\n PluginEvent,\n} from 'roosterjs-content-model-types';\n\n/**\n * Paste plugin, handles BeforePaste event and reformat some special content, including:\n * 1. Content copied from Word\n * 2. Content copied from Excel\n * 3. Content copied from Word Online or OneNote Online\n * 4. Content copied from Power Point\n */\nexport class PastePlugin implements EditorPlugin {\n private editor: IEditor | null = null;\n\n /**\n * Construct a new instance of Paste class\n * @param unknownTagReplacement Replace solution of unknown tags, default behavior is to replace with SPAN\n * @param allowExcelNoBorderTable Allow table copied from Excel without border\n */\n constructor(\n private allowExcelNoBorderTable?: boolean,\n private domToModelForSanitizing: Pick<\n DomToModelOptionForSanitizing,\n | 'additionalAllowedTags'\n | 'additionalDisallowedTags'\n | 'styleSanitizers'\n | 'attributeSanitizers'\n > = {\n styleSanitizers: DefaultSanitizers,\n additionalAllowedTags: [],\n additionalDisallowedTags: [],\n attributeSanitizers: {},\n }\n ) {}\n\n /**\n * Get name of this plugin\n */\n getName() {\n return 'Paste';\n }\n\n /**\n * The first method that editor will call to a plugin when editor is initializing.\n * It will pass in the editor instance, plugin should take this chance to save the\n * editor reference so that it can call to any editor method or format API later.\n * @param editor The editor object\n */\n initialize(editor: IEditor) {\n this.editor = editor;\n }\n\n /**\n * The last method that editor will call to a plugin before it is disposed.\n * Plugin can take this chance to clear the reference to editor. After this method is\n * called, plugin should not call to any editor method since it will result in error.\n */\n dispose() {\n this.editor = null;\n }\n\n /**\n * Core method for a plugin. Once an event happens in editor, editor will call this\n * method of each plugin to handle the event as long as the event is not handled\n * exclusively by another plugin.\n * @param event The event to handle:\n */\n onPluginEvent(event: PluginEvent) {\n if (!this.editor || event.eventType != 'beforePaste') {\n return;\n }\n\n if (!event.domToModelOption) {\n return;\n }\n\n const pasteSource = getPasteSource(event, false);\n const pasteType = event.pasteType;\n\n switch (pasteSource) {\n case 'wordDesktop':\n processPastedContentFromWordDesktop(event, this.editor.getTrustedHTMLHandler());\n break;\n case 'wacComponents':\n processPastedContentWacComponents(event);\n break;\n case 'excelOnline':\n case 'excelDesktop':\n if (pasteType === 'normal' || pasteType === 'mergeFormat') {\n // Handle HTML copied from Excel\n processPastedContentFromExcel(\n event,\n this.editor.getTrustedHTMLHandler(),\n this.allowExcelNoBorderTable\n );\n }\n break;\n case 'googleSheets':\n event.domToModelOption.additionalAllowedTags.push(\n PastePropertyNames.GOOGLE_SHEET_NODE_NAME as Lowercase<string>\n );\n break;\n case 'powerPointDesktop':\n processPastedContentFromPowerPoint(event, this.editor.getTrustedHTMLHandler());\n break;\n }\n\n addParser(event.domToModelOption, 'link', parseLink);\n addParser(event.domToModelOption, 'tableCell', deprecatedBorderColorParser);\n addParser(event.domToModelOption, 'tableCell', tableBorderParser);\n addParser(event.domToModelOption, 'table', deprecatedBorderColorParser);\n\n if (pasteType === 'mergeFormat') {\n addParser(event.domToModelOption, 'block', blockElementParser);\n addParser(event.domToModelOption, 'listLevel', blockElementParser);\n }\n\n this.setEventSanitizers(event);\n }\n\n private setEventSanitizers(event: BeforePasteEvent) {\n if (this.domToModelForSanitizing) {\n const {\n styleSanitizers,\n attributeSanitizers,\n additionalAllowedTags,\n additionalDisallowedTags,\n } = this.domToModelForSanitizing;\n getObjectKeys(styleSanitizers).forEach(key =>\n chainSanitizerCallback(\n event.domToModelOption.styleSanitizers,\n key,\n styleSanitizers[key]\n )\n );\n getObjectKeys(attributeSanitizers).forEach(key =>\n chainSanitizerCallback(\n event.domToModelOption.attributeSanitizers,\n key,\n attributeSanitizers[key]\n )\n );\n event.domToModelOption.additionalAllowedTags.push(...additionalAllowedTags);\n event.domToModelOption.additionalDisallowedTags.push(...additionalDisallowedTags);\n }\n }\n}\n\n/**\n * For block elements that have background color style, remove the background color when user selects the merge current format\n * paste option\n */\nconst blockElementParser: FormatParser<ContentModelBlockFormat> = (\n format: ContentModelBlockFormat,\n element: HTMLElement\n) => {\n if (element.style.backgroundColor) {\n delete format.backgroundColor;\n }\n};\n\nconst ElementBorderKeys = new Map<\n keyof BorderFormat,\n {\n c: keyof CSSStyleDeclaration;\n s: keyof CSSStyleDeclaration;\n w: keyof CSSStyleDeclaration;\n }\n>([\n ['borderTop', { w: 'borderTopWidth', s: 'borderTopStyle', c: 'borderTopColor' }],\n ['borderRight', { w: 'borderRightWidth', s: 'borderRightStyle', c: 'borderRightColor' }],\n ['borderBottom', { w: 'borderBottomWidth', s: 'borderBottomStyle', c: 'borderBottomColor' }],\n ['borderLeft', { w: 'borderLeftWidth', s: 'borderLeftStyle', c: 'borderLeftColor' }],\n]);\n\nfunction tableBorderParser(format: ContentModelTableCellFormat, element: HTMLElement): void {\n BorderKeys.forEach(key => {\n if (!format[key]) {\n const styleSet = ElementBorderKeys.get(key);\n if (\n styleSet &&\n element.style[styleSet.w] &&\n element.style[styleSet.s] &&\n !element.style[styleSet.c]\n ) {\n format[key] = `${element.style[styleSet.w]} ${element.style[styleSet.s]}`;\n }\n }\n });\n}\n"]}
@@ -8,6 +8,9 @@ var processWordComments_1 = require("./processWordComments");
8
8
  var processWordLists_1 = require("./processWordLists");
9
9
  var removeNegativeTextIndentParser_1 = require("./removeNegativeTextIndentParser");
10
10
  var setProcessor_1 = require("../utils/setProcessor");
11
+ var PERCENTAGE_REGEX = /%/;
12
+ // Default line height in browsers according to https://developer.mozilla.org/en-US/docs/Web/CSS/line-height#normal
13
+ var DEFAULT_BROWSER_LINE_HEIGHT_PERCENTAGE = 1.2;
11
14
  /**
12
15
  * @internal
13
16
  * Handles Pasted content when source is Word Desktop
@@ -16,6 +19,7 @@ var setProcessor_1 = require("../utils/setProcessor");
16
19
  function processPastedContentFromWordDesktop(ev, trustedHTMLHandler) {
17
20
  var metadataMap = (0, getStyleMetadata_1.getStyleMetadata)(ev, trustedHTMLHandler);
18
21
  (0, setProcessor_1.setProcessor)(ev.domToModelOption, 'element', wordDesktopElementProcessor(metadataMap));
22
+ (0, addParser_1.addParser)(ev.domToModelOption, 'block', adjustPercentileLineHeight);
19
23
  (0, addParser_1.addParser)(ev.domToModelOption, 'block', removeNegativeTextIndentParser_1.removeNegativeTextIndentParser);
20
24
  (0, addParser_1.addParser)(ev.domToModelOption, 'listLevel', listLevelParser);
21
25
  (0, addParser_1.addParser)(ev.domToModelOption, 'container', wordTableParser);
@@ -32,6 +36,15 @@ var wordDesktopElementProcessor = function (metadataKey) {
32
36
  }
33
37
  };
34
38
  };
39
+ function adjustPercentileLineHeight(format, element) {
40
+ //If the line height is less than the browser default line height, line between the text is going to be too narrow
41
+ var parsedLineHeight;
42
+ if (PERCENTAGE_REGEX.test(element.style.lineHeight) &&
43
+ !isNaN((parsedLineHeight = parseInt(element.style.lineHeight)))) {
44
+ format.lineHeight = (DEFAULT_BROWSER_LINE_HEIGHT_PERCENTAGE *
45
+ (parsedLineHeight / 100)).toString();
46
+ }
47
+ }
35
48
  function listLevelParser(format, element, context, defaultStyle) {
36
49
  if (element.style.marginLeft != '') {
37
50
  format.marginLeft = defaultStyle.marginLeft;
@@ -1 +1 @@
1
- {"version":3,"file":"processPastedContentFromWordDesktop.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-plugins/lib/paste/WordDesktop/processPastedContentFromWordDesktop.ts"],"names":[],"mappings":";;;AAAA,gDAA+C;AAC/C,uDAAsD;AACtD,gDAA+C;AAC/C,6DAA4D;AAC5D,uDAAqD;AACrD,mFAAkF;AAClF,sDAAqD;AAWrD;;;;GAIG;AACH,SAAgB,mCAAmC,CAC/C,EAAoB,EACpB,kBAA4C;IAE5C,IAAM,WAAW,GAA8B,IAAA,mCAAgB,EAAC,EAAE,EAAE,kBAAkB,CAAC,CAAC;IAExF,IAAA,2BAAY,EAAC,EAAE,CAAC,gBAAgB,EAAE,SAAS,EAAE,2BAA2B,CAAC,WAAW,CAAC,CAAC,CAAC;IACvF,IAAA,qBAAS,EAAC,EAAE,CAAC,gBAAgB,EAAE,OAAO,EAAE,+DAA8B,CAAC,CAAC;IACxE,IAAA,qBAAS,EAAC,EAAE,CAAC,gBAAgB,EAAE,WAAW,EAAE,eAAe,CAAC,CAAC;IAC7D,IAAA,qBAAS,EAAC,EAAE,CAAC,gBAAgB,EAAE,WAAW,EAAE,eAAe,CAAC,CAAC;IAC7D,IAAA,qBAAS,EAAC,EAAE,CAAC,gBAAgB,EAAE,OAAO,EAAE,eAAe,CAAC,CAAC;AAC7D,CAAC;AAXD,kFAWC;AAED,IAAM,2BAA2B,GAAG,UAChC,WAAsC;IAEtC,OAAO,UAAC,KAAK,EAAE,OAAO,EAAE,OAAO;QAC3B,IAAM,MAAM,GAAG,IAAA,qBAAS,EAAC,OAAO,CAAC,CAAC;QAClC,4FAA4F;QAC5F,IACI,CAAC,CACG,IAAA,kCAAe,EAAC,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,WAAW,CAAC;YAC7D,IAAA,yCAAmB,EAAC,MAAM,EAAE,OAAO,CAAC,CACvC,EACH;YACE,OAAO,CAAC,wBAAwB,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;SACrE;IACL,CAAC,CAAC;AACN,CAAC,CAAC;AAEF,SAAS,eAAe,CACpB,MAAuC,EACvC,OAAoB,EACpB,OAA0B,EAC1B,YAAoD;IAEpD,IAAI,OAAO,CAAC,KAAK,CAAC,UAAU,IAAI,EAAE,EAAE;QAChC,MAAM,CAAC,UAAU,GAAG,YAAY,CAAC,UAAU,CAAC;KAC/C;IAED,MAAM,CAAC,YAAY,GAAG,SAAS,CAAC;AACpC,CAAC;AAED,IAAM,eAAe,GAA0C,UAAC,MAAM;;IAClE,IAAI,MAAA,MAAM,CAAC,UAAU,0CAAE,UAAU,CAAC,GAAG,CAAC,EAAE;QACpC,OAAO,MAAM,CAAC,UAAU,CAAC;KAC5B;AACL,CAAC,CAAC","sourcesContent":["import { addParser } from '../utils/addParser';\nimport { getStyleMetadata } from './getStyleMetadata';\nimport { getStyles } from '../utils/getStyles';\nimport { processWordComments } from './processWordComments';\nimport { processWordList } from './processWordLists';\nimport { removeNegativeTextIndentParser } from './removeNegativeTextIndentParser';\nimport { setProcessor } from '../utils/setProcessor';\nimport type { WordMetadata } from './WordMetadata';\nimport type {\n BeforePasteEvent,\n ContentModelListItemLevelFormat,\n ContentModelTableFormat,\n DomToModelContext,\n ElementProcessor,\n FormatParser,\n} from 'roosterjs-content-model-types';\n\n/**\n * @internal\n * Handles Pasted content when source is Word Desktop\n * @param ev BeforePasteEvent\n */\nexport function processPastedContentFromWordDesktop(\n ev: BeforePasteEvent,\n trustedHTMLHandler: (text: string) => string\n) {\n const metadataMap: Map<string, WordMetadata> = getStyleMetadata(ev, trustedHTMLHandler);\n\n setProcessor(ev.domToModelOption, 'element', wordDesktopElementProcessor(metadataMap));\n addParser(ev.domToModelOption, 'block', removeNegativeTextIndentParser);\n addParser(ev.domToModelOption, 'listLevel', listLevelParser);\n addParser(ev.domToModelOption, 'container', wordTableParser);\n addParser(ev.domToModelOption, 'table', wordTableParser);\n}\n\nconst wordDesktopElementProcessor = (\n metadataKey: Map<string, WordMetadata>\n): ElementProcessor<HTMLElement> => {\n return (group, element, context) => {\n const styles = getStyles(element);\n // Process Word Lists or Word Commands, otherwise use the default processor on this element.\n if (\n !(\n processWordList(styles, group, element, context, metadataKey) ||\n processWordComments(styles, element)\n )\n ) {\n context.defaultElementProcessors.element(group, element, context);\n }\n };\n};\n\nfunction listLevelParser(\n format: ContentModelListItemLevelFormat,\n element: HTMLElement,\n context: DomToModelContext,\n defaultStyle: Readonly<Partial<CSSStyleDeclaration>>\n): void {\n if (element.style.marginLeft != '') {\n format.marginLeft = defaultStyle.marginLeft;\n }\n\n format.marginBottom = undefined;\n}\n\nconst wordTableParser: FormatParser<ContentModelTableFormat> = (format): void => {\n if (format.marginLeft?.startsWith('-')) {\n delete format.marginLeft;\n }\n};\n"]}
1
+ {"version":3,"file":"processPastedContentFromWordDesktop.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-plugins/lib/paste/WordDesktop/processPastedContentFromWordDesktop.ts"],"names":[],"mappings":";;;AAAA,gDAA+C;AAC/C,uDAAsD;AACtD,gDAA+C;AAC/C,6DAA4D;AAC5D,uDAAqD;AACrD,mFAAkF;AAClF,sDAAqD;AAYrD,IAAM,gBAAgB,GAAG,GAAG,CAAC;AAC7B,mHAAmH;AACnH,IAAM,sCAAsC,GAAG,GAAG,CAAC;AAEnD;;;;GAIG;AACH,SAAgB,mCAAmC,CAC/C,EAAoB,EACpB,kBAA4C;IAE5C,IAAM,WAAW,GAA8B,IAAA,mCAAgB,EAAC,EAAE,EAAE,kBAAkB,CAAC,CAAC;IAExF,IAAA,2BAAY,EAAC,EAAE,CAAC,gBAAgB,EAAE,SAAS,EAAE,2BAA2B,CAAC,WAAW,CAAC,CAAC,CAAC;IACvF,IAAA,qBAAS,EAAC,EAAE,CAAC,gBAAgB,EAAE,OAAO,EAAE,0BAA0B,CAAC,CAAC;IACpE,IAAA,qBAAS,EAAC,EAAE,CAAC,gBAAgB,EAAE,OAAO,EAAE,+DAA8B,CAAC,CAAC;IACxE,IAAA,qBAAS,EAAC,EAAE,CAAC,gBAAgB,EAAE,WAAW,EAAE,eAAe,CAAC,CAAC;IAC7D,IAAA,qBAAS,EAAC,EAAE,CAAC,gBAAgB,EAAE,WAAW,EAAE,eAAe,CAAC,CAAC;IAC7D,IAAA,qBAAS,EAAC,EAAE,CAAC,gBAAgB,EAAE,OAAO,EAAE,eAAe,CAAC,CAAC;AAC7D,CAAC;AAZD,kFAYC;AAED,IAAM,2BAA2B,GAAG,UAChC,WAAsC;IAEtC,OAAO,UAAC,KAAK,EAAE,OAAO,EAAE,OAAO;QAC3B,IAAM,MAAM,GAAG,IAAA,qBAAS,EAAC,OAAO,CAAC,CAAC;QAClC,4FAA4F;QAC5F,IACI,CAAC,CACG,IAAA,kCAAe,EAAC,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,WAAW,CAAC;YAC7D,IAAA,yCAAmB,EAAC,MAAM,EAAE,OAAO,CAAC,CACvC,EACH;YACE,OAAO,CAAC,wBAAwB,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;SACrE;IACL,CAAC,CAAC;AACN,CAAC,CAAC;AAEF,SAAS,0BAA0B,CAAC,MAA+B,EAAE,OAAoB;IACrF,kHAAkH;IAClH,IAAI,gBAAwB,CAAC;IAC7B,IACI,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC;QAC/C,CAAC,KAAK,CAAC,CAAC,gBAAgB,GAAG,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,EACjE;QACE,MAAM,CAAC,UAAU,GAAG,CAChB,sCAAsC;YACtC,CAAC,gBAAgB,GAAG,GAAG,CAAC,CAC3B,CAAC,QAAQ,EAAE,CAAC;KAChB;AACL,CAAC;AAED,SAAS,eAAe,CACpB,MAAuC,EACvC,OAAoB,EACpB,OAA0B,EAC1B,YAAoD;IAEpD,IAAI,OAAO,CAAC,KAAK,CAAC,UAAU,IAAI,EAAE,EAAE;QAChC,MAAM,CAAC,UAAU,GAAG,YAAY,CAAC,UAAU,CAAC;KAC/C;IAED,MAAM,CAAC,YAAY,GAAG,SAAS,CAAC;AACpC,CAAC;AAED,IAAM,eAAe,GAA0C,UAAC,MAAM;;IAClE,IAAI,MAAA,MAAM,CAAC,UAAU,0CAAE,UAAU,CAAC,GAAG,CAAC,EAAE;QACpC,OAAO,MAAM,CAAC,UAAU,CAAC;KAC5B;AACL,CAAC,CAAC","sourcesContent":["import { addParser } from '../utils/addParser';\nimport { getStyleMetadata } from './getStyleMetadata';\nimport { getStyles } from '../utils/getStyles';\nimport { processWordComments } from './processWordComments';\nimport { processWordList } from './processWordLists';\nimport { removeNegativeTextIndentParser } from './removeNegativeTextIndentParser';\nimport { setProcessor } from '../utils/setProcessor';\nimport type { WordMetadata } from './WordMetadata';\nimport type {\n BeforePasteEvent,\n ContentModelBlockFormat,\n ContentModelListItemLevelFormat,\n ContentModelTableFormat,\n DomToModelContext,\n ElementProcessor,\n FormatParser,\n} from 'roosterjs-content-model-types';\n\nconst PERCENTAGE_REGEX = /%/;\n// Default line height in browsers according to https://developer.mozilla.org/en-US/docs/Web/CSS/line-height#normal\nconst DEFAULT_BROWSER_LINE_HEIGHT_PERCENTAGE = 1.2;\n\n/**\n * @internal\n * Handles Pasted content when source is Word Desktop\n * @param ev BeforePasteEvent\n */\nexport function processPastedContentFromWordDesktop(\n ev: BeforePasteEvent,\n trustedHTMLHandler: (text: string) => string\n) {\n const metadataMap: Map<string, WordMetadata> = getStyleMetadata(ev, trustedHTMLHandler);\n\n setProcessor(ev.domToModelOption, 'element', wordDesktopElementProcessor(metadataMap));\n addParser(ev.domToModelOption, 'block', adjustPercentileLineHeight);\n addParser(ev.domToModelOption, 'block', removeNegativeTextIndentParser);\n addParser(ev.domToModelOption, 'listLevel', listLevelParser);\n addParser(ev.domToModelOption, 'container', wordTableParser);\n addParser(ev.domToModelOption, 'table', wordTableParser);\n}\n\nconst wordDesktopElementProcessor = (\n metadataKey: Map<string, WordMetadata>\n): ElementProcessor<HTMLElement> => {\n return (group, element, context) => {\n const styles = getStyles(element);\n // Process Word Lists or Word Commands, otherwise use the default processor on this element.\n if (\n !(\n processWordList(styles, group, element, context, metadataKey) ||\n processWordComments(styles, element)\n )\n ) {\n context.defaultElementProcessors.element(group, element, context);\n }\n };\n};\n\nfunction adjustPercentileLineHeight(format: ContentModelBlockFormat, element: HTMLElement): void {\n //If the line height is less than the browser default line height, line between the text is going to be too narrow\n let parsedLineHeight: number;\n if (\n PERCENTAGE_REGEX.test(element.style.lineHeight) &&\n !isNaN((parsedLineHeight = parseInt(element.style.lineHeight)))\n ) {\n format.lineHeight = (\n DEFAULT_BROWSER_LINE_HEIGHT_PERCENTAGE *\n (parsedLineHeight / 100)\n ).toString();\n }\n}\n\nfunction listLevelParser(\n format: ContentModelListItemLevelFormat,\n element: HTMLElement,\n context: DomToModelContext,\n defaultStyle: Readonly<Partial<CSSStyleDeclaration>>\n): void {\n if (element.style.marginLeft != '') {\n format.marginLeft = defaultStyle.marginLeft;\n }\n\n format.marginBottom = undefined;\n}\n\nconst wordTableParser: FormatParser<ContentModelTableFormat> = (format): void => {\n if (format.marginLeft?.startsWith('-')) {\n delete format.marginLeft;\n }\n};\n"]}
@@ -0,0 +1,9 @@
1
+ import type { ValueSanitizer } from 'roosterjs-content-model-types';
2
+ /**
3
+ * @internal
4
+ * Chain all callback for an style sanitizer
5
+ * @param map The source callback map
6
+ * @param name Name of the property to chain
7
+ * @param newCallback A new callback to process the given name on the given map.
8
+ */
9
+ export declare function chainSanitizerCallback(map: Record<string, ValueSanitizer>, name: string, newCallback: ValueSanitizer): void;
@@ -0,0 +1,36 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.chainSanitizerCallback = void 0;
4
+ /**
5
+ * @internal
6
+ * Chain all callback for an style sanitizer
7
+ * @param map The source callback map
8
+ * @param name Name of the property to chain
9
+ * @param newCallback A new callback to process the given name on the given map.
10
+ */
11
+ function chainSanitizerCallback(map, name, newCallback) {
12
+ var finalCb = typeof newCallback == 'function'
13
+ ? newCallback
14
+ : function (value) { return (newCallback ? value : null); };
15
+ if (!map[name]) {
16
+ map[name] = finalCb;
17
+ }
18
+ else {
19
+ var originalCallback_1 = map[name];
20
+ map[name] = function (value, tagName) {
21
+ var og = typeof originalCallback_1 == 'function'
22
+ ? originalCallback_1(value, tagName)
23
+ : originalCallback_1
24
+ ? value
25
+ : false;
26
+ if (!og) {
27
+ return null;
28
+ }
29
+ else {
30
+ return finalCb(og, tagName);
31
+ }
32
+ };
33
+ }
34
+ }
35
+ exports.chainSanitizerCallback = chainSanitizerCallback;
36
+ //# sourceMappingURL=chainSanitizerCallback.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chainSanitizerCallback.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-plugins/lib/paste/utils/chainSanitizerCallback.ts"],"names":[],"mappings":";;;AAEA;;;;;;GAMG;AACH,SAAgB,sBAAsB,CAClC,GAAmC,EACnC,IAAY,EACZ,WAA2B;IAE3B,IAAM,OAAO,GACT,OAAO,WAAW,IAAI,UAAU;QAC5B,CAAC,CAAC,WAAW;QACb,CAAC,CAAC,UAAC,KAAa,IAAK,OAAA,CAAC,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,EAA5B,CAA4B,CAAC;IAC1D,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;QACZ,GAAG,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC;KACvB;SAAM;QACH,IAAM,kBAAgB,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC;QACnC,GAAG,CAAC,IAAI,CAAC,GAAG,UAAC,KAAa,EAAE,OAAe;YACvC,IAAM,EAAE,GACJ,OAAO,kBAAgB,IAAI,UAAU;gBACjC,CAAC,CAAC,kBAAgB,CAAC,KAAK,EAAE,OAAO,CAAC;gBAClC,CAAC,CAAC,kBAAgB;oBAClB,CAAC,CAAC,KAAK;oBACP,CAAC,CAAC,KAAK,CAAC;YAChB,IAAI,CAAC,EAAE,EAAE;gBACL,OAAO,IAAI,CAAC;aACf;iBAAM;gBACH,OAAO,OAAO,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;aAC/B;QACL,CAAC,CAAC;KACL;AACL,CAAC;AA3BD,wDA2BC","sourcesContent":["import type { ValueSanitizer } from 'roosterjs-content-model-types';\n\n/**\n * @internal\n * Chain all callback for an style sanitizer\n * @param map The source callback map\n * @param name Name of the property to chain\n * @param newCallback A new callback to process the given name on the given map.\n */\nexport function chainSanitizerCallback(\n map: Record<string, ValueSanitizer>,\n name: string,\n newCallback: ValueSanitizer\n) {\n const finalCb =\n typeof newCallback == 'function'\n ? newCallback\n : (value: string) => (newCallback ? value : null);\n if (!map[name]) {\n map[name] = finalCb;\n } else {\n const originalCallback = map[name];\n map[name] = (value: string, tagName: string) => {\n const og =\n typeof originalCallback == 'function'\n ? originalCallback(value, tagName)\n : originalCallback\n ? value\n : false;\n if (!og) {\n return null;\n } else {\n return finalCb(og, tagName);\n }\n };\n }\n}\n"]}
@@ -1,5 +1,5 @@
1
- import type { ContentModelParagraph, ContentModelText } from 'roosterjs-content-model-types';
1
+ import type { ContentModelText, ShallowMutableContentModelParagraph } from 'roosterjs-content-model-types';
2
2
  /**
3
3
  * @internal
4
4
  */
5
- export declare function getQueryString(triggerCharacter: string, paragraph: ContentModelParagraph, previousSegment: ContentModelText, splittedSegmentResult?: ContentModelText[]): string;
5
+ export declare function getQueryString(triggerCharacter: string, paragraph: ShallowMutableContentModelParagraph, previousSegment: ContentModelText, splittedSegmentResult?: ContentModelText[]): string;
@@ -1 +1 @@
1
- {"version":3,"file":"getQueryString.js","sourceRoot":"","sources":["../../../../packages/roosterjs-content-model-plugins/lib/picker/getQueryString.ts"],"names":[],"mappings":";;;AAAA,oEAAmE;AAGnE;;GAEG;AACH,SAAgB,cAAc,CAC1B,gBAAwB,EACxB,SAAgC,EAChC,eAAiC,EACjC,qBAA0C;IAE1C,IAAI,MAAM,GAAG,EAAE,CAAC;IAChB,IAAI,CAAC,GAAG,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;IAEpD,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE;QAChB,IAAM,OAAO,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;QAEtC,IAAI,OAAO,CAAC,WAAW,IAAI,MAAM,EAAE;YAC/B,MAAM,GAAG,EAAE,CAAC;YACZ,MAAM;SACT;QAED,IAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,gBAAgB,CAAC,CAAC;QAEzD,IAAI,KAAK,IAAI,CAAC,EAAE;YACZ,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC;YAEhD,qBAAqB,aAArB,qBAAqB,uBAArB,qBAAqB,CAAE,OAAO,CAC1B,KAAK,GAAG,CAAC;gBACL,CAAC,CAAC,IAAA,mCAAgB,EAAC,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC;gBAClE,CAAC,CAAC,OAAO,CAChB,CAAC;YAEF,MAAM;SACT;aAAM;YACH,MAAM,GAAG,OAAO,CAAC,IAAI,GAAG,MAAM,CAAC;YAE/B,qBAAqB,aAArB,qBAAqB,uBAArB,qBAAqB,CAAE,OAAO,CAAC,OAAO,CAAC,CAAC;SAC3C;KACJ;IAED,IAAI,CAAC,GAAG,CAAC,EAAE;QACP,MAAM,GAAG,EAAE,CAAC;KACf;IAED,OAAO,MAAM,CAAC;AAClB,CAAC;AAzCD,wCAyCC","sourcesContent":["import { splitTextSegment } from '../pluginUtils/splitTextSegment';\nimport type { ContentModelParagraph, ContentModelText } from 'roosterjs-content-model-types';\n\n/**\n * @internal\n */\nexport function getQueryString(\n triggerCharacter: string,\n paragraph: ContentModelParagraph,\n previousSegment: ContentModelText,\n splittedSegmentResult?: ContentModelText[]\n): string {\n let result = '';\n let i = paragraph.segments.indexOf(previousSegment);\n\n for (; i >= 0; i--) {\n const segment = paragraph.segments[i];\n\n if (segment.segmentType != 'Text') {\n result = '';\n break;\n }\n\n const index = segment.text.lastIndexOf(triggerCharacter);\n\n if (index >= 0) {\n result = segment.text.substring(index) + result;\n\n splittedSegmentResult?.unshift(\n index > 0\n ? splitTextSegment(segment, paragraph, index, segment.text.length)\n : segment\n );\n\n break;\n } else {\n result = segment.text + result;\n\n splittedSegmentResult?.unshift(segment);\n }\n }\n\n if (i < 0) {\n result = '';\n }\n\n return result;\n}\n"]}
1
+ {"version":3,"file":"getQueryString.js","sourceRoot":"","sources":["../../../../packages/roosterjs-content-model-plugins/lib/picker/getQueryString.ts"],"names":[],"mappings":";;;AAAA,oEAAmE;AAMnE;;GAEG;AACH,SAAgB,cAAc,CAC1B,gBAAwB,EACxB,SAA8C,EAC9C,eAAiC,EACjC,qBAA0C;IAE1C,IAAI,MAAM,GAAG,EAAE,CAAC;IAChB,IAAI,CAAC,GAAG,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;IAEpD,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE;QAChB,IAAM,OAAO,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;QAEtC,IAAI,OAAO,CAAC,WAAW,IAAI,MAAM,EAAE;YAC/B,MAAM,GAAG,EAAE,CAAC;YACZ,MAAM;SACT;QAED,IAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,gBAAgB,CAAC,CAAC;QAEzD,IAAI,KAAK,IAAI,CAAC,EAAE;YACZ,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC;YAEhD,qBAAqB,aAArB,qBAAqB,uBAArB,qBAAqB,CAAE,OAAO,CAC1B,KAAK,GAAG,CAAC;gBACL,CAAC,CAAC,IAAA,mCAAgB,EAAC,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC;gBAClE,CAAC,CAAC,OAAO,CAChB,CAAC;YAEF,MAAM;SACT;aAAM;YACH,MAAM,GAAG,OAAO,CAAC,IAAI,GAAG,MAAM,CAAC;YAE/B,qBAAqB,aAArB,qBAAqB,uBAArB,qBAAqB,CAAE,OAAO,CAAC,OAAO,CAAC,CAAC;SAC3C;KACJ;IAED,IAAI,CAAC,GAAG,CAAC,EAAE;QACP,MAAM,GAAG,EAAE,CAAC;KACf;IAED,OAAO,MAAM,CAAC;AAClB,CAAC;AAzCD,wCAyCC","sourcesContent":["import { splitTextSegment } from '../pluginUtils/splitTextSegment';\nimport type {\n ContentModelText,\n ShallowMutableContentModelParagraph,\n} from 'roosterjs-content-model-types';\n\n/**\n * @internal\n */\nexport function getQueryString(\n triggerCharacter: string,\n paragraph: ShallowMutableContentModelParagraph,\n previousSegment: ContentModelText,\n splittedSegmentResult?: ContentModelText[]\n): string {\n let result = '';\n let i = paragraph.segments.indexOf(previousSegment);\n\n for (; i >= 0; i--) {\n const segment = paragraph.segments[i];\n\n if (segment.segmentType != 'Text') {\n result = '';\n break;\n }\n\n const index = segment.text.lastIndexOf(triggerCharacter);\n\n if (index >= 0) {\n result = segment.text.substring(index) + result;\n\n splittedSegmentResult?.unshift(\n index > 0\n ? splitTextSegment(segment, paragraph, index, segment.text.length)\n : segment\n );\n\n break;\n } else {\n result = segment.text + result;\n\n splittedSegmentResult?.unshift(segment);\n }\n }\n\n if (i < 0) {\n result = '';\n }\n\n return result;\n}\n"]}
@@ -1,5 +1,5 @@
1
- import type { ContentModelParagraph, ContentModelText } from 'roosterjs-content-model-types';
1
+ import type { ContentModelText, ShallowMutableContentModelParagraph } from 'roosterjs-content-model-types';
2
2
  /**
3
3
  * @internal
4
4
  */
5
- export declare function splitTextSegment(textSegment: ContentModelText, parent: ContentModelParagraph, start: number, end: number): ContentModelText;
5
+ export declare function splitTextSegment(textSegment: ContentModelText, parent: ShallowMutableContentModelParagraph, start: number, end: number): ContentModelText;
@@ -1 +1 @@
1
- {"version":3,"file":"splitTextSegment.js","sourceRoot":"","sources":["../../../../packages/roosterjs-content-model-plugins/lib/pluginUtils/splitTextSegment.ts"],"names":[],"mappings":";;;;AAAA,2EAAyD;AAGzD;;GAEG;AACH,SAAgB,gBAAgB,CAC5B,WAA6B,EAC7B,MAA6B,EAC7B,KAAa,EACb,GAAW;;IAEX,IAAM,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC;IAC9B,IAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IACnD,IAAM,aAAa,GAAG,IAAA,wCAAU,EAC5B,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,GAAG,CAAC,EAC1B,WAAW,CAAC,MAAM,EAClB,WAAW,CAAC,IAAI,EAChB,WAAW,CAAC,IAAI,CACnB,CAAC;IAEF,IAAM,WAAW,GAAuB,CAAC,aAAa,CAAC,CAAC;IACxD,IAAI,KAAK,GAAG,CAAC,EAAE;QACX,WAAW,CAAC,OAAO,CACf,IAAA,wCAAU,EACN,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,KAAK,CAAC,EACxB,WAAW,CAAC,MAAM,EAClB,WAAW,CAAC,IAAI,EAChB,WAAW,CAAC,IAAI,CACnB,CACJ,CAAC;KACL;IACD,IAAI,GAAG,GAAG,IAAI,CAAC,MAAM,EAAE;QACnB,WAAW,CAAC,IAAI,CACZ,IAAA,wCAAU,EAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,WAAW,CAAC,MAAM,EAAE,WAAW,CAAC,IAAI,EAAE,WAAW,CAAC,IAAI,CAAC,CAC1F,CAAC;KACL;IAED,WAAW,CAAC,OAAO,CAAC,UAAA,OAAO,IAAI,OAAA,CAAC,OAAO,CAAC,UAAU,GAAG,WAAW,CAAC,UAAU,CAAC,EAA7C,CAA6C,CAAC,CAAC;IAC9E,CAAA,KAAA,MAAM,CAAC,QAAQ,CAAA,CAAC,MAAM,uCAAC,KAAK,EAAE,CAAC,uBAAK,WAAW,WAAE;IAEjD,OAAO,aAAa,CAAC;AACzB,CAAC;AApCD,4CAoCC","sourcesContent":["import { createText } from 'roosterjs-content-model-dom';\nimport type { ContentModelParagraph, ContentModelText } from 'roosterjs-content-model-types';\n\n/**\n * @internal\n */\nexport function splitTextSegment(\n textSegment: ContentModelText,\n parent: ContentModelParagraph,\n start: number,\n end: number\n): ContentModelText {\n const text = textSegment.text;\n const index = parent.segments.indexOf(textSegment);\n const middleSegment = createText(\n text.substring(start, end),\n textSegment.format,\n textSegment.link,\n textSegment.code\n );\n\n const newSegments: ContentModelText[] = [middleSegment];\n if (start > 0) {\n newSegments.unshift(\n createText(\n text.substring(0, start),\n textSegment.format,\n textSegment.link,\n textSegment.code\n )\n );\n }\n if (end < text.length) {\n newSegments.push(\n createText(text.substring(end), textSegment.format, textSegment.link, textSegment.code)\n );\n }\n\n newSegments.forEach(segment => (segment.isSelected = textSegment.isSelected));\n parent.segments.splice(index, 1, ...newSegments);\n\n return middleSegment;\n}\n"]}
1
+ {"version":3,"file":"splitTextSegment.js","sourceRoot":"","sources":["../../../../packages/roosterjs-content-model-plugins/lib/pluginUtils/splitTextSegment.ts"],"names":[],"mappings":";;;;AAAA,2EAAyD;AAMzD;;GAEG;AACH,SAAgB,gBAAgB,CAC5B,WAA6B,EAC7B,MAA2C,EAC3C,KAAa,EACb,GAAW;;IAEX,IAAM,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC;IAC9B,IAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IACnD,IAAM,aAAa,GAAG,IAAA,wCAAU,EAC5B,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,GAAG,CAAC,EAC1B,WAAW,CAAC,MAAM,EAClB,WAAW,CAAC,IAAI,EAChB,WAAW,CAAC,IAAI,CACnB,CAAC;IAEF,IAAM,WAAW,GAAuB,CAAC,aAAa,CAAC,CAAC;IACxD,IAAI,KAAK,GAAG,CAAC,EAAE;QACX,WAAW,CAAC,OAAO,CACf,IAAA,wCAAU,EACN,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,KAAK,CAAC,EACxB,WAAW,CAAC,MAAM,EAClB,WAAW,CAAC,IAAI,EAChB,WAAW,CAAC,IAAI,CACnB,CACJ,CAAC;KACL;IACD,IAAI,GAAG,GAAG,IAAI,CAAC,MAAM,EAAE;QACnB,WAAW,CAAC,IAAI,CACZ,IAAA,wCAAU,EAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,WAAW,CAAC,MAAM,EAAE,WAAW,CAAC,IAAI,EAAE,WAAW,CAAC,IAAI,CAAC,CAC1F,CAAC;KACL;IAED,WAAW,CAAC,OAAO,CAAC,UAAA,OAAO,IAAI,OAAA,CAAC,OAAO,CAAC,UAAU,GAAG,WAAW,CAAC,UAAU,CAAC,EAA7C,CAA6C,CAAC,CAAC;IAC9E,CAAA,KAAA,MAAM,CAAC,QAAQ,CAAA,CAAC,MAAM,uCAAC,KAAK,EAAE,CAAC,uBAAK,WAAW,WAAE;IAEjD,OAAO,aAAa,CAAC;AACzB,CAAC;AApCD,4CAoCC","sourcesContent":["import { createText } from 'roosterjs-content-model-dom';\nimport type {\n ContentModelText,\n ShallowMutableContentModelParagraph,\n} from 'roosterjs-content-model-types';\n\n/**\n * @internal\n */\nexport function splitTextSegment(\n textSegment: ContentModelText,\n parent: ShallowMutableContentModelParagraph,\n start: number,\n end: number\n): ContentModelText {\n const text = textSegment.text;\n const index = parent.segments.indexOf(textSegment);\n const middleSegment = createText(\n text.substring(start, end),\n textSegment.format,\n textSegment.link,\n textSegment.code\n );\n\n const newSegments: ContentModelText[] = [middleSegment];\n if (start > 0) {\n newSegments.unshift(\n createText(\n text.substring(0, start),\n textSegment.format,\n textSegment.link,\n textSegment.code\n )\n );\n }\n if (end < text.length) {\n newSegments.push(\n createText(text.substring(end), textSegment.format, textSegment.link, textSegment.code)\n );\n }\n\n newSegments.forEach(segment => (segment.isSelected = textSegment.isSelected));\n parent.segments.splice(index, 1, ...newSegments);\n\n return middleSegment;\n}\n"]}
@@ -51,6 +51,9 @@ export declare class TableEditor {
51
51
  dispose(): void;
52
52
  isEditing(): boolean;
53
53
  isOwnedElement(node: Node): boolean;
54
+ /**
55
+ * public only for testing purposes
56
+ */
54
57
  onMouseMove(x: number, y: number): void;
55
58
  private setEditorFeatures;
56
59
  private onEditorCreated;
@@ -82,6 +82,7 @@ var TableEditor = /** @class */ (function () {
82
82
  _this.editor.focus();
83
83
  if (_this.range) {
84
84
  _this.editor.setDOMSelection({ type: 'range', range: _this.range, isReverted: false });
85
+ _this.range = null;
85
86
  }
86
87
  _this.editor.takeSnapshot(); // Pass in an empty callback to make sure ContentChangedEvent is triggered
87
88
  _this.onChanged();
@@ -168,6 +169,9 @@ var TableEditor = /** @class */ (function () {
168
169
  .filter(function (feature) { return !!(feature === null || feature === void 0 ? void 0 : feature.div); })
169
170
  .some(function (feature) { return (feature === null || feature === void 0 ? void 0 : feature.div) == node; });
170
171
  };
172
+ /**
173
+ * public only for testing purposes
174
+ */
171
175
  TableEditor.prototype.onMouseMove = function (x, y) {
172
176
  var _a;
173
177
  // Get whole table rect
@@ -1 +1 @@
1
- {"version":3,"file":"TableEditor.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-plugins/lib/tableEdit/editors/TableEditor.ts"],"names":[],"mappings":"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","sourcesContent":["import { createCellResizer } from './features/CellResizer';\nimport { createTableInserter } from './features/TableInserter';\nimport { createTableMover } from './features/TableMover';\nimport { createTableResizer } from './features/TableResizer';\nimport { disposeTableEditFeature } from './features/TableEditFeature';\nimport { isNodeOfType, normalizeRect, parseTableCells } from 'roosterjs-content-model-dom';\nimport type { OnTableEditorCreatedCallback } from '../OnTableEditorCreatedCallback';\nimport type { TableEditFeature } from './features/TableEditFeature';\nimport type { IEditor, TableSelection } from 'roosterjs-content-model-types';\nimport type { TableEditFeatureName } from './features/TableEditFeatureName';\n\nconst INSERTER_HOVER_OFFSET = 6;\nconst enum TOP_OR_SIDE {\n top = 0,\n side = 1,\n}\n/**\n * @internal\n *\n * A table has 6 hot areas to be resized/edited (take LTR example):\n *\n * [6] [ ]\n * +[ 1 ]+--------------------+\n * |[ ]| |\n * [ ] [ ] |\n * [ ] [ ] |\n * [2] [3] |\n * [ ] [ ] |\n * [ ][ 4 ]| |\n * +------------------+--------------------+\n * | | |\n * | | |\n * | | |\n * +------------------+--------------------+\n * [5]\n *\n * 1 - Hover area to show insert column button\n * 2 - Hover area to show insert row button\n * 3 - Hover area to show vertical resizing bar\n * 4 - Hover area to show horizontal resizing bar\n * 5 - Hover area to show whole table resize handle\n * 6 - Hover area to show whole table mover handle\n *\n * When set a different current table or change current TD, we need to update these areas\n */\nexport class TableEditor {\n // 1, 2 - Insert a column or a row\n private horizontalInserter: TableEditFeature | null = null;\n private verticalInserter: TableEditFeature | null = null;\n\n // 3, 4 - Resize a column or a row from a cell\n private horizontalResizer: TableEditFeature | null = null;\n private verticalResizer: TableEditFeature | null = null;\n\n // 5 - Resize whole table\n private tableResizer: TableEditFeature | null = null;\n\n // 6 - Move as well as select whole table\n private tableMover: TableEditFeature | null = null;\n\n private isRTL: boolean;\n private range: Range | null = null;\n private isCurrentlyEditing: boolean;\n\n constructor(\n private editor: IEditor,\n public readonly table: HTMLTableElement,\n private onChanged: () => void,\n private anchorContainer?: HTMLElement,\n private contentDiv?: EventTarget | null,\n private onTableEditorCreated?: OnTableEditorCreatedCallback,\n private disableFeatures?: TableEditFeatureName[]\n ) {\n this.isRTL = editor.getDocument().defaultView?.getComputedStyle(table).direction == 'rtl';\n this.setEditorFeatures();\n this.isCurrentlyEditing = false;\n }\n\n dispose() {\n this.disposeTableResizer();\n this.disposeCellResizers();\n this.disposeTableInserter();\n this.disposeTableMover();\n }\n\n isEditing(): boolean {\n return this.isCurrentlyEditing;\n }\n\n isOwnedElement(node: Node) {\n return [\n this.tableResizer,\n this.tableMover,\n this.horizontalInserter,\n this.verticalInserter,\n this.horizontalResizer,\n this.verticalResizer,\n ]\n .filter(feature => !!feature?.div)\n .some(feature => feature?.div == node);\n }\n\n onMouseMove(x: number, y: number) {\n // Get whole table rect\n const tableRect = normalizeRect(this.table.getBoundingClientRect());\n\n if (!tableRect) {\n return;\n }\n\n // Determine if cursor is on top or side\n const topOrSide =\n y <= tableRect.top + INSERTER_HOVER_OFFSET\n ? TOP_OR_SIDE.top\n : this.isRTL\n ? x >= tableRect.right - INSERTER_HOVER_OFFSET\n ? TOP_OR_SIDE.side\n : undefined\n : x <= tableRect.left + INSERTER_HOVER_OFFSET\n ? TOP_OR_SIDE.side\n : undefined;\n const topOrSideBinary = topOrSide ? 1 : 0;\n\n // i is row index, j is column index\n for (let i = 0; i < this.table.rows.length; i++) {\n const tr = this.table.rows[i];\n let j = 0;\n for (; j < tr.cells.length; j++) {\n const td = tr.cells[j];\n const tdRect = normalizeRect(td.getBoundingClientRect());\n\n if (!tdRect || !tableRect) {\n continue;\n }\n\n // Determine the cell the cursor is in range of\n // Offset is only used for first row and column\n const lessThanBottom = y <= tdRect.bottom;\n const lessThanRight = this.isRTL\n ? x <= tdRect.right + INSERTER_HOVER_OFFSET * topOrSideBinary\n : x <= tdRect.right;\n const moreThanLeft = this.isRTL\n ? x >= tdRect.left\n : x >= tdRect.left - INSERTER_HOVER_OFFSET * topOrSideBinary;\n\n if (lessThanBottom && lessThanRight && moreThanLeft) {\n if (i === 0 && topOrSide == TOP_OR_SIDE.top) {\n const center = (tdRect.left + tdRect.right) / 2;\n const isOnRightHalf = this.isRTL ? x < center : x > center;\n !this.isFeatureDisabled('VerticalTableInserter') &&\n this.setInserterTd(\n isOnRightHalf ? td : tr.cells[j - 1],\n false /*isHorizontal*/\n );\n } else if (j === 0 && topOrSide == TOP_OR_SIDE.side) {\n const tdAbove = this.table.rows[i - 1]?.cells[0];\n const tdAboveRect = tdAbove\n ? normalizeRect(tdAbove.getBoundingClientRect())\n : null;\n\n const isTdNotAboveMerged = !tdAboveRect\n ? null\n : this.isRTL\n ? tdAboveRect.right === tdRect.right\n : tdAboveRect.left === tdRect.left;\n\n !this.isFeatureDisabled('HorizontalTableInserter') &&\n this.setInserterTd(\n y < (tdRect.top + tdRect.bottom) / 2 && isTdNotAboveMerged\n ? tdAbove\n : td,\n true /*isHorizontal*/\n );\n } else {\n this.setInserterTd(null);\n }\n\n !this.isFeatureDisabled('CellResizer') && this.setResizingTd(td);\n\n //Cell found\n break;\n }\n }\n\n if (j < tr.cells.length) {\n break;\n }\n }\n\n // Create Mover and Resizer\n this.setEditorFeatures();\n }\n\n private setEditorFeatures() {\n const disableSelector = this.isFeatureDisabled('TableSelector');\n const disableMovement = this.isFeatureDisabled('TableMover');\n if (!this.tableMover && !(disableSelector && disableMovement)) {\n this.tableMover = createTableMover(\n this.table,\n this.editor,\n this.isRTL,\n disableSelector ? () => {} : this.onSelect,\n this.onStartTableMove,\n this.onEndTableMove,\n this.contentDiv,\n this.anchorContainer,\n this.onEditorCreated,\n disableMovement\n );\n }\n\n if (!this.tableResizer && !this.isFeatureDisabled('TableResizer')) {\n this.tableResizer = createTableResizer(\n this.table,\n this.editor,\n this.isRTL,\n this.onStartTableResize,\n this.onFinishEditing,\n this.contentDiv,\n this.anchorContainer,\n this.onTableEditorCreated\n );\n }\n }\n\n private onEditorCreated = (featureType: TableEditFeatureName, element: HTMLElement) => {\n const disposer = this.onTableEditorCreated?.(featureType, element);\n const onMouseOut = element && this.getOnMouseOut(element);\n if (onMouseOut) {\n element.addEventListener('mouseout', onMouseOut);\n }\n\n return () => {\n disposer?.();\n if (onMouseOut) {\n element.removeEventListener('mouseout', onMouseOut);\n }\n };\n };\n\n private setResizingTd(td: HTMLTableCellElement) {\n if (this.horizontalResizer && this.horizontalResizer.node != td) {\n this.disposeCellResizers();\n }\n\n if (!this.horizontalResizer && td) {\n this.horizontalResizer = createCellResizer(\n this.editor,\n td,\n this.table,\n this.isRTL,\n true /*isHorizontal*/,\n this.onStartCellResize,\n this.onFinishEditing,\n this.anchorContainer\n );\n this.verticalResizer = createCellResizer(\n this.editor,\n td,\n this.table,\n this.isRTL,\n false /*isHorizontal*/,\n this.onStartCellResize,\n this.onFinishEditing,\n this.anchorContainer\n );\n }\n }\n\n /**\n * create or remove TableInserter\n * @param td td to attach to, set this to null to remove inserters (both horizontal and vertical)\n */\n private setInserterTd(td: HTMLTableCellElement | null, isHorizontal?: boolean) {\n const inserter = isHorizontal ? this.horizontalInserter : this.verticalInserter;\n if (td === null || (inserter && inserter.node != td)) {\n this.disposeTableInserter();\n }\n\n if (!this.horizontalInserter && !this.verticalInserter && td) {\n const newInserter = createTableInserter(\n this.editor,\n td,\n this.table,\n this.isRTL,\n !!isHorizontal,\n this.onInserted,\n this.anchorContainer,\n this.onEditorCreated\n );\n if (isHorizontal) {\n this.horizontalInserter = newInserter;\n } else {\n this.verticalInserter = newInserter;\n }\n }\n }\n\n private disposeTableResizer() {\n if (this.tableResizer) {\n disposeTableEditFeature(this.tableResizer);\n this.tableResizer = null;\n }\n }\n\n private disposeTableInserter() {\n if (this.horizontalInserter) {\n disposeTableEditFeature(this.horizontalInserter);\n this.horizontalInserter = null;\n }\n if (this.verticalInserter) {\n disposeTableEditFeature(this.verticalInserter);\n this.verticalInserter = null;\n }\n }\n\n private disposeCellResizers() {\n if (this.horizontalResizer) {\n disposeTableEditFeature(this.horizontalResizer);\n this.horizontalResizer = null;\n }\n if (this.verticalResizer) {\n disposeTableEditFeature(this.verticalResizer);\n this.verticalResizer = null;\n }\n }\n\n private disposeTableMover() {\n if (this.tableMover) {\n disposeTableEditFeature(this.tableMover);\n this.tableMover = null;\n }\n }\n\n private onFinishEditing = (): false => {\n this.editor.focus();\n\n if (this.range) {\n this.editor.setDOMSelection({ type: 'range', range: this.range, isReverted: false });\n }\n\n this.editor.takeSnapshot(); // Pass in an empty callback to make sure ContentChangedEvent is triggered\n this.onChanged();\n this.isCurrentlyEditing = false;\n\n return false;\n };\n\n private onStartTableResize = () => {\n this.isCurrentlyEditing = true;\n this.onStartResize();\n };\n\n private onStartCellResize = () => {\n this.isCurrentlyEditing = true;\n this.disposeTableResizer();\n this.onStartResize();\n };\n\n private onStartTableMove = () => {\n this.isCurrentlyEditing = true;\n this.disposeTableResizer();\n this.disposeTableInserter();\n this.disposeCellResizers();\n };\n\n private onStartResize() {\n this.isCurrentlyEditing = true;\n const range = this.editor.getDOMSelection();\n\n if (range && range.type == 'range') {\n this.range = range.range;\n }\n\n this.editor.takeSnapshot();\n }\n\n private onEndTableMove = () => {\n this.disposeTableMover();\n return this.onFinishEditing();\n };\n\n private onInserted = () => {\n this.disposeTableResizer();\n this.onFinishEditing();\n };\n\n /**\n * Public only for testing purposes\n * @param table the table to select\n */\n public onSelect = (table: HTMLTableElement) => {\n this.editor.focus();\n\n if (table) {\n const parsedTable = parseTableCells(table);\n const selection: TableSelection = {\n table: table,\n firstRow: 0,\n firstColumn: 0,\n lastRow: parsedTable.length - 1,\n lastColumn: (parsedTable[0]?.length ?? 0) - 1,\n type: 'table',\n };\n\n this.editor.setDOMSelection(selection);\n }\n };\n\n private getOnMouseOut = (feature: HTMLElement) => {\n return (ev: MouseEvent) => {\n if (\n feature &&\n ev.relatedTarget != feature &&\n isNodeOfType(this.contentDiv as Node, 'ELEMENT_NODE') &&\n isNodeOfType(ev.relatedTarget as Node, 'ELEMENT_NODE') &&\n !(this.contentDiv == ev.relatedTarget) &&\n !this.isEditing()\n ) {\n this.dispose();\n }\n };\n };\n\n private isFeatureDisabled(feature: TableEditFeatureName) {\n return this.disableFeatures?.includes(feature);\n }\n}\n"]}
1
+ {"version":3,"file":"TableEditor.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-plugins/lib/tableEdit/editors/TableEditor.ts"],"names":[],"mappings":"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","sourcesContent":["import { createCellResizer } from './features/CellResizer';\nimport { createTableInserter } from './features/TableInserter';\nimport { createTableMover } from './features/TableMover';\nimport { createTableResizer } from './features/TableResizer';\nimport { disposeTableEditFeature } from './features/TableEditFeature';\nimport { isNodeOfType, normalizeRect, parseTableCells } from 'roosterjs-content-model-dom';\nimport type { OnTableEditorCreatedCallback } from '../OnTableEditorCreatedCallback';\nimport type { TableEditFeature } from './features/TableEditFeature';\nimport type { IEditor, TableSelection } from 'roosterjs-content-model-types';\nimport type { TableEditFeatureName } from './features/TableEditFeatureName';\n\nconst INSERTER_HOVER_OFFSET = 6;\nconst enum TOP_OR_SIDE {\n top = 0,\n side = 1,\n}\n/**\n * @internal\n *\n * A table has 6 hot areas to be resized/edited (take LTR example):\n *\n * [6] [ ]\n * +[ 1 ]+--------------------+\n * |[ ]| |\n * [ ] [ ] |\n * [ ] [ ] |\n * [2] [3] |\n * [ ] [ ] |\n * [ ][ 4 ]| |\n * +------------------+--------------------+\n * | | |\n * | | |\n * | | |\n * +------------------+--------------------+\n * [5]\n *\n * 1 - Hover area to show insert column button\n * 2 - Hover area to show insert row button\n * 3 - Hover area to show vertical resizing bar\n * 4 - Hover area to show horizontal resizing bar\n * 5 - Hover area to show whole table resize handle\n * 6 - Hover area to show whole table mover handle\n *\n * When set a different current table or change current TD, we need to update these areas\n */\nexport class TableEditor {\n // 1, 2 - Insert a column or a row\n private horizontalInserter: TableEditFeature | null = null;\n private verticalInserter: TableEditFeature | null = null;\n\n // 3, 4 - Resize a column or a row from a cell\n private horizontalResizer: TableEditFeature | null = null;\n private verticalResizer: TableEditFeature | null = null;\n\n // 5 - Resize whole table\n private tableResizer: TableEditFeature | null = null;\n\n // 6 - Move as well as select whole table\n private tableMover: TableEditFeature | null = null;\n\n private isRTL: boolean;\n private range: Range | null = null;\n private isCurrentlyEditing: boolean;\n\n constructor(\n private editor: IEditor,\n public readonly table: HTMLTableElement,\n private onChanged: () => void,\n private anchorContainer?: HTMLElement,\n private contentDiv?: EventTarget | null,\n private onTableEditorCreated?: OnTableEditorCreatedCallback,\n private disableFeatures?: TableEditFeatureName[]\n ) {\n this.isRTL = editor.getDocument().defaultView?.getComputedStyle(table).direction == 'rtl';\n this.setEditorFeatures();\n this.isCurrentlyEditing = false;\n }\n\n dispose() {\n this.disposeTableResizer();\n this.disposeCellResizers();\n this.disposeTableInserter();\n this.disposeTableMover();\n }\n\n isEditing(): boolean {\n return this.isCurrentlyEditing;\n }\n\n isOwnedElement(node: Node) {\n return [\n this.tableResizer,\n this.tableMover,\n this.horizontalInserter,\n this.verticalInserter,\n this.horizontalResizer,\n this.verticalResizer,\n ]\n .filter(feature => !!feature?.div)\n .some(feature => feature?.div == node);\n }\n\n /**\n * public only for testing purposes\n */\n public onMouseMove(x: number, y: number) {\n // Get whole table rect\n const tableRect = normalizeRect(this.table.getBoundingClientRect());\n\n if (!tableRect) {\n return;\n }\n\n // Determine if cursor is on top or side\n const topOrSide =\n y <= tableRect.top + INSERTER_HOVER_OFFSET\n ? TOP_OR_SIDE.top\n : this.isRTL\n ? x >= tableRect.right - INSERTER_HOVER_OFFSET\n ? TOP_OR_SIDE.side\n : undefined\n : x <= tableRect.left + INSERTER_HOVER_OFFSET\n ? TOP_OR_SIDE.side\n : undefined;\n const topOrSideBinary = topOrSide ? 1 : 0;\n\n // i is row index, j is column index\n for (let i = 0; i < this.table.rows.length; i++) {\n const tr = this.table.rows[i];\n let j = 0;\n for (; j < tr.cells.length; j++) {\n const td = tr.cells[j];\n const tdRect = normalizeRect(td.getBoundingClientRect());\n\n if (!tdRect || !tableRect) {\n continue;\n }\n\n // Determine the cell the cursor is in range of\n // Offset is only used for first row and column\n const lessThanBottom = y <= tdRect.bottom;\n const lessThanRight = this.isRTL\n ? x <= tdRect.right + INSERTER_HOVER_OFFSET * topOrSideBinary\n : x <= tdRect.right;\n const moreThanLeft = this.isRTL\n ? x >= tdRect.left\n : x >= tdRect.left - INSERTER_HOVER_OFFSET * topOrSideBinary;\n\n if (lessThanBottom && lessThanRight && moreThanLeft) {\n if (i === 0 && topOrSide == TOP_OR_SIDE.top) {\n const center = (tdRect.left + tdRect.right) / 2;\n const isOnRightHalf = this.isRTL ? x < center : x > center;\n !this.isFeatureDisabled('VerticalTableInserter') &&\n this.setInserterTd(\n isOnRightHalf ? td : tr.cells[j - 1],\n false /*isHorizontal*/\n );\n } else if (j === 0 && topOrSide == TOP_OR_SIDE.side) {\n const tdAbove = this.table.rows[i - 1]?.cells[0];\n const tdAboveRect = tdAbove\n ? normalizeRect(tdAbove.getBoundingClientRect())\n : null;\n\n const isTdNotAboveMerged = !tdAboveRect\n ? null\n : this.isRTL\n ? tdAboveRect.right === tdRect.right\n : tdAboveRect.left === tdRect.left;\n\n !this.isFeatureDisabled('HorizontalTableInserter') &&\n this.setInserterTd(\n y < (tdRect.top + tdRect.bottom) / 2 && isTdNotAboveMerged\n ? tdAbove\n : td,\n true /*isHorizontal*/\n );\n } else {\n this.setInserterTd(null);\n }\n\n !this.isFeatureDisabled('CellResizer') && this.setResizingTd(td);\n\n //Cell found\n break;\n }\n }\n\n if (j < tr.cells.length) {\n break;\n }\n }\n\n // Create Mover and Resizer\n this.setEditorFeatures();\n }\n\n private setEditorFeatures() {\n const disableSelector = this.isFeatureDisabled('TableSelector');\n const disableMovement = this.isFeatureDisabled('TableMover');\n if (!this.tableMover && !(disableSelector && disableMovement)) {\n this.tableMover = createTableMover(\n this.table,\n this.editor,\n this.isRTL,\n disableSelector ? () => {} : this.onSelect,\n this.onStartTableMove,\n this.onEndTableMove,\n this.contentDiv,\n this.anchorContainer,\n this.onEditorCreated,\n disableMovement\n );\n }\n\n if (!this.tableResizer && !this.isFeatureDisabled('TableResizer')) {\n this.tableResizer = createTableResizer(\n this.table,\n this.editor,\n this.isRTL,\n this.onStartTableResize,\n this.onFinishEditing,\n this.contentDiv,\n this.anchorContainer,\n this.onTableEditorCreated\n );\n }\n }\n\n private onEditorCreated = (featureType: TableEditFeatureName, element: HTMLElement) => {\n const disposer = this.onTableEditorCreated?.(featureType, element);\n const onMouseOut = element && this.getOnMouseOut(element);\n if (onMouseOut) {\n element.addEventListener('mouseout', onMouseOut);\n }\n\n return () => {\n disposer?.();\n if (onMouseOut) {\n element.removeEventListener('mouseout', onMouseOut);\n }\n };\n };\n\n private setResizingTd(td: HTMLTableCellElement) {\n if (this.horizontalResizer && this.horizontalResizer.node != td) {\n this.disposeCellResizers();\n }\n\n if (!this.horizontalResizer && td) {\n this.horizontalResizer = createCellResizer(\n this.editor,\n td,\n this.table,\n this.isRTL,\n true /*isHorizontal*/,\n this.onStartCellResize,\n this.onFinishEditing,\n this.anchorContainer\n );\n this.verticalResizer = createCellResizer(\n this.editor,\n td,\n this.table,\n this.isRTL,\n false /*isHorizontal*/,\n this.onStartCellResize,\n this.onFinishEditing,\n this.anchorContainer\n );\n }\n }\n\n /**\n * create or remove TableInserter\n * @param td td to attach to, set this to null to remove inserters (both horizontal and vertical)\n */\n private setInserterTd(td: HTMLTableCellElement | null, isHorizontal?: boolean) {\n const inserter = isHorizontal ? this.horizontalInserter : this.verticalInserter;\n if (td === null || (inserter && inserter.node != td)) {\n this.disposeTableInserter();\n }\n\n if (!this.horizontalInserter && !this.verticalInserter && td) {\n const newInserter = createTableInserter(\n this.editor,\n td,\n this.table,\n this.isRTL,\n !!isHorizontal,\n this.onInserted,\n this.anchorContainer,\n this.onEditorCreated\n );\n if (isHorizontal) {\n this.horizontalInserter = newInserter;\n } else {\n this.verticalInserter = newInserter;\n }\n }\n }\n\n private disposeTableResizer() {\n if (this.tableResizer) {\n disposeTableEditFeature(this.tableResizer);\n this.tableResizer = null;\n }\n }\n\n private disposeTableInserter() {\n if (this.horizontalInserter) {\n disposeTableEditFeature(this.horizontalInserter);\n this.horizontalInserter = null;\n }\n if (this.verticalInserter) {\n disposeTableEditFeature(this.verticalInserter);\n this.verticalInserter = null;\n }\n }\n\n private disposeCellResizers() {\n if (this.horizontalResizer) {\n disposeTableEditFeature(this.horizontalResizer);\n this.horizontalResizer = null;\n }\n if (this.verticalResizer) {\n disposeTableEditFeature(this.verticalResizer);\n this.verticalResizer = null;\n }\n }\n\n private disposeTableMover() {\n if (this.tableMover) {\n disposeTableEditFeature(this.tableMover);\n this.tableMover = null;\n }\n }\n\n private onFinishEditing = (): false => {\n this.editor.focus();\n\n if (this.range) {\n this.editor.setDOMSelection({ type: 'range', range: this.range, isReverted: false });\n this.range = null;\n }\n\n this.editor.takeSnapshot(); // Pass in an empty callback to make sure ContentChangedEvent is triggered\n this.onChanged();\n this.isCurrentlyEditing = false;\n\n return false;\n };\n\n private onStartTableResize = () => {\n this.isCurrentlyEditing = true;\n this.onStartResize();\n };\n\n private onStartCellResize = () => {\n this.isCurrentlyEditing = true;\n this.disposeTableResizer();\n this.onStartResize();\n };\n\n private onStartTableMove = () => {\n this.isCurrentlyEditing = true;\n this.disposeTableResizer();\n this.disposeTableInserter();\n this.disposeCellResizers();\n };\n\n private onStartResize() {\n this.isCurrentlyEditing = true;\n const range = this.editor.getDOMSelection();\n\n if (range && range.type == 'range') {\n this.range = range.range;\n }\n\n this.editor.takeSnapshot();\n }\n\n private onEndTableMove = () => {\n this.disposeTableMover();\n return this.onFinishEditing();\n };\n\n private onInserted = () => {\n this.disposeTableResizer();\n this.onFinishEditing();\n };\n\n /**\n * Public only for testing purposes\n * @param table the table to select\n */\n public onSelect = (table: HTMLTableElement) => {\n this.editor.focus();\n\n if (table) {\n const parsedTable = parseTableCells(table);\n const selection: TableSelection = {\n table: table,\n firstRow: 0,\n firstColumn: 0,\n lastRow: parsedTable.length - 1,\n lastColumn: (parsedTable[0]?.length ?? 0) - 1,\n type: 'table',\n };\n\n this.editor.setDOMSelection(selection);\n }\n };\n\n private getOnMouseOut = (feature: HTMLElement) => {\n return (ev: MouseEvent) => {\n if (\n feature &&\n ev.relatedTarget != feature &&\n isNodeOfType(this.contentDiv as Node, 'ELEMENT_NODE') &&\n isNodeOfType(ev.relatedTarget as Node, 'ELEMENT_NODE') &&\n !(this.contentDiv == ev.relatedTarget) &&\n !this.isEditing()\n ) {\n this.dispose();\n }\n };\n };\n\n private isFeatureDisabled(feature: TableEditFeatureName) {\n return this.disableFeatures?.includes(feature);\n }\n}\n"]}
@@ -1,5 +1,5 @@
1
1
  import type { TableEditFeature } from './TableEditFeature';
2
- import type { IEditor } from 'roosterjs-content-model-types';
2
+ import type { IEditor, ReadonlyContentModelTable } from 'roosterjs-content-model-types';
3
3
  /**
4
4
  * @internal
5
5
  */
@@ -12,3 +12,41 @@ export declare const VERTICAL_RESIZER_ID = "verticalResizer";
12
12
  * @internal
13
13
  */
14
14
  export declare function createCellResizer(editor: IEditor, td: HTMLTableCellElement, table: HTMLTableElement, isRTL: boolean, isHorizontal: boolean, onStart: () => void, onEnd: () => false, anchorContainer?: HTMLElement): TableEditFeature | null;
15
+ /**
16
+ * @internal
17
+ * Exported for testing
18
+ */
19
+ export interface CellResizerContext {
20
+ editor: IEditor;
21
+ td: HTMLTableCellElement;
22
+ table: HTMLTableElement;
23
+ isRTL: boolean;
24
+ zoomScale: number;
25
+ onStart: () => void;
26
+ }
27
+ /**
28
+ * @internal
29
+ * Exported for testing
30
+ */
31
+ export interface CellResizerInitValue {
32
+ cmTable: ReadonlyContentModelTable | undefined;
33
+ anchorColumn: number | undefined;
34
+ anchorRow: number | undefined;
35
+ anchorRowHeight: number;
36
+ allWidths: number[];
37
+ }
38
+ /**
39
+ * @internal
40
+ * Exported for testing
41
+ */
42
+ export declare function onDragStart(context: CellResizerContext, event: MouseEvent): CellResizerInitValue;
43
+ /**
44
+ * @internal
45
+ * Exported for testing
46
+ */
47
+ export declare function onDraggingHorizontal(context: CellResizerContext, event: MouseEvent, initValue: CellResizerInitValue, deltaX: number, deltaY: number): boolean;
48
+ /**
49
+ * @internal
50
+ * Exported for testing
51
+ */
52
+ export declare function onDraggingVertical(context: CellResizerContext, event: MouseEvent, initValue: CellResizerInitValue, deltaX: number): boolean;
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.createCellResizer = exports.VERTICAL_RESIZER_ID = exports.HORIZONTAL_RESIZER_ID = void 0;
3
+ exports.onDraggingVertical = exports.onDraggingHorizontal = exports.onDragStart = exports.createCellResizer = exports.VERTICAL_RESIZER_ID = exports.HORIZONTAL_RESIZER_ID = void 0;
4
4
  var tslib_1 = require("tslib");
5
5
  var createElement_1 = require("../../../pluginUtils/CreateElement/createElement");
6
6
  var DragAndDropHelper_1 = require("../../../pluginUtils/DragAndDrop/DragAndDropHelper");
@@ -40,6 +40,10 @@ function createCellResizer(editor, td, table, isRTL, isHorizontal, onStart, onEn
40
40
  return { node: td, div: div, featureHandler: featureHandler };
41
41
  }
42
42
  exports.createCellResizer = createCellResizer;
43
+ /**
44
+ * @internal
45
+ * Exported for testing
46
+ */
43
47
  function onDragStart(context, event) {
44
48
  var td = context.td, onStart = context.onStart;
45
49
  var rect = (0, roosterjs_content_model_dom_1.normalizeRect)(td.getBoundingClientRect());
@@ -79,20 +83,25 @@ function onDragStart(context, event) {
79
83
  }; // Just a fallback
80
84
  }
81
85
  }
86
+ exports.onDragStart = onDragStart;
87
+ /**
88
+ * @internal
89
+ * Exported for testing
90
+ */
82
91
  function onDraggingHorizontal(context, event, initValue, deltaX, deltaY) {
83
92
  var table = context.table;
84
93
  var cmTable = initValue.cmTable, anchorRow = initValue.anchorRow, anchorRowHeight = initValue.anchorRowHeight;
85
94
  // Assign new widths and heights to the CM table
86
- if (cmTable && anchorRow != undefined) {
95
+ if (cmTable && anchorRow != undefined && cmTable.rows[anchorRow] != undefined) {
87
96
  // Modify the CM Table size
88
- cmTable.rows[anchorRow].height = (anchorRowHeight !== null && anchorRowHeight !== void 0 ? anchorRowHeight : 0) + deltaY;
89
- // Normalize the table
90
- (0, roosterjs_content_model_dom_1.normalizeTable)(cmTable);
97
+ (0, roosterjs_content_model_dom_1.mutateBlock)(cmTable).rows[anchorRow].height = (anchorRowHeight !== null && anchorRowHeight !== void 0 ? anchorRowHeight : 0) + deltaY;
98
+ // Normalize the new height value
99
+ var newHeight = Math.max(cmTable.rows[anchorRow].height, roosterjs_content_model_dom_1.MIN_ALLOWED_TABLE_CELL_HEIGHT);
91
100
  // Writeback CM Table size changes to DOM Table
92
101
  var tableRow = table.rows[anchorRow];
93
102
  for (var col = 0; col < tableRow.cells.length; col++) {
94
103
  var td = tableRow.cells[col];
95
- td.style.height = cmTable.rows[anchorRow].height + 'px';
104
+ td.style.height = newHeight + 'px';
96
105
  }
97
106
  return true;
98
107
  }
@@ -100,18 +109,26 @@ function onDraggingHorizontal(context, event, initValue, deltaX, deltaY) {
100
109
  return false;
101
110
  }
102
111
  }
112
+ exports.onDraggingHorizontal = onDraggingHorizontal;
113
+ /**
114
+ * @internal
115
+ * Exported for testing
116
+ */
103
117
  function onDraggingVertical(context, event, initValue, deltaX) {
104
118
  var table = context.table, isRTL = context.isRTL;
105
119
  var cmTable = initValue.cmTable, anchorColumn = initValue.anchorColumn, allWidths = initValue.allWidths;
106
120
  // Assign new widths and heights to the CM table
107
121
  if (cmTable && anchorColumn != undefined) {
122
+ var mutableTable = (0, roosterjs_content_model_dom_1.mutateBlock)(cmTable);
108
123
  // Modify the CM Table size
109
124
  var lastColumn = anchorColumn == cmTable.widths.length - 1;
110
125
  var change = deltaX * (isRTL ? -1 : 1);
111
126
  // This is the last column
112
127
  if (lastColumn) {
113
128
  // Only the last column changes
114
- cmTable.widths[anchorColumn] = allWidths[anchorColumn] + change;
129
+ // Normalize the new width value
130
+ var newWidth = Math.max(allWidths[anchorColumn] + change, roosterjs_content_model_dom_1.MIN_ALLOWED_TABLE_CELL_WIDTH);
131
+ mutableTable.widths[anchorColumn] = newWidth;
115
132
  }
116
133
  else {
117
134
  // Any other two columns
@@ -121,11 +138,9 @@ function onDraggingVertical(context, event, initValue, deltaX) {
121
138
  nextAnchorChange < roosterjs_content_model_dom_1.MIN_ALLOWED_TABLE_CELL_WIDTH) {
122
139
  return false;
123
140
  }
124
- cmTable.widths[anchorColumn] = anchorChange;
125
- cmTable.widths[anchorColumn + 1] = nextAnchorChange;
141
+ mutableTable.widths[anchorColumn] = anchorChange;
142
+ mutableTable.widths[anchorColumn + 1] = nextAnchorChange;
126
143
  }
127
- // Normalize the table
128
- (0, roosterjs_content_model_dom_1.normalizeTable)(cmTable);
129
144
  // Writeback CM Table size changes to DOM Table
130
145
  for (var row = 0; row < table.rows.length; row++) {
131
146
  var tableRow = table.rows[row];
@@ -139,6 +154,7 @@ function onDraggingVertical(context, event, initValue, deltaX) {
139
154
  return false;
140
155
  }
141
156
  }
157
+ exports.onDraggingVertical = onDraggingVertical;
142
158
  function setHorizontalPosition(context, trigger) {
143
159
  var td = context.td;
144
160
  var rect = (0, roosterjs_content_model_dom_1.normalizeRect)(td.getBoundingClientRect());