roosterjs 9.54.0 → 9.56.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/rooster.js CHANGED
@@ -6752,7 +6752,7 @@ var formatSegmentWithContentModel_1 = __webpack_require__(/*! ../utils/formatSeg
6752
6752
  */
6753
6753
  function changeCapitalization(editor, capitalization, language) {
6754
6754
  editor.focus();
6755
- (0, formatSegmentWithContentModel_1.formatSegmentWithContentModel)(editor, 'changeCapitalization', function (_, __, segment) {
6755
+ (0, formatSegmentWithContentModel_1.formatSegmentWithContentModel)(editor, 'changeCapitalization', function (_, __, segment, paragraph) {
6756
6756
  if ((segment === null || segment === void 0 ? void 0 : segment.segmentType) == 'Text') {
6757
6757
  switch (capitalization) {
6758
6758
  case 'lowerCase':
@@ -6763,7 +6763,13 @@ function changeCapitalization(editor, capitalization, language) {
6763
6763
  break;
6764
6764
  case 'capitalize':
6765
6765
  var wordArray = segment.text.toLocaleLowerCase(language).split(' ');
6766
- for (var i = 0; i < wordArray.length; i++) {
6766
+ // When a collapsed selection is in the middle of a word, the word is split
6767
+ // into multiple text segments around the selection marker. In that case the
6768
+ // first segment of the word continues from a previous segment, so its first
6769
+ // word must not be capitalized to avoid results like "HeLlo" for "he|llo".
6770
+ var precedingChar = getPrecedingCharacter(paragraph, segment);
6771
+ var startIndex = precedingChar && precedingChar != ' ' ? 1 : 0;
6772
+ for (var i = startIndex; i < wordArray.length; i++) {
6767
6773
  wordArray[i] =
6768
6774
  wordArray[i].charAt(0).toLocaleUpperCase(language) +
6769
6775
  wordArray[i].slice(1);
@@ -6787,6 +6793,30 @@ function changeCapitalization(editor, capitalization, language) {
6787
6793
  });
6788
6794
  }
6789
6795
  exports.changeCapitalization = changeCapitalization;
6796
+ /**
6797
+ * Get the character immediately preceding the given segment within its paragraph, skipping
6798
+ * selection markers (which carry no text). Returns an empty string if there is no preceding
6799
+ * text character (e.g. the segment starts the paragraph or follows a non-text segment).
6800
+ */
6801
+ function getPrecedingCharacter(paragraph, segment) {
6802
+ if (!paragraph) {
6803
+ return '';
6804
+ }
6805
+ var index = paragraph.segments.indexOf(segment);
6806
+ for (var i = index - 1; i >= 0; i--) {
6807
+ var previous = paragraph.segments[i];
6808
+ if (previous.segmentType == 'SelectionMarker') {
6809
+ continue;
6810
+ }
6811
+ else if (previous.segmentType == 'Text' && previous.text.length > 0) {
6812
+ return previous.text[previous.text.length - 1];
6813
+ }
6814
+ else {
6815
+ break;
6816
+ }
6817
+ }
6818
+ return '';
6819
+ }
6790
6820
 
6791
6821
 
6792
6822
  /***/ },
@@ -9349,21 +9379,11 @@ exports.generatePasteOptionFromPlugins = generatePasteOptionFromPlugins;
9349
9379
  "use strict";
9350
9380
 
9351
9381
  Object.defineProperty(exports, "__esModule", ({ value: true }));
9352
- exports.mergePasteContent = exports.cloneModelForPaste = void 0;
9382
+ exports.mergePasteContent = void 0;
9353
9383
  var tslib_1 = __webpack_require__(/*! tslib */ "./node_modules/tslib/tslib.es6.mjs");
9354
9384
  var createDomToModelContextForSanitizing_1 = __webpack_require__(/*! ../createModelFromHtml/createDomToModelContextForSanitizing */ "./packages/roosterjs-content-model-core/lib/command/createModelFromHtml/createDomToModelContextForSanitizing.ts");
9355
9385
  var roosterjs_content_model_dom_1 = __webpack_require__(/*! roosterjs-content-model-dom */ "./packages/roosterjs-content-model-dom/lib/index.ts");
9356
9386
  var BlackColor = 'rgb(0,0,0)';
9357
- var CloneOption = {
9358
- includeCachedElement: function (node, type) { return (type == 'cache' ? undefined : node); },
9359
- };
9360
- /**
9361
- * @internal
9362
- */
9363
- function cloneModelForPaste(model) {
9364
- return (0, roosterjs_content_model_dom_1.cloneModel)(model, CloneOption);
9365
- }
9366
- exports.cloneModelForPaste = cloneModelForPaste;
9367
9387
  /**
9368
9388
  * @internal
9369
9389
  */
@@ -9371,7 +9391,7 @@ function mergePasteContent(editor, eventResult, isFirstPaste) {
9371
9391
  var fragment = eventResult.fragment, domToModelOption = eventResult.domToModelOption, customizedMerge = eventResult.customizedMerge, pasteType = eventResult.pasteType, clipboardData = eventResult.clipboardData, containsBlockElements = eventResult.containsBlockElements;
9372
9392
  editor.formatContentModel(function (model, context) {
9373
9393
  if (!isFirstPaste && clipboardData.modelBeforePaste) {
9374
- var clonedModel = cloneModelForPaste(clipboardData.modelBeforePaste);
9394
+ var clonedModel = (0, roosterjs_content_model_dom_1.cloneModelForPaste)(clipboardData.modelBeforePaste);
9375
9395
  model.blocks = clonedModel.blocks;
9376
9396
  }
9377
9397
  var domToModelContext = (0, createDomToModelContextForSanitizing_1.createDomToModelContextForSanitizing)(editor.getDocument(), undefined /*defaultFormat*/, editor.getEnvironment().domToModelSettings.customized, domToModelOption, editor.getDOMHelper());
@@ -9450,10 +9470,11 @@ function getLastSegmentFormat(pasteModel) {
9450
9470
  Object.defineProperty(exports, "__esModule", ({ value: true }));
9451
9471
  exports.paste = void 0;
9452
9472
  var cleanHtmlComments_1 = __webpack_require__(/*! ./cleanHtmlComments */ "./packages/roosterjs-content-model-core/lib/command/paste/cleanHtmlComments.ts");
9453
- var mergePasteContent_1 = __webpack_require__(/*! ./mergePasteContent */ "./packages/roosterjs-content-model-core/lib/command/paste/mergePasteContent.ts");
9473
+ var roosterjs_content_model_dom_1 = __webpack_require__(/*! roosterjs-content-model-dom */ "./packages/roosterjs-content-model-dom/lib/index.ts");
9454
9474
  var convertInlineCss_1 = __webpack_require__(/*! ../createModelFromHtml/convertInlineCss */ "./packages/roosterjs-content-model-core/lib/command/createModelFromHtml/convertInlineCss.ts");
9455
9475
  var createPasteFragment_1 = __webpack_require__(/*! ./createPasteFragment */ "./packages/roosterjs-content-model-core/lib/command/paste/createPasteFragment.ts");
9456
9476
  var generatePasteOptionFromPlugins_1 = __webpack_require__(/*! ./generatePasteOptionFromPlugins */ "./packages/roosterjs-content-model-core/lib/command/paste/generatePasteOptionFromPlugins.ts");
9477
+ var mergePasteContent_1 = __webpack_require__(/*! ./mergePasteContent */ "./packages/roosterjs-content-model-core/lib/command/paste/mergePasteContent.ts");
9457
9478
  var retrieveHtmlInfo_1 = __webpack_require__(/*! ./retrieveHtmlInfo */ "./packages/roosterjs-content-model-core/lib/command/paste/retrieveHtmlInfo.ts");
9458
9479
  /**
9459
9480
  * Paste into editor using a clipboardData object
@@ -9469,7 +9490,7 @@ function paste(editor, clipboardData, pasteTypeOrGetter) {
9469
9490
  if (!clipboardData.modelBeforePaste) {
9470
9491
  isFirstPaste = true;
9471
9492
  editor.formatContentModel(function (model) {
9472
- clipboardData.modelBeforePaste = (0, mergePasteContent_1.cloneModelForPaste)(model);
9493
+ clipboardData.modelBeforePaste = (0, roosterjs_content_model_dom_1.cloneModelForPaste)(model);
9473
9494
  return false;
9474
9495
  });
9475
9496
  }
@@ -12754,7 +12775,7 @@ var CopyPastePlugin = /** @class */ (function () {
12754
12775
  var dataTransfer = event.clipboardData;
12755
12776
  if (shouldPreventDefaultPaste(dataTransfer, editor_1)) {
12756
12777
  event.preventDefault();
12757
- (0, roosterjs_content_model_dom_1.extractClipboardItems)((0, roosterjs_content_model_dom_1.toArray)(dataTransfer.items), _this.state.allowedCustomPasteType).then(function (clipboardData) {
12778
+ (0, roosterjs_content_model_dom_1.extractClipboardItems)((0, roosterjs_content_model_dom_1.toArray)(dataTransfer.items), _this.state.allowedCustomPasteType, true /* isPasteNative */).then(function (clipboardData) {
12758
12779
  if (!editor_1.isDisposed()) {
12759
12780
  (0, paste_1.paste)(editor_1, clipboardData, _this.state.defaultPasteType);
12760
12781
  }
@@ -16791,6 +16812,8 @@ function createAriaLiveElement(document) {
16791
16812
  div.style.height = '1px';
16792
16813
  div.style.overflow = 'hidden';
16793
16814
  div.style.position = 'absolute';
16815
+ div.style.top = '0';
16816
+ div.style.left = '0';
16794
16817
  div.style.whiteSpace = 'nowrap';
16795
16818
  div.style.width = '1px';
16796
16819
  div.ariaLive = 'assertive';
@@ -17592,6 +17615,9 @@ function createDomToModelDecoratorContext() {
17592
17615
  code: {
17593
17616
  format: {},
17594
17617
  },
17618
+ data: {
17619
+ format: {},
17620
+ },
17595
17621
  blockDecorator: {
17596
17622
  format: {},
17597
17623
  tagName: '',
@@ -17663,6 +17689,7 @@ exports.defaultProcessorMap = void 0;
17663
17689
  var brProcessor_1 = __webpack_require__(/*! ../processors/brProcessor */ "./packages/roosterjs-content-model-dom/lib/domToModel/processors/brProcessor.ts");
17664
17690
  var childProcessor_1 = __webpack_require__(/*! ../processors/childProcessor */ "./packages/roosterjs-content-model-dom/lib/domToModel/processors/childProcessor.ts");
17665
17691
  var codeProcessor_1 = __webpack_require__(/*! ../processors/codeProcessor */ "./packages/roosterjs-content-model-dom/lib/domToModel/processors/codeProcessor.ts");
17692
+ var dataProcessor_1 = __webpack_require__(/*! ../processors/dataProcessor */ "./packages/roosterjs-content-model-dom/lib/domToModel/processors/dataProcessor.ts");
17666
17693
  var delimiterProcessor_1 = __webpack_require__(/*! ../processors/delimiterProcessor */ "./packages/roosterjs-content-model-dom/lib/domToModel/processors/delimiterProcessor.ts");
17667
17694
  var elementProcessor_1 = __webpack_require__(/*! ../processors/elementProcessor */ "./packages/roosterjs-content-model-dom/lib/domToModel/processors/elementProcessor.ts");
17668
17695
  var entityProcessor_1 = __webpack_require__(/*! ../processors/entityProcessor */ "./packages/roosterjs-content-model-dom/lib/domToModel/processors/entityProcessor.ts");
@@ -17689,6 +17716,7 @@ exports.defaultProcessorMap = {
17689
17716
  blockquote: knownElementProcessor_1.knownElementProcessor,
17690
17717
  br: brProcessor_1.brProcessor,
17691
17718
  code: codeProcessor_1.codeProcessor,
17719
+ data: dataProcessor_1.dataProcessor,
17692
17720
  dd: formatContainerProcessor_1.formatContainerProcessor,
17693
17721
  del: knownElementProcessor_1.knownElementProcessor,
17694
17722
  div: knownElementProcessor_1.knownElementProcessor,
@@ -17944,6 +17972,33 @@ var codeProcessor = function (group, element, context) {
17944
17972
  exports.codeProcessor = codeProcessor;
17945
17973
 
17946
17974
 
17975
+ /***/ },
17976
+
17977
+ /***/ "./packages/roosterjs-content-model-dom/lib/domToModel/processors/dataProcessor.ts"
17978
+ /*!*****************************************************************************************!*\
17979
+ !*** ./packages/roosterjs-content-model-dom/lib/domToModel/processors/dataProcessor.ts ***!
17980
+ \*****************************************************************************************/
17981
+ (__unused_webpack_module, exports, __webpack_require__) {
17982
+
17983
+ "use strict";
17984
+
17985
+ Object.defineProperty(exports, "__esModule", ({ value: true }));
17986
+ exports.dataProcessor = void 0;
17987
+ var knownElementProcessor_1 = __webpack_require__(/*! ./knownElementProcessor */ "./packages/roosterjs-content-model-dom/lib/domToModel/processors/knownElementProcessor.ts");
17988
+ var parseFormat_1 = __webpack_require__(/*! ../utils/parseFormat */ "./packages/roosterjs-content-model-dom/lib/domToModel/utils/parseFormat.ts");
17989
+ var stackFormat_1 = __webpack_require__(/*! ../utils/stackFormat */ "./packages/roosterjs-content-model-dom/lib/domToModel/utils/stackFormat.ts");
17990
+ /**
17991
+ * @internal
17992
+ */
17993
+ var dataProcessor = function (group, element, context) {
17994
+ (0, stackFormat_1.stackFormat)(context, { data: 'empty' }, function () {
17995
+ (0, parseFormat_1.parseFormat)(element, context.formatParsers.data, context.data.format, context);
17996
+ (0, knownElementProcessor_1.knownElementProcessor)(group, element, context);
17997
+ });
17998
+ };
17999
+ exports.dataProcessor = dataProcessor;
18000
+
18001
+
17947
18002
  /***/ },
17948
18003
 
17949
18004
  /***/ "./packages/roosterjs-content-model-dom/lib/domToModel/processors/delimiterProcessor.ts"
@@ -19382,13 +19437,14 @@ var SkippedStylesForTable = [
19382
19437
  * @internal
19383
19438
  */
19384
19439
  function stackFormat(context, options, callback) {
19385
- var segmentFormat = context.segmentFormat, blockFormat = context.blockFormat, linkFormat = context.link, codeFormat = context.code, decoratorFormat = context.blockDecorator;
19386
- var segment = options.segment, paragraph = options.paragraph, link = options.link, code = options.code, blockDecorator = options.blockDecorator;
19440
+ var segmentFormat = context.segmentFormat, blockFormat = context.blockFormat, linkFormat = context.link, codeFormat = context.code, dataFormat = context.data, decoratorFormat = context.blockDecorator;
19441
+ var segment = options.segment, paragraph = options.paragraph, link = options.link, code = options.code, data = options.data, blockDecorator = options.blockDecorator;
19387
19442
  try {
19388
19443
  context.segmentFormat = stackFormatInternal(segmentFormat, segment);
19389
19444
  context.blockFormat = stackFormatInternal(blockFormat, paragraph);
19390
19445
  context.link = stackLinkInternal(linkFormat, link);
19391
19446
  context.code = stackCodeInternal(codeFormat, code);
19447
+ context.data = stackDataInternal(dataFormat, data);
19392
19448
  context.blockDecorator = stackDecoratorInternal(decoratorFormat, blockDecorator);
19393
19449
  callback();
19394
19450
  }
@@ -19397,6 +19453,7 @@ function stackFormat(context, options, callback) {
19397
19453
  context.blockFormat = blockFormat;
19398
19454
  context.link = linkFormat;
19399
19455
  context.code = codeFormat;
19456
+ context.data = dataFormat;
19400
19457
  context.blockDecorator = decoratorFormat;
19401
19458
  }
19402
19459
  }
@@ -19439,6 +19496,16 @@ function stackCodeInternal(codeFormat, code) {
19439
19496
  return codeFormat;
19440
19497
  }
19441
19498
  }
19499
+ function stackDataInternal(dataFormat, data) {
19500
+ switch (data) {
19501
+ case 'empty':
19502
+ return {
19503
+ format: {},
19504
+ };
19505
+ default:
19506
+ return dataFormat;
19507
+ }
19508
+ }
19442
19509
  function stackDecoratorInternal(format, decorator) {
19443
19510
  switch (decorator) {
19444
19511
  case 'empty':
@@ -19774,7 +19841,7 @@ var ContentHandlers = (_a = {},
19774
19841
  * @param allowedCustomPasteType Allowed custom content type when paste besides text/plain, text/html and images
19775
19842
  Only text types are supported, and do not add "text/" prefix to the type values
19776
19843
  */
19777
- function extractClipboardItems(items, allowedCustomPasteType) {
19844
+ function extractClipboardItems(items, allowedCustomPasteType, isPasteNative) {
19778
19845
  var data = {
19779
19846
  types: [],
19780
19847
  text: '',
@@ -19782,7 +19849,7 @@ function extractClipboardItems(items, allowedCustomPasteType) {
19782
19849
  files: [],
19783
19850
  rawHtml: null,
19784
19851
  customValues: {},
19785
- pasteNativeEvent: true,
19852
+ pasteNativeEvent: !!isPasteNative,
19786
19853
  };
19787
19854
  return Promise.all((items || []).map(function (item) {
19788
19855
  var type = item.type;
@@ -20723,6 +20790,7 @@ function pruneUnselectedModel(model) {
20723
20790
  exports.pruneUnselectedModel = pruneUnselectedModel;
20724
20791
  function pruneUnselectedModelInternal(model, isSelectionAfterElement) {
20725
20792
  var e_1, _a, _b;
20793
+ var _c;
20726
20794
  for (var index = model.blocks.length - 1; index >= 0; index--) {
20727
20795
  var block = model.blocks[index];
20728
20796
  switch (block.blockType) {
@@ -20746,15 +20814,17 @@ function pruneUnselectedModelInternal(model, isSelectionAfterElement) {
20746
20814
  case 'Paragraph':
20747
20815
  var newSegments = [];
20748
20816
  try {
20749
- for (var _c = (e_1 = void 0, (0, tslib_1.__values)(block.segments)), _d = _c.next(); !_d.done; _d = _c.next()) {
20750
- var segment = _d.value;
20817
+ for (var _d = (e_1 = void 0, (0, tslib_1.__values)(block.segments)), _e = _d.next(); !_e.done; _e = _d.next()) {
20818
+ var segment = _e.value;
20819
+ var isSelectedOrUndeletable = segment.isSelected || ((_c = segment.link) === null || _c === void 0 ? void 0 : _c.format.undeletable);
20751
20820
  if (segment.segmentType == 'General') {
20752
20821
  pruneUnselectedModel(segment);
20753
- if (segment.blocks.length > 0 || segment.isSelected) {
20822
+ if (segment.blocks.length > 0 || isSelectedOrUndeletable) {
20754
20823
  newSegments.push(segment);
20755
20824
  }
20756
20825
  }
20757
- else if (segment.isSelected && segment.segmentType != 'SelectionMarker') {
20826
+ else if (isSelectedOrUndeletable &&
20827
+ segment.segmentType != 'SelectionMarker') {
20758
20828
  newSegments.push(segment);
20759
20829
  }
20760
20830
  }
@@ -20762,7 +20832,7 @@ function pruneUnselectedModelInternal(model, isSelectionAfterElement) {
20762
20832
  catch (e_1_1) { e_1 = { error: e_1_1 }; }
20763
20833
  finally {
20764
20834
  try {
20765
- if (_d && !_d.done && (_a = _c.return)) _a.call(_c);
20835
+ if (_e && !_e.done && (_a = _d.return)) _a.call(_d);
20766
20836
  }
20767
20837
  finally { if (e_1) throw e_1.error; }
20768
20838
  }
@@ -22218,6 +22288,7 @@ var borderColorFormatHandler_1 = __webpack_require__(/*! ./common/borderColorFor
22218
22288
  var borderFormatHandler_1 = __webpack_require__(/*! ./common/borderFormatHandler */ "./packages/roosterjs-content-model-dom/lib/formatHandlers/common/borderFormatHandler.ts");
22219
22289
  var boxShadowFormatHandler_1 = __webpack_require__(/*! ./common/boxShadowFormatHandler */ "./packages/roosterjs-content-model-dom/lib/formatHandlers/common/boxShadowFormatHandler.ts");
22220
22290
  var datasetFormatHandler_1 = __webpack_require__(/*! ./common/datasetFormatHandler */ "./packages/roosterjs-content-model-dom/lib/formatHandlers/common/datasetFormatHandler.ts");
22291
+ var dataValueFormatHandler_1 = __webpack_require__(/*! ./segment/dataValueFormatHandler */ "./packages/roosterjs-content-model-dom/lib/formatHandlers/segment/dataValueFormatHandler.ts");
22221
22292
  var directionFormatHandler_1 = __webpack_require__(/*! ./block/directionFormatHandler */ "./packages/roosterjs-content-model-dom/lib/formatHandlers/block/directionFormatHandler.ts");
22222
22293
  var displayFormatHandler_1 = __webpack_require__(/*! ./block/displayFormatHandler */ "./packages/roosterjs-content-model-dom/lib/formatHandlers/block/displayFormatHandler.ts");
22223
22294
  var entityFormatHandler_1 = __webpack_require__(/*! ./entity/entityFormatHandler */ "./packages/roosterjs-content-model-dom/lib/formatHandlers/entity/entityFormatHandler.ts");
@@ -22263,6 +22334,7 @@ var defaultFormatHandlerMap = {
22263
22334
  borderColor: borderColorFormatHandler_1.borderColorFormatHandler,
22264
22335
  boxShadow: boxShadowFormatHandler_1.boxShadowFormatHandler,
22265
22336
  dataset: datasetFormatHandler_1.datasetFormatHandler,
22337
+ dataValue: dataValueFormatHandler_1.dataValueFormatHandler,
22266
22338
  direction: directionFormatHandler_1.directionFormatHandler,
22267
22339
  display: displayFormatHandler_1.displayFormatHandler,
22268
22340
  float: floatFormatHandler_1.floatFormatHandler,
@@ -22404,6 +22476,7 @@ exports.defaultFormatKeysPerCategory = {
22404
22476
  ],
22405
22477
  segmentUnderLink: ['textColor'],
22406
22478
  code: ['fontFamily', 'display'],
22479
+ data: ['dataValue'],
22407
22480
  dataset: ['dataset'],
22408
22481
  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),
22409
22482
  container: (0, tslib_1.__spreadArray)((0, tslib_1.__spreadArray)([], (0, tslib_1.__read)(sharedContainerFormats), false), ['htmlAlign', 'size', 'display', 'id'], false),
@@ -22694,6 +22767,37 @@ exports.boldFormatHandler = {
22694
22767
  };
22695
22768
 
22696
22769
 
22770
+ /***/ },
22771
+
22772
+ /***/ "./packages/roosterjs-content-model-dom/lib/formatHandlers/segment/dataValueFormatHandler.ts"
22773
+ /*!***************************************************************************************************!*\
22774
+ !*** ./packages/roosterjs-content-model-dom/lib/formatHandlers/segment/dataValueFormatHandler.ts ***!
22775
+ \***************************************************************************************************/
22776
+ (__unused_webpack_module, exports) {
22777
+
22778
+ "use strict";
22779
+
22780
+ Object.defineProperty(exports, "__esModule", ({ value: true }));
22781
+ exports.dataValueFormatHandler = void 0;
22782
+ /**
22783
+ * @internal
22784
+ * Format handler for the "value" attribute of a HTML &lt;data&gt; element
22785
+ */
22786
+ exports.dataValueFormatHandler = {
22787
+ parse: function (format, element) {
22788
+ var _a;
22789
+ if (element.hasAttribute('value')) {
22790
+ format.dataValue = (_a = element.getAttribute('value')) !== null && _a !== void 0 ? _a : '';
22791
+ }
22792
+ },
22793
+ apply: function (format, element) {
22794
+ if (format.dataValue != undefined) {
22795
+ element.setAttribute('value', format.dataValue);
22796
+ }
22797
+ },
22798
+ };
22799
+
22800
+
22697
22801
  /***/ },
22698
22802
 
22699
22803
  /***/ "./packages/roosterjs-content-model-dom/lib/formatHandlers/segment/fontFamilyFormatHandler.ts"
@@ -23734,9 +23838,9 @@ exports.shouldSetValue = shouldSetValue;
23734
23838
 
23735
23839
  Object.defineProperty(exports, "__esModule", ({ value: true }));
23736
23840
  exports.createImage = exports.createText = exports.createTableCell = exports.createTable = exports.createSelectionMarker = exports.createParagraph = exports.createFormatContainer = exports.createListItem = exports.createBr = exports.isLinkUndeletable = exports.setLinkUndeletable = exports.scrollRectIntoView = exports.normalizeRect = exports.isWhiteSpacePreserved = exports.reuseCachedElement = exports.findClosestBlockEntityContainer = exports.isBlockEntityContainer = exports.isEntityDelimiter = exports.addDelimiters = exports.generateEntityClassNames = exports.parseEntityFormat = exports.getAllEntityWrappers = exports.findClosestEntityWrapper = exports.isEntityElement = exports.unwrap = exports.wrap = exports.wrapAllChildNodes = exports.moveChildNodes = exports.toArray = exports.getSafeIdSelector = exports.getObjectKeys = exports.isElementOfType = exports.isNodeOfType = exports.hasMetadata = exports.getMetadata = exports.updateMetadata = exports.buildSelectionMarker = exports.isBlockElement = exports.areSameFormats = exports.parseFormat = exports.getRegularSelectionOffsets = exports.formatContainerProcessor = exports.tableProcessor = exports.entityProcessor = exports.processChildNode = exports.handleRegularSelection = exports.childProcessor = exports.contentModelToText = exports.contentModelToDom = exports.domToContentModel = void 0;
23737
- exports.trimModelForSelection = exports.getDOMInsertPointRect = exports.getSelectionRootNode = exports.isBold = exports.createModelToDomConfig = exports.createModelToDomContextWithConfig = exports.createModelToDomContext = exports.createDomToModelConfig = exports.createDomToModelContextWithConfig = exports.createDomToModelContext = exports.defaultGenerateColorKey = exports.parseColor = exports.setColor = exports.getColor = exports.DeprecatedColors = exports.BorderKeys = exports.parseValueWithUnit = exports.getAutoListStyleType = exports.getOrderedListNumberStr = exports.ParagraphFormats = exports.ListFormatsToMove = exports.ListFormatsToKeep = exports.ListFormats = exports.copyFormat = exports.setParagraphNotImplicit = exports.normalizeSegmentFormat = exports.mergeTextSegments = exports.normalizeSingleSegment = exports.isEmpty = exports.addSegment = exports.unwrapBlock = exports.isGeneralSegment = exports.normalizeContentModel = exports.normalizeParagraph = exports.addTextSegment = exports.addLink = exports.addCode = exports.addBlock = exports.mutateSegment = exports.mutateSegments = exports.mutateBlock = exports.createTableRow = exports.createEmptyModel = exports.createListLevel = exports.createDivider = exports.createEntity = exports.createGeneralBlock = exports.createGeneralSegment = exports.createParagraphDecorator = exports.createContentModelDocument = void 0;
23738
- exports.runEditSteps = exports.getClosestAncestorBlockGroupIndex = exports.getSegmentTextFormat = exports.getListStyleTypeFromString = exports.retrieveModelFormatState = exports.setTableCellBackgroundColor = exports.MIN_ALLOWED_TABLE_CELL_HEIGHT = exports.MIN_ALLOWED_TABLE_CELL_WIDTH = exports.normalizeTable = exports.setFirstColumnFormatBorders = exports.applyTableFormat = exports.deleteBlock = exports.deleteSegment = exports.deleteSelection = exports.mergeModel = exports.cloneModel = exports.setSelection = exports.hasSelectionInBlockGroup = exports.hasSelectionInSegment = exports.hasSelectionInBlock = exports.getSelectedCells = exports.getSelectedSegmentsAndParagraphs = exports.getSelectedSegments = exports.getSelectedParagraphs = exports.getOperationalBlocks = exports.getFirstSelectedTable = exports.getFirstSelectedListItem = exports.iterateSelections = exports.isBlockGroupOfType = exports.getRangesByText = exports.getImageState = exports.setImageState = exports.getParagraphMarker = exports.setParagraphMarker = exports.cacheGetEventData = exports.extractClipboardItems = exports.normalizeFontFamily = exports.transformColor = exports.retrieveDocumentMetadata = exports.readFile = exports.parseTableCells = exports.normalizeText = exports.isSpace = exports.isPunctuation = exports.extractBorderValues = exports.combineBorderValue = exports.getNodePositionFromEvent = exports.isCursorMovingKey = exports.isModifierKey = exports.isCharacterValue = void 0;
23739
- exports.EmptySegmentFormat = exports.UnorderedListStyleMap = exports.OrderedListStyleMap = exports.TableBorderFormat = exports.NumberingListType = exports.BulletListType = exports.ChangeSource = exports.ListMetadataDefinition = exports.getListMetadata = exports.updateListMetadata = exports.getTableMetadata = exports.updateTableMetadata = exports.getTableCellMetadata = exports.updateTableCellMetadata = exports.getImageMetadata = exports.updateImageMetadata = void 0;
23841
+ 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.addData = exports.addCode = exports.addBlock = exports.mutateSegment = exports.mutateSegments = exports.mutateBlock = exports.createTableRow = exports.createEmptyModel = exports.createListLevel = exports.createDivider = exports.createEntity = exports.createGeneralBlock = exports.createGeneralSegment = exports.createParagraphDecorator = exports.createContentModelDocument = void 0;
23842
+ 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.cloneModelForPaste = exports.cloneModel = exports.setSelection = exports.hasSelectionInBlockGroup = exports.hasSelectionInSegment = exports.hasSelectionInBlock = exports.getSelectedCells = exports.getSelectedSegmentsAndParagraphs = exports.getSelectedSegments = exports.getSelectedParagraphs = exports.getOperationalBlocks = exports.getFirstSelectedTable = exports.getFirstSelectedListItem = exports.iterateSelections = exports.isBlockGroupOfType = exports.getRangesByText = exports.getImageState = exports.setImageState = exports.getParagraphMarker = exports.setParagraphMarker = exports.cacheGetEventData = exports.extractClipboardItems = exports.normalizeFontFamily = exports.transformColor = exports.retrieveDocumentMetadata = exports.readFile = exports.parseTableCells = exports.normalizeText = exports.isSpace = exports.isPunctuation = exports.extractBorderValues = exports.combineBorderValue = exports.getNodePositionFromEvent = exports.isCursorMovingKey = exports.isModifierKey = exports.isCharacterValue = exports.trimModelForSelection = void 0;
23843
+ exports.EmptySegmentFormat = exports.UnorderedListStyleMap = exports.OrderedListStyleMap = exports.TableBorderFormat = exports.NumberingListType = exports.BulletListType = exports.ChangeSource = exports.ListMetadataDefinition = exports.getListMetadata = exports.updateListMetadata = exports.getTableMetadata = exports.updateTableMetadata = exports.getTableCellMetadata = exports.updateTableCellMetadata = exports.getImageMetadata = exports.updateImageMetadata = exports.runEditSteps = exports.getClosestAncestorBlockGroupIndex = void 0;
23740
23844
  var domToContentModel_1 = __webpack_require__(/*! ./domToModel/domToContentModel */ "./packages/roosterjs-content-model-dom/lib/domToModel/domToContentModel.ts");
23741
23845
  Object.defineProperty(exports, "domToContentModel", ({ enumerable: true, get: function () { return domToContentModel_1.domToContentModel; } }));
23742
23846
  var contentModelToDom_1 = __webpack_require__(/*! ./modelToDom/contentModelToDom */ "./packages/roosterjs-content-model-dom/lib/modelToDom/contentModelToDom.ts");
@@ -23850,7 +23954,9 @@ Object.defineProperty(exports, "addBlock", ({ enumerable: true, get: function ()
23850
23954
  var addDecorators_1 = __webpack_require__(/*! ./modelApi/common/addDecorators */ "./packages/roosterjs-content-model-dom/lib/modelApi/common/addDecorators.ts");
23851
23955
  Object.defineProperty(exports, "addCode", ({ enumerable: true, get: function () { return addDecorators_1.addCode; } }));
23852
23956
  var addDecorators_2 = __webpack_require__(/*! ./modelApi/common/addDecorators */ "./packages/roosterjs-content-model-dom/lib/modelApi/common/addDecorators.ts");
23853
- Object.defineProperty(exports, "addLink", ({ enumerable: true, get: function () { return addDecorators_2.addLink; } }));
23957
+ Object.defineProperty(exports, "addData", ({ enumerable: true, get: function () { return addDecorators_2.addData; } }));
23958
+ var addDecorators_3 = __webpack_require__(/*! ./modelApi/common/addDecorators */ "./packages/roosterjs-content-model-dom/lib/modelApi/common/addDecorators.ts");
23959
+ Object.defineProperty(exports, "addLink", ({ enumerable: true, get: function () { return addDecorators_3.addLink; } }));
23854
23960
  var addTextSegment_1 = __webpack_require__(/*! ./modelApi/common/addTextSegment */ "./packages/roosterjs-content-model-dom/lib/modelApi/common/addTextSegment.ts");
23855
23961
  Object.defineProperty(exports, "addTextSegment", ({ enumerable: true, get: function () { return addTextSegment_1.addTextSegment; } }));
23856
23962
  var normalizeParagraph_1 = __webpack_require__(/*! ./modelApi/common/normalizeParagraph */ "./packages/roosterjs-content-model-dom/lib/modelApi/common/normalizeParagraph.ts");
@@ -23967,6 +24073,7 @@ var setSelection_1 = __webpack_require__(/*! ./modelApi/selection/setSelection *
23967
24073
  Object.defineProperty(exports, "setSelection", ({ enumerable: true, get: function () { return setSelection_1.setSelection; } }));
23968
24074
  var cloneModel_1 = __webpack_require__(/*! ./modelApi/editing/cloneModel */ "./packages/roosterjs-content-model-dom/lib/modelApi/editing/cloneModel.ts");
23969
24075
  Object.defineProperty(exports, "cloneModel", ({ enumerable: true, get: function () { return cloneModel_1.cloneModel; } }));
24076
+ Object.defineProperty(exports, "cloneModelForPaste", ({ enumerable: true, get: function () { return cloneModel_1.cloneModelForPaste; } }));
23970
24077
  var mergeModel_1 = __webpack_require__(/*! ./modelApi/editing/mergeModel */ "./packages/roosterjs-content-model-dom/lib/modelApi/editing/mergeModel.ts");
23971
24078
  Object.defineProperty(exports, "mergeModel", ({ enumerable: true, get: function () { return mergeModel_1.mergeModel; } }));
23972
24079
  var deleteSelection_1 = __webpack_require__(/*! ./modelApi/editing/deleteSelection */ "./packages/roosterjs-content-model-dom/lib/modelApi/editing/deleteSelection.ts");
@@ -24170,7 +24277,7 @@ exports.addBlock = addBlock;
24170
24277
  "use strict";
24171
24278
 
24172
24279
  Object.defineProperty(exports, "__esModule", ({ value: true }));
24173
- exports.addDecorators = exports.addCode = exports.addLink = void 0;
24280
+ exports.addDecorators = exports.addData = exports.addCode = exports.addLink = void 0;
24174
24281
  var tslib_1 = __webpack_require__(/*! tslib */ "./node_modules/tslib/tslib.es6.mjs");
24175
24282
  /**
24176
24283
  * @internal
@@ -24197,12 +24304,27 @@ function addCode(segment, code) {
24197
24304
  }
24198
24305
  }
24199
24306
  exports.addCode = addCode;
24307
+ /**
24308
+ * @internal
24309
+ * Add a data decorator into segment if any
24310
+ * @param segment The segment to add decorator to
24311
+ * @param data The data decorator to add
24312
+ */
24313
+ function addData(segment, data) {
24314
+ if (data.format.dataValue != undefined) {
24315
+ segment.data = {
24316
+ format: (0, tslib_1.__assign)({}, data.format),
24317
+ };
24318
+ }
24319
+ }
24320
+ exports.addData = addData;
24200
24321
  /**
24201
24322
  * @internal
24202
24323
  */
24203
24324
  function addDecorators(segment, context) {
24204
24325
  addLink(segment, context.link);
24205
24326
  addCode(segment, context.code);
24327
+ addData(segment, context.data);
24206
24328
  }
24207
24329
  exports.addDecorators = addDecorators;
24208
24330
 
@@ -24487,7 +24609,8 @@ function segmentsWithSameFormat(seg1, seg2) {
24487
24609
  return (!!seg1.isSelected == !!seg2.isSelected &&
24488
24610
  (0, areSameFormats_1.areSameFormats)(seg1.format, seg2.format) &&
24489
24611
  areSameLinks(seg1.link, seg2.link) &&
24490
- areSameCodes(seg1.code, seg2.code));
24612
+ areSameCodes(seg1.code, seg2.code) &&
24613
+ areSameData(seg1.data, seg2.data));
24491
24614
  }
24492
24615
  function areSameLinks(link1, link2) {
24493
24616
  return ((!link1 && !link2) ||
@@ -24499,6 +24622,9 @@ function areSameLinks(link1, link2) {
24499
24622
  function areSameCodes(code1, code2) {
24500
24623
  return (!code1 && !code2) || (code1 && code2 && (0, areSameFormats_1.areSameFormats)(code1.format, code2.format));
24501
24624
  }
24625
+ function areSameData(data1, data2) {
24626
+ return (!data1 && !data2) || (data1 && data2 && (0, areSameFormats_1.areSameFormats)(data1.format, data2.format));
24627
+ }
24502
24628
 
24503
24629
 
24504
24630
  /***/ },
@@ -24796,7 +24922,34 @@ exports.normalizeAllSegments = normalizeAllSegments;
24796
24922
  function normalizeSingleSegment(paragraph, segment, ignoreTrailingSpaces) {
24797
24923
  if (ignoreTrailingSpaces === void 0) { ignoreTrailingSpaces = false; }
24798
24924
  var context = resetNormalizeSegmentContext();
24925
+ var index = paragraph.segments.indexOf(segment);
24799
24926
  context.ignoreTrailingSpaces = ignoreTrailingSpaces;
24927
+ // Search backward for the nearest non-empty text segment (skipping SelectionMarkers and empty text),
24928
+ // to determine whether leading spaces of the current segment should be preserved.
24929
+ // If the previous text doesn't end with a space, keep the leading space to maintain word separation.
24930
+ for (var i = index - 1; i >= 0; i--) {
24931
+ var s = paragraph.segments[i];
24932
+ if (s.segmentType == 'Text') {
24933
+ if (s.text.length > 0) {
24934
+ if (s.text.substr(-1) != SPACE) {
24935
+ context.ignoreLeadingSpaces = false;
24936
+ }
24937
+ break;
24938
+ }
24939
+ }
24940
+ else if (s.segmentType == 'Image') {
24941
+ // If the previous segment is an image, we should keep the leading space of the current segment to maintain word separation.
24942
+ context.ignoreLeadingSpaces = false;
24943
+ break;
24944
+ }
24945
+ else if (s.segmentType == 'Br') {
24946
+ // If the previous segment is a line break, we should ignore the leading space of the current segment.
24947
+ context.ignoreLeadingSpaces = true;
24948
+ }
24949
+ else if (s.segmentType != 'SelectionMarker') {
24950
+ break;
24951
+ }
24952
+ }
24800
24953
  normalizeSegment(paragraph, segment, context);
24801
24954
  }
24802
24955
  exports.normalizeSingleSegment = normalizeSingleSegment;
@@ -24837,6 +24990,10 @@ function normalizeSegment(paragraph, segment, context) {
24837
24990
  context.ignoreLeadingSpaces = false;
24838
24991
  break;
24839
24992
  case 'Text':
24993
+ // Skip empty text segments to avoid affecting normalization context
24994
+ if (segment.text.length == 0) {
24995
+ break;
24996
+ }
24840
24997
  context.textSegments.push(segment);
24841
24998
  context.lastInlineSegment = segment;
24842
24999
  context.lastTextSegment = segment;
@@ -24844,9 +25001,9 @@ function normalizeSegment(paragraph, segment, context) {
24844
25001
  var last = segment.text.substr(-1);
24845
25002
  if (!(0, hasSpacesOnly_1.hasSpacesOnly)(segment.text)) {
24846
25003
  if (first == SPACE) {
24847
- // 1. Multiple leading space => single &nbsp; or empty (depends on if previous segment ends with space)
25004
+ // 1. Multiple leading space => single space or empty (depends on if previous segment ends with space)
24848
25005
  (0, mutate_1.mutateSegment)(paragraph, segment, function (textSegment) {
24849
- textSegment.text = textSegment.text.replace(LEADING_SPACE_REGEX, context.ignoreLeadingSpaces ? '' : NONE_BREAK_SPACE);
25006
+ textSegment.text = textSegment.text.replace(LEADING_SPACE_REGEX, context.ignoreLeadingSpaces ? '' : SPACE);
24850
25007
  });
24851
25008
  }
24852
25009
  if (last == SPACE) {
@@ -25553,9 +25710,10 @@ var addDecorators_1 = __webpack_require__(/*! ../common/addDecorators */ "./pack
25553
25710
  * @param text Text of this model
25554
25711
  * @param format @optional The format of this model
25555
25712
  * @param link @optional The link decorator
25556
- * @param code @option The code decorator
25713
+ * @param code @optional The code decorator
25714
+ * @param data @optional The data decorator
25557
25715
  */
25558
- function createText(text, format, link, code) {
25716
+ function createText(text, format, link, code, data) {
25559
25717
  var result = {
25560
25718
  segmentType: 'Text',
25561
25719
  text: text,
@@ -25567,6 +25725,9 @@ function createText(text, format, link, code) {
25567
25725
  if (code) {
25568
25726
  (0, addDecorators_1.addCode)(result, code);
25569
25727
  }
25728
+ if (data) {
25729
+ (0, addDecorators_1.addData)(result, data);
25730
+ }
25570
25731
  return result;
25571
25732
  }
25572
25733
  exports.createText = createText;
@@ -25945,8 +26106,20 @@ function getBorderStyleFromColor(color) {
25945
26106
  "use strict";
25946
26107
 
25947
26108
  Object.defineProperty(exports, "__esModule", ({ value: true }));
25948
- exports.cloneModel = void 0;
26109
+ exports.cloneModel = exports.cloneModelForPaste = void 0;
25949
26110
  var tslib_1 = __webpack_require__(/*! tslib */ "./node_modules/tslib/tslib.es6.mjs");
26111
+ var CloneOption = {
26112
+ includeCachedElement: function (node, type) { return (type == 'cache' ? undefined : node); },
26113
+ };
26114
+ /**
26115
+ * Clone a content model for paste operations, ensuring that cached elements are handled appropriately.
26116
+ * @param model The content model to clone
26117
+ * @returns A cloned content model suitable for paste operations
26118
+ */
26119
+ function cloneModelForPaste(model) {
26120
+ return cloneModel(model, CloneOption);
26121
+ }
26122
+ exports.cloneModelForPaste = cloneModelForPaste;
25950
26123
  /**
25951
26124
  * Clone a content model
25952
26125
  * @param model The content model to clone
@@ -26022,7 +26195,7 @@ function cloneBlockGroupBase(group, options) {
26022
26195
  };
26023
26196
  }
26024
26197
  function cloneSegmentBase(segment) {
26025
- var segmentType = segment.segmentType, isSelected = segment.isSelected, code = segment.code, link = segment.link;
26198
+ var segmentType = segment.segmentType, isSelected = segment.isSelected, code = segment.code, link = segment.link, data = segment.data;
26026
26199
  var newSegment = Object.assign({
26027
26200
  segmentType: segmentType,
26028
26201
  isSelected: isSelected,
@@ -26033,6 +26206,9 @@ function cloneSegmentBase(segment) {
26033
26206
  if (link) {
26034
26207
  newSegment.link = Object.assign(cloneModelWithFormat(link), cloneModelWithDataset(link));
26035
26208
  }
26209
+ if (data) {
26210
+ newSegment.data = cloneModelWithFormat(data);
26211
+ }
26036
26212
  return newSegment;
26037
26213
  }
26038
26214
  function cloneEntity(entity, options) {
@@ -30068,7 +30244,7 @@ var moveChildNodes_1 = __webpack_require__(/*! ../../domUtils/moveChildNodes */
30068
30244
  * @internal
30069
30245
  */
30070
30246
  var handleSegmentDecorator = function (_, parent, segment, context) {
30071
- var code = segment.code, link = segment.link;
30247
+ var code = segment.code, link = segment.link, data = segment.data;
30072
30248
  if ((0, isNodeOfType_1.isNodeOfType)(parent, 'ELEMENT_NODE')) {
30073
30249
  if (link) {
30074
30250
  (0, stackFormat_1.stackFormat)(context, 'a', function () {
@@ -30087,6 +30263,14 @@ var handleSegmentDecorator = function (_, parent, segment, context) {
30087
30263
  (_a = context.onNodeCreated) === null || _a === void 0 ? void 0 : _a.call(context, code, codeNode);
30088
30264
  });
30089
30265
  }
30266
+ if (data) {
30267
+ (0, stackFormat_1.stackFormat)(context, 'data', function () {
30268
+ var _a;
30269
+ var dataNode = (0, moveChildNodes_1.wrapAllChildNodes)(parent, 'data');
30270
+ (0, applyFormat_1.applyFormat)(dataNode, context.formatAppliers.data, data.format, context);
30271
+ (_a = context.onNodeCreated) === null || _a === void 0 ? void 0 : _a.call(context, data, dataNode);
30272
+ });
30273
+ }
30090
30274
  }
30091
30275
  };
30092
30276
  exports.handleSegmentDecorator = handleSegmentDecorator;
@@ -30271,7 +30455,20 @@ exports.handleText = handleText;
30271
30455
  Object.defineProperty(exports, "__esModule", ({ value: true }));
30272
30456
  exports.mergeNode = void 0;
30273
30457
  var isNodeOfType_1 = __webpack_require__(/*! ../../domUtils/isNodeOfType */ "./packages/roosterjs-content-model-dom/lib/domUtils/isNodeOfType.ts");
30274
- var OptimizeTags = ['SPAN', 'B', 'EM', 'I', 'U', 'SUB', 'SUP', 'STRIKE', 'S', 'A', 'CODE'];
30458
+ var OptimizeTags = [
30459
+ 'SPAN',
30460
+ 'B',
30461
+ 'EM',
30462
+ 'I',
30463
+ 'U',
30464
+ 'SUB',
30465
+ 'SUP',
30466
+ 'STRIKE',
30467
+ 'S',
30468
+ 'A',
30469
+ 'CODE',
30470
+ 'DATA',
30471
+ ];
30275
30472
  /**
30276
30473
  * @internal
30277
30474
  */
@@ -32020,11 +32217,12 @@ exports.modelProcessor = modelProcessor;
32020
32217
 
32021
32218
  Object.defineProperty(exports, "__esModule", ({ value: true }));
32022
32219
  exports.MarkdownPastePlugin = void 0;
32023
- var roosterjs_content_model_dom_1 = __webpack_require__(/*! roosterjs-content-model-dom */ "./packages/roosterjs-content-model-dom/lib/index.ts");
32024
32220
  var convertMarkdownToContentModel_1 = __webpack_require__(/*! ../markdownToModel/convertMarkdownToContentModel */ "./packages/roosterjs-content-model-markdown/lib/markdownToModel/convertMarkdownToContentModel.ts");
32025
32221
  var isPastedContentMarkdown_1 = __webpack_require__(/*! ../publicApi/isPastedContentMarkdown */ "./packages/roosterjs-content-model-markdown/lib/publicApi/isPastedContentMarkdown.ts");
32222
+ var roosterjs_content_model_dom_1 = __webpack_require__(/*! roosterjs-content-model-dom */ "./packages/roosterjs-content-model-dom/lib/index.ts");
32026
32223
  var DefaultOptions = {
32027
32224
  autoConversion: false,
32225
+ undoConversion: false,
32028
32226
  };
32029
32227
  /**
32030
32228
  * Markdown paste plugin. Handles the BeforePaste event and, when the pasted content
@@ -32070,12 +32268,37 @@ var MarkdownPastePlugin = /** @class */ (function () {
32070
32268
  * @param event The event to handle:
32071
32269
  */
32072
32270
  MarkdownPastePlugin.prototype.onPluginEvent = function (event) {
32073
- if (!this.editor || event.eventType != 'beforePaste') {
32271
+ if (!this.editor) {
32074
32272
  return;
32075
32273
  }
32076
- var shouldConvert = event.pasteType === 'asMarkdown' || this.options.autoConversion;
32077
- if (shouldConvert && (0, isPastedContentMarkdown_1.isPastedContentMarkdown)(this.editor, event.clipboardData)) {
32078
- convertPastedTextToMarkdown(this.editor, event.fragment, event.clipboardData.text);
32274
+ if (event.eventType === 'contentChanged' &&
32275
+ event.source === roosterjs_content_model_dom_1.ChangeSource.Paste &&
32276
+ this.options.autoConversion &&
32277
+ event.data) {
32278
+ var clipboardData = event.data;
32279
+ var shouldConvert = clipboardData && clipboardData.pasteNativeEvent && this.options.autoConversion;
32280
+ if (shouldConvert &&
32281
+ (0, isPastedContentMarkdown_1.isPastedContentMarkdown)(this.editor, clipboardData) &&
32282
+ clipboardData.modelBeforePaste) {
32283
+ var modelBeforePaste_1 = (0, roosterjs_content_model_dom_1.cloneModelForPaste)(clipboardData.modelBeforePaste);
32284
+ (0, roosterjs_content_model_dom_1.mergeModel)(modelBeforePaste_1, (0, convertMarkdownToContentModel_1.convertMarkdownToContentModel)(clipboardData.text, { emptyLine: 'merge' }));
32285
+ if (this.options.undoConversion) {
32286
+ this.editor.takeSnapshot();
32287
+ }
32288
+ this.editor.formatContentModel(function (model) {
32289
+ model.blocks = modelBeforePaste_1.blocks;
32290
+ return true;
32291
+ }, {
32292
+ apiName: 'MarkdownConversion',
32293
+ scrollCaretIntoView: true,
32294
+ });
32295
+ }
32296
+ }
32297
+ else if (event.eventType === 'beforePaste' && !event.clipboardData.pasteNativeEvent) {
32298
+ var shouldConvert = event.pasteType === 'asMarkdown';
32299
+ if (shouldConvert && (0, isPastedContentMarkdown_1.isPastedContentMarkdown)(this.editor, event.clipboardData)) {
32300
+ convertPastedTextToMarkdown(this.editor, event.fragment, event.clipboardData.text);
32301
+ }
32079
32302
  }
32080
32303
  };
32081
32304
  return MarkdownPastePlugin;
@@ -38018,16 +38241,31 @@ function createImageWrapper(editor, image, options, editInfo, htmlOptions, opera
38018
38241
  croppers = (0, createImageCropper_1.createImageCropper)(doc);
38019
38242
  }
38020
38243
  var wrapper = createWrapper(editor, imageClone, options, editInfo, resizers, rotators, croppers);
38244
+ // Capture the image footprint before attaching the shadow root, since the light-DOM image
38245
+ // stops being rendered once the shadow root takes over.
38246
+ var imageWidth = image.offsetWidth;
38247
+ var imageHeight = image.offsetHeight;
38021
38248
  var imageSpan = (0, roosterjs_content_model_dom_1.wrap)(doc, image, 'span');
38022
- var shadowSpan = createShadowSpan(wrapper, imageSpan);
38249
+ var shadowSpan = createShadowSpan(wrapper, imageSpan, imageWidth, imageHeight);
38023
38250
  return { wrapper: wrapper, shadowSpan: shadowSpan, imageClone: imageClone, resizers: resizers, rotators: rotators, croppers: croppers };
38024
38251
  }
38025
38252
  exports.createImageWrapper = createImageWrapper;
38026
- var createShadowSpan = function (wrapper, imageSpan) {
38253
+ var createShadowSpan = function (wrapper, imageSpan, imageWidth, imageHeight) {
38027
38254
  var shadowRoot = imageSpan.attachShadow({
38028
38255
  mode: 'open',
38029
38256
  });
38030
38257
  imageSpan.id = IMAGE_EDIT_SHADOW_ROOT;
38258
+ // Pin the shadow host to the original image's box so that wrapping the image does not grow the
38259
+ // surrounding line box. Without this, the taller edit wrapper enlarges the line and the browser
38260
+ // scrolls the selection back into view, making the editor jump. The wrapper and handles still
38261
+ // overflow the host visually because overflow is left visible.
38262
+ if (imageWidth > 0 && imageHeight > 0) {
38263
+ imageSpan.style.display = 'inline-block';
38264
+ imageSpan.style.width = imageWidth + "px";
38265
+ imageSpan.style.height = imageHeight + "px";
38266
+ imageSpan.style.verticalAlign = 'bottom';
38267
+ imageSpan.style.overflow = 'visible';
38268
+ }
38031
38269
  shadowRoot.appendChild(wrapper);
38032
38270
  return imageSpan;
38033
38271
  };