roosterjs 8.29.5 → 8.30.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.
package/dist/rooster.js CHANGED
@@ -2810,6 +2810,11 @@ function getElementBasedFormatState(editor, event) {
2810
2810
  multiline = endingBlock && startingBlock ? !endingBlock.equals(startingBlock) : false;
2811
2811
  }
2812
2812
  var headerTag = (0, roosterjs_editor_dom_1.getTagOfNode)(editor.getElementAtCursor('H1,H2,H3,H4,H5,H6', null /*startFrom*/, event));
2813
+ var table = editor.queryElements('table', 1 /* OnSelection */)[0];
2814
+ var tableFormat = table ? (0, roosterjs_editor_dom_1.getTableFormatInfo)(table) : undefined;
2815
+ var hasHeader = (table === null || table === void 0 ? void 0 : table.rows[0])
2816
+ ? (0, roosterjs_editor_dom_1.toArray)(table.rows[0].cells).every(function (cell) { return (0, roosterjs_editor_dom_1.getTagOfNode)(cell) == 'TH'; })
2817
+ : undefined;
2813
2818
  return {
2814
2819
  isBullet: listTag == 'UL',
2815
2820
  isNumbering: listTag == 'OL',
@@ -2818,7 +2823,9 @@ function getElementBasedFormatState(editor, event) {
2818
2823
  canUnlink: !!editor.queryElements('a[href]', 1 /* OnSelection */)[0],
2819
2824
  canAddImageAltText: !!editor.queryElements('img', 1 /* OnSelection */)[0],
2820
2825
  isBlockQuote: !!editor.queryElements('blockquote', 1 /* OnSelection */)[0],
2821
- isInTable: !!editor.queryElements('table', 1 /* OnSelection */)[0],
2826
+ isInTable: !!table,
2827
+ tableFormat: tableFormat,
2828
+ tableHasHeader: hasHeader,
2822
2829
  };
2823
2830
  }
2824
2831
  exports.getElementBasedFormatState = getElementBasedFormatState;
@@ -5828,7 +5835,6 @@ function buildCss(table, coordinates, contentDivSelector) {
5828
5835
  });
