roosterjs-content-model-plugins 9.26.0 → 9.29.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 (226) hide show
  1. package/lib/autoFormat/AutoFormatPlugin.d.ts +4 -1
  2. package/lib/autoFormat/AutoFormatPlugin.js +94 -96
  3. package/lib/autoFormat/AutoFormatPlugin.js.map +1 -1
  4. package/lib/autoFormat/horizontalLine/checkAndInsertHorizontalLine.d.ts +3 -3
  5. package/lib/autoFormat/horizontalLine/checkAndInsertHorizontalLine.js +14 -21
  6. package/lib/autoFormat/horizontalLine/checkAndInsertHorizontalLine.js.map +1 -1
  7. package/lib/edit/EditPlugin.d.ts +9 -0
  8. package/lib/edit/EditPlugin.js +21 -3
  9. package/lib/edit/EditPlugin.js.map +1 -1
  10. package/lib/edit/inputSteps/handleEnterOnList.js +1 -0
  11. package/lib/edit/inputSteps/handleEnterOnList.js.map +1 -1
  12. package/lib/edit/keyboardEnter.js +7 -3
  13. package/lib/edit/keyboardEnter.js.map +1 -1
  14. package/lib/edit/tabUtils/handleTabOnParagraph.d.ts +1 -1
  15. package/lib/edit/tabUtils/handleTabOnParagraph.js +8 -3
  16. package/lib/edit/tabUtils/handleTabOnParagraph.js.map +1 -1
  17. package/lib/edit/utils/splitParagraph.d.ts +1 -0
  18. package/lib/edit/utils/splitParagraph.js +8 -4
  19. package/lib/edit/utils/splitParagraph.js.map +1 -1
  20. package/lib/imageEdit/ImageEditPlugin.js +9 -9
  21. package/lib/imageEdit/ImageEditPlugin.js.map +1 -1
  22. package/lib/imageEdit/utils/findEditingImage.d.ts +4 -0
  23. package/lib/imageEdit/utils/findEditingImage.js +7 -2
  24. package/lib/imageEdit/utils/findEditingImage.js.map +1 -1
  25. package/lib/index.d.ts +1 -0
  26. package/lib/index.js.map +1 -1
  27. package/lib/paste/PastePlugin.js +7 -4
  28. package/lib/paste/PastePlugin.js.map +1 -1
  29. package/lib/paste/PowerPoint/processPastedContentFromPowerPoint.js +132 -1
  30. package/lib/paste/PowerPoint/processPastedContentFromPowerPoint.js.map +1 -1
  31. package/lib/paste/WordDesktop/getStyleMetadata.d.ts +2 -2
  32. package/lib/paste/WordDesktop/getStyleMetadata.js +33 -5
  33. package/lib/paste/WordDesktop/getStyleMetadata.js.map +1 -1
  34. package/lib/paste/WordDesktop/processPastedContentFromWordDesktop.d.ts +2 -2
  35. package/lib/paste/WordDesktop/processPastedContentFromWordDesktop.js +5 -5
  36. package/lib/paste/WordDesktop/processPastedContentFromWordDesktop.js.map +1 -1
  37. package/lib/paste/WordDesktop/processWordLists.js +34 -61
  38. package/lib/paste/WordDesktop/processWordLists.js.map +1 -1
  39. package/lib/paste/parsers/deprecatedColorParser.js.map +1 -0
  40. package/lib/paste/parsers/linkParser.js.map +1 -0
  41. package/lib/paste/{WordDesktop → parsers}/removeNegativeTextIndentParser.js +1 -1
  42. package/lib/paste/parsers/removeNegativeTextIndentParser.js.map +1 -0
  43. package/lib/paste/pasteSourceValidations/getPasteSource.d.ts +3 -2
  44. package/lib/paste/pasteSourceValidations/getPasteSource.js +2 -1
  45. package/lib/paste/pasteSourceValidations/getPasteSource.js.map +1 -1
  46. package/lib/paste/pasteSourceValidations/isWordDesktopDocument.js +7 -2
  47. package/lib/paste/pasteSourceValidations/isWordDesktopDocument.js.map +1 -1
  48. package/lib/paste/processors/pasteButtonProcessor.d.ts +7 -0
  49. package/lib/paste/processors/pasteButtonProcessor.js +36 -0
  50. package/lib/paste/processors/pasteButtonProcessor.js.map +1 -0
  51. package/lib/paste/utils/customListUtils.d.ts +9 -0
  52. package/lib/paste/utils/customListUtils.js +63 -0
  53. package/lib/paste/utils/customListUtils.js.map +1 -0
  54. package/lib/tableEdit/TableEditPlugin.d.ts +7 -4
  55. package/lib/tableEdit/TableEditPlugin.js +28 -17
  56. package/lib/tableEdit/TableEditPlugin.js.map +1 -1
  57. package/lib/tableEdit/TableWithRoot.d.ts +15 -0
  58. package/lib/tableEdit/TableWithRoot.js +3 -0
  59. package/lib/tableEdit/TableWithRoot.js.map +1 -0
  60. package/lib/tableEdit/editors/TableEditor.d.ts +4 -2
  61. package/lib/tableEdit/editors/TableEditor.js +9 -3
  62. package/lib/tableEdit/editors/TableEditor.js.map +1 -1
  63. package/lib/tableEdit/editors/features/TableInserter.d.ts +4 -3
  64. package/lib/tableEdit/editors/features/TableInserter.js +7 -5
  65. package/lib/tableEdit/editors/features/TableInserter.js.map +1 -1
  66. package/lib/watermark/WatermarkPlugin.js +1 -1
  67. package/lib/watermark/WatermarkPlugin.js.map +1 -1
  68. package/lib-amd/autoFormat/AutoFormatPlugin.d.ts +4 -1
  69. package/lib-amd/autoFormat/AutoFormatPlugin.js +94 -96
  70. package/lib-amd/autoFormat/AutoFormatPlugin.js.map +1 -1
  71. package/lib-amd/autoFormat/horizontalLine/checkAndInsertHorizontalLine.d.ts +3 -3
  72. package/lib-amd/autoFormat/horizontalLine/checkAndInsertHorizontalLine.js +15 -21
  73. package/lib-amd/autoFormat/horizontalLine/checkAndInsertHorizontalLine.js.map +1 -1
  74. package/lib-amd/edit/EditPlugin.d.ts +9 -0
  75. package/lib-amd/edit/EditPlugin.js +21 -4
  76. package/lib-amd/edit/EditPlugin.js.map +1 -1
  77. package/lib-amd/edit/inputSteps/handleEnterOnList.js +1 -0
  78. package/lib-amd/edit/inputSteps/handleEnterOnList.js.map +1 -1
  79. package/lib-amd/edit/keyboardEnter.js +7 -3
  80. package/lib-amd/edit/keyboardEnter.js.map +1 -1
  81. package/lib-amd/edit/tabUtils/handleTabOnParagraph.d.ts +1 -1
  82. package/lib-amd/edit/tabUtils/handleTabOnParagraph.js +8 -3
  83. package/lib-amd/edit/tabUtils/handleTabOnParagraph.js.map +1 -1
  84. package/lib-amd/edit/utils/splitParagraph.d.ts +1 -0
  85. package/lib-amd/edit/utils/splitParagraph.js +8 -4
  86. package/lib-amd/edit/utils/splitParagraph.js.map +1 -1
  87. package/lib-amd/imageEdit/ImageEditPlugin.js +9 -9
  88. package/lib-amd/imageEdit/ImageEditPlugin.js.map +1 -1
  89. package/lib-amd/imageEdit/utils/findEditingImage.d.ts +4 -0
  90. package/lib-amd/imageEdit/utils/findEditingImage.js +7 -2
  91. package/lib-amd/imageEdit/utils/findEditingImage.js.map +1 -1
  92. package/lib-amd/index.d.ts +1 -0
  93. package/lib-amd/index.js.map +1 -1
  94. package/lib-amd/paste/PastePlugin.js +4 -3
  95. package/lib-amd/paste/PastePlugin.js.map +1 -1
  96. package/lib-amd/paste/PowerPoint/processPastedContentFromPowerPoint.js +128 -2
  97. package/lib-amd/paste/PowerPoint/processPastedContentFromPowerPoint.js.map +1 -1
  98. package/lib-amd/paste/WordDesktop/getStyleMetadata.d.ts +2 -2
  99. package/lib-amd/paste/WordDesktop/getStyleMetadata.js +33 -5
  100. package/lib-amd/paste/WordDesktop/getStyleMetadata.js.map +1 -1
  101. package/lib-amd/paste/WordDesktop/processPastedContentFromWordDesktop.d.ts +2 -2
  102. package/lib-amd/paste/WordDesktop/processPastedContentFromWordDesktop.js +5 -5
  103. package/lib-amd/paste/WordDesktop/processPastedContentFromWordDesktop.js.map +1 -1
  104. package/lib-amd/paste/WordDesktop/processWordLists.js +34 -61
  105. package/lib-amd/paste/WordDesktop/processWordLists.js.map +1 -1
  106. package/lib-amd/paste/parsers/deprecatedColorParser.js.map +1 -0
  107. package/lib-amd/paste/parsers/linkParser.js.map +1 -0
  108. package/lib-amd/paste/{WordDesktop → parsers}/removeNegativeTextIndentParser.js +1 -1
  109. package/lib-amd/paste/parsers/removeNegativeTextIndentParser.js.map +1 -0
  110. package/lib-amd/paste/pasteSourceValidations/getPasteSource.d.ts +3 -2
  111. package/lib-amd/paste/pasteSourceValidations/getPasteSource.js +2 -1
  112. package/lib-amd/paste/pasteSourceValidations/getPasteSource.js.map +1 -1
  113. package/lib-amd/paste/pasteSourceValidations/isWordDesktopDocument.js +7 -2
  114. package/lib-amd/paste/pasteSourceValidations/isWordDesktopDocument.js.map +1 -1
  115. package/lib-amd/paste/processors/pasteButtonProcessor.d.ts +7 -0
  116. package/lib-amd/paste/processors/pasteButtonProcessor.js +36 -0
  117. package/lib-amd/paste/processors/pasteButtonProcessor.js.map +1 -0
  118. package/lib-amd/paste/utils/customListUtils.d.ts +9 -0
  119. package/lib-amd/paste/utils/customListUtils.js +63 -0
  120. package/lib-amd/paste/utils/customListUtils.js.map +1 -0
  121. package/lib-amd/tableEdit/TableEditPlugin.d.ts +7 -4
  122. package/lib-amd/tableEdit/TableEditPlugin.js +28 -18
  123. package/lib-amd/tableEdit/TableEditPlugin.js.map +1 -1
  124. package/lib-amd/tableEdit/TableWithRoot.d.ts +15 -0
  125. package/lib-amd/tableEdit/TableWithRoot.js +5 -0
  126. package/lib-amd/tableEdit/TableWithRoot.js.map +1 -0
  127. package/lib-amd/tableEdit/editors/TableEditor.d.ts +4 -2
  128. package/lib-amd/tableEdit/editors/TableEditor.js +9 -3
  129. package/lib-amd/tableEdit/editors/TableEditor.js.map +1 -1
  130. package/lib-amd/tableEdit/editors/features/TableInserter.d.ts +4 -3
  131. package/lib-amd/tableEdit/editors/features/TableInserter.js +7 -5
  132. package/lib-amd/tableEdit/editors/features/TableInserter.js.map +1 -1
  133. package/lib-amd/watermark/WatermarkPlugin.js +1 -1
  134. package/lib-amd/watermark/WatermarkPlugin.js.map +1 -1
  135. package/lib-mjs/autoFormat/AutoFormatPlugin.d.ts +4 -1
  136. package/lib-mjs/autoFormat/AutoFormatPlugin.js +95 -97
  137. package/lib-mjs/autoFormat/AutoFormatPlugin.js.map +1 -1
  138. package/lib-mjs/autoFormat/horizontalLine/checkAndInsertHorizontalLine.d.ts +3 -3
  139. package/lib-mjs/autoFormat/horizontalLine/checkAndInsertHorizontalLine.js +15 -22
  140. package/lib-mjs/autoFormat/horizontalLine/checkAndInsertHorizontalLine.js.map +1 -1
  141. package/lib-mjs/edit/EditPlugin.d.ts +9 -0
  142. package/lib-mjs/edit/EditPlugin.js +21 -3
  143. package/lib-mjs/edit/EditPlugin.js.map +1 -1
  144. package/lib-mjs/edit/inputSteps/handleEnterOnList.js +2 -1
  145. package/lib-mjs/edit/inputSteps/handleEnterOnList.js.map +1 -1
  146. package/lib-mjs/edit/keyboardEnter.js +7 -3
  147. package/lib-mjs/edit/keyboardEnter.js.map +1 -1
  148. package/lib-mjs/edit/tabUtils/handleTabOnParagraph.d.ts +1 -1
  149. package/lib-mjs/edit/tabUtils/handleTabOnParagraph.js +8 -3
  150. package/lib-mjs/edit/tabUtils/handleTabOnParagraph.js.map +1 -1
  151. package/lib-mjs/edit/utils/splitParagraph.d.ts +1 -0
  152. package/lib-mjs/edit/utils/splitParagraph.js +9 -5
  153. package/lib-mjs/edit/utils/splitParagraph.js.map +1 -1
  154. package/lib-mjs/imageEdit/ImageEditPlugin.js +11 -11
  155. package/lib-mjs/imageEdit/ImageEditPlugin.js.map +1 -1
  156. package/lib-mjs/imageEdit/utils/findEditingImage.d.ts +4 -0
  157. package/lib-mjs/imageEdit/utils/findEditingImage.js +6 -1
  158. package/lib-mjs/imageEdit/utils/findEditingImage.js.map +1 -1
  159. package/lib-mjs/index.d.ts +1 -0
  160. package/lib-mjs/index.js.map +1 -1
  161. package/lib-mjs/paste/PastePlugin.js +7 -4
  162. package/lib-mjs/paste/PastePlugin.js.map +1 -1
  163. package/lib-mjs/paste/PowerPoint/processPastedContentFromPowerPoint.js +133 -2
  164. package/lib-mjs/paste/PowerPoint/processPastedContentFromPowerPoint.js.map +1 -1
  165. package/lib-mjs/paste/WordDesktop/getStyleMetadata.d.ts +2 -2
  166. package/lib-mjs/paste/WordDesktop/getStyleMetadata.js +33 -5
  167. package/lib-mjs/paste/WordDesktop/getStyleMetadata.js.map +1 -1
  168. package/lib-mjs/paste/WordDesktop/processPastedContentFromWordDesktop.d.ts +2 -2
  169. package/lib-mjs/paste/WordDesktop/processPastedContentFromWordDesktop.js +5 -5
  170. package/lib-mjs/paste/WordDesktop/processPastedContentFromWordDesktop.js.map +1 -1
  171. package/lib-mjs/paste/WordDesktop/processWordLists.js +35 -62
  172. package/lib-mjs/paste/WordDesktop/processWordLists.js.map +1 -1
  173. package/lib-mjs/paste/parsers/deprecatedColorParser.js.map +1 -0
  174. package/lib-mjs/paste/parsers/linkParser.js.map +1 -0
  175. package/lib-mjs/paste/{WordDesktop → parsers}/removeNegativeTextIndentParser.js +1 -1
  176. package/lib-mjs/paste/parsers/removeNegativeTextIndentParser.js.map +1 -0
  177. package/lib-mjs/paste/pasteSourceValidations/getPasteSource.d.ts +3 -2
  178. package/lib-mjs/paste/pasteSourceValidations/getPasteSource.js +2 -1
  179. package/lib-mjs/paste/pasteSourceValidations/getPasteSource.js.map +1 -1
  180. package/lib-mjs/paste/pasteSourceValidations/isWordDesktopDocument.js +7 -2
  181. package/lib-mjs/paste/pasteSourceValidations/isWordDesktopDocument.js.map +1 -1
  182. package/lib-mjs/paste/processors/pasteButtonProcessor.d.ts +7 -0
  183. package/lib-mjs/paste/processors/pasteButtonProcessor.js +32 -0
  184. package/lib-mjs/paste/processors/pasteButtonProcessor.js.map +1 -0
  185. package/lib-mjs/paste/utils/customListUtils.d.ts +9 -0
  186. package/lib-mjs/paste/utils/customListUtils.js +58 -0
  187. package/lib-mjs/paste/utils/customListUtils.js.map +1 -0
  188. package/lib-mjs/tableEdit/TableEditPlugin.d.ts +7 -4
  189. package/lib-mjs/tableEdit/TableEditPlugin.js +28 -17
  190. package/lib-mjs/tableEdit/TableEditPlugin.js.map +1 -1
  191. package/lib-mjs/tableEdit/TableWithRoot.d.ts +15 -0
  192. package/lib-mjs/tableEdit/TableWithRoot.js +2 -0
  193. package/lib-mjs/tableEdit/TableWithRoot.js.map +1 -0
  194. package/lib-mjs/tableEdit/editors/TableEditor.d.ts +4 -2
  195. package/lib-mjs/tableEdit/editors/TableEditor.js +9 -3
  196. package/lib-mjs/tableEdit/editors/TableEditor.js.map +1 -1
  197. package/lib-mjs/tableEdit/editors/features/TableInserter.d.ts +4 -3
  198. package/lib-mjs/tableEdit/editors/features/TableInserter.js +7 -5
  199. package/lib-mjs/tableEdit/editors/features/TableInserter.js.map +1 -1
  200. package/lib-mjs/watermark/WatermarkPlugin.js +1 -1
  201. package/lib-mjs/watermark/WatermarkPlugin.js.map +1 -1
  202. package/package.json +5 -5
  203. package/lib/paste/WordDesktop/removeNegativeTextIndentParser.js.map +0 -1
  204. package/lib/paste/utils/deprecatedColorParser.js.map +0 -1
  205. package/lib/paste/utils/linkParser.js.map +0 -1
  206. package/lib-amd/paste/WordDesktop/removeNegativeTextIndentParser.js.map +0 -1
  207. package/lib-amd/paste/utils/deprecatedColorParser.js.map +0 -1
  208. package/lib-amd/paste/utils/linkParser.js.map +0 -1
  209. package/lib-mjs/paste/WordDesktop/removeNegativeTextIndentParser.js.map +0 -1
  210. package/lib-mjs/paste/utils/deprecatedColorParser.js.map +0 -1
  211. package/lib-mjs/paste/utils/linkParser.js.map +0 -1
  212. /package/lib/paste/{utils → parsers}/deprecatedColorParser.d.ts +0 -0
  213. /package/lib/paste/{utils → parsers}/deprecatedColorParser.js +0 -0
  214. /package/lib/paste/{utils → parsers}/linkParser.d.ts +0 -0
  215. /package/lib/paste/{utils → parsers}/linkParser.js +0 -0
  216. /package/lib/paste/{WordDesktop → parsers}/removeNegativeTextIndentParser.d.ts +0 -0
  217. /package/lib-amd/paste/{utils → parsers}/deprecatedColorParser.d.ts +0 -0
  218. /package/lib-amd/paste/{utils → parsers}/deprecatedColorParser.js +0 -0
  219. /package/lib-amd/paste/{utils → parsers}/linkParser.d.ts +0 -0
  220. /package/lib-amd/paste/{utils → parsers}/linkParser.js +0 -0
  221. /package/lib-amd/paste/{WordDesktop → parsers}/removeNegativeTextIndentParser.d.ts +0 -0
  222. /package/lib-mjs/paste/{utils → parsers}/deprecatedColorParser.d.ts +0 -0
  223. /package/lib-mjs/paste/{utils → parsers}/deprecatedColorParser.js +0 -0
  224. /package/lib-mjs/paste/{utils → parsers}/linkParser.d.ts +0 -0
  225. /package/lib-mjs/paste/{utils → parsers}/linkParser.js +0 -0
  226. /package/lib-mjs/paste/{WordDesktop → parsers}/removeNegativeTextIndentParser.d.ts +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"findEditingImage.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-plugins/lib/imageEdit/utils/findEditingImage.ts"],"names":[],"mappings":";;;;AAAA,2EAAsE;AAOtE;;GAEG;AACH,SAAgB,gBAAgB,CAC5B,KAAqC,EACrC,OAAgB;IAEhB,IAAI,iBAAiB,GAA6B,IAAI,CAAC;IACvD,IAAA,qDAAuB,EACnB,KAAK,EACL,WAAW,EACX,UAAC,SAAwC;;;YACrC,KAAsB,IAAA,KAAA,sBAAA,SAAS,CAAC,QAAQ,CAAA,gBAAA,4BAAE;gBAArC,IAAM,OAAO,WAAA;gBACd,IACI,OAAO,CAAC,WAAW,IAAI,OAAO;oBAC9B,CAAC,CAAC,OAAO,IAAI,OAAO,CAAC,MAAM,CAAC,EAAE,IAAI,OAAO,CAAC,IAAI,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,EAC1E;oBACE,iBAAiB,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE,SAAS,WAAA,EAAE,CAAC;oBAClD,OAAO,IAAI,CAAC;iBACf;aACJ;;;;;;;;;QACD,OAAO,KAAK,CAAC;IACjB,CAAC,EACD,IAAI,CAAC,iBAAiB,CACzB,CAAC;IAEF,OAAO,iBAAiB,CAAC;AAC7B,CAAC;AAxBD,4CAwBC","sourcesContent":["import { queryContentModelBlocks } from 'roosterjs-content-model-api';\nimport type {\n ReadonlyContentModelBlockGroup,\n ReadonlyContentModelParagraph,\n} from 'roosterjs-content-model-types';\nimport type { ImageAndParagraph } from '../types/ImageAndParagraph';\n\n/**\n * @internal\n */\nexport function findEditingImage(\n group: ReadonlyContentModelBlockGroup,\n imageId?: string\n): ImageAndParagraph | null {\n let imageAndParagraph: ImageAndParagraph | null = null;\n queryContentModelBlocks<ReadonlyContentModelParagraph>(\n group,\n 'Paragraph',\n (paragraph: ReadonlyContentModelParagraph): paragraph is ReadonlyContentModelParagraph => {\n for (const segment of paragraph.segments) {\n if (\n segment.segmentType == 'Image' &&\n ((imageId && segment.format.id == imageId) || segment.dataset.isEditing)\n ) {\n imageAndParagraph = { image: segment, paragraph };\n return true;\n }\n }\n return false;\n },\n true /*findFirstOnly*/\n );\n\n return imageAndParagraph;\n}\n"]}
