roosterjs 9.26.0 → 9.27.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/rooster.js CHANGED
@@ -5615,8 +5615,9 @@ function insertLink(editor, link, anchorTitle, displayText, target) {
5615
5615
  .map(function (x) { return (x.segmentType == 'Text' ? x.text : ''); })
5616
5616
  .join('');
5617
5617
  var text = displayText || originalText || '';
5618
- if (segments.some(function (x) { return x.segmentType != 'SelectionMarker'; }) &&
5619
- originalText == text) {
5618
+ if ((segments.some(function (x) { return x.segmentType != 'SelectionMarker'; }) &&
5619
+ originalText == text) ||
5620
+ (segments.length == 1 && segments[0].segmentType == 'Image')) {
5620
5621
  segments.forEach(function (x) {
5621
5622
  var link = createLink(linkUrl_1, anchorTitle, target, x.segmentType == 'Text');
5622
5623
  (0, roosterjs_content_model_dom_1.addLink)(x, link);
@@ -8020,6 +8021,64 @@ function exportContent(editor, mode, optionsOrCallbacks) {
8020
8021
  exports.exportContent = exportContent;
8021
8022
 
8022
8023
 
8024
+ /***/ }),
8025
+
8026
+ /***/ "./packages/roosterjs-content-model-core/lib/command/paste/cleanHtmlComments.ts":
8027
+ /*!**************************************************************************************!*\
8028
+ !*** ./packages/roosterjs-content-model-core/lib/command/paste/cleanHtmlComments.ts ***!
8029
+ \**************************************************************************************/
8030
+ /***/ ((__unused_webpack_module, exports) => {
8031
+
8032
+ "use strict";
8033
+
8034
+ Object.defineProperty(exports, "__esModule", ({ value: true }));
8035
+ exports.cleanHtmlComments = void 0;
8036
+ var HtmlCommentStart = '\x3C!--';
8037
+ var HtmlCommentStart2 = '<!--';
8038
+ var HtmlCommentEnd = '-->';
8039
+ var styleTag = '<style';
8040
+ var styleClosingTag = '</style>';
8041
+ var nonWordCharacterRegex = /\W/;
8042
+ /**
8043
+ * @internal
8044
+ * Exported only for unit test
8045
+ */
8046
+ function cleanHtmlComments(html) {
8047
+ var _a;
8048
+ var _b = extractHtmlIndexes(html), styleIndex = _b.styleIndex, styleEndIndex = _b.styleEndIndex;
8049
+ while (styleIndex > -1) {
8050
+ html = removeCommentsFromHtml(html, HtmlCommentStart, styleEndIndex, styleIndex);
8051
+ html = removeCommentsFromHtml(html, HtmlCommentStart2, styleEndIndex, styleIndex);
8052
+ html = removeCommentsFromHtml(html, HtmlCommentEnd, styleEndIndex, styleIndex);
8053
+ (_a = extractHtmlIndexes(html, styleEndIndex + 1), styleIndex = _a.styleIndex, styleEndIndex = _a.styleEndIndex);
8054
+ }
8055
+ return html;
8056
+ }
8057
+ exports.cleanHtmlComments = cleanHtmlComments;
8058
+ function extractHtmlIndexes(html, startIndex) {
8059
+ if (startIndex === void 0) { startIndex = 0; }
8060
+ var htmlLowercase = html.toLowerCase();
8061
+ var styleIndex = htmlLowercase.indexOf(styleTag, startIndex);
8062
+ var currentIndex = styleIndex + styleTag.length;
8063
+ var nextChar = html.substring(currentIndex, currentIndex + 1);
8064
+ while (!nonWordCharacterRegex.test(nextChar) && styleIndex > -1) {
8065
+ styleIndex = htmlLowercase.indexOf(styleTag, styleIndex + 1);
8066
+ currentIndex = styleIndex + styleTag.length;
8067
+ nextChar = html.substring(currentIndex, currentIndex + 1);
8068
+ }
8069
+ var styleEndIndex = htmlLowercase.indexOf(styleClosingTag, startIndex);
8070
+ return { styleIndex: styleIndex, styleEndIndex: styleEndIndex };
8071
+ }
8072
+ function removeCommentsFromHtml(html, marker, endId, startId) {
8073
+ var id = html.indexOf(marker, startId);
8074
+ while (id > -1 && id < endId) {
8075
+ html = html.substring(0, id) + html.substring(id + marker.length);
8076
+ id = html.indexOf(marker, id + 1);
8077
+ }
8078
+ return html;
8079
+ }
8080
+
8081
+
8023
8082
  /***/ }),
8024
8083
 
8025
8084
  /***/ "./packages/roosterjs-content-model-core/lib/command/paste/createPasteFragment.ts":
@@ -8259,6 +8318,7 @@ function getLastSegmentFormat(pasteModel) {
8259
8318
 
8260
8319
  Object.defineProperty(exports, "__esModule", ({ value: true }));
8261
8320
  exports.paste = void 0;
8321
+ var cleanHtmlComments_1 = __webpack_require__(/*! ./cleanHtmlComments */ "./packages/roosterjs-content-model-core/lib/command/paste/cleanHtmlComments.ts");
8262
8322
  var mergePasteContent_1 = __webpack_require__(/*! ./mergePasteContent */ "./packages/roosterjs-content-model-core/lib/command/paste/mergePasteContent.ts");
8263
8323
  var convertInlineCss_1 = __webpack_require__(/*! ../createModelFromHtml/convertInlineCss */ "./packages/roosterjs-content-model-core/lib/command/createModelFromHtml/convertInlineCss.ts");
8264
8324
  var createPasteFragment_1 = __webpack_require__(/*! ./createPasteFragment */ "./packages/roosterjs-content-model-core/lib/command/paste/createPasteFragment.ts");
@@ -8283,7 +8343,11 @@ function paste(editor, clipboardData, pasteTypeOrGetter) {
8283
8343
  });
8284
8344
  }
8285
8345
  // 1. Prepare variables
8286
- var doc = createDOMFromHtml(clipboardData.rawHtml, editor.getDOMCreator());
8346
+ var domCreator = editor.getDOMCreator();
8347
+ if (!domCreator.isBypassed && clipboardData.rawHtml) {
8348
+ clipboardData.rawHtml = (0, cleanHtmlComments_1.cleanHtmlComments)(clipboardData.rawHtml);
8349
+ }
8350
+ var doc = createDOMFromHtml(clipboardData.rawHtml, domCreator);
8287
8351
  var pasteType = typeof pasteTypeOrGetter == 'function'
8288
8352
  ? pasteTypeOrGetter(doc, clipboardData)
8289
8353
  : pasteTypeOrGetter;
@@ -8292,7 +8356,7 @@ function paste(editor, clipboardData, pasteTypeOrGetter) {
8292
8356
  // 3. Create target fragment
8293
8357
  var sourceFragment = (0, createPasteFragment_1.createPasteFragment)(editor.getDocument(), clipboardData, pasteType, (_a = (clipboardData.rawHtml == clipboardData.html
8294
8358
  ? doc
8295
- : createDOMFromHtml(clipboardData.html, editor.getDOMCreator()))) === null || _a === void 0 ? void 0 : _a.body);
8359
+ : createDOMFromHtml(clipboardData.html, domCreator))) === null || _a === void 0 ? void 0 : _a.body);
8296
8360
  // 4. Trigger BeforePaste event to allow plugins modify the fragment
8297
8361
  var eventResult = (0, generatePasteOptionFromPlugins_1.generatePasteOptionFromPlugins)(editor, clipboardData, sourceFragment, htmlFromClipboard, pasteType);
8298
8362
  // 5. Convert global CSS to inline CSS
@@ -10743,11 +10807,14 @@ var DomIndexerImpl = /** @class */ (function () {
10743
10807
  DomIndexerImpl.prototype.reconcileSelection = function (model, newSelection, oldSelection) {
10744
10808
  var _a, _b;
10745
10809
  if (oldSelection) {
10810
+ var startNode = void 0;
10746
10811
  if (oldSelection.type == 'range' &&
10747
10812
  this.isCollapsed(oldSelection) &&
10748
- (0, roosterjs_content_model_dom_1.isNodeOfType)(oldSelection.start.node, 'TEXT_NODE') &&
10749
- isIndexedSegment(oldSelection.start.node)) {
10750
- this.reconcileTextSelection(oldSelection.start.node);
10813
+ (startNode = oldSelection.start.node) &&
10814
+ (0, roosterjs_content_model_dom_1.isNodeOfType)(startNode, 'TEXT_NODE') &&
10815
+ isIndexedSegment(startNode) &&
10816
+ startNode.__roosterjsContentModel.segments.length > 0) {
10817
+ this.reconcileTextSelection(startNode);
10751
10818
  }
10752
10819
  else {
10753
10820
  (0, roosterjs_content_model_dom_1.setSelection)(model);
@@ -11409,6 +11476,7 @@ var adjustImageSelectionOnSafari_1 = __webpack_require__(/*! ./utils/adjustImage
11409
11476
  var deleteEmptyList_1 = __webpack_require__(/*! ./utils/deleteEmptyList */ "./packages/roosterjs-content-model-core/lib/corePlugin/copyPaste/utils/deleteEmptyList.ts");
11410
11477
  var pasteCopyBlockEntityParser_1 = __webpack_require__(/*! ../../override/pasteCopyBlockEntityParser */ "./packages/roosterjs-content-model-core/lib/override/pasteCopyBlockEntityParser.ts");
11411
11478
  var paste_1 = __webpack_require__(/*! ../../command/paste/paste */ "./packages/roosterjs-content-model-core/lib/command/paste/paste.ts");
11479
+ var pruneUnselectedModel_1 = __webpack_require__(/*! ./utils/pruneUnselectedModel */ "./packages/roosterjs-content-model-core/lib/corePlugin/copyPaste/utils/pruneUnselectedModel.ts");
11412
11480
  var roosterjs_content_model_dom_1 = __webpack_require__(/*! roosterjs-content-model-dom */ "./packages/roosterjs-content-model-dom/lib/index.ts");
11413
11481
  var TEMP_DIV_ID = 'roosterJS_copyCutTempDiv';
11414
11482
  /**
@@ -11423,6 +11491,7 @@ var CopyPastePlugin = /** @class */ (function () {
11423
11491
  var _this = this;
11424
11492
  this.editor = null;
11425
11493
  this.disposer = null;
11494
+ this.customCopyCutEnabled = false;
11426
11495
  this.onPaste = function (event) {
11427
11496
  if (_this.editor && isClipboardEvent(event)) {
11428
11497
  var editor_1 = _this.editor;
@@ -11467,6 +11536,7 @@ var CopyPastePlugin = /** @class */ (function () {
11467
11536
  beforeDispatch: function (e) { return _this.onCutCopy(e, true /*isCut*/); },
11468
11537
  },
11469
11538
  });
11539
+ this.customCopyCutEnabled = editor.isExperimentalFeatureEnabled('CustomCopyCut');
11470
11540
  };
11471
11541
  /**
11472
11542
  * Dispose this plugin
@@ -11491,7 +11561,7 @@ var CopyPastePlugin = /** @class */ (function () {
11491
11561
  };
11492
11562
  CopyPastePlugin.prototype.onCutCopy = function (event, isCut) {
11493
11563
  var _this = this;
11494
- var _a;
11564
+ var _a, _b, _c;
11495
11565
  if (!this.editor) {
11496
11566
  return;
11497
11567
  }
@@ -11500,6 +11570,7 @@ var CopyPastePlugin = /** @class */ (function () {
11500
11570
  (0, adjustImageSelectionOnSafari_1.adjustImageSelectionOnSafari)(this.editor, selection);
11501
11571
  if (selection && (selection.type != 'range' || !selection.range.collapsed)) {
11502
11572
  var pasteModel = this.editor.getContentModelCopy('disconnected');
11573
+ (0, pruneUnselectedModel_1.pruneUnselectedModel)(pasteModel);
11503
11574
  if (selection.type === 'table') {
11504
11575
  (0, roosterjs_content_model_dom_1.iterateSelections)(pasteModel, function (_, tableContext) {
11505
11576
  if (tableContext === null || tableContext === void 0 ? void 0 : tableContext.table) {
@@ -11526,10 +11597,16 @@ var CopyPastePlugin = /** @class */ (function () {
11526
11597
  rawEvent: event,
11527
11598
  isCut: isCut,
11528
11599
  }).range;
11529
- if (newRange) {
11600
+ if (this.customCopyCutEnabled && isClipboardEvent(event)) {
11601
+ event.preventDefault();
11602
+ var text = (0, roosterjs_content_model_dom_1.contentModelToText)(pasteModel);
11603
+ (_a = event.clipboardData) === null || _a === void 0 ? void 0 : _a.setData('text/html', tempDiv_1.innerHTML);
11604
+ (_b = event.clipboardData) === null || _b === void 0 ? void 0 : _b.setData('text/plain', text);
11605
+ }
11606
+ else if (newRange) {
11530
11607
  (0, addRangeToSelection_1.addRangeToSelection)(doc, newRange);
11531
11608
  }
11532
- (_a = doc.defaultView) === null || _a === void 0 ? void 0 : _a.requestAnimationFrame(function () {
11609
+ (_c = doc.defaultView) === null || _c === void 0 ? void 0 : _c.requestAnimationFrame(function () {
11533
11610
  if (!_this.editor) {
11534
11611
  return;
11535
11612
  }
@@ -11566,7 +11643,9 @@ var CopyPastePlugin = /** @class */ (function () {
11566
11643
  tempDiv.style.left = '0';
11567
11644
  tempDiv.style.userSelect = 'text';
11568
11645
  tempDiv.contentEditable = 'true';
11569
- doc.body.appendChild(tempDiv);
11646
+ if (!this.customCopyCutEnabled) {
11647
+ doc.body.appendChild(tempDiv);
11648
+ }
11570
11649
  this.state.tempDiv = tempDiv;
11571
11650
  }
11572
11651
  var div = this.state.tempDiv;
@@ -11778,6 +11857,151 @@ var deleteEmptyList = function (context) {
11778
11857
  exports.deleteEmptyList = deleteEmptyList;
11779
11858
 
11780
11859
 
11860
+ /***/ }),
11861
+
11862
+ /***/ "./packages/roosterjs-content-model-core/lib/corePlugin/copyPaste/utils/pruneUnselectedModel.ts":
11863
+ /*!******************************************************************************************************!*\
11864
+ !*** ./packages/roosterjs-content-model-core/lib/corePlugin/copyPaste/utils/pruneUnselectedModel.ts ***!
11865
+ \******************************************************************************************************/
11866
+ /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
11867
+
11868
+ "use strict";
11869
+
11870
+ Object.defineProperty(exports, "__esModule", ({ value: true }));
11871
+ exports.pruneUnselectedModel = void 0;
11872
+ var tslib_1 = __webpack_require__(/*! tslib */ "./node_modules/tslib/tslib.es6.mjs");
11873
+ /**
11874
+ * @internal
11875
+ */
11876
+ function pruneUnselectedModel(model) {
11877
+ pruneUnselectedModelInternal(model, false /* isSelectionAfterElement */);
11878
+ unwrap(model);
11879
+ }
11880
+ exports.pruneUnselectedModel = pruneUnselectedModel;
11881
+ function pruneUnselectedModelInternal(model, isSelectionAfterElement) {
11882
+ var e_1, _a, _b;
11883
+ for (var index = model.blocks.length - 1; index >= 0; index--) {
11884
+ var block = model.blocks[index];
11885
+ switch (block.blockType) {
11886
+ case 'BlockGroup':
11887
+ pruneUnselectedModelInternal(block, isSelectionAfterElement);
11888
+ if (block.blockGroupType == 'General'
11889
+ ? block.blocks.length == 0 && !block.isSelected
11890
+ : block.blocks.length == 0) {
11891
+ model.blocks.splice(index, 1);
11892
+ }
11893
+ break;
11894
+ case 'Divider':
11895
+ case 'Entity':
11896
+ if (!block.isSelected) {
11897
+ model.blocks.splice(index, 1);
11898
+ }
11899
+ else {
11900
+ isSelectionAfterElement = true;
11901
+ }
11902
+ break;
11903
+ case 'Paragraph':
11904
+ var newSegments = [];
11905
+ try {
11906
+ for (var _c = (e_1 = void 0, (0, tslib_1.__values)(block.segments)), _d = _c.next(); !_d.done; _d = _c.next()) {
11907
+ var segment = _d.value;
11908
+ if (segment.segmentType == 'General') {
11909
+ pruneUnselectedModel(segment);
11910
+ if (segment.blocks.length > 0 || segment.isSelected) {
11911
+ newSegments.push(segment);
11912
+ }
11913
+ }
11914
+ else if (segment.isSelected && segment.segmentType != 'SelectionMarker') {
11915
+ newSegments.push(segment);
11916
+ }
11917
+ }
11918
+ }
11919
+ catch (e_1_1) { e_1 = { error: e_1_1 }; }
11920
+ finally {
11921
+ try {
11922
+ if (_d && !_d.done && (_a = _c.return)) _a.call(_c);
11923
+ }
11924
+ finally { if (e_1) throw e_1.error; }
11925
+ }
11926
+ block.segments = newSegments;
11927
+ if (block.segments.length == 0) {
11928
+ model.blocks.splice(index, 1);
11929
+ }
11930
+ else {
11931
+ isSelectionAfterElement = true;
11932
+ }
11933
+ break;
11934
+ case 'Table':
11935
+ var filteredRows = [];
11936
+ for (var i = 0; i < block.rows.length; i++) {
11937
+ var row = block.rows[i];
11938
+ for (var j = 0; j < row.cells.length; j++) {
11939
+ var cell = row.cells[j];
11940
+ if (!cell.isSelected) {
11941
+ pruneUnselectedModelInternal(cell, isSelectionAfterElement);
11942
+ }
11943
+ else {
11944
+ isSelectionAfterElement = true;
11945
+ }
11946
+ }
11947
+ var newCells = [];
11948
+ for (var k = 0; k < row.cells.length; k++) {
11949
+ var cell = row.cells[k];
11950
+ if (cell.isSelected || cell.blocks.length > 0) {
11951
+ newCells.push(cell);
11952
+ }
11953
+ }
11954
+ row.cells = newCells;
11955
+ if (row.cells.length > 0) {
11956
+ filteredRows.push(row);
11957
+ }
11958
+ }
11959
+ if (!isSelectionAfterElement &&
11960
+ filteredRows.length == 1 &&
11961
+ filteredRows[0].cells.length == 1 &&
11962
+ !filteredRows[0].cells[0].isSelected) {
11963
+ var cell = filteredRows[0].cells[0];
11964
+ (_b = model.blocks).splice.apply(_b, (0, tslib_1.__spreadArray)([index, 1], (0, tslib_1.__read)(cell.blocks), false));
11965
+ }
11966
+ else if (filteredRows.length == 0) {
11967
+ model.blocks.splice(index, 1);
11968
+ }
11969
+ else {
11970
+ block.rows = filteredRows;
11971
+ }
11972
+ break;
11973
+ }
11974
+ }
11975
+ return isSelectionAfterElement;
11976
+ }
11977
+ function unwrap(model) {
11978
+ var block = model.blocks[0];
11979
+ if (model.blocks.length == 1) {
11980
+ while (block.blockType == 'BlockGroup') {
11981
+ model.blocks = block.blocks;
11982
+ block = model.blocks[0];
11983
+ if (model.blocks.length > 1) {
11984
+ return;
11985
+ }
11986
+ }
11987
+ if (block.blockType == 'Paragraph') {
11988
+ block.isImplicit = true;
11989
+ block.format = {};
11990
+ inheritSegmentFormatToChildren(block);
11991
+ }
11992
+ }
11993
+ }
11994
+ function inheritSegmentFormatToChildren(parent) {
11995
+ var value = parent.segmentFormat;
11996
+ if (value !== undefined) {
11997
+ for (var index = 0; index < parent.segments.length; index++) {
11998
+ var segment = parent.segments[index];
11999
+ segment.format = (0, tslib_1.__assign)((0, tslib_1.__assign)({}, parent.segmentFormat), segment.format);
12000
+ }
12001
+ }
12002
+ }
12003
+
12004
+
11781
12005
  /***/ }),
11782
12006
 
11783
12007
  /***/ "./packages/roosterjs-content-model-core/lib/corePlugin/createEditorCorePlugins.ts":
@@ -12816,6 +13040,7 @@ var FormatPlugin = /** @class */ (function () {
12816
13040
  */
12817
13041
  FormatPlugin.prototype.initialize = function (editor) {
12818
13042
  this.editor = editor;
13043
+ this.state.defaultFormat = (0, roosterjs_content_model_dom_1.normalizeSegmentFormat)(this.state.defaultFormat, editor.getEnvironment());
12819
13044
  };
12820
13045
  /**
12821
13046
  * The last method that editor will call to a plugin before it is disposed.
@@ -15437,6 +15662,7 @@ function trustedHTMLHandlerToDOMCreator(trustedHTMLHandler) {
15437
15662
  var handler = trustedHTMLHandler || exports.defaultTrustHtmlHandler;
15438
15663
  return {
15439
15664
  htmlToDOM: function (html) { return new DOMParser().parseFromString(handler(html), 'text/html'); },
15665
+ isBypassed: !trustedHTMLHandler,
15440
15666
  };
15441
15667
  }
15442
15668
 
@@ -15705,10 +15931,22 @@ exports.BulletListType = {
15705
15931
  * Bullet type circle
15706
15932
  */
15707
15933
  Circle: 9,
15934
+ /**
15935
+ * Box Shadow bullet type
15936
+ */
15937
+ BoxShadow: 10,
15938
+ /**
15939
+ * Rhombus with a cross inside
15940
+ */
15941
+ Xrhombus: 11,
15942
+ /**
15943
+ * Check mark bullet type
15944
+ */
15945
+ CheckMark: 12,
15708
15946
  /**
15709
15947
  * Maximum value of the enum
15710
15948
  */
15711
- Max: 9,
15949
+ Max: 12,
15712
15950
  };
15713
15951
 
15714
15952
 
@@ -16081,7 +16319,7 @@ var BulletListType_1 = __webpack_require__(/*! ./BulletListType */ "./packages/r
16081
16319
  */
16082
16320
  exports.UnorderedListStyleMap = (_a = {},
16083
16321
  _a[BulletListType_1.BulletListType.Disc] = 'disc',
16084
- _a[BulletListType_1.BulletListType.Square] = '"∎ "',
16322
+ _a[BulletListType_1.BulletListType.Square] = 'square',
16085
16323
  _a[BulletListType_1.BulletListType.Circle] = 'circle',
16086
16324
  _a[BulletListType_1.BulletListType.Dash] = '"- "',
16087
16325
  _a[BulletListType_1.BulletListType.LongArrow] = '"➔ "',
@@ -16089,6 +16327,9 @@ exports.UnorderedListStyleMap = (_a = {},
16089
16327
  _a[BulletListType_1.BulletListType.ShortArrow] = '"➢ "',
16090
16328
  _a[BulletListType_1.BulletListType.UnfilledArrow] = '"➪ "',
16091
16329
  _a[BulletListType_1.BulletListType.Hyphen] = '"— "',
16330
+ _a[BulletListType_1.BulletListType.CheckMark] = '"✔ "',
16331
+ _a[BulletListType_1.BulletListType.Xrhombus] = '"❖ "',
16332
+ _a[BulletListType_1.BulletListType.BoxShadow] = '"❑ "',
16092
16333
  _a);
16093
16334
 
16094
16335
 
@@ -16997,6 +17238,7 @@ var FormatContainerTriggerStyles = [
16997
17238
  'minWidth',
16998
17239
  'minHeight',
16999
17240
  ];
17241
+ var FormatContainerTriggerAttributes = ['id'];
17000
17242
  var ByPassFormatContainerTags = ['H1', 'H2', 'H3', 'H4', 'H5', 'H6', 'P', 'A'];
17001
17243
  var SegmentDecoratorTags = ['A', 'CODE'];
17002
17244
  /**
@@ -17050,7 +17292,8 @@ function shouldUseFormatContainer(element, context) {
17050
17292
  }
17051
17293
  // For block element with positive value of border width or top/bottom margin/padding,
17052
17294
  // we need to use format container
17053
- if (FormatContainerTriggerStyles.some(function (key) { return parseInt(style[key] || defaultStyle[key] || '') > 0; })) {
17295
+ if (FormatContainerTriggerStyles.some(function (key) { return parseInt(style[key] || defaultStyle[key] || '') > 0; }) ||
17296
+ FormatContainerTriggerAttributes.some(function (attr) { return element.hasAttribute(attr); })) {
17054
17297
  return true;
17055
17298
  }
17056
17299
  // For margin left/right with value "auto", we need to use format container
@@ -18407,6 +18650,35 @@ function setHiddenProperty(node, key, value) {
18407
18650
  exports.setHiddenProperty = setHiddenProperty;
18408
18651
 
18409
18652
 
18653
+ /***/ }),
18654
+
18655
+ /***/ "./packages/roosterjs-content-model-dom/lib/domUtils/hiddenProperties/imageState.ts":
18656
+ /*!******************************************************************************************!*\
18657
+ !*** ./packages/roosterjs-content-model-dom/lib/domUtils/hiddenProperties/imageState.ts ***!
18658
+ \******************************************************************************************/
18659
+ /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
18660
+
18661
+ "use strict";
18662
+
18663
+ Object.defineProperty(exports, "__esModule", ({ value: true }));
18664
+ exports.setImageState = exports.getImageState = void 0;
18665
+ var hiddenProperty_1 = __webpack_require__(/*! ./hiddenProperty */ "./packages/roosterjs-content-model-dom/lib/domUtils/hiddenProperties/hiddenProperty.ts");
18666
+ /**
18667
+ * Get image state from element. This is used to store a image state.
18668
+ */
18669
+ function getImageState(element) {
18670
+ return (0, hiddenProperty_1.getHiddenProperty)(element, 'imageState');
18671
+ }
18672
+ exports.getImageState = getImageState;
18673
+ /**
18674
+ * Set image state to element. This is used to store a image state.
18675
+ */
18676
+ function setImageState(element, marker) {
18677
+ (0, hiddenProperty_1.setHiddenProperty)(element, 'imageState', marker);
18678
+ }
18679
+ exports.setImageState = setImageState;
18680
+
18681
+
18410
18682
  /***/ }),
18411
18683
 
18412
18684
  /***/ "./packages/roosterjs-content-model-dom/lib/domUtils/hiddenProperties/paragraphMarker.ts":
@@ -19949,6 +20221,7 @@ var fontSizeFormatHandler_1 = __webpack_require__(/*! ./segment/fontSizeFormatHa
19949
20221
  var getObjectKeys_1 = __webpack_require__(/*! ../domUtils/getObjectKeys */ "./packages/roosterjs-content-model-dom/lib/domUtils/getObjectKeys.ts");
19950
20222
  var htmlAlignFormatHandler_1 = __webpack_require__(/*! ./block/htmlAlignFormatHandler */ "./packages/roosterjs-content-model-dom/lib/formatHandlers/block/htmlAlignFormatHandler.ts");
19951
20223
  var idFormatHandler_1 = __webpack_require__(/*! ./common/idFormatHandler */ "./packages/roosterjs-content-model-dom/lib/formatHandlers/common/idFormatHandler.ts");
20224
+ var imageStateFormatHandler_1 = __webpack_require__(/*! ./segment/imageStateFormatHandler */ "./packages/roosterjs-content-model-dom/lib/formatHandlers/segment/imageStateFormatHandler.ts");
19952
20225
  var italicFormatHandler_1 = __webpack_require__(/*! ./segment/italicFormatHandler */ "./packages/roosterjs-content-model-dom/lib/formatHandlers/segment/italicFormatHandler.ts");
19953
20226
  var letterSpacingFormatHandler_1 = __webpack_require__(/*! ./segment/letterSpacingFormatHandler */ "./packages/roosterjs-content-model-dom/lib/formatHandlers/segment/letterSpacingFormatHandler.ts");
19954
20227
  var lineHeightFormatHandler_1 = __webpack_require__(/*! ./block/lineHeightFormatHandler */ "./packages/roosterjs-content-model-dom/lib/formatHandlers/block/lineHeightFormatHandler.ts");
@@ -19988,6 +20261,7 @@ var defaultFormatHandlerMap = {
19988
20261
  entity: entityFormatHandler_1.entityFormatHandler,
19989
20262
  htmlAlign: htmlAlignFormatHandler_1.htmlAlignFormatHandler,
19990
20263
  id: idFormatHandler_1.idFormatHandler,
20264
+ imageState: imageStateFormatHandler_1.imageStateFormatHandler,
19991
20265
  italic: italicFormatHandler_1.italicFormatHandler,
19992
20266
  letterSpacing: letterSpacingFormatHandler_1.letterSpacingFormatHandler,
19993
20267
  lineHeight: lineHeightFormatHandler_1.lineHeightFormatHandler,
@@ -20100,6 +20374,7 @@ exports.defaultFormatKeysPerCategory = {
20100
20374
  'display',
20101
20375
  'float',
20102
20376
  'verticalAlign',
20377
+ 'imageState',
20103
20378
  ],
20104
20379
  link: [
20105
20380
  'link',
@@ -20118,7 +20393,7 @@ exports.defaultFormatKeysPerCategory = {
20118
20393
  code: ['fontFamily', 'display'],
20119
20394
  dataset: ['dataset'],
20120
20395
  divider: (0, tslib_1.__spreadArray)((0, tslib_1.__spreadArray)((0, tslib_1.__spreadArray)([], (0, tslib_1.__read)(sharedBlockFormats), false), (0, tslib_1.__read)(sharedContainerFormats), false), ['display', 'size', 'htmlAlign'], false),
20121
- container: (0, tslib_1.__spreadArray)((0, tslib_1.__spreadArray)([], (0, tslib_1.__read)(sharedContainerFormats), false), ['htmlAlign', 'size', 'display'], false),
20396
+ container: (0, tslib_1.__spreadArray)((0, tslib_1.__spreadArray)([], (0, tslib_1.__read)(sharedContainerFormats), false), ['htmlAlign', 'size', 'display', 'id'], false),
20122
20397
  entity: ['entity'],
20123
20398
  general: ['textColor', 'backgroundColor'], // General model still need to do color transformation in dark mode
20124
20399
  };
@@ -20477,6 +20752,37 @@ function normalizeFontSize(fontSize, contextFont, context) {
20477
20752
  }
20478
20753
 
20479
20754
 
20755
+ /***/ }),
20756
+
20757
+ /***/ "./packages/roosterjs-content-model-dom/lib/formatHandlers/segment/imageStateFormatHandler.ts":
20758
+ /*!****************************************************************************************************!*\
20759
+ !*** ./packages/roosterjs-content-model-dom/lib/formatHandlers/segment/imageStateFormatHandler.ts ***!
20760
+ \****************************************************************************************************/
20761
+ /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
20762
+
20763
+ "use strict";
20764
+
20765
+ Object.defineProperty(exports, "__esModule", ({ value: true }));
20766
+ exports.imageStateFormatHandler = void 0;
20767
+ var imageState_1 = __webpack_require__(/*! ../../domUtils/hiddenProperties/imageState */ "./packages/roosterjs-content-model-dom/lib/domUtils/hiddenProperties/imageState.ts");
20768
+ /**
20769
+ * @internal
20770
+ */
20771
+ exports.imageStateFormatHandler = {
20772
+ parse: function (format, element) {
20773
+ var marker = (0, imageState_1.getImageState)(element);
20774
+ if (marker) {
20775
+ format.imageState = marker;
20776
+ }
20777
+ },
20778
+ apply: function (format, element) {
20779
+ if (format.imageState) {
20780
+ (0, imageState_1.setImageState)(element, format.imageState);
20781
+ }
20782
+ },
20783
+ };
20784
+
20785
+
20480
20786
  /***/ }),
20481
20787
 
20482
20788
  /***/ "./packages/roosterjs-content-model-dom/lib/formatHandlers/segment/italicFormatHandler.ts":
@@ -21267,9 +21573,9 @@ exports.shouldSetValue = shouldSetValue;
21267
21573
 
21268
21574
  Object.defineProperty(exports, "__esModule", ({ value: true }));
21269
21575
  exports.createParagraphDecorator = 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.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;
21270
- exports.parseTableCells = exports.normalizeText = exports.isSpace = exports.isPunctuation = exports.extractBorderValues = exports.combineBorderValue = exports.isCursorMovingKey = 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.setParagraphNotImplicit = 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 = void 0;
21271
- exports.UnorderedListStyleMap = exports.OrderedListStyleMap = exports.TableBorderFormat = exports.NumberingListType = exports.BulletListType = exports.ChangeSource = exports.ListMetadataDefinition = exports.getListMetadata = exports.updateListMetadata = exports.getTableMetadata = exports.updateTableMetadata = exports.getTableCellMetadata = exports.updateTableCellMetadata = exports.getImageMetadata = exports.updateImageMetadata = exports.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.getParagraphMarker = exports.setParagraphMarker = exports.cacheGetEventData = exports.extractClipboardItems = exports.transformColor = exports.readFile = void 0;
21272
- exports.EmptySegmentFormat = void 0;
21576
+ exports.normalizeText = exports.isSpace = exports.isPunctuation = exports.extractBorderValues = exports.combineBorderValue = exports.isCursorMovingKey = 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.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 = void 0;
21577
+ exports.NumberingListType = exports.BulletListType = exports.ChangeSource = exports.ListMetadataDefinition = exports.getListMetadata = exports.updateListMetadata = exports.getTableMetadata = exports.updateTableMetadata = exports.getTableCellMetadata = exports.updateTableCellMetadata = exports.getImageMetadata = exports.updateImageMetadata = exports.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.getImageState = exports.setImageState = exports.getParagraphMarker = exports.setParagraphMarker = exports.cacheGetEventData = exports.extractClipboardItems = exports.transformColor = exports.readFile = exports.parseTableCells = void 0;
21578
+ exports.EmptySegmentFormat = exports.UnorderedListStyleMap = exports.OrderedListStyleMap = exports.TableBorderFormat = void 0;
21273
21579
  var domToContentModel_1 = __webpack_require__(/*! ./domToModel/domToContentModel */ "./packages/roosterjs-content-model-dom/lib/domToModel/domToContentModel.ts");
21274
21580
  Object.defineProperty(exports, "domToContentModel", ({ enumerable: true, get: function () { return domToContentModel_1.domToContentModel; } }));
21275
21581
  var contentModelToDom_1 = __webpack_require__(/*! ./modelToDom/contentModelToDom */ "./packages/roosterjs-content-model-dom/lib/modelToDom/contentModelToDom.ts");
@@ -21398,6 +21704,8 @@ var normalizeSegment_1 = __webpack_require__(/*! ./modelApi/common/normalizeSegm
21398
21704
  Object.defineProperty(exports, "normalizeSingleSegment", ({ enumerable: true, get: function () { return normalizeSegment_1.normalizeSingleSegment; } }));
21399
21705
  var mergeTextSegments_1 = __webpack_require__(/*! ./modelApi/common/mergeTextSegments */ "./packages/roosterjs-content-model-dom/lib/modelApi/common/mergeTextSegments.ts");
21400
21706
  Object.defineProperty(exports, "mergeTextSegments", ({ enumerable: true, get: function () { return mergeTextSegments_1.mergeTextSegments; } }));
21707
+ var normalizeSegmentFormat_1 = __webpack_require__(/*! ./modelApi/common/normalizeSegmentFormat */ "./packages/roosterjs-content-model-dom/lib/modelApi/common/normalizeSegmentFormat.ts");
21708
+ Object.defineProperty(exports, "normalizeSegmentFormat", ({ enumerable: true, get: function () { return normalizeSegmentFormat_1.normalizeSegmentFormat; } }));
21401
21709
  var setParagraphNotImplicit_1 = __webpack_require__(/*! ./modelApi/block/setParagraphNotImplicit */ "./packages/roosterjs-content-model-dom/lib/modelApi/block/setParagraphNotImplicit.ts");
21402
21710
  Object.defineProperty(exports, "setParagraphNotImplicit", ({ enumerable: true, get: function () { return setParagraphNotImplicit_1.setParagraphNotImplicit; } }));
21403
21711
  var getOrderedListNumberStr_1 = __webpack_require__(/*! ./modelApi/list/getOrderedListNumberStr */ "./packages/roosterjs-content-model-dom/lib/modelApi/list/getOrderedListNumberStr.ts");
@@ -21452,6 +21760,9 @@ Object.defineProperty(exports, "cacheGetEventData", ({ enumerable: true, get: fu
21452
21760
  var paragraphMarker_1 = __webpack_require__(/*! ./domUtils/hiddenProperties/paragraphMarker */ "./packages/roosterjs-content-model-dom/lib/domUtils/hiddenProperties/paragraphMarker.ts");
21453
21761
  Object.defineProperty(exports, "setParagraphMarker", ({ enumerable: true, get: function () { return paragraphMarker_1.setParagraphMarker; } }));
21454
21762
  Object.defineProperty(exports, "getParagraphMarker", ({ enumerable: true, get: function () { return paragraphMarker_1.getParagraphMarker; } }));
21763
+ var imageState_1 = __webpack_require__(/*! ./domUtils/hiddenProperties/imageState */ "./packages/roosterjs-content-model-dom/lib/domUtils/hiddenProperties/imageState.ts");
21764
+ Object.defineProperty(exports, "setImageState", ({ enumerable: true, get: function () { return imageState_1.setImageState; } }));
21765
+ Object.defineProperty(exports, "getImageState", ({ enumerable: true, get: function () { return imageState_1.getImageState; } }));
21455
21766
  var isBlockGroupOfType_1 = __webpack_require__(/*! ./modelApi/typeCheck/isBlockGroupOfType */ "./packages/roosterjs-content-model-dom/lib/modelApi/typeCheck/isBlockGroupOfType.ts");
21456
21767
  Object.defineProperty(exports, "isBlockGroupOfType", ({ enumerable: true, get: function () { return isBlockGroupOfType_1.isBlockGroupOfType; } }));
21457
21768
  var iterateSelections_1 = __webpack_require__(/*! ./modelApi/selection/iterateSelections */ "./packages/roosterjs-content-model-dom/lib/modelApi/selection/iterateSelections.ts");
@@ -22301,6 +22612,44 @@ function normalizeLastTextSegment(paragraph, segment, lastInlineSegment) {
22301
22612
  }
22302
22613
 
22303
22614
 
22615
+ /***/ }),
22616
+
22617
+ /***/ "./packages/roosterjs-content-model-dom/lib/modelApi/common/normalizeSegmentFormat.ts":
22618
+ /*!********************************************************************************************!*\
22619
+ !*** ./packages/roosterjs-content-model-dom/lib/modelApi/common/normalizeSegmentFormat.ts ***!
22620
+ \********************************************************************************************/
22621
+ /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
22622
+
22623
+ "use strict";
22624
+
22625
+ Object.defineProperty(exports, "__esModule", ({ value: true }));
22626
+ exports.normalizeSegmentFormat = void 0;
22627
+ var createContentModelDocument_1 = __webpack_require__(/*! ../creators/createContentModelDocument */ "./packages/roosterjs-content-model-dom/lib/modelApi/creators/createContentModelDocument.ts");
22628
+ var createText_1 = __webpack_require__(/*! ../creators/createText */ "./packages/roosterjs-content-model-dom/lib/modelApi/creators/createText.ts");
22629
+ var ensureParagraph_1 = __webpack_require__(/*! ./ensureParagraph */ "./packages/roosterjs-content-model-dom/lib/modelApi/common/ensureParagraph.ts");
22630
+ var createModelToDomContext_1 = __webpack_require__(/*! ../../modelToDom/context/createModelToDomContext */ "./packages/roosterjs-content-model-dom/lib/modelToDom/context/createModelToDomContext.ts");
22631
+ var createDomToModelContext_1 = __webpack_require__(/*! ../../domToModel/context/createDomToModelContext */ "./packages/roosterjs-content-model-dom/lib/domToModel/context/createDomToModelContext.ts");
22632
+ /**
22633
+ * Some format values can be changed when apply to DOM, such as font family.
22634
+ * This function will normalize the format and return the same string after DOM modification.
22635
+ * @param format The format to be normalized
22636
+ * @return Normalized format
22637
+ */
22638
+ function normalizeSegmentFormat(format, environment) {
22639
+ var _a, _b;
22640
+ var span = document.createElement('span');
22641
+ var segment = (0, createText_1.createText)('text', format);
22642
+ var domToModelContext = (0, createDomToModelContext_1.createDomToModelContextWithConfig)(environment.domToModelSettings.calculated);
22643
+ var modelToDomContext = (0, createModelToDomContext_1.createModelToDomContextWithConfig)(environment.modelToDomSettings.calculated);
22644
+ var model = (0, createContentModelDocument_1.createContentModelDocument)();
22645
+ modelToDomContext.modelHandlers.segment(span.ownerDocument, span, segment, modelToDomContext, []);
22646
+ domToModelContext.elementProcessors.element(model, span, domToModelContext);
22647
+ var paragraph = (0, ensureParagraph_1.ensureParagraph)(model);
22648
+ return (_b = (_a = paragraph.segments[0]) === null || _a === void 0 ? void 0 : _a.format) !== null && _b !== void 0 ? _b : format;
22649
+ }
22650
+ exports.normalizeSegmentFormat = normalizeSegmentFormat;
22651
+
22652
+
22304
22653
  /***/ }),
22305
22654
 
22306
22655
  /***/ "./packages/roosterjs-content-model-dom/lib/modelApi/common/unwrapBlock.ts":
@@ -24454,6 +24803,7 @@ exports.retrieveModelFormatState = void 0;
24454
24803
  var tslib_1 = __webpack_require__(/*! tslib */ "./node_modules/tslib/tslib.es6.mjs");
24455
24804
  var borderValues_1 = __webpack_require__(/*! ../../domUtils/style/borderValues */ "./packages/roosterjs-content-model-dom/lib/domUtils/style/borderValues.ts");
24456
24805
  var getClosestAncestorBlockGroupIndex_1 = __webpack_require__(/*! ./getClosestAncestorBlockGroupIndex */ "./packages/roosterjs-content-model-dom/lib/modelApi/editing/getClosestAncestorBlockGroupIndex.ts");
24806
+ var updateImageMetadata_1 = __webpack_require__(/*! ../metadata/updateImageMetadata */ "./packages/roosterjs-content-model-dom/lib/modelApi/metadata/updateImageMetadata.ts");
24457
24807
  var updateTableMetadata_1 = __webpack_require__(/*! ../metadata/updateTableMetadata */ "./packages/roosterjs-content-model-dom/lib/modelApi/metadata/updateTableMetadata.ts");
24458
24808
  var isBold_1 = __webpack_require__(/*! ../../domUtils/style/isBold */ "./packages/roosterjs-content-model-dom/lib/domUtils/style/isBold.ts");
24459
24809
  var iterateSelections_1 = __webpack_require__(/*! ../selection/iterateSelections */ "./packages/roosterjs-content-model-dom/lib/modelApi/selection/iterateSelections.ts");
@@ -24526,6 +24876,7 @@ function retrieveModelFormatState(model, pendingFormat, formatState, conflictSol
24526
24876
  }
24527
24877
  else {
24528
24878
  formatState.imageFormat = undefined;
24879
+ formatState.imageEditingMetadata = undefined;
24529
24880
  }
24530
24881
  }
24531
24882
  });
@@ -24622,6 +24973,7 @@ function retrieveImageFormat(image, result) {
24622
24973
  boxShadow: format.boxShadow,
24623
24974
  borderRadius: format.borderRadius,
24624
24975
  };
24976
+ result.imageEditingMetadata = (0, updateImageMetadata_1.getImageMetadata)(image);
24625
24977
  }
24626
24978
  function mergeValue(format, key, newValue, isFirst, conflictSolution, parseFn) {
24627
24979
  if (conflictSolution === void 0) { conflictSolution = 'remove'; }
@@ -28957,52 +29309,71 @@ var AutoFormatPlugin = /** @class */ (function () {
28957
29309
  if (options === void 0) { options = DefaultOptions; }
28958
29310
  this.options = options;
28959
29311
  this.editor = null;
28960
- this.features = [
29312
+ this.autoLink = {
29313
+ enabled: !!(this.options.autoLink || this.options.autoTel || this.options.autoMailto),
29314
+ transformFunction: function (_model, previousSegment, paragraph, context) {
29315
+ var _a;
29316
+ var _b = _this.options, autoLink = _b.autoLink, autoTel = _b.autoTel, autoMailto = _b.autoMailto;
29317
+ var linkSegment = (0, roosterjs_content_model_api_1.promoteLink)(previousSegment, paragraph, {
29318
+ autoLink: autoLink,
29319
+ autoTel: autoTel,
29320
+ autoMailto: autoMailto,
29321
+ });
29322
+ if (linkSegment) {
29323
+ return createAnchor(((_a = linkSegment.link) === null || _a === void 0 ? void 0 : _a.format.href) || '', linkSegment.text);
29324
+ }
29325
+ return false;
29326
+ },
29327
+ apiName: 'autoLink',
29328
+ changeSource: roosterjs_content_model_dom_1.ChangeSource.AutoLink,
29329
+ };
29330
+ this.tabFeatures = [
28961
29331
  {
28962
- autoFormat: 'list',
28963
29332
  enabled: !!(this.options.autoBullet || this.options.autoNumbering),
28964
29333
  transformFunction: function (model, _previousSegment, paragraph, context) {
28965
29334
  return (0, keyboardListTrigger_1.keyboardListTrigger)(model, paragraph, context, _this.options.autoBullet, _this.options.autoNumbering, _this.options.removeListMargins);
28966
29335
  },
29336
+ apiName: 'autoToggleList',
29337
+ changeSource: roosterjs_content_model_dom_1.ChangeSource.AutoFormat,
28967
29338
  },
29339
+ this.autoLink,
29340
+ ];
29341
+ this.features = (0, tslib_1.__spreadArray)((0, tslib_1.__spreadArray)([], (0, tslib_1.__read)(this.tabFeatures), false), [
28968
29342
  {
28969
- autoFormat: 'link',
28970
- enabled: !!(this.options.autoLink || this.options.autoTel || this.options.autoMailto),
28971
- transformFunction: function (_model, previousSegment, paragraph, context) {
28972
- var _a;
28973
- var _b = _this.options, autoLink = _b.autoLink, autoTel = _b.autoTel, autoMailto = _b.autoMailto;
28974
- var linkSegment = (0, roosterjs_content_model_api_1.promoteLink)(previousSegment, paragraph, {
28975
- autoLink: autoLink,
28976
- autoTel: autoTel,
28977
- autoMailto: autoMailto,
28978
- });
28979
- if (linkSegment) {
28980
- return createAnchor(((_a = linkSegment.link) === null || _a === void 0 ? void 0 : _a.format.href) || '', linkSegment.text);
28981
- }
28982
- return false;
28983
- },
28984
- },
28985
- {
28986
- autoFormat: 'hyphen',
28987
29343
  enabled: !!this.options.autoHyphen,
29344
+ apiName: 'autoHyphen',
29345
+ changeSource: roosterjs_content_model_dom_1.ChangeSource.Format,
28988
29346
  transformFunction: function (_model, previousSegment, paragraph, context) {
28989
29347
  return (0, transformHyphen_1.transformHyphen)(previousSegment, paragraph, context);
28990
29348
  },
28991
29349
  },
28992
29350
  {
28993
- autoFormat: 'fraction',
28994
29351
  enabled: !!this.options.autoFraction,
29352
+ apiName: 'autoFraction',
29353
+ changeSource: roosterjs_content_model_dom_1.ChangeSource.Format,
28995
29354
  transformFunction: function (_model, previousSegment, paragraph, context) {
28996
29355
  return (0, transformFraction_1.transformFraction)(previousSegment, paragraph, context);
28997
29356
  },
28998
29357
  },
28999
29358
  {
29000
- autoFormat: 'ordinal',
29001
29359
  enabled: !!this.options.autoOrdinals,
29360
+ apiName: 'autoOrdinal',
29361
+ changeSource: roosterjs_content_model_dom_1.ChangeSource.Format,
29002
29362
  transformFunction: function (_model, previousSegment, paragraph, context) {
29003
29363
  return (0, transformOrdinals_1.transformOrdinals)(previousSegment, paragraph, context);
29004
29364
  },
29005
29365
  },
29366
+ ], false);
29367
+ this.enterFeatures = [
29368
+ {
29369
+ enabled: !!this.options.autoHorizontalLine,
29370
+ transformFunction: function (model, _previousSegment, paragraph, context) {
29371
+ return (0, checkAndInsertHorizontalLine_1.checkAndInsertHorizontalLine)(model, paragraph, context);
29372
+ },
29373
+ apiName: 'autoHorizontalLine',
29374
+ changeSource: roosterjs_content_model_dom_1.ChangeSource.AutoFormat,
29375
+ },
29376
+ this.autoLink,
29006
29377
  ];
29007
29378
  }
29008
29379
  /**
@@ -29049,8 +29420,51 @@ var AutoFormatPlugin = /** @class */ (function () {
29049
29420
  }
29050
29421
  }
29051
29422
  };
29423
+ AutoFormatPlugin.prototype.handleKeyboardEvents = function (editor, features) {
29424
+ var formatOptions = {
29425
+ changeSource: '',
29426
+ apiName: '',
29427
+ getChangeData: undefined,
29428
+ };
29429
+ (0, roosterjs_content_model_api_1.formatTextSegmentBeforeSelectionMarker)(editor, function (model, previousSegment, paragraph, _markerFormat, context) {
29430
+ var e_1, _a;
29431
+ var featureApplied = undefined;
29432
+ var _loop_1 = function (feature) {
29433
+ if (feature.enabled) {
29434
+ var result_1 = feature.transformFunction(model, previousSegment, paragraph, context);
29435
+ if (result_1) {
29436
+ if (typeof result_1 !== 'boolean') {
29437
+ formatOptions.getChangeData = function () { return result_1; };
29438
+ }
29439
+ featureApplied = feature;
29440
+ return "break";
29441
+ }
29442
+ }
29443
+ };
29444
+ try {
29445
+ for (var features_1 = (0, tslib_1.__values)(features), features_1_1 = features_1.next(); !features_1_1.done; features_1_1 = features_1.next()) {
29446
+ var feature = features_1_1.value;
29447
+ var state_1 = _loop_1(feature);
29448
+ if (state_1 === "break")
29449
+ break;
29450
+ }
29451
+ }
29452
+ catch (e_1_1) { e_1 = { error: e_1_1 }; }
29453
+ finally {
29454
+ try {
29455
+ if (features_1_1 && !features_1_1.done && (_a = features_1.return)) _a.call(features_1);
29456
+ }
29457
+ finally { if (e_1) throw e_1.error; }
29458
+ }
29459
+ if (featureApplied) {
29460
+ formatOptions.changeSource = featureApplied.changeSource;
29461
+ formatOptions.apiName = featureApplied.apiName;
29462
+ }
29463
+ return !!featureApplied;
29464
+ }, formatOptions);
29465
+ return formatOptions;
29466
+ };
29052
29467
  AutoFormatPlugin.prototype.handleEditorInputEvent = function (editor, event) {
29053
- var _this = this;
29054
29468
  var rawEvent = event.rawEvent;
29055
29469
  var selection = editor.getDOMSelection();
29056
29470
  if (rawEvent.inputType === 'insertText' &&
@@ -29059,53 +29473,12 @@ var AutoFormatPlugin = /** @class */ (function () {
29059
29473
  selection.range.collapsed) {
29060
29474
  switch (rawEvent.data) {
29061
29475
  case ' ':
29062
- var formatOptions_1 = {
29063
- changeSource: '',
29064
- apiName: '',
29065
- getChangeData: undefined,
29066
- };
29067
- (0, roosterjs_content_model_api_1.formatTextSegmentBeforeSelectionMarker)(editor, function (model, previousSegment, paragraph, _markerFormat, context) {
29068
- var e_1, _a;
29069
- var formatApplied = undefined;
29070
- var _loop_1 = function (feature) {
29071
- if (feature.enabled) {
29072
- var result_1 = feature.transformFunction(model, previousSegment, paragraph, context);
29073
- if (result_1) {
29074
- if (typeof result_1 !== 'boolean') {
29075
- formatOptions_1.getChangeData = function () { return result_1; };
29076
- }
29077
- formatApplied = feature.autoFormat;
29078
- return "break";
29079
- }
29080
- }
29081
- };
29082
- try {
29083
- for (var _b = (0, tslib_1.__values)(_this.features), _c = _b.next(); !_c.done; _c = _b.next()) {
29084
- var feature = _c.value;
29085
- var state_1 = _loop_1(feature);
29086
- if (state_1 === "break")
29087
- break;
29088
- }
29089
- }
29090
- catch (e_1_1) { e_1 = { error: e_1_1 }; }
29091
- finally {
29092
- try {
29093
- if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
29094
- }
29095
- finally { if (e_1) throw e_1.error; }
29096
- }
29097
- if (formatApplied) {
29098
- formatOptions_1.changeSource = getChangeSource(formatApplied);
29099
- formatOptions_1.apiName = getApiName(formatApplied);
29100
- }
29101
- return !!formatApplied;
29102
- }, formatOptions_1);
29476
+ this.handleKeyboardEvents(editor, this.features);
29103
29477
  break;
29104
29478
  }
29105
29479
  }
29106
29480
  };
29107
29481
  AutoFormatPlugin.prototype.handleKeyDownEvent = function (editor, event) {
29108
- var _this = this;
29109
29482
  var rawEvent = event.rawEvent;
29110
29483
  if (!rawEvent.defaultPrevented && !event.handledByEditFeature) {
29111
29484
  switch (rawEvent.key) {
@@ -29116,34 +29489,21 @@ var AutoFormatPlugin = /** @class */ (function () {
29116
29489
  break;
29117
29490
  case 'Tab':
29118
29491
  if (!rawEvent.shiftKey) {
29119
- (0, roosterjs_content_model_api_1.formatTextSegmentBeforeSelectionMarker)(editor, function (model, _previousSegment, paragraph, _markerFormat, context) {
29120
- var _a = _this.options, autoBullet = _a.autoBullet, autoNumbering = _a.autoNumbering, removeListMargins = _a.removeListMargins;
29121
- var shouldList = false;
29122
- if (autoBullet || autoNumbering) {
29123
- shouldList = (0, keyboardListTrigger_1.keyboardListTrigger)(model, paragraph, context, autoBullet, autoNumbering, removeListMargins);
29124
- context.canUndoByBackspace = shouldList;
29125
- }
29126
- if (shouldList) {
29127
- event.rawEvent.preventDefault();
29128
- }
29129
- return shouldList;
29130
- }, {
29131
- changeSource: roosterjs_content_model_dom_1.ChangeSource.AutoFormat,
29132
- apiName: 'autoToggleList',
29133
- });
29492
+ var eventHandled_1 = this.handleKeyboardEvents(editor, this.tabFeatures);
29493
+ if (eventHandled_1.apiName == 'autoToggleList') {
29494
+ event.rawEvent.preventDefault();
29495
+ }
29134
29496
  }
29135
29497
  break;
29136
29498
  case 'Enter':
29137
- this.handleEnterKey(editor, event);
29499
+ var eventHandled = this.handleKeyboardEvents(editor, this.enterFeatures);
29500
+ if (eventHandled.apiName == 'autoHorizontalLine') {
29501
+ event.rawEvent.preventDefault();
29502
+ }
29138
29503
  break;
29139
29504
  }
29140
29505
  }
29141
29506
  };
29142
- AutoFormatPlugin.prototype.handleEnterKey = function (editor, event) {
29143
- if (this.options.autoHorizontalLine) {
29144
- (0, checkAndInsertHorizontalLine_1.checkAndInsertHorizontalLine)(editor, event);
29145
- }
29146
- };
29147
29507
  AutoFormatPlugin.prototype.handleContentChangedEvent = function (editor, event) {
29148
29508
  var _a = this.options, autoLink = _a.autoLink, autoTel = _a.autoTel, autoMailto = _a.autoMailto;
29149
29509
  if (event.source == 'Paste' && (autoLink || autoTel || autoMailto)) {
@@ -29157,16 +29517,6 @@ var AutoFormatPlugin = /** @class */ (function () {
29157
29517
  return AutoFormatPlugin;
29158
29518
  }());
29159
29519
  exports.AutoFormatPlugin = AutoFormatPlugin;
29160
- var getApiName = function (autoFormat) {
29161
- return autoFormat == 'list' ? 'autoToggleList' : autoFormat == 'hyphen' ? 'autoHyphen' : '';
29162
- };
29163
- var getChangeSource = function (autoFormat) {
29164
- return autoFormat == 'list' || autoFormat == 'hyphen'
29165
- ? roosterjs_content_model_dom_1.ChangeSource.AutoFormat
29166
- : autoFormat == 'link'
29167
- ? roosterjs_content_model_dom_1.ChangeSource.AutoLink
29168
- : '';
29169
- };
29170
29520
  var createAnchor = function (url, text) {
29171
29521
  var anchor = document.createElement('a');
29172
29522
  anchor.href = url;
@@ -29188,7 +29538,6 @@ var createAnchor = function (url, text) {
29188
29538
  Object.defineProperty(exports, "__esModule", ({ value: true }));
29189
29539
  exports.checkAndInsertHorizontalLine = exports.insertHorizontalLineIntoModel = void 0;
29190
29540
  var tslib_1 = __webpack_require__(/*! tslib */ "./node_modules/tslib/tslib.es6.mjs");
29191
- var roosterjs_content_model_api_1 = __webpack_require__(/*! roosterjs-content-model-api */ "./packages/roosterjs-content-model-api/lib/index.ts");
29192
29541
  var roosterjs_content_model_dom_1 = __webpack_require__(/*! roosterjs-content-model-dom */ "./packages/roosterjs-content-model-dom/lib/index.ts");
29193
29542
  var HorizontalLineTriggerCharacters = [
29194
29543
  '-',
@@ -29252,28 +29601,22 @@ exports.insertHorizontalLineIntoModel = insertHorizontalLineIntoModel;
29252
29601
  * @param event The keydown event
29253
29602
  * @returns True if horizontal line is inserted, otherwise false
29254
29603
  */
29255
- function checkAndInsertHorizontalLine(editor, event) {
29256
- return (0, roosterjs_content_model_api_1.formatTextSegmentBeforeSelectionMarker)(editor, function (model, _, para, __, context) {
29257
- var allText = para.segments.reduce(function (acc, segment) { return (segment.segmentType === 'Text' ? acc + segment.text : acc); }, '');
29258
- // At least 3 characters are needed to trigger horizontal line
29259
- if (allText.length < 3) {
29260
- return false;
29604
+ var checkAndInsertHorizontalLine = function (model, paragraph, context) {
29605
+ var allText = paragraph.segments.reduce(function (acc, segment) { return (segment.segmentType === 'Text' ? acc + segment.text : acc); }, '');
29606
+ // At least 3 characters are needed to trigger horizontal line
29607
+ if (allText.length < 3) {
29608
+ return false;
29609
+ }
29610
+ return HorizontalLineTriggerCharacters.some(function (triggerCharacter) {
29611
+ var shouldFormat = allText.split('').every(function (char) { return char === triggerCharacter; });
29612
+ if (shouldFormat) {
29613
+ paragraph.segments = paragraph.segments.filter(function (s) { return s.segmentType != 'Text'; });
29614
+ insertHorizontalLineIntoModel(model, context, triggerCharacter);
29615
+ context.canUndoByBackspace = true;
29261
29616
  }
29262
- return HorizontalLineTriggerCharacters.some(function (triggerCharacter) {
29263
- var shouldFormat = allText.split('').every(function (char) { return char === triggerCharacter; });
29264
- if (shouldFormat) {
29265
- para.segments = para.segments.filter(function (s) { return s.segmentType != 'Text'; });
29266
- insertHorizontalLineIntoModel(model, context, triggerCharacter);
29267
- event.rawEvent.preventDefault();
29268
- context.canUndoByBackspace = true;
29269
- }
29270
- return shouldFormat;
29271
- });
29272
- }, {
29273
- changeSource: roosterjs_content_model_dom_1.ChangeSource.AutoFormat,
29274
- apiName: 'autoHorizontalLine',
29617
+ return shouldFormat;
29275
29618
  });
29276
- }
29619
+ };
29277
29620
  exports.checkAndInsertHorizontalLine = checkAndInsertHorizontalLine;
29278
29621
 
29279
29622
 
@@ -30138,8 +30481,24 @@ var EditPlugin = /** @class */ (function () {
30138
30481
  this.disposer = null;
30139
30482
  this.shouldHandleNextInputEvent = false;
30140
30483
  this.selectionAfterDelete = null;
30141
- this.handleNormalEnter = false;
30484
+ this.handleNormalEnter = function (editor) { return false; };
30142
30485
  }
30486
+ EditPlugin.prototype.createNormalEnterChecker = function (result) {
30487
+ return result ? function () { return true; } : function () { return false; };
30488
+ };
30489
+ EditPlugin.prototype.getHandleNormalEnter = function (editor) {
30490
+ switch (typeof this.options.shouldHandleEnterKey) {
30491
+ case 'function':
30492
+ return this.options.shouldHandleEnterKey;
30493
+ break;
30494
+ case 'boolean':
30495
+ return this.createNormalEnterChecker(this.options.shouldHandleEnterKey);
30496
+ break;
30497
+ default:
30498
+ return this.createNormalEnterChecker(editor.isExperimentalFeatureEnabled('HandleEnterKey'));
30499
+ break;
30500
+ }
30501
+ };
30143
30502
  /**
30144
30503
  * Get name of this plugin
30145
30504
  */
@@ -30155,7 +30514,7 @@ var EditPlugin = /** @class */ (function () {
30155
30514
  EditPlugin.prototype.initialize = function (editor) {
30156
30515
  var _this = this;
30157
30516
  this.editor = editor;
30158
- this.handleNormalEnter = this.editor.isExperimentalFeatureEnabled('HandleEnterKey');
30517
+ this.handleNormalEnter = this.getHandleNormalEnter(editor);
30159
30518
  if (editor.getEnvironment().isAndroid) {
30160
30519
  this.disposer = this.editor.attachDomEvent({
30161
30520
  beforeinput: {
@@ -30262,7 +30621,7 @@ var EditPlugin = /** @class */ (function () {
30262
30621
  if (!hasCtrlOrMetaKey &&
30263
30622
  !event.rawEvent.isComposing &&
30264
30623
  event.rawEvent.keyCode !== DEAD_KEY) {
30265
- (0, keyboardEnter_1.keyboardEnter)(editor, rawEvent, this.handleNormalEnter);
30624
+ (0, keyboardEnter_1.keyboardEnter)(editor, rawEvent, this.handleNormalEnter(editor));
30266
30625
  }
30267
30626
  break;
30268
30627
  default:
@@ -31671,17 +32030,36 @@ Object.defineProperty(exports, "__esModule", ({ value: true }));
31671
32030
  exports.splitParagraph = void 0;
31672
32031
  var tslib_1 = __webpack_require__(/*! tslib */ "./node_modules/tslib/tslib.es6.mjs");
31673
32032
  var roosterjs_content_model_dom_1 = __webpack_require__(/*! roosterjs-content-model-dom */ "./packages/roosterjs-content-model-dom/lib/index.ts");
32033
+ var DEFAULT_FORMAT_KEYS = [
32034
+ 'backgroundColor',
32035
+ 'direction',
32036
+ 'textAlign',
32037
+ 'htmlAlign',
32038
+ 'lineHeight',
32039
+ 'textIndent',
32040
+ 'marginTop',
32041
+ 'marginRight',
32042
+ 'marginBottom',
32043
+ 'marginLeft',
32044
+ 'paddingTop',
32045
+ 'paddingRight',
32046
+ 'paddingBottom',
32047
+ 'paddingLeft',
32048
+ ];
31674
32049
  /**
31675
32050
  * @internal
31676
32051
  * Split the given paragraph from insert point into two paragraphs,
31677
32052
  * and move the selection marker to the beginning of the second paragraph
31678
32053
  * @param insertPoint The input insert point which includes the paragraph and selection marker
32054
+ * @param formatKeys The format that needs to be copied from the splitted paragraph, if not specified, some default format will be copied
31679
32055
  * @returns The new paragraph it created
31680
32056
  */
31681
- function splitParagraph(insertPoint) {
32057
+ function splitParagraph(insertPoint, formatKeys) {
31682
32058
  var _a;
32059
+ if (formatKeys === void 0) { formatKeys = DEFAULT_FORMAT_KEYS; }
31683
32060
  var paragraph = insertPoint.paragraph, marker = insertPoint.marker;
31684
- var newParagraph = (0, roosterjs_content_model_dom_1.createParagraph)(false /*isImplicit*/, paragraph.format, paragraph.segmentFormat);
32061
+ var newFormat = createNewFormat(paragraph.format, formatKeys);
32062
+ var newParagraph = (0, roosterjs_content_model_dom_1.createParagraph)(false /*isImplicit*/, newFormat, paragraph.segmentFormat);
31685
32063
  var markerIndex = paragraph.segments.indexOf(marker);
31686
32064
  var segments = paragraph.segments.splice(markerIndex, paragraph.segments.length - markerIndex);
31687
32065
  if (paragraph.segments.length == 0) {
@@ -31694,6 +32072,26 @@ function splitParagraph(insertPoint) {
31694
32072
  return newParagraph;
31695
32073
  }
31696
32074
  exports.splitParagraph = splitParagraph;
32075
+ var createNewFormat = function (format, formatKeys) {
32076
+ var e_1, _a, _b;
32077
+ var newFormat = {};
32078
+ try {
32079
+ for (var formatKeys_1 = (0, tslib_1.__values)(formatKeys), formatKeys_1_1 = formatKeys_1.next(); !formatKeys_1_1.done; formatKeys_1_1 = formatKeys_1.next()) {
32080
+ var key = formatKeys_1_1.value;
32081
+ if (format[key]) {
32082
+ newFormat = (0, tslib_1.__assign)((0, tslib_1.__assign)({}, newFormat), (_b = {}, _b[key] = format[key], _b));
32083
+ }
32084
+ }
32085
+ }
32086
+ catch (e_1_1) { e_1 = { error: e_1_1 }; }
32087
+ finally {
32088
+ try {
32089
+ if (formatKeys_1_1 && !formatKeys_1_1.done && (_a = formatKeys_1.return)) _a.call(formatKeys_1);
32090
+ }
32091
+ finally { if (e_1) throw e_1.error; }
32092
+ }
32093
+ return newFormat;
32094
+ };
31697
32095
 
31698
32096
 
31699
32097
  /***/ }),
@@ -32302,9 +32700,6 @@ var ImageEditPlugin = /** @class */ (function () {
32302
32700
  ImageEditPlugin.prototype.removeImageEditing = function (clonedRoot) {
32303
32701
  var images = clonedRoot.querySelectorAll('img');
32304
32702
  images.forEach(function (image) {
32305
- if (image.dataset.isEditing) {
32306
- delete image.dataset.isEditing;
32307
- }
32308
32703
  if (image.dataset.editingInfo) {
32309
32704
  delete image.dataset.editingInfo;
32310
32705
  }
@@ -32375,8 +32770,11 @@ var ImageEditPlugin = /** @class */ (function () {
32375
32770
  };
32376
32771
  ImageEditPlugin.prototype.setContentHandler = function (editor) {
32377
32772
  var selection = editor.getDOMSelection();
32378
- if ((selection === null || selection === void 0 ? void 0 : selection.type) == 'image' && selection.image.dataset.isEditing && !this.isEditing) {
32379
- delete selection.image.dataset.isEditing;
32773
+ if ((selection === null || selection === void 0 ? void 0 : selection.type) == 'image') {
32774
+ this.cleanInfo();
32775
+ (0, roosterjs_content_model_dom_1.setImageState)(selection.image, '');
32776
+ this.isEditing = false;
32777
+ this.isCropMode = false;
32380
32778
  }
32381
32779
  };
32382
32780
  ImageEditPlugin.prototype.formatEventHandler = function (event) {
@@ -32414,7 +32812,7 @@ var ImageEditPlugin = /** @class */ (function () {
32414
32812
  var result = false;
32415
32813
  if (shouldSelectImage ||
32416
32814
  (previousSelectedImage === null || previousSelectedImage === void 0 ? void 0 : previousSelectedImage.image) != (editingImage === null || editingImage === void 0 ? void 0 : editingImage.image) ||
32417
- (previousSelectedImage === null || previousSelectedImage === void 0 ? void 0 : previousSelectedImage.image.dataset.isEditing) ||
32815
+ (previousSelectedImage === null || previousSelectedImage === void 0 ? void 0 : previousSelectedImage.image.format.imageState) == findEditingImage_1.EDITING_MARKER ||
32418
32816
  isApiOperation) {
32419
32817
  var _a = _this, lastSrc_1 = _a.lastSrc, selectedImage_1 = _a.selectedImage, imageEditInfo_1 = _a.imageEditInfo, clonedImage_1 = _a.clonedImage;
32420
32818
  if ((_this.isEditing || isApiOperation) &&
@@ -32427,7 +32825,7 @@ var ImageEditPlugin = /** @class */ (function () {
32427
32825
  (0, applyChange_1.applyChange)(editor, selectedImage_1, image, imageEditInfo_1, lastSrc_1, _this.wasImageResized || _this.isCropMode, clonedImage_1);
32428
32826
  image.isSelected = shouldSelectImage;
32429
32827
  image.isSelectedAsImageSelection = shouldSelectImage;
32430
- delete image.dataset.isEditing;
32828
+ image.format.imageState = undefined;
32431
32829
  if ((selection === null || selection === void 0 ? void 0 : selection.type) == 'range' && !selection.range.collapsed) {
32432
32830
  var selectedParagraphs = (0, roosterjs_content_model_dom_1.getSelectedParagraphs)(model, true);
32433
32831
  var isImageInRange = selectedParagraphs.some(function (paragraph) {
@@ -32455,7 +32853,7 @@ var ImageEditPlugin = /** @class */ (function () {
32455
32853
  (0, roosterjs_content_model_dom_1.mutateSegment)(editingImage.paragraph, editingImage.image, function (image) {
32456
32854
  editingImageModel = image;
32457
32855
  _this.imageEditInfo = (0, updateImageEditInfo_1.updateImageEditInfo)(image, selection.image);
32458
- image.dataset.isEditing = 'true';
32856
+ image.format.imageState = 'isEditing';
32459
32857
  });
32460
32858
  result = true;
32461
32859
  }
@@ -32466,7 +32864,7 @@ var ImageEditPlugin = /** @class */ (function () {
32466
32864
  if (!isApiOperation &&
32467
32865
  editingImageModel &&
32468
32866
  editingImageModel == model &&
32469
- editingImageModel.dataset.isEditing &&
32867
+ editingImageModel.format.imageState == findEditingImage_1.EDITING_MARKER &&
32470
32868
  (0, roosterjs_content_model_dom_1.isNodeOfType)(node, 'ELEMENT_NODE') &&
32471
32869
  (0, roosterjs_content_model_dom_1.isElementOfType)(node, 'img')) {
32472
32870
  if (isCropMode) {
@@ -33557,9 +33955,13 @@ exports.doubleCheckResize = doubleCheckResize;
33557
33955
  "use strict";
33558
33956
 
33559
33957
  Object.defineProperty(exports, "__esModule", ({ value: true }));
33560
- exports.findEditingImage = void 0;
33958
+ exports.findEditingImage = exports.EDITING_MARKER = void 0;
33561
33959
  var tslib_1 = __webpack_require__(/*! tslib */ "./node_modules/tslib/tslib.es6.mjs");
33562
33960
  var roosterjs_content_model_api_1 = __webpack_require__(/*! roosterjs-content-model-api */ "./packages/roosterjs-content-model-api/lib/index.ts");
33961
+ /**
33962
+ * @internal
33963
+ */
33964
+ exports.EDITING_MARKER = 'isEditing';
33563
33965
  /**
33564
33966
  * @internal
33565
33967
  */
@@ -33571,7 +33973,8 @@ function findEditingImage(group, imageId) {
33571
33973
  for (var _b = (0, tslib_1.__values)(paragraph.segments), _c = _b.next(); !_c.done; _c = _b.next()) {
33572
33974
  var segment = _c.value;
33573
33975
  if (segment.segmentType == 'Image' &&
33574
- ((imageId && segment.format.id == imageId) || segment.dataset.isEditing)) {
33976
+ ((imageId && segment.format.id == imageId) ||
33977
+ segment.format.imageState == exports.EDITING_MARKER)) {
33575
33978
  imageAndParagraph = { image: segment, paragraph: paragraph };
33576
33979
  return true;
33577
33980
  }
@@ -34689,9 +35092,9 @@ var addParser_1 = __webpack_require__(/*! ./utils/addParser */ "./packages/roost
34689
35092
  var roosterjs_content_model_dom_1 = __webpack_require__(/*! roosterjs-content-model-dom */ "./packages/roosterjs-content-model-dom/lib/index.ts");
34690
35093
  var chainSanitizerCallback_1 = __webpack_require__(/*! ./utils/chainSanitizerCallback */ "./packages/roosterjs-content-model-plugins/lib/paste/utils/chainSanitizerCallback.ts");
34691
35094
  var DefaultSanitizers_1 = __webpack_require__(/*! ./DefaultSanitizers */ "./packages/roosterjs-content-model-plugins/lib/paste/DefaultSanitizers.ts");
34692
- var deprecatedColorParser_1 = __webpack_require__(/*! ./utils/deprecatedColorParser */ "./packages/roosterjs-content-model-plugins/lib/paste/utils/deprecatedColorParser.ts");
35095
+ var deprecatedColorParser_1 = __webpack_require__(/*! ./parsers/deprecatedColorParser */ "./packages/roosterjs-content-model-plugins/lib/paste/parsers/deprecatedColorParser.ts");
34693
35096
  var getPasteSource_1 = __webpack_require__(/*! ./pasteSourceValidations/getPasteSource */ "./packages/roosterjs-content-model-plugins/lib/paste/pasteSourceValidations/getPasteSource.ts");
34694
- var linkParser_1 = __webpack_require__(/*! ./utils/linkParser */ "./packages/roosterjs-content-model-plugins/lib/paste/utils/linkParser.ts");
35097
+ var linkParser_1 = __webpack_require__(/*! ./parsers/linkParser */ "./packages/roosterjs-content-model-plugins/lib/paste/parsers/linkParser.ts");
34695
35098
  var constants_1 = __webpack_require__(/*! ./pasteSourceValidations/constants */ "./packages/roosterjs-content-model-plugins/lib/paste/pasteSourceValidations/constants.ts");
34696
35099
  var processPastedContentFromExcel_1 = __webpack_require__(/*! ./Excel/processPastedContentFromExcel */ "./packages/roosterjs-content-model-plugins/lib/paste/Excel/processPastedContentFromExcel.ts");
34697
35100
  var processPastedContentFromOneNote_1 = __webpack_require__(/*! ./oneNote/processPastedContentFromOneNote */ "./packages/roosterjs-content-model-plugins/lib/paste/oneNote/processPastedContentFromOneNote.ts");
@@ -34762,7 +35165,7 @@ var PastePlugin = /** @class */ (function () {
34762
35165
  var pasteType = event.pasteType;
34763
35166
  switch (pasteSource) {
34764
35167
  case 'wordDesktop':
34765
- (0, processPastedContentFromWordDesktop_1.processPastedContentFromWordDesktop)(event, this.editor.getDOMCreator());
35168
+ (0, processPastedContentFromWordDesktop_1.processPastedContentFromWordDesktop)(event);
34766
35169
  break;
34767
35170
  case 'wacComponents':
34768
35171
  (0, processPastedContentWacComponents_1.processPastedContentWacComponents)(event);
@@ -34854,22 +35257,153 @@ function tableBorderParser(format, element) {
34854
35257
 
34855
35258
  Object.defineProperty(exports, "__esModule", ({ value: true }));
34856
35259
  exports.processPastedContentFromPowerPoint = void 0;
35260
+ var tslib_1 = __webpack_require__(/*! tslib */ "./node_modules/tslib/tslib.es6.mjs");
35261
+ var addParser_1 = __webpack_require__(/*! ../utils/addParser */ "./packages/roosterjs-content-model-plugins/lib/paste/utils/addParser.ts");
35262
+ var customListUtils_1 = __webpack_require__(/*! ../utils/customListUtils */ "./packages/roosterjs-content-model-plugins/lib/paste/utils/customListUtils.ts");
35263
+ var removeNegativeTextIndentParser_1 = __webpack_require__(/*! ../parsers/removeNegativeTextIndentParser */ "./packages/roosterjs-content-model-plugins/lib/paste/parsers/removeNegativeTextIndentParser.ts");
35264
+ var setProcessor_1 = __webpack_require__(/*! ../utils/setProcessor */ "./packages/roosterjs-content-model-plugins/lib/paste/utils/setProcessor.ts");
34857
35265
  var roosterjs_content_model_dom_1 = __webpack_require__(/*! roosterjs-content-model-dom */ "./packages/roosterjs-content-model-dom/lib/index.ts");
35266
+ var BulletSelector = '* > span > span[style*=mso-special-format]';
35267
+ var MsOfficeSpecialFormat = 'mso-special-format';
35268
+ var CssStyleKey = 'style';
35269
+ var MsoSpecialFormatRegex = /mso-special-format:\s*([^;]*)/;
35270
+ var clearListItemStyles = function (format) {
35271
+ delete format.textAlign;
35272
+ delete format.marginLeft;
35273
+ delete format.paddingLeft;
35274
+ };
34858
35275
  /**
34859
35276
  * @internal
34860
35277
  * Convert pasted content from PowerPoint
34861
35278
  * @param event The BeforePaste event
34862
35279
  */
34863
35280
  function processPastedContentFromPowerPoint(event, domCreator) {
34864
- var fragment = event.fragment, clipboardData = event.clipboardData;
35281
+ var fragment = event.fragment, clipboardData = event.clipboardData, domToModelOption = event.domToModelOption;
34865
35282
  if (clipboardData.html && !clipboardData.text && clipboardData.image) {
34866
35283
  // It is possible that PowerPoint copied both image and HTML but not plain text.
34867
35284
  // We always prefer HTML if any.
34868
35285
  var doc = domCreator.htmlToDOM(clipboardData.html);
34869
35286
  (0, roosterjs_content_model_dom_1.moveChildNodes)(fragment, doc === null || doc === void 0 ? void 0 : doc.body);
34870
35287
  }
35288
+ (0, addParser_1.addParser)(domToModelOption, 'block', removeNegativeTextIndentParser_1.removeNegativeTextIndentParser);
35289
+ (0, setProcessor_1.setProcessor)(domToModelOption, 'element', function (group, element, context) {
35290
+ var _a, _b;
35291
+ var style = element.getAttribute(CssStyleKey) || '';
35292
+ // If the element is the bullet element, just ignore it, otherwise we will see an extra bullet in the list
35293
+ if (style.includes(MsOfficeSpecialFormat) && context.listFormat.levels.length > 0) {
35294
+ return;
35295
+ }
35296
+ var bulletElement = element.querySelector(BulletSelector);
35297
+ if (bulletElement) {
35298
+ var _c = extractPowerPointListInfo(element, bulletElement), depth = _c.depth, unorderedBulletType = _c.unorderedBulletType, orderedBulletType = _c.orderedBulletType, startNumberOverrideOrBullet_1 = _c.startNumberOverrideOrBullet, isOrderedList = _c.isOrderedList, isNewList_1 = _c.isNewList;
35299
+ // Setup the listformat with the metadata extracted from the bullet element
35300
+ (0, customListUtils_1.setupListFormat)(isOrderedList ? 'OL' : 'UL', element, context, depth, context.listFormat, group, [clearListItemStyles]);
35301
+ // Set the metadata for the list item, which will be used to set the correct bullet style type
35302
+ var listMetadata = {
35303
+ unorderedStyleType: !isOrderedList && unorderedBulletType
35304
+ ? roosterjs_content_model_dom_1.BulletListType[unorderedBulletType]
35305
+ : undefined,
35306
+ orderedStyleType: isOrderedList && orderedBulletType
35307
+ ? roosterjs_content_model_dom_1.NumberingListType[orderedBulletType]
35308
+ : undefined,
35309
+ };
35310
+ // Process the Div element as a list item.
35311
+ (0, customListUtils_1.processAsListItem)(context, element, group, listMetadata, function (listItem) {
35312
+ var _a;
35313
+ var currentMarkerSize = listItem.formatHolder.format.fontSize;
35314
+ var bulletElementSize = (_a = bulletElement.parentElement) === null || _a === void 0 ? void 0 : _a.style.fontSize;
35315
+ listItem.formatHolder.format.fontSize = bulletElementSize || currentMarkerSize;
35316
+ if (isNewList_1) {
35317
+ listItem.levels[listItem.levels.length - 1].format.startNumberOverride = parseInt(startNumberOverrideOrBullet_1);
35318
+ }
35319
+ clearListItemStyles(listItem.levels[listItem.levels.length - 1].format);
35320
+ clearListItemStyles(listItem.format);
35321
+ });
35322
+ }
35323
+ else {
35324
+ (_b = (_a = context.defaultElementProcessors).element) === null || _b === void 0 ? void 0 : _b.call(_a, group, element, context);
35325
+ }
35326
+ });
34871
35327
  }
34872
35328
  exports.processPastedContentFromPowerPoint = processPastedContentFromPowerPoint;
35329
+ /**
35330
+ * Extract list information from PowerPoint pasted content
35331
+ *
35332
+ * The lists from PowerPoint are represent as:
35333
+ *
35334
+ * - The class 0# represents the depth of the list, if the list is in the first level, the class attribute wont be present.
35335
+ * - The mso-special-format style represents the type of bullet and the start of the list.
35336
+ * The first part of the mso-special-format is the type of bullet, and the second part is the start of the list.
35337
+ * - All the items that are in the same list have the same mso-special-format style. Which we are leveraging to identify when a list is new or part of the existing list thread.
35338
+ *
35339
+ * @example
35340
+ * ` <div class="O1" style="...">
35341
+ <span style="font-size: 5pt"
35342
+ ><span style="mso-special-format: 'numbullet6\,1'; font-family: +mj-lt"
35343
+ >i.</span
35344
+ ></span
35345
+ ><span style="...;">123</span>
35346
+ </div> `
35347
+ *
35348
+ * @param element The element to extract list information from
35349
+ * @param bulletElement The bullet element to extract list information from
35350
+ * @returns The extracted list information
35351
+ */
35352
+ function extractPowerPointListInfo(element, bulletElement) {
35353
+ var className = element.className.substring(1) || '0';
35354
+ var depth = parseInt(className) + 1;
35355
+ var style = bulletElement.getAttribute(CssStyleKey) || '';
35356
+ var msoSpecialFormat = style.match(MsoSpecialFormatRegex);
35357
+ var _a = (0, tslib_1.__read)((msoSpecialFormat === null || msoSpecialFormat === void 0 ? void 0 : msoSpecialFormat[1].replace('"', '').split('\\,')) || [], 2), bulletTypeHtml = _a[0], startNumberOverrideOrBullet = _a[1];
35358
+ var isOrderedList = OrderedListStyleMap.has(bulletTypeHtml);
35359
+ var unorderedBulletType = UnorderedBullets.get(bulletElement.innerText);
35360
+ var orderedBulletType = OrderedListStyleMap.get(bulletTypeHtml);
35361
+ return {
35362
+ depth: depth,
35363
+ unorderedBulletType: unorderedBulletType,
35364
+ orderedBulletType: orderedBulletType,
35365
+ startNumberOverrideOrBullet: startNumberOverrideOrBullet,
35366
+ isOrderedList: isOrderedList,
35367
+ isNewList: isOrderedList &&
35368
+ !!orderedBulletType &&
35369
+ bulletElement.innerText ===
35370
+ getPptListStart(orderedBulletType, startNumberOverrideOrBullet),
35371
+ };
35372
+ }
35373
+ var UnorderedBullets = new Map([
35374
+ ['•', 'Disc'],
35375
+ ['o', 'Circle'],
35376
+ ['§', 'Square'],
35377
+ ['q', 'BoxShadow'],
35378
+ ['v', 'Xrhombus'],
35379
+ ['Ø', 'ShortArrow'],
35380
+ ['ü', 'CheckMark'],
35381
+ ]);
35382
+ var OrderedListStyleMap = new Map([
35383
+ ['numbullet1', 'UpperAlpha'],
35384
+ ['numbullet2', 'DecimalParenthesis'],
35385
+ ['numbullet3', 'Decimal'],
35386
+ ['numbullet7', 'UpperRoman'],
35387
+ ['numbullet9', 'LowerAlphaParenthesis'],
35388
+ ['numbullet0', 'LowerAlpha'],
35389
+ ['numbullet6', 'LowerRoman'],
35390
+ ]);
35391
+ function getPptListStart(orderedBulletType, startNumberOverride) {
35392
+ var bullet = (0, roosterjs_content_model_dom_1.getOrderedListNumberStr)(roosterjs_content_model_dom_1.NumberingListType[orderedBulletType], parseInt(startNumberOverride));
35393
+ switch (orderedBulletType) {
35394
+ case 'Decimal':
35395
+ case 'UpperAlpha':
35396
+ case 'LowerAlpha':
35397
+ case 'UpperRoman':
35398
+ case 'LowerRoman':
35399
+ return bullet + '.';
35400
+ case 'DecimalParenthesis':
35401
+ case 'LowerAlphaParenthesis':
35402
+ return bullet + ')';
35403
+ default:
35404
+ return undefined;
35405
+ }
35406
+ }
34873
35407
 
34874
35408
 
34875
35409
  /***/ }),
@@ -35165,6 +35699,25 @@ exports.getStyleMetadata = void 0;
35165
35699
  var tslib_1 = __webpack_require__(/*! tslib */ "./node_modules/tslib/tslib.es6.mjs");
35166
35700
  var roosterjs_content_model_dom_1 = __webpack_require__(/*! roosterjs-content-model-dom */ "./packages/roosterjs-content-model-dom/lib/index.ts");
35167
35701
  var FORMATING_REGEX = /[\n\t'{}"]+/g;
35702
+ var STYLE_TAG = '<style>';
35703
+ var STYLE_TAG_END = '</style>';
35704
+ function extractStyleTagsFromHtml(htmlContent) {
35705
+ var styles = [];
35706
+ var lowerCaseHtmlContent = htmlContent.toLowerCase();
35707
+ var styleStartIndex = lowerCaseHtmlContent.indexOf(STYLE_TAG);
35708
+ while (styleStartIndex >= 0) {
35709
+ var styleEndIndex = lowerCaseHtmlContent.indexOf(STYLE_TAG_END, styleStartIndex);
35710
+ if (styleEndIndex >= 0) {
35711
+ var styleContent = htmlContent.substring(styleStartIndex + STYLE_TAG.length, styleEndIndex).trim();
35712
+ styles.push(styleContent);
35713
+ styleStartIndex = lowerCaseHtmlContent.indexOf(STYLE_TAG, styleEndIndex);
35714
+ }
35715
+ else {
35716
+ break;
35717
+ }
35718
+ }
35719
+ return styles;
35720
+ }
35168
35721
  /**
35169
35722
  * @internal
35170
35723
  * Word Desktop content has a style tag that contains data for the lists.
@@ -35185,12 +35738,10 @@ var FORMATING_REGEX = /[\n\t'{}"]+/g;
35185
35738
  * 5. Save data in record and only use the required information.
35186
35739
  *
35187
35740
  */
35188
- function getStyleMetadata(ev, domCreator) {
35741
+ function getStyleMetadata(ev) {
35189
35742
  var metadataMap = new Map();
35190
- var doc = domCreator.htmlToDOM(ev.htmlBefore);
35191
- var styles = doc.querySelectorAll('style');
35192
- styles.forEach(function (style) {
35193
- var text = (style === null || style === void 0 ? void 0 : style.innerHTML.trim()) || '';
35743
+ var headStyles = extractStyleTagsFromHtml(ev.htmlBefore);
35744
+ headStyles.forEach(function (text) {
35194
35745
  var index = 0;
35195
35746
  var _loop_1 = function () {
35196
35747
  var indexAt = text.indexOf('@', index + 1);
@@ -35257,7 +35808,7 @@ var getStyleMetadata_1 = __webpack_require__(/*! ./getStyleMetadata */ "./packag
35257
35808
  var getStyles_1 = __webpack_require__(/*! ../utils/getStyles */ "./packages/roosterjs-content-model-plugins/lib/paste/utils/getStyles.ts");
35258
35809
  var processWordComments_1 = __webpack_require__(/*! ./processWordComments */ "./packages/roosterjs-content-model-plugins/lib/paste/WordDesktop/processWordComments.ts");
35259
35810
  var processWordLists_1 = __webpack_require__(/*! ./processWordLists */ "./packages/roosterjs-content-model-plugins/lib/paste/WordDesktop/processWordLists.ts");
35260
- var removeNegativeTextIndentParser_1 = __webpack_require__(/*! ./removeNegativeTextIndentParser */ "./packages/roosterjs-content-model-plugins/lib/paste/WordDesktop/removeNegativeTextIndentParser.ts");
35811
+ var removeNegativeTextIndentParser_1 = __webpack_require__(/*! ../parsers/removeNegativeTextIndentParser */ "./packages/roosterjs-content-model-plugins/lib/paste/parsers/removeNegativeTextIndentParser.ts");
35261
35812
  var setProcessor_1 = __webpack_require__(/*! ../utils/setProcessor */ "./packages/roosterjs-content-model-plugins/lib/paste/utils/setProcessor.ts");
35262
35813
  var PERCENTAGE_REGEX = /%/;
35263
35814
  // Default line height in browsers according to https://developer.mozilla.org/en-US/docs/Web/CSS/line-height#normal
@@ -35267,8 +35818,8 @@ var DEFAULT_BROWSER_LINE_HEIGHT_PERCENTAGE = 1.2;
35267
35818
  * Handles Pasted content when source is Word Desktop
35268
35819
  * @param ev BeforePasteEvent
35269
35820
  */
35270
- function processPastedContentFromWordDesktop(ev, domCreator) {
35271
- var metadataMap = (0, getStyleMetadata_1.getStyleMetadata)(ev, domCreator);
35821
+ function processPastedContentFromWordDesktop(ev) {
35822
+ var metadataMap = (0, getStyleMetadata_1.getStyleMetadata)(ev);
35272
35823
  (0, setProcessor_1.setProcessor)(ev.domToModelOption, 'element', wordDesktopElementProcessor(metadataMap));
35273
35824
  (0, addParser_1.addParser)(ev.domToModelOption, 'block', adjustPercentileLineHeight);
35274
35825
  (0, addParser_1.addParser)(ev.domToModelOption, 'block', removeNegativeTextIndentParser_1.removeNegativeTextIndentParser);
@@ -35296,12 +35847,12 @@ function adjustPercentileLineHeight(format, element) {
35296
35847
  (parsedLineHeight / 100)).toString();
35297
35848
  }
35298
35849
  }
35299
- function listLevelParser(format, element, context, defaultStyle) {
35850
+ var listLevelParser = function (format, element, _context, defaultStyle) {
35300
35851
  if (element.style.marginLeft != '') {
35301
35852
  format.marginLeft = defaultStyle.marginLeft;
35302
35853
  }
35303
35854
  format.marginBottom = undefined;
35304
- }
35855
+ };
35305
35856
  var wordTableParser = function (format) {
35306
35857
  var _a;
35307
35858
  if ((_a = format.marginLeft) === null || _a === void 0 ? void 0 : _a.startsWith('-')) {
@@ -35355,8 +35906,8 @@ exports.processWordComments = processWordComments;
35355
35906
  Object.defineProperty(exports, "__esModule", ({ value: true }));
35356
35907
  exports.processWordList = void 0;
35357
35908
  var tslib_1 = __webpack_require__(/*! tslib */ "./node_modules/tslib/tslib.es6.mjs");
35358
- var removeNegativeTextIndentParser_1 = __webpack_require__(/*! ./removeNegativeTextIndentParser */ "./packages/roosterjs-content-model-plugins/lib/paste/WordDesktop/removeNegativeTextIndentParser.ts");
35359
35909
  var roosterjs_content_model_dom_1 = __webpack_require__(/*! roosterjs-content-model-dom */ "./packages/roosterjs-content-model-dom/lib/index.ts");
35910
+ var customListUtils_1 = __webpack_require__(/*! ../utils/customListUtils */ "./packages/roosterjs-content-model-plugins/lib/paste/utils/customListUtils.ts");
35360
35911
  /** Word list metadata style name */
35361
35912
  var MSO_LIST = 'mso-list';
35362
35913
  var MSO_LIST_IGNORE = 'ignore';
@@ -35395,28 +35946,28 @@ function processWordList(styles, group, element, context, metadata) {
35395
35946
  if (wordListStyle && group && typeof listFormat.wordLevel === 'number') {
35396
35947
  var wordLevel = listFormat.wordLevel, wordList = listFormat.wordList;
35397
35948
  // Retrieve the Fake bullet on the element and also the list type
35398
- var listMetadata = metadata.get(lNumber + ":" + level);
35399
- var listType = ((_a = listMetadata === null || listMetadata === void 0 ? void 0 : listMetadata['mso-level-number-format']) === null || _a === void 0 ? void 0 : _a.toLowerCase()) != BULLET_METADATA
35949
+ var listMetadata_1 = metadata.get(lNumber + ":" + level);
35950
+ var listType_1 = ((_a = listMetadata_1 === null || listMetadata_1 === void 0 ? void 0 : listMetadata_1['mso-level-number-format']) === null || _a === void 0 ? void 0 : _a.toLowerCase()) != BULLET_METADATA
35400
35951
  ? 'OL'
35401
35952
  : 'UL';
35402
35953
  // Create the new level of the list item and parse the format
35403
- var newLevel = (0, roosterjs_content_model_dom_1.createListLevel)(listType);
35404
- (0, roosterjs_content_model_dom_1.parseFormat)(element, (0, tslib_1.__spreadArray)((0, tslib_1.__spreadArray)([], (0, tslib_1.__read)(context.formatParsers.listLevel), false), [wordListPaddingParser], false), newLevel.format, context);
35405
- // If the list format is in a different level, update the array so we get the new item
35406
- // To be in the same level as the provided level metadata.
35407
- if (wordLevel > listFormat.levels.length) {
35408
- while (wordLevel != listFormat.levels.length) {
35409
- listFormat.levels.push(newLevel);
35410
- }
35411
- }
35412
- else {
35413
- listFormat.levels.splice(wordLevel, listFormat.levels.length - 1);
35414
- listFormat.levels[wordLevel - 1] = newLevel;
35415
- }
35954
+ (0, customListUtils_1.setupListFormat)(listType_1, element, context, wordLevel, listFormat, group, [
35955
+ wordListPaddingParser,
35956
+ ]);
35416
35957
  listFormat.levels[listFormat.levels.length - 1]
35417
35958
  .format.wordList = wordList;
35418
- listFormat.listParent = group;
35419
- processAsListItem(listFormat, context, element, group, listMetadata);
35959
+ var bullet = getBulletFromMetadata(listMetadata_1, listType_1);
35960
+ var listFormatMetadata = bullet
35961
+ ? {
35962
+ unorderedStyleType: listType_1 == 'UL' ? bullet : undefined,
35963
+ orderedStyleType: listType_1 == 'OL' ? bullet : undefined,
35964
+ }
35965
+ : undefined;
35966
+ (0, customListUtils_1.processAsListItem)(context, element, group, listFormatMetadata, function (listItem) {
35967
+ if (listType_1 == 'OL') {
35968
+ setStartNumber(listItem, context, listMetadata_1);
35969
+ }
35970
+ });
35420
35971
  if (listFormat.levels.length > 0 &&
35421
35972
  listFormat.wordKnownLevels.get(wordList) != listFormat.levels) {
35422
35973
  listFormat.wordKnownLevels.set(wordList, (0, tslib_1.__spreadArray)([], (0, tslib_1.__read)(listFormat.levels), false));
@@ -35426,28 +35977,6 @@ function processWordList(styles, group, element, context, metadata) {
35426
35977
  return false;
35427
35978
  }
35428
35979
  exports.processWordList = processWordList;
35429
- function processAsListItem(listFormat, context, element, group, listMetadata) {
35430
- var listLevel = listFormat.levels[listFormat.levels.length - 1];
35431
- var listType = listLevel.listType;
35432
- var bullet = getBulletFromMetadata(listMetadata, listType);
35433
- if (bullet) {
35434
- (0, roosterjs_content_model_dom_1.updateListMetadata)(listFormat.levels[listFormat.levels.length - 1], function (metadata) {
35435
- return Object.assign({}, metadata, {
35436
- unorderedStyleType: listType == 'UL' ? bullet : undefined,
35437
- orderedStyleType: listType == 'OL' ? bullet : undefined,
35438
- });
35439
- });
35440
- }
35441
- var listItem = (0, roosterjs_content_model_dom_1.createListItem)(listFormat.levels, context.segmentFormat);
35442
- (0, roosterjs_content_model_dom_1.parseFormat)(element, context.formatParsers.segmentOnBlock, context.segmentFormat, context);
35443
- (0, roosterjs_content_model_dom_1.parseFormat)(element, context.formatParsers.listItemElement, listItem.format, context);
35444
- (0, roosterjs_content_model_dom_1.parseFormat)(element, [removeNegativeTextIndentParser_1.removeNegativeTextIndentParser, nonListElementParser], listItem.format, context);
35445
- if (listType == 'OL') {
35446
- setStartNumber(listItem, context, listMetadata);
35447
- }
35448
- context.elementProcessors.child(listItem, element, context);
35449
- (0, roosterjs_content_model_dom_1.addBlock)(group, listItem);
35450
- }
35451
35980
  function getBulletFromMetadata(listMetadata, listType) {
35452
35981
  var templateType = (listMetadata === null || listMetadata === void 0 ? void 0 : listMetadata['mso-level-number-format']) || 'decimal';
35453
35982
  var templateFinal;
@@ -35494,14 +36023,6 @@ function getBulletFromMetadata(listMetadata, listType) {
35494
36023
  }
35495
36024
  return (0, roosterjs_content_model_dom_1.getListStyleTypeFromString)(listType, templateFinal);
35496
36025
  }
35497
- function wordListPaddingParser(format, element) {
35498
- if (element.style.marginLeft && element.style.marginLeft != '0in') {
35499
- format.paddingLeft = '0px';
35500
- }
35501
- if (element.style.marginRight && element.style.marginRight != '0in') {
35502
- format.paddingRight = '0px';
35503
- }
35504
- }
35505
36026
  function setStartNumber(listItem, context, listMetadata) {
35506
36027
  var _a, _b;
35507
36028
  var _c = context.listFormat, listParent = _c.listParent, wordList = _c.wordList, wordKnownLevels = _c.wordKnownLevels, wordLevel = _c.wordLevel, levels = _c.levels;
@@ -35529,43 +36050,14 @@ function getLastNotEmptyBlock(listParent) {
35529
36050
  }
35530
36051
  return undefined;
35531
36052
  }
35532
- var nonListElementParser = function (format, element, _context, defaultStyle) {
35533
- if (!(0, roosterjs_content_model_dom_1.isElementOfType)(element, 'li')) {
35534
- Object.keys(defaultStyle).forEach(function (keyInput) {
35535
- var key = keyInput;
35536
- var formatKey = keyInput;
35537
- if (key != 'display' &&
35538
- format[formatKey] != undefined &&
35539
- format[formatKey] == defaultStyle[key]) {
35540
- delete format[formatKey];
35541
- }
35542
- });
36053
+ function wordListPaddingParser(format, element) {
36054
+ if (element.style.marginLeft && element.style.marginLeft != '0in') {
36055
+ format.paddingLeft = '0px';
35543
36056
  }
35544
- };
35545
-
35546
-
35547
- /***/ }),
35548
-
35549
- /***/ "./packages/roosterjs-content-model-plugins/lib/paste/WordDesktop/removeNegativeTextIndentParser.ts":
35550
- /*!**********************************************************************************************************!*\
35551
- !*** ./packages/roosterjs-content-model-plugins/lib/paste/WordDesktop/removeNegativeTextIndentParser.ts ***!
35552
- \**********************************************************************************************************/
35553
- /***/ ((__unused_webpack_module, exports) => {
35554
-
35555
- "use strict";
35556
-
35557
- Object.defineProperty(exports, "__esModule", ({ value: true }));
35558
- exports.removeNegativeTextIndentParser = void 0;
35559
- /**
35560
- * @internal
35561
- */
35562
- var removeNegativeTextIndentParser = function (format, element) {
35563
- var _a;
35564
- if ((_a = format.textIndent) === null || _a === void 0 ? void 0 : _a.startsWith('-')) {
35565
- delete format.textIndent;
36057
+ if (element.style.marginRight && element.style.marginRight != '0in') {
36058
+ format.paddingRight = '0px';
35566
36059
  }
35567
- };
35568
- exports.removeNegativeTextIndentParser = removeNegativeTextIndentParser;
36060
+ }
35569
36061
 
35570
36062
 
35571
36063
  /***/ }),
@@ -35692,6 +36184,98 @@ function ensureOneNoteListContext(cmContext) {
35692
36184
  }
35693
36185
 
35694
36186
 
36187
+ /***/ }),
36188
+
36189
+ /***/ "./packages/roosterjs-content-model-plugins/lib/paste/parsers/deprecatedColorParser.ts":
36190
+ /*!*********************************************************************************************!*\
36191
+ !*** ./packages/roosterjs-content-model-plugins/lib/paste/parsers/deprecatedColorParser.ts ***!
36192
+ \*********************************************************************************************/
36193
+ /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
36194
+
36195
+ "use strict";
36196
+
36197
+ Object.defineProperty(exports, "__esModule", ({ value: true }));
36198
+ exports.deprecatedBorderColorParser = void 0;
36199
+ var roosterjs_content_model_dom_1 = __webpack_require__(/*! roosterjs-content-model-dom */ "./packages/roosterjs-content-model-dom/lib/index.ts");
36200
+ /**
36201
+ * @internal
36202
+ */
36203
+ var deprecatedBorderColorParser = function (format) {
36204
+ roosterjs_content_model_dom_1.BorderKeys.forEach(function (key) {
36205
+ var value = format[key];
36206
+ var color = '';
36207
+ if (value &&
36208
+ roosterjs_content_model_dom_1.DeprecatedColors.some(function (dColor) { return value.indexOf(dColor) > -1 && (color = dColor); })) {
36209
+ var newValue = value.replace(color, '').trimRight();
36210
+ format[key] = newValue;
36211
+ }
36212
+ });
36213
+ };
36214
+ exports.deprecatedBorderColorParser = deprecatedBorderColorParser;
36215
+
36216
+
36217
+ /***/ }),
36218
+
36219
+ /***/ "./packages/roosterjs-content-model-plugins/lib/paste/parsers/linkParser.ts":
36220
+ /*!**********************************************************************************!*\
36221
+ !*** ./packages/roosterjs-content-model-plugins/lib/paste/parsers/linkParser.ts ***!
36222
+ \**********************************************************************************/
36223
+ /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
36224
+
36225
+ "use strict";
36226
+
36227
+ Object.defineProperty(exports, "__esModule", ({ value: true }));
36228
+ exports.parseLink = void 0;
36229
+ var roosterjs_content_model_dom_1 = __webpack_require__(/*! roosterjs-content-model-dom */ "./packages/roosterjs-content-model-dom/lib/index.ts");
36230
+ var SUPPORTED_PROTOCOLS = ['http:', 'https:', 'notes:', 'mailto:', 'onenote:'];
36231
+ var INVALID_LINKS_REGEX = /^file:\/\/\/[a-zA-Z\/]/i;
36232
+ /**
36233
+ * @internal
36234
+ */
36235
+ var parseLink = function (format, element) {
36236
+ if (!(0, roosterjs_content_model_dom_1.isElementOfType)(element, 'a')) {
36237
+ return;
36238
+ }
36239
+ var url;
36240
+ try {
36241
+ url = new URL(element.href);
36242
+ }
36243
+ catch (_a) {
36244
+ url = undefined;
36245
+ }
36246
+ if ((url && SUPPORTED_PROTOCOLS.indexOf(url.protocol) === -1) ||
36247
+ INVALID_LINKS_REGEX.test(element.href)) {
36248
+ element.removeAttribute('href');
36249
+ format.href = '';
36250
+ }
36251
+ };
36252
+ exports.parseLink = parseLink;
36253
+
36254
+
36255
+ /***/ }),
36256
+
36257
+ /***/ "./packages/roosterjs-content-model-plugins/lib/paste/parsers/removeNegativeTextIndentParser.ts":
36258
+ /*!******************************************************************************************************!*\
36259
+ !*** ./packages/roosterjs-content-model-plugins/lib/paste/parsers/removeNegativeTextIndentParser.ts ***!
36260
+ \******************************************************************************************************/
36261
+ /***/ ((__unused_webpack_module, exports) => {
36262
+
36263
+ "use strict";
36264
+
36265
+ Object.defineProperty(exports, "__esModule", ({ value: true }));
36266
+ exports.removeNegativeTextIndentParser = void 0;
36267
+ /**
36268
+ * @internal
36269
+ */
36270
+ var removeNegativeTextIndentParser = function (format) {
36271
+ var _a;
36272
+ if ((_a = format.textIndent) === null || _a === void 0 ? void 0 : _a.startsWith('-')) {
36273
+ delete format.textIndent;
36274
+ }
36275
+ };
36276
+ exports.removeNegativeTextIndentParser = removeNegativeTextIndentParser;
36277
+
36278
+
35695
36279
  /***/ }),
35696
36280
 
35697
36281
  /***/ "./packages/roosterjs-content-model-plugins/lib/paste/pasteSourceValidations/constants.ts":
@@ -36108,32 +36692,75 @@ exports.chainSanitizerCallback = chainSanitizerCallback;
36108
36692
 
36109
36693
  /***/ }),
36110
36694
 
36111
- /***/ "./packages/roosterjs-content-model-plugins/lib/paste/utils/deprecatedColorParser.ts":
36112
- /*!*******************************************************************************************!*\
36113
- !*** ./packages/roosterjs-content-model-plugins/lib/paste/utils/deprecatedColorParser.ts ***!
36114
- \*******************************************************************************************/
36695
+ /***/ "./packages/roosterjs-content-model-plugins/lib/paste/utils/customListUtils.ts":
36696
+ /*!*************************************************************************************!*\
36697
+ !*** ./packages/roosterjs-content-model-plugins/lib/paste/utils/customListUtils.ts ***!
36698
+ \*************************************************************************************/
36115
36699
  /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
36116
36700
 
36117
36701
  "use strict";
36118
36702
 
36119
36703
  Object.defineProperty(exports, "__esModule", ({ value: true }));
36120
- exports.deprecatedBorderColorParser = void 0;
36704
+ exports.processAsListItem = exports.setupListFormat = void 0;
36705
+ var removeNegativeTextIndentParser_1 = __webpack_require__(/*! ../parsers/removeNegativeTextIndentParser */ "./packages/roosterjs-content-model-plugins/lib/paste/parsers/removeNegativeTextIndentParser.ts");
36121
36706
  var roosterjs_content_model_dom_1 = __webpack_require__(/*! roosterjs-content-model-dom */ "./packages/roosterjs-content-model-dom/lib/index.ts");
36707
+ var removeMargin = function (format) {
36708
+ delete format.marginLeft;
36709
+ };
36122
36710
  /**
36123
36711
  * @internal
36124
36712
  */
36125
- var deprecatedBorderColorParser = function (format) {
36126
- roosterjs_content_model_dom_1.BorderKeys.forEach(function (key) {
36127
- var value = format[key];
36128
- var color = '';
36129
- if (value &&
36130
- roosterjs_content_model_dom_1.DeprecatedColors.some(function (dColor) { return value.indexOf(dColor) > -1 && (color = dColor); })) {
36131
- var newValue = value.replace(color, '').trimRight();
36132
- format[key] = newValue;
36713
+ function setupListFormat(listType, element, context, listDepth, listFormat, group, additionalParsers) {
36714
+ if (additionalParsers === void 0) { additionalParsers = []; }
36715
+ var newLevel = (0, roosterjs_content_model_dom_1.createListLevel)(listType);
36716
+ (0, roosterjs_content_model_dom_1.parseFormat)(element, context.formatParsers.listLevel, newLevel.format, context);
36717
+ (0, roosterjs_content_model_dom_1.parseFormat)(element, additionalParsers.concat(removeMargin), newLevel.format, context);
36718
+ // If the list format is in a different level, update the array so we get the new item
36719
+ // To be in the same level as the provided level metadata.
36720
+ if (listDepth > listFormat.levels.length) {
36721
+ while (listDepth != listFormat.levels.length) {
36722
+ listFormat.levels.push(newLevel);
36133
36723
  }
36134
- });
36724
+ }
36725
+ else {
36726
+ listFormat.levels.splice(listDepth, listFormat.levels.length - 1);
36727
+ listFormat.levels[listDepth - 1] = newLevel;
36728
+ }
36729
+ listFormat.listParent = group;
36730
+ }
36731
+ exports.setupListFormat = setupListFormat;
36732
+ /**
36733
+ * @internal
36734
+ */
36735
+ function processAsListItem(context, element, group, listFormatMetadata, beforeProcessingChildren) {
36736
+ var listFormat = context.listFormat;
36737
+ if (listFormatMetadata) {
36738
+ (0, roosterjs_content_model_dom_1.updateListMetadata)(listFormat.levels[listFormat.levels.length - 1], function (metadata) {
36739
+ return Object.assign({}, metadata, listFormatMetadata);
36740
+ });
36741
+ }
36742
+ var listItem = (0, roosterjs_content_model_dom_1.createListItem)(listFormat.levels, context.segmentFormat);
36743
+ (0, roosterjs_content_model_dom_1.parseFormat)(element, context.formatParsers.segmentOnBlock, context.segmentFormat, context);
36744
+ (0, roosterjs_content_model_dom_1.parseFormat)(element, context.formatParsers.listItemElement, listItem.format, context);
36745
+ (0, roosterjs_content_model_dom_1.parseFormat)(element, [removeNegativeTextIndentParser_1.removeNegativeTextIndentParser, nonListElementParser], listItem.format, context);
36746
+ beforeProcessingChildren === null || beforeProcessingChildren === void 0 ? void 0 : beforeProcessingChildren(listItem);
36747
+ context.elementProcessors.child(listItem, element, context);
36748
+ (0, roosterjs_content_model_dom_1.addBlock)(group, listItem);
36749
+ }
36750
+ exports.processAsListItem = processAsListItem;
36751
+ var nonListElementParser = function (format, element, _context, defaultStyle) {
36752
+ if (!(0, roosterjs_content_model_dom_1.isElementOfType)(element, 'li')) {
36753
+ Object.keys(defaultStyle).forEach(function (keyInput) {
36754
+ var key = keyInput;
36755
+ var formatKey = keyInput;
36756
+ if (key != 'display' &&
36757
+ format[formatKey] != undefined &&
36758
+ format[formatKey] == defaultStyle[key]) {
36759
+ delete format[formatKey];
36760
+ }
36761
+ });
36762
+ }
36135
36763
  };
36136
- exports.deprecatedBorderColorParser = deprecatedBorderColorParser;
36137
36764
 
36138
36765
 
36139
36766
  /***/ }),
@@ -36169,44 +36796,6 @@ function getStyles(element) {
36169
36796
  exports.getStyles = getStyles;
36170
36797
 
36171
36798
 
36172
- /***/ }),
36173
-
36174
- /***/ "./packages/roosterjs-content-model-plugins/lib/paste/utils/linkParser.ts":
36175
- /*!********************************************************************************!*\
36176
- !*** ./packages/roosterjs-content-model-plugins/lib/paste/utils/linkParser.ts ***!
36177
- \********************************************************************************/
36178
- /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
36179
-
36180
- "use strict";
36181
-
36182
- Object.defineProperty(exports, "__esModule", ({ value: true }));
36183
- exports.parseLink = void 0;
36184
- var roosterjs_content_model_dom_1 = __webpack_require__(/*! roosterjs-content-model-dom */ "./packages/roosterjs-content-model-dom/lib/index.ts");
36185
- var SUPPORTED_PROTOCOLS = ['http:', 'https:', 'notes:', 'mailto:', 'onenote:'];
36186
- var INVALID_LINKS_REGEX = /^file:\/\/\/[a-zA-Z\/]/i;
36187
- /**
36188
- * @internal
36189
- */
36190
- var parseLink = function (format, element) {
36191
- if (!(0, roosterjs_content_model_dom_1.isElementOfType)(element, 'a')) {
36192
- return;
36193
- }
36194
- var url;
36195
- try {
36196
- url = new URL(element.href);
36197
- }
36198
- catch (_a) {
36199
- url = undefined;
36200
- }
36201
- if ((url && SUPPORTED_PROTOCOLS.indexOf(url.protocol) === -1) ||
36202
- INVALID_LINKS_REGEX.test(element.href)) {
36203
- element.removeAttribute('href');
36204
- format.href = '';
36205
- }
36206
- };
36207
- exports.parseLink = parseLink;
36208
-
36209
-
36210
36799
  /***/ }),
36211
36800
 
36212
36801
  /***/ "./packages/roosterjs-content-model-plugins/lib/paste/utils/setProcessor.ts":
@@ -38738,7 +39327,7 @@ var WatermarkPlugin = /** @class */ (function () {
38738
39327
  this.isShowing = true;
38739
39328
  };
38740
39329
  WatermarkPlugin.prototype.applyWatermarkStyle = function (editor) {
38741
- var rule = "position: absolute; pointer-events: none; content: \"" + this.watermark + "\";";
39330
+ var rule = "position: absolute; pointer-events: none; margin-inline-start: 1px; content: \"" + this.watermark + "\";";
38742
39331
  var format = (0, tslib_1.__assign)((0, tslib_1.__assign)({}, this.format), { textColor: editor.isDarkMode() ? this.darkTextColor : this.format.textColor });
38743
39332
  (0, roosterjs_content_model_dom_1.getObjectKeys)(styleMap).forEach(function (x) {
38744
39333
  if (format[x]) {