roosterjs 9.42.0 → 9.44.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.
package/dist/rooster.js CHANGED
@@ -2095,7 +2095,7 @@ exports["default"] = getDarkColor;
2095
2095
 
2096
2096
  Object.defineProperty(exports, "__esModule", ({ value: true }));
2097
2097
  exports.formatParagraphWithContentModel = exports.formatImageWithContentModel = exports.formatTableWithContentModel = exports.createEditorContextForEntity = exports.clearSelectedCells = exports.insertTableColumn = exports.insertTableRow = exports.insertEntity = exports.toggleCode = exports.setParagraphMargin = exports.adjustImageSelection = exports.setImageAltText = exports.adjustLinkSelection = exports.removeLink = exports.insertLink = exports.clearFormat = exports.getFormatState = exports.changeImage = exports.setImageBoxShadow = exports.setImageBorder = exports.setSpacing = exports.toggleBlockQuote = exports.setHeadingLevel = exports.setDirection = exports.setAlignment = exports.setIndentation = exports.setListStartNumber = exports.setListStyle = exports.insertImage = exports.splitTextSegment = exports.changeCapitalization = exports.applySegmentFormat = exports.changeFontSize = exports.setTextColor = exports.setFontSize = exports.setFontName = exports.setBackgroundColor = exports.toggleSuperscript = exports.toggleSubscript = exports.toggleStrikethrough = exports.toggleUnderline = exports.toggleItalic = exports.toggleBold = exports.toggleNumbering = exports.toggleBullet = exports.applyTableBorderFormat = exports.editTable = exports.setTableCellShade = exports.formatTable = exports.insertTable = void 0;
2098
- exports.adjustWordSelection = exports.queryContentModelBlocks = exports.getListAnnounceData = exports.promoteLink = exports.matchLink = exports.setModelIndentation = exports.findListItemsInSameThread = exports.setModelListStartNumber = exports.setModelListStyle = exports.setListType = exports.formatInsertPointWithContentModel = exports.formatTextSegmentBeforeSelectionMarker = exports.formatSegmentWithContentModel = void 0;
2098
+ exports.adjustWordSelection = exports.queryContentModelBlocks = exports.getListAnnounceData = exports.getPromoteLink = exports.promoteLink = exports.matchLink = exports.setModelIndentation = exports.findListItemsInSameThread = exports.setModelListStartNumber = exports.setModelListStyle = exports.setListType = exports.formatInsertPointWithContentModel = exports.formatTextSegmentBeforeSelectionMarker = exports.formatSegmentWithContentModel = void 0;
2099
2099
  var insertTable_1 = __webpack_require__(/*! ./publicApi/table/insertTable */ "./packages/roosterjs-content-model-api/lib/publicApi/table/insertTable.ts");
2100
2100
  Object.defineProperty(exports, "insertTable", ({ enumerable: true, get: function () { return insertTable_1.insertTable; } }));
2101
2101
  var formatTable_1 = __webpack_require__(/*! ./publicApi/table/formatTable */ "./packages/roosterjs-content-model-api/lib/publicApi/table/formatTable.ts");
@@ -2216,6 +2216,7 @@ var matchLink_1 = __webpack_require__(/*! ./modelApi/link/matchLink */ "./packag
2216
2216
  Object.defineProperty(exports, "matchLink", ({ enumerable: true, get: function () { return matchLink_1.matchLink; } }));
2217
2217
  var promoteLink_1 = __webpack_require__(/*! ./modelApi/link/promoteLink */ "./packages/roosterjs-content-model-api/lib/modelApi/link/promoteLink.ts");
2218
2218
  Object.defineProperty(exports, "promoteLink", ({ enumerable: true, get: function () { return promoteLink_1.promoteLink; } }));
2219
+ Object.defineProperty(exports, "getPromoteLink", ({ enumerable: true, get: function () { return promoteLink_1.getPromoteLink; } }));
2219
2220
  var getListAnnounceData_1 = __webpack_require__(/*! ./modelApi/list/getListAnnounceData */ "./packages/roosterjs-content-model-api/lib/modelApi/list/getListAnnounceData.ts");
2220
2221
  Object.defineProperty(exports, "getListAnnounceData", ({ enumerable: true, get: function () { return getListAnnounceData_1.getListAnnounceData; } }));
2221
2222
  var queryContentModelBlocks_1 = __webpack_require__(/*! ./modelApi/common/queryContentModelBlocks */ "./packages/roosterjs-content-model-api/lib/modelApi/common/queryContentModelBlocks.ts");
@@ -2534,7 +2535,13 @@ function setModelIndentation(model, indentation, length, context) {
2534
2535
  }
2535
2536
  }
2536
2537
  });
2537
- return paragraphOrListItem.length > 0;
2538
+ if (paragraphOrListItem.length > 0) {
2539
+ (0, roosterjs_content_model_dom_1.normalizeContentModel)(model);
2540
+ return true;
2541
+ }
2542
+ else {
2543
+ return false;
2544
+ }
2538
2545
  }
2539
2546
  exports.setModelIndentation = setModelIndentation;
2540
2547
  function isSelected(listItem) {
@@ -3449,9 +3456,12 @@ var MAILTO_REGEX = "(M|m)ailto:" + COMMON_REGEX;
3449
3456
  function getLinkUrl(text, autoLinkOptions) {
3450
3457
  var _a;
3451
3458
  var _b = autoLinkOptions !== null && autoLinkOptions !== void 0 ? autoLinkOptions : {}, autoLink = _b.autoLink, autoMailto = _b.autoMailto, autoTel = _b.autoTel;
3459
+ var mailtoMatch = matchMailTo(text);
3460
+ if (mailtoMatch && !autoMailto) {
3461
+ return undefined;
3462
+ }
3452
3463
  var linkMatch = autoLink ? (_a = (0, matchLink_1.matchLink)(text)) === null || _a === void 0 ? void 0 : _a.normalizedUrl : undefined;
3453
3464
  var telMatch = autoTel ? matchTel(text) : undefined;
3454
- var mailtoMatch = autoMailto ? matchMailTo(text) : undefined;
3455
3465
  return linkMatch || telMatch || mailtoMatch;
3456
3466
  }
3457
3467
  exports.getLinkUrl = getLinkUrl;
@@ -3578,7 +3588,7 @@ exports.matchLink = matchLink;
3578
3588
  "use strict";
3579
3589
 
3580
3590
  Object.defineProperty(exports, "__esModule", ({ value: true }));
3581
- exports.promoteLink = void 0;
3591
+ exports.getPromoteLink = exports.promoteLink = void 0;
3582
3592
  var getLinkUrl_1 = __webpack_require__(/*! ./getLinkUrl */ "./packages/roosterjs-content-model-api/lib/modelApi/link/getLinkUrl.ts");
3583
3593
  var splitTextSegment_1 = __webpack_require__(/*! ../../publicApi/segment/splitTextSegment */ "./packages/roosterjs-content-model-api/lib/publicApi/segment/splitTextSegment.ts");
3584
3594
  /**
@@ -3596,14 +3606,12 @@ function promoteLink(segment, paragraph, autoLinkOptions) {
3596
3606
  if (segment.link) {
3597
3607
  return null;
3598
3608
  }
3599
- var link = segment.text.split(' ').pop();
3600
- var url = link === null || link === void 0 ? void 0 : link.trim();
3601
- var linkUrl = undefined;
3602
- if (url && link && (linkUrl = (0, getLinkUrl_1.getLinkUrl)(url, autoLinkOptions))) {
3603
- var linkSegment = (0, splitTextSegment_1.splitTextSegment)(segment, paragraph, segment.text.length - link.trimLeft().length, segment.text.trimRight().length);
3609
+ var promotedLink = getPromoteLink(segment, autoLinkOptions);
3610
+ if (promotedLink) {
3611
+ var linkSegment = (0, splitTextSegment_1.splitTextSegment)(segment, paragraph, segment.text.length - promotedLink.label.trimLeft().length, segment.text.trimRight().length);
3604
3612
  linkSegment.link = {
3605
3613
  format: {
3606
- href: linkUrl,
3614
+ href: promotedLink.href,
3607
3615
  underline: true,
3608
3616
  },
3609
3617
  dataset: {},
@@ -3613,6 +3621,25 @@ function promoteLink(segment, paragraph, autoLinkOptions) {
3613
3621
  return null;
3614
3622
  }
3615
3623
  exports.promoteLink = promoteLink;
3624
+ /**
3625
+ * Verify if the link can be promoted
3626
+ * @param segment The text segment to search link text from
3627
+ * @param options Options of auto link
3628
+ * @returns if a link can be promoted
3629
+ */
3630
+ function getPromoteLink(segment, autoLinkOptions) {
3631
+ var link = segment.text.split(' ').pop();
3632
+ var url = link === null || link === void 0 ? void 0 : link.trim();
3633
+ var linkUrl = undefined;
3634
+ if (url && link && (linkUrl = (0, getLinkUrl_1.getLinkUrl)(url, autoLinkOptions))) {
3635
+ return {
3636
+ label: link,
3637
+ href: linkUrl,
3638
+ };
3639
+ }
3640
+ return undefined;
3641
+ }
3642
+ exports.getPromoteLink = getPromoteLink;
3616
3643
 
3617
3644
 
3618
3645
  /***/ }),
