roosterjs 9.10.0 → 9.11.2

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.
@@ -2426,8 +2426,16 @@ function setModelIndentation(model, indentation, length, context) {
2426
2426
  }
2427
2427
  else if (block.levels.length == 1 || !isMultilevelSelection(model, block, parent)) {
2428
2428
  if (isIndent) {
2429
- var lastLevel = block.levels[block.levels.length - 1];
2430
- var newLevel = (0, roosterjs_content_model_dom_1.createListLevel)((lastLevel === null || lastLevel === void 0 ? void 0 : lastLevel.listType) || 'UL', lastLevel === null || lastLevel === void 0 ? void 0 : lastLevel.format);
2429
+ var threadIdx = thread.indexOf(block);
2430
+ var previousItem = thread[threadIdx - 1];
2431
+ var nextItem = thread[threadIdx + 1];
2432
+ var levelLength = block.levels.length;
2433
+ var lastLevel = block.levels[levelLength - 1];
2434
+ var newLevel = (0, roosterjs_content_model_dom_1.createListLevel)((lastLevel === null || lastLevel === void 0 ? void 0 : lastLevel.listType) || 'UL', lastLevel === null || lastLevel === void 0 ? void 0 : lastLevel.format, previousItem && previousItem.levels.length > levelLength
2435
+ ? previousItem.levels[levelLength].dataset
2436
+ : nextItem && nextItem.levels.length > levelLength
2437
+ ? nextItem.levels[levelLength].dataset
2438
+ : undefined);
2431
2439
  (0, roosterjs_content_model_dom_1.updateListMetadata)(newLevel, function (metadata) {
2432
2440
  metadata = metadata || {};
2433
2441
  metadata.applyListStyleFromLevel = true;
@@ -2602,6 +2610,7 @@ var roosterjs_content_model_dom_1 = __webpack_require__(/*! roosterjs-content-mo
2602
2610
  * @internal
2603
2611
  */
2604
2612
  function clearModelFormat(model, blocksToClear, segmentsToClear, tablesToClear) {
2613
+ var pendingStructureChange = false;
2605
2614
  (0, roosterjs_content_model_dom_1.iterateSelections)(model, function (path, tableContext, block, segments) {
2606
2615
  if (segments) {
2607
2616
  if ((block === null || block === void 0 ? void 0 : block.blockType) == 'Paragraph') {
@@ -2633,14 +2642,14 @@ function clearModelFormat(model, blocksToClear, segmentsToClear, tablesToClear)
2633
2642
  isOnlySelectionMarkerSelected(blocksToClear[0][1]) &&
2634
2643
  blocksToClear.length == 1) {
2635
2644
  segmentsToClear.splice.apply(segmentsToClear, (0, tslib_1.__spreadArray)([0, segmentsToClear.length], (0, tslib_1.__read)((0, adjustWordSelection_1.adjustWordSelection)(model, marker)), false));
2636
- clearListFormat(blocksToClear[0][0]);
2645
+ pendingStructureChange = clearListFormat(blocksToClear[0][0]) || pendingStructureChange;
2637
2646
  }
2638
2647
  else if (blocksToClear.length > 1 || blocksToClear.some(function (x) { return isWholeBlockSelected(x[1]); })) {
2639
2648
  // 2. If a full block or multiple blocks are selected, clear block format
2640
2649
  for (var i = blocksToClear.length - 1; i >= 0; i--) {
2641
2650
  var _a = (0, tslib_1.__read)(blocksToClear[i], 2), path = _a[0], block = _a[1];
2642
2651
  clearBlockFormat(path, block);
2643
- clearListFormat(path);
2652
+ pendingStructureChange = clearListFormat(path) || pendingStructureChange;
2644
2653
  clearContainerFormat(path, block);
2645
2654
  }
2646
2655
  }
@@ -2648,6 +2657,7 @@ function clearModelFormat(model, blocksToClear, segmentsToClear, tablesToClear)
2648
2657
  clearSegmentsFormat(segmentsToClear, model.format);
2649
2658
  // 4. Clear format for table if any
2650
2659
  createTablesFormat(tablesToClear);
2660
+ return pendingStructureChange;
2651
2661
  }
2652
2662
  exports.clearModelFormat = clearModelFormat;
2653
2663
  function createTablesFormat(tablesToClear) {
@@ -2707,6 +2717,10 @@ function clearListFormat(path) {
2707
2717
  var listItem = path[(0, roosterjs_content_model_dom_1.getClosestAncestorBlockGroupIndex)(path, ['ListItem'], ['TableCell'])];
2708
2718
  if (listItem) {
2709
2719
  (0, roosterjs_content_model_dom_1.mutateBlock)(listItem).levels = [];
2720
+ return true;
2721
+ }
2722
+ else {
2723
+ return false;
2710
2724
  }
2711
2725
  }
2712
2726
  function clearBlockFormat(path, block) {
@@ -4929,6 +4943,7 @@ Object.defineProperty(exports, "__esModule", ({ value: true }));
4929
4943
  exports.clearFormat = void 0;
4930
4944
  var clearModelFormat_1 = __webpack_require__(/*! ../../modelApi/common/clearModelFormat */ "./packages/roosterjs-content-model-api/lib/modelApi/common/clearModelFormat.ts");
4931
4945
  var roosterjs_content_model_dom_1 = __webpack_require__(/*! roosterjs-content-model-dom */ "./packages/roosterjs-content-model-dom/lib/index.ts");
4946
+ var MAX_TRY = 3;
4932
4947
  /**
4933
4948
  * Clear format of selection
4934
4949
  * @param editor The editor to clear format from
@@ -4936,12 +4951,22 @@ var roosterjs_content_model_dom_1 = __webpack_require__(/*! roosterjs-content-mo
4936
4951
  function clearFormat(editor) {
4937
4952
  editor.focus();
4938
4953
  editor.formatContentModel(function (model) {
4939
- var blocksToClear = [];
4940
- var segmentsToClear = [];
4941
- var tablesToClear = [];
4942
- (0, clearModelFormat_1.clearModelFormat)(model, blocksToClear, segmentsToClear, tablesToClear);
4943
- (0, roosterjs_content_model_dom_1.normalizeContentModel)(model);
4944
- return (blocksToClear.length > 0 || segmentsToClear.length > 0 || tablesToClear.length > 0);
4954
+ var changed = false;
4955
+ var needtoRun = true;
4956
+ var triedTimes = 0;
4957
+ while (needtoRun && triedTimes++ < MAX_TRY) {
4958
+ var blocksToClear = [];
4959
+ var segmentsToClear = [];
4960
+ var tablesToClear = [];
4961
+ needtoRun = (0, clearModelFormat_1.clearModelFormat)(model, blocksToClear, segmentsToClear, tablesToClear);
4962
+ (0, roosterjs_content_model_dom_1.normalizeContentModel)(model);
4963
+ changed =
4964
+ changed ||
4965
+ blocksToClear.length > 0 ||
4966
+ segmentsToClear.length > 0 ||
4967
+ tablesToClear.length > 0;
4968
+ }
4969
+ return changed;
4945
4970
  }, {
4946
4971
  apiName: 'clearFormat',
4947
4972
  });
@@ -10371,8 +10396,8 @@ var DomIndexerImpl = /** @class */ (function () {
10371
10396
  };
10372
10397
  DomIndexerImpl.prototype.reconcileTextSelection = function (textNode, startOffset, endOffset) {
10373
10398
  var _a;
10374
- var _b;
10375
- var _c = textNode.__roosterjsContentModel, paragraph = _c.paragraph, segments = _c.segments;
10399
+ var _b, _c;
10400
+ var _d = textNode.__roosterjsContentModel, paragraph = _d.paragraph, segments = _d.segments;
10376
10401
  var first = segments[0];
10377
10402
  var last = segments[segments.length - 1];
10378
10403
  var selectable;
@@ -10394,6 +10419,14 @@ var DomIndexerImpl = /** @class */ (function () {
10394
10419
  if (endOffset === undefined) {
10395
10420
  var marker = (0, roosterjs_content_model_dom_1.createSelectionMarker)(first.format);
10396
10421
  newSegments.push(marker);
10422
+ if (startOffset < ((_b = textNode.nodeValue) !== null && _b !== void 0 ? _b : '').length) {
10423
+ if (first.link) {
10424
+ (0, roosterjs_content_model_dom_1.addLink)(marker, first.link);
10425
+ }
10426
+ if (first.code) {
10427
+ (0, roosterjs_content_model_dom_1.addCode)(marker, first.code);
10428
+ }
10429
+ }
10397
10430
  selectable = marker;
10398
10431
  endOffset = startOffset;
10399
10432
  }
@@ -10435,7 +10468,7 @@ var DomIndexerImpl = /** @class */ (function () {
10435
10468
  var isBefore = wrapper.previousSibling == delimiter;
10436
10469
  var isAfter = wrapper.nextSibling == delimiter;
10437
10470
  if (index >= 0 && delimiter && (0, roosterjs_content_model_dom_1.isEntityDelimiter)(delimiter) && (isBefore || isAfter)) {
10438
- var marker = (0, roosterjs_content_model_dom_1.createSelectionMarker)(((_b = paragraph.segments[isAfter ? index + 1 : index - 1]) !== null && _b !== void 0 ? _b : first).format);
10471
+ var marker = (0, roosterjs_content_model_dom_1.createSelectionMarker)(((_c = paragraph.segments[isAfter ? index + 1 : index - 1]) !== null && _c !== void 0 ? _c : first).format);
10439
10472
  paragraph.segments.splice(isAfter ? index + 1 : index, 0, marker);
10440
10473
  selectable = marker;
10441
10474
  }
@@ -10848,10 +10881,12 @@ Object.defineProperty(exports, "__esModule", ({ value: true }));
10848
10881
  exports.createCopyPastePlugin = exports.preprocessTable = exports.onNodeCreated = exports.adjustSelectionForCopyCut = void 0;
10849
10882
  var tslib_1 = __webpack_require__(/*! tslib */ "./node_modules/tslib/tslib.es6.mjs");
10850
10883
  var addRangeToSelection_1 = __webpack_require__(/*! ../../coreApi/setDOMSelection/addRangeToSelection */ "./packages/roosterjs-content-model-core/lib/coreApi/setDOMSelection/addRangeToSelection.ts");
10851
- var deleteEmptyList_1 = __webpack_require__(/*! ./deleteEmptyList */ "./packages/roosterjs-content-model-core/lib/corePlugin/copyPaste/deleteEmptyList.ts");
10884
+ var adjustImageSelectionOnSafari_1 = __webpack_require__(/*! ./utils/adjustImageSelectionOnSafari */ "./packages/roosterjs-content-model-core/lib/corePlugin/copyPaste/utils/adjustImageSelectionOnSafari.ts");
10885
+ var deleteEmptyList_1 = __webpack_require__(/*! ./utils/deleteEmptyList */ "./packages/roosterjs-content-model-core/lib/corePlugin/copyPaste/utils/deleteEmptyList.ts");
10852
10886
  var pasteCopyBlockEntityParser_1 = __webpack_require__(/*! ../../override/pasteCopyBlockEntityParser */ "./packages/roosterjs-content-model-core/lib/override/pasteCopyBlockEntityParser.ts");
10853
10887
  var paste_1 = __webpack_require__(/*! ../../command/paste/paste */ "./packages/roosterjs-content-model-core/lib/command/paste/paste.ts");
10854
10888
  var roosterjs_content_model_dom_1 = __webpack_require__(/*! roosterjs-content-model-dom */ "./packages/roosterjs-content-model-dom/lib/index.ts");
10889
+ var TEMP_DIV_ID = 'roosterJS_copyCutTempDiv';
10855
10890
  /**
10856
10891
  * Copy and paste plugin for handling onCopy and onPaste event
10857
10892
  */
@@ -10938,6 +10973,7 @@ var CopyPastePlugin = /** @class */ (function () {
10938
10973
  }
10939
10974
  var doc = this.editor.getDocument();
10940
10975
  var selection = this.editor.getDOMSelection();
10976
+ (0, adjustImageSelectionOnSafari_1.adjustImageSelectionOnSafari)(this.editor, selection);
10941
10977
  if (selection && (selection.type != 'range' || !selection.range.collapsed)) {
10942
10978
  var pasteModel = this.editor.getContentModelCopy('disconnected');
10943
10979
  if (selection.type === 'table') {
@@ -11014,6 +11050,7 @@ var CopyPastePlugin = /** @class */ (function () {
11014
11050
  div.style.color = 'black';
11015
11051
  div.childNodes.forEach(function (node) { return div.removeChild(node); });
11016
11052
  div.style.display = '';
11053
+ div.id = TEMP_DIV_ID;
11017
11054
  div.focus();
11018
11055
  return div;
11019
11056
  };
@@ -11115,10 +11152,41 @@ exports.createCopyPastePlugin = createCopyPastePlugin;
11115
11152
 
11116
11153
  /***/ }),
11117
11154
 
11118
- /***/ "./packages/roosterjs-content-model-core/lib/corePlugin/copyPaste/deleteEmptyList.ts":
11119
- /*!*******************************************************************************************!*\
11120
- !*** ./packages/roosterjs-content-model-core/lib/corePlugin/copyPaste/deleteEmptyList.ts ***!
11121
- \*******************************************************************************************/
11155
+ /***/ "./packages/roosterjs-content-model-core/lib/corePlugin/copyPaste/utils/adjustImageSelectionOnSafari.ts":
11156
+ /*!**************************************************************************************************************!*\
11157
+ !*** ./packages/roosterjs-content-model-core/lib/corePlugin/copyPaste/utils/adjustImageSelectionOnSafari.ts ***!
11158
+ \**************************************************************************************************************/
11159
+ /***/ ((__unused_webpack_module, exports) => {
11160
+
11161
+ "use strict";
11162
+
11163
+ Object.defineProperty(exports, "__esModule", ({ value: true }));
11164
+ exports.adjustImageSelectionOnSafari = void 0;
11165
+ /**
11166
+ * @internal
11167
+ * Adjust Image selection, so the copy by keyboard does not remove image selection.
11168
+ */
11169
+ function adjustImageSelectionOnSafari(editor, selection) {
11170
+ if (editor.getEnvironment().isSafari && (selection === null || selection === void 0 ? void 0 : selection.type) == 'image') {
11171
+ var range = new Range();
11172
+ range.setStartBefore(selection.image);
11173
+ range.setEndAfter(selection.image);
11174
+ editor.setDOMSelection({
11175
+ range: range,
11176
+ type: 'range',
11177
+ isReverted: false,
11178
+ });
11179
+ }
11180
+ }
11181
+ exports.adjustImageSelectionOnSafari = adjustImageSelectionOnSafari;
11182
+
11183
+
11184
+ /***/ }),
11185
+
11186
+ /***/ "./packages/roosterjs-content-model-core/lib/corePlugin/copyPaste/utils/deleteEmptyList.ts":
11187
+ /*!*************************************************************************************************!*\
11188
+ !*** ./packages/roosterjs-content-model-core/lib/corePlugin/copyPaste/utils/deleteEmptyList.ts ***!
11189
+ \*************************************************************************************************/
11122
11190
  /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
11123
11191
 
11124
11192
  "use strict";
@@ -14151,6 +14219,12 @@ var DOMHelperImpl = /** @class */ (function () {
14151
14219
  var paddingRight = (0, roosterjs_content_model_dom_1.parseValueWithUnit)(style === null || style === void 0 ? void 0 : style.paddingRight);
14152
14220
  return this.contentDiv.clientWidth - (paddingLeft + paddingRight);
14153
14221
  };
14222
+ /**
14223
+ * Get a deep cloned root element
14224
+ */
14225
+ DOMHelperImpl.prototype.getClonedRoot = function () {
14226
+ return this.contentDiv.cloneNode(true /*deep*/);
14227
+ };
14154
14228
  return DOMHelperImpl;
14155
14229
  }());
14156
14230
  /**
@@ -15691,18 +15765,27 @@ exports.blockProcessor = blockProcessor;
15691
15765
 
15692
15766
  Object.defineProperty(exports, "__esModule", ({ value: true }));
15693
15767
  exports.brProcessor = void 0;
15768
+ var tslib_1 = __webpack_require__(/*! tslib */ "./node_modules/tslib/tslib.es6.mjs");
15694
15769
  var addSegment_1 = __webpack_require__(/*! ../../modelApi/common/addSegment */ "./packages/roosterjs-content-model-dom/lib/modelApi/common/addSegment.ts");
15695
15770
  var createBr_1 = __webpack_require__(/*! ../../modelApi/creators/createBr */ "./packages/roosterjs-content-model-dom/lib/modelApi/creators/createBr.ts");
15771
+ var getRegularSelectionOffsets_1 = __webpack_require__(/*! ../utils/getRegularSelectionOffsets */ "./packages/roosterjs-content-model-dom/lib/domToModel/utils/getRegularSelectionOffsets.ts");
15696
15772
  /**
15697
15773
  * @internal
15698
15774
  */
15699
15775
  var brProcessor = function (group, element, context) {
15700
15776
  var _a;
15701
15777
  var br = (0, createBr_1.createBr)(context.segmentFormat);
15778
+ var _b = (0, tslib_1.__read)((0, getRegularSelectionOffsets_1.getRegularSelectionOffsets)(context, element), 2), start = _b[0], end = _b[1];
15779
+ if (start >= 0) {
15780
+ context.isInSelection = true;
15781
+ }
15702
15782
  if (context.isInSelection) {
15703
15783
  br.isSelected = true;
15704
15784
  }
15705
15785
  var paragraph = (0, addSegment_1.addSegment)(group, br, context.blockFormat);
15786
+ if (end >= 0) {
15787
+ context.isInSelection = false;
15788
+ }
15706
15789
  (_a = context.domIndexer) === null || _a === void 0 ? void 0 : _a.onSegment(element, paragraph, [br]);
15707
15790
  };
15708
15791
  exports.brProcessor = brProcessor;
@@ -20904,8 +20987,6 @@ function isSegmentEmpty(segment) {
20904
20987
  switch (segment.segmentType) {
20905
20988
  case 'Text':
20906
20989
  return !segment.text;
20907
- case 'Image':
20908
- return !segment.src;
20909
20990
  default:
20910
20991
  return false;
20911
20992
  }
@@ -21119,6 +21200,7 @@ function normalizeParagraph(paragraph) {
21119
21200
  (0, mutate_1.mutateBlock)(paragraph).segments.pop();
21120
21201
  }
21121
21202
  }
21203
+ normalizeParagraphStyle(paragraph);
21122
21204
  }
21123
21205
  if (!(0, isWhiteSpacePreserved_1.isWhiteSpacePreserved)(paragraph.format.whiteSpace)) {
21124
21206
  (0, normalizeSegment_1.normalizeAllSegments)(paragraph);
@@ -21128,6 +21210,13 @@ function normalizeParagraph(paragraph) {
21128
21210
  moveUpSegmentFormat(paragraph);
21129
21211
  }
21130
21212
  exports.normalizeParagraph = normalizeParagraph;
21213
+ function normalizeParagraphStyle(paragraph) {
21214
+ // New paragraph should not have white-space style
21215
+ if (paragraph.format.whiteSpace &&
21216
+ paragraph.segments.every(function (seg) { return seg.segmentType == 'Br' || seg.segmentType == 'SelectionMarker'; })) {
21217
+ delete (0, mutate_1.mutateBlock)(paragraph).format.whiteSpace;
21218
+ }
21219
+ }
21131
21220
  function removeEmptySegments(block) {
21132
21221
  for (var j = block.segments.length - 1; j >= 0; j--) {
21133
21222
  if ((0, isEmpty_1.isSegmentEmpty)(block.segments[j])) {
@@ -22947,15 +23036,16 @@ var KeysOfSegmentFormat = (0, getObjectKeys_1.getObjectKeys)(EmptySegmentFormat_
22947
23036
  function mergeModel(target, source, context, options) {
22948
23037
  var _a;
22949
23038
  var insertPosition = (_a = options === null || options === void 0 ? void 0 : options.insertPosition) !== null && _a !== void 0 ? _a : (0, deleteSelection_1.deleteSelection)(target, [], context).insertPoint;
22950
- if (options === null || options === void 0 ? void 0 : options.addParagraphAfterMergedContent) {
22951
- var _b = insertPosition || {}, paragraph = _b.paragraph, marker = _b.marker;
23039
+ var _b = options || {}, addParagraphAfterMergedContent = _b.addParagraphAfterMergedContent, mergeFormat = _b.mergeFormat, mergeTable = _b.mergeTable;
23040
+ if (addParagraphAfterMergedContent && !mergeTable) {
23041
+ var _c = insertPosition || {}, paragraph = _c.paragraph, marker = _c.marker;
22952
23042
  var newPara = (0, createParagraph_1.createParagraph)(false /* isImplicit */, paragraph === null || paragraph === void 0 ? void 0 : paragraph.format, marker === null || marker === void 0 ? void 0 : marker.format);
22953
23043
  (0, addBlock_1.addBlock)(source, newPara);
22954
23044
  }
22955
23045
  if (insertPosition) {
22956
- if ((options === null || options === void 0 ? void 0 : options.mergeFormat) && options.mergeFormat != 'none') {
23046
+ if (mergeFormat && mergeFormat != 'none') {
22957
23047
  var newFormat = (0, tslib_1.__assign)((0, tslib_1.__assign)({}, (target.format || {})), insertPosition.marker.format);
22958
- applyDefaultFormat(source, newFormat, options === null || options === void 0 ? void 0 : options.mergeFormat);
23048
+ applyDefaultFormat(source, newFormat, mergeFormat);
22959
23049
  }
22960
23050
  for (var i = 0; i < source.blocks.length; i++) {
22961
23051
  var block = source.blocks[i];
@@ -22971,8 +23061,8 @@ function mergeModel(target, source, context, options) {
22971
23061
  context === null || context === void 0 ? void 0 : context.newEntities.push(block);
22972
23062
  break;
22973
23063
  case 'Table':
22974
- if (source.blocks.length == 1 && (options === null || options === void 0 ? void 0 : options.mergeTable)) {
22975
- mergeTable(insertPosition, block, source);
23064
+ if (source.blocks.length == 1 && mergeTable) {
23065
+ mergeTables(insertPosition, block, source);
22976
23066
  }
22977
23067
  else {
22978
23068
  insertBlock(insertPosition, block);
@@ -23042,7 +23132,7 @@ function mergeParagraph(markerPosition, newPara, mergeToCurrentParagraph, contex
23042
23132
  newParagraph.format = (0, tslib_1.__assign)((0, tslib_1.__assign)({}, newParagraph.format), newPara.format);
23043
23133
  }
23044
23134
  }
23045
- function mergeTable(markerPosition, newTable, source) {
23135
+ function mergeTables(markerPosition, newTable, source) {
23046
23136
  var _a, _b;
23047
23137
  var tableContext = markerPosition.tableContext, marker = markerPosition.marker;
23048
23138
  if (tableContext && source.blocks.length == 1 && source.blocks[0] == newTable) {
@@ -26540,11 +26630,13 @@ var AutoFormatPlugin = /** @class */ (function () {
26540
26630
  * @param options An optional parameter that takes in an object of type AutoFormatOptions, which includes the following properties:
26541
26631
  * - autoBullet: A boolean that enables or disables automatic bullet list formatting. Defaults to false.
26542
26632
  * - autoNumbering: A boolean that enables or disables automatic numbering formatting. Defaults to false.
26543
- * - autoLink: A boolean that enables or disables automatic hyperlink creation when pasting or typing content. Defaults to false.
26544
- * - autoUnlink: A boolean that enables or disables automatic hyperlink removal when pressing backspace. Defaults to false.
26545
26633
  * - autoHyphen: A boolean that enables or disables automatic hyphen transformation. Defaults to false.
26546
26634
  * - autoFraction: A boolean that enables or disables automatic fraction transformation. Defaults to false.
26547
26635
  * - autoOrdinals: A boolean that enables or disables automatic ordinal number transformation. Defaults to false.
26636
+ * - autoLink: A boolean that enables or disables automatic hyperlink url address creation when pasting or typing content. Defaults to false.
26637
+ * - autoUnlink: A boolean that enables or disables automatic hyperlink removal when pressing backspace. Defaults to false.
26638
+ * - autoTel: A boolean that enables or disables automatic hyperlink telephone numbers transformation. Defaults to false.
26639
+ * - autoMailto: A boolean that enables or disables automatic hyperlink email address transformation. Defaults to false.
26548
26640
  */
26549
26641
  function AutoFormatPlugin(options) {
26550
26642
  if (options === void 0) { options = DefaultOptions; }
@@ -26610,7 +26702,7 @@ var AutoFormatPlugin = /** @class */ (function () {
26610
26702
  apiName: '',
26611
26703
  };
26612
26704
  (0, roosterjs_content_model_api_1.formatTextSegmentBeforeSelectionMarker)(editor, function (model, previousSegment, paragraph, _markerFormat, context) {
26613
- var _a = _this.options, autoBullet = _a.autoBullet, autoNumbering = _a.autoNumbering, autoLink = _a.autoLink, autoHyphen = _a.autoHyphen, autoFraction = _a.autoFraction, autoOrdinals = _a.autoOrdinals;
26705
+ var _a = _this.options, autoBullet = _a.autoBullet, autoNumbering = _a.autoNumbering, autoLink = _a.autoLink, autoHyphen = _a.autoHyphen, autoFraction = _a.autoFraction, autoOrdinals = _a.autoOrdinals, autoMailto = _a.autoMailto, autoTel = _a.autoTel;
26614
26706
  var shouldHyphen = false;
26615
26707
  var shouldLink = false;
26616
26708
  var shouldList = false;
@@ -26619,8 +26711,12 @@ var AutoFormatPlugin = /** @class */ (function () {
26619
26711
  if (autoBullet || autoNumbering) {
26620
26712
  shouldList = (0, keyboardListTrigger_1.keyboardListTrigger)(model, paragraph, context, autoBullet, autoNumbering);
26621
26713
  }
26622
- if (autoLink) {
26623
- shouldLink = (0, createLinkAfterSpace_1.createLinkAfterSpace)(previousSegment, paragraph, context);
26714
+ if (autoLink || autoTel || autoMailto) {
26715
+ shouldLink = (0, createLinkAfterSpace_1.createLinkAfterSpace)(previousSegment, paragraph, context, {
26716
+ autoLink: autoLink,
26717
+ autoTel: autoTel,
26718
+ autoMailto: autoMailto,
26719
+ });
26624
26720
  }
26625
26721
  if (autoHyphen) {
26626
26722
  shouldHyphen = (0, transformHyphen_1.transformHyphen)(previousSegment, paragraph, context);
@@ -26656,9 +26752,13 @@ var AutoFormatPlugin = /** @class */ (function () {
26656
26752
  }
26657
26753
  };
26658
26754
  AutoFormatPlugin.prototype.handleContentChangedEvent = function (editor, event) {
26659
- var autoLink = this.options.autoLink;
26660
- if (event.source == 'Paste' && autoLink) {
26661
- (0, createLink_1.createLink)(editor);
26755
+ var _a = this.options, autoLink = _a.autoLink, autoTel = _a.autoTel, autoMailto = _a.autoMailto;
26756
+ if (event.source == 'Paste' && (autoLink || autoTel || autoMailto)) {
26757
+ (0, createLink_1.createLink)(editor, {
26758
+ autoLink: autoLink,
26759
+ autoTel: autoTel,
26760
+ autoMailto: autoMailto,
26761
+ });
26662
26762
  }
26663
26763
  };
26664
26764
  return AutoFormatPlugin;
@@ -26735,10 +26835,11 @@ Object.defineProperty(exports, "__esModule", ({ value: true }));
26735
26835
  exports.createLink = void 0;
26736
26836
  var roosterjs_content_model_dom_1 = __webpack_require__(/*! roosterjs-content-model-dom */ "./packages/roosterjs-content-model-dom/lib/index.ts");
26737
26837
  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");
26738
26839
  /**
26739
26840
  * @internal
26740
26841
  */
26741
- function createLink(editor) {
26842
+ function createLink(editor, autoLinkOptions) {
26742
26843
  var anchorNode = null;
26743
26844
  var links = [];
26744
26845
  (0, roosterjs_content_model_api_1.formatTextSegmentBeforeSelectionMarker)(editor, function (_model, linkSegment, _paragraph) {
@@ -26746,11 +26847,11 @@ function createLink(editor) {
26746
26847
  links.push(linkSegment.link);
26747
26848
  return true;
26748
26849
  }
26749
- var linkData = null;
26750
- if (!linkSegment.link && (linkData = (0, roosterjs_content_model_api_1.matchLink)(linkSegment.text))) {
26850
+ var linkUrl = undefined;
26851
+ if (!linkSegment.link && (linkUrl = (0, getLinkUrl_1.getLinkUrl)(linkSegment.text, autoLinkOptions))) {
26751
26852
  (0, roosterjs_content_model_dom_1.addLink)(linkSegment, {
26752
26853
  format: {
26753
- href: linkData.normalizedUrl,
26854
+ href: linkUrl,
26754
26855
  underline: true,
26755
26856
  },
26756
26857
  dataset: {},
@@ -26786,19 +26887,20 @@ exports.createLink = createLink;
26786
26887
 
26787
26888
  Object.defineProperty(exports, "__esModule", ({ value: true }));
26788
26889
  exports.createLinkAfterSpace = void 0;
26890
+ var getLinkUrl_1 = __webpack_require__(/*! ./getLinkUrl */ "./packages/roosterjs-content-model-plugins/lib/autoFormat/link/getLinkUrl.ts");
26789
26891
  var roosterjs_content_model_api_1 = __webpack_require__(/*! roosterjs-content-model-api */ "./packages/roosterjs-content-model-api/lib/index.ts");
26790
26892
  /**
26791
26893
  * @internal
26792
26894
  */
26793
- function createLinkAfterSpace(previousSegment, paragraph, context) {
26895
+ function createLinkAfterSpace(previousSegment, paragraph, context, autoLinkOptions) {
26794
26896
  var link = previousSegment.text.split(' ').pop();
26795
26897
  var url = link === null || link === void 0 ? void 0 : link.trim();
26796
- var linkData = null;
26797
- if (url && link && (linkData = (0, roosterjs_content_model_api_1.matchLink)(url))) {
26898
+ var linkUrl = undefined;
26899
+ if (url && link && (linkUrl = (0, getLinkUrl_1.getLinkUrl)(url, autoLinkOptions))) {
26798
26900
  var linkSegment = (0, roosterjs_content_model_api_1.splitTextSegment)(previousSegment, paragraph, previousSegment.text.length - link.trimLeft().length, previousSegment.text.trimRight().length);
26799
26901
  linkSegment.link = {
26800
26902
  format: {
26801
- href: linkData.normalizedUrl,
26903
+ href: linkUrl,
26802
26904
  underline: true,
26803
26905
  },
26804
26906
  dataset: {},
@@ -26811,6 +26913,42 @@ function createLinkAfterSpace(previousSegment, paragraph, context) {
26811
26913
  exports.createLinkAfterSpace = createLinkAfterSpace;
26812
26914
 
26813
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
+
26814
26952
  /***/ }),
26815
26953
 
26816
26954
  /***/ "./packages/roosterjs-content-model-plugins/lib/autoFormat/link/unlink.ts":
@@ -27562,7 +27700,7 @@ var EditPlugin = /** @class */ (function () {
27562
27700
  EditPlugin.prototype.initialize = function (editor) {
27563
27701
  var _this = this;
27564
27702
  this.editor = editor;
27565
- this.handleNormalEnter = this.editor.isExperimentalFeatureEnabled('PersistCache');
27703
+ this.handleNormalEnter = this.editor.isExperimentalFeatureEnabled('HandleEnterKey');
27566
27704
  if (editor.getEnvironment().isAndroid) {
27567
27705
  this.disposer = this.editor.attachDomEvent({
27568
27706
  beforeinput: {
@@ -28457,9 +28595,9 @@ function canDeleteAfter(rawEvent, range) {
28457
28595
  Object.defineProperty(exports, "__esModule", ({ value: true }));
28458
28596
  exports.keyboardEnter = void 0;
28459
28597
  var deleteEmptyQuote_1 = __webpack_require__(/*! ./deleteSteps/deleteEmptyQuote */ "./packages/roosterjs-content-model-plugins/lib/edit/deleteSteps/deleteEmptyQuote.ts");
28460
- var roosterjs_content_model_dom_1 = __webpack_require__(/*! roosterjs-content-model-dom */ "./packages/roosterjs-content-model-dom/lib/index.ts");
28461
28598
  var handleEnterOnList_1 = __webpack_require__(/*! ./inputSteps/handleEnterOnList */ "./packages/roosterjs-content-model-plugins/lib/edit/inputSteps/handleEnterOnList.ts");
28462
28599
  var handleEnterOnParagraph_1 = __webpack_require__(/*! ./inputSteps/handleEnterOnParagraph */ "./packages/roosterjs-content-model-plugins/lib/edit/inputSteps/handleEnterOnParagraph.ts");
28600
+ var roosterjs_content_model_dom_1 = __webpack_require__(/*! roosterjs-content-model-dom */ "./packages/roosterjs-content-model-dom/lib/index.ts");
28463
28601
  /**
28464
28602
  * @internal
28465
28603
  */
@@ -28493,6 +28631,7 @@ function keyboardEnter(editor, rawEvent, handleNormalEnter) {
28493
28631
  }, {
28494
28632
  rawEvent: rawEvent,
28495
28633
  scrollCaretIntoView: true,
28634
+ changeSource: roosterjs_content_model_dom_1.ChangeSource.Keyboard,
28496
28635
  });
28497
28636
  }
28498
28637
  exports.keyboardEnter = keyboardEnter;
@@ -28536,6 +28675,7 @@ function keyboardInput(editor, rawEvent) {
28536
28675
  }, {
28537
28676
  scrollCaretIntoView: true,
28538
28677
  rawEvent: rawEvent,
28678
+ changeSource: roosterjs_content_model_dom_1.ChangeSource.Keyboard,
28539
28679
  });
28540
28680
  return true;
28541
28681
  }
@@ -28566,12 +28706,12 @@ function shouldInputWithContentModel(selection, rawEvent) {
28566
28706
 
28567
28707
  Object.defineProperty(exports, "__esModule", ({ value: true }));
28568
28708
  exports.keyboardTab = void 0;
28569
- var roosterjs_content_model_dom_1 = __webpack_require__(/*! roosterjs-content-model-dom */ "./packages/roosterjs-content-model-dom/lib/index.ts");
28570
28709
  var handleTabOnList_1 = __webpack_require__(/*! ./tabUtils/handleTabOnList */ "./packages/roosterjs-content-model-plugins/lib/edit/tabUtils/handleTabOnList.ts");
28571
28710
  var handleTabOnParagraph_1 = __webpack_require__(/*! ./tabUtils/handleTabOnParagraph */ "./packages/roosterjs-content-model-plugins/lib/edit/tabUtils/handleTabOnParagraph.ts");
28572
28711
  var handleTabOnTable_1 = __webpack_require__(/*! ./tabUtils/handleTabOnTable */ "./packages/roosterjs-content-model-plugins/lib/edit/tabUtils/handleTabOnTable.ts");
28573
28712
  var handleTabOnTableCell_1 = __webpack_require__(/*! ./tabUtils/handleTabOnTableCell */ "./packages/roosterjs-content-model-plugins/lib/edit/tabUtils/handleTabOnTableCell.ts");
28574
28713
  var roosterjs_content_model_api_1 = __webpack_require__(/*! roosterjs-content-model-api */ "./packages/roosterjs-content-model-api/lib/index.ts");
28714
+ var roosterjs_content_model_dom_1 = __webpack_require__(/*! roosterjs-content-model-dom */ "./packages/roosterjs-content-model-dom/lib/index.ts");
28575
28715
  /**
28576
28716
  * @internal
28577
28717
  */
@@ -28590,6 +28730,7 @@ function keyboardTab(editor, rawEvent) {
28590
28730
  return (0, handleTabOnTable_1.handleTabOnTable)(model, rawEvent);
28591
28731
  }, {
28592
28732
  apiName: 'handleTabKey',
28733
+ changeSource: roosterjs_content_model_dom_1.ChangeSource.Keyboard,
28593
28734
  });
28594
28735
  return true;
28595
28736
  }
@@ -29343,6 +29484,8 @@ var DefaultOptions = {
29343
29484
  };
29344
29485
  var MouseRightButton = 2;
29345
29486
  var DRAG_ID = '_dragging';
29487
+ var IMAGE_EDIT_CLASS = 'imageEdit';
29488
+ var IMAGE_EDIT_CLASS_CARET = 'imageEditCaretColor';
29346
29489
  /**
29347
29490
  * ImageEdit plugin handles the following image editing features:
29348
29491
  * - Resize image
@@ -29494,14 +29637,22 @@ var ImageEditPlugin = /** @class */ (function () {
29494
29637
  };
29495
29638
  ImageEditPlugin.prototype.keyDownHandler = function (editor, event) {
29496
29639
  if (this.isEditing) {
29497
- if (event.rawEvent.key === 'Escape') {
29498
- this.removeImageWrapper();
29640
+ if (event.rawEvent.key === 'Escape' ||
29641
+ event.rawEvent.key === 'Delete' ||
29642
+ event.rawEvent.key === 'Backspace') {
29643
+ if (event.rawEvent.key === 'Escape') {
29644
+ this.removeImageWrapper();
29645
+ }
29646
+ this.cleanInfo();
29499
29647
  }
29500
29648
  else {
29501
29649
  this.applyFormatWithContentModel(editor, this.isCropMode, true /** should selectImage */, false /* isApiOperation */);
29502
29650
  }
29503
29651
  }
29504
29652
  };
29653
+ /**
29654
+ * EXPOSED FOR TESTING PURPOSE ONLY
29655
+ */
29505
29656
  ImageEditPlugin.prototype.applyFormatWithContentModel = function (editor, isCropMode, shouldSelectImage, isApiOperation) {
29506
29657
  var _this = this;
29507
29658
  var editingImageModel;
@@ -29528,6 +29679,15 @@ var ImageEditPlugin = /** @class */ (function () {
29528
29679
  image.isSelected = shouldSelectImage;
29529
29680
  image.isSelectedAsImageSelection = shouldSelectImage;
29530
29681
  delete image.dataset.isEditing;
29682
+ if ((selection === null || selection === void 0 ? void 0 : selection.type) == 'range' && !selection.range.collapsed) {
29683
+ var selectedParagraphs = (0, roosterjs_content_model_dom_1.getSelectedParagraphs)(model, true);
29684
+ var isImageInRange = selectedParagraphs.some(function (paragraph) {
29685
+ return paragraph.segments.includes(image);
29686
+ });
29687
+ if (isImageInRange) {
29688
+ image.isSelected = true;
29689
+ }
29690
+ }
29531
29691
  });
29532
29692
  if (shouldSelectImage) {
29533
29693
  (0, normalizeImageSelection_1.normalizeImageSelection)(previousSelectedImage);
@@ -29588,9 +29748,10 @@ var ImageEditPlugin = /** @class */ (function () {
29588
29748
  this.rotators = rotators;
29589
29749
  this.croppers = croppers;
29590
29750
  this.zoomScale = editor.getDOMHelper().calculateZoomScale();
29591
- editor.setEditorStyle('imageEdit', "outline-style:none!important;", [
29751
+ editor.setEditorStyle(IMAGE_EDIT_CLASS, "outline-style:none!important;", [
29592
29752
  "span:has(>img" + (0, roosterjs_content_model_dom_1.getSafeIdSelector)(this.selectedImage.id) + ")",
29593
29753
  ]);
29754
+ editor.setEditorStyle(IMAGE_EDIT_CLASS_CARET, "caret-color: transparent;");
29594
29755
  };
29595
29756
  ImageEditPlugin.prototype.startRotateAndResize = function (editor, image) {
29596
29757
  var _this = this;
@@ -29598,6 +29759,7 @@ var ImageEditPlugin = /** @class */ (function () {
29598
29759
  if (this.imageEditInfo) {
29599
29760
  this.startEditing(editor, image, ['resize', 'rotate']);
29600
29761
  if (this.selectedImage && this.imageEditInfo && this.wrapper && this.clonedImage) {
29762
+ var isMobileOrTable = !!editor.getEnvironment().isMobileOrTablet;
29601
29763
  this.dndHelpers = (0, tslib_1.__spreadArray)((0, tslib_1.__spreadArray)([], (0, tslib_1.__read)((0, getDropAndDragHelpers_1.getDropAndDragHelpers)(this.wrapper, this.imageEditInfo, this.options, ImageEditElementClass_1.ImageEditElementClass.ResizeHandle, resizerContext_1.Resizer, function () {
29602
29764
  if (_this.imageEditInfo &&
29603
29765
  _this.selectedImage &&
@@ -29606,7 +29768,7 @@ var ImageEditPlugin = /** @class */ (function () {
29606
29768
  (0, updateWrapper_1.updateWrapper)(_this.imageEditInfo, _this.options, _this.selectedImage, _this.clonedImage, _this.wrapper, _this.resizers);
29607
29769
  _this.wasImageResized = true;
29608
29770
  }
29609
- }, this.zoomScale)), false), (0, tslib_1.__read)((0, getDropAndDragHelpers_1.getDropAndDragHelpers)(this.wrapper, this.imageEditInfo, this.options, ImageEditElementClass_1.ImageEditElementClass.RotateHandle, rotatorContext_1.Rotator, function () {
29771
+ }, this.zoomScale, isMobileOrTable)), false), (0, tslib_1.__read)((0, getDropAndDragHelpers_1.getDropAndDragHelpers)(this.wrapper, this.imageEditInfo, this.options, ImageEditElementClass_1.ImageEditElementClass.RotateHandle, rotatorContext_1.Rotator, function () {
29610
29772
  var _a;
29611
29773
  if (_this.imageEditInfo &&
29612
29774
  _this.selectedImage &&
@@ -29615,7 +29777,7 @@ var ImageEditPlugin = /** @class */ (function () {
29615
29777
  (0, updateWrapper_1.updateWrapper)(_this.imageEditInfo, _this.options, _this.selectedImage, _this.clonedImage, _this.wrapper);
29616
29778
  _this.updateRotateHandleState(editor, _this.selectedImage, _this.wrapper, _this.rotators, (_a = _this.imageEditInfo) === null || _a === void 0 ? void 0 : _a.angleRad);
29617
29779
  }
29618
- }, this.zoomScale)), false);
29780
+ }, this.zoomScale, isMobileOrTable)), false);
29619
29781
  (0, updateWrapper_1.updateWrapper)(this.imageEditInfo, this.options, this.selectedImage, this.clonedImage, this.wrapper, this.resizers);
29620
29782
  this.updateRotateHandleState(editor, this.selectedImage, this.wrapper, this.rotators, (_a = this.imageEditInfo) === null || _a === void 0 ? void 0 : _a.angleRad);
29621
29783
  }
@@ -29655,7 +29817,7 @@ var ImageEditPlugin = /** @class */ (function () {
29655
29817
  (0, updateWrapper_1.updateWrapper)(_this.imageEditInfo, _this.options, _this.selectedImage, _this.clonedImage, _this.wrapper, undefined, _this.croppers);
29656
29818
  _this.isCropMode = true;
29657
29819
  }
29658
- }, this.zoomScale)), false);
29820
+ }, this.zoomScale, !!editor.getEnvironment().isMobileOrTablet)), false);
29659
29821
  (0, updateWrapper_1.updateWrapper)(this.imageEditInfo, this.options, this.selectedImage, this.clonedImage, this.wrapper, undefined, this.croppers);
29660
29822
  }
29661
29823
  }
@@ -29681,9 +29843,13 @@ var ImageEditPlugin = /** @class */ (function () {
29681
29843
  (0, updateWrapper_1.updateWrapper)(this.imageEditInfo, this.options, this.selectedImage, this.clonedImage, this.wrapper);
29682
29844
  this.applyFormatWithContentModel(editor, false /* isCrop */, true /* shouldSelect*/, true /* isApiOperation */);
29683
29845
  };
29846
+ /**
29847
+ * Exported for testing purpose only
29848
+ */
29684
29849
  ImageEditPlugin.prototype.cleanInfo = function () {
29685
- var _a;
29686
- (_a = this.editor) === null || _a === void 0 ? void 0 : _a.setEditorStyle('imageEdit', null);
29850
+ var _a, _b;
29851
+ (_a = this.editor) === null || _a === void 0 ? void 0 : _a.setEditorStyle(IMAGE_EDIT_CLASS, null);
29852
+ (_b = this.editor) === null || _b === void 0 ? void 0 : _b.setEditorStyle(IMAGE_EDIT_CLASS_CARET, null);
29687
29853
  this.selectedImage = null;
29688
29854
  this.shadowSpan = null;
29689
29855
  this.wrapper = null;
@@ -30659,8 +30825,8 @@ function findEditingImage(group, imageId) {
30659
30825
  var segment = block.segments[j];
30660
30826
  switch (segment.segmentType) {
30661
30827
  case 'Image':
30662
- if ((segment.dataset.isEditing && !imageId) ||
30663
- segment.format.id == imageId) {
30828
+ if ((imageId && segment.format.id == imageId) ||
30829
+ segment.dataset.isEditing) {
30664
30830
  return {
30665
30831
  paragraph: block,
30666
30832
  image: segment,
@@ -30854,7 +31020,7 @@ var roosterjs_content_model_dom_1 = __webpack_require__(/*! roosterjs-content-mo
30854
31020
  /**
30855
31021
  * @internal
30856
31022
  */
30857
- function getDropAndDragHelpers(wrapper, editInfo, options, elementClass, helper, updateWrapper, zoomScale) {
31023
+ function getDropAndDragHelpers(wrapper, editInfo, options, elementClass, helper, updateWrapper, zoomScale, useTouch) {
30858
31024
  return getEditElements(wrapper, elementClass).map(function (element) {
30859
31025
  return new DragAndDropHelper_1.DragAndDropHelper(element, {
30860
31026
  editInfo: editInfo,
@@ -30862,7 +31028,7 @@ function getDropAndDragHelpers(wrapper, editInfo, options, elementClass, helper,
30862
31028
  elementClass: elementClass,
30863
31029
  x: element.dataset.x,
30864
31030
  y: element.dataset.y,
30865
- }, updateWrapper, helper, zoomScale);
31031
+ }, updateWrapper, helper, zoomScale, useTouch);
30866
31032
  });
30867
31033
  }
30868
31034
  exports.getDropAndDragHelpers = getDropAndDragHelpers;