roosterjs 9.11.2 → 9.13.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
@@ -2095,7 +2095,7 @@ exports["default"] = getDarkColor;
2095
2095
 
2096
2096
  Object.defineProperty(exports, "__esModule", ({ value: true }));
2097
2097
  exports.formatSegmentWithContentModel = exports.formatParagraphWithContentModel = exports.formatImageWithContentModel = exports.formatTableWithContentModel = exports.clearSelectedCells = exports.insertTableColumn = exports.insertTableRow = exports.insertEntity = exports.toggleCode = exports.setParagraphMargin = exports.adjustImageSelection = exports.setImageAltText = exports.adjustLinkSelection = exports.removeLink = exports.insertLink = exports.clearFormat = exports.getFormatState = exports.changeImage = exports.setImageBoxShadow = exports.setImageBorder = exports.setSpacing = exports.toggleBlockQuote = exports.setHeadingLevel = exports.setDirection = exports.setAlignment = exports.setIndentation = exports.setListStartNumber = exports.setListStyle = exports.insertImage = exports.splitTextSegment = exports.changeCapitalization = exports.applySegmentFormat = exports.changeFontSize = exports.setTextColor = exports.setFontSize = exports.setFontName = exports.setBackgroundColor = exports.toggleSuperscript = exports.toggleSubscript = exports.toggleStrikethrough = exports.toggleUnderline = exports.toggleItalic = exports.toggleBold = exports.toggleNumbering = exports.toggleBullet = exports.applyTableBorderFormat = exports.editTable = exports.setTableCellShade = exports.formatTable = exports.insertTable = void 0;
2098
- exports.getListAnnounceData = exports.matchLink = exports.setModelIndentation = exports.findListItemsInSameThread = exports.setModelListStartNumber = exports.setModelListStyle = exports.setListType = exports.formatInsertPointWithContentModel = exports.formatTextSegmentBeforeSelectionMarker = void 0;
2098
+ exports.getListAnnounceData = exports.promoteLink = exports.matchLink = exports.setModelIndentation = exports.findListItemsInSameThread = exports.setModelListStartNumber = exports.setModelListStyle = exports.setListType = exports.formatInsertPointWithContentModel = exports.formatTextSegmentBeforeSelectionMarker = void 0;
2099
2099
  var insertTable_1 = __webpack_require__(/*! ./publicApi/table/insertTable */ "./packages/roosterjs-content-model-api/lib/publicApi/table/insertTable.ts");
2100
2100
  Object.defineProperty(exports, "insertTable", ({ enumerable: true, get: function () { return insertTable_1.insertTable; } }));
2101
2101
  var formatTable_1 = __webpack_require__(/*! ./publicApi/table/formatTable */ "./packages/roosterjs-content-model-api/lib/publicApi/table/formatTable.ts");
@@ -2212,6 +2212,8 @@ var setModelIndentation_1 = __webpack_require__(/*! ./modelApi/block/setModelInd
2212
2212
  Object.defineProperty(exports, "setModelIndentation", ({ enumerable: true, get: function () { return setModelIndentation_1.setModelIndentation; } }));
2213
2213
  var matchLink_1 = __webpack_require__(/*! ./modelApi/link/matchLink */ "./packages/roosterjs-content-model-api/lib/modelApi/link/matchLink.ts");
2214
2214
  Object.defineProperty(exports, "matchLink", ({ enumerable: true, get: function () { return matchLink_1.matchLink; } }));
2215
+ var promoteLink_1 = __webpack_require__(/*! ./modelApi/link/promoteLink */ "./packages/roosterjs-content-model-api/lib/modelApi/link/promoteLink.ts");
2216
+ Object.defineProperty(exports, "promoteLink", ({ enumerable: true, get: function () { return promoteLink_1.promoteLink; } }));
2215
2217
  var getListAnnounceData_1 = __webpack_require__(/*! ./modelApi/list/getListAnnounceData */ "./packages/roosterjs-content-model-api/lib/modelApi/list/getListAnnounceData.ts");
2216
2218
  Object.defineProperty(exports, "getListAnnounceData", ({ enumerable: true, get: function () { return getListAnnounceData_1.getListAnnounceData; } }));
2217
2219
 
@@ -3067,6 +3069,42 @@ function applyImageBorderFormat(image, border, borderRadius) {
3067
3069
  exports.applyImageBorderFormat = applyImageBorderFormat;
3068
3070
 
3069
3071
 
3072
+ /***/ }),
3073
+
3074
+ /***/ "./packages/roosterjs-content-model-api/lib/modelApi/link/getLinkUrl.ts":
3075
+ /*!******************************************************************************!*\
3076
+ !*** ./packages/roosterjs-content-model-api/lib/modelApi/link/getLinkUrl.ts ***!
3077
+ \******************************************************************************/
3078
+ /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
3079
+
3080
+ "use strict";
3081
+
3082
+ Object.defineProperty(exports, "__esModule", ({ value: true }));
3083
+ exports.getLinkUrl = void 0;
3084
+ var matchLink_1 = __webpack_require__(/*! ./matchLink */ "./packages/roosterjs-content-model-api/lib/modelApi/link/matchLink.ts");
3085
+ var COMMON_REGEX = "[s]*[a-zA-Z0-9+][s]*";
3086
+ var TELEPHONE_REGEX = "(T|t)el:" + COMMON_REGEX;
3087
+ var MAILTO_REGEX = "(M|m)ailto:" + COMMON_REGEX;
3088
+ /**
3089
+ * @internal
3090
+ */
3091
+ function getLinkUrl(text, autoLinkOptions) {
3092
+ var _a;
3093
+ var _b = autoLinkOptions !== null && autoLinkOptions !== void 0 ? autoLinkOptions : {}, autoLink = _b.autoLink, autoMailto = _b.autoMailto, autoTel = _b.autoTel;
3094
+ var linkMatch = autoLink ? (_a = (0, matchLink_1.matchLink)(text)) === null || _a === void 0 ? void 0 : _a.normalizedUrl : undefined;
3095
+ var telMatch = autoTel ? matchTel(text) : undefined;
3096
+ var mailtoMatch = autoMailto ? matchMailTo(text) : undefined;
3097
+ return linkMatch || telMatch || mailtoMatch;
3098
+ }
3099
+ exports.getLinkUrl = getLinkUrl;
3100
+ function matchTel(text) {
3101
+ return text.match(TELEPHONE_REGEX) ? text.toLocaleLowerCase() : undefined;
3102
+ }
3103
+ function matchMailTo(text) {
3104
+ return text.match(MAILTO_REGEX) ? text.toLocaleLowerCase() : undefined;
3105
+ }
3106
+
3107
+
3070
3108
  /***/ }),
3071
3109
 
3072
3110
  /***/ "./packages/roosterjs-content-model-api/lib/modelApi/link/matchLink.ts":