1
+ {"version":3,"file":"findEditingImage.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-plugins/lib/imageEdit/utils/findEditingImage.ts"],"names":[],"mappings":";;;;AAAA,2EAAsE;AAOtE;;GAEG;AACU,QAAA,cAAc,GAAG,WAAW,CAAC;AAE1C;;GAEG;AACH,SAAgB,gBAAgB,CAC5B,KAAqC,EACrC,OAAgB;IAEhB,IAAI,iBAAiB,GAA6B,IAAI,CAAC;IACvD,IAAA,qDAAuB,EACnB,KAAK,EACL,WAAW,EACX,UAAC,SAAwC;;;YACrC,KAAsB,IAAA,KAAA,sBAAA,SAAS,CAAC,QAAQ,CAAA,gBAAA,4BAAE;gBAArC,IAAM,OAAO,WAAA;gBACd,IACI,OAAO,CAAC,WAAW,IAAI,OAAO;oBAC9B,CAAC,CAAC,OAAO,IAAI,OAAO,CAAC,MAAM,CAAC,EAAE,IAAI,OAAO,CAAC;wBACtC,OAAO,CAAC,MAAM,CAAC,UAAU,IAAI,sBAAc,CAAC,EAClD;oBACE,iBAAiB,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE,SAAS,WAAA,EAAE,CAAC;oBAClD,OAAO,IAAI,CAAC;iBACf;aACJ;;;;;;;;;QACD,OAAO,KAAK,CAAC;IACjB,CAAC,EACD,IAAI,CAAC,iBAAiB,CACzB,CAAC;IAEF,OAAO,iBAAiB,CAAC;AAC7B,CAAC;AAzBD,4CAyBC","sourcesContent":["import { queryContentModelBlocks } from 'roosterjs-content-model-api';\nimport type {\n ReadonlyContentModelBlockGroup,\n ReadonlyContentModelParagraph,\n} from 'roosterjs-content-model-types';\nimport type { ImageAndParagraph } from '../types/ImageAndParagraph';\n\n/**\n * @internal\n */\nexport const EDITING_MARKER = 'isEditing';\n\n/**\n * @internal\n */\nexport function findEditingImage(\n group: ReadonlyContentModelBlockGroup,\n imageId?: string\n): ImageAndParagraph | null {\n let imageAndParagraph: ImageAndParagraph | null = null;\n queryContentModelBlocks<ReadonlyContentModelParagraph>(\n group,\n 'Paragraph',\n (paragraph: ReadonlyContentModelParagraph): paragraph is ReadonlyContentModelParagraph => {\n for (const segment of paragraph.segments) {\n if (\n segment.segmentType == 'Image' &&\n ((imageId && segment.format.id == imageId) ||\n segment.format.imageState == EDITING_MARKER)\n ) {\n imageAndParagraph = { image: segment, paragraph };\n return true;\n }\n }\n return false;\n },\n true /*findFirstOnly*/\n );\n\n return imageAndParagraph;\n}\n"]}
package/lib/index.d.ts CHANGED
@@ -1,6 +1,7 @@
1
1
  export { TableEditPlugin } from './tableEdit/TableEditPlugin';
2
2
  export { OnTableEditorCreatedCallback } from './tableEdit/OnTableEditorCreatedCallback';
3
3
  export { TableEditFeatureName } from './tableEdit/editors/features/TableEditFeatureName';
4
+ export { TableWithRoot } from './tableEdit/TableWithRoot';
4
5
  export { PastePlugin } from './paste/PastePlugin';
5
6
  export { DefaultSanitizers } from './paste/DefaultSanitizers';
6
7
  export { EditPlugin, EditOptions } from './edit/EditPlugin';
