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