roosterjs-content-model-core 0.20.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 (417) hide show
  1. package/LICENSE +25 -0
  2. package/README.md +262 -0
  3. package/lib/constants/ChangeSource.d.ts +59 -0
  4. package/lib/constants/ChangeSource.js +63 -0
  5. package/lib/constants/ChangeSource.js.map +1 -0
  6. package/lib/coreApi/createContentModel.d.ts +9 -0
  7. package/lib/coreApi/createContentModel.js +40 -0
  8. package/lib/coreApi/createContentModel.js.map +1 -0
  9. package/lib/coreApi/createEditorContext.d.ts +6 -0
  10. package/lib/coreApi/createEditorContext.js +38 -0
  11. package/lib/coreApi/createEditorContext.js.map +1 -0
  12. package/lib/coreApi/formatContentModel.d.ts +12 -0
  13. package/lib/coreApi/formatContentModel.js +128 -0
  14. package/lib/coreApi/formatContentModel.js.map +1 -0
  15. package/lib/coreApi/getDOMSelection.d.ts +5 -0
  16. package/lib/coreApi/getDOMSelection.js +41 -0
  17. package/lib/coreApi/getDOMSelection.js.map +1 -0
  18. package/lib/coreApi/setContentModel.d.ts +9 -0
  19. package/lib/coreApi/setContentModel.js +33 -0
  20. package/lib/coreApi/setContentModel.js.map +1 -0
  21. package/lib/coreApi/setDOMSelection.d.ts +5 -0
  22. package/lib/coreApi/setDOMSelection.js +41 -0
  23. package/lib/coreApi/setDOMSelection.js.map +1 -0
  24. package/lib/coreApi/switchShadowEdit.d.ts +8 -0
  25. package/lib/coreApi/switchShadowEdit.js +54 -0
  26. package/lib/coreApi/switchShadowEdit.js.map +1 -0
  27. package/lib/corePlugin/ContentModelCachePlugin.d.ts +53 -0
  28. package/lib/corePlugin/ContentModelCachePlugin.js +169 -0
  29. package/lib/corePlugin/ContentModelCachePlugin.js.map +1 -0
  30. package/lib/corePlugin/ContentModelCopyPastePlugin.d.ts +46 -0
  31. package/lib/corePlugin/ContentModelCopyPastePlugin.js +233 -0
  32. package/lib/corePlugin/ContentModelCopyPastePlugin.js.map +1 -0
  33. package/lib/corePlugin/ContentModelFormatPlugin.d.ts +59 -0
  34. package/lib/corePlugin/ContentModelFormatPlugin.js +147 -0
  35. package/lib/corePlugin/ContentModelFormatPlugin.js.map +1 -0
  36. package/lib/corePlugin/ContentModelTypeInContainerPlugin.d.ts +23 -0
  37. package/lib/corePlugin/ContentModelTypeInContainerPlugin.js +32 -0
  38. package/lib/corePlugin/ContentModelTypeInContainerPlugin.js.map +1 -0
  39. package/lib/corePlugin/utils/addRangeToSelection.d.ts +4 -0
  40. package/lib/corePlugin/utils/addRangeToSelection.js +16 -0
  41. package/lib/corePlugin/utils/addRangeToSelection.js.map +1 -0
  42. package/lib/corePlugin/utils/applyDefaultFormat.d.ts +9 -0
  43. package/lib/corePlugin/utils/applyDefaultFormat.js +79 -0
  44. package/lib/corePlugin/utils/applyDefaultFormat.js.map +1 -0
  45. package/lib/corePlugin/utils/applyPendingFormat.d.ts +8 -0
  46. package/lib/corePlugin/utils/applyPendingFormat.js +51 -0
  47. package/lib/corePlugin/utils/applyPendingFormat.js.map +1 -0
  48. package/lib/corePlugin/utils/areSameSelection.d.ts +6 -0
  49. package/lib/corePlugin/utils/areSameSelection.js +36 -0
  50. package/lib/corePlugin/utils/areSameSelection.js.map +1 -0
  51. package/lib/corePlugin/utils/contentModelDomIndexer.d.ts +6 -0
  52. package/lib/corePlugin/utils/contentModelDomIndexer.js +190 -0
  53. package/lib/corePlugin/utils/contentModelDomIndexer.js.map +1 -0
  54. package/lib/editor/createContentModelEditorCore.d.ts +6 -0
  55. package/lib/editor/createContentModelEditorCore.js +50 -0
  56. package/lib/editor/createContentModelEditorCore.js.map +1 -0
  57. package/lib/editor/promoteToContentModelEditorCore.d.ts +8 -0
  58. package/lib/editor/promoteToContentModelEditorCore.js +72 -0
  59. package/lib/editor/promoteToContentModelEditorCore.js.map +1 -0
  60. package/lib/index.d.ts +29 -0
  61. package/lib/index.js +71 -0
  62. package/lib/index.js.map +1 -0
  63. package/lib/metadata/definitionCreators.d.ts +48 -0
  64. package/lib/metadata/definitionCreators.js +95 -0
  65. package/lib/metadata/definitionCreators.js.map +1 -0
  66. package/lib/metadata/updateImageMetadata.d.ts +7 -0
  67. package/lib/metadata/updateImageMetadata.js +28 -0
  68. package/lib/metadata/updateImageMetadata.js.map +1 -0
  69. package/lib/metadata/updateListMetadata.d.ts +15 -0
  70. package/lib/metadata/updateListMetadata.js +181 -0
  71. package/lib/metadata/updateListMetadata.js.map +1 -0
  72. package/lib/metadata/updateTableCellMetadata.d.ts +7 -0
  73. package/lib/metadata/updateTableCellMetadata.js +20 -0
  74. package/lib/metadata/updateTableCellMetadata.js.map +1 -0
  75. package/lib/metadata/updateTableMetadata.d.ts +7 -0
  76. package/lib/metadata/updateTableMetadata.js +32 -0
  77. package/lib/metadata/updateTableMetadata.js.map +1 -0
  78. package/lib/modelApi/edit/deleteExpandedSelection.d.ts +7 -0
  79. package/lib/modelApi/edit/deleteExpandedSelection.js +99 -0
  80. package/lib/modelApi/edit/deleteExpandedSelection.js.map +1 -0
  81. package/lib/modelApi/edit/deleteSingleChar.d.ts +4 -0
  82. package/lib/modelApi/edit/deleteSingleChar.js +36 -0
  83. package/lib/modelApi/edit/deleteSingleChar.js.map +1 -0
  84. package/lib/override/tablePreProcessor.d.ts +5 -0
  85. package/lib/override/tablePreProcessor.js +25 -0
  86. package/lib/override/tablePreProcessor.js.map +1 -0
  87. package/lib/publicApi/domUtils/borderValues.d.ts +13 -0
  88. package/lib/publicApi/domUtils/borderValues.js +48 -0
  89. package/lib/publicApi/domUtils/borderValues.js.map +1 -0
  90. package/lib/publicApi/domUtils/eventUtils.d.ts +13 -0
  91. package/lib/publicApi/domUtils/eventUtils.js +29 -0
  92. package/lib/publicApi/domUtils/eventUtils.js.map +1 -0
  93. package/lib/publicApi/domUtils/stringUtil.d.ts +18 -0
  94. package/lib/publicApi/domUtils/stringUtil.js +35 -0
  95. package/lib/publicApi/domUtils/stringUtil.js.map +1 -0
  96. package/lib/publicApi/model/cloneModel.d.ts +30 -0
  97. package/lib/publicApi/model/cloneModel.js +207 -0
  98. package/lib/publicApi/model/cloneModel.js.map +1 -0
  99. package/lib/publicApi/model/getClosestAncestorBlockGroupIndex.d.ts +12 -0
  100. package/lib/publicApi/model/getClosestAncestorBlockGroupIndex.js +28 -0
  101. package/lib/publicApi/model/getClosestAncestorBlockGroupIndex.js.map +1 -0
  102. package/lib/publicApi/model/isBlockGroupOfType.d.ts +8 -0
  103. package/lib/publicApi/model/isBlockGroupOfType.js +14 -0
  104. package/lib/publicApi/model/isBlockGroupOfType.js.map +1 -0
  105. package/lib/publicApi/model/mergeModel.d.ts +36 -0
  106. package/lib/publicApi/model/mergeModel.js +262 -0
  107. package/lib/publicApi/model/mergeModel.js.map +1 -0
  108. package/lib/publicApi/model/paste.d.ts +14 -0
  109. package/lib/publicApi/model/paste.js +150 -0
  110. package/lib/publicApi/model/paste.js.map +1 -0
  111. package/lib/publicApi/selection/collectSelections.d.ts +50 -0
  112. package/lib/publicApi/selection/collectSelections.js +182 -0
  113. package/lib/publicApi/selection/collectSelections.js.map +1 -0
  114. package/lib/publicApi/selection/deleteBlock.d.ts +11 -0
  115. package/lib/publicApi/selection/deleteBlock.js +56 -0
  116. package/lib/publicApi/selection/deleteBlock.js.map +1 -0
  117. package/lib/publicApi/selection/deleteSegment.d.ts +10 -0
  118. package/lib/publicApi/selection/deleteSegment.js +88 -0
  119. package/lib/publicApi/selection/deleteSegment.js.map +1 -0
  120. package/lib/publicApi/selection/deleteSelection.d.ts +9 -0
  121. package/lib/publicApi/selection/deleteSelection.js +44 -0
  122. package/lib/publicApi/selection/deleteSelection.js.map +1 -0
  123. package/lib/publicApi/selection/getSelectionRootNode.d.ts +9 -0
  124. package/lib/publicApi/selection/getSelectionRootNode.js +23 -0
  125. package/lib/publicApi/selection/getSelectionRootNode.js.map +1 -0
  126. package/lib/publicApi/selection/iterateSelections.d.ts +48 -0
  127. package/lib/publicApi/selection/iterateSelections.js +147 -0
  128. package/lib/publicApi/selection/iterateSelections.js.map +1 -0
  129. package/lib/publicApi/selection/setSelection.d.ts +8 -0
  130. package/lib/publicApi/selection/setSelection.js +131 -0
  131. package/lib/publicApi/selection/setSelection.js.map +1 -0
  132. package/lib/publicApi/table/applyTableFormat.d.ts +8 -0
  133. package/lib/publicApi/table/applyTableFormat.js +241 -0
  134. package/lib/publicApi/table/applyTableFormat.js.map +1 -0
  135. package/lib/publicApi/table/normalizeTable.d.ts +13 -0
  136. package/lib/publicApi/table/normalizeTable.js +121 -0
  137. package/lib/publicApi/table/normalizeTable.js.map +1 -0
  138. package/lib/publicApi/table/setTableCellBackgroundColor.d.ts +15 -0
  139. package/lib/publicApi/table/setTableCellBackgroundColor.js +105 -0
  140. package/lib/publicApi/table/setTableCellBackgroundColor.js.map +1 -0
  141. package/lib-amd/constants/ChangeSource.d.ts +59 -0
  142. package/lib-amd/constants/ChangeSource.js +65 -0
  143. package/lib-amd/constants/ChangeSource.js.map +1 -0
  144. package/lib-amd/coreApi/createContentModel.d.ts +9 -0
  145. package/lib-amd/coreApi/createContentModel.js +39 -0
  146. package/lib-amd/coreApi/createContentModel.js.map +1 -0
  147. package/lib-amd/coreApi/createEditorContext.d.ts +6 -0
  148. package/lib-amd/coreApi/createEditorContext.js +40 -0
  149. package/lib-amd/coreApi/createEditorContext.js.map +1 -0
  150. package/lib-amd/coreApi/formatContentModel.d.ts +12 -0
  151. package/lib-amd/coreApi/formatContentModel.js +128 -0
  152. package/lib-amd/coreApi/formatContentModel.js.map +1 -0
  153. package/lib-amd/coreApi/getDOMSelection.d.ts +5 -0
  154. package/lib-amd/coreApi/getDOMSelection.js +43 -0
  155. package/lib-amd/coreApi/getDOMSelection.js.map +1 -0
  156. package/lib-amd/coreApi/setContentModel.d.ts +9 -0
  157. package/lib-amd/coreApi/setContentModel.js +33 -0
  158. package/lib-amd/coreApi/setContentModel.js.map +1 -0
  159. package/lib-amd/coreApi/setDOMSelection.d.ts +5 -0
  160. package/lib-amd/coreApi/setDOMSelection.js +43 -0
  161. package/lib-amd/coreApi/setDOMSelection.js.map +1 -0
  162. package/lib-amd/coreApi/switchShadowEdit.d.ts +8 -0
  163. package/lib-amd/coreApi/switchShadowEdit.js +55 -0
  164. package/lib-amd/coreApi/switchShadowEdit.js.map +1 -0
  165. package/lib-amd/corePlugin/ContentModelCachePlugin.d.ts +53 -0
  166. package/lib-amd/corePlugin/ContentModelCachePlugin.js +169 -0
  167. package/lib-amd/corePlugin/ContentModelCachePlugin.js.map +1 -0
  168. package/lib-amd/corePlugin/ContentModelCopyPastePlugin.d.ts +46 -0
  169. package/lib-amd/corePlugin/ContentModelCopyPastePlugin.js +226 -0
  170. package/lib-amd/corePlugin/ContentModelCopyPastePlugin.js.map +1 -0
  171. package/lib-amd/corePlugin/ContentModelFormatPlugin.d.ts +59 -0
  172. package/lib-amd/corePlugin/ContentModelFormatPlugin.js +145 -0
  173. package/lib-amd/corePlugin/ContentModelFormatPlugin.js.map +1 -0
  174. package/lib-amd/corePlugin/ContentModelTypeInContainerPlugin.d.ts +23 -0
  175. package/lib-amd/corePlugin/ContentModelTypeInContainerPlugin.js +34 -0
  176. package/lib-amd/corePlugin/ContentModelTypeInContainerPlugin.js.map +1 -0
  177. package/lib-amd/corePlugin/utils/addRangeToSelection.d.ts +4 -0
  178. package/lib-amd/corePlugin/utils/addRangeToSelection.js +18 -0
  179. package/lib-amd/corePlugin/utils/addRangeToSelection.js.map +1 -0
  180. package/lib-amd/corePlugin/utils/applyDefaultFormat.d.ts +9 -0
  181. package/lib-amd/corePlugin/utils/applyDefaultFormat.js +78 -0
  182. package/lib-amd/corePlugin/utils/applyDefaultFormat.js.map +1 -0
  183. package/lib-amd/corePlugin/utils/applyPendingFormat.d.ts +8 -0
  184. package/lib-amd/corePlugin/utils/applyPendingFormat.js +50 -0
  185. package/lib-amd/corePlugin/utils/applyPendingFormat.js.map +1 -0
  186. package/lib-amd/corePlugin/utils/areSameSelection.d.ts +6 -0
  187. package/lib-amd/corePlugin/utils/areSameSelection.js +38 -0
  188. package/lib-amd/corePlugin/utils/areSameSelection.js.map +1 -0
  189. package/lib-amd/corePlugin/utils/contentModelDomIndexer.d.ts +6 -0
  190. package/lib-amd/corePlugin/utils/contentModelDomIndexer.js +189 -0
  191. package/lib-amd/corePlugin/utils/contentModelDomIndexer.js.map +1 -0
  192. package/lib-amd/editor/createContentModelEditorCore.d.ts +6 -0
  193. package/lib-amd/editor/createContentModelEditorCore.js +44 -0
  194. package/lib-amd/editor/createContentModelEditorCore.js.map +1 -0
  195. package/lib-amd/editor/promoteToContentModelEditorCore.d.ts +8 -0
  196. package/lib-amd/editor/promoteToContentModelEditorCore.js +64 -0
  197. package/lib-amd/editor/promoteToContentModelEditorCore.js.map +1 -0
  198. package/lib-amd/index.d.ts +29 -0
  199. package/lib-amd/index.js +44 -0
  200. package/lib-amd/index.js.map +1 -0
  201. package/lib-amd/metadata/definitionCreators.d.ts +48 -0
  202. package/lib-amd/metadata/definitionCreators.js +97 -0
  203. package/lib-amd/metadata/definitionCreators.js.map +1 -0
  204. package/lib-amd/metadata/updateImageMetadata.d.ts +7 -0
  205. package/lib-amd/metadata/updateImageMetadata.js +28 -0
  206. package/lib-amd/metadata/updateImageMetadata.js.map +1 -0
  207. package/lib-amd/metadata/updateListMetadata.d.ts +15 -0
  208. package/lib-amd/metadata/updateListMetadata.js +179 -0
  209. package/lib-amd/metadata/updateListMetadata.js.map +1 -0
  210. package/lib-amd/metadata/updateTableCellMetadata.d.ts +7 -0
  211. package/lib-amd/metadata/updateTableCellMetadata.js +20 -0
  212. package/lib-amd/metadata/updateTableCellMetadata.js.map +1 -0
  213. package/lib-amd/metadata/updateTableMetadata.d.ts +7 -0
  214. package/lib-amd/metadata/updateTableMetadata.js +31 -0
  215. package/lib-amd/metadata/updateTableMetadata.js.map +1 -0
  216. package/lib-amd/modelApi/edit/deleteExpandedSelection.d.ts +7 -0
  217. package/lib-amd/modelApi/edit/deleteExpandedSelection.js +96 -0
  218. package/lib-amd/modelApi/edit/deleteExpandedSelection.js.map +1 -0
  219. package/lib-amd/modelApi/edit/deleteSingleChar.d.ts +4 -0
  220. package/lib-amd/modelApi/edit/deleteSingleChar.js +37 -0
  221. package/lib-amd/modelApi/edit/deleteSingleChar.js.map +1 -0
  222. package/lib-amd/override/tablePreProcessor.d.ts +5 -0
  223. package/lib-amd/override/tablePreProcessor.js +25 -0
  224. package/lib-amd/override/tablePreProcessor.js.map +1 -0
  225. package/lib-amd/publicApi/domUtils/borderValues.d.ts +13 -0
  226. package/lib-amd/publicApi/domUtils/borderValues.js +50 -0
  227. package/lib-amd/publicApi/domUtils/borderValues.js.map +1 -0
  228. package/lib-amd/publicApi/domUtils/eventUtils.d.ts +13 -0
  229. package/lib-amd/publicApi/domUtils/eventUtils.js +31 -0
  230. package/lib-amd/publicApi/domUtils/eventUtils.js.map +1 -0
  231. package/lib-amd/publicApi/domUtils/stringUtil.d.ts +18 -0
  232. package/lib-amd/publicApi/domUtils/stringUtil.js +37 -0
  233. package/lib-amd/publicApi/domUtils/stringUtil.js.map +1 -0
  234. package/lib-amd/publicApi/model/cloneModel.d.ts +30 -0
  235. package/lib-amd/publicApi/model/cloneModel.js +208 -0
  236. package/lib-amd/publicApi/model/cloneModel.js.map +1 -0
  237. package/lib-amd/publicApi/model/getClosestAncestorBlockGroupIndex.d.ts +12 -0
  238. package/lib-amd/publicApi/model/getClosestAncestorBlockGroupIndex.js +30 -0
  239. package/lib-amd/publicApi/model/getClosestAncestorBlockGroupIndex.js.map +1 -0
  240. package/lib-amd/publicApi/model/isBlockGroupOfType.d.ts +8 -0
  241. package/lib-amd/publicApi/model/isBlockGroupOfType.js +16 -0
  242. package/lib-amd/publicApi/model/isBlockGroupOfType.js.map +1 -0
  243. package/lib-amd/publicApi/model/mergeModel.d.ts +36 -0
  244. package/lib-amd/publicApi/model/mergeModel.js +258 -0
  245. package/lib-amd/publicApi/model/mergeModel.js.map +1 -0
  246. package/lib-amd/publicApi/model/paste.d.ts +14 -0
  247. package/lib-amd/publicApi/model/paste.js +146 -0
  248. package/lib-amd/publicApi/model/paste.js.map +1 -0
  249. package/lib-amd/publicApi/selection/collectSelections.d.ts +50 -0
  250. package/lib-amd/publicApi/selection/collectSelections.js +180 -0
  251. package/lib-amd/publicApi/selection/collectSelections.js.map +1 -0
  252. package/lib-amd/publicApi/selection/deleteBlock.d.ts +11 -0
  253. package/lib-amd/publicApi/selection/deleteBlock.js +58 -0
  254. package/lib-amd/publicApi/selection/deleteBlock.js.map +1 -0
  255. package/lib-amd/publicApi/selection/deleteSegment.d.ts +10 -0
  256. package/lib-amd/publicApi/selection/deleteSegment.js +87 -0
  257. package/lib-amd/publicApi/selection/deleteSegment.js.map +1 -0
  258. package/lib-amd/publicApi/selection/deleteSelection.d.ts +9 -0
  259. package/lib-amd/publicApi/selection/deleteSelection.js +44 -0
  260. package/lib-amd/publicApi/selection/deleteSelection.js.map +1 -0
  261. package/lib-amd/publicApi/selection/getSelectionRootNode.d.ts +9 -0
  262. package/lib-amd/publicApi/selection/getSelectionRootNode.js +25 -0
  263. package/lib-amd/publicApi/selection/getSelectionRootNode.js.map +1 -0
  264. package/lib-amd/publicApi/selection/iterateSelections.d.ts +48 -0
  265. package/lib-amd/publicApi/selection/iterateSelections.js +148 -0
  266. package/lib-amd/publicApi/selection/iterateSelections.js.map +1 -0
  267. package/lib-amd/publicApi/selection/setSelection.d.ts +8 -0
  268. package/lib-amd/publicApi/selection/setSelection.js +132 -0
  269. package/lib-amd/publicApi/selection/setSelection.js.map +1 -0
  270. package/lib-amd/publicApi/table/applyTableFormat.d.ts +8 -0
  271. package/lib-amd/publicApi/table/applyTableFormat.js +236 -0
  272. package/lib-amd/publicApi/table/applyTableFormat.js.map +1 -0
  273. package/lib-amd/publicApi/table/normalizeTable.d.ts +13 -0
  274. package/lib-amd/publicApi/table/normalizeTable.js +121 -0
  275. package/lib-amd/publicApi/table/normalizeTable.js.map +1 -0
  276. package/lib-amd/publicApi/table/setTableCellBackgroundColor.d.ts +15 -0
  277. package/lib-amd/publicApi/table/setTableCellBackgroundColor.js +105 -0
  278. package/lib-amd/publicApi/table/setTableCellBackgroundColor.js.map +1 -0
  279. package/lib-mjs/constants/ChangeSource.d.ts +59 -0
  280. package/lib-mjs/constants/ChangeSource.js +60 -0
  281. package/lib-mjs/constants/ChangeSource.js.map +1 -0
  282. package/lib-mjs/coreApi/createContentModel.d.ts +9 -0
  283. package/lib-mjs/coreApi/createContentModel.js +36 -0
  284. package/lib-mjs/coreApi/createContentModel.js.map +1 -0
  285. package/lib-mjs/coreApi/createEditorContext.d.ts +6 -0
  286. package/lib-mjs/coreApi/createEditorContext.js +34 -0
  287. package/lib-mjs/coreApi/createEditorContext.js.map +1 -0
  288. package/lib-mjs/coreApi/formatContentModel.d.ts +12 -0
  289. package/lib-mjs/coreApi/formatContentModel.js +124 -0
  290. package/lib-mjs/coreApi/formatContentModel.js.map +1 -0
  291. package/lib-mjs/coreApi/getDOMSelection.d.ts +5 -0
  292. package/lib-mjs/coreApi/getDOMSelection.js +37 -0
  293. package/lib-mjs/coreApi/getDOMSelection.js.map +1 -0
  294. package/lib-mjs/coreApi/setContentModel.d.ts +9 -0
  295. package/lib-mjs/coreApi/setContentModel.js +29 -0
  296. package/lib-mjs/coreApi/setContentModel.js.map +1 -0
  297. package/lib-mjs/coreApi/setDOMSelection.d.ts +5 -0
  298. package/lib-mjs/coreApi/setDOMSelection.js +37 -0
  299. package/lib-mjs/coreApi/setDOMSelection.js.map +1 -0
  300. package/lib-mjs/coreApi/switchShadowEdit.d.ts +8 -0
  301. package/lib-mjs/coreApi/switchShadowEdit.js +50 -0
  302. package/lib-mjs/coreApi/switchShadowEdit.js.map +1 -0
  303. package/lib-mjs/corePlugin/ContentModelCachePlugin.d.ts +53 -0
  304. package/lib-mjs/corePlugin/ContentModelCachePlugin.js +165 -0
  305. package/lib-mjs/corePlugin/ContentModelCachePlugin.js.map +1 -0
  306. package/lib-mjs/corePlugin/ContentModelCopyPastePlugin.d.ts +46 -0
  307. package/lib-mjs/corePlugin/ContentModelCopyPastePlugin.js +228 -0
  308. package/lib-mjs/corePlugin/ContentModelCopyPastePlugin.js.map +1 -0
  309. package/lib-mjs/corePlugin/ContentModelFormatPlugin.d.ts +59 -0
  310. package/lib-mjs/corePlugin/ContentModelFormatPlugin.js +143 -0
  311. package/lib-mjs/corePlugin/ContentModelFormatPlugin.js.map +1 -0
  312. package/lib-mjs/corePlugin/ContentModelTypeInContainerPlugin.d.ts +23 -0
  313. package/lib-mjs/corePlugin/ContentModelTypeInContainerPlugin.js +29 -0
  314. package/lib-mjs/corePlugin/ContentModelTypeInContainerPlugin.js.map +1 -0
  315. package/lib-mjs/corePlugin/utils/addRangeToSelection.d.ts +4 -0
  316. package/lib-mjs/corePlugin/utils/addRangeToSelection.js +12 -0
  317. package/lib-mjs/corePlugin/utils/addRangeToSelection.js.map +1 -0
  318. package/lib-mjs/corePlugin/utils/applyDefaultFormat.d.ts +9 -0
  319. package/lib-mjs/corePlugin/utils/applyDefaultFormat.js +75 -0
  320. package/lib-mjs/corePlugin/utils/applyDefaultFormat.js.map +1 -0
  321. package/lib-mjs/corePlugin/utils/applyPendingFormat.d.ts +8 -0
  322. package/lib-mjs/corePlugin/utils/applyPendingFormat.js +47 -0
  323. package/lib-mjs/corePlugin/utils/applyPendingFormat.js.map +1 -0
  324. package/lib-mjs/corePlugin/utils/areSameSelection.d.ts +6 -0
  325. package/lib-mjs/corePlugin/utils/areSameSelection.js +32 -0
  326. package/lib-mjs/corePlugin/utils/areSameSelection.js.map +1 -0
  327. package/lib-mjs/corePlugin/utils/contentModelDomIndexer.d.ts +6 -0
  328. package/lib-mjs/corePlugin/utils/contentModelDomIndexer.js +187 -0
  329. package/lib-mjs/corePlugin/utils/contentModelDomIndexer.js.map +1 -0
  330. package/lib-mjs/editor/createContentModelEditorCore.d.ts +6 -0
  331. package/lib-mjs/editor/createContentModelEditorCore.js +46 -0
  332. package/lib-mjs/editor/createContentModelEditorCore.js.map +1 -0
  333. package/lib-mjs/editor/promoteToContentModelEditorCore.d.ts +8 -0
  334. package/lib-mjs/editor/promoteToContentModelEditorCore.js +68 -0
  335. package/lib-mjs/editor/promoteToContentModelEditorCore.js.map +1 -0
  336. package/lib-mjs/index.d.ts +29 -0
  337. package/lib-mjs/index.js +30 -0
  338. package/lib-mjs/index.js.map +1 -0
  339. package/lib-mjs/metadata/definitionCreators.d.ts +48 -0
  340. package/lib-mjs/metadata/definitionCreators.js +87 -0
  341. package/lib-mjs/metadata/definitionCreators.js.map +1 -0
  342. package/lib-mjs/metadata/updateImageMetadata.d.ts +7 -0
  343. package/lib-mjs/metadata/updateImageMetadata.js +24 -0
  344. package/lib-mjs/metadata/updateImageMetadata.js.map +1 -0
  345. package/lib-mjs/metadata/updateListMetadata.d.ts +15 -0
  346. package/lib-mjs/metadata/updateListMetadata.js +177 -0
  347. package/lib-mjs/metadata/updateListMetadata.js.map +1 -0
  348. package/lib-mjs/metadata/updateTableCellMetadata.d.ts +7 -0
  349. package/lib-mjs/metadata/updateTableCellMetadata.js +16 -0
  350. package/lib-mjs/metadata/updateTableCellMetadata.js.map +1 -0
  351. package/lib-mjs/metadata/updateTableMetadata.d.ts +7 -0
  352. package/lib-mjs/metadata/updateTableMetadata.js +28 -0
  353. package/lib-mjs/metadata/updateTableMetadata.js.map +1 -0
  354. package/lib-mjs/modelApi/edit/deleteExpandedSelection.d.ts +7 -0
  355. package/lib-mjs/modelApi/edit/deleteExpandedSelection.js +95 -0
  356. package/lib-mjs/modelApi/edit/deleteExpandedSelection.js.map +1 -0
  357. package/lib-mjs/modelApi/edit/deleteSingleChar.d.ts +4 -0
  358. package/lib-mjs/modelApi/edit/deleteSingleChar.js +32 -0
  359. package/lib-mjs/modelApi/edit/deleteSingleChar.js.map +1 -0
  360. package/lib-mjs/override/tablePreProcessor.d.ts +5 -0
  361. package/lib-mjs/override/tablePreProcessor.js +21 -0
  362. package/lib-mjs/override/tablePreProcessor.js.map +1 -0
  363. package/lib-mjs/publicApi/domUtils/borderValues.d.ts +13 -0
  364. package/lib-mjs/publicApi/domUtils/borderValues.js +43 -0
  365. package/lib-mjs/publicApi/domUtils/borderValues.js.map +1 -0
  366. package/lib-mjs/publicApi/domUtils/eventUtils.d.ts +13 -0
  367. package/lib-mjs/publicApi/domUtils/eventUtils.js +24 -0
  368. package/lib-mjs/publicApi/domUtils/eventUtils.js.map +1 -0
  369. package/lib-mjs/publicApi/domUtils/stringUtil.d.ts +18 -0
  370. package/lib-mjs/publicApi/domUtils/stringUtil.js +29 -0
  371. package/lib-mjs/publicApi/domUtils/stringUtil.js.map +1 -0
  372. package/lib-mjs/publicApi/model/cloneModel.d.ts +30 -0
  373. package/lib-mjs/publicApi/model/cloneModel.js +203 -0
  374. package/lib-mjs/publicApi/model/cloneModel.js.map +1 -0
  375. package/lib-mjs/publicApi/model/getClosestAncestorBlockGroupIndex.d.ts +12 -0
  376. package/lib-mjs/publicApi/model/getClosestAncestorBlockGroupIndex.js +24 -0
  377. package/lib-mjs/publicApi/model/getClosestAncestorBlockGroupIndex.js.map +1 -0
  378. package/lib-mjs/publicApi/model/isBlockGroupOfType.d.ts +8 -0
  379. package/lib-mjs/publicApi/model/isBlockGroupOfType.js +10 -0
  380. package/lib-mjs/publicApi/model/isBlockGroupOfType.js.map +1 -0
  381. package/lib-mjs/publicApi/model/mergeModel.d.ts +36 -0
  382. package/lib-mjs/publicApi/model/mergeModel.js +258 -0
  383. package/lib-mjs/publicApi/model/mergeModel.js.map +1 -0
  384. package/lib-mjs/publicApi/model/paste.d.ts +14 -0
  385. package/lib-mjs/publicApi/model/paste.js +145 -0
  386. package/lib-mjs/publicApi/model/paste.js.map +1 -0
  387. package/lib-mjs/publicApi/selection/collectSelections.d.ts +50 -0
  388. package/lib-mjs/publicApi/selection/collectSelections.js +173 -0
  389. package/lib-mjs/publicApi/selection/collectSelections.js.map +1 -0
  390. package/lib-mjs/publicApi/selection/deleteBlock.d.ts +11 -0
  391. package/lib-mjs/publicApi/selection/deleteBlock.js +52 -0
  392. package/lib-mjs/publicApi/selection/deleteBlock.js.map +1 -0
  393. package/lib-mjs/publicApi/selection/deleteSegment.d.ts +10 -0
  394. package/lib-mjs/publicApi/selection/deleteSegment.js +84 -0
  395. package/lib-mjs/publicApi/selection/deleteSegment.js.map +1 -0
  396. package/lib-mjs/publicApi/selection/deleteSelection.d.ts +9 -0
  397. package/lib-mjs/publicApi/selection/deleteSelection.js +40 -0
  398. package/lib-mjs/publicApi/selection/deleteSelection.js.map +1 -0
  399. package/lib-mjs/publicApi/selection/getSelectionRootNode.d.ts +9 -0
  400. package/lib-mjs/publicApi/selection/getSelectionRootNode.js +19 -0
  401. package/lib-mjs/publicApi/selection/getSelectionRootNode.js.map +1 -0
  402. package/lib-mjs/publicApi/selection/iterateSelections.d.ts +48 -0
  403. package/lib-mjs/publicApi/selection/iterateSelections.js +143 -0
  404. package/lib-mjs/publicApi/selection/iterateSelections.js.map +1 -0
  405. package/lib-mjs/publicApi/selection/setSelection.d.ts +8 -0
  406. package/lib-mjs/publicApi/selection/setSelection.js +127 -0
  407. package/lib-mjs/publicApi/selection/setSelection.js.map +1 -0
  408. package/lib-mjs/publicApi/table/applyTableFormat.d.ts +8 -0
  409. package/lib-mjs/publicApi/table/applyTableFormat.js +237 -0
  410. package/lib-mjs/publicApi/table/applyTableFormat.js.map +1 -0
  411. package/lib-mjs/publicApi/table/normalizeTable.d.ts +13 -0
  412. package/lib-mjs/publicApi/table/normalizeTable.js +117 -0
  413. package/lib-mjs/publicApi/table/normalizeTable.js.map +1 -0
  414. package/lib-mjs/publicApi/table/setTableCellBackgroundColor.d.ts +15 -0
  415. package/lib-mjs/publicApi/table/setTableCellBackgroundColor.js +100 -0
  416. package/lib-mjs/publicApi/table/setTableCellBackgroundColor.js.map +1 -0
  417. package/package.json +21 -0
