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