package/lib/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../packages/roosterjs-content-model-plugins/lib/index.ts"],"names":[],"mappings":";;;AAAA,+DAA8D;AAArD,kHAAA,eAAe,OAAA;AAGxB,mDAAkD;AAAzC,0GAAA,WAAW,OAAA;AACpB,+DAA8D;AAArD,sHAAA,iBAAiB,OAAA;AAC1B,gDAA4D;AAAnD,wGAAA,UAAU,OAAA;AACnB,kEAAiE;AAAxD,oHAAA,gBAAgB,OAAA;AAGzB,kDAgB8B;AAf1B,yGAAA,YAAY,OAAA;AACZ,2GAAA,cAAc,OAAA;AACd,8GAAA,iBAAiB,OAAA;AACjB,gHAAA,mBAAmB,OAAA;AACnB,yGAAA,YAAY,OAAA;AACZ,0GAAA,aAAa,OAAA;AACb,yGAAA,YAAY,OAAA;AACZ,4GAAA,eAAe,OAAA;AACf,8GAAA,iBAAiB,OAAA;AACjB,2GAAA,cAAc,OAAA;AACd,8GAAA,iBAAiB,OAAA;AACjB,iHAAA,oBAAoB,OAAA;AACpB,iHAAA,oBAAoB,OAAA;AACpB,+GAAA,kBAAkB,OAAA;AAClB,gHAAA,mBAAmB,OAAA;AAEvB,4DAA2D;AAAlD,gHAAA,cAAc,OAAA;AAEvB,iFAAoG;AAA3F,8HAAA,qBAAqB,OAAA;AAC9B,+DAA8D;AAArD,kHAAA,eAAe,OAAA;AAExB,iEAAgE;AAAvD,oHAAA,gBAAgB,OAAA;AACzB,4DAA4E;AAAnE,gHAAA,cAAc,OAAA;AACvB,+DAA8D;AAArD,kHAAA,eAAe,OAAA;AAExB,sDAAqD;AAA5C,4GAAA,YAAY,OAAA;AAGrB,2EAAyF;AAAhF,0HAAA,mBAAmB,OAAA;AAC5B,+DAA8D;AAArD,kHAAA,eAAe,OAAA;AAExB,8EAA6E;AAApE,4HAAA,oBAAoB,OAAA","sourcesContent":["export { TableEditPlugin } from './tableEdit/TableEditPlugin';\nexport { OnTableEditorCreatedCallback } from './tableEdit/OnTableEditorCreatedCallback';\nexport { TableEditFeatureName } from './tableEdit/editors/features/TableEditFeatureName';\nexport { PastePlugin } from './paste/PastePlugin';\nexport { DefaultSanitizers } from './paste/DefaultSanitizers';\nexport { EditPlugin, EditOptions } from './edit/EditPlugin';\nexport { AutoFormatPlugin } from './autoFormat/AutoFormatPlugin';\nexport { AutoFormatOptions } from './autoFormat/interface/AutoFormatOptions';\n\nexport {\n ShortcutBold,\n ShortcutItalic,\n ShortcutUnderline,\n ShortcutClearFormat,\n ShortcutUndo,\n ShortcutUndo2,\n ShortcutRedo,\n ShortcutRedoAlt,\n ShortcutRedoMacOS,\n ShortcutBullet,\n ShortcutNumbering,\n ShortcutIncreaseFont,\n ShortcutDecreaseFont,\n ShortcutIndentList,\n ShortcutOutdentList,\n} from './shortcut/shortcuts';\nexport { ShortcutPlugin } from './shortcut/ShortcutPlugin';\nexport { ShortcutKeyDefinition, ShortcutCommand } from './shortcut/ShortcutCommand';\nexport { ContextMenuPluginBase, ContextMenuOptions } from './contextMenuBase/ContextMenuPluginBase';\nexport { WatermarkPlugin } from './watermark/WatermarkPlugin';\nexport { WatermarkFormat } from './watermark/WatermarkFormat';\nexport { isModelEmptyFast } from './watermark/isModelEmptyFast';\nexport { MarkdownPlugin, MarkdownOptions } from './markdown/MarkdownPlugin';\nexport { HyperlinkPlugin } from './hyperlink/HyperlinkPlugin';\nexport { HyperlinkToolTip } from './hyperlink/HyperlinkToolTip';\nexport { PickerPlugin } from './picker/PickerPlugin';\nexport { PickerHelper } from './picker/PickerHelper';\nexport { PickerSelectionChangMode, PickerDirection, PickerHandler } from './picker/PickerHandler';\nexport { CustomReplacePlugin, CustomReplace } from './customReplace/CustomReplacePlugin';\nexport { ImageEditPlugin } from './imageEdit/ImageEditPlugin';\nexport { ImageEditOptions } from './imageEdit/types/ImageEditOptions';\nexport { HiddenPropertyPlugin } from './hiddenProperty/HiddenPropertyPlugin';\nexport { HiddenPropertyOptions } from './hiddenProperty/HiddenPropertyOptions';\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../packages/roosterjs-content-model-plugins/lib/index.ts"],"names":[],"mappings":";;;AAAA,+DAA8D;AAArD,kHAAA,eAAe,OAAA;AAIxB,mDAAkD;AAAzC,0GAAA,WAAW,OAAA;AACpB,+DAA8D;AAArD,sHAAA,iBAAiB,OAAA;AAC1B,gDAA4D;AAAnD,wGAAA,UAAU,OAAA;AACnB,kEAAiE;AAAxD,oHAAA,gBAAgB,OAAA;AAGzB,kDAgB8B;AAf1B,yGAAA,YAAY,OAAA;AACZ,2GAAA,cAAc,OAAA;AACd,8GAAA,iBAAiB,OAAA;AACjB,gHAAA,mBAAmB,OAAA;AACnB,yGAAA,YAAY,OAAA;AACZ,0GAAA,aAAa,OAAA;AACb,yGAAA,YAAY,OAAA;AACZ,4GAAA,eAAe,OAAA;AACf,8GAAA,iBAAiB,OAAA;AACjB,2GAAA,cAAc,OAAA;AACd,8GAAA,iBAAiB,OAAA;AACjB,iHAAA,oBAAoB,OAAA;AACpB,iHAAA,oBAAoB,OAAA;AACpB,+GAAA,kBAAkB,OAAA;AAClB,gHAAA,mBAAmB,OAAA;AAEvB,4DAA2D;AAAlD,gHAAA,cAAc,OAAA;AAEvB,iFAAoG;AAA3F,8HAAA,qBAAqB,OAAA;AAC9B,+DAA8D;AAArD,kHAAA,eAAe,OAAA;AAExB,iEAAgE;AAAvD,oHAAA,gBAAgB,OAAA;AACzB,4DAA4E;AAAnE,gHAAA,cAAc,OAAA;AACvB,+DAA8D;AAArD,kHAAA,eAAe,OAAA;AAExB,sDAAqD;AAA5C,4GAAA,YAAY,OAAA;AAGrB,2EAAyF;AAAhF,0HAAA,mBAAmB,OAAA;AAC5B,+DAA8D;AAArD,kHAAA,eAAe,OAAA;AAExB,8EAA6E;AAApE,4HAAA,oBAAoB,OAAA","sourcesContent":["export { TableEditPlugin } from './tableEdit/TableEditPlugin';\nexport { OnTableEditorCreatedCallback } from './tableEdit/OnTableEditorCreatedCallback';\nexport { TableEditFeatureName } from './tableEdit/editors/features/TableEditFeatureName';\nexport { TableWithRoot } from './tableEdit/TableWithRoot';\nexport { PastePlugin } from './paste/PastePlugin';\nexport { DefaultSanitizers } from './paste/DefaultSanitizers';\nexport { EditPlugin, EditOptions } from './edit/EditPlugin';\nexport { AutoFormatPlugin } from './autoFormat/AutoFormatPlugin';\nexport { AutoFormatOptions } from './autoFormat/interface/AutoFormatOptions';\n\nexport {\n ShortcutBold,\n ShortcutItalic,\n ShortcutUnderline,\n ShortcutClearFormat,\n ShortcutUndo,\n ShortcutUndo2,\n ShortcutRedo,\n ShortcutRedoAlt,\n ShortcutRedoMacOS,\n ShortcutBullet,\n ShortcutNumbering,\n ShortcutIncreaseFont,\n ShortcutDecreaseFont,\n ShortcutIndentList,\n ShortcutOutdentList,\n} from './shortcut/shortcuts';\nexport { ShortcutPlugin } from './shortcut/ShortcutPlugin';\nexport { ShortcutKeyDefinition, ShortcutCommand } from './shortcut/ShortcutCommand';\nexport { ContextMenuPluginBase, ContextMenuOptions } from './contextMenuBase/ContextMenuPluginBase';\nexport { WatermarkPlugin } from './watermark/WatermarkPlugin';\nexport { WatermarkFormat } from './watermark/WatermarkFormat';\nexport { isModelEmptyFast } from './watermark/isModelEmptyFast';\nexport { MarkdownPlugin, MarkdownOptions } from './markdown/MarkdownPlugin';\nexport { HyperlinkPlugin } from './hyperlink/HyperlinkPlugin';\nexport { HyperlinkToolTip } from './hyperlink/HyperlinkToolTip';\nexport { PickerPlugin } from './picker/PickerPlugin';\nexport { PickerHelper } from './picker/PickerHelper';\nexport { PickerSelectionChangMode, PickerDirection, PickerHandler } from './picker/PickerHandler';\nexport { CustomReplacePlugin, CustomReplace } from './customReplace/CustomReplacePlugin';\nexport { ImageEditPlugin } from './imageEdit/ImageEditPlugin';\nexport { ImageEditOptions } from './imageEdit/types/ImageEditOptions';\nexport { HiddenPropertyPlugin } from './hiddenProperty/HiddenPropertyPlugin';\nexport { HiddenPropertyOptions } from './hiddenProperty/HiddenPropertyOptions';\n"]}
@@ -6,15 +6,17 @@ var addParser_1 = require("./utils/addParser");
6
6
  var roosterjs_content_model_dom_1 = require("roosterjs-content-model-dom");
7
7
  var chainSanitizerCallback_1 = require("./utils/chainSanitizerCallback");
8
8
  var DefaultSanitizers_1 = require("./DefaultSanitizers");
9
- var deprecatedColorParser_1 = require("./utils/deprecatedColorParser");
9
+ var deprecatedColorParser_1 = require("./parsers/deprecatedColorParser");
10
10
  var getPasteSource_1 = require("./pasteSourceValidations/getPasteSource");
11
- var linkParser_1 = require("./utils/linkParser");
11
+ var linkParser_1 = require("./parsers/linkParser");
12
+ var pasteButtonProcessor_1 = require("./processors/pasteButtonProcessor");
12
13
  var constants_1 = require("./pasteSourceValidations/constants");
13
14
  var processPastedContentFromExcel_1 = require("./Excel/processPastedContentFromExcel");
14
15
  var processPastedContentFromOneNote_1 = require("./oneNote/processPastedContentFromOneNote");
15
16
  var processPastedContentFromPowerPoint_1 = require("./PowerPoint/processPastedContentFromPowerPoint");
16
17
  var processPastedContentFromWordDesktop_1 = require("./WordDesktop/processPastedContentFromWordDesktop");
17
18
  var processPastedContentWacComponents_1 = require("./WacComponents/processPastedContentWacComponents");
