roosterjs 9.3.1 → 9.4.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
@@ -2446,7 +2446,7 @@ function setModelIndentation(model, indentation, length, context) {
2446
2446
  var currentParent = parent;
2447
2447
  while (currentParent && modifiedBlocks.indexOf(currentBlock) < 0) {
2448
2448
  var index = path.indexOf(currentParent);
2449
- var format = currentBlock.format;
2449
+ var format = (0, roosterjs_content_model_dom_1.mutateBlock)(currentBlock).format;
2450
2450
  var newValue = calculateMarginValue(format, isIndent, length);
2451
2451
  if (newValue !== null) {
2452
2452
  var isRtl = format.direction == 'rtl';
@@ -2894,7 +2894,7 @@ function insertEntityModel(model, entityModel, position, isBlock, focusAfterEnti
2894
2894
  var pathIndex = position == 'root'
2895
2895
  ? (0, roosterjs_content_model_dom_1.getClosestAncestorBlockGroupIndex)(path, ['TableCell', 'Document'])
2896
2896
  : 0;
2897
- blockParent = path[pathIndex];
2897
+ blockParent = (0, roosterjs_content_model_dom_1.mutateBlock)(path[pathIndex]);
2898
2898
  var child = path[pathIndex - 1];
2899
2899
  var directChild = (child === null || child === void 0 ? void 0 : child.blockGroupType) == 'FormatContainer' ||
2900
2900
  (child === null || child === void 0 ? void 0 : child.blockGroupType) == 'General' ||
@@ -2912,7 +2912,7 @@ function insertEntityModel(model, entityModel, position, isBlock, focusAfterEnti
2912
2912
  var nextBlock = blockParent.blocks[blockIndex];
2913
2913
  blocksToInsert.push(entityModel);
2914
2914
  if ((nextBlock === null || nextBlock === void 0 ? void 0 : nextBlock.blockType) == 'Paragraph') {
2915
- nextParagraph = nextBlock;
2915
+ nextParagraph = (0, roosterjs_content_model_dom_1.mutateBlock)(nextBlock);
2916
2916
  }
2917
2917
  else if (!nextBlock || nextBlock.blockType == 'Entity' || focusAfterEntity) {
2918
2918
  nextParagraph = (0, roosterjs_content_model_dom_1.createParagraph)(false /*isImplicit*/, {}, model.format);
@@ -3134,11 +3134,6 @@ exports.matchLink = matchLink;
3134
3134
 
3135
3135
  Object.defineProperty(exports, "__esModule", ({ value: true }));
3136
3136
  exports.findListItemsInSameThread = void 0;
3137
- /**
3138
- * @param model The content model
3139
- * @param currentItem The current list item
3140
- * Search for all list items in the same thread as the current list item
3141
- */
3142
3137
  function findListItemsInSameThread(group, currentItem) {
3143
3138
  var items = [];
3144
3139
  findListItems(group, items);
@@ -3280,7 +3275,7 @@ function getListAnnounceData(path) {
3280
3275
  }
3281
3276
  else if (level.listType == 'OL') {
3282
3277
  var listNumber = getListNumber(path, listItem);
3283
- var metadata = (0, roosterjs_content_model_dom_1.updateListMetadata)(level);
3278
+ var metadata = (0, roosterjs_content_model_dom_1.getListMetadata)(level);
3284
3279
  var listStyle = (0, roosterjs_content_model_dom_1.getAutoListStyleType)('OL', metadata !== null && metadata !== void 0 ? metadata : {}, listItem.levels.length - 1, level.format.listStyleType);
3285
3280
  return listStyle === undefined
3286
3281
  ? null
@@ -5024,7 +5019,7 @@ function changeImage(editor, file) {
5024
5019
  if (dataUrl && !editor.isDisposed() && (selection === null || selection === void 0 ? void 0 : selection.type) === 'image') {
5025
5020
  (0, formatImageWithContentModel_1.formatImageWithContentModel)(editor, 'changeImage', function (image) {
5026
5021
  var _a, _b;
5027
- var originalSrc = (_b = (_a = (0, roosterjs_content_model_dom_1.updateImageMetadata)(image)) === null || _a === void 0 ? void 0 : _a.src) !== null && _b !== void 0 ? _b : '';
5022
+ var originalSrc = (_b = (_a = (0, roosterjs_content_model_dom_1.getImageMetadata)(image)) === null || _a === void 0 ? void 0 : _a.src) !== null && _b !== void 0 ? _b : '';
5028
5023
  var previousSrc = image.src;
5029
5024
  image.src = dataUrl;
5030
5025
  image.dataset = {};
@@ -6296,6 +6291,11 @@ function applyTableBorderFormat(editor, border, operation) {
6296
6291
  //Format perimeter if necessary or possible
6297
6292
  modifyPerimeter(tableModel, sel, borderFormat, perimeter, isRtl);
6298
6293
  }
6294
+ var tableMeta = (0, roosterjs_content_model_dom_1.hasMetadata)(tableModel) ? (0, roosterjs_content_model_dom_1.getTableMetadata)(tableModel) : {};
6295
+ if (tableMeta) {
6296
+ // Enforce first column format if necessary
6297
+ (0, roosterjs_content_model_dom_1.setFirstColumnFormatBorders)(tableModel.rows, tableMeta);
6298
+ }
6299
6299
  return true;
6300
6300
  }
6301
6301
  else {
@@ -6602,7 +6602,6 @@ function setTableCellShade(editor, color) {
6602
6602
  editor.formatContentModel(function (model) {
6603
6603
  var _a = (0, tslib_1.__read)((0, roosterjs_content_model_dom_1.getFirstSelectedTable)(model), 1), table = _a[0];
6604
6604
  if (table) {
6605
- (0, roosterjs_content_model_dom_1.normalizeTable)(table);
6606
6605
  table.rows.forEach(function (row) {
6607
6606
  return row.cells.forEach(function (cell) {
6608
6607
  if ((0, roosterjs_content_model_dom_1.hasSelectionInBlockGroup)(cell)) {
@@ -9293,8 +9292,6 @@ var HIDE_CURSOR_CSS_KEY = '_DOMSelectionHideCursor';
9293
9292
  var HIDE_SELECTION_CSS_KEY = '_DOMSelectionHideSelection';
9294
9293
  var IMAGE_ID = 'image';
9295
9294
  var TABLE_ID = 'table';
9296
- var DEFAULT_SELECTION_BORDER_COLOR = '#DB626C';
9297
- var TABLE_CSS_RULE = 'background-color:#C6C6C6!important;';
9298
9295
  var CARET_CSS_RULE = 'caret-color: transparent';
9299
9296
  var TRANSPARENT_SELECTION_CSS_RULE = 'background-color: transparent !important;';
9300
9297
  var SELECTION_SELECTOR = '*::selection';
@@ -9307,6 +9304,7 @@ var setDOMSelection = function (core, selection, skipSelectionChangedEvent) {
9307
9304
  // Set skipReselectOnFocus to skip this behavior
9308
9305
  var skipReselectOnFocus = core.selection.skipReselectOnFocus;
9309
9306
  var doc = core.physicalRoot.ownerDocument;
9307
+ var isDarkMode = core.lifecycle.isDarkMode;
9310
9308
  core.selection.skipReselectOnFocus = true;
9311
9309
  core.api.setEditorStyle(core, DOM_SELECTION_CSS_KEY, null /*cssRule*/);
9312
9310
  core.api.setEditorStyle(core, HIDE_CURSOR_CSS_KEY, null /*cssRule*/);
@@ -9319,7 +9317,10 @@ var setDOMSelection = function (core, selection, skipSelectionChangedEvent) {
9319
9317
  type: 'image',
9320
9318
  image: image,
9321
9319
  };
9322
- core.api.setEditorStyle(core, DOM_SELECTION_CSS_KEY, "outline-style:auto!important; outline-color:" + (core.selection.imageSelectionBorderColor || DEFAULT_SELECTION_BORDER_COLOR) + "!important;", ["span:has(>img#" + (0, ensureUniqueId_1.ensureUniqueId)(image, IMAGE_ID) + ")"]);
9320
+ var imageSelectionColor = isDarkMode
9321
+ ? core.selection.imageSelectionBorderColorDark
9322
+ : core.selection.imageSelectionBorderColor;
9323
+ core.api.setEditorStyle(core, DOM_SELECTION_CSS_KEY, "outline-style:auto!important; outline-color:" + imageSelectionColor + "!important;", ["span:has(>img#" + (0, ensureUniqueId_1.ensureUniqueId)(image, IMAGE_ID) + ")"]);
9323
9324
  core.api.setEditorStyle(core, HIDE_SELECTION_CSS_KEY, TRANSPARENT_SELECTION_CSS_RULE, [SELECTION_SELECTOR]);
9324
9325
  setRangeSelection(doc, image, false /* collapse */);
9325
9326
  break;
@@ -9359,7 +9360,10 @@ var setDOMSelection = function (core, selection, skipSelectionChangedEvent) {
9359
9360
  ? ["#" + tableId, "#" + tableId + " *"]
9360
9361
  : handleTableSelected(parsedTable, tableId, table, firstCell, lastCell);
9361
9362
  core.selection.selection = selection;
9362
- core.api.setEditorStyle(core, DOM_SELECTION_CSS_KEY, TABLE_CSS_RULE, tableSelectors);
9363
+ var tableSelectionColor = isDarkMode
9364
+ ? core.selection.tableCellSelectionBackgroundColorDark
9365
+ : core.selection.tableCellSelectionBackgroundColor;
9366
+ core.api.setEditorStyle(core, DOM_SELECTION_CSS_KEY, "background-color:" + tableSelectionColor + "!important;", tableSelectors);
9363
9367
  core.api.setEditorStyle(core, HIDE_CURSOR_CSS_KEY, CARET_CSS_RULE);
9364
9368
  var nodeToSelect = ((_c = firstCell.cell) === null || _c === void 0 ? void 0 : _c.firstElementChild) || firstCell.cell;
9365
9369
  if (nodeToSelect) {
@@ -10667,7 +10671,7 @@ var deleteEmptyList = function (context) {
10667
10671
  (!previousBlock || (0, roosterjs_content_model_dom_1.hasSelectionInBlock)(previousBlock)) &&
10668
10672
  nextBlock &&
10669
10673
  isEmptyBlock(nextBlock)) {
10670
- item.levels = [];
10674
+ (0, roosterjs_content_model_dom_1.mutateBlock)(item).levels = [];
10671
10675
  }
10672
10676
  }
10673
10677
  }
@@ -12104,7 +12108,7 @@ exports.createLifecyclePlugin = createLifecyclePlugin;
12104
12108
  "use strict";
12105
12109
 
12106
12110
  Object.defineProperty(exports, "__esModule", ({ value: true }));
12107
- exports.createSelectionPlugin = void 0;
12111
+ exports.createSelectionPlugin = exports.DEFAULT_TABLE_CELL_SELECTION_BACKGROUND_COLOR = exports.DEFAULT_SELECTION_BORDER_COLOR = void 0;
12108
12112
  var findCoordinate_1 = __webpack_require__(/*! ./findCoordinate */ "./packages/roosterjs-content-model-core/lib/corePlugin/selection/findCoordinate.ts");
12109
12113
  var findTableCellElement_1 = __webpack_require__(/*! ../../coreApi/setDOMSelection/findTableCellElement */ "./packages/roosterjs-content-model-core/lib/coreApi/setDOMSelection/findTableCellElement.ts");
12110
12114
  var isSingleImageInSelection_1 = __webpack_require__(/*! ./isSingleImageInSelection */ "./packages/roosterjs-content-model-core/lib/corePlugin/selection/isSingleImageInSelection.ts");
@@ -12118,9 +12122,18 @@ var Down = 'ArrowDown';
12118
12122
  var Left = 'ArrowLeft';
12119
12123
  var Right = 'ArrowRight';
12120
12124
  var Tab = 'Tab';
12125
+ /**
12126
+ * @internal
12127
+ */
12128
+ exports.DEFAULT_SELECTION_BORDER_COLOR = '#DB626C';
12129
+ /**
12130
+ * @internal
12131
+ */
12132
+ exports.DEFAULT_TABLE_CELL_SELECTION_BACKGROUND_COLOR = '#C6C6C6';
12121
12133
  var SelectionPlugin = /** @class */ (function () {
12122
12134
  function SelectionPlugin(options) {
12123
12135
  var _this = this;
12136
+ var _a, _b;
12124
12137
  this.editor = null;
12125
12138
  this.disposer = null;
12126
12139
  this.isSafari = false;
@@ -12241,7 +12254,14 @@ var SelectionPlugin = /** @class */ (function () {
12241
12254
  this.state = {
12242
12255
  selection: null,
12243
12256
  tableSelection: null,
12244
- imageSelectionBorderColor: options.imageSelectionBorderColor,
12257
+ imageSelectionBorderColor: (_a = options.imageSelectionBorderColor) !== null && _a !== void 0 ? _a : exports.DEFAULT_SELECTION_BORDER_COLOR,
12258
+ imageSelectionBorderColorDark: options.imageSelectionBorderColor
12259
+ ? undefined
12260
+ : exports.DEFAULT_SELECTION_BORDER_COLOR,
12261
+ tableCellSelectionBackgroundColor: (_b = options.tableCellSelectionBackgroundColor) !== null && _b !== void 0 ? _b : exports.DEFAULT_TABLE_CELL_SELECTION_BACKGROUND_COLOR,
12262
+ tableCellSelectionBackgroundColorDark: options.tableCellSelectionBackgroundColor
12263
+ ? undefined
12264
+ : exports.DEFAULT_TABLE_CELL_SELECTION_BACKGROUND_COLOR,
12245
12265
  };
12246
12266
  }
12247
12267
  SelectionPlugin.prototype.getName = function () {
@@ -12249,6 +12269,17 @@ var SelectionPlugin = /** @class */ (function () {
12249
12269
  };
12250
12270
  SelectionPlugin.prototype.initialize = function (editor) {
12251
12271
  this.editor = editor;
12272
+ if (!this.state.imageSelectionBorderColorDark && this.state.imageSelectionBorderColor) {
12273
+ this.state.imageSelectionBorderColorDark = editor
12274
+ .getColorManager()
12275
+ .getDarkColor(this.state.imageSelectionBorderColor, undefined, 'border');
12276
+ }
12277
+ if (!this.state.tableCellSelectionBackgroundColorDark &&
12278
+ this.state.tableCellSelectionBackgroundColor) {
12279
+ this.state.tableCellSelectionBackgroundColorDark = editor
12280
+ .getColorManager()
12281
+ .getDarkColor(this.state.tableCellSelectionBackgroundColor, undefined, 'background');
12282
+ }
12252
12283
  var env = this.editor.getEnvironment();
12253
12284
  var document = this.editor.getDocument();
12254
12285
  this.isSafari = !!env.isSafari;
@@ -12555,6 +12586,7 @@ var SelectionPlugin = /** @class */ (function () {
12555
12586
  var parsedTable;
12556
12587
  var firstCo;
12557
12588
  if ((table = domHelper.findClosestElementAncestor(tableStart, 'table')) &&
12589
+ table.isContentEditable &&
12558
12590
  (parsedTable = (0, roosterjs_content_model_dom_1.parseTableCells)(table)) &&
12559
12591
  (firstCo = (0, findCoordinate_1.findCoordinate)(parsedTable, tdStart, domHelper))) {
12560
12592
  return { table: table, parsedTable: parsedTable, firstCo: firstCo, startNode: tdStart };
@@ -19583,9 +19615,9 @@ exports.shouldSetValue = shouldSetValue;
19583
19615
  "use strict";
19584
19616
 
19585
19617
  Object.defineProperty(exports, "__esModule", ({ value: true }));
19586
- exports.createListLevel = exports.createDivider = exports.createEntity = exports.createGeneralBlock = exports.createGeneralSegment = exports.createParagraphDecorator = exports.createContentModelDocument = exports.createImage = exports.createText = exports.createTableCell = exports.createTable = exports.createSelectionMarker = exports.createParagraph = exports.createFormatContainer = exports.createListItem = exports.createBr = 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.wrap = exports.wrapAllChildNodes = exports.moveChildNodes = exports.toArray = exports.getObjectKeys = exports.isElementOfType = exports.isNodeOfType = exports.hasMetadata = 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;
19587
- exports.getSelectedSegments = exports.getSelectedParagraphs = exports.getOperationalBlocks = exports.getFirstSelectedTable = exports.getFirstSelectedListItem = exports.iterateSelections = exports.getClosestAncestorBlockGroupIndex = exports.isBlockGroupOfType = exports.cacheGetEventData = exports.extractClipboardItems = exports.transformColor = exports.readFile = exports.parseTableCells = exports.normalizeText = exports.isSpace = exports.isPunctuation = exports.extractBorderValues = exports.combineBorderValue = exports.isCursorMovingKey = exports.isModifierKey = exports.isCharacterValue = exports.getSelectionRootNode = exports.isBold = exports.createModelToDomConfig = exports.createModelToDomContextWithConfig = exports.createModelToDomContext = exports.createDomToModelConfig = exports.createDomToModelContextWithConfig = exports.createDomToModelContext = exports.parseColor = exports.setColor = exports.getColor = exports.DeprecatedColors = exports.BorderKeys = exports.parseValueWithUnit = exports.getAutoListStyleType = exports.getOrderedListNumberStr = exports.setParagraphNotImplicit = exports.normalizeSingleSegment = exports.isEmpty = exports.addSegment = exports.unwrapBlock = exports.isGeneralSegment = exports.normalizeContentModel = exports.normalizeParagraph = exports.addTextSegment = exports.addLink = exports.addCode = exports.addBlock = exports.createEmptyModel = void 0;
19588
- exports.UnorderedListStyleMap = exports.OrderedListStyleMap = exports.TableBorderFormat = exports.NumberingListType = exports.BulletListType = exports.ChangeSource = exports.ListMetadataDefinition = exports.updateListMetadata = exports.updateTableMetadata = exports.updateTableCellMetadata = exports.updateImageMetadata = exports.getSegmentTextFormat = exports.getListStyleTypeFromString = exports.retrieveModelFormatState = exports.setTableCellBackgroundColor = exports.MIN_ALLOWED_TABLE_CELL_WIDTH = exports.normalizeTable = exports.applyTableFormat = exports.deleteBlock = exports.deleteSegment = exports.deleteSelection = exports.mergeModel = exports.cloneModel = exports.setSelection = exports.hasSelectionInBlockGroup = exports.hasSelectionInSegment = exports.hasSelectionInBlock = exports.getSelectedCells = exports.getSelectedSegmentsAndParagraphs = void 0;
19618
+ exports.createDivider = exports.createEntity = exports.createGeneralBlock = exports.createGeneralSegment = exports.createParagraphDecorator = exports.createContentModelDocument = exports.createImage = exports.createText = exports.createTableCell = exports.createTable = exports.createSelectionMarker = exports.createParagraph = exports.createFormatContainer = exports.createListItem = exports.createBr = 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.wrap = exports.wrapAllChildNodes = exports.moveChildNodes = exports.toArray = 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;
19619
+ exports.iterateSelections = exports.getClosestAncestorBlockGroupIndex = exports.isBlockGroupOfType = exports.cacheGetEventData = exports.extractClipboardItems = exports.transformColor = exports.readFile = exports.parseTableCells = exports.normalizeText = exports.isSpace = exports.isPunctuation = exports.extractBorderValues = exports.combineBorderValue = exports.isCursorMovingKey = exports.isModifierKey = exports.isCharacterValue = exports.getSelectionRootNode = exports.isBold = exports.createModelToDomConfig = exports.createModelToDomContextWithConfig = exports.createModelToDomContext = exports.createDomToModelConfig = exports.createDomToModelContextWithConfig = exports.createDomToModelContext = exports.parseColor = exports.setColor = exports.getColor = exports.DeprecatedColors = exports.BorderKeys = exports.parseValueWithUnit = exports.getAutoListStyleType = exports.getOrderedListNumberStr = exports.setParagraphNotImplicit = 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 = void 0;
19620
+ exports.UnorderedListStyleMap = exports.OrderedListStyleMap = exports.TableBorderFormat = exports.NumberingListType = exports.BulletListType = exports.ChangeSource = exports.ListMetadataDefinition = exports.getListMetadata = exports.updateListMetadata = exports.getTableMetadata = exports.updateTableMetadata = exports.getTableCellMetadata = exports.updateTableCellMetadata = exports.getImageMetadata = exports.updateImageMetadata = exports.getSegmentTextFormat = exports.getListStyleTypeFromString = exports.retrieveModelFormatState = exports.setTableCellBackgroundColor = 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 = void 0;
19589
19621
  var domToContentModel_1 = __webpack_require__(/*! ./domToModel/domToContentModel */ "./packages/roosterjs-content-model-dom/lib/domToModel/domToContentModel.ts");
19590
19622
  Object.defineProperty(exports, "domToContentModel", ({ enumerable: true, get: function () { return domToContentModel_1.domToContentModel; } }));
19591
19623
  var contentModelToDom_1 = __webpack_require__(/*! ./modelToDom/contentModelToDom */ "./packages/roosterjs-content-model-dom/lib/modelToDom/contentModelToDom.ts");
@@ -19612,6 +19644,7 @@ var buildSelectionMarker_1 = __webpack_require__(/*! ./domToModel/utils/buildSel
19612
19644
  Object.defineProperty(exports, "buildSelectionMarker", ({ enumerable: true, get: function () { return buildSelectionMarker_1.buildSelectionMarker; } }));
19613
19645
  var updateMetadata_1 = __webpack_require__(/*! ./modelApi/metadata/updateMetadata */ "./packages/roosterjs-content-model-dom/lib/modelApi/metadata/updateMetadata.ts");
19614
19646
  Object.defineProperty(exports, "updateMetadata", ({ enumerable: true, get: function () { return updateMetadata_1.updateMetadata; } }));
19647
+ Object.defineProperty(exports, "getMetadata", ({ enumerable: true, get: function () { return updateMetadata_1.getMetadata; } }));
19615
19648
  Object.defineProperty(exports, "hasMetadata", ({ enumerable: true, get: function () { return updateMetadata_1.hasMetadata; } }));
19616
19649
  var isNodeOfType_1 = __webpack_require__(/*! ./domUtils/isNodeOfType */ "./packages/roosterjs-content-model-dom/lib/domUtils/isNodeOfType.ts");
19617
19650
  Object.defineProperty(exports, "isNodeOfType", ({ enumerable: true, get: function () { return isNodeOfType_1.isNodeOfType; } }));
@@ -19676,6 +19709,12 @@ var createListLevel_1 = __webpack_require__(/*! ./modelApi/creators/createListLe
19676
19709
  Object.defineProperty(exports, "createListLevel", ({ enumerable: true, get: function () { return createListLevel_1.createListLevel; } }));
19677
19710
  var createEmptyModel_1 = __webpack_require__(/*! ./modelApi/creators/createEmptyModel */ "./packages/roosterjs-content-model-dom/lib/modelApi/creators/createEmptyModel.ts");
19678
19711
  Object.defineProperty(exports, "createEmptyModel", ({ enumerable: true, get: function () { return createEmptyModel_1.createEmptyModel; } }));
19712
+ var createTableRow_1 = __webpack_require__(/*! ./modelApi/creators/createTableRow */ "./packages/roosterjs-content-model-dom/lib/modelApi/creators/createTableRow.ts");
19713
+ Object.defineProperty(exports, "createTableRow", ({ enumerable: true, get: function () { return createTableRow_1.createTableRow; } }));
19714
+ var mutate_1 = __webpack_require__(/*! ./modelApi/common/mutate */ "./packages/roosterjs-content-model-dom/lib/modelApi/common/mutate.ts");
19715
+ Object.defineProperty(exports, "mutateBlock", ({ enumerable: true, get: function () { return mutate_1.mutateBlock; } }));
19716
+ Object.defineProperty(exports, "mutateSegments", ({ enumerable: true, get: function () { return mutate_1.mutateSegments; } }));
19717
+ Object.defineProperty(exports, "mutateSegment", ({ enumerable: true, get: function () { return mutate_1.mutateSegment; } }));
19679
19718
  var addBlock_1 = __webpack_require__(/*! ./modelApi/common/addBlock */ "./packages/roosterjs-content-model-dom/lib/modelApi/common/addBlock.ts");
19680
19719
  Object.defineProperty(exports, "addBlock", ({ enumerable: true, get: function () { return addBlock_1.addBlock; } }));
19681
19720
  var addDecorators_1 = __webpack_require__(/*! ./modelApi/common/addDecorators */ "./packages/roosterjs-content-model-dom/lib/modelApi/common/addDecorators.ts");
@@ -19781,6 +19820,7 @@ var deleteBlock_1 = __webpack_require__(/*! ./modelApi/editing/deleteBlock */ ".
19781
19820
  Object.defineProperty(exports, "deleteBlock", ({ enumerable: true, get: function () { return deleteBlock_1.deleteBlock; } }));
19782
19821
  var applyTableFormat_1 = __webpack_require__(/*! ./modelApi/editing/applyTableFormat */ "./packages/roosterjs-content-model-dom/lib/modelApi/editing/applyTableFormat.ts");
19783
19822
  Object.defineProperty(exports, "applyTableFormat", ({ enumerable: true, get: function () { return applyTableFormat_1.applyTableFormat; } }));
19823
+ Object.defineProperty(exports, "setFirstColumnFormatBorders", ({ enumerable: true, get: function () { return applyTableFormat_1.setFirstColumnFormatBorders; } }));
19784
19824
  var normalizeTable_1 = __webpack_require__(/*! ./modelApi/editing/normalizeTable */ "./packages/roosterjs-content-model-dom/lib/modelApi/editing/normalizeTable.ts");
19785
19825
  Object.defineProperty(exports, "normalizeTable", ({ enumerable: true, get: function () { return normalizeTable_1.normalizeTable; } }));
19786
19826
  Object.defineProperty(exports, "MIN_ALLOWED_TABLE_CELL_WIDTH", ({ enumerable: true, get: function () { return normalizeTable_1.MIN_ALLOWED_TABLE_CELL_WIDTH; } }));
@@ -19794,12 +19834,16 @@ var getSegmentTextFormat_1 = __webpack_require__(/*! ./modelApi/editing/getSegme
19794
19834
  Object.defineProperty(exports, "getSegmentTextFormat", ({ enumerable: true, get: function () { return getSegmentTextFormat_1.getSegmentTextFormat; } }));
19795
19835
  var updateImageMetadata_1 = __webpack_require__(/*! ./modelApi/metadata/updateImageMetadata */ "./packages/roosterjs-content-model-dom/lib/modelApi/metadata/updateImageMetadata.ts");
19796
19836
  Object.defineProperty(exports, "updateImageMetadata", ({ enumerable: true, get: function () { return updateImageMetadata_1.updateImageMetadata; } }));
19837
+ Object.defineProperty(exports, "getImageMetadata", ({ enumerable: true, get: function () { return updateImageMetadata_1.getImageMetadata; } }));
19797
19838
  var updateTableCellMetadata_1 = __webpack_require__(/*! ./modelApi/metadata/updateTableCellMetadata */ "./packages/roosterjs-content-model-dom/lib/modelApi/metadata/updateTableCellMetadata.ts");
19798
19839
  Object.defineProperty(exports, "updateTableCellMetadata", ({ enumerable: true, get: function () { return updateTableCellMetadata_1.updateTableCellMetadata; } }));
19840
+ Object.defineProperty(exports, "getTableCellMetadata", ({ enumerable: true, get: function () { return updateTableCellMetadata_1.getTableCellMetadata; } }));
19799
19841
  var updateTableMetadata_1 = __webpack_require__(/*! ./modelApi/metadata/updateTableMetadata */ "./packages/roosterjs-content-model-dom/lib/modelApi/metadata/updateTableMetadata.ts");
19800
19842
  Object.defineProperty(exports, "updateTableMetadata", ({ enumerable: true, get: function () { return updateTableMetadata_1.updateTableMetadata; } }));
19843
+ Object.defineProperty(exports, "getTableMetadata", ({ enumerable: true, get: function () { return updateTableMetadata_1.getTableMetadata; } }));
19801
19844
  var updateListMetadata_1 = __webpack_require__(/*! ./modelApi/metadata/updateListMetadata */ "./packages/roosterjs-content-model-dom/lib/modelApi/metadata/updateListMetadata.ts");
19802
19845
  Object.defineProperty(exports, "updateListMetadata", ({ enumerable: true, get: function () { return updateListMetadata_1.updateListMetadata; } }));
19846
+ Object.defineProperty(exports, "getListMetadata", ({ enumerable: true, get: function () { return updateListMetadata_1.getListMetadata; } }));
19803
19847
  Object.defineProperty(exports, "ListMetadataDefinition", ({ enumerable: true, get: function () { return updateListMetadata_1.ListMetadataDefinition; } }));
19804
19848
  var ChangeSource_1 = __webpack_require__(/*! ./constants/ChangeSource */ "./packages/roosterjs-content-model-dom/lib/constants/ChangeSource.ts");
19805
19849
  Object.defineProperty(exports, "ChangeSource", ({ enumerable: true, get: function () { return ChangeSource_1.ChangeSource; } }));
@@ -19821,19 +19865,20 @@ Object.defineProperty(exports, "UnorderedListStyleMap", ({ enumerable: true, get
19821
19865
  /*!********************************************************************************************!*\
19822
19866
  !*** ./packages/roosterjs-content-model-dom/lib/modelApi/block/setParagraphNotImplicit.ts ***!
19823
19867
  \********************************************************************************************/
19824
- /***/ ((__unused_webpack_module, exports) => {
19868
+ /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
19825
19869
 
19826
19870
  "use strict";
19827
19871
 
19828
19872
  Object.defineProperty(exports, "__esModule", ({ value: true }));
19829
19873
  exports.setParagraphNotImplicit = void 0;
19874
+ var mutate_1 = __webpack_require__(/*! ../common/mutate */ "./packages/roosterjs-content-model-dom/lib/modelApi/common/mutate.ts");
19830
19875
  /**
19831
19876
  * For a given block, if it is a paragraph, set it to be not-implicit
19832
19877
  * @param block The block to check
19833
19878
  */
19834
19879
  function setParagraphNotImplicit(block) {
19835
19880
  if (block.blockType == 'Paragraph' && block.isImplicit) {
19836
- block.isImplicit = false;
19881
+ (0, mutate_1.mutateBlock)(block).isImplicit = false;
19837
19882
  }
19838
19883
  }
19839
19884
  exports.setParagraphNotImplicit = setParagraphNotImplicit;
@@ -19923,13 +19968,6 @@ exports.addDecorators = addDecorators;
19923
19968
  Object.defineProperty(exports, "__esModule", ({ value: true }));
19924
19969
  exports.addSegment = void 0;
19925
19970
  var ensureParagraph_1 = __webpack_require__(/*! ./ensureParagraph */ "./packages/roosterjs-content-model-dom/lib/modelApi/common/ensureParagraph.ts");
19926
- /**
19927
- * Add a given segment into a paragraph from its parent group. If the last block of the given group is not paragraph, create a new paragraph.
19928
- * @param group The parent block group of the paragraph to add segment into
19929
- * @param newSegment The segment to add
19930
- * @param blockFormat The block format used for creating a new paragraph when need
19931
- * @returns The parent paragraph where the segment is added to
19932
- */
19933
19971
  function addSegment(group, newSegment, blockFormat, segmentFormat) {
19934
19972
  var paragraph = (0, ensureParagraph_1.ensureParagraph)(group, blockFormat, segmentFormat);
19935
19973
  var lastSegment = paragraph.segments[paragraph.segments.length - 1];
@@ -20022,16 +20060,11 @@ Object.defineProperty(exports, "__esModule", ({ value: true }));
20022
20060
  exports.ensureParagraph = void 0;
20023
20061
  var addBlock_1 = __webpack_require__(/*! ./addBlock */ "./packages/roosterjs-content-model-dom/lib/modelApi/common/addBlock.ts");
20024
20062
  var createParagraph_1 = __webpack_require__(/*! ../creators/createParagraph */ "./packages/roosterjs-content-model-dom/lib/modelApi/creators/createParagraph.ts");
20025
- /**
20026
- * @internal
20027
- * Ensure there is a Paragraph that can insert segments in a Content Model Block Group
20028
- * @param group The parent block group of the target paragraph
20029
- * @param blockFormat Format of the paragraph. This is only used if we need to create a new paragraph
20030
- */
20063
+ var mutate_1 = __webpack_require__(/*! ./mutate */ "./packages/roosterjs-content-model-dom/lib/modelApi/common/mutate.ts");
20031
20064
  function ensureParagraph(group, blockFormat, segmentFormat) {
20032
20065
  var lastBlock = group.blocks[group.blocks.length - 1];
20033
20066
  if ((lastBlock === null || lastBlock === void 0 ? void 0 : lastBlock.blockType) == 'Paragraph') {
20034
- return lastBlock;
20067
+ return (0, mutate_1.mutateBlock)(lastBlock);
20035
20068
  }
20036
20069
  else {
20037
20070
  var paragraph = (0, createParagraph_1.createParagraph)(true, blockFormat, segmentFormat);
@@ -20159,6 +20192,87 @@ function isBlockGroup(model) {
20159
20192
  }
20160
20193
 
20161
20194
 
20195
+ /***/ }),
20196
+
20197
+ /***/ "./packages/roosterjs-content-model-dom/lib/modelApi/common/mutate.ts":
20198
+ /*!****************************************************************************!*\
20199
+ !*** ./packages/roosterjs-content-model-dom/lib/modelApi/common/mutate.ts ***!
20200
+ \****************************************************************************/
20201
+ /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
20202
+
20203
+ "use strict";
20204
+
20205
+ Object.defineProperty(exports, "__esModule", ({ value: true }));
20206
+ exports.mutateSegment = exports.mutateSegments = exports.mutateBlock = void 0;
20207
+ var tslib_1 = __webpack_require__(/*! tslib */ "./node_modules/tslib/tslib.es6.mjs");
20208
+ /**
20209
+ * Convert a readonly block to mutable block, clear cached element if exist
20210
+ * @param block The block to convert from
20211
+ * @returns The same block object of its related mutable type
20212
+ */
20213
+ function mutateBlock(block) {
20214
+ if (block.cachedElement) {
20215
+ delete block.cachedElement;
20216
+ }
20217
+ if (isTable(block)) {
20218
+ block.rows.forEach(function (row) {
20219
+ delete row.cachedElement;
20220
+ });
20221
+ }
20222
+ else if (isListItem(block)) {
20223
+ block.levels.forEach(function (level) { return delete level.cachedElement; });
20224
+ }
20225
+ var result = block;
20226
+ return result;
20227
+ }
20228
+ exports.mutateBlock = mutateBlock;
20229
+ /**
20230
+ * Convert segments of a readonly paragraph to be mutable.
20231
+ * Segments that are not belong to the given paragraph will be skipped
20232
+ * @param paragraph The readonly paragraph to convert from
20233
+ * @param segments The segments to convert from
20234
+ */
20235
+ function mutateSegments(paragraph, segments) {
20236
+ var mutablePara = mutateBlock(paragraph);
20237
+ var result = [mutablePara, [], []];
20238
+ if (segments) {
20239
+ segments.forEach(function (segment) {
20240
+ var index = paragraph.segments.indexOf(segment);
20241
+ if (index >= 0) {
20242
+ result[1].push(mutablePara.segments[index]);
20243
+ result[2].push(index);
20244
+ }
20245
+ });
20246
+ }
20247
+ return result;
20248
+ }
20249
+ exports.mutateSegments = mutateSegments;
20250
+ /**
20251
+ * Convert a readonly segment to be mutable, together with its owner paragraph
20252
+ * If the segment does not belong to the given paragraph, return null for the segment
20253
+ * @param paragraph The readonly paragraph to convert from
20254
+ * @param segment The segment to convert from
20255
+ */
20256
+ function mutateSegment(paragraph, segment, callback) {
20257
+ var _a;
20258
+ var _b = (0, tslib_1.__read)(mutateSegments(paragraph, [segment]), 3), mutablePara = _b[0], mutableSegments = _b[1], indexes = _b[2];
20259
+ var mutableSegment = mutableSegments[0] == segment
20260
+ ? mutableSegments[0]
20261
+ : null;
20262
+ if (callback && mutableSegment) {
20263
+ callback(mutableSegments[0], mutablePara, indexes[0]);
20264
+ }
20265
+ return [mutablePara, mutableSegment, (_a = indexes[0]) !== null && _a !== void 0 ? _a : -1];
20266
+ }
20267
+ exports.mutateSegment = mutateSegment;
20268
+ function isTable(obj) {
20269
+ return obj.blockType == 'Table';
20270
+ }
20271
+ function isListItem(obj) {
20272
+ return obj.blockGroupType == 'ListItem';
20273
+ }
20274
+
20275
+
20162
20276
  /***/ }),
20163
20277
 
20164
20278
  /***/ "./packages/roosterjs-content-model-dom/lib/modelApi/common/normalizeContentModel.ts":
@@ -20172,6 +20286,7 @@ function isBlockGroup(model) {
20172
20286
  Object.defineProperty(exports, "__esModule", ({ value: true }));
20173
20287
  exports.normalizeContentModel = void 0;
20174
20288
  var isEmpty_1 = __webpack_require__(/*! ./isEmpty */ "./packages/roosterjs-content-model-dom/lib/modelApi/common/isEmpty.ts");
20289
+ var mutate_1 = __webpack_require__(/*! ./mutate */ "./packages/roosterjs-content-model-dom/lib/modelApi/common/mutate.ts");
20175
20290
  var normalizeParagraph_1 = __webpack_require__(/*! ./normalizeParagraph */ "./packages/roosterjs-content-model-dom/lib/modelApi/common/normalizeParagraph.ts");
20176
20291
  var unwrapBlock_1 = __webpack_require__(/*! ./unwrapBlock */ "./packages/roosterjs-content-model-dom/lib/modelApi/common/unwrapBlock.ts");
20177
20292
  /**
@@ -20210,7 +20325,7 @@ function normalizeContentModel(group) {
20210
20325
  break;
20211
20326
  }
20212
20327
  if ((0, isEmpty_1.isBlockEmpty)(block)) {
20213
- group.blocks.splice(i, 1);
20328
+ (0, mutate_1.mutateBlock)(group).blocks.splice(i, 1);
20214
20329
  }
20215
20330
  }
20216
20331
  }
@@ -20233,6 +20348,7 @@ var areSameFormats_1 = __webpack_require__(/*! ../../domToModel/utils/areSameFor
20233
20348
  var createBr_1 = __webpack_require__(/*! ../creators/createBr */ "./packages/roosterjs-content-model-dom/lib/modelApi/creators/createBr.ts");
20234
20349
  var isEmpty_1 = __webpack_require__(/*! ./isEmpty */ "./packages/roosterjs-content-model-dom/lib/modelApi/common/isEmpty.ts");
20235
20350
  var isWhiteSpacePreserved_1 = __webpack_require__(/*! ../../domUtils/isWhiteSpacePreserved */ "./packages/roosterjs-content-model-dom/lib/domUtils/isWhiteSpacePreserved.ts");
20351
+ var mutate_1 = __webpack_require__(/*! ./mutate */ "./packages/roosterjs-content-model-dom/lib/modelApi/common/mutate.ts");
20236
20352
  var normalizeSegment_1 = __webpack_require__(/*! ./normalizeSegment */ "./packages/roosterjs-content-model-dom/lib/modelApi/common/normalizeSegment.ts");
20237
20353
  /**
20238
20354
  * @param paragraph The paragraph to normalize
@@ -20245,7 +20361,7 @@ function normalizeParagraph(paragraph) {
20245
20361
  var secondLast = segments[segments.length - 2];
20246
20362
  if (last.segmentType == 'SelectionMarker' &&
20247
20363
  (!secondLast || secondLast.segmentType == 'Br')) {
20248
- segments.push((0, createBr_1.createBr)(last.format));
20364
+ (0, mutate_1.mutateBlock)(paragraph).segments.push((0, createBr_1.createBr)(last.format));
20249
20365
  }
20250
20366
  else if (segments.length > 1 && segments[segments.length - 1].segmentType == 'Br') {
20251
20367
  var noMarkerSegments = segments.filter(function (x) { return x.segmentType != 'SelectionMarker'; });
@@ -20253,7 +20369,7 @@ function normalizeParagraph(paragraph) {
20253
20369
  // But if there are more than one <BR> at the end, do not remove them.
20254
20370
  if (noMarkerSegments.length > 1 &&
20255
20371
  noMarkerSegments[noMarkerSegments.length - 2].segmentType != 'Br') {
20256
- segments.pop();
20372
+ (0, mutate_1.mutateBlock)(paragraph).segments.pop();
20257
20373
  }
20258
20374
  }
20259
20375
  }
@@ -20268,7 +20384,7 @@ exports.normalizeParagraph = normalizeParagraph;
20268
20384
  function removeEmptySegments(block) {
20269
20385
  for (var j = block.segments.length - 1; j >= 0; j--) {
20270
20386
  if ((0, isEmpty_1.isSegmentEmpty)(block.segments[j])) {
20271
- block.segments.splice(j, 1);
20387
+ (0, mutate_1.mutateBlock)(block).segments.splice(j, 1);
20272
20388
  }
20273
20389
  }
20274
20390
  }
@@ -20288,7 +20404,9 @@ function removeEmptyLinks(paragraph) {
20288
20404
  next &&
20289
20405
  !next.link &&
20290
20406
  (0, areSameFormats_1.areSameFormats)(next.format, marker.format))) {
20291
- delete marker.link;
20407
+ (0, mutate_1.mutateSegment)(paragraph, marker, function (mutableMarker) {
20408
+ delete mutableMarker.link;
20409
+ });
20292
20410
  }
20293
20411
  }
20294
20412
  }
@@ -20303,7 +20421,7 @@ function moveUpSegmentFormat(paragraph) {
20303
20421
  changed_1 = internalMoveUpSegmentFormat(segments_1, target_1, key) || changed_1;
20304
20422
  });
20305
20423
  if (changed_1) {
20306
- paragraph.segmentFormat = target_1;
20424
+ (0, mutate_1.mutateBlock)(paragraph).segmentFormat = target_1;
20307
20425
  }
20308
20426
  }
20309
20427
  }
@@ -20334,6 +20452,7 @@ function internalMoveUpSegmentFormat(segments, target, formatKey) {
20334
20452
  Object.defineProperty(exports, "__esModule", ({ value: true }));
20335
20453
  exports.normalizeSegment = exports.createNormalizeSegmentContext = exports.normalizeSingleSegment = exports.normalizeAllSegments = void 0;
20336
20454
  var hasSpacesOnly_1 = __webpack_require__(/*! ./hasSpacesOnly */ "./packages/roosterjs-content-model-dom/lib/modelApi/common/hasSpacesOnly.ts");
20455
+ var mutate_1 = __webpack_require__(/*! ./mutate */ "./packages/roosterjs-content-model-dom/lib/modelApi/common/mutate.ts");
20337
20456
  var SPACE = '\u0020';
20338
20457
  var NONE_BREAK_SPACE = '\u00A0';
20339
20458
  var LEADING_SPACE_REGEX = /^\u0020+/;
@@ -20344,10 +20463,10 @@ var TRAILING_SPACE_REGEX = /\u0020+$/;
20344
20463
  function normalizeAllSegments(paragraph) {
20345
20464
  var context = resetNormalizeSegmentContext();
20346
20465
  paragraph.segments.forEach(function (segment) {
20347
- normalizeSegment(segment, context);
20466
+ normalizeSegment(paragraph, segment, context);
20348
20467
  });
20349
- normalizeTextSegments(context.textSegments, context.lastInlineSegment);
20350
- normalizeLastTextSegment(context.lastTextSegment, context.lastInlineSegment);
20468
+ normalizeTextSegments(paragraph, context.textSegments, context.lastInlineSegment);
20469
+ normalizeLastTextSegment(paragraph, context.lastTextSegment, context.lastInlineSegment);
20351
20470
  }
20352
20471
  exports.normalizeAllSegments = normalizeAllSegments;
20353
20472
  /**
@@ -20355,11 +20474,11 @@ exports.normalizeAllSegments = normalizeAllSegments;
20355
20474
  * @param segment The segment to normalize
20356
20475
  * @param ignoreTrailingSpaces Whether we should ignore the trailing space of the text segment @default false
20357
20476
  */
20358
- function normalizeSingleSegment(segment, ignoreTrailingSpaces) {
20477
+ function normalizeSingleSegment(paragraph, segment, ignoreTrailingSpaces) {
20359
20478
  if (ignoreTrailingSpaces === void 0) { ignoreTrailingSpaces = false; }
20360
20479
  var context = resetNormalizeSegmentContext();
20361
20480
  context.ignoreTrailingSpaces = ignoreTrailingSpaces;
20362
- normalizeSegment(segment, context);
20481
+ normalizeSegment(paragraph, segment, context);
20363
20482
  }
20364
20483
  exports.normalizeSingleSegment = normalizeSingleSegment;
20365
20484
  /**
@@ -20381,11 +20500,11 @@ function resetNormalizeSegmentContext(context) {
20381
20500
  /**
20382
20501
  * @internal Export for test only
20383
20502
  */
20384
- function normalizeSegment(segment, context) {
20503
+ function normalizeSegment(paragraph, segment, context) {
20385
20504
  switch (segment.segmentType) {
20386
20505
  case 'Br':
20387
- normalizeTextSegments(context.textSegments, context.lastInlineSegment);
20388
- normalizeLastTextSegment(context.lastTextSegment, context.lastInlineSegment);
20506
+ normalizeTextSegments(paragraph, context.textSegments, context.lastInlineSegment);
20507
+ normalizeLastTextSegment(paragraph, context.lastTextSegment, context.lastInlineSegment);
20389
20508
  // Line ends, reset all states
20390
20509
  resetNormalizeSegmentContext(context);
20391
20510
  break;
@@ -20407,11 +20526,15 @@ function normalizeSegment(segment, context) {
20407
20526
  if (!(0, hasSpacesOnly_1.hasSpacesOnly)(segment.text)) {
20408
20527
  if (first == SPACE) {
20409
20528
  // 1. Multiple leading space => single &nbsp; or empty (depends on if previous segment ends with space)
20410
- segment.text = segment.text.replace(LEADING_SPACE_REGEX, context.ignoreLeadingSpaces ? '' : NONE_BREAK_SPACE);
20529
+ (0, mutate_1.mutateSegment)(paragraph, segment, function (textSegment) {
20530
+ textSegment.text = textSegment.text.replace(LEADING_SPACE_REGEX, context.ignoreLeadingSpaces ? '' : NONE_BREAK_SPACE);
20531
+ });
20411
20532
  }
20412
20533
  if (last == SPACE) {
20413
20534
  // 2. Multiple trailing space => single space
20414
- segment.text = segment.text.replace(TRAILING_SPACE_REGEX, context.ignoreTrailingSpaces ? SPACE : NONE_BREAK_SPACE);
20535
+ (0, mutate_1.mutateSegment)(paragraph, segment, function (textSegment) {
20536
+ textSegment.text = textSegment.text.replace(TRAILING_SPACE_REGEX, context.ignoreTrailingSpaces ? SPACE : NONE_BREAK_SPACE);
20537
+ });
20415
20538
  }
20416
20539
  }
20417
20540
  context.ignoreLeadingSpaces = last == SPACE;
@@ -20419,24 +20542,28 @@ function normalizeSegment(segment, context) {
20419
20542
  }
20420
20543
  }
20421
20544
  exports.normalizeSegment = normalizeSegment;
20422
- function normalizeTextSegments(segments, lastInlineSegment) {
20545
+ function normalizeTextSegments(paragraph, segments, lastInlineSegment) {
20423
20546
  segments.forEach(function (segment) {
20424
20547
  // 3. Segment ends with &nbsp; replace it with space if the previous char is not space so that next segment can wrap
20425
20548
  // Only do this for segments that is not the last one since the last space will be removed in step 4
20426
20549
  if (segment != lastInlineSegment) {
20427
- var text = segment.text;
20428
- if (text.substr(-1) == NONE_BREAK_SPACE &&
20429
- text.length > 1 &&
20430
- text.substr(-2, 1) != SPACE) {
20431
- segment.text = text.substring(0, text.length - 1) + SPACE;
20550
+ var text_1 = segment.text;
20551
+ if (text_1.substr(-1) == NONE_BREAK_SPACE &&
20552
+ text_1.length > 1 &&
20553
+ text_1.substr(-2, 1) != SPACE) {
20554
+ (0, mutate_1.mutateSegment)(paragraph, segment, function (textSegment) {
20555
+ textSegment.text = text_1.substring(0, text_1.length - 1) + SPACE;
20556
+ });
20432
20557
  }
20433
20558
  }
20434
20559
  });
20435
20560
  }
20436
- function normalizeLastTextSegment(segment, lastInlineSegment) {
20561
+ function normalizeLastTextSegment(paragraph, segment, lastInlineSegment) {
20437
20562
  if (segment && segment == lastInlineSegment && (segment === null || segment === void 0 ? void 0 : segment.text.substr(-1)) == SPACE) {
20438
20563
  // 4. last text segment of the paragraph, remove trailing space
20439
- segment.text = segment.text.replace(TRAILING_SPACE_REGEX, '');
20564
+ (0, mutate_1.mutateSegment)(paragraph, segment, function (textSegment) {
20565
+ textSegment.text = textSegment.text.replace(TRAILING_SPACE_REGEX, '');
20566
+ });
20440
20567
  }
20441
20568
  }
20442
20569
 
@@ -20454,6 +20581,7 @@ function normalizeLastTextSegment(segment, lastInlineSegment) {
20454
20581
  Object.defineProperty(exports, "__esModule", ({ value: true }));
20455
20582
  exports.unwrapBlock = void 0;
20456
20583
  var tslib_1 = __webpack_require__(/*! tslib */ "./node_modules/tslib/tslib.es6.mjs");
20584
+ var mutate_1 = __webpack_require__(/*! ./mutate */ "./packages/roosterjs-content-model-dom/lib/modelApi/common/mutate.ts");
20457
20585
  var setParagraphNotImplicit_1 = __webpack_require__(/*! ../block/setParagraphNotImplicit */ "./packages/roosterjs-content-model-dom/lib/modelApi/block/setParagraphNotImplicit.ts");
20458
20586
  /**
20459
20587
  * Unwrap a given block group, move its child blocks to be under its parent group
@@ -20462,11 +20590,13 @@ var setParagraphNotImplicit_1 = __webpack_require__(/*! ../block/setParagraphNot
20462
20590
  */
20463
20591
  function unwrapBlock(parent, groupToUnwrap) {
20464
20592
  var _a;
20465
- var _b;
20593
+ var _b, _c;
20466
20594
  var index = (_b = parent === null || parent === void 0 ? void 0 : parent.blocks.indexOf(groupToUnwrap)) !== null && _b !== void 0 ? _b : -1;
20467
20595
  if (index >= 0) {
20468
20596
  groupToUnwrap.blocks.forEach(setParagraphNotImplicit_1.setParagraphNotImplicit);
20469
- parent === null || parent === void 0 ? void 0 : (_a = parent.blocks).splice.apply(_a, (0, tslib_1.__spreadArray)([index, 1], (0, tslib_1.__read)(groupToUnwrap.blocks), false));
20597
+ if (parent) {
20598
+ (_c = (0, mutate_1.mutateBlock)(parent)) === null || _c === void 0 ? void 0 : (_a = _c.blocks).splice.apply(_a, (0, tslib_1.__spreadArray)([index, 1], (0, tslib_1.__read)(groupToUnwrap.blocks.map(mutate_1.mutateBlock)), false));
20599
+ }
20470
20600
  }
20471
20601
  }
20472
20602
  exports.unwrapBlock = unwrapBlock;
@@ -20492,7 +20622,7 @@ var tslib_1 = __webpack_require__(/*! tslib */ "./node_modules/tslib/tslib.es6.m
20492
20622
  function createBr(format) {
20493
20623
  return {
20494
20624
  segmentType: 'Br',
20495
- format: format ? (0, tslib_1.__assign)({}, format) : {},
20625
+ format: (0, tslib_1.__assign)({}, format),
20496
20626
  };
20497
20627
  }
20498
20628
  exports.createBr = createBr;
@@ -20549,7 +20679,7 @@ function createDivider(tagName, format) {
20549
20679
  return {
20550
20680
  blockType: 'Divider',
20551
20681
  tagName: tagName,
20552
- format: format ? (0, tslib_1.__assign)({}, format) : {},
20682
+ format: (0, tslib_1.__assign)({}, format),
20553
20683
  };
20554
20684
  }
20555
20685
  exports.createDivider = createDivider;
@@ -20647,7 +20777,7 @@ function createFormatContainer(tag, format) {
20647
20777
  blockGroupType: 'FormatContainer',
20648
20778
  tagName: tag,
20649
20779
  blocks: [],
20650
- format: (0, tslib_1.__assign)({}, (format || {})),
20780
+ format: (0, tslib_1.__assign)({}, format),
20651
20781
  };
20652
20782
  }
20653
20783
  exports.createFormatContainer = createFormatContainer;
@@ -20704,7 +20834,7 @@ function createGeneralSegment(element, format) {
20704
20834
  blockType: 'BlockGroup',
20705
20835
  blockGroupType: 'General',
20706
20836
  segmentType: 'General',
20707
- format: format ? (0, tslib_1.__assign)({}, format) : {},
20837
+ format: (0, tslib_1.__assign)({}, format),
20708
20838
  blocks: [],
20709
20839
  element: element,
20710
20840
  };
@@ -20734,7 +20864,7 @@ function createImage(src, format) {
20734
20864
  return {
20735
20865
  segmentType: 'Image',
20736
20866
  src: src,
20737
- format: format ? (0, tslib_1.__assign)({}, format) : {},
20867
+ format: (0, tslib_1.__assign)({}, format),
20738
20868
  dataset: {},
20739
20869
  };
20740
20870
  }
@@ -20830,7 +20960,7 @@ function createParagraph(isImplicit, blockFormat, segmentFormat, decorator) {
20830
20960
  var result = {
20831
20961
  blockType: 'Paragraph',
20832
20962
  segments: [],
20833
- format: blockFormat ? (0, tslib_1.__assign)({}, blockFormat) : {},
20963
+ format: (0, tslib_1.__assign)({}, blockFormat),
20834
20964
  };
20835
20965
  if (segmentFormat && Object.keys(segmentFormat).length > 0) {
20836
20966
  result.segmentFormat = (0, tslib_1.__assign)({}, segmentFormat);
@@ -20870,7 +21000,7 @@ var tslib_1 = __webpack_require__(/*! tslib */ "./node_modules/tslib/tslib.es6.m
20870
21000
  function createParagraphDecorator(tagName, format) {
20871
21001
  return {
20872
21002
  tagName: tagName.toLocaleLowerCase(),
20873
- format: (0, tslib_1.__assign)({}, (format || {})),
21003
+ format: (0, tslib_1.__assign)({}, format),
20874
21004
  };
20875
21005
  }
20876
21006
  exports.createParagraphDecorator = createParagraphDecorator;
@@ -20897,7 +21027,7 @@ function createSelectionMarker(format) {
20897
21027
  return {
20898
21028
  segmentType: 'SelectionMarker',
20899
21029
  isSelected: true,
20900
- format: format ? (0, tslib_1.__assign)({}, format) : {},
21030
+ format: (0, tslib_1.__assign)({}, format),
20901
21031
  };
20902
21032
  }
20903
21033
  exports.createSelectionMarker = createSelectionMarker;
@@ -20916,6 +21046,7 @@ exports.createSelectionMarker = createSelectionMarker;
20916
21046
  Object.defineProperty(exports, "__esModule", ({ value: true }));
20917
21047
  exports.createTable = void 0;
20918
21048
  var tslib_1 = __webpack_require__(/*! tslib */ "./node_modules/tslib/tslib.es6.mjs");
21049
+ var createTableRow_1 = __webpack_require__(/*! ./createTableRow */ "./packages/roosterjs-content-model-dom/lib/modelApi/creators/createTableRow.ts");
20919
21050
  /**
20920
21051
  * Create a ContentModelTable model
20921
21052
  * @param rowCount Count of rows of this table
@@ -20924,16 +21055,12 @@ var tslib_1 = __webpack_require__(/*! tslib */ "./node_modules/tslib/tslib.es6.m
20924
21055
  function createTable(rowCount, format) {
20925
21056
  var rows = [];
20926
21057
  for (var i = 0; i < rowCount; i++) {
20927
- rows.push({
20928
- height: 0,
20929
- format: {},
20930
- cells: [],
20931
- });
21058
+ rows.push((0, createTableRow_1.createTableRow)());
20932
21059
  }
20933
21060
  return {
20934
21061
  blockType: 'Table',
20935
21062
  rows: rows,
20936
- format: (0, tslib_1.__assign)({}, (format || {})),
21063
+ format: (0, tslib_1.__assign)({}, format),
20937
21064
  widths: [],
20938
21065
  dataset: {},
20939
21066
  };
@@ -20967,7 +21094,7 @@ function createTableCell(spanLeftOrColSpan, spanAboveOrRowSpan, isHeader, format
20967
21094
  return {
20968
21095
  blockGroupType: 'TableCell',
20969
21096
  blocks: [],
20970
- format: format ? (0, tslib_1.__assign)({}, format) : {},
21097
+ format: (0, tslib_1.__assign)({}, format),
20971
21098
  spanLeft: spanLeft,
20972
21099
  spanAbove: spanAbove,
20973
21100
  isHeader: !!isHeader,
@@ -20977,6 +21104,34 @@ function createTableCell(spanLeftOrColSpan, spanAboveOrRowSpan, isHeader, format
20977
21104
  exports.createTableCell = createTableCell;
20978
21105
 
20979
21106
 
21107
+ /***/ }),
21108
+
21109
+ /***/ "./packages/roosterjs-content-model-dom/lib/modelApi/creators/createTableRow.ts":
21110
+ /*!**************************************************************************************!*\
21111
+ !*** ./packages/roosterjs-content-model-dom/lib/modelApi/creators/createTableRow.ts ***!
21112
+ \**************************************************************************************/
21113
+ /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
21114
+
21115
+ "use strict";
21116
+
21117
+ Object.defineProperty(exports, "__esModule", ({ value: true }));
21118
+ exports.createTableRow = void 0;
21119
+ var tslib_1 = __webpack_require__(/*! tslib */ "./node_modules/tslib/tslib.es6.mjs");
21120
+ /**
21121
+ * Create a ContentModelTableRow model
21122
+ * @param format @optional The format of this model
21123
+ */
21124
+ function createTableRow(format, height) {
21125
+ if (height === void 0) { height = 0; }
21126
+ return {
21127
+ height: height,
21128
+ format: (0, tslib_1.__assign)({}, format),
21129
+ cells: [],
21130
+ };
21131
+ }
21132
+ exports.createTableRow = createTableRow;
21133
+
21134
+
20980
21135
  /***/ }),
20981
21136
 
20982
21137
  /***/ "./packages/roosterjs-content-model-dom/lib/modelApi/creators/createText.ts":
@@ -21002,7 +21157,7 @@ function createText(text, format, link, code) {
21002
21157
  var result = {
21003
21158
  segmentType: 'Text',
21004
21159
  text: text,
21005
- format: format ? (0, tslib_1.__assign)({}, format) : {},
21160
+ format: (0, tslib_1.__assign)({}, format),
21006
21161
  };
21007
21162
  if (link) {
21008
21163
  (0, addDecorators_1.addLink)(result, link);
@@ -21027,10 +21182,11 @@ exports.createText = createText;
21027
21182
 
21028
21183
  var _a;
21029
21184
  Object.defineProperty(exports, "__esModule", ({ value: true }));
21030
- exports.applyTableFormat = void 0;
21185
+ exports.setFirstColumnFormatBorders = exports.applyTableFormat = void 0;
21031
21186
  var tslib_1 = __webpack_require__(/*! tslib */ "./node_modules/tslib/tslib.es6.mjs");
21032
21187
  var borderFormatHandler_1 = __webpack_require__(/*! ../../formatHandlers/common/borderFormatHandler */ "./packages/roosterjs-content-model-dom/lib/formatHandlers/common/borderFormatHandler.ts");
21033
21188
  var borderValues_1 = __webpack_require__(/*! ../../domUtils/style/borderValues */ "./packages/roosterjs-content-model-dom/lib/domUtils/style/borderValues.ts");
21189
+ var mutate_1 = __webpack_require__(/*! ../common/mutate */ "./packages/roosterjs-content-model-dom/lib/modelApi/common/mutate.ts");
21034
21190
  var setTableCellBackgroundColor_1 = __webpack_require__(/*! ./setTableCellBackgroundColor */ "./packages/roosterjs-content-model-dom/lib/modelApi/editing/setTableCellBackgroundColor.ts");
21035
21191
  var TableBorderFormat_1 = __webpack_require__(/*! ../../constants/TableBorderFormat */ "./packages/roosterjs-content-model-dom/lib/constants/TableBorderFormat.ts");
21036
21192
  var updateTableCellMetadata_1 = __webpack_require__(/*! ../metadata/updateTableCellMetadata */ "./packages/roosterjs-content-model-dom/lib/modelApi/metadata/updateTableCellMetadata.ts");
@@ -21056,27 +21212,18 @@ var DEFAULT_FORMAT = {
21056
21212
  * @param keepCellShade @optional When pass true, table cells with customized shade color will not be overwritten. @default false
21057
21213
  */
21058
21214
  function applyTableFormat(table, newFormat, keepCellShade) {
21059
- var rows = table.rows;
21060
- (0, updateTableMetadata_1.updateTableMetadata)(table, function (format) {
21061
- var effectiveMetadata = (0, tslib_1.__assign)((0, tslib_1.__assign)((0, tslib_1.__assign)({}, DEFAULT_FORMAT), format), (newFormat || {}));
21215
+ var mutableTable = (0, mutate_1.mutateBlock)(table);
21216
+ var rows = mutableTable.rows;
21217
+ (0, updateTableMetadata_1.updateTableMetadata)(mutableTable, function (format) {
21218
+ var effectiveMetadata = (0, tslib_1.__assign)((0, tslib_1.__assign)((0, tslib_1.__assign)({}, DEFAULT_FORMAT), format), newFormat);
21062
21219
  var metaOverrides = updateOverrides(rows, !keepCellShade);
21063
- delete table.cachedElement;
21064
- clearCache(rows);
21065
21220
  formatCells(rows, effectiveMetadata, metaOverrides);
21066
- setFirstColumnFormat(rows, effectiveMetadata, metaOverrides);
21221
+ setFirstColumnFormatBorders(rows, effectiveMetadata);
21067
21222
  setHeaderRowFormat(rows, effectiveMetadata, metaOverrides);
21068
21223
  return effectiveMetadata;
21069
21224
  });
21070
21225
  }
21071
21226
  exports.applyTableFormat = applyTableFormat;
21072
- function clearCache(rows) {
21073
- rows.forEach(function (row) {
21074
- row.cells.forEach(function (cell) {
21075
- delete cell.cachedElement;
21076
- });
21077
- delete row.cachedElement;
21078
- });
21079
- }
21080
21227
  function updateOverrides(rows, removeCellShade) {
21081
21228
  var overrides = {
21082
21229
  bgColorOverrides: [],
@@ -21091,7 +21238,7 @@ function updateOverrides(rows, removeCellShade) {
21091
21238
  overrides.vAlignOverrides.push(vAlignOverrides);
21092
21239
  overrides.borderOverrides.push(borderOverrides);
21093
21240
  row.cells.forEach(function (cell) {
21094
- (0, updateTableCellMetadata_1.updateTableCellMetadata)(cell, function (metadata) {
21241
+ (0, updateTableCellMetadata_1.updateTableCellMetadata)((0, mutate_1.mutateBlock)(cell), function (metadata) {
21095
21242
  if (metadata && removeCellShade) {
21096
21243
  bgColorOverrides.push(false);
21097
21244
  delete metadata.bgColorOverride;
@@ -21178,10 +21325,11 @@ var BorderFormatters = (_a = {},
21178
21325
  * Apply vertical align, borders, and background color to all cells in the table
21179
21326
  */
21180
21327
  function formatCells(rows, format, metaOverrides) {
21181
- var hasBandedRows = format.hasBandedRows, hasBandedColumns = format.hasBandedColumns, bgColorOdd = format.bgColorOdd, bgColorEven = format.bgColorEven;
21328
+ var hasBandedRows = format.hasBandedRows, hasBandedColumns = format.hasBandedColumns, bgColorOdd = format.bgColorOdd, bgColorEven = format.bgColorEven, hasFirstColumn = format.hasFirstColumn;
21182
21329
  rows.forEach(function (row, rowIndex) {
21183
- row.cells.forEach(function (cell, colIndex) {
21330
+ row.cells.forEach(function (readonlyCell, colIndex) {
21184
21331
  var _a;
21332
+ var cell = (0, mutate_1.mutateBlock)(readonlyCell);
21185
21333
  // Format Borders
21186
21334
  if (!metaOverrides.borderOverrides[rowIndex][colIndex] &&
21187
21335
  typeof format.tableBorderFormat == 'number') {
@@ -21208,46 +21356,76 @@ function formatCells(rows, format, metaOverrides) {
21208
21356
  }
21209
21357
  // Format Background Color
21210
21358
  if (!metaOverrides.bgColorOverrides[rowIndex][colIndex]) {
21211
- var color = hasBandedRows || hasBandedColumns
21212
- ? (hasBandedColumns && colIndex % 2 != 0) ||
21213
- (hasBandedRows && rowIndex % 2 != 0)
21214
- ? bgColorOdd
21215
- : bgColorEven
21216
- : bgColorEven; /* bgColorEven is the default color */
21359
+ var color = void 0;
21360
+ if (hasFirstColumn && colIndex == 0 && rowIndex > 0) {
21361
+ color = null;
21362
+ }
21363
+ else {
21364
+ color =
21365
+ hasBandedRows || hasBandedColumns
21366
+ ? (hasBandedColumns && colIndex % 2 != 0) ||
21367
+ (hasBandedRows && rowIndex % 2 != 0)
21368
+ ? bgColorOdd
21369
+ : bgColorEven
21370
+ : bgColorEven; /* bgColorEven is the default color */
21371
+ }
21217
21372
  (0, setTableCellBackgroundColor_1.setTableCellBackgroundColor)(cell, color, false /*isColorOverride*/, true /*applyToSegments*/);
21218
21373
  }
21219
21374
  // Format Vertical Align
21220
21375
  if (format.verticalAlign && !metaOverrides.vAlignOverrides[rowIndex][colIndex]) {
21221
21376
  cell.format.verticalAlign = format.verticalAlign;
21222
21377
  }
21378
+ // Format Header
21379
+ cell.isHeader = false;
21223
21380
  });
21224
21381
  });
21225
21382
  }
21226
- function setFirstColumnFormat(rows, format, metaOverrides) {
21383
+ /**
21384
+ * Set the first column format borders for the table as well as header property
21385
+ * @param rows The rows of the table
21386
+ * @param format The table metadata format
21387
+ */
21388
+ function setFirstColumnFormatBorders(rows, format) {
21389
+ // Exit early hasFirstColumn is not set
21390
+ if (!format.hasFirstColumn) {
21391
+ return;
21392
+ }
21227
21393
  rows.forEach(function (row, rowIndex) {
21228
- row.cells.forEach(function (cell, cellIndex) {
21229
- if (format.hasFirstColumn && cellIndex === 0) {
21394
+ row.cells.forEach(function (readonlyCell, cellIndex) {
21395
+ var cell = (0, mutate_1.mutateBlock)(readonlyCell);
21396
+ if (cellIndex === 0) {
21230
21397
  cell.isHeader = true;
21231
- if (rowIndex !== 0 && !metaOverrides.bgColorOverrides[rowIndex][cellIndex]) {
21232
- setBorderColor(cell.format, 'borderTop');
21233
- (0, setTableCellBackgroundColor_1.setTableCellBackgroundColor)(cell, null /*color*/, false /*isColorOverride*/, true /*applyToSegments*/);
21234
- }
21235
- if (rowIndex !== rows.length - 1 && rowIndex !== 0) {
21236
- setBorderColor(cell.format, 'borderBottom');
21398
+ switch (rowIndex) {
21399
+ case 0:
21400
+ cell.isHeader = !!format.hasHeaderRow;
21401
+ break;
21402
+ case rows.length - 1:
21403
+ setBorderColor(cell.format, 'borderTop');
21404
+ break;
21405
+ case 1:
21406
+ setBorderColor(cell.format, 'borderBottom');
21407
+ break;
21408
+ default:
21409
+ setBorderColor(cell.format, 'borderTop');
21410
+ setBorderColor(cell.format, 'borderBottom');
21411
+ break;
21237
21412
  }
21238
21413
  }
21239
- else {
21240
- cell.isHeader = false;
21241
- }
21242
21414
  });
21243
21415
  });
21244
21416
  }
21417
+ exports.setFirstColumnFormatBorders = setFirstColumnFormatBorders;
21245
21418
  function setHeaderRowFormat(rows, format, metaOverrides) {
21246
21419
  var _a;
21420
+ // Exit early if hasHeaderRow is not set
21421
+ if (!format.hasHeaderRow) {
21422
+ return;
21423
+ }
21247
21424
  var rowIndex = 0;
21248
- (_a = rows[rowIndex]) === null || _a === void 0 ? void 0 : _a.cells.forEach(function (cell, cellIndex) {
21249
- cell.isHeader = format.hasHeaderRow;
21250
- if (format.hasHeaderRow && format.headerRowColor) {
21425
+ (_a = rows[rowIndex]) === null || _a === void 0 ? void 0 : _a.cells.forEach(function (readonlyCell, cellIndex) {
21426
+ var cell = (0, mutate_1.mutateBlock)(readonlyCell);
21427
+ cell.isHeader = true;
21428
+ if (format.headerRowColor) {
21251
21429
  if (!metaOverrides.bgColorOverrides[rowIndex][cellIndex]) {
21252
21430
  (0, setTableCellBackgroundColor_1.setTableCellBackgroundColor)(cell, format.headerRowColor, false /*isColorOverride*/, true /*applyToSegments*/);
21253
21431
  }
@@ -21257,6 +21435,11 @@ function setHeaderRowFormat(rows, format, metaOverrides) {
21257
21435
  }
21258
21436
  });
21259
21437
  }
21438
+ /**
21439
+ * @param format The cell format to set the border color
21440
+ * @param key The border key to set the color
21441
+ * @param value The color to set. If not given, it removes the color and sets the style to transparent
21442
+ */
21260
21443
  function setBorderColor(format, key, value) {
21261
21444
  var border = (0, borderValues_1.extractBorderValues)(format[key]);
21262
21445
  border.color = value || '';
@@ -21426,10 +21609,11 @@ function cloneFormatContainer(container, options) {
21426
21609
  return newContainer;
21427
21610
  }
21428
21611
  function cloneListItem(item, options) {
21429
- var formatHolder = item.formatHolder, levels = item.levels;
21612
+ var formatHolder = item.formatHolder, levels = item.levels, cachedElement = item.cachedElement;
21430
21613
  return Object.assign({
21431
21614
  formatHolder: cloneSelectionMarker(formatHolder),
21432
21615
  levels: levels.map(cloneListLevel),
21616
+ cachedElement: handleCachedElement(cachedElement, 'cache', options),
21433
21617
  }, cloneBlockBase(item), cloneBlockGroupBase(item, options));
21434
21618
  }
21435
21619
  function cloneListLevel(level) {
@@ -21571,6 +21755,7 @@ var deleteBlock_1 = __webpack_require__(/*! ./deleteBlock */ "./packages/rooster
21571
21755
  var deleteSegment_1 = __webpack_require__(/*! ./deleteSegment */ "./packages/roosterjs-content-model-dom/lib/modelApi/editing/deleteSegment.ts");
21572
21756
  var getSegmentTextFormat_1 = __webpack_require__(/*! ./getSegmentTextFormat */ "./packages/roosterjs-content-model-dom/lib/modelApi/editing/getSegmentTextFormat.ts");
21573
21757
  var iterateSelections_1 = __webpack_require__(/*! ../selection/iterateSelections */ "./packages/roosterjs-content-model-dom/lib/modelApi/selection/iterateSelections.ts");
21758
+ var mutate_1 = __webpack_require__(/*! ../common/mutate */ "./packages/roosterjs-content-model-dom/lib/modelApi/common/mutate.ts");
21574
21759
  var setParagraphNotImplicit_1 = __webpack_require__(/*! ../block/setParagraphNotImplicit */ "./packages/roosterjs-content-model-dom/lib/modelApi/block/setParagraphNotImplicit.ts");
21575
21760
  var DeleteSelectionIteratingOptions = {
21576
21761
  contentUnderSelectedTableCell: 'ignoreForTableOrCell',
@@ -21588,19 +21773,20 @@ function deleteExpandedSelection(model, formatContext) {
21588
21773
  insertPoint: null,
21589
21774
  formatContext: formatContext,
21590
21775
  };
21591
- (0, iterateSelections_1.iterateSelections)(model, function (path, tableContext, block, segments) {
21776
+ (0, iterateSelections_1.iterateSelections)(model, function (path, tableContext, readonlyBlock, readonlySegments) {
21592
21777
  // Set paragraph, format and index for default position where we will put cursor to.
21593
21778
  // Later we can overwrite these info when process the selections
21594
21779
  var paragraph = (0, createParagraph_1.createParagraph)(true /*implicit*/, undefined /*blockFormat*/, model.format);
21595
21780
  var markerFormat = model.format;
21596
21781
  var insertMarkerIndex = 0;
21597
- if (segments) {
21782
+ if (readonlySegments && (readonlyBlock === null || readonlyBlock === void 0 ? void 0 : readonlyBlock.blockType) == 'Paragraph') {
21783
+ var _a = (0, tslib_1.__read)((0, mutate_1.mutateSegments)(readonlyBlock, readonlySegments), 3), block_1 = _a[0], segments = _a[1], indexes = _a[2];
21598
21784
  // Delete segments inside a paragraph
21599
- if (segments[0] && (block === null || block === void 0 ? void 0 : block.blockType) == 'Paragraph') {
21785
+ if (segments[0]) {
21600
21786
  // Now that we have found a paragraph with selections, we can overwrite the default paragraph with this one
21601
21787
  // so we can put cursor here after delete
21602
- paragraph = block;
21603
- insertMarkerIndex = paragraph.segments.indexOf(segments[0]);
21788
+ paragraph = block_1;
21789
+ insertMarkerIndex = indexes[0];
21604
21790
  markerFormat = (0, getSegmentTextFormat_1.getSegmentTextFormat)(segments[0]);
21605
21791
  context.lastParagraph = paragraph;
21606
21792
  context.lastTableContext = tableContext;
@@ -21610,9 +21796,9 @@ function deleteExpandedSelection(model, formatContext) {
21610
21796
  segment.segmentType == 'SelectionMarker') {
21611
21797
  // First time we hit a selection and it is a selection marker, just mark it and not need to delete
21612
21798
  // because this is possible a collapsed selection, then it will be handled later
21613
- context.insertPoint = createInsertPoint(segment, block, path, tableContext);
21799
+ context.insertPoint = createInsertPoint(segment, block_1, path, tableContext);
21614
21800
  }
21615
- else if ((0, deleteSegment_1.deleteSegment)(block, segment, context.formatContext)) {
21801
+ else if ((0, deleteSegment_1.deleteSegment)(block_1, segment, context.formatContext)) {
21616
21802
  context.deleteResult = 'range';
21617
21803
  }
21618
21804
  });
@@ -21620,27 +21806,26 @@ function deleteExpandedSelection(model, formatContext) {
21620
21806
  // Need to make it "not implicit" so that it will always have a container element, so that when we do normalization
21621
21807
  // of this paragraph, a BR can be added if need
21622
21808
  if (context.deleteResult == 'range') {
21623
- (0, setParagraphNotImplicit_1.setParagraphNotImplicit)(block);
21809
+ (0, setParagraphNotImplicit_1.setParagraphNotImplicit)(block_1);
21624
21810
  }
21625
21811
  }
21626
21812
  }
21627
- else if (block) {
21813
+ else if (readonlyBlock) {
21628
21814
  // Delete a whole block (divider, table, ...)
21629
- var blocks = path[0].blocks;
21630
- if ((0, deleteBlock_1.deleteBlock)(blocks, block, paragraph, context.formatContext)) {
21815
+ var blocks = (0, mutate_1.mutateBlock)(path[0]).blocks;
21816
+ if ((0, deleteBlock_1.deleteBlock)(blocks, readonlyBlock, paragraph, context.formatContext)) {
21631
21817
  context.deleteResult = 'range';
21632
21818
  }
21633
21819
  }
21634
21820
  else if (tableContext) {
21635
21821
  // Delete a whole table cell
21636
21822
  var table = tableContext.table, colIndex = tableContext.colIndex, rowIndex = tableContext.rowIndex;
21637
- var row = table.rows[rowIndex];
21638
- var cell = row.cells[colIndex];
21823
+ var mutableTable = (0, mutate_1.mutateBlock)(table);
21824
+ var row = mutableTable.rows[rowIndex];
21825
+ var cell = (0, mutate_1.mutateBlock)(row.cells[colIndex]);
21639
21826
  path = (0, tslib_1.__spreadArray)([cell], (0, tslib_1.__read)(path), false);
21640
21827
  paragraph.segments.push((0, createBr_1.createBr)(model.format));
21641
21828
  cell.blocks = [paragraph];
21642
- delete cell.cachedElement;
21643
- delete row.cachedElement;
21644
21829
  context.deleteResult = 'range';
21645
21830
  }
21646
21831
  if (!context.insertPoint) {
@@ -21676,28 +21861,30 @@ function createInsertPoint(marker, paragraph, path, tableContext) {
21676
21861
 
21677
21862
  Object.defineProperty(exports, "__esModule", ({ value: true }));
21678
21863
  exports.deleteSegment = void 0;
21864
+ var tslib_1 = __webpack_require__(/*! tslib */ "./node_modules/tslib/tslib.es6.mjs");
21679
21865
  var deleteSingleChar_1 = __webpack_require__(/*! ./deleteSingleChar */ "./packages/roosterjs-content-model-dom/lib/modelApi/editing/deleteSingleChar.ts");
21680
21866
  var isWhiteSpacePreserved_1 = __webpack_require__(/*! ../../domUtils/isWhiteSpacePreserved */ "./packages/roosterjs-content-model-dom/lib/domUtils/isWhiteSpacePreserved.ts");
21867
+ var mutate_1 = __webpack_require__(/*! ../common/mutate */ "./packages/roosterjs-content-model-dom/lib/modelApi/common/mutate.ts");
21681
21868
  var normalizeSegment_1 = __webpack_require__(/*! ../common/normalizeSegment */ "./packages/roosterjs-content-model-dom/lib/modelApi/common/normalizeSegment.ts");
21682
21869
  var stringUtil_1 = __webpack_require__(/*! ../../domUtils/stringUtil */ "./packages/roosterjs-content-model-dom/lib/domUtils/stringUtil.ts");
21683
21870
  /**
21684
21871
  * Delete a content model segment from current selection
21685
- * @param paragraph Parent paragraph of the segment to delete
21686
- * @param segmentToDelete The segment to delete
21872
+ * @param readonlyParagraph Parent paragraph of the segment to delete
21873
+ * @param readonlySegmentToDelete The segment to delete
21687
21874
  * @param context @optional Context object provided by formatContentModel API
21688
21875
  * @param direction @optional Whether this is deleting forward or backward. This is only used for deleting entity.
21689
21876
  * If not specified, only selected entity will be deleted
21690
21877
  */
21691
- function deleteSegment(paragraph, segmentToDelete, context, direction) {
21878
+ function deleteSegment(readonlyParagraph, readonlySegmentToDelete, context, direction) {
21879
+ var _a = (0, tslib_1.__read)((0, mutate_1.mutateSegment)(readonlyParagraph, readonlySegmentToDelete), 3), paragraph = _a[0], segmentToDelete = _a[1], index = _a[2];
21692
21880
  var segments = paragraph.segments;
21693
- var index = segments.indexOf(segmentToDelete);
21694
21881
  var preserveWhiteSpace = (0, isWhiteSpacePreserved_1.isWhiteSpacePreserved)(paragraph.format.whiteSpace);
21695
21882
  var isForward = direction == 'forward';
21696
21883
  var isBackward = direction == 'backward';
21697
21884
  if (!preserveWhiteSpace) {
21698
- normalizePreviousSegment(segments, index);
21885
+ normalizePreviousSegment(paragraph, segments, index);
21699
21886
  }
21700
- switch (segmentToDelete.segmentType) {
21887
+ switch (segmentToDelete === null || segmentToDelete === void 0 ? void 0 : segmentToDelete.segmentType) {
21701
21888
  case 'Br':
21702
21889
  case 'Image':
21703
21890
  case 'SelectionMarker':
@@ -21745,10 +21932,12 @@ function deleteSegment(paragraph, segmentToDelete, context, direction) {
21745
21932
  else {
21746
21933
  return false;
21747
21934
  }
21935
+ default:
21936
+ return false;
21748
21937
  }
21749
21938
  }
21750
21939
  exports.deleteSegment = deleteSegment;
21751
- function normalizePreviousSegment(segments, currentIndex) {
21940
+ function normalizePreviousSegment(paragraph, segments, currentIndex) {
21752
21941
  var _a;
21753
21942
  var index = currentIndex - 1;
21754
21943
  while (((_a = segments[index]) === null || _a === void 0 ? void 0 : _a.segmentType) == 'SelectionMarker') {
@@ -21756,7 +21945,7 @@ function normalizePreviousSegment(segments, currentIndex) {
21756
21945
  }
21757
21946
  var segment = segments[index];
21758
21947
  if (segment) {
21759
- (0, normalizeSegment_1.normalizeSingleSegment)(segment);
21948
+ (0, normalizeSegment_1.normalizeSingleSegment)(paragraph, segment);
21760
21949
  }
21761
21950
  }
21762
21951
 
@@ -21775,6 +21964,7 @@ Object.defineProperty(exports, "__esModule", ({ value: true }));
21775
21964
  exports.deleteSelection = void 0;
21776
21965
  var tslib_1 = __webpack_require__(/*! tslib */ "./node_modules/tslib/tslib.es6.mjs");
21777
21966
  var deleteExpandedSelection_1 = __webpack_require__(/*! ./deleteExpandedSelection */ "./packages/roosterjs-content-model-dom/lib/modelApi/editing/deleteExpandedSelection.ts");
21967
+ var mutate_1 = __webpack_require__(/*! ../common/mutate */ "./packages/roosterjs-content-model-dom/lib/modelApi/common/mutate.ts");
21778
21968
  /**
21779
21969
  * Delete selected content from Content Model
21780
21970
  * @param model The model to delete selected content from
@@ -21807,8 +21997,9 @@ function mergeParagraphAfterDelete(context) {
21807
21997
  lastParagraph &&
21808
21998
  lastParagraph != insertPoint.paragraph &&
21809
21999
  lastTableContext == insertPoint.tableContext) {
21810
- (_a = insertPoint.paragraph.segments).push.apply(_a, (0, tslib_1.__spreadArray)([], (0, tslib_1.__read)(lastParagraph.segments), false));
21811
- lastParagraph.segments = [];
22000
+ var mutableLastParagraph = (0, mutate_1.mutateBlock)(lastParagraph);
22001
+ (_a = (0, mutate_1.mutateBlock)(insertPoint.paragraph).segments).push.apply(_a, (0, tslib_1.__spreadArray)([], (0, tslib_1.__read)(mutableLastParagraph.segments), false));
22002
+ mutableLastParagraph.segments = [];
21812
22003
  }
21813
22004
  }
21814
22005
 
@@ -21995,6 +22186,7 @@ var createTableCell_1 = __webpack_require__(/*! ../creators/createTableCell */ "
21995
22186
  var deleteSelection_1 = __webpack_require__(/*! ./deleteSelection */ "./packages/roosterjs-content-model-dom/lib/modelApi/editing/deleteSelection.ts");
21996
22187
  var getClosestAncestorBlockGroupIndex_1 = __webpack_require__(/*! ./getClosestAncestorBlockGroupIndex */ "./packages/roosterjs-content-model-dom/lib/modelApi/editing/getClosestAncestorBlockGroupIndex.ts");
21997
22188
  var getObjectKeys_1 = __webpack_require__(/*! ../..//domUtils/getObjectKeys */ "./packages/roosterjs-content-model-dom/lib/domUtils/getObjectKeys.ts");
22189
+ var mutate_1 = __webpack_require__(/*! ../common/mutate */ "./packages/roosterjs-content-model-dom/lib/modelApi/common/mutate.ts");
21998
22190
  var normalizeContentModel_1 = __webpack_require__(/*! ../common/normalizeContentModel */ "./packages/roosterjs-content-model-dom/lib/modelApi/common/normalizeContentModel.ts");
21999
22191
  var normalizeTable_1 = __webpack_require__(/*! ./normalizeTable */ "./packages/roosterjs-content-model-dom/lib/modelApi/editing/normalizeTable.ts");
22000
22192
  var HeadingTags = ['h1', 'h2', 'h3', 'h4', 'h5', 'h6'];
@@ -22103,7 +22295,8 @@ function mergeTable(markerPosition, newTable, source) {
22103
22295
  var _a, _b;
22104
22296
  var tableContext = markerPosition.tableContext, marker = markerPosition.marker;
22105
22297
  if (tableContext && source.blocks.length == 1 && source.blocks[0] == newTable) {
22106
- var table = tableContext.table, colIndex = tableContext.colIndex, rowIndex = tableContext.rowIndex;
22298
+ var readonlyTable = tableContext.table, colIndex = tableContext.colIndex, rowIndex = tableContext.rowIndex;
22299
+ var table = (0, mutate_1.mutateBlock)(readonlyTable);
22107
22300
  for (var i = 0; i < newTable.rows.length; i++) {
22108
22301
  for (var j = 0; j < newTable.rows[i].cells.length; j++) {
22109
22302
  var newCell = newTable.rows[i].cells[j];
@@ -22155,7 +22348,7 @@ function mergeList(markerPosition, newList) {
22155
22348
  var listParent = path[listItemIndex + 1]; // It is ok here when index is -1, that means there is no list and we just insert a new paragraph and use path[0] as its parent
22156
22349
  var blockIndex = listParent.blocks.indexOf(listItem || paragraph);
22157
22350
  if (blockIndex >= 0) {
22158
- listParent.blocks.splice(blockIndex, 0, newList);
22351
+ (0, mutate_1.mutateBlock)(listParent).blocks.splice(blockIndex, 0, newList);
22159
22352
  }
22160
22353
  if (listItem) {
22161
22354
  listItem === null || listItem === void 0 ? void 0 : listItem.levels.forEach(function (level, i) {
@@ -22172,7 +22365,7 @@ function splitParagraph(markerPosition, newParaFormat) {
22172
22365
  newParagraph.segments = paragraph.segments.splice(segmentIndex);
22173
22366
  }
22174
22367
  if (paraIndex >= 0) {
22175
- path[0].blocks.splice(paraIndex + 1, 0, newParagraph);
22368
+ (0, mutate_1.mutateBlock)(path[0]).blocks.splice(paraIndex + 1, 0, newParagraph);
22176
22369
  }
22177
22370
  var listItemIndex = (0, getClosestAncestorBlockGroupIndex_1.getClosestAncestorBlockGroupIndex)(path, ['ListItem'], ['FormatContainer', 'TableCell']);
22178
22371
  var listItem = path[listItemIndex];
@@ -22185,7 +22378,7 @@ function splitParagraph(markerPosition, newParaFormat) {
22185
22378
  newListItem.blocks = listItem.blocks.splice(paraIndex + 1);
22186
22379
  }
22187
22380
  if (blockIndex >= 0) {
22188
- listParent.blocks.splice(blockIndex + 1, 0, newListItem);
22381
+ (0, mutate_1.mutateBlock)(listParent).blocks.splice(blockIndex + 1, 0, newListItem);
22189
22382
  }
22190
22383
  path[listItemIndex] = newListItem;
22191
22384
  }
@@ -22199,7 +22392,7 @@ function insertBlock(markerPosition, block) {
22199
22392
  var newPara = splitParagraph(markerPosition, newParaFormat);
22200
22393
  var blockIndex = path[0].blocks.indexOf(newPara);
22201
22394
  if (blockIndex >= 0) {
22202
- path[0].blocks.splice(blockIndex, 0, block);
22395
+ (0, mutate_1.mutateBlock)(path[0]).blocks.splice(blockIndex, 0, block);
22203
22396
  }
22204
22397
  }
22205
22398
  function applyDefaultFormat(group, format, applyDefaultFormatOption) {
@@ -22209,7 +22402,7 @@ function applyDefaultFormat(group, format, applyDefaultFormatOption) {
22209
22402
  switch (block.blockType) {
22210
22403
  case 'BlockGroup':
22211
22404
  if (block.blockGroupType == 'ListItem') {
22212
- block.formatHolder.format = mergeSegmentFormat(applyDefaultFormatOption, format, block.formatHolder.format);
22405
+ (0, mutate_1.mutateBlock)(block).formatHolder.format = mergeSegmentFormat(applyDefaultFormatOption, format, block.formatHolder.format);
22213
22406
  }
22214
22407
  applyDefaultFormat(block, format, applyDefaultFormatOption);
22215
22408
  break;
@@ -22222,14 +22415,15 @@ function applyDefaultFormat(group, format, applyDefaultFormatOption) {
22222
22415
  break;
22223
22416
  case 'Paragraph':
22224
22417
  var paragraphFormat_1 = ((_a = block.decorator) === null || _a === void 0 ? void 0 : _a.format) || {};
22225
- block.segments.forEach(function (segment) {
22418
+ var paragraph = (0, mutate_1.mutateBlock)(block);
22419
+ paragraph.segments.forEach(function (segment) {
22226
22420
  if (segment.segmentType == 'General') {
22227
22421
  applyDefaultFormat(segment, format, applyDefaultFormatOption);
22228
22422
  }
22229
22423
  segment.format = mergeSegmentFormat(applyDefaultFormatOption, format, (0, tslib_1.__assign)((0, tslib_1.__assign)({}, paragraphFormat_1), segment.format));
22230
22424
  });
22231
22425
  if (applyDefaultFormatOption === 'keepSourceEmphasisFormat') {
22232
- delete block.decorator;
22426
+ delete paragraph.decorator;
22233
22427
  }
22234
22428
  break;
22235
22429
  }
@@ -22237,12 +22431,12 @@ function applyDefaultFormat(group, format, applyDefaultFormatOption) {
22237
22431
  }
22238
22432
  function mergeBlockFormat(applyDefaultFormatOption, block) {
22239
22433
  if (applyDefaultFormatOption == 'keepSourceEmphasisFormat' && block.format.backgroundColor) {
22240
- delete block.format.backgroundColor;
22434
+ delete (0, mutate_1.mutateBlock)(block).format.backgroundColor;
22241
22435
  }
22242
22436
  }
22243
- function mergeSegmentFormat(applyDefaultFormatOption, targetformat, sourceFormat) {
22437
+ function mergeSegmentFormat(applyDefaultFormatOption, targetFormat, sourceFormat) {
22244
22438
  return applyDefaultFormatOption == 'mergeAll'
22245
- ? (0, tslib_1.__assign)((0, tslib_1.__assign)({}, targetformat), sourceFormat) : (0, tslib_1.__assign)((0, tslib_1.__assign)({}, targetformat), getSemanticFormat(sourceFormat));
22439
+ ? (0, tslib_1.__assign)((0, tslib_1.__assign)({}, targetFormat), sourceFormat) : (0, tslib_1.__assign)((0, tslib_1.__assign)({}, targetFormat), getSemanticFormat(sourceFormat));
22246
22440
  }
22247
22441
  function getSemanticFormat(segmentFormat) {
22248
22442
  var result = {};
@@ -22277,6 +22471,7 @@ var addBlock_1 = __webpack_require__(/*! ../common/addBlock */ "./packages/roost
22277
22471
  var addSegment_1 = __webpack_require__(/*! ../common/addSegment */ "./packages/roosterjs-content-model-dom/lib/modelApi/common/addSegment.ts");
22278
22472
  var createBr_1 = __webpack_require__(/*! ../creators/createBr */ "./packages/roosterjs-content-model-dom/lib/modelApi/creators/createBr.ts");
22279
22473
  var createParagraph_1 = __webpack_require__(/*! ../creators/createParagraph */ "./packages/roosterjs-content-model-dom/lib/modelApi/creators/createParagraph.ts");
22474
+ var mutate_1 = __webpack_require__(/*! ../common/mutate */ "./packages/roosterjs-content-model-dom/lib/modelApi/common/mutate.ts");
22280
22475
  /**
22281
22476
  * Minimum width for a table cell
22282
22477
  */
@@ -22285,16 +22480,17 @@ var MIN_HEIGHT = 22;
22285
22480
  /**
22286
22481
  * Normalize a Content Model table, make sure:
22287
22482
  * 1. Fist cells are not spanned
22288
- * 2. Inner cells are not header
22483
+ * 2. Only first column and row can have headers
22289
22484
  * 3. All cells have content and width
22290
22485
  * 4. Table and table row have correct width/height
22291
22486
  * 5. Spanned cell has no child blocks
22292
22487
  * 6. default format is correctly applied
22293
- * @param table The table to normalize
22488
+ * @param readonlyTable The table to normalize
22294
22489
  * @param defaultSegmentFormat @optional Default segment format to apply to cell
22295
22490
  */
22296
- function normalizeTable(table, defaultSegmentFormat) {
22491
+ function normalizeTable(readonlyTable, defaultSegmentFormat) {
22297
22492
  var _a;
22493
+ var table = (0, mutate_1.mutateBlock)(readonlyTable);
22298
22494
  // Always collapse border and use border box for table in roosterjs to make layout simpler
22299
22495
  var format = table.format;
22300
22496
  if (!format.borderCollapse || !format.useBorderBox) {
@@ -22305,7 +22501,8 @@ function normalizeTable(table, defaultSegmentFormat) {
22305
22501
  // Make sure all inner cells are not header
22306
22502
  // Make sure all cells have content and width
22307
22503
  table.rows.forEach(function (row, rowIndex) {
22308
- row.cells.forEach(function (cell, colIndex) {
22504
+ row.cells.forEach(function (readonlyCell, colIndex) {
22505
+ var cell = (0, mutate_1.mutateBlock)(readonlyCell);
22309
22506
  if (cell.blocks.length == 0) {
22310
22507
  var format_1 = cell.format.textColor
22311
22508
  ? (0, tslib_1.__assign)((0, tslib_1.__assign)({}, defaultSegmentFormat), { textColor: cell.format.textColor }) : defaultSegmentFormat;
@@ -22315,7 +22512,7 @@ function normalizeTable(table, defaultSegmentFormat) {
22315
22512
  if (rowIndex == 0) {
22316
22513
  cell.spanAbove = false;
22317
22514
  }
22318
- else if (rowIndex > 0 && cell.isHeader) {
22515
+ else if (rowIndex > 0 && colIndex > 0 && cell.isHeader) {
22319
22516
  cell.isHeader = false;
22320
22517
  delete cell.cachedElement;
22321
22518
  }
@@ -22391,8 +22588,8 @@ function tryMoveBlocks(targetCell, sourceCell) {
22391
22588
  var _a;
22392
22589
  var onlyHasEmptyOrBr = sourceCell.blocks.every(function (block) { return block.blockType == 'Paragraph' && hasOnlyBrSegment(block.segments); });
22393
22590
  if (!onlyHasEmptyOrBr) {
22394
- (_a = targetCell.blocks).push.apply(_a, (0, tslib_1.__spreadArray)([], (0, tslib_1.__read)(sourceCell.blocks), false));
22395
- sourceCell.blocks = [];
22591
+ (_a = (0, mutate_1.mutateBlock)(targetCell).blocks).push.apply(_a, (0, tslib_1.__spreadArray)([], (0, tslib_1.__read)(sourceCell.blocks), false));
22592
+ (0, mutate_1.mutateBlock)(sourceCell).blocks = [];
22396
22593
  }
22397
22594
  }
22398
22595
  function hasOnlyBrSegment(segments) {
@@ -22413,12 +22610,13 @@ function hasOnlyBrSegment(segments) {
22413
22610
 
22414
22611
  Object.defineProperty(exports, "__esModule", ({ value: true }));
22415
22612
  exports.retrieveModelFormatState = void 0;
22613
+ var tslib_1 = __webpack_require__(/*! tslib */ "./node_modules/tslib/tslib.es6.mjs");
22416
22614
  var borderValues_1 = __webpack_require__(/*! ../../domUtils/style/borderValues */ "./packages/roosterjs-content-model-dom/lib/domUtils/style/borderValues.ts");
22417
22615
  var getClosestAncestorBlockGroupIndex_1 = __webpack_require__(/*! ./getClosestAncestorBlockGroupIndex */ "./packages/roosterjs-content-model-dom/lib/modelApi/editing/getClosestAncestorBlockGroupIndex.ts");
22616
+ var updateTableMetadata_1 = __webpack_require__(/*! ../metadata/updateTableMetadata */ "./packages/roosterjs-content-model-dom/lib/modelApi/metadata/updateTableMetadata.ts");
22418
22617
  var isBold_1 = __webpack_require__(/*! ../../domUtils/style/isBold */ "./packages/roosterjs-content-model-dom/lib/domUtils/style/isBold.ts");
22419
22618
  var iterateSelections_1 = __webpack_require__(/*! ../selection/iterateSelections */ "./packages/roosterjs-content-model-dom/lib/modelApi/selection/iterateSelections.ts");
22420
22619
  var parseValueWithUnit_1 = __webpack_require__(/*! ../../formatHandlers/utils/parseValueWithUnit */ "./packages/roosterjs-content-model-dom/lib/formatHandlers/utils/parseValueWithUnit.ts");
22421
- var updateTableMetadata_1 = __webpack_require__(/*! ../metadata/updateTableMetadata */ "./packages/roosterjs-content-model-dom/lib/modelApi/metadata/updateTableMetadata.ts");
22422
22620
  /**
22423
22621
  * Retrieve format state from the given Content Model
22424
22622
  * @param model The Content Model to retrieve format state from
@@ -22450,10 +22648,10 @@ function retrieveModelFormatState(model, pendingFormat, formatState) {
22450
22648
  segments === null || segments === void 0 ? void 0 : segments.forEach(function (segment) {
22451
22649
  var _a, _b, _c;
22452
22650
  if (isFirstSegment || segment.segmentType != 'SelectionMarker') {
22453
- var modelFormat = Object.assign({}, model.format);
22454
- modelFormat === null || modelFormat === void 0 ? true : delete modelFormat.italic;
22455
- modelFormat === null || modelFormat === void 0 ? true : delete modelFormat.underline;
22456
- modelFormat === null || modelFormat === void 0 ? true : delete modelFormat.fontWeight;
22651
+ var modelFormat = (0, tslib_1.__assign)({}, model.format);
22652
+ delete modelFormat.italic;
22653
+ delete modelFormat.underline;
22654
+ delete modelFormat.fontWeight;
22457
22655
  retrieveSegmentFormat(formatState, isFirst, Object.assign({}, modelFormat, block.format, (_a = block.decorator) === null || _a === void 0 ? void 0 : _a.format, segment.format, (_b = segment.code) === null || _b === void 0 ? void 0 : _b.format, (_c = segment.link) === null || _c === void 0 ? void 0 : _c.format, pendingFormat));
22458
22656
  mergeValue(formatState, 'isCodeInline', !!(segment === null || segment === void 0 ? void 0 : segment.code), isFirst);
22459
22657
  }
@@ -22544,7 +22742,7 @@ function retrieveStructureFormat(result, path, isFirst) {
22544
22742
  ((_b = path[containerIndex]) === null || _b === void 0 ? void 0 : _b.tagName) == 'blockquote', isFirst);
22545
22743
  }
22546
22744
  function retrieveTableFormat(tableContext, result) {
22547
- var tableFormat = (0, updateTableMetadata_1.updateTableMetadata)(tableContext.table);
22745
+ var tableFormat = (0, updateTableMetadata_1.getTableMetadata)(tableContext.table);
22548
22746
  result.isInTable = true;
22549
22747
  result.tableHasHeader = tableContext.table.rows.some(function (row) {
22550
22748
  return row.cells.some(function (cell) { return cell.isHeader; });
@@ -22602,6 +22800,7 @@ function px2Pt(px) {
22602
22800
  Object.defineProperty(exports, "__esModule", ({ value: true }));
22603
22801
  exports.setTableCellBackgroundColor = void 0;
22604
22802
  var tslib_1 = __webpack_require__(/*! tslib */ "./node_modules/tslib/tslib.es6.mjs");
22803
+ var mutate_1 = __webpack_require__(/*! ../common/mutate */ "./packages/roosterjs-content-model-dom/lib/modelApi/common/mutate.ts");
22605
22804
  var color_1 = __webpack_require__(/*! ../../formatHandlers/utils/color */ "./packages/roosterjs-content-model-dom/lib/formatHandlers/utils/color.ts");
22606
22805
  var updateTableCellMetadata_1 = __webpack_require__(/*! ../metadata/updateTableCellMetadata */ "./packages/roosterjs-content-model-dom/lib/modelApi/metadata/updateTableCellMetadata.ts");
22607
22806
  // Using the HSL (hue, saturation and lightness) representation for RGB color values.
@@ -22653,9 +22852,10 @@ function setTableCellBackgroundColor(cell, color, isColorOverride, applyToSegmen
22653
22852
  }
22654
22853
  exports.setTableCellBackgroundColor = setTableCellBackgroundColor;
22655
22854
  function removeAdaptiveCellColor(cell) {
22656
- cell.blocks.forEach(function (block) {
22855
+ cell.blocks.forEach(function (readonlyBlock) {
22657
22856
  var _a, _b;
22658
- if (block.blockType == 'Paragraph') {
22857
+ if (readonlyBlock.blockType == 'Paragraph') {
22858
+ var block = (0, mutate_1.mutateBlock)(readonlyBlock);
22659
22859
  if (((_a = block.segmentFormat) === null || _a === void 0 ? void 0 : _a.textColor) &&
22660
22860
  shouldRemoveColor((_b = block.segmentFormat) === null || _b === void 0 ? void 0 : _b.textColor, cell.format.backgroundColor || '')) {
22661
22861
  delete block.segmentFormat.textColor;
@@ -22671,9 +22871,10 @@ function removeAdaptiveCellColor(cell) {
22671
22871
  }
22672
22872
  function setAdaptiveCellColor(cell) {
22673
22873
  if (cell.format.textColor) {
22674
- cell.blocks.forEach(function (block) {
22874
+ cell.blocks.forEach(function (readonlyBlock) {
22675
22875
  var _a;
22676
- if (block.blockType == 'Paragraph') {
22876
+ if (readonlyBlock.blockType == 'Paragraph') {
22877
+ var block = (0, mutate_1.mutateBlock)(readonlyBlock);
22677
22878
  if (!((_a = block.segmentFormat) === null || _a === void 0 ? void 0 : _a.textColor)) {
22678
22879
  block.segmentFormat = (0, tslib_1.__assign)((0, tslib_1.__assign)({}, block.segmentFormat), { textColor: cell.format.textColor });
22679
22880
  }
@@ -23005,7 +23206,7 @@ exports.createObjectDefinition = createObjectDefinition;
23005
23206
  "use strict";
23006
23207
 
23007
23208
  Object.defineProperty(exports, "__esModule", ({ value: true }));
23008
- exports.updateImageMetadata = void 0;
23209
+ exports.updateImageMetadata = exports.getImageMetadata = void 0;
23009
23210
  var updateMetadata_1 = __webpack_require__(/*! ./updateMetadata */ "./packages/roosterjs-content-model-dom/lib/modelApi/metadata/updateMetadata.ts");
23010
23211
  var definitionCreators_1 = __webpack_require__(/*! ./definitionCreators */ "./packages/roosterjs-content-model-dom/lib/modelApi/metadata/definitionCreators.ts");
23011
23212
  var NumberDefinition = (0, definitionCreators_1.createNumberDefinition)();
@@ -23021,6 +23222,14 @@ var ImageMetadataFormatDefinition = (0, definitionCreators_1.createObjectDefinit
23021
23222
  naturalHeight: NumberDefinition,
23022
23223
  naturalWidth: NumberDefinition,
23023
23224
  });
23225
+ /**
23226
+ * Get image metadata
23227
+ * @param image The image Content Model
23228
+ */
23229
+ function getImageMetadata(image) {
23230
+ return (0, updateMetadata_1.getMetadata)(image, ImageMetadataFormatDefinition);
23231
+ }
23232
+ exports.getImageMetadata = getImageMetadata;
23024
23233
  /**
23025
23234
  * Update image metadata with a callback
23026
23235
  * @param image The image Content Model
@@ -23043,10 +23252,10 @@ exports.updateImageMetadata = updateImageMetadata;
23043
23252
  "use strict";
23044
23253
 
23045
23254
  Object.defineProperty(exports, "__esModule", ({ value: true }));
23046
- exports.updateListMetadata = exports.ListMetadataDefinition = void 0;
23255
+ exports.updateListMetadata = exports.getListMetadata = exports.ListMetadataDefinition = void 0;
23047
23256
  var BulletListType_1 = __webpack_require__(/*! ../../constants/BulletListType */ "./packages/roosterjs-content-model-dom/lib/constants/BulletListType.ts");
23048
- var NumberingListType_1 = __webpack_require__(/*! ../../constants/NumberingListType */ "./packages/roosterjs-content-model-dom/lib/constants/NumberingListType.ts");
23049
23257
  var updateMetadata_1 = __webpack_require__(/*! ./updateMetadata */ "./packages/roosterjs-content-model-dom/lib/modelApi/metadata/updateMetadata.ts");
23258
+ var NumberingListType_1 = __webpack_require__(/*! ../../constants/NumberingListType */ "./packages/roosterjs-content-model-dom/lib/constants/NumberingListType.ts");
23050
23259
  var definitionCreators_1 = __webpack_require__(/*! ./definitionCreators */ "./packages/roosterjs-content-model-dom/lib/modelApi/metadata/definitionCreators.ts");
23051
23260
  /**
23052
23261
  * Metadata definition for List
@@ -23056,6 +23265,14 @@ exports.ListMetadataDefinition = (0, definitionCreators_1.createObjectDefinition
23056
23265
  unorderedStyleType: (0, definitionCreators_1.createNumberDefinition)(true /** isOptional */, undefined /** value **/, BulletListType_1.BulletListType.Min, BulletListType_1.BulletListType.Max),
23057
23266
  applyListStyleFromLevel: (0, definitionCreators_1.createBooleanDefinition)(true /*isOptional*/),
23058
23267
  }, true /** isOptional */, true /** allowNull */);
23268
+ /**
23269
+ * Get list metadata
23270
+ * @param list The list Content Model (metadata holder)
23271
+ */
23272
+ function getListMetadata(list) {
23273
+ return (0, updateMetadata_1.getMetadata)(list, exports.ListMetadataDefinition);
23274
+ }
23275
+ exports.getListMetadata = getListMetadata;
23059
23276
  /**
23060
23277
  * Update list metadata with a callback
23061
23278
  * @param list The list Content Model (metadata holder)
@@ -23078,26 +23295,34 @@ exports.updateListMetadata = updateListMetadata;
23078
23295
  "use strict";
23079
23296
 
23080
23297
  Object.defineProperty(exports, "__esModule", ({ value: true }));
23081
- exports.hasMetadata = exports.updateMetadata = void 0;
23298
+ exports.hasMetadata = exports.updateMetadata = exports.getMetadata = void 0;
23082
23299
  var validate_1 = __webpack_require__(/*! ./validate */ "./packages/roosterjs-content-model-dom/lib/modelApi/metadata/validate.ts");
23083
23300
  var EditingInfoDatasetName = 'editingInfo';
23084
23301
  /**
23085
- * Update metadata of the given model
23086
- * @param model The model to update metadata to
23087
- * @param callback A callback function to update metadata
23088
- * @param definition @optional Metadata definition used for verify the metadata object
23089
- * @returns The metadata object if any, or null
23302
+ * Retrieve metadata from the given model.
23303
+ * @param model The Content Model to retrieve metadata from
23304
+ * @param definition Definition of this metadata type, used for validate the metadata object
23305
+ * @returns Metadata of the model, or null if it does not contain a valid metadata
23090
23306
  */
23091
- function updateMetadata(model, callback, definition) {
23307
+ function getMetadata(model, definition) {
23092
23308
  var metadataString = model.dataset[EditingInfoDatasetName];
23093
23309
  var obj = null;
23094
23310
  try {
23095
23311
  obj = JSON.parse(metadataString);
23096
23312
  }
23097
23313
  catch (_a) { }
23098
- if (definition && !(0, validate_1.validate)(obj, definition)) {
23099
- obj = null;
23100
- }
23314
+ return !definition || (0, validate_1.validate)(obj, definition) ? obj : null;
23315
+ }
23316
+ exports.getMetadata = getMetadata;
23317
+ /**
23318
+ * Update metadata of the given model
23319
+ * @param model The model to update metadata to
23320
+ * @param callback A callback function to update metadata
23321
+ * @param definition @optional Metadata definition used for verify the metadata object
23322
+ * @returns The metadata object if any, or null
23323
+ */
23324
+ function updateMetadata(model, callback, definition) {
23325
+ var obj = getMetadata(model, definition);
23101
23326
  if (callback) {
23102
23327
  obj = callback(obj);
23103
23328
  if (!obj) {
@@ -23131,7 +23356,7 @@ exports.hasMetadata = hasMetadata;
23131
23356
  "use strict";
23132
23357
 
23133
23358
  Object.defineProperty(exports, "__esModule", ({ value: true }));
23134
- exports.updateTableCellMetadata = void 0;
23359
+ exports.updateTableCellMetadata = exports.getTableCellMetadata = void 0;
23135
23360
  var definitionCreators_1 = __webpack_require__(/*! ./definitionCreators */ "./packages/roosterjs-content-model-dom/lib/modelApi/metadata/definitionCreators.ts");
23136
23361
  var updateMetadata_1 = __webpack_require__(/*! ./updateMetadata */ "./packages/roosterjs-content-model-dom/lib/modelApi/metadata/updateMetadata.ts");
23137
23362
  var TableCellMetadataFormatDefinition = (0, definitionCreators_1.createObjectDefinition)({
@@ -23139,6 +23364,14 @@ var TableCellMetadataFormatDefinition = (0, definitionCreators_1.createObjectDef
23139
23364
  vAlignOverride: (0, definitionCreators_1.createBooleanDefinition)(true /** isOptional */),
23140
23365
  borderOverride: (0, definitionCreators_1.createBooleanDefinition)(true /** isOptional */),
23141
23366
  }, false /* isOptional */, true /** allowNull */);
23367
+ /**
23368
+ * Get table cell metadata
23369
+ * @param cell The table cell Content Model
23370
+ */
23371
+ function getTableCellMetadata(cell) {
23372
+ return (0, updateMetadata_1.getMetadata)(cell, TableCellMetadataFormatDefinition);
23373
+ }
23374
+ exports.getTableCellMetadata = getTableCellMetadata;
23142
23375
  /**
23143
23376
  * Update table cell metadata with a callback
23144
23377
  * @param cell The table cell Content Model
@@ -23161,9 +23394,9 @@ exports.updateTableCellMetadata = updateTableCellMetadata;
23161
23394
  "use strict";
23162
23395
 
23163
23396
  Object.defineProperty(exports, "__esModule", ({ value: true }));
23164
- exports.updateTableMetadata = void 0;
23165
- var TableBorderFormat_1 = __webpack_require__(/*! ../../constants/TableBorderFormat */ "./packages/roosterjs-content-model-dom/lib/constants/TableBorderFormat.ts");
23397
+ exports.updateTableMetadata = exports.getTableMetadata = void 0;
23166
23398
  var updateMetadata_1 = __webpack_require__(/*! ./updateMetadata */ "./packages/roosterjs-content-model-dom/lib/modelApi/metadata/updateMetadata.ts");
23399
+ var TableBorderFormat_1 = __webpack_require__(/*! ../../constants/TableBorderFormat */ "./packages/roosterjs-content-model-dom/lib/constants/TableBorderFormat.ts");
23167
23400
  var definitionCreators_1 = __webpack_require__(/*! ./definitionCreators */ "./packages/roosterjs-content-model-dom/lib/modelApi/metadata/definitionCreators.ts");
23168
23401
  var NullStringDefinition = (0, definitionCreators_1.createStringDefinition)(false /** isOptional */, undefined /** value */, true /** allowNull */);
23169
23402
  var BooleanDefinition = (0, definitionCreators_1.createBooleanDefinition)(false /** isOptional */);
@@ -23181,6 +23414,14 @@ var TableFormatDefinition = (0, definitionCreators_1.createObjectDefinition)({
23181
23414
  tableBorderFormat: (0, definitionCreators_1.createNumberDefinition)(false /** isOptional */, undefined /* value */, TableBorderFormat_1.TableBorderFormat.Min /* first table border format */, TableBorderFormat_1.TableBorderFormat.Max /* last table border format */),
23182
23415
  verticalAlign: NullStringDefinition,
23183
23416
  }, false /* isOptional */, true /** allowNull */);
23417
+ /**
23418
+ * Get table metadata
23419
+ * @param table The table Content Model
23420
+ */
23421
+ function getTableMetadata(table) {
23422
+ return (0, updateMetadata_1.getMetadata)(table, TableFormatDefinition);
23423
+ }
23424
+ exports.getTableMetadata = getTableMetadata;
23184
23425
  /**
23185
23426
  * Update table metadata with a callback
23186
23427
  * @param table The table Content Model
@@ -23280,64 +23521,63 @@ var tslib_1 = __webpack_require__(/*! tslib */ "./node_modules/tslib/tslib.es6.m
23280
23521
  var getClosestAncestorBlockGroupIndex_1 = __webpack_require__(/*! ../editing/getClosestAncestorBlockGroupIndex */ "./packages/roosterjs-content-model-dom/lib/modelApi/editing/getClosestAncestorBlockGroupIndex.ts");
23281
23522
  var isBlockGroupOfType_1 = __webpack_require__(/*! ../typeCheck/isBlockGroupOfType */ "./packages/roosterjs-content-model-dom/lib/modelApi/typeCheck/isBlockGroupOfType.ts");
23282
23523
  var iterateSelections_1 = __webpack_require__(/*! ./iterateSelections */ "./packages/roosterjs-content-model-dom/lib/modelApi/selection/iterateSelections.ts");
23283
- /**
23284
- * Get an array of selected parent paragraph and child segment pair
23285
- * @param model The Content Model to get selection from
23286
- * @param includingFormatHolder True means also include format holder as segment from list item, in that case paragraph will be null
23287
- */
23288
- function getSelectedSegmentsAndParagraphs(model, includingFormatHolder, includingEntity) {
23524
+ var mutate_1 = __webpack_require__(/*! ../common/mutate */ "./packages/roosterjs-content-model-dom/lib/modelApi/common/mutate.ts");
23525
+ function getSelectedSegmentsAndParagraphs(model, includingFormatHolder, includingEntity, mutate) {
23289
23526
  var selections = collectSelections(model, {
23290
23527
  includeListFormatHolder: includingFormatHolder ? 'allSegments' : 'never',
23291
23528
  });
23292
23529
  var result = [];
23293
23530
  selections.forEach(function (_a) {
23294
23531
  var segments = _a.segments, block = _a.block, path = _a.path;
23295
- if (segments && ((includingFormatHolder && !block) || (block === null || block === void 0 ? void 0 : block.blockType) == 'Paragraph')) {
23296
- segments.forEach(function (segment) {
23297
- if (includingEntity ||
23298
- segment.segmentType != 'Entity' ||
23299
- !segment.entityFormat.isReadonly) {
23300
- result.push([segment, (block === null || block === void 0 ? void 0 : block.blockType) == 'Paragraph' ? block : null, path]);
23532
+ if (segments) {
23533
+ if (includingFormatHolder &&
23534
+ !block &&
23535
+ segments.length == 1 &&
23536
+ path[0].blockGroupType == 'ListItem' &&
23537
+ segments[0] == path[0].formatHolder) {
23538
+ var list = path[0];
23539
+ if (mutate) {
23540
+ (0, mutate_1.mutateBlock)(list);
23301
23541
  }
23302
- });
23542
+ result.push([list.formatHolder, null, path]);
23543
+ }
23544
+ else if ((block === null || block === void 0 ? void 0 : block.blockType) == 'Paragraph') {
23545
+ if (mutate) {
23546
+ (0, mutate_1.mutateBlock)(block);
23547
+ }
23548
+ segments.forEach(function (segment) {
23549
+ if (includingEntity ||
23550
+ segment.segmentType != 'Entity' ||
23551
+ !segment.entityFormat.isReadonly) {
23552
+ result.push([segment, block, path]);
23553
+ }
23554
+ });
23555
+ }
23303
23556
  }
23304
23557
  });
23305
23558
  return result;
23306
23559
  }
23307
23560
  exports.getSelectedSegmentsAndParagraphs = getSelectedSegmentsAndParagraphs;
23308
- /**
23309
- * Get an array of selected segments from a content model
23310
- * @param model The Content Model to get selection from
23311
- * @param includingFormatHolder True means also include format holder as segment from list item
23312
- */
23313
- function getSelectedSegments(model, includingFormatHolder) {
23314
- return getSelectedSegmentsAndParagraphs(model, includingFormatHolder).map(function (x) { return x[0]; });
23561
+ function getSelectedSegments(model, includingFormatHolder, mutate) {
23562
+ var segments = mutate
23563
+ ? getSelectedSegmentsAndParagraphs(model, includingFormatHolder, false /*includeEntity*/, true /*mutate*/)
23564
+ : getSelectedSegmentsAndParagraphs(model, includingFormatHolder);
23565
+ return segments.map(function (x) { return x[0]; });
23315
23566
  }
23316
23567
  exports.getSelectedSegments = getSelectedSegments;
23317
- /**
23318
- * Get any array of selected paragraphs from a content model
23319
- * @param model The Content Model to get selection from
23320
- */
23321
- function getSelectedParagraphs(model) {
23568
+ function getSelectedParagraphs(model, mutate) {
23322
23569
  var selections = collectSelections(model, { includeListFormatHolder: 'never' });
23323
23570
  var result = [];
23324
23571
  removeUnmeaningfulSelections(selections);
23325
23572
  selections.forEach(function (_a) {
23326
23573
  var block = _a.block;
23327
23574
  if ((block === null || block === void 0 ? void 0 : block.blockType) == 'Paragraph') {
23328
- result.push(block);
23575
+ result.push(mutate ? (0, mutate_1.mutateBlock)(block) : block);
23329
23576
  }
23330
23577
  });
23331
23578
  return result;
23332
23579
  }
23333
23580
  exports.getSelectedParagraphs = getSelectedParagraphs;
23334
- /**
23335
- * Get an array of block group - block pair that is of the expected block group type from selection
23336
- * @param group The root block group to search
23337
- * @param blockGroupTypes The expected block group types
23338
- * @param stopTypes Block group types that will stop searching when hit
23339
- * @param deepFirst True means search in deep first, otherwise wide first
23340
- */
23341
23581
  function getOperationalBlocks(group, blockGroupTypes, stopTypes, deepFirst) {
23342
23582
  var result = [];
23343
23583
  var findSequence = deepFirst ? blockGroupTypes.map(function (type) { return [type]; }) : [blockGroupTypes];
@@ -23378,10 +23618,6 @@ function getOperationalBlocks(group, blockGroupTypes, stopTypes, deepFirst) {
23378
23618
  return result;
23379
23619
  }
23380
23620
  exports.getOperationalBlocks = getOperationalBlocks;
23381
- /**
23382
- * Get the first selected table from content model
23383
- * @param model The Content Model to get selection from
23384
- */
23385
23621
  function getFirstSelectedTable(model) {
23386
23622
  var selections = collectSelections(model, { includeListFormatHolder: 'never' });
23387
23623
  var table;
@@ -23405,10 +23641,6 @@ function getFirstSelectedTable(model) {
23405
23641
  return [table, resultPath];
23406
23642
  }
23407
23643
  exports.getFirstSelectedTable = getFirstSelectedTable;
23408
- /**
23409
- * Get the first selected list item from content model
23410
- * @param model The Content Model to get selection from
23411
- */
23412
23644
  function getFirstSelectedListItem(model) {
23413
23645
  var listItem;
23414
23646
  getOperationalBlocks(model, ['ListItem'], ['TableCell']).forEach(function (r) {
@@ -23431,6 +23663,8 @@ function collectSelections(group, option) {
23431
23663
  }, option);
23432
23664
  return selections;
23433
23665
  }
23666
+ //#endregion
23667
+ //#region utils
23434
23668
  function removeUnmeaningfulSelections(selections) {
23435
23669
  if (selections.length > 1 &&
23436
23670
  isOnlySelectionMarkerSelected(selections, false /*checkFirstParagraph*/)) {
@@ -23458,6 +23692,7 @@ function isOnlySelectionMarkerSelected(selections, checkFirstParagraph) {
23458
23692
  return false;
23459
23693
  }
23460
23694
  }
23695
+ //#endregion
23461
23696
 
23462
23697
 
23463
23698
  /***/ }),
@@ -23605,12 +23840,6 @@ exports.hasSelectionInSegment = hasSelectionInSegment;
23605
23840
  Object.defineProperty(exports, "__esModule", ({ value: true }));
23606
23841
  exports.iterateSelections = void 0;
23607
23842
  var tslib_1 = __webpack_require__(/*! tslib */ "./node_modules/tslib/tslib.es6.mjs");
23608
- /**
23609
- * Iterate all selected elements in a given model
23610
- * @param group The given Content Model to iterate selection from
23611
- * @param callback The callback function to access the selected element
23612
- * @param option Option to determine how to iterate
23613
- */
23614
23843
  function iterateSelections(group, callback, option) {
23615
23844
  var internalCallback = function (path, tableContext, block, segments) {
23616
23845
  var _a;
@@ -23760,6 +23989,7 @@ function internalIterateSelections(path, callback, option, table, treatAllAsSele
23760
23989
  Object.defineProperty(exports, "__esModule", ({ value: true }));
23761
23990
  exports.setSelection = void 0;
23762
23991
  var isGeneralSegment_1 = __webpack_require__(/*! ../typeCheck/isGeneralSegment */ "./packages/roosterjs-content-model-dom/lib/modelApi/typeCheck/isGeneralSegment.ts");
23992
+ var mutate_1 = __webpack_require__(/*! ../common/mutate */ "./packages/roosterjs-content-model-dom/lib/modelApi/common/mutate.ts");
23763
23993
  /**
23764
23994
  * Set selection into Content Model. If the Content Model already has selection, existing selection will be overwritten by the new one.
23765
23995
  * @param group The root level group of Content Model
@@ -23772,8 +24002,8 @@ function setSelection(group, start, end) {
23772
24002
  exports.setSelection = setSelection;
23773
24003
  function setSelectionToBlockGroup(group, isInSelection, start, end) {
23774
24004
  return handleSelection(isInSelection, group, start, end, function (isInSelection) {
23775
- if ((0, isGeneralSegment_1.isGeneralSegment)(group)) {
23776
- setIsSelected(group, isInSelection);
24005
+ if ((0, isGeneralSegment_1.isGeneralSegment)(group) && needToSetSelection(group, isInSelection)) {
24006
+ setIsSelected((0, mutate_1.mutateBlock)(group), isInSelection);
23777
24007
  }
23778
24008
  group.blocks.forEach(function (block) {
23779
24009
  isInSelection = setSelectionToBlock(block, isInSelection, start, end);
@@ -23790,11 +24020,14 @@ function setSelectionToBlock(block, isInSelection, start, end) {
23790
24020
  case 'Divider':
23791
24021
  case 'Entity':
23792
24022
  return handleSelection(isInSelection, block, start, end, function (isInSelection) {
23793
- if (isInSelection) {
23794
- block.isSelected = true;
23795
- }
23796
- else {
23797
- delete block.isSelected;
24023
+ if (needToSetSelection(block, isInSelection)) {
24024
+ var mutableBlock = (0, mutate_1.mutateBlock)(block);
24025
+ if (isInSelection) {
24026
+ mutableBlock.isSelected = true;
24027
+ }
24028
+ else {
24029
+ delete mutableBlock.isSelected;
24030
+ }
23798
24031
  }
23799
24032
  return isInSelection;
23800
24033
  });
@@ -23802,13 +24035,13 @@ function setSelectionToBlock(block, isInSelection, start, end) {
23802
24035
  var segmentsToDelete_1 = [];
23803
24036
  block.segments.forEach(function (segment, i) {
23804
24037
  isInSelection = handleSelection(isInSelection, segment, start, end, function (isInSelection) {
23805
- return setSelectionToSegment(segment, isInSelection, segmentsToDelete_1, start, end, i);
24038
+ return setSelectionToSegment(block, segment, isInSelection, segmentsToDelete_1, start, end, i);
23806
24039
  });
23807
24040
  });
23808
- while (segmentsToDelete_1.length > 0) {
23809
- var index = segmentsToDelete_1.pop();
24041
+ var index = void 0;
24042
+ while ((index = segmentsToDelete_1.pop()) !== undefined) {
23810
24043
  if (index >= 0) {
23811
- block.segments.splice(index, 1);
24044
+ (0, mutate_1.mutateBlock)(block).segments.splice(index, 1);
23812
24045
  }
23813
24046
  }
23814
24047
  return isInSelection;
@@ -23825,7 +24058,9 @@ function setSelectionToTable(table, isInSelection, start, end) {
23825
24058
  for (var col = 0; col < currentRow.cells.length; col++) {
23826
24059
  var currentCell = table.rows[row].cells[col];
23827
24060
  var isSelected = row >= first.row && row <= last.row && col >= first.col && col <= last.col;
23828
- setIsSelected(currentCell, isSelected);
24061
+ if (needToSetSelection(currentCell, isSelected)) {
24062
+ setIsSelected((0, mutate_1.mutateBlock)(currentCell), isSelected);
24063
+ }
23829
24064
  if (!isSelected) {
23830
24065
  setSelectionToBlockGroup(currentCell, false /*isInSelection*/, start, end);
23831
24066
  }
@@ -23848,7 +24083,7 @@ function findCell(table, cell) {
23848
24083
  : -1;
23849
24084
  return { row: row, col: col };
23850
24085
  }
23851
- function setSelectionToSegment(segment, isInSelection, segmentsToDelete, start, end, i) {
24086
+ function setSelectionToSegment(paragraph, segment, isInSelection, segmentsToDelete, start, end, i) {
23852
24087
  switch (segment.segmentType) {
23853
24088
  case 'SelectionMarker':
23854
24089
  if (!isInSelection || (segment != start && segment != end)) {
@@ -23859,19 +24094,32 @@ function setSelectionToSegment(segment, isInSelection, segmentsToDelete, start,
23859
24094
  }
23860
24095
  return isInSelection;
23861
24096
  case 'General':
23862
- setIsSelected(segment, isInSelection);
24097
+ internalSetSelectionToSegment(paragraph, segment, isInSelection);
23863
24098
  return segment != start && segment != end
23864
24099
  ? setSelectionToBlockGroup(segment, isInSelection, start, end)
23865
24100
  : isInSelection;
23866
24101
  case 'Image':
23867
- setIsSelected(segment, isInSelection);
23868
- segment.isSelectedAsImageSelection = start == segment && (!end || end == segment);
24102
+ var isSelectedAsImageSelection_1 = start == segment && (!end || end == segment);
24103
+ internalSetSelectionToSegment(paragraph, segment, isInSelection, !segment.isSelectedAsImageSelection != !isSelectedAsImageSelection_1
24104
+ ? function (image) { return (image.isSelectedAsImageSelection = isSelectedAsImageSelection_1); }
24105
+ : undefined);
23869
24106
  return isInSelection;
23870
24107
  default:
23871
- setIsSelected(segment, isInSelection);
24108
+ internalSetSelectionToSegment(paragraph, segment, isInSelection);
23872
24109
  return isInSelection;
23873
24110
  }
23874
24111
  }
24112
+ function internalSetSelectionToSegment(paragraph, segment, isInSelection, additionAction) {
24113
+ if (additionAction || needToSetSelection(segment, isInSelection)) {
24114
+ (0, mutate_1.mutateSegment)(paragraph, segment, function (mutableSegment) {
24115
+ setIsSelected(mutableSegment, isInSelection);
24116
+ additionAction === null || additionAction === void 0 ? void 0 : additionAction(mutableSegment);
24117
+ });
24118
+ }
24119
+ }
24120
+ function needToSetSelection(selectable, isSelected) {
24121
+ return !selectable.isSelected != !isSelected;
24122
+ }
23875
24123
  function setIsSelected(selectable, value) {
23876
24124
  if (value) {
23877
24125
  selectable.isSelected = true;
@@ -23900,11 +24148,6 @@ function handleSelection(isInSelection, model, start, end, callback) {
23900
24148
 
23901
24149
  Object.defineProperty(exports, "__esModule", ({ value: true }));
23902
24150
  exports.isBlockGroupOfType = void 0;
23903
- /**
23904
- * Check if the given content model block or block group is of the expected block group type
23905
- * @param input The object to check
23906
- * @param type The expected type
23907
- */
23908
24151
  function isBlockGroupOfType(input, type) {
23909
24152
  var item = input;
23910
24153
  return (item === null || item === void 0 ? void 0 : item.blockGroupType) == type;
@@ -23924,10 +24167,6 @@ exports.isBlockGroupOfType = isBlockGroupOfType;
23924
24167
 
23925
24168
  Object.defineProperty(exports, "__esModule", ({ value: true }));
23926
24169
  exports.isGeneralSegment = void 0;
23927
- /**
23928
- * Check if the given block group is a general segment
23929
- * @param group The group to check
23930
- */
23931
24170
  function isGeneralSegment(group) {
23932
24171
  return (group.blockGroupType == 'General' &&
23933
24172
  group.segmentType == 'General');
@@ -25637,7 +25876,11 @@ var roosterjs_content_model_api_1 = __webpack_require__(/*! roosterjs-content-mo
25637
25876
  * @internal
25638
25877
  */
25639
25878
  function createLink(editor) {
25879
+ var anchorNode = null;
25640
25880
  (0, roosterjs_content_model_api_1.formatTextSegmentBeforeSelectionMarker)(editor, function (_model, linkSegment, _paragraph) {
25881
+ if (linkSegment.link) {
25882
+ return true;
25883
+ }
25641
25884
  var linkData = null;
25642
25885
  if (!linkSegment.link && (linkData = (0, roosterjs_content_model_api_1.matchLink)(linkSegment.text))) {
25643
25886
  (0, roosterjs_content_model_dom_1.addLink)(linkSegment, {
@@ -25652,6 +25895,12 @@ function createLink(editor) {
25652
25895
  return false;
25653
25896
  }, {
25654
25897
  changeSource: roosterjs_content_model_dom_1.ChangeSource.AutoLink,
25898
+ onNodeCreated: function (_modelElement, node) {
25899
+ if (!anchorNode) {
25900
+ anchorNode = node;
25901
+ }
25902
+ },
25903
+ getChangeData: function () { return anchorNode; },
25655
25904
  });
25656
25905
  }
25657
25906
  exports.createLink = createLink;
@@ -26392,6 +26641,7 @@ var EditPlugin = /** @class */ (function () {
26392
26641
  this.editor = null;
26393
26642
  this.disposer = null;
26394
26643
  this.shouldHandleNextInputEvent = false;
26644
+ this.selectionAfterDelete = null;
26395
26645
  }
26396
26646
  /**
26397
26647
  * Get name of this plugin
@@ -26439,6 +26689,12 @@ var EditPlugin = /** @class */ (function () {
26439
26689
  case 'keyDown':
26440
26690
  this.handleKeyDownEvent(this.editor, event);
26441
26691
  break;
26692
+ case 'keyUp':
26693
+ if (this.selectionAfterDelete) {
26694
+ this.editor.setDOMSelection(this.selectionAfterDelete);
26695
+ this.selectionAfterDelete = null;
26696
+ }
26697
+ break;
26442
26698
  }
26443
26699
  }
26444
26700
  };
@@ -26475,8 +26731,6 @@ var EditPlugin = /** @class */ (function () {
26475
26731
  }
26476
26732
  };
26477
26733
  EditPlugin.prototype.handleBeforeInputEvent = function (editor, rawEvent) {
26478
- var _this = this;
26479
- var _a, _b;
26480
26734
  // Some Android IMEs doesn't fire correct keydown event for BACKSPACE/DELETE key
26481
26735
  // Here we translate input event to BACKSPACE/DELETE keydown event to be compatible with existing logic
26482
26736
  if (!this.shouldHandleNextInputEvent ||
@@ -26504,15 +26758,9 @@ var EditPlugin = /** @class */ (function () {
26504
26758
  }
26505
26759
  if (handled) {
26506
26760
  rawEvent.preventDefault();
26507
- // Restore the selection to avoid the cursor jump issue
26761
+ // Restore the selection on keyup event to avoid the cursor jump issue
26508
26762
  // See: https://issues.chromium.org/issues/330596261
26509
- var selection_1 = editor.getDOMSelection();
26510
- var doc = (_a = this.editor) === null || _a === void 0 ? void 0 : _a.getDocument();
26511
- (_b = doc === null || doc === void 0 ? void 0 : doc.defaultView) === null || _b === void 0 ? void 0 : _b.requestAnimationFrame(function () {
26512
- if (_this.editor) {
26513
- _this.editor.setDOMSelection(selection_1);
26514
- }
26515
- });
26763
+ this.selectionAfterDelete = editor.getDOMSelection();
26516
26764
  }
26517
26765
  };
26518
26766
  return EditPlugin;
@@ -26596,8 +26844,9 @@ function getDeleteCollapsedSelection(direction) {
26596
26844
  context.deleteResult = 'range';
26597
26845
  }
26598
26846
  else if ((blockToDelete = (0, getLeafSiblingBlock_1.getLeafSiblingBlock)(path, paragraph, isForward))) {
26599
- var block = blockToDelete.block, path_1 = blockToDelete.path, siblingSegment = blockToDelete.siblingSegment;
26600
- if (block.blockType == 'Paragraph') {
26847
+ var readonlyBlock = blockToDelete.block, path_1 = blockToDelete.path, siblingSegment = blockToDelete.siblingSegment;
26848
+ if (readonlyBlock.blockType == 'Paragraph') {
26849
+ var block = (0, roosterjs_content_model_dom_1.mutateBlock)(readonlyBlock);
26601
26850
  if (siblingSegment) {
26602
26851
  // When selection is under general segment, need to check if it has a sibling sibling, and delete from it
26603
26852
  if ((0, roosterjs_content_model_dom_1.deleteSegment)(block, siblingSegment, context.formatContext, direction)) {
@@ -26619,7 +26868,6 @@ function getDeleteCollapsedSelection(direction) {
26619
26868
  tableContext: tableContext,
26620
26869
  };
26621
26870
  context.lastParagraph = paragraph;
26622
- delete block.cachedElement;
26623
26871
  }
26624
26872
  context.deleteResult = 'range';
26625
26873
  }
@@ -26627,7 +26875,7 @@ function getDeleteCollapsedSelection(direction) {
26627
26875
  context.lastTableContext = tableContext;
26628
26876
  }
26629
26877
  else {
26630
- if ((0, roosterjs_content_model_dom_1.deleteBlock)(path_1[0].blocks, block, undefined /*replacement*/, context.formatContext, direction)) {
26878
+ if ((0, roosterjs_content_model_dom_1.deleteBlock)((0, roosterjs_content_model_dom_1.mutateBlock)(path_1[0]).blocks, readonlyBlock, undefined /*replacement*/, context.formatContext, direction)) {
26631
26879
  context.deleteResult = 'range';
26632
26880
  }
26633
26881
  }
@@ -26740,7 +26988,7 @@ var insertNewLine = function (quote, parent, index) {
26740
26988
  var marker = (0, roosterjs_content_model_dom_1.createSelectionMarker)();
26741
26989
  var newParagraph = (0, roosterjs_content_model_dom_1.createParagraph)(false /* isImplicit */);
26742
26990
  newParagraph.segments.push(marker);
26743
- parent.blocks.splice(index + 1, 0, newParagraph);
26991
+ (0, roosterjs_content_model_dom_1.mutateBlock)(parent).blocks.splice(index + 1, 0, newParagraph);
26744
26992
  };
26745
26993
 
26746
26994
 
@@ -27080,7 +27328,7 @@ var handleEnterOnList = function (context) {
27080
27328
  lastParagraph.blockType === 'Paragraph' &&
27081
27329
  lastParagraph.segments[lastParagraph.segments.length - 1].segmentType ===
27082
27330
  'SelectionMarker') {
27083
- lastParagraph.segments.pop();
27331
+ (0, roosterjs_content_model_dom_1.mutateBlock)(lastParagraph).segments.pop();
27084
27332
  nextParagraph.segments.unshift((0, roosterjs_content_model_dom_1.createSelectionMarker)(insertPoint.marker.format));
27085
27333
  }
27086
27334
  context.lastParagraph = undefined;
@@ -27088,7 +27336,7 @@ var handleEnterOnList = function (context) {
27088
27336
  }
27089
27337
  else if (deleteResult !== 'range') {
27090
27338
  if (isEmptyListItem(listItem_1)) {
27091
- listItem_1.levels.pop();
27339
+ (0, roosterjs_content_model_dom_1.mutateBlock)(listItem_1).levels.pop();
27092
27340
  }
27093
27341
  else {
27094
27342
  var newListItem = createNewListItem(context, listItem_1, listParent);
@@ -27121,7 +27369,7 @@ var createNewListItem = function (context, listItem, listParent) {
27121
27369
  newListItem.blocks.push(newParagraph);
27122
27370
  insertPoint.paragraph = newParagraph;
27123
27371
  context.lastParagraph = newParagraph;
27124
- listParent.blocks.splice(listIndex + 1, 0, newListItem);
27372
+ (0, roosterjs_content_model_dom_1.mutateBlock)(listParent).blocks.splice(listIndex + 1, 0, newListItem);
27125
27373
  return newListItem;
27126
27374
  };
27127
27375
  var createNewListLevel = function (listItem) {
@@ -27615,9 +27863,6 @@ Object.defineProperty(exports, "__esModule", ({ value: true }));
27615
27863
  exports.getLeafSiblingBlock = void 0;
27616
27864
  var tslib_1 = __webpack_require__(/*! tslib */ "./node_modules/tslib/tslib.es6.mjs");
27617
27865
  var roosterjs_content_model_dom_1 = __webpack_require__(/*! roosterjs-content-model-dom */ "./packages/roosterjs-content-model-dom/lib/index.ts");
27618
- /**
27619
- * @internal
27620
- */
27621
27866
  function getLeafSiblingBlock(path, block, isNext) {
27622
27867
  var _a;
27623
27868
  var newPath = (0, tslib_1.__spreadArray)([], (0, tslib_1.__read)(path), false);
@@ -31133,6 +31378,7 @@ exports.createCellResizer = exports.VERTICAL_RESIZER_ID = exports.HORIZONTAL_RES
31133
31378
  var tslib_1 = __webpack_require__(/*! tslib */ "./node_modules/tslib/tslib.es6.mjs");
31134
31379
  var createElement_1 = __webpack_require__(/*! ../../../pluginUtils/CreateElement/createElement */ "./packages/roosterjs-content-model-plugins/lib/pluginUtils/CreateElement/createElement.ts");
31135
31380
  var DragAndDropHelper_1 = __webpack_require__(/*! ../../../pluginUtils/DragAndDrop/DragAndDropHelper */ "./packages/roosterjs-content-model-plugins/lib/pluginUtils/DragAndDrop/DragAndDropHelper.ts");
31381
+ var getTableFromContentModel_1 = __webpack_require__(/*! ../utils/getTableFromContentModel */ "./packages/roosterjs-content-model-plugins/lib/tableEdit/editors/utils/getTableFromContentModel.ts");
31136
31382
  var roosterjs_content_model_dom_1 = __webpack_require__(/*! roosterjs-content-model-dom */ "./packages/roosterjs-content-model-dom/lib/index.ts");
31137
31383
  var CELL_RESIZER_WIDTH = 4;
31138
31384
  /**
@@ -31185,21 +31431,8 @@ function onDragStart(context, event) {
31185
31431
  }; // Just a fallback
31186
31432
  }
31187
31433
  var editor = context.editor, table = context.table;
31188
- // Get current selection
31189
- var selection = editor.getDOMSelection();
31190
- // Select first cell of the table
31191
- editor.setDOMSelection({
31192
- type: 'table',
31193
- firstColumn: 0,
31194
- firstRow: 0,
31195
- lastColumn: 0,
31196
- lastRow: 0,
31197
- table: table,
31198
- });
31199
- // Get the table content model
31200
- var cmTable = (0, roosterjs_content_model_dom_1.getFirstSelectedTable)(editor.getContentModelCopy('disconnected'))[0];
31201
- // Restore selection
31202
- editor.setDOMSelection(selection);
31434
+ // Get Table block in content model
31435
+ var cmTable = (0, getTableFromContentModel_1.getCMTableFromTable)(editor, table);
31203
31436
  if (rect && cmTable) {
31204
31437
  onStart();
31205
31438
  return {
@@ -31476,6 +31709,7 @@ var tslib_1 = __webpack_require__(/*! tslib */ "./node_modules/tslib/tslib.es6.m
31476
31709
  var createElement_1 = __webpack_require__(/*! ../../../pluginUtils/CreateElement/createElement */ "./packages/roosterjs-content-model-plugins/lib/pluginUtils/CreateElement/createElement.ts");
31477
31710
  var DragAndDropHelper_1 = __webpack_require__(/*! ../../../pluginUtils/DragAndDrop/DragAndDropHelper */ "./packages/roosterjs-content-model-plugins/lib/pluginUtils/DragAndDrop/DragAndDropHelper.ts");
31478
31711
  var roosterjs_content_model_api_1 = __webpack_require__(/*! roosterjs-content-model-api */ "./packages/roosterjs-content-model-api/lib/index.ts");
31712
+ var getTableFromContentModel_1 = __webpack_require__(/*! ../utils/getTableFromContentModel */ "./packages/roosterjs-content-model-plugins/lib/tableEdit/editors/utils/getTableFromContentModel.ts");
31479
31713
  var roosterjs_content_model_dom_1 = __webpack_require__(/*! roosterjs-content-model-dom */ "./packages/roosterjs-content-model-dom/lib/index.ts");
31480
31714
  var TABLE_MOVER_LENGTH = 12;
31481
31715
  /**
@@ -31609,21 +31843,10 @@ function onDragStart(context) {
31609
31843
  tableRect.style.top = trect.top + "px";
31610
31844
  tableRect.style.left = trect.left + "px";
31611
31845
  (_a = div.parentNode) === null || _a === void 0 ? void 0 : _a.appendChild(tableRect);
31612
- // Get current selection
31846
+ // Get drag start selection
31613
31847
  var initialSelection = editor.getDOMSelection();
31614
- // Select first cell of the table
31615
- editor.setDOMSelection({
31616
- type: 'table',
31617
- firstColumn: 0,
31618
- firstRow: 0,
31619
- lastColumn: 0,
31620
- lastRow: 0,
31621
- table: table,
31622
- });
31623
- // Get the table content model
31624
- var _b = (0, tslib_1.__read)((0, roosterjs_content_model_dom_1.getFirstSelectedTable)(editor.getContentModelCopy('disconnected')), 1), cmTable = _b[0];
31625
- // Restore selection
31626
- editor.setDOMSelection(initialSelection);
31848
+ // Get Table block in content model
31849
+ var cmTable = (0, getTableFromContentModel_1.getCMTableFromTable)(editor, table);
31627
31850
  return {
31628
31851
  cmTable: cmTable,
31629
31852
  initialSelection: initialSelection,
@@ -31756,6 +31979,7 @@ exports.createTableResizer = exports.TABLE_RESIZER_ID = void 0;
31756
31979
  var tslib_1 = __webpack_require__(/*! tslib */ "./node_modules/tslib/tslib.es6.mjs");
31757
31980
  var createElement_1 = __webpack_require__(/*! ../../../pluginUtils/CreateElement/createElement */ "./packages/roosterjs-content-model-plugins/lib/pluginUtils/CreateElement/createElement.ts");
31758
31981
  var DragAndDropHelper_1 = __webpack_require__(/*! ../../../pluginUtils/DragAndDrop/DragAndDropHelper */ "./packages/roosterjs-content-model-plugins/lib/pluginUtils/DragAndDrop/DragAndDropHelper.ts");
31982
+ var getTableFromContentModel_1 = __webpack_require__(/*! ../utils/getTableFromContentModel */ "./packages/roosterjs-content-model-plugins/lib/tableEdit/editors/utils/getTableFromContentModel.ts");
31759
31983
  var roosterjs_content_model_dom_1 = __webpack_require__(/*! roosterjs-content-model-dom */ "./packages/roosterjs-content-model-dom/lib/index.ts");
31760
31984
  var TABLE_RESIZER_LENGTH = 12;
31761
31985
  /**
@@ -31819,21 +32043,8 @@ var TableResizer = /** @class */ (function (_super) {
31819
32043
  function onDragStart(context, event) {
31820
32044
  context.onStart();
31821
32045
  var editor = context.editor, table = context.table;
31822
- // Get current selection
31823
- var selection = editor.getDOMSelection();
31824
- // Select first cell of the table
31825
- editor.setDOMSelection({
31826
- type: 'table',
31827
- firstColumn: 0,
31828
- firstRow: 0,
31829
- lastColumn: 0,
31830
- lastRow: 0,
31831
- table: table,
31832
- });
31833
- // Get the table content model
31834
- var cmTable = (0, roosterjs_content_model_dom_1.getFirstSelectedTable)(editor.getContentModelCopy('disconnected'))[0];
31835
- // Restore selection
31836
- editor.setDOMSelection(selection);
32046
+ // Get Table block in content model
32047
+ var cmTable = (0, getTableFromContentModel_1.getCMTableFromTable)(editor, table);
31837
32048
  // Save original widths and heights
31838
32049
  var heights = [];
31839
32050
  cmTable === null || cmTable === void 0 ? void 0 : cmTable.rows.forEach(function (row) {
@@ -31935,6 +32146,45 @@ function isTableBottomVisible(editor, rect, contentDiv) {
31935
32146
  }
31936
32147
 
31937
32148
 
32149
+ /***/ }),
32150
+
32151
+ /***/ "./packages/roosterjs-content-model-plugins/lib/tableEdit/editors/utils/getTableFromContentModel.ts":
32152
+ /*!**********************************************************************************************************!*\
32153
+ !*** ./packages/roosterjs-content-model-plugins/lib/tableEdit/editors/utils/getTableFromContentModel.ts ***!
32154
+ \**********************************************************************************************************/
32155
+ /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
32156
+
32157
+ "use strict";
32158
+
32159
+ Object.defineProperty(exports, "__esModule", ({ value: true }));
32160
+ exports.getCMTableFromTable = void 0;
32161
+ var tslib_1 = __webpack_require__(/*! tslib */ "./node_modules/tslib/tslib.es6.mjs");
32162
+ var roosterjs_content_model_dom_1 = __webpack_require__(/*! roosterjs-content-model-dom */ "./packages/roosterjs-content-model-dom/lib/index.ts");
32163
+ /**
32164
+ * @internal
32165
+ * Get ContentModelTable from a table element if it is present in the content model
32166
+ */
32167
+ function getCMTableFromTable(editor, table) {
32168
+ var cmTable;
32169
+ editor.formatContentModel(function (model) {
32170
+ var _a;
32171
+ _a = (0, tslib_1.__read)((0, roosterjs_content_model_dom_1.getFirstSelectedTable)(model), 1), cmTable = _a[0];
32172
+ return false;
32173
+ }, {
32174
+ selectionOverride: {
32175
+ type: 'table',
32176
+ firstColumn: 0,
32177
+ firstRow: 0,
32178
+ lastColumn: 0,
32179
+ lastRow: 0,
32180
+ table: table,
32181
+ },
32182
+ });
32183
+ return cmTable;
32184
+ }
32185
+ exports.getCMTableFromTable = getCMTableFromTable;
32186
+
32187
+
31938
32188
  /***/ }),
31939
32189
 
31940
32190
  /***/ "./packages/roosterjs-content-model-plugins/lib/watermark/WatermarkPlugin.ts":