@@ -3856,7 +3883,8 @@ function setListType(model, listType, removeMargins) {
3856
3883
  var _b, _c;
3857
3884
  var block = _a.block, parent = _a.parent;
3858
3885
  if ((0, roosterjs_content_model_dom_1.isBlockGroupOfType)(block, 'ListItem')) {
3859
- var level = block.levels.pop();
3886
+ var mutableBlock = (0, roosterjs_content_model_dom_1.mutateBlock)(block);
3887
+ var level = mutableBlock.levels.pop();
3860
3888
  if (!alreadyInExpectedType && level) {
3861
3889
  level.listType = listType;
3862
3890
  (0, roosterjs_content_model_dom_1.updateListMetadata)(level, function (metadata) {
@@ -3864,7 +3892,7 @@ function setListType(model, listType, removeMargins) {
3864
3892
  applyListStyleFromLevel: true,
3865
3893
  });
3866
3894
  });
3867
- block.levels.push(level);
3895
+ mutableBlock.levels.push(level);
3868
3896
  }
3869
3897
  else if (block.blocks.length == 1) {
3870
3898
  (0, roosterjs_content_model_dom_1.setParagraphNotImplicit)(block.blocks[0]);
@@ -5147,7 +5175,6 @@ function getExistingHeadingTag(decorator) {
5147
5175
 
5148
5176
  Object.defineProperty(exports, "__esModule", ({ value: true }));
5149
5177
  exports.setIndentation = void 0;
5150
- var roosterjs_content_model_dom_1 = __webpack_require__(/*! roosterjs-content-model-dom */ "./packages/roosterjs-content-model-dom/lib/index.ts");
5151
5178
  var setModelIndentation_1 = __webpack_require__(/*! ../../modelApi/block/setModelIndentation */ "./packages/roosterjs-content-model-api/lib/modelApi/block/setModelIndentation.ts");
5152
5179
  /**
5153
5180
  * Indent or outdent to selected paragraphs
@@ -5159,9 +5186,6 @@ function setIndentation(editor, indentation, length) {
5159
5186
  editor.focus();
5160
5187
  editor.formatContentModel(function (model, context) {
5161
5188
  var result = (0, setModelIndentation_1.setModelIndentation)(model, indentation, length);
5162
- if (result) {
5163
- (0, roosterjs_content_model_dom_1.normalizeContentModel)(model);
5164
- }
5165
5189
  context.newPendingFormat = 'preserve';
5166
5190
  return result;
5167
5191
  }, {
@@ -7483,7 +7507,7 @@ function formatSegmentWithContentModel(editor, apiName, toggleStyleCallback, seg
7483
7507
  var modelsFromEntities = [];
7484
7508
  segmentAndParagraphs.forEach(function (item) {
7485
7509
  if (item[0].segmentType == 'Entity') {
7486
- expandEntitySelections(editor, item[0], formatsAndSegments, modelsFromEntities);
7510
+ expandEntitySelections(editor, item[0], formatsAndSegments, modelsFromEntities, item[1]);
7487
7511
  }
7488
7512
  else {
7489
7513
  formatsAndSegments.push([item[0].format, item[0], item[1]]);
@@ -7528,7 +7552,7 @@ function formatSegmentWithContentModel(editor, apiName, toggleStyleCallback, seg
7528
7552
  });
7529
7553
  }
7530
7554
  exports.formatSegmentWithContentModel = formatSegmentWithContentModel;
7531
- function expandEntitySelections(editor, entity, formatsAndSegments, modelsFromEntities) {
7555
+ function expandEntitySelections(editor, entity, formatsAndSegments, modelsFromEntities, paragraph) {
7532
7556
  var _a = entity.entityFormat, id = _a.id, type = _a.entityType, isReadonly = _a.isReadonly;
7533
7557
  if (id && type) {
7534
7558
  var formattableRoots = [];
@@ -7552,6 +7576,9 @@ function expandEntitySelections(editor, entity, formatsAndSegments, modelsFromEn
7552
7576
  modelsFromEntities.push([entity, root, model]);
7553
7577
  }
7554
7578
  });
7579
+ if (formattableRoots.length > 0) {
7580
+ formatsAndSegments.push([entity.format, entity, paragraph]);
7581
+ }
7555
7582
  }
7556
7583
  }
7557
7584
  function writeBackEntities(editor, modelsFromEntities) {
@@ -8969,8 +8996,8 @@ function createDOMFromHtml(html, domCreator) {
8969
8996
  Object.defineProperty(exports, "__esModule", ({ value: true }));
8970
8997
  exports.retrieveHtmlInfo = void 0;
8971
8998
  var tslib_1 = __webpack_require__(/*! tslib */ "./node_modules/tslib/tslib.es6.mjs");
8972
- var roosterjs_content_model_dom_1 = __webpack_require__(/*! roosterjs-content-model-dom */ "./packages/roosterjs-content-model-dom/lib/index.ts");
8973
8999
  var convertInlineCss_1 = __webpack_require__(/*! ../createModelFromHtml/convertInlineCss */ "./packages/roosterjs-content-model-core/lib/command/createModelFromHtml/convertInlineCss.ts");
9000
+ var roosterjs_content_model_dom_1 = __webpack_require__(/*! roosterjs-content-model-dom */ "./packages/roosterjs-content-model-dom/lib/index.ts");
8974
9001
  var START_FRAGMENT = '<!--StartFragment-->';
8975
9002
  var END_FRAGMENT = '<!--EndFragment-->';
8976
9003
  /**
@@ -8982,7 +9009,7 @@ function retrieveHtmlInfo(doc, clipboardData) {
8982
9009
  globalCssRules: [],
8983
9010
  };
8984
9011
  if (doc) {
8985
- result = (0, tslib_1.__assign)((0, tslib_1.__assign)({}, retrieveHtmlStrings(clipboardData)), { globalCssRules: (0, convertInlineCss_1.retrieveCssRules)(doc), metadata: retrieveMetadata(doc), containsBlockElements: checkBlockElements(doc) });
9012
+ result = (0, tslib_1.__assign)((0, tslib_1.__assign)({}, retrieveHtmlStrings(clipboardData)), { globalCssRules: (0, convertInlineCss_1.retrieveCssRules)(doc), metadata: (0, roosterjs_content_model_dom_1.retrieveDocumentMetadata)(doc), containsBlockElements: checkBlockElements(doc) });
8986
9013
  clipboardData.htmlFirstLevelChildTags = retrieveTopLevelTags(doc);
8987
9014
  }
8988
9015
  return result;
@@ -9004,18 +9031,6 @@ function retrieveTopLevelTags(doc) {
9004
9031
  }
9005
9032
  return topLevelTags;
9006
9033
  }
9007
- function retrieveMetadata(doc) {
9008
- var _a;
9009
- var result = {};
9010
- var attributes = (_a = doc.querySelector('html')) === null || _a === void 0 ? void 0 : _a.attributes;
9011
- (attributes ? (0, roosterjs_content_model_dom_1.toArray)(attributes) : []).forEach(function (attr) {
9012
- result[attr.name] = attr.value;
9013
- });
9014
- (0, roosterjs_content_model_dom_1.toArray)(doc.querySelectorAll('meta')).forEach(function (meta) {
9015
- result[meta.name] = meta.content;
9016
- });
9017
- return result;
9018
- }
9019
9034
  function retrieveHtmlStrings(clipboardData) {
9020
9035
  var _a;
9021
9036
  var rawHtml = (_a = clipboardData.rawHtml) !== null && _a !== void 0 ? _a : '';
@@ -9610,10 +9625,10 @@ var getRootComputedStyleForContext_1 = __webpack_require__(/*! ./getRootComputed
9610
9625
  * Create a EditorContext object used by ContentModel API
9611
9626
  */
9612
9627
  var createEditorContext = function (core, saveIndex) {
9613
- var _a, _b;
9628
+ var _a, _b, _c;
9614
9629
  var lifecycle = core.lifecycle, format = core.format, darkColorHandler = core.darkColorHandler, logicalRoot = core.logicalRoot, cache = core.cache, domHelper = core.domHelper;
9615
9630
  saveIndex = saveIndex && !core.lifecycle.shadowEditFragment;
9616
- var context = (0, tslib_1.__assign)({ isDarkMode: lifecycle.isDarkMode, defaultFormat: format.defaultFormat, pendingFormat: (_a = format.pendingFormat) !== null && _a !== void 0 ? _a : undefined, darkColorHandler: darkColorHandler, addDelimiterForEntity: true, allowCacheElement: true, domIndexer: saveIndex ? cache.domIndexer : undefined, zoomScale: domHelper.calculateZoomScale(), experimentalFeatures: (_b = core.experimentalFeatures) !== null && _b !== void 0 ? _b : [], paragraphMap: core.cache.paragraphMap, editorViewWidth: domHelper.getClientWidth() }, (0, getRootComputedStyleForContext_1.getRootComputedStyleForContext)(logicalRoot.ownerDocument));
9631
+ var context = (0, tslib_1.__assign)({ isDarkMode: lifecycle.isDarkMode, defaultFormat: format.defaultFormat, pendingFormat: (_a = format.pendingFormat) !== null && _a !== void 0 ? _a : undefined, darkColorHandler: darkColorHandler, addDelimiterForEntity: true, allowCacheElement: true, allowCacheListItem: !!((_b = core.experimentalFeatures) === null || _b === void 0 ? void 0 : _b.includes('CacheList')), domIndexer: saveIndex ? cache.domIndexer : undefined, zoomScale: domHelper.calculateZoomScale(), experimentalFeatures: (_c = core.experimentalFeatures) !== null && _c !== void 0 ? _c : [], paragraphMap: core.cache.paragraphMap, editorViewWidth: domHelper.getClientWidth() }, (0, getRootComputedStyleForContext_1.getRootComputedStyleForContext)(logicalRoot.ownerDocument));
9617
9632
  if (core.domHelper.isRightToLeft()) {
9618
9633
  context.isRootRtl = true;
9619
9634
  }
@@ -11447,7 +11462,7 @@ var DomIndexerImpl = /** @class */ (function () {
11447
11462
  var startContainer = newRange.startContainer, startOffset = newRange.startOffset, endContainer = newRange.endContainer, endOffset = newRange.endOffset, collapsed = newRange.collapsed;
11448
11463
  delete model.hasRevertedRangeSelection;
11449
11464
  if (collapsed) {
11450
- return !!this.reconcileNodeSelection(startContainer, startOffset, model.format);
11465
+ return !!this.reconcileNodeSelection(startContainer, startOffset, model.format, selectionMarker);
11451
11466
  }
11452
11467
  else if (startContainer == endContainer &&
11453
11468
  (0, roosterjs_content_model_dom_1.isNodeOfType)(startContainer, 'TEXT_NODE')) {
@@ -11535,10 +11550,10 @@ var DomIndexerImpl = /** @class */ (function () {
11535
11550
  var start = selection.start, end = selection.end;
11536
11551
  return start.node == end.node && start.offset == end.offset;
11537
11552
  };
11538
- DomIndexerImpl.prototype.reconcileNodeSelection = function (node, offset, defaultFormat) {
11553
+ DomIndexerImpl.prototype.reconcileNodeSelection = function (node, offset, defaultFormat, selectionMarker) {
11539
11554
  if ((0, roosterjs_content_model_dom_1.isNodeOfType)(node, 'TEXT_NODE')) {
11540
11555
  if (isIndexedSegment(node)) {
11541
- return this.reconcileTextSelection(node, offset);
11556
+ return this.reconcileTextSelection(node, offset, undefined, selectionMarker);
11542
11557
  }
11543
11558
  else if (isIndexedDelimiter(node)) {
11544
11559
  return this.reconcileDelimiterSelection(node, defaultFormat);
@@ -19549,6 +19564,39 @@ function readFile(file, callback) {
19549
19564
  exports.readFile = readFile;
19550
19565
 
19551
19566
 
19567
+ /***/ }),
19568
+
19569
+ /***/ "./packages/roosterjs-content-model-dom/lib/domUtils/retrieveDocumentMetadata.ts":
19570
+ /*!***************************************************************************************!*\
19571
+ !*** ./packages/roosterjs-content-model-dom/lib/domUtils/retrieveDocumentMetadata.ts ***!
19572
+ \***************************************************************************************/
19573
+ /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
19574
+
19575
+ "use strict";
19576
+
19577
+ Object.defineProperty(exports, "__esModule", ({ value: true }));
19578
+ exports.retrieveDocumentMetadata = void 0;
19579
+ var toArray_1 = __webpack_require__(/*! ./toArray */ "./packages/roosterjs-content-model-dom/lib/domUtils/toArray.ts");
19580
+ /**
19581
+ * Retrieves metadata from the given document, including HTML attributes and meta tags.
19582
+ * @param doc The document from which to retrieve metadata.
19583
+ * @returns A record containing metadata key-value pairs.
19584
+ */
19585
+ function retrieveDocumentMetadata(doc) {
19586
+ var _a;
19587
+ var result = {};
19588
+ var attributes = (_a = doc.querySelector('html')) === null || _a === void 0 ? void 0 : _a.attributes;
19589
+ (attributes ? (0, toArray_1.toArray)(attributes) : []).forEach(function (attr) {
19590
+ result[attr.name] = attr.value;
19591
+ });
19592
+ (0, toArray_1.toArray)(doc.querySelectorAll('meta')).forEach(function (meta) {
19593
+ result[meta.name] = meta.content;
19594
+ });
19595
+ return result;
19596
+ }
19597
+ exports.retrieveDocumentMetadata = retrieveDocumentMetadata;
19598
+
19599
+
19552
19600
  /***/ }),
19553
19601
 
19554
19602
  /***/ "./packages/roosterjs-content-model-dom/lib/domUtils/reuseCachedElement.ts":
@@ -22386,8 +22434,8 @@ exports.shouldSetValue = shouldSetValue;
22386
22434
  Object.defineProperty(exports, "__esModule", ({ value: true }));
22387
22435
  exports.createContentModelDocument = exports.createImage = exports.createText = exports.createTableCell = exports.createTable = exports.createSelectionMarker = exports.createParagraph = exports.createFormatContainer = exports.createListItem = exports.createBr = exports.isLinkUndeletable = exports.setLinkUndeletable = exports.scrollRectIntoView = exports.normalizeRect = exports.isWhiteSpacePreserved = exports.reuseCachedElement = exports.findClosestBlockEntityContainer = exports.isBlockEntityContainer = exports.isEntityDelimiter = exports.addDelimiters = exports.generateEntityClassNames = exports.parseEntityFormat = exports.getAllEntityWrappers = exports.findClosestEntityWrapper = exports.isEntityElement = exports.unwrap = exports.wrap = exports.wrapAllChildNodes = exports.moveChildNodes = exports.toArray = exports.getSafeIdSelector = exports.getObjectKeys = exports.isElementOfType = exports.isNodeOfType = exports.hasMetadata = exports.getMetadata = exports.updateMetadata = exports.buildSelectionMarker = exports.isBlockElement = exports.areSameFormats = exports.parseFormat = exports.getRegularSelectionOffsets = exports.tableProcessor = exports.entityProcessor = exports.processChildNode = exports.handleRegularSelection = exports.childProcessor = exports.contentModelToText = exports.contentModelToDom = exports.domToContentModel = void 0;
22388
22436
  exports.isModifierKey = exports.isCharacterValue = exports.getDOMInsertPointRect = exports.getSelectionRootNode = exports.isBold = exports.createModelToDomConfig = exports.createModelToDomContextWithConfig = exports.createModelToDomContext = exports.createDomToModelConfig = exports.createDomToModelContextWithConfig = exports.createDomToModelContext = exports.defaultGenerateColorKey = exports.parseColor = exports.setColor = exports.getColor = exports.DeprecatedColors = exports.BorderKeys = exports.parseValueWithUnit = exports.getAutoListStyleType = exports.getOrderedListNumberStr = exports.ParagraphFormats = exports.ListFormatsToMove = exports.ListFormatsToKeep = exports.ListFormats = exports.copyFormat = exports.setParagraphNotImplicit = exports.normalizeSegmentFormat = exports.mergeTextSegments = exports.normalizeSingleSegment = exports.isEmpty = exports.addSegment = exports.unwrapBlock = exports.isGeneralSegment = exports.normalizeContentModel = exports.normalizeParagraph = exports.addTextSegment = exports.addLink = exports.addCode = exports.addBlock = exports.mutateSegment = exports.mutateSegments = exports.mutateBlock = exports.createTableRow = exports.createEmptyModel = exports.createListLevel = exports.createDivider = exports.createEntity = exports.createGeneralBlock = exports.createGeneralSegment = exports.createParagraphDecorator = void 0;
22389
- exports.getTableCellMetadata = exports.updateTableCellMetadata = exports.getImageMetadata = exports.updateImageMetadata = exports.runEditSteps = exports.getClosestAncestorBlockGroupIndex = exports.getSegmentTextFormat = exports.getListStyleTypeFromString = exports.retrieveModelFormatState = exports.setTableCellBackgroundColor = exports.MIN_ALLOWED_TABLE_CELL_HEIGHT = exports.MIN_ALLOWED_TABLE_CELL_WIDTH = exports.normalizeTable = exports.setFirstColumnFormatBorders = exports.applyTableFormat = exports.deleteBlock = exports.deleteSegment = exports.deleteSelection = exports.mergeModel = exports.cloneModel = exports.setSelection = exports.hasSelectionInBlockGroup = exports.hasSelectionInSegment = exports.hasSelectionInBlock = exports.getSelectedCells = exports.getSelectedSegmentsAndParagraphs = exports.getSelectedSegments = exports.getSelectedParagraphs = exports.getOperationalBlocks = exports.getFirstSelectedTable = exports.getFirstSelectedListItem = exports.iterateSelections = exports.isBlockGroupOfType = exports.getRangesByText = exports.getImageState = exports.setImageState = exports.getParagraphMarker = exports.setParagraphMarker = exports.cacheGetEventData = exports.extractClipboardItems = exports.normalizeFontFamily = exports.transformColor = exports.readFile = exports.parseTableCells = exports.normalizeText = exports.isSpace = exports.isPunctuation = exports.extractBorderValues = exports.combineBorderValue = exports.isCursorMovingKey = void 0;
22390
- exports.EmptySegmentFormat = exports.UnorderedListStyleMap = exports.OrderedListStyleMap = exports.TableBorderFormat = exports.NumberingListType = exports.BulletListType = exports.ChangeSource = exports.ListMetadataDefinition = exports.getListMetadata = exports.updateListMetadata = exports.getTableMetadata = exports.updateTableMetadata = void 0;
22437
+ exports.updateTableCellMetadata = exports.getImageMetadata = exports.updateImageMetadata = exports.runEditSteps = exports.getClosestAncestorBlockGroupIndex = exports.getSegmentTextFormat = exports.getListStyleTypeFromString = exports.retrieveModelFormatState = exports.setTableCellBackgroundColor = exports.MIN_ALLOWED_TABLE_CELL_HEIGHT = exports.MIN_ALLOWED_TABLE_CELL_WIDTH = exports.normalizeTable = exports.setFirstColumnFormatBorders = exports.applyTableFormat = exports.deleteBlock = exports.deleteSegment = exports.deleteSelection = exports.mergeModel = exports.cloneModel = exports.setSelection = exports.hasSelectionInBlockGroup = exports.hasSelectionInSegment = exports.hasSelectionInBlock = exports.getSelectedCells = exports.getSelectedSegmentsAndParagraphs = exports.getSelectedSegments = exports.getSelectedParagraphs = exports.getOperationalBlocks = exports.getFirstSelectedTable = exports.getFirstSelectedListItem = exports.iterateSelections = exports.isBlockGroupOfType = exports.getRangesByText = exports.getImageState = exports.setImageState = exports.getParagraphMarker = exports.setParagraphMarker = exports.cacheGetEventData = exports.extractClipboardItems = exports.normalizeFontFamily = exports.transformColor = exports.retrieveDocumentMetadata = exports.readFile = exports.parseTableCells = exports.normalizeText = exports.isSpace = exports.isPunctuation = exports.extractBorderValues = exports.combineBorderValue = exports.isCursorMovingKey = void 0;
22438
+ exports.EmptySegmentFormat = exports.UnorderedListStyleMap = exports.OrderedListStyleMap = exports.TableBorderFormat = exports.NumberingListType = exports.BulletListType = exports.ChangeSource = exports.ListMetadataDefinition = exports.getListMetadata = exports.updateListMetadata = exports.getTableMetadata = exports.updateTableMetadata = exports.getTableCellMetadata = void 0;
22391
22439
  var domToContentModel_1 = __webpack_require__(/*! ./domToModel/domToContentModel */ "./packages/roosterjs-content-model-dom/lib/domToModel/domToContentModel.ts");
22392
22440
  Object.defineProperty(exports, "domToContentModel", ({ enumerable: true, get: function () { return domToContentModel_1.domToContentModel; } }));
22393
22441
  var contentModelToDom_1 = __webpack_require__(/*! ./modelToDom/contentModelToDom */ "./packages/roosterjs-content-model-dom/lib/modelToDom/contentModelToDom.ts");
@@ -22571,6 +22619,8 @@ var parseTableCells_1 = __webpack_require__(/*! ./domUtils/table/parseTableCells
22571
22619
  Object.defineProperty(exports, "parseTableCells", ({ enumerable: true, get: function () { return parseTableCells_1.parseTableCells; } }));
22572
22620
  var readFile_1 = __webpack_require__(/*! ./domUtils/readFile */ "./packages/roosterjs-content-model-dom/lib/domUtils/readFile.ts");
22573
22621
  Object.defineProperty(exports, "readFile", ({ enumerable: true, get: function () { return readFile_1.readFile; } }));
22622
+ var retrieveDocumentMetadata_1 = __webpack_require__(/*! ./domUtils/retrieveDocumentMetadata */ "./packages/roosterjs-content-model-dom/lib/domUtils/retrieveDocumentMetadata.ts");
22623
+ Object.defineProperty(exports, "retrieveDocumentMetadata", ({ enumerable: true, get: function () { return retrieveDocumentMetadata_1.retrieveDocumentMetadata; } }));
22574
22624
  var transformColor_1 = __webpack_require__(/*! ./domUtils/style/transformColor */ "./packages/roosterjs-content-model-dom/lib/domUtils/style/transformColor.ts");
22575
22625
  Object.defineProperty(exports, "transformColor", ({ enumerable: true, get: function () { return transformColor_1.transformColor; } }));
22576
22626
  var normalizeFontFamily_1 = __webpack_require__(/*! ./domUtils/style/normalizeFontFamily */ "./packages/roosterjs-content-model-dom/lib/domUtils/style/normalizeFontFamily.ts");
@@ -27726,12 +27776,11 @@ exports.handleBlock = handleBlock;
27726
27776
 
27727
27777
  Object.defineProperty(exports, "__esModule", ({ value: true }));
27728
27778
  exports.handleBlockGroupChildren = void 0;
27729
- var isNodeOfType_1 = __webpack_require__(/*! ../../domUtils/isNodeOfType */ "./packages/roosterjs-content-model-dom/lib/domUtils/isNodeOfType.ts");
27779
+ var cleanUpRestNodes_1 = __webpack_require__(/*! ../utils/cleanUpRestNodes */ "./packages/roosterjs-content-model-dom/lib/modelToDom/utils/cleanUpRestNodes.ts");
27730
27780
  /**
27731
27781
  * @internal
27732
27782
  */
27733
27783
  var handleBlockGroupChildren = function (doc, parent, group, context) {
27734
- var _a;
27735
27784
  var listFormat = context.listFormat;
27736
27785
  var nodeStack = listFormat.nodeStack;
27737
27786
  var refNode = parent.firstChild;
@@ -27745,28 +27794,35 @@ var handleBlockGroupChildren = function (doc, parent, group, context) {
27745
27794
  if (index == 0 ||
27746
27795
  childBlock.blockType != 'BlockGroup' ||
27747
27796
  childBlock.blockGroupType != 'ListItem') {
27748
- listFormat.nodeStack = [];
27797
+ cleanUpNodeStack(listFormat.nodeStack, context);
27798
+ if (listFormat.nodeStack.length > 0) {
27799
+ listFormat.nodeStack = [];
27800
+ }
27749
27801
  }
27750
27802
  refNode = context.modelHandlers.block(doc, parent, childBlock, context, refNode);
27751
27803
  if (childBlock.blockType == 'Entity') {
27752
27804
  (_a = context.domIndexer) === null || _a === void 0 ? void 0 : _a.onBlockEntity(childBlock, group);
27753
27805
  }
27754
27806
  });
27807
+ cleanUpNodeStack(listFormat.nodeStack, context);
27755
27808
  // Remove all rest node if any since they don't appear in content model
27756
- while (refNode) {
27757
- var next = refNode.nextSibling;
27758
- if ((0, isNodeOfType_1.isNodeOfType)(refNode, 'ELEMENT_NODE')) {
27759
- context.rewriteFromModel.removedBlockElements.push(refNode);
27760
- }
27761
- (_a = refNode.parentNode) === null || _a === void 0 ? void 0 : _a.removeChild(refNode);
27762
- refNode = next;
27763
- }
27809
+ (0, cleanUpRestNodes_1.cleanUpRestNodes)(refNode, context.rewriteFromModel);
27764
27810
  }
27765
27811
  finally {
27766
27812
  listFormat.nodeStack = nodeStack;
27767
27813
  }
27768
27814
  };
27769
27815
  exports.handleBlockGroupChildren = handleBlockGroupChildren;
27816
+ function cleanUpNodeStack(nodeStack, context) {
27817
+ var _a, _b;
27818
+ if (context.allowCacheListItem && nodeStack.length > 0) {
27819
+ // Clear list stack, only run to nodeStack[1] because nodeStack[0] is the parent node
27820
+ for (var i = nodeStack.length - 1; i > 0; i--) {
27821
+ var node = (_b = (_a = nodeStack.pop()) === null || _a === void 0 ? void 0 : _a.refNode) !== null && _b !== void 0 ? _b : null;
27822
+ (0, cleanUpRestNodes_1.cleanUpRestNodes)(node, context.rewriteFromModel);
27823
+ }
27824
+ }
27825
+ }
27770
27826
 
27771
27827
 
27772
27828
  /***/ }),
@@ -28101,20 +28157,24 @@ exports.handleList = void 0;
28101
28157
  var tslib_1 = __webpack_require__(/*! tslib */ "./node_modules/tslib/tslib.es6.mjs");
28102
28158
  var applyFormat_1 = __webpack_require__(/*! ../utils/applyFormat */ "./packages/roosterjs-content-model-dom/lib/modelToDom/utils/applyFormat.ts");
28103
28159
  var applyMetadata_1 = __webpack_require__(/*! ../utils/applyMetadata */ "./packages/roosterjs-content-model-dom/lib/modelToDom/utils/applyMetadata.ts");
28160
+ var cleanUpRestNodes_1 = __webpack_require__(/*! ../utils/cleanUpRestNodes */ "./packages/roosterjs-content-model-dom/lib/modelToDom/utils/cleanUpRestNodes.ts");
28161
+ var reuseCachedElement_1 = __webpack_require__(/*! ../../domUtils/reuseCachedElement */ "./packages/roosterjs-content-model-dom/lib/domUtils/reuseCachedElement.ts");
28104
28162
  /**
28105
28163
  * @internal
28106
28164
  */
28107
28165
  var handleList = function (doc, parent, listItem, context, refNode) {
28108
- var _a, _b, _c;
28166
+ var _a, _b, _c, _d;
28109
28167
  var layer = 0;
28110
28168
  var nodeStack = context.listFormat.nodeStack;
28111
28169
  if (nodeStack.length == 0) {
28112
28170
  nodeStack.push({
28113
28171
  node: parent,
28172
+ refNode: refNode,
28114
28173
  });
28115
28174
  }
28116
28175
  // Skip existing list levels that has same properties so we can reuse them
28117
28176
  for (; layer < listItem.levels.length && layer + 1 < nodeStack.length; layer++) {
28177
+ var parentLevel = nodeStack[layer];
28118
28178
  var stackLevel = nodeStack[layer + 1];
28119
28179
  var itemLevel = listItem.levels[layer];
28120
28180
  if (stackLevel.listType != itemLevel.listType ||
@@ -28125,30 +28185,66 @@ var handleList = function (doc, parent, listItem, context, refNode) {
28125
28185
  itemLevel.format.listStyleType != ((_b = stackLevel.format) === null || _b === void 0 ? void 0 : _b.listStyleType))) {
28126
28186
  break;
28127
28187
  }
28188
+ if (context.allowCacheListItem &&
28189
+ parentLevel.refNode &&
28190
+ itemLevel.cachedElement == parentLevel.refNode) {
28191
+ // Move refNode to next node since we are reusing this cached element
28192
+ parentLevel.refNode = parentLevel.refNode.nextSibling;
28193
+ }
28128
28194
  }
28129
28195
  // Cut off remained list levels that we can't reuse
28196
+ if (context.allowCacheListItem) {
28197
+ // Clean up all rest nodes in the reused list levels
28198
+ for (var i = layer + 1; i < nodeStack.length; i++) {
28199
+ var stackLevel = nodeStack[i];
28200
+ (0, cleanUpRestNodes_1.cleanUpRestNodes)(stackLevel.refNode, context.rewriteFromModel);
28201
+ }
28202
+ }
28130
28203
  nodeStack.splice(layer + 1);
28131
28204
  // Create new list levels that are after reused ones
28132
28205
  for (; layer < listItem.levels.length; layer++) {
28133
28206
  var level = listItem.levels[layer];
28134
- var newList = doc.createElement(level.listType || 'UL');
28135
28207
  var lastParent = nodeStack[nodeStack.length - 1].node;
28136
- lastParent.insertBefore(newList, layer == 0 ? refNode : null);
28137
- nodeStack.push({
28138
- node: newList,
28139
- listType: level.listType,
28140
- format: (0, tslib_1.__assign)({}, level.format),
28141
- dataset: (0, tslib_1.__assign)({}, level.dataset),
28142
- });
28208
+ var newList = void 0;
28209
+ var isNewlyCreated = false;
28210
+ var levelRefNode = (_c = nodeStack[layer].refNode) !== null && _c !== void 0 ? _c : null;
28211
+ if (context.allowCacheListItem && level.cachedElement) {
28212
+ newList = level.cachedElement;
28213
+ nodeStack[layer].refNode = (0, reuseCachedElement_1.reuseCachedElement)(lastParent, level.cachedElement, levelRefNode, context.rewriteFromModel);
28214
+ nodeStack.push({
28215
+ node: newList,
28216
+ refNode: newList.firstChild,
28217
+ listType: level.listType,
28218
+ format: (0, tslib_1.__assign)({}, level.format),
28219
+ dataset: (0, tslib_1.__assign)({}, level.dataset),
28220
+ });
28221
+ }
28222
+ else {
28223
+ newList = doc.createElement(level.listType == 'OL' ? 'ol' : 'ul');
28224
+ isNewlyCreated = true;
28225
+ lastParent.insertBefore(newList, levelRefNode);
28226
+ nodeStack.push({
28227
+ node: newList,
28228
+ refNode: null,
28229
+ listType: level.listType,
28230
+ format: (0, tslib_1.__assign)({}, level.format),
28231
+ dataset: (0, tslib_1.__assign)({}, level.dataset),
28232
+ });
28233
+ if (context.allowCacheListItem) {
28234
+ level.cachedElement = newList;
28235
+ }
28236
+ }
28143
28237
  (0, applyFormat_1.applyFormat)(newList, context.formatAppliers.listLevelThread, level.format, context);
28144
28238
  // Need to apply metadata after applying list level format since the list numbers value relies on the result of list thread handling
28145
28239
  (0, applyMetadata_1.applyMetadata)(level, context.metadataAppliers.listLevel, level.format, context);
28146
28240
  // Need to apply listItemElement formats after applying metadata since the list numbers value relies on the result of metadata handling
28147
28241
  (0, applyFormat_1.applyFormat)(newList, context.formatAppliers.listLevel, level.format, context);
28148
28242
  (0, applyFormat_1.applyFormat)(newList, context.formatAppliers.dataset, level.dataset, context);
28149
- (_c = context.onNodeCreated) === null || _c === void 0 ? void 0 : _c.call(context, level, newList);
28243
+ if (isNewlyCreated) {
28244
+ (_d = context.onNodeCreated) === null || _d === void 0 ? void 0 : _d.call(context, level, newList);
28245
+ }
28150
28246
  }
28151
- return refNode;
28247
+ return nodeStack[0].refNode;
28152
28248
  };
28153
28249
  exports.handleList = handleList;
28154
28250
 
@@ -28168,6 +28264,7 @@ exports.handleListItem = void 0;
28168
28264
  var applyFormat_1 = __webpack_require__(/*! ../utils/applyFormat */ "./packages/roosterjs-content-model-dom/lib/modelToDom/utils/applyFormat.ts");
28169
28265
  var applyMetadata_1 = __webpack_require__(/*! ../utils/applyMetadata */ "./packages/roosterjs-content-model-dom/lib/modelToDom/utils/applyMetadata.ts");
28170
28266
  var isGenericRoleElement_1 = __webpack_require__(/*! ../../domUtils/isGenericRoleElement */ "./packages/roosterjs-content-model-dom/lib/domUtils/isGenericRoleElement.ts");
28267
+ var reuseCachedElement_1 = __webpack_require__(/*! ../../domUtils/reuseCachedElement */ "./packages/roosterjs-content-model-dom/lib/domUtils/reuseCachedElement.ts");
28171
28268
  var setParagraphNotImplicit_1 = __webpack_require__(/*! ../../modelApi/block/setParagraphNotImplicit */ "./packages/roosterjs-content-model-dom/lib/modelApi/block/setParagraphNotImplicit.ts");
28172
28269
  var stackFormat_1 = __webpack_require__(/*! ../utils/stackFormat */ "./packages/roosterjs-content-model-dom/lib/modelToDom/utils/stackFormat.ts");
28173
28270
  var unwrap_1 = __webpack_require__(/*! ../../domUtils/unwrap */ "./packages/roosterjs-content-model-dom/lib/domUtils/unwrap.ts");
@@ -28180,13 +28277,35 @@ var handleListItem = function (doc, parent, listItem, context, refNode) {
28180
28277
  var _a, _b;
28181
28278
  refNode = context.modelHandlers.list(doc, parent, listItem, context, refNode);
28182
28279
  var nodeStack = context.listFormat.nodeStack;
28183
- var listParent = ((_a = nodeStack === null || nodeStack === void 0 ? void 0 : nodeStack[(nodeStack === null || nodeStack === void 0 ? void 0 : nodeStack.length) - 1]) === null || _a === void 0 ? void 0 : _a.node) || parent;
28184
- var li = doc.createElement('li');
28280
+ var leafLevel = (_a = nodeStack === null || nodeStack === void 0 ? void 0 : nodeStack[nodeStack.length - 1]) !== null && _a !== void 0 ? _a : {};
28281
+ var itemRefNode = leafLevel.refNode || null;
28282
+ var listParent = leafLevel.node || parent;
28185
28283
  var level = listItem.levels[listItem.levels.length - 1];
28186
- // It is possible listParent is the same with parent param.
28187
- // This happens when outdent a list item to cause it has no list level
28188
- listParent.insertBefore(li, (refNode === null || refNode === void 0 ? void 0 : refNode.parentNode) == listParent ? refNode : null);
28189
- context.rewriteFromModel.addedBlockElements.push(li);
28284
+ var li;
28285
+ var isNewlyCreated = false;
28286
+ if (context.allowCacheListItem && listItem.cachedElement) {
28287
+ li = listItem.cachedElement;
28288
+ // Check if the cached LI is used as refNode under another list level,
28289
+ // since we know we are going to move it under the current listParent,
28290
+ // we need to update the refNode of the previous list level to avoid removing it later
28291
+ for (var i = 0; i < nodeStack.length - 1; i++) {
28292
+ if (nodeStack[i].refNode === li) {
28293
+ nodeStack[i].refNode = li.nextSibling;
28294
+ }
28295
+ }
28296
+ leafLevel.refNode = (0, reuseCachedElement_1.reuseCachedElement)(listParent, li, itemRefNode, context.rewriteFromModel);
28297
+ }
28298
+ else {
28299
+ li = doc.createElement('li');
28300
+ isNewlyCreated = true;
28301
+ // It is possible listParent is the same with parent param.
28302
+ // This happens when outdent a list item to cause it has no list level
28303
+ listParent.insertBefore(li, (itemRefNode === null || itemRefNode === void 0 ? void 0 : itemRefNode.parentNode) == listParent ? itemRefNode : null);
28304
+ context.rewriteFromModel.addedBlockElements.push(li);
28305
+ if (context.allowCacheListItem) {
28306
+ listItem.cachedElement = li;
28307
+ }
28308
+ }
28190
28309
  if (level) {
28191
28310
  (0, applyFormat_1.applyFormat)(li, context.formatAppliers.segment, listItem.formatHolder.format, context);
28192
28311
  (0, applyFormat_1.applyFormat)(li, context.formatAppliers.listItemThread, level.format, context);
@@ -28214,7 +28333,9 @@ var handleListItem = function (doc, parent, listItem, context, refNode) {
28214
28333
  element.setAttribute(HtmlRoleAttribute, PresentationRoleValue);
28215
28334
  }
28216
28335
  }
28217
- (_b = context.onNodeCreated) === null || _b === void 0 ? void 0 : _b.call(context, listItem, li);
28336
+ if (isNewlyCreated) {
28337
+ (_b = context.onNodeCreated) === null || _b === void 0 ? void 0 : _b.call(context, listItem, li);
28338
+ }
28218
28339
  return refNode;
28219
28340
  };
28220
28341
  exports.handleListItem = handleListItem;
@@ -28794,6 +28915,40 @@ function applyMetadata(model, applier, format, context) {
28794
28915
  exports.applyMetadata = applyMetadata;
28795
28916
 
28796
28917
 
28918
+ /***/ }),
28919
+
28920
+ /***/ "./packages/roosterjs-content-model-dom/lib/modelToDom/utils/cleanUpRestNodes.ts":
28921
+ /*!***************************************************************************************!*\
28922
+ !*** ./packages/roosterjs-content-model-dom/lib/modelToDom/utils/cleanUpRestNodes.ts ***!
28923
+ \***************************************************************************************/
28924
+ /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
28925
+
28926
+ "use strict";
28927
+
28928
+ Object.defineProperty(exports, "__esModule", ({ value: true }));
28929
+ exports.cleanUpRestNodes = void 0;
28930
+ var isNodeOfType_1 = __webpack_require__(/*! ../../domUtils/isNodeOfType */ "./packages/roosterjs-content-model-dom/lib/domUtils/isNodeOfType.ts");
28931
+ /**
28932
+ * @internal
28933
+ * Cleans up all rest nodes starting from refNode
28934
+ * @param refNode The reference node to start cleaning up
28935
+ * @param rewriteContext The context for rewrite process
28936
+ */
28937
+ function cleanUpRestNodes(refNode, rewriteContext) {
28938
+ while (refNode) {
28939
+ var next = refNode.nextSibling;
28940
+ if (refNode.parentNode) {
28941
+ if ((0, isNodeOfType_1.isNodeOfType)(refNode, 'ELEMENT_NODE')) {
28942
+ rewriteContext.removedBlockElements.push(refNode);
28943
+ }
28944
+ refNode.parentNode.removeChild(refNode);
28945
+ }
28946
+ refNode = next;
28947
+ }
28948
+ }
28949
+ exports.cleanUpRestNodes = cleanUpRestNodes;
28950
+
28951
+
28797
28952
  /***/ }),
28798
28953
 
28799
28954
  /***/ "./packages/roosterjs-content-model-dom/lib/modelToDom/utils/handleSegmentCommon.ts":
@@ -28846,12 +29001,15 @@ function stackFormat(context, tagNameOrFormat, callback) {
28846
29001
  : tagNameOrFormat;
28847
29002
  if (newFormat) {
28848
29003
  var implicitFormat = context.implicitFormat;
29004
+ var nodeStack = context.listFormat.nodeStack;
28849
29005
  try {
28850
29006
  context.implicitFormat = (0, tslib_1.__assign)((0, tslib_1.__assign)({}, implicitFormat), newFormat);
29007
+ context.listFormat.nodeStack = [];
28851
29008
  callback();
28852
29009
  }
28853
29010
  finally {
28854
29011
  context.implicitFormat = implicitFormat;
29012
+ context.listFormat.nodeStack = nodeStack;
28855
29013
  }
28856
29014
  }
28857
29015
  else {
@@ -30509,13 +30667,13 @@ var tslib_1 = __webpack_require__(/*! tslib */ "./node_modules/tslib/tslib.es6.m
30509
30667
  var roosterjs_content_model_dom_1 = __webpack_require__(/*! roosterjs-content-model-dom */ "./packages/roosterjs-content-model-dom/lib/index.ts");
30510
30668
  var checkAndInsertHorizontalLine_1 = __webpack_require__(/*! ./horizontalLine/checkAndInsertHorizontalLine */ "./packages/roosterjs-content-model-plugins/lib/autoFormat/horizontalLine/checkAndInsertHorizontalLine.ts");
30511
30669
  var createLink_1 = __webpack_require__(/*! ./link/createLink */ "./packages/roosterjs-content-model-plugins/lib/autoFormat/link/createLink.ts");
30512
- var roosterjs_content_model_api_1 = __webpack_require__(/*! roosterjs-content-model-api */ "./packages/roosterjs-content-model-api/lib/index.ts");
30513
30670
  var getListTypeStyle_1 = __webpack_require__(/*! ./list/getListTypeStyle */ "./packages/roosterjs-content-model-plugins/lib/autoFormat/list/getListTypeStyle.ts");
30514
30671
  var keyboardListTrigger_1 = __webpack_require__(/*! ./list/keyboardListTrigger */ "./packages/roosterjs-content-model-plugins/lib/autoFormat/list/keyboardListTrigger.ts");
30515
30672
  var transformFraction_1 = __webpack_require__(/*! ./numbers/transformFraction */ "./packages/roosterjs-content-model-plugins/lib/autoFormat/numbers/transformFraction.ts");
30516
30673
  var transformHyphen_1 = __webpack_require__(/*! ./hyphen/transformHyphen */ "./packages/roosterjs-content-model-plugins/lib/autoFormat/hyphen/transformHyphen.ts");
30517
30674
  var transformOrdinals_1 = __webpack_require__(/*! ./numbers/transformOrdinals */ "./packages/roosterjs-content-model-plugins/lib/autoFormat/numbers/transformOrdinals.ts");
30518
30675
  var unlink_1 = __webpack_require__(/*! ./link/unlink */ "./packages/roosterjs-content-model-plugins/lib/autoFormat/link/unlink.ts");
30676
+ var roosterjs_content_model_api_1 = __webpack_require__(/*! roosterjs-content-model-api */ "./packages/roosterjs-content-model-api/lib/index.ts");
30519
30677
  /**
30520
30678
  * @internal
30521
30679
  */
@@ -30645,7 +30803,6 @@ var AutoFormatPlugin = /** @class */ (function () {
30645
30803
  this.editor = null;
30646
30804
  };
30647
30805
  AutoFormatPlugin.prototype.shouldHandleInputEventExclusively = function (editor, event) {
30648
- var _this = this;
30649
30806
  var rawEvent = event.rawEvent;
30650
30807
  var selection = editor.getDOMSelection();
30651
30808
  var shouldHandle = false;
@@ -30654,15 +30811,15 @@ var AutoFormatPlugin = /** @class */ (function () {
30654
30811
  selection.type === 'range' &&
30655
30812
  selection.range.collapsed &&
30656
30813
  rawEvent.data == ' ') {
30657
- (0, roosterjs_content_model_api_1.formatTextSegmentBeforeSelectionMarker)(editor, function (model, previousSegment, paragraph) {
30658
- var _a = _this.options, autoLink = _a.autoLink, autoTel = _a.autoTel, autoMailto = _a.autoMailto, autoBullet = _a.autoBullet, autoNumbering = _a.autoNumbering;
30659
- var list = (0, getListTypeStyle_1.getListTypeStyle)(model, autoBullet, autoNumbering);
30660
- var link = (0, roosterjs_content_model_api_1.promoteLink)(previousSegment, paragraph, {
30661
- autoLink: autoLink,
30662
- autoTel: autoTel,
30663
- autoMailto: autoMailto,
30814
+ var _a = this.options, autoLink_1 = _a.autoLink, autoTel_1 = _a.autoTel, autoMailto_1 = _a.autoMailto, autoBullet_1 = _a.autoBullet, autoNumbering_1 = _a.autoNumbering;
30815
+ (0, roosterjs_content_model_api_1.formatTextSegmentBeforeSelectionMarker)(editor, function (model, previousSegment, _paragraph, _markerFormat) {
30816
+ var list = (0, getListTypeStyle_1.getListTypeStyle)(model, autoBullet_1, autoNumbering_1);
30817
+ var promotedLink = (0, roosterjs_content_model_api_1.getPromoteLink)(previousSegment, {
30818
+ autoLink: autoLink_1,
30819
+ autoTel: autoTel_1,
30820
+ autoMailto: autoMailto_1,
30664
30821
  });
30665
- shouldHandle = !!link || !!list;
30822
+ shouldHandle = !!promotedLink || !!list;
30666
30823
  return false;
30667
30824
  });
30668
30825
  }
@@ -31747,8 +31904,22 @@ var DELETE_KEY = 46;
31747
31904
  * Other cases: https://stackoverflow.com/questions/25043934/is-it-ok-to-ignore-keydown-events-with-keycode-229
31748
31905
  */
31749
31906
  var DEAD_KEY = 229;
31907
+ var DefaultHandleTabOptions = {
31908
+ indentMultipleBlocks: true,
31909
+ indentTable: true,
31910
+ appendTableRow: true,
31911
+ indentList: true,
31912
+ indentParagraph: true,
31913
+ };
31914
+ var DisabledHandleTabOptions = {
31915
+ indentMultipleBlocks: false,
31916
+ indentTable: false,
31917
+ appendTableRow: false,
31918
+ indentList: false,
31919
+ indentParagraph: false,
31920
+ };
31750
31921
  var DefaultOptions = {
31751
- handleTabKey: true,
31922
+ handleTabKey: DefaultHandleTabOptions,
31752
31923
  handleExpandedSelectionOnDelete: true,
31753
31924
  };
31754
31925
  /**
@@ -31761,17 +31932,21 @@ var DefaultOptions = {
31761
31932
  var EditPlugin = /** @class */ (function () {
31762
31933
  /**
31763
31934
  * @param options An optional parameter that takes in an object of type EditOptions, which includes the following properties:
31764
- * handleTabKey: A boolean that enables or disables Tab key handling. Defaults to true.
31935
+ * handleTabKey: A boolean or HandleTabOptions object that controls Tab key handling. When a boolean, true enables all features and false disables all. When an object, individual features can be controlled. Defaults to all enabled.
31765
31936
  */
31766
31937
  function EditPlugin(options) {
31767
31938
  if (options === void 0) { options = DefaultOptions; }
31768
- this.options = options;
31769
31939
  this.editor = null;
31770
31940
  this.disposer = null;
31771
31941
  this.shouldHandleNextInputEvent = false;
31772
31942
  this.selectionAfterDelete = null;
31773
31943
  this.handleNormalEnter = function () { return false; };
31774
- this.options = (0, tslib_1.__assign)((0, tslib_1.__assign)({}, DefaultOptions), options);
31944
+ var tabOptions = options.handleTabKey === false
31945
+ ? DisabledHandleTabOptions
31946
+ : options.handleTabKey === true || !options.handleTabKey
31947
+ ? DefaultHandleTabOptions
31948
+ : (0, tslib_1.__assign)((0, tslib_1.__assign)({}, DefaultHandleTabOptions), options.handleTabKey);
31949
+ this.options = (0, tslib_1.__assign)((0, tslib_1.__assign)((0, tslib_1.__assign)({}, DefaultOptions), options), { handleTabKey: tabOptions });
31775
31950
  }
31776
31951
  EditPlugin.prototype.createNormalEnterChecker = function (result) {
31777
31952
  return result ? function () { return true; } : function () { return false; };
@@ -31852,7 +32027,7 @@ var EditPlugin = /** @class */ (function () {
31852
32027
  */
31853
32028
  EditPlugin.prototype.willHandleEventExclusively = function (event) {
31854
32029
  if (this.editor &&
31855
- this.options.handleTabKey &&
32030
+ this.options.handleTabKey.appendTableRow &&
31856
32031
  event.eventType == 'keyDown' &&
31857
32032
  event.rawEvent.key == 'Tab' &&
31858
32033
  !event.rawEvent.shiftKey) {
@@ -31895,8 +32070,8 @@ var EditPlugin = /** @class */ (function () {
31895
32070
  }
31896
32071
  break;
31897
32072
  case 'Tab':
31898
- if (this.options.handleTabKey && !hasCtrlOrMetaKey) {
31899
- (0, keyboardTab_1.keyboardTab)(editor, rawEvent);
32073
+ if (!hasCtrlOrMetaKey) {
32074
+ (0, keyboardTab_1.keyboardTab)(editor, rawEvent, this.options.handleTabKey);
31900
32075
  }
31901
32076
  break;
31902
32077
  case 'Unidentified':
@@ -32987,29 +33162,31 @@ var roosterjs_content_model_dom_1 = __webpack_require__(/*! roosterjs-content-mo
32987
33162
  /**
32988
33163
  * @internal
32989
33164
  */
32990
- function keyboardTab(editor, rawEvent) {
33165
+ function keyboardTab(editor, rawEvent, options) {
32991
33166
  var selection = editor.getDOMSelection();
32992
33167
  switch (selection === null || selection === void 0 ? void 0 : selection.type) {
32993
33168
  case 'range':
32994
33169
  editor.formatContentModel(function (model, context) {
32995
- return handleTab(model, rawEvent, context);
33170
+ return handleTab(model, rawEvent, context, options);
32996
33171
  }, {
32997
33172
  apiName: 'handleTabKey',
32998
33173
  rawEvent: rawEvent,
32999
33174
  changeSource: roosterjs_content_model_dom_1.ChangeSource.Keyboard,
33000
33175
  getChangeData: function () { return rawEvent.which; },
33001
33176
  });
33002
- return true;
33177
+ break;
33003
33178
  case 'table':
33004
- editor.formatContentModel(function (model) {
33005
- return (0, handleTabOnTable_1.handleTabOnTable)(model, rawEvent);
33006
- }, {
33007
- apiName: 'handleTabKey',
33008
- rawEvent: rawEvent,
33009
- changeSource: roosterjs_content_model_dom_1.ChangeSource.Keyboard,
33010
- getChangeData: function () { return rawEvent.which; },
33011
- });
33012
- return true;
33179
+ if (options.indentTable) {
33180
+ editor.formatContentModel(function (model) {
33181
+ return (0, handleTabOnTable_1.handleTabOnTable)(model, rawEvent);
33182
+ }, {
33183
+ apiName: 'handleTabKey',
33184
+ rawEvent: rawEvent,
33185
+ changeSource: roosterjs_content_model_dom_1.ChangeSource.Keyboard,
33186
+ getChangeData: function () { return rawEvent.which; },
33187
+ });
33188
+ }
33189
+ break;
33013
33190
  }
33014
33191
  }
33015
33192
  exports.keyboardTab = keyboardTab;
@@ -33020,22 +33197,30 @@ exports.keyboardTab = keyboardTab;
33020
33197
  * - If it is a paragraph, call handleTabOnParagraph to handle the tab key.
33021
33198
  * - If it is a list item, call handleTabOnList to handle the tab key.
33022
33199
  */
33023
- function handleTab(model, rawEvent, context) {
33200
+ function handleTab(model, rawEvent, context, options) {
33024
33201
  var blocks = (0, roosterjs_content_model_dom_1.getOperationalBlocks)(model, ['ListItem', 'TableCell'], []);
33025
33202
  var block = blocks.length > 0 ? blocks[0].block : undefined;
33026
33203
  if (blocks.length > 1) {
33027
- (0, roosterjs_content_model_api_1.setModelIndentation)(model, rawEvent.shiftKey ? 'outdent' : 'indent');
33028
- rawEvent.preventDefault();
33029
- return true;
33204
+ if (options.indentMultipleBlocks) {
33205
+ (0, roosterjs_content_model_api_1.setModelIndentation)(model, rawEvent.shiftKey ? 'outdent' : 'indent');
33206
+ rawEvent.preventDefault();
33207
+ return true;
33208
+ }
33030
33209
  }
33031
33210
  else if ((0, roosterjs_content_model_dom_1.isBlockGroupOfType)(block, 'TableCell')) {
33032
- return (0, handleTabOnTableCell_1.handleTabOnTableCell)(model, block, rawEvent);
33211
+ if (options.appendTableRow) {
33212
+ return (0, handleTabOnTableCell_1.handleTabOnTableCell)(model, block, rawEvent);
33213
+ }
33033
33214
  }
33034
33215
  else if ((block === null || block === void 0 ? void 0 : block.blockType) === 'Paragraph') {
33035
- return (0, handleTabOnParagraph_1.handleTabOnParagraph)(model, block, rawEvent, context);
33216
+ if (options.indentParagraph) {
33217
+ return (0, handleTabOnParagraph_1.handleTabOnParagraph)(model, block, rawEvent, context);
33218
+ }
33036
33219
  }
33037
33220
  else if ((0, roosterjs_content_model_dom_1.isBlockGroupOfType)(block, 'ListItem')) {
33038
- return (0, handleTabOnList_1.handleTabOnList)(model, block, rawEvent, context);
33221
+ if (options.indentList) {
33222
+ return (0, handleTabOnList_1.handleTabOnList)(model, block, rawEvent, context);
33223
+ }
33039
33224
  }
33040
33225
  return false;
33041
33226
  }
@@ -34723,11 +34908,10 @@ var ImageEditPlugin = /** @class */ (function () {
34723
34908
  }
34724
34909
  }
34725
34910
  };
34726
- ImageEditPlugin.prototype.setContentHandler = function (editor) {
34727
- var selection = editor.getDOMSelection();
34728
- if ((selection === null || selection === void 0 ? void 0 : selection.type) == 'image') {
34911
+ ImageEditPlugin.prototype.setContentHandler = function () {
34912
+ if (this.selectedImage) {
34729
34913
  this.cleanInfo();
34730
- (0, roosterjs_content_model_dom_1.setImageState)(selection.image, '');
34914
+ (0, roosterjs_content_model_dom_1.setImageState)(this.selectedImage, '');
34731
34915
  this.isEditing = false;
34732
34916
  this.isCropMode = false;
34733
34917
  }
@@ -34742,7 +34926,7 @@ var ImageEditPlugin = /** @class */ (function () {
34742
34926
  ImageEditPlugin.prototype.contentChangedHandler = function (editor, event) {
34743
34927
  switch (event.source) {
34744
34928
  case roosterjs_content_model_dom_1.ChangeSource.SetContent:
34745
- this.setContentHandler(editor);
34929
+ this.setContentHandler();
34746
34930
  break;
34747
34931
  case roosterjs_content_model_dom_1.ChangeSource.Format:
34748
34932
  this.formatEventHandler(event);
@@ -36076,14 +36260,19 @@ function generateDataURL(image, editInfo) {
36076
36260
  canvas.width = targetWidth * devicePixelRatio;
36077
36261
  canvas.height = targetHeight * devicePixelRatio;
36078
36262
  var context = canvas.getContext('2d');
36079
- if (context) {
36080
- context.scale(devicePixelRatio, devicePixelRatio);
36081
- context.translate(targetWidth / 2, targetHeight / 2);
36082
- context.rotate(angle);
36083
- context.scale(editInfo.flippedHorizontal ? -1 : 1, editInfo.flippedVertical ? -1 : 1);
36084
- context.drawImage(image, nWidth * left, nHeight * top, imageWidth, imageHeight, -width / 2, -height / 2, width, height);
36263
+ try {
36264
+ if (context) {
36265
+ context.scale(devicePixelRatio, devicePixelRatio);
36266
+ context.translate(targetWidth / 2, targetHeight / 2);
36267
+ context.rotate(angle);
36268
+ context.scale(editInfo.flippedHorizontal ? -1 : 1, editInfo.flippedVertical ? -1 : 1);
36269
+ context.drawImage(image, nWidth * left, nHeight * top, imageWidth, imageHeight, -width / 2, -height / 2, width, height);
36270
+ }
36271
+ return canvas.toDataURL('image/png', 1.0);
36272
+ }
36273
+ catch (_a) {
36274
+ return image.src;
36085
36275
  }
36086
- return canvas.toDataURL('image/png', 1.0);
36087
36276
  }
36088
36277
  exports.generateDataURL = generateDataURL;
36089
36278
 
@@ -37155,8 +37344,8 @@ var blockElementParser_1 = __webpack_require__(/*! ./parsers/blockElementParser
37155
37344
  var chainSanitizerCallback_1 = __webpack_require__(/*! ./utils/chainSanitizerCallback */ "./packages/roosterjs-content-model-plugins/lib/paste/utils/chainSanitizerCallback.ts");
37156
37345
  var DefaultSanitizers_1 = __webpack_require__(/*! ./DefaultSanitizers */ "./packages/roosterjs-content-model-plugins/lib/paste/DefaultSanitizers.ts");
37157
37346
  var deprecatedColorParser_1 = __webpack_require__(/*! ./parsers/deprecatedColorParser */ "./packages/roosterjs-content-model-plugins/lib/paste/parsers/deprecatedColorParser.ts");
37347
+ var getDocumentSource_1 = __webpack_require__(/*! ./pasteSourceValidations/getDocumentSource */ "./packages/roosterjs-content-model-plugins/lib/paste/pasteSourceValidations/getDocumentSource.ts");
37158
37348
  var roosterjs_content_model_dom_1 = __webpack_require__(/*! roosterjs-content-model-dom */ "./packages/roosterjs-content-model-dom/lib/index.ts");
37159
- var getPasteSource_1 = __webpack_require__(/*! ./pasteSourceValidations/getPasteSource */ "./packages/roosterjs-content-model-plugins/lib/paste/pasteSourceValidations/getPasteSource.ts");
37160
37349
  var imageSizeParser_1 = __webpack_require__(/*! ./parsers/imageSizeParser */ "./packages/roosterjs-content-model-plugins/lib/paste/parsers/imageSizeParser.ts");
37161
37350
  var linkParser_1 = __webpack_require__(/*! ./parsers/linkParser */ "./packages/roosterjs-content-model-plugins/lib/paste/parsers/linkParser.ts");
37162
37351
  var pasteButtonProcessor_1 = __webpack_require__(/*! ./processors/pasteButtonProcessor */ "./packages/roosterjs-content-model-plugins/lib/paste/processors/pasteButtonProcessor.ts");
@@ -37228,11 +37417,19 @@ var PastePlugin = /** @class */ (function () {
37228
37417
  if (!event.domToModelOption) {
37229
37418
  return;
37230
37419
  }
37231
- var pasteSource = (0, getPasteSource_1.getPasteSource)(event, false /* shouldConvertSingleImage */, this.editor.getEnvironment());
37420
+ var htmlAttributes = event.htmlAttributes, clipboardData = event.clipboardData, fragment = event.fragment;
37421
+ var pasteSource = (0, getDocumentSource_1.getDocumentSource)({
37422
+ htmlAttributes: htmlAttributes,
37423
+ fragment: fragment,
37424
+ clipboardItemTypes: clipboardData.types,
37425
+ htmlFirstLevelChildTags: clipboardData.htmlFirstLevelChildTags,
37426
+ environment: this.editor.getEnvironment(),
37427
+ rawHtml: clipboardData.rawHtml,
37428
+ });
37232
37429
  var pasteType = event.pasteType;
37233
37430
  switch (pasteSource) {
37234
37431
  case 'wordDesktop':
37235
- (0, processPastedContentFromWordDesktop_1.processPastedContentFromWordDesktop)(event);
37432
+ (0, processPastedContentFromWordDesktop_1.processPastedContentFromWordDesktop)(event.domToModelOption, event.htmlBefore || event.clipboardData.rawHtml || '');
37236
37433
  break;
37237
37434
  case 'wacComponents':
37238
37435
  (0, processPastedContentWacComponents_1.processPastedContentWacComponents)(event);
@@ -37786,9 +37983,12 @@ function extractHtmlIndexes(html, startIndex) {
37786
37983
  * 5. Save data in record and only use the required information.
37787
37984
  *
37788
37985
  */
37789
- function getStyleMetadata(ev) {
37986
+ function getStyleMetadata(htmlString) {
37790
37987
  var metadataMap = new Map();
37791
- var headStyles = extractStyleTagsFromHtml(ev.htmlBefore || ev.clipboardData.rawHtml || '');
37988
+ if (!htmlString) {
37989
+ return metadataMap;
37990
+ }
37991
+ var headStyles = extractStyleTagsFromHtml(htmlString);
37792
37992
  headStyles.forEach(function (text) {
37793
37993
  var index = 0;
37794
37994
  var _loop_1 = function () {
@@ -37860,20 +38060,23 @@ var processWordComments_1 = __webpack_require__(/*! ./processWordComments */ "./
37860
38060
  var processWordLists_1 = __webpack_require__(/*! ./processWordLists */ "./packages/roosterjs-content-model-plugins/lib/paste/WordDesktop/processWordLists.ts");
37861
38061
  var removeNegativeTextIndentParser_1 = __webpack_require__(/*! ../parsers/removeNegativeTextIndentParser */ "./packages/roosterjs-content-model-plugins/lib/paste/parsers/removeNegativeTextIndentParser.ts");
37862
38062
  var setProcessor_1 = __webpack_require__(/*! ../utils/setProcessor */ "./packages/roosterjs-content-model-plugins/lib/paste/utils/setProcessor.ts");
38063
+ var wordContainerParser_1 = __webpack_require__(/*! ../parsers/wordContainerParser */ "./packages/roosterjs-content-model-plugins/lib/paste/parsers/wordContainerParser.ts");
37863
38064
  var wordTableParser_1 = __webpack_require__(/*! ../parsers/wordTableParser */ "./packages/roosterjs-content-model-plugins/lib/paste/parsers/wordTableParser.ts");
37864
38065
  /**
37865
38066
  * @internal
37866
- * Handles Pasted content when source is Word Desktop
37867
- * @param ev BeforePasteEvent
38067
+ * Handles pasted content when the source is Word Desktop.
38068
+ * @param domToModelOption Options for DOM to Content Model conversion
38069
+ * @param htmlString The HTML string to process
37868
38070
  */
37869
- function processPastedContentFromWordDesktop(ev) {
37870
- var metadataMap = (0, getStyleMetadata_1.getStyleMetadata)(ev);
37871
- (0, setProcessor_1.setProcessor)(ev.domToModelOption, 'element', wordDesktopElementProcessor(metadataMap));
37872
- (0, addParser_1.addParser)(ev.domToModelOption, 'block', adjustPercentileLineHeightParser_1.adjustPercentileLineHeight);
37873
- (0, addParser_1.addParser)(ev.domToModelOption, 'block', removeNegativeTextIndentParser_1.removeNegativeTextIndentParser);
37874
- (0, addParser_1.addParser)(ev.domToModelOption, 'listLevel', listLevelParser_1.listLevelParser);
37875
- (0, addParser_1.addParser)(ev.domToModelOption, 'container', wordTableParser_1.wordTableParser);
37876
- (0, addParser_1.addParser)(ev.domToModelOption, 'table', wordTableParser_1.wordTableParser);
38071
+ function processPastedContentFromWordDesktop(domToModelOption, htmlString) {
38072
+ var metadataMap = (0, getStyleMetadata_1.getStyleMetadata)(htmlString);
38073
+ (0, setProcessor_1.setProcessor)(domToModelOption, 'element', wordDesktopElementProcessor(metadataMap));
38074
+ (0, addParser_1.addParser)(domToModelOption, 'block', adjustPercentileLineHeightParser_1.adjustPercentileLineHeight);
38075
+ (0, addParser_1.addParser)(domToModelOption, 'block', removeNegativeTextIndentParser_1.removeNegativeTextIndentParser);
38076
+ (0, addParser_1.addParser)(domToModelOption, 'listItemElement', removeNegativeTextIndentParser_1.removeNegativeTextIndentParser);
38077
+ (0, addParser_1.addParser)(domToModelOption, 'listLevel', listLevelParser_1.listLevelParser);
38078
+ (0, addParser_1.addParser)(domToModelOption, 'container', wordContainerParser_1.wordContainerParser);
38079
+ (0, addParser_1.addParser)(domToModelOption, 'table', wordTableParser_1.wordTableParser);
37877
38080
  }
37878
38081
  exports.processPastedContentFromWordDesktop = processPastedContentFromWordDesktop;
37879
38082
  var wordDesktopElementProcessor = function (metadataKey) {
@@ -38466,7 +38669,7 @@ exports.removeNegativeTextIndentParser = void 0;
38466
38669
  /**
38467
38670
  * @internal
38468
38671
  */
38469
- var removeNegativeTextIndentParser = function (format) {
38672
+ var removeNegativeTextIndentParser = function (format, element) {
38470
38673
  var _a;
38471
38674
  if ((_a = format.textIndent) === null || _a === void 0 ? void 0 : _a.startsWith('-')) {
38472
38675
  delete format.textIndent;
@@ -38513,6 +38716,33 @@ var tableBorderParser = function (format, element) {
38513
38716
  exports.tableBorderParser = tableBorderParser;
38514
38717
 
38515
38718
 
38719
+ /***/ }),
38720
+
38721
+ /***/ "./packages/roosterjs-content-model-plugins/lib/paste/parsers/wordContainerParser.ts":
38722
+ /*!*******************************************************************************************!*\
38723
+ !*** ./packages/roosterjs-content-model-plugins/lib/paste/parsers/wordContainerParser.ts ***!
38724
+ \*******************************************************************************************/
38725
+ /***/ ((__unused_webpack_module, exports) => {
38726
+
38727
+ "use strict";
38728
+
38729
+ Object.defineProperty(exports, "__esModule", ({ value: true }));
38730
+ exports.wordContainerParser = void 0;
38731
+ /**
38732
+ * @internal
38733
+ * Parser for processing container formatting specific to Word Desktop
38734
+ * Removes negative margin-left values which are commonly used in Word lists
38735
+ * @param format The container format to modify
38736
+ */
38737
+ var wordContainerParser = function (format) {
38738
+ var _a;
38739
+ if ((_a = format.marginLeft) === null || _a === void 0 ? void 0 : _a.startsWith('-')) {
38740
+ delete format.marginLeft;
38741
+ }
38742
+ };
38743
+ exports.wordContainerParser = wordContainerParser;
38744
+
38745
+
38516
38746
  /***/ }),
38517
38747
 
38518
38748
  /***/ "./packages/roosterjs-content-model-plugins/lib/paste/parsers/wordTableParser.ts":
@@ -38602,16 +38832,16 @@ exports.documentContainWacElements = documentContainWacElements;
38602
38832
 
38603
38833
  /***/ }),
38604
38834
 
38605
- /***/ "./packages/roosterjs-content-model-plugins/lib/paste/pasteSourceValidations/getPasteSource.ts":
38606
- /*!*****************************************************************************************************!*\
38607
- !*** ./packages/roosterjs-content-model-plugins/lib/paste/pasteSourceValidations/getPasteSource.ts ***!
38608
- \*****************************************************************************************************/
38835
+ /***/ "./packages/roosterjs-content-model-plugins/lib/paste/pasteSourceValidations/getDocumentSource.ts":
38836
+ /*!********************************************************************************************************!*\
38837
+ !*** ./packages/roosterjs-content-model-plugins/lib/paste/pasteSourceValidations/getDocumentSource.ts ***!
38838
+ \********************************************************************************************************/
38609
38839
  /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
38610
38840
 
38611
38841
  "use strict";
38612
38842
 
38613
38843
  Object.defineProperty(exports, "__esModule", ({ value: true }));
38614
- exports.getPasteSource = void 0;
38844
+ exports.getDocumentSource = void 0;
38615
38845
  var documentContainWacElements_1 = __webpack_require__(/*! ./documentContainWacElements */ "./packages/roosterjs-content-model-plugins/lib/paste/pasteSourceValidations/documentContainWacElements.ts");
38616
38846
  var isExcelDesktopDocument_1 = __webpack_require__(/*! ./isExcelDesktopDocument */ "./packages/roosterjs-content-model-plugins/lib/paste/pasteSourceValidations/isExcelDesktopDocument.ts");
38617
38847
  var isExcelNonNativeEvent_1 = __webpack_require__(/*! ./isExcelNonNativeEvent */ "./packages/roosterjs-content-model-plugins/lib/paste/pasteSourceValidations/isExcelNonNativeEvent.ts");
@@ -38639,16 +38869,8 @@ var getSourceFunctions = new Map([
38639
38869
  * @param shouldConvertSingleImage Whether convert single image is enabled.
38640
38870
  * @returns The Type of pasted content, if no type found will return {KnownSourceType.Default}
38641
38871
  */
38642
- function getPasteSource(event, shouldConvertSingleImage, environment) {
38643
- var htmlAttributes = event.htmlAttributes, clipboardData = event.clipboardData, fragment = event.fragment;
38872
+ function getDocumentSource(param) {
38644
38873
  var result = null;
38645
- var param = {
38646
- htmlAttributes: htmlAttributes,
38647
- fragment: fragment,
38648
- shouldConvertSingleImage: shouldConvertSingleImage,
38649
- clipboardData: clipboardData,
38650
- environment: environment,
38651
- };
38652
38874
  getSourceFunctions.forEach(function (func, key) {
38653
38875
  if (!result && func(param)) {
38654
38876
  result = key;
@@ -38656,7 +38878,7 @@ function getPasteSource(event, shouldConvertSingleImage, environment) {
38656
38878
  });
38657
38879
  return result !== null && result !== void 0 ? result : 'default';
38658
38880
  }
38659
- exports.getPasteSource = getPasteSource;
38881
+ exports.getDocumentSource = getDocumentSource;
38660
38882
 
38661
38883
 
38662
38884
  /***/ }),
@@ -38706,11 +38928,11 @@ var ShadowWorkbookClipboardType = 'web data/shadow-workbook';
38706
38928
  * attributes we use to determine if the content is from Excel. This function is used to handle that case.
38707
38929
  */
38708
38930
  var isExcelNotNativeEvent = function (props) {
38709
- var _a;
38710
- var clipboardData = props.clipboardData;
38711
- return (clipboardData.types.includes(ShadowWorkbookClipboardType) &&
38712
- ((_a = clipboardData.htmlFirstLevelChildTags) === null || _a === void 0 ? void 0 : _a.length) == 1 &&
38713
- clipboardData.htmlFirstLevelChildTags[0] == 'TABLE');
38931
+ var clipboardItemTypes = props.clipboardItemTypes, htmlFirstLevelChildTags = props.htmlFirstLevelChildTags;
38932
+ return !!(clipboardItemTypes &&
38933
+ clipboardItemTypes.includes(ShadowWorkbookClipboardType) &&
38934
+ (htmlFirstLevelChildTags === null || htmlFirstLevelChildTags === void 0 ? void 0 : htmlFirstLevelChildTags.length) == 1 &&
38935
+ htmlFirstLevelChildTags[0] == 'TABLE');
38714
38936
  };
38715
38937
  exports.isExcelNotNativeEvent = isExcelNotNativeEvent;
38716
38938
 
@@ -38848,14 +39070,14 @@ var WORD_PROG_ID = 'Word.Document';
38848
39070
  * @returns
38849
39071
  */
38850
39072
  var isWordDesktopDocument = function (props) {
38851
- var _a;
38852
- var htmlAttributes = props.htmlAttributes, clipboardData = props.clipboardData, environment = props.environment;
39073
+ var htmlAttributes = props.htmlAttributes, rawHtml = props.rawHtml, environment = props.environment;
38853
39074
  return (htmlAttributes[WORD_ATTRIBUTE_NAME] == WORD_ATTRIBUTE_VALUE ||
38854
39075
  htmlAttributes[constants_1.PastePropertyNames.PROG_ID_NAME] == WORD_PROG_ID ||
38855
39076
  // Safari removes the metadata from the clipboard html, so we need to do this check.
38856
39077
  !!(environment.isSafari &&
38857
- clipboardData.rawHtml &&
38858
- ((_a = clipboardData.rawHtml) === null || _a === void 0 ? void 0 : _a.replace(/ /g, '').indexOf(WORD_ATTRIBUTE_NAME + "=\"" + WORD_ATTRIBUTE_VALUE)) > -1));
39078
+ rawHtml &&
39079
+ (rawHtml === null || rawHtml === void 0 ? void 0 : rawHtml.replace(/ /g, '').indexOf(WORD_ATTRIBUTE_NAME + "=\"" + WORD_ATTRIBUTE_VALUE)) >
39080
+ -1));
38859
39081
  };
38860
39082
  exports.isWordDesktopDocument = isWordDesktopDocument;
38861
39083
 
@@ -38880,11 +39102,10 @@ exports.shouldConvertToSingleImage = void 0;
38880
39102
  * @returns
38881
39103
  */
38882
39104
  var shouldConvertToSingleImage = function (props) {
38883
- var _a;
38884
- var shouldConvertSingleImage = props.shouldConvertSingleImage, clipboardData = props.clipboardData;
38885
- return (shouldConvertSingleImage &&
38886
- ((_a = clipboardData.htmlFirstLevelChildTags) === null || _a === void 0 ? void 0 : _a.length) == 1 &&
38887
- clipboardData.htmlFirstLevelChildTags[0] == 'IMG');
39105
+ var shouldConvertSingleImage = props.shouldConvertSingleImage, htmlFirstLevelChildTags = props.htmlFirstLevelChildTags;
39106
+ return !!(shouldConvertSingleImage &&
39107
+ (htmlFirstLevelChildTags === null || htmlFirstLevelChildTags === void 0 ? void 0 : htmlFirstLevelChildTags.length) == 1 &&
39108
+ htmlFirstLevelChildTags[0] == 'IMG');
38888
39109
  };
38889
39110
  exports.shouldConvertToSingleImage = shouldConvertToSingleImage;
38890
39111