roosterjs 9.5.1 → 9.6.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.
@@ -1,4 +1,4 @@
1
- // Type definitions for roosterjs (Version 9.5.1)
1
+ // Type definitions for roosterjs (Version 9.6.0)
2
2
  // Generated by dts tool from roosterjs
3
3
  // Project: https://github.com/Microsoft/roosterjs
4
4
 
@@ -3067,6 +3067,16 @@ export interface DomIndexer {
3067
3067
  * @returns True if reconcile successfully, otherwise false
3068
3068
  */
3069
3069
  reconcileSelection: (model: ContentModelDocument, newSelection: DOMSelection, oldSelection?: CacheSelection) => boolean;
3070
+ /**
3071
+ * When child list of editor content is changed, we can use this method to do sync the change from editor into content model.
3072
+ * This is mostly used when user start to type in an empty line. In that case browser will remove the existing BR node in the empty line if any,
3073
+ * and create a new TEXT node for the typed text. Here we use these information to remove original Br segment and create a new Text segment
3074
+ * in content model. But if we find anything that cannot be handled, return false so caller will invalidate the cached model
3075
+ * @param addedNodes Nodes added by browser during mutation
3076
+ * @param removedNodes Nodes removed by browser during mutation
3077
+ * @returns True if the changed nodes are successfully reconciled, otherwise false
3078
+ */
3079
+ reconcileChildList: (addedNodes: ArrayLike<Node>, removedNodes: ArrayLike<Node>) => boolean;
3070
3080
  }
3071
3081
 
3072
3082
  /**
@@ -3084,7 +3094,7 @@ export interface TextMutationObserver {
3084
3094
  /**
3085
3095
  * Flush all pending mutations that have not be handled in order to ignore them
3086
3096
  */
3087
- flushMutations(): void;
3097
+ flushMutations(newModel?: ContentModelDocument): void;
3088
3098
  }
3089
3099
 
3090
3100
  /**
@@ -7492,6 +7502,11 @@ export const OrderedListStyleMap: Record<number, string>;
7492
7502
  */
7493
7503
  export const UnorderedListStyleMap: Record<number, string>;
7494
7504
 
7505
+ /**
7506
+ * Provide a default empty instance of segment format with all its properties
7507
+ */
7508
+ export const EmptySegmentFormat: Readonly<Required<ContentModelSegmentFormat>>;
7509
+
7495
7510
  /**
7496
7511
  * The main editor class based on Content Model
7497
7512
  */
