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