roosterjs-content-model-plugins 0.23.0 → 0.24.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 (154) hide show
  1. package/lib/edit/ContentModelEditPlugin.d.ts +2 -2
  2. package/lib/edit/ContentModelEditPlugin.js +1 -2
  3. package/lib/edit/ContentModelEditPlugin.js.map +1 -1
  4. package/lib/edit/deleteSteps/deleteList.d.ts +5 -0
  5. package/lib/edit/deleteSteps/deleteList.js +24 -0
  6. package/lib/edit/deleteSteps/deleteList.js.map +1 -0
  7. package/lib/edit/handleKeyboardEventCommon.d.ts +2 -3
  8. package/lib/edit/handleKeyboardEventCommon.js +1 -1
  9. package/lib/edit/handleKeyboardEventCommon.js.map +1 -1
  10. package/lib/edit/keyboardDelete.d.ts +2 -2
  11. package/lib/edit/keyboardDelete.js +8 -1
  12. package/lib/edit/keyboardDelete.js.map +1 -1
  13. package/lib/edit/keyboardInput.d.ts +2 -2
  14. package/lib/edit/keyboardInput.js.map +1 -1
  15. package/lib/paste/ContentModelPastePlugin.d.ts +2 -2
  16. package/lib/paste/ContentModelPastePlugin.js +16 -25
  17. package/lib/paste/ContentModelPastePlugin.js.map +1 -1
  18. package/lib/paste/Excel/processPastedContentFromExcel.d.ts +2 -3
  19. package/lib/paste/Excel/processPastedContentFromExcel.js.map +1 -1
  20. package/lib/paste/PowerPoint/processPastedContentFromPowerPoint.d.ts +1 -1
  21. package/lib/paste/PowerPoint/processPastedContentFromPowerPoint.js.map +1 -1
  22. package/lib/paste/WacComponents/processPastedContentWacComponents.d.ts +2 -2
  23. package/lib/paste/WacComponents/processPastedContentWacComponents.js +59 -61
  24. package/lib/paste/WacComponents/processPastedContentWacComponents.js.map +1 -1
  25. package/lib/paste/WordDesktop/getStyleMetadata.d.ts +2 -2
  26. package/lib/paste/WordDesktop/getStyleMetadata.js.map +1 -1
  27. package/lib/paste/WordDesktop/processPastedContentFromWordDesktop.d.ts +2 -2
  28. package/lib/paste/WordDesktop/processPastedContentFromWordDesktop.js +2 -0
  29. package/lib/paste/WordDesktop/processPastedContentFromWordDesktop.js.map +1 -1
  30. package/lib/paste/WordDesktop/processWordLists.js +2 -0
  31. package/lib/paste/WordDesktop/processWordLists.js.map +1 -1
  32. package/lib/paste/WordDesktop/removeNegativeTextIndentParser.d.ts +5 -0
  33. package/lib/paste/WordDesktop/removeNegativeTextIndentParser.js +14 -0
  34. package/lib/paste/WordDesktop/removeNegativeTextIndentParser.js.map +1 -0
  35. package/lib/paste/pasteSourceValidations/constants.d.ts +5 -5
  36. package/lib/paste/pasteSourceValidations/constants.js +5 -6
  37. package/lib/paste/pasteSourceValidations/constants.js.map +1 -1
  38. package/lib/paste/pasteSourceValidations/getPasteSource.d.ts +1 -2
  39. package/lib/paste/pasteSourceValidations/getPasteSource.js.map +1 -1
  40. package/lib/paste/pasteSourceValidations/isExcelDesktopDocument.js +2 -1
  41. package/lib/paste/pasteSourceValidations/isExcelDesktopDocument.js.map +1 -1
  42. package/lib/paste/pasteSourceValidations/isExcelOnlineDocument.js +3 -2
  43. package/lib/paste/pasteSourceValidations/isExcelOnlineDocument.js.map +1 -1
  44. package/lib/paste/pasteSourceValidations/isGoogleSheetDocument.js +2 -1
  45. package/lib/paste/pasteSourceValidations/isGoogleSheetDocument.js.map +1 -1
  46. package/lib/paste/pasteSourceValidations/isPowerPointDesktopDocument.js +2 -1
  47. package/lib/paste/pasteSourceValidations/isPowerPointDesktopDocument.js.map +1 -1
  48. package/lib/paste/pasteSourceValidations/isWordDesktopDocument.js +2 -1
  49. package/lib/paste/pasteSourceValidations/isWordDesktopDocument.js.map +1 -1
  50. package/lib/paste/utils/addParser.d.ts +2 -2
  51. package/lib/paste/utils/addParser.js.map +1 -1
  52. package/lib-amd/edit/ContentModelEditPlugin.d.ts +2 -2
  53. package/lib-amd/edit/ContentModelEditPlugin.js +1 -2
  54. package/lib-amd/edit/ContentModelEditPlugin.js.map +1 -1
  55. package/lib-amd/edit/deleteSteps/deleteList.d.ts +5 -0
  56. package/lib-amd/edit/deleteSteps/deleteList.js +25 -0
  57. package/lib-amd/edit/deleteSteps/deleteList.js.map +1 -0
  58. package/lib-amd/edit/handleKeyboardEventCommon.d.ts +2 -3
  59. package/lib-amd/edit/handleKeyboardEventCommon.js +1 -1
  60. package/lib-amd/edit/handleKeyboardEventCommon.js.map +1 -1
  61. package/lib-amd/edit/keyboardDelete.d.ts +2 -2
  62. package/lib-amd/edit/keyboardDelete.js +8 -2
  63. package/lib-amd/edit/keyboardDelete.js.map +1 -1
  64. package/lib-amd/edit/keyboardInput.d.ts +2 -2
  65. package/lib-amd/edit/keyboardInput.js.map +1 -1
  66. package/lib-amd/paste/ContentModelPastePlugin.d.ts +2 -2
  67. package/lib-amd/paste/ContentModelPastePlugin.js +16 -26
  68. package/lib-amd/paste/ContentModelPastePlugin.js.map +1 -1
  69. package/lib-amd/paste/Excel/processPastedContentFromExcel.d.ts +2 -3
  70. package/lib-amd/paste/Excel/processPastedContentFromExcel.js.map +1 -1
  71. package/lib-amd/paste/PowerPoint/processPastedContentFromPowerPoint.d.ts +1 -1
  72. package/lib-amd/paste/PowerPoint/processPastedContentFromPowerPoint.js.map +1 -1
  73. package/lib-amd/paste/WacComponents/processPastedContentWacComponents.d.ts +2 -2
  74. package/lib-amd/paste/WacComponents/processPastedContentWacComponents.js +58 -62
  75. package/lib-amd/paste/WacComponents/processPastedContentWacComponents.js.map +1 -1
  76. package/lib-amd/paste/WordDesktop/getStyleMetadata.d.ts +2 -2
  77. package/lib-amd/paste/WordDesktop/getStyleMetadata.js.map +1 -1
  78. package/lib-amd/paste/WordDesktop/processPastedContentFromWordDesktop.d.ts +2 -2
  79. package/lib-amd/paste/WordDesktop/processPastedContentFromWordDesktop.js +2 -1
  80. package/lib-amd/paste/WordDesktop/processPastedContentFromWordDesktop.js.map +1 -1
  81. package/lib-amd/paste/WordDesktop/processWordLists.js +2 -1
  82. package/lib-amd/paste/WordDesktop/processWordLists.js.map +1 -1
  83. package/lib-amd/paste/WordDesktop/removeNegativeTextIndentParser.d.ts +5 -0
  84. package/lib-amd/paste/WordDesktop/removeNegativeTextIndentParser.js +16 -0
  85. package/lib-amd/paste/WordDesktop/removeNegativeTextIndentParser.js.map +1 -0
  86. package/lib-amd/paste/pasteSourceValidations/constants.d.ts +5 -5
  87. package/lib-amd/paste/pasteSourceValidations/constants.js +5 -6
  88. package/lib-amd/paste/pasteSourceValidations/constants.js.map +1 -1
  89. package/lib-amd/paste/pasteSourceValidations/getPasteSource.d.ts +1 -2
  90. package/lib-amd/paste/pasteSourceValidations/getPasteSource.js.map +1 -1
  91. package/lib-amd/paste/pasteSourceValidations/isExcelDesktopDocument.js +2 -2
  92. package/lib-amd/paste/pasteSourceValidations/isExcelDesktopDocument.js.map +1 -1
  93. package/lib-amd/paste/pasteSourceValidations/isExcelOnlineDocument.js +3 -3
  94. package/lib-amd/paste/pasteSourceValidations/isExcelOnlineDocument.js.map +1 -1
  95. package/lib-amd/paste/pasteSourceValidations/isGoogleSheetDocument.js +2 -2
  96. package/lib-amd/paste/pasteSourceValidations/isGoogleSheetDocument.js.map +1 -1
  97. package/lib-amd/paste/pasteSourceValidations/isPowerPointDesktopDocument.js +2 -2
  98. package/lib-amd/paste/pasteSourceValidations/isPowerPointDesktopDocument.js.map +1 -1
  99. package/lib-amd/paste/pasteSourceValidations/isWordDesktopDocument.js +2 -2
  100. package/lib-amd/paste/pasteSourceValidations/isWordDesktopDocument.js.map +1 -1
  101. package/lib-amd/paste/utils/addParser.d.ts +2 -2
  102. package/lib-amd/paste/utils/addParser.js.map +1 -1
  103. package/lib-mjs/edit/ContentModelEditPlugin.d.ts +2 -2
  104. package/lib-mjs/edit/ContentModelEditPlugin.js +1 -2
  105. package/lib-mjs/edit/ContentModelEditPlugin.js.map +1 -1
  106. package/lib-mjs/edit/deleteSteps/deleteList.d.ts +5 -0
  107. package/lib-mjs/edit/deleteSteps/deleteList.js +20 -0
  108. package/lib-mjs/edit/deleteSteps/deleteList.js.map +1 -0
  109. package/lib-mjs/edit/handleKeyboardEventCommon.d.ts +2 -3
  110. package/lib-mjs/edit/handleKeyboardEventCommon.js +1 -1
  111. package/lib-mjs/edit/handleKeyboardEventCommon.js.map +1 -1
  112. package/lib-mjs/edit/keyboardDelete.d.ts +2 -2
  113. package/lib-mjs/edit/keyboardDelete.js +8 -1
  114. package/lib-mjs/edit/keyboardDelete.js.map +1 -1
  115. package/lib-mjs/edit/keyboardInput.d.ts +2 -2
  116. package/lib-mjs/edit/keyboardInput.js.map +1 -1
  117. package/lib-mjs/paste/ContentModelPastePlugin.d.ts +2 -2
  118. package/lib-mjs/paste/ContentModelPastePlugin.js +16 -25
  119. package/lib-mjs/paste/ContentModelPastePlugin.js.map +1 -1
  120. package/lib-mjs/paste/Excel/processPastedContentFromExcel.d.ts +2 -3
  121. package/lib-mjs/paste/Excel/processPastedContentFromExcel.js.map +1 -1
  122. package/lib-mjs/paste/PowerPoint/processPastedContentFromPowerPoint.d.ts +1 -1
  123. package/lib-mjs/paste/PowerPoint/processPastedContentFromPowerPoint.js.map +1 -1
  124. package/lib-mjs/paste/WacComponents/processPastedContentWacComponents.d.ts +2 -2
  125. package/lib-mjs/paste/WacComponents/processPastedContentWacComponents.js +59 -61
  126. package/lib-mjs/paste/WacComponents/processPastedContentWacComponents.js.map +1 -1
  127. package/lib-mjs/paste/WordDesktop/getStyleMetadata.d.ts +2 -2
  128. package/lib-mjs/paste/WordDesktop/getStyleMetadata.js.map +1 -1
  129. package/lib-mjs/paste/WordDesktop/processPastedContentFromWordDesktop.d.ts +2 -2
  130. package/lib-mjs/paste/WordDesktop/processPastedContentFromWordDesktop.js +2 -0
  131. package/lib-mjs/paste/WordDesktop/processPastedContentFromWordDesktop.js.map +1 -1
  132. package/lib-mjs/paste/WordDesktop/processWordLists.js +2 -0
  133. package/lib-mjs/paste/WordDesktop/processWordLists.js.map +1 -1
  134. package/lib-mjs/paste/WordDesktop/removeNegativeTextIndentParser.d.ts +5 -0
  135. package/lib-mjs/paste/WordDesktop/removeNegativeTextIndentParser.js +10 -0
  136. package/lib-mjs/paste/WordDesktop/removeNegativeTextIndentParser.js.map +1 -0
  137. package/lib-mjs/paste/pasteSourceValidations/constants.d.ts +5 -5
  138. package/lib-mjs/paste/pasteSourceValidations/constants.js +5 -6
  139. package/lib-mjs/paste/pasteSourceValidations/constants.js.map +1 -1
  140. package/lib-mjs/paste/pasteSourceValidations/getPasteSource.d.ts +1 -2
  141. package/lib-mjs/paste/pasteSourceValidations/getPasteSource.js.map +1 -1
  142. package/lib-mjs/paste/pasteSourceValidations/isExcelDesktopDocument.js +2 -1
  143. package/lib-mjs/paste/pasteSourceValidations/isExcelDesktopDocument.js.map +1 -1
  144. package/lib-mjs/paste/pasteSourceValidations/isExcelOnlineDocument.js +3 -2
  145. package/lib-mjs/paste/pasteSourceValidations/isExcelOnlineDocument.js.map +1 -1
  146. package/lib-mjs/paste/pasteSourceValidations/isGoogleSheetDocument.js +2 -1
  147. package/lib-mjs/paste/pasteSourceValidations/isGoogleSheetDocument.js.map +1 -1
  148. package/lib-mjs/paste/pasteSourceValidations/isPowerPointDesktopDocument.js +2 -1
  149. package/lib-mjs/paste/pasteSourceValidations/isPowerPointDesktopDocument.js.map +1 -1
  150. package/lib-mjs/paste/pasteSourceValidations/isWordDesktopDocument.js +2 -1
  151. package/lib-mjs/paste/pasteSourceValidations/isWordDesktopDocument.js.map +1 -1
  152. package/lib-mjs/paste/utils/addParser.d.ts +2 -2
  153. package/lib-mjs/paste/utils/addParser.js.map +1 -1
  154. package/package.json +5 -5
