roosterjs 9.7.0 → 9.8.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.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- // Type definitions for roosterjs (Version 9.7.0)
1
+ // Type definitions for roosterjs (Version 9.8.0)
2
2
  // Generated by dts tool from roosterjs
3
3
  // Project: https://github.com/Microsoft/roosterjs
4
4
 
@@ -8329,6 +8329,11 @@ class PastePlugin implements EditorPlugin {
8329
8329
  private setEventSanitizers;
8330
8330
  }
8331
8331
 
8332
+ /**
8333
+ * Default style sanitizers for PastePlugin.
8334
+ */
8335
+ const DefaultSanitizers: Record<string, ValueSanitizer>;
8336
+
8332
8337
  /**
8333
8338
  * Edit plugins helps editor to do editing operation on top of content model.
8334
8339
  * This includes:
package/dist/rooster.js CHANGED
@@ -3462,6 +3462,15 @@ function setListType(model, listType, removeMargins) {
3462
3462
  }
3463
3463
  (0, roosterjs_content_model_dom_1.mutateBlock)(parent).blocks.splice(index, 1, newListItem);
3464
3464
  existingListItems.push(newListItem);
3465
+ var levelIndex = newListItem.levels.length - 1;
3466
+ var level = (0, roosterjs_content_model_dom_1.mutateBlock)(newListItem).levels[levelIndex];
3467
+ if (level) {
3468
+ (0, roosterjs_content_model_dom_1.updateListMetadata)(level, function (metadata) {
3469
+ return Object.assign({}, metadata, {
3470
+ applyListStyleFromLevel: true,
3471
+ });
3472
+ });
3473
+ }
3465
3474
  }
3466
3475
  else {
3467
3476
  existingListItems.forEach(function (x) { return ((0, roosterjs_content_model_dom_1.mutateBlock)(x).levels[0].format.marginBottom = '0px'); });
@@ -8303,12 +8312,14 @@ exports.getPath = getPath;
8303
8312
  /*!********************************************************************************!*\
8304
8313
  !*** ./packages/roosterjs-content-model-core/lib/coreApi/announce/announce.ts ***!
8305
8314
  \********************************************************************************/
