roosterjs 9.44.0 → 9.45.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
@@ -2343,6 +2343,10 @@ function setModelDirection(model, direction) {
2343
2343
  item.levels.forEach(function (level) {
2344
2344
  level.format.direction = calcDirection;
2345
2345
  });
2346
+ // We already set direction on levels, no need to keep it on list item level
2347
+ delete item.format.direction;
2348
+ // Remove textAlign to let it be calculated based on direction change
2349
+ delete item.format.textAlign;
2346
2350
  item.blocks.forEach(function (block) { return internalSetDirection(block, calcDirection); });
2347
2351
  });
2348
2352
  }
@@ -4363,9 +4367,18 @@ Object.defineProperty(exports, "__esModule", ({ value: true }));
4363
4367
  exports.alignTableCellVertically = exports.alignTableCellHorizontally = void 0;
4364
4368
  var roosterjs_content_model_dom_1 = __webpack_require__(/*! roosterjs-content-model-dom */ "./packages/roosterjs-content-model-dom/lib/index.ts");
4365
4369
  var TextAlignValueMap = {
4366
- alignCellLeft: 'start',
4367
- alignCellCenter: 'center',
4368
- alignCellRight: 'end',
4370
+ alignCellLeft: {
4371
+ ltr: 'start',
4372
+ rtl: 'end',
4373
+ },
4374
+ alignCellCenter: {
4375
+ ltr: 'center',
4376
+ rtl: 'center',
4377
+ },
4378
+ alignCellRight: {
4379
+ ltr: 'end',
4380
+ rtl: 'start',
4381
+ },
4369
4382
  };
