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