8306
- /***/ ((__unused_webpack_module, exports) => {
8315
+ /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
8307
8316
 
8308
8317
  "use strict";
8309
8318
 
8310
8319
  Object.defineProperty(exports, "__esModule", ({ value: true }));
8311
8320
  exports.announce = void 0;
8321
+ var createAriaLiveElement_1 = __webpack_require__(/*! ../../utils/createAriaLiveElement */ "./packages/roosterjs-content-model-core/lib/utils/createAriaLiveElement.ts");
8322
+ var DOT_STRING = '.';
8312
8323
  /**
8313
8324
  * @internal
8314
8325
  * Announce the given data
@@ -8316,17 +8327,17 @@ exports.announce = void 0;
8316
8327
  * @param announceData Data to announce
8317
8328
  */
8318
8329
  var announce = function (core, announceData) {
8319
- var _a;
8320
- var text = announceData.text, defaultStrings = announceData.defaultStrings, _b = announceData.formatStrings, formatStrings = _b === void 0 ? [] : _b;
8330
+ var text = announceData.text, defaultStrings = announceData.defaultStrings, _a = announceData.formatStrings, formatStrings = _a === void 0 ? [] : _a;
8321
8331
  var announcerStringGetter = core.lifecycle.announcerStringGetter;
8322
8332
  var template = defaultStrings && (announcerStringGetter === null || announcerStringGetter === void 0 ? void 0 : announcerStringGetter(defaultStrings));
8323
8333
  var textToAnnounce = formatString(template || text, formatStrings);
8324
- if (textToAnnounce) {
8334
+ if (!core.lifecycle.announceContainer) {
8335
+ core.lifecycle.announceContainer = (0, createAriaLiveElement_1.createAriaLiveElement)(core.physicalRoot.ownerDocument);
8336
+ }
8337
+ if (textToAnnounce && core.lifecycle.announceContainer) {
8325
8338
  var announceContainer = core.lifecycle.announceContainer;
8326
- if (!announceContainer || textToAnnounce == announceContainer.textContent) {
8327
- (_a = announceContainer === null || announceContainer === void 0 ? void 0 : announceContainer.parentElement) === null || _a === void 0 ? void 0 : _a.removeChild(announceContainer);
8328
- announceContainer = createAriaLiveElement(core.physicalRoot.ownerDocument);
8329
- core.lifecycle.announceContainer = announceContainer;
8339
+ if (textToAnnounce == announceContainer.textContent) {
8340
+ textToAnnounce += DOT_STRING;
8330
8341
  }
8331
8342
  if (announceContainer) {
8332
8343
  announceContainer.textContent = textToAnnounce;
@@ -8345,19 +8356,6 @@ function formatString(text, formatStrings) {
8345
8356
  });
8346
8357
  return text;
8347
8358
  }
8348
- function createAriaLiveElement(document) {
8349
- var div = document.createElement('div');
8350
- div.style.clip = 'rect(0px, 0px, 0px, 0px)';
8351
- div.style.clipPath = 'inset(100%)';
8352
- div.style.height = '1px';
8353
- div.style.overflow = 'hidden';
8354
- div.style.position = 'absolute';
8355
- div.style.whiteSpace = 'nowrap';
8356
- div.style.width = '1px';
8357
- div.ariaLive = 'assertive';
8358
- document.body.appendChild(div);
8359
- return div;
8360
- }
8361
8359
 
8362
8360
 
8363
8361
  /***/ }),
@@ -9575,7 +9573,7 @@ function ensureUniqueId(element, idPrefix) {
9575
9573
  idPrefix = element.id || idPrefix;
9576
9574
  var doc = element.ownerDocument;
9577
9575
  var i = 0;
9578
- while (!element.id || doc.querySelectorAll('#' + element.id).length > 1) {
9576
+ while (!element.id || doc.querySelectorAll("[id=\"" + element.id + "\"]").length > 1) {
9579
9577
  element.id = idPrefix + '_' + i++;
9580
9578
  }
9581
9579
  return element.id;
@@ -12278,6 +12276,7 @@ exports.applyPendingFormat = applyPendingFormat;
12278
12276
  Object.defineProperty(exports, "__esModule", ({ value: true }));
12279
12277
  exports.createLifecyclePlugin = void 0;
12280
12278
  var roosterjs_content_model_dom_1 = __webpack_require__(/*! roosterjs-content-model-dom */ "./packages/roosterjs-content-model-dom/lib/index.ts");
12279
+ var createAriaLiveElement_1 = __webpack_require__(/*! ../../utils/createAriaLiveElement */ "./packages/roosterjs-content-model-core/lib/utils/createAriaLiveElement.ts");
12281
12280
  var ContentEditableAttributeName = 'contenteditable';
12282
12281
  var DefaultTextColor = '#000000';
12283
12282
  var DefaultBackColor = '#ffffff';
@@ -12337,6 +12336,8 @@ var LifecyclePlugin = /** @class */ (function () {
12337
12336
  this.adjustColor();
12338
12337
  // Let other plugins know that we are ready
12339
12338
  this.editor.triggerEvent('editorReady', {}, true /*broadcast*/);
12339
+ // Initialize the Announce container.
12340
+ this.state.announceContainer = (0, createAriaLiveElement_1.createAriaLiveElement)(editor.getDocument());
12340
12341
  };
12341
12342
  /**
12342
12343
  * Dispose this plugin
@@ -14472,6 +14473,37 @@ function shouldUseTableProcessor(element, context) {
14472
14473
  }
14473
14474
 
14474
14475
 
14476
+ /***/ }),
14477
+
14478
+ /***/ "./packages/roosterjs-content-model-core/lib/utils/createAriaLiveElement.ts":
14479
+ /*!**********************************************************************************!*\
14480
+ !*** ./packages/roosterjs-content-model-core/lib/utils/createAriaLiveElement.ts ***!
14481
+ \**********************************************************************************/
14482
+ /***/ ((__unused_webpack_module, exports) => {
14483
+
14484
+ "use strict";
14485
+
14486
+ Object.defineProperty(exports, "__esModule", ({ value: true }));
14487
+ exports.createAriaLiveElement = void 0;
14488
+ /**
14489
+ * @internal
14490
+ */
14491
+ function createAriaLiveElement(document) {
14492
+ var div = document.createElement('div');
14493
+ div.style.clip = 'rect(0px, 0px, 0px, 0px)';
14494
+ div.style.clipPath = 'inset(100%)';
14495
+ div.style.height = '1px';
14496
+ div.style.overflow = 'hidden';
14497
+ div.style.position = 'absolute';
14498
+ div.style.whiteSpace = 'nowrap';
14499
+ div.style.width = '1px';
14500
+ div.ariaLive = 'assertive';
14501
+ document.body.appendChild(div);
14502
+ return div;
14503
+ }
14504
+ exports.createAriaLiveElement = createAriaLiveElement;
14505
+
14506
+
14475
14507
  /***/ }),
14476
14508
 
14477
14509
  /***/ "./packages/roosterjs-content-model-dom/lib/config/defaultContentModelFormatMap.ts":
@@ -26814,7 +26846,9 @@ function canAppendList(index, previousListIndex) {
26814
26846
 
26815
26847
  Object.defineProperty(exports, "__esModule", ({ value: true }));
26816
26848
  exports.keyboardListTrigger = void 0;
26849
+ var tslib_1 = __webpack_require__(/*! tslib */ "./node_modules/tslib/tslib.es6.mjs");
26817
26850
  var getListTypeStyle_1 = __webpack_require__(/*! ./getListTypeStyle */ "./packages/roosterjs-content-model-plugins/lib/autoFormat/list/getListTypeStyle.ts");
26851
+ var roosterjs_content_model_dom_1 = __webpack_require__(/*! roosterjs-content-model-dom */ "./packages/roosterjs-content-model-dom/lib/index.ts");
26818
26852
  var roosterjs_content_model_api_1 = __webpack_require__(/*! roosterjs-content-model-api */ "./packages/roosterjs-content-model-api/lib/index.ts");
26819
26853
  /**
26820
26854
  * @internal
@@ -26828,6 +26862,7 @@ function keyboardListTrigger(model, paragraph, context, shouldSearchForBullet, s
26828
26862
  var listType = listStyleType.listType, styleType = listStyleType.styleType, index = listStyleType.index;
26829
26863
  triggerList(model, listType, styleType, index);
26830
26864
  context.canUndoByBackspace = true;
26865
+ setAnnounceData(model, context);
26831
26866
  return true;
26832
26867
  }
26833
26868
  return false;
@@ -26842,11 +26877,21 @@ var triggerList = function (model, listType, styleType, index) {
26842
26877
  (0, roosterjs_content_model_api_1.setModelListStyle)(model, isOrderedList
26843
26878
  ? {
26844
26879
  orderedStyleType: styleType,
26880
+ applyListStyleFromLevel: false,
26845
26881
  }
26846
26882
  : {
26847
26883
  unorderedStyleType: styleType,
26884
+ applyListStyleFromLevel: false,
26848
26885
  });
26849
26886
  };
26887
+ function setAnnounceData(model, context) {
26888
+ var _a = (0, tslib_1.__read)((0, roosterjs_content_model_dom_1.getOperationalBlocks)(model, ['ListItem'], [] // Set stop types to be empty so we can find list items even cross the boundary of table, then we can always operation on the list item if any
26889
+ ), 1), paragraphOrListItems = _a[0];
26890
+ if (paragraphOrListItems && (0, roosterjs_content_model_dom_1.isBlockGroupOfType)(paragraphOrListItems.block, 'ListItem')) {
26891
+ var path = paragraphOrListItems.path, block = paragraphOrListItems.block;
26892
+ context.announceData = (0, roosterjs_content_model_api_1.getListAnnounceData)((0, tslib_1.__spreadArray)([block], (0, tslib_1.__read)(path), false));
26893
+ }
26894
+ }
26850
26895
 
26851
26896
 
26852
26897
  /***/ }),
@@ -28938,6 +28983,7 @@ var getHTMLImageOptions_1 = __webpack_require__(/*! ./utils/getHTMLImageOptions
28938
28983
  var getSelectedImage_1 = __webpack_require__(/*! ./utils/getSelectedImage */ "./packages/roosterjs-content-model-plugins/lib/imageEdit/utils/getSelectedImage.ts");
28939
28984
  var updateImageEditInfo_1 = __webpack_require__(/*! ./utils/updateImageEditInfo */ "./packages/roosterjs-content-model-plugins/lib/imageEdit/utils/updateImageEditInfo.ts");
28940
28985
  var ImageEditElementClass_1 = __webpack_require__(/*! ./types/ImageEditElementClass */ "./packages/roosterjs-content-model-plugins/lib/imageEdit/types/ImageEditElementClass.ts");
28986
+ var normalizeImageSelection_1 = __webpack_require__(/*! ./utils/normalizeImageSelection */ "./packages/roosterjs-content-model-plugins/lib/imageEdit/utils/normalizeImageSelection.ts");
28941
28987
  var resizerContext_1 = __webpack_require__(/*! ./Resizer/resizerContext */ "./packages/roosterjs-content-model-plugins/lib/imageEdit/Resizer/resizerContext.ts");
28942
28988
  var rotatorContext_1 = __webpack_require__(/*! ./Rotator/rotatorContext */ "./packages/roosterjs-content-model-plugins/lib/imageEdit/Rotator/rotatorContext.ts");
28943
28989
  var updateRotateHandle_1 = __webpack_require__(/*! ./Rotator/updateRotateHandle */ "./packages/roosterjs-content-model-plugins/lib/imageEdit/Rotator/updateRotateHandle.ts");
@@ -29120,6 +29166,9 @@ var ImageEditPlugin = /** @class */ (function () {
29120
29166
  image.isSelected = shouldSelectImage;
29121
29167
  image.isSelectedAsImageSelection = shouldSelectImage;
29122
29168
  });
29169
+ if (shouldSelectImage) {
29170
+ (0, normalizeImageSelection_1.normalizeImageSelection)(previousSelectedImage);
29171
+ }
29123
29172
  _this.cleanInfo();
29124
29173
  result = true;
29125
29174
  }
@@ -30602,6 +30651,48 @@ function isFixedNumberValue(value) {
30602
30651
  }
30603
30652
 
30604
30653
 
30654
+ /***/ }),
30655
+
30656
+ /***/ "./packages/roosterjs-content-model-plugins/lib/imageEdit/utils/normalizeImageSelection.ts":
30657
+ /*!*************************************************************************************************!*\
30658
+ !*** ./packages/roosterjs-content-model-plugins/lib/imageEdit/utils/normalizeImageSelection.ts ***!
30659
+ \*************************************************************************************************/
30660
+ /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
30661
+
30662
+ "use strict";
30663
+
30664
+ Object.defineProperty(exports, "__esModule", ({ value: true }));
30665
+ exports.normalizeImageSelection = void 0;
30666
+ var roosterjs_content_model_dom_1 = __webpack_require__(/*! roosterjs-content-model-dom */ "./packages/roosterjs-content-model-dom/lib/index.ts");
30667
+ /**
30668
+ * Selecting directly on the image will only capture the image segment.
30669
+ * However, if the selection is made while the image is within a wrapper, it will capture the span that encloses the image.
30670
+ * In the last case, the selection will be marked as <---SelectionMarker---><---Image---><---SelectionMarker--->.
30671
+ * To fix this behavior the extra selection markers are removed.
30672
+ * @internal
30673
+ */
30674
+ function normalizeImageSelection(imageAndParagraph) {
30675
+ var paragraph = imageAndParagraph.paragraph;
30676
+ var index = paragraph.segments.indexOf(imageAndParagraph.image);
30677
+ if (index > 0) {
30678
+ var markerBefore = paragraph.segments[index - 1];
30679
+ var markerAfter = paragraph.segments[index + 1];
30680
+ if (markerBefore &&
30681
+ markerAfter &&
30682
+ markerAfter.segmentType == 'SelectionMarker' &&
30683
+ markerBefore.segmentType == 'SelectionMarker' &&
30684
+ markerAfter.isSelected &&
30685
+ markerBefore.isSelected) {
30686
+ var mutatedParagraph = (0, roosterjs_content_model_dom_1.mutateBlock)(paragraph);
30687
+ mutatedParagraph.segments.splice(index - 1, 1);
30688
+ mutatedParagraph.segments.splice(index, 1);
30689
+ }
30690
+ return imageAndParagraph;
30691
+ }
30692
+ }
30693
+ exports.normalizeImageSelection = normalizeImageSelection;
30694
+
30695
+
30605
30696
  /***/ }),
