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,53 @@
1
+ import type { ContentModelCachePluginState } from 'roosterjs-content-model-types';
2
+ import type { IEditor, PluginEvent, PluginWithState } from 'roosterjs-editor-types';
3
+ /**
4
+ * ContentModel cache plugin manages cached Content Model, and refresh the cache when necessary
5
+ */
6
+ export declare class ContentModelCachePlugin implements PluginWithState<ContentModelCachePluginState> {
7
+ private state;
8
+ private editor;
9
+ /**
10
+ * Construct a new instance of ContentModelEditPlugin class
11
+ * @param state State of this plugin
12
+ */
13
+ constructor(state: ContentModelCachePluginState);
14
+ /**
15
+ * Get name of this plugin
16
+ */
17
+ getName(): string;
18
+ /**
19
+ * The first method that editor will call to a plugin when editor is initializing.
20
+ * It will pass in the editor instance, plugin should take this chance to save the
21
+ * editor reference so that it can call to any editor method or format API later.
22
+ * @param editor The editor object
23
+ */
24
+ initialize(editor: IEditor): void;
25
+ /**
26
+ * The last method that editor will call to a plugin before it is disposed.
27
+ * Plugin can take this chance to clear the reference to editor. After this method is
28
+ * called, plugin should not call to any editor method since it will result in error.
29
+ */
30
+ dispose(): void;
31
+ /**
32
+ * Get plugin state object
33
+ */
34
+ getState(): ContentModelCachePluginState;
35
+ /**
36
+ * Core method for a plugin. Once an event happens in editor, editor will call this
37
+ * method of each plugin to handle the event as long as the event is not handled
38
+ * exclusively by another plugin.
39
+ * @param event The event to handle:
40
+ */
41
+ onPluginEvent(event: PluginEvent): void;
42
+ private onNativeSelectionChange;
43
+ private invalidateCache;
44
+ private updateCachedModel;
45
+ private shouldClearCache;
46
+ }
47
+ /**
48
+ * @internal
49
+ * Create a new instance of ContentModelCachePlugin class.
50
+ * This is mostly for unit test
51
+ * @param state State of this plugin
52
+ */
53
+ export declare function createContentModelCachePlugin(state: ContentModelCachePluginState): ContentModelCachePlugin;
@@ -0,0 +1,169 @@
1
+ define(["require", "exports", "./utils/areSameSelection", "../publicApi/domUtils/eventUtils"], function (require, exports, areSameSelection_1, eventUtils_1) {
2
+ "use strict";
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.createContentModelCachePlugin = exports.ContentModelCachePlugin = void 0;
5
+ /**
6
+ * ContentModel cache plugin manages cached Content Model, and refresh the cache when necessary
7
+ */
8
+ var ContentModelCachePlugin = /** @class */ (function () {
9
+ /**
10
+ * Construct a new instance of ContentModelEditPlugin class
11
+ * @param state State of this plugin
12
+ */
13
+ function ContentModelCachePlugin(state) {
14
+ var _this = this;
15
+ this.state = state;
16
+ this.editor = null;
17
+ this.onNativeSelectionChange = function () {
18
+ var _a;
19
+ if ((_a = _this.editor) === null || _a === void 0 ? void 0 : _a.hasFocus()) {
20
+ _this.updateCachedModel(_this.editor);
21
+ }
22
+ };
23
+ // TODO: Remove tempState parameter once we have standalone Content Model editor
24
+ }
25
+ /**
26
+ * Get name of this plugin
27
+ */
28
+ ContentModelCachePlugin.prototype.getName = function () {
29
+ return 'ContentModelCache';
30
+ };
31
+ /**
32
+ * The first method that editor will call to a plugin when editor is initializing.
33
+ * It will pass in the editor instance, plugin should take this chance to save the
34
+ * editor reference so that it can call to any editor method or format API later.
35
+ * @param editor The editor object
36
+ */
37
+ ContentModelCachePlugin.prototype.initialize = function (editor) {
38
+ // TODO: Later we may need a different interface for Content Model editor plugin
39
+ this.editor = editor;
40
+ this.editor.getDocument().addEventListener('selectionchange', this.onNativeSelectionChange);
41
+ };
42
+ /**
43
+ * The last method that editor will call to a plugin before it is disposed.
44
+ * Plugin can take this chance to clear the reference to editor. After this method is
45
+ * called, plugin should not call to any editor method since it will result in error.
46
+ */
47
+ ContentModelCachePlugin.prototype.dispose = function () {
48
+ if (this.editor) {
49
+ this.editor
50
+ .getDocument()
51
+ .removeEventListener('selectionchange', this.onNativeSelectionChange);
52
+ this.editor = null;
53
+ }
54
+ };
55
+ /**
56
+ * Get plugin state object
57
+ */
58
+ ContentModelCachePlugin.prototype.getState = function () {
59
+ return this.state;
60
+ };
61
+ /**
62
+ * Core method for a plugin. Once an event happens in editor, editor will call this
63
+ * method of each plugin to handle the event as long as the event is not handled
64
+ * exclusively by another plugin.
65
+ * @param event The event to handle:
66
+ */
67
+ ContentModelCachePlugin.prototype.onPluginEvent = function (event) {
68
+ if (!this.editor) {
69
+ return;
70
+ }
71
+ switch (event.eventType) {
72
+ case 0 /* KeyDown */:
73
+ if (this.shouldClearCache(event)) {
74
+ this.invalidateCache();
75
+ }
76
+ break;
77
+ case 3 /* Input */:
78
+ {
79
+ this.updateCachedModel(this.editor, true /*forceUpdate*/);
80
+ }
81
+ break;
82
+ case 22 /* SelectionChanged */:
83
+ this.updateCachedModel(this.editor);
84
+ break;
85
+ case 7 /* ContentChanged */:
86
+ {
87
+ var _a = event, contentModel = _a.contentModel, selection = _a.selection;
88
+ if (contentModel && this.state.domIndexer) {
89
+ this.state.cachedModel = contentModel;
90
+ this.state.cachedSelection = selection;
91
+ }
92
+ else {
93
+ this.invalidateCache();
94
+ }
95
+ }
96
+ break;
97
+ }
98
+ };
99
+ ContentModelCachePlugin.prototype.invalidateCache = function () {
100
+ var _a;
101
+ if (!((_a = this.editor) === null || _a === void 0 ? void 0 : _a.isInShadowEdit())) {
102
+ this.state.cachedModel = undefined;
103
+ this.state.cachedSelection = undefined;
104
+ }
105
+ };
106
+ ContentModelCachePlugin.prototype.updateCachedModel = function (editor, forceUpdate) {
107
+ var _a;
108
+ var cachedSelection = this.state.cachedSelection;
109
+ this.state.cachedSelection = undefined; // Clear it to force getDOMSelection() retrieve the latest selection range
110
+ var newRangeEx = editor.getDOMSelection() || undefined;
111
+ var model = this.state.cachedModel;
112
+ var isSelectionChanged = forceUpdate ||
113
+ !cachedSelection ||
114
+ !newRangeEx ||
115
+ !(0, areSameSelection_1.areSameSelection)(newRangeEx, cachedSelection);
116
+ if (isSelectionChanged) {
117
+ if (!model ||
118
+ !newRangeEx ||
119
+ !((_a = this.state.domIndexer) === null || _a === void 0 ? void 0 : _a.reconcileSelection(model, newRangeEx, cachedSelection))) {
120
+ this.invalidateCache();
121
+ }
122
+ else {
123
+ this.state.cachedSelection = newRangeEx;
124
+ }
125
+ }
126
+ else {
127
+ this.state.cachedSelection = cachedSelection;
128
+ }
129
+ };
130
+ ContentModelCachePlugin.prototype.shouldClearCache = function (event) {
131
+ var _a;
132
+ var rawEvent = event.rawEvent, handledByEditFeature = event.handledByEditFeature;
133
+ // In these cases we can't update the model, so clear cache:
134
+ // 1. It is already handled by Content Edit Features
135
+ if (handledByEditFeature) {
136
+ return true;
137
+ }
138
+ // 2. Default behavior is prevented, which means other plugins has handled the event
139
+ if (rawEvent.defaultPrevented) {
140
+ return true;
141
+ }
142
+ // 3. ENTER key is pressed. ENTER key will create new paragraph, so need to update cache to reflect this change
143
+ // TODO: Handle ENTER key to better reuse content model
144
+ if (rawEvent.key == 'Enter') {
145
+ return true;
146
+ }
147
+ // 4. Current selection is image or table or expanded range selection, and is inputting some text
148
+ if ((((_a = this.state.cachedSelection) === null || _a === void 0 ? void 0 : _a.type) != 'range' ||
149
+ !this.state.cachedSelection.range.collapsed) &&
150
+ (0, eventUtils_1.isCharacterValue)(rawEvent)) {
151
+ return true;
152
+ }
153
+ return false;
154
+ };
155
+ return ContentModelCachePlugin;
156
+ }());
157
+ exports.ContentModelCachePlugin = ContentModelCachePlugin;
158
+ /**
159
+ * @internal
160
+ * Create a new instance of ContentModelCachePlugin class.
161
+ * This is mostly for unit test
162
+ * @param state State of this plugin
163
+ */
164
+ function createContentModelCachePlugin(state) {
165
+ return new ContentModelCachePlugin(state);
166
+ }
167
+ exports.createContentModelCachePlugin = createContentModelCachePlugin;
168
+ });
169
+ //# sourceMappingURL=ContentModelCachePlugin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ContentModelCachePlugin.js","sourceRoot":"","sources":["../../../../packages-content-model/roosterjs-content-model-core/lib/corePlugin/ContentModelCachePlugin.ts"],"names":[],"mappings":"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","sourcesContent":["import { areSameSelection } from './utils/areSameSelection';\nimport { isCharacterValue } from '../publicApi/domUtils/eventUtils';\nimport { PluginEventType } from 'roosterjs-editor-types';\nimport type {\n ContentModelCachePluginState,\n ContentModelContentChangedEvent,\n IStandaloneEditor,\n} from 'roosterjs-content-model-types';\nimport type {\n IEditor,\n PluginEvent,\n PluginKeyDownEvent,\n PluginWithState,\n} from 'roosterjs-editor-types';\n\n/**\n * ContentModel cache plugin manages cached Content Model, and refresh the cache when necessary\n */\nexport class ContentModelCachePlugin implements PluginWithState<ContentModelCachePluginState> {\n private editor: (IEditor & IStandaloneEditor) | null = null;\n\n /**\n * Construct a new instance of ContentModelEditPlugin class\n * @param state State of this plugin\n */\n constructor(private state: ContentModelCachePluginState) {\n // TODO: Remove tempState parameter once we have standalone Content Model editor\n }\n\n /**\n * Get name of this plugin\n */\n getName() {\n return 'ContentModelCache';\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 // TODO: Later we may need a different interface for Content Model editor plugin\n this.editor = editor as IEditor & IStandaloneEditor;\n this.editor.getDocument().addEventListener('selectionchange', this.onNativeSelectionChange);\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 if (this.editor) {\n this.editor\n .getDocument()\n .removeEventListener('selectionchange', this.onNativeSelectionChange);\n this.editor = null;\n }\n }\n\n /**\n * Get plugin state object\n */\n getState(): ContentModelCachePluginState {\n return this.state;\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) {\n return;\n }\n\n switch (event.eventType) {\n case PluginEventType.KeyDown:\n if (this.shouldClearCache(event)) {\n this.invalidateCache();\n }\n break;\n\n case PluginEventType.Input:\n {\n this.updateCachedModel(this.editor, true /*forceUpdate*/);\n }\n break;\n\n case PluginEventType.SelectionChanged:\n this.updateCachedModel(this.editor);\n break;\n\n case PluginEventType.ContentChanged:\n {\n const { contentModel, selection } = event as ContentModelContentChangedEvent;\n\n if (contentModel && this.state.domIndexer) {\n this.state.cachedModel = contentModel;\n this.state.cachedSelection = selection;\n } else {\n this.invalidateCache();\n }\n }\n\n break;\n }\n }\n\n private onNativeSelectionChange = () => {\n if (this.editor?.hasFocus()) {\n this.updateCachedModel(this.editor);\n }\n };\n\n private invalidateCache() {\n if (!this.editor?.isInShadowEdit()) {\n this.state.cachedModel = undefined;\n this.state.cachedSelection = undefined;\n }\n }\n\n private updateCachedModel(editor: IStandaloneEditor, forceUpdate?: boolean) {\n const cachedSelection = this.state.cachedSelection;\n this.state.cachedSelection = undefined; // Clear it to force getDOMSelection() retrieve the latest selection range\n\n const newRangeEx = editor.getDOMSelection() || undefined;\n const model = this.state.cachedModel;\n const isSelectionChanged =\n forceUpdate ||\n !cachedSelection ||\n !newRangeEx ||\n !areSameSelection(newRangeEx, cachedSelection);\n\n if (isSelectionChanged) {\n if (\n !model ||\n !newRangeEx ||\n !this.state.domIndexer?.reconcileSelection(model, newRangeEx, cachedSelection)\n ) {\n this.invalidateCache();\n } else {\n this.state.cachedSelection = newRangeEx;\n }\n } else {\n this.state.cachedSelection = cachedSelection;\n }\n }\n\n private shouldClearCache(event: PluginKeyDownEvent) {\n const { rawEvent, handledByEditFeature } = event;\n\n // In these cases we can't update the model, so clear cache:\n // 1. It is already handled by Content Edit Features\n if (handledByEditFeature) {\n return true;\n }\n\n // 2. Default behavior is prevented, which means other plugins has handled the event\n if (rawEvent.defaultPrevented) {\n return true;\n }\n\n // 3. ENTER key is pressed. ENTER key will create new paragraph, so need to update cache to reflect this change\n // TODO: Handle ENTER key to better reuse content model\n\n if (rawEvent.key == 'Enter') {\n return true;\n }\n\n // 4. Current selection is image or table or expanded range selection, and is inputting some text\n if (\n (this.state.cachedSelection?.type != 'range' ||\n !this.state.cachedSelection.range.collapsed) &&\n isCharacterValue(rawEvent)\n ) {\n return true;\n }\n\n return false;\n }\n}\n\n/**\n * @internal\n * Create a new instance of ContentModelCachePlugin class.\n * This is mostly for unit test\n * @param state State of this plugin\n */\nexport function createContentModelCachePlugin(state: ContentModelCachePluginState) {\n return new ContentModelCachePlugin(state);\n}\n"]}
@@ -0,0 +1,46 @@
1
+ import type { OnNodeCreated } from 'roosterjs-content-model-types';
2
+ import type { CopyPastePluginState, IEditor, PluginWithState } from 'roosterjs-editor-types';
3
+ /**
4
+ * Copy and paste plugin for handling onCopy and onPaste event
5
+ */
6
+ export declare class ContentModelCopyPastePlugin implements PluginWithState<CopyPastePluginState> {
7
+ private state;
8
+ private editor;
9
+ private disposer;
10
+ /**
11
+ * Construct a new instance of CopyPastePlugin
12
+ * @param options The editor options
13
+ */
14
+ constructor(state: CopyPastePluginState);
15
+ /**
16
+ * Get a friendly name of this plugin
17
+ */
18
+ getName(): string;
19
+ /**
20
+ * Initialize this plugin. This should only be called from Editor
21
+ * @param editor Editor instance
22
+ */
23
+ initialize(editor: IEditor): void;
24
+ /**
25
+ * Dispose this plugin
26
+ */
27
+ dispose(): void;
28
+ /**
29
+ * Get plugin state object
30
+ */
31
+ getState(): CopyPastePluginState;
32
+ private onCutCopy;
33
+ private onPaste;
34
+ private getTempDiv;
35
+ }
36
+ /**
37
+ * @internal
38
+ * Exported only for unit testing
39
+ */
40
+ export declare const onNodeCreated: OnNodeCreated;
41
+ /**
42
+ * @internal
43
+ * Create a new instance of ContentModelCopyPastePlugin
44
+ * @param state The plugin state object
45
+ */
46
+ export declare function createContentModelCopyPastePlugin(state: CopyPastePluginState): ContentModelCopyPastePlugin;
@@ -0,0 +1,226 @@
1
+ define(["require", "exports", "tslib", "./utils/addRangeToSelection", "../constants/ChangeSource", "../publicApi/model/cloneModel", "../publicApi/selection/deleteSelection", "roosterjs-editor-dom", "../publicApi/selection/iterateSelections", "../publicApi/model/paste", "roosterjs-content-model-dom"], function (require, exports, tslib_1, addRangeToSelection_1, ChangeSource_1, cloneModel_1, deleteSelection_1, roosterjs_editor_dom_1, iterateSelections_1, paste_1, roosterjs_content_model_dom_1) {
2
+ "use strict";
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.createContentModelCopyPastePlugin = exports.onNodeCreated = exports.ContentModelCopyPastePlugin = void 0;
5
+ /**
6
+ * Copy and paste plugin for handling onCopy and onPaste event
7
+ */
8
+ var ContentModelCopyPastePlugin = /** @class */ (function () {
9
+ /**
10
+ * Construct a new instance of CopyPastePlugin
11
+ * @param options The editor options
12
+ */
13
+ function ContentModelCopyPastePlugin(state) {
14
+ var _this = this;
15
+ this.state = state;
16
+ this.editor = null;
17
+ this.disposer = null;
18
+ this.onPaste = function (event) {
19
+ if (_this.editor && isClipboardEvent(event)) {
20
+ var editor_1 = _this.editor;
21
+ var dataTransfer = event.clipboardData;
22
+ if (dataTransfer === null || dataTransfer === void 0 ? void 0 : dataTransfer.items) {
23
+ event.preventDefault();
24
+ (0, roosterjs_editor_dom_1.extractClipboardItems)((0, roosterjs_content_model_dom_1.toArray)(dataTransfer.items), {
25
+ allowedCustomPasteType: _this.state.allowedCustomPasteType,
26
+ }, true /*pasteNativeEvent*/).then(function (clipboardData) {
27
+ if (!editor_1.isDisposed()) {
28
+ (0, paste_1.paste)(editor_1, clipboardData);
29
+ }
30
+ });
31
+ }
32
+ }
33
+ };
34
+ }
35
+ /**
36
+ * Get a friendly name of this plugin
37
+ */
38
+ ContentModelCopyPastePlugin.prototype.getName = function () {
39
+ return 'ContentModelCopyPaste';
40
+ };
41
+ /**
42
+ * Initialize this plugin. This should only be called from Editor
43
+ * @param editor Editor instance
44
+ */
45
+ ContentModelCopyPastePlugin.prototype.initialize = function (editor) {
46
+ var _this = this;
47
+ this.editor = editor;
48
+ this.disposer = this.editor.addDomEventHandler({
49
+ paste: function (e) { return _this.onPaste(e); },
50
+ copy: function (e) { return _this.onCutCopy(e, false /*isCut*/); },
51
+ cut: function (e) { return _this.onCutCopy(e, true /*isCut*/); },
52
+ });
53
+ };
54
+ /**
55
+ * Dispose this plugin
56
+ */
57
+ ContentModelCopyPastePlugin.prototype.dispose = function () {
58
+ if (this.disposer) {
59
+ this.disposer();
60
+ }
61
+ this.disposer = null;
62
+ this.editor = null;
63
+ };
64
+ /**
65
+ * Get plugin state object
66
+ */
67
+ ContentModelCopyPastePlugin.prototype.getState = function () {
68
+ return this.state;
69
+ };
70
+ ContentModelCopyPastePlugin.prototype.onCutCopy = function (event, isCut) {
71
+ var _this = this;
72
+ if (!this.editor) {
73
+ return;
74
+ }
75
+ var doc = this.editor.getDocument();
76
+ var selection = this.editor.getDOMSelection();
77
+ if (selection && (selection.type != 'range' || !selection.range.collapsed)) {
78
+ var model = this.editor.createContentModel();
79
+ var pasteModel = (0, cloneModel_1.cloneModel)(model, {
80
+ includeCachedElement: this.editor.isDarkMode()
81
+ ? function (node, type) {
82
+ var _a;
83
+ if (type == 'cache') {
84
+ return undefined;
85
+ }
86
+ else {
87
+ var result = node.cloneNode(true /*deep*/);
88
+ (_a = _this.editor) === null || _a === void 0 ? void 0 : _a.transformToDarkColor(result, 1 /* DarkToLight */);
89
+ result.style.color = result.style.color || 'inherit';
90
+ result.style.backgroundColor =
91
+ result.style.backgroundColor || 'inherit';
92
+ return result;
93
+ }
94
+ }
95
+ : false,
96
+ });
97
+ if (selection.type === 'table') {
98
+ (0, iterateSelections_1.iterateSelections)(pasteModel, function (_, tableContext) {
99
+ if (tableContext === null || tableContext === void 0 ? void 0 : tableContext.table) {
100
+ var table = tableContext === null || tableContext === void 0 ? void 0 : tableContext.table;
101
+ table.rows = table.rows
102
+ .map(function (row) {
103
+ return (0, tslib_1.__assign)((0, tslib_1.__assign)({}, row), { cells: row.cells.filter(function (cell) { return cell.isSelected; }) });
104
+ })
105
+ .filter(function (row) { return row.cells.length > 0; });
106
+ return true;
107
+ }
108
+ return false;
109
+ });
110
+ }
111
+ var tempDiv_1 = this.getTempDiv(this.editor);
112
+ var selectionForCopy = (0, roosterjs_content_model_dom_1.contentModelToDom)(tempDiv_1.ownerDocument, tempDiv_1, pasteModel, (0, roosterjs_content_model_dom_1.createModelToDomContext)(), exports.onNodeCreated);
113
+ var newRange = selectionForCopy
114
+ ? domSelectionToRange(doc, selectionForCopy, tempDiv_1)
115
+ : null;
116
+ if (newRange) {
117
+ newRange = this.editor.triggerPluginEvent(9 /* BeforeCutCopy */, {
118
+ clonedRoot: tempDiv_1,
119
+ range: newRange,
120
+ rawEvent: event,
121
+ isCut: isCut,
122
+ }).range;
123
+ if (newRange) {
124
+ (0, addRangeToSelection_1.addRangeToSelection)(doc, newRange);
125
+ }
126
+ this.editor.runAsync(function (e) {
127
+ var editor = e;
128
+ cleanUpAndRestoreSelection(tempDiv_1);
129
+ editor.focus();
130
+ editor.setDOMSelection(selection);
131
+ if (isCut) {
132
+ editor.formatContentModel(function (model, context) {
133
+ if ((0, deleteSelection_1.deleteSelection)(model, [], context).deleteResult == 'range') {
134
+ (0, roosterjs_content_model_dom_1.normalizeContentModel)(model);
135
+ }
136
+ return true;
137
+ }, {
138
+ apiName: 'cut',
139
+ changeSource: ChangeSource_1.ChangeSource.Cut,
140
+ });
141
+ }
142
+ });
143
+ }
144
+ else {
145
+ cleanUpAndRestoreSelection(tempDiv_1);
146
+ }
147
+ }
148
+ };
149
+ ContentModelCopyPastePlugin.prototype.getTempDiv = function (editor) {
150
+ var div = editor.getCustomData('CopyPasteTempDiv', function () {
151
+ var tempDiv = editor.getDocument().createElement('div');
152
+ tempDiv.style.width = '600px';
153
+ tempDiv.style.height = '1px';
154
+ tempDiv.style.overflow = 'hidden';
155
+ tempDiv.style.position = 'fixed';
156
+ tempDiv.style.top = '0';
157
+ tempDiv.style.left = '0';
158
+ tempDiv.style.userSelect = 'text';
159
+ tempDiv.contentEditable = 'true';
160
+ editor.getDocument().body.appendChild(tempDiv);
161
+ return tempDiv;
162
+ }, function (tempDiv) { var _a; return (_a = tempDiv.parentNode) === null || _a === void 0 ? void 0 : _a.removeChild(tempDiv); });
163
+ div.style.backgroundColor = 'white';
164
+ div.style.color = 'black';
165
+ div.childNodes.forEach(function (node) { return div.removeChild(node); });
166
+ div.style.display = '';
167
+ div.focus();
168
+ return div;
169
+ };
170
+ return ContentModelCopyPastePlugin;
171
+ }());
172
+ exports.ContentModelCopyPastePlugin = ContentModelCopyPastePlugin;
173
+ function cleanUpAndRestoreSelection(tempDiv) {
174
+ tempDiv.style.backgroundColor = '';
175
+ tempDiv.style.color = '';
176
+ tempDiv.style.display = 'none';
177
+ (0, roosterjs_content_model_dom_1.moveChildNodes)(tempDiv);
178
+ }
179
+ function isClipboardEvent(event) {
180
+ return !!event.clipboardData;
181
+ }
182
+ function domSelectionToRange(doc, selection, tempDiv) {
183
+ var _a;
184
+ var newRange = null;
185
+ if (selection.type === 'table') {
186
+ var table = tempDiv.querySelector("#" + selection.table.id);
187
+ var elementToSelect = ((_a = table.parentElement) === null || _a === void 0 ? void 0 : _a.childElementCount) == 1 ? table.parentElement : table;
188
+ newRange = doc.createRange();
189
+ newRange.selectNode(elementToSelect);
190
+ }
191
+ else if (selection.type === 'image') {
192
+ var image = tempDiv.querySelector('#' + selection.image.id);
193
+ if (image) {
194
+ newRange = doc.createRange();
195
+ newRange.selectNode(image);
196
+ }
197
+ }
198
+ else {
199
+ newRange = selection.range;
200
+ }
201
+ return newRange;
202
+ }
203
+ /**
204
+ * @internal
205
+ * Exported only for unit testing
206
+ */
207
+ var onNodeCreated = function (_, node) {
208
+ if ((0, roosterjs_content_model_dom_1.isNodeOfType)(node, 'ELEMENT_NODE') && (0, roosterjs_content_model_dom_1.isElementOfType)(node, 'table')) {
209
+ (0, roosterjs_content_model_dom_1.wrap)(node.ownerDocument, node, 'div');
210
+ }
211
+ if ((0, roosterjs_content_model_dom_1.isNodeOfType)(node, 'ELEMENT_NODE') && !node.isContentEditable) {
212
+ node.removeAttribute('contenteditable');
213
+ }
214
+ };
215
+ exports.onNodeCreated = onNodeCreated;
216
+ /**
217
+ * @internal
218
+ * Create a new instance of ContentModelCopyPastePlugin
219
+ * @param state The plugin state object
220
+ */
221
+ function createContentModelCopyPastePlugin(state) {
222
+ return new ContentModelCopyPastePlugin(state);
223
+ }
224
+ exports.createContentModelCopyPastePlugin = createContentModelCopyPastePlugin;
225
+ });
226
+ //# sourceMappingURL=ContentModelCopyPastePlugin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ContentModelCopyPastePlugin.js","sourceRoot":"","sources":["../../../../packages-content-model/roosterjs-content-model-core/lib/corePlugin/ContentModelCopyPastePlugin.ts"],"names":[],"mappings":"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","sourcesContent":["import { addRangeToSelection } from './utils/addRangeToSelection';\nimport { ChangeSource } from '../constants/ChangeSource';\nimport { cloneModel } from '../publicApi/model/cloneModel';\nimport { ColorTransformDirection, PluginEventType } from 'roosterjs-editor-types';\nimport { deleteSelection } from '../publicApi/selection/deleteSelection';\nimport { extractClipboardItems } from 'roosterjs-editor-dom';\nimport { iterateSelections } from '../publicApi/selection/iterateSelections';\nimport { paste } from '../publicApi/model/paste';\nimport {\n contentModelToDom,\n createModelToDomContext,\n isElementOfType,\n isNodeOfType,\n moveChildNodes,\n normalizeContentModel,\n toArray,\n wrap,\n} from 'roosterjs-content-model-dom';\nimport type { DOMSelection, IStandaloneEditor, OnNodeCreated } from 'roosterjs-content-model-types';\nimport type {\n CopyPastePluginState,\n IEditor,\n PluginWithState,\n ClipboardData,\n} from 'roosterjs-editor-types';\n\n/**\n * Copy and paste plugin for handling onCopy and onPaste event\n */\nexport class ContentModelCopyPastePlugin implements PluginWithState<CopyPastePluginState> {\n private editor: (IStandaloneEditor & IEditor) | null = null;\n private disposer: (() => void) | null = null;\n\n /**\n * Construct a new instance of CopyPastePlugin\n * @param options The editor options\n */\n constructor(private state: CopyPastePluginState) {}\n\n /**\n * Get a friendly name of this plugin\n */\n getName() {\n return 'ContentModelCopyPaste';\n }\n\n /**\n * Initialize this plugin. This should only be called from Editor\n * @param editor Editor instance\n */\n initialize(editor: IEditor) {\n this.editor = editor as IStandaloneEditor & IEditor;\n this.disposer = this.editor.addDomEventHandler({\n paste: e => this.onPaste(e),\n copy: e => this.onCutCopy(e, false /*isCut*/),\n cut: e => this.onCutCopy(e, true /*isCut*/),\n });\n }\n\n /**\n * Dispose this plugin\n */\n dispose() {\n if (this.disposer) {\n this.disposer();\n }\n this.disposer = null;\n this.editor = null;\n }\n\n /**\n * Get plugin state object\n */\n getState() {\n return this.state;\n }\n\n private onCutCopy(event: Event, isCut: boolean) {\n if (!this.editor) {\n return;\n }\n\n const doc = this.editor.getDocument();\n const selection = this.editor.getDOMSelection();\n\n if (selection && (selection.type != 'range' || !selection.range.collapsed)) {\n const model = this.editor.createContentModel();\n\n const pasteModel = cloneModel(model, {\n includeCachedElement: this.editor.isDarkMode()\n ? (node, type) => {\n if (type == 'cache') {\n return undefined;\n } else {\n const result = node.cloneNode(true /*deep*/) as HTMLElement;\n\n this.editor?.transformToDarkColor(\n result,\n ColorTransformDirection.DarkToLight\n );\n\n result.style.color = result.style.color || 'inherit';\n result.style.backgroundColor =\n result.style.backgroundColor || 'inherit';\n\n return result;\n }\n }\n : false,\n });\n if (selection.type === 'table') {\n iterateSelections(pasteModel, (_, tableContext) => {\n if (tableContext?.table) {\n const table = tableContext?.table;\n table.rows = table.rows\n .map(row => {\n return {\n ...row,\n cells: row.cells.filter(cell => cell.isSelected),\n };\n })\n .filter(row => row.cells.length > 0);\n return true;\n }\n return false;\n });\n }\n const tempDiv = this.getTempDiv(this.editor);\n const selectionForCopy = contentModelToDom(\n tempDiv.ownerDocument,\n tempDiv,\n pasteModel,\n createModelToDomContext(),\n onNodeCreated\n );\n\n let newRange: Range | null = selectionForCopy\n ? domSelectionToRange(doc, selectionForCopy, tempDiv)\n : null;\n if (newRange) {\n newRange = this.editor.triggerPluginEvent(PluginEventType.BeforeCutCopy, {\n clonedRoot: tempDiv,\n range: newRange,\n rawEvent: event as ClipboardEvent,\n isCut,\n }).range;\n\n if (newRange) {\n addRangeToSelection(doc, newRange);\n }\n\n this.editor.runAsync(e => {\n const editor = e as IStandaloneEditor & IEditor;\n\n cleanUpAndRestoreSelection(tempDiv);\n editor.focus();\n editor.setDOMSelection(selection);\n\n if (isCut) {\n editor.formatContentModel(\n (model, context) => {\n if (deleteSelection(model, [], context).deleteResult == 'range') {\n normalizeContentModel(model);\n }\n\n return true;\n },\n {\n apiName: 'cut',\n changeSource: ChangeSource.Cut,\n }\n );\n }\n });\n } else {\n cleanUpAndRestoreSelection(tempDiv);\n }\n }\n }\n\n private onPaste = (event: Event) => {\n if (this.editor && isClipboardEvent(event)) {\n const editor = this.editor;\n\n const dataTransfer = event.clipboardData;\n\n if (dataTransfer?.items) {\n event.preventDefault();\n extractClipboardItems(\n toArray(dataTransfer.items),\n {\n allowedCustomPasteType: this.state.allowedCustomPasteType,\n },\n true /*pasteNativeEvent*/\n ).then((clipboardData: ClipboardData) => {\n if (!editor.isDisposed()) {\n paste(editor, clipboardData);\n }\n });\n }\n }\n };\n\n private getTempDiv(editor: IEditor) {\n const div = editor.getCustomData(\n 'CopyPasteTempDiv',\n () => {\n const tempDiv = editor.getDocument().createElement('div');\n\n tempDiv.style.width = '600px';\n tempDiv.style.height = '1px';\n tempDiv.style.overflow = 'hidden';\n tempDiv.style.position = 'fixed';\n tempDiv.style.top = '0';\n tempDiv.style.left = '0';\n tempDiv.style.userSelect = 'text';\n tempDiv.contentEditable = 'true';\n\n editor.getDocument().body.appendChild(tempDiv);\n\n return tempDiv;\n },\n tempDiv => tempDiv.parentNode?.removeChild(tempDiv)\n );\n\n div.style.backgroundColor = 'white';\n div.style.color = 'black';\n div.childNodes.forEach(node => div.removeChild(node));\n\n div.style.display = '';\n div.focus();\n\n return div;\n }\n}\n\nfunction cleanUpAndRestoreSelection(tempDiv: HTMLDivElement) {\n tempDiv.style.backgroundColor = '';\n tempDiv.style.color = '';\n tempDiv.style.display = 'none';\n moveChildNodes(tempDiv);\n}\n\nfunction isClipboardEvent(event: Event): event is ClipboardEvent {\n return !!(event as ClipboardEvent).clipboardData;\n}\n\nfunction domSelectionToRange(\n doc: Document,\n selection: DOMSelection,\n tempDiv: HTMLDivElement\n): Range | null {\n let newRange: Range | null = null;\n\n if (selection.type === 'table') {\n const table = tempDiv.querySelector(`#${selection.table.id}`) as HTMLTableElement;\n const elementToSelect =\n table.parentElement?.childElementCount == 1 ? table.parentElement : table;\n\n newRange = doc.createRange();\n newRange.selectNode(elementToSelect);\n } else if (selection.type === 'image') {\n const image = tempDiv.querySelector('#' + selection.image.id);\n\n if (image) {\n newRange = doc.createRange();\n newRange.selectNode(image);\n }\n } else {\n newRange = selection.range;\n }\n\n return newRange;\n}\n\n/**\n * @internal\n * Exported only for unit testing\n */\nexport const onNodeCreated: OnNodeCreated = (_, node): void => {\n if (isNodeOfType(node, 'ELEMENT_NODE') && isElementOfType(node, 'table')) {\n wrap(node.ownerDocument, node, 'div');\n }\n if (isNodeOfType(node, 'ELEMENT_NODE') && !node.isContentEditable) {\n node.removeAttribute('contenteditable');\n }\n};\n\n/**\n * @internal\n * Create a new instance of ContentModelCopyPastePlugin\n * @param state The plugin state object\n */\nexport function createContentModelCopyPastePlugin(state: CopyPastePluginState) {\n return new ContentModelCopyPastePlugin(state);\n}\n"]}
@@ -0,0 +1,59 @@
1
+ import type { IEditor, PluginEvent, PluginWithState } from 'roosterjs-editor-types';
2
+ import type { ContentModelFormatPluginState } from 'roosterjs-content-model-types';
3
+ /**
4
+ * ContentModelFormat plugins helps editor to do formatting on top of content model.
5
+ * This includes:
6
+ * 1. Handle pending format changes when selection is collapsed
7
+ */
8
+ export declare class ContentModelFormatPlugin implements PluginWithState<ContentModelFormatPluginState> {
9
+ private state;
10
+ private editor;
11
+ private hasDefaultFormat;
12
+ /**
13
+ * Construct a new instance of ContentModelEditPlugin class
14
+ * @param state State of this plugin
15
+ */
16
+ constructor(state: ContentModelFormatPluginState);
17
+ /**
18
+ * Get name of this plugin
19
+ */
20
+ getName(): string;
21
+ /**
22
+ * The first method that editor will call to a plugin when editor is initializing.
23
+ * It will pass in the editor instance, plugin should take this chance to save the
24
+ * editor reference so that it can call to any editor method or format API later.
25
+ * @param editor The editor object
26
+ */
27
+ initialize(editor: IEditor): void;
28
+ /**
29
+ * The last method that editor will call to a plugin before it is disposed.
30
+ * Plugin can take this chance to clear the reference to editor. After this method is
31
+ * called, plugin should not call to any editor method since it will result in error.
32
+ */
33
+ dispose(): void;
34
+ /**
35
+ * Get plugin state object
36
+ */
37
+ getState(): ContentModelFormatPluginState;
38
+ /**
39
+ * Core method for a plugin. Once an event happens in editor, editor will call this
40
+ * method of each plugin to handle the event as long as the event is not handled
41
+ * exclusively by another plugin.
42
+ * @param event The event to handle:
43
+ */
44
+ onPluginEvent(event: PluginEvent): void;
45
+ private checkAndApplyPendingFormat;
46
+ private clearPendingFormat;
47
+ /**
48
+ * @internal
49
+ * Check if this editor can apply pending format
50
+ * @param editor The editor to get format from
51
+ */
52
+ private canApplyPendingFormat;
53
+ }
54
+ /**
55
+ * @internal
56
+ * Create a new instance of ContentModelFormatPlugin.
57
+ * This is mostly for unit test
58
+ */
59
+ export declare function createContentModelFormatPlugin(state: ContentModelFormatPluginState): ContentModelFormatPlugin;