4370
4383
  var VerticalAlignValueMap = {
4371
4384
  alignCellTop: 'top',
@@ -4377,7 +4390,8 @@ var VerticalAlignValueMap = {
4377
4390
  */
4378
4391
  function alignTableCellHorizontally(table, operation) {
4379
4392
  alignTableCellInternal(table, function (cell) {
4380
- cell.format.textAlign = TextAlignValueMap[operation];
4393
+ cell.format.textAlign =
4394
+ TextAlignValueMap[operation][cell.format.direction == 'rtl' ? 'rtl' : 'ltr'];
4381
4395
  });
4382
4396
  }
4383
4397
  exports.alignTableCellHorizontally = alignTableCellHorizontally;
@@ -4540,12 +4554,12 @@ var roosterjs_content_model_dom_1 = __webpack_require__(/*! roosterjs-content-mo
4540
4554
  /**
4541
4555
  * @internal
4542
4556
  */
4543
- function createTableStructure(parent, columns, rows) {
4557
+ function createTableStructure(parent, columns, rows, cellFormat) {
4544
4558
  var table = (0, roosterjs_content_model_dom_1.createTable)(rows);
4545
4559
  (0, roosterjs_content_model_dom_1.addBlock)(parent, table);
4546
4560
  table.rows.forEach(function (row) {
4547
4561
  for (var i = 0; i < columns; i++) {
4548
- var cell = (0, roosterjs_content_model_dom_1.createTableCell)();
4562
+ var cell = (0, roosterjs_content_model_dom_1.createTableCell)(undefined /*spanLeftOrColSpan */, undefined /*spanAboveOrRowSpan */, undefined /* isHeader */, cellFormat);
4549
4563
  row.cells.push(cell);
4550
4564
  }
4551
4565
  });
@@ -7137,19 +7151,21 @@ var roosterjs_content_model_dom_1 = __webpack_require__(/*! roosterjs-content-mo
7137
7151
  * @param rows Number of rows in table
7138
7152
  * @param tableMetadataFormat (Optional) The table format that are stored as metadata. If not passed, the default format will be applied: background color: #FFF; border color: #ABABAB
7139
7153
  * @param format (Optional) The table format used for style attributes
7154
+ * @param cellFormat (Optional) custom format for table cells, except for borders styles, for borders use tableMetadataFormat
7140
7155
  */
7141
- function insertTable(editor, columns, rows, tableMetadataFormat, format) {
7156
+ function insertTable(editor, columns, rows, tableMetadataFormat, format, customCellFormat) {
7142
7157
  editor.focus();
7143
7158
  editor.formatContentModel(function (model, context) {
7144
7159
  var _a, _b, _c;
7145
7160
  var insertPosition = (0, roosterjs_content_model_dom_1.deleteSelection)(model, [], context).insertPoint;
7146
7161
  if (insertPosition) {
7147
7162
  var doc = (0, roosterjs_content_model_dom_1.createContentModelDocument)();
7148
- var table = (0, createTableStructure_1.createTableStructure)(doc, columns, rows);
7163
+ var table = (0, createTableStructure_1.createTableStructure)(doc, columns, rows, customCellFormat);
7149
7164
  if (format) {
7150
7165
  table.format = (0, tslib_1.__assign)({}, format);
7151
7166
  }
7152
7167
  (0, roosterjs_content_model_dom_1.normalizeTable)(table, editor.getPendingFormat() || insertPosition.marker.format);
7168
+ initCellWidth(table);
7153
7169
  (0, adjustIndentation_1.adjustTableIndentation)(insertPosition, table);
7154
7170
  // Assign default vertical align
7155
7171
  tableMetadataFormat = tableMetadataFormat || { verticalAlign: 'top' };
@@ -7174,6 +7190,28 @@ function insertTable(editor, columns, rows, tableMetadataFormat, format) {
7174
7190
  });
7175
7191
  }
7176
7192
  exports.insertTable = insertTable;
7193
+ function initCellWidth(table) {
7194
+ var columns = Math.max.apply(Math, (0, tslib_1.__spreadArray)([], (0, tslib_1.__read)(table.rows.map(function (row) { return row.cells.length; })), false));
7195
+ for (var i = 0; i < columns; i++) {
7196
+ if (table.widths[i] === undefined) {
7197
+ table.widths[i] = getTableCellWidth(columns);
7198
+ }
7199
+ else if (table.widths[i] < roosterjs_content_model_dom_1.MIN_ALLOWED_TABLE_CELL_WIDTH) {
7200
+ table.widths[i] = roosterjs_content_model_dom_1.MIN_ALLOWED_TABLE_CELL_WIDTH;
7201
+ }
7202
+ }
7203
+ }
7204
+ function getTableCellWidth(columns) {
7205
+ if (columns <= 4) {
7206
+ return 120;
7207
+ }
7208
+ else if (columns <= 6) {
7209
+ return 100;
7210
+ }
7211
+ else {
7212
+ return 70;
7213
+ }
7214
+ }
7177
7215
 
7178
7216
 
7179
7217
  /***/ }),
@@ -8610,7 +8648,9 @@ function exportContent(editor, mode, optionsOrCallbacks) {
8610
8648
  case 'HTMLFast':
8611
8649
  var clonedRoot = editor.getDOMHelper().getClonedRoot();
8612
8650
  if (editor.isDarkMode()) {
8613
- (0, roosterjs_content_model_dom_1.transformColor)(clonedRoot, false /*includeSelf*/, 'darkToLight', editor.getColorManager());
8651
+ (0, roosterjs_content_model_dom_1.transformColor)(clonedRoot, false /*includeSelf*/, 'darkToLight', editor.getColorManager(), {
8652
+ tableBorders: editor.isExperimentalFeatureEnabled('TransformTableBorderColors'),
8653
+ });
8614
8654
  }
8615
8655
  return getHTMLFromDOM(editor, clonedRoot);
8616
8656
  case 'HTML':
@@ -10051,7 +10091,9 @@ function restoreSnapshotColors(core, snapshot) {
10051
10091
  var isDarkMode = core.lifecycle.isDarkMode;
10052
10092
  core.darkColorHandler.updateKnownColor(isDarkMode); // Pass no parameter to force update all colors
10053
10093
  if (!!snapshot.isDarkMode != !!isDarkMode) {
10054
- (0, roosterjs_content_model_dom_1.transformColor)(core.physicalRoot, false /*includeSelf*/, isDarkMode ? 'lightToDark' : 'darkToLight', core.darkColorHandler);
10094
+ (0, roosterjs_content_model_dom_1.transformColor)(core.physicalRoot, false /*includeSelf*/, isDarkMode ? 'lightToDark' : 'darkToLight', core.darkColorHandler, {
10095
+ tableBorders: core.experimentalFeatures.indexOf('TransformTableBorderColors') > -1,
10096
+ });
10055
10097
  }
10056
10098
  }
10057
10099
  exports.restoreSnapshotColors = restoreSnapshotColors;
@@ -12716,7 +12758,9 @@ var EntityPlugin = /** @class */ (function () {
12716
12758
  canPersist: eventResult === null || eventResult === void 0 ? void 0 : eventResult.shouldPersist,
12717
12759
  };
12718
12760
  if (editor.isDarkMode()) {
12719
- (0, roosterjs_content_model_dom_1.transformColor)(wrapper, true /*includeSelf*/, 'lightToDark', editor.getColorManager());
12761
+ (0, roosterjs_content_model_dom_1.transformColor)(wrapper, true /*includeSelf*/, 'lightToDark', editor.getColorManager(), {
12762
+ tableBorders: editor.isExperimentalFeatureEnabled('TransformTableBorderColors'),
12763
+ });
12720
12764
  }
12721
12765
  }
12722
12766
  else if (id) {
@@ -14985,7 +15029,9 @@ var Editor = /** @class */ (function () {
14985
15029
  var result = node.cloneNode(true /*deep*/);
14986
15030
  if (_this.isDarkMode()) {
14987
15031
  var colorHandler = _this.getColorManager();
14988
- (0, roosterjs_content_model_dom_1.transformColor)(result, true /*includeSelf*/, 'darkToLight', colorHandler);
15032
+ (0, roosterjs_content_model_dom_1.transformColor)(result, true /*includeSelf*/, 'darkToLight', colorHandler, {
15033
+ tableBorders: _this.isExperimentalFeatureEnabled('TransformTableBorderColors'),
15034
+ });
14989
15035
  result.style.color = result.style.color || 'inherit';
14990
15036
  result.style.backgroundColor = result.style.backgroundColor || 'inherit';
14991
15037
  }
@@ -15123,7 +15169,7 @@ var Editor = /** @class */ (function () {
15123
15169
  * @returns The HTML document which contains this editor
15124
15170
  */
15125
15171
  Editor.prototype.getDocument = function () {
15126
- return this.getCore().physicalRoot.ownerDocument;
15172
+ return this.getCore().environment.document;
15127
15173
  };
15128
15174
  /**
15129
15175
  * Focus to this editor, the selection was restored to where it was before, no unexpected scroll.
@@ -15185,7 +15231,9 @@ var Editor = /** @class */ (function () {
15185
15231
  Editor.prototype.setDarkModeState = function (isDarkMode) {
15186
15232
  var core = this.getCore();
15187
15233
  if (!!isDarkMode != core.lifecycle.isDarkMode) {
15188
- (0, roosterjs_content_model_dom_1.transformColor)(core.physicalRoot, false /*includeSelf*/, isDarkMode ? 'lightToDark' : 'darkToLight', core.darkColorHandler);
15234
+ (0, roosterjs_content_model_dom_1.transformColor)(core.physicalRoot, false /*includeSelf*/, isDarkMode ? 'lightToDark' : 'darkToLight', core.darkColorHandler, {
15235
+ tableBorders: this.isExperimentalFeatureEnabled('TransformTableBorderColors'),
15236
+ });
15189
15237
  core.lifecycle.isDarkMode = !!isDarkMode;
15190
15238
  core.api.triggerEvent(core, {
15191
15239
  eventType: 'contentChanged',
@@ -15576,12 +15624,13 @@ function createEditorEnvironment(contentDiv, options) {
15576
15624
  var userAgent = (_b = navigator === null || navigator === void 0 ? void 0 : navigator.userAgent) !== null && _b !== void 0 ? _b : '';
15577
15625
  var appVersion = (_c = navigator === null || navigator === void 0 ? void 0 : navigator.appVersion) !== null && _c !== void 0 ? _c : '';
15578
15626
  return {
15627
+ document: contentDiv.ownerDocument,
15579
15628
  domToModelSettings: (0, createEditorDefaultSettings_1.createDomToModelSettings)(options),
15580
15629
  modelToDomSettings: (0, createEditorDefaultSettings_1.createModelToDomSettings)(options),
15581
15630
  isMac: appVersion.indexOf('Mac') != -1,
15582
15631
  isAndroid: /android/i.test(userAgent),
15583
15632
  isIOS: /iPad|iPhone/.test(userAgent),
15584
- isSafari: userAgent.indexOf('Safari') >= 0 &&
15633
+ isSafari: userAgent.indexOf('AppleWebKit') >= 0 &&
15585
15634
  userAgent.indexOf('Chrome') < 0 &&
15586
15635
  userAgent.indexOf('Android') < 0,
15587
15636
  isMobileOrTablet: getIsMobileOrTablet(userAgent),
@@ -17407,7 +17456,12 @@ exports.ContextStyles = [
17407
17456
  'paddingRight',
17408
17457
  ];
17409
17458
  /**
17410
- * @internal
17459
+ * Content Model Element Processor for format container elements (e.g., blockquote, div)
17460
+ * Processes elements that create FormatContainer blocks in the content model.
17461
+ * This processor can be used in processorOverride to customize how specific elements are processed.
17462
+ * @param group The parent block group
17463
+ * @param element The DOM element to process
17464
+ * @param context DOM to Content Model context
17411
17465
  */
17412
17466
  var formatContainerProcessor = function (group, element, context) {
17413
17467
  (0, stackFormat_1.stackFormat)(context, { segment: 'shallowCloneForBlock', paragraph: 'shallowClone' }, function () {
@@ -20013,25 +20067,50 @@ function process(fontFamily, result, start, end) {
20013
20067
 
20014
20068
  Object.defineProperty(exports, "__esModule", ({ value: true }));
20015
20069
  exports.transformColor = void 0;
20070
+ var borderKeys_1 = __webpack_require__(/*! ../../formatHandlers/utils/borderKeys */ "./packages/roosterjs-content-model-dom/lib/formatHandlers/utils/borderKeys.ts");
20071
+ var isElementOfType_1 = __webpack_require__(/*! ../isElementOfType */ "./packages/roosterjs-content-model-dom/lib/domUtils/isElementOfType.ts");
20016
20072
  var color_1 = __webpack_require__(/*! ../../formatHandlers/utils/color */ "./packages/roosterjs-content-model-dom/lib/formatHandlers/utils/color.ts");
20017
20073
  /**
20018
20074
  * Edit and transform color of elements between light mode and dark mode
20075
+ * By default, text and background colors are transformed for all elements.
20019
20076
  * @param rootNode The root DOM node to transform
20020
20077
  * @param includeSelf True to transform the root node as well, otherwise false
20021
20078
  * @param direction To specify the transform direction, light to dark, or dark to light
20022
20079
  * @param darkColorHandler The dark color handler object to help do color transformation
20080
+ * @param transformColorOptions Configuration options for controlling which elements and styles undergo color transformation.
20023
20081
  */
20024
- function transformColor(rootNode, includeSelf, direction, darkColorHandler) {
20082
+ function transformColor(rootNode, includeSelf, direction, darkColorHandler, transformColorOptions) {
20025
20083
  var toDarkMode = direction == 'lightToDark';
20084
+ var tableBorders = (transformColorOptions === null || transformColorOptions === void 0 ? void 0 : transformColorOptions.tableBorders) || false;
20026
20085
  var transformer = function (element) {
20027
20086
  var textColor = (0, color_1.getColor)(element, false /*isBackground*/, !toDarkMode, darkColorHandler);
20028
20087
  var backColor = (0, color_1.getColor)(element, true /*isBackground*/, !toDarkMode, darkColorHandler);
20029
20088
  (0, color_1.setColor)(element, textColor, false /*isBackground*/, toDarkMode, darkColorHandler);
20030
20089
  (0, color_1.setColor)(element, backColor, true /*isBackground*/, toDarkMode, darkColorHandler);
20090
+ if (tableBorders) {
20091
+ transformBorderColor(element, toDarkMode, darkColorHandler);
20092
+ }
20031
20093
  };
20032
20094
  iterateElements(rootNode, transformer, includeSelf);
20033
20095
  }
20034
20096
  exports.transformColor = transformColor;
20097
+ function transformBorderColor(element, toDarkMode, darkColorHandler) {
20098
+ if ((0, isElementOfType_1.isElementOfType)(element, 'td') || (0, isElementOfType_1.isElementOfType)(element, 'th')) {
20099
+ borderKeys_1.BorderKeys.forEach(function (key) {
20100
+ var borderColorProperty = borderKeys_1.BorderColorKeyMap[key];
20101
+ var style = element.style.getPropertyValue(borderColorProperty);
20102
+ if (style) {
20103
+ var lightColor = (0, color_1.getLightModeColor)(style, !toDarkMode, darkColorHandler);
20104
+ if (lightColor) {
20105
+ var transformedColor = (0, color_1.adaptColor)(element, lightColor, 'border', toDarkMode, darkColorHandler);
20106
+ if (transformedColor) {
20107
+ element.style.setProperty(borderColorProperty, transformedColor);
20108
+ }
20109
+ }
20110
+ }
20111
+ });
20112
+ }
20113
+ }
20035
20114
  function iterateElements(root, transformer, includeSelf) {
20036
20115
  if (includeSelf && isHTMLElement(root)) {
20037
20116
  transformer(root);
@@ -20479,30 +20558,14 @@ exports.textAlignFormatHandler = {
20479
20558
  var _a;
20480
20559
  directionFormatHandler_1.directionFormatHandler.parse(format, element, context, defaultStyle);
20481
20560
  var textAlign = element.style.textAlign || defaultStyle.textAlign;
20482
- if (element.tagName == 'LI' &&
20483
- ((_a = element.parentElement) === null || _a === void 0 ? void 0 : _a.style.display) === 'flex' &&
20484
- element.parentElement.style.flexDirection === 'column' &&
20485
- element.style.alignSelf) {
20486
- // For LI element with flex style applied, we use its "align-self" style value instead since LI has a different implementation for align
20487
- textAlign = element.style.alignSelf;
20488
- }
20489
- if (textAlign) {
20561
+ if (textAlign && ((_a = element.parentElement) === null || _a === void 0 ? void 0 : _a.style.display) !== 'flex') {
20490
20562
  format.textAlign = (0, dir_1.calcAlign)(textAlign, format.direction);
20491
20563
  }
20492
20564
  },
20493
20565
  apply: function (format, element) {
20494
20566
  var dir = format.direction == 'rtl' ? 'rtl' : 'ltr';
20495
20567
  if (format.textAlign) {
20496
- var parent_1 = element.parentElement;
20497
- var parentTag = parent_1 === null || parent_1 === void 0 ? void 0 : parent_1.tagName;
20498
- if (element.tagName == 'LI' && parent_1 && (parentTag == 'OL' || parentTag == 'UL')) {
20499
- element.style.alignSelf = format.textAlign;
20500
- element.parentElement.style.flexDirection = 'column';
20501
- element.parentElement.style.display = 'flex';
20502
- }
20503
- else {
20504
- element.style.textAlign = dir_1.ResultMap[format.textAlign][dir];
20505
- }
20568
+ element.style.textAlign = dir_1.ResultMap[format.textAlign][dir];
20506
20569
  }
20507
20570
  },
20508
20571
  };
@@ -20669,27 +20732,96 @@ exports.borderBoxFormatHandler = {
20669
20732
  };
20670
20733
 
20671
20734
 
20735
+ /***/ }),
20736
+
20737
+ /***/ "./packages/roosterjs-content-model-dom/lib/formatHandlers/common/borderColorFormatHandler.ts":
20738
+ /*!****************************************************************************************************!*\
20739
+ !*** ./packages/roosterjs-content-model-dom/lib/formatHandlers/common/borderColorFormatHandler.ts ***!
20740
+ \****************************************************************************************************/
20741
+ /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
20742
+
20743
+ "use strict";
20744
+
20745
+ Object.defineProperty(exports, "__esModule", ({ value: true }));
20746
+ exports.borderColorFormatHandler = void 0;
20747
+ var color_1 = __webpack_require__(/*! ../utils/color */ "./packages/roosterjs-content-model-dom/lib/formatHandlers/utils/color.ts");
20748
+ var borderKeys_1 = __webpack_require__(/*! ../utils/borderKeys */ "./packages/roosterjs-content-model-dom/lib/formatHandlers/utils/borderKeys.ts");
20749
+ var borderValues_1 = __webpack_require__(/*! ../../domUtils/style/borderValues */ "./packages/roosterjs-content-model-dom/lib/domUtils/style/borderValues.ts");
20750
+ /**
20751
+ * Keys of border width
20752
+ */
20753
+ var BorderWidthKeyMap = {
20754
+ borderTop: 'border-top-width',
20755
+ borderRight: 'border-right-width',
20756
+ borderBottom: 'border-bottom-width',
20757
+ borderLeft: 'border-left-width',
20758
+ };
20759
+ /**
20760
+ * Keys of border styles
20761
+ */
20762
+ var BorderStyleKeyMap = {
20763
+ borderTop: 'border-top-style',
20764
+ borderRight: 'border-right-style',
20765
+ borderBottom: 'border-bottom-style',
20766
+ borderLeft: 'border-left-style',
20767
+ };
20768
+ /**
20769
+ * @internal
20770
+ */
20771
+ exports.borderColorFormatHandler = {
20772
+ parse: function (format, element, context) {
20773
+ if (context.experimentalFeatures &&
20774
+ context.experimentalFeatures.indexOf('TransformTableBorderColors') > -1) {
20775
+ borderKeys_1.BorderKeys.forEach(function (key) {
20776
+ var width = element.style.getPropertyValue(BorderWidthKeyMap[key]);
20777
+ var style = element.style.getPropertyValue(BorderStyleKeyMap[key]);
20778
+ var borderColor = (0, color_1.retrieveElementColor)(element, key);
20779
+ if (borderColor) {
20780
+ var lightModeColor = (0, color_1.getLightModeColor)(borderColor, !!context.isDarkMode, context.darkColorHandler);
20781
+ format[key] = (0, borderValues_1.combineBorderValue)({
20782
+ width: width,
20783
+ style: style,
20784
+ color: lightModeColor,
20785
+ });
20786
+ }
20787
+ });
20788
+ }
20789
+ },
20790
+ apply: function (format, element, context) {
20791
+ if (context.experimentalFeatures &&
20792
+ context.experimentalFeatures.indexOf('TransformTableBorderColors') > -1) {
20793
+ borderKeys_1.BorderKeys.forEach(function (key) {
20794
+ var value = format[key];
20795
+ if (value) {
20796
+ var borderValues = (0, borderValues_1.extractBorderValues)(value);
20797
+ if (borderValues.color) {
20798
+ var transformedColor = (0, color_1.adaptColor)(element, borderValues.color, 'border', !!context.isDarkMode, context.darkColorHandler);
20799
+ if (transformedColor) {
20800
+ var borderColorProperty = borderKeys_1.BorderColorKeyMap[key];
20801
+ element.style.setProperty(borderColorProperty, transformedColor);
20802
+ }
20803
+ }
20804
+ }
20805
+ });
20806
+ }
20807
+ },
20808
+ };
20809
+
20810
+
20672
20811
  /***/ }),
20673
20812
 
20674
20813
  /***/ "./packages/roosterjs-content-model-dom/lib/formatHandlers/common/borderFormatHandler.ts":
20675
20814
  /*!***********************************************************************************************!*\
20676
20815
  !*** ./packages/roosterjs-content-model-dom/lib/formatHandlers/common/borderFormatHandler.ts ***!
20677
20816
  \***********************************************************************************************/
20678
- /***/ ((__unused_webpack_module, exports) => {
20817
+ /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
20679
20818
 
20680
20819
  "use strict";
20681
20820
 
20682
20821
  Object.defineProperty(exports, "__esModule", ({ value: true }));
20683
- exports.borderFormatHandler = exports.BorderKeys = void 0;
20684
- /**
20685
- * Keys of border items
20686
- */
20687
- exports.BorderKeys = [
20688
- 'borderTop',
20689
- 'borderRight',
20690
- 'borderBottom',
20691
- 'borderLeft',
20692
- ];
20822
+ exports.borderFormatHandler = void 0;
20823
+ var tslib_1 = __webpack_require__(/*! tslib */ "./node_modules/tslib/tslib.es6.mjs");
20824
+ var borderKeys_1 = __webpack_require__(/*! ../utils/borderKeys */ "./packages/roosterjs-content-model-dom/lib/formatHandlers/utils/borderKeys.ts");
20693
20825
  // This array needs to match BorderKeys array
20694
20826
  var BorderWidthKeys = [
20695
20827
  'borderTopWidth',
@@ -20703,13 +20835,13 @@ var BorderRadiusKeys = [
20703
20835
  'borderBottomLeftRadius',
20704
20836
  'borderBottomRightRadius',
20705
20837
  ];
20706
- var AllKeys = exports.BorderKeys.concat(BorderRadiusKeys);
20838
+ var AllKeys = (0, tslib_1.__spreadArray)((0, tslib_1.__spreadArray)([], (0, tslib_1.__read)(borderKeys_1.BorderKeys), false), (0, tslib_1.__read)(BorderRadiusKeys), false);
20707
20839
  /**
20708
20840
  * @internal
20709
20841
  */
20710
20842
  exports.borderFormatHandler = {
20711
20843
  parse: function (format, element, _, defaultStyle) {
20712
- exports.BorderKeys.forEach(function (key, i) {
20844
+ borderKeys_1.BorderKeys.forEach(function (key, i) {
20713
20845
  var _a;
20714
20846
  var value = element.style[key];
20715
20847
  var defaultWidth = (_a = defaultStyle[BorderWidthKeys[i]]) !== null && _a !== void 0 ? _a : '0px';
@@ -21064,6 +21196,7 @@ var ariaFormatHandler_1 = __webpack_require__(/*! ./common/ariaFormatHandler */
21064
21196
  var backgroundColorFormatHandler_1 = __webpack_require__(/*! ./common/backgroundColorFormatHandler */ "./packages/roosterjs-content-model-dom/lib/formatHandlers/common/backgroundColorFormatHandler.ts");
21065
21197
  var boldFormatHandler_1 = __webpack_require__(/*! ./segment/boldFormatHandler */ "./packages/roosterjs-content-model-dom/lib/formatHandlers/segment/boldFormatHandler.ts");
21066
21198
  var borderBoxFormatHandler_1 = __webpack_require__(/*! ./common/borderBoxFormatHandler */ "./packages/roosterjs-content-model-dom/lib/formatHandlers/common/borderBoxFormatHandler.ts");
21199
+ var borderColorFormatHandler_1 = __webpack_require__(/*! ./common/borderColorFormatHandler */ "./packages/roosterjs-content-model-dom/lib/formatHandlers/common/borderColorFormatHandler.ts");
21067
21200
  var borderFormatHandler_1 = __webpack_require__(/*! ./common/borderFormatHandler */ "./packages/roosterjs-content-model-dom/lib/formatHandlers/common/borderFormatHandler.ts");
21068
21201
  var boxShadowFormatHandler_1 = __webpack_require__(/*! ./common/boxShadowFormatHandler */ "./packages/roosterjs-content-model-dom/lib/formatHandlers/common/boxShadowFormatHandler.ts");
21069
21202
  var datasetFormatHandler_1 = __webpack_require__(/*! ./common/datasetFormatHandler */ "./packages/roosterjs-content-model-dom/lib/formatHandlers/common/datasetFormatHandler.ts");
@@ -21078,9 +21211,11 @@ var htmlAlignFormatHandler_1 = __webpack_require__(/*! ./block/htmlAlignFormatHa
21078
21211
  var idFormatHandler_1 = __webpack_require__(/*! ./common/idFormatHandler */ "./packages/roosterjs-content-model-dom/lib/formatHandlers/common/idFormatHandler.ts");
21079
21212
  var imageStateFormatHandler_1 = __webpack_require__(/*! ./segment/imageStateFormatHandler */ "./packages/roosterjs-content-model-dom/lib/formatHandlers/segment/imageStateFormatHandler.ts");
21080
21213
  var italicFormatHandler_1 = __webpack_require__(/*! ./segment/italicFormatHandler */ "./packages/roosterjs-content-model-dom/lib/formatHandlers/segment/italicFormatHandler.ts");
21214
+ var legacyTableBorderFormatHandler_1 = __webpack_require__(/*! ./table/legacyTableBorderFormatHandler */ "./packages/roosterjs-content-model-dom/lib/formatHandlers/table/legacyTableBorderFormatHandler.ts");
21081
21215
  var letterSpacingFormatHandler_1 = __webpack_require__(/*! ./segment/letterSpacingFormatHandler */ "./packages/roosterjs-content-model-dom/lib/formatHandlers/segment/letterSpacingFormatHandler.ts");
21082
21216
  var lineHeightFormatHandler_1 = __webpack_require__(/*! ./block/lineHeightFormatHandler */ "./packages/roosterjs-content-model-dom/lib/formatHandlers/block/lineHeightFormatHandler.ts");
21083
21217
  var linkFormatHandler_1 = __webpack_require__(/*! ./segment/linkFormatHandler */ "./packages/roosterjs-content-model-dom/lib/formatHandlers/segment/linkFormatHandler.ts");
21218
+ var listItemAlignFormatHandler_1 = __webpack_require__(/*! ./list/listItemAlignFormatHandler */ "./packages/roosterjs-content-model-dom/lib/formatHandlers/list/listItemAlignFormatHandler.ts");
21084
21219
  var listItemThreadFormatHandler_1 = __webpack_require__(/*! ./list/listItemThreadFormatHandler */ "./packages/roosterjs-content-model-dom/lib/formatHandlers/list/listItemThreadFormatHandler.ts");
21085
21220
  var listLevelThreadFormatHandler_1 = __webpack_require__(/*! ./list/listLevelThreadFormatHandler */ "./packages/roosterjs-content-model-dom/lib/formatHandlers/list/listLevelThreadFormatHandler.ts");
21086
21221
  var listStyleFormatHandler_1 = __webpack_require__(/*! ./list/listStyleFormatHandler */ "./packages/roosterjs-content-model-dom/lib/formatHandlers/list/listStyleFormatHandler.ts");
@@ -21107,6 +21242,7 @@ var defaultFormatHandlerMap = {
21107
21242
  bold: boldFormatHandler_1.boldFormatHandler,
21108
21243
  border: borderFormatHandler_1.borderFormatHandler,
21109
21244
  borderBox: borderBoxFormatHandler_1.borderBoxFormatHandler,
21245
+ borderColor: borderColorFormatHandler_1.borderColorFormatHandler,
21110
21246
  boxShadow: boxShadowFormatHandler_1.boxShadowFormatHandler,
21111
21247
  dataset: datasetFormatHandler_1.datasetFormatHandler,
21112
21248
  direction: directionFormatHandler_1.directionFormatHandler,
@@ -21119,9 +21255,11 @@ var defaultFormatHandlerMap = {
21119
21255
  id: idFormatHandler_1.idFormatHandler,
21120
21256
  imageState: imageStateFormatHandler_1.imageStateFormatHandler,
21121
21257
  italic: italicFormatHandler_1.italicFormatHandler,
21258
+ legacyTableBorder: legacyTableBorderFormatHandler_1.legacyTableBorderFormatHandler,
21122
21259
  letterSpacing: letterSpacingFormatHandler_1.letterSpacingFormatHandler,
21123
21260
  lineHeight: lineHeightFormatHandler_1.lineHeightFormatHandler,
21124
21261
  link: linkFormatHandler_1.linkFormatHandler,
21262
+ listItemAlign: listItemAlignFormatHandler_1.listItemAlignFormatHandler,
21125
21263
  listItemThread: listItemThreadFormatHandler_1.listItemThreadFormatHandler,
21126
21264
  listLevelThread: listLevelThreadFormatHandler_1.listLevelThreadFormatHandler,
21127
21265
  listStyle: listStyleFormatHandler_1.listStyleFormatHandler,
@@ -21175,13 +21313,7 @@ exports.defaultFormatKeysPerCategory = {
21175
21313
  block: sharedBlockFormats,
21176
21314
  listItemThread: ['listItemThread'],
21177
21315
  listLevelThread: ['listLevelThread'],
21178
- listItemElement: (0, tslib_1.__spreadArray)((0, tslib_1.__spreadArray)([], (0, tslib_1.__read)(sharedBlockFormats), false), [
21179
- 'direction',
21180
- 'textAlign',
21181
- 'lineHeight',
21182
- 'margin',
21183
- 'listStyle',
21184
- ], false),
21316
+ listItemElement: (0, tslib_1.__spreadArray)((0, tslib_1.__spreadArray)([], (0, tslib_1.__read)(sharedBlockFormats), false), ['listItemAlign', 'margin', 'listStyle'], false),
21185
21317
  listLevel: ['direction', 'textAlign', 'margin', 'padding', 'listStyle', 'backgroundColor'],
21186
21318
  styleBasedSegment: (0, tslib_1.__spreadArray)((0, tslib_1.__spreadArray)([], (0, tslib_1.__read)(styleBasedSegmentFormats), false), ['textColor', 'backgroundColor', 'lineHeight'], false),
21187
21319
  elementBasedSegment: elementBasedSegmentFormats,
@@ -21196,6 +21328,7 @@ exports.defaultFormatKeysPerCategory = {
21196
21328
  ], false),
21197
21329
  tableCell: [
21198
21330
  'border',
21331
+ 'borderColor',
21199
21332
  'backgroundColor',
21200
21333
  'padding',
21201
21334
  'verticalAlign',
@@ -21220,7 +21353,7 @@ exports.defaultFormatKeysPerCategory = {
21220
21353
  'direction',
21221
21354
  'role',
21222
21355
  ],
21223
- tableBorder: ['borderBox', 'tableSpacing'],
21356
+ tableBorder: ['borderBox', 'tableSpacing', 'legacyTableBorder'],
21224
21357
  tableCellBorder: ['borderBox'],
21225
21358
  image: [
21226
21359
  'id',
@@ -21306,6 +21439,53 @@ exports.entityFormatHandler = {
21306
21439
  };
21307
21440
 
21308
21441
 
21442
+ /***/ }),
21443
+
21444
+ /***/ "./packages/roosterjs-content-model-dom/lib/formatHandlers/list/listItemAlignFormatHandler.ts":
21445
+ /*!****************************************************************************************************!*\
21446
+ !*** ./packages/roosterjs-content-model-dom/lib/formatHandlers/list/listItemAlignFormatHandler.ts ***!
21447
+ \****************************************************************************************************/
21448
+ /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
21449
+
21450
+ "use strict";
21451
+
21452
+ Object.defineProperty(exports, "__esModule", ({ value: true }));
21453
+ exports.listItemAlignFormatHandler = void 0;
21454
+ var dir_1 = __webpack_require__(/*! ../utils/dir */ "./packages/roosterjs-content-model-dom/lib/formatHandlers/utils/dir.ts");
21455
+ /**
21456
+ * @internal
21457
+ */
21458
+ exports.listItemAlignFormatHandler = {
21459
+ parse: function (format, element, context) {
21460
+ var _a;
21461
+ // For list, we usually use align-self to implement alignment
21462
+ if (element.style.alignSelf) {
21463
+ format.textAlign = (0, dir_1.calcAlign)(element.style.alignSelf, context.blockFormat.direction);
21464
+ }
21465
+ else if (element.style.textAlign && ((_a = element.parentElement) === null || _a === void 0 ? void 0 : _a.style.display) !== 'flex') {
21466
+ var align = element.style.textAlign;
21467
+ // For RTL environment, 'start' and 'end' in textAlign means opposite direction compared to LTR unless parent is using flex display
21468
+ if (context.blockFormat.direction === 'rtl' && (align == 'start' || align == 'end')) {
21469
+ align = align == 'start' ? 'end' : 'start';
21470
+ }
21471
+ format.textAlign = (0, dir_1.calcAlign)(align, context.blockFormat.direction);
21472
+ }
21473
+ },
21474
+ apply: function (format, element) {
21475
+ if (format.textAlign) {
21476
+ var parent_1 = element.parentElement;
21477
+ element.style.alignSelf = format.textAlign;
21478
+ // For list item we use align-self to implement textAlign rather than text-align
21479
+ element.style.removeProperty('text-align');
21480
+ if (parent_1) {
21481
+ parent_1.style.flexDirection = 'column';
21482
+ parent_1.style.display = 'flex';
21483
+ }
21484
+ }
21485
+ },
21486
+ };
21487
+
21488
+
21309
21489
  /***/ }),
21310
21490
 
21311
21491
  /***/ "./packages/roosterjs-content-model-dom/lib/formatHandlers/list/listItemThreadFormatHandler.ts":
@@ -21981,6 +22161,50 @@ exports.underlineFormatHandler = {
21981
22161
  };
21982
22162
 
21983
22163
 
22164
+ /***/ }),
22165
+
22166
+ /***/ "./packages/roosterjs-content-model-dom/lib/formatHandlers/table/legacyTableBorderFormatHandler.ts":
22167
+ /*!*********************************************************************************************************!*\
22168
+ !*** ./packages/roosterjs-content-model-dom/lib/formatHandlers/table/legacyTableBorderFormatHandler.ts ***!
22169
+ \*********************************************************************************************************/
22170
+ /***/ ((__unused_webpack_module, exports) => {
22171
+
22172
+ "use strict";
22173
+
22174
+ Object.defineProperty(exports, "__esModule", ({ value: true }));
22175
+ exports.legacyTableBorderFormatHandler = void 0;
22176
+ /**
22177
+ * @internal
22178
+ */
22179
+ exports.legacyTableBorderFormatHandler = {
22180
+ parse: function (format, element) {
22181
+ var border = element.getAttribute('border');
22182
+ var cellSpacing = element.getAttribute('cellspacing');
22183
+ var cellpadding = element.getAttribute('cellpadding');
22184
+ if (border) {
22185
+ format.legacyTableBorder = border;
22186
+ }
22187
+ if (cellSpacing) {
22188
+ format.cellSpacing = cellSpacing;
22189
+ }
22190
+ if (cellpadding) {
22191
+ format.cellPadding = cellpadding;
22192
+ }
22193
+ },
22194
+ apply: function (format, element) {
22195
+ if (format.legacyTableBorder) {
22196
+ element.setAttribute('border', format.legacyTableBorder);
22197
+ }
22198
+ if (format.cellSpacing) {
22199
+ element.setAttribute('cellspacing', format.cellSpacing);
22200
+ }
22201
+ if (format.cellPadding) {
22202
+ element.setAttribute('cellpadding', format.cellPadding);
22203
+ }
22204
+ },
22205
+ };
22206
+
22207
+
21984
22208
  /***/ }),
21985
22209
 
21986
22210
  /***/ "./packages/roosterjs-content-model-dom/lib/formatHandlers/table/tableLayoutFormatHandler.ts":
@@ -22025,7 +22249,6 @@ Object.defineProperty(exports, "__esModule", ({ value: true }));
22025
22249
  exports.tableSpacingFormatHandler = void 0;
22026
22250
  var BorderCollapsed = 'collapse';
22027
22251
  var BorderSeparate = 'separate';
22028
- var CellPadding = 'cellPadding';
22029
22252
  /**
22030
22253
  * @internal
22031
22254
  */
@@ -22034,12 +22257,6 @@ exports.tableSpacingFormatHandler = {
22034
22257
  if (element.style.borderCollapse == BorderCollapsed) {
22035
22258
  format.borderCollapse = true;
22036
22259
  }
22037
- else {
22038
- var cellPadding = element.getAttribute(CellPadding);
22039
- if (cellPadding) {
22040
- format.borderCollapse = true;
22041
- }
22042
- }
22043
22260
  if (element.style.borderCollapse == BorderSeparate) {
22044
22261
  format.borderSeparate = true;
22045
22262
  }
@@ -22087,6 +22304,38 @@ exports.textColorOnTableCellFormatHandler = {
22087
22304
  };
22088
22305
 
22089
22306
 
22307
+ /***/ }),
22308
+
22309
+ /***/ "./packages/roosterjs-content-model-dom/lib/formatHandlers/utils/borderKeys.ts":
22310
+ /*!*************************************************************************************!*\
22311
+ !*** ./packages/roosterjs-content-model-dom/lib/formatHandlers/utils/borderKeys.ts ***!
22312
+ \*************************************************************************************/
22313
+ /***/ ((__unused_webpack_module, exports) => {
22314
+
22315
+ "use strict";
22316
+
22317
+ Object.defineProperty(exports, "__esModule", ({ value: true }));
22318
+ exports.BorderColorKeyMap = exports.BorderKeys = void 0;
22319
+ /**
22320
+ * Keys of border items
22321
+ */
22322
+ exports.BorderKeys = [
22323
+ 'borderTop',
22324
+ 'borderRight',
22325
+ 'borderBottom',
22326
+ 'borderLeft',
22327
+ ];
22328
+ /**
22329
+ * @internal
22330
+ */
22331
+ exports.BorderColorKeyMap = {
22332
+ borderTop: 'border-top-color',
22333
+ borderRight: 'border-right-color',
22334
+ borderBottom: 'border-bottom-color',
22335
+ borderLeft: 'border-left-color',
22336
+ };
22337
+
22338
+
22090
22339
  /***/ }),
22091
22340
 
22092
22341
  /***/ "./packages/roosterjs-content-model-dom/lib/formatHandlers/utils/color.ts":
@@ -22098,8 +22347,9 @@ exports.textColorOnTableCellFormatHandler = {
22098
22347
  "use strict";
22099
22348
 
22100
22349
  Object.defineProperty(exports, "__esModule", ({ value: true }));
22101
- exports.parseColor = exports.defaultGenerateColorKey = exports.setColor = exports.getColor = exports.DeprecatedColors = void 0;
22350
+ exports.parseColor = exports.defaultGenerateColorKey = exports.adaptColor = exports.setColor = exports.retrieveElementColor = exports.getLightModeColor = exports.getColor = exports.DeprecatedColors = void 0;
22102
22351
  var tslib_1 = __webpack_require__(/*! tslib */ "./node_modules/tslib/tslib.es6.mjs");
22352
+ var borderKeys_1 = __webpack_require__(/*! ./borderKeys */ "./packages/roosterjs-content-model-dom/lib/formatHandlers/utils/borderKeys.ts");
22103
22353
  var getObjectKeys_1 = __webpack_require__(/*! ../../domUtils/getObjectKeys */ "./packages/roosterjs-content-model-dom/lib/domUtils/getObjectKeys.ts");
22104
22354
  /**
22105
22355
  * List of deprecated colors
@@ -22147,13 +22397,20 @@ var COLOR_VAR_PREFIX = '--darkColor';
22147
22397
  * @param fallback @optional Fallback color to use if no color is found from the element
22148
22398
  */
22149
22399
  function getColor(element, isBackground, isDarkMode, darkColorHandler, fallback) {
22150
- var color = (isBackground ? element.style.backgroundColor : element.style.color) ||
22151
- element.getAttribute(isBackground ? 'bgcolor' : 'color') ||
22152
- fallback;
22153
- if (color && exports.DeprecatedColors.indexOf(color) > -1) {
22154
- color = isBackground ? undefined : BlackColor;
22400
+ var color = retrieveElementColor(element, isBackground ? 'background' : 'text', fallback);
22401
+ return color
22402
+ ? getLightModeColor(color, isDarkMode, darkColorHandler, isBackground ? undefined : BlackColor)
22403
+ : undefined;
22404
+ }
22405
+ exports.getColor = getColor;
22406
+ /**
22407
+ * @internal
22408
+ */
22409
+ function getLightModeColor(color, isDarkMode, darkColorHandler, fallback) {
22410
+ if (exports.DeprecatedColors.indexOf(color) > -1) {
22411
+ return fallback;
22155
22412
  }
22156
- else if (darkColorHandler && color) {
22413
+ else if (darkColorHandler) {
22157
22414
  var match = color.startsWith(VARIABLE_PREFIX) ? VARIABLE_REGEX.exec(color) : null;
22158
22415
  if (match) {
22159
22416
  color = match[2] || '';
@@ -22162,12 +22419,26 @@ function getColor(element, isBackground, isDarkMode, darkColorHandler, fallback)
22162
22419
  // If editor is in dark mode but the color is not in dark color format, it is possible the color was inserted from external code
22163
22420
  // without any light color info. So we first try to see if there is a known dark color can match this color, and use its related
22164
22421
  // light color as light mode color. Otherwise we need to drop this color to avoid show "white on white" content.
22165
- color = findLightColorFromDarkColor(color, darkColorHandler.knownColors) || '';
22422
+ return findLightColorFromDarkColor(color, darkColorHandler.knownColors) || '';
22166
22423
  }
22167
22424
  }
22168
22425
  return color;
22169
22426
  }
22170
- exports.getColor = getColor;
22427
+ exports.getLightModeColor = getLightModeColor;
22428
+ /**
22429
+ * @internal
22430
+ */
22431
+ function retrieveElementColor(element, source, fallback) {
22432
+ switch (source) {
22433
+ case 'text':
22434
+ return element.style.color || element.getAttribute('color') || fallback;
22435
+ case 'background':
22436
+ return element.style.backgroundColor || element.getAttribute('bgcolor') || fallback;
22437
+ default:
22438
+ return element.style.getPropertyValue(borderKeys_1.BorderColorKeyMap[source]) || fallback;
22439
+ }
22440
+ }
22441
+ exports.retrieveElementColor = retrieveElementColor;
22171
22442
  /**
22172
22443
  * Set color to given HTML element
22173
22444
  * @param element The element to set color to
@@ -22177,12 +22448,20 @@ exports.getColor = getColor;
22177
22448
  * @param darkColorHandler @optional The dark color handler object to help manager dark mode color
22178
22449
  */
22179
22450
  function setColor(element, color, isBackground, isDarkMode, darkColorHandler) {
22451
+ var newColor = adaptColor(element, color, isBackground ? 'background' : 'text', isDarkMode, darkColorHandler);
22452
+ element.removeAttribute(isBackground ? 'bgcolor' : 'color');
22453
+ element.style.setProperty(isBackground ? 'background-color' : 'color', newColor || null);
22454
+ }
22455
+ exports.setColor = setColor;
22456
+ /**
22457
+ * @internal
22458
+ */
22459
+ function adaptColor(element, color, colorType, isDarkMode, darkColorHandler) {
22180
22460
  var _a, _b;
22181
22461
  var match = color && color.startsWith(VARIABLE_PREFIX) ? VARIABLE_REGEX.exec(color) : null;
22182
22462
  var _c = (0, tslib_1.__read)(match !== null && match !== void 0 ? match : [], 3), _ = _c[0], existingKey = _c[1], fallbackColor = _c[2];
22183
22463
  color = fallbackColor !== null && fallbackColor !== void 0 ? fallbackColor : color;
22184
22464
  if (darkColorHandler && color) {
22185
- var colorType = isBackground ? 'background' : 'text';
22186
22465
  var key = existingKey ||
22187
22466
  darkColorHandler.generateColorKey(color, undefined /*baseLValue*/, colorType, element);
22188
22467
  var darkModeColor = ((_b = (_a = darkColorHandler.knownColors) === null || _a === void 0 ? void 0 : _a[key]) === null || _b === void 0 ? void 0 : _b.darkModeColor) ||
@@ -22193,10 +22472,9 @@ function setColor(element, color, isBackground, isDarkMode, darkColorHandler) {
22193
22472
  });
22194
22473
  color = isDarkMode ? "" + VARIABLE_PREFIX + key + ", " + color + VARIABLE_POSTFIX : color;
22195
22474
  }
22196
- element.removeAttribute(isBackground ? 'bgcolor' : 'color');
22197
- element.style.setProperty(isBackground ? 'background-color' : 'color', color || null);
22475
+ return color;
22198
22476
  }
22199
- exports.setColor = setColor;
22477
+ exports.adaptColor = adaptColor;
22200
22478
  /**
22201
22479
  * Generate color key for dark color
22202
22480
  * @param lightColor The input light color
@@ -22432,10 +22710,10 @@ exports.shouldSetValue = shouldSetValue;
22432
22710
  "use strict";
22433
22711
 
22434
22712
  Object.defineProperty(exports, "__esModule", ({ value: true }));
22435
- exports.createContentModelDocument = exports.createImage = exports.createText = exports.createTableCell = exports.createTable = exports.createSelectionMarker = exports.createParagraph = exports.createFormatContainer = exports.createListItem = exports.createBr = exports.isLinkUndeletable = exports.setLinkUndeletable = exports.scrollRectIntoView = exports.normalizeRect = exports.isWhiteSpacePreserved = exports.reuseCachedElement = exports.findClosestBlockEntityContainer = exports.isBlockEntityContainer = exports.isEntityDelimiter = exports.addDelimiters = exports.generateEntityClassNames = exports.parseEntityFormat = exports.getAllEntityWrappers = exports.findClosestEntityWrapper = exports.isEntityElement = exports.unwrap = exports.wrap = exports.wrapAllChildNodes = exports.moveChildNodes = exports.toArray = exports.getSafeIdSelector = exports.getObjectKeys = exports.isElementOfType = exports.isNodeOfType = exports.hasMetadata = exports.getMetadata = exports.updateMetadata = exports.buildSelectionMarker = exports.isBlockElement = exports.areSameFormats = exports.parseFormat = exports.getRegularSelectionOffsets = exports.tableProcessor = exports.entityProcessor = exports.processChildNode = exports.handleRegularSelection = exports.childProcessor = exports.contentModelToText = exports.contentModelToDom = exports.domToContentModel = void 0;
22436
- exports.isModifierKey = exports.isCharacterValue = exports.getDOMInsertPointRect = exports.getSelectionRootNode = exports.isBold = exports.createModelToDomConfig = exports.createModelToDomContextWithConfig = exports.createModelToDomContext = exports.createDomToModelConfig = exports.createDomToModelContextWithConfig = exports.createDomToModelContext = exports.defaultGenerateColorKey = exports.parseColor = exports.setColor = exports.getColor = exports.DeprecatedColors = exports.BorderKeys = exports.parseValueWithUnit = exports.getAutoListStyleType = exports.getOrderedListNumberStr = exports.ParagraphFormats = exports.ListFormatsToMove = exports.ListFormatsToKeep = exports.ListFormats = exports.copyFormat = exports.setParagraphNotImplicit = exports.normalizeSegmentFormat = exports.mergeTextSegments = exports.normalizeSingleSegment = exports.isEmpty = exports.addSegment = exports.unwrapBlock = exports.isGeneralSegment = exports.normalizeContentModel = exports.normalizeParagraph = exports.addTextSegment = exports.addLink = exports.addCode = exports.addBlock = exports.mutateSegment = exports.mutateSegments = exports.mutateBlock = exports.createTableRow = exports.createEmptyModel = exports.createListLevel = exports.createDivider = exports.createEntity = exports.createGeneralBlock = exports.createGeneralSegment = exports.createParagraphDecorator = void 0;
22437
- exports.updateTableCellMetadata = exports.getImageMetadata = exports.updateImageMetadata = exports.runEditSteps = exports.getClosestAncestorBlockGroupIndex = exports.getSegmentTextFormat = exports.getListStyleTypeFromString = exports.retrieveModelFormatState = exports.setTableCellBackgroundColor = exports.MIN_ALLOWED_TABLE_CELL_HEIGHT = exports.MIN_ALLOWED_TABLE_CELL_WIDTH = exports.normalizeTable = exports.setFirstColumnFormatBorders = exports.applyTableFormat = exports.deleteBlock = exports.deleteSegment = exports.deleteSelection = exports.mergeModel = exports.cloneModel = exports.setSelection = exports.hasSelectionInBlockGroup = exports.hasSelectionInSegment = exports.hasSelectionInBlock = exports.getSelectedCells = exports.getSelectedSegmentsAndParagraphs = exports.getSelectedSegments = exports.getSelectedParagraphs = exports.getOperationalBlocks = exports.getFirstSelectedTable = exports.getFirstSelectedListItem = exports.iterateSelections = exports.isBlockGroupOfType = exports.getRangesByText = exports.getImageState = exports.setImageState = exports.getParagraphMarker = exports.setParagraphMarker = exports.cacheGetEventData = exports.extractClipboardItems = exports.normalizeFontFamily = exports.transformColor = exports.retrieveDocumentMetadata = exports.readFile = exports.parseTableCells = exports.normalizeText = exports.isSpace = exports.isPunctuation = exports.extractBorderValues = exports.combineBorderValue = exports.isCursorMovingKey = void 0;
22438
- exports.EmptySegmentFormat = exports.UnorderedListStyleMap = exports.OrderedListStyleMap = exports.TableBorderFormat = exports.NumberingListType = exports.BulletListType = exports.ChangeSource = exports.ListMetadataDefinition = exports.getListMetadata = exports.updateListMetadata = exports.getTableMetadata = exports.updateTableMetadata = exports.getTableCellMetadata = void 0;
22713
+ exports.createImage = exports.createText = exports.createTableCell = exports.createTable = exports.createSelectionMarker = exports.createParagraph = exports.createFormatContainer = exports.createListItem = exports.createBr = exports.isLinkUndeletable = exports.setLinkUndeletable = exports.scrollRectIntoView = exports.normalizeRect = exports.isWhiteSpacePreserved = exports.reuseCachedElement = exports.findClosestBlockEntityContainer = exports.isBlockEntityContainer = exports.isEntityDelimiter = exports.addDelimiters = exports.generateEntityClassNames = exports.parseEntityFormat = exports.getAllEntityWrappers = exports.findClosestEntityWrapper = exports.isEntityElement = exports.unwrap = exports.wrap = exports.wrapAllChildNodes = exports.moveChildNodes = exports.toArray = exports.getSafeIdSelector = exports.getObjectKeys = exports.isElementOfType = exports.isNodeOfType = exports.hasMetadata = exports.getMetadata = exports.updateMetadata = exports.buildSelectionMarker = exports.isBlockElement = exports.areSameFormats = exports.parseFormat = exports.getRegularSelectionOffsets = exports.formatContainerProcessor = exports.tableProcessor = exports.entityProcessor = exports.processChildNode = exports.handleRegularSelection = exports.childProcessor = exports.contentModelToText = exports.contentModelToDom = exports.domToContentModel = void 0;
22714
+ exports.isCharacterValue = exports.getDOMInsertPointRect = exports.getSelectionRootNode = exports.isBold = exports.createModelToDomConfig = exports.createModelToDomContextWithConfig = exports.createModelToDomContext = exports.createDomToModelConfig = exports.createDomToModelContextWithConfig = exports.createDomToModelContext = exports.defaultGenerateColorKey = exports.parseColor = exports.setColor = exports.getColor = exports.DeprecatedColors = exports.BorderKeys = exports.parseValueWithUnit = exports.getAutoListStyleType = exports.getOrderedListNumberStr = exports.ParagraphFormats = exports.ListFormatsToMove = exports.ListFormatsToKeep = exports.ListFormats = exports.copyFormat = exports.setParagraphNotImplicit = exports.normalizeSegmentFormat = exports.mergeTextSegments = exports.normalizeSingleSegment = exports.isEmpty = exports.addSegment = exports.unwrapBlock = exports.isGeneralSegment = exports.normalizeContentModel = exports.normalizeParagraph = exports.addTextSegment = exports.addLink = exports.addCode = exports.addBlock = exports.mutateSegment = exports.mutateSegments = exports.mutateBlock = exports.createTableRow = exports.createEmptyModel = exports.createListLevel = exports.createDivider = exports.createEntity = exports.createGeneralBlock = exports.createGeneralSegment = exports.createParagraphDecorator = exports.createContentModelDocument = void 0;
22715
+ exports.getImageMetadata = exports.updateImageMetadata = exports.runEditSteps = exports.getClosestAncestorBlockGroupIndex = exports.getSegmentTextFormat = exports.getListStyleTypeFromString = exports.retrieveModelFormatState = exports.setTableCellBackgroundColor = exports.MIN_ALLOWED_TABLE_CELL_HEIGHT = exports.MIN_ALLOWED_TABLE_CELL_WIDTH = exports.normalizeTable = exports.setFirstColumnFormatBorders = exports.applyTableFormat = exports.deleteBlock = exports.deleteSegment = exports.deleteSelection = exports.mergeModel = exports.cloneModel = exports.setSelection = exports.hasSelectionInBlockGroup = exports.hasSelectionInSegment = exports.hasSelectionInBlock = exports.getSelectedCells = exports.getSelectedSegmentsAndParagraphs = exports.getSelectedSegments = exports.getSelectedParagraphs = exports.getOperationalBlocks = exports.getFirstSelectedTable = exports.getFirstSelectedListItem = exports.iterateSelections = exports.isBlockGroupOfType = exports.getRangesByText = exports.getImageState = exports.setImageState = exports.getParagraphMarker = exports.setParagraphMarker = exports.cacheGetEventData = exports.extractClipboardItems = exports.normalizeFontFamily = exports.transformColor = exports.retrieveDocumentMetadata = exports.readFile = exports.parseTableCells = exports.normalizeText = exports.isSpace = exports.isPunctuation = exports.extractBorderValues = exports.combineBorderValue = exports.isCursorMovingKey = exports.isModifierKey = void 0;
22716
+ exports.EmptySegmentFormat = exports.UnorderedListStyleMap = exports.OrderedListStyleMap = exports.TableBorderFormat = exports.NumberingListType = exports.BulletListType = exports.ChangeSource = exports.ListMetadataDefinition = exports.getListMetadata = exports.updateListMetadata = exports.getTableMetadata = exports.updateTableMetadata = exports.getTableCellMetadata = exports.updateTableCellMetadata = void 0;
22439
22717
  var domToContentModel_1 = __webpack_require__(/*! ./domToModel/domToContentModel */ "./packages/roosterjs-content-model-dom/lib/domToModel/domToContentModel.ts");
22440
22718
  Object.defineProperty(exports, "domToContentModel", ({ enumerable: true, get: function () { return domToContentModel_1.domToContentModel; } }));
22441
22719
  var contentModelToDom_1 = __webpack_require__(/*! ./modelToDom/contentModelToDom */ "./packages/roosterjs-content-model-dom/lib/modelToDom/contentModelToDom.ts");
@@ -22450,6 +22728,8 @@ var entityProcessor_1 = __webpack_require__(/*! ./domToModel/processors/entityPr
22450
22728
  Object.defineProperty(exports, "entityProcessor", ({ enumerable: true, get: function () { return entityProcessor_1.entityProcessor; } }));
22451
22729
  var tableProcessor_1 = __webpack_require__(/*! ./domToModel/processors/tableProcessor */ "./packages/roosterjs-content-model-dom/lib/domToModel/processors/tableProcessor.ts");
22452
22730
  Object.defineProperty(exports, "tableProcessor", ({ enumerable: true, get: function () { return tableProcessor_1.tableProcessor; } }));
22731
+ var formatContainerProcessor_1 = __webpack_require__(/*! ./domToModel/processors/formatContainerProcessor */ "./packages/roosterjs-content-model-dom/lib/domToModel/processors/formatContainerProcessor.ts");
22732
+ Object.defineProperty(exports, "formatContainerProcessor", ({ enumerable: true, get: function () { return formatContainerProcessor_1.formatContainerProcessor; } }));
22453
22733
  var getRegularSelectionOffsets_1 = __webpack_require__(/*! ./domToModel/utils/getRegularSelectionOffsets */ "./packages/roosterjs-content-model-dom/lib/domToModel/utils/getRegularSelectionOffsets.ts");
22454
22734
  Object.defineProperty(exports, "getRegularSelectionOffsets", ({ enumerable: true, get: function () { return getRegularSelectionOffsets_1.getRegularSelectionOffsets; } }));
22455
22735
  var parseFormat_1 = __webpack_require__(/*! ./domToModel/utils/parseFormat */ "./packages/roosterjs-content-model-dom/lib/domToModel/utils/parseFormat.ts");
@@ -22582,8 +22862,8 @@ var getAutoListStyleType_1 = __webpack_require__(/*! ./modelApi/list/getAutoList
22582
22862
  Object.defineProperty(exports, "getAutoListStyleType", ({ enumerable: true, get: function () { return getAutoListStyleType_1.getAutoListStyleType; } }));
22583
22863
  var parseValueWithUnit_1 = __webpack_require__(/*! ./formatHandlers/utils/parseValueWithUnit */ "./packages/roosterjs-content-model-dom/lib/formatHandlers/utils/parseValueWithUnit.ts");
22584
22864
  Object.defineProperty(exports, "parseValueWithUnit", ({ enumerable: true, get: function () { return parseValueWithUnit_1.parseValueWithUnit; } }));
22585
- var borderFormatHandler_1 = __webpack_require__(/*! ./formatHandlers/common/borderFormatHandler */ "./packages/roosterjs-content-model-dom/lib/formatHandlers/common/borderFormatHandler.ts");
22586
- Object.defineProperty(exports, "BorderKeys", ({ enumerable: true, get: function () { return borderFormatHandler_1.BorderKeys; } }));
22865
+ var borderKeys_1 = __webpack_require__(/*! ./formatHandlers/utils/borderKeys */ "./packages/roosterjs-content-model-dom/lib/formatHandlers/utils/borderKeys.ts");
22866
+ Object.defineProperty(exports, "BorderKeys", ({ enumerable: true, get: function () { return borderKeys_1.BorderKeys; } }));
22587
22867
  var color_1 = __webpack_require__(/*! ./formatHandlers/utils/color */ "./packages/roosterjs-content-model-dom/lib/formatHandlers/utils/color.ts");
22588
22868
  Object.defineProperty(exports, "DeprecatedColors", ({ enumerable: true, get: function () { return color_1.DeprecatedColors; } }));
22589
22869
  Object.defineProperty(exports, "getColor", ({ enumerable: true, get: function () { return color_1.getColor; } }));
@@ -23586,10 +23866,10 @@ function normalizeLastTextSegment(paragraph, segment, lastInlineSegment) {
23586
23866
  Object.defineProperty(exports, "__esModule", ({ value: true }));
23587
23867
  exports.normalizeSegmentFormat = void 0;
23588
23868
  var createContentModelDocument_1 = __webpack_require__(/*! ../creators/createContentModelDocument */ "./packages/roosterjs-content-model-dom/lib/modelApi/creators/createContentModelDocument.ts");
23869
+ var createDomToModelContext_1 = __webpack_require__(/*! ../../domToModel/context/createDomToModelContext */ "./packages/roosterjs-content-model-dom/lib/domToModel/context/createDomToModelContext.ts");
23870
+ var createModelToDomContext_1 = __webpack_require__(/*! ../../modelToDom/context/createModelToDomContext */ "./packages/roosterjs-content-model-dom/lib/modelToDom/context/createModelToDomContext.ts");
23589
23871
  var createText_1 = __webpack_require__(/*! ../creators/createText */ "./packages/roosterjs-content-model-dom/lib/modelApi/creators/createText.ts");
23590
23872
  var ensureParagraph_1 = __webpack_require__(/*! ./ensureParagraph */ "./packages/roosterjs-content-model-dom/lib/modelApi/common/ensureParagraph.ts");
23591
- var createModelToDomContext_1 = __webpack_require__(/*! ../../modelToDom/context/createModelToDomContext */ "./packages/roosterjs-content-model-dom/lib/modelToDom/context/createModelToDomContext.ts");
23592
- var createDomToModelContext_1 = __webpack_require__(/*! ../../domToModel/context/createDomToModelContext */ "./packages/roosterjs-content-model-dom/lib/domToModel/context/createDomToModelContext.ts");
23593
23873
  /**
23594
23874
  * Some format values can be changed when apply to DOM, such as font family.
23595
23875
  * This function will normalize the format and return the same string after DOM modification.
@@ -23598,7 +23878,7 @@ var createDomToModelContext_1 = __webpack_require__(/*! ../../domToModel/context
23598
23878
  */
23599
23879
  function normalizeSegmentFormat(format, environment) {
23600
23880
  var _a, _b;
23601
- var span = document.createElement('span');
23881
+ var span = environment.document.createElement('span');
23602
23882
  var segment = (0, createText_1.createText)('text', format);
23603
23883
  var domToModelContext = (0, createDomToModelContext_1.createDomToModelContextWithConfig)(environment.domToModelSettings.calculated);
23604
23884
  var modelToDomContext = (0, createModelToDomContext_1.createModelToDomContextWithConfig)(environment.modelToDomSettings.calculated);
@@ -24235,7 +24515,7 @@ var _a;
24235
24515
  Object.defineProperty(exports, "__esModule", ({ value: true }));
24236
24516
  exports.setFirstColumnFormatBorders = exports.applyTableFormat = void 0;
24237
24517
  var tslib_1 = __webpack_require__(/*! tslib */ "./node_modules/tslib/tslib.es6.mjs");
24238
- var borderFormatHandler_1 = __webpack_require__(/*! ../../formatHandlers/common/borderFormatHandler */ "./packages/roosterjs-content-model-dom/lib/formatHandlers/common/borderFormatHandler.ts");
24518
+ var borderKeys_1 = __webpack_require__(/*! ../../formatHandlers/utils/borderKeys */ "./packages/roosterjs-content-model-dom/lib/formatHandlers/utils/borderKeys.ts");
24239
24519
  var borderValues_1 = __webpack_require__(/*! ../../domUtils/style/borderValues */ "./packages/roosterjs-content-model-dom/lib/domUtils/style/borderValues.ts");
24240
24520
  var mutate_1 = __webpack_require__(/*! ../common/mutate */ "./packages/roosterjs-content-model-dom/lib/modelApi/common/mutate.ts");
24241
24521
  var setTableCellBackgroundColor_1 = __webpack_require__(/*! ./setTableCellBackgroundColor */ "./packages/roosterjs-content-model-dom/lib/modelApi/editing/setTableCellBackgroundColor.ts");
@@ -24398,7 +24678,7 @@ function formatCells(rows, format, metaOverrides) {
24398
24678
  ];
24399
24679
  transparentBorderMatrix === null || transparentBorderMatrix === void 0 ? void 0 : transparentBorderMatrix.forEach(function (alwaysUseTransparent, i) {
24400
24680
  var borderColor = (!alwaysUseTransparent && formatColor_1[i]) || '';
24401
- cell.format[borderFormatHandler_1.BorderKeys[i]] = (0, borderValues_1.combineBorderValue)({
24681
+ cell.format[borderKeys_1.BorderKeys[i]] = (0, borderValues_1.combineBorderValue)({
24402
24682
  style: getBorderStyleFromColor(borderColor),
24403
24683
  width: '1px',
24404
24684
  color: borderColor,
@@ -25658,7 +25938,7 @@ exports.MIN_ALLOWED_TABLE_CELL_HEIGHT = 22;
25658
25938
  * Normalize a Content Model table, make sure:
25659
25939
  * 1. Fist cells are not spanned
25660
25940
  * 2. Only first column and row can have headers
25661
- * 3. All cells have content and width
25941
+ * 3. All cells have content
25662
25942
  * 4. Table and table row have correct width/height
25663
25943
  * 5. Spanned cell has no child blocks
25664
25944
  * 6. default format is correctly applied
@@ -25668,9 +25948,10 @@ exports.MIN_ALLOWED_TABLE_CELL_HEIGHT = 22;
25668
25948
  function normalizeTable(readonlyTable, defaultSegmentFormat) {
25669
25949
  var _a;
25670
25950
  var table = (0, mutate_1.mutateBlock)(readonlyTable);
25671
- // Always collapse border and use border box for table in roosterjs to make layout simpler
25951
+ // Collapse border and use border box for table in roosterjs to make layout simpler
25952
+ // But if this is a legacy style table (table with deprecated border attributes), we should not change its border model
25672
25953
  var format = table.format;
25673
- if (!format.borderCollapse || !format.useBorderBox) {
25954
+ if (!format.cellSpacing && !format.cellPadding && !format.legacyTableBorder) {
25674
25955
  format.borderCollapse = true;
25675
25956
  format.useBorderBox = true;
25676
25957
  }
@@ -25702,15 +25983,6 @@ function normalizeTable(readonlyTable, defaultSegmentFormat) {
25702
25983
  row.height = exports.MIN_ALLOWED_TABLE_CELL_HEIGHT;
25703
25984
  }
25704
25985
  });
25705
- var columns = Math.max.apply(Math, (0, tslib_1.__spreadArray)([], (0, tslib_1.__read)(table.rows.map(function (row) { return row.cells.length; })), false));
25706
- for (var i = 0; i < columns; i++) {
25707
- if (table.widths[i] === undefined) {
25708
- table.widths[i] = getTableCellWidth(columns);
25709
- }
25710
- else if (table.widths[i] < exports.MIN_ALLOWED_TABLE_CELL_WIDTH) {
25711
- table.widths[i] = exports.MIN_ALLOWED_TABLE_CELL_WIDTH;
25712
- }
25713
- }
25714
25986
  // Move blocks from spanned cell to its main cell if any,
25715
25987
  // and remove rows/columns if all cells in it are spanned
25716
25988
  var colCount = ((_a = table.rows[0]) === null || _a === void 0 ? void 0 : _a.cells.length) || 0;
@@ -25724,7 +25996,13 @@ function normalizeTable(readonlyTable, defaultSegmentFormat) {
25724
25996
  });
25725
25997
  if (table.rows.every(function (row) { var _a; return (_a = row.cells[colIndex]) === null || _a === void 0 ? void 0 : _a.spanLeft; })) {
25726
25998
  table.rows.forEach(function (row) { return row.cells.splice(colIndex, 1); });
25727
- table.widths.splice(colIndex - 1, 2, table.widths[colIndex - 1] + table.widths[colIndex]);
25999
+ if (typeof table.widths[colIndex] === 'number' &&
26000
+ typeof table.widths[colIndex - 1] === 'number') {
26001
+ table.widths.splice(colIndex - 1, 2, table.widths[colIndex - 1] + table.widths[colIndex]);
26002
+ }
26003
+ else {
26004
+ table.widths.splice(colIndex, 1);
26005
+ }
25728
26006
  }
25729
26007
  };
25730
26008
  for (var colIndex = colCount - 1; colIndex > 0; colIndex--) {
@@ -25749,17 +26027,6 @@ function normalizeTable(readonlyTable, defaultSegmentFormat) {
25749
26027
  }
25750
26028
  }
25751
26029
  exports.normalizeTable = normalizeTable;
25752
- function getTableCellWidth(columns) {
25753
- if (columns <= 4) {
25754
- return 120;
25755
- }
25756
- else if (columns <= 6) {
25757
- return 100;
25758
- }
25759
- else {
25760
- return 70;
25761
- }
25762
- }
25763
26030
  function tryMoveBlocks(targetCell, sourceCell) {
25764
26031
  var _a;
25765
26032
  var onlyHasEmptyOrBr = sourceCell.blocks.every(function (block) { return block.blockType == 'Paragraph' && hasOnlyBrSegment(block.segments); });
@@ -28110,7 +28377,7 @@ var parseValueWithUnit_1 = __webpack_require__(/*! ../../formatHandlers/utils/pa
28110
28377
  */
28111
28378
  var handleImage = function (doc, parent, imageModel, context, segmentNodes) {
28112
28379
  var img = doc.createElement('img');
28113
- var element = document.createElement('span');
28380
+ var element = doc.createElement('span');
28114
28381
  parent.appendChild(element);
28115
28382
  element.appendChild(img);
28116
28383
  img.src = imageModel.src;
@@ -30591,8 +30858,12 @@ function retrieveStringFromParsedTable(tsInfo) {
30591
30858
  var parsedTable = tsInfo.parsedTable, firstCo = tsInfo.firstCo, lastCo = tsInfo.lastCo;
30592
30859
  var result = '';
30593
30860
  if (lastCo) {
30594
- for (var r = firstCo.row; r <= lastCo.row; r++) {
30595
- for (var c = firstCo.col; c <= lastCo.col; c++) {
30861
+ var firstCol = Math.min(firstCo.col, lastCo.col);
30862
+ var lastCol = Math.max(firstCo.col, lastCo.col);
30863
+ var firstRow = Math.min(firstCo.row, lastCo.row);
30864
+ var lastRow = Math.max(firstCo.row, lastCo.row);
30865
+ for (var r = firstRow; r <= lastRow; r++) {
30866
+ for (var c = firstCol; c <= lastCol; c++) {
30596
30867
  var cell = parsedTable[r] && parsedTable[r][c];
30597
30868
  if (cell && typeof cell != 'string') {
30598
30869
  result += ' ' + cell.innerText + ',';
@@ -30640,13 +30911,6 @@ function getIsSelectingOrUnselecting(prevTableSelection, newTableSelection) {
30640
30911
  // Same area but different positions
30641
30912
  return 'selecting';
30642
30913
  }
30643
- if (prevFirstColumn !== newFirstColumn ||
30644
- prevFirstRow !== newFirstRow ||
30645
- prevLastColumn !== newLastColumn ||
30646
- prevLastRow !== newLastRow) {
30647
- return 'selecting';
30648
- }
30649
- return null;
30650
30914
  }
30651
30915
  exports.getIsSelectingOrUnselecting = getIsSelectingOrUnselecting;
30652
30916
 
@@ -30722,8 +30986,8 @@ var AutoFormatPlugin = /** @class */ (function () {
30722
30986
  autoTel: autoTel,
30723
30987
  autoMailto: autoMailto,
30724
30988
  });
30725
- if (linkSegment) {
30726
- return createAnchor(((_a = linkSegment.link) === null || _a === void 0 ? void 0 : _a.format.href) || '', linkSegment.text);
30989
+ if (linkSegment && _this.editor) {
30990
+ return createAnchor(_this.editor.getDocument(), ((_a = linkSegment.link) === null || _a === void 0 ? void 0 : _a.format.href) || '', linkSegment.text);
30727
30991
  }
30728
30992
  return false;
30729
30993
  },
@@ -30952,8 +31216,8 @@ var AutoFormatPlugin = /** @class */ (function () {
30952
31216
  return AutoFormatPlugin;
30953
31217
  }());
30954
31218
  exports.AutoFormatPlugin = AutoFormatPlugin;
30955
- var createAnchor = function (url, text) {
30956
- var anchor = document.createElement('a');
31219
+ var createAnchor = function (doc, url, text) {
31220
+ var anchor = doc.createElement('a');
30957
31221
  anchor.href = url;
30958
31222
  anchor.textContent = text;
30959
31223
  return anchor;
@@ -31651,7 +31915,8 @@ var ORDINAL_LENGTH = 2;
31651
31915
  var numericValue = null;
31652
31916
  if (numberSegment &&
31653
31917
  numberSegment.segmentType == 'Text' &&
31654
- (numericValue = getNumericValue(numberSegment.text, true /* checkFullText */)) &&
31918
+ (numericValue = getNumericValue(numberSegment.text, true /* checkFullText */)) !==
31919
+ null &&
31655
31920
  getOrdinal(numericValue) === value) {
31656
31921
  shouldAddSuperScript = true;
31657
31922
  }
@@ -31659,7 +31924,7 @@ var ORDINAL_LENGTH = 2;
31659
31924
  else {
31660
31925
  var ordinal = value.substring(value.length - ORDINAL_LENGTH); // This value is equal st, nd, rd, th
31661
31926
  var numericValue = getNumericValue(value); //This is the numeric part. Ex: 10th, numeric value =
31662
- if (numericValue && getOrdinal(numericValue) === ordinal) {
31927
+ if (numericValue !== null && getOrdinal(numericValue) === ordinal) {
31663
31928
  shouldAddSuperScript = true;
31664
31929
  }
31665
31930
  }
@@ -32388,25 +32653,55 @@ var insertNewLine = function (quote, parent, quoteIndex, paragraph) {
32388
32653
 
32389
32654
  Object.defineProperty(exports, "__esModule", ({ value: true }));
32390
32655
  exports.deleteList = void 0;
32656
+ var tslib_1 = __webpack_require__(/*! tslib */ "./node_modules/tslib/tslib.es6.mjs");
32391
32657
  var roosterjs_content_model_dom_1 = __webpack_require__(/*! roosterjs-content-model-dom */ "./packages/roosterjs-content-model-dom/lib/index.ts");
32392
32658
  /**
32393
32659
  * @internal
32394
32660
  */
32395
32661
  var deleteList = function (context) {
32662
+ var _a, _b;
32396
32663
  if (context.deleteResult != 'notDeleted') {
32397
32664
  return;
32398
32665
  }
32399
- var _a = context.insertPoint, paragraph = _a.paragraph, marker = _a.marker, path = _a.path;
32400
- if (paragraph.segments[0] == marker) {
32401
- var index = (0, roosterjs_content_model_dom_1.getClosestAncestorBlockGroupIndex)(path, ['ListItem'], ['TableCell', 'FormatContainer']);
32402
- var item = path[index];
32403
- var lastLevel = item === null || item === void 0 ? void 0 : item.levels[item.levels.length - 1];
32404
- if (lastLevel && (item === null || item === void 0 ? void 0 : item.blocks[0]) == paragraph) {
32405
- if (lastLevel.format.displayForDummyItem == 'block') {
32406
- item.levels.pop();
32666
+ var _c = context.insertPoint, paragraph = _c.paragraph, marker = _c.marker, path = _c.path;
32667
+ var index = (0, roosterjs_content_model_dom_1.getClosestAncestorBlockGroupIndex)(path, ['ListItem'], ['TableCell', 'FormatContainer']);
32668
+ var item = path[index];
32669
+ var parent = path[index + 1];
32670
+ if ((item === null || item === void 0 ? void 0 : item.blockGroupType) == 'ListItem' &&
32671
+ item.levels.length > 0 &&
32672
+ paragraph.segments[0] == marker &&
32673
+ parent) {
32674
+ var mutableList = (0, roosterjs_content_model_dom_1.mutateBlock)(item);
32675
+ var lastLevel = mutableList.levels[mutableList.levels.length - 1];
32676
+ var listItemIndex = parent.blocks.indexOf(item);
32677
+ var previousItem = parent.blocks[listItemIndex - 1];
32678
+ // 1. If the last level is dummy, just remove it (legacy behavior)
32679
+ // 2. If focus is at the beginning of list item and previous block is a list item with the same level count,
32680
+ // merge current list item into previous one
32681
+ // 3. Otherwise, split the list item. Keep the blocks before the paragraph in the current list item,
32682
+ // move the rest to a new list item (if there are multiple levels) or directly to parent (if only one level)
32683
+ if (lastLevel.format.displayForDummyItem == 'block') {
32684
+ mutableList.levels.pop();
32685
+ context.deleteResult = 'range';
32686
+ }
32687
+ else if (item.blocks[0] == paragraph &&
32688
+ (previousItem === null || previousItem === void 0 ? void 0 : previousItem.blockType) == 'BlockGroup' &&
32689
+ previousItem.blockGroupType == 'ListItem' &&
32690
+ previousItem.levels.length == mutableList.levels.length) {
32691
+ var mutablePreviousItem = (0, roosterjs_content_model_dom_1.mutateBlock)(previousItem);
32692
+ (_a = mutablePreviousItem.blocks).push.apply(_a, (0, tslib_1.__spreadArray)([], (0, tslib_1.__read)(mutableList.blocks), false));
32693
+ (0, roosterjs_content_model_dom_1.mutateBlock)(parent).blocks.splice(listItemIndex, 1);
32694
+ context.deleteResult = 'range';
32695
+ }
32696
+ else {
32697
+ var removedBlocks = mutableList.blocks.splice(mutableList.blocks.indexOf(paragraph), mutableList.blocks.length);
32698
+ if (mutableList.levels.length > 1) {
32699
+ var newListItem = (0, roosterjs_content_model_dom_1.createListItem)(mutableList.levels.slice(0, -1), mutableList.format);
32700
+ newListItem.blocks = removedBlocks.map(function (block) { return (0, roosterjs_content_model_dom_1.mutateBlock)(block); });
32701
+ (0, roosterjs_content_model_dom_1.mutateBlock)(parent).blocks.splice(listItemIndex + 1, 0, newListItem);
32407
32702
  }
32408
32703
  else {
32409
- lastLevel.format.displayForDummyItem = 'block';
32704
+ (_b = (0, roosterjs_content_model_dom_1.mutateBlock)(parent).blocks).splice.apply(_b, (0, tslib_1.__spreadArray)([listItemIndex + 1, 0], (0, tslib_1.__read)(removedBlocks), false));
32410
32705
  }
32411
32706
  context.deleteResult = 'range';
32412
32707
  }
@@ -33679,11 +33974,12 @@ var FindReplacePlugin = /** @class */ (function () {
33679
33974
  * @param editor The editor object
33680
33975
  */
33681
33976
  FindReplacePlugin.prototype.initialize = function (editor) {
33682
- var _a;
33683
33977
  this.editor = editor;
33684
- var win = (_a = editor.getDocument().defaultView) !== null && _a !== void 0 ? _a : window;
33685
- this.context.findHighlight.initialize(win);
33686
- this.context.replaceHighlight.initialize(win);
33978
+ var win = editor.getDocument().defaultView;
33979
+ if (win) {
33980
+ this.context.findHighlight.initialize(win);
33981
+ this.context.replaceHighlight.initialize(win);
33982
+ }
33687
33983
  this.editor.setEditorStyle(constants_1.FindHighlightRuleKey, this.findHighlightStyle, [
33688
33984
  constants_1.FindHighlightSelector,
33689
33985
  ]);
@@ -36253,9 +36549,11 @@ function generateDataURL(image, editInfo) {
36253
36549
  var height = heightPx || image.clientHeight;
36254
36550
  var imageWidth = nWidth * (1 - left - right);
36255
36551
  var imageHeight = nHeight * (1 - top - bottom);
36552
+ var doc = image.ownerDocument;
36553
+ var win = doc.defaultView;
36256
36554
  // Adjust the canvas size and scaling for high display resolution
36257
- var devicePixelRatio = window.devicePixelRatio || 1;
36258
- var canvas = document.createElement('canvas');
36555
+ var devicePixelRatio = (win === null || win === void 0 ? void 0 : win.devicePixelRatio) || 1;
36556
+ var canvas = doc.createElement('canvas');
36259
36557
  var targetWidth = generatedImageSize.targetWidth, targetHeight = generatedImageSize.targetHeight;
36260
36558
  canvas.width = targetWidth * devicePixelRatio;
36261
36559
  canvas.height = targetHeight * devicePixelRatio;
@@ -40421,13 +40719,13 @@ var TableEditPlugin = /** @class */ (function () {
40421
40719
  }
40422
40720
  };
40423
40721
  this.onMouseMove = function (event) {
40424
- var _a;
40722
+ var _a, _b;
40425
40723
  var e = event;
40426
- if (e.buttons > 0 || !_this.editor) {
40724
+ var editorWindow = (_a = _this.editor) === null || _a === void 0 ? void 0 : _a.getDocument().defaultView;
40725
+ if (e.buttons > 0 || !editorWindow) {
40427
40726
  return;
40428
40727
  }
40429
40728
  _this.ensureTableRects();
40430
- var editorWindow = _this.editor.getDocument().defaultView || window;
40431
40729
  var x = e.pageX - editorWindow.scrollX;
40432
40730
  var y = e.pageY - editorWindow.scrollY;
40433
40731
  var currentTable = null;
@@ -40446,7 +40744,7 @@ var TableEditPlugin = /** @class */ (function () {
40446
40744
  }
40447
40745
  }
40448
40746
  _this.setTableEditor(currentTable, e);
40449
- (_a = _this.tableEditor) === null || _a === void 0 ? void 0 : _a.onMouseMove(x, y);
40747
+ (_b = _this.tableEditor) === null || _b === void 0 ? void 0 : _b.onMouseMove(x, y);
40450
40748
  };
40451
40749
  this.invalidateTableRects = function () {
40452
40750
  _this.tableRectMap = null;
@@ -40566,6 +40864,7 @@ var CellResizer_1 = __webpack_require__(/*! ./features/CellResizer */ "./package
40566
40864
  var TableInserter_1 = __webpack_require__(/*! ./features/TableInserter */ "./packages/roosterjs-content-model-plugins/lib/tableEdit/editors/features/TableInserter.ts");
40567
40865
  var TableMover_1 = __webpack_require__(/*! ./features/TableMover */ "./packages/roosterjs-content-model-plugins/lib/tableEdit/editors/features/TableMover.ts");
40568
40866
  var TableResizer_1 = __webpack_require__(/*! ./features/TableResizer */ "./packages/roosterjs-content-model-plugins/lib/tableEdit/editors/features/TableResizer.ts");
40867
+ var TableRowColumnSelector_1 = __webpack_require__(/*! ./features/TableRowColumnSelector */ "./packages/roosterjs-content-model-plugins/lib/tableEdit/editors/features/TableRowColumnSelector.ts");
40569
40868
  var TableEditFeature_1 = __webpack_require__(/*! ./features/TableEditFeature */ "./packages/roosterjs-content-model-plugins/lib/tableEdit/editors/features/TableEditFeature.ts");
40570
40869
  var roosterjs_content_model_dom_1 = __webpack_require__(/*! roosterjs-content-model-dom */ "./packages/roosterjs-content-model-dom/lib/index.ts");
40571
40870
  var INSERTER_HOVER_OFFSET = 6;
@@ -40625,6 +40924,9 @@ var TableEditor = /** @class */ (function () {
40625
40924
  this.tableResizer = null;
40626
40925
  // 6 - Move as well as select whole table
40627
40926
  this.tableMover = null;
40927
+ // 7 - Select whole column or row
40928
+ this.tableColumnSelector = null;
40929
+ this.tableRowSelector = null;
40628
40930
  this.range = null;
40629
40931
  this.onEditorCreated = function (featureType, element) {
40630
40932
  var _a;
@@ -40666,6 +40968,7 @@ var TableEditor = /** @class */ (function () {
40666
40968
  _this.disposeTableResizer();
40667
40969
  _this.disposeTableInserter();
40668
40970
  _this.disposeCellResizers();
40971
+ _this.disposeTableSelector();
40669
40972
  };
40670
40973
  this.onEndTableMove = function (disposeHandler) {
40671
40974
  if (disposeHandler) {
@@ -40721,6 +41024,7 @@ var TableEditor = /** @class */ (function () {
40721
41024
  this.disposeCellResizers();
40722
41025
  this.disposeTableInserter();
40723
41026
  this.disposeTableMover();
41027
+ this.disposeTableSelector();
40724
41028
  };
40725
41029
  TableEditor.prototype.isEditing = function () {
40726
41030
  return this.isCurrentlyEditing;
@@ -40733,9 +41037,11 @@ var TableEditor = /** @class */ (function () {
40733
41037
  this.verticalInserter,
40734
41038
  this.horizontalResizer,
40735
41039
  this.verticalResizer,
41040
+ this.tableColumnSelector,
41041
+ this.tableRowSelector,
40736
41042
  ]
40737
41043
  .filter(function (feature) { return !!(feature === null || feature === void 0 ? void 0 : feature.div); })
40738
- .some(function (feature) { return (feature === null || feature === void 0 ? void 0 : feature.div) == node; });
41044
+ .some(function (feature) { return (feature === null || feature === void 0 ? void 0 : feature.div) == node || ((feature === null || feature === void 0 ? void 0 : feature.div) && feature.div.contains(node)); });
40739
41045
  };
40740
41046
  /**
40741
41047
  * public only for testing purposes
@@ -40811,6 +41117,17 @@ var TableEditor = /** @class */ (function () {
40811
41117
  break;
40812
41118
  }
40813
41119
  }
41120
+ if (topOrSide == 0 /* top */) {
41121
+ !this.isFeatureDisabled('TableColumnSelector') &&
41122
+ this.setSelectorRowColumn(false /*isRow*/);
41123
+ }
41124
+ else if (topOrSide == 1 /* side */) {
41125
+ !this.isFeatureDisabled('TableRowSelector') &&
41126
+ this.setSelectorRowColumn(true /*isRow*/);
41127
+ }
41128
+ else {
41129
+ this.setSelectorRowColumn(null);
41130
+ }
40814
41131
  // Create Mover and Resizer
40815
41132
  this.setEditorFeatures();
40816
41133
  };
@@ -40852,6 +41169,14 @@ var TableEditor = /** @class */ (function () {
40852
41169
  }
40853
41170
  }
40854
41171
  };
41172
+ TableEditor.prototype.setSelectorRowColumn = function (isRowSelector /*undefined means to clear both*/) {
41173
+ if (isRowSelector !== null && !this.tableRowSelector && !this.tableColumnSelector) {
41174
+ this.tableRowSelector = (0, TableRowColumnSelector_1.createTableRowColumnSelector)(this.editor, this.table, !!isRowSelector, this.anchorContainer, this.onEditorCreated);
41175
+ }
41176
+ else {
41177
+ this.disposeTableSelector();
41178
+ }
41179
+ };
40855
41180
  TableEditor.prototype.disposeTableResizer = function () {
40856
41181
  if (this.tableResizer) {
40857
41182
  (0, TableEditFeature_1.disposeTableEditFeature)(this.tableResizer);
@@ -40868,6 +41193,16 @@ var TableEditor = /** @class */ (function () {
40868
41193
  this.verticalInserter = null;
40869
41194
  }
40870
41195
  };
41196
+ TableEditor.prototype.disposeTableSelector = function () {
41197
+ if (this.tableColumnSelector) {
41198
+ (0, TableEditFeature_1.disposeTableEditFeature)(this.tableColumnSelector);
41199
+ this.tableColumnSelector = null;
41200
+ }
41201
+ if (this.tableRowSelector) {
41202
+ (0, TableEditFeature_1.disposeTableEditFeature)(this.tableRowSelector);
41203
+ this.tableRowSelector = null;
41204
+ }
41205
+ };
40871
41206
  TableEditor.prototype.disposeCellResizers = function () {
40872
41207
  if (this.horizontalResizer) {
40873
41208
  (0, TableEditFeature_1.disposeTableEditFeature)(this.horizontalResizer);
@@ -40984,40 +41319,61 @@ function onDragStart(context, event) {
40984
41319
  var td = context.td, onStart = context.onStart;
40985
41320
  var rect = (0, roosterjs_content_model_dom_1.normalizeRect)(td.getBoundingClientRect());
40986
41321
  // Get cell coordinates
40987
- var columnIndex = td.cellIndex;
40988
- var row = td.parentElement && (0, roosterjs_content_model_dom_1.isElementOfType)(td.parentElement, 'tr') ? td.parentElement : undefined;
40989
- var rowIndex = row === null || row === void 0 ? void 0 : row.rowIndex;
40990
- if (rowIndex == undefined) {
40991
- return {
40992
- cmTable: undefined,
40993
- anchorColumn: undefined,
40994
- anchorRow: undefined,
40995
- anchorRowHeight: -1,
40996
- allWidths: [],
40997
- }; // Just a fallback
40998
- }
41322
+ var rowIndex;
41323
+ var columnIndex;
41324
+ var nextColumnIndex = -1;
40999
41325
  var editor = context.editor, table = context.table;
41000
41326
  // Get Table block in content model
41001
41327
  var cmTable = (0, getTableFromContentModel_1.getCMTableFromTable)(editor, table);
41002
41328
  if (rect && cmTable) {
41329
+ for (var r = 0; r < (cmTable === null || cmTable === void 0 ? void 0 : cmTable.rows.length); r++) {
41330
+ for (var c = 0; c < cmTable.rows[r].cells.length; c++) {
41331
+ var cell = cmTable.rows[r].cells[c];
41332
+ if (cell.cachedElement == td) {
41333
+ // Target cell found, record its position
41334
+ rowIndex = r;
41335
+ columnIndex = c;
41336
+ }
41337
+ else if (rowIndex != undefined && columnIndex != undefined) {
41338
+ // rowIndex and columnIndex are already found, we can find nextColumnIndex now
41339
+ if (!cell.cachedElement) {
41340
+ // No cached element means this cell is merged, so this could potentially be the right side of column
41341
+ // We are trying to find the last merged cell so we can modify its width later
41342
+ columnIndex = c;
41343
+ }
41344
+ else {
41345
+ // Since we already found the target cell, the first cell with cachedElement after that must be the next column
41346
+ nextColumnIndex = c;
41347
+ break;
41348
+ }
41349
+ }
41350
+ }
41351
+ // As long as rowIndex is found, we can break here, no matter if nextColumnIndex is found or not
41352
+ // because for the last column case, nextColumnIndex will be -1
41353
+ if (rowIndex != undefined) {
41354
+ break;
41355
+ }
41356
+ }
41003
41357
  onStart();
41004
- return {
41005
- cmTable: cmTable,
41006
- anchorColumn: columnIndex,
41007
- anchorRow: rowIndex,
41008
- anchorRowHeight: cmTable.rows[rowIndex].height,
41009
- allWidths: (0, tslib_1.__spreadArray)([], (0, tslib_1.__read)(cmTable.widths), false),
41010
- };
41011
- }
41012
- else {
41013
- return {
41014
- cmTable: cmTable,
41015
- anchorColumn: undefined,
41016
- anchorRow: undefined,
41017
- anchorRowHeight: -1,
41018
- allWidths: [],
41019
- }; // Just a fallback
41358
+ if (rowIndex !== undefined) {
41359
+ return {
41360
+ cmTable: cmTable,
41361
+ anchorColumn: columnIndex,
41362
+ nextColumn: nextColumnIndex,
41363
+ anchorRow: rowIndex,
41364
+ anchorRowHeight: cmTable.rows[rowIndex].height,
41365
+ allWidths: (0, tslib_1.__spreadArray)([], (0, tslib_1.__read)(cmTable.widths), false),
41366
+ };
41367
+ }
41020
41368
  }
41369
+ return {
41370
+ cmTable: cmTable,
41371
+ anchorColumn: undefined,
41372
+ anchorRow: undefined,
41373
+ anchorRowHeight: -1,
41374
+ allWidths: [],
41375
+ nextColumn: -1,
41376
+ }; // Just a fallback
41021
41377
  }
41022
41378
  exports.onDragStart = onDragStart;
41023
41379
  /**
@@ -41025,7 +41381,6 @@ exports.onDragStart = onDragStart;
41025
41381
  * Exported for testing
41026
41382
  */
41027
41383
  function onDraggingHorizontal(context, event, initValue, deltaX, deltaY) {
41028
- var table = context.table;
41029
41384
  var cmTable = initValue.cmTable, anchorRow = initValue.anchorRow, anchorRowHeight = initValue.anchorRowHeight;
41030
41385
  // Assign new widths and heights to the CM table
41031
41386
  if (cmTable && anchorRow != undefined && cmTable.rows[anchorRow] != undefined) {
@@ -41034,11 +41389,13 @@ function onDraggingHorizontal(context, event, initValue, deltaX, deltaY) {
41034
41389
  // Normalize the new height value
41035
41390
  var newHeight = Math.max(cmTable.rows[anchorRow].height, roosterjs_content_model_dom_1.MIN_ALLOWED_TABLE_CELL_HEIGHT);
41036
41391
  // Writeback CM Table size changes to DOM Table
41037
- var tableRow = table.rows[anchorRow];
41038
- for (var col = 0; col < tableRow.cells.length; col++) {
41039
- var td = tableRow.cells[col];
41040
- td.style.height = newHeight + 'px';
41041
- td.style.boxSizing = 'border-box';
41392
+ var tableRow = cmTable.rows[anchorRow].cells;
41393
+ for (var col = 0; col < tableRow.length; col++) {
41394
+ var td = tableRow[col].cachedElement;
41395
+ if (td) {
41396
+ td.style.height = newHeight + 'px';
41397
+ td.style.boxSizing = 'border-box';
41398
+ }
41042
41399
  }
41043
41400
  return true;
41044
41401
  }
@@ -41053,15 +41410,13 @@ exports.onDraggingHorizontal = onDraggingHorizontal;
41053
41410
  */
41054
41411
  function onDraggingVertical(context, event, initValue, deltaX) {
41055
41412
  var table = context.table, isRTL = context.isRTL;
41056
- var cmTable = initValue.cmTable, anchorColumn = initValue.anchorColumn, allWidths = initValue.allWidths;
41413
+ var cmTable = initValue.cmTable, anchorColumn = initValue.anchorColumn, nextColumn = initValue.nextColumn, allWidths = initValue.allWidths;
41057
41414
  // Assign new widths and heights to the CM table
41058
41415
  if (cmTable && anchorColumn != undefined) {
41059
41416
  var mutableTable = (0, roosterjs_content_model_dom_1.mutateBlock)(cmTable);
41060
- // Modify the CM Table size
41061
- var lastColumn = anchorColumn == cmTable.widths.length - 1;
41062
41417
  var change = deltaX * (isRTL ? -1 : 1);
41063
41418
  // This is the last column
41064
- if (lastColumn) {
41419
+ if (nextColumn == -1) {
41065
41420
  // Only the last column changes
41066
41421
  // Normalize the new width value
41067
41422
  var newWidth = Math.max(allWidths[anchorColumn] + change, roosterjs_content_model_dom_1.MIN_ALLOWED_TABLE_CELL_WIDTH);
@@ -41070,21 +41425,37 @@ function onDraggingVertical(context, event, initValue, deltaX) {
41070
41425
  else {
41071
41426
  // Any other two columns
41072
41427
  var anchorChange = allWidths[anchorColumn] + change;
41073
- var nextAnchorChange = allWidths[anchorColumn + 1] - change;
41428
+ var nextAnchorChange = allWidths[nextColumn] - change;
41074
41429
  if (anchorChange < roosterjs_content_model_dom_1.MIN_ALLOWED_TABLE_CELL_WIDTH ||
41075
41430
  nextAnchorChange < roosterjs_content_model_dom_1.MIN_ALLOWED_TABLE_CELL_WIDTH) {
41076
41431
  return false;
41077
41432
  }
41078
41433
  mutableTable.widths[anchorColumn] = anchorChange;
41079
- mutableTable.widths[anchorColumn + 1] = nextAnchorChange;
41434
+ mutableTable.widths[nextColumn] = nextAnchorChange;
41080
41435
  }
41081
- // Writeback CM Table size changes to DOM Table
41082
- for (var row = 0; row < table.rows.length; row++) {
41083
- var tableRow = table.rows[row];
41084
- for (var col = 0; col < tableRow.cells.length; col++) {
41085
- var td = tableRow.cells[col];
41086
- td.style.width = cmTable.widths[col] + 'px';
41087
- td.style.boxSizing = 'border-box';
41436
+ // Write back CM Table size changes to DOM Table
41437
+ for (var row = 0; row < cmTable.rows.length; row++) {
41438
+ var tableRow = cmTable.rows[row].cells;
41439
+ var lastTd = null;
41440
+ var lastWidth = 0;
41441
+ for (var col = 0; col < tableRow.length; col++) {
41442
+ var td = tableRow[col].cachedElement;
41443
+ if (td) {
41444
+ td.style.boxSizing = 'border-box';
41445
+ lastTd = td;
41446
+ lastWidth = cmTable.widths[col];
41447
+ }
41448
+ else if (lastTd && tableRow[col].spanLeft) {
41449
+ lastWidth += cmTable.widths[col];
41450
+ }
41451
+ else if (tableRow[col].spanAbove) {
41452
+ // For span above case, we don't need to adjust width, just clear lastTd and lastWidth
41453
+ lastTd = null;
41454
+ lastWidth = 0;
41455
+ }
41456
+ if (lastTd) {
41457
+ lastTd.style.width = lastWidth + 'px';
41458
+ }
41088
41459
  }
41089
41460
  }
41090
41461
  if (context.originalWidth > 0) {
@@ -41303,8 +41674,8 @@ var createElement_1 = __webpack_require__(/*! ../../../pluginUtils/CreateElement
41303
41674
  var DragAndDropHelper_1 = __webpack_require__(/*! ../../../pluginUtils/DragAndDrop/DragAndDropHelper */ "./packages/roosterjs-content-model-plugins/lib/pluginUtils/DragAndDrop/DragAndDropHelper.ts");
41304
41675
  var roosterjs_content_model_api_1 = __webpack_require__(/*! roosterjs-content-model-api */ "./packages/roosterjs-content-model-api/lib/index.ts");
41305
41676
  var getTableFromContentModel_1 = __webpack_require__(/*! ../utils/getTableFromContentModel */ "./packages/roosterjs-content-model-plugins/lib/tableEdit/editors/utils/getTableFromContentModel.ts");
41306
- var roosterjs_content_model_dom_1 = __webpack_require__(/*! roosterjs-content-model-dom */ "./packages/roosterjs-content-model-dom/lib/index.ts");
41307
41677
  var getNodePositionFromEvent_1 = __webpack_require__(/*! ../../../utils/getNodePositionFromEvent */ "./packages/roosterjs-content-model-plugins/lib/utils/getNodePositionFromEvent.ts");
41678
+ var roosterjs_content_model_dom_1 = __webpack_require__(/*! roosterjs-content-model-dom */ "./packages/roosterjs-content-model-dom/lib/index.ts");
41308
41679
  var TABLE_MOVER_LENGTH = 12;
41309
41680
  /**
41310
41681
  * @internal
@@ -41404,7 +41775,7 @@ function onDragStart(context) {
41404
41775
  tag: 'div',
41405
41776
  style: 'position: fixed; user-select: none; border: 1px solid #808080',
41406
41777
  };
41407
- var tableRect = (0, createElement_1.createElement)(createElementData, document);
41778
+ var tableRect = (0, createElement_1.createElement)(createElementData, editor.getDocument());
41408
41779
  tableRect.style.width = trect.width + "px";
41409
41780
  tableRect.style.height = trect.height + "px";
41410
41781
  tableRect.style.top = trect.top + "px";
@@ -41732,6 +42103,239 @@ function isTableBottomVisible(editor, rect, contentDiv) {
41732
42103
  }
41733
42104
 
41734
42105
 
42106
+ /***/ }),
42107
+
42108
+ /***/ "./packages/roosterjs-content-model-plugins/lib/tableEdit/editors/features/TableRowColumnSelector.ts":
42109
+ /*!***********************************************************************************************************!*\
42110
+ !*** ./packages/roosterjs-content-model-plugins/lib/tableEdit/editors/features/TableRowColumnSelector.ts ***!
42111
+ \***********************************************************************************************************/
42112
+ /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
42113
+
42114
+ "use strict";
42115
+
42116
+ Object.defineProperty(exports, "__esModule", ({ value: true }));
42117
+ exports.onDragEnd = exports.onDragging = exports.onDragStart = exports.createTableRowColumnSelector = void 0;
42118
+ var tslib_1 = __webpack_require__(/*! tslib */ "./node_modules/tslib/tslib.es6.mjs");
42119
+ var createElement_1 = __webpack_require__(/*! ../../../pluginUtils/CreateElement/createElement */ "./packages/roosterjs-content-model-plugins/lib/pluginUtils/CreateElement/createElement.ts");
42120
+ var DragAndDropHelper_1 = __webpack_require__(/*! ../../../pluginUtils/DragAndDrop/DragAndDropHelper */ "./packages/roosterjs-content-model-plugins/lib/pluginUtils/DragAndDrop/DragAndDropHelper.ts");
42121
+ var roosterjs_content_model_dom_1 = __webpack_require__(/*! roosterjs-content-model-dom */ "./packages/roosterjs-content-model-dom/lib/index.ts");
42122
+ var STABLE_DOWN_ARROW_CURSOR = 'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgaGVpZ2h0PSIxNiIgdmlld0JveD0iMCAwIDE2IDE2Ij48dGV4dCB4PSI4IiB5PSIxMiIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC1zaXplPSIxNCIgZmlsbD0iYmxhY2siPiYjMTI5MDk1OzwvdGV4dD48L3N2Zz4=';
42123
+ var STABLE_RIGHT_ARROW_CURSOR = 'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgaGVpZ2h0PSIxNiIgdmlld0JveD0iMCAwIDE2IDE2Ij48dGV4dCB4PSI4IiB5PSIxMiIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC1zaXplPSIxNCIgZmlsbD0iYmxhY2siIHRyYW5zZm9ybT0icm90YXRlKC05MCA4IDgpIj4mIzEyOTA5NTs8L3RleHQ+PC9zdmc+';
42124
+ /**
42125
+ * @internal
42126
+ */
42127
+ function createTableRowColumnSelector(editor, table, isRowSelector, anchorContainer, onTableEditorCreated) {
42128
+ var _a;
42129
+ var doc = editor.getDocument();
42130
+ var zoomScale = editor.getDOMHelper().calculateZoomScale();
42131
+ var containerDiv = doc.createElement('div');
42132
+ containerDiv.style.cssText = 'position: fixed; pointer-events: none;';
42133
+ var cells = isRowSelector
42134
+ ? Array.from(table.rows)
42135
+ .map(function (row) { return row.cells[0]; })
42136
+ .filter(function (cell) { return cell; })
42137
+ : Array.from(((_a = table.rows[0]) === null || _a === void 0 ? void 0 : _a.cells) || []);
42138
+ var handlers = [];
42139
+ cells.forEach(function (cell) {
42140
+ var cellRect = (0, roosterjs_content_model_dom_1.normalizeRect)(cell.getBoundingClientRect());
42141
+ if (cellRect) {
42142
+ var createElementData = getInsertElementData(cellRect, isRowSelector);
42143
+ var cellDiv = (0, createElement_1.createElement)(createElementData, doc);
42144
+ containerDiv.appendChild(cellDiv);
42145
+ var context = {
42146
+ table: table,
42147
+ zoomScale: zoomScale,
42148
+ editor: editor,
42149
+ div: cellDiv,
42150
+ isRow: isRowSelector,
42151
+ };
42152
+ var handler = new TableRowColumnSelectorHandler(cellDiv, isRowSelector, context, {
42153
+ onDragStart: onDragStart,
42154
+ onDragging: onDragging,
42155
+ onDragEnd: onDragEnd,
42156
+ }, zoomScale, onTableEditorCreated, editor.getEnvironment().isMobileOrTablet);
42157
+ handlers.push(handler);
42158
+ }
42159
+ });
42160
+ (anchorContainer || doc.body).appendChild(containerDiv);
42161
+ var compositeHandler = {
42162
+ dispose: function () {
42163
+ handlers.forEach(function (h) { return h.dispose(); });
42164
+ },
42165
+ };
42166
+ return { div: containerDiv, featureHandler: compositeHandler, node: table };
42167
+ }
42168
+ exports.createTableRowColumnSelector = createTableRowColumnSelector;
42169
+ var TableRowColumnSelectorHandler = /** @class */ (function (_super) {
42170
+ (0, tslib_1.__extends)(TableRowColumnSelectorHandler, _super);
42171
+ function TableRowColumnSelectorHandler(div, isRow, context, handler, zoomScale, onTableEditorCreated, forceMobile) {
42172
+ var _this = _super.call(this, div, context, function () { }, handler, zoomScale, forceMobile) || this;
42173
+ _this.isRow = isRow;
42174
+ _this.disposer = onTableEditorCreated === null || onTableEditorCreated === void 0 ? void 0 : onTableEditorCreated(_this.isRow ? 'TableRowSelector' : 'TableColumnSelector', div);
42175
+ return _this;
42176
+ }
42177
+ TableRowColumnSelectorHandler.prototype.dispose = function () {
42178
+ var _a;
42179
+ (_a = this.disposer) === null || _a === void 0 ? void 0 : _a.call(this);
42180
+ this.disposer = undefined;
42181
+ };
42182
+ return TableRowColumnSelectorHandler;
42183
+ }(DragAndDropHelper_1.DragAndDropHelper));
42184
+ /**
42185
+ * @internal
42186
+ * Helper function to calculate current row/column index from mouse coordinates during drag
42187
+ */
42188
+ function getCurrentIndexFromMouse(table, x, y, isRow) {
42189
+ if (isRow) {
42190
+ for (var i = 0; i < table.rows.length; i++) {
42191
+ var row = table.rows[i];
42192
+ for (var j = 0; j < row.cells.length; j++) {
42193
+ var cell = row.cells[j];
42194
+ var cellRect = (0, roosterjs_content_model_dom_1.normalizeRect)(cell.getBoundingClientRect());
42195
+ if (cellRect && y >= cellRect.top && y <= cellRect.bottom) {
42196
+ return i;
42197
+ }
42198
+ }
42199
+ }
42200
+ return Math.max(0, table.rows.length - 1);
42201
+ }
42202
+ else {
42203
+ if (!table.rows[0]) {
42204
+ return 0;
42205
+ }
42206
+ var firstRow = table.rows[0];
42207
+ for (var i = 0; i < firstRow.cells.length; i++) {
42208
+ var cell = firstRow.cells[i];
42209
+ var cellRect = (0, roosterjs_content_model_dom_1.normalizeRect)(cell.getBoundingClientRect());
42210
+ if (cellRect && x >= cellRect.left && x <= cellRect.right) {
42211
+ return i;
42212
+ }
42213
+ }
42214
+ return firstRow.cells.length - 1;
42215
+ }
42216
+ }
42217
+ /**
42218
+ * @internal
42219
+ * Exported for testing
42220
+ */
42221
+ function onDragStart(context, event) {
42222
+ var table = context.table, editor = context.editor, isRow = context.isRow;
42223
+ editor.setDOMSelection(null);
42224
+ var parsedTable = (0, roosterjs_content_model_dom_1.parseTableCells)(table);
42225
+ var startIndex = getCurrentIndexFromMouse(table, event.clientX, event.clientY, isRow);
42226
+ if (isRow) {
42227
+ var columnNumber = parsedTable[startIndex].length - 1;
42228
+ var initialSelection = {
42229
+ type: 'table',
42230
+ table: table,
42231
+ firstRow: startIndex,
42232
+ lastRow: startIndex,
42233
+ firstColumn: 0,
42234
+ lastColumn: columnNumber,
42235
+ };
42236
+ return {
42237
+ cmTable: undefined,
42238
+ initialSelection: initialSelection,
42239
+ parsedTable: parsedTable,
42240
+ startIndex: startIndex,
42241
+ };
42242
+ }
42243
+ else {
42244
+ var rowNumber = parsedTable.length - 1;
42245
+ var initialSelection = {
42246
+ type: 'table',
42247
+ table: table,
42248
+ firstRow: 0,
42249
+ lastRow: rowNumber,
42250
+ firstColumn: startIndex,
42251
+ lastColumn: startIndex,
42252
+ };
42253
+ return {
42254
+ cmTable: undefined,
42255
+ initialSelection: initialSelection,
42256
+ parsedTable: parsedTable,
42257
+ startIndex: startIndex,
42258
+ };
42259
+ }
42260
+ }
42261
+ exports.onDragStart = onDragStart;
42262
+ /**
42263
+ * @internal
42264
+ * Exported for testing
42265
+ */
42266
+ function onDragging(context, event, initValue) {
42267
+ if (!initValue) {
42268
+ return false;
42269
+ }
42270
+ var table = context.table, editor = context.editor, isRow = context.isRow;
42271
+ var parsedTable = initValue.parsedTable, startIndex = initValue.startIndex;
42272
+ var currentIndex = getCurrentIndexFromMouse(table, event.clientX, event.clientY, isRow);
42273
+ if (isRow) {
42274
+ var columnNumber = parsedTable[startIndex].length - 1;
42275
+ var firstRow = Math.min(startIndex, currentIndex);
42276
+ var lastRow = Math.max(startIndex, currentIndex);
42277
+ editor.setDOMSelection({
42278
+ type: 'table',
42279
+ table: table,
42280
+ firstRow: firstRow,
42281
+ firstColumn: 0,
42282
+ lastRow: lastRow,
42283
+ lastColumn: columnNumber,
42284
+ });
42285
+ }
42286
+ else {
42287
+ var firstColumn = Math.min(startIndex, currentIndex);
42288
+ var lastColumn = Math.max(startIndex, currentIndex);
42289
+ var rowNumber = parsedTable.length - 1;
42290
+ editor.setDOMSelection({
42291
+ type: 'table',
42292
+ table: table,
42293
+ firstRow: 0,
42294
+ firstColumn: firstColumn,
42295
+ lastColumn: lastColumn,
42296
+ lastRow: rowNumber,
42297
+ });
42298
+ }
42299
+ return true;
42300
+ }
42301
+ exports.onDragging = onDragging;
42302
+ /**
42303
+ * @internal
42304
+ * Exported for testing
42305
+ */
42306
+ function onDragEnd(context, event, initValue) {
42307
+ if (!initValue) {
42308
+ return false;
42309
+ }
42310
+ var editor = context.editor;
42311
+ var selection = editor.getDOMSelection();
42312
+ if ((selection === null || selection === void 0 ? void 0 : selection.type) !== 'table') {
42313
+ editor.setDOMSelection(initValue.initialSelection);
42314
+ }
42315
+ return true;
42316
+ }
42317
+ exports.onDragEnd = onDragEnd;
42318
+ function getInsertElementData(rect, isRowSelector) {
42319
+ var MIN_DISTANCE_FROM_BOUNDARY = 5;
42320
+ var GAP_FROM_CELL = 5;
42321
+ var cellLength = isRowSelector ? rect.bottom - rect.top : rect.right - rect.left;
42322
+ var maxSelectorSize = Math.max(16, cellLength - MIN_DISTANCE_FROM_BOUNDARY * 2);
42323
+ var SELECTOR_SIZE = cellLength >= 32 ? Math.min(cellLength - 16, maxSelectorSize) : 16;
42324
+ var centerOffset = (cellLength - SELECTOR_SIZE) / 2;
42325
+ var size = isRowSelector
42326
+ ? "width: 5px; height: " + SELECTOR_SIZE + "px; top: " + (rect.top + centerOffset) + "px; left: " + (rect.left - 5 - GAP_FROM_CELL) + "px"
42327
+ : "width: " + SELECTOR_SIZE + "px; height: 5px; top: " + (rect.top - 5 - GAP_FROM_CELL) + "px; left: " + (rect.left + centerOffset) + "px";
42328
+ var cursor = isRowSelector
42329
+ ? "url(\"" + STABLE_RIGHT_ARROW_CURSOR + "\"), auto"
42330
+ : "url(\"" + STABLE_DOWN_ARROW_CURSOR + "\") , auto";
42331
+ var outerDivStyle = "position: fixed; " + size + "; background-color: transparent; cursor: " + cursor + "; pointer-events: auto;";
42332
+ return {
42333
+ tag: 'div',
42334
+ style: outerDivStyle,
42335
+ };
42336
+ }
42337
+
42338
+
41735
42339
  /***/ }),
41736
42340
 
41737
42341
  /***/ "./packages/roosterjs-content-model-plugins/lib/tableEdit/editors/utils/getTableFromContentModel.ts":
@@ -41754,6 +42358,7 @@ function getCMTableFromTable(editor, table) {
41754
42358
  var context = (0, roosterjs_content_model_dom_1.createDomToModelContext)({
41755
42359
  zoomScale: editor.getDOMHelper().calculateZoomScale(),
41756
42360
  recalculateTableSize: true,
42361
+ allowCacheElement: true, // We need this cache so we can retrieve TD element and update TD width and height when resizing table
41757
42362
  });
41758
42363
  context.elementProcessors.element(model, table, context);
41759
42364
  var firstBlock = model.blocks[0];
@@ -41823,7 +42428,7 @@ var TouchPlugin = /** @class */ (function () {
41823
42428
  */
41824
42429
  TouchPlugin.prototype.onPluginEvent = function (event) {
41825
42430
  var _this = this;
41826
- var _a, _b, _c, _d;
42431
+ var _a, _b, _c;
41827
42432
  if (!this.editor) {
41828
42433
  return;
41829
42434
  }
@@ -41832,57 +42437,59 @@ var TouchPlugin = /** @class */ (function () {
41832
42437
  this.isDblClicked = false;
41833
42438
  this.isTouchPenPointerEvent = true;
41834
42439
  event.originalEvent.preventDefault();
41835
- var targetWindow = ((_a = this.editor.getDocument()) === null || _a === void 0 ? void 0 : _a.defaultView) || window;
41836
- if (this.timer) {
41837
- targetWindow.clearTimeout(this.timer);
41838
- }
41839
- this.timer = targetWindow.setTimeout(function () {
41840
- _this.timer = 0;
41841
- if (_this.editor) {
41842
- if (!_this.isDblClicked) {
41843
- _this.editor.focus();
41844
- var caretPosition = (0, getNodePositionFromEvent_1.getNodePositionFromEvent)(_this.editor, event.rawEvent.x, event.rawEvent.y);
41845
- var newRange = _this.editor.getDocument().createRange();
41846
- if (caretPosition) {
41847
- var node = caretPosition.node, offset = caretPosition.offset;
41848
- // Place cursor at same position of browser handler by default
41849
- newRange.setStart(node, offset);
41850
- newRange.setEnd(node, offset);
41851
- var nodeTextContent = node.textContent || '';
41852
- var charAtSelection = nodeTextContent[offset];
41853
- if (node.nodeType === Node.TEXT_NODE &&
41854
- charAtSelection &&
41855
- !SPACE_MATCHING_REGEX.test(charAtSelection) &&
41856
- !PUNCTUATION_MATCHING_REGEX.test(charAtSelection)) {
41857
- var _a = findWordBoundaries(nodeTextContent, offset), wordStart = _a.wordStart, wordEnd = _a.wordEnd;
41858
- // Move cursor to the calculated offset
41859
- var leftCursorWordLength = offset - wordStart;
41860
- var rightCursorWordLength = wordEnd - offset;
41861
- var movingOffset = leftCursorWordLength >= rightCursorWordLength
41862
- ? rightCursorWordLength
41863
- : -leftCursorWordLength;
41864
- movingOffset =
41865
- Math.abs(movingOffset) > MAX_TOUCH_MOVE_DISTANCE
41866
- ? 0
41867
- : movingOffset;
41868
- var newOffsetPosition = offset + movingOffset;
41869
- if (movingOffset !== 0 &&
41870
- nodeTextContent.length >= newOffsetPosition) {
41871
- newRange.setStart(node, newOffsetPosition);
41872
- newRange.setEnd(node, newOffsetPosition);
42440
+ var targetWindow = this.editor.getDocument().defaultView;
42441
+ if (targetWindow) {
42442
+ if (this.timer) {
42443
+ targetWindow.clearTimeout(this.timer);
42444
+ }
42445
+ this.timer = targetWindow.setTimeout(function () {
42446
+ _this.timer = 0;
42447
+ if (_this.editor) {
42448
+ if (!_this.isDblClicked) {
42449
+ _this.editor.focus();
42450
+ var caretPosition = (0, getNodePositionFromEvent_1.getNodePositionFromEvent)(_this.editor, event.rawEvent.x, event.rawEvent.y);
42451
+ var newRange = _this.editor.getDocument().createRange();
42452
+ if (caretPosition) {
42453
+ var node = caretPosition.node, offset = caretPosition.offset;
42454
+ // Place cursor at same position of browser handler by default
42455
+ newRange.setStart(node, offset);
42456
+ newRange.setEnd(node, offset);
42457
+ var nodeTextContent = node.textContent || '';
42458
+ var charAtSelection = nodeTextContent[offset];
42459
+ if (node.nodeType === Node.TEXT_NODE &&
42460
+ charAtSelection &&
42461
+ !SPACE_MATCHING_REGEX.test(charAtSelection) &&
42462
+ !PUNCTUATION_MATCHING_REGEX.test(charAtSelection)) {
42463
+ var _a = findWordBoundaries(nodeTextContent, offset), wordStart = _a.wordStart, wordEnd = _a.wordEnd;
42464
+ // Move cursor to the calculated offset
42465
+ var leftCursorWordLength = offset - wordStart;
42466
+ var rightCursorWordLength = wordEnd - offset;
42467
+ var movingOffset = leftCursorWordLength >= rightCursorWordLength
42468
+ ? rightCursorWordLength
42469
+ : -leftCursorWordLength;
42470
+ movingOffset =
42471
+ Math.abs(movingOffset) > MAX_TOUCH_MOVE_DISTANCE
42472
+ ? 0
42473
+ : movingOffset;
42474
+ var newOffsetPosition = offset + movingOffset;
42475
+ if (movingOffset !== 0 &&
42476
+ nodeTextContent.length >= newOffsetPosition) {
42477
+ newRange.setStart(node, newOffsetPosition);
42478
+ newRange.setEnd(node, newOffsetPosition);
42479
+ }
41873
42480
  }
41874
42481
  }
42482
+ _this.editor.setDOMSelection({
42483
+ type: 'range',
42484
+ range: newRange,
42485
+ isReverted: false,
42486
+ });
42487
+ // reset values
42488
+ _this.isTouchPenPointerEvent = false;
41875
42489
  }
41876
- _this.editor.setDOMSelection({
41877
- type: 'range',
41878
- range: newRange,
41879
- isReverted: false,
41880
- });
41881
- // reset values
41882
- _this.isTouchPenPointerEvent = false;
41883
42490
  }
41884
- }
41885
- }, POINTER_DETECTION_DELAY);
42491
+ }, POINTER_DETECTION_DELAY);
42492
+ }
41886
42493
  break;
41887
42494
  case 'doubleClick':
41888
42495
  if (this.isTouchPenPointerEvent) {
@@ -41898,7 +42505,7 @@ var TouchPlugin = /** @class */ (function () {
41898
42505
  var char = nodeTextContent.charAt(offset);
41899
42506
  // Check if the clicked character is a punctuation mark, then highlight that character only
41900
42507
  if (PUNCTUATION_MATCHING_REGEX.test(char)) {
41901
- var newRange = (_b = this.editor.getDocument()) === null || _b === void 0 ? void 0 : _b.createRange();
42508
+ var newRange = (_a = this.editor.getDocument()) === null || _a === void 0 ? void 0 : _a.createRange();
41902
42509
  if (newRange) {
41903
42510
  newRange.setStart(node, offset);
41904
42511
  newRange.setEnd(node, offset + 1);
@@ -41920,7 +42527,7 @@ var TouchPlugin = /** @class */ (function () {
41920
42527
  SPACE_MATCHING_REGEX.test(nodeTextContent.charAt(start - 1))) {
41921
42528
  start--;
41922
42529
  }
41923
- var newRange = (_c = this.editor.getDocument()) === null || _c === void 0 ? void 0 : _c.createRange();
42530
+ var newRange = (_b = this.editor.getDocument()) === null || _b === void 0 ? void 0 : _b.createRange();
41924
42531
  if (newRange) {
41925
42532
  newRange.setStart(node, start);
41926
42533
  newRange.setEnd(node, start + 1);
@@ -41933,8 +42540,8 @@ var TouchPlugin = /** @class */ (function () {
41933
42540
  }
41934
42541
  }
41935
42542
  else {
41936
- var _e = findWordBoundaries(nodeTextContent, offset), wordStart = _e.wordStart, wordEnd = _e.wordEnd;
41937
- var newRange = (_d = this.editor.getDocument()) === null || _d === void 0 ? void 0 : _d.createRange();
42543
+ var _d = findWordBoundaries(nodeTextContent, offset), wordStart = _d.wordStart, wordEnd = _d.wordEnd;
42544
+ var newRange = (_c = this.editor.getDocument()) === null || _c === void 0 ? void 0 : _c.createRange();
41938
42545
  if (newRange) {
41939
42546
  newRange.setStart(node, wordStart);
41940
42547
  newRange.setEnd(node, wordEnd);