30606
30697
 
30607
30698
  /***/ "./packages/roosterjs-content-model-plugins/lib/imageEdit/utils/updateHandleCursor.ts":
@@ -30817,11 +30908,13 @@ exports.updateWrapper = updateWrapper;
30817
30908
  "use strict";
30818
30909
 
30819
30910
  Object.defineProperty(exports, "__esModule", ({ value: true }));
30820
- exports.ImageEditPlugin = exports.CustomReplacePlugin = exports.PickerPlugin = exports.HyperlinkPlugin = exports.MarkdownPlugin = exports.WatermarkPlugin = exports.ContextMenuPluginBase = exports.ShortcutPlugin = exports.ShortcutOutdentList = exports.ShortcutIndentList = exports.ShortcutDecreaseFont = exports.ShortcutIncreaseFont = exports.ShortcutNumbering = exports.ShortcutBullet = exports.ShortcutRedoMacOS = exports.ShortcutRedoAlt = exports.ShortcutRedo = exports.ShortcutUndo2 = exports.ShortcutUndo = exports.ShortcutClearFormat = exports.ShortcutUnderline = exports.ShortcutItalic = exports.ShortcutBold = exports.AutoFormatPlugin = exports.EditPlugin = exports.PastePlugin = exports.TableEditPlugin = void 0;
30911
+ exports.ImageEditPlugin = exports.CustomReplacePlugin = exports.PickerPlugin = exports.HyperlinkPlugin = exports.MarkdownPlugin = exports.WatermarkPlugin = exports.ContextMenuPluginBase = exports.ShortcutPlugin = exports.ShortcutOutdentList = exports.ShortcutIndentList = exports.ShortcutDecreaseFont = exports.ShortcutIncreaseFont = exports.ShortcutNumbering = exports.ShortcutBullet = exports.ShortcutRedoMacOS = exports.ShortcutRedoAlt = exports.ShortcutRedo = exports.ShortcutUndo2 = exports.ShortcutUndo = exports.ShortcutClearFormat = exports.ShortcutUnderline = exports.ShortcutItalic = exports.ShortcutBold = exports.AutoFormatPlugin = exports.EditPlugin = exports.DefaultSanitizers = exports.PastePlugin = exports.TableEditPlugin = void 0;
30821
30912
  var TableEditPlugin_1 = __webpack_require__(/*! ./tableEdit/TableEditPlugin */ "./packages/roosterjs-content-model-plugins/lib/tableEdit/TableEditPlugin.ts");