@@ -3171,6 +3209,51 @@ function matchLink(url) {
3171
3209
  exports.matchLink = matchLink;
3172
3210
 
3173
3211
 
3212
+ /***/ }),
3213
+
3214
+ /***/ "./packages/roosterjs-content-model-api/lib/modelApi/link/promoteLink.ts":
3215
+ /*!*******************************************************************************!*\
3216
+ !*** ./packages/roosterjs-content-model-api/lib/modelApi/link/promoteLink.ts ***!
3217
+ \*******************************************************************************/
3218
+ /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
3219
+
3220
+ "use strict";
3221
+
3222
+ Object.defineProperty(exports, "__esModule", ({ value: true }));
3223
+ exports.promoteLink = void 0;
3224
+ var getLinkUrl_1 = __webpack_require__(/*! ./getLinkUrl */ "./packages/roosterjs-content-model-api/lib/modelApi/link/getLinkUrl.ts");
3225
+ var splitTextSegment_1 = __webpack_require__(/*! ../../publicApi/segment/splitTextSegment */ "./packages/roosterjs-content-model-api/lib/publicApi/segment/splitTextSegment.ts");
3226
+ /**
3227
+ * Promote the given text segment to a hyper link when the segment text is ending with a valid link format.
3228
+ * When the whole text segment if of a link, promote the whole segment.
3229
+ * When the text segment ends with a link format, split the segment and promote the second part
3230
+ * When link is in middle of the text segment, no action.
3231
+ * This is mainly used for doing auto link when there is a link before cursor
3232
+ * @param segment The text segment to search link text from
3233
+ * @param paragraph Parent paragraph of the segment
3234
+ * @param options Options of auto link
3235
+ * @returns If a link is promoted, return this segment. Otherwise return null
3236
+ */
3237
+ function promoteLink(segment, paragraph, autoLinkOptions) {
3238
+ var link = segment.text.split(' ').pop();
3239
+ var url = link === null || link === void 0 ? void 0 : link.trim();
3240
+ var linkUrl = undefined;
3241
+ if (url && link && (linkUrl = (0, getLinkUrl_1.getLinkUrl)(url, autoLinkOptions))) {
3242
+ var linkSegment = (0, splitTextSegment_1.splitTextSegment)(segment, paragraph, segment.text.length - link.trimLeft().length, segment.text.trimRight().length);
3243
+ linkSegment.link = {
3244
+ format: {
3245
+ href: linkUrl,
3246
+ underline: true,
3247
+ },
3248
+ dataset: {},
3249
+ };
3250
+ return linkSegment;
3251
+ }
3252
+ return null;
3253
+ }
3254
+ exports.promoteLink = promoteLink;
3255
+
3256
+
3174
3257
  /***/ }),
3175
3258
 
3176
3259
  /***/ "./packages/roosterjs-content-model-api/lib/modelApi/list/findListItemsInSameThread.ts":
@@ -10182,6 +10265,10 @@ function getIndexedTableItem(element) {
10182
10265
  return null;
10183
10266
  }
10184
10267
  }