@@ -0,0 +1,258 @@
1
+ define(["require", "exports", "tslib", "../table/applyTableFormat", "../../publicApi/selection/deleteSelection", "./getClosestAncestorBlockGroupIndex", "../table/normalizeTable", "roosterjs-content-model-dom"], function (require, exports, tslib_1, applyTableFormat_1, deleteSelection_1, getClosestAncestorBlockGroupIndex_1, normalizeTable_1, roosterjs_content_model_dom_1) {
2
+ "use strict";
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.mergeModel = void 0;
5
+ var HeadingTags = ['h1', 'h2', 'h3', 'h4', 'h5', 'h6'];
6
+ /**
7
+ * Merge source model into target mode
8
+ * @param target Target Content Model that will merge content into
9
+ * @param source Source Content Model will be merged to target model
10
+ * @param context Format context. When call this function inside formatContentModel, provide this context so that formatContentModel will do extra handling to the result
11
+ * @param options More options, see MergeModelOption
12
+ * @returns Insert point after merge, or null if there is no insert point
13
+ */
14
+ function mergeModel(target, source, context, options) {
15
+ var _a;
16
+ var insertPosition = (_a = options === null || options === void 0 ? void 0 : options.insertPosition) !== null && _a !== void 0 ? _a : (0, deleteSelection_1.deleteSelection)(target, [], context).insertPoint;
17
+ if (insertPosition) {
18
+ if ((options === null || options === void 0 ? void 0 : options.mergeFormat) && options.mergeFormat != 'none') {
19
+ var newFormat = (0, tslib_1.__assign)((0, tslib_1.__assign)({}, (target.format || {})), insertPosition.marker.format);
20
+ applyDefaultFormat(source, newFormat, options === null || options === void 0 ? void 0 : options.mergeFormat);
21
+ }
22
+ for (var i = 0; i < source.blocks.length; i++) {
23
+ var block = source.blocks[i];
24
+ switch (block.blockType) {
25
+ case 'Paragraph':
26
+ mergeParagraph(insertPosition, block, i == 0, context, options);
27
+ break;
28
+ case 'Divider':
29
+ insertBlock(insertPosition, block);
30
+ break;
31
+ case 'Entity':
32
+ insertBlock(insertPosition, block);
33
+ context === null || context === void 0 ? void 0 : context.newEntities.push(block);
34
+ break;
35
+ case 'Table':
36
+ if (source.blocks.length == 1 && (options === null || options === void 0 ? void 0 : options.mergeTable)) {
37
+ mergeTable(insertPosition, block, source);
38
+ }
39
+ else {
40
+ insertBlock(insertPosition, block);
41
+ }
42
+ break;
43
+ case 'BlockGroup':
44
+ switch (block.blockGroupType) {
45
+ case 'General':
46
+ case 'FormatContainer':
47
+ insertBlock(insertPosition, block);
48
+ break;
49
+ case 'ListItem':
50
+ mergeList(insertPosition, block);
51
+ break;
52
+ }
53
+ break;
54
+ }
55
+ }
56
+ }
57
+ (0, roosterjs_content_model_dom_1.normalizeContentModel)(target);
58
+ return insertPosition;
59
+ }
60
+ exports.mergeModel = mergeModel;
61
+ function mergeParagraph(markerPosition, newPara, mergeToCurrentParagraph, context, option) {
62
+ var paragraph = markerPosition.paragraph, marker = markerPosition.marker;
63
+ var newParagraph = mergeToCurrentParagraph
64
+ ? paragraph
65
+ : splitParagraph(markerPosition, newPara.format);
66
+ var segmentIndex = newParagraph.segments.indexOf(marker);
67
+ if ((option === null || option === void 0 ? void 0 : option.mergeFormat) == 'none' && mergeToCurrentParagraph) {
68
+ newParagraph.segments.forEach(function (segment) {
69
+ segment.format = (0, tslib_1.__assign)((0, tslib_1.__assign)({}, (newParagraph.segmentFormat || {})), segment.format);
70
+ });
71
+ delete newParagraph.segmentFormat;
72
+ }
73
+ if (segmentIndex >= 0) {
74
+ for (var i = 0; i < newPara.segments.length; i++) {
75
+ var segment = newPara.segments[i];
76
+ newParagraph.segments.splice(segmentIndex + i, 0, segment);
77
+ if (context) {
78
+ if (segment.segmentType == 'Entity') {
79
+ context.newEntities.push(segment);
80
+ }
81
+ if (segment.segmentType == 'Image') {
82
+ context.newImages.push(segment);
83
+ }
84
+ }
85
+ }
86
+ }
87
+ if (newPara.decorator) {
88
+ newParagraph.decorator = (0, tslib_1.__assign)({}, newPara.decorator);
89
+ if (HeadingTags.indexOf(newParagraph.decorator.tagName) > -1) {
90
+ var sourceKeys = (0, roosterjs_content_model_dom_1.getObjectKeys)(newParagraph.decorator.format);
91
+ var segmentDecoratorKeys_1 = (0, roosterjs_content_model_dom_1.getObjectKeys)(newParagraph.segmentFormat || {});
92
+ sourceKeys.forEach(function (key) {
93
+ var _a;
94
+ if (segmentDecoratorKeys_1.indexOf(key) > -1) {
95
+ (_a = newParagraph.segmentFormat) === null || _a === void 0 ? true : delete _a[key];
96
+ }
97
+ });
98
+ }
99
+ }
100
+ if (!mergeToCurrentParagraph) {
101
+ newParagraph.format = newPara.format;
102
+ }
103
+ }
104
+ function mergeTable(markerPosition, newTable, source) {
105
+ var _a, _b;
106
+ var tableContext = markerPosition.tableContext, marker = markerPosition.marker;
107
+ if (tableContext && source.blocks.length == 1 && source.blocks[0] == newTable) {
108
+ var table = tableContext.table, colIndex = tableContext.colIndex, rowIndex = tableContext.rowIndex;
109
+ for (var i = 0; i < newTable.rows.length; i++) {
110
+ for (var j = 0; j < newTable.rows[i].cells.length; j++) {
111
+ var newCell = newTable.rows[i].cells[j];
112
+ if (i == 0 && colIndex + j >= table.rows[0].cells.length) {
113
+ for (var k = 0; k < table.rows.length; k++) {
114
+ var leftCell = (_a = table.rows[k]) === null || _a === void 0 ? void 0 : _a.cells[colIndex + j - 1];
115
+ table.rows[k].cells[colIndex + j] = (0, roosterjs_content_model_dom_1.createTableCell)(false /*spanLeft*/, false /*spanAbove*/, leftCell === null || leftCell === void 0 ? void 0 : leftCell.isHeader, leftCell === null || leftCell === void 0 ? void 0 : leftCell.format);
116
+ }
117
+ }
118
+ if (j == 0 && rowIndex + i >= table.rows.length) {
119
+ if (!table.rows[rowIndex + i]) {
120
+ table.rows[rowIndex + i] = {
121
+ cells: [],
122
+ format: {},
123
+ height: 0,
124
+ };
125
+ }
126
+ for (var k = 0; k < table.rows[rowIndex].cells.length; k++) {
127
+ var aboveCell = (_b = table.rows[rowIndex + i - 1]) === null || _b === void 0 ? void 0 : _b.cells[k];
128
+ table.rows[rowIndex + i].cells[k] = (0, roosterjs_content_model_dom_1.createTableCell)(false /*spanLeft*/, false /*spanAbove*/, false /*isHeader*/, aboveCell === null || aboveCell === void 0 ? void 0 : aboveCell.format);
129
+ }
130
+ }
131
+ var oldCell = table.rows[rowIndex + i].cells[colIndex + j];
132
+ table.rows[rowIndex + i].cells[colIndex + j] = newCell;
133
+ if (i == 0 && j == 0) {
134
+ var newMarker = (0, roosterjs_content_model_dom_1.createSelectionMarker)(marker.format);
135
+ var newPara = (0, roosterjs_content_model_dom_1.addSegment)(newCell, newMarker);
136
+ if (markerPosition.path[0] == oldCell) {
137
+ // Update insert point to match the change result
138
+ markerPosition.path[0] = newCell;
139
+ markerPosition.marker = newMarker;
140
+ markerPosition.paragraph = newPara;
141
+ }
142
+ }
143
+ }
144
+ }
145
+ (0, normalizeTable_1.normalizeTable)(table, markerPosition.marker.format);
146
+ (0, applyTableFormat_1.applyTableFormat)(table, undefined /*newFormat*/, true /*keepCellShade*/);
147
+ }
148
+ else {
149
+ insertBlock(markerPosition, newTable);
150
+ }
151
+ }
152
+ function mergeList(markerPosition, newList) {
153
+ splitParagraph(markerPosition, newList.format);
154
+ var path = markerPosition.path, paragraph = markerPosition.paragraph;
155
+ var listItemIndex = (0, getClosestAncestorBlockGroupIndex_1.getClosestAncestorBlockGroupIndex)(path, ['ListItem']);
156
+ var listItem = path[listItemIndex];
157
+ var listParent = path[listItemIndex + 1]; // It is ok here when index is -1, that means there is no list and we just insert a new paragraph and use path[0] as its parent
158
+ var blockIndex = listParent.blocks.indexOf(listItem || paragraph);
159
+ if (blockIndex >= 0) {
160
+ listParent.blocks.splice(blockIndex, 0, newList);
161
+ }
162
+ if (listItem) {
163
+ listItem === null || listItem === void 0 ? void 0 : listItem.levels.forEach(function (level, i) {
164
+ newList.levels[i] = (0, tslib_1.__assign)({}, level);
165
+ });
166
+ }
167
+ }
168
+ function splitParagraph(markerPosition, newParaFormat) {
169
+ var paragraph = markerPosition.paragraph, marker = markerPosition.marker, path = markerPosition.path;
170
+ var segmentIndex = paragraph.segments.indexOf(marker);
171
+ var paraIndex = path[0].blocks.indexOf(paragraph);
172
+ var newParagraph = (0, roosterjs_content_model_dom_1.createParagraph)(false /*isImplicit*/, (0, tslib_1.__assign)((0, tslib_1.__assign)({}, paragraph.format), newParaFormat), paragraph.segmentFormat);
173
+ if (segmentIndex >= 0) {
174
+ newParagraph.segments = paragraph.segments.splice(segmentIndex);
175
+ }
176
+ if (paraIndex >= 0) {
177
+ path[0].blocks.splice(paraIndex + 1, 0, newParagraph);
178
+ }
179
+ var listItemIndex = (0, getClosestAncestorBlockGroupIndex_1.getClosestAncestorBlockGroupIndex)(path, ['ListItem'], ['FormatContainer', 'TableCell']);
180
+ var listItem = path[listItemIndex];
181
+ if (listItem) {
182
+ var listParent = listItemIndex >= 0 ? path[listItemIndex + 1] : null;
183
+ var blockIndex = listParent ? listParent.blocks.indexOf(listItem) : -1;
184
+ if (blockIndex >= 0 && listParent) {
185
+ var newListItem = (0, roosterjs_content_model_dom_1.createListItem)(listItem.levels, listItem.formatHolder.format);
186
+ if (paraIndex >= 0) {
187
+ newListItem.blocks = listItem.blocks.splice(paraIndex + 1);
188
+ }
189
+ if (blockIndex >= 0) {
190
+ listParent.blocks.splice(blockIndex + 1, 0, newListItem);
191
+ }
192
+ path[listItemIndex] = newListItem;
193
+ }
194
+ }
195
+ markerPosition.paragraph = newParagraph;
196
+ return newParagraph;
197
+ }
198
+ function insertBlock(markerPosition, block) {
199
+ var path = markerPosition.path;
200
+ var newParaFormat = block.blockType !== 'Paragraph' ? {} : block.format;
201
+ var newPara = splitParagraph(markerPosition, newParaFormat);
202
+ var blockIndex = path[0].blocks.indexOf(newPara);
203
+ if (blockIndex >= 0) {
204
+ path[0].blocks.splice(blockIndex, 0, block);
205
+ }
206
+ }
207
+ function applyDefaultFormat(group, format, applyDefaultFormatOption) {
208
+ group.blocks.forEach(function (block) {
209
+ var _a;
210
+ switch (block.blockType) {
211
+ case 'BlockGroup':
212
+ if (block.blockGroupType == 'ListItem') {
213
+ block.formatHolder.format = mergeSegmentFormat(applyDefaultFormatOption, format, block.formatHolder.format);
214
+ }
215
+ applyDefaultFormat(block, format, applyDefaultFormatOption);
216
+ break;
217
+ case 'Table':
218
+ block.rows.forEach(function (row) {
219
+ return row.cells.forEach(function (cell) {
220
+ applyDefaultFormat(cell, format, applyDefaultFormatOption);
221
+ });
222
+ });
223
+ break;
224
+ case 'Paragraph':
225
+ var paragraphFormat_1 = ((_a = block.decorator) === null || _a === void 0 ? void 0 : _a.format) || {};
226
+ block.segments.forEach(function (segment) {
227
+ if (segment.segmentType == 'General') {
228
+ applyDefaultFormat(segment, format, applyDefaultFormatOption);
229
+ }
230
+ segment.format = mergeSegmentFormat(applyDefaultFormatOption, format, (0, tslib_1.__assign)((0, tslib_1.__assign)({}, paragraphFormat_1), segment.format));
231
+ });
232
+ if (applyDefaultFormatOption === 'keepSourceEmphasisFormat') {
233
+ delete block.decorator;
234
+ }
235
+ break;
236
+ }
237
+ });
238
+ }
239
+ function mergeSegmentFormat(applyDefaultFormatOption, targetformat, sourceFormat) {
240
+ return applyDefaultFormatOption == 'mergeAll'
241
+ ? (0, tslib_1.__assign)((0, tslib_1.__assign)({}, targetformat), sourceFormat) : (0, tslib_1.__assign)((0, tslib_1.__assign)({}, targetformat), getSemanticFormat(sourceFormat));
242
+ }
243
+ function getSemanticFormat(segmentFormat) {
244
+ var result = {};
245
+ var fontWeight = segmentFormat.fontWeight, italic = segmentFormat.italic, underline = segmentFormat.underline;
246
+ if (fontWeight && fontWeight != 'normal') {
247
+ result.fontWeight = fontWeight;
248
+ }
249
+ if (italic) {
250
+ result.italic = italic;
251
+ }
252
+ if (underline) {
253
+ result.underline = underline;
254
+ }
255
+ return result;
256
+ }
257
+ });
258
+ //# sourceMappingURL=mergeModel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mergeModel.js","sourceRoot":"","sources":["../../../../../packages-content-model/roosterjs-content-model-core/lib/publicApi/model/mergeModel.ts"],"names":[],"mappings":"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","sourcesContent":["import { applyTableFormat } from '../table/applyTableFormat';\nimport { deleteSelection } from '../../publicApi/selection/deleteSelection';\nimport { getClosestAncestorBlockGroupIndex } from './getClosestAncestorBlockGroupIndex';\nimport { normalizeTable } from '../table/normalizeTable';\nimport {\n addSegment,\n createListItem,\n createParagraph,\n createSelectionMarker,\n createTableCell,\n getObjectKeys,\n normalizeContentModel,\n} from 'roosterjs-content-model-dom';\nimport type {\n ContentModelBlock,\n ContentModelBlockFormat,\n ContentModelBlockGroup,\n ContentModelDocument,\n ContentModelListItem,\n ContentModelParagraph,\n ContentModelSegmentFormat,\n ContentModelTable,\n FormatWithContentModelContext,\n InsertPoint,\n} from 'roosterjs-content-model-types';\n\nconst HeadingTags = ['h1', 'h2', 'h3', 'h4', 'h5', 'h6'];\n\n/**\n * Options to specify how to merge models\n */\nexport interface MergeModelOption {\n /**\n * When there is only a table to merge, whether merge this table into current table (if any), or just directly insert (nested table).\n * This is usually used when paste table inside a table\n * @default false\n */\n mergeTable?: boolean;\n\n /**\n * Use this insert position to merge instead of querying selection from target model\n * @default undefined\n */\n insertPosition?: InsertPoint;\n\n /**\n * Use this to decide whether to change the source model format when doing the merge.\n * 'mergeAll': segment format of the insert position will be merged into the content that is merged into current model.\n * If the source model already has some format, it will not be overwritten.\n * 'keepSourceEmphasisFormat': format of the insert position will be set into the content that is merged into current model.\n * If the source model already has emphasis format, such as, fontWeight, Italic or underline different than the default style, it will not be overwritten.\n * 'none' the source segment format will not be modified.\n * @default undefined\n */\n mergeFormat?: 'mergeAll' | 'keepSourceEmphasisFormat' | 'none';\n}\n\n/**\n * Merge source model into target mode\n * @param target Target Content Model that will merge content into\n * @param source Source Content Model will be merged to target model\n * @param context Format context. When call this function inside formatContentModel, provide this context so that formatContentModel will do extra handling to the result\n * @param options More options, see MergeModelOption\n * @returns Insert point after merge, or null if there is no insert point\n */\nexport function mergeModel(\n target: ContentModelDocument,\n source: ContentModelDocument,\n context?: FormatWithContentModelContext,\n options?: MergeModelOption\n): InsertPoint | null {\n const insertPosition =\n options?.insertPosition ?? deleteSelection(target, [], context).insertPoint;\n\n if (insertPosition) {\n if (options?.mergeFormat && options.mergeFormat != 'none') {\n const newFormat: ContentModelSegmentFormat = {\n ...(target.format || {}),\n ...insertPosition.marker.format,\n };\n\n applyDefaultFormat(source, newFormat, options?.mergeFormat);\n }\n\n for (let i = 0; i < source.blocks.length; i++) {\n const block = source.blocks[i];\n\n switch (block.blockType) {\n case 'Paragraph':\n mergeParagraph(insertPosition, block, i == 0, context, options);\n break;\n\n case 'Divider':\n insertBlock(insertPosition, block);\n break;\n\n case 'Entity':\n insertBlock(insertPosition, block);\n context?.newEntities.push(block);\n break;\n\n case 'Table':\n if (source.blocks.length == 1 && options?.mergeTable) {\n mergeTable(insertPosition, block, source);\n } else {\n insertBlock(insertPosition, block);\n }\n break;\n\n case 'BlockGroup':\n switch (block.blockGroupType) {\n case 'General':\n case 'FormatContainer':\n insertBlock(insertPosition, block);\n break;\n case 'ListItem':\n mergeList(insertPosition, block);\n break;\n }\n break;\n }\n }\n }\n\n normalizeContentModel(target);\n\n return insertPosition;\n}\n\nfunction mergeParagraph(\n markerPosition: InsertPoint,\n newPara: ContentModelParagraph,\n mergeToCurrentParagraph: boolean,\n context?: FormatWithContentModelContext,\n option?: MergeModelOption\n) {\n const { paragraph, marker } = markerPosition;\n const newParagraph = mergeToCurrentParagraph\n ? paragraph\n : splitParagraph(markerPosition, newPara.format);\n const segmentIndex = newParagraph.segments.indexOf(marker);\n\n if (option?.mergeFormat == 'none' && mergeToCurrentParagraph) {\n newParagraph.segments.forEach(segment => {\n segment.format = { ...(newParagraph.segmentFormat || {}), ...segment.format };\n });\n delete newParagraph.segmentFormat;\n }\n if (segmentIndex >= 0) {\n for (let i = 0; i < newPara.segments.length; i++) {\n const segment = newPara.segments[i];\n\n newParagraph.segments.splice(segmentIndex + i, 0, segment);\n\n if (context) {\n if (segment.segmentType == 'Entity') {\n context.newEntities.push(segment);\n }\n\n if (segment.segmentType == 'Image') {\n context.newImages.push(segment);\n }\n }\n }\n }\n\n if (newPara.decorator) {\n newParagraph.decorator = { ...newPara.decorator };\n if (HeadingTags.indexOf(newParagraph.decorator.tagName) > -1) {\n const sourceKeys: (keyof ContentModelSegmentFormat)[] = getObjectKeys(\n newParagraph.decorator.format\n );\n const segmentDecoratorKeys: (keyof ContentModelSegmentFormat)[] = getObjectKeys(\n newParagraph.segmentFormat || {}\n );\n\n sourceKeys.forEach(key => {\n if (segmentDecoratorKeys.indexOf(key) > -1) {\n delete newParagraph.segmentFormat?.[key];\n }\n });\n }\n }\n\n if (!mergeToCurrentParagraph) {\n newParagraph.format = newPara.format;\n }\n}\n\nfunction mergeTable(\n markerPosition: InsertPoint,\n newTable: ContentModelTable,\n source: ContentModelDocument\n) {\n const { tableContext, marker } = markerPosition;\n\n if (tableContext && source.blocks.length == 1 && source.blocks[0] == newTable) {\n const { table, colIndex, rowIndex } = tableContext;\n for (let i = 0; i < newTable.rows.length; i++) {\n for (let j = 0; j < newTable.rows[i].cells.length; j++) {\n const newCell = newTable.rows[i].cells[j];\n\n if (i == 0 && colIndex + j >= table.rows[0].cells.length) {\n for (let k = 0; k < table.rows.length; k++) {\n const leftCell = table.rows[k]?.cells[colIndex + j - 1];\n table.rows[k].cells[colIndex + j] = createTableCell(\n false /*spanLeft*/,\n false /*spanAbove*/,\n leftCell?.isHeader,\n leftCell?.format\n );\n }\n }\n\n if (j == 0 && rowIndex + i >= table.rows.length) {\n if (!table.rows[rowIndex + i]) {\n table.rows[rowIndex + i] = {\n cells: [],\n format: {},\n height: 0,\n };\n }\n\n for (let k = 0; k < table.rows[rowIndex].cells.length; k++) {\n const aboveCell = table.rows[rowIndex + i - 1]?.cells[k];\n table.rows[rowIndex + i].cells[k] = createTableCell(\n false /*spanLeft*/,\n false /*spanAbove*/,\n false /*isHeader*/,\n aboveCell?.format\n );\n }\n }\n\n const oldCell = table.rows[rowIndex + i].cells[colIndex + j];\n table.rows[rowIndex + i].cells[colIndex + j] = newCell;\n\n if (i == 0 && j == 0) {\n const newMarker = createSelectionMarker(marker.format);\n const newPara = addSegment(newCell, newMarker);\n\n if (markerPosition.path[0] == oldCell) {\n // Update insert point to match the change result\n markerPosition.path[0] = newCell;\n markerPosition.marker = newMarker;\n markerPosition.paragraph = newPara;\n }\n }\n }\n }\n\n normalizeTable(table, markerPosition.marker.format);\n applyTableFormat(table, undefined /*newFormat*/, true /*keepCellShade*/);\n } else {\n insertBlock(markerPosition, newTable);\n }\n}\n\nfunction mergeList(markerPosition: InsertPoint, newList: ContentModelListItem) {\n splitParagraph(markerPosition, newList.format);\n\n const { path, paragraph } = markerPosition;\n\n const listItemIndex = getClosestAncestorBlockGroupIndex(path, ['ListItem']);\n const listItem = path[listItemIndex] as ContentModelListItem;\n const listParent = path[listItemIndex + 1]; // It is ok here when index is -1, that means there is no list and we just insert a new paragraph and use path[0] as its parent\n const blockIndex = listParent.blocks.indexOf(listItem || paragraph);\n\n if (blockIndex >= 0) {\n listParent.blocks.splice(blockIndex, 0, newList);\n }\n\n if (listItem) {\n listItem?.levels.forEach((level, i) => {\n newList.levels[i] = { ...level };\n });\n }\n}\n\nfunction splitParagraph(markerPosition: InsertPoint, newParaFormat: ContentModelBlockFormat) {\n const { paragraph, marker, path } = markerPosition;\n const segmentIndex = paragraph.segments.indexOf(marker);\n const paraIndex = path[0].blocks.indexOf(paragraph);\n const newParagraph = createParagraph(\n false /*isImplicit*/,\n { ...paragraph.format, ...newParaFormat },\n paragraph.segmentFormat\n );\n\n if (segmentIndex >= 0) {\n newParagraph.segments = paragraph.segments.splice(segmentIndex);\n }\n\n if (paraIndex >= 0) {\n path[0].blocks.splice(paraIndex + 1, 0, newParagraph);\n }\n\n const listItemIndex = getClosestAncestorBlockGroupIndex(\n path,\n ['ListItem'],\n ['FormatContainer', 'TableCell']\n );\n const listItem = path[listItemIndex] as ContentModelListItem;\n\n if (listItem) {\n const listParent = listItemIndex >= 0 ? path[listItemIndex + 1] : null;\n const blockIndex = listParent ? listParent.blocks.indexOf(listItem) : -1;\n\n if (blockIndex >= 0 && listParent) {\n const newListItem = createListItem(listItem.levels, listItem.formatHolder.format);\n\n if (paraIndex >= 0) {\n newListItem.blocks = listItem.blocks.splice(paraIndex + 1);\n }\n\n if (blockIndex >= 0) {\n listParent.blocks.splice(blockIndex + 1, 0, newListItem);\n }\n\n path[listItemIndex] = newListItem;\n }\n }\n\n markerPosition.paragraph = newParagraph;\n\n return newParagraph;\n}\n\nfunction insertBlock(markerPosition: InsertPoint, block: ContentModelBlock) {\n const { path } = markerPosition;\n const newParaFormat = block.blockType !== 'Paragraph' ? {} : block.format;\n const newPara = splitParagraph(markerPosition, newParaFormat);\n const blockIndex = path[0].blocks.indexOf(newPara);\n\n if (blockIndex >= 0) {\n path[0].blocks.splice(blockIndex, 0, block);\n }\n}\n\nfunction applyDefaultFormat(\n group: ContentModelBlockGroup,\n format: ContentModelSegmentFormat,\n applyDefaultFormatOption: 'mergeAll' | 'keepSourceEmphasisFormat'\n) {\n group.blocks.forEach(block => {\n switch (block.blockType) {\n case 'BlockGroup':\n if (block.blockGroupType == 'ListItem') {\n block.formatHolder.format = mergeSegmentFormat(\n applyDefaultFormatOption,\n format,\n block.formatHolder.format\n );\n }\n applyDefaultFormat(block, format, applyDefaultFormatOption);\n break;\n\n case 'Table':\n block.rows.forEach(row =>\n row.cells.forEach(cell => {\n applyDefaultFormat(cell, format, applyDefaultFormatOption);\n })\n );\n break;\n\n case 'Paragraph':\n const paragraphFormat = block.decorator?.format || {};\n block.segments.forEach(segment => {\n if (segment.segmentType == 'General') {\n applyDefaultFormat(segment, format, applyDefaultFormatOption);\n }\n\n segment.format = mergeSegmentFormat(applyDefaultFormatOption, format, {\n ...paragraphFormat,\n ...segment.format,\n });\n });\n\n if (applyDefaultFormatOption === 'keepSourceEmphasisFormat') {\n delete block.decorator;\n }\n break;\n }\n });\n}\n\nfunction mergeSegmentFormat(\n applyDefaultFormatOption: 'mergeAll' | 'keepSourceEmphasisFormat',\n targetformat: ContentModelSegmentFormat,\n sourceFormat: ContentModelSegmentFormat\n): ContentModelSegmentFormat {\n return applyDefaultFormatOption == 'mergeAll'\n ? { ...targetformat, ...sourceFormat }\n : {\n ...targetformat,\n ...getSemanticFormat(sourceFormat),\n };\n}\n\nfunction getSemanticFormat(segmentFormat: ContentModelSegmentFormat): ContentModelSegmentFormat {\n const result: ContentModelSegmentFormat = {};\n\n const { fontWeight, italic, underline } = segmentFormat;\n\n if (fontWeight && fontWeight != 'normal') {\n result.fontWeight = fontWeight;\n }\n if (italic) {\n result.italic = italic;\n }\n if (underline) {\n result.underline = underline;\n }\n\n return result;\n}\n"]}
@@ -0,0 +1,14 @@
1
+ import type { ContentModelDocument, FormatWithContentModelContext, InsertPoint, PasteType, IStandaloneEditor } from 'roosterjs-content-model-types';
2
+ import type { ClipboardData, IEditor } from 'roosterjs-editor-types';
3
+ /**
4
+ * Paste into editor using a clipboardData object
5
+ * @param editor The editor to paste content into
6
+ * @param clipboardData Clipboard data retrieved from clipboard
7
+ * @param pasteType Type of content to paste. @default normal
8
+ */
9
+ export declare function paste(editor: IStandaloneEditor & IEditor, clipboardData: ClipboardData, pasteType?: PasteType): void;
10
+ /**
11
+ * @internal
12
+ * Export only for unit test
13
+ */
14
+ export declare function mergePasteContent(model: ContentModelDocument, context: FormatWithContentModelContext, pasteModel: ContentModelDocument, applyCurrentFormat: boolean, customizedMerge: undefined | ((source: ContentModelDocument, target: ContentModelDocument) => InsertPoint | null)): InsertPoint | null;
@@ -0,0 +1,146 @@
1
+ define(["require", "exports", "tslib", "../../constants/ChangeSource", "../selection/collectSelections", "./mergeModel", "roosterjs-content-model-dom", "roosterjs-editor-dom"], function (require, exports, tslib_1, ChangeSource_1, collectSelections_1, mergeModel_1, roosterjs_content_model_dom_1, roosterjs_editor_dom_1) {
2
+ "use strict";
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.mergePasteContent = exports.paste = void 0;
5
+ // Map new PasteType to old PasteType
6
+ // TODO: We can remove this once we have standalone editor
7
+ var PasteTypeMap = {
8
+ asImage: 3 /* AsImage */,
9
+ asPlainText: 1 /* AsPlainText */,
10
+ mergeFormat: 2 /* MergeFormat */,
11
+ normal: 0 /* Normal */,
12
+ };
13
+ var EmptySegmentFormat = {
14
+ backgroundColor: '',
15
+ fontFamily: '',
16
+ fontSize: '',
17
+ fontWeight: '',
18
+ italic: false,
19
+ letterSpacing: '',
20
+ lineHeight: '',
21
+ strikethrough: false,
22
+ superOrSubScriptSequence: '',
23
+ textColor: '',
24
+ underline: false,
25
+ };
26
+ /**
27
+ * Paste into editor using a clipboardData object
28
+ * @param editor The editor to paste content into
29
+ * @param clipboardData Clipboard data retrieved from clipboard
30
+ * @param pasteType Type of content to paste. @default normal
31
+ */
32
+ function paste(editor, clipboardData, pasteType) {
33
+ if (pasteType === void 0) { pasteType = 'normal'; }
34
+ if (clipboardData.snapshotBeforePaste) {
35
+ // Restore original content before paste a new one
36
+ editor.setContent(clipboardData.snapshotBeforePaste);
37
+ }
38
+ else {
39
+ clipboardData.snapshotBeforePaste = editor.getContent(2 /* RawHTMLWithSelection */);
40
+ }
41
+ editor.focus();
42
+ var originalFormat;
43
+ editor.formatContentModel(function (model, context) {
44
+ var _a;
45
+ var eventData = createBeforePasteEventData(editor, clipboardData, pasteType);
46
+ var currentSegment = (0, collectSelections_1.getSelectedSegments)(model, true /*includingFormatHolder*/)[0];
47
+ var _b = (_a = currentSegment === null || currentSegment === void 0 ? void 0 : currentSegment.format) !== null && _a !== void 0 ? _a : {}, fontFamily = _b.fontFamily, fontSize = _b.fontSize, textColor = _b.textColor, backgroundColor = _b.backgroundColor, letterSpacing = _b.letterSpacing, lineHeight = _b.lineHeight;
48
+ var _c = triggerPluginEventAndCreatePasteFragment(editor, clipboardData, pasteType, eventData, { fontFamily: fontFamily, fontSize: fontSize, textColor: textColor, backgroundColor: backgroundColor, letterSpacing: letterSpacing, lineHeight: lineHeight }), domToModelOption = _c.domToModelOption, fragment = _c.fragment, customizedMerge = _c.customizedMerge;
49
+ var pasteModel = (0, roosterjs_content_model_dom_1.domToContentModel)(fragment, (0, roosterjs_content_model_dom_1.createDomToModelContext)(undefined /*editorContext*/, domToModelOption));
50
+ var insertPoint = mergePasteContent(model, context, pasteModel, pasteType == 'mergeFormat', customizedMerge);
51
+ if (insertPoint) {
52
+ originalFormat = insertPoint.marker.format;
53
+ }
54
+ if (originalFormat) {
55
+ context.newPendingFormat = (0, tslib_1.__assign)((0, tslib_1.__assign)({}, EmptySegmentFormat), originalFormat); // Use empty format as initial value to clear any other format inherits from pasted content
56
+ }
57
+ return true;
58
+ }, {
59
+ changeSource: ChangeSource_1.ChangeSource.Paste,
60
+ getChangeData: function () { return clipboardData; },
61
+ apiName: 'paste',
62
+ });
63
+ }
64
+ exports.paste = paste;
65
+ /**
66
+ * @internal
67
+ * Export only for unit test
68
+ */
69
+ function mergePasteContent(model, context, pasteModel, applyCurrentFormat, customizedMerge) {
70
+ return customizedMerge
71
+ ? customizedMerge(model, pasteModel)
72
+ : (0, mergeModel_1.mergeModel)(model, pasteModel, context, {
73
+ mergeFormat: applyCurrentFormat ? 'keepSourceEmphasisFormat' : 'none',
74
+ mergeTable: shouldMergeTable(pasteModel),
75
+ });
76
+ }
77
+ exports.mergePasteContent = mergePasteContent;
78
+ function shouldMergeTable(pasteModel) {
79
+ // If model contains a table and a paragraph element after the table with a single BR segment, remove the Paragraph after the table
80
+ if (pasteModel.blocks.length == 2 &&
81
+ pasteModel.blocks[0].blockType === 'Table' &&
82
+ pasteModel.blocks[1].blockType === 'Paragraph' &&
83
+ pasteModel.blocks[1].segments.length === 1 &&
84
+ pasteModel.blocks[1].segments[0].segmentType === 'Br') {
85
+ pasteModel.blocks.splice(1);
86
+ }
87
+ // Only merge table when the document contain a single table.
88
+ return pasteModel.blocks.length === 1 && pasteModel.blocks[0].blockType === 'Table';
89
+ }
90
+ function createBeforePasteEventData(editor, clipboardData, pasteType) {
91
+ var options = (0, roosterjs_editor_dom_1.createDefaultHtmlSanitizerOptions)();
92
+ // Remove "caret-color" style generated by Safari to make sure caret shows in right color after paste
93
+ options.cssStyleCallbacks['caret-color'] = function () { return false; };
94
+ return {
95
+ clipboardData: clipboardData,
96
+ fragment: editor.getDocument().createDocumentFragment(),
97
+ sanitizingOption: options,
98
+ htmlBefore: '',
99
+ htmlAfter: '',
100
+ htmlAttributes: {},
101
+ domToModelOption: {},
102
+ pasteType: PasteTypeMap[pasteType],
103
+ };
104
+ }
105
+ /**
106
+ * This function is used to create a BeforePasteEvent object after trigger the event, so other plugins can modify the event object
107
+ * This function will also create a DocumentFragment for paste.
108
+ */
109
+ function triggerPluginEventAndCreatePasteFragment(editor, clipboardData, pasteType, eventData, currentFormat) {
110
+ var event = (0, tslib_1.__assign)({ eventType: 10 /* BeforePaste */ }, eventData);
111
+ var fragment = event.fragment;
112
+ var rawHtml = clipboardData.rawHtml, text = clipboardData.text, imageDataUri = clipboardData.imageDataUri;
113
+ var trustedHTMLHandler = editor.getTrustedHTMLHandler();
114
+ var doc = rawHtml
115
+ ? new DOMParser().parseFromString(trustedHTMLHandler(rawHtml), 'text/html')
116
+ : undefined;
117
+ // Step 2: Retrieve Metadata from Html and the Html that was copied.
118
+ (0, roosterjs_editor_dom_1.retrieveMetadataFromClipboard)(doc, event, trustedHTMLHandler);
119
+ // Step 3: Fill the BeforePasteEvent object, especially the fragment for paste
120
+ if ((pasteType == 'asImage' && imageDataUri) ||
121
+ (pasteType != 'asPlainText' && !text && imageDataUri)) {
122
+ // Paste image
123
+ (0, roosterjs_editor_dom_1.handleImagePaste)(imageDataUri, fragment);
124
+ }
125
+ else if (pasteType != 'asPlainText' && rawHtml && doc ? doc.body : false) {
126
+ (0, roosterjs_content_model_dom_1.moveChildNodes)(fragment, doc === null || doc === void 0 ? void 0 : doc.body);
127
+ }
128
+ else if (text) {
129
+ // Paste text
130
+ (0, roosterjs_editor_dom_1.handleTextPaste)(text, null /*position*/, fragment);
131
+ }
132
+ var formatContainer = fragment.ownerDocument.createElement('span');
133
+ (0, roosterjs_content_model_dom_1.moveChildNodes)(formatContainer, fragment);
134
+ fragment.appendChild(formatContainer);
135
+ (0, roosterjs_content_model_dom_1.applySegmentFormatToElement)(formatContainer, currentFormat);
136
+ var pluginEvent = event;
137
+ // Step 4: Trigger BeforePasteEvent so that plugins can do proper change before paste, when the type of paste is different than Plain Text
138
+ if (pasteType !== 'asPlainText') {
139
+ pluginEvent = editor.triggerPluginEvent(10 /* BeforePaste */, event, true /* broadcast */);
140
+ }
141
+ // Step 5. Sanitize the fragment before paste to make sure the content is safe
142
+ (0, roosterjs_editor_dom_1.sanitizePasteContent)(event, null /*position*/);
143
+ return pluginEvent;
144
+ }
145
+ });
146
+ //# sourceMappingURL=paste.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paste.js","sourceRoot":"","sources":["../../../../../packages-content-model/roosterjs-content-model-core/lib/publicApi/model/paste.ts"],"names":[],"mappings":"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","sourcesContent":["import { ChangeSource } from '../../constants/ChangeSource';\nimport { GetContentMode, PasteType as OldPasteType, PluginEventType } from 'roosterjs-editor-types';\nimport { getSelectedSegments } from '../selection/collectSelections';\nimport { mergeModel } from './mergeModel';\nimport type {\n ContentModelDocument,\n ContentModelSegmentFormat,\n FormatWithContentModelContext,\n InsertPoint,\n PasteType,\n ContentModelBeforePasteEventData,\n ContentModelBeforePasteEvent,\n IStandaloneEditor,\n} from 'roosterjs-content-model-types';\nimport type { ClipboardData, IEditor } from 'roosterjs-editor-types';\nimport {\n applySegmentFormatToElement,\n createDomToModelContext,\n domToContentModel,\n moveChildNodes,\n} from 'roosterjs-content-model-dom';\nimport {\n createDefaultHtmlSanitizerOptions,\n handleImagePaste,\n handleTextPaste,\n retrieveMetadataFromClipboard,\n sanitizePasteContent,\n} from 'roosterjs-editor-dom';\n\n// Map new PasteType to old PasteType\n// TODO: We can remove this once we have standalone editor\nconst PasteTypeMap: Record<PasteType, OldPasteType> = {\n asImage: OldPasteType.AsImage,\n asPlainText: OldPasteType.AsPlainText,\n mergeFormat: OldPasteType.MergeFormat,\n normal: OldPasteType.Normal,\n};\nconst EmptySegmentFormat: Required<ContentModelSegmentFormat> = {\n backgroundColor: '',\n fontFamily: '',\n fontSize: '',\n fontWeight: '',\n italic: false,\n letterSpacing: '',\n lineHeight: '',\n strikethrough: false,\n superOrSubScriptSequence: '',\n textColor: '',\n underline: false,\n};\n\n/**\n * Paste into editor using a clipboardData object\n * @param editor The editor to paste content into\n * @param clipboardData Clipboard data retrieved from clipboard\n * @param pasteType Type of content to paste. @default normal\n */\nexport function paste(\n editor: IStandaloneEditor & IEditor,\n clipboardData: ClipboardData,\n pasteType: PasteType = 'normal'\n) {\n if (clipboardData.snapshotBeforePaste) {\n // Restore original content before paste a new one\n editor.setContent(clipboardData.snapshotBeforePaste);\n } else {\n clipboardData.snapshotBeforePaste = editor.getContent(GetContentMode.RawHTMLWithSelection);\n }\n\n editor.focus();\n let originalFormat: ContentModelSegmentFormat | undefined;\n\n editor.formatContentModel(\n (model, context) => {\n const eventData = createBeforePasteEventData(editor, clipboardData, pasteType);\n const currentSegment = getSelectedSegments(model, true /*includingFormatHolder*/)[0];\n const { fontFamily, fontSize, textColor, backgroundColor, letterSpacing, lineHeight } =\n currentSegment?.format ?? {};\n const {\n domToModelOption,\n fragment,\n customizedMerge,\n } = triggerPluginEventAndCreatePasteFragment(\n editor,\n clipboardData,\n pasteType,\n eventData,\n { fontFamily, fontSize, textColor, backgroundColor, letterSpacing, lineHeight }\n );\n\n const pasteModel = domToContentModel(\n fragment,\n createDomToModelContext(undefined /*editorContext*/, domToModelOption)\n );\n\n const insertPoint = mergePasteContent(\n model,\n context,\n pasteModel,\n pasteType == 'mergeFormat',\n customizedMerge\n );\n\n if (insertPoint) {\n originalFormat = insertPoint.marker.format;\n }\n\n if (originalFormat) {\n context.newPendingFormat = { ...EmptySegmentFormat, ...originalFormat }; // Use empty format as initial value to clear any other format inherits from pasted content\n }\n\n return true;\n },\n\n {\n changeSource: ChangeSource.Paste,\n getChangeData: () => clipboardData,\n apiName: 'paste',\n }\n );\n}\n\n/**\n * @internal\n * Export only for unit test\n */\nexport function mergePasteContent(\n model: ContentModelDocument,\n context: FormatWithContentModelContext,\n pasteModel: ContentModelDocument,\n applyCurrentFormat: boolean,\n customizedMerge:\n | undefined\n | ((source: ContentModelDocument, target: ContentModelDocument) => InsertPoint | null)\n): InsertPoint | null {\n return customizedMerge\n ? customizedMerge(model, pasteModel)\n : mergeModel(model, pasteModel, context, {\n mergeFormat: applyCurrentFormat ? 'keepSourceEmphasisFormat' : 'none',\n mergeTable: shouldMergeTable(pasteModel),\n });\n}\n\nfunction shouldMergeTable(pasteModel: ContentModelDocument): boolean | undefined {\n // If model contains a table and a paragraph element after the table with a single BR segment, remove the Paragraph after the table\n if (\n pasteModel.blocks.length == 2 &&\n pasteModel.blocks[0].blockType === 'Table' &&\n pasteModel.blocks[1].blockType === 'Paragraph' &&\n pasteModel.blocks[1].segments.length === 1 &&\n pasteModel.blocks[1].segments[0].segmentType === 'Br'\n ) {\n pasteModel.blocks.splice(1);\n }\n // Only merge table when the document contain a single table.\n return pasteModel.blocks.length === 1 && pasteModel.blocks[0].blockType === 'Table';\n}\n\nfunction createBeforePasteEventData(\n editor: IEditor,\n clipboardData: ClipboardData,\n pasteType: PasteType\n): ContentModelBeforePasteEventData {\n const options = createDefaultHtmlSanitizerOptions();\n\n // Remove \"caret-color\" style generated by Safari to make sure caret shows in right color after paste\n options.cssStyleCallbacks['caret-color'] = () => false;\n\n return {\n clipboardData,\n fragment: editor.getDocument().createDocumentFragment(),\n sanitizingOption: options,\n htmlBefore: '',\n htmlAfter: '',\n htmlAttributes: {},\n domToModelOption: {},\n pasteType: PasteTypeMap[pasteType],\n };\n}\n\n/**\n * This function is used to create a BeforePasteEvent object after trigger the event, so other plugins can modify the event object\n * This function will also create a DocumentFragment for paste.\n */\nfunction triggerPluginEventAndCreatePasteFragment(\n editor: IEditor,\n clipboardData: ClipboardData,\n pasteType: PasteType,\n eventData: ContentModelBeforePasteEventData,\n currentFormat: ContentModelSegmentFormat\n): ContentModelBeforePasteEventData {\n const event = {\n eventType: PluginEventType.BeforePaste,\n ...eventData,\n } as ContentModelBeforePasteEvent;\n\n const { fragment } = event;\n const { rawHtml, text, imageDataUri } = clipboardData;\n const trustedHTMLHandler = editor.getTrustedHTMLHandler();\n\n const doc: Document | undefined = rawHtml\n ? new DOMParser().parseFromString(trustedHTMLHandler(rawHtml), 'text/html')\n : undefined;\n\n // Step 2: Retrieve Metadata from Html and the Html that was copied.\n retrieveMetadataFromClipboard(doc, event, trustedHTMLHandler);\n\n // Step 3: Fill the BeforePasteEvent object, especially the fragment for paste\n if (\n (pasteType == 'asImage' && imageDataUri) ||\n (pasteType != 'asPlainText' && !text && imageDataUri)\n ) {\n // Paste image\n handleImagePaste(imageDataUri, fragment);\n } else if (pasteType != 'asPlainText' && rawHtml && doc ? doc.body : false) {\n moveChildNodes(fragment, doc?.body);\n } else if (text) {\n // Paste text\n handleTextPaste(text, null /*position*/, fragment);\n }\n\n const formatContainer = fragment.ownerDocument.createElement('span');\n\n moveChildNodes(formatContainer, fragment);\n fragment.appendChild(formatContainer);\n\n applySegmentFormatToElement(formatContainer, currentFormat);\n\n let pluginEvent: ContentModelBeforePasteEvent = event;\n\n // Step 4: Trigger BeforePasteEvent so that plugins can do proper change before paste, when the type of paste is different than Plain Text\n if (pasteType !== 'asPlainText') {\n pluginEvent = editor.triggerPluginEvent(\n PluginEventType.BeforePaste,\n event,\n true /* broadcast */\n ) as ContentModelBeforePasteEvent;\n }\n\n // Step 5. Sanitize the fragment before paste to make sure the content is safe\n sanitizePasteContent(event, null /*position*/);\n\n return pluginEvent;\n}\n"]}
@@ -0,0 +1,50 @@
1
+ import type { ContentModelBlock, ContentModelBlockGroup, ContentModelBlockGroupType, ContentModelDocument, ContentModelListItem, ContentModelParagraph, ContentModelSegment, ContentModelTable } from 'roosterjs-content-model-types';
2
+ import type { TypeOfBlockGroup } from '../model/getClosestAncestorBlockGroupIndex';
3
+ /**
4
+ * Represent a pair of parent block group and child block
5
+ */
6
+ export declare type OperationalBlocks<T extends ContentModelBlockGroup> = {
7
+ /**
8
+ * The parent block group
9
+ */
10
+ parent: ContentModelBlockGroup;
11
+ /**
12
+ * The child block
13
+ */
14
+ block: ContentModelBlock | T;
15
+ };
16
+ /**
17
+ * Get an array of selected parent paragraph and child segment pair
18
+ * @param model The Content Model to get selection from
19
+ * @param includingFormatHolder True means also include format holder as segment from list item, in that case paragraph will be null
20
+ */
21
+ export declare function getSelectedSegmentsAndParagraphs(model: ContentModelDocument, includingFormatHolder: boolean): [ContentModelSegment, ContentModelParagraph | null][];
22
+ /**
23
+ * Get an array of selected segments from a content model
24
+ * @param model The Content Model to get selection from
25
+ * @param includingFormatHolder True means also include format holder as segment from list item
26
+ */
27
+ export declare function getSelectedSegments(model: ContentModelDocument, includingFormatHolder: boolean): ContentModelSegment[];
28
+ /**
29
+ * Get any array of selected paragraphs from a content model
30
+ * @param model The Content Model to get selection from
31
+ */
32
+ export declare function getSelectedParagraphs(model: ContentModelDocument): ContentModelParagraph[];
33
+ /**
34
+ * Get an array of block group - block pair that is of the expected block group type from selection
35
+ * @param model The Content Model to get selection from
36
+ * @param blockGroupTypes The expected block group types
37
+ * @param stopTypes Block group types that will stop searching when hit
38
+ * @param deepFirst True means search in deep first, otherwise wide first
39
+ */
40
+ export declare function getOperationalBlocks<T extends ContentModelBlockGroup>(model: ContentModelDocument, blockGroupTypes: TypeOfBlockGroup<T>[], stopTypes: ContentModelBlockGroupType[], deepFirst?: boolean): OperationalBlocks<T>[];
41
+ /**
42
+ * Get the first selected table from content model
43
+ * @param model The Content Model to get selection from
44
+ */
45
+ export declare function getFirstSelectedTable(model: ContentModelDocument): [ContentModelTable | undefined, ContentModelBlockGroup[]];
46
+ /**
47
+ * Get the first selected list item from content model
48
+ * @param model The Content Model to get selection from
49
+ */
50
+ export declare function getFirstSelectedListItem(model: ContentModelDocument): ContentModelListItem | undefined;