30822
30913
  Object.defineProperty(exports, "TableEditPlugin", ({ enumerable: true, get: function () { return TableEditPlugin_1.TableEditPlugin; } }));
30823
30914
  var PastePlugin_1 = __webpack_require__(/*! ./paste/PastePlugin */ "./packages/roosterjs-content-model-plugins/lib/paste/PastePlugin.ts");
30824
30915
  Object.defineProperty(exports, "PastePlugin", ({ enumerable: true, get: function () { return PastePlugin_1.PastePlugin; } }));
30916
+ var DefaultSanitizers_1 = __webpack_require__(/*! ./paste/DefaultSanitizers */ "./packages/roosterjs-content-model-plugins/lib/paste/DefaultSanitizers.ts");
30917
+ Object.defineProperty(exports, "DefaultSanitizers", ({ enumerable: true, get: function () { return DefaultSanitizers_1.DefaultSanitizers; } }));
30825
30918
  var EditPlugin_1 = __webpack_require__(/*! ./edit/EditPlugin */ "./packages/roosterjs-content-model-plugins/lib/edit/EditPlugin.ts");
30826
30919
  Object.defineProperty(exports, "EditPlugin", ({ enumerable: true, get: function () { return EditPlugin_1.EditPlugin; } }));
30827
30920
  var AutoFormatPlugin_1 = __webpack_require__(/*! ./autoFormat/AutoFormatPlugin */ "./packages/roosterjs-content-model-plugins/lib/autoFormat/AutoFormatPlugin.ts");
@@ -31126,7 +31219,7 @@ exports.setFormat = setFormat;
31126
31219
  Object.defineProperty(exports, "__esModule", ({ value: true }));
31127
31220
  exports.divParagraphSanitizer = exports.DefaultSanitizers = void 0;
31128
31221
  /**
31129
- * @internal
31222
+ * Default style sanitizers for PastePlugin.
31130
31223
  */
31131
31224
  exports.DefaultSanitizers = {
31132
31225
  width: divParagraphSanitizer,