10268
+ // Make a node not indexed. Do not export this function since we should not let code outside here know this detail
10269
+ function unindex(node) {
10270
+ delete node.__roosterjsContentModel;
10271
+ }
10185
10272
  /**
10186
10273
  * @internal
10187
10274
  * Implementation of DomIndexer
@@ -10229,6 +10316,19 @@ var DomIndexerImpl = /** @class */ (function () {
10229
10316
  this.onBlockEntityDelimiter(entity.wrapper.previousSibling, entity, group);
10230
10317
  this.onBlockEntityDelimiter(entity.wrapper.nextSibling, entity, group);
10231
10318
  };
10319
+ DomIndexerImpl.prototype.onMergeText = function (targetText, sourceText) {
10320
+ var _a;
10321
+ if (isIndexedSegment(targetText) && isIndexedSegment(sourceText)) {
10322
+ if (targetText.nextSibling == sourceText) {
10323
+ (_a = targetText.__roosterjsContentModel.segments).push.apply(_a, (0, tslib_1.__spreadArray)([], (0, tslib_1.__read)(sourceText.__roosterjsContentModel.segments), false));
10324
+ unindex(sourceText);
10325
+ }
10326
+ }
10327
+ else {
10328
+ unindex(sourceText);
10329
+ unindex(targetText);
10330
+ }
10331
+ };
10232
10332
  DomIndexerImpl.prototype.reconcileSelection = function (model, newSelection, oldSelection) {
10233
10333
  var _a, _b;
10234
10334
  if (oldSelection) {
@@ -13881,9 +13981,6 @@ var Editor = /** @class */ (function () {
13881
13981
  case 'connected': // Get a connected model is deprecated. Now we will always return disconnected model
13882
13982
  case 'disconnected':
13883
13983
  return (0, roosterjs_content_model_dom_1.cloneModel)(core.api.createContentModel(core, {
13884
- processorOverride: {
13885
- table: roosterjs_content_model_dom_1.tableProcessor,
13886
- },
13887
13984
  tryGetFromCache: false,
13888
13985
  }), {
13889
13986
  includeCachedElement: this.cloneOptionCallback,
@@ -14409,7 +14506,6 @@ exports.getDarkColorFallback = getDarkColorFallback;
14409
14506
  Object.defineProperty(exports, "__esModule", ({ value: true }));
14410
14507
  exports.createModelToDomSettings = exports.createDomToModelSettings = void 0;
14411
14508
  var roosterjs_content_model_dom_1 = __webpack_require__(/*! roosterjs-content-model-dom */ "./packages/roosterjs-content-model-dom/lib/index.ts");
14412
- var tablePreProcessor_1 = __webpack_require__(/*! ../../override/tablePreProcessor */ "./packages/roosterjs-content-model-core/lib/override/tablePreProcessor.ts");
14413
14509
  var listMetadataApplier_1 = __webpack_require__(/*! ../../override/listMetadataApplier */ "./packages/roosterjs-content-model-core/lib/override/listMetadataApplier.ts");
14414
14510
  /**
14415
14511
  * @internal
@@ -14418,11 +14514,7 @@ var listMetadataApplier_1 = __webpack_require__(/*! ../../override/listMetadataA
14418
14514
  */
14419
14515
  function createDomToModelSettings(options) {
14420
14516
  var _a;
14421
- var builtIn = {
14422
- processorOverride: {
14423
- table: tablePreProcessor_1.tablePreProcessor,
14424
- },
14425
- };
14517
+ var builtIn = {};
14426
14518
  var customized = (_a = options.defaultDomToModelOptions) !== null && _a !== void 0 ? _a : {};
14427
14519
  return {
14428
14520
  builtIn: builtIn,
@@ -14770,40 +14862,6 @@ var pasteTextProcessor = function (group, text, context) {
14770
14862
  exports.pasteTextProcessor = pasteTextProcessor;
14771
14863
 
14772
14864
 
14773
- /***/ }),
14774
-
14775
- /***/ "./packages/roosterjs-content-model-core/lib/override/tablePreProcessor.ts":
14776
- /*!*********************************************************************************!*\
14777
- !*** ./packages/roosterjs-content-model-core/lib/override/tablePreProcessor.ts ***!
14778
- \*********************************************************************************/
14779
- /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
14780
-
14781
- "use strict";
14782
-
14783
- Object.defineProperty(exports, "__esModule", ({ value: true }));
14784
- exports.tablePreProcessor = void 0;
14785
- var roosterjs_content_model_dom_1 = __webpack_require__(/*! roosterjs-content-model-dom */ "./packages/roosterjs-content-model-dom/lib/index.ts");
14786
- /**
14787
- * @internal
14788
- */
14789
- var tablePreProcessor = function (group, element, context) {
14790
- var processor = shouldUseTableProcessor(element, context) ? roosterjs_content_model_dom_1.tableProcessor : roosterjs_content_model_dom_1.entityProcessor;
14791
- processor(group, element, context);
14792
- };
14793
- exports.tablePreProcessor = tablePreProcessor;
14794
- function shouldUseTableProcessor(element, context) {
14795
- var selectionRoot = (0, roosterjs_content_model_dom_1.getSelectionRootNode)(context.selection);
14796
- // Treat table as a real table when:
14797
- // 1. It is a roosterjs table (has metadata)
14798
- // 2. Table is in selection
14799
- // 3. There is selection inside table (or whole table is selected)
14800
- // Otherwise, we treat the table as entity so we will not change it when write back
14801
- return ((0, roosterjs_content_model_dom_1.hasMetadata)(element) ||
14802
- context.isInSelection ||
14803
- (selectionRoot && element.contains(selectionRoot)));
14804
- }
14805
-
14806
-
14807
14865
  /***/ }),
14808
14866
 
14809
14867
  /***/ "./packages/roosterjs-content-model-core/lib/utils/createAriaLiveElement.ts":
@@ -18435,12 +18493,15 @@ var directionFormatHandler_1 = __webpack_require__(/*! ./directionFormatHandler
18435
18493
  */
18436
18494
  exports.htmlAlignFormatHandler = {
18437
18495
  parse: function (format, element, context, defaultStyle) {
18438
- directionFormatHandler_1.directionFormatHandler.parse(format, element, context, defaultStyle);
18439
- var htmlAlign = element.getAttribute('align');
18440
- if (htmlAlign) {
18441
- format.htmlAlign = (0, dir_1.calcAlign)(htmlAlign, format.direction);
18442
- delete format.textAlign;
18443
- delete context.blockFormat.textAlign;
18496
+ // When there is text-align in CSS style on the same element, we should ignore HTML align
18497
+ if (!element.style.textAlign) {
18498
+ directionFormatHandler_1.directionFormatHandler.parse(format, element, context, defaultStyle);
18499
+ var htmlAlign = element.getAttribute('align');
18500
+ if (htmlAlign) {
18501
+ format.htmlAlign = (0, dir_1.calcAlign)(htmlAlign, format.direction);
18502
+ delete format.textAlign;
18503
+ delete context.blockFormat.textAlign;
18504
+ }
18444
18505
  }
18445
18506
  },
18446
18507
  apply: function (format, element) {
@@ -21173,6 +21234,7 @@ exports.normalizeContentModel = normalizeContentModel;
21173
21234
 
21174
21235
  Object.defineProperty(exports, "__esModule", ({ value: true }));
21175
21236
  exports.normalizeParagraph = void 0;
21237
+ var tslib_1 = __webpack_require__(/*! tslib */ "./node_modules/tslib/tslib.es6.mjs");
21176
21238
  var areSameFormats_1 = __webpack_require__(/*! ../../domToModel/utils/areSameFormats */ "./packages/roosterjs-content-model-dom/lib/domToModel/utils/areSameFormats.ts");
21177
21239
  var createBr_1 = __webpack_require__(/*! ../creators/createBr */ "./packages/roosterjs-content-model-dom/lib/modelApi/creators/createBr.ts");
21178
21240
  var isEmpty_1 = __webpack_require__(/*! ./isEmpty */ "./packages/roosterjs-content-model-dom/lib/modelApi/common/isEmpty.ts");
@@ -21208,6 +21270,7 @@ function normalizeParagraph(paragraph) {
21208
21270
  }
21209
21271
  removeEmptyLinks(paragraph);
21210
21272
  removeEmptySegments(paragraph);
21273
+ mergeTextSegments(paragraph);
21211
21274
  moveUpSegmentFormat(paragraph);
21212
21275
  }
21213
21276
  exports.normalizeParagraph = normalizeParagraph;
@@ -21225,6 +21288,40 @@ function removeEmptySegments(block) {
21225
21288
  }
21226
21289
  }
21227
21290
  }
21291
+ function mergeTextSegments(block) {
21292
+ var lastText = null;
21293
+ for (var i = 0; i < block.segments.length; i++) {
21294
+ var segment = block.segments[i];
21295
+ if (segment.segmentType != 'Text') {
21296
+ lastText = null;
21297
+ }
21298
+ else if (!lastText || !segmentsWithSameFormat(lastText, segment)) {
21299
+ lastText = segment;
21300
+ }
21301
+ else {
21302
+ var _a = (0, tslib_1.__read)((0, mutate_1.mutateSegments)(block, [lastText, segment]), 2), mutableBlock = _a[0], _b = (0, tslib_1.__read)(_a[1], 1), mutableLastText = _b[0];
21303
+ mutableLastText.text += segment.text;
21304
+ mutableBlock.segments.splice(i, 1);
21305
+ i--;
21306
+ }
21307
+ }
21308
+ }
21309
+ function segmentsWithSameFormat(seg1, seg2) {
21310
+ return (!!seg1.isSelected == !!seg2.isSelected &&
21311
+ (0, areSameFormats_1.areSameFormats)(seg1.format, seg2.format) &&
21312
+ areSameLinks(seg1.link, seg2.link) &&
21313
+ areSameCodes(seg1.code, seg2.code));
21314
+ }
21315
+ function areSameLinks(link1, link2) {
21316
+ return ((!link1 && !link2) ||
21317
+ (link1 &&
21318
+ link2 &&
21319
+ (0, areSameFormats_1.areSameFormats)(link1.format, link2.format) &&
21320
+ (0, areSameFormats_1.areSameFormats)(link1.dataset, link2.dataset)));
21321
+ }
21322
+ function areSameCodes(code1, code2) {
21323
+ return (!code1 && !code2) || (code1 && code2 && (0, areSameFormats_1.areSameFormats)(code1.format, code2.format));
21324
+ }
21228
21325
  function removeEmptyLinks(paragraph) {
21229
21326
  var marker = paragraph.segments.find(function (x) { return x.segmentType == 'SelectionMarker'; });
21230
21327
  if (marker) {
@@ -22625,7 +22722,7 @@ function deleteExpandedSelection(model, formatContext) {
22625
22722
  // so we can put cursor here after delete
22626
22723
  paragraph = block_1;
22627
22724
  insertMarkerIndex = indexes[0];
22628
- markerFormat = (0, getSegmentTextFormat_1.getSegmentTextFormat)(segments[0]);
22725
+ markerFormat = (0, getSegmentTextFormat_1.getSegmentTextFormat)(segments[0], true /*includingBIU*/);
22629
22726
  context.lastParagraph = paragraph;
22630
22727
  context.lastTableContext = tableContext;
22631
22728
  segments.forEach(function (segment, i) {
@@ -22969,18 +23066,22 @@ exports.getSegmentTextFormat = void 0;
22969
23066
  /**
22970
23067
  * Get the text format of a segment, this function will return only format that is applicable to text
22971
23068
  * @param segment The segment to get format from
23069
+ * @param includingBIU When pass true, also get Bold/Italic/Underline format
22972
23070
  * @returns
22973
23071
  */
22974
- function getSegmentTextFormat(segment) {
23072
+ function getSegmentTextFormat(segment, includingBIU) {
22975
23073
  var _a;
22976
- var _b = (_a = segment === null || segment === void 0 ? void 0 : segment.format) !== null && _a !== void 0 ? _a : {}, fontFamily = _b.fontFamily, fontSize = _b.fontSize, textColor = _b.textColor, backgroundColor = _b.backgroundColor, letterSpacing = _b.letterSpacing, lineHeight = _b.lineHeight;
23074
+ var format = (_a = segment.format) !== null && _a !== void 0 ? _a : {};
22977
23075
  var textFormat = {
22978
- fontFamily: fontFamily,
22979
- fontSize: fontSize,
22980
- textColor: textColor,
22981
- backgroundColor: backgroundColor,
22982
- letterSpacing: letterSpacing,
22983
- lineHeight: lineHeight,
23076
+ fontFamily: format.fontFamily,
23077
+ fontSize: format.fontSize,
23078
+ textColor: format.textColor,
23079
+ backgroundColor: format.backgroundColor,
23080
+ letterSpacing: format.letterSpacing,
23081
+ lineHeight: format.lineHeight,
23082
+ fontWeight: includingBIU ? format.fontWeight : undefined,
23083
+ italic: includingBIU ? format.italic : undefined,
23084
+ underline: includingBIU ? format.underline : undefined,
22984
23085
  };
22985
23086
  return removeUndefinedValues(textFormat);
22986
23087
  }
@@ -23294,12 +23395,26 @@ function getSegmentFormatInLinkFormat(targetFormat) {
23294
23395
  return result;
23295
23396
  }
23296
23397
  function mergeLinkFormat(applyDefaultFormatOption, targetFormat, sourceFormat) {
23297
- return applyDefaultFormatOption == 'mergeAll'
23298
- ? (0, tslib_1.__assign)((0, tslib_1.__assign)({}, getSegmentFormatInLinkFormat(targetFormat)), sourceFormat) : (0, tslib_1.__assign)((0, tslib_1.__assign)((0, tslib_1.__assign)((0, tslib_1.__assign)({}, getFormatWithoutSegmentFormat(sourceFormat)), getSegmentFormatInLinkFormat(targetFormat)), getSemanticFormat(sourceFormat)), getHyperlinkTextColor(sourceFormat));
23398
+ switch (applyDefaultFormatOption) {
23399
+ case 'mergeAll':
23400
+ case 'preferSource':
23401
+ return (0, tslib_1.__assign)((0, tslib_1.__assign)({}, getSegmentFormatInLinkFormat(targetFormat)), sourceFormat);
23402
+ case 'keepSourceEmphasisFormat':
23403
+ return (0, tslib_1.__assign)((0, tslib_1.__assign)((0, tslib_1.__assign)((0, tslib_1.__assign)({}, getFormatWithoutSegmentFormat(sourceFormat)), getSegmentFormatInLinkFormat(targetFormat)), getSemanticFormat(sourceFormat)), getHyperlinkTextColor(sourceFormat));
23404
+ case 'preferTarget':
23405
+ return (0, tslib_1.__assign)((0, tslib_1.__assign)({}, sourceFormat), getSegmentFormatInLinkFormat(targetFormat));
23406
+ }
23299
23407
  }
23300
23408
  function mergeSegmentFormat(applyDefaultFormatOption, targetFormat, sourceFormat) {
23301
- return applyDefaultFormatOption == 'mergeAll'
23302
- ? (0, tslib_1.__assign)((0, tslib_1.__assign)({}, targetFormat), sourceFormat) : (0, tslib_1.__assign)((0, tslib_1.__assign)((0, tslib_1.__assign)({}, getFormatWithoutSegmentFormat(sourceFormat)), targetFormat), getSemanticFormat(sourceFormat));
23409
+ switch (applyDefaultFormatOption) {
23410
+ case 'mergeAll':
23411
+ case 'preferSource':
23412
+ return (0, tslib_1.__assign)((0, tslib_1.__assign)({}, targetFormat), sourceFormat);
23413
+ case 'preferTarget':
23414
+ return (0, tslib_1.__assign)((0, tslib_1.__assign)({}, sourceFormat), targetFormat);
23415
+ case 'keepSourceEmphasisFormat':
23416
+ return (0, tslib_1.__assign)((0, tslib_1.__assign)((0, tslib_1.__assign)({}, getFormatWithoutSegmentFormat(sourceFormat)), targetFormat), getSemanticFormat(sourceFormat));
23417
+ }
23303
23418
  }
23304
23419
  function getSemanticFormat(segmentFormat) {
23305
23420
  var result = {};
@@ -25179,14 +25294,17 @@ function extractSelectionRange(doc, context) {
25179
25294
  }
25180
25295
  }
25181
25296
  function calcPosition(pos) {
25182
- var _a, _b, _c;
25297
+ var _a, _b, _c, _d, _e;
25183
25298
  var result;
25184
25299
  if (pos.block) {
25185
25300
  if (!pos.segment) {
25186
25301
  result = { container: pos.block, offset: 0 };
25187
25302
  }
25188
25303
  else if ((0, isNodeOfType_1.isNodeOfType)(pos.segment, 'TEXT_NODE')) {
25189
- result = { container: pos.segment, offset: ((_a = pos.segment.nodeValue) === null || _a === void 0 ? void 0 : _a.length) || 0 };
25304
+ result = {
25305
+ container: pos.segment,
25306
+ offset: (_c = (_a = pos.offset) !== null && _a !== void 0 ? _a : (_b = pos.segment.nodeValue) === null || _b === void 0 ? void 0 : _b.length) !== null && _c !== void 0 ? _c : 0,
25307
+ };
25190
25308
  }
25191
25309
  else if (pos.segment.parentNode) {
25192
25310
  result = {
@@ -25205,7 +25323,7 @@ function calcPosition(pos) {
25205
25323
  result = {
25206
25324
  container: container,
25207
25325
  offset: (0, isNodeOfType_1.isNodeOfType)(container, 'TEXT_NODE')
25208
- ? (_c = (_b = container.nodeValue) === null || _b === void 0 ? void 0 : _b.length) !== null && _c !== void 0 ? _c : 0
25326
+ ? (_e = (_d = container.nodeValue) === null || _d === void 0 ? void 0 : _d.length) !== null && _e !== void 0 ? _e : 0
25209
25327
  : container.childNodes.length,
25210
25328
  };
25211
25329
  }
@@ -25972,7 +26090,7 @@ var handleParagraph = function (doc, parent, paragraph, context, refNode) {
25972
26090
  else {
25973
26091
  handleSegments();
25974
26092
  }
25975
- (0, optimize_1.optimize)(container);
26093
+ (0, optimize_1.optimize)(container, context);
25976
26094
  // It is possible the next sibling node is changed during processing child segments
25977
26095
  // e.g. When this paragraph is an implicit paragraph and it contains an inline entity segment
25978
26096
  // The segment will be appended to container as child then the container will be removed
@@ -26312,12 +26430,13 @@ function hasSameAttributes(element1, element2) {
26312
26430
  Object.defineProperty(exports, "__esModule", ({ value: true }));
26313
26431
  exports.optimize = void 0;
26314
26432
  var entityUtils_1 = __webpack_require__(/*! ../../domUtils/entityUtils */ "./packages/roosterjs-content-model-dom/lib/domUtils/entityUtils.ts");
26433
+ var isNodeOfType_1 = __webpack_require__(/*! ../../domUtils/isNodeOfType */ "./packages/roosterjs-content-model-dom/lib/domUtils/isNodeOfType.ts");
26315
26434
  var mergeNode_1 = __webpack_require__(/*! ./mergeNode */ "./packages/roosterjs-content-model-dom/lib/modelToDom/optimizers/mergeNode.ts");
26316
26435
  var removeUnnecessarySpan_1 = __webpack_require__(/*! ./removeUnnecessarySpan */ "./packages/roosterjs-content-model-dom/lib/modelToDom/optimizers/removeUnnecessarySpan.ts");
26317
26436
  /**
26318
26437
  * @internal
26319
26438
  */
26320
- function optimize(root) {
26439
+ function optimize(root, context) {
26321
26440
  /**
26322
26441
  * Do no do any optimization to entity
26323
26442
  */
@@ -26327,10 +26446,48 @@ function optimize(root) {
26327
26446
  (0, removeUnnecessarySpan_1.removeUnnecessarySpan)(root);
26328
26447
  (0, mergeNode_1.mergeNode)(root);
26329
26448
  for (var child = root.firstChild; child; child = child.nextSibling) {
26330
- optimize(child);
26449
+ optimize(child, context);
26331
26450
  }
26451
+ normalizeTextNode(root, context);
26332
26452
  }
26333
26453
  exports.optimize = optimize;
26454
+ // Merge continuous text nodes into one single node (same with normalize()),
26455
+ // and update selection and dom indexes
26456
+ function normalizeTextNode(root, context) {
26457
+ var _a, _b, _c, _d;
26458
+ var lastText = null;
26459
+ var child;
26460
+ var next;
26461
+ var selection = context.regularSelection;
26462
+ for (child = root.firstChild, next = child ? child.nextSibling : null; child; child = next, next = child ? child.nextSibling : null) {
26463
+ if (!(0, isNodeOfType_1.isNodeOfType)(child, 'TEXT_NODE')) {
26464
+ lastText = null;
26465
+ }
26466
+ else if (!lastText) {
26467
+ lastText = child;
26468
+ }
26469
+ else {
26470
+ var originalLength = (_b = (_a = lastText.nodeValue) === null || _a === void 0 ? void 0 : _a.length) !== null && _b !== void 0 ? _b : 0;
26471
+ (_c = context.domIndexer) === null || _c === void 0 ? void 0 : _c.onMergeText(lastText, child);
26472
+ lastText.nodeValue += (_d = child.nodeValue) !== null && _d !== void 0 ? _d : '';
26473
+ if (selection) {
26474
+ updateSelection(selection.start, lastText, child, originalLength);
26475
+ updateSelection(selection.end, lastText, child, originalLength);
26476
+ }
26477
+ root.removeChild(child);
26478
+ }
26479
+ }
26480
+ }
26481
+ function updateSelection(mark, lastText, nextText, lastTextOriginalLength) {
26482
+ if (mark && mark.offset == undefined) {
26483
+ if (mark.segment == lastText) {
26484
+ mark.offset = lastTextOriginalLength;
26485
+ }
26486
+ else if (mark.segment == nextText) {
26487
+ mark.segment = lastText;
26488
+ }
26489
+ }
26490
+ }
26334
26491
 
26335
26492
 
26336
26493
  /***/ }),
@@ -26603,7 +26760,6 @@ Object.defineProperty(exports, "__esModule", ({ value: true }));
26603
26760
  exports.AutoFormatPlugin = void 0;
26604
26761
  var roosterjs_content_model_dom_1 = __webpack_require__(/*! roosterjs-content-model-dom */ "./packages/roosterjs-content-model-dom/lib/index.ts");
26605
26762
  var createLink_1 = __webpack_require__(/*! ./link/createLink */ "./packages/roosterjs-content-model-plugins/lib/autoFormat/link/createLink.ts");
26606
- var createLinkAfterSpace_1 = __webpack_require__(/*! ./link/createLinkAfterSpace */ "./packages/roosterjs-content-model-plugins/lib/autoFormat/link/createLinkAfterSpace.ts");
26607
26763
  var roosterjs_content_model_api_1 = __webpack_require__(/*! roosterjs-content-model-api */ "./packages/roosterjs-content-model-api/lib/index.ts");
26608
26764
  var keyboardListTrigger_1 = __webpack_require__(/*! ./list/keyboardListTrigger */ "./packages/roosterjs-content-model-plugins/lib/autoFormat/list/keyboardListTrigger.ts");
26609
26765
  var transformFraction_1 = __webpack_require__(/*! ./numbers/transformFraction */ "./packages/roosterjs-content-model-plugins/lib/autoFormat/numbers/transformFraction.ts");
@@ -26713,11 +26869,14 @@ var AutoFormatPlugin = /** @class */ (function () {
26713
26869
  shouldList = (0, keyboardListTrigger_1.keyboardListTrigger)(model, paragraph, context, autoBullet, autoNumbering);
26714
26870
  }
26715
26871
  if (autoLink || autoTel || autoMailto) {
26716
- shouldLink = (0, createLinkAfterSpace_1.createLinkAfterSpace)(previousSegment, paragraph, context, {
26872
+ shouldLink = !!(0, roosterjs_content_model_api_1.promoteLink)(previousSegment, paragraph, {
26717
26873
  autoLink: autoLink,
26718
26874
  autoTel: autoTel,
26719
26875
  autoMailto: autoMailto,
26720
26876
  });
26877
+ if (shouldLink) {
26878
+ context.canUndoByBackspace = true;
26879
+ }
26721
26880
  }
26722
26881
  if (autoHyphen) {
26723
26882
  shouldHyphen = (0, transformHyphen_1.transformHyphen)(previousSegment, paragraph, context);
@@ -26741,6 +26900,7 @@ var AutoFormatPlugin = /** @class */ (function () {
26741
26900
  }
26742
26901
  };
26743
26902
  AutoFormatPlugin.prototype.handleKeyDownEvent = function (editor, event) {
26903
+ var _this = this;
26744
26904
  var rawEvent = event.rawEvent;
26745
26905
  if (!rawEvent.defaultPrevented && !event.handledByEditFeature) {
26746
26906
  switch (rawEvent.key) {
@@ -26749,6 +26909,20 @@ var AutoFormatPlugin = /** @class */ (function () {
26749
26909
  (0, unlink_1.unlink)(editor, rawEvent);
26750
26910
  }
26751
26911
  break;
26912
+ case 'Tab':
26913
+ (0, roosterjs_content_model_api_1.formatTextSegmentBeforeSelectionMarker)(editor, function (model, _previousSegment, paragraph, _markerFormat, context) {
26914
+ var _a = _this.options, autoBullet = _a.autoBullet, autoNumbering = _a.autoNumbering;
26915
+ var shouldList = false;
26916
+ if (autoBullet || autoNumbering) {
26917
+ shouldList = (0, keyboardListTrigger_1.keyboardListTrigger)(model, paragraph, context, autoBullet, autoNumbering);
26918
+ context.canUndoByBackspace = shouldList;
26919
+ event.rawEvent.preventDefault();
26920
+ }
26921
+ return shouldList;
26922
+ }, {
26923
+ changeSource: roosterjs_content_model_dom_1.ChangeSource.AutoFormat,
26924
+ apiName: 'autoToggleList',
26925
+ });
26752
26926
  }
26753
26927
  }
26754
26928
  };
@@ -26836,33 +27010,26 @@ Object.defineProperty(exports, "__esModule", ({ value: true }));
26836
27010
  exports.createLink = void 0;
26837
27011
  var roosterjs_content_model_dom_1 = __webpack_require__(/*! roosterjs-content-model-dom */ "./packages/roosterjs-content-model-dom/lib/index.ts");
26838
27012
  var roosterjs_content_model_api_1 = __webpack_require__(/*! roosterjs-content-model-api */ "./packages/roosterjs-content-model-api/lib/index.ts");
26839
- var getLinkUrl_1 = __webpack_require__(/*! ./getLinkUrl */ "./packages/roosterjs-content-model-plugins/lib/autoFormat/link/getLinkUrl.ts");
26840
27013
  /**
26841
27014
  * @internal
26842
27015
  */
26843
27016
  function createLink(editor, autoLinkOptions) {
26844
27017
  var anchorNode = null;
26845
27018
  var links = [];
26846
- (0, roosterjs_content_model_api_1.formatTextSegmentBeforeSelectionMarker)(editor, function (_model, linkSegment, _paragraph) {
26847
- if (linkSegment.link) {
26848
- links.push(linkSegment.link);
27019
+ (0, roosterjs_content_model_api_1.formatTextSegmentBeforeSelectionMarker)(editor, function (_model, segment, paragraph) {
27020
+ var promotedSegment = null;
27021
+ if (segment.link) {
27022
+ links.push(segment.link);
26849
27023
  return true;
26850
27024
  }
26851
- var linkUrl = undefined;
26852
- if (!linkSegment.link && (linkUrl = (0, getLinkUrl_1.getLinkUrl)(linkSegment.text, autoLinkOptions))) {
26853
- (0, roosterjs_content_model_dom_1.addLink)(linkSegment, {
26854
- format: {
26855
- href: linkUrl,
26856
- underline: true,
26857
- },
26858
- dataset: {},
26859
- });
26860
- if (linkSegment.link) {
26861
- links.push(linkSegment.link);
26862
- }
27025
+ else if ((promotedSegment = (0, roosterjs_content_model_api_1.promoteLink)(segment, paragraph, autoLinkOptions)) &&
27026
+ promotedSegment.link) {
27027
+ links.push(promotedSegment.link);
26863
27028
  return true;
26864
27029
  }
26865
- return false;
27030
+ else {
27031
+ return false;
27032
+ }
26866
27033
  }, {
26867
27034
  changeSource: roosterjs_content_model_dom_1.ChangeSource.AutoLink,
26868
27035
  onNodeCreated: function (modelElement, node) {
@@ -26876,80 +27043,6 @@ function createLink(editor, autoLinkOptions) {
26876
27043
  exports.createLink = createLink;
26877
27044
 
26878
27045
 
26879
- /***/ }),
26880
-
26881
- /***/ "./packages/roosterjs-content-model-plugins/lib/autoFormat/link/createLinkAfterSpace.ts":
26882
- /*!**********************************************************************************************!*\
26883
- !*** ./packages/roosterjs-content-model-plugins/lib/autoFormat/link/createLinkAfterSpace.ts ***!
26884
- \**********************************************************************************************/
26885
- /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
26886
-
26887
- "use strict";
26888
-
26889
- Object.defineProperty(exports, "__esModule", ({ value: true }));
26890
- exports.createLinkAfterSpace = void 0;
26891
- var getLinkUrl_1 = __webpack_require__(/*! ./getLinkUrl */ "./packages/roosterjs-content-model-plugins/lib/autoFormat/link/getLinkUrl.ts");
26892
- var roosterjs_content_model_api_1 = __webpack_require__(/*! roosterjs-content-model-api */ "./packages/roosterjs-content-model-api/lib/index.ts");
26893
- /**
26894
- * @internal
26895
- */
26896
- function createLinkAfterSpace(previousSegment, paragraph, context, autoLinkOptions) {
26897
- var link = previousSegment.text.split(' ').pop();
26898
- var url = link === null || link === void 0 ? void 0 : link.trim();
26899
- var linkUrl = undefined;
26900
- if (url && link && (linkUrl = (0, getLinkUrl_1.getLinkUrl)(url, autoLinkOptions))) {
26901
- var linkSegment = (0, roosterjs_content_model_api_1.splitTextSegment)(previousSegment, paragraph, previousSegment.text.length - link.trimLeft().length, previousSegment.text.trimRight().length);
26902
- linkSegment.link = {
26903
- format: {
26904
- href: linkUrl,
26905
- underline: true,
26906
- },
26907
- dataset: {},
26908
- };
26909
- context.canUndoByBackspace = true;
26910
- return true;
26911
- }
26912
- return false;
26913
- }
26914
- exports.createLinkAfterSpace = createLinkAfterSpace;
26915
-
26916
-
26917
- /***/ }),
26918
-
26919
- /***/ "./packages/roosterjs-content-model-plugins/lib/autoFormat/link/getLinkUrl.ts":
26920
- /*!************************************************************************************!*\
26921
- !*** ./packages/roosterjs-content-model-plugins/lib/autoFormat/link/getLinkUrl.ts ***!
26922
- \************************************************************************************/
26923
- /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
26924
-
26925
- "use strict";
26926
-
26927
- Object.defineProperty(exports, "__esModule", ({ value: true }));
26928
- exports.getLinkUrl = void 0;
26929
- var roosterjs_content_model_api_1 = __webpack_require__(/*! roosterjs-content-model-api */ "./packages/roosterjs-content-model-api/lib/index.ts");
26930
- var COMMON_REGEX = "[s]*[a-zA-Z0-9+][s]*";
26931
- var TELEPHONE_REGEX = "(T|t)el:" + COMMON_REGEX;
26932
- var MAILTO_REGEX = "(M|m)ailto:" + COMMON_REGEX;
26933
- /**
26934
- * @internal
26935
- */
26936
- function getLinkUrl(text, autoLinkOptions) {
26937
- var _a;
26938
- var autoLink = autoLinkOptions.autoLink, autoMailto = autoLinkOptions.autoMailto, autoTel = autoLinkOptions.autoTel;
26939
- var linkMatch = autoLink ? (_a = (0, roosterjs_content_model_api_1.matchLink)(text)) === null || _a === void 0 ? void 0 : _a.normalizedUrl : undefined;
26940
- var telMatch = autoTel ? matchTel(text) : undefined;
26941
- var mailtoMatch = autoMailto ? matchMailTo(text) : undefined;
26942
- return linkMatch || telMatch || mailtoMatch;
26943
- }
26944
- exports.getLinkUrl = getLinkUrl;
26945
- function matchTel(text) {
26946
- return text.match(TELEPHONE_REGEX) ? text.toLocaleLowerCase() : undefined;
26947
- }
26948
- function matchMailTo(text) {
26949
- return text.match(MAILTO_REGEX) ? text.toLocaleLowerCase() : undefined;
26950
- }
26951
-
26952
-
26953
27046
  /***/ }),
26954
27047
 
26955
27048
  /***/ "./packages/roosterjs-content-model-plugins/lib/autoFormat/link/unlink.ts":
@@ -27420,6 +27513,7 @@ var getOrdinal = function (value) {
27420
27513
  };
27421
27514
  return ORDINALS[value] || 'th';
27422
27515
  };
27516
+ var ORDINALS = ['st', 'nd', 'rd', 'th'];
27423
27517
  /**
27424
27518
  * The two last characters of ordinal number (st, nd, rd, th)
27425
27519
  */
@@ -27429,21 +27523,39 @@ var ORDINAL_LENGTH = 2;
27429
27523
  */ function transformOrdinals(previousSegment, paragraph, context) {
27430
27524
  var _a;
27431
27525
  var value = (_a = previousSegment.text.split(' ').pop()) === null || _a === void 0 ? void 0 : _a.trim();
27526
+ var shouldAddSuperScript = false;
27432
27527
  if (value) {
27433
- var ordinal = value.substring(value.length - ORDINAL_LENGTH); // This value is equal st, nd, rd, th
27434
- var numericValue = getNumericValue(value); //This is the numeric part. Ex: 10th, numeric value = 10
27435
- if (numericValue && getOrdinal(numericValue) === ordinal) {
27528
+ var isOrdinal = ORDINALS.indexOf(value) > -1;
27529
+ if (isOrdinal) {
27530
+ var index = paragraph.segments.indexOf(previousSegment);
27531
+ var numberSegment = paragraph.segments[index - 1];
27532
+ var numericValue = null;
27533
+ if (numberSegment &&
27534
+ numberSegment.segmentType == 'Text' &&
27535
+ (numericValue = getNumericValue(numberSegment.text, true /* checkFullText */)) &&
27536
+ getOrdinal(numericValue) === value) {
27537
+ shouldAddSuperScript = true;
27538
+ }
27539
+ }
27540
+ else {
27541
+ var ordinal = value.substring(value.length - ORDINAL_LENGTH); // This value is equal st, nd, rd, th
27542
+ var numericValue = getNumericValue(value); //This is the numeric part. Ex: 10th, numeric value =
27543
+ if (numericValue && getOrdinal(numericValue) === ordinal) {
27544
+ shouldAddSuperScript = true;
27545
+ }
27546
+ }
27547
+ if (shouldAddSuperScript) {
27436
27548
  var ordinalSegment = (0, roosterjs_content_model_api_1.splitTextSegment)(previousSegment, paragraph, previousSegment.text.length - 3, previousSegment.text.length - 1);
27437
27549
  ordinalSegment.format.superOrSubScriptSequence = 'super';
27438
27550
  context.canUndoByBackspace = true;
27439
- return true;
27440
27551
  }
27441
27552
  }
27442
- return false;
27553
+ return shouldAddSuperScript;
27443
27554
  }
27444
27555
  exports.transformOrdinals = transformOrdinals;
27445
- function getNumericValue(text) {
27446
- var number = text.substring(0, text.length - ORDINAL_LENGTH);
27556
+ function getNumericValue(text, checkFullText) {
27557
+ if (checkFullText === void 0) { checkFullText = false; }
27558
+ var number = checkFullText ? text : text.substring(0, text.length - ORDINAL_LENGTH);
27447
27559
  var isNumber = /^-?\d+$/.test(number);
27448
27560
  if (isNumber) {
27449
27561
  return parseInt(text);
@@ -27778,6 +27890,7 @@ var EditPlugin = /** @class */ (function () {
27778
27890
  };
27779
27891
  EditPlugin.prototype.handleKeyDownEvent = function (editor, event) {
27780
27892
  var rawEvent = event.rawEvent;
27893
+ var hasCtrlOrMetaKey = rawEvent.ctrlKey || rawEvent.metaKey;
27781
27894
  if (!rawEvent.defaultPrevented && !event.handledByEditFeature) {
27782
27895
  switch (rawEvent.key) {
27783
27896
  case 'Backspace':
@@ -27794,7 +27907,7 @@ var EditPlugin = /** @class */ (function () {
27794
27907
  }
27795
27908
  break;
27796
27909
  case 'Tab':
27797
- if (this.options.handleTabKey) {
27910
+ if (this.options.handleTabKey && !hasCtrlOrMetaKey) {
27798
27911
  (0, keyboardTab_1.keyboardTab)(editor, rawEvent);
27799
27912
  }
27800
27913
  break;
@@ -27804,7 +27917,9 @@ var EditPlugin = /** @class */ (function () {
27804
27917
  }
27805
27918
  break;
27806
27919
  case 'Enter':
27807
- (0, keyboardEnter_1.keyboardEnter)(editor, rawEvent, this.handleNormalEnter);
27920
+ if (!hasCtrlOrMetaKey) {
27921
+ (0, keyboardEnter_1.keyboardEnter)(editor, rawEvent, this.handleNormalEnter);
27922
+ }
27808
27923
  break;
27809
27924
  default:
27810
27925
  (0, keyboardInput_1.keyboardInput)(editor, rawEvent);
@@ -28367,6 +28482,41 @@ function shouldDeleteAllSegmentsBefore(rawEvent) {
28367
28482
  exports.shouldDeleteAllSegmentsBefore = shouldDeleteAllSegmentsBefore;
28368
28483
 
28369
28484
 
28485
+ /***/ }),
28486
+
28487
+ /***/ "./packages/roosterjs-content-model-plugins/lib/edit/inputSteps/handleAutoLink.ts":
28488
+ /*!****************************************************************************************!*\
28489
+ !*** ./packages/roosterjs-content-model-plugins/lib/edit/inputSteps/handleAutoLink.ts ***!
28490
+ \****************************************************************************************/
28491
+ /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
28492
+
28493
+ "use strict";
28494
+
28495
+ Object.defineProperty(exports, "__esModule", ({ value: true }));
28496
+ exports.handleAutoLink = void 0;
28497
+ var roosterjs_content_model_api_1 = __webpack_require__(/*! roosterjs-content-model-api */ "./packages/roosterjs-content-model-api/lib/index.ts");
28498
+ /**
28499
+ * @internal
28500
+ */
28501
+ var handleAutoLink = function (context) {
28502
+ var deleteResult = context.deleteResult, insertPoint = context.insertPoint;
28503
+ if (deleteResult == 'notDeleted' || deleteResult == 'nothingToDelete') {
28504
+ var marker = insertPoint.marker, paragraph = insertPoint.paragraph;
28505
+ var index = paragraph.segments.indexOf(marker);
28506
+ var segBefore = index > 0 ? paragraph.segments[index - 1] : null;
28507
+ if ((segBefore === null || segBefore === void 0 ? void 0 : segBefore.segmentType) == 'Text' &&
28508
+ (0, roosterjs_content_model_api_1.promoteLink)(segBefore, paragraph, {
28509
+ autoLink: true,
28510
+ }) &&
28511
+ context.formatContext) {
28512
+ context.formatContext.canUndoByBackspace = true;
28513
+ }
28514
+ // Do not set deleteResult here since we haven't really start a new paragraph, we need other delete step to keep working on it
28515
+ }
28516
+ };
28517
+ exports.handleAutoLink = handleAutoLink;
28518
+
28519
+
28370
28520
  /***/ }),
28371
28521
 
28372
28522
  /***/ "./packages/roosterjs-content-model-plugins/lib/edit/inputSteps/handleEnterOnList.ts":
@@ -28596,6 +28746,7 @@ function canDeleteAfter(rawEvent, range) {
28596
28746
  Object.defineProperty(exports, "__esModule", ({ value: true }));
28597
28747
  exports.keyboardEnter = void 0;
28598
28748
  var deleteEmptyQuote_1 = __webpack_require__(/*! ./deleteSteps/deleteEmptyQuote */ "./packages/roosterjs-content-model-plugins/lib/edit/deleteSteps/deleteEmptyQuote.ts");
28749
+ var handleAutoLink_1 = __webpack_require__(/*! ./inputSteps/handleAutoLink */ "./packages/roosterjs-content-model-plugins/lib/edit/inputSteps/handleAutoLink.ts");
28599
28750
  var handleEnterOnList_1 = __webpack_require__(/*! ./inputSteps/handleEnterOnList */ "./packages/roosterjs-content-model-plugins/lib/edit/inputSteps/handleEnterOnList.ts");
28600
28751
  var handleEnterOnParagraph_1 = __webpack_require__(/*! ./inputSteps/handleEnterOnParagraph */ "./packages/roosterjs-content-model-plugins/lib/edit/inputSteps/handleEnterOnParagraph.ts");
28601
28752
  var roosterjs_content_model_dom_1 = __webpack_require__(/*! roosterjs-content-model-dom */ "./packages/roosterjs-content-model-dom/lib/index.ts");
@@ -28613,7 +28764,9 @@ function keyboardEnter(editor, rawEvent, handleNormalEnter) {
28613
28764
  // For ENTER key, although we may have deleted something, since we still need to split the line, we always treat it as not delete
28614
28765
  // so further delete steps can keep working
28615
28766
  result.deleteResult = 'notDeleted';
28616
- var steps = rawEvent.shiftKey ? [] : [handleEnterOnList_1.handleEnterOnList, deleteEmptyQuote_1.deleteEmptyQuote];
28767
+ var steps = rawEvent.shiftKey
28768
+ ? []
28769
+ : [handleAutoLink_1.handleAutoLink, handleEnterOnList_1.handleEnterOnList, deleteEmptyQuote_1.deleteEmptyQuote];
28617
28770
  if (handleNormalEnter) {
28618
28771
  steps.push(handleEnterOnParagraph_1.handleEnterOnParagraph);
28619
28772
  }
@@ -28633,6 +28786,8 @@ function keyboardEnter(editor, rawEvent, handleNormalEnter) {
28633
28786
  rawEvent: rawEvent,
28634
28787
  scrollCaretIntoView: true,
28635
28788
  changeSource: roosterjs_content_model_dom_1.ChangeSource.Keyboard,
28789
+ getChangeData: function () { return rawEvent.which; },
28790
+ apiName: 'handleEnterKey',
28636
28791
  });
28637
28792
  }
28638
28793
  exports.keyboardEnter = keyboardEnter;
@@ -28677,6 +28832,8 @@ function keyboardInput(editor, rawEvent) {
28677
28832
  scrollCaretIntoView: true,
28678
28833
  rawEvent: rawEvent,
28679
28834
  changeSource: roosterjs_content_model_dom_1.ChangeSource.Keyboard,
28835
+ getChangeData: function () { return rawEvent.which; },
28836
+ apiName: 'handleInputKey',
28680
28837
  });
28681
28838
  return true;
28682
28839
  }
@@ -28724,6 +28881,9 @@ function keyboardTab(editor, rawEvent) {
28724
28881
  return handleTab(model, rawEvent, context);
28725
28882
  }, {
28726
28883
  apiName: 'handleTabKey',
28884
+ rawEvent: rawEvent,
28885
+ changeSource: roosterjs_content_model_dom_1.ChangeSource.Keyboard,
28886
+ getChangeData: function () { return rawEvent.which; },
28727
28887
  });
28728
28888
  return true;
28729
28889
  case 'table':
@@ -28731,7 +28891,9 @@ function keyboardTab(editor, rawEvent) {
28731
28891
  return (0, handleTabOnTable_1.handleTabOnTable)(model, rawEvent);
28732
28892
  }, {
28733
28893
  apiName: 'handleTabKey',
28894
+ rawEvent: rawEvent,
28734
28895
  changeSource: roosterjs_content_model_dom_1.ChangeSource.Keyboard,
28896
+ getChangeData: function () { return rawEvent.which; },
28735
28897
  });
28736
28898
  return true;
28737
28899
  }