roosterjs 9.26.0 → 9.29.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.
@@ -2093,8 +2093,8 @@ exports["default"] = getDarkColor;
2093
2093
  "use strict";
2094
2094
 
2095
2095
  Object.defineProperty(exports, "__esModule", ({ value: true }));
2096
- exports.formatSegmentWithContentModel = exports.formatParagraphWithContentModel = exports.formatImageWithContentModel = exports.formatTableWithContentModel = exports.clearSelectedCells = exports.insertTableColumn = exports.insertTableRow = exports.insertEntity = exports.toggleCode = exports.setParagraphMargin = exports.adjustImageSelection = exports.setImageAltText = exports.adjustLinkSelection = exports.removeLink = exports.insertLink = exports.clearFormat = exports.getFormatState = exports.changeImage = exports.setImageBoxShadow = exports.setImageBorder = exports.setSpacing = exports.toggleBlockQuote = exports.setHeadingLevel = exports.setDirection = exports.setAlignment = exports.setIndentation = exports.setListStartNumber = exports.setListStyle = exports.insertImage = exports.splitTextSegment = exports.changeCapitalization = exports.applySegmentFormat = exports.changeFontSize = exports.setTextColor = exports.setFontSize = exports.setFontName = exports.setBackgroundColor = exports.toggleSuperscript = exports.toggleSubscript = exports.toggleStrikethrough = exports.toggleUnderline = exports.toggleItalic = exports.toggleBold = exports.toggleNumbering = exports.toggleBullet = exports.applyTableBorderFormat = exports.editTable = exports.setTableCellShade = exports.formatTable = exports.insertTable = void 0;
2097
- exports.queryContentModelBlocks = exports.getListAnnounceData = exports.promoteLink = exports.matchLink = exports.setModelIndentation = exports.findListItemsInSameThread = exports.setModelListStartNumber = exports.setModelListStyle = exports.setListType = exports.formatInsertPointWithContentModel = exports.formatTextSegmentBeforeSelectionMarker = void 0;
2096
+ exports.formatParagraphWithContentModel = exports.formatImageWithContentModel = exports.formatTableWithContentModel = exports.createEditorContextForEntity = exports.clearSelectedCells = exports.insertTableColumn = exports.insertTableRow = exports.insertEntity = exports.toggleCode = exports.setParagraphMargin = exports.adjustImageSelection = exports.setImageAltText = exports.adjustLinkSelection = exports.removeLink = exports.insertLink = exports.clearFormat = exports.getFormatState = exports.changeImage = exports.setImageBoxShadow = exports.setImageBorder = exports.setSpacing = exports.toggleBlockQuote = exports.setHeadingLevel = exports.setDirection = exports.setAlignment = exports.setIndentation = exports.setListStartNumber = exports.setListStyle = exports.insertImage = exports.splitTextSegment = exports.changeCapitalization = exports.applySegmentFormat = exports.changeFontSize = exports.setTextColor = exports.setFontSize = exports.setFontName = exports.setBackgroundColor = exports.toggleSuperscript = exports.toggleSubscript = exports.toggleStrikethrough = exports.toggleUnderline = exports.toggleItalic = exports.toggleBold = exports.toggleNumbering = exports.toggleBullet = exports.applyTableBorderFormat = exports.editTable = exports.setTableCellShade = exports.formatTable = exports.insertTable = void 0;
2097
+ exports.queryContentModelBlocks = exports.getListAnnounceData = exports.promoteLink = exports.matchLink = exports.setModelIndentation = exports.findListItemsInSameThread = exports.setModelListStartNumber = exports.setModelListStyle = exports.setListType = exports.formatInsertPointWithContentModel = exports.formatTextSegmentBeforeSelectionMarker = exports.formatSegmentWithContentModel = void 0;
2098
2098
  var insertTable_1 = __webpack_require__(/*! ./publicApi/table/insertTable */ "./packages/roosterjs-content-model-api/lib/publicApi/table/insertTable.ts");
2099
2099
  Object.defineProperty(exports, "insertTable", ({ enumerable: true, get: function () { return insertTable_1.insertTable; } }));
2100
2100
  var formatTable_1 = __webpack_require__(/*! ./publicApi/table/formatTable */ "./packages/roosterjs-content-model-api/lib/publicApi/table/formatTable.ts");
@@ -2187,6 +2187,8 @@ var insertTableColumn_1 = __webpack_require__(/*! ./modelApi/table/insertTableCo
2187
2187
  Object.defineProperty(exports, "insertTableColumn", ({ enumerable: true, get: function () { return insertTableColumn_1.insertTableColumn; } }));
2188
2188
  var clearSelectedCells_1 = __webpack_require__(/*! ./modelApi/table/clearSelectedCells */ "./packages/roosterjs-content-model-api/lib/modelApi/table/clearSelectedCells.ts");
2189
2189
  Object.defineProperty(exports, "clearSelectedCells", ({ enumerable: true, get: function () { return clearSelectedCells_1.clearSelectedCells; } }));
2190
+ var createEditorContextForEntity_1 = __webpack_require__(/*! ./publicApi/utils/createEditorContextForEntity */ "./packages/roosterjs-content-model-api/lib/publicApi/utils/createEditorContextForEntity.ts");
2191
+ Object.defineProperty(exports, "createEditorContextForEntity", ({ enumerable: true, get: function () { return createEditorContextForEntity_1.createEditorContextForEntity; } }));
2190
2192
  var formatTableWithContentModel_1 = __webpack_require__(/*! ./publicApi/utils/formatTableWithContentModel */ "./packages/roosterjs-content-model-api/lib/publicApi/utils/formatTableWithContentModel.ts");
2191
2193
  Object.defineProperty(exports, "formatTableWithContentModel", ({ enumerable: true, get: function () { return formatTableWithContentModel_1.formatTableWithContentModel; } }));
2192
2194
  var formatImageWithContentModel_1 = __webpack_require__(/*! ./publicApi/utils/formatImageWithContentModel */ "./packages/roosterjs-content-model-api/lib/publicApi/utils/formatImageWithContentModel.ts");
