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.
- package/dist/rooster-amd-min.js +1 -1
- package/dist/rooster-amd-min.js.map +1 -1
- package/dist/rooster-amd.d.ts +17 -2
- package/dist/rooster-amd.js +267 -74
- package/dist/rooster-amd.js.map +1 -1
- package/dist/rooster-min.js +1 -1
- package/dist/rooster-min.js.map +1 -1
- package/dist/rooster-react-amd-min.js +2 -0
- package/dist/rooster-react-amd-min.js.map +1 -0
- package/dist/rooster-react-amd.d.ts +852 -0
- package/dist/rooster-react-amd.js +6762 -0
- package/dist/rooster-react-amd.js.map +1 -0
- package/dist/rooster-react-min.js +2 -0
- package/dist/rooster-react-min.js.map +1 -0
- package/dist/rooster-react.d.ts +854 -0
- package/dist/rooster-react.js +6762 -0
- package/dist/rooster-react.js.map +1 -0
- package/dist/rooster.d.ts +17 -2
- package/dist/rooster.js +267 -74
- package/dist/rooster.js.map +1 -1
- package/package.json +6 -6
package/dist/rooster-amd.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
// Type definitions for roosterjs (Version 9.
|
|
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
|
*/
|
package/dist/rooster-amd.js
CHANGED
|
@@ -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
|
-
|
|
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
|
|
6861
|
-
segmentAndParagraphs[0]
|
|
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
|
-
|
|
9840
|
-
|
|
9841
|
-
|
|
9842
|
-
|
|
9843
|
-
|
|
9844
|
-
|
|
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 =
|
|
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
|
-
|
|
10144
|
-
|
|
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
|
|
10238
|
-
var firstTarget =
|
|
10239
|
-
|
|
10240
|
-
|
|
10241
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
'*'
|
|
26414
|
-
'-'
|
|
26415
|
-
'--'
|
|
26416
|
-
'->'
|
|
26417
|
-
'-->'
|
|
26418
|
-
'=>'
|
|
26419
|
-
'>'
|
|
26420
|
-
'—'
|
|
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
|
-
|
|
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 =
|
|
26861
|
+
textSegment.text = text;
|
|
26669
26862
|
context.canUndoByBackspace = true;
|
|
26670
26863
|
return true;
|
|
26671
26864
|
}
|