19
+ var setProcessor_1 = require("./utils/setProcessor");
18
20
  /**
19
21
  * Paste plugin, handles BeforePaste event and reformat some special content, including:
20
22
  * 1. Content copied from Word
@@ -75,11 +77,11 @@ var PastePlugin = /** @class */ (function () {
75
77
  if (!event.domToModelOption) {
76
78
  return;
77
79
  }
78
- var pasteSource = (0, getPasteSource_1.getPasteSource)(event, false);
80
+ var pasteSource = (0, getPasteSource_1.getPasteSource)(event, false /* shouldConvertSingleImage */, this.editor.getEnvironment());
79
81
  var pasteType = event.pasteType;
80
82
  switch (pasteSource) {
81
83
  case 'wordDesktop':
82
- (0, processPastedContentFromWordDesktop_1.processPastedContentFromWordDesktop)(event, this.editor.getDOMCreator());
84
+ (0, processPastedContentFromWordDesktop_1.processPastedContentFromWordDesktop)(event);
83
85
  break;
84
86
  case 'wacComponents':
85
87
  (0, processPastedContentWacComponents_1.processPastedContentWacComponents)(event);
@@ -106,6 +108,7 @@ var PastePlugin = /** @class */ (function () {
106
108
  (0, addParser_1.addParser)(event.domToModelOption, 'tableCell', deprecatedColorParser_1.deprecatedBorderColorParser);
107
109
  (0, addParser_1.addParser)(event.domToModelOption, 'tableCell', tableBorderParser);
108
110
  (0, addParser_1.addParser)(event.domToModelOption, 'table', deprecatedColorParser_1.deprecatedBorderColorParser);
111
+ (0, setProcessor_1.setProcessor)(event.domToModelOption, 'button', pasteButtonProcessor_1.pasteButtonProcessor);
109
112
  if (pasteType === 'mergeFormat') {
110
113
  (0, addParser_1.addParser)(event.domToModelOption, 'block', blockElementParser);
111
114
  (0, addParser_1.addParser)(event.domToModelOption, 'listLevel', blockElementParser);
@@ -1 +1 @@
1
- {"version":3,"file":"PastePlugin.js","sourceRoot":"","sources":["../../../../packages/roosterjs-content-model-plugins/lib/paste/PastePlugin.ts"],"names":[],"mappings":"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","sourcesContent":["import { addParser } from './utils/addParser';\nimport { BorderKeys, getObjectKeys } from 'roosterjs-content-model-dom';\nimport { chainSanitizerCallback } from './utils/chainSanitizerCallback';\nimport { DefaultSanitizers } from './DefaultSanitizers';\nimport { deprecatedBorderColorParser } from './utils/deprecatedColorParser';\nimport { getPasteSource } from './pasteSourceValidations/getPasteSource';\nimport { parseLink } from './utils/linkParser';\nimport { PastePropertyNames } from './pasteSourceValidations/constants';\nimport { processPastedContentFromExcel } from './Excel/processPastedContentFromExcel';\nimport { processPastedContentFromOneNote } from './oneNote/processPastedContentFromOneNote';\nimport { processPastedContentFromPowerPoint } from './PowerPoint/processPastedContentFromPowerPoint';\nimport { processPastedContentFromWordDesktop } from './WordDesktop/processPastedContentFromWordDesktop';\nimport { processPastedContentWacComponents } from './WacComponents/processPastedContentWacComponents';\nimport type {\n BeforePasteEvent,\n BorderFormat,\n ContentModelBlockFormat,\n ContentModelTableCellFormat,\n DomToModelOptionForSanitizing,\n EditorPlugin,\n FormatParser,\n IEditor,\n PluginEvent,\n} from 'roosterjs-content-model-types';\n\n/**\n * Paste plugin, handles BeforePaste event and reformat some special content, including:\n * 1. Content copied from Word\n * 2. Content copied from Excel\n * 3. Content copied from Word Online or OneNote Online\n * 4. Content copied from Power Point\n */\nexport class PastePlugin implements EditorPlugin {\n private editor: IEditor | null = null;\n\n /**\n * Construct a new instance of Paste class\n * @param unknownTagReplacement Replace solution of unknown tags, default behavior is to replace with SPAN\n * @param allowExcelNoBorderTable Allow table copied from Excel without border\n */\n constructor(\n private allowExcelNoBorderTable?: boolean,\n private domToModelForSanitizing: Pick<\n DomToModelOptionForSanitizing,\n | 'additionalAllowedTags'\n | 'additionalDisallowedTags'\n | 'styleSanitizers'\n | 'attributeSanitizers'\n > = {\n styleSanitizers: DefaultSanitizers,\n additionalAllowedTags: [],\n additionalDisallowedTags: [],\n attributeSanitizers: {},\n }\n ) {}\n\n /**\n * Get name of this plugin\n */\n getName() {\n return 'Paste';\n }\n\n /**\n * The first method that editor will call to a plugin when editor is initializing.\n * It will pass in the editor instance, plugin should take this chance to save the\n * editor reference so that it can call to any editor method or format API later.\n * @param editor The editor object\n */\n initialize(editor: IEditor) {\n this.editor = editor;\n }\n\n /**\n * The last method that editor will call to a plugin before it is disposed.\n * Plugin can take this chance to clear the reference to editor. After this method is\n * called, plugin should not call to any editor method since it will result in error.\n */\n dispose() {\n this.editor = null;\n }\n\n /**\n * Core method for a plugin. Once an event happens in editor, editor will call this\n * method of each plugin to handle the event as long as the event is not handled\n * exclusively by another plugin.\n * @param event The event to handle:\n */\n onPluginEvent(event: PluginEvent) {\n if (!this.editor || event.eventType != 'beforePaste') {\n return;\n }\n\n if (!event.domToModelOption) {\n return;\n }\n\n const pasteSource = getPasteSource(event, false);\n const pasteType = event.pasteType;\n\n switch (pasteSource) {\n case 'wordDesktop':\n processPastedContentFromWordDesktop(event, this.editor.getDOMCreator());\n break;\n case 'wacComponents':\n processPastedContentWacComponents(event);\n break;\n case 'excelOnline':\n case 'excelDesktop':\n case 'excelNonNativeEvent':\n if (pasteType === 'normal' || pasteType === 'mergeFormat') {\n // Handle HTML copied from Excel\n processPastedContentFromExcel(\n event,\n this.editor.getDOMCreator(),\n !!this.allowExcelNoBorderTable,\n pasteSource != 'excelNonNativeEvent' /* isNativeEvent */\n );\n }\n break;\n case 'googleSheets':\n event.domToModelOption.additionalAllowedTags.push(\n PastePropertyNames.GOOGLE_SHEET_NODE_NAME as Lowercase<string>\n );\n break;\n case 'powerPointDesktop':\n processPastedContentFromPowerPoint(event, this.editor.getDOMCreator());\n break;\n\n case 'oneNoteDesktop':\n processPastedContentFromOneNote(event);\n break;\n }\n\n addParser(event.domToModelOption, 'link', parseLink);\n addParser(event.domToModelOption, 'tableCell', deprecatedBorderColorParser);\n addParser(event.domToModelOption, 'tableCell', tableBorderParser);\n addParser(event.domToModelOption, 'table', deprecatedBorderColorParser);\n\n if (pasteType === 'mergeFormat') {\n addParser(event.domToModelOption, 'block', blockElementParser);\n addParser(event.domToModelOption, 'listLevel', blockElementParser);\n }\n\n this.setEventSanitizers(event);\n }\n\n private setEventSanitizers(event: BeforePasteEvent) {\n if (this.domToModelForSanitizing) {\n const {\n styleSanitizers,\n attributeSanitizers,\n additionalAllowedTags,\n additionalDisallowedTags,\n } = this.domToModelForSanitizing;\n getObjectKeys(styleSanitizers).forEach(key =>\n chainSanitizerCallback(\n event.domToModelOption.styleSanitizers,\n key,\n styleSanitizers[key]\n )\n );\n getObjectKeys(attributeSanitizers).forEach(key =>\n chainSanitizerCallback(\n event.domToModelOption.attributeSanitizers,\n key,\n attributeSanitizers[key]\n )\n );\n event.domToModelOption.additionalAllowedTags.push(...additionalAllowedTags);\n event.domToModelOption.additionalDisallowedTags.push(...additionalDisallowedTags);\n }\n }\n}\n\n/**\n * For block elements that have background color style, remove the background color when user selects the merge current format\n * paste option\n */\nconst blockElementParser: FormatParser<ContentModelBlockFormat> = (\n format: ContentModelBlockFormat,\n element: HTMLElement\n) => {\n if (element.style.backgroundColor) {\n delete format.backgroundColor;\n }\n};\n\nconst ElementBorderKeys = new Map<\n keyof BorderFormat,\n {\n c: keyof CSSStyleDeclaration;\n s: keyof CSSStyleDeclaration;\n w: keyof CSSStyleDeclaration;\n }\n>([\n ['borderTop', { w: 'borderTopWidth', s: 'borderTopStyle', c: 'borderTopColor' }],\n ['borderRight', { w: 'borderRightWidth', s: 'borderRightStyle', c: 'borderRightColor' }],\n ['borderBottom', { w: 'borderBottomWidth', s: 'borderBottomStyle', c: 'borderBottomColor' }],\n ['borderLeft', { w: 'borderLeftWidth', s: 'borderLeftStyle', c: 'borderLeftColor' }],\n]);\n\nfunction tableBorderParser(format: ContentModelTableCellFormat, element: HTMLElement): void {\n BorderKeys.forEach(key => {\n if (!format[key]) {\n const styleSet = ElementBorderKeys.get(key);\n if (\n styleSet &&\n element.style[styleSet.w] &&\n element.style[styleSet.s] &&\n !element.style[styleSet.c]\n ) {\n format[key] = `${element.style[styleSet.w]} ${element.style[styleSet.s]}`;\n }\n }\n });\n}\n"]}
1
+ {"version":3,"file":"PastePlugin.js","sourceRoot":"","sources":["../../../../packages/roosterjs-content-model-plugins/lib/paste/PastePlugin.ts"],"names":[],"mappings":";;;;AAAA,+CAA8C;AAC9C,2EAAwE;AACxE,yEAAwE;AACxE,yDAAwD;AACxD,yEAA8E;AAC9E,0EAAyE;AACzE,mDAAiD;AACjD,0EAAyE;AACzE,gEAAwE;AACxE,uFAAsF;AACtF,6FAA4F;AAC5F,sGAAqG;AACrG,yGAAwG;AACxG,uGAAsG;AACtG,qDAAoD;AAapD;;;;;;GAMG;AACH;IAGI;;;;OAIG;IACH,qBACY,uBAAiC,EACjC,uBAWP;QAXO,wCAAA,EAAA;YAOJ,eAAe,EAAE,qCAAiB;YAClC,qBAAqB,EAAE,EAAE;YACzB,wBAAwB,EAAE,EAAE;YAC5B,mBAAmB,EAAE,EAAE;SAC1B;QAZO,4BAAuB,GAAvB,uBAAuB,CAAU;QACjC,4BAAuB,GAAvB,uBAAuB,CAW9B;QApBG,WAAM,GAAmB,IAAI,CAAC;IAqBnC,CAAC;IAEJ;;OAEG;IACH,6BAAO,GAAP;QACI,OAAO,OAAO,CAAC;IACnB,CAAC;IAED;;;;;OAKG;IACH,gCAAU,GAAV,UAAW,MAAe;QACtB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACzB,CAAC;IAED;;;;OAIG;IACH,6BAAO,GAAP;QACI,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;IACvB,CAAC;IAED;;;;;OAKG;IACH,mCAAa,GAAb,UAAc,KAAkB;QAC5B,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,KAAK,CAAC,SAAS,IAAI,aAAa,EAAE;YAClD,OAAO;SACV;QAED,IAAI,CAAC,KAAK,CAAC,gBAAgB,EAAE;YACzB,OAAO;SACV;QAED,IAAM,WAAW,GAAG,IAAA,+BAAc,EAC9B,KAAK,EACL,KAAK,CAAC,8BAA8B,EACpC,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE,CAC/B,CAAC;QACF,IAAM,SAAS,GAAG,KAAK,CAAC,SAAS,CAAC;QAElC,QAAQ,WAAW,EAAE;YACjB,KAAK,aAAa;gBACd,IAAA,yEAAmC,EAAC,KAAK,CAAC,CAAC;gBAC3C,MAAM;YACV,KAAK,eAAe;gBAChB,IAAA,qEAAiC,EAAC,KAAK,CAAC,CAAC;gBACzC,MAAM;YACV,KAAK,aAAa,CAAC;YACnB,KAAK,cAAc,CAAC;YACpB,KAAK,qBAAqB;gBACtB,IAAI,SAAS,KAAK,QAAQ,IAAI,SAAS,KAAK,aAAa,EAAE;oBACvD,gCAAgC;oBAChC,IAAA,6DAA6B,EACzB,KAAK,EACL,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE,EAC3B,CAAC,CAAC,IAAI,CAAC,uBAAuB,EAC9B,WAAW,IAAI,qBAAqB,CAAC,mBAAmB,CAC3D,CAAC;iBACL;gBACD,MAAM;YACV,KAAK,cAAc;gBACf,KAAK,CAAC,gBAAgB,CAAC,qBAAqB,CAAC,IAAI,CAC7C,8BAAkB,CAAC,sBAA2C,CACjE,CAAC;gBACF,MAAM;YACV,KAAK,mBAAmB;gBACpB,IAAA,uEAAkC,EAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE,CAAC,CAAC;gBACvE,MAAM;YAEV,KAAK,gBAAgB;gBACjB,IAAA,iEAA+B,EAAC,KAAK,CAAC,CAAC;gBACvC,MAAM;SACb;QAED,IAAA,qBAAS,EAAC,KAAK,CAAC,gBAAgB,EAAE,MAAM,EAAE,sBAAS,CAAC,CAAC;QACrD,IAAA,qBAAS,EAAC,KAAK,CAAC,gBAAgB,EAAE,WAAW,EAAE,mDAA2B,CAAC,CAAC;QAC5E,IAAA,qBAAS,EAAC,KAAK,CAAC,gBAAgB,EAAE,WAAW,EAAE,iBAAiB,CAAC,CAAC;QAClE,IAAA,qBAAS,EAAC,KAAK,CAAC,gBAAgB,EAAE,OAAO,EAAE,mDAA2B,CAAC,CAAC;QACxE,IAAA,2BAAY,EAAC,KAAK,CAAC,gBAAgB,EAAE,QAAQ,EAAE,2CAAoB,CAAC,CAAC;QAErE,IAAI,SAAS,KAAK,aAAa,EAAE;YAC7B,IAAA,qBAAS,EAAC,KAAK,CAAC,gBAAgB,EAAE,OAAO,EAAE,kBAAkB,CAAC,CAAC;YAC/D,IAAA,qBAAS,EAAC,KAAK,CAAC,gBAAgB,EAAE,WAAW,EAAE,kBAAkB,CAAC,CAAC;SACtE;QAED,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC;IACnC,CAAC;IAEO,wCAAkB,GAA1B,UAA2B,KAAuB;;QAC9C,IAAI,IAAI,CAAC,uBAAuB,EAAE;YACxB,IAAA,KAKF,IAAI,CAAC,uBAAuB,EAJ5B,iBAAe,qBAAA,EACf,qBAAmB,yBAAA,EACnB,qBAAqB,2BAAA,EACrB,wBAAwB,8BACI,CAAC;YACjC,IAAA,2CAAa,EAAC,iBAAe,CAAC,CAAC,OAAO,CAAC,UAAA,GAAG;gBACtC,OAAA,IAAA,+CAAsB,EAClB,KAAK,CAAC,gBAAgB,CAAC,eAAe,EACtC,GAAG,EACH,iBAAe,CAAC,GAAG,CAAC,CACvB;YAJD,CAIC,CACJ,CAAC;YACF,IAAA,2CAAa,EAAC,qBAAmB,CAAC,CAAC,OAAO,CAAC,UAAA,GAAG;gBAC1C,OAAA,IAAA,+CAAsB,EAClB,KAAK,CAAC,gBAAgB,CAAC,mBAAmB,EAC1C,GAAG,EACH,qBAAmB,CAAC,GAAG,CAAC,CAC3B;YAJD,CAIC,CACJ,CAAC;YACF,CAAA,KAAA,KAAK,CAAC,gBAAgB,CAAC,qBAAqB,CAAA,CAAC,IAAI,8DAAI,qBAAqB,WAAE;YAC5E,CAAA,KAAA,KAAK,CAAC,gBAAgB,CAAC,wBAAwB,CAAA,CAAC,IAAI,8DAAI,wBAAwB,WAAE;SACrF;IACL,CAAC;IACL,kBAAC;AAAD,CAAC,AAlJD,IAkJC;AAlJY,kCAAW;AAoJxB;;;GAGG;AACH,IAAM,kBAAkB,GAA0C,UAC9D,MAA+B,EAC/B,OAAoB;IAEpB,IAAI,OAAO,CAAC,KAAK,CAAC,eAAe,EAAE;QAC/B,OAAO,MAAM,CAAC,eAAe,CAAC;KACjC;AACL,CAAC,CAAC;AAEF,IAAM,iBAAiB,GAAG,IAAI,GAAG,CAO/B;IACE,CAAC,WAAW,EAAE,EAAE,CAAC,EAAE,gBAAgB,EAAE,CAAC,EAAE,gBAAgB,EAAE,CAAC,EAAE,gBAAgB,EAAE,CAAC;IAChF,CAAC,aAAa,EAAE,EAAE,CAAC,EAAE,kBAAkB,EAAE,CAAC,EAAE,kBAAkB,EAAE,CAAC,EAAE,kBAAkB,EAAE,CAAC;IACxF,CAAC,cAAc,EAAE,EAAE,CAAC,EAAE,mBAAmB,EAAE,CAAC,EAAE,mBAAmB,EAAE,CAAC,EAAE,mBAAmB,EAAE,CAAC;IAC5F,CAAC,YAAY,EAAE,EAAE,CAAC,EAAE,iBAAiB,EAAE,CAAC,EAAE,iBAAiB,EAAE,CAAC,EAAE,iBAAiB,EAAE,CAAC;CACvF,CAAC,CAAC;AAEH,SAAS,iBAAiB,CAAC,MAAmC,EAAE,OAAoB;IAChF,wCAAU,CAAC,OAAO,CAAC,UAAA,GAAG;QAClB,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE;YACd,IAAM,QAAQ,GAAG,iBAAiB,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAC5C,IACI,QAAQ;gBACR,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC;gBACzB,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC;gBACzB,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,EAC5B;gBACE,MAAM,CAAC,GAAG,CAAC,GAAM,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAI,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAG,CAAC;aAC7E;SACJ;IACL,CAAC,CAAC,CAAC;AACP,CAAC","sourcesContent":["import { addParser } from './utils/addParser';\nimport { BorderKeys, getObjectKeys } from 'roosterjs-content-model-dom';\nimport { chainSanitizerCallback } from './utils/chainSanitizerCallback';\nimport { DefaultSanitizers } from './DefaultSanitizers';\nimport { deprecatedBorderColorParser } from './parsers/deprecatedColorParser';\nimport { getPasteSource } from './pasteSourceValidations/getPasteSource';\nimport { parseLink } from './parsers/linkParser';\nimport { pasteButtonProcessor } from './processors/pasteButtonProcessor';\nimport { PastePropertyNames } from './pasteSourceValidations/constants';\nimport { processPastedContentFromExcel } from './Excel/processPastedContentFromExcel';\nimport { processPastedContentFromOneNote } from './oneNote/processPastedContentFromOneNote';\nimport { processPastedContentFromPowerPoint } from './PowerPoint/processPastedContentFromPowerPoint';\nimport { processPastedContentFromWordDesktop } from './WordDesktop/processPastedContentFromWordDesktop';\nimport { processPastedContentWacComponents } from './WacComponents/processPastedContentWacComponents';\nimport { setProcessor } from './utils/setProcessor';\nimport type {\n BeforePasteEvent,\n BorderFormat,\n ContentModelBlockFormat,\n ContentModelTableCellFormat,\n DomToModelOptionForSanitizing,\n EditorPlugin,\n FormatParser,\n IEditor,\n PluginEvent,\n} from 'roosterjs-content-model-types';\n\n/**\n * Paste plugin, handles BeforePaste event and reformat some special content, including:\n * 1. Content copied from Word\n * 2. Content copied from Excel\n * 3. Content copied from Word Online or OneNote Online\n * 4. Content copied from Power Point\n */\nexport class PastePlugin implements EditorPlugin {\n private editor: IEditor | null = null;\n\n /**\n * Construct a new instance of Paste class\n * @param unknownTagReplacement Replace solution of unknown tags, default behavior is to replace with SPAN\n * @param allowExcelNoBorderTable Allow table copied from Excel without border\n */\n constructor(\n private allowExcelNoBorderTable?: boolean,\n private domToModelForSanitizing: Pick<\n DomToModelOptionForSanitizing,\n | 'additionalAllowedTags'\n | 'additionalDisallowedTags'\n | 'styleSanitizers'\n | 'attributeSanitizers'\n > = {\n styleSanitizers: DefaultSanitizers,\n additionalAllowedTags: [],\n additionalDisallowedTags: [],\n attributeSanitizers: {},\n }\n ) {}\n\n /**\n * Get name of this plugin\n */\n getName() {\n return 'Paste';\n }\n\n /**\n * The first method that editor will call to a plugin when editor is initializing.\n * It will pass in the editor instance, plugin should take this chance to save the\n * editor reference so that it can call to any editor method or format API later.\n * @param editor The editor object\n */\n initialize(editor: IEditor) {\n this.editor = editor;\n }\n\n /**\n * The last method that editor will call to a plugin before it is disposed.\n * Plugin can take this chance to clear the reference to editor. After this method is\n * called, plugin should not call to any editor method since it will result in error.\n */\n dispose() {\n this.editor = null;\n }\n\n /**\n * Core method for a plugin. Once an event happens in editor, editor will call this\n * method of each plugin to handle the event as long as the event is not handled\n * exclusively by another plugin.\n * @param event The event to handle:\n */\n onPluginEvent(event: PluginEvent) {\n if (!this.editor || event.eventType != 'beforePaste') {\n return;\n }\n\n if (!event.domToModelOption) {\n return;\n }\n\n const pasteSource = getPasteSource(\n event,\n false /* shouldConvertSingleImage */,\n this.editor.getEnvironment()\n );\n const pasteType = event.pasteType;\n\n switch (pasteSource) {\n case 'wordDesktop':\n processPastedContentFromWordDesktop(event);\n break;\n case 'wacComponents':\n processPastedContentWacComponents(event);\n break;\n case 'excelOnline':\n case 'excelDesktop':\n case 'excelNonNativeEvent':\n if (pasteType === 'normal' || pasteType === 'mergeFormat') {\n // Handle HTML copied from Excel\n processPastedContentFromExcel(\n event,\n this.editor.getDOMCreator(),\n !!this.allowExcelNoBorderTable,\n pasteSource != 'excelNonNativeEvent' /* isNativeEvent */\n );\n }\n break;\n case 'googleSheets':\n event.domToModelOption.additionalAllowedTags.push(\n PastePropertyNames.GOOGLE_SHEET_NODE_NAME as Lowercase<string>\n );\n break;\n case 'powerPointDesktop':\n processPastedContentFromPowerPoint(event, this.editor.getDOMCreator());\n break;\n\n case 'oneNoteDesktop':\n processPastedContentFromOneNote(event);\n break;\n }\n\n addParser(event.domToModelOption, 'link', parseLink);\n addParser(event.domToModelOption, 'tableCell', deprecatedBorderColorParser);\n addParser(event.domToModelOption, 'tableCell', tableBorderParser);\n addParser(event.domToModelOption, 'table', deprecatedBorderColorParser);\n setProcessor(event.domToModelOption, 'button', pasteButtonProcessor);\n\n if (pasteType === 'mergeFormat') {\n addParser(event.domToModelOption, 'block', blockElementParser);\n addParser(event.domToModelOption, 'listLevel', blockElementParser);\n }\n\n this.setEventSanitizers(event);\n }\n\n private setEventSanitizers(event: BeforePasteEvent) {\n if (this.domToModelForSanitizing) {\n const {\n styleSanitizers,\n attributeSanitizers,\n additionalAllowedTags,\n additionalDisallowedTags,\n } = this.domToModelForSanitizing;\n getObjectKeys(styleSanitizers).forEach(key =>\n chainSanitizerCallback(\n event.domToModelOption.styleSanitizers,\n key,\n styleSanitizers[key]\n )\n );\n getObjectKeys(attributeSanitizers).forEach(key =>\n chainSanitizerCallback(\n event.domToModelOption.attributeSanitizers,\n key,\n attributeSanitizers[key]\n )\n );\n event.domToModelOption.additionalAllowedTags.push(...additionalAllowedTags);\n event.domToModelOption.additionalDisallowedTags.push(...additionalDisallowedTags);\n }\n }\n}\n\n/**\n * For block elements that have background color style, remove the background color when user selects the merge current format\n * paste option\n */\nconst blockElementParser: FormatParser<ContentModelBlockFormat> = (\n format: ContentModelBlockFormat,\n element: HTMLElement\n) => {\n if (element.style.backgroundColor) {\n delete format.backgroundColor;\n }\n};\n\nconst ElementBorderKeys = new Map<\n keyof BorderFormat,\n {\n c: keyof CSSStyleDeclaration;\n s: keyof CSSStyleDeclaration;\n w: keyof CSSStyleDeclaration;\n }\n>([\n ['borderTop', { w: 'borderTopWidth', s: 'borderTopStyle', c: 'borderTopColor' }],\n ['borderRight', { w: 'borderRightWidth', s: 'borderRightStyle', c: 'borderRightColor' }],\n ['borderBottom', { w: 'borderBottomWidth', s: 'borderBottomStyle', c: 'borderBottomColor' }],\n ['borderLeft', { w: 'borderLeftWidth', s: 'borderLeftStyle', c: 'borderLeftColor' }],\n]);\n\nfunction tableBorderParser(format: ContentModelTableCellFormat, element: HTMLElement): void {\n BorderKeys.forEach(key => {\n if (!format[key]) {\n const styleSet = ElementBorderKeys.get(key);\n if (\n styleSet &&\n element.style[styleSet.w] &&\n element.style[styleSet.s] &&\n !element.style[styleSet.c]\n ) {\n format[key] = `${element.style[styleSet.w]} ${element.style[styleSet.s]}`;\n }\n }\n });\n}\n"]}
@@ -1,20 +1,151 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.processPastedContentFromPowerPoint = void 0;
4
+ var tslib_1 = require("tslib");
5
+ var addParser_1 = require("../utils/addParser");
6
+ var customListUtils_1 = require("../utils/customListUtils");
7
+ var removeNegativeTextIndentParser_1 = require("../parsers/removeNegativeTextIndentParser");
8
+ var setProcessor_1 = require("../utils/setProcessor");
4
9
  var roosterjs_content_model_dom_1 = require("roosterjs-content-model-dom");
10
+ var BulletSelector = '* > span > span[style*=mso-special-format]';
11
+ var MsOfficeSpecialFormat = 'mso-special-format';
12
+ var CssStyleKey = 'style';
13
+ var MsoSpecialFormatRegex = /mso-special-format:\s*([^;]*)/;
14
+ var clearListItemStyles = function (format) {
15
+ delete format.textAlign;
16
+ delete format.marginLeft;
17
+ delete format.paddingLeft;
18
+ };
5
19
  /**
6
20
  * @internal
7
21
  * Convert pasted content from PowerPoint
8
22
  * @param event The BeforePaste event
9
23
  */
10
24
  function processPastedContentFromPowerPoint(event, domCreator) {
11
- var fragment = event.fragment, clipboardData = event.clipboardData;
25
+ var fragment = event.fragment, clipboardData = event.clipboardData, domToModelOption = event.domToModelOption;
12
26
  if (clipboardData.html && !clipboardData.text && clipboardData.image) {
13
27
  // It is possible that PowerPoint copied both image and HTML but not plain text.
14
28
  // We always prefer HTML if any.
15
29
  var doc = domCreator.htmlToDOM(clipboardData.html);
16
30
  (0, roosterjs_content_model_dom_1.moveChildNodes)(fragment, doc === null || doc === void 0 ? void 0 : doc.body);
17
31
  }
32
+ (0, addParser_1.addParser)(domToModelOption, 'block', removeNegativeTextIndentParser_1.removeNegativeTextIndentParser);
33
+ (0, setProcessor_1.setProcessor)(domToModelOption, 'element', function (group, element, context) {
34
+ var _a, _b;
35
+ var style = element.getAttribute(CssStyleKey) || '';
36
+ // If the element is the bullet element, just ignore it, otherwise we will see an extra bullet in the list
37
+ if (style.includes(MsOfficeSpecialFormat) && context.listFormat.levels.length > 0) {
38
+ return;
39
+ }
40
+ var bulletElement = element.querySelector(BulletSelector);
41
+ if (bulletElement) {
42
+ var _c = extractPowerPointListInfo(element, bulletElement), depth = _c.depth, unorderedBulletType = _c.unorderedBulletType, orderedBulletType = _c.orderedBulletType, startNumberOverrideOrBullet_1 = _c.startNumberOverrideOrBullet, isOrderedList = _c.isOrderedList, isNewList_1 = _c.isNewList;
43
+ // Setup the listformat with the metadata extracted from the bullet element
44
+ (0, customListUtils_1.setupListFormat)(isOrderedList ? 'OL' : 'UL', element, context, depth, context.listFormat, group, [clearListItemStyles]);
45
+ // Set the metadata for the list item, which will be used to set the correct bullet style type
46
+ var listMetadata = {
47
+ unorderedStyleType: !isOrderedList && unorderedBulletType
48
+ ? roosterjs_content_model_dom_1.BulletListType[unorderedBulletType]
49
+ : undefined,
50
+ orderedStyleType: isOrderedList && orderedBulletType
51
+ ? roosterjs_content_model_dom_1.NumberingListType[orderedBulletType]
52
+ : undefined,
53
+ };
54
+ // Process the Div element as a list item.
55
+ (0, customListUtils_1.processAsListItem)(context, element, group, listMetadata, function (listItem) {
56
+ var _a;
57
+ var currentMarkerSize = listItem.formatHolder.format.fontSize;
58
+ var bulletElementSize = (_a = bulletElement.parentElement) === null || _a === void 0 ? void 0 : _a.style.fontSize;
59
+ listItem.formatHolder.format.fontSize = bulletElementSize || currentMarkerSize;
60
+ if (isNewList_1) {
61
+ listItem.levels[listItem.levels.length - 1].format.startNumberOverride = parseInt(startNumberOverrideOrBullet_1);
62
+ }
63
+ clearListItemStyles(listItem.levels[listItem.levels.length - 1].format);
64
+ clearListItemStyles(listItem.format);
65
+ });
66
+ }
67
+ else {
68
+ (_b = (_a = context.defaultElementProcessors).element) === null || _b === void 0 ? void 0 : _b.call(_a, group, element, context);
69
+ }
70
+ });
18
71
  }
19
72
  exports.processPastedContentFromPowerPoint = processPastedContentFromPowerPoint;
73
+ /**
74
+ * Extract list information from PowerPoint pasted content
75
+ *
76
+ * The lists from PowerPoint are represent as:
77
+ *
78
+ * - The class 0# represents the depth of the list, if the list is in the first level, the class attribute wont be present.
79
+ * - The mso-special-format style represents the type of bullet and the start of the list.
80
+ * The first part of the mso-special-format is the type of bullet, and the second part is the start of the list.
81
+ * - All the items that are in the same list have the same mso-special-format style. Which we are leveraging to identify when a list is new or part of the existing list thread.
82
+ *
83
+ * @example
84
+ * ` <div class="O1" style="...">
85
+ <span style="font-size: 5pt"
86
+ ><span style="mso-special-format: 'numbullet6\,1'; font-family: +mj-lt"
87
+ >i.</span
88
+ ></span
89
+ ><span style="...;">123</span>
90
+ </div> `
91
+ *
92
+ * @param element The element to extract list information from
93
+ * @param bulletElement The bullet element to extract list information from
94
+ * @returns The extracted list information
95
+ */
96
+ function extractPowerPointListInfo(element, bulletElement) {
97
+ var className = element.className.substring(1) || '0';
98
+ var depth = parseInt(className) + 1;
99
+ var style = bulletElement.getAttribute(CssStyleKey) || '';
100
+ var msoSpecialFormat = style.match(MsoSpecialFormatRegex);
101
+ var _a = (0, tslib_1.__read)((msoSpecialFormat === null || msoSpecialFormat === void 0 ? void 0 : msoSpecialFormat[1].replace('"', '').split('\\,')) || [], 2), bulletTypeHtml = _a[0], startNumberOverrideOrBullet = _a[1];
102
+ var isOrderedList = OrderedListStyleMap.has(bulletTypeHtml);
103
+ var unorderedBulletType = UnorderedBullets.get(bulletElement.innerText);
104
+ var orderedBulletType = OrderedListStyleMap.get(bulletTypeHtml);
105
+ return {
106
+ depth: depth,
107
+ unorderedBulletType: unorderedBulletType,
108
+ orderedBulletType: orderedBulletType,
109
+ startNumberOverrideOrBullet: startNumberOverrideOrBullet,
110
+ isOrderedList: isOrderedList,
111
+ isNewList: isOrderedList &&
112
+ !!orderedBulletType &&
113
+ bulletElement.innerText ===
114
+ getPptListStart(orderedBulletType, startNumberOverrideOrBullet),
115
+ };
116
+ }
117
+ var UnorderedBullets = new Map([
118
+ ['•', 'Disc'],
119
+ ['o', 'Circle'],
120
+ ['§', 'Square'],
121
+ ['q', 'BoxShadow'],
122
+ ['v', 'Xrhombus'],
123
+ ['Ø', 'ShortArrow'],
124
+ ['ü', 'CheckMark'],
125
+ ]);
126
+ var OrderedListStyleMap = new Map([
127
+ ['numbullet1', 'UpperAlpha'],
128
+ ['numbullet2', 'DecimalParenthesis'],
129
+ ['numbullet3', 'Decimal'],
130
+ ['numbullet7', 'UpperRoman'],
131
+ ['numbullet9', 'LowerAlphaParenthesis'],
132
+ ['numbullet0', 'LowerAlpha'],
133
+ ['numbullet6', 'LowerRoman'],
134
+ ]);
135
+ function getPptListStart(orderedBulletType, startNumberOverride) {
136
+ var bullet = (0, roosterjs_content_model_dom_1.getOrderedListNumberStr)(roosterjs_content_model_dom_1.NumberingListType[orderedBulletType], parseInt(startNumberOverride));
137
+ switch (orderedBulletType) {
138
+ case 'Decimal':
139
+ case 'UpperAlpha':
140
+ case 'LowerAlpha':
141
+ case 'UpperRoman':
142
+ case 'LowerRoman':
143
+ return bullet + '.';
144
+ case 'DecimalParenthesis':
145
+ case 'LowerAlphaParenthesis':
146
+ return bullet + ')';
147
+ default:
148
+ return undefined;
149
+ }
150
+ }
20
151
  //# sourceMappingURL=processPastedContentFromPowerPoint.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"processPastedContentFromPowerPoint.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-plugins/lib/paste/PowerPoint/processPastedContentFromPowerPoint.ts"],"names":[],"mappings":";;;AAAA,2EAA6D;AAG7D;;;;GAIG;AAEH,SAAgB,kCAAkC,CAC9C,KAAuB,EACvB,UAAsB;IAEd,IAAA,QAAQ,GAAoB,KAAK,SAAzB,EAAE,aAAa,GAAK,KAAK,cAAV,CAAW;IAE1C,IAAI,aAAa,CAAC,IAAI,IAAI,CAAC,aAAa,CAAC,IAAI,IAAI,aAAa,CAAC,KAAK,EAAE;QAClE,gFAAgF;QAChF,gCAAgC;QAChC,IAAM,GAAG,GAAG,UAAU,CAAC,SAAS,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;QAErD,IAAA,4CAAc,EAAC,QAAQ,EAAE,GAAG,aAAH,GAAG,uBAAH,GAAG,CAAE,IAAI,CAAC,CAAC;KACvC;AACL,CAAC;AAbD,gFAaC","sourcesContent":["import { moveChildNodes } from 'roosterjs-content-model-dom';\nimport type { BeforePasteEvent, DOMCreator } from 'roosterjs-content-model-types';\n\n/**\n * @internal\n * Convert pasted content from PowerPoint\n * @param event The BeforePaste event\n */\n\nexport function processPastedContentFromPowerPoint(\n event: BeforePasteEvent,\n domCreator: DOMCreator\n) {\n const { fragment, clipboardData } = event;\n\n if (clipboardData.html && !clipboardData.text && clipboardData.image) {\n // It is possible that PowerPoint copied both image and HTML but not plain text.\n // We always prefer HTML if any.\n const doc = domCreator.htmlToDOM(clipboardData.html);\n\n moveChildNodes(fragment, doc?.body);\n }\n}\n"]}
1
+ {"version":3,"file":"processPastedContentFromPowerPoint.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-plugins/lib/paste/PowerPoint/processPastedContentFromPowerPoint.ts"],"names":[],"mappings":"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","sourcesContent":["import { addParser } from '../utils/addParser';\nimport { processAsListItem, setupListFormat } from '../utils/customListUtils';\nimport { removeNegativeTextIndentParser } from '../parsers/removeNegativeTextIndentParser';\nimport { setProcessor } from '../utils/setProcessor';\nimport {\n BulletListType,\n getOrderedListNumberStr,\n moveChildNodes,\n NumberingListType,\n} from 'roosterjs-content-model-dom';\nimport type {\n BeforePasteEvent,\n ContentModelListItemLevelFormat,\n DOMCreator,\n} from 'roosterjs-content-model-types';\n\nconst BulletSelector = '* > span > span[style*=mso-special-format]';\nconst MsOfficeSpecialFormat = 'mso-special-format';\nconst CssStyleKey = 'style';\nconst MsoSpecialFormatRegex = /mso-special-format:\\s*([^;]*)/;\n\nconst clearListItemStyles = (format: ContentModelListItemLevelFormat): void => {\n delete format.textAlign;\n delete format.marginLeft;\n delete format.paddingLeft;\n};\n/**\n * @internal\n * Convert pasted content from PowerPoint\n * @param event The BeforePaste event\n */\n\nexport function processPastedContentFromPowerPoint(\n event: BeforePasteEvent,\n domCreator: DOMCreator\n) {\n const { fragment, clipboardData, domToModelOption } = event;\n\n if (clipboardData.html && !clipboardData.text && clipboardData.image) {\n // It is possible that PowerPoint copied both image and HTML but not plain text.\n // We always prefer HTML if any.\n const doc = domCreator.htmlToDOM(clipboardData.html);\n\n moveChildNodes(fragment, doc?.body);\n }\n\n addParser(domToModelOption, 'block', removeNegativeTextIndentParser);\n\n setProcessor(domToModelOption, 'element', (group, element, context) => {\n const style = element.getAttribute(CssStyleKey) || '';\n // If the element is the bullet element, just ignore it, otherwise we will see an extra bullet in the list\n if (style.includes(MsOfficeSpecialFormat) && context.listFormat.levels.length > 0) {\n return;\n }\n const bulletElement = element.querySelector(BulletSelector) as HTMLElement;\n if (bulletElement) {\n const {\n depth,\n unorderedBulletType,\n orderedBulletType,\n startNumberOverrideOrBullet,\n isOrderedList,\n isNewList,\n } = extractPowerPointListInfo(element, bulletElement);\n\n // Setup the listformat with the metadata extracted from the bullet element\n setupListFormat(\n isOrderedList ? 'OL' : 'UL',\n element,\n context,\n depth,\n context.listFormat,\n group,\n [clearListItemStyles]\n );\n\n // Set the metadata for the list item, which will be used to set the correct bullet style type\n const listMetadata = {\n unorderedStyleType:\n !isOrderedList && unorderedBulletType\n ? BulletListType[unorderedBulletType]\n : undefined,\n orderedStyleType:\n isOrderedList && orderedBulletType\n ? NumberingListType[orderedBulletType]\n : undefined,\n };\n\n // Process the Div element as a list item.\n processAsListItem(context, element, group, listMetadata, listItem => {\n const currentMarkerSize = listItem.formatHolder.format.fontSize;\n const bulletElementSize = bulletElement.parentElement?.style.fontSize;\n listItem.formatHolder.format.fontSize = bulletElementSize || currentMarkerSize;\n if (isNewList) {\n listItem.levels[\n listItem.levels.length - 1\n ].format.startNumberOverride = parseInt(startNumberOverrideOrBullet);\n }\n clearListItemStyles(listItem.levels[listItem.levels.length - 1].format);\n clearListItemStyles(listItem.format);\n });\n } else {\n context.defaultElementProcessors.element?.(group, element, context);\n }\n });\n}\n\n/**\n * Extract list information from PowerPoint pasted content\n *\n * The lists from PowerPoint are represent as:\n *\n * - The class 0# represents the depth of the list, if the list is in the first level, the class attribute wont be present.\n * - The mso-special-format style represents the type of bullet and the start of the list.\n * The first part of the mso-special-format is the type of bullet, and the second part is the start of the list.\n * - All the items that are in the same list have the same mso-special-format style. Which we are leveraging to identify when a list is new or part of the existing list thread.\n *\n * @example\n * ` <div class=\"O1\" style=\"...\">\n <span style=\"font-size: 5pt\"\n ><span style=\"mso-special-format: 'numbullet6\\,1'; font-family: +mj-lt\"\n >i.</span\n ></span\n ><span style=\"...;\">123</span>\n </div> `\n *\n * @param element The element to extract list information from\n * @param bulletElement The bullet element to extract list information from\n * @returns The extracted list information\n */\nfunction extractPowerPointListInfo(element: HTMLElement, bulletElement: HTMLElement) {\n const className = element.className.substring(1) || '0';\n const depth = parseInt(className) + 1;\n const style = bulletElement.getAttribute(CssStyleKey) || '';\n const msoSpecialFormat = style.match(MsoSpecialFormatRegex);\n const [bulletTypeHtml, startNumberOverrideOrBullet] =\n msoSpecialFormat?.[1].replace('\"', '').split('\\\\,') || [];\n const isOrderedList = OrderedListStyleMap.has(bulletTypeHtml);\n\n const unorderedBulletType = UnorderedBullets.get(bulletElement.innerText);\n const orderedBulletType = OrderedListStyleMap.get(bulletTypeHtml);\n\n return {\n depth,\n unorderedBulletType,\n orderedBulletType,\n startNumberOverrideOrBullet,\n isOrderedList,\n isNewList:\n isOrderedList &&\n !!orderedBulletType &&\n bulletElement.innerText ===\n getPptListStart(orderedBulletType, startNumberOverrideOrBullet),\n };\n}\n\nconst UnorderedBullets: Map<string, keyof typeof BulletListType> = new Map([\n ['•', 'Disc'],\n ['o', 'Circle'],\n ['§', 'Square'],\n ['q', 'BoxShadow'],\n ['v', 'Xrhombus'],\n ['Ø', 'ShortArrow'],\n ['ü', 'CheckMark'],\n]);\n\nconst OrderedListStyleMap: Map<string, keyof typeof NumberingListType> = new Map([\n ['numbullet1', 'UpperAlpha'],\n ['numbullet2', 'DecimalParenthesis'],\n ['numbullet3', 'Decimal'],\n ['numbullet7', 'UpperRoman'],\n ['numbullet9', 'LowerAlphaParenthesis'],\n ['numbullet0', 'LowerAlpha'],\n ['numbullet6', 'LowerRoman'],\n]);\n\nfunction getPptListStart(\n orderedBulletType: keyof typeof NumberingListType,\n startNumberOverride: string\n) {\n const bullet = getOrderedListNumberStr(\n NumberingListType[orderedBulletType],\n parseInt(startNumberOverride)\n );\n switch (orderedBulletType) {\n case 'Decimal':\n case 'UpperAlpha':\n case 'LowerAlpha':\n case 'UpperRoman':\n case 'LowerRoman':\n return bullet + '.';\n case 'DecimalParenthesis':\n case 'LowerAlphaParenthesis':\n return bullet + ')';\n\n default:\n return undefined;\n }\n}\n"]}
@@ -1,5 +1,5 @@
1
1
  import type { WordMetadata } from './WordMetadata';
2
- import type { BeforePasteEvent, DOMCreator } from 'roosterjs-content-model-types';
2
+ import type { BeforePasteEvent } from 'roosterjs-content-model-types';
3
3
  /**
4
4
  * @internal
5
5
  * Word Desktop content has a style tag that contains data for the lists.
@@ -20,4 +20,4 @@ import type { BeforePasteEvent, DOMCreator } from 'roosterjs-content-model-types
20
20
  * 5. Save data in record and only use the required information.
21
21
  *
22
22
  */
23
- export declare function getStyleMetadata(ev: BeforePasteEvent, domCreator: DOMCreator): Map<string, WordMetadata>;
23
+ export declare function getStyleMetadata(ev: BeforePasteEvent): Map<string, WordMetadata>;
@@ -4,6 +4,36 @@ exports.getStyleMetadata = void 0;
4
4
  var tslib_1 = require("tslib");
5
5
  var roosterjs_content_model_dom_1 = require("roosterjs-content-model-dom");
6
6
  var FORMATING_REGEX = /[\n\t'{}"]+/g;
7
+ var STYLE_TAG = '<style';
8
+ var STYLE_TAG_END = '</style>';
9
+ var nonWordCharacterRegex = /\W/;
10
+ function extractStyleTagsFromHtml(htmlContent) {
11
+ var _a;
12
+ var styles = [];
13
+ var _b = extractHtmlIndexes(htmlContent), styleIndex = _b.styleIndex, styleEndIndex = _b.styleEndIndex;
14
+ while (styleIndex >= 0 && styleEndIndex >= 0) {
15
+ var styleContent = htmlContent
16
+ .substring(styleIndex + STYLE_TAG.length, styleEndIndex)
17
+ .trim();
18
+ styles.push(styleContent);
19
+ (_a = extractHtmlIndexes(htmlContent, styleEndIndex + 1), styleIndex = _a.styleIndex, styleEndIndex = _a.styleEndIndex);
20
+ }
21
+ return styles;
22
+ }
23
+ function extractHtmlIndexes(html, startIndex) {
24
+ if (startIndex === void 0) { startIndex = 0; }
25
+ var htmlLowercase = html.toLowerCase();
26
+ var styleIndex = htmlLowercase.indexOf(STYLE_TAG, startIndex);
27
+ var currentIndex = styleIndex + STYLE_TAG.length;
28
+ var nextChar = html.substring(currentIndex, currentIndex + 1);
29
+ while (!nonWordCharacterRegex.test(nextChar) && styleIndex > -1) {
30
+ styleIndex = htmlLowercase.indexOf(STYLE_TAG, styleIndex + 1);
31
+ currentIndex = styleIndex + STYLE_TAG.length;
32
+ nextChar = html.substring(currentIndex, currentIndex + 1);
33
+ }
34
+ var styleEndIndex = htmlLowercase.indexOf(STYLE_TAG_END, startIndex);
35
+ return { styleIndex: styleIndex, styleEndIndex: styleEndIndex };
36
+ }
7
37
  /**
8
38
  * @internal
9
39
  * Word Desktop content has a style tag that contains data for the lists.
@@ -24,12 +54,10 @@ var FORMATING_REGEX = /[\n\t'{}"]+/g;
24
54
  * 5. Save data in record and only use the required information.
25
55
  *
26
56
  */
27
- function getStyleMetadata(ev, domCreator) {
57
+ function getStyleMetadata(ev) {
28
58
  var metadataMap = new Map();
29
- var doc = domCreator.htmlToDOM(ev.htmlBefore);
30
- var styles = doc.querySelectorAll('style');
31
- styles.forEach(function (style) {
32
- var text = (style === null || style === void 0 ? void 0 : style.innerHTML.trim()) || '';
59
+ var headStyles = extractStyleTagsFromHtml(ev.htmlBefore || ev.clipboardData.rawHtml || '');
60
+ headStyles.forEach(function (text) {
33
61
  var index = 0;
34
62
  var _loop_1 = function () {
35
63
  var indexAt = text.indexOf('@', index + 1);
@@ -1 +1 @@
1
- {"version":3,"file":"getStyleMetadata.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-plugins/lib/paste/WordDesktop/getStyleMetadata.ts"],"names":[],"mappings":";;;;AAAA,2EAA4D;AAI5D,IAAM,eAAe,GAAG,cAAc,CAAC;AAEvC;;;;;;;;;;;;;;;;;;;GAmBG;AACH,SAAgB,gBAAgB,CAAC,EAAoB,EAAE,UAAsB;IACzE,IAAM,WAAW,GAA8B,IAAI,GAAG,EAAE,CAAC;IACzD,IAAM,GAAG,GAAG,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC;IAChD,IAAM,MAAM,GAAG,GAAG,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC;IAE7C,MAAM,CAAC,OAAO,CAAC,UAAA,KAAK;QAChB,IAAM,IAAI,GAAG,CAAA,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,SAAS,CAAC,IAAI,EAAE,KAAI,EAAE,CAAC;QAE3C,IAAI,KAAK,GAAG,CAAC,CAAC;;YAEV,IAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;YAC7C,IAAM,aAAa,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;YACjD,IAAM,eAAe,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;YACnD,KAAK,GAAG,OAAO,CAAC;YAEhB,KAAK;YACL,IAAM,YAAY,GAAG,IAAI;iBACpB,SAAS,CAAC,OAAO,GAAG,CAAC,EAAE,eAAe,CAAC;iBACvC,OAAO,CAAC,eAAe,EAAE,EAAE,CAAC;iBAC5B,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;iBACnB,SAAS,EAAE;iBACX,QAAQ,EAAE,CAAC;YAEhB,KAAK;YACL,IAAM,QAAQ,GAAG,IAAI;iBAChB,SAAS,CAAC,eAAe,EAAE,aAAa,GAAG,CAAC,CAAC;iBAC7C,QAAQ,EAAE;iBACV,SAAS,EAAE,CAAC;YACjB,IAAM,MAAM,GAA2B,EAAE,CAAC;YAE1C,KAAK;YACL,IAAM,OAAO,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YACpC,OAAO,CAAC,OAAO,CAAC,UAAA,KAAK;gBACjB,KAAK;gBACC,IAAA,KAAA,oBAAe,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,IAAA,EAA9B,GAAG,QAAA,EAAE,KAAK,QAAoB,CAAC;gBACtC,IAAI,GAAG,IAAI,KAAK,EAAE;oBACd,IAAM,WAAW,GAAG,GAAG,CAAC,OAAO,CAAC,eAAe,EAAE,EAAE,CAAC,CAAC,SAAS,EAAE,CAAC,QAAQ,EAAE,CAAC;oBAC5E,IAAM,aAAa,GAAG,KAAK,CAAC,OAAO,CAAC,eAAe,EAAE,EAAE,CAAC,CAAC,SAAS,EAAE,CAAC,QAAQ,EAAE,CAAC;oBAChF,KAAK;oBACL,MAAM,CAAC,WAAW,CAAC,GAAG,aAAa,CAAC;iBACvC;YACL,CAAC,CAAC,CAAC;YAEH,IAAM,IAAI,GAAiB;gBACvB,yBAAyB,EAAE,MAAM,CAAC,yBAAyB,CAAC;gBAC5D,oBAAoB,EAAE,MAAM,CAAC,oBAAoB,CAAC,IAAI,GAAG;gBACzD,gBAAgB,EAAE,MAAM,CAAC,gBAAgB,CAAC;aAC7C,CAAC;YACF,IAAI,IAAA,2CAAa,EAAC,IAAI,CAAC,CAAC,IAAI,CAAC,UAAA,GAAG,IAAI,OAAA,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAX,CAAW,CAAC,EAAE;gBAC9C,WAAW,CAAC,GAAG,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC;aACvC;;QAzCL,OAAO,KAAK,IAAI,CAAC;;SA0ChB;IACL,CAAC,CAAC,CAAC;IACH,OAAO,WAAW,CAAC;AACvB,CAAC;AAtDD,4CAsDC","sourcesContent":["import { getObjectKeys } from 'roosterjs-content-model-dom';\nimport type { WordMetadata } from './WordMetadata';\nimport type { BeforePasteEvent, DOMCreator } from 'roosterjs-content-model-types';\n\nconst FORMATING_REGEX = /[\\n\\t'{}\"]+/g;\n\n/**\n * @internal\n * Word Desktop content has a style tag that contains data for the lists.\n * So this function query that style tag and extract the data from the innerHTML, since it is not available from the HTMLStyleElement.sheet.\n *\n * The format is like:\n * example of style element content\n * @list l0:level1 {\n * styleTag: styleValue;\n * ...\n * }\n *\n * To extract the data:\n * 1. Substring the value of the style selector, using @ index and { index\n * 2. Substring the value of the style rules by Substring the content between { and }\n * 3. Split the value of the rules using ; as separator { styleTag: styleValue; styleTag1: StyleValue1 } = ['styleTag: styleValue', 'styleTag1: StyleValue1']\n * 4. Split the value of the rule using : as separator: styleTag: styleValue = [styleTag, styleValue]\n * 5. Save data in record and only use the required information.\n *\n */\nexport function getStyleMetadata(ev: BeforePasteEvent, domCreator: DOMCreator) {\n const metadataMap: Map<string, WordMetadata> = new Map();\n const doc = domCreator.htmlToDOM(ev.htmlBefore);\n const styles = doc.querySelectorAll('style');\n\n styles.forEach(style => {\n const text = style?.innerHTML.trim() || '';\n\n let index = 0;\n while (index >= 0) {\n const indexAt = text.indexOf('@', index + 1);\n const indexCurlyEnd = text.indexOf('}', indexAt);\n const indexCurlyStart = text.indexOf('{', indexAt);\n index = indexAt;\n\n // 1.\n const metadataName = text\n .substring(indexAt + 1, indexCurlyStart)\n .replace(FORMATING_REGEX, '')\n .replace('list', '')\n .trimRight()\n .trimLeft();\n\n // 2.\n const dataName = text\n .substring(indexCurlyStart, indexCurlyEnd + 1)\n .trimLeft()\n .trimRight();\n const record: Record<string, string> = {};\n\n // 3.\n const entries = dataName.split(';');\n entries.forEach(entry => {\n // 4.\n const [key, value] = entry.split(':');\n if (key && value) {\n const formatedKey = key.replace(FORMATING_REGEX, '').trimRight().trimLeft();\n const formatedValue = value.replace(FORMATING_REGEX, '').trimRight().trimLeft();\n // 5.\n record[formatedKey] = formatedValue;\n }\n });\n\n const data: WordMetadata = {\n 'mso-level-number-format': record['mso-level-number-format'],\n 'mso-level-start-at': record['mso-level-start-at'] || '1',\n 'mso-level-text': record['mso-level-text'],\n };\n if (getObjectKeys(data).some(key => !!data[key])) {\n metadataMap.set(metadataName, data);\n }\n }\n });\n return metadataMap;\n}\n"]}
1
+ {"version":3,"file":"getStyleMetadata.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-plugins/lib/paste/WordDesktop/getStyleMetadata.ts"],"names":[],"mappings":"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","sourcesContent":["import { getObjectKeys } from 'roosterjs-content-model-dom';\nimport type { WordMetadata } from './WordMetadata';\nimport type { BeforePasteEvent } from 'roosterjs-content-model-types';\n\nconst FORMATING_REGEX = /[\\n\\t'{}\"]+/g;\nconst STYLE_TAG = '<style';\nconst STYLE_TAG_END = '</style>';\nconst nonWordCharacterRegex = /\\W/;\n\nfunction extractStyleTagsFromHtml(htmlContent: string): string[] {\n const styles: string[] = [];\n\n let { styleIndex, styleEndIndex } = extractHtmlIndexes(htmlContent);\n while (styleIndex >= 0 && styleEndIndex >= 0) {\n const styleContent = htmlContent\n .substring(styleIndex + STYLE_TAG.length, styleEndIndex)\n .trim();\n styles.push(styleContent);\n ({ styleIndex, styleEndIndex } = extractHtmlIndexes(htmlContent, styleEndIndex + 1));\n }\n return styles;\n}\n\nfunction extractHtmlIndexes(html: string, startIndex: number = 0) {\n const htmlLowercase = html.toLowerCase();\n let styleIndex = htmlLowercase.indexOf(STYLE_TAG, startIndex);\n let currentIndex = styleIndex + STYLE_TAG.length;\n let nextChar = html.substring(currentIndex, currentIndex + 1);\n\n while (!nonWordCharacterRegex.test(nextChar) && styleIndex > -1) {\n styleIndex = htmlLowercase.indexOf(STYLE_TAG, styleIndex + 1);\n currentIndex = styleIndex + STYLE_TAG.length;\n nextChar = html.substring(currentIndex, currentIndex + 1);\n }\n\n const styleEndIndex = htmlLowercase.indexOf(STYLE_TAG_END, startIndex);\n return { styleIndex, styleEndIndex };\n}\n\n/**\n * @internal\n * Word Desktop content has a style tag that contains data for the lists.\n * So this function query that style tag and extract the data from the innerHTML, since it is not available from the HTMLStyleElement.sheet.\n *\n * The format is like:\n * example of style element content\n * @list l0:level1 {\n * styleTag: styleValue;\n * ...\n * }\n *\n * To extract the data:\n * 1. Substring the value of the style selector, using @ index and { index\n * 2. Substring the value of the style rules by Substring the content between { and }\n * 3. Split the value of the rules using ; as separator { styleTag: styleValue; styleTag1: StyleValue1 } = ['styleTag: styleValue', 'styleTag1: StyleValue1']\n * 4. Split the value of the rule using : as separator: styleTag: styleValue = [styleTag, styleValue]\n * 5. Save data in record and only use the required information.\n *\n */\nexport function getStyleMetadata(ev: BeforePasteEvent) {\n const metadataMap: Map<string, WordMetadata> = new Map();\n const headStyles = extractStyleTagsFromHtml(ev.htmlBefore || ev.clipboardData.rawHtml || '');\n\n headStyles.forEach(text => {\n let index = 0;\n while (index >= 0) {\n const indexAt = text.indexOf('@', index + 1);\n const indexCurlyEnd = text.indexOf('}', indexAt);\n const indexCurlyStart = text.indexOf('{', indexAt);\n index = indexAt;\n\n // 1.\n const metadataName = text\n .substring(indexAt + 1, indexCurlyStart)\n .replace(FORMATING_REGEX, '')\n .replace('list', '')\n .trimRight()\n .trimLeft();\n\n // 2.\n const dataName = text\n .substring(indexCurlyStart, indexCurlyEnd + 1)\n .trimLeft()\n .trimRight();\n const record: Record<string, string> = {};\n\n // 3.\n const entries = dataName.split(';');\n entries.forEach(entry => {\n // 4.\n const [key, value] = entry.split(':');\n if (key && value) {\n const formatedKey = key.replace(FORMATING_REGEX, '').trimRight().trimLeft();\n const formatedValue = value.replace(FORMATING_REGEX, '').trimRight().trimLeft();\n // 5.\n record[formatedKey] = formatedValue;\n }\n });\n\n const data: WordMetadata = {\n 'mso-level-number-format': record['mso-level-number-format'],\n 'mso-level-start-at': record['mso-level-start-at'] || '1',\n 'mso-level-text': record['mso-level-text'],\n };\n if (getObjectKeys(data).some(key => !!data[key])) {\n metadataMap.set(metadataName, data);\n }\n }\n });\n\n return metadataMap;\n}\n"]}
@@ -1,7 +1,7 @@
1
- import type { BeforePasteEvent, DOMCreator } from 'roosterjs-content-model-types';
1
+ import type { BeforePasteEvent } from 'roosterjs-content-model-types';
2
2
  /**
3
3
  * @internal
4
4
  * Handles Pasted content when source is Word Desktop
5
5
  * @param ev BeforePasteEvent
6
6
  */
7
- export declare function processPastedContentFromWordDesktop(ev: BeforePasteEvent, domCreator: DOMCreator): void;
7
+ export declare function processPastedContentFromWordDesktop(ev: BeforePasteEvent): void;
@@ -6,7 +6,7 @@ var getStyleMetadata_1 = require("./getStyleMetadata");
6
6
  var getStyles_1 = require("../utils/getStyles");
7
7
  var processWordComments_1 = require("./processWordComments");
8
8
  var processWordLists_1 = require("./processWordLists");
9
- var removeNegativeTextIndentParser_1 = require("./removeNegativeTextIndentParser");
9
+ var removeNegativeTextIndentParser_1 = require("../parsers/removeNegativeTextIndentParser");
10
10
  var setProcessor_1 = require("../utils/setProcessor");
11
11
  var PERCENTAGE_REGEX = /%/;
12
12
  // Default line height in browsers according to https://developer.mozilla.org/en-US/docs/Web/CSS/line-height#normal
@@ -16,8 +16,8 @@ var DEFAULT_BROWSER_LINE_HEIGHT_PERCENTAGE = 1.2;
16
16
  * Handles Pasted content when source is Word Desktop
17
17
  * @param ev BeforePasteEvent
18
18
  */
19
- function processPastedContentFromWordDesktop(ev, domCreator) {
20
- var metadataMap = (0, getStyleMetadata_1.getStyleMetadata)(ev, domCreator);
19
+ function processPastedContentFromWordDesktop(ev) {
20
+ var metadataMap = (0, getStyleMetadata_1.getStyleMetadata)(ev);
21
21
  (0, setProcessor_1.setProcessor)(ev.domToModelOption, 'element', wordDesktopElementProcessor(metadataMap));
22
22
  (0, addParser_1.addParser)(ev.domToModelOption, 'block', adjustPercentileLineHeight);
23
23
  (0, addParser_1.addParser)(ev.domToModelOption, 'block', removeNegativeTextIndentParser_1.removeNegativeTextIndentParser);
@@ -45,12 +45,12 @@ function adjustPercentileLineHeight(format, element) {
45
45
  (parsedLineHeight / 100)).toString();
46
46
  }
47
47
  }
48
- function listLevelParser(format, element, context, defaultStyle) {
48
+ var listLevelParser = function (format, element, _context, defaultStyle) {
49
49
  if (element.style.marginLeft != '') {
50
50
  format.marginLeft = defaultStyle.marginLeft;
51
51
  }
52
52
  format.marginBottom = undefined;
53
- }
53
+ };
54
54
  var wordTableParser = function (format) {
55
55
  var _a;
56
56
  if ((_a = format.marginLeft) === null || _a === void 0 ? void 0 : _a.startsWith('-')) {
@@ -1 +1 @@
1
- {"version":3,"file":"processPastedContentFromWordDesktop.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-plugins/lib/paste/WordDesktop/processPastedContentFromWordDesktop.ts"],"names":[],"mappings":";;;AAAA,gDAA+C;AAC/C,uDAAsD;AACtD,gDAA+C;AAC/C,6DAA4D;AAC5D,uDAAqD;AACrD,mFAAkF;AAClF,sDAAqD;AAarD,IAAM,gBAAgB,GAAG,GAAG,CAAC;AAC7B,mHAAmH;AACnH,IAAM,sCAAsC,GAAG,GAAG,CAAC;AAEnD;;;;GAIG;AACH,SAAgB,mCAAmC,CAAC,EAAoB,EAAE,UAAsB;IAC5F,IAAM,WAAW,GAA8B,IAAA,mCAAgB,EAAC,EAAE,EAAE,UAAU,CAAC,CAAC;IAEhF,IAAA,2BAAY,EAAC,EAAE,CAAC,gBAAgB,EAAE,SAAS,EAAE,2BAA2B,CAAC,WAAW,CAAC,CAAC,CAAC;IACvF,IAAA,qBAAS,EAAC,EAAE,CAAC,gBAAgB,EAAE,OAAO,EAAE,0BAA0B,CAAC,CAAC;IACpE,IAAA,qBAAS,EAAC,EAAE,CAAC,gBAAgB,EAAE,OAAO,EAAE,+DAA8B,CAAC,CAAC;IACxE,IAAA,qBAAS,EAAC,EAAE,CAAC,gBAAgB,EAAE,WAAW,EAAE,eAAe,CAAC,CAAC;IAC7D,IAAA,qBAAS,EAAC,EAAE,CAAC,gBAAgB,EAAE,WAAW,EAAE,eAAe,CAAC,CAAC;IAC7D,IAAA,qBAAS,EAAC,EAAE,CAAC,gBAAgB,EAAE,OAAO,EAAE,eAAe,CAAC,CAAC;AAC7D,CAAC;AATD,kFASC;AAED,IAAM,2BAA2B,GAAG,UAChC,WAAsC;IAEtC,OAAO,UAAC,KAAK,EAAE,OAAO,EAAE,OAAO;QAC3B,IAAM,MAAM,GAAG,IAAA,qBAAS,EAAC,OAAO,CAAC,CAAC;QAClC,4FAA4F;QAC5F,IACI,CAAC,CACG,IAAA,kCAAe,EAAC,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,WAAW,CAAC;YAC7D,IAAA,yCAAmB,EAAC,MAAM,EAAE,OAAO,CAAC,CACvC,EACH;YACE,OAAO,CAAC,wBAAwB,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;SACrE;IACL,CAAC,CAAC;AACN,CAAC,CAAC;AAEF,SAAS,0BAA0B,CAAC,MAA+B,EAAE,OAAoB;IACrF,kHAAkH;IAClH,IAAI,gBAAwB,CAAC;IAC7B,IACI,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC;QAC/C,CAAC,KAAK,CAAC,CAAC,gBAAgB,GAAG,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,EACjE;QACE,MAAM,CAAC,UAAU,GAAG,CAChB,sCAAsC;YACtC,CAAC,gBAAgB,GAAG,GAAG,CAAC,CAC3B,CAAC,QAAQ,EAAE,CAAC;KAChB;AACL,CAAC;AAED,SAAS,eAAe,CACpB,MAAuC,EACvC,OAAoB,EACpB,OAA0B,EAC1B,YAAoD;IAEpD,IAAI,OAAO,CAAC,KAAK,CAAC,UAAU,IAAI,EAAE,EAAE;QAChC,MAAM,CAAC,UAAU,GAAG,YAAY,CAAC,UAAU,CAAC;KAC/C;IAED,MAAM,CAAC,YAAY,GAAG,SAAS,CAAC;AACpC,CAAC;AAED,IAAM,eAAe,GAA0C,UAAC,MAAM;;IAClE,IAAI,MAAA,MAAM,CAAC,UAAU,0CAAE,UAAU,CAAC,GAAG,CAAC,EAAE;QACpC,OAAO,MAAM,CAAC,UAAU,CAAC;KAC5B;AACL,CAAC,CAAC","sourcesContent":["import { addParser } from '../utils/addParser';\nimport { getStyleMetadata } from './getStyleMetadata';\nimport { getStyles } from '../utils/getStyles';\nimport { processWordComments } from './processWordComments';\nimport { processWordList } from './processWordLists';\nimport { removeNegativeTextIndentParser } from './removeNegativeTextIndentParser';\nimport { setProcessor } from '../utils/setProcessor';\nimport type { WordMetadata } from './WordMetadata';\nimport type {\n BeforePasteEvent,\n ContentModelBlockFormat,\n ContentModelListItemLevelFormat,\n ContentModelTableFormat,\n DOMCreator,\n DomToModelContext,\n ElementProcessor,\n FormatParser,\n} from 'roosterjs-content-model-types';\n\nconst PERCENTAGE_REGEX = /%/;\n// Default line height in browsers according to https://developer.mozilla.org/en-US/docs/Web/CSS/line-height#normal\nconst DEFAULT_BROWSER_LINE_HEIGHT_PERCENTAGE = 1.2;\n\n/**\n * @internal\n * Handles Pasted content when source is Word Desktop\n * @param ev BeforePasteEvent\n */\nexport function processPastedContentFromWordDesktop(ev: BeforePasteEvent, domCreator: DOMCreator) {\n const metadataMap: Map<string, WordMetadata> = getStyleMetadata(ev, domCreator);\n\n setProcessor(ev.domToModelOption, 'element', wordDesktopElementProcessor(metadataMap));\n addParser(ev.domToModelOption, 'block', adjustPercentileLineHeight);\n addParser(ev.domToModelOption, 'block', removeNegativeTextIndentParser);\n addParser(ev.domToModelOption, 'listLevel', listLevelParser);\n addParser(ev.domToModelOption, 'container', wordTableParser);\n addParser(ev.domToModelOption, 'table', wordTableParser);\n}\n\nconst wordDesktopElementProcessor = (\n metadataKey: Map<string, WordMetadata>\n): ElementProcessor<HTMLElement> => {\n return (group, element, context) => {\n const styles = getStyles(element);\n // Process Word Lists or Word Commands, otherwise use the default processor on this element.\n if (\n !(\n processWordList(styles, group, element, context, metadataKey) ||\n processWordComments(styles, element)\n )\n ) {\n context.defaultElementProcessors.element(group, element, context);\n }\n };\n};\n\nfunction adjustPercentileLineHeight(format: ContentModelBlockFormat, element: HTMLElement): void {\n //If the line height is less than the browser default line height, line between the text is going to be too narrow\n let parsedLineHeight: number;\n if (\n PERCENTAGE_REGEX.test(element.style.lineHeight) &&\n !isNaN((parsedLineHeight = parseInt(element.style.lineHeight)))\n ) {\n format.lineHeight = (\n DEFAULT_BROWSER_LINE_HEIGHT_PERCENTAGE *\n (parsedLineHeight / 100)\n ).toString();\n }\n}\n\nfunction listLevelParser(\n format: ContentModelListItemLevelFormat,\n element: HTMLElement,\n context: DomToModelContext,\n defaultStyle: Readonly<Partial<CSSStyleDeclaration>>\n): void {\n if (element.style.marginLeft != '') {\n format.marginLeft = defaultStyle.marginLeft;\n }\n\n format.marginBottom = undefined;\n}\n\nconst wordTableParser: FormatParser<ContentModelTableFormat> = (format): void => {\n if (format.marginLeft?.startsWith('-')) {\n delete format.marginLeft;\n }\n};\n"]}
1
+ {"version":3,"file":"processPastedContentFromWordDesktop.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-plugins/lib/paste/WordDesktop/processPastedContentFromWordDesktop.ts"],"names":[],"mappings":";;;AAAA,gDAA+C;AAC/C,uDAAsD;AACtD,gDAA+C;AAC/C,6DAA4D;AAC5D,uDAAqD;AACrD,4FAA2F;AAC3F,sDAAqD;AAYrD,IAAM,gBAAgB,GAAG,GAAG,CAAC;AAC7B,mHAAmH;AACnH,IAAM,sCAAsC,GAAG,GAAG,CAAC;AAEnD;;;;GAIG;AACH,SAAgB,mCAAmC,CAAC,EAAoB;IACpE,IAAM,WAAW,GAA8B,IAAA,mCAAgB,EAAC,EAAE,CAAC,CAAC;IAEpE,IAAA,2BAAY,EAAC,EAAE,CAAC,gBAAgB,EAAE,SAAS,EAAE,2BAA2B,CAAC,WAAW,CAAC,CAAC,CAAC;IACvF,IAAA,qBAAS,EAAC,EAAE,CAAC,gBAAgB,EAAE,OAAO,EAAE,0BAA0B,CAAC,CAAC;IACpE,IAAA,qBAAS,EAAC,EAAE,CAAC,gBAAgB,EAAE,OAAO,EAAE,+DAA8B,CAAC,CAAC;IACxE,IAAA,qBAAS,EAAC,EAAE,CAAC,gBAAgB,EAAE,WAAW,EAAE,eAAe,CAAC,CAAC;IAC7D,IAAA,qBAAS,EAAC,EAAE,CAAC,gBAAgB,EAAE,WAAW,EAAE,eAAe,CAAC,CAAC;IAC7D,IAAA,qBAAS,EAAC,EAAE,CAAC,gBAAgB,EAAE,OAAO,EAAE,eAAe,CAAC,CAAC;AAC7D,CAAC;AATD,kFASC;AAED,IAAM,2BAA2B,GAAG,UAChC,WAAsC;IAEtC,OAAO,UAAC,KAAK,EAAE,OAAO,EAAE,OAAO;QAC3B,IAAM,MAAM,GAAG,IAAA,qBAAS,EAAC,OAAO,CAAC,CAAC;QAClC,4FAA4F;QAC5F,IACI,CAAC,CACG,IAAA,kCAAe,EAAC,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,WAAW,CAAC;YAC7D,IAAA,yCAAmB,EAAC,MAAM,EAAE,OAAO,CAAC,CACvC,EACH;YACE,OAAO,CAAC,wBAAwB,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;SACrE;IACL,CAAC,CAAC;AACN,CAAC,CAAC;AAEF,SAAS,0BAA0B,CAAC,MAA+B,EAAE,OAAoB;IACrF,kHAAkH;IAClH,IAAI,gBAAwB,CAAC;IAC7B,IACI,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC;QAC/C,CAAC,KAAK,CAAC,CAAC,gBAAgB,GAAG,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,EACjE;QACE,MAAM,CAAC,UAAU,GAAG,CAChB,sCAAsC;YACtC,CAAC,gBAAgB,GAAG,GAAG,CAAC,CAC3B,CAAC,QAAQ,EAAE,CAAC;KAChB;AACL,CAAC;AAED,IAAM,eAAe,GAAkD,UACnE,MAAuC,EACvC,OAAoB,EACpB,QAA2B,EAC3B,YAAoD;IAEpD,IAAI,OAAO,CAAC,KAAK,CAAC,UAAU,IAAI,EAAE,EAAE;QAChC,MAAM,CAAC,UAAU,GAAG,YAAY,CAAC,UAAU,CAAC;KAC/C;IAED,MAAM,CAAC,YAAY,GAAG,SAAS,CAAC;AACpC,CAAC,CAAC;AAEF,IAAM,eAAe,GAA0C,UAAC,MAAM;;IAClE,IAAI,MAAA,MAAM,CAAC,UAAU,0CAAE,UAAU,CAAC,GAAG,CAAC,EAAE;QACpC,OAAO,MAAM,CAAC,UAAU,CAAC;KAC5B;AACL,CAAC,CAAC","sourcesContent":["import { addParser } from '../utils/addParser';\nimport { getStyleMetadata } from './getStyleMetadata';\nimport { getStyles } from '../utils/getStyles';\nimport { processWordComments } from './processWordComments';\nimport { processWordList } from './processWordLists';\nimport { removeNegativeTextIndentParser } from '../parsers/removeNegativeTextIndentParser';\nimport { setProcessor } from '../utils/setProcessor';\nimport type { WordMetadata } from './WordMetadata';\nimport type {\n BeforePasteEvent,\n ContentModelBlockFormat,\n ContentModelListItemLevelFormat,\n ContentModelTableFormat,\n DomToModelContext,\n ElementProcessor,\n FormatParser,\n} from 'roosterjs-content-model-types';\n\nconst PERCENTAGE_REGEX = /%/;\n// Default line height in browsers according to https://developer.mozilla.org/en-US/docs/Web/CSS/line-height#normal\nconst DEFAULT_BROWSER_LINE_HEIGHT_PERCENTAGE = 1.2;\n\n/**\n * @internal\n * Handles Pasted content when source is Word Desktop\n * @param ev BeforePasteEvent\n */\nexport function processPastedContentFromWordDesktop(ev: BeforePasteEvent) {\n const metadataMap: Map<string, WordMetadata> = getStyleMetadata(ev);\n\n setProcessor(ev.domToModelOption, 'element', wordDesktopElementProcessor(metadataMap));\n addParser(ev.domToModelOption, 'block', adjustPercentileLineHeight);\n addParser(ev.domToModelOption, 'block', removeNegativeTextIndentParser);\n addParser(ev.domToModelOption, 'listLevel', listLevelParser);\n addParser(ev.domToModelOption, 'container', wordTableParser);\n addParser(ev.domToModelOption, 'table', wordTableParser);\n}\n\nconst wordDesktopElementProcessor = (\n metadataKey: Map<string, WordMetadata>\n): ElementProcessor<HTMLElement> => {\n return (group, element, context) => {\n const styles = getStyles(element);\n // Process Word Lists or Word Commands, otherwise use the default processor on this element.\n if (\n !(\n processWordList(styles, group, element, context, metadataKey) ||\n processWordComments(styles, element)\n )\n ) {\n context.defaultElementProcessors.element(group, element, context);\n }\n };\n};\n\nfunction adjustPercentileLineHeight(format: ContentModelBlockFormat, element: HTMLElement): void {\n //If the line height is less than the browser default line height, line between the text is going to be too narrow\n let parsedLineHeight: number;\n if (\n PERCENTAGE_REGEX.test(element.style.lineHeight) &&\n !isNaN((parsedLineHeight = parseInt(element.style.lineHeight)))\n ) {\n format.lineHeight = (\n DEFAULT_BROWSER_LINE_HEIGHT_PERCENTAGE *\n (parsedLineHeight / 100)\n ).toString();\n }\n}\n\nconst listLevelParser: FormatParser<ContentModelListItemLevelFormat> = (\n format: ContentModelListItemLevelFormat,\n element: HTMLElement,\n _context: DomToModelContext,\n defaultStyle: Readonly<Partial<CSSStyleDeclaration>>\n) => {\n if (element.style.marginLeft != '') {\n format.marginLeft = defaultStyle.marginLeft;\n }\n\n format.marginBottom = undefined;\n};\n\nconst wordTableParser: FormatParser<ContentModelTableFormat> = (format): void => {\n if (format.marginLeft?.startsWith('-')) {\n delete format.marginLeft;\n }\n};\n"]}