roosterjs 8.34.0 → 8.35.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -2276,7 +2276,7 @@ function changeFontSize(editor, change, fontSizes) {
2276
2276
  var pt = parseFloat((0, roosterjs_editor_dom_1.getComputedStyle)(element, 'font-size') || element.style.fontSize);
2277
2277
  element.style.fontSize = getNewFontSize(pt, changeBase, fontSizes) + 'pt';
2278
2278
  var lineHeight = (0, roosterjs_editor_dom_1.getComputedStyle)(element, 'line-height');
2279
- if (lineHeight != 'normal') {
2279
+ if (lineHeight && lineHeight != 'normal') {
2280
2280
  element.style.lineHeight = 'normal';
2281
2281
  }
2282
2282
  }, 'changeFontSize');
@@ -3281,7 +3281,7 @@ function setFontSize(editor, fontSize) {
3281
3281
  (0, applyListItemWrap_1.default)(editor, 'font-size', function (element, isInnerNode) {
3282
3282
  element.style.fontSize = isInnerNode ? '' : fontSize;
3283
3283
  var lineHeight = (0, roosterjs_editor_dom_1.getComputedStyle)(element, 'line-height');
3284
- if (lineHeight != 'normal') {
3284
+ if (lineHeight && lineHeight != 'normal') {
3285
3285
  element.style.lineHeight = 'normal';
3286
3286
  }
3287
3287
  }, 'setFontSize');
@@ -4323,8 +4323,8 @@ function blockFormat(editor, callback, beforeRunCallback, apiName) {
4323
4323
  if (selection.type == 0 /* Normal */) {
4324
4324
  editor.select(start, end);
4325
4325
  }
4326
- else if (selection.type == 1 /* TableSelection */) {
4327
- editor.select(selection.table, selection.coordinates);
4326
+ else {
4327
+ editor.select(selection);
4328
4328
  }
4329
4329
  }, apiName);
4330
4330
  }
@@ -4502,16 +4502,15 @@ function execCommand(editor, command, apiName) {
4502
4502
  }
4503
4503
  else {
4504
4504
  (0, formatUndoSnapshot_1.default)(editor, function () {
4505
- var tempRange;
4505
+ var needToSwitchSelection = selection.type != 0 /* Normal */;
4506
4506
  selection.ranges.forEach(function (range) {
4507
- if (selection.type == 1 /* TableSelection */) {
4507
+ if (needToSwitchSelection) {
4508
4508
  editor.select(range);
4509
4509
  }
4510
4510
  formatter();
4511
- tempRange = range;
4512
4511
  });
4513
- if (tempRange && selection.type == 1 /* TableSelection */) {
4514
- editor.select(selection.table, selection.coordinates);
4512
+ if (needToSwitchSelection) {
4513
+ editor.select(selection);
4515
4514
  }
4516
4515
  }, apiName);
4517
4516
  }
@@ -4643,7 +4642,7 @@ function toggleListType(editor, listType, startNumber, includeSiblingLists, orde
4643
4642
  var chain = startNumber > 0 && chains.filter(function (chain) { return chain.canAppendAtCursor(startNumber); })[0];
4644
4643
  var vList = chain && start.equalTo(end)
4645
4644
  ? chain.createVListAtBlock((_a = (0, roosterjs_editor_dom_1.getBlockElementAtNode)(region.rootNode, start.node)) === null || _a === void 0 ? void 0 : _a.collapseToSingleElement(), startNumber)
4646
- : (0, roosterjs_editor_dom_1.createVListFromRegion)(region, includeSiblingLists);
4645
+ : (0, roosterjs_editor_dom_1.createVListFromRegion)(region, startNumber === 1 ? false : includeSiblingLists);
4647
4646
  if (vList) {
4648
4647
  vList.changeListType(start, end, listType);
4649
4648
  if (editor.isFeatureEnabled("AutoFormatList" /* AutoFormatList */)) {
@@ -4735,8 +4734,7 @@ function addUndoSnapshotInternal(core, canUndoByBackspace) {
4735
4734
  if (!core.lifecycle.shadowEditFragment) {
4736
4735
  var rangeEx = core.api.getSelectionRangeEx(core);
4737
4736
  var isDarkMode = core.lifecycle.isDarkMode;
4738
- var metadata = (rangeEx === null || rangeEx === void 0 ? void 0 : rangeEx.type) == 1 /* TableSelection */
4739
- ? __assign({ type: 1 /* TableSelection */, tableId: rangeEx.table.id, isDarkMode: isDarkMode }, rangeEx.coordinates) : __assign({ type: 0 /* Normal */, isDarkMode: isDarkMode, start: [], end: [] }, ((0, roosterjs_editor_dom_1.getSelectionPath)(core.contentDiv, rangeEx.ranges[0]) || {}));
4737
+ var metadata = createContentMetadata(core.contentDiv, rangeEx, isDarkMode) || null;
4740
4738
  core.undo.snapshotsService.addSnapshot({
4741
4739
  html: core.contentDiv.innerHTML,
4742
4740
  metadata: metadata,
@@ -4744,6 +4742,20 @@ function addUndoSnapshotInternal(core, canUndoByBackspace) {
4744
4742
  core.undo.hasNewContent = false;
4745
4743
  }
4746
4744
  }
4745
+ function createContentMetadata(root, rangeEx, isDarkMode) {
4746
+ switch (rangeEx === null || rangeEx === void 0 ? void 0 : rangeEx.type) {
4747
+ case 1 /* TableSelection */:
4748
+ return __assign({ type: 1 /* TableSelection */, tableId: rangeEx.table.id, isDarkMode: !!isDarkMode }, rangeEx.coordinates);
4749
+ case 2 /* ImageSelection */:
4750
+ return {
4751
+ type: 2 /* ImageSelection */,
4752
+ imageId: rangeEx.image.id,
4753
+ isDarkMode: !!isDarkMode,
4754
+ };
4755
+ case 0 /* Normal */:
4756
+ return __assign({ type: 0 /* Normal */, isDarkMode: !!isDarkMode, start: [], end: [] }, ((0, roosterjs_editor_dom_1.getSelectionPath)(root, rangeEx.ranges[0]) || {}));
4757
+ }
4758
+ }
4747
4759
 
4748
4760
 
4749
4761
  /***/ }),
@@ -5843,6 +5855,7 @@ var roosterjs_editor_dom_1 = __webpack_require__(/*! roosterjs-editor-dom */ "./
5843
5855
  var IMAGE_ID = 'imageSelected';
5844
5856
  var CONTENT_DIV_ID = 'contentDiv_';
5845
5857
  var STYLE_ID = 'imageStyle';
5858
+ var DEFAULT_SELECTION_BORDER_COLOR = '#DB626C';
5846
5859
  /**
5847
5860
  * @internal
5848
5861
  * Select a image and save data of the selected range
@@ -5851,23 +5864,21 @@ var STYLE_ID = 'imageStyle';
5851
5864
  */
5852
5865
  var selectImage = function (core, image) {
5853
5866
  unselect(core);
5867
+ var selection = null;
5854
5868
  if (image) {
5855
5869
  var range = (0, roosterjs_editor_dom_1.createRange)(image);
5856
5870
  (0, addUniqueId_1.default)(image, IMAGE_ID);
5857
5871
  (0, addUniqueId_1.default)(core.contentDiv, CONTENT_DIV_ID);
5858
5872
  core.api.selectRange(core, (0, roosterjs_editor_dom_1.createRange)(new roosterjs_editor_dom_1.Position(image, -3 /* After */)));
5859
5873
  select(core, image);
5860
- var selection = {
5874
+ selection = {
5861
5875
  type: 2 /* ImageSelection */,
5862
5876
  ranges: [range],
5863
5877
  image: image,
5864
5878
  areAllCollapsed: range.collapsed,
5865
5879
  };
5866
- core.domEvent.imageSelectionRange = selection;
5867
- return selection;
5868
5880
  }
5869
- core.domEvent.imageSelectionRange = null;
5870
- return null;
5881
+ return selection;
5871
5882
  };
5872
5883
  exports.selectImage = selectImage;
5873
5884
  var select = function (core, image) {
@@ -5876,14 +5887,9 @@ var select = function (core, image) {
5876
5887
  (0, addSelectionStyle_1.default)(core, borderCSS, STYLE_ID);
5877
5888
  };
5878
5889
  var buildBorderCSS = function (core, imageId) {
5879
- var borderColor = core.imageSelectionBorderColor || '#DB626C';
5880
- return ('#' +
5881
- core.contentDiv.id +
5882
- ' #' +
5883
- imageId +
5884
- ' { margin: -2px !important; border: 2px solid' +
5885
- borderColor +
5886
- ' !important; }');
5890
+ var divId = core.contentDiv.id;
5891
+ var color = core.imageSelectionBorderColor || DEFAULT_SELECTION_BORDER_COLOR;
5892
+ return "#" + divId + " #" + imageId + " {outline-style: auto!important;outline-color: " + color + "!important;caret-color: transparent!important;}";
5887
5893
  };
5888
5894
  var unselect = function (core) {
5889
5895
  var doc = core.contentDiv.ownerDocument;
@@ -6021,12 +6027,11 @@ function buildCss(table, coordinates, contentDivSelector) {
6021
6027
  var ranges = [];
6022
6028
  var firstSelected = null;
6023
6029
  var lastSelected = null;
6024
- var css = '';
6025
- var isFirst = true;
6030
+ var selectors = [];
6026
6031
  var vTable = new roosterjs_editor_dom_1.VTable(table);
6027
6032
  // Get whether table has thead, tbody or tfoot.
6028
6033
  var tableChildren = (0, roosterjs_editor_dom_1.toArray)(table.childNodes).filter(function (node) { return ['THEAD', 'TBODY', 'TFOOT'].indexOf((0, roosterjs_editor_dom_1.getTagOfNode)(node)) > -1; });
6029
- // Set the start and end of each of the table childs, so we can build the selector according the element between the table and the row.
6034
+ // Set the start and end of each of the table children, so we can build the selector according the element between the table and the row.
6030
6035
  var cont = 0;
6031
6036
  var indexes = tableChildren.map(function (node) {
6032
6037
  var result = {
@@ -6053,15 +6058,9 @@ function buildCss(table, coordinates, contentDivSelector) {
6053
6058
  var tag = (0, roosterjs_editor_dom_1.getTagOfNode)(cell);
6054
6059
  tdCount++;
6055
6060
  if (rowIndex >= tr1 && rowIndex <= tr2 && cellIndex >= td1 && cellIndex <= td2) {
6056
- if (isFirst) {
6057
- isFirst = false;
6058
- }
6059
- else if (!css.endsWith(',')) {
6060
- css += ',';
6061
- }
6062
6061
  removeImportant(cell);
6063
6062
  var selector = generateCssFromCell(contentDivSelector, table.id, middleElSelector, currentRow, tag, tdCount);
6064
- css += selector;
6063
+ selectors.push(selector);
6065
6064
  firstSelected = firstSelected || table.querySelector(selector);
6066
6065
  lastSelected = table.querySelector(selector);
6067
6066
  }
@@ -6074,7 +6073,7 @@ function buildCss(table, coordinates, contentDivSelector) {
6074
6073
  ranges.push(rowRange);
6075
6074
  }
6076
6075
  });
6077
- css += '{background-color: rgba(198,198,198,0.7) !important;}';
6076
+ var css = selectors.join(',') + " {background-color: rgba(198,198,198,0.7) !important; caret-color: transparent}";
6078
6077
  return { css: css, ranges: ranges };
6079
6078
  }
6080
6079
  function select(core, table, coordinates) {
@@ -6182,17 +6181,30 @@ var setContent = function (core, content, triggerContentChangedEvent, metadata)
6182
6181
  };
6183
6182
  exports.setContent = setContent;
6184
6183
  function selectContentMetadata(core, metadata) {
6185
- switch (metadata === null || metadata === void 0 ? void 0 : metadata.type) {
6186
- case 0 /* Normal */:
6187
- var range = (0, roosterjs_editor_dom_1.createRange)(core.contentDiv, metadata.start, metadata.end);
6188
- core.api.selectRange(core, range);
6189
- break;
6190
- case 1 /* TableSelection */:
6191
- var table = (0, roosterjs_editor_dom_1.queryElements)(core.contentDiv, '#' + metadata.tableId)[0];
6192
- if (table) {
6193
- core.api.selectTable(core, table, metadata);
6194
- }
6195
- break;
6184
+ if (!core.lifecycle.shadowEditSelectionPath && metadata) {
6185
+ core.domEvent.tableSelectionRange = null;
6186
+ core.domEvent.imageSelectionRange = null;
6187
+ core.domEvent.selectionRange = null;
6188
+ switch (metadata.type) {
6189
+ case 0 /* Normal */:
6190
+ core.api.selectTable(core, null);
6191
+ core.api.selectImage(core, null);
6192
+ var range = (0, roosterjs_editor_dom_1.createRange)(core.contentDiv, metadata.start, metadata.end);
6193
+ core.api.selectRange(core, range);
6194
+ break;
6195
+ case 1 /* TableSelection */:
6196
+ var table = (0, roosterjs_editor_dom_1.queryElements)(core.contentDiv, '#' + metadata.tableId)[0];
6197
+ if (table) {
6198
+ core.domEvent.tableSelectionRange = core.api.selectTable(core, table, metadata);
6199
+ }
6200
+ break;
6201
+ case 2 /* ImageSelection */:
6202
+ var image = (0, roosterjs_editor_dom_1.queryElements)(core.contentDiv, '#' + metadata.imageId)[0];
6203
+ if (image) {
6204
+ core.domEvent.imageSelectionRange = core.api.selectImage(core, image);
6205
+ }
6206
+ break;
6207
+ }
6196
6208
  }
6197
6209
  }
6198
6210
 
@@ -6646,7 +6658,7 @@ var CopyPastePlugin = /** @class */ (function () {
6646
6658
  var html = this.editor.getContent(2 /* RawHTMLWithSelection */);
6647
6659
  var tempDiv_1 = this.getTempDiv(this.editor, true /*forceInLightMode*/);
6648
6660
  var metadata = (0, roosterjs_editor_dom_1.setHtmlWithMetadata)(tempDiv_1, html, this.editor.getTrustedHTMLHandler());
6649
- var newRange = void 0;
6661
+ var newRange = null;
6650
6662
  if (selection_1.type === 1 /* TableSelection */ &&
6651
6663
  selection_1.coordinates) {
6652
6664
  var table = tempDiv_1.querySelector("#" + selection_1.table.id);
@@ -6655,6 +6667,12 @@ var CopyPastePlugin = /** @class */ (function () {
6655
6667
  this.deleteTableContent(this.editor, selection_1.table, selection_1.coordinates);
6656
6668
  }
6657
6669
  }
6670
+ else if (selection_1.type === 2 /* ImageSelection */) {
6671
+ var image = tempDiv_1.querySelector('#' + selection_1.image.id);
6672
+ if (image) {
6673
+ newRange = (0, roosterjs_editor_dom_1.createRange)(image);
6674
+ }
6675
+ }
6658
6676
  else {
6659
6677
  newRange =
6660
6678
  (metadata === null || metadata === void 0 ? void 0 : metadata.type) === 0 /* Normal */
@@ -6702,17 +6720,16 @@ var CopyPastePlugin = /** @class */ (function () {
6702
6720
  return div;
6703
6721
  };
6704
6722
  CopyPastePlugin.prototype.cleanUpAndRestoreSelection = function (tempDiv, range, isCopy) {
6705
- var _a, _b;
6723
+ var _a, _b, _c;
6706
6724
  if (!!((_a = range) === null || _a === void 0 ? void 0 : _a.type) || range.type == 0) {
6707
6725
  var selection = range;
6708
6726
  switch (selection.type) {
6709
6727
  case 1 /* TableSelection */:
6710
- if (this.editor && selection.table && selection.coordinates) {
6711
- this.editor.select(selection.table, selection.coordinates);
6712
- }
6728
+ case 2 /* ImageSelection */:
6729
+ (_b = this.editor) === null || _b === void 0 ? void 0 : _b.select(selection);
6713
6730
  break;
6714
6731
  case 0 /* Normal */:
6715
- var range_1 = (_b = selection.ranges) === null || _b === void 0 ? void 0 : _b[0];
6732
+ var range_1 = (_c = selection.ranges) === null || _c === void 0 ? void 0 : _c[0];
6716
6733
  this.restoreRange(range_1, isCopy);
6717
6734
  break;
6718
6735
  }
@@ -6850,7 +6867,9 @@ var DOMEventPlugin = /** @class */ (function () {
6850
6867
  });
6851
6868
  };
6852
6869
  this.onKeyboardEvent = function (event) {
6853
- if ((0, roosterjs_editor_dom_1.isCharacterValue)(event)) {
6870
+ if ((0, roosterjs_editor_dom_1.isCharacterValue)(event) || (event.which >= 33 /* PAGEUP */ && event.which <= 40 /* DOWN */)) {
6871
+ // Stop propagation for Character keys and Up/Down/Left/Right/Home/End/PageUp/PageDown
6872
+ // since editor already handles these keys and no need to propagate to parents
6854
6873
  event.stopPropagation();
6855
6874
  }
6856
6875
  };
@@ -8012,6 +8031,7 @@ var PendingFormatStatePlugin = /** @class */ (function () {
8012
8031
  event.eventType == 0 /* KeyDown */ &&
8013
8032
  (0, roosterjs_editor_dom_1.isCharacterValue)(event.rawEvent) &&
8014
8033
  this.state.pendableFormatSpan) {
8034
+ this.state.pendableFormatSpan.removeAttribute('contentEditable');
8015
8035
  this.editor.insertNode(this.state.pendableFormatSpan);
8016
8036
  this.editor.select(this.state.pendableFormatSpan, -2 /* Before */, this.state.pendableFormatSpan, -1 /* End */);
8017
8037
  this.clear();
@@ -8860,44 +8880,83 @@ var Editor = /** @class */ (function () {
8860
8880
  };
8861
8881
  Editor.prototype.select = function (arg1, arg2, arg3, arg4) {
8862
8882
  var core = this.getCore();
8863
- if (arg1 && 'rows' in arg1) {
8864
- var selection = core.api.selectTable(core, arg1, arg2);
8865
- core.domEvent.tableSelectionRange = selection;
8866
- this.triggerSelectionChanged(selection);
8867
- return !!selection;
8883
+ var rangeEx = null;
8884
+ if (isSelectionRangeEx(arg1)) {
8885
+ rangeEx = arg1;
8868
8886
  }
8869
- else {
8870
- core.api.selectTable(core, null);
8871
- core.domEvent.tableSelectionRange = null;
8887
+ else if ((0, roosterjs_editor_dom_1.safeInstanceOf)(arg1, 'HTMLTableElement') && isTableSelection(arg2)) {
8888
+ rangeEx = {
8889
+ type: 1 /* TableSelection */,
8890
+ ranges: [],
8891
+ areAllCollapsed: false,
8892
+ table: arg1,
8893
+ coordinates: arg2,
8894
+ };
8872
8895
  }
8873
- if (this.isFeatureEnabled("ImageSelection" /* ImageSelection */) &&
8896
+ else if (this.isFeatureEnabled("ImageSelection" /* ImageSelection */) &&
8874
8897
  (0, roosterjs_editor_dom_1.safeInstanceOf)(arg1, 'HTMLImageElement') &&
8875
- !arg2) {
8876
- var selection = core.api.selectImage(core, arg1);
8877
- this.triggerSelectionChanged(selection);
8878
- return !!selection;
8898
+ typeof arg2 == 'undefined') {
8899
+ rangeEx = {
8900
+ type: 2 /* ImageSelection */,
8901
+ ranges: [],
8902
+ areAllCollapsed: false,
8903
+ image: arg1,
8904
+ };
8879
8905
  }
8880
8906
  else {
8881
- core.api.selectImage(core, null);
8907
+ var range = !arg1
8908
+ ? null
8909
+ : (0, roosterjs_editor_dom_1.safeInstanceOf)(arg1, 'Range')
8910
+ ? arg1
8911
+ : isSelectionPath(arg1)
8912
+ ? (0, roosterjs_editor_dom_1.createRange)(core.contentDiv, arg1.start, arg1.end)
8913
+ : isNodePosition(arg1) || (0, roosterjs_editor_dom_1.safeInstanceOf)(arg1, 'Node')
8914
+ ? (0, roosterjs_editor_dom_1.createRange)(arg1, arg2, arg3, arg4)
8915
+ : null;
8916
+ rangeEx = range
8917
+ ? {
8918
+ type: 0 /* Normal */,
8919
+ ranges: [range],
8920
+ areAllCollapsed: range.collapsed,
8921
+ }
8922
+ : null;
8882
8923
  }
8883
- var range = !arg1
8884
- ? null
8885
- : (0, roosterjs_editor_dom_1.safeInstanceOf)(arg1, 'Range')
8886
- ? arg1
8887
- : 'start' in arg1 && Array.isArray(arg1.end)
8888
- ? (0, roosterjs_editor_dom_1.createRange)(core.contentDiv, arg1.start, arg1.end)
8889
- : (0, roosterjs_editor_dom_1.createRange)(arg1, arg2, arg3, arg4);
8890
- this.triggerSelectionChanged({
8891
- type: 0 /* Normal */,
8892
- ranges: range ? [range] : [],
8893
- areAllCollapsed: range ? range.collapsed : true,
8894
- });
8895
- return !!range && this.contains(range) && core.api.selectRange(core, range);
8896
- };
8897
- Editor.prototype.triggerSelectionChanged = function (selection) {
8898
- this.triggerPluginEvent(22 /* SelectionChanged */, {
8899
- selectionRangeEx: selection,
8900
- }, true /** broadcast **/);
8924
+ if (rangeEx) {
8925
+ switch (rangeEx.type) {
8926
+ case 1 /* TableSelection */:
8927
+ if (this.contains(rangeEx.table)) {
8928
+ core.domEvent.imageSelectionRange = core.api.selectImage(core, null);
8929
+ core.domEvent.tableSelectionRange = core.api.selectTable(core, rangeEx.table, rangeEx.coordinates);
8930
+ rangeEx = core.domEvent.tableSelectionRange;
8931
+ }
8932
+ break;
8933
+ case 2 /* ImageSelection */:
8934
+ if (this.contains(rangeEx.image)) {
8935
+ core.domEvent.tableSelectionRange = core.api.selectTable(core, null);
8936
+ core.domEvent.imageSelectionRange = core.api.selectImage(core, rangeEx.image);
8937
+ rangeEx = core.domEvent.imageSelectionRange;
8938
+ }
8939
+ break;
8940
+ case 0 /* Normal */:
8941
+ core.domEvent.tableSelectionRange = core.api.selectTable(core, null);
8942
+ core.domEvent.imageSelectionRange = core.api.selectImage(core, null);
8943
+ if (this.contains(rangeEx.ranges[0])) {
8944
+ core.api.selectRange(core, rangeEx.ranges[0]);
8945
+ }
8946
+ else {
8947
+ rangeEx = null;
8948
+ }
8949
+ break;
8950
+ }
8951
+ this.triggerPluginEvent(22 /* SelectionChanged */, {
8952
+ selectionRangeEx: rangeEx,
8953
+ }, true /** broadcast **/);
8954
+ }
8955
+ else {
8956
+ core.domEvent.tableSelectionRange = core.api.selectTable(core, null);
8957
+ core.domEvent.imageSelectionRange = core.api.selectImage(core, null);
8958
+ }
8959
+ return !!rangeEx;
8901
8960
  };
8902
8961
  /**
8903
8962
  * Get current focused position. Return null if editor doesn't have focus at this time.
@@ -9379,6 +9438,31 @@ var Editor = /** @class */ (function () {
9379
9438
  return Editor;
9380
9439
  }());
9381
9440
  exports.default = Editor;
9441
+ function isSelectionRangeEx(obj) {
9442
+ var rangeEx = obj;
9443
+ return (rangeEx &&
9444
+ typeof rangeEx == 'object' &&
9445
+ typeof rangeEx.type == 'number' &&
9446
+ Array.isArray(rangeEx.ranges));
9447
+ }
9448
+ function isTableSelection(obj) {
9449
+ var selection = obj;
9450
+ return (selection &&
9451
+ typeof selection == 'object' &&
9452
+ typeof selection.firstCell == 'object' &&
9453
+ typeof selection.lastCell == 'object');
9454
+ }
9455
+ function isSelectionPath(obj) {
9456
+ var path = obj;
9457
+ return path && typeof path == 'object' && Array.isArray(path.start) && Array.isArray(path.end);
9458
+ }
9459
+ function isNodePosition(obj) {
9460
+ var pos = obj;
9461
+ return (pos &&
9462
+ typeof pos == 'object' &&
9463
+ typeof pos.node == 'object' &&
9464
+ typeof pos.offset == 'number');
9465
+ }
9382
9466
 
9383
9467
 
9384
9468
  /***/ }),
@@ -11365,6 +11449,7 @@ var safeInstanceOf_1 = __webpack_require__(/*! ../utils/safeInstanceOf */ "./pac
11365
11449
  var setStyles_1 = __webpack_require__(/*! ../style/setStyles */ "./packages/roosterjs-editor-dom/lib/style/setStyles.ts");
11366
11450
  var toArray_1 = __webpack_require__(/*! ../jsUtils/toArray */ "./packages/roosterjs-editor-dom/lib/jsUtils/toArray.ts");
11367
11451
  var cloneObject_1 = __webpack_require__(/*! ./cloneObject */ "./packages/roosterjs-editor-dom/lib/htmlSanitizer/cloneObject.ts");
11452
+ var processCssVariable_1 = __webpack_require__(/*! ./processCssVariable */ "./packages/roosterjs-editor-dom/lib/htmlSanitizer/processCssVariable.ts");
11368
11453
  var getAllowedValues_1 = __webpack_require__(/*! ./getAllowedValues */ "./packages/roosterjs-editor-dom/lib/htmlSanitizer/getAllowedValues.ts");
11369
11454
  /**
11370
11455
  * HTML sanitizer class provides two features:
@@ -11582,17 +11667,29 @@ var HtmlSanitizer = /** @class */ (function () {
11582
11667
  var value = styles[name];
11583
11668
  var callback = _this.styleCallbacks[name];
11584
11669
  var isInheritable = thisStyle[name] != undefined;
11585
- var keep = (!callback || callback(value, element, thisStyle, context)) &&
11586
- value != 'inherit' &&
11587
- value.indexOf('expression') < 0 &&
11588
- name.substr(0, 1) != '-' &&
11589
- _this.defaultStyleValues[name] != value &&
11590
- ((isInheritable && value != thisStyle[name]) ||
11591
- (!isInheritable && value != 'initial' && value != 'normal'));
11670
+ var keep = true;
11671
+ if (keep && !!callback) {
11672
+ keep = callback(value, element, thisStyle, context);
11673
+ }
11674
+ if (keep && (0, processCssVariable_1.isCssVariable)(value)) {
11675
+ value = (0, processCssVariable_1.processCssVariable)(value);
11676
+ keep = !!value;
11677
+ }
11678
+ keep =
11679
+ keep &&
11680
+ value != 'inherit' &&
11681
+ value.indexOf('expression') < 0 &&
11682
+ name.substr(0, 1) != '-' &&
11683
+ _this.defaultStyleValues[name] != value &&
11684
+ ((isInheritable && value != thisStyle[name]) ||
11685
+ (!isInheritable && value != 'initial' && value != 'normal'));
11592
11686
  if (keep && isInheritable) {
11593
11687
  thisStyle[name] = value;
11594
11688
  }
11595
- if (!keep) {
11689
+ if (keep) {
11690
+ styles[name] = value;
11691
+ }
11692
+ else {
11596
11693
  delete styles[name];
11597
11694
  }
11598
11695
  });
@@ -12118,6 +12215,39 @@ function getPredefinedCssForElement(element, additionalPredefinedCssForElement)
12118
12215
  exports.default = getPredefinedCssForElement;
12119
12216
 
12120
12217
 
12218
+ /***/ }),
12219
+
12220
+ /***/ "./packages/roosterjs-editor-dom/lib/htmlSanitizer/processCssVariable.ts":
12221
+ /*!*******************************************************************************!*\
12222
+ !*** ./packages/roosterjs-editor-dom/lib/htmlSanitizer/processCssVariable.ts ***!
12223
+ \*******************************************************************************/
12224
+ /*! no static exports found */
12225
+ /***/ (function(module, exports, __webpack_require__) {
12226
+
12227
+ "use strict";
12228
+
12229
+ Object.defineProperty(exports, "__esModule", { value: true });
12230
+ exports.isCssVariable = exports.processCssVariable = void 0;
12231
+ var VARIABLE_REGEX = /^\s*var\(\s*[a-zA-Z0-9-_]+\s*(,\s*(.*))?\)\s*$/;
12232
+ var VARIABLE_PREFIX = 'var(';
12233
+ /**
12234
+ * @internal
12235
+ * Handle CSS variable format. e.g.: var(--name, fallbackValue)
12236
+ */
12237
+ function processCssVariable(value) {
12238
+ var match = VARIABLE_REGEX.exec(value);
12239
+ return (match === null || match === void 0 ? void 0 : match[2]) || ''; // Without fallback value, we don't know what does the original value mean, so ignore it
12240
+ }
12241
+ exports.processCssVariable = processCssVariable;
12242
+ /**
12243
+ * @internal
12244
+ */
12245
+ function isCssVariable(value) {
12246
+ return value.indexOf(VARIABLE_PREFIX) == 0;
12247
+ }
12248
+ exports.isCssVariable = isCssVariable;
12249
+
12250
+
12121
12251
  /***/ }),
12122
12252
 
12123
12253
  /***/ "./packages/roosterjs-editor-dom/lib/index.ts":
@@ -13624,7 +13754,7 @@ var VListChain = /** @class */ (function () {
13624
13754
  var lastNumber = 0;
13625
13755
  for (var i = 0; i < lists.length; i++) {
13626
13756
  var list = lists[i];
13627
- list.start = lastNumber + 1;
13757
+ list.start = list.start > 1 ? list.start : lastNumber + 1;
13628
13758
  var vlist = new VList_1.default(list);
13629
13759
  lastNumber = vlist.getLastItemNumber() || 0;
13630
13760
  delete list.dataset[CHAIN_DATASET_NAME];
@@ -14387,16 +14517,16 @@ Object.defineProperty(exports, "__esModule", { value: true });
14387
14517
  */
14388
14518
  function setBulletListMarkers(li, listStyleType) {
14389
14519
  var marker = bulletListStyle[listStyleType];
14390
- var isDiscOrSquare = listStyleType === 1 /* Disc */ || listStyleType === 3 /* Square */;
14391
- li.style.listStyleType = isDiscOrSquare ? marker : "\"" + marker + "\"";
14520
+ var isDisc = listStyleType === 1 /* Disc */;
14521
+ li.style.listStyleType = isDisc ? marker : "\"" + marker + "\"";
14392
14522
  }
14393
14523
  exports.default = setBulletListMarkers;
14394
14524
  var bulletListStyle = (_a = {},
14395
14525
  _a[1 /* Disc */] = 'disc',
14396
- _a[3 /* Square */] = 'square',
14526
+ _a[3 /* Square */] = '',
14397
14527
  _a[2 /* Dash */] = '- ',
14398
- _a[5 /* LongArrow */] = ' ',
14399
- _a[8 /* DoubleLongArrow */] = ' ',
14528
+ _a[5 /* LongArrow */] = ' ',
14529
+ _a[8 /* DoubleLongArrow */] = ' ',
14400
14530
  _a[4 /* ShortArrow */] = '➢ ',
14401
14531
  _a[6 /* UnfilledArrow */] = '➪ ',
14402
14532
  _a[7 /* Hyphen */] = '— ',
@@ -15870,6 +16000,11 @@ var TableContentMetadataDefinition = (0, definitionCreators_1.createObjectDefini
15870
16000
  firstCell: CoordinatesDefinition,
15871
16001
  lastCell: CoordinatesDefinition,
15872
16002
  });
16003
+ var ImageContentMetadataDefinition = (0, definitionCreators_1.createObjectDefinition)({
16004
+ type: (0, definitionCreators_1.createNumberDefinition)(false /*isOptional*/, 2 /* ImageSelection */),
16005
+ isDarkMode: IsDarkModeDefinition,
16006
+ imageId: (0, definitionCreators_1.createStringDefinition)(),
16007
+ });
15873
16008
  /**
15874
16009
  * @deprecated Use setHtmlWithMetadata instead
15875
16010
  * Restore inner HTML of a root element from given html string. If the string contains selection path,
@@ -15905,7 +16040,8 @@ function setHtmlWithMetadata(rootNode, html, trustedHTMLHandler) {
15905
16040
  try {
15906
16041
  var obj = JSON.parse(potentialMetadataComment.nodeValue || '');
15907
16042
  if ((0, validate_1.default)(obj, NormalContentMetadataDefinition) ||
15908
- (0, validate_1.default)(obj, TableContentMetadataDefinition)) {
16043
+ (0, validate_1.default)(obj, TableContentMetadataDefinition) ||
16044
+ (0, validate_1.default)(obj, ImageContentMetadataDefinition)) {
15909
16045
  rootNode.removeChild(potentialMetadataComment);
15910
16046
  obj.type = typeof obj.type === 'undefined' ? 0 /* Normal */ : obj.type;
15911
16047
  obj.isDarkMode = obj.isDarkMode || false;
@@ -20157,7 +20293,7 @@ var DeleteBeforeEntityFeature = {
20157
20293
  function cacheGetNeighborEntityElement(event, editor, isNext, collapseOnly, operation) {
20158
20294
  var element = (0, roosterjs_editor_dom_1.cacheGetEventData)(event, 'NEIGHBOR_ENTITY_ELEMENT_' + isNext + '_' + collapseOnly, function () {
20159
20295
  var range = editor.getSelectionRange();
20160
- if (collapseOnly && !range.collapsed) {
20296
+ if (!range || (collapseOnly && !range.collapsed)) {
20161
20297
  return null;
20162
20298
  }
20163
20299
  range.commonAncestorContainer.normalize();
@@ -20222,6 +20358,10 @@ var getAutoBulletListStyle_1 = __webpack_require__(/*! ../utils/getAutoBulletLis
20222
20358
  var getAutoNumberingListStyle_1 = __webpack_require__(/*! ../utils/getAutoNumberingListStyle */ "./packages/roosterjs-editor-plugins/lib/plugins/ContentEdit/utils/getAutoNumberingListStyle.ts");
20223
20359
  var roosterjs_editor_api_1 = __webpack_require__(/*! roosterjs-editor-api */ "./packages/roosterjs-editor-api/lib/index.ts");
20224
20360
  var roosterjs_editor_dom_1 = __webpack_require__(/*! roosterjs-editor-dom */ "./packages/roosterjs-editor-dom/lib/index.ts");
20361
+ var ListStyleDefinitionMetadata = (0, roosterjs_editor_dom_1.createObjectDefinition)({
20362
+ orderedStyleType: (0, roosterjs_editor_dom_1.createNumberDefinition)(true /** isOptional */, undefined /** value **/, 1 /* Min */, 20 /* Max */),
20363
+ unorderedStyleType: (0, roosterjs_editor_dom_1.createNumberDefinition)(true /** isOptional */, undefined /** value **/, 1 /* Min */, 9 /* Max */),
20364
+ }, true /** isOptional */, true /** allowNull */);
20225
20365
  /**
20226
20366
  * IndentWhenTab edit feature, provides the ability to indent current list when user press TAB
20227
20367
  */
@@ -20391,7 +20531,7 @@ var AutoBulletList = {
20391
20531
  shouldHandleEvent: function (event, editor) {
20392
20532
  if (!cacheGetListElement(event, editor) &&
20393
20533
  editor.isFeatureEnabled("AutoFormatList" /* AutoFormatList */)) {
20394
- return shouldTriggerList(event, editor, getAutoBulletListStyle_1.default);
20534
+ return shouldTriggerList(event, editor, getAutoBulletListStyle_1.default, 2 /* Unordered */);
20395
20535
  }
20396
20536
  return false;
20397
20537
  },
@@ -20421,7 +20561,7 @@ var AutoNumberingList = {
20421
20561
  shouldHandleEvent: function (event, editor) {
20422
20562
  if (!cacheGetListElement(event, editor) &&
20423
20563
  editor.isFeatureEnabled("AutoFormatList" /* AutoFormatList */)) {
20424
- return shouldTriggerList(event, editor, getAutoNumberingListStyle_1.default);
20564
+ return shouldTriggerList(event, editor, getAutoNumberingListStyle_1.default, 1 /* Ordered */);
20425
20565
  }
20426
20566
  return false;
20427
20567
  },
@@ -20434,21 +20574,42 @@ var AutoNumberingList = {
20434
20574
  var textBeforeCursor = searcher.getSubStringBefore(5);
20435
20575
  var textRange = searcher.getRangeFromText(textBeforeCursor, true /*exactMatch*/);
20436
20576
  if (textRange) {
20437
- var number = parseInt(textBeforeCursor);
20438
- var previousNode = editor
20439
- .getBodyTraverser(textRange.startContainer)
20440
- .getPreviousBlockElement();
20441
- var isLi = previousNode
20442
- ? (0, roosterjs_editor_dom_1.getTagOfNode)(previousNode === null || previousNode === void 0 ? void 0 : previousNode.collapseToSingleElement()) === 'LI'
20443
- : false;
20577
+ var number = isFirstItemOfAList(textBeforeCursor)
20578
+ ? 1
20579
+ : parseInt(textBeforeCursor);
20580
+ var isLi = getPreviousList(editor, textRange);
20444
20581
  var listStyle = (0, getAutoNumberingListStyle_1.default)(textBeforeCursor);
20445
20582
  prepareAutoBullet(editor, textRange);
20446
- (0, roosterjs_editor_api_1.toggleNumbering)(editor, isLi ? undefined : number /** startNumber */, listStyle, 'autoToggleList' /** apiNameOverride */);
20583
+ (0, roosterjs_editor_api_1.toggleNumbering)(editor, isLi && number !== 1 ? undefined : number /** startNumber */, listStyle, 'autoToggleList' /** apiNameOverride */);
20447
20584
  }
20448
20585
  (_a = searcher.getRangeFromText(textBeforeCursor, true /*exactMatch*/)) === null || _a === void 0 ? void 0 : _a.deleteContents();
20449
20586
  }, null /*changeSource*/, true /*canUndoByBackspace*/);
20450
20587
  },
20451
20588
  };
20589
+ var getPreviousList = function (editor, textRange) {
20590
+ var _a;
20591
+ var previousNode = (_a = editor
20592
+ .getBodyTraverser(textRange === null || textRange === void 0 ? void 0 : textRange.startContainer)
20593
+ .getPreviousBlockElement()) === null || _a === void 0 ? void 0 : _a.collapseToSingleElement();
20594
+ return (0, roosterjs_editor_dom_1.getTagOfNode)(previousNode) === 'LI' ? previousNode : undefined;
20595
+ };
20596
+ var getPreviousListType = function (editor, textRange, listType) {
20597
+ var type = listType === 1 /* Ordered */ ? 'orderedStyleType' : 'unorderedStyleType';
20598
+ var previousNode = getPreviousList(editor, textRange);
20599
+ return previousNode && (0, roosterjs_editor_dom_1.getTagOfNode)(previousNode) === 'LI'
20600
+ ? (0, roosterjs_editor_dom_1.getMetadata)(previousNode.parentElement, ListStyleDefinitionMetadata)[type]
20601
+ : null;
20602
+ };
20603
+ var isFirstItemOfAList = function (item) {
20604
+ var number = parseInt(item);
20605
+ if (number && number === 1) {
20606
+ return 1;
20607
+ }
20608
+ else {
20609
+ var letter = item.replace(/\(|\)|\-|\./g, '').trim();
20610
+ return letter.length === 1 && ['i', 'a', 'I', 'A'].indexOf(letter) > -1 ? 1 : undefined;
20611
+ }
20612
+ };
20452
20613
  /**
20453
20614
  * Maintain the list numbers in list chain
20454
20615
  * e.g. we have two lists:
@@ -20511,14 +20672,23 @@ function cacheGetListElement(event, editor) {
20511
20672
  var listElement = li && (0, roosterjs_editor_dom_1.getTagOfNode)(li) == 'LI' && editor.getElementAtCursor('UL,OL', li);
20512
20673
  return listElement ? [listElement, li] : null;
20513
20674
  }
20514
- function shouldTriggerList(event, editor, getListStyle) {
20675
+ function shouldTriggerList(event, editor, getListStyle, listType) {
20515
20676
  var searcher = editor.getContentSearcherOfCursor(event);
20516
20677
  var textBeforeCursor = searcher.getSubStringBefore(4);
20517
20678
  var itHasSpace = /\s/g.test(textBeforeCursor);
20518
20679
  var listChains = getListChains(editor);
20680
+ var textRange = searcher.getRangeFromText(textBeforeCursor, true /*exactMatch*/);
20681
+ var previousListType = getPreviousListType(editor, textRange, listType);
20682
+ var isFirstItem = isFirstItemOfAList(textBeforeCursor);
20683
+ var listStyle = getListStyle(textBeforeCursor, listChains, previousListType);
20684
+ var shouldTriggerNewListStyle = isFirstItem ||
20685
+ !previousListType ||
20686
+ previousListType === listStyle ||
20687
+ listType === 2 /* Unordered */;
20519
20688
  return (!itHasSpace &&
20520
20689
  !searcher.getNearestNonTextInlineElement() &&
20521
- getListStyle(textBeforeCursor, listChains));
20690
+ listStyle &&
20691
+ shouldTriggerNewListStyle);
20522
20692
  }
20523
20693
  /**
20524
20694
  * @internal
@@ -20581,8 +20751,12 @@ function cacheGetRangeForMarkdownOperation(event, editor, triggerCharacter) {
20581
20751
  if (inlineTextContent[inlineTextContent.length - 1].trim().length == 0) {
20582
20752
  return false;
20583
20753
  }
20754
+ //if the text is pasted, it might create a inner element inside the text element,
20755
+ // then is necessary to check the parent block to get whole text
20756
+ var parentBlockText = textInlineElement.getParentBlock().getTextContent();
20584
20757
  // special case for consecutive trigger characters
20585
- if (inlineTextContent[inlineTextContent.length - 1] === triggerCharacter) {
20758
+ // check parent block in case of pasted text
20759
+ if (parentBlockText[parentBlockText.length - 1].trim() === triggerCharacter) {
20586
20760
  return false;
20587
20761
  }
20588
20762
  if (!endPosition) {
@@ -21367,24 +21541,42 @@ var characters = {
21367
21541
  '-': 2 /* Dash */,
21368
21542
  ')': 3 /* Parenthesis */,
21369
21543
  };
21544
+ var lowerRomanTypes = [
21545
+ 13 /* LowerRoman */,
21546
+ 16 /* LowerRomanDash */,
21547
+ 15 /* LowerRomanDoubleParenthesis */,
21548
+ 14 /* LowerRomanParenthesis */,
21549
+ ];
21550
+ var upperRomanTypes = [
21551
+ 17 /* UpperRoman */,
21552
+ 20 /* UpperRomanDash */,
21553
+ 19 /* UpperRomanDoubleParenthesis */,
21554
+ 18 /* UpperRomanParenthesis */,
21555
+ ];
21370
21556
  var numberingTriggers = ['1', 'a', 'A', 'I', 'i'];
21371
- var identifyNumberingType = function (text) {
21557
+ var lowerRomanNumbers = ['i', 'v', 'x', 'l', 'c', 'd', 'm'];
21558
+ var upperRomanNumbers = ['I', 'V', 'X', 'L', 'C', 'D', 'M'];
21559
+ var identifyNumberingType = function (text, previousListStyle) {
21372
21560
  if (!isNaN(parseInt(text))) {
21373
21561
  return 1 /* Decimal */;
21374
21562
  }
21375
21563
  else if (/[a-z]+/g.test(text)) {
21376
- if (text === 'i') {
21564
+ if ((lowerRomanTypes.indexOf(previousListStyle) > -1 &&
21565
+ lowerRomanNumbers.indexOf(text[0]) > -1) ||
21566
+ (!previousListStyle && text === 'i')) {
21377
21567
  return 4 /* LowerRoman */;
21378
21568
  }
21379
- else {
21569
+ else if (previousListStyle || (!previousListStyle && text === 'a')) {
21380
21570
  return 2 /* LowerAlpha */;
21381
21571
  }
21382
21572
  }
21383
21573
  else if (/[A-Z]+/g.test(text)) {
21384
- if (text === 'I') {
21574
+ if ((upperRomanTypes.indexOf(previousListStyle) > -1 &&
21575
+ upperRomanNumbers.indexOf(text[0]) > -1) ||
21576
+ (!previousListStyle && text === 'I')) {
21385
21577
  return 5 /* UpperRoman */;
21386
21578
  }
21387
- else {
21579
+ else if (previousListStyle || (!previousListStyle && text === 'A')) {
21388
21580
  return 3 /* UpperAlpha */;
21389
21581
  }
21390
21582
  }
@@ -21426,14 +21618,14 @@ var DecimalsTypes = (_f = {},
21426
21618
  _f[3 /* Parenthesis */] = 3 /* DecimalParenthesis */,
21427
21619
  _f[4 /* DoubleParenthesis */] = 4 /* DecimalDoubleParenthesis */,
21428
21620
  _f);
21429
- var identifyNumberingListType = function (numbering, isDoubleParenthesis) {
21621
+ var identifyNumberingListType = function (numbering, isDoubleParenthesis, previousListStyle) {
21430
21622
  var separatorCharacter = isDoubleParenthesis
21431
21623
  ? 4 /* DoubleParenthesis */
21432
- : characters[numbering[1]];
21624
+ : characters[numbering[numbering.length - 1]];
21433
21625
  // if separator is not valid, no need to check if the number is valid.
21434
21626
  if (separatorCharacter) {
21435
- var number = numbering[numbering.length - 2];
21436
- var numberingType = identifyNumberingType(number);
21627
+ var number = isDoubleParenthesis ? numbering.slice(1, -1) : numbering.slice(0, -1);
21628
+ var numberingType = identifyNumberingType(number, previousListStyle);
21437
21629
  return numberingType ? numberingListTypes[numberingType](separatorCharacter) : null;
21438
21630
  }
21439
21631
  return null;
@@ -21441,10 +21633,11 @@ var identifyNumberingListType = function (numbering, isDoubleParenthesis) {
21441
21633
  /**
21442
21634
  * @internal
21443
21635
  * @param textBeforeCursor The trigger character
21444
- * @param previousListChain (Optional) This parameters is used to keep the list chain, if the is not a new list
21636
+ * @param previousListChain @optional This parameters is used to keep the list chain, if the is not a new list
21637
+ * @param previousListStyle @optional The list style of the previous list
21445
21638
  * @returns The style of a numbering list triggered by a string
21446
21639
  */
21447
- function getAutoNumberingListStyle(textBeforeCursor, previousListChain) {
21640
+ function getAutoNumberingListStyle(textBeforeCursor, previousListChain, previousListStyle) {
21448
21641
  var _a;
21449
21642
  var trigger = textBeforeCursor.trim();
21450
21643
  //Only the staring items ['1', 'a', 'A', 'I', 'i'] must trigger a new list. All the other triggers is used to keep the list chain.
@@ -21458,12 +21651,8 @@ function getAutoNumberingListStyle(textBeforeCursor, previousListChain) {
21458
21651
  return null;
21459
21652
  }
21460
21653
  }
21461
- // the marker must be a combination of 2 or 3 characters, so if the length is less than 2, no need to check
21462
- // If the marker length is 3, the marker style is double parenthesis such as (1), (A).
21463
- var isDoubleParenthesis = trigger.length === 3 && trigger[0] === '(' && trigger[2] === ')';
21464
- var numberingType = trigger.length === 2 || isDoubleParenthesis
21465
- ? identifyNumberingListType(trigger, isDoubleParenthesis)
21466
- : null;
21654
+ var isDoubleParenthesis = trigger[0] === '(' && trigger[trigger.length - 1] === ')';
21655
+ var numberingType = identifyNumberingListType(trigger, isDoubleParenthesis, previousListStyle);
21467
21656
  return numberingType;
21468
21657
  }
21469
21658
  exports.default = getAutoNumberingListStyle;
@@ -22694,7 +22883,7 @@ var editInfo_1 = __webpack_require__(/*! ../editInfoUtils/editInfo */ "./package
22694
22883
  function resizeByPercentage(editor, image, percentage, minWidth, minHeight) {
22695
22884
  var editInfo = (0, editInfo_1.getEditInfoFromImage)(image);
22696
22885
  if (!(0, isResizedTo_1.default)(image, percentage)) {
22697
- loadImage(image, editInfo.src, function () {
22886
+ loadImage(image, image.src, function () {
22698
22887
  if (!editor.isDisposed() && editor.contains(image)) {
22699
22888
  var lastSrc_1 = image.getAttribute('src');
22700
22889
  var _a = (0, getTargetSizeByPercentage_1.default)(editInfo, percentage), width = _a.width, height = _a.height;
@@ -22883,7 +23072,7 @@ function areSameNumber(n1, n2) {
22883
23072
  Object.defineProperty(exports, "__esModule", { value: true });
22884
23073
  exports.getEditInfoFromImage = exports.deleteEditInfo = exports.saveEditInfo = void 0;
22885
23074
  var checkEditInfoState_1 = __webpack_require__(/*! ./checkEditInfoState */ "./packages/roosterjs-editor-plugins/lib/plugins/ImageEdit/editInfoUtils/checkEditInfoState.ts");
22886
- var IMAGE_EDIT_INFO_NAME = 'roosterEditInfo';
23075
+ var roosterjs_editor_dom_1 = __webpack_require__(/*! roosterjs-editor-dom */ "./packages/roosterjs-editor-dom/lib/index.ts");
22887
23076
  /**
22888
23077
  * @internal
22889
23078
  * Save edit info to image
@@ -22892,7 +23081,7 @@ var IMAGE_EDIT_INFO_NAME = 'roosterEditInfo';
22892
23081
  */
22893
23082
  function saveEditInfo(image, editInfo) {
22894
23083
  if (image) {
22895
- image.dataset[IMAGE_EDIT_INFO_NAME] = JSON.stringify(editInfo);
23084
+ (0, roosterjs_editor_dom_1.setMetadata)(image, editInfo);
22896
23085
  }
22897
23086
  }
22898
23087
  exports.saveEditInfo = saveEditInfo;
@@ -22903,7 +23092,7 @@ exports.saveEditInfo = saveEditInfo;
22903
23092
  */
22904
23093
  function deleteEditInfo(image) {
22905
23094
  if (image) {
22906
- delete image.dataset[IMAGE_EDIT_INFO_NAME];
23095
+ (0, roosterjs_editor_dom_1.removeMetadata)(image);
22907
23096
  }
22908
23097
  }
22909
23098
  exports.deleteEditInfo = deleteEditInfo;
@@ -22916,7 +23105,7 @@ exports.deleteEditInfo = deleteEditInfo;
22916
23105
  * @param image The image to get edit info from
22917
23106
  */
22918
23107
  function getEditInfoFromImage(image) {
22919
- var obj = safeParseJSON(image === null || image === void 0 ? void 0 : image.dataset[IMAGE_EDIT_INFO_NAME]);
23108
+ var obj = (0, roosterjs_editor_dom_1.getMetadata)(image);
22920
23109
  return (0, checkEditInfoState_1.default)(obj) == 0 /* Invalid */ ? getInitialEditInfo(image) : obj;
22921
23110
  }
22922
23111
  exports.getEditInfoFromImage = getEditInfoFromImage;
@@ -22934,14 +23123,6 @@ function getInitialEditInfo(image) {
22934
23123
  angleRad: 0,
22935
23124
  };
22936
23125
  }
22937
- function safeParseJSON(json) {
22938
- try {
22939
- return JSON.parse(json);
22940
- }
22941
- catch (_a) {
22942
- return null;
22943
- }
22944
- }
22945
23126
 
22946
23127
 
22947
23128
  /***/ }),
@@ -26326,7 +26507,8 @@ var TableCellSelection = /** @class */ (function () {
26326
26507
  */
26327
26508
  TableCellSelection.prototype.handleKeyDownEvent = function (event) {
26328
26509
  var _this = this;
26329
- var _a = event.rawEvent, shiftKey = _a.shiftKey, ctrlKey = _a.ctrlKey, metaKey = _a.metaKey, which = _a.which, defaultPrevented = _a.defaultPrevented;
26510
+ var _a;
26511
+ var _b = event.rawEvent, shiftKey = _b.shiftKey, ctrlKey = _b.ctrlKey, metaKey = _b.metaKey, which = _b.which, defaultPrevented = _b.defaultPrevented;
26330
26512
  if ((shiftKey && (ctrlKey || metaKey)) || which == 16 /* SHIFT */ || defaultPrevented) {
26331
26513
  this.preventKeyUp = defaultPrevented;
26332
26514
  return;
@@ -26362,6 +26544,10 @@ var TableCellSelection = /** @class */ (function () {
26362
26544
  }
26363
26545
  });
26364
26546
  }
26547
+ else if (((_a = this.editor.getSelectionRangeEx()) === null || _a === void 0 ? void 0 : _a.type) == 1 /* TableSelection */ &&
26548
+ (!(0, roosterjs_editor_dom_1.isCtrlOrMetaPressed)(event.rawEvent) || which == 36 /* HOME */ || which == 35 /* END */)) {
26549
+ this.editor.select(null);
26550
+ }
26365
26551
  };
26366
26552
  TableCellSelection.prototype.handleKeyUpEvent = function (event) {
26367
26553
  var _a = event.rawEvent, shiftKey = _a.shiftKey, which = _a.which, ctrlKey = _a.ctrlKey;
@@ -27242,9 +27428,7 @@ var TableEditor = /** @class */ (function () {
27242
27428
  var rows = vTable.cells.length - 1;
27243
27429
  var lastCellIndex_1 = 0;
27244
27430
  vTable.cells[rows].forEach(function (cell, index) {
27245
- if (cell.td) {
27246
- lastCellIndex_1 = index;
27247
- }
27431
+ lastCellIndex_1 = index;
27248
27432
  });
27249
27433
  var selection = {
27250
27434
  firstCell: {
@@ -29070,6 +29254,8 @@ var CompatibleKeys;
29070
29254
  CompatibleKeys[CompatibleKeys["ESCAPE"] = 27] = "ESCAPE";
29071
29255
  CompatibleKeys[CompatibleKeys["SPACE"] = 32] = "SPACE";
29072
29256
  CompatibleKeys[CompatibleKeys["PAGEUP"] = 33] = "PAGEUP";
29257
+ CompatibleKeys[CompatibleKeys["END"] = 35] = "END";
29258
+ CompatibleKeys[CompatibleKeys["HOME"] = 36] = "HOME";
29073
29259
  CompatibleKeys[CompatibleKeys["LEFT"] = 37] = "LEFT";
29074
29260
  CompatibleKeys[CompatibleKeys["UP"] = 38] = "UP";
29075
29261
  CompatibleKeys[CompatibleKeys["RIGHT"] = 39] = "RIGHT";