@@ -1,11 +1,9 @@
1
- define(["require", "exports", "../utils/addParser", "../utils/setProcessor", "./constants"], function (require, exports, addParser_1, setProcessor_1, constants_1) {
1
+ define(["require", "exports", "tslib", "../utils/addParser", "roosterjs-content-model-dom", "../utils/setProcessor", "./constants"], function (require, exports, tslib_1, addParser_1, roosterjs_content_model_dom_1, setProcessor_1, constants_1) {
2
2
  "use strict";
3
3
  Object.defineProperty(exports, "__esModule", { value: true });
4
4
  exports.processPastedContentWacComponents = void 0;
5
5
  var LIST_ELEMENT_TAGS = ['UL', 'OL', 'LI'];
6
6
  var LIST_ELEMENT_SELECTOR = LIST_ELEMENT_TAGS.join(',');
7
- var COMMENT_BG_COLOR_REST = 'rgba(209, 209, 209, 0.5)';
8
- var COMMENTS_TEXT_HIGHLIGHT_CLICKED = 'rgba(197, 139, 204, 0.5)';
9
7
  /**
10
8
  * Wac components do not use sub and super tags, instead only add vertical align to a span.
11
9
  * This parser normalize the content for content model
@@ -51,31 +49,46 @@ define(["require", "exports", "../utils/addParser", "../utils/setProcessor", "./
51
49
  * This processor calls the default list processor and then sets the correct list level and list bullet.
52
50
  */
53
51
  var wacLiElementProcessor = function (group, element, context) {
54
- var _a, _b, _c;
55
- (_b = (_a = context.defaultElementProcessors).li) === null || _b === void 0 ? void 0 : _b.call(_a, group, element, context);
52
+ var _a, _b, _c, _d, _e;
53
+ var level = parseInt((_a = element.getAttribute('data-aria-level')) !== null && _a !== void 0 ? _a : '');
56
54
  var listFormat = context.listFormat;
55
+ var listType = ((_b = listFormat.levels[context.listFormat.levels.length - 1]) === null || _b === void 0 ? void 0 : _b.listType) ||
56
+ ((_c = element.closest('ol,ul')) === null || _c === void 0 ? void 0 : _c.tagName.toUpperCase());
57
+ var newLevel = (0, roosterjs_content_model_dom_1.createListLevel)(listType, context.blockFormat);
58
+ (0, roosterjs_content_model_dom_1.parseFormat)(element, context.formatParsers.listLevelThread, newLevel.format, context);
59
+ (0, roosterjs_content_model_dom_1.parseFormat)(element, context.formatParsers.listLevel, newLevel.format, context);
60
+ context.listFormat.levels = listFormat.currentListLevels || context.listFormat.levels;
61
+ if (level > 0) {
62
+ if (level > context.listFormat.levels.length) {
63
+ while (level != context.listFormat.levels.length) {
64
+ context.listFormat.levels.push(newLevel);
65
+ }
66
+ }
67
+ else {
68
+ context.listFormat.levels.splice(level, context.listFormat.levels.length - 1);
69
+ context.listFormat.levels[level - 1] = newLevel;
70
+ }
71
+ }
72
+ (_e = (_d = context.defaultElementProcessors).li) === null || _e === void 0 ? void 0 : _e.call(_d, group, element, context);
57
73
  var listParent = listFormat.listParent;
58
74
  if (listParent) {
59
75
  var lastblock = listParent.blocks[listParent.blocks.length - 1];
60
- if (lastblock.blockType == 'BlockGroup' &&
61
- lastblock.blockGroupType == 'ListItem' &&
62
- context.listFormat.listParent !== lastblock) {
76
+ if (lastblock.blockType == 'BlockGroup' && lastblock.blockGroupType == 'ListItem') {
63
77
  var currentLevel = lastblock.levels[lastblock.levels.length - 1];
64
- // Get item level from 'data-aria-level' attribute
65
- var level = parseInt((_c = element.getAttribute('data-aria-level')) !== null && _c !== void 0 ? _c : '');
66
- if (level > 0) {
67
- if (level > lastblock.levels.length) {
68
- while (level != lastblock.levels.length) {
69
- lastblock.levels.push(currentLevel);
70
- }
71
- }
72
- else {
73
- lastblock.levels.splice(level, lastblock.levels.length - 1);
74
- lastblock.levels[level - 1] = currentLevel;
75
- }
76
- }
78
+ updateStartOverride(currentLevel, element, context);
77
79
  }
78
80
  }
81
+ var newLevels = [];
82
+ listFormat.levels.forEach(function (v) {
83
+ var newValue = {
84
+ dataset: (0, tslib_1.__assign)({}, v.dataset),
85
+ format: (0, tslib_1.__assign)({}, v.format),
86
+ listType: v.listType,
87
+ };
88
+ newLevels.push(newValue);
89
+ });
90
+ listFormat.currentListLevels = newLevels;
91
+ listFormat.levels = [];
79
92
  };
80
93
  /**
81
94
  * This parsers does:
@@ -119,10 +132,8 @@ define(["require", "exports", "../utils/addParser", "../utils/setProcessor", "./
119
132
  !element.closest(LIST_ELEMENT_SELECTOR));
120
133
  }
121
134
  var wacCommentParser = function (format, element) {
122
- if ((element.className.includes(constants_1.COMMENT_HIGHLIGHT_CLASS) &&
123
- element.style.backgroundColor == COMMENT_BG_COLOR_REST) ||
124
- (element.className.includes(constants_1.COMMENT_HIGHLIGHT_CLICKED_CLASS) &&
125
- element.style.backgroundColor == COMMENTS_TEXT_HIGHLIGHT_CLICKED)) {
135
+ if (element.className.includes(constants_1.COMMENT_HIGHLIGHT_CLASS) ||
136
+ element.className.includes(constants_1.COMMENT_HIGHLIGHT_CLICKED_CLASS)) {
126
137
  delete format.backgroundColor;
127
138
  }
128
139
  };
@@ -142,49 +153,34 @@ define(["require", "exports", "../utils/addParser", "../utils/setProcessor", "./
142
153
  (0, addParser_1.default)(ev.domToModelOption, 'segment', wacCommentParser);
143
154
  (0, setProcessor_1.setProcessor)(ev.domToModelOption, 'element', wacElementProcessor);
144
155
  (0, setProcessor_1.setProcessor)(ev.domToModelOption, 'li', wacLiElementProcessor);
145
- (0, setProcessor_1.setProcessor)(ev.domToModelOption, 'ol', wacListProcessor);
146
- (0, setProcessor_1.setProcessor)(ev.domToModelOption, 'ul', wacListProcessor);
147
156
  }
148
157
  exports.processPastedContentWacComponents = processPastedContentWacComponents;
149
- /**
150
- * List items from word have this format when using List items:
151
- * @example
152
- <div>
153
- <ol></ol>
154
- </div>
155
- <div>
156
- <ol></ol>
157
- </div>
158
- <div>
159
- <ol></ol>
160
- </div>
161
- * Due to this the div between each of the lists we need to restore the list context to use the previous list,
162
- * otherwise it could create a new list instead under the same list element
163
- */
164
- var wacListProcessor = function (group, element, context) {
165
- var _a, _b, _c, _d, _e;
166
- var lastBlock = group.blocks[group.blocks.length - 1];
167
- var isWrappedInContainer = element.closest("." + constants_1.LIST_CONTAINER_ELEMENT_CLASS_NAME);
168
- if ((_a = isWrappedInContainer === null || isWrappedInContainer === void 0 ? void 0 : isWrappedInContainer.previousElementSibling) === null || _a === void 0 ? void 0 : _a.classList.contains(constants_1.LIST_CONTAINER_ELEMENT_CLASS_NAME)) {
169
- if ((lastBlock === null || lastBlock === void 0 ? void 0 : lastBlock.blockType) === 'BlockGroup' && lastBlock.blockGroupType == 'ListItem') {
170
- context.listFormat = {
171
- threadItemCounts: [],
172
- levels: lastBlock.levels,
173
- listParent: group,
174
- };
175
- }
176
- }
177
- if (element.tagName.toUpperCase() === 'OL') {
178
- (_c = (_b = context.defaultElementProcessors).ol) === null || _c === void 0 ? void 0 : _c.call(_b, group, element, context);
179
- }
180
- else {
181
- (_e = (_d = context.defaultElementProcessors).ul) === null || _e === void 0 ? void 0 : _e.call(_d, group, element, context);
182
- }
183
- };
184
158
  var wacContainerParser = function (format, element) {
185
159
  if (element.style.marginLeft.startsWith('-')) {
186
160
  delete format.marginLeft;
187
161
  }
188
162
  };
163
+ function updateStartOverride(currentLevel, element, ctx) {
164
+ if (!currentLevel || currentLevel.listType == 'UL') {
165
+ return;
166
+ }
167
+ var list = element.closest('ol');
168
+ var listFormat = ctx.listFormat;
169
+ var _a = (0, tslib_1.__read)(extractWordListMetadata(list, element), 2), start = _a[0], listLevel = _a[1];
170
+ if (!listFormat.listItemThread) {
171
+ listFormat.listItemThread = [];
172
+ }
173
+ var thread = listFormat.listItemThread[listLevel];
174
+ if (thread && start - thread != 1) {
175
+ currentLevel.format.startNumberOverride = start;
176
+ }
177
+ listFormat.listItemThread[listLevel] = start;
178
+ }
179
+ function extractWordListMetadata(list, item) {
180
+ var itemIndex = item && Array.from((list === null || list === void 0 ? void 0 : list.querySelectorAll('li')) || []).indexOf(item);
181
+ var start = parseInt((list === null || list === void 0 ? void 0 : list.getAttribute('start')) || '1') + (itemIndex && itemIndex > 0 ? itemIndex : 0);
182
+ var listLevel = parseInt((item === null || item === void 0 ? void 0 : item.getAttribute('data-aria-level')) || '');
183
+ return [start, listLevel];
184
+ }
189
185
  });
190
186
  //# sourceMappingURL=processPastedContentWacComponents.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"processPastedContentWacComponents.js","sourceRoot":"","sources":["../../../../../packages-content-model/roosterjs-content-model-plugins/lib/paste/WacComponents/processPastedContentWacComponents.ts"],"names":[],"mappings":"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","sourcesContent":["import addParser from '../utils/addParser';\nimport { setProcessor } from '../utils/setProcessor';\nimport {\n COMMENT_HIGHLIGHT_CLASS,\n COMMENT_HIGHLIGHT_CLICKED_CLASS,\n LIST_CONTAINER_ELEMENT_CLASS_NAME,\n TEMP_ELEMENTS_CLASSES,\n WAC_IDENTIFY_SELECTOR,\n} from './constants';\nimport type {\n ContentModelBeforePasteEvent,\n ContentModelBlockFormat,\n ContentModelBlockGroup,\n ContentModelListItemLevelFormat,\n ContentModelSegmentFormat,\n DomToModelContext,\n ElementProcessor,\n FormatParser,\n} from 'roosterjs-content-model-types';\n\nconst LIST_ELEMENT_TAGS = ['UL', 'OL', 'LI'];\nconst LIST_ELEMENT_SELECTOR = LIST_ELEMENT_TAGS.join(',');\n\nconst COMMENT_BG_COLOR_REST = 'rgba(209, 209, 209, 0.5)';\nconst COMMENTS_TEXT_HIGHLIGHT_CLICKED = 'rgba(197, 139, 204, 0.5)';\n\n/**\n * Wac components do not use sub and super tags, instead only add vertical align to a span.\n * This parser normalize the content for content model\n */\nconst wacSubSuperParser: FormatParser<ContentModelSegmentFormat> = (\n format: ContentModelSegmentFormat,\n element: HTMLElement\n): void => {\n const verticalAlign = element.style.verticalAlign;\n if (verticalAlign === 'super') {\n format.superOrSubScriptSequence = 'super';\n }\n if (verticalAlign === 'sub') {\n format.superOrSubScriptSequence = 'sub';\n }\n};\n\n/**\n * This processor does:\n * 1) Remove the display and margin of the element.\n * 2) When an element should be ignored but should handle the child elements call the default child processor.\n * 3) Removes the End of Paragraph element to avoid empty lines, we should only remove this if the previous element of the EOP is an EmptyTextRun\n * 4) Finally call the default processor.\n * @returns\n */\nconst wacElementProcessor: ElementProcessor<HTMLElement> = (\n group: ContentModelBlockGroup,\n element: HTMLElement,\n context: DomToModelContext\n): void => {\n const elementTag = element.tagName;\n\n if (element.matches(WAC_IDENTIFY_SELECTOR)) {\n element.style.removeProperty('display');\n element.style.removeProperty('margin');\n }\n\n if (element.classList.contains(LIST_CONTAINER_ELEMENT_CLASS_NAME)) {\n context.elementProcessors.child(group, element, context);\n return;\n }\n\n if (TEMP_ELEMENTS_CLASSES.some(className => element.classList.contains(className))) {\n return;\n } else if (shouldClearListContext(elementTag, element, context)) {\n const { listFormat } = context;\n listFormat.levels = [];\n listFormat.listParent = undefined;\n }\n\n context.defaultElementProcessors.element(group, element, context);\n};\n\n/**\n * This processor calls the default list processor and then sets the correct list level and list bullet.\n */\nconst wacLiElementProcessor: ElementProcessor<HTMLLIElement> = (\n group: ContentModelBlockGroup,\n element: HTMLLIElement,\n context: DomToModelContext\n): void => {\n context.defaultElementProcessors.li?.(group, element, context);\n const { listFormat } = context;\n const listParent = listFormat.listParent;\n if (listParent) {\n const lastblock = listParent.blocks[listParent.blocks.length - 1];\n if (\n lastblock.blockType == 'BlockGroup' &&\n lastblock.blockGroupType == 'ListItem' &&\n context.listFormat.listParent !== lastblock\n ) {\n const currentLevel = lastblock.levels[lastblock.levels.length - 1];\n\n // Get item level from 'data-aria-level' attribute\n const level = parseInt(element.getAttribute('data-aria-level') ?? '');\n if (level > 0) {\n if (level > lastblock.levels.length) {\n while (level != lastblock.levels.length) {\n lastblock.levels.push(currentLevel);\n }\n } else {\n lastblock.levels.splice(level, lastblock.levels.length - 1);\n lastblock.levels[level - 1] = currentLevel;\n }\n }\n }\n }\n};\n\n/**\n * This parsers does:\n * 1) Sets the display for dummy item to undefined when the current style is block.\n * 2) Removes the Margin Left\n */\nconst wacListItemParser: FormatParser<ContentModelListItemLevelFormat> = (\n format: ContentModelListItemLevelFormat,\n element: HTMLElement\n): void => {\n if (element.style.display === 'block') {\n format.displayForDummyItem = undefined;\n }\n\n format.marginLeft = undefined;\n};\n\n/**\n * Wac usually adds padding to lists which is unwanted so remove it.\n */\nconst wacListLevelParser: FormatParser<ContentModelListItemLevelFormat> = (\n format: ContentModelListItemLevelFormat\n): void => {\n format.marginLeft = undefined;\n format.paddingLeft = undefined;\n};\n\n/**\n * This function returns whether we need to clear the list format.\n * Word Online wraps lists inside divs to have this structure:\n *\n * <div class='ListContainerWrapper'>\n * <ol>...</ol>\n * </div>\n * <div>\n * <p>...</p>\n * <div>\n * <div class='ListContainerWrapper'>\n * <ol>...</ol>\n * </div>\n *\n * So if a elements is not contained inside of a list we should clear the list context to prevent normal text to be\n * transformed into list\n * For the above scenario, if we do not clear the format, the content inside of the second div would be transformed to a list too.\n */\nfunction shouldClearListContext(\n elementTag: string,\n element: HTMLElement,\n context: DomToModelContext\n) {\n return (\n context.listFormat.levels.length > 0 &&\n LIST_ELEMENT_TAGS.every(tag => tag != elementTag) &&\n !element.closest(LIST_ELEMENT_SELECTOR)\n );\n}\n\nconst wacCommentParser: FormatParser<ContentModelSegmentFormat> = (\n format: ContentModelSegmentFormat,\n element: HTMLElement\n): void => {\n if (\n (element.className.includes(COMMENT_HIGHLIGHT_CLASS) &&\n element.style.backgroundColor == COMMENT_BG_COLOR_REST) ||\n (element.className.includes(COMMENT_HIGHLIGHT_CLICKED_CLASS) &&\n element.style.backgroundColor == COMMENTS_TEXT_HIGHLIGHT_CLICKED)\n ) {\n delete format.backgroundColor;\n }\n};\n/**\n * @internal\n * Convert pasted content from Office Online\n * Once it is known that the document is from WAC\n * We need to remove the display property and margin from all the list item\n * @param ev ContentModelBeforePasteEvent\n */\nexport function processPastedContentWacComponents(ev: ContentModelBeforePasteEvent) {\n addParser(ev.domToModelOption, 'segment', wacSubSuperParser);\n addParser(ev.domToModelOption, 'listItemThread', wacListItemParser);\n addParser(ev.domToModelOption, 'listLevel', wacListLevelParser);\n addParser(ev.domToModelOption, 'container', wacContainerParser);\n addParser(ev.domToModelOption, 'table', wacContainerParser);\n addParser(ev.domToModelOption, 'segment', wacCommentParser);\n\n setProcessor(ev.domToModelOption, 'element', wacElementProcessor);\n setProcessor(ev.domToModelOption, 'li', wacLiElementProcessor);\n setProcessor(ev.domToModelOption, 'ol', wacListProcessor);\n setProcessor(ev.domToModelOption, 'ul', wacListProcessor);\n}\n\n/**\n * List items from word have this format when using List items:\n * @example\n <div>\n <ol></ol>\n </div>\n <div>\n <ol></ol>\n </div>\n <div>\n <ol></ol>\n </div>\n * Due to this the div between each of the lists we need to restore the list context to use the previous list,\n * otherwise it could create a new list instead under the same list element\n */\nconst wacListProcessor: ElementProcessor<HTMLOListElement | HTMLUListElement> = (\n group: ContentModelBlockGroup,\n element: HTMLOListElement | HTMLUListElement,\n context: DomToModelContext\n): void => {\n const lastBlock = group.blocks[group.blocks.length - 1];\n const isWrappedInContainer = element.closest(`.${LIST_CONTAINER_ELEMENT_CLASS_NAME}`);\n if (\n isWrappedInContainer?.previousElementSibling?.classList.contains(\n LIST_CONTAINER_ELEMENT_CLASS_NAME\n )\n ) {\n if (lastBlock?.blockType === 'BlockGroup' && lastBlock.blockGroupType == 'ListItem') {\n context.listFormat = {\n threadItemCounts: [],\n levels: lastBlock.levels,\n listParent: group,\n };\n }\n }\n if (element.tagName.toUpperCase() === 'OL') {\n context.defaultElementProcessors.ol?.(group, element as HTMLOListElement, context);\n } else {\n context.defaultElementProcessors.ul?.(group, element as HTMLUListElement, context);\n }\n};\n\nconst wacContainerParser: FormatParser<ContentModelBlockFormat> = (\n format: ContentModelBlockFormat,\n element: HTMLElement\n) => {\n if (element.style.marginLeft.startsWith('-')) {\n delete format.marginLeft;\n }\n};\n"]}
1
+ {"version":3,"file":"processPastedContentWacComponents.js","sourceRoot":"","sources":["../../../../../packages-content-model/roosterjs-content-model-plugins/lib/paste/WacComponents/processPastedContentWacComponents.ts"],"names":[],"mappings":"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","sourcesContent":["import addParser from '../utils/addParser';\nimport { createListLevel, parseFormat } from 'roosterjs-content-model-dom';\nimport { setProcessor } from '../utils/setProcessor';\nimport {\n COMMENT_HIGHLIGHT_CLASS,\n COMMENT_HIGHLIGHT_CLICKED_CLASS,\n LIST_CONTAINER_ELEMENT_CLASS_NAME,\n TEMP_ELEMENTS_CLASSES,\n WAC_IDENTIFY_SELECTOR,\n} from './constants';\nimport type {\n BeforePasteEvent,\n ContentModelBlockFormat,\n ContentModelBlockGroup,\n ContentModelListItemLevelFormat,\n ContentModelListLevel,\n ContentModelSegmentFormat,\n DomToModelContext,\n DomToModelListFormat,\n ElementProcessor,\n FormatParser,\n} from 'roosterjs-content-model-types';\n\nconst LIST_ELEMENT_TAGS = ['UL', 'OL', 'LI'];\nconst LIST_ELEMENT_SELECTOR = LIST_ELEMENT_TAGS.join(',');\n\ninterface WacContext extends DomToModelListFormat {\n /**\n * Current list levels\n */\n currentListLevels?: ContentModelListLevel[];\n /**\n * Array to keep the start of the lists and determine if the start override should be set.\n */\n listItemThread?: number[];\n}\n\n/**\n * Wac components do not use sub and super tags, instead only add vertical align to a span.\n * This parser normalize the content for content model\n */\nconst wacSubSuperParser: FormatParser<ContentModelSegmentFormat> = (\n format: ContentModelSegmentFormat,\n element: HTMLElement\n): void => {\n const verticalAlign = element.style.verticalAlign;\n if (verticalAlign === 'super') {\n format.superOrSubScriptSequence = 'super';\n }\n if (verticalAlign === 'sub') {\n format.superOrSubScriptSequence = 'sub';\n }\n};\n\n/**\n * This processor does:\n * 1) Remove the display and margin of the element.\n * 2) When an element should be ignored but should handle the child elements call the default child processor.\n * 3) Removes the End of Paragraph element to avoid empty lines, we should only remove this if the previous element of the EOP is an EmptyTextRun\n * 4) Finally call the default processor.\n * @returns\n */\nconst wacElementProcessor: ElementProcessor<HTMLElement> = (\n group: ContentModelBlockGroup,\n element: HTMLElement,\n context: DomToModelContext\n): void => {\n const elementTag = element.tagName;\n\n if (element.matches(WAC_IDENTIFY_SELECTOR)) {\n element.style.removeProperty('display');\n element.style.removeProperty('margin');\n }\n\n if (element.classList.contains(LIST_CONTAINER_ELEMENT_CLASS_NAME)) {\n context.elementProcessors.child(group, element, context);\n return;\n }\n\n if (TEMP_ELEMENTS_CLASSES.some(className => element.classList.contains(className))) {\n return;\n } else if (shouldClearListContext(elementTag, element, context)) {\n const { listFormat } = context;\n listFormat.levels = [];\n listFormat.listParent = undefined;\n }\n\n context.defaultElementProcessors.element(group, element, context);\n};\n\n/**\n * This processor calls the default list processor and then sets the correct list level and list bullet.\n */\nconst wacLiElementProcessor: ElementProcessor<HTMLLIElement> = (\n group: ContentModelBlockGroup,\n element: HTMLLIElement,\n context: DomToModelContext\n): void => {\n const level = parseInt(element.getAttribute('data-aria-level') ?? '');\n const listFormat = context.listFormat as WacContext;\n const listType =\n listFormat.levels[context.listFormat.levels.length - 1]?.listType ||\n (element.closest('ol,ul')?.tagName.toUpperCase() as 'UL' | 'OL');\n const newLevel: ContentModelListLevel = createListLevel(listType, context.blockFormat);\n parseFormat(element, context.formatParsers.listLevelThread, newLevel.format, context);\n parseFormat(element, context.formatParsers.listLevel, newLevel.format, context);\n context.listFormat.levels = listFormat.currentListLevels || context.listFormat.levels;\n\n if (level > 0) {\n if (level > context.listFormat.levels.length) {\n while (level != context.listFormat.levels.length) {\n context.listFormat.levels.push(newLevel);\n }\n } else {\n context.listFormat.levels.splice(level, context.listFormat.levels.length - 1);\n context.listFormat.levels[level - 1] = newLevel;\n }\n }\n\n context.defaultElementProcessors.li?.(group, element, context);\n\n const listParent = listFormat.listParent;\n if (listParent) {\n const lastblock = listParent.blocks[listParent.blocks.length - 1];\n if (lastblock.blockType == 'BlockGroup' && lastblock.blockGroupType == 'ListItem') {\n const currentLevel = lastblock.levels[lastblock.levels.length - 1];\n updateStartOverride(currentLevel, element, context);\n }\n }\n\n const newLevels: ContentModelListLevel[] = [];\n listFormat.levels.forEach(v => {\n const newValue: ContentModelListLevel = {\n dataset: { ...v.dataset },\n format: { ...v.format },\n listType: v.listType,\n };\n newLevels.push(newValue);\n });\n listFormat.currentListLevels = newLevels;\n listFormat.levels = [];\n};\n\n/**\n * This parsers does:\n * 1) Sets the display for dummy item to undefined when the current style is block.\n * 2) Removes the Margin Left\n */\nconst wacListItemParser: FormatParser<ContentModelListItemLevelFormat> = (\n format: ContentModelListItemLevelFormat,\n element: HTMLElement\n): void => {\n if (element.style.display === 'block') {\n format.displayForDummyItem = undefined;\n }\n\n format.marginLeft = undefined;\n};\n\n/**\n * Wac usually adds padding to lists which is unwanted so remove it.\n */\nconst wacListLevelParser: FormatParser<ContentModelListItemLevelFormat> = (\n format: ContentModelListItemLevelFormat\n): void => {\n format.marginLeft = undefined;\n format.paddingLeft = undefined;\n};\n\n/**\n * This function returns whether we need to clear the list format.\n * Word Online wraps lists inside divs to have this structure:\n *\n * <div class='ListContainerWrapper'>\n * <ol>...</ol>\n * </div>\n * <div>\n * <p>...</p>\n * <div>\n * <div class='ListContainerWrapper'>\n * <ol>...</ol>\n * </div>\n *\n * So if a elements is not contained inside of a list we should clear the list context to prevent normal text to be\n * transformed into list\n * For the above scenario, if we do not clear the format, the content inside of the second div would be transformed to a list too.\n */\nfunction shouldClearListContext(\n elementTag: string,\n element: HTMLElement,\n context: DomToModelContext\n) {\n return (\n context.listFormat.levels.length > 0 &&\n LIST_ELEMENT_TAGS.every(tag => tag != elementTag) &&\n !element.closest(LIST_ELEMENT_SELECTOR)\n );\n}\n\nconst wacCommentParser: FormatParser<ContentModelSegmentFormat> = (\n format: ContentModelSegmentFormat,\n element: HTMLElement\n): void => {\n if (\n element.className.includes(COMMENT_HIGHLIGHT_CLASS) ||\n element.className.includes(COMMENT_HIGHLIGHT_CLICKED_CLASS)\n ) {\n delete format.backgroundColor;\n }\n};\n/**\n * @internal\n * Convert pasted content from Office Online\n * Once it is known that the document is from WAC\n * We need to remove the display property and margin from all the list item\n * @param ev ContentModelBeforePasteEvent\n */\nexport function processPastedContentWacComponents(ev: BeforePasteEvent) {\n addParser(ev.domToModelOption, 'segment', wacSubSuperParser);\n addParser(ev.domToModelOption, 'listItemThread', wacListItemParser);\n addParser(ev.domToModelOption, 'listLevel', wacListLevelParser);\n addParser(ev.domToModelOption, 'container', wacContainerParser);\n addParser(ev.domToModelOption, 'table', wacContainerParser);\n addParser(ev.domToModelOption, 'segment', wacCommentParser);\n\n setProcessor(ev.domToModelOption, 'element', wacElementProcessor);\n setProcessor(ev.domToModelOption, 'li', wacLiElementProcessor);\n}\n\nconst wacContainerParser: FormatParser<ContentModelBlockFormat> = (\n format: ContentModelBlockFormat,\n element: HTMLElement\n) => {\n if (element.style.marginLeft.startsWith('-')) {\n delete format.marginLeft;\n }\n};\n\nfunction updateStartOverride(\n currentLevel: ContentModelListLevel | undefined,\n element: HTMLLIElement,\n ctx: DomToModelContext\n) {\n if (!currentLevel || currentLevel.listType == 'UL') {\n return;\n }\n\n const list = element.closest('ol');\n const listFormat = ctx.listFormat as WacContext;\n const [start, listLevel] = extractWordListMetadata(list, element);\n\n if (!listFormat.listItemThread) {\n listFormat.listItemThread = [];\n }\n\n const thread: number | undefined = listFormat.listItemThread[listLevel];\n if (thread && start - thread != 1) {\n currentLevel.format.startNumberOverride = start;\n }\n listFormat.listItemThread[listLevel] = start;\n}\nfunction extractWordListMetadata(\n list: HTMLElement | null | undefined,\n item: HTMLElement | null | undefined\n) {\n const itemIndex =\n item && Array.from(list?.querySelectorAll('li') || []).indexOf(item as HTMLLIElement);\n const start =\n parseInt(list?.getAttribute('start') || '1') + (itemIndex && itemIndex > 0 ? itemIndex : 0);\n const listLevel = parseInt(item?.getAttribute('data-aria-level') || '');\n\n return [start, listLevel];\n}\n"]}
@@ -1,5 +1,5 @@
1
1
  import type { WordMetadata } from './WordMetadata';
2
- import type { ContentModelBeforePasteEvent } 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 { ContentModelBeforePasteEvent } from 'roosterjs-content-model-types
20
20
  * 5. Save data in record and only use the required information.
21
21
  *
22
22
  */
23
- export default function getStyleMetadata(ev: ContentModelBeforePasteEvent, trustedHTMLHandler: (val: string) => string): Map<string, WordMetadata>;
23
+ export default function getStyleMetadata(ev: BeforePasteEvent, trustedHTMLHandler: (val: string) => string): Map<string, WordMetadata>;
@@ -1 +1 @@
1
- {"version":3,"file":"getStyleMetadata.js","sourceRoot":"","sources":["../../../../../packages-content-model/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 { ContentModelBeforePasteEvent } 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 default function getStyleMetadata(\n ev: ContentModelBeforePasteEvent,\n trustedHTMLHandler: (val: string) => string\n) {\n const metadataMap: Map<string, WordMetadata> = new Map();\n const doc = new DOMParser().parseFromString(trustedHTMLHandler(ev.htmlBefore), 'text/html');\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-content-model/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;\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 default function getStyleMetadata(\n ev: BeforePasteEvent,\n trustedHTMLHandler: (val: string) => string\n) {\n const metadataMap: Map<string, WordMetadata> = new Map();\n const doc = new DOMParser().parseFromString(trustedHTMLHandler(ev.htmlBefore), 'text/html');\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,7 +1,7 @@
1
- import type { ContentModelBeforePasteEvent } 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 ContentModelBeforePasteEvent
6
6
  */
7
- export declare function processPastedContentFromWordDesktop(ev: ContentModelBeforePasteEvent, trustedHTMLHandler: (text: string) => string): void;
7
+ export declare function processPastedContentFromWordDesktop(ev: BeforePasteEvent, trustedHTMLHandler: (text: string) => string): void;
@@ -1,4 +1,4 @@
1
- define(["require", "exports", "../utils/addParser", "./getStyleMetadata", "../utils/getStyles", "./processWordComments", "./processWordLists", "../utils/setProcessor"], function (require, exports, addParser_1, getStyleMetadata_1, getStyles_1, processWordComments_1, processWordLists_1, setProcessor_1) {
1
+ define(["require", "exports", "../utils/addParser", "./getStyleMetadata", "../utils/getStyles", "./processWordComments", "./processWordLists", "./removeNegativeTextIndentParser", "../utils/setProcessor"], function (require, exports, addParser_1, getStyleMetadata_1, getStyles_1, processWordComments_1, processWordLists_1, removeNegativeTextIndentParser_1, setProcessor_1) {
2
2
  "use strict";
3
3
  Object.defineProperty(exports, "__esModule", { value: true });
4
4
  exports.processPastedContentFromWordDesktop = void 0;
@@ -13,6 +13,7 @@ define(["require", "exports", "../utils/addParser", "./getStyleMetadata", "../ut
13
13
  var metadataMap = (0, getStyleMetadata_1.default)(ev, trustedHTMLHandler);
14
14
  (0, setProcessor_1.setProcessor)(ev.domToModelOption, 'element', wordDesktopElementProcessor(metadataMap));
15
15
  (0, addParser_1.default)(ev.domToModelOption, 'block', removeNonValidLineHeight);
16
+ (0, addParser_1.default)(ev.domToModelOption, 'block', removeNegativeTextIndentParser_1.removeNegativeTextIndentParser);
16
17
  (0, addParser_1.default)(ev.domToModelOption, 'listLevel', listLevelParser);
17
18
  (0, addParser_1.default)(ev.domToModelOption, 'container', wordTableParser);
18
19
  (0, addParser_1.default)(ev.domToModelOption, 'table', wordTableParser);
@@ -1 +1 @@
1
- {"version":3,"file":"processPastedContentFromWordDesktop.js","sourceRoot":"","sources":["../../../../../packages-content-model/roosterjs-content-model-plugins/lib/paste/WordDesktop/processPastedContentFromWordDesktop.ts"],"names":[],"mappings":";;;;IAiBA,IAAM,gBAAgB,GAAG,GAAG,CAAC;IAC7B,IAAM,sCAAsC,GAAG,GAAG,CAAC;IAEnD;;;;OAIG;IACH,SAAgB,mCAAmC,CAC/C,EAAgC,EAChC,kBAA4C;QAE5C,IAAM,WAAW,GAA8B,IAAA,0BAAgB,EAAC,EAAE,EAAE,kBAAkB,CAAC,CAAC;QAExF,IAAA,2BAAY,EAAC,EAAE,CAAC,gBAAgB,EAAE,SAAS,EAAE,2BAA2B,CAAC,WAAW,CAAC,CAAC,CAAC;QACvF,IAAA,mBAAS,EAAC,EAAE,CAAC,gBAAgB,EAAE,OAAO,EAAE,wBAAwB,CAAC,CAAC;QAClE,IAAA,mBAAS,EAAC,EAAE,CAAC,gBAAgB,EAAE,WAAW,EAAE,eAAe,CAAC,CAAC;QAC7D,IAAA,mBAAS,EAAC,EAAE,CAAC,gBAAgB,EAAE,WAAW,EAAE,eAAe,CAAC,CAAC;QAC7D,IAAA,mBAAS,EAAC,EAAE,CAAC,gBAAgB,EAAE,OAAO,EAAE,eAAe,CAAC,CAAC;IAC7D,CAAC;IAXD,kFAWC;IAED,IAAM,2BAA2B,GAAG,UAChC,WAAsC;QAEtC,OAAO,UAAC,KAAK,EAAE,OAAO,EAAE,OAAO;YAC3B,IAAM,MAAM,GAAG,IAAA,qBAAS,EAAC,OAAO,CAAC,CAAC;YAClC,4FAA4F;YAC5F,IACI,CAAC,CACG,IAAA,kCAAe,EAAC,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,WAAW,CAAC;gBAC7D,IAAA,yCAAmB,EAAC,MAAM,EAAE,OAAO,CAAC,CACvC,EACH;gBACE,OAAO,CAAC,wBAAwB,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;aACrE;QACL,CAAC,CAAC;IACN,CAAC,CAAC;IAEF,SAAS,wBAAwB,CAC7B,MAA+B,EAC/B,OAAoB,EACpB,OAA0B,EAC1B,YAAoD;QAEpD,kHAAkH;QAClH,IAAI,gBAAwB,CAAC;QAC7B,IACI,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC;YAC/C,CAAC,KAAK,CAAC,CAAC,gBAAgB,GAAG,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC;YAC/D,gBAAgB,GAAG,sCAAsC,EAC3D;YACE,MAAM,CAAC,UAAU,GAAG,YAAY,CAAC,UAAU,CAAC;SAC/C;IACL,CAAC;IAED,SAAS,eAAe,CACpB,MAAuC,EACvC,OAAoB,EACpB,OAA0B,EAC1B,YAAoD;QAEpD,IAAI,OAAO,CAAC,KAAK,CAAC,UAAU,IAAI,EAAE,EAAE;YAChC,MAAM,CAAC,UAAU,GAAG,YAAY,CAAC,UAAU,CAAC;SAC/C;QAED,MAAM,CAAC,YAAY,GAAG,SAAS,CAAC;IACpC,CAAC;IAED,IAAM,eAAe,GAA0C,UAAC,MAAM;;QAClE,IAAI,MAAA,MAAM,CAAC,UAAU,0CAAE,UAAU,CAAC,GAAG,CAAC,EAAE;YACpC,OAAO,MAAM,CAAC,UAAU,CAAC;SAC5B;IACL,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 { setProcessor } from '../utils/setProcessor';\nimport type { WordMetadata } from './WordMetadata';\nimport type {\n ContentModelBeforePasteEvent,\n ContentModelBlockFormat,\n ContentModelListItemLevelFormat,\n ContentModelTableFormat,\n DomToModelContext,\n ElementProcessor,\n FormatParser,\n} from 'roosterjs-content-model-types';\n\nconst PERCENTAGE_REGEX = /%/;\nconst DEFAULT_BROWSER_LINE_HEIGHT_PERCENTAGE = 120;\n\n/**\n * @internal\n * Handles Pasted content when source is Word Desktop\n * @param ev ContentModelBeforePasteEvent\n */\nexport function processPastedContentFromWordDesktop(\n ev: ContentModelBeforePasteEvent,\n trustedHTMLHandler: (text: string) => string\n) {\n const metadataMap: Map<string, WordMetadata> = getStyleMetadata(ev, trustedHTMLHandler);\n\n setProcessor(ev.domToModelOption, 'element', wordDesktopElementProcessor(metadataMap));\n addParser(ev.domToModelOption, 'block', removeNonValidLineHeight);\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 removeNonValidLineHeight(\n format: ContentModelBlockFormat,\n element: HTMLElement,\n context: DomToModelContext,\n defaultStyle: Readonly<Partial<CSSStyleDeclaration>>\n): 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 parsedLineHeight < DEFAULT_BROWSER_LINE_HEIGHT_PERCENTAGE\n ) {\n format.lineHeight = defaultStyle.lineHeight;\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-content-model/roosterjs-content-model-plugins/lib/paste/WordDesktop/processPastedContentFromWordDesktop.ts"],"names":[],"mappings":";;;;IAkBA,IAAM,gBAAgB,GAAG,GAAG,CAAC;IAC7B,IAAM,sCAAsC,GAAG,GAAG,CAAC;IAEnD;;;;OAIG;IACH,SAAgB,mCAAmC,CAC/C,EAAoB,EACpB,kBAA4C;QAE5C,IAAM,WAAW,GAA8B,IAAA,0BAAgB,EAAC,EAAE,EAAE,kBAAkB,CAAC,CAAC;QAExF,IAAA,2BAAY,EAAC,EAAE,CAAC,gBAAgB,EAAE,SAAS,EAAE,2BAA2B,CAAC,WAAW,CAAC,CAAC,CAAC;QACvF,IAAA,mBAAS,EAAC,EAAE,CAAC,gBAAgB,EAAE,OAAO,EAAE,wBAAwB,CAAC,CAAC;QAClE,IAAA,mBAAS,EAAC,EAAE,CAAC,gBAAgB,EAAE,OAAO,EAAE,+DAA8B,CAAC,CAAC;QACxE,IAAA,mBAAS,EAAC,EAAE,CAAC,gBAAgB,EAAE,WAAW,EAAE,eAAe,CAAC,CAAC;QAC7D,IAAA,mBAAS,EAAC,EAAE,CAAC,gBAAgB,EAAE,WAAW,EAAE,eAAe,CAAC,CAAC;QAC7D,IAAA,mBAAS,EAAC,EAAE,CAAC,gBAAgB,EAAE,OAAO,EAAE,eAAe,CAAC,CAAC;IAC7D,CAAC;IAZD,kFAYC;IAED,IAAM,2BAA2B,GAAG,UAChC,WAAsC;QAEtC,OAAO,UAAC,KAAK,EAAE,OAAO,EAAE,OAAO;YAC3B,IAAM,MAAM,GAAG,IAAA,qBAAS,EAAC,OAAO,CAAC,CAAC;YAClC,4FAA4F;YAC5F,IACI,CAAC,CACG,IAAA,kCAAe,EAAC,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,WAAW,CAAC;gBAC7D,IAAA,yCAAmB,EAAC,MAAM,EAAE,OAAO,CAAC,CACvC,EACH;gBACE,OAAO,CAAC,wBAAwB,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;aACrE;QACL,CAAC,CAAC;IACN,CAAC,CAAC;IAEF,SAAS,wBAAwB,CAC7B,MAA+B,EAC/B,OAAoB,EACpB,OAA0B,EAC1B,YAAoD;QAEpD,kHAAkH;QAClH,IAAI,gBAAwB,CAAC;QAC7B,IACI,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC;YAC/C,CAAC,KAAK,CAAC,CAAC,gBAAgB,GAAG,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC;YAC/D,gBAAgB,GAAG,sCAAsC,EAC3D;YACE,MAAM,CAAC,UAAU,GAAG,YAAY,CAAC,UAAU,CAAC;SAC/C;IACL,CAAC;IAED,SAAS,eAAe,CACpB,MAAuC,EACvC,OAAoB,EACpB,OAA0B,EAC1B,YAAoD;QAEpD,IAAI,OAAO,CAAC,KAAK,CAAC,UAAU,IAAI,EAAE,EAAE;YAChC,MAAM,CAAC,UAAU,GAAG,YAAY,CAAC,UAAU,CAAC;SAC/C;QAED,MAAM,CAAC,YAAY,GAAG,SAAS,CAAC;IACpC,CAAC;IAED,IAAM,eAAe,GAA0C,UAAC,MAAM;;QAClE,IAAI,MAAA,MAAM,CAAC,UAAU,0CAAE,UAAU,CAAC,GAAG,CAAC,EAAE;YACpC,OAAO,MAAM,CAAC,UAAU,CAAC;SAC5B;IACL,CAAC,CAAC","sourcesContent":["import addParser from '../utils/addParser';\nimport getStyleMetadata from './getStyleMetadata';\nimport { getStyles } from '../utils/getStyles';\nimport { processWordComments } from './processWordComments';\nimport { processWordList } from './processWordLists';\nimport { removeNegativeTextIndentParser } from './removeNegativeTextIndentParser';\nimport { setProcessor } from '../utils/setProcessor';\nimport type { WordMetadata } from './WordMetadata';\nimport type {\n BeforePasteEvent,\n ContentModelBlockFormat,\n ContentModelListItemLevelFormat,\n ContentModelTableFormat,\n DomToModelContext,\n ElementProcessor,\n FormatParser,\n} from 'roosterjs-content-model-types';\n\nconst PERCENTAGE_REGEX = /%/;\nconst DEFAULT_BROWSER_LINE_HEIGHT_PERCENTAGE = 120;\n\n/**\n * @internal\n * Handles Pasted content when source is Word Desktop\n * @param ev ContentModelBeforePasteEvent\n */\nexport function processPastedContentFromWordDesktop(\n ev: BeforePasteEvent,\n trustedHTMLHandler: (text: string) => string\n) {\n const metadataMap: Map<string, WordMetadata> = getStyleMetadata(ev, trustedHTMLHandler);\n\n setProcessor(ev.domToModelOption, 'element', wordDesktopElementProcessor(metadataMap));\n addParser(ev.domToModelOption, 'block', removeNonValidLineHeight);\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 removeNonValidLineHeight(\n format: ContentModelBlockFormat,\n element: HTMLElement,\n context: DomToModelContext,\n defaultStyle: Readonly<Partial<CSSStyleDeclaration>>\n): 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 parsedLineHeight < DEFAULT_BROWSER_LINE_HEIGHT_PERCENTAGE\n ) {\n format.lineHeight = defaultStyle.lineHeight;\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,4 +1,4 @@
1
- define(["require", "exports", "tslib", "roosterjs-content-model-core", "roosterjs-content-model-dom"], function (require, exports, tslib_1, roosterjs_content_model_core_1, roosterjs_content_model_dom_1) {
1
+ define(["require", "exports", "tslib", "roosterjs-content-model-core", "./removeNegativeTextIndentParser", "roosterjs-content-model-dom"], function (require, exports, tslib_1, roosterjs_content_model_core_1, removeNegativeTextIndentParser_1, roosterjs_content_model_dom_1) {
2
2
  "use strict";
3
3
  Object.defineProperty(exports, "__esModule", { value: true });
4
4
  exports.processWordList = void 0;
@@ -86,6 +86,7 @@ define(["require", "exports", "tslib", "roosterjs-content-model-core", "roosterj
86
86
  var listItem = (0, roosterjs_content_model_dom_1.createListItem)(listFormat.levels, context.segmentFormat);
87
87
  (0, roosterjs_content_model_dom_1.parseFormat)(element, context.formatParsers.segmentOnBlock, context.segmentFormat, context);
88
88
  (0, roosterjs_content_model_dom_1.parseFormat)(element, context.formatParsers.listItemElement, listItem.format, context);
89
+ (0, roosterjs_content_model_dom_1.parseFormat)(element, [removeNegativeTextIndentParser_1.removeNegativeTextIndentParser], listItem.format, context);
89
90
  if (listType == 'OL') {
90
91
  setStartNumber(listItem, context, listMetadata);
91
92
  }
@@ -1 +1 @@
1
- {"version":3,"file":"processWordLists.js","sourceRoot":"","sources":["../../../../../packages-content-model/roosterjs-content-model-plugins/lib/paste/WordDesktop/processWordLists.ts"],"names":[],"mappings":"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","sourcesContent":["import { getListStyleTypeFromString, updateListMetadata } from 'roosterjs-content-model-core';\nimport type { WordMetadata } from './WordMetadata';\nimport {\n addBlock,\n createListItem,\n createListLevel,\n isEmpty,\n parseFormat,\n} from 'roosterjs-content-model-dom';\nimport type {\n ContentModelBlockGroup,\n ContentModelListItem,\n ContentModelListItemFormat,\n ContentModelListItemLevelFormat,\n ContentModelListLevel,\n DomToModelContext,\n DomToModelListFormat,\n} from 'roosterjs-content-model-types';\n\n/** Word list metadata style name */\nconst MSO_LIST = 'mso-list';\nconst MSO_LIST_IGNORE = 'ignore';\nconst WORD_FIRST_LIST = 'l0';\nconst TEMPLATE_VALUE_REGEX = /%[0-9a-zA-Z]+/g;\n\ninterface WordDesktopListFormat extends DomToModelListFormat {\n wordLevel?: number | '';\n wordList?: string;\n wordKnownLevels?: Map<string, ContentModelListLevel[]>;\n}\n\ninterface WordListFormat extends ContentModelListItemFormat {\n wordList?: string;\n}\n\nconst BULLET_METADATA = 'bullet';\n/**\n * @internal\n * @param styles\n * @param group\n * @param element\n * @param context\n * @returns\n */\nexport function processWordList(\n styles: Record<string, string>,\n group: ContentModelBlockGroup,\n element: HTMLElement,\n context: DomToModelContext,\n metadata: Map<string, WordMetadata>\n) {\n const listFormat = context.listFormat as WordDesktopListFormat;\n if (!listFormat.wordKnownLevels) {\n listFormat.wordKnownLevels = new Map<string, ContentModelListLevel[]>();\n }\n const wordListStyle = styles[MSO_LIST] || '';\n\n // If the element contains Ignore style, do not process it,\n // Usually this element contains the fake bullet used in Word Desktop.\n if (wordListStyle.toLowerCase() === MSO_LIST_IGNORE) {\n return true;\n }\n\n const [lNumber, level] = wordListStyle.split(' ');\n // Try get the list metadata from word, which follows this format: l1 level1 lfo2\n // If we are able to get the level property means we can process this element to be a list\n listFormat.wordLevel = level && parseInt(level.substr('level'.length));\n\n listFormat.wordList = lNumber || WORD_FIRST_LIST;\n if (listFormat.levels.length == 0) {\n listFormat.levels =\n (listFormat.wordList && listFormat.wordKnownLevels.get(listFormat.wordList)) || [];\n }\n\n if (wordListStyle && group && typeof listFormat.wordLevel === 'number') {\n const { wordLevel, wordList } = listFormat;\n // Retrieve the Fake bullet on the element and also the list type\n const listMetadata = metadata.get(`${lNumber}:${level}`);\n const listType =\n listMetadata?.['mso-level-number-format']?.toLowerCase() != BULLET_METADATA\n ? 'OL'\n : 'UL';\n\n // Create the new level of the list item and parse the format\n const newLevel: ContentModelListLevel = createListLevel(listType);\n parseFormat(\n element,\n [...context.formatParsers.listLevel, wordListPaddingParser],\n newLevel.format,\n context\n );\n\n // If the list format is in a different level, update the array so we get the new item\n // To be in the same level as the provided level metadata.\n if (wordLevel > listFormat.levels.length) {\n while (wordLevel != listFormat.levels.length) {\n listFormat.levels.push(newLevel);\n }\n } else {\n listFormat.levels.splice(wordLevel, listFormat.levels.length - 1);\n listFormat.levels[wordLevel - 1] = newLevel;\n }\n (listFormat.levels[listFormat.levels.length - 1]\n .format as WordListFormat).wordList = wordList;\n\n listFormat.listParent = group;\n\n processAsListItem(listFormat, context, element, group, listMetadata);\n\n if (\n listFormat.levels.length > 0 &&\n listFormat.wordKnownLevels.get(wordList) != listFormat.levels\n ) {\n listFormat.wordKnownLevels.set(wordList, [...listFormat.levels]);\n }\n return true;\n }\n\n return false;\n}\n\nfunction processAsListItem(\n listFormat: WordDesktopListFormat,\n context: DomToModelContext,\n element: HTMLElement,\n group: ContentModelBlockGroup,\n listMetadata: WordMetadata | undefined\n) {\n const listLevel = listFormat.levels[listFormat.levels.length - 1];\n const { listType } = listLevel;\n const bullet = getBulletFromMetadata(listMetadata, listType);\n if (bullet) {\n updateListMetadata(listFormat.levels[listFormat.levels.length - 1], metadata =>\n Object.assign({}, metadata, {\n unorderedStyleType: listType == 'UL' ? bullet : undefined,\n orderedStyleType: listType == 'OL' ? bullet : undefined,\n })\n );\n }\n\n const listItem = createListItem(listFormat.levels, context.segmentFormat);\n\n parseFormat(element, context.formatParsers.segmentOnBlock, context.segmentFormat, context);\n parseFormat(element, context.formatParsers.listItemElement, listItem.format, context);\n\n if (listType == 'OL') {\n setStartNumber(listItem, context, listMetadata);\n }\n\n context.elementProcessors.child(listItem, element, context);\n addBlock(group, listItem);\n}\n\nfunction getBulletFromMetadata(listMetadata: WordMetadata | undefined, listType: 'OL' | 'UL') {\n const templateType = listMetadata?.['mso-level-number-format'] || 'decimal';\n let templateFinal: string;\n\n if (listMetadata?.['mso-level-text']) {\n let templateValue: string = '';\n switch (templateType) {\n case 'alpha-upper':\n templateValue = 'UpperAlpha';\n break;\n case 'alpha-lower':\n templateValue = 'LowerAlpha';\n break;\n case 'roman-lower':\n templateValue = 'LowerRoman';\n break;\n case 'roman-upper':\n templateValue = 'UpperRoman';\n break;\n default:\n templateValue = 'Number';\n break;\n }\n const template = (listMetadata['mso-level-text'] || '')\n .replace('\\\\', '')\n .replace('\"', '')\n .replace(TEMPLATE_VALUE_REGEX, '${' + templateValue + '}');\n\n templateFinal = '\"' + template + ' \"';\n } else {\n switch (templateType) {\n case 'alpha-lower':\n templateFinal = 'lower-alpha';\n break;\n case 'roman-lower':\n templateFinal = 'lower-roman';\n break;\n case 'roman-upper':\n templateFinal = 'upper-roman';\n break;\n default:\n templateFinal = 'decimal';\n break;\n }\n }\n\n return getListStyleTypeFromString(listType, templateFinal);\n}\n\nfunction wordListPaddingParser(\n format: ContentModelListItemLevelFormat,\n element: HTMLElement\n): void {\n if (element.style.marginLeft && element.style.marginLeft != '0in') {\n format.paddingLeft = '0px';\n }\n if (element.style.marginRight && element.style.marginRight != '0in') {\n format.paddingRight = '0px';\n }\n}\n\nfunction setStartNumber(\n listItem: ContentModelListItem,\n context: DomToModelContext,\n listMetadata: WordMetadata | undefined\n) {\n const {\n listParent,\n wordList,\n wordKnownLevels,\n wordLevel,\n levels,\n } = context.listFormat as WordDesktopListFormat;\n\n const block = getLastNotEmptyBlock(listParent);\n if (\n (block?.blockType != 'BlockGroup' ||\n block.blockGroupType != 'ListItem' ||\n (wordLevel &&\n (block.levels[wordLevel]?.format as WordListFormat)?.wordList != wordList)) &&\n wordList\n ) {\n const start = listMetadata?.['mso-level-start-at']\n ? parseInt(listMetadata['mso-level-start-at'])\n : NaN;\n const knownLevel = wordKnownLevels?.get(wordList) || [];\n\n if (start != undefined && !isNaN(start) && knownLevel.length != levels.length) {\n listItem.levels[listItem.levels.length - 1].format.startNumberOverride = start;\n }\n }\n}\n\nfunction getLastNotEmptyBlock(listParent: ContentModelBlockGroup | undefined) {\n for (let index = (listParent?.blocks.length || 0) - 1; index > 0; index--) {\n const result = listParent?.blocks[index];\n if (result && !isEmpty(result)) {\n return result;\n }\n }\n\n return undefined;\n}\n"]}
1
+ {"version":3,"file":"processWordLists.js","sourceRoot":"","sources":["../../../../../packages-content-model/roosterjs-content-model-plugins/lib/paste/WordDesktop/processWordLists.ts"],"names":[],"mappings":"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","sourcesContent":["import { getListStyleTypeFromString, updateListMetadata } from 'roosterjs-content-model-core';\nimport { removeNegativeTextIndentParser } from './removeNegativeTextIndentParser';\nimport type { WordMetadata } from './WordMetadata';\nimport {\n addBlock,\n createListItem,\n createListLevel,\n isEmpty,\n parseFormat,\n} from 'roosterjs-content-model-dom';\nimport type {\n ContentModelBlockGroup,\n ContentModelListItem,\n ContentModelListItemFormat,\n ContentModelListItemLevelFormat,\n ContentModelListLevel,\n DomToModelContext,\n DomToModelListFormat,\n} from 'roosterjs-content-model-types';\n\n/** Word list metadata style name */\nconst MSO_LIST = 'mso-list';\nconst MSO_LIST_IGNORE = 'ignore';\nconst WORD_FIRST_LIST = 'l0';\nconst TEMPLATE_VALUE_REGEX = /%[0-9a-zA-Z]+/g;\n\ninterface WordDesktopListFormat extends DomToModelListFormat {\n wordLevel?: number | '';\n wordList?: string;\n wordKnownLevels?: Map<string, ContentModelListLevel[]>;\n}\n\ninterface WordListFormat extends ContentModelListItemFormat {\n wordList?: string;\n}\n\nconst BULLET_METADATA = 'bullet';\n/**\n * @internal\n * @param styles\n * @param group\n * @param element\n * @param context\n * @returns\n */\nexport function processWordList(\n styles: Record<string, string>,\n group: ContentModelBlockGroup,\n element: HTMLElement,\n context: DomToModelContext,\n metadata: Map<string, WordMetadata>\n) {\n const listFormat = context.listFormat as WordDesktopListFormat;\n if (!listFormat.wordKnownLevels) {\n listFormat.wordKnownLevels = new Map<string, ContentModelListLevel[]>();\n }\n const wordListStyle = styles[MSO_LIST] || '';\n\n // If the element contains Ignore style, do not process it,\n // Usually this element contains the fake bullet used in Word Desktop.\n if (wordListStyle.toLowerCase() === MSO_LIST_IGNORE) {\n return true;\n }\n\n const [lNumber, level] = wordListStyle.split(' ');\n // Try get the list metadata from word, which follows this format: l1 level1 lfo2\n // If we are able to get the level property means we can process this element to be a list\n listFormat.wordLevel = level && parseInt(level.substr('level'.length));\n\n listFormat.wordList = lNumber || WORD_FIRST_LIST;\n if (listFormat.levels.length == 0) {\n listFormat.levels =\n (listFormat.wordList && listFormat.wordKnownLevels.get(listFormat.wordList)) || [];\n }\n\n if (wordListStyle && group && typeof listFormat.wordLevel === 'number') {\n const { wordLevel, wordList } = listFormat;\n // Retrieve the Fake bullet on the element and also the list type\n const listMetadata = metadata.get(`${lNumber}:${level}`);\n const listType =\n listMetadata?.['mso-level-number-format']?.toLowerCase() != BULLET_METADATA\n ? 'OL'\n : 'UL';\n\n // Create the new level of the list item and parse the format\n const newLevel: ContentModelListLevel = createListLevel(listType);\n parseFormat(\n element,\n [...context.formatParsers.listLevel, wordListPaddingParser],\n newLevel.format,\n context\n );\n\n // If the list format is in a different level, update the array so we get the new item\n // To be in the same level as the provided level metadata.\n if (wordLevel > listFormat.levels.length) {\n while (wordLevel != listFormat.levels.length) {\n listFormat.levels.push(newLevel);\n }\n } else {\n listFormat.levels.splice(wordLevel, listFormat.levels.length - 1);\n listFormat.levels[wordLevel - 1] = newLevel;\n }\n (listFormat.levels[listFormat.levels.length - 1]\n .format as WordListFormat).wordList = wordList;\n\n listFormat.listParent = group;\n\n processAsListItem(listFormat, context, element, group, listMetadata);\n\n if (\n listFormat.levels.length > 0 &&\n listFormat.wordKnownLevels.get(wordList) != listFormat.levels\n ) {\n listFormat.wordKnownLevels.set(wordList, [...listFormat.levels]);\n }\n return true;\n }\n\n return false;\n}\n\nfunction processAsListItem(\n listFormat: WordDesktopListFormat,\n context: DomToModelContext,\n element: HTMLElement,\n group: ContentModelBlockGroup,\n listMetadata: WordMetadata | undefined\n) {\n const listLevel = listFormat.levels[listFormat.levels.length - 1];\n const { listType } = listLevel;\n const bullet = getBulletFromMetadata(listMetadata, listType);\n if (bullet) {\n updateListMetadata(listFormat.levels[listFormat.levels.length - 1], metadata =>\n Object.assign({}, metadata, {\n unorderedStyleType: listType == 'UL' ? bullet : undefined,\n orderedStyleType: listType == 'OL' ? bullet : undefined,\n })\n );\n }\n\n const listItem = createListItem(listFormat.levels, context.segmentFormat);\n\n parseFormat(element, context.formatParsers.segmentOnBlock, context.segmentFormat, context);\n parseFormat(element, context.formatParsers.listItemElement, listItem.format, context);\n parseFormat(element, [removeNegativeTextIndentParser], listItem.format, context);\n\n if (listType == 'OL') {\n setStartNumber(listItem, context, listMetadata);\n }\n\n context.elementProcessors.child(listItem, element, context);\n addBlock(group, listItem);\n}\n\nfunction getBulletFromMetadata(listMetadata: WordMetadata | undefined, listType: 'OL' | 'UL') {\n const templateType = listMetadata?.['mso-level-number-format'] || 'decimal';\n let templateFinal: string;\n\n if (listMetadata?.['mso-level-text']) {\n let templateValue: string = '';\n switch (templateType) {\n case 'alpha-upper':\n templateValue = 'UpperAlpha';\n break;\n case 'alpha-lower':\n templateValue = 'LowerAlpha';\n break;\n case 'roman-lower':\n templateValue = 'LowerRoman';\n break;\n case 'roman-upper':\n templateValue = 'UpperRoman';\n break;\n default:\n templateValue = 'Number';\n break;\n }\n const template = (listMetadata['mso-level-text'] || '')\n .replace('\\\\', '')\n .replace('\"', '')\n .replace(TEMPLATE_VALUE_REGEX, '${' + templateValue + '}');\n\n templateFinal = '\"' + template + ' \"';\n } else {\n switch (templateType) {\n case 'alpha-lower':\n templateFinal = 'lower-alpha';\n break;\n case 'roman-lower':\n templateFinal = 'lower-roman';\n break;\n case 'roman-upper':\n templateFinal = 'upper-roman';\n break;\n default:\n templateFinal = 'decimal';\n break;\n }\n }\n\n return getListStyleTypeFromString(listType, templateFinal);\n}\n\nfunction wordListPaddingParser(\n format: ContentModelListItemLevelFormat,\n element: HTMLElement\n): void {\n if (element.style.marginLeft && element.style.marginLeft != '0in') {\n format.paddingLeft = '0px';\n }\n if (element.style.marginRight && element.style.marginRight != '0in') {\n format.paddingRight = '0px';\n }\n}\n\nfunction setStartNumber(\n listItem: ContentModelListItem,\n context: DomToModelContext,\n listMetadata: WordMetadata | undefined\n) {\n const {\n listParent,\n wordList,\n wordKnownLevels,\n wordLevel,\n levels,\n } = context.listFormat as WordDesktopListFormat;\n\n const block = getLastNotEmptyBlock(listParent);\n if (\n (block?.blockType != 'BlockGroup' ||\n block.blockGroupType != 'ListItem' ||\n (wordLevel &&\n (block.levels[wordLevel]?.format as WordListFormat)?.wordList != wordList)) &&\n wordList\n ) {\n const start = listMetadata?.['mso-level-start-at']\n ? parseInt(listMetadata['mso-level-start-at'])\n : NaN;\n const knownLevel = wordKnownLevels?.get(wordList) || [];\n\n if (start != undefined && !isNaN(start) && knownLevel.length != levels.length) {\n listItem.levels[listItem.levels.length - 1].format.startNumberOverride = start;\n }\n }\n}\n\nfunction getLastNotEmptyBlock(listParent: ContentModelBlockGroup | undefined) {\n for (let index = (listParent?.blocks.length || 0) - 1; index > 0; index--) {\n const result = listParent?.blocks[index];\n if (result && !isEmpty(result)) {\n return result;\n }\n }\n\n return undefined;\n}\n"]}
@@ -0,0 +1,5 @@
1
+ import type { FormatParser, TextIndentFormat } from 'roosterjs-content-model-types';
2
+ /**
3
+ * @internal
4
+ */
5
+ export declare const removeNegativeTextIndentParser: FormatParser<TextIndentFormat>;
@@ -0,0 +1,16 @@
1
+ define(["require", "exports"], function (require, exports) {
2
+ "use strict";
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.removeNegativeTextIndentParser = void 0;
5
+ /**
6
+ * @internal
7
+ */
8
+ var removeNegativeTextIndentParser = function (format, element) {
9
+ var _a;
10
+ if ((_a = format.textIndent) === null || _a === void 0 ? void 0 : _a.startsWith('-')) {
11
+ delete format.textIndent;
12
+ }
13
+ };
14
+ exports.removeNegativeTextIndentParser = removeNegativeTextIndentParser;
15
+ });
16
+ //# sourceMappingURL=removeNegativeTextIndentParser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"removeNegativeTextIndentParser.js","sourceRoot":"","sources":["../../../../../packages-content-model/roosterjs-content-model-plugins/lib/paste/WordDesktop/removeNegativeTextIndentParser.ts"],"names":[],"mappings":";;;;IAEA;;OAEG;IACI,IAAM,8BAA8B,GAAmC,UAAC,MAAM,EAAE,OAAO;;QAC1F,IAAI,MAAA,MAAM,CAAC,UAAU,0CAAE,UAAU,CAAC,GAAG,CAAC,EAAE;YACpC,OAAO,MAAM,CAAC,UAAU,CAAC;SAC5B;IACL,CAAC,CAAC;IAJW,QAAA,8BAA8B,kCAIzC","sourcesContent":["import type { FormatParser, TextIndentFormat } from 'roosterjs-content-model-types';\n\n/**\n * @internal\n */\nexport const removeNegativeTextIndentParser: FormatParser<TextIndentFormat> = (format, element) => {\n if (format.textIndent?.startsWith('-')) {\n delete format.textIndent;\n }\n};\n"]}
@@ -1,17 +1,17 @@
1
1
  /**
2
2
  * @internal
3
3
  */
4
- export declare const enum PastePropertyNames {
4
+ export declare const PastePropertyNames: {
5
5
  /**
6
6
  * Node attribute used to identify if the content is from Google Sheets.
7
7
  */
8
- GOOGLE_SHEET_NODE_NAME = "google-sheets-html-origin",
8
+ GOOGLE_SHEET_NODE_NAME: string;
9
9
  /**
10
10
  * Name of the HTMLMeta Property that provides the Office App Source of the pasted content
11
11
  */
12
- PROG_ID_NAME = "ProgId",
12
+ PROG_ID_NAME: string;
13
13
  /**
14
14
  * Name of the HTMLMeta Property that identifies pated content as from Excel Desktop
15
15
  */
16
- EXCEL_DESKTOP_ATTRIBUTE_NAME = "xmlns:x"
17
- }
16
+ EXCEL_DESKTOP_ATTRIBUTE_NAME: string;
17
+ };
@@ -5,20 +5,19 @@ define(["require", "exports"], function (require, exports) {
5
5
  /**
6
6
  * @internal
7
7
  */
8
- var PastePropertyNames;
9
- (function (PastePropertyNames) {
8
+ exports.PastePropertyNames = {
10
9
  /**
11
10
  * Node attribute used to identify if the content is from Google Sheets.
12
11
  */
13
- PastePropertyNames["GOOGLE_SHEET_NODE_NAME"] = "google-sheets-html-origin";
12
+ GOOGLE_SHEET_NODE_NAME: 'google-sheets-html-origin',
14
13
  /**
15
14
  * Name of the HTMLMeta Property that provides the Office App Source of the pasted content
16
15
  */
17
- PastePropertyNames["PROG_ID_NAME"] = "ProgId";
16
+ PROG_ID_NAME: 'ProgId',
18
17
  /**
19
18
  * Name of the HTMLMeta Property that identifies pated content as from Excel Desktop
20
19
  */
21
- PastePropertyNames["EXCEL_DESKTOP_ATTRIBUTE_NAME"] = "xmlns:x";
22
- })(PastePropertyNames = exports.PastePropertyNames || (exports.PastePropertyNames = {}));
20
+ EXCEL_DESKTOP_ATTRIBUTE_NAME: 'xmlns:x',
21
+ };
23
22
  });
24
23
  //# sourceMappingURL=constants.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../../../packages-content-model/roosterjs-content-model-plugins/lib/paste/pasteSourceValidations/constants.ts"],"names":[],"mappings":";;;;IAAA;;OAEG;IACH,IAAkB,kBAejB;IAfD,WAAkB,kBAAkB;QAChC;;WAEG;QACH,0EAAoD,CAAA;QAEpD;;WAEG;QACH,6CAAuB,CAAA;QAEvB;;WAEG;QACH,8DAAwC,CAAA;IAC5C,CAAC,EAfiB,kBAAkB,GAAlB,0BAAkB,KAAlB,0BAAkB,QAenC","sourcesContent":["/**\n * @internal\n */\nexport const enum PastePropertyNames {\n /**\n * Node attribute used to identify if the content is from Google Sheets.\n */\n GOOGLE_SHEET_NODE_NAME = 'google-sheets-html-origin',\n\n /**\n * Name of the HTMLMeta Property that provides the Office App Source of the pasted content\n */\n PROG_ID_NAME = 'ProgId',\n\n /**\n * Name of the HTMLMeta Property that identifies pated content as from Excel Desktop\n */\n EXCEL_DESKTOP_ATTRIBUTE_NAME = 'xmlns:x',\n}\n"]}
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../../../packages-content-model/roosterjs-content-model-plugins/lib/paste/pasteSourceValidations/constants.ts"],"names":[],"mappings":";;;;IAAA;;OAEG;IACU,QAAA,kBAAkB,GAAG;QAC9B;;WAEG;QACH,sBAAsB,EAAE,2BAA2B;QAEnD;;WAEG;QACH,YAAY,EAAE,QAAQ;QAEtB;;WAEG;QACH,4BAA4B,EAAE,SAAS;KAC1C,CAAC","sourcesContent":["/**\n * @internal\n */\nexport const PastePropertyNames = {\n /**\n * Node attribute used to identify if the content is from Google Sheets.\n */\n GOOGLE_SHEET_NODE_NAME: 'google-sheets-html-origin',\n\n /**\n * Name of the HTMLMeta Property that provides the Office App Source of the pasted content\n */\n PROG_ID_NAME: 'ProgId',\n\n /**\n * Name of the HTMLMeta Property that identifies pated content as from Excel Desktop\n */\n EXCEL_DESKTOP_ATTRIBUTE_NAME: 'xmlns:x',\n};\n"]}
@@ -1,5 +1,4 @@
1
- import type { ClipboardData } from 'roosterjs-content-model-types';
2
- import type { BeforePasteEvent } from 'roosterjs-editor-types';
1
+ import type { BeforePasteEvent, ClipboardData } from 'roosterjs-content-model-types';
3
2
  /**
4
3
  * @internal
5
4
  */
@@ -1 +1 @@
1
- {"version":3,"file":"getPasteSource.js","sourceRoot":"","sources":["../../../../../packages-content-model/roosterjs-content-model-plugins/lib/paste/pasteSourceValidations/getPasteSource.ts"],"names":[],"mappings":";;;;IAuCA,IAAM,kBAAkB,GAAG,IAAI,GAAG,CAA0C;QACxE,CAAC,aAAa,EAAE,6CAAqB,CAAC;QACtC,CAAC,cAAc,EAAE,+CAAsB,CAAC;QACxC,CAAC,aAAa,EAAE,6CAAqB,CAAC;QACtC,CAAC,mBAAmB,EAAE,yDAA2B,CAAC;QAClD,CAAC,eAAe,EAAE,uDAA0B,CAAC;QAC7C,CAAC,cAAc,EAAE,6CAAqB,CAAC;QACvC,CAAC,aAAa,EAAE,uDAA0B,CAAC;KAC9C,CAAC,CAAC;IAEH;;;;;;OAMG;IACH,SAAgB,cAAc,CAC1B,KAAuB,EACvB,wBAAiC;QAEzB,IAAA,cAAc,GAA8B,KAAK,eAAnC,EAAE,aAAa,GAAe,KAAK,cAApB,EAAE,QAAQ,GAAK,KAAK,SAAV,CAAW;QAE1D,IAAI,MAAM,GAAgC,IAAI,CAAC;QAC/C,IAAM,KAAK,GAAyB;YAChC,cAAc,gBAAA;YACd,QAAQ,UAAA;YACR,wBAAwB,0BAAA;YACxB,aAAa,eAAA;SAChB,CAAC;QAEF,kBAAkB,CAAC,OAAO,CAAC,UAAC,IAAI,EAAE,GAAG;YACjC,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,KAAK,CAAC,EAAE;gBACxB,MAAM,GAAG,GAAG,CAAC;aAChB;QACL,CAAC,CAAC,CAAC;QAEH,OAAO,MAAM,aAAN,MAAM,cAAN,MAAM,GAAI,SAAS,CAAC;IAC/B,CAAC;IArBD,wCAqBC","sourcesContent":["import { documentContainWacElements } from './documentContainWacElements';\nimport { isExcelDesktopDocument } from './isExcelDesktopDocument';\nimport { isExcelOnlineDocument } from './isExcelOnlineDocument';\nimport { isGoogleSheetDocument } from './isGoogleSheetDocument';\nimport { isPowerPointDesktopDocument } from './isPowerPointDesktopDocument';\nimport { isWordDesktopDocument } from './isWordDesktopDocument';\nimport { shouldConvertToSingleImage } from './shouldConvertToSingleImage';\nimport type { ClipboardData } from 'roosterjs-content-model-types';\nimport type { BeforePasteEvent } from 'roosterjs-editor-types';\n\n/**\n * @internal\n */\nexport type GetSourceInputParams = {\n htmlAttributes: Record<string, string>;\n fragment: DocumentFragment;\n shouldConvertSingleImage: boolean;\n clipboardData: ClipboardData;\n};\n\n/**\n * @internal\n * Represent the types of sources to handle in the Paste Plugin\n */\nexport type KnownPasteSourceType =\n | 'wordDesktop'\n | 'excelDesktop'\n | 'excelOnline'\n | 'powerPointDesktop'\n | 'googleSheets'\n | 'wacComponents'\n | 'default'\n | 'singleImage';\n\n/**\n * @internal\n */\nexport type GetSourceFunction = (props: GetSourceInputParams) => boolean;\n\nconst getSourceFunctions = new Map<KnownPasteSourceType, GetSourceFunction>([\n ['wordDesktop', isWordDesktopDocument],\n ['excelDesktop', isExcelDesktopDocument],\n ['excelOnline', isExcelOnlineDocument],\n ['powerPointDesktop', isPowerPointDesktopDocument],\n ['wacComponents', documentContainWacElements],\n ['googleSheets', isGoogleSheetDocument],\n ['singleImage', shouldConvertToSingleImage],\n]);\n\n/**\n * @internal\n * This function tries to get the source of the Pasted content\n * @param event the before paste event\n * @param shouldConvertSingleImage Whether convert single image is enabled.\n * @returns The Type of pasted content, if no type found will return {KnownSourceType.Default}\n */\nexport function getPasteSource(\n event: BeforePasteEvent,\n shouldConvertSingleImage: boolean\n): KnownPasteSourceType {\n const { htmlAttributes, clipboardData, fragment } = event;\n\n let result: KnownPasteSourceType | null = null;\n const param: GetSourceInputParams = {\n htmlAttributes,\n fragment,\n shouldConvertSingleImage,\n clipboardData,\n };\n\n getSourceFunctions.forEach((func, key) => {\n if (!result && func(param)) {\n result = key;\n }\n });\n\n return result ?? 'default';\n}\n"]}
1
+ {"version":3,"file":"getPasteSource.js","sourceRoot":"","sources":["../../../../../packages-content-model/roosterjs-content-model-plugins/lib/paste/pasteSourceValidations/getPasteSource.ts"],"names":[],"mappings":";;;;IAsCA,IAAM,kBAAkB,GAAG,IAAI,GAAG,CAA0C;QACxE,CAAC,aAAa,EAAE,6CAAqB,CAAC;QACtC,CAAC,cAAc,EAAE,+CAAsB,CAAC;QACxC,CAAC,aAAa,EAAE,6CAAqB,CAAC;QACtC,CAAC,mBAAmB,EAAE,yDAA2B,CAAC;QAClD,CAAC,eAAe,EAAE,uDAA0B,CAAC;QAC7C,CAAC,cAAc,EAAE,6CAAqB,CAAC;QACvC,CAAC,aAAa,EAAE,uDAA0B,CAAC;KAC9C,CAAC,CAAC;IAEH;;;;;;OAMG;IACH,SAAgB,cAAc,CAC1B,KAAuB,EACvB,wBAAiC;QAEzB,IAAA,cAAc,GAA8B,KAAK,eAAnC,EAAE,aAAa,GAAe,KAAK,cAApB,EAAE,QAAQ,GAAK,KAAK,SAAV,CAAW;QAE1D,IAAI,MAAM,GAAgC,IAAI,CAAC;QAC/C,IAAM,KAAK,GAAyB;YAChC,cAAc,gBAAA;YACd,QAAQ,UAAA;YACR,wBAAwB,0BAAA;YACxB,aAAa,eAAA;SAChB,CAAC;QAEF,kBAAkB,CAAC,OAAO,CAAC,UAAC,IAAI,EAAE,GAAG;YACjC,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,KAAK,CAAC,EAAE;gBACxB,MAAM,GAAG,GAAG,CAAC;aAChB;QACL,CAAC,CAAC,CAAC;QAEH,OAAO,MAAM,aAAN,MAAM,cAAN,MAAM,GAAI,SAAS,CAAC;IAC/B,CAAC;IArBD,wCAqBC","sourcesContent":["import { documentContainWacElements } from './documentContainWacElements';\nimport { isExcelDesktopDocument } from './isExcelDesktopDocument';\nimport { isExcelOnlineDocument } from './isExcelOnlineDocument';\nimport { isGoogleSheetDocument } from './isGoogleSheetDocument';\nimport { isPowerPointDesktopDocument } from './isPowerPointDesktopDocument';\nimport { isWordDesktopDocument } from './isWordDesktopDocument';\nimport { shouldConvertToSingleImage } from './shouldConvertToSingleImage';\nimport type { BeforePasteEvent, ClipboardData } from 'roosterjs-content-model-types';\n\n/**\n * @internal\n */\nexport type GetSourceInputParams = {\n htmlAttributes: Record<string, string>;\n fragment: DocumentFragment;\n shouldConvertSingleImage: boolean;\n clipboardData: ClipboardData;\n};\n\n/**\n * @internal\n * Represent the types of sources to handle in the Paste Plugin\n */\nexport type KnownPasteSourceType =\n | 'wordDesktop'\n | 'excelDesktop'\n | 'excelOnline'\n | 'powerPointDesktop'\n | 'googleSheets'\n | 'wacComponents'\n | 'default'\n | 'singleImage';\n\n/**\n * @internal\n */\nexport type GetSourceFunction = (props: GetSourceInputParams) => boolean;\n\nconst getSourceFunctions = new Map<KnownPasteSourceType, GetSourceFunction>([\n ['wordDesktop', isWordDesktopDocument],\n ['excelDesktop', isExcelDesktopDocument],\n ['excelOnline', isExcelOnlineDocument],\n ['powerPointDesktop', isPowerPointDesktopDocument],\n ['wacComponents', documentContainWacElements],\n ['googleSheets', isGoogleSheetDocument],\n ['singleImage', shouldConvertToSingleImage],\n]);\n\n/**\n * @internal\n * This function tries to get the source of the Pasted content\n * @param event the before paste event\n * @param shouldConvertSingleImage Whether convert single image is enabled.\n * @returns The Type of pasted content, if no type found will return {KnownSourceType.Default}\n */\nexport function getPasteSource(\n event: BeforePasteEvent,\n shouldConvertSingleImage: boolean\n): KnownPasteSourceType {\n const { htmlAttributes, clipboardData, fragment } = event;\n\n let result: KnownPasteSourceType | null = null;\n const param: GetSourceInputParams = {\n htmlAttributes,\n fragment,\n shouldConvertSingleImage,\n clipboardData,\n };\n\n getSourceFunctions.forEach((func, key) => {\n if (!result && func(param)) {\n result = key;\n }\n });\n\n return result ?? 'default';\n}\n"]}
@@ -1,4 +1,4 @@
1
- define(["require", "exports"], function (require, exports) {
1
+ define(["require", "exports", "./constants"], function (require, exports, constants_1) {
2
2
  "use strict";
3
3
  Object.defineProperty(exports, "__esModule", { value: true });
4
4
  exports.isExcelDesktopDocument = void 0;
@@ -12,7 +12,7 @@ define(["require", "exports"], function (require, exports) {
12
12
  var isExcelDesktopDocument = function (props) {
13
13
  var htmlAttributes = props.htmlAttributes;
14
14
  // The presence of this attribute confirms its origin from Excel Desktop
15
- return htmlAttributes["xmlns:x" /* EXCEL_DESKTOP_ATTRIBUTE_NAME */] == EXCEL_ATTRIBUTE_VALUE;
15
+ return htmlAttributes[constants_1.PastePropertyNames.EXCEL_DESKTOP_ATTRIBUTE_NAME] == EXCEL_ATTRIBUTE_VALUE;
16
16
  };
17
17
  exports.isExcelDesktopDocument = isExcelDesktopDocument;
18
18
  });
@@ -1 +1 @@
1
- {"version":3,"file":"isExcelDesktopDocument.js","sourceRoot":"","sources":["../../../../../packages-content-model/roosterjs-content-model-plugins/lib/paste/pasteSourceValidations/isExcelDesktopDocument.ts"],"names":[],"mappings":";;;;IAGA,IAAM,qBAAqB,GAAG,wCAAwC,CAAC;IAEvE;;;;;OAKG;IACI,IAAM,sBAAsB,GAAsB,UAAA,KAAK;QAClD,IAAA,cAAc,GAAK,KAAK,eAAV,CAAW;QACjC,wEAAwE;QACxE,OAAO,cAAc,8CAAiD,IAAI,qBAAqB,CAAC;IACpG,CAAC,CAAC;IAJW,QAAA,sBAAsB,0BAIjC","sourcesContent":["import { PastePropertyNames } from './constants';\nimport type { GetSourceFunction } from './getPasteSource';\n\nconst EXCEL_ATTRIBUTE_VALUE = 'urn:schemas-microsoft-com:office:excel';\n\n/**\n * @internal\n * Checks whether the Array provided contains strings that identify Excel Desktop documents\n * @param props Properties related to the PasteEvent\n * @returns\n */\nexport const isExcelDesktopDocument: GetSourceFunction = props => {\n const { htmlAttributes } = props;\n // The presence of this attribute confirms its origin from Excel Desktop\n return htmlAttributes[PastePropertyNames.EXCEL_DESKTOP_ATTRIBUTE_NAME] == EXCEL_ATTRIBUTE_VALUE;\n};\n"]}
1
+ {"version":3,"file":"isExcelDesktopDocument.js","sourceRoot":"","sources":["../../../../../packages-content-model/roosterjs-content-model-plugins/lib/paste/pasteSourceValidations/isExcelDesktopDocument.ts"],"names":[],"mappings":";;;;IAGA,IAAM,qBAAqB,GAAG,wCAAwC,CAAC;IAEvE;;;;;OAKG;IACI,IAAM,sBAAsB,GAAsB,UAAA,KAAK;QAClD,IAAA,cAAc,GAAK,KAAK,eAAV,CAAW;QACjC,wEAAwE;QACxE,OAAO,cAAc,CAAC,8BAAkB,CAAC,4BAA4B,CAAC,IAAI,qBAAqB,CAAC;IACpG,CAAC,CAAC;IAJW,QAAA,sBAAsB,0BAIjC","sourcesContent":["import { PastePropertyNames } from './constants';\nimport type { GetSourceFunction } from './getPasteSource';\n\nconst EXCEL_ATTRIBUTE_VALUE = 'urn:schemas-microsoft-com:office:excel';\n\n/**\n * @internal\n * Checks whether the Array provided contains strings that identify Excel Desktop documents\n * @param props Properties related to the PasteEvent\n * @returns\n */\nexport const isExcelDesktopDocument: GetSourceFunction = props => {\n const { htmlAttributes } = props;\n // The presence of this attribute confirms its origin from Excel Desktop\n return htmlAttributes[PastePropertyNames.EXCEL_DESKTOP_ATTRIBUTE_NAME] == EXCEL_ATTRIBUTE_VALUE;\n};\n"]}
@@ -1,4 +1,4 @@
1
- define(["require", "exports"], function (require, exports) {
1
+ define(["require", "exports", "./constants"], function (require, exports, constants_1) {
2
2
  "use strict";
3
3
  Object.defineProperty(exports, "__esModule", { value: true });
4
4
  exports.isExcelOnlineDocument = void 0;
@@ -13,8 +13,8 @@ define(["require", "exports"], function (require, exports) {
13
13
  var isExcelOnlineDocument = function (props) {
14
14
  var htmlAttributes = props.htmlAttributes;
15
15
  // The presence of Excel.Sheet confirms its origin from Excel, the absence of EXCEL_DESKTOP_ATTRIBUTE_NAME confirms it is from the Online version
16
- return (htmlAttributes["ProgId" /* PROG_ID_NAME */] == EXCEL_ONLINE_ATTRIBUTE_VALUE &&
17
- htmlAttributes["xmlns:x" /* EXCEL_DESKTOP_ATTRIBUTE_NAME */] == undefined);
16
+ return (htmlAttributes[constants_1.PastePropertyNames.PROG_ID_NAME] == EXCEL_ONLINE_ATTRIBUTE_VALUE &&
17
+ htmlAttributes[constants_1.PastePropertyNames.EXCEL_DESKTOP_ATTRIBUTE_NAME] == undefined);
18
18
  };
19
19
  exports.isExcelOnlineDocument = isExcelOnlineDocument;
20
20
  });