@@ -2852,14 +2854,16 @@ function isWholeBlockSelected(block) {
2852
2854
  Object.defineProperty(exports, "__esModule", ({ value: true }));
2853
2855
  exports.queryContentModelBlocks = void 0;
2854
2856
  var tslib_1 = __webpack_require__(/*! tslib */ "./node_modules/tslib/tslib.es6.mjs");
2857
+ var roosterjs_content_model_dom_1 = __webpack_require__(/*! roosterjs-content-model-dom */ "./packages/roosterjs-content-model-dom/lib/index.ts");
2855
2858
  /**
2856
2859
  * Query content model blocks
2857
2860
  * @param group The block group to query
2858
2861
  * @param type The type of block to query
2859
2862
  * @param filter Optional selector to filter the blocks
2860
2863
  * @param findFirstOnly True to return the first block only, false to return all blocks
2864
+ * @param shouldExpandEntity Optional function to determine if an entity's children should be recursively queried, should return a EditorContext if the entity should be expanded, or null if not
2861
2865
  */
2862
- function queryContentModelBlocks(group, type, filter, findFirstOnly) {
2866
+ function queryContentModelBlocks(group, type, filter, findFirstOnly, shouldExpandEntity) {
2863
2867
  var e_1, _a, e_2, _b;
2864
2868
  var elements = [];
2865
2869
  for (var i = 0; i < group.blocks.length; i++) {
@@ -2874,12 +2878,21 @@ function queryContentModelBlocks(group, type, filter, findFirstOnly) {
2874
2878
  if (isExpectedBlockType(block, type, filter)) {
2875
2879
  elements.push(block);
2876
2880
  }
2881
+ if (block.blockType == 'Entity' && shouldExpandEntity) {
2882
+ var editorContext = shouldExpandEntity(block);
2883
+ if (editorContext) {
2884
+ var context = (0, roosterjs_content_model_dom_1.createDomToModelContext)(editorContext);
2885
+ var model = (0, roosterjs_content_model_dom_1.domToContentModel)(block.wrapper, context);
2886
+ var results_1 = queryContentModelBlocks(model, type, filter, findFirstOnly, shouldExpandEntity);
2887
+ elements.push.apply(elements, (0, tslib_1.__spreadArray)([], (0, tslib_1.__read)(results_1), false));
2888
+ }
2889
+ }
2877
2890
  break;
2878
2891
  case 'BlockGroup':
2879
2892
  if (isExpectedBlockType(block, type, filter)) {
2880
2893
  elements.push(block);
2881
2894
  }
2882
- var results = queryContentModelBlocks(block, type, filter, findFirstOnly);
2895
+ var results = queryContentModelBlocks(block, type, filter, findFirstOnly, shouldExpandEntity);
2883
2896
  elements.push.apply(elements, (0, tslib_1.__spreadArray)([], (0, tslib_1.__read)(results), false));
2884
2897
  break;
2885
2898
  case 'Table':
@@ -2892,8 +2905,8 @@ function queryContentModelBlocks(group, type, filter, findFirstOnly) {
2892
2905
  try {
2893
2906
  for (var _e = (e_2 = void 0, (0, tslib_1.__values)(row.cells)), _f = _e.next(); !_f.done; _f = _e.next()) {
2894
2907
  var cell = _f.value;
2895
- var results_1 = queryContentModelBlocks(cell, type, filter, findFirstOnly);
2896
- elements.push.apply(elements, (0, tslib_1.__spreadArray)([], (0, tslib_1.__read)(results_1), false));
2908
+ var results_2 = queryContentModelBlocks(cell, type, filter, findFirstOnly, shouldExpandEntity);
2909
+ elements.push.apply(elements, (0, tslib_1.__spreadArray)([], (0, tslib_1.__read)(results_2), false));
2897
2910
  }
2898
2911
  }
2899
2912
  catch (e_2_1) { e_2 = { error: e_2_1 }; }
@@ -3681,17 +3694,9 @@ function setListType(model, listType, removeMargins) {
3681
3694
  (0, roosterjs_content_model_dom_1.setParagraphNotImplicit)(block.blocks[0]);
3682
3695
  }
3683
3696
  if (alreadyInExpectedType) {
3684
- //if the list item has margins or textAlign, we need to apply them to the block to preserve the indention and alignment
3697
+ // if the list item has margins or textAlign, we need to apply them to the block to preserve the indention and alignment
3685
3698
  block.blocks.forEach(function (x) {
3686
- if (block.format.marginLeft) {
3687
- x.format.marginLeft = block.format.marginLeft;
3688
- }
3689
- if (block.format.marginRight) {
3690
- x.format.marginRight = block.format.marginRight;
3691
- }
3692
- if (block.format.textAlign) {
3693
- x.format.textAlign = block.format.textAlign;
3694
- }
3699
+ (0, roosterjs_content_model_dom_1.copyFormat)(x.format, block.format, roosterjs_content_model_dom_1.ListFormats);
3695
3700
  });
3696
3701
  }
3697
3702
  }
@@ -3726,17 +3731,8 @@ function setListType(model, listType, removeMargins) {
3726
3731
  }
3727
3732
  var mutableBlock = (0, roosterjs_content_model_dom_1.mutateBlock)(block);
3728
3733
  newListItem.blocks.push(mutableBlock);
3729
- if (mutableBlock.format.marginRight) {
3730
- newListItem.format.marginRight = mutableBlock.format.marginRight;
3731
- mutableBlock.format.marginRight = undefined;
3732
- }
3733
- if (mutableBlock.format.marginLeft) {
3734
- newListItem.format.marginLeft = mutableBlock.format.marginLeft;
3735
- mutableBlock.format.marginLeft = undefined;
3736
- }
3737
- if (mutableBlock.format.textAlign) {
3738
- newListItem.format.textAlign = mutableBlock.format.textAlign;
3739
- }
3734
+ (0, roosterjs_content_model_dom_1.copyFormat)(newListItem.format, mutableBlock.format, roosterjs_content_model_dom_1.ListFormatsToMove, true /*deleteOriginalFormat*/);
3735
+ (0, roosterjs_content_model_dom_1.copyFormat)(newListItem.format, mutableBlock.format, roosterjs_content_model_dom_1.ListFormatsToKeep);
3740
3736
  (0, roosterjs_content_model_dom_1.mutateBlock)(parent).blocks.splice(index, 1, newListItem);
3741
3737
  existingListItems.push(newListItem);
3742
3738
  var levelIndex = newListItem.levels.length - 1;
@@ -5614,8 +5610,9 @@ function insertLink(editor, link, anchorTitle, displayText, target) {
5614
5610
  .map(function (x) { return (x.segmentType == 'Text' ? x.text : ''); })
5615
5611
  .join('');
5616
5612
  var text = displayText || originalText || '';
5617
- if (segments.some(function (x) { return x.segmentType != 'SelectionMarker'; }) &&
5618
- originalText == text) {
5613
+ if ((segments.some(function (x) { return x.segmentType != 'SelectionMarker'; }) &&
5614
+ originalText == text) ||
5615
+ (segments.length == 1 && segments[0].segmentType == 'Image')) {
5619
5616
  segments.forEach(function (x) {
5620
5617
  var link = createLink(linkUrl_1, anchorTitle, target, x.segmentType == 'Text');
5621
5618
  (0, roosterjs_content_model_dom_1.addLink)(x, link);
@@ -6994,6 +6991,46 @@ function setTableCellShade(editor, color) {
6994
6991
  exports.setTableCellShade = setTableCellShade;
6995
6992
 
6996
6993
 
6994
+ /***/ }),
6995
+
6996
+ /***/ "./packages/roosterjs-content-model-api/lib/publicApi/utils/createEditorContextForEntity.ts":
6997
+ /*!**************************************************************************************************!*\
6998
+ !*** ./packages/roosterjs-content-model-api/lib/publicApi/utils/createEditorContextForEntity.ts ***!
6999
+ \**************************************************************************************************/
7000
+ /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
7001
+
7002
+ "use strict";
7003
+
7004
+ Object.defineProperty(exports, "__esModule", ({ value: true }));
7005
+ exports.createEditorContextForEntity = void 0;
7006
+ var tslib_1 = __webpack_require__(/*! tslib */ "./node_modules/tslib/tslib.es6.mjs");
7007
+ /**
7008
+ * Create an EditorContext for an entity
7009
+ * @param editor The editor object
7010
+ * @param entity The entity to create the context for
7011
+ * @returns The generated EditorContext for the entity
7012
+ */
7013
+ function createEditorContextForEntity(editor, entity) {
7014
+ var _a;
7015
+ var domHelper = editor.getDOMHelper();
7016
+ var context = {
7017
+ isDarkMode: editor.isDarkMode(),
7018
+ defaultFormat: (0, tslib_1.__assign)({}, entity.format),
7019
+ darkColorHandler: editor.getColorManager(),
7020
+ addDelimiterForEntity: false,
7021
+ allowCacheElement: false,
7022
+ domIndexer: undefined,
7023
+ zoomScale: domHelper.calculateZoomScale(),
7024
+ experimentalFeatures: [],
7025
+ };
7026
+ if (((_a = editor.getDocument().defaultView) === null || _a === void 0 ? void 0 : _a.getComputedStyle(entity.wrapper).direction) == 'rtl') {
7027
+ context.isRootRtl = true;
7028
+ }
7029
+ return context;
7030
+ }
7031
+ exports.createEditorContextForEntity = createEditorContextForEntity;
7032
+
7033
+
6997
7034
  /***/ }),
6998
7035
 
6999
7036
  /***/ "./packages/roosterjs-content-model-api/lib/publicApi/utils/formatImageWithContentModel.ts":
@@ -7211,8 +7248,9 @@ exports.formatParagraphWithContentModel = formatParagraphWithContentModel;
7211
7248
  Object.defineProperty(exports, "__esModule", ({ value: true }));
7212
7249
  exports.formatSegmentWithContentModel = void 0;
7213
7250
  var tslib_1 = __webpack_require__(/*! tslib */ "./node_modules/tslib/tslib.es6.mjs");
7214
- var adjustWordSelection_1 = __webpack_require__(/*! ../../modelApi/selection/adjustWordSelection */ "./packages/roosterjs-content-model-api/lib/modelApi/selection/adjustWordSelection.ts");
7215
7251
  var roosterjs_content_model_dom_1 = __webpack_require__(/*! roosterjs-content-model-dom */ "./packages/roosterjs-content-model-dom/lib/index.ts");
7252
+ var adjustWordSelection_1 = __webpack_require__(/*! ../../modelApi/selection/adjustWordSelection */ "./packages/roosterjs-content-model-api/lib/modelApi/selection/adjustWordSelection.ts");
7253
+ var createEditorContextForEntity_1 = __webpack_require__(/*! ./createEditorContextForEntity */ "./packages/roosterjs-content-model-api/lib/publicApi/utils/createEditorContextForEntity.ts");
7216
7254
  /**
7217
7255
  * Invoke a callback to format the selected segment using Content Model
7218
7256
  * @param editor The editor object
@@ -7286,24 +7324,6 @@ function formatSegmentWithContentModel(editor, apiName, toggleStyleCallback, seg
7286
7324
  });
7287
7325
  }
7288
7326
  exports.formatSegmentWithContentModel = formatSegmentWithContentModel;
7289
- function createEditorContextForEntity(editor, entity) {
7290
- var _a;
7291
- var domHelper = editor.getDOMHelper();
7292
- var context = {
7293
- isDarkMode: editor.isDarkMode(),
7294
- defaultFormat: (0, tslib_1.__assign)({}, entity.format),
7295
- darkColorHandler: editor.getColorManager(),
7296
- addDelimiterForEntity: false,
7297
- allowCacheElement: false,
7298
- domIndexer: undefined,
7299
- zoomScale: domHelper.calculateZoomScale(),
7300
- experimentalFeatures: [],
7301
- };
7302
- if (((_a = editor.getDocument().defaultView) === null || _a === void 0 ? void 0 : _a.getComputedStyle(entity.wrapper).direction) == 'rtl') {
7303
- context.isRootRtl = true;
7304
- }
7305
- return context;
7306
- }
7307
7327
  function expandEntitySelections(editor, entity, formatsAndSegments, modelsFromEntities) {
7308
7328
  var _a = entity.entityFormat, id = _a.id, type = _a.entityType, isReadonly = _a.isReadonly;
7309
7329
  if (id && type) {
@@ -7316,7 +7336,7 @@ function expandEntitySelections(editor, entity, formatsAndSegments, modelsFromEn
7316
7336
  editor.triggerEvent('entityOperation', entityOperationEventData);
7317
7337
  formattableRoots.forEach(function (root) {
7318
7338
  if (entity.wrapper.contains(root.element)) {
7319
- var editorContext = createEditorContextForEntity(editor, entity);
7339
+ var editorContext = (0, createEditorContextForEntity_1.createEditorContextForEntity)(editor, entity);
7320
7340
  var context = (0, roosterjs_content_model_dom_1.createDomToModelContext)(editorContext, root.domToModelOptions);
7321
7341
  // Treat everything as selected since the parent entity is selected
7322
7342
  context.isInSelection = true;
@@ -7333,7 +7353,7 @@ function expandEntitySelections(editor, entity, formatsAndSegments, modelsFromEn
7333
7353
  function writeBackEntities(editor, modelsFromEntities) {
7334
7354
  modelsFromEntities.forEach(function (_a) {
7335
7355
  var _b = (0, tslib_1.__read)(_a, 3), entity = _b[0], root = _b[1], model = _b[2];
7336
- var editorContext = createEditorContextForEntity(editor, entity);
7356
+ var editorContext = (0, createEditorContextForEntity_1.createEditorContextForEntity)(editor, entity);
7337
7357
  var modelToDomContext = (0, roosterjs_content_model_dom_1.createModelToDomContext)(editorContext, root.modelToDomOptions);
7338
7358
  (0, roosterjs_content_model_dom_1.contentModelToDom)(editor.getDocument(), root.element, model, modelToDomContext);
7339
7359
  });
@@ -8019,6 +8039,64 @@ function exportContent(editor, mode, optionsOrCallbacks) {
8019
8039
  exports.exportContent = exportContent;
8020
8040
 
8021
8041
 
8042
+ /***/ }),
8043
+
8044
+ /***/ "./packages/roosterjs-content-model-core/lib/command/paste/cleanHtmlComments.ts":
8045
+ /*!**************************************************************************************!*\
8046
+ !*** ./packages/roosterjs-content-model-core/lib/command/paste/cleanHtmlComments.ts ***!
8047
+ \**************************************************************************************/
8048
+ /***/ ((__unused_webpack_module, exports) => {
8049
+
8050
+ "use strict";
8051
+
8052
+ Object.defineProperty(exports, "__esModule", ({ value: true }));
8053
+ exports.cleanHtmlComments = void 0;
8054
+ var HtmlCommentStart = '\x3C!--';
8055
+ var HtmlCommentStart2 = '<!--';
8056
+ var HtmlCommentEnd = '-->';
8057
+ var styleTag = '<style';
8058
+ var styleClosingTag = '</style>';
8059
+ var nonWordCharacterRegex = /\W/;
8060
+ /**
8061
+ * @internal
8062
+ * Exported only for unit test
8063
+ */
8064
+ function cleanHtmlComments(html) {
8065
+ var _a;
8066
+ var _b = extractHtmlIndexes(html), styleIndex = _b.styleIndex, styleEndIndex = _b.styleEndIndex;
8067
+ while (styleIndex > -1) {
8068
+ html = removeCommentsFromHtml(html, HtmlCommentStart, styleEndIndex, styleIndex);
8069
+ html = removeCommentsFromHtml(html, HtmlCommentStart2, styleEndIndex, styleIndex);
8070
+ html = removeCommentsFromHtml(html, HtmlCommentEnd, styleEndIndex, styleIndex);
8071
+ (_a = extractHtmlIndexes(html, styleEndIndex + 1), styleIndex = _a.styleIndex, styleEndIndex = _a.styleEndIndex);
8072
+ }
8073
+ return html;
8074
+ }
8075
+ exports.cleanHtmlComments = cleanHtmlComments;
8076
+ function extractHtmlIndexes(html, startIndex) {
8077
+ if (startIndex === void 0) { startIndex = 0; }
8078
+ var htmlLowercase = html.toLowerCase();
8079
+ var styleIndex = htmlLowercase.indexOf(styleTag, startIndex);
8080
+ var currentIndex = styleIndex + styleTag.length;
8081
+ var nextChar = html.substring(currentIndex, currentIndex + 1);
8082
+ while (!nonWordCharacterRegex.test(nextChar) && styleIndex > -1) {
8083
+ styleIndex = htmlLowercase.indexOf(styleTag, styleIndex + 1);
8084
+ currentIndex = styleIndex + styleTag.length;
8085
+ nextChar = html.substring(currentIndex, currentIndex + 1);
8086
+ }
8087
+ var styleEndIndex = htmlLowercase.indexOf(styleClosingTag, startIndex);
8088
+ return { styleIndex: styleIndex, styleEndIndex: styleEndIndex };
8089
+ }
8090
+ function removeCommentsFromHtml(html, marker, endId, startId) {
8091
+ var id = html.indexOf(marker, startId);
8092
+ while (id > -1 && id < endId) {
8093
+ html = html.substring(0, id) + html.substring(id + marker.length);
8094
+ id = html.indexOf(marker, id + 1);
8095
+ }
8096
+ return html;
8097
+ }
8098
+
8099
+
8022
8100
  /***/ }),
8023
8101
 
8024
8102
  /***/ "./packages/roosterjs-content-model-core/lib/command/paste/createPasteFragment.ts":
@@ -8258,6 +8336,7 @@ function getLastSegmentFormat(pasteModel) {
8258
8336
 
8259
8337
  Object.defineProperty(exports, "__esModule", ({ value: true }));
8260
8338
  exports.paste = void 0;
8339
+ var cleanHtmlComments_1 = __webpack_require__(/*! ./cleanHtmlComments */ "./packages/roosterjs-content-model-core/lib/command/paste/cleanHtmlComments.ts");
8261
8340
  var mergePasteContent_1 = __webpack_require__(/*! ./mergePasteContent */ "./packages/roosterjs-content-model-core/lib/command/paste/mergePasteContent.ts");
8262
8341
  var convertInlineCss_1 = __webpack_require__(/*! ../createModelFromHtml/convertInlineCss */ "./packages/roosterjs-content-model-core/lib/command/createModelFromHtml/convertInlineCss.ts");
8263
8342
  var createPasteFragment_1 = __webpack_require__(/*! ./createPasteFragment */ "./packages/roosterjs-content-model-core/lib/command/paste/createPasteFragment.ts");
@@ -8282,7 +8361,11 @@ function paste(editor, clipboardData, pasteTypeOrGetter) {
8282
8361
  });
8283
8362
  }
8284
8363
  // 1. Prepare variables
8285
- var doc = createDOMFromHtml(clipboardData.rawHtml, editor.getDOMCreator());
8364
+ var domCreator = editor.getDOMCreator();
8365
+ if (!domCreator.isBypassed && clipboardData.rawHtml) {
8366
+ clipboardData.rawHtml = (0, cleanHtmlComments_1.cleanHtmlComments)(clipboardData.rawHtml);
8367
+ }
8368
+ var doc = createDOMFromHtml(clipboardData.rawHtml, domCreator);
8286
8369
  var pasteType = typeof pasteTypeOrGetter == 'function'
8287
8370
  ? pasteTypeOrGetter(doc, clipboardData)
8288
8371
  : pasteTypeOrGetter;
@@ -8291,7 +8374,7 @@ function paste(editor, clipboardData, pasteTypeOrGetter) {
8291
8374
  // 3. Create target fragment
8292
8375
  var sourceFragment = (0, createPasteFragment_1.createPasteFragment)(editor.getDocument(), clipboardData, pasteType, (_a = (clipboardData.rawHtml == clipboardData.html
8293
8376
  ? doc
8294
- : createDOMFromHtml(clipboardData.html, editor.getDOMCreator()))) === null || _a === void 0 ? void 0 : _a.body);
8377
+ : createDOMFromHtml(clipboardData.html, domCreator))) === null || _a === void 0 ? void 0 : _a.body);
8295
8378
  // 4. Trigger BeforePaste event to allow plugins modify the fragment
8296
8379
  var eventResult = (0, generatePasteOptionFromPlugins_1.generatePasteOptionFromPlugins)(editor, clipboardData, sourceFragment, htmlFromClipboard, pasteType);
8297
8380
  // 5. Convert global CSS to inline CSS
@@ -9404,7 +9487,7 @@ var roosterjs_content_model_dom_1 = __webpack_require__(/*! roosterjs-content-mo
9404
9487
  * @internal
9405
9488
  */
9406
9489
  function restoreSnapshotHTML(core, snapshot) {
9407
- var _a;
9490
+ var _a, _b;
9408
9491
  var physicalRoot = core.physicalRoot, entityMap = core.entity.entityMap;
9409
9492
  var refNode = physicalRoot.firstChild;
9410
9493
  var body = core.domCreator.htmlToDOM(snapshot.html).body;
@@ -9412,6 +9495,14 @@ function restoreSnapshotHTML(core, snapshot) {
9412
9495
  var next = currentNode.nextSibling;
9413
9496
  var originalEntityElement = tryGetEntityElement(entityMap, currentNode);
9414
9497
  if (originalEntityElement) {
9498
+ // After restoring the snapshot, we need to clear the delimiter indexes since cached model will be cleared
9499
+ if ((0, roosterjs_content_model_dom_1.isBlockEntityContainer)(originalEntityElement)) {
9500
+ for (var node = originalEntityElement.firstChild; node; node = node.nextSibling) {
9501
+ if ((0, roosterjs_content_model_dom_1.isNodeOfType)(node, 'ELEMENT_NODE') && (0, roosterjs_content_model_dom_1.isEntityDelimiter)(node)) {
9502
+ (_a = core.cache.domIndexer) === null || _a === void 0 ? void 0 : _a.clearIndex(node);
9503
+ }
9504
+ }
9505
+ }
9415
9506
  refNode = (0, roosterjs_content_model_dom_1.reuseCachedElement)(physicalRoot, originalEntityElement, refNode);
9416
9507
  }
9417
9508
  else {
@@ -9439,7 +9530,7 @@ function restoreSnapshotHTML(core, snapshot) {
9439
9530
  }
9440
9531
  while (refNode) {
9441
9532
  var next = refNode.nextSibling;
9442
- (_a = refNode.parentNode) === null || _a === void 0 ? void 0 : _a.removeChild(refNode);
9533
+ (_b = refNode.parentNode) === null || _b === void 0 ? void 0 : _b.removeChild(refNode);
9443
9534
  refNode = next;
9444
9535
  }
9445
9536
  }
@@ -10739,14 +10830,20 @@ var DomIndexerImpl = /** @class */ (function () {
10739
10830
  unindex(targetText);
10740
10831
  }
10741
10832
  };
10833
+ DomIndexerImpl.prototype.clearIndex = function (container) {
10834
+ internalClearIndex(container);
10835
+ };
10742
10836
  DomIndexerImpl.prototype.reconcileSelection = function (model, newSelection, oldSelection) {
10743
10837
  var _a, _b;
10744
10838
  if (oldSelection) {
10839
+ var startNode = void 0;
10745
10840
  if (oldSelection.type == 'range' &&
10746
10841
  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);
10842
+ (startNode = oldSelection.start.node) &&
10843
+ (0, roosterjs_content_model_dom_1.isNodeOfType)(startNode, 'TEXT_NODE') &&
10844
+ isIndexedSegment(startNode) &&
10845
+ startNode.__roosterjsContentModel.segments.length > 0) {
10846
+ this.reconcileTextSelection(startNode);
10750
10847
  }
10751
10848
  else {
10752
10849
  (0, roosterjs_content_model_dom_1.setSelection)(model);
@@ -11099,6 +11196,12 @@ function getFirstLeaf(node) {
11099
11196
  }
11100
11197
  return node;
11101
11198
  }
11199
+ function internalClearIndex(container) {
11200
+ unindex(container);
11201
+ for (var node = container.firstChild; node; node = node.nextSibling) {
11202
+ internalClearIndex(node);
11203
+ }
11204
+ }
11102
11205
 
11103
11206
 
11104
11207
  /***/ }),
@@ -11408,6 +11511,7 @@ var adjustImageSelectionOnSafari_1 = __webpack_require__(/*! ./utils/adjustImage
11408
11511
  var deleteEmptyList_1 = __webpack_require__(/*! ./utils/deleteEmptyList */ "./packages/roosterjs-content-model-core/lib/corePlugin/copyPaste/utils/deleteEmptyList.ts");
11409
11512
  var pasteCopyBlockEntityParser_1 = __webpack_require__(/*! ../../override/pasteCopyBlockEntityParser */ "./packages/roosterjs-content-model-core/lib/override/pasteCopyBlockEntityParser.ts");
11410
11513
  var paste_1 = __webpack_require__(/*! ../../command/paste/paste */ "./packages/roosterjs-content-model-core/lib/command/paste/paste.ts");
11514
+ var pruneUnselectedModel_1 = __webpack_require__(/*! ./utils/pruneUnselectedModel */ "./packages/roosterjs-content-model-core/lib/corePlugin/copyPaste/utils/pruneUnselectedModel.ts");
11411
11515
  var roosterjs_content_model_dom_1 = __webpack_require__(/*! roosterjs-content-model-dom */ "./packages/roosterjs-content-model-dom/lib/index.ts");
11412
11516
  var TEMP_DIV_ID = 'roosterJS_copyCutTempDiv';
11413
11517
  /**
@@ -11422,6 +11526,7 @@ var CopyPastePlugin = /** @class */ (function () {
11422
11526
  var _this = this;
11423
11527
  this.editor = null;
11424
11528
  this.disposer = null;
11529
+ this.customCopyCutEnabled = false;
11425
11530
  this.onPaste = function (event) {
11426
11531
  if (_this.editor && isClipboardEvent(event)) {
11427
11532
  var editor_1 = _this.editor;
@@ -11466,6 +11571,7 @@ var CopyPastePlugin = /** @class */ (function () {
11466
11571
  beforeDispatch: function (e) { return _this.onCutCopy(e, true /*isCut*/); },
11467
11572
  },
11468
11573
  });
11574
+ this.customCopyCutEnabled = editor.isExperimentalFeatureEnabled('CustomCopyCut');
11469
11575
  };
11470
11576
  /**
11471
11577
  * Dispose this plugin
@@ -11490,7 +11596,7 @@ var CopyPastePlugin = /** @class */ (function () {
11490
11596
  };
11491
11597
  CopyPastePlugin.prototype.onCutCopy = function (event, isCut) {
11492
11598
  var _this = this;
11493
- var _a;
11599
+ var _a, _b, _c;
11494
11600
  if (!this.editor) {
11495
11601
  return;
11496
11602
  }
@@ -11499,6 +11605,7 @@ var CopyPastePlugin = /** @class */ (function () {
11499
11605
  (0, adjustImageSelectionOnSafari_1.adjustImageSelectionOnSafari)(this.editor, selection);
11500
11606
  if (selection && (selection.type != 'range' || !selection.range.collapsed)) {
11501
11607
  var pasteModel = this.editor.getContentModelCopy('disconnected');
11608
+ (0, pruneUnselectedModel_1.pruneUnselectedModel)(pasteModel);
11502
11609
  if (selection.type === 'table') {
11503
11610
  (0, roosterjs_content_model_dom_1.iterateSelections)(pasteModel, function (_, tableContext) {
11504
11611
  if (tableContext === null || tableContext === void 0 ? void 0 : tableContext.table) {
@@ -11525,10 +11632,16 @@ var CopyPastePlugin = /** @class */ (function () {
11525
11632
  rawEvent: event,
11526
11633
  isCut: isCut,
11527
11634
  }).range;
11528
- if (newRange) {
11635
+ if (this.customCopyCutEnabled && isClipboardEvent(event)) {
11636
+ event.preventDefault();
11637
+ var text = (0, roosterjs_content_model_dom_1.contentModelToText)(pasteModel);
11638
+ (_a = event.clipboardData) === null || _a === void 0 ? void 0 : _a.setData('text/html', tempDiv_1.innerHTML);
11639
+ (_b = event.clipboardData) === null || _b === void 0 ? void 0 : _b.setData('text/plain', text);
11640
+ }
11641
+ else if (newRange) {
11529
11642
  (0, addRangeToSelection_1.addRangeToSelection)(doc, newRange);
11530
11643
  }
11531
- (_a = doc.defaultView) === null || _a === void 0 ? void 0 : _a.requestAnimationFrame(function () {
11644
+ (_c = doc.defaultView) === null || _c === void 0 ? void 0 : _c.requestAnimationFrame(function () {
11532
11645
  if (!_this.editor) {
11533
11646
  return;
11534
11647
  }
@@ -11565,7 +11678,9 @@ var CopyPastePlugin = /** @class */ (function () {
11565
11678
  tempDiv.style.left = '0';
11566
11679
  tempDiv.style.userSelect = 'text';
11567
11680
  tempDiv.contentEditable = 'true';
11568
- doc.body.appendChild(tempDiv);
11681
+ if (!this.customCopyCutEnabled) {
11682
+ doc.body.appendChild(tempDiv);
11683
+ }
11569
11684
  this.state.tempDiv = tempDiv;
11570
11685
  }
11571
11686
  var div = this.state.tempDiv;
@@ -11777,6 +11892,151 @@ var deleteEmptyList = function (context) {
11777
11892
  exports.deleteEmptyList = deleteEmptyList;
11778
11893
 
11779
11894
 
11895
+ /***/ }),
11896
+
11897
+ /***/ "./packages/roosterjs-content-model-core/lib/corePlugin/copyPaste/utils/pruneUnselectedModel.ts":
11898
+ /*!******************************************************************************************************!*\
11899
+ !*** ./packages/roosterjs-content-model-core/lib/corePlugin/copyPaste/utils/pruneUnselectedModel.ts ***!
11900
+ \******************************************************************************************************/
11901
+ /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
11902
+
11903
+ "use strict";
11904
+
11905
+ Object.defineProperty(exports, "__esModule", ({ value: true }));
11906
+ exports.pruneUnselectedModel = void 0;
11907
+ var tslib_1 = __webpack_require__(/*! tslib */ "./node_modules/tslib/tslib.es6.mjs");
11908
+ /**
11909
+ * @internal
11910
+ */
11911
+ function pruneUnselectedModel(model) {
11912
+ pruneUnselectedModelInternal(model, false /* isSelectionAfterElement */);
11913
+ unwrap(model);
11914
+ }
11915
+ exports.pruneUnselectedModel = pruneUnselectedModel;
11916
+ function pruneUnselectedModelInternal(model, isSelectionAfterElement) {
11917
+ var e_1, _a, _b;
11918
+ for (var index = model.blocks.length - 1; index >= 0; index--) {
11919
+ var block = model.blocks[index];
11920
+ switch (block.blockType) {
11921
+ case 'BlockGroup':
11922
+ pruneUnselectedModelInternal(block, isSelectionAfterElement);
11923
+ if (block.blockGroupType == 'General'
11924
+ ? block.blocks.length == 0 && !block.isSelected
11925
+ : block.blocks.length == 0) {
11926
+ model.blocks.splice(index, 1);
11927
+ }
11928
+ break;
11929
+ case 'Divider':
11930
+ case 'Entity':
11931
+ if (!block.isSelected) {
11932
+ model.blocks.splice(index, 1);
11933
+ }
11934
+ else {
11935
+ isSelectionAfterElement = true;
11936
+ }
11937
+ break;
11938
+ case 'Paragraph':
11939
+ var newSegments = [];
11940
+ try {
11941
+ for (var _c = (e_1 = void 0, (0, tslib_1.__values)(block.segments)), _d = _c.next(); !_d.done; _d = _c.next()) {
11942
+ var segment = _d.value;
11943
+ if (segment.segmentType == 'General') {
11944
+ pruneUnselectedModel(segment);
11945
+ if (segment.blocks.length > 0 || segment.isSelected) {
11946
+ newSegments.push(segment);
11947
+ }
11948
+ }
11949
+ else if (segment.isSelected && segment.segmentType != 'SelectionMarker') {
11950
+ newSegments.push(segment);
11951
+ }
11952
+ }
11953
+ }
11954
+ catch (e_1_1) { e_1 = { error: e_1_1 }; }
11955
+ finally {
11956
+ try {
11957
+ if (_d && !_d.done && (_a = _c.return)) _a.call(_c);
11958
+ }
11959
+ finally { if (e_1) throw e_1.error; }
11960
+ }
11961
+ block.segments = newSegments;
11962
+ if (block.segments.length == 0) {
11963
+ model.blocks.splice(index, 1);
11964
+ }
11965
+ else {
11966
+ isSelectionAfterElement = true;
11967
+ }
11968
+ break;
11969
+ case 'Table':
11970
+ var filteredRows = [];
11971
+ for (var i = 0; i < block.rows.length; i++) {
11972
+ var row = block.rows[i];
11973
+ for (var j = 0; j < row.cells.length; j++) {
11974
+ var cell = row.cells[j];
11975
+ if (!cell.isSelected) {
11976
+ pruneUnselectedModelInternal(cell, isSelectionAfterElement);
11977
+ }
11978
+ else {
11979
+ isSelectionAfterElement = true;
11980
+ }
11981
+ }
11982
+ var newCells = [];
11983
+ for (var k = 0; k < row.cells.length; k++) {
11984
+ var cell = row.cells[k];
11985
+ if (cell.isSelected || cell.blocks.length > 0) {
11986
+ newCells.push(cell);
11987
+ }
11988
+ }
11989
+ row.cells = newCells;
11990
+ if (row.cells.length > 0) {
11991
+ filteredRows.push(row);
11992
+ }
11993
+ }
11994
+ if (!isSelectionAfterElement &&
11995
+ filteredRows.length == 1 &&
11996
+ filteredRows[0].cells.length == 1 &&
11997
+ !filteredRows[0].cells[0].isSelected) {
11998
+ var cell = filteredRows[0].cells[0];
11999
+ (_b = model.blocks).splice.apply(_b, (0, tslib_1.__spreadArray)([index, 1], (0, tslib_1.__read)(cell.blocks), false));
12000
+ }
12001
+ else if (filteredRows.length == 0) {
12002
+ model.blocks.splice(index, 1);
12003
+ }
12004
+ else {
12005
+ block.rows = filteredRows;
12006
+ }
12007
+ break;
12008
+ }
12009
+ }
12010
+ return isSelectionAfterElement;
12011
+ }
12012
+ function unwrap(model) {
12013
+ var block = model.blocks[0];
12014
+ if (model.blocks.length == 1) {
12015
+ while (block.blockType == 'BlockGroup') {
12016
+ model.blocks = block.blocks;
12017
+ block = model.blocks[0];
12018
+ if (model.blocks.length > 1) {
12019
+ return;
12020
+ }
12021
+ }
12022
+ if (block.blockType == 'Paragraph') {
12023
+ block.isImplicit = true;
12024
+ block.format = {};
12025
+ inheritSegmentFormatToChildren(block);
12026
+ }
12027
+ }
12028
+ }
12029
+ function inheritSegmentFormatToChildren(parent) {
12030
+ var value = parent.segmentFormat;
12031
+ if (value !== undefined) {
12032
+ for (var index = 0; index < parent.segments.length; index++) {
12033
+ var segment = parent.segments[index];
12034
+ segment.format = (0, tslib_1.__assign)((0, tslib_1.__assign)({}, parent.segmentFormat), segment.format);
12035
+ }
12036
+ }
12037
+ }
12038
+
12039
+
11780
12040
  /***/ }),
11781
12041
 
11782
12042
  /***/ "./packages/roosterjs-content-model-core/lib/corePlugin/createEditorCorePlugins.ts":
@@ -12545,17 +12805,10 @@ function handleDelimiterKeyDownEvent(editor, event) {
12545
12805
  var key = rawEvent.key;
12546
12806
  switch (key) {
12547
12807
  case 'Enter':
12548
- if (range.collapsed) {
12549
- handleInputOnDelimiter(editor, range, getFocusedElement(selection), rawEvent);
12550
- }
12551
- else {
12552
- var helper = editor.getDOMHelper();
12553
- var entity = (0, roosterjs_content_model_dom_1.findClosestEntityWrapper)(range.startContainer, helper);
12554
- if (entity &&
12555
- (0, roosterjs_content_model_dom_1.isNodeOfType)(entity, 'ELEMENT_NODE') &&
12556
- helper.isNodeInEditor(entity)) {
12557
- triggerEntityEventOnEnter(editor, entity, rawEvent);
12558
- }
12808
+ var helper = editor.getDOMHelper();
12809
+ var entity = (0, roosterjs_content_model_dom_1.findClosestEntityWrapper)(range.startContainer, helper);
12810
+ if (entity && (0, roosterjs_content_model_dom_1.isNodeOfType)(entity, 'ELEMENT_NODE') && helper.isNodeInEditor(entity)) {
12811
+ triggerEntityEventOnEnter(editor, entity, rawEvent);
12559
12812
  }
12560
12813
  break;
12561
12814
  case 'ArrowLeft':
@@ -12794,6 +13047,10 @@ var FormatPlugin = /** @class */ (function () {
12794
13047
  defaultFormat: (0, tslib_1.__assign)({}, option.defaultSegmentFormat),
12795
13048
  pendingFormat: null,
12796
13049
  };
13050
+ var defaultFormat = this.state.defaultFormat;
13051
+ if (defaultFormat.fontFamily) {
13052
+ defaultFormat.fontFamily = (0, roosterjs_content_model_dom_1.normalizeFontFamily)(defaultFormat.fontFamily);
13053
+ }
12797
13054
  this.defaultFormatKeys = new Set();
12798
13055
  (0, roosterjs_content_model_dom_1.getObjectKeys)(DefaultStyleKeyMap).forEach(function (key) {
12799
13056
  if (_this.state.defaultFormat[key]) {
@@ -12815,6 +13072,7 @@ var FormatPlugin = /** @class */ (function () {
12815
13072
  */
12816
13073
  FormatPlugin.prototype.initialize = function (editor) {
12817
13074
  this.editor = editor;
13075
+ this.state.defaultFormat = (0, roosterjs_content_model_dom_1.normalizeSegmentFormat)(this.state.defaultFormat, editor.getEnvironment());
12818
13076
  };
12819
13077
  /**
12820
13078
  * The last method that editor will call to a plugin before it is disposed.
@@ -13491,7 +13749,7 @@ var SelectionPlugin = /** @class */ (function () {
13491
13749
  }
13492
13750
  };
13493
13751
  SelectionPlugin.prototype.onMouseDown = function (editor, rawEvent) {
13494
- var _a;
13752
+ var _a, _b, _c;
13495
13753
  var selection = editor.getDOMSelection();
13496
13754
  var image;
13497
13755
  // Image selection
@@ -13530,6 +13788,7 @@ var SelectionPlugin = /** @class */ (function () {
13530
13788
  rawEvent.preventDefault();
13531
13789
  }
13532
13790
  }
13791
+ (_c = (_b = this.state).mouseDisposer) === null || _c === void 0 ? void 0 : _c.call(_b);
13533
13792
  this.state.mouseDisposer = editor.attachDomEvent({
13534
13793
  mousemove: {
13535
13794
  beforeDispatch: this.onMouseMove,
@@ -13542,7 +13801,7 @@ var SelectionPlugin = /** @class */ (function () {
13542
13801
  };
13543
13802
  SelectionPlugin.prototype.onKeyDown = function (editor, rawEvent) {
13544
13803
  var _this = this;
13545
- var _a;
13804
+ var _a, _b;
13546
13805
  var key = rawEvent.key;
13547
13806
  var selection = editor.getDOMSelection();
13548
13807
  var win = editor.getDocument().defaultView;
@@ -13585,7 +13844,25 @@ var SelectionPlugin = /** @class */ (function () {
13585
13844
  }
13586
13845
  break;
13587
13846
  case 'table':
13588
- if ((_a = this.state.tableSelection) === null || _a === void 0 ? void 0 : _a.lastCo) {
13847
+ // After a content change event is handled tableSelection state is reset to null
13848
+ // Since we have table selection from DOMSelection, we can use it to re-create the tableSelection state
13849
+ if (this.state.tableSelection == null) {
13850
+ var table = selection.table, firstRow = selection.firstRow, firstColumn = selection.firstColumn, lastRow = selection.lastRow, lastColumn = selection.lastColumn;
13851
+ var parsedTable = (0, roosterjs_content_model_dom_1.parseTableCells)(table);
13852
+ if (parsedTable) {
13853
+ var firstCo = { row: firstRow, col: firstColumn };
13854
+ var lastCo = { row: lastRow, col: lastColumn };
13855
+ // Create the tableSelection with current table info
13856
+ this.state.tableSelection = {
13857
+ table: table,
13858
+ parsedTable: parsedTable,
13859
+ firstCo: firstCo,
13860
+ lastCo: lastCo,
13861
+ startNode: ((_a = (0, findTableCellElement_1.findTableCellElement)(parsedTable, firstCo)) === null || _a === void 0 ? void 0 : _a.cell) || table,
13862
+ };
13863
+ }
13864
+ }
13865
+ if ((_b = this.state.tableSelection) === null || _b === void 0 ? void 0 : _b.lastCo) {
13589
13866
  var shiftKey = rawEvent.shiftKey, key_1 = rawEvent.key;
13590
13867
  if (shiftKey && (key_1 == Left || key_1 == Right)) {
13591
13868
  var isRtl = (win === null || win === void 0 ? void 0 : win.getComputedStyle(this.state.tableSelection.table).direction) ==
@@ -14378,7 +14655,7 @@ var Editor = /** @class */ (function () {
14378
14655
  return result;
14379
14656
  };
14380
14657
  this.core = (0, createEditorCore_1.createEditorCore)(contentDiv, options);
14381
- var initialModel = (_a = options.initialModel) !== null && _a !== void 0 ? _a : (0, roosterjs_content_model_dom_1.createEmptyModel)(options.defaultSegmentFormat);
14658
+ var initialModel = (_a = options.initialModel) !== null && _a !== void 0 ? _a : (0, roosterjs_content_model_dom_1.createEmptyModel)(this.core.format.defaultFormat);
14382
14659
  this.core.api.setContentModel(this.core, initialModel, { ignoreSelection: true }, undefined /*onNodeCreated*/, true /*isInitializing*/);
14383
14660
  this.core.plugins.forEach(function (plugin) { return plugin.initialize(_this); });
14384
14661
  }
@@ -15436,6 +15713,7 @@ function trustedHTMLHandlerToDOMCreator(trustedHTMLHandler) {
15436
15713
  var handler = trustedHTMLHandler || exports.defaultTrustHtmlHandler;
15437
15714
  return {
15438
15715
  htmlToDOM: function (html) { return new DOMParser().parseFromString(handler(html), 'text/html'); },
15716
+ isBypassed: !trustedHTMLHandler,
15439
15717
  };
15440
15718
  }
15441
15719
 
@@ -15704,10 +15982,22 @@ exports.BulletListType = {
15704
15982
  * Bullet type circle
15705
15983
  */
15706
15984
  Circle: 9,
15985
+ /**
15986
+ * Box Shadow bullet type
15987
+ */
15988
+ BoxShadow: 10,
15989
+ /**
15990
+ * Rhombus with a cross inside
15991
+ */
15992
+ Xrhombus: 11,
15993
+ /**
15994
+ * Check mark bullet type
15995
+ */
15996
+ CheckMark: 12,
15707
15997
  /**
15708
15998
  * Maximum value of the enum
15709
15999
  */
15710
- Max: 9,
16000
+ Max: 12,
15711
16001
  };
15712
16002
 
15713
16003
 
@@ -16080,7 +16370,7 @@ var BulletListType_1 = __webpack_require__(/*! ./BulletListType */ "./packages/r
16080
16370
  */
16081
16371
  exports.UnorderedListStyleMap = (_a = {},
16082
16372
  _a[BulletListType_1.BulletListType.Disc] = 'disc',
16083
- _a[BulletListType_1.BulletListType.Square] = '"∎ "',
16373
+ _a[BulletListType_1.BulletListType.Square] = 'square',
16084
16374
  _a[BulletListType_1.BulletListType.Circle] = 'circle',
16085
16375
  _a[BulletListType_1.BulletListType.Dash] = '"- "',
16086
16376
  _a[BulletListType_1.BulletListType.LongArrow] = '"➔ "',
@@ -16088,6 +16378,9 @@ exports.UnorderedListStyleMap = (_a = {},
16088
16378
  _a[BulletListType_1.BulletListType.ShortArrow] = '"➢ "',
16089
16379
  _a[BulletListType_1.BulletListType.UnfilledArrow] = '"➪ "',
16090
16380
  _a[BulletListType_1.BulletListType.Hyphen] = '"— "',
16381
+ _a[BulletListType_1.BulletListType.CheckMark] = '"✔ "',
16382
+ _a[BulletListType_1.BulletListType.Xrhombus] = '"❖ "',
16383
+ _a[BulletListType_1.BulletListType.BoxShadow] = '"❑ "',
16091
16384
  _a);
16092
16385
 
16093
16386
 
@@ -16976,6 +17269,7 @@ var createParagraph_1 = __webpack_require__(/*! ../../modelApi/creators/createPa
16976
17269
  var formatContainerProcessor_1 = __webpack_require__(/*! ./formatContainerProcessor */ "./packages/roosterjs-content-model-dom/lib/domToModel/processors/formatContainerProcessor.ts");
16977
17270
  var getDefaultStyle_1 = __webpack_require__(/*! ../utils/getDefaultStyle */ "./packages/roosterjs-content-model-dom/lib/domToModel/utils/getDefaultStyle.ts");
16978
17271
  var isBlockElement_1 = __webpack_require__(/*! ../utils/isBlockElement */ "./packages/roosterjs-content-model-dom/lib/domToModel/utils/isBlockElement.ts");
17272
+ var entityUtils_1 = __webpack_require__(/*! ../../domUtils/entityUtils */ "./packages/roosterjs-content-model-dom/lib/domUtils/entityUtils.ts");
16979
17273
  var parseFormat_1 = __webpack_require__(/*! ../utils/parseFormat */ "./packages/roosterjs-content-model-dom/lib/domToModel/utils/parseFormat.ts");
16980
17274
  var stackFormat_1 = __webpack_require__(/*! ../utils/stackFormat */ "./packages/roosterjs-content-model-dom/lib/domToModel/utils/stackFormat.ts");
16981
17275
  var FormatContainerTriggerStyles = [
@@ -16996,6 +17290,7 @@ var FormatContainerTriggerStyles = [
16996
17290
  'minWidth',
16997
17291
  'minHeight',
16998
17292
  ];
17293
+ var FormatContainerTriggerAttributes = ['id'];
16999
17294
  var ByPassFormatContainerTags = ['H1', 'H2', 'H3', 'H4', 'H5', 'H6', 'P', 'A'];
17000
17295
  var SegmentDecoratorTags = ['A', 'CODE'];
17001
17296
  /**
@@ -17007,6 +17302,9 @@ var knownElementProcessor = function (group, element, context) {
17007
17302
  shouldUseFormatContainer(element, context)) {
17008
17303
  (0, formatContainerProcessor_1.formatContainerProcessor)(group, element, context);
17009
17304
  }
17305
+ else if ((0, entityUtils_1.isBlockEntityContainer)(element)) {
17306
+ context.elementProcessors.child(group, element, context);
17307
+ }
17010
17308
  else if (isBlock) {
17011
17309
  var decorator = context.blockDecorator.tagName ? context.blockDecorator : undefined;
17012
17310
  var isSegmentDecorator = SegmentDecoratorTags.indexOf(element.tagName) >= 0;
@@ -17049,7 +17347,8 @@ function shouldUseFormatContainer(element, context) {
17049
17347
  }
17050
17348
  // For block element with positive value of border width or top/bottom margin/padding,
17051
17349
  // we need to use format container
17052
- if (FormatContainerTriggerStyles.some(function (key) { return parseInt(style[key] || defaultStyle[key] || '') > 0; })) {
17350
+ if (FormatContainerTriggerStyles.some(function (key) { return parseInt(style[key] || defaultStyle[key] || '') > 0; }) ||
17351
+ FormatContainerTriggerAttributes.some(function (attr) { return element.hasAttribute(attr); })) {
17053
17352
  return true;
17054
17353
  }
17055
17354
  // For margin left/right with value "auto", we need to use format container
@@ -17335,6 +17634,7 @@ var tableProcessor = function (group, tableElement, context) {
17335
17634
  }
17336
17635
  (0, parseFormat_1.parseFormat)(tr, context.formatParsers.block, context.blockFormat, context);
17337
17636
  (0, parseFormat_1.parseFormat)(tr, context.formatParsers.segmentOnBlock, context.segmentFormat, context);
17637
+ tableRow.height = parseInt(tr.style.height) || 0;
17338
17638
  var _loop_2 = function (sourceCol, targetCol) {
17339
17639
  for (; tableRow.cells[targetCol]; targetCol++) { }
17340
17640
  var td = tr.cells[sourceCol];
@@ -18406,6 +18706,35 @@ function setHiddenProperty(node, key, value) {
18406
18706
  exports.setHiddenProperty = setHiddenProperty;
18407
18707
 
18408
18708
 
18709
+ /***/ }),
18710
+
18711
+ /***/ "./packages/roosterjs-content-model-dom/lib/domUtils/hiddenProperties/imageState.ts":
18712
+ /*!******************************************************************************************!*\
18713
+ !*** ./packages/roosterjs-content-model-dom/lib/domUtils/hiddenProperties/imageState.ts ***!
18714
+ \******************************************************************************************/
18715
+ /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
18716
+
18717
+ "use strict";
18718
+
18719
+ Object.defineProperty(exports, "__esModule", ({ value: true }));
18720
+ exports.setImageState = exports.getImageState = void 0;
18721
+ var hiddenProperty_1 = __webpack_require__(/*! ./hiddenProperty */ "./packages/roosterjs-content-model-dom/lib/domUtils/hiddenProperties/hiddenProperty.ts");
18722
+ /**
18723
+ * Get image state from element. This is used to store a image state.
18724
+ */
18725
+ function getImageState(element) {
18726
+ return (0, hiddenProperty_1.getHiddenProperty)(element, 'imageState');
18727
+ }
18728
+ exports.getImageState = getImageState;
18729
+ /**
18730
+ * Set image state to element. This is used to store a image state.
18731
+ */
18732
+ function setImageState(element, marker) {
18733
+ (0, hiddenProperty_1.setHiddenProperty)(element, 'imageState', marker);
18734
+ }
18735
+ exports.setImageState = setImageState;
18736
+
18737
+
18409
18738
  /***/ }),
18410
18739
 
18411
18740
  /***/ "./packages/roosterjs-content-model-dom/lib/domUtils/hiddenProperties/paragraphMarker.ts":
@@ -18928,6 +19257,56 @@ function isBold(boldStyle) {
18928
19257
  exports.isBold = isBold;
18929
19258
 
18930
19259
 
19260
+ /***/ }),
19261
+
19262
+ /***/ "./packages/roosterjs-content-model-dom/lib/domUtils/style/normalizeFontFamily.ts":
19263
+ /*!****************************************************************************************!*\
19264
+ !*** ./packages/roosterjs-content-model-dom/lib/domUtils/style/normalizeFontFamily.ts ***!
19265
+ \****************************************************************************************/
19266
+ /***/ ((__unused_webpack_module, exports) => {
19267
+
19268
+ "use strict";
19269
+
19270
+ Object.defineProperty(exports, "__esModule", ({ value: true }));
19271
+ exports.normalizeFontFamily = void 0;
19272
+ /**
19273
+ * Normalize font family string to a standard format
19274
+ * Add quotes around font family names that contain non-alphanumeric/dash characters
19275
+ * @param fontFamily The font family string to normalize
19276
+ * @returns The normalized font family string
19277
+ */
19278
+ function normalizeFontFamily(fontFamily) {
19279
+ var existingQuotedFontsRegex = /".*?"/g;
19280
+ var match = existingQuotedFontsRegex.exec(fontFamily);
19281
+ var start = 0;
19282
+ var result = [];
19283
+ while (match) {
19284
+ process(fontFamily, result, start, match.index);
19285
+ start = match.index + match[0].length;
19286
+ result.push(match[0]);
19287
+ match = existingQuotedFontsRegex.exec(fontFamily);
19288
+ }
19289
+ process(fontFamily, result, start, fontFamily.length);
19290
+ return result.join(', ');
19291
+ }
19292
+ exports.normalizeFontFamily = normalizeFontFamily;
19293
+ function process(fontFamily, result, start, end) {
19294
+ var families = fontFamily.substring(start, end).split(',');
19295
+ families.forEach(function (family) {
19296
+ family = family.trim();
19297
+ if (family) {
19298
+ // Check if the family name contains non-alphanumeric characters
19299
+ if (/[^a-zA-Z0-9\-]/.test(family)) {
19300
+ result.push("\"" + family + "\"");
19301
+ }
19302
+ else {
19303
+ result.push(family);
19304
+ }
19305
+ }
19306
+ });
19307
+ }
19308
+
19309
+
18931
19310
  /***/ }),
18932
19311
 
18933
19312
  /***/ "./packages/roosterjs-content-model-dom/lib/domUtils/style/transformColor.ts":
@@ -19948,6 +20327,7 @@ var fontSizeFormatHandler_1 = __webpack_require__(/*! ./segment/fontSizeFormatHa
19948
20327
  var getObjectKeys_1 = __webpack_require__(/*! ../domUtils/getObjectKeys */ "./packages/roosterjs-content-model-dom/lib/domUtils/getObjectKeys.ts");
19949
20328
  var htmlAlignFormatHandler_1 = __webpack_require__(/*! ./block/htmlAlignFormatHandler */ "./packages/roosterjs-content-model-dom/lib/formatHandlers/block/htmlAlignFormatHandler.ts");
19950
20329
  var idFormatHandler_1 = __webpack_require__(/*! ./common/idFormatHandler */ "./packages/roosterjs-content-model-dom/lib/formatHandlers/common/idFormatHandler.ts");
20330
+ var imageStateFormatHandler_1 = __webpack_require__(/*! ./segment/imageStateFormatHandler */ "./packages/roosterjs-content-model-dom/lib/formatHandlers/segment/imageStateFormatHandler.ts");
19951
20331
  var italicFormatHandler_1 = __webpack_require__(/*! ./segment/italicFormatHandler */ "./packages/roosterjs-content-model-dom/lib/formatHandlers/segment/italicFormatHandler.ts");
19952
20332
  var letterSpacingFormatHandler_1 = __webpack_require__(/*! ./segment/letterSpacingFormatHandler */ "./packages/roosterjs-content-model-dom/lib/formatHandlers/segment/letterSpacingFormatHandler.ts");
19953
20333
  var lineHeightFormatHandler_1 = __webpack_require__(/*! ./block/lineHeightFormatHandler */ "./packages/roosterjs-content-model-dom/lib/formatHandlers/block/lineHeightFormatHandler.ts");
@@ -19987,6 +20367,7 @@ var defaultFormatHandlerMap = {
19987
20367
  entity: entityFormatHandler_1.entityFormatHandler,
19988
20368
  htmlAlign: htmlAlignFormatHandler_1.htmlAlignFormatHandler,
19989
20369
  id: idFormatHandler_1.idFormatHandler,
20370
+ imageState: imageStateFormatHandler_1.imageStateFormatHandler,
19990
20371
  italic: italicFormatHandler_1.italicFormatHandler,
19991
20372
  letterSpacing: letterSpacingFormatHandler_1.letterSpacingFormatHandler,
19992
20373
  lineHeight: lineHeightFormatHandler_1.lineHeightFormatHandler,
@@ -20099,6 +20480,7 @@ exports.defaultFormatKeysPerCategory = {
20099
20480
  'display',
20100
20481
  'float',
20101
20482
  'verticalAlign',
20483
+ 'imageState',
20102
20484
  ],
20103
20485
  link: [
20104
20486
  'link',
@@ -20117,7 +20499,7 @@ exports.defaultFormatKeysPerCategory = {
20117
20499
  code: ['fontFamily', 'display'],
20118
20500
  dataset: ['dataset'],
20119
20501
  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),
20502
+ container: (0, tslib_1.__spreadArray)((0, tslib_1.__spreadArray)([], (0, tslib_1.__read)(sharedContainerFormats), false), ['htmlAlign', 'size', 'display', 'id'], false),
20121
20503
  entity: ['entity'],
20122
20504
  general: ['textColor', 'backgroundColor'], // General model still need to do color transformation in dark mode
20123
20505
  };
@@ -20476,6 +20858,37 @@ function normalizeFontSize(fontSize, contextFont, context) {
20476
20858
  }
20477
20859
 
20478
20860
 
20861
+ /***/ }),
20862
+
20863
+ /***/ "./packages/roosterjs-content-model-dom/lib/formatHandlers/segment/imageStateFormatHandler.ts":
20864
+ /*!****************************************************************************************************!*\
20865
+ !*** ./packages/roosterjs-content-model-dom/lib/formatHandlers/segment/imageStateFormatHandler.ts ***!
20866
+ \****************************************************************************************************/
20867
+ /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
20868
+
20869
+ "use strict";
20870
+
20871
+ Object.defineProperty(exports, "__esModule", ({ value: true }));
20872
+ exports.imageStateFormatHandler = void 0;
20873
+ var imageState_1 = __webpack_require__(/*! ../../domUtils/hiddenProperties/imageState */ "./packages/roosterjs-content-model-dom/lib/domUtils/hiddenProperties/imageState.ts");
20874
+ /**
20875
+ * @internal
20876
+ */
20877
+ exports.imageStateFormatHandler = {
20878
+ parse: function (format, element) {
20879
+ var marker = (0, imageState_1.getImageState)(element);
20880
+ if (marker) {
20881
+ format.imageState = marker;
20882
+ }
20883
+ },
20884
+ apply: function (format, element) {
20885
+ if (format.imageState) {
20886
+ (0, imageState_1.setImageState)(element, format.imageState);
20887
+ }
20888
+ },
20889
+ };
20890
+
20891
+
20479
20892
  /***/ }),
20480
20893
 
20481
20894
  /***/ "./packages/roosterjs-content-model-dom/lib/formatHandlers/segment/italicFormatHandler.ts":
@@ -21266,9 +21679,9 @@ exports.shouldSetValue = shouldSetValue;
21266
21679
 
21267
21680
  Object.defineProperty(exports, "__esModule", ({ value: true }));
21268
21681
  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;
21682
+ 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.ParagraphFormats = exports.ListFormatsToMove = exports.ListFormatsToKeep = exports.ListFormats = exports.copyFormat = exports.setParagraphNotImplicit = exports.normalizeSegmentFormat = exports.mergeTextSegments = exports.normalizeSingleSegment = exports.isEmpty = exports.addSegment = exports.unwrapBlock = exports.isGeneralSegment = exports.normalizeContentModel = exports.normalizeParagraph = exports.addTextSegment = exports.addLink = exports.addCode = exports.addBlock = exports.mutateSegment = exports.mutateSegments = exports.mutateBlock = exports.createTableRow = exports.createEmptyModel = exports.createListLevel = exports.createDivider = exports.createEntity = exports.createGeneralBlock = exports.createGeneralSegment = void 0;
21683
+ 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.normalizeFontFamily = exports.transformColor = exports.readFile = exports.parseTableCells = exports.normalizeText = exports.isSpace = exports.isPunctuation = exports.extractBorderValues = exports.combineBorderValue = void 0;
21684
+ exports.EmptySegmentFormat = exports.UnorderedListStyleMap = exports.OrderedListStyleMap = exports.TableBorderFormat = exports.NumberingListType = exports.BulletListType = exports.ChangeSource = exports.ListMetadataDefinition = exports.getListMetadata = exports.updateListMetadata = void 0;
21272
21685
  var domToContentModel_1 = __webpack_require__(/*! ./domToModel/domToContentModel */ "./packages/roosterjs-content-model-dom/lib/domToModel/domToContentModel.ts");
21273
21686
  Object.defineProperty(exports, "domToContentModel", ({ enumerable: true, get: function () { return domToContentModel_1.domToContentModel; } }));
21274
21687
  var contentModelToDom_1 = __webpack_require__(/*! ./modelToDom/contentModelToDom */ "./packages/roosterjs-content-model-dom/lib/modelToDom/contentModelToDom.ts");
@@ -21397,8 +21810,16 @@ var normalizeSegment_1 = __webpack_require__(/*! ./modelApi/common/normalizeSegm
21397
21810
  Object.defineProperty(exports, "normalizeSingleSegment", ({ enumerable: true, get: function () { return normalizeSegment_1.normalizeSingleSegment; } }));
21398
21811
  var mergeTextSegments_1 = __webpack_require__(/*! ./modelApi/common/mergeTextSegments */ "./packages/roosterjs-content-model-dom/lib/modelApi/common/mergeTextSegments.ts");
21399
21812
  Object.defineProperty(exports, "mergeTextSegments", ({ enumerable: true, get: function () { return mergeTextSegments_1.mergeTextSegments; } }));
21813
+ var normalizeSegmentFormat_1 = __webpack_require__(/*! ./modelApi/common/normalizeSegmentFormat */ "./packages/roosterjs-content-model-dom/lib/modelApi/common/normalizeSegmentFormat.ts");
21814
+ Object.defineProperty(exports, "normalizeSegmentFormat", ({ enumerable: true, get: function () { return normalizeSegmentFormat_1.normalizeSegmentFormat; } }));
21400
21815
  var setParagraphNotImplicit_1 = __webpack_require__(/*! ./modelApi/block/setParagraphNotImplicit */ "./packages/roosterjs-content-model-dom/lib/modelApi/block/setParagraphNotImplicit.ts");
21401
21816
  Object.defineProperty(exports, "setParagraphNotImplicit", ({ enumerable: true, get: function () { return setParagraphNotImplicit_1.setParagraphNotImplicit; } }));
21817
+ var copyFormat_1 = __webpack_require__(/*! ./modelApi/block/copyFormat */ "./packages/roosterjs-content-model-dom/lib/modelApi/block/copyFormat.ts");
21818
+ Object.defineProperty(exports, "copyFormat", ({ enumerable: true, get: function () { return copyFormat_1.copyFormat; } }));
21819
+ Object.defineProperty(exports, "ListFormats", ({ enumerable: true, get: function () { return copyFormat_1.ListFormats; } }));
21820
+ Object.defineProperty(exports, "ListFormatsToKeep", ({ enumerable: true, get: function () { return copyFormat_1.ListFormatsToKeep; } }));
21821
+ Object.defineProperty(exports, "ListFormatsToMove", ({ enumerable: true, get: function () { return copyFormat_1.ListFormatsToMove; } }));
21822
+ Object.defineProperty(exports, "ParagraphFormats", ({ enumerable: true, get: function () { return copyFormat_1.ParagraphFormats; } }));
21402
21823
  var getOrderedListNumberStr_1 = __webpack_require__(/*! ./modelApi/list/getOrderedListNumberStr */ "./packages/roosterjs-content-model-dom/lib/modelApi/list/getOrderedListNumberStr.ts");
21403
21824
  Object.defineProperty(exports, "getOrderedListNumberStr", ({ enumerable: true, get: function () { return getOrderedListNumberStr_1.getOrderedListNumberStr; } }));
21404
21825
  var getAutoListStyleType_1 = __webpack_require__(/*! ./modelApi/list/getAutoListStyleType */ "./packages/roosterjs-content-model-dom/lib/modelApi/list/getAutoListStyleType.ts");
@@ -21444,6 +21865,8 @@ var readFile_1 = __webpack_require__(/*! ./domUtils/readFile */ "./packages/roos
21444
21865
  Object.defineProperty(exports, "readFile", ({ enumerable: true, get: function () { return readFile_1.readFile; } }));
21445
21866
  var transformColor_1 = __webpack_require__(/*! ./domUtils/style/transformColor */ "./packages/roosterjs-content-model-dom/lib/domUtils/style/transformColor.ts");
21446
21867
  Object.defineProperty(exports, "transformColor", ({ enumerable: true, get: function () { return transformColor_1.transformColor; } }));
21868
+ var normalizeFontFamily_1 = __webpack_require__(/*! ./domUtils/style/normalizeFontFamily */ "./packages/roosterjs-content-model-dom/lib/domUtils/style/normalizeFontFamily.ts");
21869
+ Object.defineProperty(exports, "normalizeFontFamily", ({ enumerable: true, get: function () { return normalizeFontFamily_1.normalizeFontFamily; } }));
21447
21870
  var extractClipboardItems_1 = __webpack_require__(/*! ./domUtils/event/extractClipboardItems */ "./packages/roosterjs-content-model-dom/lib/domUtils/event/extractClipboardItems.ts");
21448
21871
  Object.defineProperty(exports, "extractClipboardItems", ({ enumerable: true, get: function () { return extractClipboardItems_1.extractClipboardItems; } }));
21449
21872
  var cacheGetEventData_1 = __webpack_require__(/*! ./domUtils/event/cacheGetEventData */ "./packages/roosterjs-content-model-dom/lib/domUtils/event/cacheGetEventData.ts");
@@ -21451,6 +21874,9 @@ Object.defineProperty(exports, "cacheGetEventData", ({ enumerable: true, get: fu
21451
21874
  var paragraphMarker_1 = __webpack_require__(/*! ./domUtils/hiddenProperties/paragraphMarker */ "./packages/roosterjs-content-model-dom/lib/domUtils/hiddenProperties/paragraphMarker.ts");
21452
21875
  Object.defineProperty(exports, "setParagraphMarker", ({ enumerable: true, get: function () { return paragraphMarker_1.setParagraphMarker; } }));
21453
21876
  Object.defineProperty(exports, "getParagraphMarker", ({ enumerable: true, get: function () { return paragraphMarker_1.getParagraphMarker; } }));
21877
+ var imageState_1 = __webpack_require__(/*! ./domUtils/hiddenProperties/imageState */ "./packages/roosterjs-content-model-dom/lib/domUtils/hiddenProperties/imageState.ts");
21878
+ Object.defineProperty(exports, "setImageState", ({ enumerable: true, get: function () { return imageState_1.setImageState; } }));
21879
+ Object.defineProperty(exports, "getImageState", ({ enumerable: true, get: function () { return imageState_1.getImageState; } }));
21454
21880
  var isBlockGroupOfType_1 = __webpack_require__(/*! ./modelApi/typeCheck/isBlockGroupOfType */ "./packages/roosterjs-content-model-dom/lib/modelApi/typeCheck/isBlockGroupOfType.ts");
21455
21881
  Object.defineProperty(exports, "isBlockGroupOfType", ({ enumerable: true, get: function () { return isBlockGroupOfType_1.isBlockGroupOfType; } }));
21456
21882
  var iterateSelections_1 = __webpack_require__(/*! ./modelApi/selection/iterateSelections */ "./packages/roosterjs-content-model-dom/lib/modelApi/selection/iterateSelections.ts");
@@ -21530,6 +21956,92 @@ var EmptySegmentFormat_1 = __webpack_require__(/*! ./constants/EmptySegmentForma
21530
21956
  Object.defineProperty(exports, "EmptySegmentFormat", ({ enumerable: true, get: function () { return EmptySegmentFormat_1.EmptySegmentFormat; } }));
21531
21957
 
21532
21958
 
21959
+ /***/ }),
21960
+
21961
+ /***/ "./packages/roosterjs-content-model-dom/lib/modelApi/block/copyFormat.ts":
21962
+ /*!*******************************************************************************!*\
21963
+ !*** ./packages/roosterjs-content-model-dom/lib/modelApi/block/copyFormat.ts ***!
21964
+ \*******************************************************************************/
21965
+ /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
21966
+
21967
+ "use strict";
21968
+
21969
+ Object.defineProperty(exports, "__esModule", ({ value: true }));
21970
+ exports.copyFormat = exports.ParagraphFormats = exports.ListFormats = exports.ListFormatsToKeep = exports.ListFormatsToMove = void 0;
21971
+ var tslib_1 = __webpack_require__(/*! tslib */ "./node_modules/tslib/tslib.es6.mjs");
21972
+ /**
21973
+ * When copy format between list and paragraph, these are the formats that we can copy and remove from the source
21974
+ */
21975
+ exports.ListFormatsToMove = [
21976
+ 'marginRight',
21977
+ 'marginLeft',
21978
+ 'paddingRight',
21979
+ 'paddingLeft',
21980
+ ];
21981
+ /**
21982
+ * When copy format between list and paragraph, these are the formats that we can copy and keep in the source
21983
+ */
21984
+ exports.ListFormatsToKeep = [
21985
+ 'direction',
21986
+ 'textAlign',
21987
+ 'htmlAlign',
21988
+ ];
21989
+ /**
21990
+ * When copy format from one block to another, these are all the formats that we can copy
21991
+ */
21992
+ exports.ListFormats = exports.ListFormatsToMove.concat(exports.ListFormatsToKeep);
21993
+ /**
21994
+ * When copy format between paragraphs, these are the formats that we can copy
21995
+ */
21996
+ exports.ParagraphFormats = [
21997
+ 'backgroundColor',
21998
+ 'direction',
21999
+ 'textAlign',
22000
+ 'htmlAlign',
22001
+ 'lineHeight',
22002
+ 'textIndent',
22003
+ 'marginTop',
22004
+ 'marginRight',
22005
+ 'marginBottom',
22006
+ 'marginLeft',
22007
+ 'paddingTop',
22008
+ 'paddingRight',
22009
+ 'paddingBottom',
22010
+ 'paddingLeft',
22011
+ ];
22012
+ /**
22013
+ * Copy formats from source to target with only specified keys
22014
+ * @param targetFormat The format object to copy format to
22015
+ * @param sourceFormat The format object to copy format from
22016
+ * @param formatKeys The format keys to copy
22017
+ * @param deleteOriginalFormat True to delete the original format from sourceFormat, false to keep it. @default false
22018
+ */
22019
+ function copyFormat(targetFormat, sourceFormat, formatKeys, deleteOriginalFormat) {
22020
+ var e_1, _a, _b;
22021
+ try {
22022
+ 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()) {
22023
+ var key = formatKeys_1_1.value;
22024
+ if (sourceFormat[key] !== undefined) {
22025
+ Object.assign(targetFormat, (_b = {},
22026
+ _b[key] = sourceFormat[key],
22027
+ _b));
22028
+ if (deleteOriginalFormat) {
22029
+ delete sourceFormat[key];
22030
+ }
22031
+ }
22032
+ }
22033
+ }
22034
+ catch (e_1_1) { e_1 = { error: e_1_1 }; }
22035
+ finally {
22036
+ try {
22037
+ if (formatKeys_1_1 && !formatKeys_1_1.done && (_a = formatKeys_1.return)) _a.call(formatKeys_1);
22038
+ }
22039
+ finally { if (e_1) throw e_1.error; }
22040
+ }
22041
+ }
22042
+ exports.copyFormat = copyFormat;
22043
+
22044
+
21533
22045
  /***/ }),
21534
22046
 
21535
22047
  /***/ "./packages/roosterjs-content-model-dom/lib/modelApi/block/setParagraphNotImplicit.ts":
@@ -22009,6 +22521,7 @@ function isListItem(obj) {
22009
22521
  Object.defineProperty(exports, "__esModule", ({ value: true }));
22010
22522
  exports.normalizeContentModel = void 0;
22011
22523
  var isEmpty_1 = __webpack_require__(/*! ./isEmpty */ "./packages/roosterjs-content-model-dom/lib/modelApi/common/isEmpty.ts");
22524
+ var copyFormat_1 = __webpack_require__(/*! ../block/copyFormat */ "./packages/roosterjs-content-model-dom/lib/modelApi/block/copyFormat.ts");
22012
22525
  var mutate_1 = __webpack_require__(/*! ./mutate */ "./packages/roosterjs-content-model-dom/lib/modelApi/common/mutate.ts");
22013
22526
  var normalizeParagraph_1 = __webpack_require__(/*! ./normalizeParagraph */ "./packages/roosterjs-content-model-dom/lib/modelApi/common/normalizeParagraph.ts");
22014
22527
  var unwrapBlock_1 = __webpack_require__(/*! ./unwrapBlock */ "./packages/roosterjs-content-model-dom/lib/modelApi/common/unwrapBlock.ts");
@@ -22028,7 +22541,7 @@ function normalizeContentModel(group) {
22028
22541
  case 'BlockGroup':
22029
22542
  if (block.blockGroupType == 'ListItem' && block.levels.length == 0) {
22030
22543
  i += block.blocks.length;
22031
- (0, unwrapBlock_1.unwrapBlock)(group, block);
22544
+ (0, unwrapBlock_1.unwrapBlock)(group, block, copyFormat_1.ListFormats);
22032
22545
  }
22033
22546
  else {
22034
22547
  normalizeContentModel(block);
@@ -22300,6 +22813,44 @@ function normalizeLastTextSegment(paragraph, segment, lastInlineSegment) {
22300
22813
  }
22301
22814
 
22302
22815
 
22816
+ /***/ }),
22817
+
22818
+ /***/ "./packages/roosterjs-content-model-dom/lib/modelApi/common/normalizeSegmentFormat.ts":
22819
+ /*!********************************************************************************************!*\
22820
+ !*** ./packages/roosterjs-content-model-dom/lib/modelApi/common/normalizeSegmentFormat.ts ***!
22821
+ \********************************************************************************************/
22822
+ /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
22823
+
22824
+ "use strict";
22825
+
22826
+ Object.defineProperty(exports, "__esModule", ({ value: true }));
22827
+ exports.normalizeSegmentFormat = void 0;
22828
+ var createContentModelDocument_1 = __webpack_require__(/*! ../creators/createContentModelDocument */ "./packages/roosterjs-content-model-dom/lib/modelApi/creators/createContentModelDocument.ts");
22829
+ var createText_1 = __webpack_require__(/*! ../creators/createText */ "./packages/roosterjs-content-model-dom/lib/modelApi/creators/createText.ts");
22830
+ var ensureParagraph_1 = __webpack_require__(/*! ./ensureParagraph */ "./packages/roosterjs-content-model-dom/lib/modelApi/common/ensureParagraph.ts");
22831
+ var createModelToDomContext_1 = __webpack_require__(/*! ../../modelToDom/context/createModelToDomContext */ "./packages/roosterjs-content-model-dom/lib/modelToDom/context/createModelToDomContext.ts");
22832
+ var createDomToModelContext_1 = __webpack_require__(/*! ../../domToModel/context/createDomToModelContext */ "./packages/roosterjs-content-model-dom/lib/domToModel/context/createDomToModelContext.ts");
22833
+ /**
22834
+ * Some format values can be changed when apply to DOM, such as font family.
22835
+ * This function will normalize the format and return the same string after DOM modification.
22836
+ * @param format The format to be normalized
22837
+ * @return Normalized format
22838
+ */
22839
+ function normalizeSegmentFormat(format, environment) {
22840
+ var _a, _b;
22841
+ var span = document.createElement('span');
22842
+ var segment = (0, createText_1.createText)('text', format);
22843
+ var domToModelContext = (0, createDomToModelContext_1.createDomToModelContextWithConfig)(environment.domToModelSettings.calculated);
22844
+ var modelToDomContext = (0, createModelToDomContext_1.createModelToDomContextWithConfig)(environment.modelToDomSettings.calculated);
22845
+ var model = (0, createContentModelDocument_1.createContentModelDocument)();
22846
+ modelToDomContext.modelHandlers.segment(span.ownerDocument, span, segment, modelToDomContext, []);
22847
+ domToModelContext.elementProcessors.element(model, span, domToModelContext);
22848
+ var paragraph = (0, ensureParagraph_1.ensureParagraph)(model);
22849
+ return (_b = (_a = paragraph.segments[0]) === null || _a === void 0 ? void 0 : _a.format) !== null && _b !== void 0 ? _b : format;
22850
+ }
22851
+ exports.normalizeSegmentFormat = normalizeSegmentFormat;
22852
+
22853
+
22303
22854
  /***/ }),
22304
22855
 
22305
22856
  /***/ "./packages/roosterjs-content-model-dom/lib/modelApi/common/unwrapBlock.ts":
@@ -22313,6 +22864,7 @@ function normalizeLastTextSegment(paragraph, segment, lastInlineSegment) {
22313
22864
  Object.defineProperty(exports, "__esModule", ({ value: true }));
22314
22865
  exports.unwrapBlock = void 0;
22315
22866
  var tslib_1 = __webpack_require__(/*! tslib */ "./node_modules/tslib/tslib.es6.mjs");
22867
+ var copyFormat_1 = __webpack_require__(/*! ../../modelApi/block/copyFormat */ "./packages/roosterjs-content-model-dom/lib/modelApi/block/copyFormat.ts");
22316
22868
  var mutate_1 = __webpack_require__(/*! ./mutate */ "./packages/roosterjs-content-model-dom/lib/modelApi/common/mutate.ts");
22317
22869
  var setParagraphNotImplicit_1 = __webpack_require__(/*! ../block/setParagraphNotImplicit */ "./packages/roosterjs-content-model-dom/lib/modelApi/block/setParagraphNotImplicit.ts");
22318
22870
  /**
@@ -22320,14 +22872,21 @@ var setParagraphNotImplicit_1 = __webpack_require__(/*! ../block/setParagraphNot
22320
22872
  * @param parent Parent block group of the unwrapping group
22321
22873
  * @param groupToUnwrap The block group to unwrap
22322
22874
  */
22323
- function unwrapBlock(parent, groupToUnwrap) {
22875
+ function unwrapBlock(parent, groupToUnwrap, formatsToKeep) {
22324
22876
  var _a;
22325
22877
  var _b, _c;
22326
22878
  var index = (_b = parent === null || parent === void 0 ? void 0 : parent.blocks.indexOf(groupToUnwrap)) !== null && _b !== void 0 ? _b : -1;
22327
22879
  if (index >= 0) {
22328
22880
  groupToUnwrap.blocks.forEach(setParagraphNotImplicit_1.setParagraphNotImplicit);
22329
22881
  if (parent) {
22330
- (_c = (0, mutate_1.mutateBlock)(parent)) === null || _c === void 0 ? void 0 : (_a = _c.blocks).splice.apply(_a, (0, tslib_1.__spreadArray)([index, 1], (0, tslib_1.__read)(groupToUnwrap.blocks.map(mutate_1.mutateBlock)), false));
22882
+ (_c = (0, mutate_1.mutateBlock)(parent)) === null || _c === void 0 ? void 0 : (_a = _c.blocks).splice.apply(_a, (0, tslib_1.__spreadArray)([index,
22883
+ 1], (0, tslib_1.__read)(groupToUnwrap.blocks.map(function (x) {
22884
+ var mutableBlock = (0, mutate_1.mutateBlock)(x);
22885
+ if (formatsToKeep) {
22886
+ (0, copyFormat_1.copyFormat)(mutableBlock.format, groupToUnwrap.format, formatsToKeep);
22887
+ }
22888
+ return mutableBlock;
22889
+ })), false));
22331
22890
  }
22332
22891
  }
22333
22892
  }
@@ -24453,6 +25012,7 @@ exports.retrieveModelFormatState = void 0;
24453
25012
  var tslib_1 = __webpack_require__(/*! tslib */ "./node_modules/tslib/tslib.es6.mjs");
24454
25013
  var borderValues_1 = __webpack_require__(/*! ../../domUtils/style/borderValues */ "./packages/roosterjs-content-model-dom/lib/domUtils/style/borderValues.ts");
24455
25014
  var getClosestAncestorBlockGroupIndex_1 = __webpack_require__(/*! ./getClosestAncestorBlockGroupIndex */ "./packages/roosterjs-content-model-dom/lib/modelApi/editing/getClosestAncestorBlockGroupIndex.ts");
25015
+ var updateImageMetadata_1 = __webpack_require__(/*! ../metadata/updateImageMetadata */ "./packages/roosterjs-content-model-dom/lib/modelApi/metadata/updateImageMetadata.ts");
24456
25016
  var updateTableMetadata_1 = __webpack_require__(/*! ../metadata/updateTableMetadata */ "./packages/roosterjs-content-model-dom/lib/modelApi/metadata/updateTableMetadata.ts");
24457
25017
  var isBold_1 = __webpack_require__(/*! ../../domUtils/style/isBold */ "./packages/roosterjs-content-model-dom/lib/domUtils/style/isBold.ts");
24458
25018
  var iterateSelections_1 = __webpack_require__(/*! ../selection/iterateSelections */ "./packages/roosterjs-content-model-dom/lib/modelApi/selection/iterateSelections.ts");
@@ -24525,6 +25085,7 @@ function retrieveModelFormatState(model, pendingFormat, formatState, conflictSol
24525
25085
  }
24526
25086
  else {
24527
25087
  formatState.imageFormat = undefined;
25088
+ formatState.imageEditingMetadata = undefined;
24528
25089
  }
24529
25090
  }
24530
25091
  });
@@ -24621,6 +25182,7 @@ function retrieveImageFormat(image, result) {
24621
25182
  boxShadow: format.boxShadow,
24622
25183
  borderRadius: format.borderRadius,
24623
25184
  };
25185
+ result.imageEditingMetadata = (0, updateImageMetadata_1.getImageMetadata)(image);
24624
25186
  }
24625
25187
  function mergeValue(format, key, newValue, isFirst, conflictSolution, parseFn) {
24626
25188
  if (conflictSolution === void 0) { conflictSolution = 'remove'; }
@@ -28956,52 +29518,71 @@ var AutoFormatPlugin = /** @class */ (function () {
28956
29518
  if (options === void 0) { options = DefaultOptions; }
28957
29519
  this.options = options;
28958
29520
  this.editor = null;
28959
- this.features = [
29521
+ this.autoLink = {
29522
+ enabled: !!(this.options.autoLink || this.options.autoTel || this.options.autoMailto),
29523
+ transformFunction: function (_model, previousSegment, paragraph, context) {
29524
+ var _a;
29525
+ var _b = _this.options, autoLink = _b.autoLink, autoTel = _b.autoTel, autoMailto = _b.autoMailto;
29526
+ var linkSegment = (0, roosterjs_content_model_api_1.promoteLink)(previousSegment, paragraph, {
29527
+ autoLink: autoLink,
29528
+ autoTel: autoTel,
29529
+ autoMailto: autoMailto,
29530
+ });
29531
+ if (linkSegment) {
29532
+ return createAnchor(((_a = linkSegment.link) === null || _a === void 0 ? void 0 : _a.format.href) || '', linkSegment.text);
29533
+ }
29534
+ return false;
29535
+ },
29536
+ apiName: 'autoLink',
29537
+ changeSource: roosterjs_content_model_dom_1.ChangeSource.AutoLink,
29538
+ };
29539
+ this.tabFeatures = [
28960
29540
  {
28961
- autoFormat: 'list',
28962
29541
  enabled: !!(this.options.autoBullet || this.options.autoNumbering),
28963
29542
  transformFunction: function (model, _previousSegment, paragraph, context) {
28964
29543
  return (0, keyboardListTrigger_1.keyboardListTrigger)(model, paragraph, context, _this.options.autoBullet, _this.options.autoNumbering, _this.options.removeListMargins);
28965
29544
  },
29545
+ apiName: 'autoToggleList',
29546
+ changeSource: roosterjs_content_model_dom_1.ChangeSource.AutoFormat,
28966
29547
  },
29548
+ this.autoLink,
29549
+ ];
29550
+ this.features = (0, tslib_1.__spreadArray)((0, tslib_1.__spreadArray)([], (0, tslib_1.__read)(this.tabFeatures), false), [
28967
29551
  {
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
29552
  enabled: !!this.options.autoHyphen,
29553
+ apiName: 'autoHyphen',
29554
+ changeSource: roosterjs_content_model_dom_1.ChangeSource.Format,
28987
29555
  transformFunction: function (_model, previousSegment, paragraph, context) {
28988
29556
  return (0, transformHyphen_1.transformHyphen)(previousSegment, paragraph, context);
28989
29557
  },
28990
29558
  },
28991
29559
  {
28992
- autoFormat: 'fraction',
28993
29560
  enabled: !!this.options.autoFraction,
29561
+ apiName: 'autoFraction',
29562
+ changeSource: roosterjs_content_model_dom_1.ChangeSource.Format,
28994
29563
  transformFunction: function (_model, previousSegment, paragraph, context) {
28995
29564
  return (0, transformFraction_1.transformFraction)(previousSegment, paragraph, context);
28996
29565
  },
28997
29566
  },
28998
29567
  {
28999
- autoFormat: 'ordinal',
29000
29568
  enabled: !!this.options.autoOrdinals,
29569
+ apiName: 'autoOrdinal',
29570
+ changeSource: roosterjs_content_model_dom_1.ChangeSource.Format,
29001
29571
  transformFunction: function (_model, previousSegment, paragraph, context) {
29002
29572
  return (0, transformOrdinals_1.transformOrdinals)(previousSegment, paragraph, context);
29003
29573
  },
29004
29574
  },
29575
+ ], false);
29576
+ this.enterFeatures = [
29577
+ {
29578
+ enabled: !!this.options.autoHorizontalLine,
29579
+ transformFunction: function (model, _previousSegment, paragraph, context) {
29580
+ return (0, checkAndInsertHorizontalLine_1.checkAndInsertHorizontalLine)(model, paragraph, context);
29581
+ },
29582
+ apiName: 'autoHorizontalLine',
29583
+ changeSource: roosterjs_content_model_dom_1.ChangeSource.AutoFormat,
29584
+ },
29585
+ this.autoLink,
29005
29586
  ];
29006
29587
  }
29007
29588
  /**
@@ -29048,8 +29629,51 @@ var AutoFormatPlugin = /** @class */ (function () {
29048
29629
  }
29049
29630
  }
29050
29631
  };
29632
+ AutoFormatPlugin.prototype.handleKeyboardEvents = function (editor, features) {
29633
+ var formatOptions = {
29634
+ changeSource: '',
29635
+ apiName: '',
29636
+ getChangeData: undefined,
29637
+ };
29638
+ (0, roosterjs_content_model_api_1.formatTextSegmentBeforeSelectionMarker)(editor, function (model, previousSegment, paragraph, _markerFormat, context) {
29639
+ var e_1, _a;
29640
+ var featureApplied = undefined;
29641
+ var _loop_1 = function (feature) {
29642
+ if (feature.enabled) {
29643
+ var result_1 = feature.transformFunction(model, previousSegment, paragraph, context);
29644
+ if (result_1) {
29645
+ if (typeof result_1 !== 'boolean') {
29646
+ formatOptions.getChangeData = function () { return result_1; };
29647
+ }
29648
+ featureApplied = feature;
29649
+ return "break";
29650
+ }
29651
+ }
29652
+ };
29653
+ try {
29654
+ 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()) {
29655
+ var feature = features_1_1.value;
29656
+ var state_1 = _loop_1(feature);
29657
+ if (state_1 === "break")
29658
+ break;
29659
+ }
29660
+ }
29661
+ catch (e_1_1) { e_1 = { error: e_1_1 }; }
29662
+ finally {
29663
+ try {
29664
+ if (features_1_1 && !features_1_1.done && (_a = features_1.return)) _a.call(features_1);
29665
+ }
29666
+ finally { if (e_1) throw e_1.error; }
29667
+ }
29668
+ if (featureApplied) {
29669
+ formatOptions.changeSource = featureApplied.changeSource;
29670
+ formatOptions.apiName = featureApplied.apiName;
29671
+ }
29672
+ return !!featureApplied;
29673
+ }, formatOptions);
29674
+ return formatOptions;
29675
+ };
29051
29676
  AutoFormatPlugin.prototype.handleEditorInputEvent = function (editor, event) {
29052
- var _this = this;
29053
29677
  var rawEvent = event.rawEvent;
29054
29678
  var selection = editor.getDOMSelection();
29055
29679
  if (rawEvent.inputType === 'insertText' &&
@@ -29058,53 +29682,12 @@ var AutoFormatPlugin = /** @class */ (function () {
29058
29682
  selection.range.collapsed) {
29059
29683
  switch (rawEvent.data) {
29060
29684
  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);
29685
+ this.handleKeyboardEvents(editor, this.features);
29102
29686
  break;
29103
29687
  }
29104
29688
  }
29105
29689
  };
29106
29690
  AutoFormatPlugin.prototype.handleKeyDownEvent = function (editor, event) {
29107
- var _this = this;
29108
29691
  var rawEvent = event.rawEvent;
29109
29692
  if (!rawEvent.defaultPrevented && !event.handledByEditFeature) {
29110
29693
  switch (rawEvent.key) {
@@ -29115,34 +29698,21 @@ var AutoFormatPlugin = /** @class */ (function () {
29115
29698
  break;
29116
29699
  case 'Tab':
29117
29700
  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
- });
29701
+ var eventHandled_1 = this.handleKeyboardEvents(editor, this.tabFeatures);
29702
+ if (eventHandled_1.apiName == 'autoToggleList') {
29703
+ event.rawEvent.preventDefault();
29704
+ }
29133
29705
  }
29134
29706
  break;
29135
29707
  case 'Enter':
29136
- this.handleEnterKey(editor, event);
29708
+ var eventHandled = this.handleKeyboardEvents(editor, this.enterFeatures);
29709
+ if (eventHandled.apiName == 'autoHorizontalLine') {
29710
+ event.rawEvent.preventDefault();
29711
+ }
29137
29712
  break;
29138
29713
  }
29139
29714
  }
29140
29715
  };
29141
- AutoFormatPlugin.prototype.handleEnterKey = function (editor, event) {
29142
- if (this.options.autoHorizontalLine) {
29143
- (0, checkAndInsertHorizontalLine_1.checkAndInsertHorizontalLine)(editor, event);
29144
- }
29145
- };
29146
29716
  AutoFormatPlugin.prototype.handleContentChangedEvent = function (editor, event) {
29147
29717
  var _a = this.options, autoLink = _a.autoLink, autoTel = _a.autoTel, autoMailto = _a.autoMailto;
29148
29718
  if (event.source == 'Paste' && (autoLink || autoTel || autoMailto)) {
@@ -29156,16 +29726,6 @@ var AutoFormatPlugin = /** @class */ (function () {
29156
29726
  return AutoFormatPlugin;
29157
29727
  }());
29158
29728
  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
29729
  var createAnchor = function (url, text) {
29170
29730
  var anchor = document.createElement('a');
29171
29731
  anchor.href = url;
@@ -29187,7 +29747,6 @@ var createAnchor = function (url, text) {
29187
29747
  Object.defineProperty(exports, "__esModule", ({ value: true }));
29188
29748
  exports.checkAndInsertHorizontalLine = exports.insertHorizontalLineIntoModel = void 0;
29189
29749
  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
29750
  var roosterjs_content_model_dom_1 = __webpack_require__(/*! roosterjs-content-model-dom */ "./packages/roosterjs-content-model-dom/lib/index.ts");
29192
29751
  var HorizontalLineTriggerCharacters = [
29193
29752
  '-',
@@ -29251,28 +29810,22 @@ exports.insertHorizontalLineIntoModel = insertHorizontalLineIntoModel;
29251
29810
  * @param event The keydown event
29252
29811
  * @returns True if horizontal line is inserted, otherwise false
29253
29812
  */
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;
29813
+ var checkAndInsertHorizontalLine = function (model, paragraph, context) {
29814
+ var allText = paragraph.segments.reduce(function (acc, segment) { return (segment.segmentType === 'Text' ? acc + segment.text : acc); }, '');
29815
+ // At least 3 characters are needed to trigger horizontal line
29816
+ if (allText.length < 3) {
29817
+ return false;
29818
+ }
29819
+ return HorizontalLineTriggerCharacters.some(function (triggerCharacter) {
29820
+ var shouldFormat = allText.split('').every(function (char) { return char === triggerCharacter; });
29821
+ if (shouldFormat) {
29822
+ paragraph.segments = paragraph.segments.filter(function (s) { return s.segmentType != 'Text'; });
29823
+ insertHorizontalLineIntoModel(model, context, triggerCharacter);
29824
+ context.canUndoByBackspace = true;
29260
29825
  }
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',
29826
+ return shouldFormat;
29274
29827
  });
29275
- }
29828
+ };
29276
29829
  exports.checkAndInsertHorizontalLine = checkAndInsertHorizontalLine;
29277
29830
 
29278
29831
 
@@ -30100,6 +30653,7 @@ exports.CustomReplacePlugin = CustomReplacePlugin;
30100
30653
 
30101
30654
  Object.defineProperty(exports, "__esModule", ({ value: true }));
30102
30655
  exports.EditPlugin = void 0;
30656
+ var tslib_1 = __webpack_require__(/*! tslib */ "./node_modules/tslib/tslib.es6.mjs");
30103
30657
  var keyboardDelete_1 = __webpack_require__(/*! ./keyboardDelete */ "./packages/roosterjs-content-model-plugins/lib/edit/keyboardDelete.ts");
30104
30658
  var keyboardEnter_1 = __webpack_require__(/*! ./keyboardEnter */ "./packages/roosterjs-content-model-plugins/lib/edit/keyboardEnter.ts");
30105
30659
  var keyboardInput_1 = __webpack_require__(/*! ./keyboardInput */ "./packages/roosterjs-content-model-plugins/lib/edit/keyboardInput.ts");
@@ -30137,8 +30691,25 @@ var EditPlugin = /** @class */ (function () {
30137
30691
  this.disposer = null;
30138
30692
  this.shouldHandleNextInputEvent = false;
30139
30693
  this.selectionAfterDelete = null;
30140
- this.handleNormalEnter = false;
30694
+ this.handleNormalEnter = function (editor) { return false; };
30695
+ this.options = (0, tslib_1.__assign)((0, tslib_1.__assign)({}, DefaultOptions), options);
30141
30696
  }
30697
+ EditPlugin.prototype.createNormalEnterChecker = function (result) {
30698
+ return result ? function () { return true; } : function () { return false; };
30699
+ };
30700
+ EditPlugin.prototype.getHandleNormalEnter = function (editor) {
30701
+ switch (typeof this.options.shouldHandleEnterKey) {
30702
+ case 'function':
30703
+ return this.options.shouldHandleEnterKey;
30704
+ break;
30705
+ case 'boolean':
30706
+ return this.createNormalEnterChecker(this.options.shouldHandleEnterKey);
30707
+ break;
30708
+ default:
30709
+ return this.createNormalEnterChecker(editor.isExperimentalFeatureEnabled('HandleEnterKey'));
30710
+ break;
30711
+ }
30712
+ };
30142
30713
  /**
30143
30714
  * Get name of this plugin
30144
30715
  */
@@ -30154,7 +30725,7 @@ var EditPlugin = /** @class */ (function () {
30154
30725
  EditPlugin.prototype.initialize = function (editor) {
30155
30726
  var _this = this;
30156
30727
  this.editor = editor;
30157
- this.handleNormalEnter = this.editor.isExperimentalFeatureEnabled('HandleEnterKey');
30728
+ this.handleNormalEnter = this.getHandleNormalEnter(editor);
30158
30729
  if (editor.getEnvironment().isAndroid) {
30159
30730
  this.disposer = this.editor.attachDomEvent({
30160
30731
  beforeinput: {
@@ -30261,7 +30832,7 @@ var EditPlugin = /** @class */ (function () {
30261
30832
  if (!hasCtrlOrMetaKey &&
30262
30833
  !event.rawEvent.isComposing &&
30263
30834
  event.rawEvent.keyCode !== DEAD_KEY) {
30264
- (0, keyboardEnter_1.keyboardEnter)(editor, rawEvent, this.handleNormalEnter);
30835
+ (0, keyboardEnter_1.keyboardEnter)(editor, rawEvent, this.handleNormalEnter(editor));
30265
30836
  }
30266
30837
  break;
30267
30838
  default:
@@ -30941,6 +31512,7 @@ var createNewListItem = function (context, listItem, listParent) {
30941
31512
  var levels = createNewListLevel(listItem);
30942
31513
  var newListItem = (0, roosterjs_content_model_dom_1.createListItem)(levels, listItem.formatHolder.format);
30943
31514
  newListItem.blocks.push(newParagraph);
31515
+ (0, roosterjs_content_model_dom_1.copyFormat)(newListItem.format, listItem.format, roosterjs_content_model_dom_1.ListFormats);
30944
31516
  var remainingBlockCount = listItem.blocks.length - paraIndex - 1;
30945
31517
  if (paraIndex >= 0 && remainingBlockCount > 0) {
30946
31518
  (_a = newListItem.blocks).push.apply(_a, (0, tslib_1.__spreadArray)([], (0, tslib_1.__read)((0, roosterjs_content_model_dom_1.mutateBlock)(listItem).blocks.splice(paraIndex + 1, remainingBlockCount)), false));
@@ -31154,7 +31726,7 @@ var roosterjs_content_model_dom_1 = __webpack_require__(/*! roosterjs-content-mo
31154
31726
  function keyboardEnter(editor, rawEvent, handleNormalEnter) {
31155
31727
  var selection = editor.getDOMSelection();
31156
31728
  editor.formatContentModel(function (model, context) {
31157
- var _a;
31729
+ var _a, _b;
31158
31730
  // 1. delete the expanded selection if any, then merge paragraph
31159
31731
  var result = (0, roosterjs_content_model_dom_1.deleteSelection)(model, [], context);
31160
31732
  // 2. Add line break
@@ -31165,14 +31737,14 @@ function keyboardEnter(editor, rawEvent, handleNormalEnter) {
31165
31737
  var steps = rawEvent.shiftKey
31166
31738
  ? []
31167
31739
  : [handleAutoLink_1.handleAutoLink, handleEnterOnList_1.handleEnterOnList, deleteEmptyQuote_1.deleteEmptyQuote];
31168
- if (handleNormalEnter) {
31740
+ if (handleNormalEnter || hasEnterForEntity((_a = result.insertPoint) === null || _a === void 0 ? void 0 : _a.paragraph)) {
31169
31741
  steps.push(handleEnterOnParagraph_1.handleEnterOnParagraph);
31170
31742
  }
31171
31743
  (0, roosterjs_content_model_dom_1.runEditSteps)(steps, result);
31172
31744
  }
31173
31745
  if (result.deleteResult == 'range') {
31174
31746
  // We have deleted something, next input should inherit the segment format from deleted content, so set pending format here
31175
- context.newPendingFormat = (_a = result.insertPoint) === null || _a === void 0 ? void 0 : _a.marker.format;
31747
+ context.newPendingFormat = (_b = result.insertPoint) === null || _b === void 0 ? void 0 : _b.marker.format;
31176
31748
  (0, roosterjs_content_model_dom_1.normalizeContentModel)(model);
31177
31749
  rawEvent.preventDefault();
31178
31750
  return true;
@@ -31189,6 +31761,10 @@ function keyboardEnter(editor, rawEvent, handleNormalEnter) {
31189
31761
  });
31190
31762
  }
31191
31763
  exports.keyboardEnter = keyboardEnter;
31764
+ function hasEnterForEntity(paragraph) {
31765
+ return (paragraph &&
31766
+ (paragraph.isImplicit || paragraph.segments.some(function (x) { return x.segmentType == 'SelectionMarker'; })));
31767
+ }
31192
31768
 
31193
31769
 
31194
31770
  /***/ }),
@@ -31403,7 +31979,7 @@ var space = ' ';
31403
31979
  * @internal
31404
31980
  The handleTabOnParagraph function will handle the tab key in following scenarios:
31405
31981
  * 1. When the selection is collapsed and the cursor is at the end of a paragraph, add 4 spaces.
31406
- * 2. When the selection is collapsed and the cursor is at the start of a paragraph, call setModelIndention function to indent the whole paragraph
31982
+ * 2. When the selection is collapsed and the cursor is at the start of a paragraph, add 4 spaces.
31407
31983
  * 3. When the selection is collapsed and the cursor is at the middle of a paragraph, add 4 spaces.
31408
31984
  * 4. When the selection is not collapsed, replace the selected range with a single space.
31409
31985
  * 5. When the selection is not collapsed, but all segments are selected, call setModelIndention function to indent the whole paragraph
@@ -31417,8 +31993,10 @@ var space = ' ';
31417
31993
  function handleTabOnParagraph(model, paragraph, rawEvent, context) {
31418
31994
  var selectedSegments = paragraph.segments.filter(function (segment) { return segment.isSelected; });
31419
31995
  var isCollapsed = selectedSegments.length === 1 && selectedSegments[0].segmentType === 'SelectionMarker';
31420
- var isAllSelected = paragraph.segments.every(function (segment) { return segment.isSelected; });
31421
- if ((paragraph.segments[0].segmentType === 'SelectionMarker' && isCollapsed) || isAllSelected) {
31996
+ var isAllSelected = paragraph.segments.every(function (segment) {
31997
+ return segment.isSelected || (segment.segmentType == 'Text' && segment.text.trim().length == 0);
31998
+ });
31999
+ if (isAllSelected) {
31422
32000
  var _a = paragraph.format, marginLeft = _a.marginLeft, marginRight = _a.marginRight, direction = _a.direction;
31423
32001
  var isRtl = direction === 'rtl';
31424
32002
  if (rawEvent.shiftKey &&
@@ -31458,6 +32036,9 @@ function handleTabOnParagraph(model, paragraph, rawEvent, context) {
31458
32036
  (0, roosterjs_content_model_dom_1.mutateBlock)(paragraph).segments.splice(markerIndex, 0, tabText);
31459
32037
  }
31460
32038
  else {
32039
+ if (markerIndex <= 0) {
32040
+ return false;
32041
+ }
31461
32042
  var tabText = paragraph.segments[markerIndex - 1];
31462
32043
  var tabSpacesLength = tabSpaces.length;
31463
32044
  if (tabText.segmentType == 'Text') {
@@ -31675,19 +32256,23 @@ var roosterjs_content_model_dom_1 = __webpack_require__(/*! roosterjs-content-mo
31675
32256
  * Split the given paragraph from insert point into two paragraphs,
31676
32257
  * and move the selection marker to the beginning of the second paragraph
31677
32258
  * @param insertPoint The input insert point which includes the paragraph and selection marker
32259
+ * @param formatKeys The format that needs to be copied from the splitted paragraph, if not specified, some default format will be copied
31678
32260
  * @returns The new paragraph it created
31679
32261
  */
31680
32262
  function splitParagraph(insertPoint) {
31681
32263
  var _a;
31682
32264
  var paragraph = insertPoint.paragraph, marker = insertPoint.marker;
31683
- var newParagraph = (0, roosterjs_content_model_dom_1.createParagraph)(false /*isImplicit*/, paragraph.format, paragraph.segmentFormat);
32265
+ var newParagraph = (0, roosterjs_content_model_dom_1.createParagraph)(false /*isImplicit*/, {}, paragraph.segmentFormat);
32266
+ (0, roosterjs_content_model_dom_1.copyFormat)(newParagraph.format, paragraph.format, roosterjs_content_model_dom_1.ParagraphFormats);
31684
32267
  var markerIndex = paragraph.segments.indexOf(marker);
31685
32268
  var segments = paragraph.segments.splice(markerIndex, paragraph.segments.length - markerIndex);
31686
- if (paragraph.segments.length == 0) {
32269
+ (_a = newParagraph.segments).push.apply(_a, (0, tslib_1.__spreadArray)([], (0, tslib_1.__read)(segments), false));
32270
+ if (paragraph.segments.length == 0 && !paragraph.isImplicit) {
31687
32271
  paragraph.segments.push((0, roosterjs_content_model_dom_1.createBr)(marker.format));
31688
32272
  }
31689
- (_a = newParagraph.segments).push.apply(_a, (0, tslib_1.__spreadArray)([], (0, tslib_1.__read)(segments), false));
31690
- (0, roosterjs_content_model_dom_1.setParagraphNotImplicit)(paragraph);
32273
+ else if (paragraph.segments.length > 0) {
32274
+ (0, roosterjs_content_model_dom_1.setParagraphNotImplicit)(paragraph);
32275
+ }
31691
32276
  insertPoint.paragraph = newParagraph;
31692
32277
  (0, roosterjs_content_model_dom_1.normalizeParagraph)(paragraph);
31693
32278
  return newParagraph;
@@ -32301,9 +32886,6 @@ var ImageEditPlugin = /** @class */ (function () {
32301
32886
  ImageEditPlugin.prototype.removeImageEditing = function (clonedRoot) {
32302
32887
  var images = clonedRoot.querySelectorAll('img');
32303
32888
  images.forEach(function (image) {
32304
- if (image.dataset.isEditing) {
32305
- delete image.dataset.isEditing;
32306
- }
32307
32889
  if (image.dataset.editingInfo) {
32308
32890
  delete image.dataset.editingInfo;
32309
32891
  }
@@ -32374,8 +32956,11 @@ var ImageEditPlugin = /** @class */ (function () {
32374
32956
  };
32375
32957
  ImageEditPlugin.prototype.setContentHandler = function (editor) {
32376
32958
  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;
32959
+ if ((selection === null || selection === void 0 ? void 0 : selection.type) == 'image') {
32960
+ this.cleanInfo();
32961
+ (0, roosterjs_content_model_dom_1.setImageState)(selection.image, '');
32962
+ this.isEditing = false;
32963
+ this.isCropMode = false;
32379
32964
  }
32380
32965
  };
32381
32966
  ImageEditPlugin.prototype.formatEventHandler = function (event) {
@@ -32413,7 +32998,7 @@ var ImageEditPlugin = /** @class */ (function () {
32413
32998
  var result = false;
32414
32999
  if (shouldSelectImage ||
32415
33000
  (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) ||
33001
+ (previousSelectedImage === null || previousSelectedImage === void 0 ? void 0 : previousSelectedImage.image.format.imageState) == findEditingImage_1.EDITING_MARKER ||
32417
33002
  isApiOperation) {
32418
33003
  var _a = _this, lastSrc_1 = _a.lastSrc, selectedImage_1 = _a.selectedImage, imageEditInfo_1 = _a.imageEditInfo, clonedImage_1 = _a.clonedImage;
32419
33004
  if ((_this.isEditing || isApiOperation) &&
@@ -32426,7 +33011,7 @@ var ImageEditPlugin = /** @class */ (function () {
32426
33011
  (0, applyChange_1.applyChange)(editor, selectedImage_1, image, imageEditInfo_1, lastSrc_1, _this.wasImageResized || _this.isCropMode, clonedImage_1);
32427
33012
  image.isSelected = shouldSelectImage;
32428
33013
  image.isSelectedAsImageSelection = shouldSelectImage;
32429
- delete image.dataset.isEditing;
33014
+ image.format.imageState = undefined;
32430
33015
  if ((selection === null || selection === void 0 ? void 0 : selection.type) == 'range' && !selection.range.collapsed) {
32431
33016
  var selectedParagraphs = (0, roosterjs_content_model_dom_1.getSelectedParagraphs)(model, true);
32432
33017
  var isImageInRange = selectedParagraphs.some(function (paragraph) {
@@ -32454,7 +33039,7 @@ var ImageEditPlugin = /** @class */ (function () {
32454
33039
  (0, roosterjs_content_model_dom_1.mutateSegment)(editingImage.paragraph, editingImage.image, function (image) {
32455
33040
  editingImageModel = image;
32456
33041
  _this.imageEditInfo = (0, updateImageEditInfo_1.updateImageEditInfo)(image, selection.image);
32457
- image.dataset.isEditing = 'true';
33042
+ image.format.imageState = 'isEditing';
32458
33043
  });
32459
33044
  result = true;
32460
33045
  }
@@ -32465,7 +33050,7 @@ var ImageEditPlugin = /** @class */ (function () {
32465
33050
  if (!isApiOperation &&
32466
33051
  editingImageModel &&
32467
33052
  editingImageModel == model &&
32468
- editingImageModel.dataset.isEditing &&
33053
+ editingImageModel.format.imageState == findEditingImage_1.EDITING_MARKER &&
32469
33054
  (0, roosterjs_content_model_dom_1.isNodeOfType)(node, 'ELEMENT_NODE') &&
32470
33055
  (0, roosterjs_content_model_dom_1.isElementOfType)(node, 'img')) {
32471
33056
  if (isCropMode) {
@@ -33556,9 +34141,13 @@ exports.doubleCheckResize = doubleCheckResize;
33556
34141
  "use strict";
33557
34142
 
33558
34143
  Object.defineProperty(exports, "__esModule", ({ value: true }));
33559
- exports.findEditingImage = void 0;
34144
+ exports.findEditingImage = exports.EDITING_MARKER = void 0;
33560
34145
  var tslib_1 = __webpack_require__(/*! tslib */ "./node_modules/tslib/tslib.es6.mjs");
33561
34146
  var roosterjs_content_model_api_1 = __webpack_require__(/*! roosterjs-content-model-api */ "./packages/roosterjs-content-model-api/lib/index.ts");
34147
+ /**
34148
+ * @internal
34149
+ */
34150
+ exports.EDITING_MARKER = 'isEditing';
33562
34151
  /**
33563
34152
  * @internal
33564
34153
  */
@@ -33570,7 +34159,8 @@ function findEditingImage(group, imageId) {
33570
34159
  for (var _b = (0, tslib_1.__values)(paragraph.segments), _c = _b.next(); !_c.done; _c = _b.next()) {
33571
34160
  var segment = _c.value;
33572
34161
  if (segment.segmentType == 'Image' &&
33573
- ((imageId && segment.format.id == imageId) || segment.dataset.isEditing)) {
34162
+ ((imageId && segment.format.id == imageId) ||
34163
+ segment.format.imageState == exports.EDITING_MARKER)) {
33574
34164
  imageAndParagraph = { image: segment, paragraph: paragraph };
33575
34165
  return true;
33576
34166
  }
@@ -34688,15 +35278,17 @@ var addParser_1 = __webpack_require__(/*! ./utils/addParser */ "./packages/roost
34688
35278
  var roosterjs_content_model_dom_1 = __webpack_require__(/*! roosterjs-content-model-dom */ "./packages/roosterjs-content-model-dom/lib/index.ts");
34689
35279
  var chainSanitizerCallback_1 = __webpack_require__(/*! ./utils/chainSanitizerCallback */ "./packages/roosterjs-content-model-plugins/lib/paste/utils/chainSanitizerCallback.ts");
34690
35280
  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");
35281
+ var deprecatedColorParser_1 = __webpack_require__(/*! ./parsers/deprecatedColorParser */ "./packages/roosterjs-content-model-plugins/lib/paste/parsers/deprecatedColorParser.ts");
34692
35282
  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");
35283
+ var linkParser_1 = __webpack_require__(/*! ./parsers/linkParser */ "./packages/roosterjs-content-model-plugins/lib/paste/parsers/linkParser.ts");
35284
+ var pasteButtonProcessor_1 = __webpack_require__(/*! ./processors/pasteButtonProcessor */ "./packages/roosterjs-content-model-plugins/lib/paste/processors/pasteButtonProcessor.ts");
34694
35285
  var constants_1 = __webpack_require__(/*! ./pasteSourceValidations/constants */ "./packages/roosterjs-content-model-plugins/lib/paste/pasteSourceValidations/constants.ts");
34695
35286
  var processPastedContentFromExcel_1 = __webpack_require__(/*! ./Excel/processPastedContentFromExcel */ "./packages/roosterjs-content-model-plugins/lib/paste/Excel/processPastedContentFromExcel.ts");
34696
35287
  var processPastedContentFromOneNote_1 = __webpack_require__(/*! ./oneNote/processPastedContentFromOneNote */ "./packages/roosterjs-content-model-plugins/lib/paste/oneNote/processPastedContentFromOneNote.ts");
34697
35288
  var processPastedContentFromPowerPoint_1 = __webpack_require__(/*! ./PowerPoint/processPastedContentFromPowerPoint */ "./packages/roosterjs-content-model-plugins/lib/paste/PowerPoint/processPastedContentFromPowerPoint.ts");
34698
35289
  var processPastedContentFromWordDesktop_1 = __webpack_require__(/*! ./WordDesktop/processPastedContentFromWordDesktop */ "./packages/roosterjs-content-model-plugins/lib/paste/WordDesktop/processPastedContentFromWordDesktop.ts");
34699
35290
  var processPastedContentWacComponents_1 = __webpack_require__(/*! ./WacComponents/processPastedContentWacComponents */ "./packages/roosterjs-content-model-plugins/lib/paste/WacComponents/processPastedContentWacComponents.ts");
35291
+ var setProcessor_1 = __webpack_require__(/*! ./utils/setProcessor */ "./packages/roosterjs-content-model-plugins/lib/paste/utils/setProcessor.ts");
34700
35292
  /**
34701
35293
  * Paste plugin, handles BeforePaste event and reformat some special content, including:
34702
35294
  * 1. Content copied from Word
@@ -34757,11 +35349,11 @@ var PastePlugin = /** @class */ (function () {
34757
35349
  if (!event.domToModelOption) {
34758
35350
  return;
34759
35351
  }
34760
- var pasteSource = (0, getPasteSource_1.getPasteSource)(event, false);
35352
+ var pasteSource = (0, getPasteSource_1.getPasteSource)(event, false /* shouldConvertSingleImage */, this.editor.getEnvironment());
34761
35353
  var pasteType = event.pasteType;
34762
35354
  switch (pasteSource) {
34763
35355
  case 'wordDesktop':
34764
- (0, processPastedContentFromWordDesktop_1.processPastedContentFromWordDesktop)(event, this.editor.getDOMCreator());
35356
+ (0, processPastedContentFromWordDesktop_1.processPastedContentFromWordDesktop)(event);
34765
35357
  break;
34766
35358
  case 'wacComponents':
34767
35359
  (0, processPastedContentWacComponents_1.processPastedContentWacComponents)(event);
@@ -34788,6 +35380,7 @@ var PastePlugin = /** @class */ (function () {
34788
35380
  (0, addParser_1.addParser)(event.domToModelOption, 'tableCell', deprecatedColorParser_1.deprecatedBorderColorParser);
34789
35381
  (0, addParser_1.addParser)(event.domToModelOption, 'tableCell', tableBorderParser);
34790
35382
  (0, addParser_1.addParser)(event.domToModelOption, 'table', deprecatedColorParser_1.deprecatedBorderColorParser);
35383
+ (0, setProcessor_1.setProcessor)(event.domToModelOption, 'button', pasteButtonProcessor_1.pasteButtonProcessor);
34791
35384
  if (pasteType === 'mergeFormat') {
34792
35385
  (0, addParser_1.addParser)(event.domToModelOption, 'block', blockElementParser);
34793
35386
  (0, addParser_1.addParser)(event.domToModelOption, 'listLevel', blockElementParser);
@@ -34853,22 +35446,153 @@ function tableBorderParser(format, element) {
34853
35446
 
34854
35447
  Object.defineProperty(exports, "__esModule", ({ value: true }));
34855
35448
  exports.processPastedContentFromPowerPoint = void 0;
35449
+ var tslib_1 = __webpack_require__(/*! tslib */ "./node_modules/tslib/tslib.es6.mjs");
35450
+ var addParser_1 = __webpack_require__(/*! ../utils/addParser */ "./packages/roosterjs-content-model-plugins/lib/paste/utils/addParser.ts");
35451
+ var customListUtils_1 = __webpack_require__(/*! ../utils/customListUtils */ "./packages/roosterjs-content-model-plugins/lib/paste/utils/customListUtils.ts");
35452
+ var removeNegativeTextIndentParser_1 = __webpack_require__(/*! ../parsers/removeNegativeTextIndentParser */ "./packages/roosterjs-content-model-plugins/lib/paste/parsers/removeNegativeTextIndentParser.ts");
35453
+ var setProcessor_1 = __webpack_require__(/*! ../utils/setProcessor */ "./packages/roosterjs-content-model-plugins/lib/paste/utils/setProcessor.ts");
34856
35454
  var roosterjs_content_model_dom_1 = __webpack_require__(/*! roosterjs-content-model-dom */ "./packages/roosterjs-content-model-dom/lib/index.ts");
35455
+ var BulletSelector = '* > span > span[style*=mso-special-format]';
35456
+ var MsOfficeSpecialFormat = 'mso-special-format';
35457
+ var CssStyleKey = 'style';
35458
+ var MsoSpecialFormatRegex = /mso-special-format:\s*([^;]*)/;
35459
+ var clearListItemStyles = function (format) {
35460
+ delete format.textAlign;
35461
+ delete format.marginLeft;
35462
+ delete format.paddingLeft;
35463
+ };
34857
35464
  /**
34858
35465
  * @internal
34859
35466
  * Convert pasted content from PowerPoint
34860
35467
  * @param event The BeforePaste event
34861
35468
  */
34862
35469
  function processPastedContentFromPowerPoint(event, domCreator) {
34863
- var fragment = event.fragment, clipboardData = event.clipboardData;
35470
+ var fragment = event.fragment, clipboardData = event.clipboardData, domToModelOption = event.domToModelOption;
34864
35471
  if (clipboardData.html && !clipboardData.text && clipboardData.image) {
34865
35472
  // It is possible that PowerPoint copied both image and HTML but not plain text.
34866
35473
  // We always prefer HTML if any.
34867
35474
  var doc = domCreator.htmlToDOM(clipboardData.html);
34868
35475
  (0, roosterjs_content_model_dom_1.moveChildNodes)(fragment, doc === null || doc === void 0 ? void 0 : doc.body);
34869
35476
  }
35477
+ (0, addParser_1.addParser)(domToModelOption, 'block', removeNegativeTextIndentParser_1.removeNegativeTextIndentParser);
35478
+ (0, setProcessor_1.setProcessor)(domToModelOption, 'element', function (group, element, context) {
35479
+ var _a, _b;
35480
+ var style = element.getAttribute(CssStyleKey) || '';
35481
+ // If the element is the bullet element, just ignore it, otherwise we will see an extra bullet in the list
35482
+ if (style.includes(MsOfficeSpecialFormat) && context.listFormat.levels.length > 0) {
35483
+ return;
35484
+ }
35485
+ var bulletElement = element.querySelector(BulletSelector);
35486
+ if (bulletElement) {
35487
+ 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;
35488
+ // Setup the listformat with the metadata extracted from the bullet element
35489
+ (0, customListUtils_1.setupListFormat)(isOrderedList ? 'OL' : 'UL', element, context, depth, context.listFormat, group, [clearListItemStyles]);
35490
+ // Set the metadata for the list item, which will be used to set the correct bullet style type
35491
+ var listMetadata = {
35492
+ unorderedStyleType: !isOrderedList && unorderedBulletType
35493
+ ? roosterjs_content_model_dom_1.BulletListType[unorderedBulletType]
35494
+ : undefined,
35495
+ orderedStyleType: isOrderedList && orderedBulletType
35496
+ ? roosterjs_content_model_dom_1.NumberingListType[orderedBulletType]
35497
+ : undefined,
35498
+ };
35499
+ // Process the Div element as a list item.
35500
+ (0, customListUtils_1.processAsListItem)(context, element, group, listMetadata, function (listItem) {
35501
+ var _a;
35502
+ var currentMarkerSize = listItem.formatHolder.format.fontSize;
35503
+ var bulletElementSize = (_a = bulletElement.parentElement) === null || _a === void 0 ? void 0 : _a.style.fontSize;
35504
+ listItem.formatHolder.format.fontSize = bulletElementSize || currentMarkerSize;
35505
+ if (isNewList_1) {
35506
+ listItem.levels[listItem.levels.length - 1].format.startNumberOverride = parseInt(startNumberOverrideOrBullet_1);
35507
+ }
35508
+ clearListItemStyles(listItem.levels[listItem.levels.length - 1].format);
35509
+ clearListItemStyles(listItem.format);
35510
+ });
35511
+ }
35512
+ else {
35513
+ (_b = (_a = context.defaultElementProcessors).element) === null || _b === void 0 ? void 0 : _b.call(_a, group, element, context);
35514
+ }
35515
+ });
34870
35516
  }
34871
35517
  exports.processPastedContentFromPowerPoint = processPastedContentFromPowerPoint;
35518
+ /**
35519
+ * Extract list information from PowerPoint pasted content
35520
+ *
35521
+ * The lists from PowerPoint are represent as:
35522
+ *
35523
+ * - The class 0# represents the depth of the list, if the list is in the first level, the class attribute wont be present.
35524
+ * - The mso-special-format style represents the type of bullet and the start of the list.
35525
+ * The first part of the mso-special-format is the type of bullet, and the second part is the start of the list.
35526
+ * - 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.
35527
+ *
35528
+ * @example
35529
+ * ` <div class="O1" style="...">
35530
+ <span style="font-size: 5pt"
35531
+ ><span style="mso-special-format: 'numbullet6\,1'; font-family: +mj-lt"
35532
+ >i.</span
35533
+ ></span
35534
+ ><span style="...;">123</span>
35535
+ </div> `
35536
+ *
35537
+ * @param element The element to extract list information from
35538
+ * @param bulletElement The bullet element to extract list information from
35539
+ * @returns The extracted list information
35540
+ */
35541
+ function extractPowerPointListInfo(element, bulletElement) {
35542
+ var className = element.className.substring(1) || '0';
35543
+ var depth = parseInt(className) + 1;
35544
+ var style = bulletElement.getAttribute(CssStyleKey) || '';
35545
+ var msoSpecialFormat = style.match(MsoSpecialFormatRegex);
35546
+ var _a = (0, tslib_1.__read)((msoSpecialFormat === null || msoSpecialFormat === void 0 ? void 0 : msoSpecialFormat[1].replace('"', '').split('\\,')) || [], 2), bulletTypeHtml = _a[0], startNumberOverrideOrBullet = _a[1];
35547
+ var isOrderedList = OrderedListStyleMap.has(bulletTypeHtml);
35548
+ var unorderedBulletType = UnorderedBullets.get(bulletElement.innerText);
35549
+ var orderedBulletType = OrderedListStyleMap.get(bulletTypeHtml);
35550
+ return {
35551
+ depth: depth,
35552
+ unorderedBulletType: unorderedBulletType,
35553
+ orderedBulletType: orderedBulletType,
35554
+ startNumberOverrideOrBullet: startNumberOverrideOrBullet,
35555
+ isOrderedList: isOrderedList,
35556
+ isNewList: isOrderedList &&
35557
+ !!orderedBulletType &&
35558
+ bulletElement.innerText ===
35559
+ getPptListStart(orderedBulletType, startNumberOverrideOrBullet),
35560
+ };
35561
+ }
35562
+ var UnorderedBullets = new Map([
35563
+ ['•', 'Disc'],
35564
+ ['o', 'Circle'],
35565
+ ['§', 'Square'],
35566
+ ['q', 'BoxShadow'],
35567
+ ['v', 'Xrhombus'],
35568
+ ['Ø', 'ShortArrow'],
35569
+ ['ü', 'CheckMark'],
35570
+ ]);
35571
+ var OrderedListStyleMap = new Map([
35572
+ ['numbullet1', 'UpperAlpha'],
35573
+ ['numbullet2', 'DecimalParenthesis'],
35574
+ ['numbullet3', 'Decimal'],
35575
+ ['numbullet7', 'UpperRoman'],
35576
+ ['numbullet9', 'LowerAlphaParenthesis'],
35577
+ ['numbullet0', 'LowerAlpha'],
35578
+ ['numbullet6', 'LowerRoman'],
35579
+ ]);
35580
+ function getPptListStart(orderedBulletType, startNumberOverride) {
35581
+ var bullet = (0, roosterjs_content_model_dom_1.getOrderedListNumberStr)(roosterjs_content_model_dom_1.NumberingListType[orderedBulletType], parseInt(startNumberOverride));
35582
+ switch (orderedBulletType) {
35583
+ case 'Decimal':
35584
+ case 'UpperAlpha':
35585
+ case 'LowerAlpha':
35586
+ case 'UpperRoman':
35587
+ case 'LowerRoman':
35588
+ return bullet + '.';
35589
+ case 'DecimalParenthesis':
35590
+ case 'LowerAlphaParenthesis':
35591
+ return bullet + ')';
35592
+ default:
35593
+ return undefined;
35594
+ }
35595
+ }
34872
35596
 
34873
35597
 
34874
35598
  /***/ }),
@@ -35164,6 +35888,36 @@ exports.getStyleMetadata = void 0;
35164
35888
  var tslib_1 = __webpack_require__(/*! tslib */ "./node_modules/tslib/tslib.es6.mjs");
35165
35889
  var roosterjs_content_model_dom_1 = __webpack_require__(/*! roosterjs-content-model-dom */ "./packages/roosterjs-content-model-dom/lib/index.ts");
35166
35890
  var FORMATING_REGEX = /[\n\t'{}"]+/g;
35891
+ var STYLE_TAG = '<style';
35892
+ var STYLE_TAG_END = '</style>';
35893
+ var nonWordCharacterRegex = /\W/;
35894
+ function extractStyleTagsFromHtml(htmlContent) {
35895
+ var _a;
35896
+ var styles = [];
35897
+ var _b = extractHtmlIndexes(htmlContent), styleIndex = _b.styleIndex, styleEndIndex = _b.styleEndIndex;
35898
+ while (styleIndex >= 0 && styleEndIndex >= 0) {
35899
+ var styleContent = htmlContent
35900
+ .substring(styleIndex + STYLE_TAG.length, styleEndIndex)
35901
+ .trim();
35902
+ styles.push(styleContent);
35903
+ (_a = extractHtmlIndexes(htmlContent, styleEndIndex + 1), styleIndex = _a.styleIndex, styleEndIndex = _a.styleEndIndex);
35904
+ }
35905
+ return styles;
35906
+ }
35907
+ function extractHtmlIndexes(html, startIndex) {
35908
+ if (startIndex === void 0) { startIndex = 0; }
35909
+ var htmlLowercase = html.toLowerCase();
35910
+ var styleIndex = htmlLowercase.indexOf(STYLE_TAG, startIndex);
35911
+ var currentIndex = styleIndex + STYLE_TAG.length;
35912
+ var nextChar = html.substring(currentIndex, currentIndex + 1);
35913
+ while (!nonWordCharacterRegex.test(nextChar) && styleIndex > -1) {
35914
+ styleIndex = htmlLowercase.indexOf(STYLE_TAG, styleIndex + 1);
35915
+ currentIndex = styleIndex + STYLE_TAG.length;
35916
+ nextChar = html.substring(currentIndex, currentIndex + 1);
35917
+ }
35918
+ var styleEndIndex = htmlLowercase.indexOf(STYLE_TAG_END, startIndex);
35919
+ return { styleIndex: styleIndex, styleEndIndex: styleEndIndex };
35920
+ }
35167
35921
  /**
35168
35922
  * @internal
35169
35923
  * Word Desktop content has a style tag that contains data for the lists.
@@ -35184,12 +35938,10 @@ var FORMATING_REGEX = /[\n\t'{}"]+/g;
35184
35938
  * 5. Save data in record and only use the required information.
35185
35939
  *
35186
35940
  */
35187
- function getStyleMetadata(ev, domCreator) {
35941
+ function getStyleMetadata(ev) {
35188
35942
  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()) || '';
35943
+ var headStyles = extractStyleTagsFromHtml(ev.htmlBefore || ev.clipboardData.rawHtml || '');
35944
+ headStyles.forEach(function (text) {
35193
35945
  var index = 0;
35194
35946
  var _loop_1 = function () {
35195
35947
  var indexAt = text.indexOf('@', index + 1);
@@ -35256,7 +36008,7 @@ var getStyleMetadata_1 = __webpack_require__(/*! ./getStyleMetadata */ "./packag
35256
36008
  var getStyles_1 = __webpack_require__(/*! ../utils/getStyles */ "./packages/roosterjs-content-model-plugins/lib/paste/utils/getStyles.ts");
35257
36009
  var processWordComments_1 = __webpack_require__(/*! ./processWordComments */ "./packages/roosterjs-content-model-plugins/lib/paste/WordDesktop/processWordComments.ts");
35258
36010
  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");
36011
+ var removeNegativeTextIndentParser_1 = __webpack_require__(/*! ../parsers/removeNegativeTextIndentParser */ "./packages/roosterjs-content-model-plugins/lib/paste/parsers/removeNegativeTextIndentParser.ts");
35260
36012
  var setProcessor_1 = __webpack_require__(/*! ../utils/setProcessor */ "./packages/roosterjs-content-model-plugins/lib/paste/utils/setProcessor.ts");
35261
36013
  var PERCENTAGE_REGEX = /%/;
35262
36014
  // Default line height in browsers according to https://developer.mozilla.org/en-US/docs/Web/CSS/line-height#normal
@@ -35266,8 +36018,8 @@ var DEFAULT_BROWSER_LINE_HEIGHT_PERCENTAGE = 1.2;
35266
36018
  * Handles Pasted content when source is Word Desktop
35267
36019
  * @param ev BeforePasteEvent
35268
36020
  */
35269
- function processPastedContentFromWordDesktop(ev, domCreator) {
35270
- var metadataMap = (0, getStyleMetadata_1.getStyleMetadata)(ev, domCreator);
36021
+ function processPastedContentFromWordDesktop(ev) {
36022
+ var metadataMap = (0, getStyleMetadata_1.getStyleMetadata)(ev);
35271
36023
  (0, setProcessor_1.setProcessor)(ev.domToModelOption, 'element', wordDesktopElementProcessor(metadataMap));
35272
36024
  (0, addParser_1.addParser)(ev.domToModelOption, 'block', adjustPercentileLineHeight);
35273
36025
  (0, addParser_1.addParser)(ev.domToModelOption, 'block', removeNegativeTextIndentParser_1.removeNegativeTextIndentParser);
@@ -35295,12 +36047,12 @@ function adjustPercentileLineHeight(format, element) {
35295
36047
  (parsedLineHeight / 100)).toString();
35296
36048
  }
35297
36049
  }
35298
- function listLevelParser(format, element, context, defaultStyle) {
36050
+ var listLevelParser = function (format, element, _context, defaultStyle) {
35299
36051
  if (element.style.marginLeft != '') {
35300
36052
  format.marginLeft = defaultStyle.marginLeft;
35301
36053
  }
35302
36054
  format.marginBottom = undefined;
35303
- }
36055
+ };
35304
36056
  var wordTableParser = function (format) {
35305
36057
  var _a;
35306
36058
  if ((_a = format.marginLeft) === null || _a === void 0 ? void 0 : _a.startsWith('-')) {
@@ -35354,7 +36106,7 @@ exports.processWordComments = processWordComments;
35354
36106
  Object.defineProperty(exports, "__esModule", ({ value: true }));
35355
36107
  exports.processWordList = void 0;
35356
36108
  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");
36109
+ var customListUtils_1 = __webpack_require__(/*! ../utils/customListUtils */ "./packages/roosterjs-content-model-plugins/lib/paste/utils/customListUtils.ts");
35358
36110
  var roosterjs_content_model_dom_1 = __webpack_require__(/*! roosterjs-content-model-dom */ "./packages/roosterjs-content-model-dom/lib/index.ts");
35359
36111
  /** Word list metadata style name */
35360
36112
  var MSO_LIST = 'mso-list';
@@ -35394,28 +36146,28 @@ function processWordList(styles, group, element, context, metadata) {
35394
36146
  if (wordListStyle && group && typeof listFormat.wordLevel === 'number') {
35395
36147
  var wordLevel = listFormat.wordLevel, wordList = listFormat.wordList;
35396
36148
  // 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
36149
+ var listMetadata_1 = metadata.get(lNumber + ":" + level);
36150
+ 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
36151
  ? 'OL'
35400
36152
  : 'UL';
35401
36153
  // 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
- }
36154
+ (0, customListUtils_1.setupListFormat)(listType_1, element, context, wordLevel, listFormat, group, [
36155
+ wordListPaddingParser,
36156
+ ]);
35415
36157
  listFormat.levels[listFormat.levels.length - 1]
35416
36158
  .format.wordList = wordList;
35417
- listFormat.listParent = group;
35418
- processAsListItem(listFormat, context, element, group, listMetadata);
36159
+ var bullet = getBulletFromMetadata(listMetadata_1, listType_1);
36160
+ var listFormatMetadata = bullet
36161
+ ? {
36162
+ unorderedStyleType: listType_1 == 'UL' ? bullet : undefined,
36163
+ orderedStyleType: listType_1 == 'OL' ? bullet : undefined,
36164
+ }
36165
+ : undefined;
36166
+ (0, customListUtils_1.processAsListItem)(context, element, group, listFormatMetadata, function (listItem) {
36167
+ if (listType_1 == 'OL') {
36168
+ setStartNumber(listItem, context, listMetadata_1, element);
36169
+ }
36170
+ });
35419
36171
  if (listFormat.levels.length > 0 &&
35420
36172
  listFormat.wordKnownLevels.get(wordList) != listFormat.levels) {
35421
36173
  listFormat.wordKnownLevels.set(wordList, (0, tslib_1.__spreadArray)([], (0, tslib_1.__read)(listFormat.levels), false));
@@ -35425,28 +36177,6 @@ function processWordList(styles, group, element, context, metadata) {
35425
36177
  return false;
35426
36178
  }
35427
36179
  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
36180
  function getBulletFromMetadata(listMetadata, listType) {
35451
36181
  var templateType = (listMetadata === null || listMetadata === void 0 ? void 0 : listMetadata['mso-level-number-format']) || 'decimal';
35452
36182
  var templateFinal;
@@ -35493,15 +36223,7 @@ function getBulletFromMetadata(listMetadata, listType) {
35493
36223
  }
35494
36224
  return (0, roosterjs_content_model_dom_1.getListStyleTypeFromString)(listType, templateFinal);
35495
36225
  }
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
- function setStartNumber(listItem, context, listMetadata) {
36226
+ function setStartNumber(listItem, context, listMetadata, element) {
35505
36227
  var _a, _b;
35506
36228
  var _c = context.listFormat, listParent = _c.listParent, wordList = _c.wordList, wordKnownLevels = _c.wordKnownLevels, wordLevel = _c.wordLevel, levels = _c.levels;
35507
36229
  var block = getLastNotEmptyBlock(listParent);
@@ -35517,6 +36239,14 @@ function setStartNumber(listItem, context, listMetadata) {
35517
36239
  if (start != undefined && !isNaN(start) && knownLevel.length != levels.length) {
35518
36240
  listItem.levels[listItem.levels.length - 1].format.startNumberOverride = start;
35519
36241
  }
36242
+ else if ((0, roosterjs_content_model_dom_1.isElementOfType)(element, 'li') &&
36243
+ (0, roosterjs_content_model_dom_1.isNodeOfType)(element.parentElement, 'ELEMENT_NODE') &&
36244
+ (0, roosterjs_content_model_dom_1.isElementOfType)(element.parentElement, 'ol') &&
36245
+ element.parentElement.firstElementChild == element &&
36246
+ knownLevel.length != element.parentElement.start) {
36247
+ listItem.levels[listItem.levels.length - 1].format.startNumberOverride =
36248
+ element.parentElement.start;
36249
+ }
35520
36250
  }
35521
36251
  }
35522
36252
  function getLastNotEmptyBlock(listParent) {
@@ -35528,43 +36258,14 @@ function getLastNotEmptyBlock(listParent) {
35528
36258
  }
35529
36259
  return undefined;
35530
36260
  }
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
- });
36261
+ function wordListPaddingParser(format, element) {
36262
+ if (element.style.marginLeft && element.style.marginLeft != '0in') {
36263
+ format.paddingLeft = '0px';
35542
36264
  }
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;
36265
+ if (element.style.marginRight && element.style.marginRight != '0in') {
36266
+ format.paddingRight = '0px';
35565
36267
  }
35566
- };
35567
- exports.removeNegativeTextIndentParser = removeNegativeTextIndentParser;
36268
+ }
35568
36269
 
35569
36270
 
35570
36271
  /***/ }),
@@ -35691,6 +36392,98 @@ function ensureOneNoteListContext(cmContext) {
35691
36392
  }
35692
36393
 
35693
36394
 
36395
+ /***/ }),
36396
+
36397
+ /***/ "./packages/roosterjs-content-model-plugins/lib/paste/parsers/deprecatedColorParser.ts":
36398
+ /*!*********************************************************************************************!*\
36399
+ !*** ./packages/roosterjs-content-model-plugins/lib/paste/parsers/deprecatedColorParser.ts ***!
36400
+ \*********************************************************************************************/
36401
+ /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
36402
+
36403
+ "use strict";
36404
+
36405
+ Object.defineProperty(exports, "__esModule", ({ value: true }));
36406
+ exports.deprecatedBorderColorParser = void 0;
36407
+ var roosterjs_content_model_dom_1 = __webpack_require__(/*! roosterjs-content-model-dom */ "./packages/roosterjs-content-model-dom/lib/index.ts");
36408
+ /**
36409
+ * @internal
36410
+ */
36411
+ var deprecatedBorderColorParser = function (format) {
36412
+ roosterjs_content_model_dom_1.BorderKeys.forEach(function (key) {
36413
+ var value = format[key];
36414
+ var color = '';
36415
+ if (value &&
36416
+ roosterjs_content_model_dom_1.DeprecatedColors.some(function (dColor) { return value.indexOf(dColor) > -1 && (color = dColor); })) {
36417
+ var newValue = value.replace(color, '').trimRight();
36418
+ format[key] = newValue;
36419
+ }
36420
+ });
36421
+ };
36422
+ exports.deprecatedBorderColorParser = deprecatedBorderColorParser;
36423
+
36424
+
36425
+ /***/ }),
36426
+
36427
+ /***/ "./packages/roosterjs-content-model-plugins/lib/paste/parsers/linkParser.ts":
36428
+ /*!**********************************************************************************!*\
36429
+ !*** ./packages/roosterjs-content-model-plugins/lib/paste/parsers/linkParser.ts ***!
36430
+ \**********************************************************************************/
36431
+ /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
36432
+
36433
+ "use strict";
36434
+
36435
+ Object.defineProperty(exports, "__esModule", ({ value: true }));
36436
+ exports.parseLink = void 0;
36437
+ var roosterjs_content_model_dom_1 = __webpack_require__(/*! roosterjs-content-model-dom */ "./packages/roosterjs-content-model-dom/lib/index.ts");
36438
+ var SUPPORTED_PROTOCOLS = ['http:', 'https:', 'notes:', 'mailto:', 'onenote:'];
36439
+ var INVALID_LINKS_REGEX = /^file:\/\/\/[a-zA-Z\/]/i;
36440
+ /**
36441
+ * @internal
36442
+ */
36443
+ var parseLink = function (format, element) {
36444
+ if (!(0, roosterjs_content_model_dom_1.isElementOfType)(element, 'a')) {
36445
+ return;
36446
+ }
36447
+ var url;
36448
+ try {
36449
+ url = new URL(element.href);
36450
+ }
36451
+ catch (_a) {
36452
+ url = undefined;
36453
+ }
36454
+ if ((url && SUPPORTED_PROTOCOLS.indexOf(url.protocol) === -1) ||
36455
+ INVALID_LINKS_REGEX.test(element.href)) {
36456
+ element.removeAttribute('href');
36457
+ format.href = '';
36458
+ }
36459
+ };
36460
+ exports.parseLink = parseLink;
36461
+
36462
+
36463
+ /***/ }),
36464
+
36465
+ /***/ "./packages/roosterjs-content-model-plugins/lib/paste/parsers/removeNegativeTextIndentParser.ts":
36466
+ /*!******************************************************************************************************!*\
36467
+ !*** ./packages/roosterjs-content-model-plugins/lib/paste/parsers/removeNegativeTextIndentParser.ts ***!
36468
+ \******************************************************************************************************/
36469
+ /***/ ((__unused_webpack_module, exports) => {
36470
+
36471
+ "use strict";
36472
+
36473
+ Object.defineProperty(exports, "__esModule", ({ value: true }));
36474
+ exports.removeNegativeTextIndentParser = void 0;
36475
+ /**
36476
+ * @internal
36477
+ */
36478
+ var removeNegativeTextIndentParser = function (format) {
36479
+ var _a;
36480
+ if ((_a = format.textIndent) === null || _a === void 0 ? void 0 : _a.startsWith('-')) {
36481
+ delete format.textIndent;
36482
+ }
36483
+ };
36484
+ exports.removeNegativeTextIndentParser = removeNegativeTextIndentParser;
36485
+
36486
+
35694
36487
  /***/ }),
35695
36488
 
35696
36489
  /***/ "./packages/roosterjs-content-model-plugins/lib/paste/pasteSourceValidations/constants.ts":
@@ -35787,7 +36580,7 @@ var getSourceFunctions = new Map([
35787
36580
  * @param shouldConvertSingleImage Whether convert single image is enabled.
35788
36581
  * @returns The Type of pasted content, if no type found will return {KnownSourceType.Default}
35789
36582
  */
35790
- function getPasteSource(event, shouldConvertSingleImage) {
36583
+ function getPasteSource(event, shouldConvertSingleImage, environment) {
35791
36584
  var htmlAttributes = event.htmlAttributes, clipboardData = event.clipboardData, fragment = event.fragment;
35792
36585
  var result = null;
35793
36586
  var param = {
@@ -35795,6 +36588,7 @@ function getPasteSource(event, shouldConvertSingleImage) {
35795
36588
  fragment: fragment,
35796
36589
  shouldConvertSingleImage: shouldConvertSingleImage,
35797
36590
  clipboardData: clipboardData,
36591
+ environment: environment,
35798
36592
  };
35799
36593
  getSourceFunctions.forEach(function (func, key) {
35800
36594
  if (!result && func(param)) {
@@ -35995,9 +36789,14 @@ var WORD_PROG_ID = 'Word.Document';
35995
36789
  * @returns
35996
36790
  */
35997
36791
  var isWordDesktopDocument = function (props) {
35998
- var htmlAttributes = props.htmlAttributes;
36792
+ var _a;
36793
+ var htmlAttributes = props.htmlAttributes, clipboardData = props.clipboardData, environment = props.environment;
35999
36794
  return (htmlAttributes[WORD_ATTRIBUTE_NAME] == WORD_ATTRIBUTE_VALUE ||
36000
- htmlAttributes[constants_1.PastePropertyNames.PROG_ID_NAME] == WORD_PROG_ID);
36795
+ htmlAttributes[constants_1.PastePropertyNames.PROG_ID_NAME] == WORD_PROG_ID ||
36796
+ // Safari removes the metadata from the clipboard html, so we need to do this check.
36797
+ !!(environment.isSafari &&
36798
+ clipboardData.rawHtml &&
36799
+ ((_a = clipboardData.rawHtml) === null || _a === void 0 ? void 0 : _a.replace(/ /g, '').indexOf(WORD_ATTRIBUTE_NAME + "=\"" + WORD_ATTRIBUTE_VALUE)) > -1));
36001
36800
  };
36002
36801
  exports.isWordDesktopDocument = isWordDesktopDocument;
36003
36802
 
@@ -36031,6 +36830,52 @@ var shouldConvertToSingleImage = function (props) {
36031
36830
  exports.shouldConvertToSingleImage = shouldConvertToSingleImage;
36032
36831
 
36033
36832
 
36833
+ /***/ }),
36834
+
36835
+ /***/ "./packages/roosterjs-content-model-plugins/lib/paste/processors/pasteButtonProcessor.ts":
36836
+ /*!***********************************************************************************************!*\
36837
+ !*** ./packages/roosterjs-content-model-plugins/lib/paste/processors/pasteButtonProcessor.ts ***!
36838
+ \***********************************************************************************************/
36839
+ /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
36840
+
36841
+ "use strict";
36842
+
36843
+ Object.defineProperty(exports, "__esModule", ({ value: true }));
36844
+ exports.pasteButtonProcessor = void 0;
36845
+ var tslib_1 = __webpack_require__(/*! tslib */ "./node_modules/tslib/tslib.es6.mjs");
36846
+ var roosterjs_content_model_dom_1 = __webpack_require__(/*! roosterjs-content-model-dom */ "./packages/roosterjs-content-model-dom/lib/index.ts");
36847
+ /**
36848
+ * @internal
36849
+ * This processor is used to process <button> elements in the DOM and convert them into Content Model.
36850
+ * It handles the button element by creating a text segment for each text node within the button.
36851
+ */
36852
+ var pasteButtonProcessor = function (group, element, context) {
36853
+ var format = {};
36854
+ (0, roosterjs_content_model_dom_1.parseFormat)(element, context.formatParsers.segment, format, context);
36855
+ // Recursively process text nodes in the button
36856
+ processTextNodesRecursively(group, element, context, format);
36857
+ };
36858
+ exports.pasteButtonProcessor = pasteButtonProcessor;
36859
+ /**
36860
+ * Helper function to recursively iterate through nodes and process text nodes
36861
+ */
36862
+ function processTextNodesRecursively(group, node, context, format) {
36863
+ if (node.nodeType === Node.TEXT_NODE) {
36864
+ // Process text node directly
36865
+ var text = (0, roosterjs_content_model_dom_1.createText)(node.nodeValue || '', format);
36866
+ (0, roosterjs_content_model_dom_1.addSegment)(group, text);
36867
+ }
36868
+ else if ((0, roosterjs_content_model_dom_1.isNodeOfType)(node, 'ELEMENT_NODE')) {
36869
+ var newFormat = (0, tslib_1.__assign)({}, format);
36870
+ (0, roosterjs_content_model_dom_1.parseFormat)(node, context.formatParsers.segment, newFormat, context);
36871
+ // Recursively process all child nodes
36872
+ for (var i = 0; i < node.childNodes.length; i++) {
36873
+ processTextNodesRecursively(group, node.childNodes[i], context, newFormat);
36874
+ }
36875
+ }
36876
+ }
36877
+
36878
+
36034
36879
  /***/ }),
36035
36880
 
36036
36881
  /***/ "./packages/roosterjs-content-model-plugins/lib/paste/utils/addParser.ts":
@@ -36107,32 +36952,75 @@ exports.chainSanitizerCallback = chainSanitizerCallback;
36107
36952
 
36108
36953
  /***/ }),
36109
36954
 
36110
- /***/ "./packages/roosterjs-content-model-plugins/lib/paste/utils/deprecatedColorParser.ts":
36111
- /*!*******************************************************************************************!*\
36112
- !*** ./packages/roosterjs-content-model-plugins/lib/paste/utils/deprecatedColorParser.ts ***!
36113
- \*******************************************************************************************/
36955
+ /***/ "./packages/roosterjs-content-model-plugins/lib/paste/utils/customListUtils.ts":
36956
+ /*!*************************************************************************************!*\
36957
+ !*** ./packages/roosterjs-content-model-plugins/lib/paste/utils/customListUtils.ts ***!
36958
+ \*************************************************************************************/
36114
36959
  /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
36115
36960
 
36116
36961
  "use strict";
36117
36962
 
36118
36963
  Object.defineProperty(exports, "__esModule", ({ value: true }));
36119
- exports.deprecatedBorderColorParser = void 0;
36964
+ exports.processAsListItem = exports.setupListFormat = void 0;
36965
+ var removeNegativeTextIndentParser_1 = __webpack_require__(/*! ../parsers/removeNegativeTextIndentParser */ "./packages/roosterjs-content-model-plugins/lib/paste/parsers/removeNegativeTextIndentParser.ts");
36120
36966
  var roosterjs_content_model_dom_1 = __webpack_require__(/*! roosterjs-content-model-dom */ "./packages/roosterjs-content-model-dom/lib/index.ts");
36967
+ var removeMargin = function (format) {
36968
+ delete format.marginLeft;
36969
+ };
36121
36970
  /**
36122
36971
  * @internal
36123
36972
  */
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;
36973
+ function setupListFormat(listType, element, context, listDepth, listFormat, group, additionalParsers) {
36974
+ if (additionalParsers === void 0) { additionalParsers = []; }
36975
+ var newLevel = (0, roosterjs_content_model_dom_1.createListLevel)(listType);
36976
+ (0, roosterjs_content_model_dom_1.parseFormat)(element, context.formatParsers.listLevel, newLevel.format, context);
36977
+ (0, roosterjs_content_model_dom_1.parseFormat)(element, additionalParsers.concat(removeMargin), newLevel.format, context);
36978
+ // If the list format is in a different level, update the array so we get the new item
36979
+ // To be in the same level as the provided level metadata.
36980
+ if (listDepth > listFormat.levels.length) {
36981
+ while (listDepth != listFormat.levels.length) {
36982
+ listFormat.levels.push(newLevel);
36132
36983
  }
36133
- });
36984
+ }
36985
+ else {
36986
+ listFormat.levels.splice(listDepth, listFormat.levels.length - 1);
36987
+ listFormat.levels[listDepth - 1] = newLevel;
36988
+ }
36989
+ listFormat.listParent = group;
36990
+ }
36991
+ exports.setupListFormat = setupListFormat;
36992
+ /**
36993
+ * @internal
36994
+ */
36995
+ function processAsListItem(context, element, group, listFormatMetadata, beforeProcessingChildren) {
36996
+ var listFormat = context.listFormat;
36997
+ if (listFormatMetadata) {
36998
+ (0, roosterjs_content_model_dom_1.updateListMetadata)(listFormat.levels[listFormat.levels.length - 1], function (metadata) {
36999
+ return Object.assign({}, metadata, listFormatMetadata);
37000
+ });
37001
+ }
37002
+ var listItem = (0, roosterjs_content_model_dom_1.createListItem)(listFormat.levels, context.segmentFormat);
37003
+ (0, roosterjs_content_model_dom_1.parseFormat)(element, context.formatParsers.segmentOnBlock, context.segmentFormat, context);
37004
+ (0, roosterjs_content_model_dom_1.parseFormat)(element, context.formatParsers.listItemElement, listItem.format, context);
37005
+ (0, roosterjs_content_model_dom_1.parseFormat)(element, [removeNegativeTextIndentParser_1.removeNegativeTextIndentParser, nonListElementParser], listItem.format, context);
37006
+ beforeProcessingChildren === null || beforeProcessingChildren === void 0 ? void 0 : beforeProcessingChildren(listItem);
37007
+ context.elementProcessors.child(listItem, element, context);
37008
+ (0, roosterjs_content_model_dom_1.addBlock)(group, listItem);
37009
+ }
37010
+ exports.processAsListItem = processAsListItem;
37011
+ var nonListElementParser = function (format, element, _context, defaultStyle) {
37012
+ if (!(0, roosterjs_content_model_dom_1.isElementOfType)(element, 'li')) {
37013
+ Object.keys(defaultStyle).forEach(function (keyInput) {
37014
+ var key = keyInput;
37015
+ var formatKey = keyInput;
37016
+ if (key != 'display' &&
37017
+ format[formatKey] != undefined &&
37018
+ format[formatKey] == defaultStyle[key]) {
37019
+ delete format[formatKey];
37020
+ }
37021
+ });
37022
+ }
36134
37023
  };
36135
- exports.deprecatedBorderColorParser = deprecatedBorderColorParser;
36136
37024
 
36137
37025
 
36138
37026
  /***/ }),
@@ -36168,44 +37056,6 @@ function getStyles(element) {
36168
37056
  exports.getStyles = getStyles;
36169
37057
 
36170
37058
 
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
37059
  /***/ }),
36210
37060
 
36211
37061
  /***/ "./packages/roosterjs-content-model-plugins/lib/paste/utils/setProcessor.ts":
@@ -37233,6 +38083,7 @@ exports.setShortcutIndentationCommand = setShortcutIndentationCommand;
37233
38083
 
37234
38084
  Object.defineProperty(exports, "__esModule", ({ value: true }));
37235
38085
  exports.TableEditPlugin = void 0;
38086
+ var tslib_1 = __webpack_require__(/*! tslib */ "./node_modules/tslib/tslib.es6.mjs");
37236
38087
  var roosterjs_content_model_dom_1 = __webpack_require__(/*! roosterjs-content-model-dom */ "./packages/roosterjs-content-model-dom/lib/index.ts");
37237
38088
  var TableEditor_1 = __webpack_require__(/*! ./editors/TableEditor */ "./packages/roosterjs-content-model-plugins/lib/tableEdit/editors/TableEditor.ts");
37238
38089
  var TABLE_RESIZER_LENGTH = 12;
@@ -37247,12 +38098,15 @@ var TableEditPlugin = /** @class */ (function () {
37247
38098
  * If not specified, the plugin will be inserted in document.body
37248
38099
  * @param onTableEditorCreated An optional callback to customize the Table Editors elements when created.
37249
38100
  * @param disableFeatures An optional array of TableEditFeatures to disable
38101
+ * @param tableSelector A function to select the tables to be edited. By default, it selects all contentEditable tables.
37250
38102
  */
37251
- function TableEditPlugin(anchorContainerSelector, onTableEditorCreated, disableFeatures) {
38103
+ function TableEditPlugin(anchorContainerSelector, onTableEditorCreated, disableFeatures, tableSelector) {
37252
38104
  var _this = this;
38105
+ if (tableSelector === void 0) { tableSelector = defaultTableSelector; }
37253
38106
  this.anchorContainerSelector = anchorContainerSelector;
37254
38107
  this.onTableEditorCreated = onTableEditorCreated;
37255
38108
  this.disableFeatures = disableFeatures;
38109
+ this.tableSelector = tableSelector;
37256
38110
  this.editor = null;
37257
38111
  this.onMouseMoveDisposer = null;
37258
38112
  this.tableRectMap = null;
@@ -37283,12 +38137,13 @@ var TableEditPlugin = /** @class */ (function () {
37283
38137
  //Find table in range of mouse
37284
38138
  if (_this.tableRectMap) {
37285
38139
  for (var i = _this.tableRectMap.length - 1; i >= 0; i--) {
37286
- var _b = _this.tableRectMap[i], table = _b.table, rect = _b.rect;
38140
+ var entry = _this.tableRectMap[i];
38141
+ var rect = entry.rect;
37287
38142
  if (x >= rect.left - TABLE_RESIZER_LENGTH &&
37288
38143
  x <= rect.right + TABLE_RESIZER_LENGTH &&
37289
38144
  y >= rect.top - TABLE_RESIZER_LENGTH &&
37290
38145
  y <= rect.bottom + TABLE_RESIZER_LENGTH) {
37291
- currentTable = table;
38146
+ currentTable = entry;
37292
38147
  break;
37293
38148
  }
37294
38149
  }
@@ -37349,19 +38204,21 @@ var TableEditPlugin = /** @class */ (function () {
37349
38204
  };
37350
38205
  /**
37351
38206
  * @internal Public only for unit test
37352
- * @param table Table to use when setting the Editors
38207
+ * @param entry Table to use when setting the Editors
37353
38208
  * @param event (Optional) Mouse event
37354
38209
  */
37355
- TableEditPlugin.prototype.setTableEditor = function (table, event) {
37356
- if (this.tableEditor && !this.tableEditor.isEditing() && table != this.tableEditor.table) {
38210
+ TableEditPlugin.prototype.setTableEditor = function (entry, event) {
38211
+ if (this.tableEditor &&
38212
+ !this.tableEditor.isEditing() &&
38213
+ (entry === null || entry === void 0 ? void 0 : entry.table) != this.tableEditor.table) {
37357
38214
  this.disposeTableEditor();
37358
38215
  }
37359
- if (!this.tableEditor && table && this.editor && table.rows.length > 0) {
38216
+ if (!this.tableEditor && entry && this.editor && entry.table.rows.length > 0) {
37360
38217
  // anchorContainerSelector is used to specify the container to host the plugin, which can be outside of the editor's div
37361
38218
  var container = this.anchorContainerSelector
37362
38219
  ? this.editor.getDocument().querySelector(this.anchorContainerSelector)
37363
38220
  : undefined;
37364
- this.tableEditor = new TableEditor_1.TableEditor(this.editor, table, this.invalidateTableRects, (0, roosterjs_content_model_dom_1.isNodeOfType)(container, 'ELEMENT_NODE') ? container : undefined, event === null || event === void 0 ? void 0 : event.currentTarget, this.onTableEditorCreated, this.disableFeatures);
38221
+ this.tableEditor = new TableEditor_1.TableEditor(this.editor, entry.table, entry.logicalRoot, this.invalidateTableRects, (0, roosterjs_content_model_dom_1.isNodeOfType)(container, 'ELEMENT_NODE') ? container : undefined, event === null || event === void 0 ? void 0 : event.currentTarget, this.onTableEditorCreated, this.disableFeatures);
37365
38222
  }
37366
38223
  };
37367
38224
  TableEditPlugin.prototype.disposeTableEditor = function () {
@@ -37373,16 +38230,11 @@ var TableEditPlugin = /** @class */ (function () {
37373
38230
  var _this = this;
37374
38231
  if (!this.tableRectMap && this.editor) {
37375
38232
  this.tableRectMap = [];
37376
- var tables = this.editor.getDOMHelper().queryElements('table');
38233
+ var tables = this.tableSelector(this.editor.getDOMHelper());
37377
38234
  tables.forEach(function (table) {
37378
- if (table.isContentEditable) {
37379
- var rect = (0, roosterjs_content_model_dom_1.normalizeRect)(table.getBoundingClientRect());
37380
- if (rect && _this.tableRectMap) {
37381
- _this.tableRectMap.push({
37382
- table: table,
37383
- rect: rect,
37384
- });
37385
- }
38235
+ var rect = (0, roosterjs_content_model_dom_1.normalizeRect)(table.table.getBoundingClientRect());
38236
+ if (rect && _this.tableRectMap) {
38237
+ _this.tableRectMap.push((0, tslib_1.__assign)((0, tslib_1.__assign)({}, table), { rect: rect }));
37386
38238
  }
37387
38239
  });
37388
38240
  }
@@ -37390,6 +38242,15 @@ var TableEditPlugin = /** @class */ (function () {
37390
38242
  return TableEditPlugin;
37391
38243
  }());
37392
38244
  exports.TableEditPlugin = TableEditPlugin;
38245
+ function defaultTableSelector(domHelper) {
38246
+ return domHelper
38247
+ .queryElements('table')
38248
+ .filter(function (table) { return table.isContentEditable; })
38249
+ .map(function (table) { return ({
38250
+ table: table,
38251
+ logicalRoot: null,
38252
+ }); });
38253
+ }
37393
38254
 
37394
38255
 
37395
38256
  /***/ }),
@@ -37446,11 +38307,12 @@ var TOP_OR_SIDE;
37446
38307
  * When set a different current table or change current TD, we need to update these areas
37447
38308
  */
37448
38309
  var TableEditor = /** @class */ (function () {
37449
- function TableEditor(editor, table, onChanged, anchorContainer, contentDiv, onTableEditorCreated, disableFeatures) {
38310
+ function TableEditor(editor, table, logicalRoot, onChanged, anchorContainer, contentDiv, onTableEditorCreated, disableFeatures) {
37450
38311
  var _this = this;
37451
38312
  var _a;
37452
38313
  this.editor = editor;
37453
38314
  this.table = table;
38315
+ this.logicalRoot = logicalRoot;
37454
38316
  this.onChanged = onChanged;
37455
38317
  this.anchorContainer = anchorContainer;
37456
38318
  this.contentDiv = contentDiv;
@@ -37502,6 +38364,7 @@ var TableEditor = /** @class */ (function () {
37502
38364
  _this.onStartResize();
37503
38365
  };
37504
38366
  this.onStartTableMove = function () {
38367
+ _this.onBeforeEditTable();
37505
38368
  _this.isCurrentlyEditing = true;
37506
38369
  _this.disposeTableResizer();
37507
38370
  _this.disposeTableInserter();
@@ -37513,7 +38376,10 @@ var TableEditor = /** @class */ (function () {
37513
38376
  }
37514
38377
  return _this.onFinishEditing();
37515
38378
  };
37516
- this.onInserted = function () {
38379
+ this.onBeforeEditTable = function () {
38380
+ _this.editor.setLogicalRoot(_this.logicalRoot);
38381
+ };
38382
+ this.onAfterInsert = function () {
37517
38383
  _this.disposeTableResizer();
37518
38384
  _this.onFinishEditing();
37519
38385
  };
@@ -37680,7 +38546,7 @@ var TableEditor = /** @class */ (function () {
37680
38546
  this.disposeTableInserter();
37681
38547
  }
37682
38548
  if (!this.horizontalInserter && !this.verticalInserter && td) {
37683
- var newInserter = (0, TableInserter_1.createTableInserter)(this.editor, td, this.table, this.isRTL, !!isHorizontal, this.onInserted, this.anchorContainer, this.onEditorCreated);
38549
+ var newInserter = (0, TableInserter_1.createTableInserter)(this.editor, td, this.table, this.isRTL, !!isHorizontal, this.onBeforeEditTable, this.onAfterInsert, this.anchorContainer, this.onEditorCreated);
37684
38550
  if (isHorizontal) {
37685
38551
  this.horizontalInserter = newInserter;
37686
38552
  }
@@ -37722,6 +38588,7 @@ var TableEditor = /** @class */ (function () {
37722
38588
  }
37723
38589
  };
37724
38590
  TableEditor.prototype.onStartResize = function () {
38591
+ this.onBeforeEditTable();
37725
38592
  this.isCurrentlyEditing = true;
37726
38593
  var range = this.editor.getDOMSelection();
37727
38594
  if (range && range.type == 'range') {
@@ -38002,7 +38869,7 @@ exports.VERTICAL_INSERTER_ID = 'verticalInserter';
38002
38869
  /**
38003
38870
  * @internal
38004
38871
  */
38005
- function createTableInserter(editor, td, table, isRTL, isHorizontal, onInsert, anchorContainer, onTableEditorCreated) {
38872
+ function createTableInserter(editor, td, table, isRTL, isHorizontal, onBeforeInsert, onAfterInserted, anchorContainer, onTableEditorCreated) {
38006
38873
  var tdRect = (0, roosterjs_content_model_dom_1.normalizeRect)(td.getBoundingClientRect());
38007
38874
  var viewPort = editor.getVisibleViewport();
38008
38875
  var tableRect = table && viewPort ? (0, getIntersectedRect_1.getIntersectedRect)([table], [viewPort]) : null;
@@ -38028,7 +38895,7 @@ function createTableInserter(editor, td, table, isRTL, isHorizontal, onInsert, a
38028
38895
  div.firstChild.style.height = tableRect.bottom - tableRect.top + "px";
38029
38896
  }
38030
38897
  (anchorContainer || document_1.body).appendChild(div);
38031
- var handler = new TableInsertHandler(div, td, table, isHorizontal, editor, onInsert, onTableEditorCreated);
38898
+ var handler = new TableInsertHandler(div, td, table, isHorizontal, editor, onBeforeInsert, onAfterInserted, onTableEditorCreated);
38032
38899
  return { div: div, featureHandler: handler, node: td };
38033
38900
  }
38034
38901
  return null;
@@ -38039,14 +38906,15 @@ exports.createTableInserter = createTableInserter;
38039
38906
  * Exported for test only
38040
38907
  */
38041
38908
  var TableInsertHandler = /** @class */ (function () {
38042
- function TableInsertHandler(div, td, table, isHorizontal, editor, onInsert, onTableEditorCreated) {
38909
+ function TableInsertHandler(div, td, table, isHorizontal, editor, onBeforeInsert, onAfterInsert, onTableEditorCreated) {
38043
38910
  var _this = this;
38044
38911
  this.div = div;
38045
38912
  this.td = td;
38046
38913
  this.table = table;
38047
38914
  this.isHorizontal = isHorizontal;
38048
38915
  this.editor = editor;
38049
- this.onInsert = onInsert;
38916
+ this.onBeforeInsert = onBeforeInsert;
38917
+ this.onAfterInsert = onAfterInsert;
38050
38918
  this.insertTd = function () {
38051
38919
  // Get cell coordinates
38052
38920
  var columnIndex = _this.td.cellIndex;
@@ -38057,6 +38925,7 @@ var TableInsertHandler = /** @class */ (function () {
38057
38925
  if ((row === null || row === void 0 ? void 0 : row.cells) == undefined || rowIndex == undefined) {
38058
38926
  return;
38059
38927
  }
38928
+ _this.onBeforeInsert();
38060
38929
  // Insert row or column
38061
38930
  (0, roosterjs_content_model_api_1.formatTableWithContentModel)(_this.editor, 'editTablePlugin', function (tableModel) {
38062
38931
  _this.isHorizontal
@@ -38071,7 +38940,7 @@ var TableInsertHandler = /** @class */ (function () {
38071
38940
  lastRow: rowIndex,
38072
38941
  table: _this.table,
38073
38942
  });
38074
- _this.onInsert();
38943
+ _this.onAfterInsert();
38075
38944
  };
38076
38945
  this.div.addEventListener('click', this.insertTd);
38077
38946
  this.disposer = onTableEditorCreated === null || onTableEditorCreated === void 0 ? void 0 : onTableEditorCreated(isHorizontal ? 'HorizontalTableInserter' : 'VerticalTableInserter', div);
@@ -38737,7 +39606,7 @@ var WatermarkPlugin = /** @class */ (function () {
38737
39606
  this.isShowing = true;
38738
39607
  };
38739
39608
  WatermarkPlugin.prototype.applyWatermarkStyle = function (editor) {
38740
- var rule = "position: absolute; pointer-events: none; content: \"" + this.watermark + "\";";
39609
+ var rule = "position: absolute; pointer-events: none; margin-inline-start: 1px; content: \"" + this.watermark + "\";";
38741
39610
  var format = (0, tslib_1.__assign)((0, tslib_1.__assign)({}, this.format), { textColor: editor.isDarkMode() ? this.darkTextColor : this.format.textColor });
38742
39611
  (0, roosterjs_content_model_dom_1.getObjectKeys)(styleMap).forEach(function (x) {
38743
39612
  if (format[x]) {