roosterjs 9.3.1 → 9.4.1

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.
@@ -2445,7 +2445,7 @@ function setModelIndentation(model, indentation, length, context) {
2445
2445
  var currentParent = parent;
2446
2446
  while (currentParent && modifiedBlocks.indexOf(currentBlock) < 0) {
2447
2447
  var index = path.indexOf(currentParent);
2448
- var format = currentBlock.format;
2448
+ var format = (0, roosterjs_content_model_dom_1.mutateBlock)(currentBlock).format;
2449
2449
  var newValue = calculateMarginValue(format, isIndent, length);
2450
2450
  if (newValue !== null) {
2451
2451
  var isRtl = format.direction == 'rtl';
@@ -2893,7 +2893,7 @@ function insertEntityModel(model, entityModel, position, isBlock, focusAfterEnti
2893
2893
  var pathIndex = position == 'root'
2894
2894
  ? (0, roosterjs_content_model_dom_1.getClosestAncestorBlockGroupIndex)(path, ['TableCell', 'Document'])
2895
2895
  : 0;
2896
- blockParent = path[pathIndex];
2896
+ blockParent = (0, roosterjs_content_model_dom_1.mutateBlock)(path[pathIndex]);
2897
2897
  var child = path[pathIndex - 1];
2898
2898
  var directChild = (child === null || child === void 0 ? void 0 : child.blockGroupType) == 'FormatContainer' ||
2899
2899
  (child === null || child === void 0 ? void 0 : child.blockGroupType) == 'General' ||
@@ -2911,7 +2911,7 @@ function insertEntityModel(model, entityModel, position, isBlock, focusAfterEnti
2911
2911
  var nextBlock = blockParent.blocks[blockIndex];
2912
2912
  blocksToInsert.push(entityModel);
2913
2913
  if ((nextBlock === null || nextBlock === void 0 ? void 0 : nextBlock.blockType) == 'Paragraph') {
2914
- nextParagraph = nextBlock;
2914
+ nextParagraph = (0, roosterjs_content_model_dom_1.mutateBlock)(nextBlock);
2915
2915
  }
2916
2916
  else if (!nextBlock || nextBlock.blockType == 'Entity' || focusAfterEntity) {
2917
2917
  nextParagraph = (0, roosterjs_content_model_dom_1.createParagraph)(false /*isImplicit*/, {}, model.format);
@@ -3133,11 +3133,6 @@ exports.matchLink = matchLink;
3133
3133
 
3134
3134
  Object.defineProperty(exports, "__esModule", ({ value: true }));
3135
3135
  exports.findListItemsInSameThread = void 0;
3136
- /**
3137
- * @param model The content model
3138
- * @param currentItem The current list item
3139
- * Search for all list items in the same thread as the current list item
3140
- */
3141
3136
  function findListItemsInSameThread(group, currentItem) {
3142
3137
  var items = [];
3143
3138
  findListItems(group, items);
@@ -3279,7 +3274,7 @@ function getListAnnounceData(path) {
3279
3274
  }
3280
3275
  else if (level.listType == 'OL') {
3281
3276
  var listNumber = getListNumber(path, listItem);
3282
- var metadata = (0, roosterjs_content_model_dom_1.updateListMetadata)(level);
3277
+ var metadata = (0, roosterjs_content_model_dom_1.getListMetadata)(level);
3283
3278
  var listStyle = (0, roosterjs_content_model_dom_1.getAutoListStyleType)('OL', metadata !== null && metadata !== void 0 ? metadata : {}, listItem.levels.length - 1, level.format.listStyleType);
3284
3279
  return listStyle === undefined
3285
3280
  ? null
@@ -5023,7 +5018,7 @@ function changeImage(editor, file) {
5023
5018
  if (dataUrl && !editor.isDisposed() && (selection === null || selection === void 0 ? void 0 : selection.type) === 'image') {
5024
5019
  (0, formatImageWithContentModel_1.formatImageWithContentModel)(editor, 'changeImage', function (image) {
5025
5020
  var _a, _b;
5026
- 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 : '';
5021
+ 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 : '';
5027
5022
  var previousSrc = image.src;
5028
5023
  image.src = dataUrl;
5029
5024
  image.dataset = {};
@@ -6295,6 +6290,11 @@ function applyTableBorderFormat(editor, border, operation) {
6295
6290
  //Format perimeter if necessary or possible
6296
6291
  modifyPerimeter(tableModel, sel, borderFormat, perimeter, isRtl);
6297
6292
  }
6293
+ var tableMeta = (0, roosterjs_content_model_dom_1.hasMetadata)(tableModel) ? (0, roosterjs_content_model_dom_1.getTableMetadata)(tableModel) : {};
6294
+ if (tableMeta) {
6295
+ // Enforce first column format if necessary
6296
+ (0, roosterjs_content_model_dom_1.setFirstColumnFormatBorders)(tableModel.rows, tableMeta);
6297
+ }
6298
6298
  return true;
6299
6299
  }
6300
6300
  else {
@@ -6601,7 +6601,6 @@ function setTableCellShade(editor, color) {
6601
6601
  editor.formatContentModel(function (model) {
6602
6602
  var _a = (0, tslib_1.__read)((0, roosterjs_content_model_dom_1.getFirstSelectedTable)(model), 1), table = _a[0];
6603
6603
  if (table) {
6604
- (0, roosterjs_content_model_dom_1.normalizeTable)(table);
6605
6604
  table.rows.forEach(function (row) {
6606
6605
  return row.cells.forEach(function (cell) {
6607
6606
  if ((0, roosterjs_content_model_dom_1.hasSelectionInBlockGroup)(cell)) {
@@ -8573,7 +8572,7 @@ var roosterjs_content_model_dom_1 = __webpack_require__(/*! roosterjs-content-mo
8573
8572
  */
8574
8573
  var formatContentModel = function (core, formatter, options, domToModelOptions) {
8575
8574
  var _a;
8576
- var _b = options || {}, apiName = _b.apiName, onNodeCreated = _b.onNodeCreated, getChangeData = _b.getChangeData, changeSource = _b.changeSource, rawEvent = _b.rawEvent, selectionOverride = _b.selectionOverride, scrollCaretIntoView = _b.scrollCaretIntoView;
8575
+ var _b = options || {}, onNodeCreated = _b.onNodeCreated, getChangeData = _b.getChangeData, rawEvent = _b.rawEvent, selectionOverride = _b.selectionOverride, scrollCaretIntoView = _b.scrollCaretIntoView;
8577
8576
  var model = core.api.createContentModel(core, domToModelOptions, selectionOverride);
8578
8577
  var context = {
8579
8578
  newEntities: [],
@@ -8607,9 +8606,9 @@ var formatContentModel = function (core, formatter, options, domToModelOptions)
8607
8606
  eventType: 'contentChanged',
8608
8607
  contentModel: clearModelCache ? undefined : model,
8609
8608
  selection: clearModelCache ? undefined : selection,
8610
- source: changeSource || roosterjs_content_model_dom_1.ChangeSource.Format,
8609
+ source: (options === null || options === void 0 ? void 0 : options.changeSource) || roosterjs_content_model_dom_1.ChangeSource.Format,
8611
8610
  data: getChangeData === null || getChangeData === void 0 ? void 0 : getChangeData(),
8612
- formatApiName: apiName,
8611
+ formatApiName: options === null || options === void 0 ? void 0 : options.apiName,
8613
8612
  changedEntities: getChangedEntities(context, rawEvent),
8614
8613
  };
8615
8614
  core.api.triggerEvent(core, eventData, true /*broadcast*/);
@@ -9292,8 +9291,6 @@ var HIDE_CURSOR_CSS_KEY = '_DOMSelectionHideCursor';
9292
9291
  var HIDE_SELECTION_CSS_KEY = '_DOMSelectionHideSelection';
9293
9292
  var IMAGE_ID = 'image';
9294
9293
  var TABLE_ID = 'table';
9295
- var DEFAULT_SELECTION_BORDER_COLOR = '#DB626C';
9296
- var TABLE_CSS_RULE = 'background-color:#C6C6C6!important;';
9297
9294
  var CARET_CSS_RULE = 'caret-color: transparent';
9298
9295
  var TRANSPARENT_SELECTION_CSS_RULE = 'background-color: transparent !important;';
9299
9296
  var SELECTION_SELECTOR = '*::selection';
@@ -9306,6 +9303,7 @@ var setDOMSelection = function (core, selection, skipSelectionChangedEvent) {
9306
9303
  // Set skipReselectOnFocus to skip this behavior
9307
9304
  var skipReselectOnFocus = core.selection.skipReselectOnFocus;
9308
9305
  var doc = core.physicalRoot.ownerDocument;
9306
+ var isDarkMode = core.lifecycle.isDarkMode;
9309
9307
  core.selection.skipReselectOnFocus = true;
9310
9308
  core.api.setEditorStyle(core, DOM_SELECTION_CSS_KEY, null /*cssRule*/);
9311
9309
  core.api.setEditorStyle(core, HIDE_CURSOR_CSS_KEY, null /*cssRule*/);
@@ -9318,7 +9316,10 @@ var setDOMSelection = function (core, selection, skipSelectionChangedEvent) {
9318
9316
  type: 'image',
9319
9317
  image: image,
9320
9318
  };
9321
- 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) + ")"]);
9319
+ var imageSelectionColor = isDarkMode
9320
+ ? core.selection.imageSelectionBorderColorDark
9321
+ : core.selection.imageSelectionBorderColor;
9322
+ 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) + ")"]);
9322
9323
  core.api.setEditorStyle(core, HIDE_SELECTION_CSS_KEY, TRANSPARENT_SELECTION_CSS_RULE, [SELECTION_SELECTOR]);
9323
9324
  setRangeSelection(doc, image, false /* collapse */);
9324
9325
  break;
@@ -9358,7 +9359,10 @@ var setDOMSelection = function (core, selection, skipSelectionChangedEvent) {
9358
9359
  ? ["#" + tableId, "#" + tableId + " *"]
9359
9360
  : handleTableSelected(parsedTable, tableId, table, firstCell, lastCell);
9360
9361
  core.selection.selection = selection;
9361
- core.api.setEditorStyle(core, DOM_SELECTION_CSS_KEY, TABLE_CSS_RULE, tableSelectors);
9362
+ var tableSelectionColor = isDarkMode
9363
+ ? core.selection.tableCellSelectionBackgroundColorDark
9364
+ : core.selection.tableCellSelectionBackgroundColor;
9365
+ core.api.setEditorStyle(core, DOM_SELECTION_CSS_KEY, "background-color:" + tableSelectionColor + "!important;", tableSelectors);
9362
9366
  core.api.setEditorStyle(core, HIDE_CURSOR_CSS_KEY, CARET_CSS_RULE);
9363
9367
  var nodeToSelect = ((_c = firstCell.cell) === null || _c === void 0 ? void 0 : _c.firstElementChild) || firstCell.cell;
9364
9368
  if (nodeToSelect) {
@@ -10666,7 +10670,7 @@ var deleteEmptyList = function (context) {
10666
10670
  (!previousBlock || (0, roosterjs_content_model_dom_1.hasSelectionInBlock)(previousBlock)) &&
10667
10671
  nextBlock &&
10668
10672
  isEmptyBlock(nextBlock)) {
10669
- item.levels = [];
10673
+ (0, roosterjs_content_model_dom_1.mutateBlock)(item).levels = [];
10670
10674
  }
10671
10675
  }
10672
10676
  }
@@ -12103,7 +12107,7 @@ exports.createLifecyclePlugin = createLifecyclePlugin;
12103
12107
  "use strict";
12104
12108
 
12105
12109
  Object.defineProperty(exports, "__esModule", ({ value: true }));
12106
- exports.createSelectionPlugin = void 0;
12110
+ exports.createSelectionPlugin = exports.DEFAULT_TABLE_CELL_SELECTION_BACKGROUND_COLOR = exports.DEFAULT_SELECTION_BORDER_COLOR = void 0;
12107
12111
  var findCoordinate_1 = __webpack_require__(/*! ./findCoordinate */ "./packages/roosterjs-content-model-core/lib/corePlugin/selection/findCoordinate.ts");
12108
12112
  var findTableCellElement_1 = __webpack_require__(/*! ../../coreApi/setDOMSelection/findTableCellElement */ "./packages/roosterjs-content-model-core/lib/coreApi/setDOMSelection/findTableCellElement.ts");
12109
12113
  var isSingleImageInSelection_1 = __webpack_require__(/*! ./isSingleImageInSelection */ "./packages/roosterjs-content-model-core/lib/corePlugin/selection/isSingleImageInSelection.ts");
@@ -12117,9 +12121,18 @@ var Down = 'ArrowDown';
12117
12121
  var Left = 'ArrowLeft';
12118
12122
  var Right = 'ArrowRight';
12119
12123
  var Tab = 'Tab';
12124
+ /**
12125
+ * @internal
12126
+ */
12127
+ exports.DEFAULT_SELECTION_BORDER_COLOR = '#DB626C';
12128
+ /**
12129
+ * @internal
12130
+ */
12131
+ exports.DEFAULT_TABLE_CELL_SELECTION_BACKGROUND_COLOR = '#C6C6C6';
12120
12132
  var SelectionPlugin = /** @class */ (function () {
12121
12133
  function SelectionPlugin(options) {
12122
12134
  var _this = this;
12135
+ var _a, _b;
12123
12136
  this.editor = null;
12124
12137
  this.disposer = null;
12125
12138
  this.isSafari = false;
@@ -12240,7 +12253,14 @@ var SelectionPlugin = /** @class */ (function () {
12240
12253
  this.state = {
12241
12254
  selection: null,
12242
12255
  tableSelection: null,
12243
- imageSelectionBorderColor: options.imageSelectionBorderColor,
12256
+ imageSelectionBorderColor: (_a = options.imageSelectionBorderColor) !== null && _a !== void 0 ? _a : exports.DEFAULT_SELECTION_BORDER_COLOR,
12257
+ imageSelectionBorderColorDark: options.imageSelectionBorderColor
12258
+ ? undefined
12259
+ : exports.DEFAULT_SELECTION_BORDER_COLOR,
12260
+ tableCellSelectionBackgroundColor: (_b = options.tableCellSelectionBackgroundColor) !== null && _b !== void 0 ? _b : exports.DEFAULT_TABLE_CELL_SELECTION_BACKGROUND_COLOR,
12261
+ tableCellSelectionBackgroundColorDark: options.tableCellSelectionBackgroundColor
12262
+ ? undefined
12263
+ : exports.DEFAULT_TABLE_CELL_SELECTION_BACKGROUND_COLOR,
12244
12264
  };
12245
12265
  }
12246
12266
  SelectionPlugin.prototype.getName = function () {
@@ -12248,6 +12268,17 @@ var SelectionPlugin = /** @class */ (function () {
12248
12268
  };
12249
12269
  SelectionPlugin.prototype.initialize = function (editor) {
12250
12270
  this.editor = editor;
12271
+ if (!this.state.imageSelectionBorderColorDark && this.state.imageSelectionBorderColor) {
12272
+ this.state.imageSelectionBorderColorDark = editor
12273
+ .getColorManager()
12274
+ .getDarkColor(this.state.imageSelectionBorderColor, undefined, 'border');
12275
+ }
12276
+ if (!this.state.tableCellSelectionBackgroundColorDark &&
12277
+ this.state.tableCellSelectionBackgroundColor) {
12278
+ this.state.tableCellSelectionBackgroundColorDark = editor
12279
+ .getColorManager()
12280
+ .getDarkColor(this.state.tableCellSelectionBackgroundColor, undefined, 'background');
12281
+ }
12251
12282
  var env = this.editor.getEnvironment();
12252
12283
  var document = this.editor.getDocument();
12253
12284
  this.isSafari = !!env.isSafari;
@@ -12554,6 +12585,7 @@ var SelectionPlugin = /** @class */ (function () {
12554
12585
  var parsedTable;
12555
12586
  var firstCo;
12556
12587
  if ((table = domHelper.findClosestElementAncestor(tableStart, 'table')) &&
12588
+ table.isContentEditable &&
12557
12589
  (parsedTable = (0, roosterjs_content_model_dom_1.parseTableCells)(table)) &&
12558
12590
  (firstCo = (0, findCoordinate_1.findCoordinate)(parsedTable, tdStart, domHelper))) {
12559
12591
  return { table: table, parsedTable: parsedTable, firstCo: firstCo, startNode: tdStart };
@@ -19582,9 +19614,9 @@ exports.shouldSetValue = shouldSetValue;
19582
19614
  "use strict";
19583
19615
 
19584
19616
  Object.defineProperty(exports, "__esModule", ({ value: true }));
19585
- 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;
19586
- 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;
19587
- 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;
19617
+ 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;
19618
+ 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;
19619
+ 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;
19588
19620
  var domToContentModel_1 = __webpack_require__(/*! ./domToModel/domToContentModel */ "./packages/roosterjs-content-model-dom/lib/domToModel/domToContentModel.ts");
19589
19621
  Object.defineProperty(exports, "domToContentModel", ({ enumerable: true, get: function () { return domToContentModel_1.domToContentModel; } }));
19590
19622
  var contentModelToDom_1 = __webpack_require__(/*! ./modelToDom/contentModelToDom */ "./packages/roosterjs-content-model-dom/lib/modelToDom/contentModelToDom.ts");
@@ -19611,6 +19643,7 @@ var buildSelectionMarker_1 = __webpack_require__(/*! ./domToModel/utils/buildSel
19611
19643
  Object.defineProperty(exports, "buildSelectionMarker", ({ enumerable: true, get: function () { return buildSelectionMarker_1.buildSelectionMarker; } }));
19612
19644
  var updateMetadata_1 = __webpack_require__(/*! ./modelApi/metadata/updateMetadata */ "./packages/roosterjs-content-model-dom/lib/modelApi/metadata/updateMetadata.ts");
19613
19645
  Object.defineProperty(exports, "updateMetadata", ({ enumerable: true, get: function () { return updateMetadata_1.updateMetadata; } }));
19646
+ Object.defineProperty(exports, "getMetadata", ({ enumerable: true, get: function () { return updateMetadata_1.getMetadata; } }));
19614
19647
  Object.defineProperty(exports, "hasMetadata", ({ enumerable: true, get: function () { return updateMetadata_1.hasMetadata; } }));
19615
19648
  var isNodeOfType_1 = __webpack_require__(/*! ./domUtils/isNodeOfType */ "./packages/roosterjs-content-model-dom/lib/domUtils/isNodeOfType.ts");
19616
19649
  Object.defineProperty(exports, "isNodeOfType", ({ enumerable: true, get: function () { return isNodeOfType_1.isNodeOfType; } }));
@@ -19675,6 +19708,12 @@ var createListLevel_1 = __webpack_require__(/*! ./modelApi/creators/createListLe
19675
19708
  Object.defineProperty(exports, "createListLevel", ({ enumerable: true, get: function () { return createListLevel_1.createListLevel; } }));
19676
19709
  var createEmptyModel_1 = __webpack_require__(/*! ./modelApi/creators/createEmptyModel */ "./packages/roosterjs-content-model-dom/lib/modelApi/creators/createEmptyModel.ts");
19677
19710
  Object.defineProperty(exports, "createEmptyModel", ({ enumerable: true, get: function () { return createEmptyModel_1.createEmptyModel; } }));
19711
+ var createTableRow_1 = __webpack_require__(/*! ./modelApi/creators/createTableRow */ "./packages/roosterjs-content-model-dom/lib/modelApi/creators/createTableRow.ts");
19712
+ Object.defineProperty(exports, "createTableRow", ({ enumerable: true, get: function () { return createTableRow_1.createTableRow; } }));
19713
+ var mutate_1 = __webpack_require__(/*! ./modelApi/common/mutate */ "./packages/roosterjs-content-model-dom/lib/modelApi/common/mutate.ts");
19714
+ Object.defineProperty(exports, "mutateBlock", ({ enumerable: true, get: function () { return mutate_1.mutateBlock; } }));
19715
+ Object.defineProperty(exports, "mutateSegments", ({ enumerable: true, get: function () { return mutate_1.mutateSegments; } }));
19716
+ Object.defineProperty(exports, "mutateSegment", ({ enumerable: true, get: function () { return mutate_1.mutateSegment; } }));
19678
19717
  var addBlock_1 = __webpack_require__(/*! ./modelApi/common/addBlock */ "./packages/roosterjs-content-model-dom/lib/modelApi/common/addBlock.ts");
19679
19718
  Object.defineProperty(exports, "addBlock", ({ enumerable: true, get: function () { return addBlock_1.addBlock; } }));
19680
19719
  var addDecorators_1 = __webpack_require__(/*! ./modelApi/common/addDecorators */ "./packages/roosterjs-content-model-dom/lib/modelApi/common/addDecorators.ts");
@@ -19780,6 +19819,7 @@ var deleteBlock_1 = __webpack_require__(/*! ./modelApi/editing/deleteBlock */ ".
19780
19819
  Object.defineProperty(exports, "deleteBlock", ({ enumerable: true, get: function () { return deleteBlock_1.deleteBlock; } }));
19781
19820
  var applyTableFormat_1 = __webpack_require__(/*! ./modelApi/editing/applyTableFormat */ "./packages/roosterjs-content-model-dom/lib/modelApi/editing/applyTableFormat.ts");
19782
19821
  Object.defineProperty(exports, "applyTableFormat", ({ enumerable: true, get: function () { return applyTableFormat_1.applyTableFormat; } }));
19822
+ Object.defineProperty(exports, "setFirstColumnFormatBorders", ({ enumerable: true, get: function () { return applyTableFormat_1.setFirstColumnFormatBorders; } }));
19783
19823
  var normalizeTable_1 = __webpack_require__(/*! ./modelApi/editing/normalizeTable */ "./packages/roosterjs-content-model-dom/lib/modelApi/editing/normalizeTable.ts");
19784
19824
  Object.defineProperty(exports, "normalizeTable", ({ enumerable: true, get: function () { return normalizeTable_1.normalizeTable; } }));
19785
19825
  Object.defineProperty(exports, "MIN_ALLOWED_TABLE_CELL_WIDTH", ({ enumerable: true, get: function () { return normalizeTable_1.MIN_ALLOWED_TABLE_CELL_WIDTH; } }));
@@ -19793,12 +19833,16 @@ var getSegmentTextFormat_1 = __webpack_require__(/*! ./modelApi/editing/getSegme
19793
19833
  Object.defineProperty(exports, "getSegmentTextFormat", ({ enumerable: true, get: function () { return getSegmentTextFormat_1.getSegmentTextFormat; } }));
19794
19834
  var updateImageMetadata_1 = __webpack_require__(/*! ./modelApi/metadata/updateImageMetadata */ "./packages/roosterjs-content-model-dom/lib/modelApi/metadata/updateImageMetadata.ts");
19795
19835
  Object.defineProperty(exports, "updateImageMetadata", ({ enumerable: true, get: function () { return updateImageMetadata_1.updateImageMetadata; } }));
19836
+ Object.defineProperty(exports, "getImageMetadata", ({ enumerable: true, get: function () { return updateImageMetadata_1.getImageMetadata; } }));
19796
19837
  var updateTableCellMetadata_1 = __webpack_require__(/*! ./modelApi/metadata/updateTableCellMetadata */ "./packages/roosterjs-content-model-dom/lib/modelApi/metadata/updateTableCellMetadata.ts");
19797
19838
  Object.defineProperty(exports, "updateTableCellMetadata", ({ enumerable: true, get: function () { return updateTableCellMetadata_1.updateTableCellMetadata; } }));
19839
+ Object.defineProperty(exports, "getTableCellMetadata", ({ enumerable: true, get: function () { return updateTableCellMetadata_1.getTableCellMetadata; } }));
19798
19840
  var updateTableMetadata_1 = __webpack_require__(/*! ./modelApi/metadata/updateTableMetadata */ "./packages/roosterjs-content-model-dom/lib/modelApi/metadata/updateTableMetadata.ts");
19799
19841
  Object.defineProperty(exports, "updateTableMetadata", ({ enumerable: true, get: function () { return updateTableMetadata_1.updateTableMetadata; } }));
19842
+ Object.defineProperty(exports, "getTableMetadata", ({ enumerable: true, get: function () { return updateTableMetadata_1.getTableMetadata; } }));
19800
19843
  var updateListMetadata_1 = __webpack_require__(/*! ./modelApi/metadata/updateListMetadata */ "./packages/roosterjs-content-model-dom/lib/modelApi/metadata/updateListMetadata.ts");
19801
19844
  Object.defineProperty(exports, "updateListMetadata", ({ enumerable: true, get: function () { return updateListMetadata_1.updateListMetadata; } }));
19845
+ Object.defineProperty(exports, "getListMetadata", ({ enumerable: true, get: function () { return updateListMetadata_1.getListMetadata; } }));
19802
19846
  Object.defineProperty(exports, "ListMetadataDefinition", ({ enumerable: true, get: function () { return updateListMetadata_1.ListMetadataDefinition; } }));
19803
19847
  var ChangeSource_1 = __webpack_require__(/*! ./constants/ChangeSource */ "./packages/roosterjs-content-model-dom/lib/constants/ChangeSource.ts");
19804
19848
  Object.defineProperty(exports, "ChangeSource", ({ enumerable: true, get: function () { return ChangeSource_1.ChangeSource; } }));
@@ -19820,19 +19864,20 @@ Object.defineProperty(exports, "UnorderedListStyleMap", ({ enumerable: true, get
19820
19864
  /*!********************************************************************************************!*\
19821
19865
  !*** ./packages/roosterjs-content-model-dom/lib/modelApi/block/setParagraphNotImplicit.ts ***!
19822
19866
  \********************************************************************************************/
19823
- /***/ ((__unused_webpack_module, exports) => {
19867
+ /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
19824
19868
 
19825
19869
  "use strict";
19826
19870
 
19827
19871
  Object.defineProperty(exports, "__esModule", ({ value: true }));
19828
19872
  exports.setParagraphNotImplicit = void 0;
19873
+ var mutate_1 = __webpack_require__(/*! ../common/mutate */ "./packages/roosterjs-content-model-dom/lib/modelApi/common/mutate.ts");
19829
19874
  /**
19830
19875
  * For a given block, if it is a paragraph, set it to be not-implicit
19831
19876
  * @param block The block to check
19832
19877
  */
19833
19878
  function setParagraphNotImplicit(block) {
19834
19879
  if (block.blockType == 'Paragraph' && block.isImplicit) {
19835
- block.isImplicit = false;
19880
+ (0, mutate_1.mutateBlock)(block).isImplicit = false;
19836
19881
  }
19837
19882
  }
19838
19883
  exports.setParagraphNotImplicit = setParagraphNotImplicit;
@@ -19922,13 +19967,6 @@ exports.addDecorators = addDecorators;
19922
19967
  Object.defineProperty(exports, "__esModule", ({ value: true }));
19923
19968
  exports.addSegment = void 0;
19924
19969
  var ensureParagraph_1 = __webpack_require__(/*! ./ensureParagraph */ "./packages/roosterjs-content-model-dom/lib/modelApi/common/ensureParagraph.ts");
19925
- /**
19926
- * 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.
19927
- * @param group The parent block group of the paragraph to add segment into
19928
- * @param newSegment The segment to add
19929
- * @param blockFormat The block format used for creating a new paragraph when need
19930
- * @returns The parent paragraph where the segment is added to
19931
- */
19932
19970
  function addSegment(group, newSegment, blockFormat, segmentFormat) {
19933
19971
  var paragraph = (0, ensureParagraph_1.ensureParagraph)(group, blockFormat, segmentFormat);
19934
19972
  var lastSegment = paragraph.segments[paragraph.segments.length - 1];
@@ -20021,16 +20059,11 @@ Object.defineProperty(exports, "__esModule", ({ value: true }));
20021
20059
  exports.ensureParagraph = void 0;
20022
20060
  var addBlock_1 = __webpack_require__(/*! ./addBlock */ "./packages/roosterjs-content-model-dom/lib/modelApi/common/addBlock.ts");
20023
20061
  var createParagraph_1 = __webpack_require__(/*! ../creators/createParagraph */ "./packages/roosterjs-content-model-dom/lib/modelApi/creators/createParagraph.ts");
20024
- /**
20025
- * @internal
20026
- * Ensure there is a Paragraph that can insert segments in a Content Model Block Group
20027
- * @param group The parent block group of the target paragraph
20028
- * @param blockFormat Format of the paragraph. This is only used if we need to create a new paragraph
20029
- */
20062
+ var mutate_1 = __webpack_require__(/*! ./mutate */ "./packages/roosterjs-content-model-dom/lib/modelApi/common/mutate.ts");
20030
20063
  function ensureParagraph(group, blockFormat, segmentFormat) {
20031
20064
  var lastBlock = group.blocks[group.blocks.length - 1];
20032
20065
  if ((lastBlock === null || lastBlock === void 0 ? void 0 : lastBlock.blockType) == 'Paragraph') {
20033
- return lastBlock;
20066
+ return (0, mutate_1.mutateBlock)(lastBlock);
20034
20067
  }
20035
20068
  else {
20036
20069
  var paragraph = (0, createParagraph_1.createParagraph)(true, blockFormat, segmentFormat);
@@ -20158,6 +20191,87 @@ function isBlockGroup(model) {
20158
20191
  }
20159
20192
 
20160
20193
 
20194
+ /***/ }),
20195
+
20196
+ /***/ "./packages/roosterjs-content-model-dom/lib/modelApi/common/mutate.ts":
20197
+ /*!****************************************************************************!*\
20198
+ !*** ./packages/roosterjs-content-model-dom/lib/modelApi/common/mutate.ts ***!
20199
+ \****************************************************************************/
20200
+ /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
20201
+
20202
+ "use strict";
20203
+
20204
+ Object.defineProperty(exports, "__esModule", ({ value: true }));
20205
+ exports.mutateSegment = exports.mutateSegments = exports.mutateBlock = void 0;
20206
+ var tslib_1 = __webpack_require__(/*! tslib */ "./node_modules/tslib/tslib.es6.mjs");
20207
+ /**
20208
+ * Convert a readonly block to mutable block, clear cached element if exist
20209
+ * @param block The block to convert from
20210
+ * @returns The same block object of its related mutable type
20211
+ */
20212
+ function mutateBlock(block) {
20213
+ if (block.cachedElement) {
20214
+ delete block.cachedElement;
20215
+ }
20216
+ if (isTable(block)) {
20217
+ block.rows.forEach(function (row) {
20218
+ delete row.cachedElement;
20219
+ });
20220
+ }
20221
+ else if (isListItem(block)) {
20222
+ block.levels.forEach(function (level) { return delete level.cachedElement; });
20223
+ }
20224
+ var result = block;
20225
+ return result;
20226
+ }
20227
+ exports.mutateBlock = mutateBlock;
20228
+ /**
20229
+ * Convert segments of a readonly paragraph to be mutable.
20230
+ * Segments that are not belong to the given paragraph will be skipped
20231
+ * @param paragraph The readonly paragraph to convert from
20232
+ * @param segments The segments to convert from
20233
+ */
20234
+ function mutateSegments(paragraph, segments) {
20235
+ var mutablePara = mutateBlock(paragraph);
20236
+ var result = [mutablePara, [], []];
20237
+ if (segments) {
20238
+ segments.forEach(function (segment) {
20239
+ var index = paragraph.segments.indexOf(segment);
20240
+ if (index >= 0) {
20241
+ result[1].push(mutablePara.segments[index]);
20242
+ result[2].push(index);
20243
+ }
20244
+ });
20245
+ }
20246
+ return result;
20247
+ }
20248
+ exports.mutateSegments = mutateSegments;
20249
+ /**
20250
+ * Convert a readonly segment to be mutable, together with its owner paragraph
20251
+ * If the segment does not belong to the given paragraph, return null for the segment
20252
+ * @param paragraph The readonly paragraph to convert from
20253
+ * @param segment The segment to convert from
20254
+ */
20255
+ function mutateSegment(paragraph, segment, callback) {
20256
+ var _a;
20257
+ var _b = (0, tslib_1.__read)(mutateSegments(paragraph, [segment]), 3), mutablePara = _b[0], mutableSegments = _b[1], indexes = _b[2];
20258
+ var mutableSegment = mutableSegments[0] == segment
20259
+ ? mutableSegments[0]
20260
+ : null;
20261
+ if (callback && mutableSegment) {
20262
+ callback(mutableSegments[0], mutablePara, indexes[0]);
20263
+ }
20264
+ return [mutablePara, mutableSegment, (_a = indexes[0]) !== null && _a !== void 0 ? _a : -1];
20265
+ }
20266
+ exports.mutateSegment = mutateSegment;
20267
+ function isTable(obj) {
20268
+ return obj.blockType == 'Table';
20269
+ }
20270
+ function isListItem(obj) {
20271
+ return obj.blockGroupType == 'ListItem';
20272
+ }
20273
+
20274
+
20161
20275
  /***/ }),
20162
20276
 
20163
20277
  /***/ "./packages/roosterjs-content-model-dom/lib/modelApi/common/normalizeContentModel.ts":
@@ -20171,6 +20285,7 @@ function isBlockGroup(model) {
20171
20285
  Object.defineProperty(exports, "__esModule", ({ value: true }));
20172
20286
  exports.normalizeContentModel = void 0;
20173
20287
  var isEmpty_1 = __webpack_require__(/*! ./isEmpty */ "./packages/roosterjs-content-model-dom/lib/modelApi/common/isEmpty.ts");
20288
+ var mutate_1 = __webpack_require__(/*! ./mutate */ "./packages/roosterjs-content-model-dom/lib/modelApi/common/mutate.ts");
20174
20289
  var normalizeParagraph_1 = __webpack_require__(/*! ./normalizeParagraph */ "./packages/roosterjs-content-model-dom/lib/modelApi/common/normalizeParagraph.ts");
20175
20290
  var unwrapBlock_1 = __webpack_require__(/*! ./unwrapBlock */ "./packages/roosterjs-content-model-dom/lib/modelApi/common/unwrapBlock.ts");
20176
20291
  /**
@@ -20209,7 +20324,7 @@ function normalizeContentModel(group) {
20209
20324
  break;
20210
20325
  }
20211
20326
  if ((0, isEmpty_1.isBlockEmpty)(block)) {
20212
- group.blocks.splice(i, 1);
20327
+ (0, mutate_1.mutateBlock)(group).blocks.splice(i, 1);
20213
20328
  }
20214
20329
  }
20215
20330
  }
@@ -20232,6 +20347,7 @@ var areSameFormats_1 = __webpack_require__(/*! ../../domToModel/utils/areSameFor
20232
20347
  var createBr_1 = __webpack_require__(/*! ../creators/createBr */ "./packages/roosterjs-content-model-dom/lib/modelApi/creators/createBr.ts");
20233
20348
  var isEmpty_1 = __webpack_require__(/*! ./isEmpty */ "./packages/roosterjs-content-model-dom/lib/modelApi/common/isEmpty.ts");
20234
20349
  var isWhiteSpacePreserved_1 = __webpack_require__(/*! ../../domUtils/isWhiteSpacePreserved */ "./packages/roosterjs-content-model-dom/lib/domUtils/isWhiteSpacePreserved.ts");
20350
+ var mutate_1 = __webpack_require__(/*! ./mutate */ "./packages/roosterjs-content-model-dom/lib/modelApi/common/mutate.ts");
20235
20351
  var normalizeSegment_1 = __webpack_require__(/*! ./normalizeSegment */ "./packages/roosterjs-content-model-dom/lib/modelApi/common/normalizeSegment.ts");
20236
20352
  /**
20237
20353
  * @param paragraph The paragraph to normalize
@@ -20244,7 +20360,7 @@ function normalizeParagraph(paragraph) {
20244
20360
  var secondLast = segments[segments.length - 2];
20245
20361
  if (last.segmentType == 'SelectionMarker' &&
20246
20362
  (!secondLast || secondLast.segmentType == 'Br')) {
20247
- segments.push((0, createBr_1.createBr)(last.format));
20363
+ (0, mutate_1.mutateBlock)(paragraph).segments.push((0, createBr_1.createBr)(last.format));
20248
20364
  }
20249
20365
  else if (segments.length > 1 && segments[segments.length - 1].segmentType == 'Br') {
20250
20366
  var noMarkerSegments = segments.filter(function (x) { return x.segmentType != 'SelectionMarker'; });
@@ -20252,7 +20368,7 @@ function normalizeParagraph(paragraph) {
20252
20368
  // But if there are more than one <BR> at the end, do not remove them.
20253
20369
  if (noMarkerSegments.length > 1 &&
20254
20370
  noMarkerSegments[noMarkerSegments.length - 2].segmentType != 'Br') {
20255
- segments.pop();
20371
+ (0, mutate_1.mutateBlock)(paragraph).segments.pop();
20256
20372
  }
20257
20373
  }
20258
20374
  }
@@ -20267,7 +20383,7 @@ exports.normalizeParagraph = normalizeParagraph;
20267
20383
  function removeEmptySegments(block) {
20268
20384
  for (var j = block.segments.length - 1; j >= 0; j--) {
20269
20385
  if ((0, isEmpty_1.isSegmentEmpty)(block.segments[j])) {
20270
- block.segments.splice(j, 1);
20386
+ (0, mutate_1.mutateBlock)(block).segments.splice(j, 1);
20271
20387
  }
20272
20388
  }
20273
20389
  }
@@ -20287,7 +20403,9 @@ function removeEmptyLinks(paragraph) {
20287
20403
  next &&
20288
20404
  !next.link &&
20289
20405
  (0, areSameFormats_1.areSameFormats)(next.format, marker.format))) {
20290
- delete marker.link;
20406
+ (0, mutate_1.mutateSegment)(paragraph, marker, function (mutableMarker) {
20407
+ delete mutableMarker.link;
20408
+ });
20291
20409
  }
20292
20410
  }
20293
20411
  }
@@ -20302,7 +20420,7 @@ function moveUpSegmentFormat(paragraph) {
20302
20420
  changed_1 = internalMoveUpSegmentFormat(segments_1, target_1, key) || changed_1;
20303
20421
  });
20304
20422
  if (changed_1) {
20305
- paragraph.segmentFormat = target_1;
20423
+ (0, mutate_1.mutateBlock)(paragraph).segmentFormat = target_1;
20306
20424
  }
20307
20425
  }
20308
20426
  }
@@ -20333,6 +20451,7 @@ function internalMoveUpSegmentFormat(segments, target, formatKey) {
20333
20451
  Object.defineProperty(exports, "__esModule", ({ value: true }));
20334
20452
  exports.normalizeSegment = exports.createNormalizeSegmentContext = exports.normalizeSingleSegment = exports.normalizeAllSegments = void 0;
20335
20453
  var hasSpacesOnly_1 = __webpack_require__(/*! ./hasSpacesOnly */ "./packages/roosterjs-content-model-dom/lib/modelApi/common/hasSpacesOnly.ts");
20454
+ var mutate_1 = __webpack_require__(/*! ./mutate */ "./packages/roosterjs-content-model-dom/lib/modelApi/common/mutate.ts");
20336
20455
  var SPACE = '\u0020';
20337
20456
  var NONE_BREAK_SPACE = '\u00A0';
20338
20457
  var LEADING_SPACE_REGEX = /^\u0020+/;
@@ -20343,10 +20462,10 @@ var TRAILING_SPACE_REGEX = /\u0020+$/;
20343
20462
  function normalizeAllSegments(paragraph) {
20344
20463
  var context = resetNormalizeSegmentContext();
20345
20464
  paragraph.segments.forEach(function (segment) {
20346
- normalizeSegment(segment, context);
20465
+ normalizeSegment(paragraph, segment, context);
20347
20466
  });
20348
- normalizeTextSegments(context.textSegments, context.lastInlineSegment);
20349
- normalizeLastTextSegment(context.lastTextSegment, context.lastInlineSegment);
20467
+ normalizeTextSegments(paragraph, context.textSegments, context.lastInlineSegment);
20468
+ normalizeLastTextSegment(paragraph, context.lastTextSegment, context.lastInlineSegment);
20350
20469
  }
20351
20470
  exports.normalizeAllSegments = normalizeAllSegments;
20352
20471
  /**
@@ -20354,11 +20473,11 @@ exports.normalizeAllSegments = normalizeAllSegments;
20354
20473
  * @param segment The segment to normalize
20355
20474
  * @param ignoreTrailingSpaces Whether we should ignore the trailing space of the text segment @default false
20356
20475
  */
20357
- function normalizeSingleSegment(segment, ignoreTrailingSpaces) {
20476
+ function normalizeSingleSegment(paragraph, segment, ignoreTrailingSpaces) {
20358
20477
  if (ignoreTrailingSpaces === void 0) { ignoreTrailingSpaces = false; }
20359
20478
  var context = resetNormalizeSegmentContext();
20360
20479
  context.ignoreTrailingSpaces = ignoreTrailingSpaces;
20361
- normalizeSegment(segment, context);
20480
+ normalizeSegment(paragraph, segment, context);
20362
20481
  }
20363
20482
  exports.normalizeSingleSegment = normalizeSingleSegment;
20364
20483
  /**
@@ -20380,11 +20499,11 @@ function resetNormalizeSegmentContext(context) {
20380
20499
  /**
20381
20500
  * @internal Export for test only
20382
20501
  */
20383
- function normalizeSegment(segment, context) {
20502
+ function normalizeSegment(paragraph, segment, context) {
20384
20503
  switch (segment.segmentType) {
20385
20504
  case 'Br':
20386
- normalizeTextSegments(context.textSegments, context.lastInlineSegment);
20387
- normalizeLastTextSegment(context.lastTextSegment, context.lastInlineSegment);
20505
+ normalizeTextSegments(paragraph, context.textSegments, context.lastInlineSegment);
20506
+ normalizeLastTextSegment(paragraph, context.lastTextSegment, context.lastInlineSegment);
20388
20507
  // Line ends, reset all states
20389
20508
  resetNormalizeSegmentContext(context);
20390
20509
  break;
@@ -20406,11 +20525,15 @@ function normalizeSegment(segment, context) {
20406
20525
  if (!(0, hasSpacesOnly_1.hasSpacesOnly)(segment.text)) {
20407
20526
  if (first == SPACE) {
20408
20527
  // 1. Multiple leading space => single &nbsp; or empty (depends on if previous segment ends with space)
20409
- segment.text = segment.text.replace(LEADING_SPACE_REGEX, context.ignoreLeadingSpaces ? '' : NONE_BREAK_SPACE);
20528
+ (0, mutate_1.mutateSegment)(paragraph, segment, function (textSegment) {
20529
+ textSegment.text = textSegment.text.replace(LEADING_SPACE_REGEX, context.ignoreLeadingSpaces ? '' : NONE_BREAK_SPACE);
20530
+ });
20410
20531
  }
20411
20532
  if (last == SPACE) {
20412
20533
  // 2. Multiple trailing space => single space
20413
- segment.text = segment.text.replace(TRAILING_SPACE_REGEX, context.ignoreTrailingSpaces ? SPACE : NONE_BREAK_SPACE);
20534
+ (0, mutate_1.mutateSegment)(paragraph, segment, function (textSegment) {
20535
+ textSegment.text = textSegment.text.replace(TRAILING_SPACE_REGEX, context.ignoreTrailingSpaces ? SPACE : NONE_BREAK_SPACE);
20536
+ });
20414
20537
  }
20415
20538
  }
20416
20539
  context.ignoreLeadingSpaces = last == SPACE;
@@ -20418,24 +20541,28 @@ function normalizeSegment(segment, context) {
20418
20541
  }
20419
20542
  }
20420
20543
  exports.normalizeSegment = normalizeSegment;
20421
- function normalizeTextSegments(segments, lastInlineSegment) {
20544
+ function normalizeTextSegments(paragraph, segments, lastInlineSegment) {
20422
20545
  segments.forEach(function (segment) {
20423
20546
  // 3. Segment ends with &nbsp; replace it with space if the previous char is not space so that next segment can wrap
20424
20547
  // Only do this for segments that is not the last one since the last space will be removed in step 4
20425
20548
  if (segment != lastInlineSegment) {
20426
- var text = segment.text;
20427
- if (text.substr(-1) == NONE_BREAK_SPACE &&
20428
- text.length > 1 &&
20429
- text.substr(-2, 1) != SPACE) {
20430
- segment.text = text.substring(0, text.length - 1) + SPACE;
20549
+ var text_1 = segment.text;
20550
+ if (text_1.substr(-1) == NONE_BREAK_SPACE &&
20551
+ text_1.length > 1 &&
20552
+ text_1.substr(-2, 1) != SPACE) {
20553
+ (0, mutate_1.mutateSegment)(paragraph, segment, function (textSegment) {
20554
+ textSegment.text = text_1.substring(0, text_1.length - 1) + SPACE;
20555
+ });
20431
20556
  }
20432
20557
  }
20433
20558
  });
20434
20559
  }
20435
- function normalizeLastTextSegment(segment, lastInlineSegment) {
20560
+ function normalizeLastTextSegment(paragraph, segment, lastInlineSegment) {
20436
20561
  if (segment && segment == lastInlineSegment && (segment === null || segment === void 0 ? void 0 : segment.text.substr(-1)) == SPACE) {
20437
20562
  // 4. last text segment of the paragraph, remove trailing space
20438
- segment.text = segment.text.replace(TRAILING_SPACE_REGEX, '');
20563
+ (0, mutate_1.mutateSegment)(paragraph, segment, function (textSegment) {
20564
+ textSegment.text = textSegment.text.replace(TRAILING_SPACE_REGEX, '');
20565
+ });
20439
20566
  }
20440
20567
  }
20441
20568
 
@@ -20453,6 +20580,7 @@ function normalizeLastTextSegment(segment, lastInlineSegment) {
20453
20580
  Object.defineProperty(exports, "__esModule", ({ value: true }));
20454
20581
  exports.unwrapBlock = void 0;
20455
20582
  var tslib_1 = __webpack_require__(/*! tslib */ "./node_modules/tslib/tslib.es6.mjs");
20583
+ var mutate_1 = __webpack_require__(/*! ./mutate */ "./packages/roosterjs-content-model-dom/lib/modelApi/common/mutate.ts");
20456
20584
  var setParagraphNotImplicit_1 = __webpack_require__(/*! ../block/setParagraphNotImplicit */ "./packages/roosterjs-content-model-dom/lib/modelApi/block/setParagraphNotImplicit.ts");
20457
20585
  /**
20458
20586
  * Unwrap a given block group, move its child blocks to be under its parent group
@@ -20461,11 +20589,13 @@ var setParagraphNotImplicit_1 = __webpack_require__(/*! ../block/setParagraphNot
20461
20589
  */
20462
20590
  function unwrapBlock(parent, groupToUnwrap) {
20463
20591
  var _a;
20464
- var _b;
20592
+ var _b, _c;
20465
20593
  var index = (_b = parent === null || parent === void 0 ? void 0 : parent.blocks.indexOf(groupToUnwrap)) !== null && _b !== void 0 ? _b : -1;
20466
20594
  if (index >= 0) {
20467
20595
  groupToUnwrap.blocks.forEach(setParagraphNotImplicit_1.setParagraphNotImplicit);
20468
- 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));
20596
+ if (parent) {
20597
+ (_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));
20598
+ }
20469
20599
  }
20470
20600
  }
20471
20601
  exports.unwrapBlock = unwrapBlock;
@@ -20491,7 +20621,7 @@ var tslib_1 = __webpack_require__(/*! tslib */ "./node_modules/tslib/tslib.es6.m
20491
20621
  function createBr(format) {
20492
20622
  return {
20493
20623
  segmentType: 'Br',
20494
- format: format ? (0, tslib_1.__assign)({}, format) : {},
20624
+ format: (0, tslib_1.__assign)({}, format),
20495
20625
  };
20496
20626
  }
20497
20627
  exports.createBr = createBr;
@@ -20548,7 +20678,7 @@ function createDivider(tagName, format) {
20548
20678
  return {
20549
20679
  blockType: 'Divider',
20550
20680
  tagName: tagName,
20551
- format: format ? (0, tslib_1.__assign)({}, format) : {},
20681
+ format: (0, tslib_1.__assign)({}, format),
20552
20682
  };
20553
20683
  }
20554
20684
  exports.createDivider = createDivider;
@@ -20646,7 +20776,7 @@ function createFormatContainer(tag, format) {
20646
20776
  blockGroupType: 'FormatContainer',
20647
20777
  tagName: tag,
20648
20778
  blocks: [],
20649
- format: (0, tslib_1.__assign)({}, (format || {})),
20779
+ format: (0, tslib_1.__assign)({}, format),
20650
20780
  };
20651
20781
  }
20652
20782
  exports.createFormatContainer = createFormatContainer;
@@ -20703,7 +20833,7 @@ function createGeneralSegment(element, format) {
20703
20833
  blockType: 'BlockGroup',
20704
20834
  blockGroupType: 'General',
20705
20835
  segmentType: 'General',
20706
- format: format ? (0, tslib_1.__assign)({}, format) : {},
20836
+ format: (0, tslib_1.__assign)({}, format),
20707
20837
  blocks: [],
20708
20838
  element: element,
20709
20839
  };
@@ -20733,7 +20863,7 @@ function createImage(src, format) {
20733
20863
  return {
20734
20864
  segmentType: 'Image',
20735
20865
  src: src,
20736
- format: format ? (0, tslib_1.__assign)({}, format) : {},
20866
+ format: (0, tslib_1.__assign)({}, format),
20737
20867
  dataset: {},
20738
20868
  };
20739
20869
  }
@@ -20829,7 +20959,7 @@ function createParagraph(isImplicit, blockFormat, segmentFormat, decorator) {
20829
20959
  var result = {
20830
20960
  blockType: 'Paragraph',
20831
20961
  segments: [],
20832
- format: blockFormat ? (0, tslib_1.__assign)({}, blockFormat) : {},
20962
+ format: (0, tslib_1.__assign)({}, blockFormat),
20833
20963
  };
20834
20964
  if (segmentFormat && Object.keys(segmentFormat).length > 0) {
20835
20965
  result.segmentFormat = (0, tslib_1.__assign)({}, segmentFormat);
@@ -20869,7 +20999,7 @@ var tslib_1 = __webpack_require__(/*! tslib */ "./node_modules/tslib/tslib.es6.m
20869
20999
  function createParagraphDecorator(tagName, format) {
20870
21000
  return {
20871
21001
  tagName: tagName.toLocaleLowerCase(),
20872
- format: (0, tslib_1.__assign)({}, (format || {})),
21002
+ format: (0, tslib_1.__assign)({}, format),
20873
21003
  };
20874
21004
  }
20875
21005
  exports.createParagraphDecorator = createParagraphDecorator;
@@ -20896,7 +21026,7 @@ function createSelectionMarker(format) {
20896
21026
  return {
20897
21027
  segmentType: 'SelectionMarker',
20898
21028
  isSelected: true,
20899
- format: format ? (0, tslib_1.__assign)({}, format) : {},
21029
+ format: (0, tslib_1.__assign)({}, format),
20900
21030
  };
20901
21031
  }
20902
21032
  exports.createSelectionMarker = createSelectionMarker;
@@ -20915,6 +21045,7 @@ exports.createSelectionMarker = createSelectionMarker;
20915
21045
  Object.defineProperty(exports, "__esModule", ({ value: true }));
20916
21046
  exports.createTable = void 0;
20917
21047
  var tslib_1 = __webpack_require__(/*! tslib */ "./node_modules/tslib/tslib.es6.mjs");
21048
+ var createTableRow_1 = __webpack_require__(/*! ./createTableRow */ "./packages/roosterjs-content-model-dom/lib/modelApi/creators/createTableRow.ts");
20918
21049
  /**
20919
21050
  * Create a ContentModelTable model
20920
21051
  * @param rowCount Count of rows of this table
@@ -20923,16 +21054,12 @@ var tslib_1 = __webpack_require__(/*! tslib */ "./node_modules/tslib/tslib.es6.m
20923
21054
  function createTable(rowCount, format) {
20924
21055
  var rows = [];
20925
21056
  for (var i = 0; i < rowCount; i++) {
20926
- rows.push({
20927
- height: 0,
20928
- format: {},
20929
- cells: [],
20930
- });
21057
+ rows.push((0, createTableRow_1.createTableRow)());
20931
21058
  }
20932
21059
  return {
20933
21060
  blockType: 'Table',
20934
21061
  rows: rows,
20935
- format: (0, tslib_1.__assign)({}, (format || {})),
21062
+ format: (0, tslib_1.__assign)({}, format),
20936
21063
  widths: [],
20937
21064
  dataset: {},
20938
21065
  };
@@ -20966,7 +21093,7 @@ function createTableCell(spanLeftOrColSpan, spanAboveOrRowSpan, isHeader, format
20966
21093
  return {
20967
21094
  blockGroupType: 'TableCell',
20968
21095
  blocks: [],
20969
- format: format ? (0, tslib_1.__assign)({}, format) : {},
21096
+ format: (0, tslib_1.__assign)({}, format),
20970
21097
  spanLeft: spanLeft,
20971
21098
  spanAbove: spanAbove,
20972
21099
  isHeader: !!isHeader,
@@ -20976,6 +21103,34 @@ function createTableCell(spanLeftOrColSpan, spanAboveOrRowSpan, isHeader, format
20976
21103
  exports.createTableCell = createTableCell;
20977
21104
 
20978
21105
 
21106
+ /***/ }),
21107
+
21108
+ /***/ "./packages/roosterjs-content-model-dom/lib/modelApi/creators/createTableRow.ts":
21109
+ /*!**************************************************************************************!*\
21110
+ !*** ./packages/roosterjs-content-model-dom/lib/modelApi/creators/createTableRow.ts ***!
21111
+ \**************************************************************************************/
21112
+ /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
21113
+
21114
+ "use strict";
21115
+
21116
+ Object.defineProperty(exports, "__esModule", ({ value: true }));
21117
+ exports.createTableRow = void 0;
21118
+ var tslib_1 = __webpack_require__(/*! tslib */ "./node_modules/tslib/tslib.es6.mjs");
21119
+ /**
21120
+ * Create a ContentModelTableRow model
21121
+ * @param format @optional The format of this model
21122
+ */
21123
+ function createTableRow(format, height) {
21124
+ if (height === void 0) { height = 0; }
21125
+ return {
21126
+ height: height,
21127
+ format: (0, tslib_1.__assign)({}, format),
21128
+ cells: [],
21129
+ };
21130
+ }
21131
+ exports.createTableRow = createTableRow;
21132
+
21133
+
20979
21134
  /***/ }),
20980
21135
 
20981
21136
  /***/ "./packages/roosterjs-content-model-dom/lib/modelApi/creators/createText.ts":
@@ -21001,7 +21156,7 @@ function createText(text, format, link, code) {
21001
21156
  var result = {
21002
21157
  segmentType: 'Text',
21003
21158
  text: text,
21004
- format: format ? (0, tslib_1.__assign)({}, format) : {},
21159
+ format: (0, tslib_1.__assign)({}, format),
21005
21160
  };
21006
21161
  if (link) {
21007
21162
  (0, addDecorators_1.addLink)(result, link);
@@ -21026,10 +21181,11 @@ exports.createText = createText;
21026
21181
 
21027
21182
  var _a;
21028
21183
  Object.defineProperty(exports, "__esModule", ({ value: true }));
21029
- exports.applyTableFormat = void 0;
21184
+ exports.setFirstColumnFormatBorders = exports.applyTableFormat = void 0;
21030
21185
  var tslib_1 = __webpack_require__(/*! tslib */ "./node_modules/tslib/tslib.es6.mjs");
21031
21186
  var borderFormatHandler_1 = __webpack_require__(/*! ../../formatHandlers/common/borderFormatHandler */ "./packages/roosterjs-content-model-dom/lib/formatHandlers/common/borderFormatHandler.ts");
21032
21187
  var borderValues_1 = __webpack_require__(/*! ../../domUtils/style/borderValues */ "./packages/roosterjs-content-model-dom/lib/domUtils/style/borderValues.ts");
21188
+ var mutate_1 = __webpack_require__(/*! ../common/mutate */ "./packages/roosterjs-content-model-dom/lib/modelApi/common/mutate.ts");
21033
21189
  var setTableCellBackgroundColor_1 = __webpack_require__(/*! ./setTableCellBackgroundColor */ "./packages/roosterjs-content-model-dom/lib/modelApi/editing/setTableCellBackgroundColor.ts");
21034
21190
  var TableBorderFormat_1 = __webpack_require__(/*! ../../constants/TableBorderFormat */ "./packages/roosterjs-content-model-dom/lib/constants/TableBorderFormat.ts");
21035
21191
  var updateTableCellMetadata_1 = __webpack_require__(/*! ../metadata/updateTableCellMetadata */ "./packages/roosterjs-content-model-dom/lib/modelApi/metadata/updateTableCellMetadata.ts");
@@ -21055,27 +21211,18 @@ var DEFAULT_FORMAT = {
21055
21211
  * @param keepCellShade @optional When pass true, table cells with customized shade color will not be overwritten. @default false
21056
21212
  */
21057
21213
  function applyTableFormat(table, newFormat, keepCellShade) {
21058
- var rows = table.rows;
21059
- (0, updateTableMetadata_1.updateTableMetadata)(table, function (format) {
21060
- var effectiveMetadata = (0, tslib_1.__assign)((0, tslib_1.__assign)((0, tslib_1.__assign)({}, DEFAULT_FORMAT), format), (newFormat || {}));
21214
+ var mutableTable = (0, mutate_1.mutateBlock)(table);
21215
+ var rows = mutableTable.rows;
21216
+ (0, updateTableMetadata_1.updateTableMetadata)(mutableTable, function (format) {
21217
+ var effectiveMetadata = (0, tslib_1.__assign)((0, tslib_1.__assign)((0, tslib_1.__assign)({}, DEFAULT_FORMAT), format), newFormat);
21061
21218
  var metaOverrides = updateOverrides(rows, !keepCellShade);
21062
- delete table.cachedElement;
21063
- clearCache(rows);
21064
21219
  formatCells(rows, effectiveMetadata, metaOverrides);
21065
- setFirstColumnFormat(rows, effectiveMetadata, metaOverrides);
21220
+ setFirstColumnFormatBorders(rows, effectiveMetadata);
21066
21221
  setHeaderRowFormat(rows, effectiveMetadata, metaOverrides);
21067
21222
  return effectiveMetadata;
21068
21223
  });
21069
21224
  }
21070
21225
  exports.applyTableFormat = applyTableFormat;
21071
- function clearCache(rows) {
21072
- rows.forEach(function (row) {
21073
- row.cells.forEach(function (cell) {
21074
- delete cell.cachedElement;
21075
- });
21076
- delete row.cachedElement;
21077
- });
21078
- }
21079
21226
  function updateOverrides(rows, removeCellShade) {
21080
21227
  var overrides = {
21081
21228
  bgColorOverrides: [],
@@ -21090,7 +21237,7 @@ function updateOverrides(rows, removeCellShade) {
21090
21237
  overrides.vAlignOverrides.push(vAlignOverrides);
21091
21238
  overrides.borderOverrides.push(borderOverrides);
21092
21239
  row.cells.forEach(function (cell) {
21093
- (0, updateTableCellMetadata_1.updateTableCellMetadata)(cell, function (metadata) {
21240
+ (0, updateTableCellMetadata_1.updateTableCellMetadata)((0, mutate_1.mutateBlock)(cell), function (metadata) {
21094
21241
  if (metadata && removeCellShade) {
21095
21242
  bgColorOverrides.push(false);
21096
21243
  delete metadata.bgColorOverride;
@@ -21177,10 +21324,11 @@ var BorderFormatters = (_a = {},
21177
21324
  * Apply vertical align, borders, and background color to all cells in the table
21178
21325
  */
21179
21326
  function formatCells(rows, format, metaOverrides) {
21180
- var hasBandedRows = format.hasBandedRows, hasBandedColumns = format.hasBandedColumns, bgColorOdd = format.bgColorOdd, bgColorEven = format.bgColorEven;
21327
+ var hasBandedRows = format.hasBandedRows, hasBandedColumns = format.hasBandedColumns, bgColorOdd = format.bgColorOdd, bgColorEven = format.bgColorEven, hasFirstColumn = format.hasFirstColumn;
21181
21328
  rows.forEach(function (row, rowIndex) {
21182
- row.cells.forEach(function (cell, colIndex) {
21329
+ row.cells.forEach(function (readonlyCell, colIndex) {
21183
21330
  var _a;
21331
+ var cell = (0, mutate_1.mutateBlock)(readonlyCell);
21184
21332
  // Format Borders
21185
21333
  if (!metaOverrides.borderOverrides[rowIndex][colIndex] &&
21186
21334
  typeof format.tableBorderFormat == 'number') {
@@ -21207,46 +21355,76 @@ function formatCells(rows, format, metaOverrides) {
21207
21355
  }
21208
21356
  // Format Background Color
21209
21357
  if (!metaOverrides.bgColorOverrides[rowIndex][colIndex]) {
21210
- var color = hasBandedRows || hasBandedColumns
21211
- ? (hasBandedColumns && colIndex % 2 != 0) ||
21212
- (hasBandedRows && rowIndex % 2 != 0)
21213
- ? bgColorOdd
21214
- : bgColorEven
21215
- : bgColorEven; /* bgColorEven is the default color */
21358
+ var color = void 0;
21359
+ if (hasFirstColumn && colIndex == 0 && rowIndex > 0) {
21360
+ color = null;
21361
+ }
21362
+ else {
21363
+ color =
21364
+ hasBandedRows || hasBandedColumns
21365
+ ? (hasBandedColumns && colIndex % 2 != 0) ||
21366
+ (hasBandedRows && rowIndex % 2 != 0)
21367
+ ? bgColorOdd
21368
+ : bgColorEven
21369
+ : bgColorEven; /* bgColorEven is the default color */
21370
+ }
21216
21371
  (0, setTableCellBackgroundColor_1.setTableCellBackgroundColor)(cell, color, false /*isColorOverride*/, true /*applyToSegments*/);
21217
21372
  }
21218
21373
  // Format Vertical Align
21219
21374
  if (format.verticalAlign && !metaOverrides.vAlignOverrides[rowIndex][colIndex]) {
21220
21375
  cell.format.verticalAlign = format.verticalAlign;
21221
21376
  }
21377
+ // Format Header
21378
+ cell.isHeader = false;
21222
21379
  });
21223
21380
  });
21224
21381
  }
21225
- function setFirstColumnFormat(rows, format, metaOverrides) {
21382
+ /**
21383
+ * Set the first column format borders for the table as well as header property
21384
+ * @param rows The rows of the table
21385
+ * @param format The table metadata format
21386
+ */
21387
+ function setFirstColumnFormatBorders(rows, format) {
21388
+ // Exit early hasFirstColumn is not set
21389
+ if (!format.hasFirstColumn) {
21390
+ return;
21391
+ }
21226
21392
  rows.forEach(function (row, rowIndex) {
21227
- row.cells.forEach(function (cell, cellIndex) {
21228
- if (format.hasFirstColumn && cellIndex === 0) {
21393
+ row.cells.forEach(function (readonlyCell, cellIndex) {
21394
+ var cell = (0, mutate_1.mutateBlock)(readonlyCell);
21395
+ if (cellIndex === 0) {
21229
21396
  cell.isHeader = true;
21230
- if (rowIndex !== 0 && !metaOverrides.bgColorOverrides[rowIndex][cellIndex]) {
21231
- setBorderColor(cell.format, 'borderTop');
21232
- (0, setTableCellBackgroundColor_1.setTableCellBackgroundColor)(cell, null /*color*/, false /*isColorOverride*/, true /*applyToSegments*/);
21233
- }
21234
- if (rowIndex !== rows.length - 1 && rowIndex !== 0) {
21235
- setBorderColor(cell.format, 'borderBottom');
21397
+ switch (rowIndex) {
21398
+ case 0:
21399
+ cell.isHeader = !!format.hasHeaderRow;
21400
+ break;
21401
+ case rows.length - 1:
21402
+ setBorderColor(cell.format, 'borderTop');
21403
+ break;
21404
+ case 1:
21405
+ setBorderColor(cell.format, 'borderBottom');
21406
+ break;
21407
+ default:
21408
+ setBorderColor(cell.format, 'borderTop');
21409
+ setBorderColor(cell.format, 'borderBottom');
21410
+ break;
21236
21411
  }
21237
21412
  }
21238
- else {
21239
- cell.isHeader = false;
21240
- }
21241
21413
  });
21242
21414
  });
21243
21415
  }
21416
+ exports.setFirstColumnFormatBorders = setFirstColumnFormatBorders;
21244
21417
  function setHeaderRowFormat(rows, format, metaOverrides) {
21245
21418
  var _a;
21419
+ // Exit early if hasHeaderRow is not set
21420
+ if (!format.hasHeaderRow) {
21421
+ return;
21422
+ }
21246
21423
  var rowIndex = 0;
21247
- (_a = rows[rowIndex]) === null || _a === void 0 ? void 0 : _a.cells.forEach(function (cell, cellIndex) {
21248
- cell.isHeader = format.hasHeaderRow;
21249
- if (format.hasHeaderRow && format.headerRowColor) {
21424
+ (_a = rows[rowIndex]) === null || _a === void 0 ? void 0 : _a.cells.forEach(function (readonlyCell, cellIndex) {
21425
+ var cell = (0, mutate_1.mutateBlock)(readonlyCell);
21426
+ cell.isHeader = true;
21427
+ if (format.headerRowColor) {
21250
21428
  if (!metaOverrides.bgColorOverrides[rowIndex][cellIndex]) {
21251
21429
  (0, setTableCellBackgroundColor_1.setTableCellBackgroundColor)(cell, format.headerRowColor, false /*isColorOverride*/, true /*applyToSegments*/);
21252
21430
  }
@@ -21256,6 +21434,11 @@ function setHeaderRowFormat(rows, format, metaOverrides) {
21256
21434
  }
21257
21435
  });
21258
21436
  }
21437
+ /**
21438
+ * @param format The cell format to set the border color
21439
+ * @param key The border key to set the color
21440
+ * @param value The color to set. If not given, it removes the color and sets the style to transparent
21441
+ */
21259
21442
  function setBorderColor(format, key, value) {
21260
21443
  var border = (0, borderValues_1.extractBorderValues)(format[key]);
21261
21444
  border.color = value || '';
@@ -21425,10 +21608,11 @@ function cloneFormatContainer(container, options) {
21425
21608
  return newContainer;
21426
21609
  }
21427
21610
  function cloneListItem(item, options) {
21428
- var formatHolder = item.formatHolder, levels = item.levels;
21611
+ var formatHolder = item.formatHolder, levels = item.levels, cachedElement = item.cachedElement;
21429
21612
  return Object.assign({
21430
21613
  formatHolder: cloneSelectionMarker(formatHolder),
21431
21614
  levels: levels.map(cloneListLevel),
21615
+ cachedElement: handleCachedElement(cachedElement, 'cache', options),
21432
21616
  }, cloneBlockBase(item), cloneBlockGroupBase(item, options));
21433
21617
  }
21434
21618
  function cloneListLevel(level) {
@@ -21570,6 +21754,7 @@ var deleteBlock_1 = __webpack_require__(/*! ./deleteBlock */ "./packages/rooster
21570
21754
  var deleteSegment_1 = __webpack_require__(/*! ./deleteSegment */ "./packages/roosterjs-content-model-dom/lib/modelApi/editing/deleteSegment.ts");
21571
21755
  var getSegmentTextFormat_1 = __webpack_require__(/*! ./getSegmentTextFormat */ "./packages/roosterjs-content-model-dom/lib/modelApi/editing/getSegmentTextFormat.ts");
21572
21756
  var iterateSelections_1 = __webpack_require__(/*! ../selection/iterateSelections */ "./packages/roosterjs-content-model-dom/lib/modelApi/selection/iterateSelections.ts");
21757
+ var mutate_1 = __webpack_require__(/*! ../common/mutate */ "./packages/roosterjs-content-model-dom/lib/modelApi/common/mutate.ts");
21573
21758
  var setParagraphNotImplicit_1 = __webpack_require__(/*! ../block/setParagraphNotImplicit */ "./packages/roosterjs-content-model-dom/lib/modelApi/block/setParagraphNotImplicit.ts");
21574
21759
  var DeleteSelectionIteratingOptions = {
21575
21760
  contentUnderSelectedTableCell: 'ignoreForTableOrCell',
@@ -21587,19 +21772,20 @@ function deleteExpandedSelection(model, formatContext) {
21587
21772
  insertPoint: null,
21588
21773
  formatContext: formatContext,
21589
21774
  };
21590
- (0, iterateSelections_1.iterateSelections)(model, function (path, tableContext, block, segments) {
21775
+ (0, iterateSelections_1.iterateSelections)(model, function (path, tableContext, readonlyBlock, readonlySegments) {
21591
21776
  // Set paragraph, format and index for default position where we will put cursor to.
21592
21777
  // Later we can overwrite these info when process the selections
21593
21778
  var paragraph = (0, createParagraph_1.createParagraph)(true /*implicit*/, undefined /*blockFormat*/, model.format);
21594
21779
  var markerFormat = model.format;
21595
21780
  var insertMarkerIndex = 0;
21596
- if (segments) {
21781
+ if (readonlySegments && (readonlyBlock === null || readonlyBlock === void 0 ? void 0 : readonlyBlock.blockType) == 'Paragraph') {
21782
+ var _a = (0, tslib_1.__read)((0, mutate_1.mutateSegments)(readonlyBlock, readonlySegments), 3), block_1 = _a[0], segments = _a[1], indexes = _a[2];
21597
21783
  // Delete segments inside a paragraph
21598
- if (segments[0] && (block === null || block === void 0 ? void 0 : block.blockType) == 'Paragraph') {
21784
+ if (segments[0]) {
21599
21785
  // Now that we have found a paragraph with selections, we can overwrite the default paragraph with this one
21600
21786
  // so we can put cursor here after delete
21601
- paragraph = block;
21602
- insertMarkerIndex = paragraph.segments.indexOf(segments[0]);
21787
+ paragraph = block_1;
21788
+ insertMarkerIndex = indexes[0];
21603
21789
  markerFormat = (0, getSegmentTextFormat_1.getSegmentTextFormat)(segments[0]);
21604
21790
  context.lastParagraph = paragraph;
21605
21791
  context.lastTableContext = tableContext;
@@ -21609,9 +21795,9 @@ function deleteExpandedSelection(model, formatContext) {
21609
21795
  segment.segmentType == 'SelectionMarker') {
21610
21796
  // First time we hit a selection and it is a selection marker, just mark it and not need to delete
21611
21797
  // because this is possible a collapsed selection, then it will be handled later
21612
- context.insertPoint = createInsertPoint(segment, block, path, tableContext);
21798
+ context.insertPoint = createInsertPoint(segment, block_1, path, tableContext);
21613
21799
  }
21614
- else if ((0, deleteSegment_1.deleteSegment)(block, segment, context.formatContext)) {
21800
+ else if ((0, deleteSegment_1.deleteSegment)(block_1, segment, context.formatContext)) {
21615
21801
  context.deleteResult = 'range';
21616
21802
  }
21617
21803
  });
@@ -21619,27 +21805,26 @@ function deleteExpandedSelection(model, formatContext) {
21619
21805
  // Need to make it "not implicit" so that it will always have a container element, so that when we do normalization
21620
21806
  // of this paragraph, a BR can be added if need
21621
21807
  if (context.deleteResult == 'range') {
21622
- (0, setParagraphNotImplicit_1.setParagraphNotImplicit)(block);
21808
+ (0, setParagraphNotImplicit_1.setParagraphNotImplicit)(block_1);
21623
21809
  }
21624
21810
  }
21625
21811
  }
21626
- else if (block) {
21812
+ else if (readonlyBlock) {
21627
21813
  // Delete a whole block (divider, table, ...)
21628
- var blocks = path[0].blocks;
21629
- if ((0, deleteBlock_1.deleteBlock)(blocks, block, paragraph, context.formatContext)) {
21814
+ var blocks = (0, mutate_1.mutateBlock)(path[0]).blocks;
21815
+ if ((0, deleteBlock_1.deleteBlock)(blocks, readonlyBlock, paragraph, context.formatContext)) {
21630
21816
  context.deleteResult = 'range';
21631
21817
  }
21632
21818
  }
21633
21819
  else if (tableContext) {
21634
21820
  // Delete a whole table cell
21635
21821
  var table = tableContext.table, colIndex = tableContext.colIndex, rowIndex = tableContext.rowIndex;
21636
- var row = table.rows[rowIndex];
21637
- var cell = row.cells[colIndex];
21822
+ var mutableTable = (0, mutate_1.mutateBlock)(table);
21823
+ var row = mutableTable.rows[rowIndex];
21824
+ var cell = (0, mutate_1.mutateBlock)(row.cells[colIndex]);
21638
21825
  path = (0, tslib_1.__spreadArray)([cell], (0, tslib_1.__read)(path), false);
21639
21826
  paragraph.segments.push((0, createBr_1.createBr)(model.format));
21640
21827
  cell.blocks = [paragraph];
21641
- delete cell.cachedElement;
21642
- delete row.cachedElement;
21643
21828
  context.deleteResult = 'range';
21644
21829
  }
21645
21830
  if (!context.insertPoint) {
@@ -21675,28 +21860,30 @@ function createInsertPoint(marker, paragraph, path, tableContext) {
21675
21860
 
21676
21861
  Object.defineProperty(exports, "__esModule", ({ value: true }));
21677
21862
  exports.deleteSegment = void 0;
21863
+ var tslib_1 = __webpack_require__(/*! tslib */ "./node_modules/tslib/tslib.es6.mjs");
21678
21864
  var deleteSingleChar_1 = __webpack_require__(/*! ./deleteSingleChar */ "./packages/roosterjs-content-model-dom/lib/modelApi/editing/deleteSingleChar.ts");
21679
21865
  var isWhiteSpacePreserved_1 = __webpack_require__(/*! ../../domUtils/isWhiteSpacePreserved */ "./packages/roosterjs-content-model-dom/lib/domUtils/isWhiteSpacePreserved.ts");
21866
+ var mutate_1 = __webpack_require__(/*! ../common/mutate */ "./packages/roosterjs-content-model-dom/lib/modelApi/common/mutate.ts");
21680
21867
  var normalizeSegment_1 = __webpack_require__(/*! ../common/normalizeSegment */ "./packages/roosterjs-content-model-dom/lib/modelApi/common/normalizeSegment.ts");
21681
21868
  var stringUtil_1 = __webpack_require__(/*! ../../domUtils/stringUtil */ "./packages/roosterjs-content-model-dom/lib/domUtils/stringUtil.ts");
21682
21869
  /**
21683
21870
  * Delete a content model segment from current selection
21684
- * @param paragraph Parent paragraph of the segment to delete
21685
- * @param segmentToDelete The segment to delete
21871
+ * @param readonlyParagraph Parent paragraph of the segment to delete
21872
+ * @param readonlySegmentToDelete The segment to delete
21686
21873
  * @param context @optional Context object provided by formatContentModel API
21687
21874
  * @param direction @optional Whether this is deleting forward or backward. This is only used for deleting entity.
21688
21875
  * If not specified, only selected entity will be deleted
21689
21876
  */
21690
- function deleteSegment(paragraph, segmentToDelete, context, direction) {
21877
+ function deleteSegment(readonlyParagraph, readonlySegmentToDelete, context, direction) {
21878
+ var _a = (0, tslib_1.__read)((0, mutate_1.mutateSegment)(readonlyParagraph, readonlySegmentToDelete), 3), paragraph = _a[0], segmentToDelete = _a[1], index = _a[2];
21691
21879
  var segments = paragraph.segments;
21692
- var index = segments.indexOf(segmentToDelete);
21693
21880
  var preserveWhiteSpace = (0, isWhiteSpacePreserved_1.isWhiteSpacePreserved)(paragraph.format.whiteSpace);
21694
21881
  var isForward = direction == 'forward';
21695
21882
  var isBackward = direction == 'backward';
21696
21883
  if (!preserveWhiteSpace) {
21697
- normalizePreviousSegment(segments, index);
21884
+ normalizePreviousSegment(paragraph, segments, index);
21698
21885
  }
21699
- switch (segmentToDelete.segmentType) {
21886
+ switch (segmentToDelete === null || segmentToDelete === void 0 ? void 0 : segmentToDelete.segmentType) {
21700
21887
  case 'Br':
21701
21888
  case 'Image':
21702
21889
  case 'SelectionMarker':
@@ -21744,10 +21931,12 @@ function deleteSegment(paragraph, segmentToDelete, context, direction) {
21744
21931
  else {
21745
21932
  return false;
21746
21933
  }
21934
+ default:
21935
+ return false;
21747
21936
  }
21748
21937
  }
21749
21938
  exports.deleteSegment = deleteSegment;
21750
- function normalizePreviousSegment(segments, currentIndex) {
21939
+ function normalizePreviousSegment(paragraph, segments, currentIndex) {
21751
21940
  var _a;
21752
21941
  var index = currentIndex - 1;
21753
21942
  while (((_a = segments[index]) === null || _a === void 0 ? void 0 : _a.segmentType) == 'SelectionMarker') {
@@ -21755,7 +21944,7 @@ function normalizePreviousSegment(segments, currentIndex) {
21755
21944
  }
21756
21945
  var segment = segments[index];
21757
21946
  if (segment) {
21758
- (0, normalizeSegment_1.normalizeSingleSegment)(segment);
21947
+ (0, normalizeSegment_1.normalizeSingleSegment)(paragraph, segment);
21759
21948
  }
21760
21949
  }
21761
21950
 
@@ -21774,6 +21963,7 @@ Object.defineProperty(exports, "__esModule", ({ value: true }));
21774
21963
  exports.deleteSelection = void 0;
21775
21964
  var tslib_1 = __webpack_require__(/*! tslib */ "./node_modules/tslib/tslib.es6.mjs");
21776
21965
  var deleteExpandedSelection_1 = __webpack_require__(/*! ./deleteExpandedSelection */ "./packages/roosterjs-content-model-dom/lib/modelApi/editing/deleteExpandedSelection.ts");
21966
+ var mutate_1 = __webpack_require__(/*! ../common/mutate */ "./packages/roosterjs-content-model-dom/lib/modelApi/common/mutate.ts");
21777
21967
  /**
21778
21968
  * Delete selected content from Content Model
21779
21969
  * @param model The model to delete selected content from
@@ -21806,8 +21996,9 @@ function mergeParagraphAfterDelete(context) {
21806
21996
  lastParagraph &&
21807
21997
  lastParagraph != insertPoint.paragraph &&
21808
21998
  lastTableContext == insertPoint.tableContext) {
21809
- (_a = insertPoint.paragraph.segments).push.apply(_a, (0, tslib_1.__spreadArray)([], (0, tslib_1.__read)(lastParagraph.segments), false));
21810
- lastParagraph.segments = [];
21999
+ var mutableLastParagraph = (0, mutate_1.mutateBlock)(lastParagraph);
22000
+ (_a = (0, mutate_1.mutateBlock)(insertPoint.paragraph).segments).push.apply(_a, (0, tslib_1.__spreadArray)([], (0, tslib_1.__read)(mutableLastParagraph.segments), false));
22001
+ mutableLastParagraph.segments = [];
21811
22002
  }
21812
22003
  }
21813
22004
 
@@ -21994,9 +22185,25 @@ var createTableCell_1 = __webpack_require__(/*! ../creators/createTableCell */ "
21994
22185
  var deleteSelection_1 = __webpack_require__(/*! ./deleteSelection */ "./packages/roosterjs-content-model-dom/lib/modelApi/editing/deleteSelection.ts");
21995
22186
  var getClosestAncestorBlockGroupIndex_1 = __webpack_require__(/*! ./getClosestAncestorBlockGroupIndex */ "./packages/roosterjs-content-model-dom/lib/modelApi/editing/getClosestAncestorBlockGroupIndex.ts");
21996
22187
  var getObjectKeys_1 = __webpack_require__(/*! ../..//domUtils/getObjectKeys */ "./packages/roosterjs-content-model-dom/lib/domUtils/getObjectKeys.ts");
22188
+ var mutate_1 = __webpack_require__(/*! ../common/mutate */ "./packages/roosterjs-content-model-dom/lib/modelApi/common/mutate.ts");
21997
22189
  var normalizeContentModel_1 = __webpack_require__(/*! ../common/normalizeContentModel */ "./packages/roosterjs-content-model-dom/lib/modelApi/common/normalizeContentModel.ts");
21998
22190
  var normalizeTable_1 = __webpack_require__(/*! ./normalizeTable */ "./packages/roosterjs-content-model-dom/lib/modelApi/editing/normalizeTable.ts");
21999
22191
  var HeadingTags = ['h1', 'h2', 'h3', 'h4', 'h5', 'h6'];
22192
+ // An object to provide keys of required properties of segment format, do NOT use any of its values
22193
+ var RequiredEmptySegmentFormat = {
22194
+ backgroundColor: null,
22195
+ fontFamily: null,
22196
+ fontSize: null,
22197
+ fontWeight: null,
22198
+ italic: null,
22199
+ letterSpacing: null,
22200
+ lineHeight: null,
22201
+ strikethrough: null,
22202
+ superOrSubScriptSequence: null,
22203
+ textColor: null,
22204
+ underline: null,
22205
+ };
22206
+ var KeysOfSegmentFormat = (0, getObjectKeys_1.getObjectKeys)(RequiredEmptySegmentFormat);
22000
22207
  /**
22001
22208
  * Merge source model into target mode
22002
22209
  * @param target Target Content Model that will merge content into
@@ -22102,7 +22309,8 @@ function mergeTable(markerPosition, newTable, source) {
22102
22309
  var _a, _b;
22103
22310
  var tableContext = markerPosition.tableContext, marker = markerPosition.marker;
22104
22311
  if (tableContext && source.blocks.length == 1 && source.blocks[0] == newTable) {
22105
- var table = tableContext.table, colIndex = tableContext.colIndex, rowIndex = tableContext.rowIndex;
22312
+ var readonlyTable = tableContext.table, colIndex = tableContext.colIndex, rowIndex = tableContext.rowIndex;
22313
+ var table = (0, mutate_1.mutateBlock)(readonlyTable);
22106
22314
  for (var i = 0; i < newTable.rows.length; i++) {
22107
22315
  for (var j = 0; j < newTable.rows[i].cells.length; j++) {
22108
22316
  var newCell = newTable.rows[i].cells[j];
@@ -22154,7 +22362,7 @@ function mergeList(markerPosition, newList) {
22154
22362
  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
22155
22363
  var blockIndex = listParent.blocks.indexOf(listItem || paragraph);
22156
22364
  if (blockIndex >= 0) {
22157
- listParent.blocks.splice(blockIndex, 0, newList);
22365
+ (0, mutate_1.mutateBlock)(listParent).blocks.splice(blockIndex, 0, newList);
22158
22366
  }
22159
22367
  if (listItem) {
22160
22368
  listItem === null || listItem === void 0 ? void 0 : listItem.levels.forEach(function (level, i) {
@@ -22171,7 +22379,7 @@ function splitParagraph(markerPosition, newParaFormat) {
22171
22379
  newParagraph.segments = paragraph.segments.splice(segmentIndex);
22172
22380
  }
22173
22381
  if (paraIndex >= 0) {
22174
- path[0].blocks.splice(paraIndex + 1, 0, newParagraph);
22382
+ (0, mutate_1.mutateBlock)(path[0]).blocks.splice(paraIndex + 1, 0, newParagraph);
22175
22383
  }
22176
22384
  var listItemIndex = (0, getClosestAncestorBlockGroupIndex_1.getClosestAncestorBlockGroupIndex)(path, ['ListItem'], ['FormatContainer', 'TableCell']);
22177
22385
  var listItem = path[listItemIndex];
@@ -22184,7 +22392,7 @@ function splitParagraph(markerPosition, newParaFormat) {
22184
22392
  newListItem.blocks = listItem.blocks.splice(paraIndex + 1);
22185
22393
  }
22186
22394
  if (blockIndex >= 0) {
22187
- listParent.blocks.splice(blockIndex + 1, 0, newListItem);
22395
+ (0, mutate_1.mutateBlock)(listParent).blocks.splice(blockIndex + 1, 0, newListItem);
22188
22396
  }
22189
22397
  path[listItemIndex] = newListItem;
22190
22398
  }
@@ -22198,7 +22406,7 @@ function insertBlock(markerPosition, block) {
22198
22406
  var newPara = splitParagraph(markerPosition, newParaFormat);
22199
22407
  var blockIndex = path[0].blocks.indexOf(newPara);
22200
22408
  if (blockIndex >= 0) {
22201
- path[0].blocks.splice(blockIndex, 0, block);
22409
+ (0, mutate_1.mutateBlock)(path[0]).blocks.splice(blockIndex, 0, block);
22202
22410
  }
22203
22411
  }
22204
22412
  function applyDefaultFormat(group, format, applyDefaultFormatOption) {
@@ -22208,7 +22416,7 @@ function applyDefaultFormat(group, format, applyDefaultFormatOption) {
22208
22416
  switch (block.blockType) {
22209
22417
  case 'BlockGroup':
22210
22418
  if (block.blockGroupType == 'ListItem') {
22211
- block.formatHolder.format = mergeSegmentFormat(applyDefaultFormatOption, format, block.formatHolder.format);
22419
+ (0, mutate_1.mutateBlock)(block).formatHolder.format = mergeSegmentFormat(applyDefaultFormatOption, format, block.formatHolder.format);
22212
22420
  }
22213
22421
  applyDefaultFormat(block, format, applyDefaultFormatOption);
22214
22422
  break;
@@ -22221,14 +22429,18 @@ function applyDefaultFormat(group, format, applyDefaultFormatOption) {
22221
22429
  break;
22222
22430
  case 'Paragraph':
22223
22431
  var paragraphFormat_1 = ((_a = block.decorator) === null || _a === void 0 ? void 0 : _a.format) || {};
22224
- block.segments.forEach(function (segment) {
22432
+ var paragraph = (0, mutate_1.mutateBlock)(block);
22433
+ paragraph.segments.forEach(function (segment) {
22225
22434
  if (segment.segmentType == 'General') {
22226
22435
  applyDefaultFormat(segment, format, applyDefaultFormatOption);
22227
22436
  }
22228
22437
  segment.format = mergeSegmentFormat(applyDefaultFormatOption, format, (0, tslib_1.__assign)((0, tslib_1.__assign)({}, paragraphFormat_1), segment.format));
22438
+ if (segment.link) {
22439
+ segment.link.format = mergeSegmentFormat(applyDefaultFormatOption, getSegmentFormatInLinkFormat(format), segment.link.format);
22440
+ }
22229
22441
  });
22230
22442
  if (applyDefaultFormatOption === 'keepSourceEmphasisFormat') {
22231
- delete block.decorator;
22443
+ delete paragraph.decorator;
22232
22444
  }
22233
22445
  break;
22234
22446
  }
@@ -22236,12 +22448,29 @@ function applyDefaultFormat(group, format, applyDefaultFormatOption) {
22236
22448
  }
22237
22449
  function mergeBlockFormat(applyDefaultFormatOption, block) {
22238
22450
  if (applyDefaultFormatOption == 'keepSourceEmphasisFormat' && block.format.backgroundColor) {
22239
- delete block.format.backgroundColor;
22451
+ delete (0, mutate_1.mutateBlock)(block).format.backgroundColor;
22240
22452
  }
22241
22453
  }
22242
- function mergeSegmentFormat(applyDefaultFormatOption, targetformat, sourceFormat) {
22454
+ /**
22455
+ * Hyperlink format type definition only contains textColor, backgroundColor and underline.
22456
+ * So create a minimum object with the styles supported in Hyperlink to be used in merge.
22457
+ */
22458
+ function getSegmentFormatInLinkFormat(targetFormat) {
22459
+ var result = {};
22460
+ if (targetFormat.textColor) {
22461
+ result.textColor = targetFormat.textColor;
22462
+ }
22463
+ if (targetFormat.backgroundColor) {
22464
+ result.backgroundColor = targetFormat.backgroundColor;
22465
+ }
22466
+ if (targetFormat.underline) {
22467
+ result.underline = targetFormat.underline;
22468
+ }
22469
+ return result;
22470
+ }
22471
+ function mergeSegmentFormat(applyDefaultFormatOption, targetFormat, sourceFormat) {
22243
22472
  return applyDefaultFormatOption == 'mergeAll'
22244
- ? (0, tslib_1.__assign)((0, tslib_1.__assign)({}, targetformat), sourceFormat) : (0, tslib_1.__assign)((0, tslib_1.__assign)({}, targetformat), getSemanticFormat(sourceFormat));
22473
+ ? (0, tslib_1.__assign)((0, tslib_1.__assign)({}, targetFormat), sourceFormat) : (0, tslib_1.__assign)((0, tslib_1.__assign)((0, tslib_1.__assign)({}, getFormatWithoutSegmentFormat(sourceFormat)), targetFormat), getSemanticFormat(sourceFormat));
22245
22474
  }
22246
22475
  function getSemanticFormat(segmentFormat) {
22247
22476
  var result = {};
@@ -22257,6 +22486,15 @@ function getSemanticFormat(segmentFormat) {
22257
22486
  }
22258
22487
  return result;
22259
22488
  }
22489
+ /**
22490
+ * Segment format can also contain other type of metadata, for example in Images/Hyperlink,
22491
+ * we want to preserve these properties when merging format
22492
+ */
22493
+ function getFormatWithoutSegmentFormat(sourceFormat) {
22494
+ var resultFormat = (0, tslib_1.__assign)({}, sourceFormat);
22495
+ KeysOfSegmentFormat.forEach(function (key) { return delete resultFormat[key]; });
22496
+ return resultFormat;
22497
+ }
22260
22498
 
22261
22499
 
22262
22500
  /***/ }),
@@ -22276,6 +22514,7 @@ var addBlock_1 = __webpack_require__(/*! ../common/addBlock */ "./packages/roost
22276
22514
  var addSegment_1 = __webpack_require__(/*! ../common/addSegment */ "./packages/roosterjs-content-model-dom/lib/modelApi/common/addSegment.ts");
22277
22515
  var createBr_1 = __webpack_require__(/*! ../creators/createBr */ "./packages/roosterjs-content-model-dom/lib/modelApi/creators/createBr.ts");
22278
22516
  var createParagraph_1 = __webpack_require__(/*! ../creators/createParagraph */ "./packages/roosterjs-content-model-dom/lib/modelApi/creators/createParagraph.ts");
22517
+ var mutate_1 = __webpack_require__(/*! ../common/mutate */ "./packages/roosterjs-content-model-dom/lib/modelApi/common/mutate.ts");
22279
22518
  /**
22280
22519
  * Minimum width for a table cell
22281
22520
  */
@@ -22284,16 +22523,17 @@ var MIN_HEIGHT = 22;
22284
22523
  /**
22285
22524
  * Normalize a Content Model table, make sure:
22286
22525
  * 1. Fist cells are not spanned
22287
- * 2. Inner cells are not header
22526
+ * 2. Only first column and row can have headers
22288
22527
  * 3. All cells have content and width
22289
22528
  * 4. Table and table row have correct width/height
22290
22529
  * 5. Spanned cell has no child blocks
22291
22530
  * 6. default format is correctly applied
22292
- * @param table The table to normalize
22531
+ * @param readonlyTable The table to normalize
22293
22532
  * @param defaultSegmentFormat @optional Default segment format to apply to cell
22294
22533
  */
22295
- function normalizeTable(table, defaultSegmentFormat) {
22534
+ function normalizeTable(readonlyTable, defaultSegmentFormat) {
22296
22535
  var _a;
22536
+ var table = (0, mutate_1.mutateBlock)(readonlyTable);
22297
22537
  // Always collapse border and use border box for table in roosterjs to make layout simpler
22298
22538
  var format = table.format;
22299
22539
  if (!format.borderCollapse || !format.useBorderBox) {
@@ -22304,7 +22544,8 @@ function normalizeTable(table, defaultSegmentFormat) {
22304
22544
  // Make sure all inner cells are not header
22305
22545
  // Make sure all cells have content and width
22306
22546
  table.rows.forEach(function (row, rowIndex) {
22307
- row.cells.forEach(function (cell, colIndex) {
22547
+ row.cells.forEach(function (readonlyCell, colIndex) {
22548
+ var cell = (0, mutate_1.mutateBlock)(readonlyCell);
22308
22549
  if (cell.blocks.length == 0) {
22309
22550
  var format_1 = cell.format.textColor
22310
22551
  ? (0, tslib_1.__assign)((0, tslib_1.__assign)({}, defaultSegmentFormat), { textColor: cell.format.textColor }) : defaultSegmentFormat;
@@ -22314,7 +22555,7 @@ function normalizeTable(table, defaultSegmentFormat) {
22314
22555
  if (rowIndex == 0) {
22315
22556
  cell.spanAbove = false;
22316
22557
  }
22317
- else if (rowIndex > 0 && cell.isHeader) {
22558
+ else if (rowIndex > 0 && colIndex > 0 && cell.isHeader) {
22318
22559
  cell.isHeader = false;
22319
22560
  delete cell.cachedElement;
22320
22561
  }
@@ -22390,8 +22631,8 @@ function tryMoveBlocks(targetCell, sourceCell) {
22390
22631
  var _a;
22391
22632
  var onlyHasEmptyOrBr = sourceCell.blocks.every(function (block) { return block.blockType == 'Paragraph' && hasOnlyBrSegment(block.segments); });
22392
22633
  if (!onlyHasEmptyOrBr) {
22393
- (_a = targetCell.blocks).push.apply(_a, (0, tslib_1.__spreadArray)([], (0, tslib_1.__read)(sourceCell.blocks), false));
22394
- sourceCell.blocks = [];
22634
+ (_a = (0, mutate_1.mutateBlock)(targetCell).blocks).push.apply(_a, (0, tslib_1.__spreadArray)([], (0, tslib_1.__read)(sourceCell.blocks), false));
22635
+ (0, mutate_1.mutateBlock)(sourceCell).blocks = [];
22395
22636
  }
22396
22637
  }
22397
22638
  function hasOnlyBrSegment(segments) {
@@ -22412,12 +22653,13 @@ function hasOnlyBrSegment(segments) {
22412
22653
 
22413
22654
  Object.defineProperty(exports, "__esModule", ({ value: true }));
22414
22655
  exports.retrieveModelFormatState = void 0;
22656
+ var tslib_1 = __webpack_require__(/*! tslib */ "./node_modules/tslib/tslib.es6.mjs");
22415
22657
  var borderValues_1 = __webpack_require__(/*! ../../domUtils/style/borderValues */ "./packages/roosterjs-content-model-dom/lib/domUtils/style/borderValues.ts");
22416
22658
  var getClosestAncestorBlockGroupIndex_1 = __webpack_require__(/*! ./getClosestAncestorBlockGroupIndex */ "./packages/roosterjs-content-model-dom/lib/modelApi/editing/getClosestAncestorBlockGroupIndex.ts");
22659
+ var updateTableMetadata_1 = __webpack_require__(/*! ../metadata/updateTableMetadata */ "./packages/roosterjs-content-model-dom/lib/modelApi/metadata/updateTableMetadata.ts");
22417
22660
  var isBold_1 = __webpack_require__(/*! ../../domUtils/style/isBold */ "./packages/roosterjs-content-model-dom/lib/domUtils/style/isBold.ts");
22418
22661
  var iterateSelections_1 = __webpack_require__(/*! ../selection/iterateSelections */ "./packages/roosterjs-content-model-dom/lib/modelApi/selection/iterateSelections.ts");
22419
22662
  var parseValueWithUnit_1 = __webpack_require__(/*! ../../formatHandlers/utils/parseValueWithUnit */ "./packages/roosterjs-content-model-dom/lib/formatHandlers/utils/parseValueWithUnit.ts");
22420
- var updateTableMetadata_1 = __webpack_require__(/*! ../metadata/updateTableMetadata */ "./packages/roosterjs-content-model-dom/lib/modelApi/metadata/updateTableMetadata.ts");
22421
22663
  /**
22422
22664
  * Retrieve format state from the given Content Model
22423
22665
  * @param model The Content Model to retrieve format state from
@@ -22449,10 +22691,10 @@ function retrieveModelFormatState(model, pendingFormat, formatState) {
22449
22691
  segments === null || segments === void 0 ? void 0 : segments.forEach(function (segment) {
22450
22692
  var _a, _b, _c;
22451
22693
  if (isFirstSegment || segment.segmentType != 'SelectionMarker') {
22452
- var modelFormat = Object.assign({}, model.format);
22453
- modelFormat === null || modelFormat === void 0 ? true : delete modelFormat.italic;
22454
- modelFormat === null || modelFormat === void 0 ? true : delete modelFormat.underline;
22455
- modelFormat === null || modelFormat === void 0 ? true : delete modelFormat.fontWeight;
22694
+ var modelFormat = (0, tslib_1.__assign)({}, model.format);
22695
+ delete modelFormat.italic;
22696
+ delete modelFormat.underline;
22697
+ delete modelFormat.fontWeight;
22456
22698
  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));
22457
22699
  mergeValue(formatState, 'isCodeInline', !!(segment === null || segment === void 0 ? void 0 : segment.code), isFirst);
22458
22700
  }
@@ -22543,7 +22785,7 @@ function retrieveStructureFormat(result, path, isFirst) {
22543
22785
  ((_b = path[containerIndex]) === null || _b === void 0 ? void 0 : _b.tagName) == 'blockquote', isFirst);
22544
22786
  }
22545
22787
  function retrieveTableFormat(tableContext, result) {
22546
- var tableFormat = (0, updateTableMetadata_1.updateTableMetadata)(tableContext.table);
22788
+ var tableFormat = (0, updateTableMetadata_1.getTableMetadata)(tableContext.table);
22547
22789
  result.isInTable = true;
22548
22790
  result.tableHasHeader = tableContext.table.rows.some(function (row) {
22549
22791
  return row.cells.some(function (cell) { return cell.isHeader; });
@@ -22601,6 +22843,7 @@ function px2Pt(px) {
22601
22843
  Object.defineProperty(exports, "__esModule", ({ value: true }));
22602
22844
  exports.setTableCellBackgroundColor = void 0;
22603
22845
  var tslib_1 = __webpack_require__(/*! tslib */ "./node_modules/tslib/tslib.es6.mjs");
22846
+ var mutate_1 = __webpack_require__(/*! ../common/mutate */ "./packages/roosterjs-content-model-dom/lib/modelApi/common/mutate.ts");
22604
22847
  var color_1 = __webpack_require__(/*! ../../formatHandlers/utils/color */ "./packages/roosterjs-content-model-dom/lib/formatHandlers/utils/color.ts");
22605
22848
  var updateTableCellMetadata_1 = __webpack_require__(/*! ../metadata/updateTableCellMetadata */ "./packages/roosterjs-content-model-dom/lib/modelApi/metadata/updateTableCellMetadata.ts");
22606
22849
  // Using the HSL (hue, saturation and lightness) representation for RGB color values.
@@ -22652,9 +22895,10 @@ function setTableCellBackgroundColor(cell, color, isColorOverride, applyToSegmen
22652
22895
  }
22653
22896
  exports.setTableCellBackgroundColor = setTableCellBackgroundColor;
22654
22897
  function removeAdaptiveCellColor(cell) {
22655
- cell.blocks.forEach(function (block) {
22898
+ cell.blocks.forEach(function (readonlyBlock) {
22656
22899
  var _a, _b;
22657
- if (block.blockType == 'Paragraph') {
22900
+ if (readonlyBlock.blockType == 'Paragraph') {
22901
+ var block = (0, mutate_1.mutateBlock)(readonlyBlock);
22658
22902
  if (((_a = block.segmentFormat) === null || _a === void 0 ? void 0 : _a.textColor) &&
22659
22903
  shouldRemoveColor((_b = block.segmentFormat) === null || _b === void 0 ? void 0 : _b.textColor, cell.format.backgroundColor || '')) {
22660
22904
  delete block.segmentFormat.textColor;
@@ -22670,9 +22914,10 @@ function removeAdaptiveCellColor(cell) {
22670
22914
  }
22671
22915
  function setAdaptiveCellColor(cell) {
22672
22916
  if (cell.format.textColor) {
22673
- cell.blocks.forEach(function (block) {
22917
+ cell.blocks.forEach(function (readonlyBlock) {
22674
22918
  var _a;
22675
- if (block.blockType == 'Paragraph') {
22919
+ if (readonlyBlock.blockType == 'Paragraph') {
22920
+ var block = (0, mutate_1.mutateBlock)(readonlyBlock);
22676
22921
  if (!((_a = block.segmentFormat) === null || _a === void 0 ? void 0 : _a.textColor)) {
22677
22922
  block.segmentFormat = (0, tslib_1.__assign)((0, tslib_1.__assign)({}, block.segmentFormat), { textColor: cell.format.textColor });
22678
22923
  }
@@ -23004,7 +23249,7 @@ exports.createObjectDefinition = createObjectDefinition;
23004
23249
  "use strict";
23005
23250
 
23006
23251
  Object.defineProperty(exports, "__esModule", ({ value: true }));
23007
- exports.updateImageMetadata = void 0;
23252
+ exports.updateImageMetadata = exports.getImageMetadata = void 0;
23008
23253
  var updateMetadata_1 = __webpack_require__(/*! ./updateMetadata */ "./packages/roosterjs-content-model-dom/lib/modelApi/metadata/updateMetadata.ts");
23009
23254
  var definitionCreators_1 = __webpack_require__(/*! ./definitionCreators */ "./packages/roosterjs-content-model-dom/lib/modelApi/metadata/definitionCreators.ts");
23010
23255
  var NumberDefinition = (0, definitionCreators_1.createNumberDefinition)();
@@ -23020,6 +23265,14 @@ var ImageMetadataFormatDefinition = (0, definitionCreators_1.createObjectDefinit
23020
23265
  naturalHeight: NumberDefinition,
23021
23266
  naturalWidth: NumberDefinition,
23022
23267
  });
23268
+ /**
23269
+ * Get image metadata
23270
+ * @param image The image Content Model
23271
+ */
23272
+ function getImageMetadata(image) {
23273
+ return (0, updateMetadata_1.getMetadata)(image, ImageMetadataFormatDefinition);
23274
+ }
23275
+ exports.getImageMetadata = getImageMetadata;
23023
23276
  /**
23024
23277
  * Update image metadata with a callback
23025
23278
  * @param image The image Content Model
@@ -23042,10 +23295,10 @@ exports.updateImageMetadata = updateImageMetadata;
23042
23295
  "use strict";
23043
23296
 
23044
23297
  Object.defineProperty(exports, "__esModule", ({ value: true }));
23045
- exports.updateListMetadata = exports.ListMetadataDefinition = void 0;
23298
+ exports.updateListMetadata = exports.getListMetadata = exports.ListMetadataDefinition = void 0;
23046
23299
  var BulletListType_1 = __webpack_require__(/*! ../../constants/BulletListType */ "./packages/roosterjs-content-model-dom/lib/constants/BulletListType.ts");
23047
- var NumberingListType_1 = __webpack_require__(/*! ../../constants/NumberingListType */ "./packages/roosterjs-content-model-dom/lib/constants/NumberingListType.ts");
23048
23300
  var updateMetadata_1 = __webpack_require__(/*! ./updateMetadata */ "./packages/roosterjs-content-model-dom/lib/modelApi/metadata/updateMetadata.ts");
23301
+ var NumberingListType_1 = __webpack_require__(/*! ../../constants/NumberingListType */ "./packages/roosterjs-content-model-dom/lib/constants/NumberingListType.ts");
23049
23302
  var definitionCreators_1 = __webpack_require__(/*! ./definitionCreators */ "./packages/roosterjs-content-model-dom/lib/modelApi/metadata/definitionCreators.ts");
23050
23303
  /**
23051
23304
  * Metadata definition for List
@@ -23055,6 +23308,14 @@ exports.ListMetadataDefinition = (0, definitionCreators_1.createObjectDefinition
23055
23308
  unorderedStyleType: (0, definitionCreators_1.createNumberDefinition)(true /** isOptional */, undefined /** value **/, BulletListType_1.BulletListType.Min, BulletListType_1.BulletListType.Max),
23056
23309
  applyListStyleFromLevel: (0, definitionCreators_1.createBooleanDefinition)(true /*isOptional*/),
23057
23310
  }, true /** isOptional */, true /** allowNull */);
23311
+ /**
23312
+ * Get list metadata
23313
+ * @param list The list Content Model (metadata holder)
23314
+ */
23315
+ function getListMetadata(list) {
23316
+ return (0, updateMetadata_1.getMetadata)(list, exports.ListMetadataDefinition);
23317
+ }
23318
+ exports.getListMetadata = getListMetadata;
23058
23319
  /**
23059
23320
  * Update list metadata with a callback
23060
23321
  * @param list The list Content Model (metadata holder)
@@ -23077,26 +23338,34 @@ exports.updateListMetadata = updateListMetadata;
23077
23338
  "use strict";
23078
23339
 
23079
23340
  Object.defineProperty(exports, "__esModule", ({ value: true }));
23080
- exports.hasMetadata = exports.updateMetadata = void 0;
23341
+ exports.hasMetadata = exports.updateMetadata = exports.getMetadata = void 0;
23081
23342
  var validate_1 = __webpack_require__(/*! ./validate */ "./packages/roosterjs-content-model-dom/lib/modelApi/metadata/validate.ts");
23082
23343
  var EditingInfoDatasetName = 'editingInfo';
23083
23344
  /**
23084
- * Update metadata of the given model
23085
- * @param model The model to update metadata to
23086
- * @param callback A callback function to update metadata
23087
- * @param definition @optional Metadata definition used for verify the metadata object
23088
- * @returns The metadata object if any, or null
23345
+ * Retrieve metadata from the given model.
23346
+ * @param model The Content Model to retrieve metadata from
23347
+ * @param definition Definition of this metadata type, used for validate the metadata object
23348
+ * @returns Metadata of the model, or null if it does not contain a valid metadata
23089
23349
  */
23090
- function updateMetadata(model, callback, definition) {
23350
+ function getMetadata(model, definition) {
23091
23351
  var metadataString = model.dataset[EditingInfoDatasetName];
23092
23352
  var obj = null;
23093
23353
  try {
23094
23354
  obj = JSON.parse(metadataString);
23095
23355
  }
23096
23356
  catch (_a) { }
23097
- if (definition && !(0, validate_1.validate)(obj, definition)) {
23098
- obj = null;
23099
- }
23357
+ return !definition || (0, validate_1.validate)(obj, definition) ? obj : null;
23358
+ }
23359
+ exports.getMetadata = getMetadata;
23360
+ /**
23361
+ * Update metadata of the given model
23362
+ * @param model The model to update metadata to
23363
+ * @param callback A callback function to update metadata
23364
+ * @param definition @optional Metadata definition used for verify the metadata object
23365
+ * @returns The metadata object if any, or null
23366
+ */
23367
+ function updateMetadata(model, callback, definition) {
23368
+ var obj = getMetadata(model, definition);
23100
23369
  if (callback) {
23101
23370
  obj = callback(obj);
23102
23371
  if (!obj) {
@@ -23130,7 +23399,7 @@ exports.hasMetadata = hasMetadata;
23130
23399
  "use strict";
23131
23400
 
23132
23401
  Object.defineProperty(exports, "__esModule", ({ value: true }));
23133
- exports.updateTableCellMetadata = void 0;
23402
+ exports.updateTableCellMetadata = exports.getTableCellMetadata = void 0;
23134
23403
  var definitionCreators_1 = __webpack_require__(/*! ./definitionCreators */ "./packages/roosterjs-content-model-dom/lib/modelApi/metadata/definitionCreators.ts");
23135
23404
  var updateMetadata_1 = __webpack_require__(/*! ./updateMetadata */ "./packages/roosterjs-content-model-dom/lib/modelApi/metadata/updateMetadata.ts");
23136
23405
  var TableCellMetadataFormatDefinition = (0, definitionCreators_1.createObjectDefinition)({
@@ -23138,6 +23407,14 @@ var TableCellMetadataFormatDefinition = (0, definitionCreators_1.createObjectDef
23138
23407
  vAlignOverride: (0, definitionCreators_1.createBooleanDefinition)(true /** isOptional */),
23139
23408
  borderOverride: (0, definitionCreators_1.createBooleanDefinition)(true /** isOptional */),
23140
23409
  }, false /* isOptional */, true /** allowNull */);
23410
+ /**
23411
+ * Get table cell metadata
23412
+ * @param cell The table cell Content Model
23413
+ */
23414
+ function getTableCellMetadata(cell) {
23415
+ return (0, updateMetadata_1.getMetadata)(cell, TableCellMetadataFormatDefinition);
23416
+ }
23417
+ exports.getTableCellMetadata = getTableCellMetadata;
23141
23418
  /**
23142
23419
  * Update table cell metadata with a callback
23143
23420
  * @param cell The table cell Content Model
@@ -23160,9 +23437,9 @@ exports.updateTableCellMetadata = updateTableCellMetadata;
23160
23437
  "use strict";
23161
23438
 
23162
23439
  Object.defineProperty(exports, "__esModule", ({ value: true }));
23163
- exports.updateTableMetadata = void 0;
23164
- var TableBorderFormat_1 = __webpack_require__(/*! ../../constants/TableBorderFormat */ "./packages/roosterjs-content-model-dom/lib/constants/TableBorderFormat.ts");
23440
+ exports.updateTableMetadata = exports.getTableMetadata = void 0;
23165
23441
  var updateMetadata_1 = __webpack_require__(/*! ./updateMetadata */ "./packages/roosterjs-content-model-dom/lib/modelApi/metadata/updateMetadata.ts");
23442
+ var TableBorderFormat_1 = __webpack_require__(/*! ../../constants/TableBorderFormat */ "./packages/roosterjs-content-model-dom/lib/constants/TableBorderFormat.ts");
23166
23443
  var definitionCreators_1 = __webpack_require__(/*! ./definitionCreators */ "./packages/roosterjs-content-model-dom/lib/modelApi/metadata/definitionCreators.ts");
23167
23444
  var NullStringDefinition = (0, definitionCreators_1.createStringDefinition)(false /** isOptional */, undefined /** value */, true /** allowNull */);
23168
23445
  var BooleanDefinition = (0, definitionCreators_1.createBooleanDefinition)(false /** isOptional */);
@@ -23180,6 +23457,14 @@ var TableFormatDefinition = (0, definitionCreators_1.createObjectDefinition)({
23180
23457
  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 */),
23181
23458
  verticalAlign: NullStringDefinition,
23182
23459
  }, false /* isOptional */, true /** allowNull */);
23460
+ /**
23461
+ * Get table metadata
23462
+ * @param table The table Content Model
23463
+ */
23464
+ function getTableMetadata(table) {
23465
+ return (0, updateMetadata_1.getMetadata)(table, TableFormatDefinition);
23466
+ }
23467
+ exports.getTableMetadata = getTableMetadata;
23183
23468
  /**
23184
23469
  * Update table metadata with a callback
23185
23470
  * @param table The table Content Model
@@ -23279,64 +23564,63 @@ var tslib_1 = __webpack_require__(/*! tslib */ "./node_modules/tslib/tslib.es6.m
23279
23564
  var getClosestAncestorBlockGroupIndex_1 = __webpack_require__(/*! ../editing/getClosestAncestorBlockGroupIndex */ "./packages/roosterjs-content-model-dom/lib/modelApi/editing/getClosestAncestorBlockGroupIndex.ts");
23280
23565
  var isBlockGroupOfType_1 = __webpack_require__(/*! ../typeCheck/isBlockGroupOfType */ "./packages/roosterjs-content-model-dom/lib/modelApi/typeCheck/isBlockGroupOfType.ts");
23281
23566
  var iterateSelections_1 = __webpack_require__(/*! ./iterateSelections */ "./packages/roosterjs-content-model-dom/lib/modelApi/selection/iterateSelections.ts");
23282
- /**
23283
- * Get an array of selected parent paragraph and child segment pair
23284
- * @param model The Content Model to get selection from
23285
- * @param includingFormatHolder True means also include format holder as segment from list item, in that case paragraph will be null
23286
- */
23287
- function getSelectedSegmentsAndParagraphs(model, includingFormatHolder, includingEntity) {
23567
+ var mutate_1 = __webpack_require__(/*! ../common/mutate */ "./packages/roosterjs-content-model-dom/lib/modelApi/common/mutate.ts");
23568
+ function getSelectedSegmentsAndParagraphs(model, includingFormatHolder, includingEntity, mutate) {
23288
23569
  var selections = collectSelections(model, {
23289
23570
  includeListFormatHolder: includingFormatHolder ? 'allSegments' : 'never',
23290
23571
  });
23291
23572
  var result = [];
23292
23573
  selections.forEach(function (_a) {
23293
23574
  var segments = _a.segments, block = _a.block, path = _a.path;
23294
- if (segments && ((includingFormatHolder && !block) || (block === null || block === void 0 ? void 0 : block.blockType) == 'Paragraph')) {
23295
- segments.forEach(function (segment) {
23296
- if (includingEntity ||
23297
- segment.segmentType != 'Entity' ||
23298
- !segment.entityFormat.isReadonly) {
23299
- result.push([segment, (block === null || block === void 0 ? void 0 : block.blockType) == 'Paragraph' ? block : null, path]);
23575
+ if (segments) {
23576
+ if (includingFormatHolder &&
23577
+ !block &&
23578
+ segments.length == 1 &&
23579
+ path[0].blockGroupType == 'ListItem' &&
23580
+ segments[0] == path[0].formatHolder) {
23581
+ var list = path[0];
23582
+ if (mutate) {
23583
+ (0, mutate_1.mutateBlock)(list);
23300
23584
  }
23301
- });
23585
+ result.push([list.formatHolder, null, path]);
23586
+ }
23587
+ else if ((block === null || block === void 0 ? void 0 : block.blockType) == 'Paragraph') {
23588
+ if (mutate) {
23589
+ (0, mutate_1.mutateBlock)(block);
23590
+ }
23591
+ segments.forEach(function (segment) {
23592
+ if (includingEntity ||
23593
+ segment.segmentType != 'Entity' ||
23594
+ !segment.entityFormat.isReadonly) {
23595
+ result.push([segment, block, path]);
23596
+ }
23597
+ });
23598
+ }
23302
23599
  }
23303
23600
  });
23304
23601
  return result;
23305
23602
  }
23306
23603
  exports.getSelectedSegmentsAndParagraphs = getSelectedSegmentsAndParagraphs;
23307
- /**
23308
- * Get an array of selected segments from a content model
23309
- * @param model The Content Model to get selection from
23310
- * @param includingFormatHolder True means also include format holder as segment from list item
23311
- */
23312
- function getSelectedSegments(model, includingFormatHolder) {
23313
- return getSelectedSegmentsAndParagraphs(model, includingFormatHolder).map(function (x) { return x[0]; });
23604
+ function getSelectedSegments(model, includingFormatHolder, mutate) {
23605
+ var segments = mutate
23606
+ ? getSelectedSegmentsAndParagraphs(model, includingFormatHolder, false /*includeEntity*/, true /*mutate*/)
23607
+ : getSelectedSegmentsAndParagraphs(model, includingFormatHolder);
23608
+ return segments.map(function (x) { return x[0]; });
23314
23609
  }
23315
23610
  exports.getSelectedSegments = getSelectedSegments;
23316
- /**
23317
- * Get any array of selected paragraphs from a content model
23318
- * @param model The Content Model to get selection from
23319
- */
23320
- function getSelectedParagraphs(model) {
23611
+ function getSelectedParagraphs(model, mutate) {
23321
23612
  var selections = collectSelections(model, { includeListFormatHolder: 'never' });
23322
23613
  var result = [];
23323
23614
  removeUnmeaningfulSelections(selections);
23324
23615
  selections.forEach(function (_a) {
23325
23616
  var block = _a.block;
23326
23617
  if ((block === null || block === void 0 ? void 0 : block.blockType) == 'Paragraph') {
23327
- result.push(block);
23618
+ result.push(mutate ? (0, mutate_1.mutateBlock)(block) : block);
23328
23619
  }
23329
23620
  });
23330
23621
  return result;
23331
23622
  }
23332
23623
  exports.getSelectedParagraphs = getSelectedParagraphs;
23333
- /**
23334
- * Get an array of block group - block pair that is of the expected block group type from selection
23335
- * @param group The root block group to search
23336
- * @param blockGroupTypes The expected block group types
23337
- * @param stopTypes Block group types that will stop searching when hit
23338
- * @param deepFirst True means search in deep first, otherwise wide first
23339
- */
23340
23624
  function getOperationalBlocks(group, blockGroupTypes, stopTypes, deepFirst) {
23341
23625
  var result = [];
23342
23626
  var findSequence = deepFirst ? blockGroupTypes.map(function (type) { return [type]; }) : [blockGroupTypes];
@@ -23377,10 +23661,6 @@ function getOperationalBlocks(group, blockGroupTypes, stopTypes, deepFirst) {
23377
23661
  return result;
23378
23662
  }
23379
23663
  exports.getOperationalBlocks = getOperationalBlocks;
23380
- /**
23381
- * Get the first selected table from content model
23382
- * @param model The Content Model to get selection from
23383
- */
23384
23664
  function getFirstSelectedTable(model) {
23385
23665
  var selections = collectSelections(model, { includeListFormatHolder: 'never' });
23386
23666
  var table;
@@ -23404,10 +23684,6 @@ function getFirstSelectedTable(model) {
23404
23684
  return [table, resultPath];
23405
23685
  }
23406
23686
  exports.getFirstSelectedTable = getFirstSelectedTable;
23407
- /**
23408
- * Get the first selected list item from content model
23409
- * @param model The Content Model to get selection from
23410
- */
23411
23687
  function getFirstSelectedListItem(model) {
23412
23688
  var listItem;
23413
23689
  getOperationalBlocks(model, ['ListItem'], ['TableCell']).forEach(function (r) {
@@ -23430,6 +23706,8 @@ function collectSelections(group, option) {
23430
23706
  }, option);
23431
23707
  return selections;
23432
23708
  }
23709
+ //#endregion
23710
+ //#region utils
23433
23711
  function removeUnmeaningfulSelections(selections) {
23434
23712
  if (selections.length > 1 &&
23435
23713
  isOnlySelectionMarkerSelected(selections, false /*checkFirstParagraph*/)) {
@@ -23457,6 +23735,7 @@ function isOnlySelectionMarkerSelected(selections, checkFirstParagraph) {
23457
23735
  return false;
23458
23736
  }
23459
23737
  }
23738
+ //#endregion
23460
23739
 
23461
23740
 
23462
23741
  /***/ }),
@@ -23604,12 +23883,6 @@ exports.hasSelectionInSegment = hasSelectionInSegment;
23604
23883
  Object.defineProperty(exports, "__esModule", ({ value: true }));
23605
23884
  exports.iterateSelections = void 0;
23606
23885
  var tslib_1 = __webpack_require__(/*! tslib */ "./node_modules/tslib/tslib.es6.mjs");
23607
- /**
23608
- * Iterate all selected elements in a given model
23609
- * @param group The given Content Model to iterate selection from
23610
- * @param callback The callback function to access the selected element
23611
- * @param option Option to determine how to iterate
23612
- */
23613
23886
  function iterateSelections(group, callback, option) {
23614
23887
  var internalCallback = function (path, tableContext, block, segments) {
23615
23888
  var _a;
@@ -23759,6 +24032,7 @@ function internalIterateSelections(path, callback, option, table, treatAllAsSele
23759
24032
  Object.defineProperty(exports, "__esModule", ({ value: true }));
23760
24033
  exports.setSelection = void 0;
23761
24034
  var isGeneralSegment_1 = __webpack_require__(/*! ../typeCheck/isGeneralSegment */ "./packages/roosterjs-content-model-dom/lib/modelApi/typeCheck/isGeneralSegment.ts");
24035
+ var mutate_1 = __webpack_require__(/*! ../common/mutate */ "./packages/roosterjs-content-model-dom/lib/modelApi/common/mutate.ts");
23762
24036
  /**
23763
24037
  * Set selection into Content Model. If the Content Model already has selection, existing selection will be overwritten by the new one.
23764
24038
  * @param group The root level group of Content Model
@@ -23771,8 +24045,8 @@ function setSelection(group, start, end) {
23771
24045
  exports.setSelection = setSelection;
23772
24046
  function setSelectionToBlockGroup(group, isInSelection, start, end) {
23773
24047
  return handleSelection(isInSelection, group, start, end, function (isInSelection) {
23774
- if ((0, isGeneralSegment_1.isGeneralSegment)(group)) {
23775
- setIsSelected(group, isInSelection);
24048
+ if ((0, isGeneralSegment_1.isGeneralSegment)(group) && needToSetSelection(group, isInSelection)) {
24049
+ setIsSelected((0, mutate_1.mutateBlock)(group), isInSelection);
23776
24050
  }
23777
24051
  group.blocks.forEach(function (block) {
23778
24052
  isInSelection = setSelectionToBlock(block, isInSelection, start, end);
@@ -23789,11 +24063,14 @@ function setSelectionToBlock(block, isInSelection, start, end) {
23789
24063
  case 'Divider':
23790
24064
  case 'Entity':
23791
24065
  return handleSelection(isInSelection, block, start, end, function (isInSelection) {
23792
- if (isInSelection) {
23793
- block.isSelected = true;
23794
- }
23795
- else {
23796
- delete block.isSelected;
24066
+ if (needToSetSelection(block, isInSelection)) {
24067
+ var mutableBlock = (0, mutate_1.mutateBlock)(block);
24068
+ if (isInSelection) {
24069
+ mutableBlock.isSelected = true;
24070
+ }
24071
+ else {
24072
+ delete mutableBlock.isSelected;
24073
+ }
23797
24074
  }
23798
24075
  return isInSelection;
23799
24076
  });
@@ -23801,13 +24078,13 @@ function setSelectionToBlock(block, isInSelection, start, end) {
23801
24078
  var segmentsToDelete_1 = [];
23802
24079
  block.segments.forEach(function (segment, i) {
23803
24080
  isInSelection = handleSelection(isInSelection, segment, start, end, function (isInSelection) {
23804
- return setSelectionToSegment(segment, isInSelection, segmentsToDelete_1, start, end, i);
24081
+ return setSelectionToSegment(block, segment, isInSelection, segmentsToDelete_1, start, end, i);
23805
24082
  });
23806
24083
  });
23807
- while (segmentsToDelete_1.length > 0) {
23808
- var index = segmentsToDelete_1.pop();
24084
+ var index = void 0;
24085
+ while ((index = segmentsToDelete_1.pop()) !== undefined) {
23809
24086
  if (index >= 0) {
23810
- block.segments.splice(index, 1);
24087
+ (0, mutate_1.mutateBlock)(block).segments.splice(index, 1);
23811
24088
  }
23812
24089
  }
23813
24090
  return isInSelection;
@@ -23824,7 +24101,9 @@ function setSelectionToTable(table, isInSelection, start, end) {
23824
24101
  for (var col = 0; col < currentRow.cells.length; col++) {
23825
24102
  var currentCell = table.rows[row].cells[col];
23826
24103
  var isSelected = row >= first.row && row <= last.row && col >= first.col && col <= last.col;
23827
- setIsSelected(currentCell, isSelected);
24104
+ if (needToSetSelection(currentCell, isSelected)) {
24105
+ setIsSelected((0, mutate_1.mutateBlock)(currentCell), isSelected);
24106
+ }
23828
24107
  if (!isSelected) {
23829
24108
  setSelectionToBlockGroup(currentCell, false /*isInSelection*/, start, end);
23830
24109
  }
@@ -23847,7 +24126,7 @@ function findCell(table, cell) {
23847
24126
  : -1;
23848
24127
  return { row: row, col: col };
23849
24128
  }
23850
- function setSelectionToSegment(segment, isInSelection, segmentsToDelete, start, end, i) {
24129
+ function setSelectionToSegment(paragraph, segment, isInSelection, segmentsToDelete, start, end, i) {
23851
24130
  switch (segment.segmentType) {
23852
24131
  case 'SelectionMarker':
23853
24132
  if (!isInSelection || (segment != start && segment != end)) {
@@ -23858,19 +24137,32 @@ function setSelectionToSegment(segment, isInSelection, segmentsToDelete, start,
23858
24137
  }
23859
24138
  return isInSelection;
23860
24139
  case 'General':
23861
- setIsSelected(segment, isInSelection);
24140
+ internalSetSelectionToSegment(paragraph, segment, isInSelection);
23862
24141
  return segment != start && segment != end
23863
24142
  ? setSelectionToBlockGroup(segment, isInSelection, start, end)
23864
24143
  : isInSelection;
23865
24144
  case 'Image':
23866
- setIsSelected(segment, isInSelection);
23867
- segment.isSelectedAsImageSelection = start == segment && (!end || end == segment);
24145
+ var isSelectedAsImageSelection_1 = start == segment && (!end || end == segment);
24146
+ internalSetSelectionToSegment(paragraph, segment, isInSelection, !segment.isSelectedAsImageSelection != !isSelectedAsImageSelection_1
24147
+ ? function (image) { return (image.isSelectedAsImageSelection = isSelectedAsImageSelection_1); }
24148
+ : undefined);
23868
24149
  return isInSelection;
23869
24150
  default:
23870
- setIsSelected(segment, isInSelection);
24151
+ internalSetSelectionToSegment(paragraph, segment, isInSelection);
23871
24152
  return isInSelection;
23872
24153
  }
23873
24154
  }
24155
+ function internalSetSelectionToSegment(paragraph, segment, isInSelection, additionAction) {
24156
+ if (additionAction || needToSetSelection(segment, isInSelection)) {
24157
+ (0, mutate_1.mutateSegment)(paragraph, segment, function (mutableSegment) {
24158
+ setIsSelected(mutableSegment, isInSelection);
24159
+ additionAction === null || additionAction === void 0 ? void 0 : additionAction(mutableSegment);
24160
+ });
24161
+ }
24162
+ }
24163
+ function needToSetSelection(selectable, isSelected) {
24164
+ return !selectable.isSelected != !isSelected;
24165
+ }
23874
24166
  function setIsSelected(selectable, value) {
23875
24167
  if (value) {
23876
24168
  selectable.isSelected = true;
@@ -23899,11 +24191,6 @@ function handleSelection(isInSelection, model, start, end, callback) {
23899
24191
 
23900
24192
  Object.defineProperty(exports, "__esModule", ({ value: true }));
23901
24193
  exports.isBlockGroupOfType = void 0;
23902
- /**
23903
- * Check if the given content model block or block group is of the expected block group type
23904
- * @param input The object to check
23905
- * @param type The expected type
23906
- */
23907
24194
  function isBlockGroupOfType(input, type) {
23908
24195
  var item = input;
23909
24196
  return (item === null || item === void 0 ? void 0 : item.blockGroupType) == type;
@@ -23923,10 +24210,6 @@ exports.isBlockGroupOfType = isBlockGroupOfType;
23923
24210
 
23924
24211
  Object.defineProperty(exports, "__esModule", ({ value: true }));
23925
24212
  exports.isGeneralSegment = void 0;
23926
- /**
23927
- * Check if the given block group is a general segment
23928
- * @param group The group to check
23929
- */
23930
24213
  function isGeneralSegment(group) {
23931
24214
  return (group.blockGroupType == 'General' &&
23932
24215
  group.segmentType == 'General');
@@ -25636,7 +25919,11 @@ var roosterjs_content_model_api_1 = __webpack_require__(/*! roosterjs-content-mo
25636
25919
  * @internal
25637
25920
  */
25638
25921
  function createLink(editor) {
25922
+ var anchorNode = null;
25639
25923
  (0, roosterjs_content_model_api_1.formatTextSegmentBeforeSelectionMarker)(editor, function (_model, linkSegment, _paragraph) {
25924
+ if (linkSegment.link) {
25925
+ return true;
25926
+ }
25640
25927
  var linkData = null;
25641
25928
  if (!linkSegment.link && (linkData = (0, roosterjs_content_model_api_1.matchLink)(linkSegment.text))) {
25642
25929
  (0, roosterjs_content_model_dom_1.addLink)(linkSegment, {
@@ -25651,6 +25938,12 @@ function createLink(editor) {
25651
25938
  return false;
25652
25939
  }, {
25653
25940
  changeSource: roosterjs_content_model_dom_1.ChangeSource.AutoLink,
25941
+ onNodeCreated: function (_modelElement, node) {
25942
+ if (!anchorNode) {
25943
+ anchorNode = node;
25944
+ }
25945
+ },
25946
+ getChangeData: function () { return anchorNode; },
25654
25947
  });
25655
25948
  }
25656
25949
  exports.createLink = createLink;
@@ -26391,6 +26684,7 @@ var EditPlugin = /** @class */ (function () {
26391
26684
  this.editor = null;
26392
26685
  this.disposer = null;
26393
26686
  this.shouldHandleNextInputEvent = false;
26687
+ this.selectionAfterDelete = null;
26394
26688
  }
26395
26689
  /**
26396
26690
  * Get name of this plugin
@@ -26438,6 +26732,12 @@ var EditPlugin = /** @class */ (function () {
26438
26732
  case 'keyDown':
26439
26733
  this.handleKeyDownEvent(this.editor, event);
26440
26734
  break;
26735
+ case 'keyUp':
26736
+ if (this.selectionAfterDelete) {
26737
+ this.editor.setDOMSelection(this.selectionAfterDelete);
26738
+ this.selectionAfterDelete = null;
26739
+ }
26740
+ break;
26441
26741
  }
26442
26742
  }
26443
26743
  };
@@ -26474,8 +26774,6 @@ var EditPlugin = /** @class */ (function () {
26474
26774
  }
26475
26775
  };
26476
26776
  EditPlugin.prototype.handleBeforeInputEvent = function (editor, rawEvent) {
26477
- var _this = this;
26478
- var _a, _b;
26479
26777
  // Some Android IMEs doesn't fire correct keydown event for BACKSPACE/DELETE key
26480
26778
  // Here we translate input event to BACKSPACE/DELETE keydown event to be compatible with existing logic
26481
26779
  if (!this.shouldHandleNextInputEvent ||
@@ -26503,15 +26801,9 @@ var EditPlugin = /** @class */ (function () {
26503
26801
  }
26504
26802
  if (handled) {
26505
26803
  rawEvent.preventDefault();
26506
- // Restore the selection to avoid the cursor jump issue
26804
+ // Restore the selection on keyup event to avoid the cursor jump issue
26507
26805
  // See: https://issues.chromium.org/issues/330596261
26508
- var selection_1 = editor.getDOMSelection();
26509
- var doc = (_a = this.editor) === null || _a === void 0 ? void 0 : _a.getDocument();
26510
- (_b = doc === null || doc === void 0 ? void 0 : doc.defaultView) === null || _b === void 0 ? void 0 : _b.requestAnimationFrame(function () {
26511
- if (_this.editor) {
26512
- _this.editor.setDOMSelection(selection_1);
26513
- }
26514
- });
26806
+ this.selectionAfterDelete = editor.getDOMSelection();
26515
26807
  }
26516
26808
  };
26517
26809
  return EditPlugin;
@@ -26595,8 +26887,9 @@ function getDeleteCollapsedSelection(direction) {
26595
26887
  context.deleteResult = 'range';
26596
26888
  }
26597
26889
  else if ((blockToDelete = (0, getLeafSiblingBlock_1.getLeafSiblingBlock)(path, paragraph, isForward))) {
26598
- var block = blockToDelete.block, path_1 = blockToDelete.path, siblingSegment = blockToDelete.siblingSegment;
26599
- if (block.blockType == 'Paragraph') {
26890
+ var readonlyBlock = blockToDelete.block, path_1 = blockToDelete.path, siblingSegment = blockToDelete.siblingSegment;
26891
+ if (readonlyBlock.blockType == 'Paragraph') {
26892
+ var block = (0, roosterjs_content_model_dom_1.mutateBlock)(readonlyBlock);
26600
26893
  if (siblingSegment) {
26601
26894
  // When selection is under general segment, need to check if it has a sibling sibling, and delete from it
26602
26895
  if ((0, roosterjs_content_model_dom_1.deleteSegment)(block, siblingSegment, context.formatContext, direction)) {
@@ -26618,7 +26911,6 @@ function getDeleteCollapsedSelection(direction) {
26618
26911
  tableContext: tableContext,
26619
26912
  };
26620
26913
  context.lastParagraph = paragraph;
26621
- delete block.cachedElement;
26622
26914
  }
26623
26915
  context.deleteResult = 'range';
26624
26916
  }
@@ -26626,7 +26918,7 @@ function getDeleteCollapsedSelection(direction) {
26626
26918
  context.lastTableContext = tableContext;
26627
26919
  }
26628
26920
  else {
26629
- if ((0, roosterjs_content_model_dom_1.deleteBlock)(path_1[0].blocks, block, undefined /*replacement*/, context.formatContext, direction)) {
26921
+ 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)) {
26630
26922
  context.deleteResult = 'range';
26631
26923
  }
26632
26924
  }
@@ -26739,7 +27031,7 @@ var insertNewLine = function (quote, parent, index) {
26739
27031
  var marker = (0, roosterjs_content_model_dom_1.createSelectionMarker)();
26740
27032
  var newParagraph = (0, roosterjs_content_model_dom_1.createParagraph)(false /* isImplicit */);
26741
27033
  newParagraph.segments.push(marker);
26742
- parent.blocks.splice(index + 1, 0, newParagraph);
27034
+ (0, roosterjs_content_model_dom_1.mutateBlock)(parent).blocks.splice(index + 1, 0, newParagraph);
26743
27035
  };
26744
27036
 
26745
27037
 
@@ -27079,7 +27371,7 @@ var handleEnterOnList = function (context) {
27079
27371
  lastParagraph.blockType === 'Paragraph' &&
27080
27372
  lastParagraph.segments[lastParagraph.segments.length - 1].segmentType ===
27081
27373
  'SelectionMarker') {
27082
- lastParagraph.segments.pop();
27374
+ (0, roosterjs_content_model_dom_1.mutateBlock)(lastParagraph).segments.pop();
27083
27375
  nextParagraph.segments.unshift((0, roosterjs_content_model_dom_1.createSelectionMarker)(insertPoint.marker.format));
27084
27376
  }
27085
27377
  context.lastParagraph = undefined;
@@ -27087,7 +27379,7 @@ var handleEnterOnList = function (context) {
27087
27379
  }
27088
27380
  else if (deleteResult !== 'range') {
27089
27381
  if (isEmptyListItem(listItem_1)) {
27090
- listItem_1.levels.pop();
27382
+ (0, roosterjs_content_model_dom_1.mutateBlock)(listItem_1).levels.pop();
27091
27383
  }
27092
27384
  else {
27093
27385
  var newListItem = createNewListItem(context, listItem_1, listParent);
@@ -27120,7 +27412,7 @@ var createNewListItem = function (context, listItem, listParent) {
27120
27412
  newListItem.blocks.push(newParagraph);
27121
27413
  insertPoint.paragraph = newParagraph;
27122
27414
  context.lastParagraph = newParagraph;
27123
- listParent.blocks.splice(listIndex + 1, 0, newListItem);
27415
+ (0, roosterjs_content_model_dom_1.mutateBlock)(listParent).blocks.splice(listIndex + 1, 0, newListItem);
27124
27416
  return newListItem;
27125
27417
  };
27126
27418
  var createNewListLevel = function (listItem) {
@@ -27614,9 +27906,6 @@ Object.defineProperty(exports, "__esModule", ({ value: true }));
27614
27906
  exports.getLeafSiblingBlock = void 0;
27615
27907
  var tslib_1 = __webpack_require__(/*! tslib */ "./node_modules/tslib/tslib.es6.mjs");
27616
27908
  var roosterjs_content_model_dom_1 = __webpack_require__(/*! roosterjs-content-model-dom */ "./packages/roosterjs-content-model-dom/lib/index.ts");
27617
- /**
27618
- * @internal
27619
- */
27620
27909
  function getLeafSiblingBlock(path, block, isNext) {
27621
27910
  var _a;
27622
27911
  var newPath = (0, tslib_1.__spreadArray)([], (0, tslib_1.__read)(path), false);
@@ -31132,6 +31421,7 @@ exports.createCellResizer = exports.VERTICAL_RESIZER_ID = exports.HORIZONTAL_RES
31132
31421
  var tslib_1 = __webpack_require__(/*! tslib */ "./node_modules/tslib/tslib.es6.mjs");
31133
31422
  var createElement_1 = __webpack_require__(/*! ../../../pluginUtils/CreateElement/createElement */ "./packages/roosterjs-content-model-plugins/lib/pluginUtils/CreateElement/createElement.ts");
31134
31423
  var DragAndDropHelper_1 = __webpack_require__(/*! ../../../pluginUtils/DragAndDrop/DragAndDropHelper */ "./packages/roosterjs-content-model-plugins/lib/pluginUtils/DragAndDrop/DragAndDropHelper.ts");
31424
+ var getTableFromContentModel_1 = __webpack_require__(/*! ../utils/getTableFromContentModel */ "./packages/roosterjs-content-model-plugins/lib/tableEdit/editors/utils/getTableFromContentModel.ts");
31135
31425
  var roosterjs_content_model_dom_1 = __webpack_require__(/*! roosterjs-content-model-dom */ "./packages/roosterjs-content-model-dom/lib/index.ts");
31136
31426
  var CELL_RESIZER_WIDTH = 4;
31137
31427
  /**
@@ -31184,21 +31474,8 @@ function onDragStart(context, event) {
31184
31474
  }; // Just a fallback
31185
31475
  }
31186
31476
  var editor = context.editor, table = context.table;
31187
- // Get current selection
31188
- var selection = editor.getDOMSelection();
31189
- // Select first cell of the table
31190
- editor.setDOMSelection({
31191
- type: 'table',
31192
- firstColumn: 0,
31193
- firstRow: 0,
31194
- lastColumn: 0,
31195
- lastRow: 0,
31196
- table: table,
31197
- });
31198
- // Get the table content model
31199
- var cmTable = (0, roosterjs_content_model_dom_1.getFirstSelectedTable)(editor.getContentModelCopy('disconnected'))[0];
31200
- // Restore selection
31201
- editor.setDOMSelection(selection);
31477
+ // Get Table block in content model
31478
+ var cmTable = (0, getTableFromContentModel_1.getCMTableFromTable)(editor, table);
31202
31479
  if (rect && cmTable) {
31203
31480
  onStart();
31204
31481
  return {
@@ -31475,6 +31752,7 @@ var tslib_1 = __webpack_require__(/*! tslib */ "./node_modules/tslib/tslib.es6.m
31475
31752
  var createElement_1 = __webpack_require__(/*! ../../../pluginUtils/CreateElement/createElement */ "./packages/roosterjs-content-model-plugins/lib/pluginUtils/CreateElement/createElement.ts");
31476
31753
  var DragAndDropHelper_1 = __webpack_require__(/*! ../../../pluginUtils/DragAndDrop/DragAndDropHelper */ "./packages/roosterjs-content-model-plugins/lib/pluginUtils/DragAndDrop/DragAndDropHelper.ts");
31477
31754
  var roosterjs_content_model_api_1 = __webpack_require__(/*! roosterjs-content-model-api */ "./packages/roosterjs-content-model-api/lib/index.ts");
31755
+ var getTableFromContentModel_1 = __webpack_require__(/*! ../utils/getTableFromContentModel */ "./packages/roosterjs-content-model-plugins/lib/tableEdit/editors/utils/getTableFromContentModel.ts");
31478
31756
  var roosterjs_content_model_dom_1 = __webpack_require__(/*! roosterjs-content-model-dom */ "./packages/roosterjs-content-model-dom/lib/index.ts");
31479
31757
  var TABLE_MOVER_LENGTH = 12;
31480
31758
  /**
@@ -31608,21 +31886,10 @@ function onDragStart(context) {
31608
31886
  tableRect.style.top = trect.top + "px";
31609
31887
  tableRect.style.left = trect.left + "px";
31610
31888
  (_a = div.parentNode) === null || _a === void 0 ? void 0 : _a.appendChild(tableRect);
31611
- // Get current selection
31889
+ // Get drag start selection
31612
31890
  var initialSelection = editor.getDOMSelection();
31613
- // Select first cell of the table
31614
- editor.setDOMSelection({
31615
- type: 'table',
31616
- firstColumn: 0,
31617
- firstRow: 0,
31618
- lastColumn: 0,
31619
- lastRow: 0,
31620
- table: table,
31621
- });
31622
- // Get the table content model
31623
- var _b = (0, tslib_1.__read)((0, roosterjs_content_model_dom_1.getFirstSelectedTable)(editor.getContentModelCopy('disconnected')), 1), cmTable = _b[0];
31624
- // Restore selection
31625
- editor.setDOMSelection(initialSelection);
31891
+ // Get Table block in content model
31892
+ var cmTable = (0, getTableFromContentModel_1.getCMTableFromTable)(editor, table);
31626
31893
  return {
31627
31894
  cmTable: cmTable,
31628
31895
  initialSelection: initialSelection,
@@ -31755,6 +32022,7 @@ exports.createTableResizer = exports.TABLE_RESIZER_ID = void 0;
31755
32022
  var tslib_1 = __webpack_require__(/*! tslib */ "./node_modules/tslib/tslib.es6.mjs");
31756
32023
  var createElement_1 = __webpack_require__(/*! ../../../pluginUtils/CreateElement/createElement */ "./packages/roosterjs-content-model-plugins/lib/pluginUtils/CreateElement/createElement.ts");
31757
32024
  var DragAndDropHelper_1 = __webpack_require__(/*! ../../../pluginUtils/DragAndDrop/DragAndDropHelper */ "./packages/roosterjs-content-model-plugins/lib/pluginUtils/DragAndDrop/DragAndDropHelper.ts");
32025
+ var getTableFromContentModel_1 = __webpack_require__(/*! ../utils/getTableFromContentModel */ "./packages/roosterjs-content-model-plugins/lib/tableEdit/editors/utils/getTableFromContentModel.ts");
31758
32026
  var roosterjs_content_model_dom_1 = __webpack_require__(/*! roosterjs-content-model-dom */ "./packages/roosterjs-content-model-dom/lib/index.ts");
31759
32027
  var TABLE_RESIZER_LENGTH = 12;
31760
32028
  /**
@@ -31818,21 +32086,8 @@ var TableResizer = /** @class */ (function (_super) {
31818
32086
  function onDragStart(context, event) {
31819
32087
  context.onStart();
31820
32088
  var editor = context.editor, table = context.table;
31821
- // Get current selection
31822
- var selection = editor.getDOMSelection();
31823
- // Select first cell of the table
31824
- editor.setDOMSelection({
31825
- type: 'table',
31826
- firstColumn: 0,
31827
- firstRow: 0,
31828
- lastColumn: 0,
31829
- lastRow: 0,
31830
- table: table,
31831
- });
31832
- // Get the table content model
31833
- var cmTable = (0, roosterjs_content_model_dom_1.getFirstSelectedTable)(editor.getContentModelCopy('disconnected'))[0];
31834
- // Restore selection
31835
- editor.setDOMSelection(selection);
32089
+ // Get Table block in content model
32090
+ var cmTable = (0, getTableFromContentModel_1.getCMTableFromTable)(editor, table);
31836
32091
  // Save original widths and heights
31837
32092
  var heights = [];
31838
32093
  cmTable === null || cmTable === void 0 ? void 0 : cmTable.rows.forEach(function (row) {
@@ -31934,6 +32189,45 @@ function isTableBottomVisible(editor, rect, contentDiv) {
31934
32189
  }
31935
32190
 
31936
32191
 
32192
+ /***/ }),
32193
+
32194
+ /***/ "./packages/roosterjs-content-model-plugins/lib/tableEdit/editors/utils/getTableFromContentModel.ts":
32195
+ /*!**********************************************************************************************************!*\
32196
+ !*** ./packages/roosterjs-content-model-plugins/lib/tableEdit/editors/utils/getTableFromContentModel.ts ***!
32197
+ \**********************************************************************************************************/
32198
+ /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
32199
+
32200
+ "use strict";
32201
+
32202
+ Object.defineProperty(exports, "__esModule", ({ value: true }));
32203
+ exports.getCMTableFromTable = void 0;
32204
+ var tslib_1 = __webpack_require__(/*! tslib */ "./node_modules/tslib/tslib.es6.mjs");
32205
+ var roosterjs_content_model_dom_1 = __webpack_require__(/*! roosterjs-content-model-dom */ "./packages/roosterjs-content-model-dom/lib/index.ts");
32206
+ /**
32207
+ * @internal
32208
+ * Get ContentModelTable from a table element if it is present in the content model
32209
+ */
32210
+ function getCMTableFromTable(editor, table) {
32211
+ var cmTable;
32212
+ editor.formatContentModel(function (model) {
32213
+ var _a;
32214
+ _a = (0, tslib_1.__read)((0, roosterjs_content_model_dom_1.getFirstSelectedTable)(model), 1), cmTable = _a[0];
32215
+ return false;
32216
+ }, {
32217
+ selectionOverride: {
32218
+ type: 'table',
32219
+ firstColumn: 0,
32220
+ firstRow: 0,
32221
+ lastColumn: 0,
32222
+ lastRow: 0,
32223
+ table: table,
32224
+ },
32225
+ });
32226
+ return cmTable;
32227
+ }
32228
+ exports.getCMTableFromTable = getCMTableFromTable;
32229
+
32230
+
31937
32231
  /***/ }),
31938
32232
 
31939
32233
  /***/ "./packages/roosterjs-content-model-plugins/lib/watermark/WatermarkPlugin.ts":