5829
5836
  (_a = vTable.cells) === null || _a === void 0 ? void 0 : _a.forEach(function (row, rowIndex) {
5830
5837
  var tdCount = 0;
5831
- var thCount = 0;
5832
5838
  firstSelected = null;
5833
5839
  lastSelected = null;
5834
5840
  //Get current TBODY/THEAD/TFOOT
@@ -5841,12 +5847,7 @@ function buildCss(table, coordinates, contentDivSelector) {
5841
5847
  var cell = row[cellIndex].td;
5842
5848
  if (cell) {
5843
5849
  var tag = (0, roosterjs_editor_dom_1.getTagOfNode)(cell);
5844
- if (tag == 'TD') {
5845
- tdCount++;
5846
- }
5847
- if (tag == 'TH') {
5848
- thCount++;
5849
- }
5850
+ tdCount++;
5850
5851
  if (rowIndex >= tr1 && rowIndex <= tr2 && cellIndex >= td1 && cellIndex <= td2) {
5851
5852
  if (isFirst) {
5852
5853
  isFirst = false;
@@ -5855,7 +5856,7 @@ function buildCss(table, coordinates, contentDivSelector) {
5855
5856
  css += ',';
5856
5857
  }
5857
5858
  removeImportant(cell);
5858
- var selector = generateCssFromCell(contentDivSelector, table.id, middleElSelector, currentRow, tag, tag == 'TD' ? tdCount : thCount);
5859
+ var selector = generateCssFromCell(contentDivSelector, table.id, middleElSelector, currentRow, tag, tdCount);
5859
5860
  css += selector;
5860
5861
  firstSelected = firstSelected || table.querySelector(selector);
5861
5862
  lastSelected = table.querySelector(selector);
@@ -6320,10 +6321,9 @@ var CopyPastePlugin = /** @class */ (function () {
6320
6321
  function CopyPastePlugin(options) {
6321
6322
  var _this = this;
6322
6323
  this.onPaste = function (event) {
6323
- var _a, _b;
6324
+ var _a;
6324
6325
  var range;
6325
6326
  (0, roosterjs_editor_dom_1.extractClipboardEvent)(event, function (clipboardData) { var _a; return (_a = _this.editor) === null || _a === void 0 ? void 0 : _a.paste(clipboardData); }, {
6326
- allowLinkPreview: (_a = _this.editor) === null || _a === void 0 ? void 0 : _a.isFeatureEnabled("PasteWithLinkPreview" /* PasteWithLinkPreview */),
6327
6327
  allowedCustomPasteType: _this.state.allowedCustomPasteType,
6328
6328
  getTempDiv: function () {
6329
6329
  var _a;
@@ -6333,7 +6333,7 @@ var CopyPastePlugin = /** @class */ (function () {
6333
6333
  removeTempDiv: function (div) {
6334
6334
  _this.cleanUpAndRestoreSelection(div, range, false /* isCopy */);
6335
6335
  },
6336
- }, (_b = _this.editor) === null || _b === void 0 ? void 0 : _b.getSelectionRange());
6336
+ }, (_a = _this.editor) === null || _a === void 0 ? void 0 : _a.getSelectionRange());
6337
6337
  };
6338
6338
  this.state = {
6339
6339
  allowedCustomPasteType: options.allowedCustomPasteType || [],
@@ -6378,16 +6378,19 @@ var CopyPastePlugin = /** @class */ (function () {
6378
6378
  if (selection && !selection.areAllCollapsed) {
6379
6379
  var html = this.editor.getContent(2 /* RawHTMLWithSelection */);
6380
6380
  var tempDiv_1 = this.getTempDiv(true /*forceInLightMode*/);
6381
- var newRange = (0, roosterjs_editor_dom_1.setHtmlWithSelectionPath)(tempDiv_1, html, this.editor.getTrustedHTMLHandler());
6382
- if (newRange) {
6383
- (0, roosterjs_editor_dom_1.addRangeToSelection)(newRange);
6384
- }
6381
+ var metadata = (0, roosterjs_editor_dom_1.setHtmlWithMetadata)(tempDiv_1, html, this.editor.getTrustedHTMLHandler());
6382
+ var newRange = (metadata === null || metadata === void 0 ? void 0 : metadata.type) === 0 /* Normal */
6383
+ ? (0, roosterjs_editor_dom_1.createRange)(tempDiv_1, metadata.start, metadata.end)
6384
+ : null;
6385
6385
  this.editor.triggerPluginEvent(9 /* BeforeCutCopy */, {
6386
6386
  clonedRoot: tempDiv_1,
6387
6387
  range: newRange,
6388
6388
  rawEvent: event,
6389
6389
  isCut: isCut,
6390
6390
  });
6391
+ if (newRange) {
6392
+ (0, roosterjs_editor_dom_1.addRangeToSelection)(newRange);
6393
+ }
6391
6394
  this.editor.runAsync(function (editor) {
6392
6395
  _this.cleanUpAndRestoreSelection(tempDiv_1, selection, !isCut /* isCopy */);
6393
6396
  if (isCut) {
@@ -7406,6 +7409,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
7406
7409
  var roosterjs_editor_dom_1 = __webpack_require__(/*! roosterjs-editor-dom */ "./packages/roosterjs-editor-dom/lib/index.ts");
7407
7410
  /**
7408
7411
  * @internal
7412
+ * TODO: Rename this plugin since it is not only for table now
7413
+ *
7409
7414
  * NormalizeTable plugin makes sure each table in editor has TBODY/THEAD/TFOOT tag around TR tags
7410
7415
  *
7411
7416
  * When we retrieve HTML content using innerHTML, browser will always add TBODY around TR nodes if there is not.
@@ -7462,6 +7467,11 @@ var NormalizeTablePlugin = /** @class */ (function () {
7462
7467
  this.normalizeTableFromEvent(event.rawEvent);
7463
7468
  }
7464
7469
  break;
7470
+ case 8 /* ExtractContentWithDom */:
7471
+ if (this.editor.isFeatureEnabled("NormalizeList" /* NormalizeList */)) {
7472
+ normalizeListsForExport(event.clonedRoot);
7473
+ }
7474
+ break;
7465
7475
  }
7466
7476
  };
7467
7477
  NormalizeTablePlugin.prototype.normalizeTableFromEvent = function (event) {
@@ -7533,6 +7543,15 @@ function normalizeTables(tables) {
7533
7543
  });
7534
7544
  return isDOMChanged;
7535
7545
  }
7546
+ function normalizeListsForExport(root) {
7547
+ (0, roosterjs_editor_dom_1.toArray)(root.querySelectorAll('li')).forEach(function (li) {
7548
+ var prevElement = li.previousSibling;
7549
+ if (li.style.display == 'block' && (0, roosterjs_editor_dom_1.safeInstanceOf)(prevElement, 'HTMLLIElement')) {
7550
+ delete li.style.display;
7551
+ prevElement.appendChild((0, roosterjs_editor_dom_1.changeElementTag)(li, 'div'));
7552
+ }
7553
+ });
7554
+ }
7536
7555
 
7537
7556
 
7538
7557
  /***/ }),
@@ -9201,17 +9220,6 @@ function removeContents(range) {
9201
9220
 
9202
9221
  "use strict";
9203
9222
 
9204
- var __assign = (this && this.__assign) || function () {
9205
- __assign = Object.assign || function(t) {
9206
- for (var s, i = 1, n = arguments.length; i < n; i++) {
9207
- s = arguments[i];
9208
- for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
9209
- t[p] = s[p];
9210
- }
9211
- return t;
9212
- };
9213
- return __assign.apply(this, arguments);
9214
- };
9215
9223
  var _a;
9216
9224
  Object.defineProperty(exports, "__esModule", { value: true });
9217
9225
  var readFile_1 = __webpack_require__(/*! ../utils/readFile */ "./packages/roosterjs-editor-dom/lib/utils/readFile.ts");
@@ -9234,6 +9242,7 @@ var ContentHandlers = (_a = {},
9234
9242
  },
9235
9243
  _a["text/plain" /* PlainText */] = function (data, value) { return (data.text = value); },
9236
9244
  _a[OTHER_TEXT_TYPE] = function (data, value, type) { return !!type && (data.customValues[type] = value); },
9245
+ _a["text/" /* Text */ + EDGE_LINK_PREVIEW] = tryParseLinkPreview,
9237
9246
  _a);
9238
9247
  /**
9239
9248
  * Extract clipboard items to be a ClipboardData object for IE
@@ -9256,10 +9265,6 @@ function extractClipboardItems(items, options) {
9256
9265
  rawHtml: null,
9257
9266
  customValues: {},
9258
9267
  };
9259
- var contentHandlers = __assign({}, ContentHandlers);
9260
- if (options === null || options === void 0 ? void 0 : options.allowLinkPreview) {
9261
- contentHandlers["text/" /* Text */ + EDGE_LINK_PREVIEW] = tryParseLinkPreview;
9262
- }
9263
9268
  return Promise.all((items || []).map(function (item) {
9264
9269
  var type = item.type;
9265
9270
  if (type.indexOf("image/" /* Image */) == 0 && !data.image && item.kind == 'file') {
@@ -9289,7 +9294,7 @@ function extractClipboardItems(items, options) {
9289
9294
  }
9290
9295
  else {
9291
9296
  var customType_1 = getAllowedCustomType(type, options === null || options === void 0 ? void 0 : options.allowedCustomPasteType);
9292
- var handler_1 = contentHandlers[type] || (customType_1 ? contentHandlers[OTHER_TEXT_TYPE] : null);
9297
+ var handler_1 = ContentHandlers[type] || (customType_1 ? ContentHandlers[OTHER_TEXT_TYPE] : null);
9293
9298
  return new Promise(function (resolve) {
9294
9299
  return handler_1
9295
9300
  ? item.getAsString(function (value) {
@@ -11543,8 +11548,8 @@ exports.default = getPredefinedCssForElement;
11543
11548
 
11544
11549
  Object.defineProperty(exports, "__esModule", { value: true });
11545
11550
  exports.VTable = exports.moveChildNodes = exports.KnownCreateElementData = exports.createElement = exports.matchesSelector = exports.setColor = exports.getInnerHTML = exports.readFile = exports.safeInstanceOf = exports.normalizeRect = exports.splitTextNode = exports.getLastLeafNode = exports.getFirstLeafNode = exports.getPreviousLeafSibling = exports.getNextLeafSibling = exports.wrap = exports.unwrap = exports.splitBalancedNodeRange = exports.splitParentNode = exports.queryElements = exports.matchLink = exports.isVoidHtmlElement = exports.isNodeEmpty = exports.isBlockElement = exports.getTagOfNode = exports.PendableFormatCommandMap = exports.getPendableFormatState = exports.getComputedStyle = exports.getComputedStyles = exports.fromHtml = exports.findClosestElementAncestor = exports.contains = exports.collapseNodes = exports.changeElementTag = exports.applyFormat = exports.getBrowserInfo = exports.Browser = exports.extractClipboardItemsForIE = exports.extractClipboardItems = exports.extractClipboardEvent = exports.applyTextStyle = exports.PartialInlineElement = exports.NodeInlineElement = exports.LinkInlineElement = exports.ImageInlineElement = exports.getInlineElementAtNode = exports.PositionContentSearcher = exports.ContentTraverser = exports.getFirstLastBlockElement = exports.getBlockElementAtNode = void 0;
11546
- exports.createBooleanDefinition = exports.createNumberDefinition = exports.validate = exports.getTextContent = exports.deleteSelectedContent = exports.adjustInsertPosition = exports.setStyles = exports.getStyles = exports.isCtrlOrMetaPressed = exports.isCharacterValue = exports.isModifierKey = exports.clearEventDataCache = exports.cacheGetEventData = exports.getEntitySelector = exports.getEntityFromElement = exports.commitEntity = exports.chainSanitizerCallback = exports.createDefaultHtmlSanitizerOptions = exports.getInheritableStyles = exports.HtmlSanitizer = exports.canUndoAutoComplete = exports.createSnapshots = exports.moveCurrentSnapsnot = exports.moveCurrentSnapshot = exports.clearProceedingSnapshotsV2 = exports.clearProceedingSnapshots = exports.canMoveCurrentSnapshot = exports.addSnapshotV2 = exports.addSnapshot = exports.addRangeToSelection = exports.setHtmlWithMetadata = exports.setHtmlWithSelectionPath = exports.getHtmlWithSelectionPath = exports.getSelectionPath = exports.isPositionAtBeginningOf = exports.getPositionRect = exports.createRange = exports.Position = exports.mergeBlocksInRegion = exports.getSelectionRangeInRegion = exports.isNodeInRegion = exports.collapseNodesInRegion = exports.getSelectedBlockElementsInRegion = exports.getRegionsFromRange = exports.setListItemStyle = exports.VListChain = exports.createVListFromRegion = exports.VListItem = exports.VList = exports.isWholeTableSelected = void 0;
11547
- exports.toArray = exports.getObjectKeys = exports.arrayPush = exports.removeMetadata = exports.setMetadata = exports.getMetadata = exports.createObjectDefinition = exports.createArrayDefinition = exports.createStringDefinition = void 0;
11551
+ exports.createNumberDefinition = exports.validate = exports.getTextContent = exports.deleteSelectedContent = exports.adjustInsertPosition = exports.setStyles = exports.getStyles = exports.isCtrlOrMetaPressed = exports.isCharacterValue = exports.isModifierKey = exports.clearEventDataCache = exports.cacheGetEventData = exports.getEntitySelector = exports.getEntityFromElement = exports.commitEntity = exports.chainSanitizerCallback = exports.createDefaultHtmlSanitizerOptions = exports.getInheritableStyles = exports.HtmlSanitizer = exports.canUndoAutoComplete = exports.createSnapshots = exports.moveCurrentSnapsnot = exports.moveCurrentSnapshot = exports.clearProceedingSnapshotsV2 = exports.clearProceedingSnapshots = exports.canMoveCurrentSnapshot = exports.addSnapshotV2 = exports.addSnapshot = exports.addRangeToSelection = exports.setHtmlWithMetadata = exports.setHtmlWithSelectionPath = exports.getHtmlWithSelectionPath = exports.getSelectionPath = exports.isPositionAtBeginningOf = exports.getPositionRect = exports.createRange = exports.Position = exports.mergeBlocksInRegion = exports.getSelectionRangeInRegion = exports.isNodeInRegion = exports.collapseNodesInRegion = exports.getSelectedBlockElementsInRegion = exports.getRegionsFromRange = exports.getTableFormatInfo = exports.setListItemStyle = exports.VListChain = exports.createVListFromRegion = exports.VListItem = exports.VList = exports.isWholeTableSelected = void 0;
11552
+ exports.toArray = exports.getObjectKeys = exports.arrayPush = exports.removeMetadata = exports.setMetadata = exports.getMetadata = exports.createObjectDefinition = exports.createArrayDefinition = exports.createStringDefinition = exports.createBooleanDefinition = void 0;
11548
11553
  var getBlockElementAtNode_1 = __webpack_require__(/*! ./blockElements/getBlockElementAtNode */ "./packages/roosterjs-editor-dom/lib/blockElements/getBlockElementAtNode.ts");
11549
11554
  Object.defineProperty(exports, "getBlockElementAtNode", { enumerable: true, get: function () { return getBlockElementAtNode_1.default; } });
11550
11555
  var getFirstLastBlockElement_1 = __webpack_require__(/*! ./blockElements/getFirstLastBlockElement */ "./packages/roosterjs-editor-dom/lib/blockElements/getFirstLastBlockElement.ts");
@@ -11650,6 +11655,8 @@ var VListChain_1 = __webpack_require__(/*! ./list/VListChain */ "./packages/roos
11650
11655
  Object.defineProperty(exports, "VListChain", { enumerable: true, get: function () { return VListChain_1.default; } });
11651
11656
  var setListItemStyle_1 = __webpack_require__(/*! ./list/setListItemStyle */ "./packages/roosterjs-editor-dom/lib/list/setListItemStyle.ts");
11652
11657
  Object.defineProperty(exports, "setListItemStyle", { enumerable: true, get: function () { return setListItemStyle_1.default; } });
11658
+ var tableFormatInfo_1 = __webpack_require__(/*! ./table/tableFormatInfo */ "./packages/roosterjs-editor-dom/lib/table/tableFormatInfo.ts");
11659
+ Object.defineProperty(exports, "getTableFormatInfo", { enumerable: true, get: function () { return tableFormatInfo_1.getTableFormatInfo; } });
11653
11660
  var getRegionsFromRange_1 = __webpack_require__(/*! ./region/getRegionsFromRange */ "./packages/roosterjs-editor-dom/lib/region/getRegionsFromRange.ts");
11654
11661
  Object.defineProperty(exports, "getRegionsFromRange", { enumerable: true, get: function () { return getRegionsFromRange_1.default; } });
11655
11662
  var getSelectedBlockElementsInRegion_1 = __webpack_require__(/*! ./region/getSelectedBlockElementsInRegion */ "./packages/roosterjs-editor-dom/lib/region/getSelectedBlockElementsInRegion.ts");
@@ -16584,11 +16591,10 @@ var TableFormatMetadata = (0, definitionCreators_1.createObjectDefinition)({
16584
16591
  hasBandedRows: BooleanDefinition,
16585
16592
  bgColorEven: NullStringDefinition,
16586
16593
  bgColorOdd: NullStringDefinition,
16587
- tableBorderFormat: (0, definitionCreators_1.createNumberDefinition)(false /** isOptional */, undefined /* value */, 0 /* first table border format */, 7 /* last table border format */),
16588
- keepCellShade: BooleanDefinition,
16594
+ tableBorderFormat: (0, definitionCreators_1.createNumberDefinition)(false /** isOptional */, undefined /* value */, 0 /* DEFAULT */, 8 /* CLEAR */),
16595
+ keepCellShade: (0, definitionCreators_1.createBooleanDefinition)(true /** isOptional */),
16589
16596
  }, false /* isOptional */, true /** allowNull */);
16590
16597
  /**
16591
- * @internal
16592
16598
  * Get the format info of a table
16593
16599
  * If the table does not have a info saved, it will be retrieved from the css styles
16594
16600
  * @param table The table that has the info
@@ -16650,11 +16656,11 @@ function getBrowserInfo(userAgent, appVersion, vendor) {
16650
16656
  // The default regex on the website doesn't consider tablet.
16651
16657
  // To support tablet, add |android|ipad|playbook|silk to the first regex according to the info in /about page
16652
16658
  (function (userAgentOrVendor) {
16653
- if (/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino|android|ipad|playbook|silk/i.test(userAgentOrVendor)
16654
- || /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(userAgentOrVendor.substr(0, 4))) {
16659
+ if (/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino|android|ipad|playbook|silk/i.test(userAgentOrVendor) ||
16660
+ /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(userAgentOrVendor.substr(0, 4))) {
16655
16661
  isMobileOrTablet = true;
16656
16662
  }
16657
- })(userAgent || vendor || "");
16663
+ })(userAgent || vendor || '');
16658
16664
  if (!isIE) {
16659
16665
  isChrome = userAgent.indexOf('Chrome') != -1;
16660
16666
  isFirefox = userAgent.indexOf('Firefox') != -1;
@@ -16691,7 +16697,7 @@ exports.getBrowserInfo = getBrowserInfo;
16691
16697
  /**
16692
16698
  * Browser object contains browser and operating system information of current environment
16693
16699
  */
16694
- exports.Browser = window
16700
+ exports.Browser = typeof window !== 'undefined' && window
16695
16701
  ? getBrowserInfo(window.navigator.userAgent, window.navigator.appVersion, window.navigator.vendor)
16696
16702
  : {};
16697
16703
 
@@ -18672,23 +18678,21 @@ var roosterjs_editor_dom_1 = __webpack_require__(/*! roosterjs-editor-dom */ "./
18672
18678
  /**
18673
18679
  * Generate event names and getXY function based on different platforms to be compatible with desktop and mobile browsers
18674
18680
  */
18675
- var MOUSE_EVENT_INFO = (function () {
18676
- if (roosterjs_editor_dom_1.Browser.isMobileOrTablet) {
18677
- return {
18678
- MOUSEDOWN: 'touchstart',
18679
- MOUSEMOVE: 'touchmove',
18680
- MOUSEUP: 'touchend',
18681
- getPageXY: getTouchEventPageXY,
18682
- };
18683
- }
18684
- else {
18685
- return {
18686
- MOUSEDOWN: 'mousedown',
18687
- MOUSEMOVE: 'mousemove',
18688
- MOUSEUP: 'mouseup',
18689
- getPageXY: getMouseEventPageXY,
18690
- };
18691
- }
18681
+ var MOUSE_EVENT_INFO_DESKTOP = (function () {
18682
+ return {
18683
+ MOUSEDOWN: 'mousedown',
18684
+ MOUSEMOVE: 'mousemove',
18685
+ MOUSEUP: 'mouseup',
18686
+ getPageXY: getMouseEventPageXY,
18687
+ };
18688
+ })();
18689
+ var MOUSE_EVENT_INFO_MOBILE = (function () {
18690
+ return {
18691
+ MOUSEDOWN: 'touchstart',
18692
+ MOUSEMOVE: 'touchmove',
18693
+ MOUSEUP: 'touchend',
18694
+ getPageXY: getTouchEventPageXY,
18695
+ };
18692
18696
  })();
18693
18697
  function getMouseEventPageXY(e) {
18694
18698
  return [e.pageX, e.pageY];
@@ -18716,8 +18720,10 @@ var DragAndDropHelper = /** @class */ (function () {
18716
18720
  * so that the handler object knows which element it is triggered from.
18717
18721
  * @param onSubmit A callback that will be invoked when event handler in handler object returns true
18718
18722
  * @param handler The event handler object, see DragAndDropHandler interface for more information
18723
+ * @param zoomScale The zoom scale of the editor
18724
+ * @param forceMobile A boolean to force the use of touch controls for the helper
18719
18725
  */
18720
- function DragAndDropHelper(trigger, context, onSubmit, handler, zoomScale) {
18726
+ function DragAndDropHelper(trigger, context, onSubmit, handler, zoomScale, forceMobile) {
18721
18727
  var _this = this;
18722
18728
  this.trigger = trigger;
18723
18729
  this.context = context;
@@ -18730,13 +18736,13 @@ var DragAndDropHelper = /** @class */ (function () {
18730
18736
  e.preventDefault();
18731
18737
  e.stopPropagation();
18732
18738
  _this.addDocumentEvents();
18733
- _a = MOUSE_EVENT_INFO.getPageXY(e), _this.initX = _a[0], _this.initY = _a[1];
18739
+ _a = _this.dndMouse.getPageXY(e), _this.initX = _a[0], _this.initY = _a[1];
18734
18740
  _this.initValue = (_c = (_b = _this.handler).onDragStart) === null || _c === void 0 ? void 0 : _c.call(_b, _this.context, e);
18735
18741
  };
18736
18742
  this.onMouseMove = function (e) {
18737
18743
  var _a, _b, _c;
18738
18744
  e.preventDefault();
18739
- var _d = MOUSE_EVENT_INFO.getPageXY(e), pageX = _d[0], pageY = _d[1];
18745
+ var _d = _this.dndMouse.getPageXY(e), pageX = _d[0], pageY = _d[1];
18740
18746
  var deltaX = (pageX - _this.initX) / _this.zoomScale;
18741
18747
  var deltaY = (pageY - _this.initY) / _this.zoomScale;
18742
18748
  if ((_b = (_a = _this.handler).onDragging) === null || _b === void 0 ? void 0 : _b.call(_a, _this.context, e, _this.initValue, deltaX, deltaY)) {
@@ -18751,24 +18757,28 @@ var DragAndDropHelper = /** @class */ (function () {
18751
18757
  (_c = _this.onSubmit) === null || _c === void 0 ? void 0 : _c.call(_this, _this.context, _this.trigger);
18752
18758
  }
18753
18759
  };
18754
- trigger.addEventListener(MOUSE_EVENT_INFO.MOUSEDOWN, this.onMouseDown);
18760
+ this.dndMouse =
18761
+ forceMobile || roosterjs_editor_dom_1.Browser.isMobileOrTablet
18762
+ ? MOUSE_EVENT_INFO_MOBILE
18763
+ : MOUSE_EVENT_INFO_DESKTOP;
18764
+ trigger.addEventListener(this.dndMouse.MOUSEDOWN, this.onMouseDown);
18755
18765
  }
18756
18766
  /**
18757
18767
  * Dispose this object, remove all event listeners that has been attached
18758
18768
  */
18759
18769
  DragAndDropHelper.prototype.dispose = function () {
18760
- this.trigger.removeEventListener(MOUSE_EVENT_INFO.MOUSEDOWN, this.onMouseDown);
18770
+ this.trigger.removeEventListener(this.dndMouse.MOUSEDOWN, this.onMouseDown);
18761
18771
  this.removeDocumentEvents();
18762
18772
  };
18763
18773
  DragAndDropHelper.prototype.addDocumentEvents = function () {
18764
18774
  var doc = this.trigger.ownerDocument;
18765
- doc.addEventListener(MOUSE_EVENT_INFO.MOUSEMOVE, this.onMouseMove, true /*useCapture*/);
18766
- doc.addEventListener(MOUSE_EVENT_INFO.MOUSEUP, this.onMouseUp, true /*useCapture*/);
18775
+ doc.addEventListener(this.dndMouse.MOUSEMOVE, this.onMouseMove, true /*useCapture*/);
18776
+ doc.addEventListener(this.dndMouse.MOUSEUP, this.onMouseUp, true /*useCapture*/);
18767
18777
  };
18768
18778
  DragAndDropHelper.prototype.removeDocumentEvents = function () {
18769
18779
  var doc = this.trigger.ownerDocument;
18770
- doc.removeEventListener(MOUSE_EVENT_INFO.MOUSEMOVE, this.onMouseMove, true /*useCapture*/);
18771
- doc.removeEventListener(MOUSE_EVENT_INFO.MOUSEUP, this.onMouseUp, true /*useCapture*/);
18780
+ doc.removeEventListener(this.dndMouse.MOUSEMOVE, this.onMouseMove, true /*useCapture*/);
18781
+ doc.removeEventListener(this.dndMouse.MOUSEUP, this.onMouseUp, true /*useCapture*/);
18772
18782
  };
18773
18783
  return DragAndDropHelper;
18774
18784
  }());
@@ -21138,7 +21148,7 @@ var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
21138
21148
  }
21139
21149
  return to.concat(ar || Array.prototype.slice.call(from));
21140
21150
  };
21141
- var _a, _b;
21151
+ var _a;
21142
21152
  Object.defineProperty(exports, "__esModule", { value: true });
21143
21153
  var applyChange_1 = __webpack_require__(/*! ./editInfoUtils/applyChange */ "./packages/roosterjs-editor-plugins/lib/plugins/ImageEdit/editInfoUtils/applyChange.ts");
21144
21154
  var canRegenerateImage_1 = __webpack_require__(/*! ./api/canRegenerateImage */ "./packages/roosterjs-editor-plugins/lib/plugins/ImageEdit/api/canRegenerateImage.ts");
@@ -21156,14 +21166,6 @@ var ALT_KEYCODE = 18;
21156
21166
  var DIRECTIONS = 8;
21157
21167
  var DirectionRad = (Math.PI * 2) / DIRECTIONS;
21158
21168
  var DirectionOrder = ['nw', 'n', 'ne', 'e', 'se', 's', 'sw', 'w'];
21159
- /**
21160
- * Map the experimental features to image edit operations to help determine which operation is allowed
21161
- */
21162
- var FeatureToOperationMap = (_a = {},
21163
- _a["SingleDirectionResize" /* SingleDirectionResize */] = 2 /* SideResize */,
21164
- _a["ImageRotate" /* ImageRotate */] = 4 /* Rotate */,
21165
- _a["ImageCrop" /* ImageCrop */] = 8 /* Crop */,
21166
- _a);
21167
21169
  /**
21168
21170
  * Default image edit options
21169
21171
  */
@@ -21175,17 +21177,20 @@ var DefaultOptions = {
21175
21177
  minRotateDeg: 5,
21176
21178
  imageSelector: 'img',
21177
21179
  rotateIconHTML: null,
21180
+ disableCrop: false,
21181
+ disableRotate: false,
21182
+ disableSideResize: false,
21178
21183
  };
21179
21184
  /**
21180
21185
  * Map the image edit operation to a function that returns editing elements HTML to help
21181
21186
  * build image editing UI
21182
21187
  */
21183
- var ImageEditHTMLMap = (_b = {},
21184
- _b[1 /* CornerResize */] = Resizer_1.getCornerResizeHTML,
21185
- _b[2 /* SideResize */] = Resizer_1.getSideResizeHTML,
21186
- _b[4 /* Rotate */] = Rotator_1.getRotateHTML,
21187
- _b[8 /* Crop */] = Cropper_1.getCropHTML,
21188
- _b);
21188
+ var ImageEditHTMLMap = (_a = {},
21189
+ _a[1 /* CornerResize */] = Resizer_1.getCornerResizeHTML,
21190
+ _a[2 /* SideResize */] = Resizer_1.getSideResizeHTML,
21191
+ _a[4 /* Rotate */] = Rotator_1.getRotateHTML,
21192
+ _a[8 /* Crop */] = Cropper_1.getCropHTML,
21193
+ _a);
21189
21194
  /**
21190
21195
  * Image edit entity name
21191
21196
  */
@@ -21213,8 +21218,6 @@ var ImageEdit = /** @class */ (function () {
21213
21218
  function ImageEdit(options, onShowResizeHandle) {
21214
21219
  var _this = this;
21215
21220
  this.onShowResizeHandle = onShowResizeHandle;
21216
- // Allowed editing operations
21217
- this.allowedOperations = 1 /* CornerResize */;
21218
21221
  /**
21219
21222
  * quit editing mode when editor lose focus
21220
21223
  */
@@ -21298,6 +21301,11 @@ var ImageEdit = /** @class */ (function () {
21298
21301
  }
21299
21302
  };
21300
21303
  this.options = __assign(__assign({}, DefaultOptions), (options || {}));
21304
+ this.allowedOperations =
21305
+ 1 /* CornerResize */ |
21306
+ (this.options.disableCrop ? 0 : 8 /* Crop */) |
21307
+ (this.options.disableRotate ? 0 : 4 /* Rotate */) |
21308
+ (this.options.disableSideResize ? 0 : 2 /* SideResize */);
21301
21309
  }
21302
21310
  /**
21303
21311
  * Get a friendly name of this plugin
@@ -21310,15 +21318,8 @@ var ImageEdit = /** @class */ (function () {
21310
21318
  * @param editor Editor instance
21311
21319
  */
21312
21320
  ImageEdit.prototype.initialize = function (editor) {
21313
- var _this = this;
21314
21321
  this.editor = editor;
21315
21322
  this.disposer = editor.addDomEventHandler('blur', this.onBlur);
21316
- // Read current enabled features from editor to determine which editing operations are allowed
21317
- (0, roosterjs_editor_dom_1.getObjectKeys)(FeatureToOperationMap).forEach(function (key) {
21318
- _this.allowedOperations |= _this.editor.isFeatureEnabled(key)
21319
- ? FeatureToOperationMap[key]
21320
- : 0;
21321
- });
21322
21323
  };
21323
21324
  /**
21324
21325
  * Dispose this plugin
@@ -21391,6 +21392,14 @@ var ImageEdit = /** @class */ (function () {
21391
21392
  break;
21392
21393
  }
21393
21394
  };
21395
+ /**
21396
+ * Check if the given image edit operation is allowed by this pluign
21397
+ * @param operation The image edit operation to check
21398
+ * @returns True means it is allowed, otherwise false
21399
+ */
21400
+ ImageEdit.prototype.isOperationAllowed = function (operation) {
21401
+ return !!(this.allowedOperations & operation);
21402
+ };
21394
21403
  ImageEdit.prototype.setEditingImage = function (image, operationOrSelect) {
21395
21404
  var _this = this;
21396
21405
  var operation = typeof operationOrSelect === 'number' ? operationOrSelect : 0 /* None */;
@@ -21443,7 +21452,9 @@ var ImageEdit = /** @class */ (function () {
21443
21452
  wrapper.style.position = 'relative';
21444
21453
  wrapper.style.maxWidth = '100%';
21445
21454
  // keep the same vertical align
21446
- var originalVerticalAlign = this.image.ownerDocument.defaultView.getComputedStyle(this.image).getPropertyValue('vertical-align');
21455
+ var originalVerticalAlign = this.image.ownerDocument.defaultView
21456
+ .getComputedStyle(this.image)
21457
+ .getPropertyValue('vertical-align');
21447
21458
  if (originalVerticalAlign) {
21448
21459
  wrapper.style.verticalAlign = originalVerticalAlign;
21449
21460
  }
@@ -23105,6 +23116,12 @@ var roosterjs_editor_dom_1 = __webpack_require__(/*! roosterjs-editor-dom */ "./
23105
23116
  var WORD_ONLINE_IDENTIFYING_SELECTOR = 'div.ListContainerWrapper>ul[class^="BulletListStyle"],div.ListContainerWrapper>ol[class^="NumberListStyle"],span.WACImageContainer > img';
23106
23117
  var LIST_CONTAINER_ELEMENT_CLASS_NAME = 'ListContainerWrapper';
23107
23118
  var IMAGE_CONTAINER_ELEMENT_CLASS_NAME = 'WACImageContainer';
23119
+ //When the list style is a symbol and the value is not in the clipboard, WordOnline
23120
+ var VALID_LIST_STYLE_CHAR_CODES = [
23121
+ '111',
23122
+ '9643',
23123
+ '9830', //'♦'
23124
+ ];
23108
23125
  /**
23109
23126
  * @internal
23110
23127
  */
@@ -23186,7 +23203,7 @@ function convertPastedContentFromWordOnline(fragment) {
23186
23203
  var listType = getContainerListType(listItemContainer); // list type that is contained by iterator.
23187
23204
  // Initialize processed element with proper listType if this is the first element
23188
23205
  if (!convertedListElement) {
23189
- convertedListElement = doc.createElement(listType);
23206
+ convertedListElement = createNewList(listItemContainer, doc, listType);
23190
23207
  }
23191
23208
  // Get all list items(<li>) in the current iterator element.
23192
23209
  var currentListItems = (0, roosterjs_editor_dom_1.toArray)(listItemContainer.querySelectorAll('li'));
@@ -23200,7 +23217,7 @@ function convertPastedContentFromWordOnline(fragment) {
23200
23217
  // and keep the processing going.
23201
23218
  if ((0, roosterjs_editor_dom_1.getTagOfNode)(convertedListElement) != listType && itemLevel == 1) {
23202
23219
  insertConvertedListToDoc(convertedListElement, fragment, itemBlock);
23203
- convertedListElement = doc.createElement(listType);
23220
+ convertedListElement = createNewList(listItemContainer, doc, listType);
23204
23221
  }
23205
23222
  insertListItem(convertedListElement, item, listType, doc);
23206
23223
  });
@@ -23237,6 +23254,15 @@ function convertPastedContentFromWordOnline(fragment) {
23237
23254
  });
23238
23255
  }
23239
23256
  exports.default = convertPastedContentFromWordOnline;
23257
+ function createNewList(listItemContainer, doc, tag) {
23258
+ var _a;
23259
+ var newList = doc.createElement(tag);
23260
+ var startAttribute = (_a = listItemContainer.firstElementChild) === null || _a === void 0 ? void 0 : _a.getAttribute('start');
23261
+ if (startAttribute) {
23262
+ newList.setAttribute('start', startAttribute);
23263
+ }
23264
+ return newList;
23265
+ }
23240
23266
  /**
23241
23267
  * The node processing is based on the premise of only ol/ul is in ListContainerWrapper class
23242
23268
  * However the html might be malformed, this function is to split all the other elements out of ListContainerWrapper
@@ -23319,11 +23345,19 @@ function getContainerListType(listItemContainer) {
23319
23345
  * @param listType Type of list(ul/ol)
23320
23346
  */
23321
23347
  function insertListItem(listRootElement, itemToInsert, listType, doc) {
23348
+ var _a;
23322
23349
  if (!listType) {
23323
23350
  return;
23324
23351
  }
23325
23352
  // Get item level from 'data-aria-level' attribute
23326
- var itemLevel = parseInt(itemToInsert.getAttribute('data-aria-level'));
23353
+ var itemLevel = parseInt((_a = itemToInsert.getAttribute('data-aria-level')) !== null && _a !== void 0 ? _a : '');
23354
+ // Try to reuse the List Marker
23355
+ var style = itemToInsert.getAttribute('data-leveltext');
23356
+ if (listType == 'UL' &&
23357
+ style &&
23358
+ VALID_LIST_STYLE_CHAR_CODES.indexOf(style.charCodeAt(0).toString()) > -1) {
23359
+ itemToInsert.style.listStyleType = "\"" + style + " \"";
23360
+ }
23327
23361
  var curListLevel = listRootElement; // Level iterator to find the correct place for the current element.
23328
23362
  // if the itemLevel is 1 it means the level iterator is at the correct place.
23329
23363
  while (itemLevel > 1) {
@@ -27492,15 +27526,15 @@ var CompatibleExperimentalFeatures;
27492
27526
  */
27493
27527
  CompatibleExperimentalFeatures["MergePastedLine"] = "MergePastedLine";
27494
27528
  /**
27495
- * Resize an image horizontally or vertically
27529
+ * @deprecated This feature is always enabled
27496
27530
  */
27497
27531
  CompatibleExperimentalFeatures["SingleDirectionResize"] = "SingleDirectionResize";
27498
27532
  /**
27499
- * Try retrieve link preview information when paste
27533
+ * @deprecated This feature is always enabled
27500
27534
  */
27501
27535
  CompatibleExperimentalFeatures["PasteWithLinkPreview"] = "PasteWithLinkPreview";
27502
27536
  /**
27503
- * Rotate an inline image (requires ImageEdit plugin)
27537
+ * @deprecated This feature is always enabled
27504
27538
  */
27505
27539
  CompatibleExperimentalFeatures["ImageRotate"] = "ImageRotate";
27506
27540
  /**
@@ -27547,6 +27581,11 @@ var CompatibleExperimentalFeatures;
27547
27581
  * when selection is collapsed. Instead, we will hold the pending format in memory and only apply it when type something
27548
27582
  */
27549
27583
  CompatibleExperimentalFeatures["PendingStyleBasedFormat"] = "PendingStyleBasedFormat";
27584
+ /**
27585
+ * Normalize list to make sure it can be displayed correctly in other client
27586
+ * e.g. We will move list items with "display: block" into previous list item and change tag to be DIV
27587
+ */
27588
+ CompatibleExperimentalFeatures["NormalizeList"] = "NormalizeList";
27550
27589
  })(CompatibleExperimentalFeatures = exports.CompatibleExperimentalFeatures || (exports.CompatibleExperimentalFeatures = {}));
27551
27590
 
27552
27591