@@ -2952,7 +2952,24 @@ function insertEntityModel(model, entityModel, position, isBlock, focusAfterEnti
2952
2952
  exports.insertEntityModel = insertEntityModel;
2953
2953
  function getInsertPoint(model, insertPointOverride, context) {
2954
2954
  if (insertPointOverride) {
2955
- return insertPointOverride;
2955
+ var paragraph = insertPointOverride.paragraph, marker = insertPointOverride.marker, tableContext = insertPointOverride.tableContext, path = insertPointOverride.path;
2956
+ var index = paragraph.segments.indexOf(marker);
2957
+ var previousSegment = index > 0 ? paragraph.segments[index - 1] : null;
2958
+ // It is possible that the real selection is right before the override selection marker.
2959
+ // This happens when:
2960
+ // [Override marker][Entity node to wrap][Real marker]
2961
+ // Then we will move the entity node into entity wrapper, causes the override marker and real marker are at the same place
2962
+ // And recreating content model causes real marker to appear before override marker.
2963
+ // Once that happens, we need to use the real marker instead so that after insert entity, real marker can be placed
2964
+ // after new entity (if insertPointOverride==true)
2965
+ return (previousSegment === null || previousSegment === void 0 ? void 0 : previousSegment.segmentType) == 'SelectionMarker' && previousSegment.isSelected
2966
+ ? {
2967
+ marker: previousSegment,
2968
+ paragraph: paragraph,
2969
+ tableContext: tableContext,
2970
+ path: path,
2971
+ }
2972
+ : insertPointOverride;
2956
2973
  }
2957
2974
  else {
2958
2975
  var deleteResult = (0, roosterjs_content_model_dom_1.deleteSelection)(model, [], context);
@@ -6857,8 +6874,8 @@ var roosterjs_content_model_dom_1 = __webpack_require__(/*! roosterjs-content-mo
6857
6874
  function formatSegmentWithContentModel(editor, apiName, toggleStyleCallback, segmentHasStyleCallback, includingFormatHolder, afterFormatCallback) {
6858
6875
  editor.formatContentModel(function (model, context) {
6859
6876
  var segmentAndParagraphs = (0, roosterjs_content_model_dom_1.getSelectedSegmentsAndParagraphs)(model, !!includingFormatHolder, false /*includingEntity*/, true /*mutate*/);
6860
- var isCollapsedSelection = segmentAndParagraphs.length == 1 &&
6861
- segmentAndParagraphs[0][0].segmentType == 'SelectionMarker';
6877
+ var isCollapsedSelection = segmentAndParagraphs.length >= 1 &&
6878
+ segmentAndParagraphs.every(function (x) { return x[0].segmentType == 'SelectionMarker'; });
6862
6879
  if (isCollapsedSelection) {
6863
6880
  var para_1 = segmentAndParagraphs[0][1];
6864
6881
  var path_1 = segmentAndParagraphs[0][2];
@@ -7710,19 +7727,6 @@ exports.mergePasteContent = exports.cloneModelForPaste = void 0;
7710
7727
  var tslib_1 = __webpack_require__(/*! tslib */ "./node_modules/tslib/tslib.es6.mjs");
7711
7728
  var createDomToModelContextForSanitizing_1 = __webpack_require__(/*! ../createModelFromHtml/createDomToModelContextForSanitizing */ "./packages/roosterjs-content-model-core/lib/command/createModelFromHtml/createDomToModelContextForSanitizing.ts");
7712
7729
  var roosterjs_content_model_dom_1 = __webpack_require__(/*! roosterjs-content-model-dom */ "./packages/roosterjs-content-model-dom/lib/index.ts");
7713
- var EmptySegmentFormat = {
7714
- backgroundColor: '',
7715
- fontFamily: '',
7716
- fontSize: '',
7717
- fontWeight: '',
7718
- italic: false,
7719
- letterSpacing: '',
7720
- lineHeight: '',
7721
- strikethrough: false,
7722
- superOrSubScriptSequence: '',
7723
- textColor: '',
7724
- underline: false,
7725
- };
7726
7730
  var CloneOption = {
7727
7731
  includeCachedElement: function (node, type) { return (type == 'cache' ? undefined : node); },
7728
7732
  };
@@ -7757,7 +7761,7 @@ function mergePasteContent(editor, eventResult, clipboardData) {
7757
7761
  ? customizedMerge(model, pasteModel)
7758
7762
  : (0, roosterjs_content_model_dom_1.mergeModel)(model, pasteModel, context, mergeOption);
7759
7763
  if (insertPoint) {
7760
- context.newPendingFormat = (0, tslib_1.__assign)((0, tslib_1.__assign)((0, tslib_1.__assign)({}, EmptySegmentFormat), model.format), insertPoint.marker.format);
7764
+ context.newPendingFormat = (0, tslib_1.__assign)((0, tslib_1.__assign)((0, tslib_1.__assign)({}, roosterjs_content_model_dom_1.EmptySegmentFormat), model.format), insertPoint.marker.format);
7761
7765
  }
7762
7766
  return true;
7763
7767
  }, {
@@ -9187,8 +9191,7 @@ var setContentModel = function (core, model, option, onNodeCreated) {
9187
9191
  core.selection.selection = selection;
9188
9192
  }
9189
9193
  // Clear pending mutations since we will use our latest model object to replace existing cache
9190
- (_a = core.cache.textMutationObserver) === null || _a === void 0 ? void 0 : _a.flushMutations();
9191
- core.cache.cachedModel = model;
9194
+ (_a = core.cache.textMutationObserver) === null || _a === void 0 ? void 0 : _a.flushMutations(model);
9192
9195
  }
9193
9196
  return selection;
9194
9197
  };
@@ -9830,19 +9833,30 @@ var CachePlugin = /** @class */ (function () {
9830
9833
  }
9831
9834
  }
9832
9835
  };
9836
+ this.onSkipMutation = function (newModel) {
9837
+ var _a;
9838
+ if (!((_a = _this.editor) === null || _a === void 0 ? void 0 : _a.isInShadowEdit())) {
9839
+ _this.state.cachedModel = newModel;
9840
+ _this.state.cachedSelection = undefined;
9841
+ }
9842
+ };
9833
9843
  this.onNativeSelectionChange = function () {
9834
9844
  var _a;
9835
9845
  if ((_a = _this.editor) === null || _a === void 0 ? void 0 : _a.hasFocus()) {
9836
9846
  _this.updateCachedModel(_this.editor);
9837
9847
  }
9838
9848
  };
9839
- this.state = option.disableCache
9840
- ? {}
9841
- : {
9842
- domIndexer: new domIndexerImpl_1.DomIndexerImpl(option.experimentalFeatures &&
9843
- option.experimentalFeatures.indexOf('PersistCache') >= 0),
9844
- textMutationObserver: (0, textMutationObserver_1.createTextMutationObserver)(contentDiv, this.onMutation),
9849
+ if (option.disableCache) {
9850
+ this.state = {};
9851
+ }
9852
+ else {
9853
+ var domIndexer = new domIndexerImpl_1.DomIndexerImpl(option.experimentalFeatures &&
9854
+ option.experimentalFeatures.indexOf('PersistCache') >= 0);
9855
+ this.state = {
9856
+ domIndexer: domIndexer,
9857
+ textMutationObserver: (0, textMutationObserver_1.createTextMutationObserver)(contentDiv, domIndexer, this.onMutation, this.onSkipMutation),
9845
9858
  };
9859
+ }
9846
9860
  }
9847
9861
  /**
9848
9862
  * Get name of this plugin
@@ -10025,6 +10039,9 @@ function isIndexedSegment(node) {
10025
10039
  Array.isArray(paragraph.segments) &&
10026
10040
  Array.isArray(segments));
10027
10041
  }
10042
+ function getIndexedSegmentItem(node) {
10043
+ return node && isIndexedSegment(node) ? node.__roosterjsContentModel : null;
10044
+ }
10028
10045
  /**
10029
10046
  * @internal
10030
10047
  * Implementation of DomIndexer
@@ -10048,9 +10065,7 @@ var DomIndexerImpl = /** @class */ (function () {
10048
10065
  previousText = child;
10049
10066
  }
10050
10067
  else {
10051
- var item = isIndexedSegment(previousText)
10052
- ? previousText.__roosterjsContentModel
10053
- : undefined;
10068
+ var item = getIndexedSegmentItem(previousText);
10054
10069
  if (item && isIndexedSegment(child)) {
10055
10070
  item.segments = item.segments.concat(child.__roosterjsContentModel.segments);
10056
10071
  child.__roosterjsContentModel.segments = [];
@@ -10123,6 +10138,32 @@ var DomIndexerImpl = /** @class */ (function () {
10123
10138
  }
10124
10139
  return false;
10125
10140
  };
10141
+ DomIndexerImpl.prototype.reconcileChildList = function (addedNodes, removedNodes) {
10142
+ if (!this.persistCache) {
10143
+ return false;
10144
+ }
10145
+ var canHandle = true;
10146
+ var context = {
10147
+ segIndex: -1,
10148
+ };
10149
+ // First process added nodes
10150
+ var addedNode = addedNodes[0];
10151
+ if (addedNodes.length == 1 && (0, roosterjs_content_model_dom_1.isNodeOfType)(addedNode, 'TEXT_NODE')) {
10152
+ canHandle = this.reconcileAddedNode(addedNode, context);
10153
+ }
10154
+ else if (addedNodes.length > 0) {
10155
+ canHandle = false;
10156
+ }
10157
+ // Second, process removed nodes
10158
+ var removedNode = removedNodes[0];
10159
+ if (canHandle && removedNodes.length == 1) {
10160
+ canHandle = this.reconcileRemovedNode(removedNode, context);
10161
+ }
10162
+ else if (removedNodes.length > 0) {
10163
+ canHandle = false;
10164
+ }
10165
+ return canHandle && !context.pendingTextNode;
10166
+ };
10126
10167
  DomIndexerImpl.prototype.isCollapsed = function (selection) {
10127
10168
  var start = selection.start, end = selection.end;
10128
10169
  return start.node == end.node && start.offset == end.offset;
@@ -10140,8 +10181,9 @@ var DomIndexerImpl = /** @class */ (function () {
10140
10181
  };
10141
10182
  DomIndexerImpl.prototype.insertMarker = function (node, isAfter) {
10142
10183
  var marker;
10143
- if (node && isIndexedSegment(node)) {
10144
- var _a = node.__roosterjsContentModel, paragraph = _a.paragraph, segments = _a.segments;
10184
+ var segmentItem = node && getIndexedSegmentItem(node);
10185
+ if (segmentItem) {
10186
+ var paragraph = segmentItem.paragraph, segments = segmentItem.segments;
10145
10187
  var index = paragraph.segments.indexOf(segments[0]);
10146
10188
  if (index >= 0) {
10147
10189
  var formatSegment = (!isAfter && paragraph.segments[index - 1]) || paragraph.segments[index];
@@ -10211,6 +10253,88 @@ var DomIndexerImpl = /** @class */ (function () {
10211
10253
  }
10212
10254
  return selectable;
10213
10255
  };
10256
+ DomIndexerImpl.prototype.reconcileAddedNode = function (node, context) {
10257
+ var segmentItem = null;
10258
+ var index = -1;
10259
+ var existingSegment;
10260
+ var previousSibling = node.previousSibling, nextSibling = node.nextSibling;
10261
+ if ((segmentItem = getIndexedSegmentItem(previousSibling)) &&
10262
+ (existingSegment = segmentItem.segments[segmentItem.segments.length - 1]) &&
10263
+ (index = segmentItem.paragraph.segments.indexOf(existingSegment)) >= 0) {
10264
+ // When we can find indexed segment before current one, use it as the insert index
10265
+ this.indexNode(segmentItem.paragraph, index + 1, node, existingSegment.format);
10266
+ }
10267
+ else if ((segmentItem = getIndexedSegmentItem(nextSibling)) &&
10268
+ (existingSegment = segmentItem.segments[0]) &&
10269
+ (index = segmentItem.paragraph.segments.indexOf(existingSegment)) >= 0) {
10270
+ // When we can find indexed segment after current one, use it as the insert index
10271
+ this.indexNode(segmentItem.paragraph, index, node, existingSegment.format);
10272
+ }
10273
+ else if (context.paragraph && context.segIndex >= 0) {
10274
+ // When there is indexed paragraph from removed nodes, we can use it as the insert index
10275
+ this.indexNode(context.paragraph, context.segIndex, node, context.format);
10276
+ }
10277
+ else if (context.pendingTextNode === undefined) {
10278
+ // When we can't find the insert index, set current node as pending node
10279
+ // so later we can pick it up when we have enough info when processing removed node
10280
+ // Only do this when pendingTextNode is undefined. If it is null it means there was already a pending node before
10281
+ // and in that case we should return false since we can't handle two pending text node
10282
+ context.pendingTextNode = node;
10283
+ }
10284
+ else {
10285
+ return false;
10286
+ }
10287
+ return true;
10288
+ };
10289
+ DomIndexerImpl.prototype.reconcileRemovedNode = function (node, context) {
10290
+ var segmentItem = null;
10291
+ var removingSegment;
10292
+ if (context.segIndex < 0 &&
10293
+ !context.paragraph && // No previous removed segment or related paragraph found, and
10294
+ (segmentItem = getIndexedSegmentItem(node)) && // The removed node is indexed, and
10295
+ (removingSegment = segmentItem.segments[0]) // There is at least one related segment
10296
+ ) {
10297
+ // Now we can remove the indexed segment from the paragraph, and remember it, later we may need to use it
10298
+ context.format = removingSegment.format;
10299
+ context.paragraph = segmentItem.paragraph;
10300
+ context.segIndex = segmentItem.paragraph.segments.indexOf(segmentItem.segments[0]);
10301
+ if (context.segIndex < 0) {
10302
+ // Indexed segment is not under paragraph, something wrong happens, we cannot keep handling
10303
+ return false;
10304
+ }
10305
+ for (var i = 0; i < segmentItem.segments.length; i++) {
10306
+ var index = segmentItem.paragraph.segments.indexOf(segmentItem.segments[i]);
10307
+ if (index >= 0) {
10308
+ segmentItem.paragraph.segments.splice(index, 1);
10309
+ }
10310
+ }
10311
+ if (context.pendingTextNode) {
10312
+ // If we have pending text node added but not indexed, do it now
10313
+ this.indexNode(context.paragraph, context.segIndex, context.pendingTextNode, segmentItem.segments[0].format);
10314
+ // Set to null since we have processed it.
10315
+ // Next time we see a pending node we know we have already processed one so it is a situation we cannot handle
10316
+ context.pendingTextNode = null;
10317
+ }
10318
+ return true;
10319
+ }
10320
+ else {
10321
+ return false;
10322
+ }
10323
+ };
10324
+ DomIndexerImpl.prototype.indexNode = function (paragraph, index, textNode, format) {
10325
+ var _a;
10326
+ var copiedFormat = format ? (0, tslib_1.__assign)({}, format) : undefined;
10327
+ if (copiedFormat) {
10328
+ (0, roosterjs_content_model_dom_1.getObjectKeys)(copiedFormat).forEach(function (key) {
10329
+ if (roosterjs_content_model_dom_1.EmptySegmentFormat[key] === undefined) {
10330
+ delete copiedFormat[key];
10331
+ }
10332
+ });
10333
+ }
10334
+ var text = (0, roosterjs_content_model_dom_1.createText)((_a = textNode.textContent) !== null && _a !== void 0 ? _a : '', copiedFormat);
10335
+ paragraph.segments.splice(index, 0, text);
10336
+ this.onSegment(textNode, paragraph, [text]);
10337
+ };
10214
10338
  return DomIndexerImpl;
10215
10339
  }());
10216
10340
  exports.DomIndexerImpl = DomIndexerImpl;
@@ -10229,16 +10353,60 @@ exports.DomIndexerImpl = DomIndexerImpl;
10229
10353
  Object.defineProperty(exports, "__esModule", ({ value: true }));
10230
10354
  exports.createTextMutationObserver = void 0;
10231
10355
  var TextMutationObserverImpl = /** @class */ (function () {
10232
- function TextMutationObserverImpl(contentDiv, onMutation) {
10356
+ function TextMutationObserverImpl(contentDiv, domIndexer, onMutation, onSkipMutation) {
10233
10357
  var _this = this;
10234
10358
  this.contentDiv = contentDiv;
10359
+ this.domIndexer = domIndexer;
10235
10360
  this.onMutation = onMutation;
10361
+ this.onSkipMutation = onSkipMutation;
10236
10362
  this.onMutationInternal = function (mutations) {
10237
- var _a;
10238
- var firstTarget = (_a = mutations[0]) === null || _a === void 0 ? void 0 : _a.target;
10239
- if (firstTarget) {
10240
- var isTextChangeOnly = mutations.every(function (mutation) { return mutation.type == 'characterData' && mutation.target == firstTarget; });
10241
- _this.onMutation(isTextChangeOnly);
10363
+ var canHandle = true;
10364
+ var firstTarget = null;
10365
+ var lastTextChangeNode = null;
10366
+ var addedNodes = [];
10367
+ var removedNodes = [];
10368
+ var reconcileText = false;
10369
+ for (var i = 0; i < mutations.length && canHandle; i++) {
10370
+ var mutation = mutations[i];
10371
+ switch (mutation.type) {
10372
+ case 'attributes':
10373
+ if (mutation.target != _this.contentDiv) {
10374
+ // We cannot handle attributes changes on editor content for now
10375
+ canHandle = false;
10376
+ }
10377
+ break;
10378
+ case 'characterData':
10379
+ if (lastTextChangeNode && lastTextChangeNode != mutation.target) {
10380
+ // Multiple text nodes got changed, we don't know how to handle it
10381
+ canHandle = false;
10382
+ }
10383
+ else {
10384
+ lastTextChangeNode = mutation.target;
10385
+ reconcileText = true;
10386
+ }
10387
+ break;
10388
+ case 'childList':
10389
+ if (!firstTarget) {
10390
+ firstTarget = mutation.target;
10391
+ }
10392
+ else if (firstTarget != mutation.target) {
10393
+ canHandle = false;
10394
+ }
10395
+ if (canHandle) {
10396
+ addedNodes = addedNodes.concat(Array.from(mutation.addedNodes));
10397
+ removedNodes = removedNodes.concat(Array.from(mutation.removedNodes));
10398
+ }
10399
+ break;
10400
+ }
10401
+ }
10402
+ if (canHandle && (addedNodes.length > 0 || removedNodes.length > 0)) {
10403
+ canHandle = _this.domIndexer.reconcileChildList(addedNodes, removedNodes);
10404
+ }
10405
+ if (canHandle && reconcileText) {
10406
+ _this.onMutation(true /*textOnly*/);
10407
+ }
10408
+ else if (!canHandle) {
10409
+ _this.onMutation(false /*textOnly*/);
10242
10410
  }
10243
10411
  };
10244
10412
  this.observer = new MutationObserver(this.onMutationInternal);
@@ -10254,17 +10422,22 @@ var TextMutationObserverImpl = /** @class */ (function () {
10254
10422
  TextMutationObserverImpl.prototype.stopObserving = function () {
10255
10423
  this.observer.disconnect();
10256
10424
  };
10257
- TextMutationObserverImpl.prototype.flushMutations = function () {
10425
+ TextMutationObserverImpl.prototype.flushMutations = function (model) {
10258
10426
  var mutations = this.observer.takeRecords();
10259
- this.onMutationInternal(mutations);
10427
+ if (model) {
10428
+ this.onSkipMutation(model);
10429
+ }
10430
+ else {
10431
+ this.onMutationInternal(mutations);
10432
+ }
10260
10433
  };
10261
10434
  return TextMutationObserverImpl;
10262
10435
  }());
10263
10436
  /**
10264
10437
  * @internal
10265
10438
  */
10266
- function createTextMutationObserver(contentDiv, onMutation) {
10267
- return new TextMutationObserverImpl(contentDiv, onMutation);
10439
+ function createTextMutationObserver(contentDiv, domIndexer, onMutation, onSkipMutation) {
10440
+ return new TextMutationObserverImpl(contentDiv, domIndexer, onMutation, onSkipMutation);
10268
10441
  }
10269
10442
  exports.createTextMutationObserver = createTextMutationObserver;
10270
10443
 
@@ -14613,6 +14786,36 @@ exports.ChangeSource = {
14613
14786
  };
14614
14787
 
14615
14788
 
14789
+ /***/ }),
14790
+
14791
+ /***/ "./packages/roosterjs-content-model-dom/lib/constants/EmptySegmentFormat.ts":
14792
+ /*!**********************************************************************************!*\
14793
+ !*** ./packages/roosterjs-content-model-dom/lib/constants/EmptySegmentFormat.ts ***!
14794
+ \**********************************************************************************/
14795
+ /***/ ((__unused_webpack_module, exports) => {
14796
+
14797
+ "use strict";
14798
+
14799
+ Object.defineProperty(exports, "__esModule", ({ value: true }));
14800
+ exports.EmptySegmentFormat = void 0;
14801
+ /**
14802
+ * Provide a default empty instance of segment format with all its properties
14803
+ */
14804
+ exports.EmptySegmentFormat = {
14805
+ backgroundColor: '',
14806
+ fontFamily: '',
14807
+ fontSize: '',
14808
+ fontWeight: '',
14809
+ italic: false,
14810
+ letterSpacing: '',
14811
+ lineHeight: '',
14812
+ strikethrough: false,
14813
+ superOrSubScriptSequence: '',
14814
+ textColor: '',
14815
+ underline: false,
14816
+ };
14817
+
14818
+
14616
14819
  /***/ }),
14617
14820
 
14618
14821
  /***/ "./packages/roosterjs-content-model-dom/lib/constants/NumberingListType.ts":
@@ -19803,7 +20006,7 @@ exports.shouldSetValue = shouldSetValue;
19803
20006
  Object.defineProperty(exports, "__esModule", ({ value: true }));
19804
20007
  exports.createEntity = exports.createGeneralBlock = exports.createGeneralSegment = exports.createParagraphDecorator = exports.createContentModelDocument = exports.createImage = exports.createText = exports.createTableCell = exports.createTable = exports.createSelectionMarker = exports.createParagraph = exports.createFormatContainer = exports.createListItem = exports.createBr = exports.normalizeRect = exports.isWhiteSpacePreserved = exports.reuseCachedElement = exports.findClosestBlockEntityContainer = exports.isBlockEntityContainer = exports.isEntityDelimiter = exports.addDelimiters = exports.generateEntityClassNames = exports.parseEntityFormat = exports.getAllEntityWrappers = exports.findClosestEntityWrapper = exports.isEntityElement = exports.unwrap = exports.wrap = exports.wrapAllChildNodes = exports.moveChildNodes = exports.toArray = exports.getObjectKeys = exports.isElementOfType = exports.isNodeOfType = exports.hasMetadata = exports.getMetadata = exports.updateMetadata = exports.buildSelectionMarker = exports.isBlockElement = exports.areSameFormats = exports.parseFormat = exports.getRegularSelectionOffsets = exports.tableProcessor = exports.entityProcessor = exports.processChildNode = exports.handleRegularSelection = exports.childProcessor = exports.contentModelToText = exports.contentModelToDom = exports.domToContentModel = void 0;
19805
20008
  exports.cacheGetEventData = exports.extractClipboardItems = exports.transformColor = exports.readFile = exports.parseTableCells = exports.normalizeText = exports.isSpace = exports.isPunctuation = exports.extractBorderValues = exports.combineBorderValue = exports.isCursorMovingKey = exports.isModifierKey = exports.isCharacterValue = exports.getDOMInsertPointRect = exports.getSelectionRootNode = exports.isBold = exports.createModelToDomConfig = exports.createModelToDomContextWithConfig = exports.createModelToDomContext = exports.createDomToModelConfig = exports.createDomToModelContextWithConfig = exports.createDomToModelContext = exports.defaultGenerateColorKey = exports.parseColor = exports.setColor = exports.getColor = exports.DeprecatedColors = exports.BorderKeys = exports.parseValueWithUnit = exports.getAutoListStyleType = exports.getOrderedListNumberStr = exports.setParagraphNotImplicit = exports.normalizeSingleSegment = exports.isEmpty = exports.addSegment = exports.unwrapBlock = exports.isGeneralSegment = exports.normalizeContentModel = exports.normalizeParagraph = exports.addTextSegment = exports.addLink = exports.addCode = exports.addBlock = exports.mutateSegment = exports.mutateSegments = exports.mutateBlock = exports.createTableRow = exports.createEmptyModel = exports.createListLevel = exports.createDivider = void 0;
19806
- exports.UnorderedListStyleMap = exports.OrderedListStyleMap = exports.TableBorderFormat = exports.NumberingListType = exports.BulletListType = exports.ChangeSource = exports.ListMetadataDefinition = exports.getListMetadata = exports.updateListMetadata = exports.getTableMetadata = exports.updateTableMetadata = exports.getTableCellMetadata = exports.updateTableCellMetadata = exports.getImageMetadata = exports.updateImageMetadata = exports.runEditSteps = exports.getClosestAncestorBlockGroupIndex = exports.getSegmentTextFormat = exports.getListStyleTypeFromString = exports.retrieveModelFormatState = exports.setTableCellBackgroundColor = exports.MIN_ALLOWED_TABLE_CELL_HEIGHT = exports.MIN_ALLOWED_TABLE_CELL_WIDTH = exports.normalizeTable = exports.setFirstColumnFormatBorders = exports.applyTableFormat = exports.deleteBlock = exports.deleteSegment = exports.deleteSelection = exports.mergeModel = exports.cloneModel = exports.setSelection = exports.hasSelectionInBlockGroup = exports.hasSelectionInSegment = exports.hasSelectionInBlock = exports.getSelectedCells = exports.getSelectedSegmentsAndParagraphs = exports.getSelectedSegments = exports.getSelectedParagraphs = exports.getOperationalBlocks = exports.getFirstSelectedTable = exports.getFirstSelectedListItem = exports.iterateSelections = exports.isBlockGroupOfType = void 0;
20009
+ exports.EmptySegmentFormat = exports.UnorderedListStyleMap = exports.OrderedListStyleMap = exports.TableBorderFormat = exports.NumberingListType = exports.BulletListType = exports.ChangeSource = exports.ListMetadataDefinition = exports.getListMetadata = exports.updateListMetadata = exports.getTableMetadata = exports.updateTableMetadata = exports.getTableCellMetadata = exports.updateTableCellMetadata = exports.getImageMetadata = exports.updateImageMetadata = exports.runEditSteps = exports.getClosestAncestorBlockGroupIndex = exports.getSegmentTextFormat = exports.getListStyleTypeFromString = exports.retrieveModelFormatState = exports.setTableCellBackgroundColor = exports.MIN_ALLOWED_TABLE_CELL_HEIGHT = exports.MIN_ALLOWED_TABLE_CELL_WIDTH = exports.normalizeTable = exports.setFirstColumnFormatBorders = exports.applyTableFormat = exports.deleteBlock = exports.deleteSegment = exports.deleteSelection = exports.mergeModel = exports.cloneModel = exports.setSelection = exports.hasSelectionInBlockGroup = exports.hasSelectionInSegment = exports.hasSelectionInBlock = exports.getSelectedCells = exports.getSelectedSegmentsAndParagraphs = exports.getSelectedSegments = exports.getSelectedParagraphs = exports.getOperationalBlocks = exports.getFirstSelectedTable = exports.getFirstSelectedListItem = exports.iterateSelections = exports.isBlockGroupOfType = void 0;
19807
20010
  var domToContentModel_1 = __webpack_require__(/*! ./domToModel/domToContentModel */ "./packages/roosterjs-content-model-dom/lib/domToModel/domToContentModel.ts");
19808
20011
  Object.defineProperty(exports, "domToContentModel", ({ enumerable: true, get: function () { return domToContentModel_1.domToContentModel; } }));
19809
20012
  var contentModelToDom_1 = __webpack_require__(/*! ./modelToDom/contentModelToDom */ "./packages/roosterjs-content-model-dom/lib/modelToDom/contentModelToDom.ts");
@@ -20051,6 +20254,8 @@ var OrderedListStyleMap_1 = __webpack_require__(/*! ./constants/OrderedListStyle
20051
20254
  Object.defineProperty(exports, "OrderedListStyleMap", ({ enumerable: true, get: function () { return OrderedListStyleMap_1.OrderedListStyleMap; } }));
20052
20255
  var UnorderedListStyleMap_1 = __webpack_require__(/*! ./constants/UnorderedListStyleMap */ "./packages/roosterjs-content-model-dom/lib/constants/UnorderedListStyleMap.ts");
20053
20256
  Object.defineProperty(exports, "UnorderedListStyleMap", ({ enumerable: true, get: function () { return UnorderedListStyleMap_1.UnorderedListStyleMap; } }));
20257
+ var EmptySegmentFormat_1 = __webpack_require__(/*! ./constants/EmptySegmentFormat */ "./packages/roosterjs-content-model-dom/lib/constants/EmptySegmentFormat.ts");
20258
+ Object.defineProperty(exports, "EmptySegmentFormat", ({ enumerable: true, get: function () { return EmptySegmentFormat_1.EmptySegmentFormat; } }));
20054
20259
 
20055
20260
 
20056
20261
  /***/ }),
@@ -22374,27 +22579,14 @@ var createParagraph_1 = __webpack_require__(/*! ../creators/createParagraph */ "
22374
22579
  var createSelectionMarker_1 = __webpack_require__(/*! ../creators/createSelectionMarker */ "./packages/roosterjs-content-model-dom/lib/modelApi/creators/createSelectionMarker.ts");
22375
22580
  var createTableCell_1 = __webpack_require__(/*! ../creators/createTableCell */ "./packages/roosterjs-content-model-dom/lib/modelApi/creators/createTableCell.ts");
22376
22581
  var deleteSelection_1 = __webpack_require__(/*! ./deleteSelection */ "./packages/roosterjs-content-model-dom/lib/modelApi/editing/deleteSelection.ts");
22582
+ var EmptySegmentFormat_1 = __webpack_require__(/*! ../../constants/EmptySegmentFormat */ "./packages/roosterjs-content-model-dom/lib/constants/EmptySegmentFormat.ts");
22377
22583
  var getClosestAncestorBlockGroupIndex_1 = __webpack_require__(/*! ./getClosestAncestorBlockGroupIndex */ "./packages/roosterjs-content-model-dom/lib/modelApi/editing/getClosestAncestorBlockGroupIndex.ts");
22378
22584
  var getObjectKeys_1 = __webpack_require__(/*! ../..//domUtils/getObjectKeys */ "./packages/roosterjs-content-model-dom/lib/domUtils/getObjectKeys.ts");
22379
22585
  var mutate_1 = __webpack_require__(/*! ../common/mutate */ "./packages/roosterjs-content-model-dom/lib/modelApi/common/mutate.ts");
22380
22586
  var normalizeContentModel_1 = __webpack_require__(/*! ../common/normalizeContentModel */ "./packages/roosterjs-content-model-dom/lib/modelApi/common/normalizeContentModel.ts");
22381
22587
  var normalizeTable_1 = __webpack_require__(/*! ./normalizeTable */ "./packages/roosterjs-content-model-dom/lib/modelApi/editing/normalizeTable.ts");
22382
22588
  var HeadingTags = ['h1', 'h2', 'h3', 'h4', 'h5', 'h6'];
22383
- // An object to provide keys of required properties of segment format, do NOT use any of its values
22384
- var RequiredEmptySegmentFormat = {
22385
- backgroundColor: null,
22386
- fontFamily: null,
22387
- fontSize: null,
22388
- fontWeight: null,
22389
- italic: null,
22390
- letterSpacing: null,
22391
- lineHeight: null,
22392
- strikethrough: null,
22393
- superOrSubScriptSequence: null,
22394
- textColor: null,
22395
- underline: null,
22396
- };
22397
- var KeysOfSegmentFormat = (0, getObjectKeys_1.getObjectKeys)(RequiredEmptySegmentFormat);
22589
+ var KeysOfSegmentFormat = (0, getObjectKeys_1.getObjectKeys)(EmptySegmentFormat_1.EmptySegmentFormat);
22398
22590
  /**
22399
22591
  * Merge source model into target mode
22400
22592
  * @param target Target Content Model that will merge content into
@@ -26358,7 +26550,7 @@ function getListTypeStyle(model, shouldSearchForBullet, shouldSearchForNumbering
26358
26550
  listMarkerSegment &&
26359
26551
  listMarkerSegment.segmentType == 'Text') {
26360
26552
  var listMarker = listMarkerSegment.text.trim();
26361
- var bulletType = bulletListType[listMarker];
26553
+ var bulletType = bulletListType.get(listMarker);
26362
26554
  if (bulletType && shouldSearchForBullet) {
26363
26555
  return { listType: 'UL', styleType: bulletType };
26364
26556
  }
@@ -26409,16 +26601,16 @@ var getPreviousListStyle = function (list) {
26409
26601
  return (_a = (0, roosterjs_content_model_dom_1.updateListMetadata)(list.levels[0])) === null || _a === void 0 ? void 0 : _a.orderedStyleType;
26410
26602
  }
26411
26603
  };
26412
- var bulletListType = {
26413
- '*': roosterjs_content_model_dom_1.BulletListType.Disc,
26414
- '-': roosterjs_content_model_dom_1.BulletListType.Dash,
26415
- '--': roosterjs_content_model_dom_1.BulletListType.Square,
26416
- '->': roosterjs_content_model_dom_1.BulletListType.LongArrow,
26417
- '-->': roosterjs_content_model_dom_1.BulletListType.DoubleLongArrow,
26418
- '=>': roosterjs_content_model_dom_1.BulletListType.UnfilledArrow,
26419
- '>': roosterjs_content_model_dom_1.BulletListType.ShortArrow,
26420
- '—': roosterjs_content_model_dom_1.BulletListType.Hyphen,
26421
- };
26604
+ var bulletListType = new Map([
26605
+ ['*', roosterjs_content_model_dom_1.BulletListType.Disc],
26606
+ ['-', roosterjs_content_model_dom_1.BulletListType.Dash],
26607
+ ['--', roosterjs_content_model_dom_1.BulletListType.Square],
26608
+ ['->', roosterjs_content_model_dom_1.BulletListType.LongArrow],
26609
+ ['-->', roosterjs_content_model_dom_1.BulletListType.DoubleLongArrow],
26610
+ ['=>', roosterjs_content_model_dom_1.BulletListType.UnfilledArrow],
26611
+ ['>', roosterjs_content_model_dom_1.BulletListType.ShortArrow],
26612
+ ['—', roosterjs_content_model_dom_1.BulletListType.Hyphen],
26613
+ ]);
26422
26614
  var isNewList = function (listMarker) {
26423
26615
  var marker = listMarker.replace(/[^\w\s]/g, '');
26424
26616
  var pattern = /^[1aAiI]$/;
@@ -26650,22 +26842,23 @@ var triggerList = function (model, listType, styleType, index) {
26650
26842
  Object.defineProperty(exports, "__esModule", ({ value: true }));
26651
26843
  exports.transformFraction = void 0;
26652
26844
  var splitTextSegment_1 = __webpack_require__(/*! ../../pluginUtils/splitTextSegment */ "./packages/roosterjs-content-model-plugins/lib/pluginUtils/splitTextSegment.ts");
26653
- var FRACTIONS = {
26654
- '1/2': '½',
26655
- '1/4': '¼',
26656
- '3/4': '¾',
26657
- };
26845
+ var FRACTIONS = new Map([
26846
+ ['1/2', '½'],
26847
+ ['1/4', '¼'],
26848
+ ['3/4', '¾'],
26849
+ ]);
26658
26850
  /**
26659
26851
  * @internal
26660
26852
  */
26661
26853
  function transformFraction(previousSegment, paragraph, context) {
26662
26854
  var _a;
26663
26855
  var fraction = (_a = previousSegment.text.split(' ').pop()) === null || _a === void 0 ? void 0 : _a.trim();
26664
- if (fraction && FRACTIONS[fraction]) {
26856
+ var text = fraction ? FRACTIONS.get(fraction) : undefined;
26857
+ if (fraction && text) {
26665
26858
  var textLength = previousSegment.text.length - 1;
26666
26859
  var textIndex = textLength - fraction.length;
26667
26860
  var textSegment = (0, splitTextSegment_1.splitTextSegment)(previousSegment, paragraph, textIndex, textLength);
26668
- textSegment.text = FRACTIONS[fraction];
26861
+ textSegment.text = text;
26669
26862
  context.canUndoByBackspace = true;
26670
26863
  return true;
26671
26864
  }