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.
@@ -2809,6 +2809,11 @@ function getElementBasedFormatState(editor, event) {
2809
2809
  multiline = endingBlock && startingBlock ? !endingBlock.equals(startingBlock) : false;
2810
2810
  }
2811
2811
  var headerTag = (0, roosterjs_editor_dom_1.getTagOfNode)(editor.getElementAtCursor('H1,H2,H3,H4,H5,H6', null /*startFrom*/, event));
2812
+ var table = editor.queryElements('table', 1 /* OnSelection */)[0];
2813
+ var tableFormat = table ? (0, roosterjs_editor_dom_1.getTableFormatInfo)(table) : undefined;
2814
+ var hasHeader = (table === null || table === void 0 ? void 0 : table.rows[0])
2815
+ ? (0, roosterjs_editor_dom_1.toArray)(table.rows[0].cells).every(function (cell) { return (0, roosterjs_editor_dom_1.getTagOfNode)(cell) == 'TH'; })
2816
+ : undefined;
2812
2817
  return {
2813
2818
  isBullet: listTag == 'UL',
2814
2819
  isNumbering: listTag == 'OL',
@@ -2817,7 +2822,9 @@ function getElementBasedFormatState(editor, event) {
2817
2822
  canUnlink: !!editor.queryElements('a[href]', 1 /* OnSelection */)[0],
2818
2823
  canAddImageAltText: !!editor.queryElements('img', 1 /* OnSelection */)[0],
2819
2824
  isBlockQuote: !!editor.queryElements('blockquote', 1 /* OnSelection */)[0],
2820
- isInTable: !!editor.queryElements('table', 1 /* OnSelection */)[0],
2825
+ isInTable: !!table,
2826
+ tableFormat: tableFormat,
2827
+ tableHasHeader: hasHeader,
2821
2828
  };
2822
2829
  }
2823
2830
  exports.getElementBasedFormatState = getElementBasedFormatState;
@@ -5827,7 +5834,6 @@ function buildCss(table, coordinates, contentDivSelector) {
5827
5834
  });
5828
5835
  (_a = vTable.cells) === null || _a === void 0 ? void 0 : _a.forEach(function (row, rowIndex) {
5829
5836
  var tdCount = 0;
5830
- var thCount = 0;
5831
5837
  firstSelected = null;
5832
5838
  lastSelected = null;
5833
5839
  //Get current TBODY/THEAD/TFOOT
@@ -5840,12 +5846,7 @@ function buildCss(table, coordinates, contentDivSelector) {
5840
5846
  var cell = row[cellIndex].td;
5841
5847
  if (cell) {
5842
5848
  var tag = (0, roosterjs_editor_dom_1.getTagOfNode)(cell);
5843
- if (tag == 'TD') {
5844
- tdCount++;
5845
- }
5846
- if (tag == 'TH') {
5847
- thCount++;
5848
- }
5849
+ tdCount++;
5849
5850
  if (rowIndex >= tr1 && rowIndex <= tr2 && cellIndex >= td1 && cellIndex <= td2) {
5850
5851
  if (isFirst) {
5851
5852
  isFirst = false;
@@ -5854,7 +5855,7 @@ function buildCss(table, coordinates, contentDivSelector) {
5854
5855
  css += ',';
5855
5856
  }
5856
5857
  removeImportant(cell);
5857
- var selector = generateCssFromCell(contentDivSelector, table.id, middleElSelector, currentRow, tag, tag == 'TD' ? tdCount : thCount);
5858
+ var selector = generateCssFromCell(contentDivSelector, table.id, middleElSelector, currentRow, tag, tdCount);
5858
5859
  css += selector;
5859
5860
  firstSelected = firstSelected || table.querySelector(selector);
5860
5861
  lastSelected = table.querySelector(selector);
@@ -6319,10 +6320,9 @@ var CopyPastePlugin = /** @class */ (function () {
6319
6320
  function CopyPastePlugin(options) {
6320
6321
  var _this = this;
6321
6322
  this.onPaste = function (event) {
6322
- var _a, _b;
6323
+ var _a;
6323
6324
  var range;
6324
6325
  (0, roosterjs_editor_dom_1.extractClipboardEvent)(event, function (clipboardData) { var _a; return (_a = _this.editor) === null || _a === void 0 ? void 0 : _a.paste(clipboardData); }, {
6325
- allowLinkPreview: (_a = _this.editor) === null || _a === void 0 ? void 0 : _a.isFeatureEnabled("PasteWithLinkPreview" /* PasteWithLinkPreview */),
6326
6326
  allowedCustomPasteType: _this.state.allowedCustomPasteType,
6327
6327
  getTempDiv: function () {
6328
6328
  var _a;
@@ -6332,7 +6332,7 @@ var CopyPastePlugin = /** @class */ (function () {
6332
6332
  removeTempDiv: function (div) {
6333
6333
  _this.cleanUpAndRestoreSelection(div, range, false /* isCopy */);
6334
6334
  },
6335
- }, (_b = _this.editor) === null || _b === void 0 ? void 0 : _b.getSelectionRange());
6335
+ }, (_a = _this.editor) === null || _a === void 0 ? void 0 : _a.getSelectionRange());
6336
6336
  };
6337
6337
  this.state = {
6338
6338
  allowedCustomPasteType: options.allowedCustomPasteType || [],
@@ -6377,16 +6377,19 @@ var CopyPastePlugin = /** @class */ (function () {
6377
6377
  if (selection && !selection.areAllCollapsed) {
6378
6378
  var html = this.editor.getContent(2 /* RawHTMLWithSelection */);
6379
6379
  var tempDiv_1 = this.getTempDiv(true /*forceInLightMode*/);
6380
- var newRange = (0, roosterjs_editor_dom_1.setHtmlWithSelectionPath)(tempDiv_1, html, this.editor.getTrustedHTMLHandler());
6381
- if (newRange) {
6382
- (0, roosterjs_editor_dom_1.addRangeToSelection)(newRange);
6383
- }
6380
+ var metadata = (0, roosterjs_editor_dom_1.setHtmlWithMetadata)(tempDiv_1, html, this.editor.getTrustedHTMLHandler());
6381
+ var newRange = (metadata === null || metadata === void 0 ? void 0 : metadata.type) === 0 /* Normal */
6382
+ ? (0, roosterjs_editor_dom_1.createRange)(tempDiv_1, metadata.start, metadata.end)
6383
+ : null;
6384
6384
  this.editor.triggerPluginEvent(9 /* BeforeCutCopy */, {
6385
6385
  clonedRoot: tempDiv_1,
6386
6386
  range: newRange,
6387
6387
  rawEvent: event,
6388
6388
  isCut: isCut,
6389
6389
  });
6390
+ if (newRange) {
6391
+ (0, roosterjs_editor_dom_1.addRangeToSelection)(newRange);
6392
+ }
6390
6393
  this.editor.runAsync(function (editor) {
6391
6394
  _this.cleanUpAndRestoreSelection(tempDiv_1, selection, !isCut /* isCopy */);
6392
6395
  if (isCut) {
@@ -7405,6 +7408,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
7405
7408
  var roosterjs_editor_dom_1 = __webpack_require__(/*! roosterjs-editor-dom */ "./packages/roosterjs-editor-dom/lib/index.ts");
7406
7409
  /**
7407
7410
  * @internal
7411
+ * TODO: Rename this plugin since it is not only for table now
7412
+ *
7408
7413
  * NormalizeTable plugin makes sure each table in editor has TBODY/THEAD/TFOOT tag around TR tags
7409
7414
  *
7410
7415
  * When we retrieve HTML content using innerHTML, browser will always add TBODY around TR nodes if there is not.
@@ -7461,6 +7466,11 @@ var NormalizeTablePlugin = /** @class */ (function () {
7461
7466
  this.normalizeTableFromEvent(event.rawEvent);
7462
7467
  }
7463
7468
  break;
7469
+ case 8 /* ExtractContentWithDom */:
7470
+ if (this.editor.isFeatureEnabled("NormalizeList" /* NormalizeList */)) {
7471
+ normalizeListsForExport(event.clonedRoot);
7472
+ }
7473
+ break;
7464
7474
  }
7465
7475
  };
7466
7476
  NormalizeTablePlugin.prototype.normalizeTableFromEvent = function (event) {
@@ -7532,6 +7542,15 @@ function normalizeTables(tables) {
7532
7542
  });
7533
7543
  return isDOMChanged;
7534
7544
  }
7545
+ function normalizeListsForExport(root) {
7546
+ (0, roosterjs_editor_dom_1.toArray)(root.querySelectorAll('li')).forEach(function (li) {
7547
+ var prevElement = li.previousSibling;
7548
+ if (li.style.display == 'block' && (0, roosterjs_editor_dom_1.safeInstanceOf)(prevElement, 'HTMLLIElement')) {
7549
+ delete li.style.display;
7550
+ prevElement.appendChild((0, roosterjs_editor_dom_1.changeElementTag)(li, 'div'));
7551
+ }
7552
+ });
7553
+ }
7535
7554
 
7536
7555
 
7537
7556
  /***/ }),
@@ -9200,17 +9219,6 @@ function removeContents(range) {
9200
9219
 
9201
9220
  "use strict";
9202
9221
 
9203
- var __assign = (this && this.__assign) || function () {
9204
- __assign = Object.assign || function(t) {
9205
- for (var s, i = 1, n = arguments.length; i < n; i++) {
9206
- s = arguments[i];
9207
- for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
9208
- t[p] = s[p];
9209
- }
9210
- return t;
9211
- };
9212
- return __assign.apply(this, arguments);
9213
- };
9214
9222
  var _a;
9215
9223
  Object.defineProperty(exports, "__esModule", { value: true });
9216
9224
  var readFile_1 = __webpack_require__(/*! ../utils/readFile */ "./packages/roosterjs-editor-dom/lib/utils/readFile.ts");
@@ -9233,6 +9241,7 @@ var ContentHandlers = (_a = {},
9233
9241
  },
9234
9242
  _a["text/plain" /* PlainText */] = function (data, value) { return (data.text = value); },
9235
9243
  _a[OTHER_TEXT_TYPE] = function (data, value, type) { return !!type && (data.customValues[type] = value); },
9244
+ _a["text/" /* Text */ + EDGE_LINK_PREVIEW] = tryParseLinkPreview,
9236
9245
  _a);
9237
9246
  /**
9238
9247
  * Extract clipboard items to be a ClipboardData object for IE
@@ -9255,10 +9264,6 @@ function extractClipboardItems(items, options) {
9255
9264
  rawHtml: null,
9256
9265
  customValues: {},
9257
9266
  };
9258
- var contentHandlers = __assign({}, ContentHandlers);
9259
- if (options === null || options === void 0 ? void 0 : options.allowLinkPreview) {
9260
- contentHandlers["text/" /* Text */ + EDGE_LINK_PREVIEW] = tryParseLinkPreview;
9261
- }
9262
9267
  return Promise.all((items || []).map(function (item) {
9263
9268
  var type = item.type;
9264
9269
  if (type.indexOf("image/" /* Image */) == 0 && !data.image && item.kind == 'file') {
@@ -9288,7 +9293,7 @@ function extractClipboardItems(items, options) {
9288
9293
  }
9289
9294
  else {
9290
9295
  var customType_1 = getAllowedCustomType(type, options === null || options === void 0 ? void 0 : options.allowedCustomPasteType);
9291
- var handler_1 = contentHandlers[type] || (customType_1 ? contentHandlers[OTHER_TEXT_TYPE] : null);
9296
+ var handler_1 = ContentHandlers[type] || (customType_1 ? ContentHandlers[OTHER_TEXT_TYPE] : null);
9292
9297
  return new Promise(function (resolve) {
9293
9298
  return handler_1
9294
9299
  ? item.getAsString(function (value) {
@@ -11542,8 +11547,8 @@ exports.default = getPredefinedCssForElement;
11542
11547
 
11543
11548
  Object.defineProperty(exports, "__esModule", { value: true });
11544
11549
  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;
11545
- 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;
11546
- exports.toArray = exports.getObjectKeys = exports.arrayPush = exports.removeMetadata = exports.setMetadata = exports.getMetadata = exports.createObjectDefinition = exports.createArrayDefinition = exports.createStringDefinition = void 0;
11550
+ 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;
11551
+ exports.toArray = exports.getObjectKeys = exports.arrayPush = exports.removeMetadata = exports.setMetadata = exports.getMetadata = exports.createObjectDefinition = exports.createArrayDefinition = exports.createStringDefinition = exports.createBooleanDefinition = void 0;
11547
11552
  var getBlockElementAtNode_1 = __webpack_require__(/*! ./blockElements/getBlockElementAtNode */ "./packages/roosterjs-editor-dom/lib/blockElements/getBlockElementAtNode.ts");
11548
11553
  Object.defineProperty(exports, "getBlockElementAtNode", { enumerable: true, get: function () { return getBlockElementAtNode_1.default; } });
11549
11554
  var getFirstLastBlockElement_1 = __webpack_require__(/*! ./blockElements/getFirstLastBlockElement */ "./packages/roosterjs-editor-dom/lib/blockElements/getFirstLastBlockElement.ts");
@@ -11649,6 +11654,8 @@ var VListChain_1 = __webpack_require__(/*! ./list/VListChain */ "./packages/roos
11649
11654
  Object.defineProperty(exports, "VListChain", { enumerable: true, get: function () { return VListChain_1.default; } });
11650
11655
  var setListItemStyle_1 = __webpack_require__(/*! ./list/setListItemStyle */ "./packages/roosterjs-editor-dom/lib/list/setListItemStyle.ts");
11651
11656
  Object.defineProperty(exports, "setListItemStyle", { enumerable: true, get: function () { return setListItemStyle_1.default; } });
11657
+ var tableFormatInfo_1 = __webpack_require__(/*! ./table/tableFormatInfo */ "./packages/roosterjs-editor-dom/lib/table/tableFormatInfo.ts");
11658
+ Object.defineProperty(exports, "getTableFormatInfo", { enumerable: true, get: function () { return tableFormatInfo_1.getTableFormatInfo; } });
11652
11659
  var getRegionsFromRange_1 = __webpack_require__(/*! ./region/getRegionsFromRange */ "./packages/roosterjs-editor-dom/lib/region/getRegionsFromRange.ts");
11653
11660
  Object.defineProperty(exports, "getRegionsFromRange", { enumerable: true, get: function () { return getRegionsFromRange_1.default; } });
11654
11661
  var getSelectedBlockElementsInRegion_1 = __webpack_require__(/*! ./region/getSelectedBlockElementsInRegion */ "./packages/roosterjs-editor-dom/lib/region/getSelectedBlockElementsInRegion.ts");
@@ -16583,11 +16590,10 @@ var TableFormatMetadata = (0, definitionCreators_1.createObjectDefinition)({
16583
16590
  hasBandedRows: BooleanDefinition,
16584
16591
  bgColorEven: NullStringDefinition,
16585
16592
  bgColorOdd: NullStringDefinition,
16586
- tableBorderFormat: (0, definitionCreators_1.createNumberDefinition)(false /** isOptional */, undefined /* value */, 0 /* first table border format */, 7 /* last table border format */),
16587
- keepCellShade: BooleanDefinition,
16593
+ tableBorderFormat: (0, definitionCreators_1.createNumberDefinition)(false /** isOptional */, undefined /* value */, 0 /* DEFAULT */, 8 /* CLEAR */),
16594
+ keepCellShade: (0, definitionCreators_1.createBooleanDefinition)(true /** isOptional */),
16588
16595
  }, false /* isOptional */, true /** allowNull */);
16589
16596
  /**
16590
- * @internal
16591
16597
  * Get the format info of a table
16592
16598
  * If the table does not have a info saved, it will be retrieved from the css styles
16593
16599
  * @param table The table that has the info
@@ -16649,11 +16655,11 @@ function getBrowserInfo(userAgent, appVersion, vendor) {
16649
16655
  // The default regex on the website doesn't consider tablet.
16650
16656
  // To support tablet, add |android|ipad|playbook|silk to the first regex according to the info in /about page
16651
16657
  (function (userAgentOrVendor) {
16652
- 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)
16653
- || /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))) {
16658
+ 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) ||
16659
+ /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))) {
16654
16660
  isMobileOrTablet = true;
16655
16661
  }
16656
- })(userAgent || vendor || "");
16662
+ })(userAgent || vendor || '');
16657
16663
  if (!isIE) {
16658
16664
  isChrome = userAgent.indexOf('Chrome') != -1;
16659
16665
  isFirefox = userAgent.indexOf('Firefox') != -1;
@@ -16690,7 +16696,7 @@ exports.getBrowserInfo = getBrowserInfo;
16690
16696
  /**
16691
16697
  * Browser object contains browser and operating system information of current environment
16692
16698
  */
16693
- exports.Browser = window
16699
+ exports.Browser = typeof window !== 'undefined' && window
16694
16700
  ? getBrowserInfo(window.navigator.userAgent, window.navigator.appVersion, window.navigator.vendor)
16695
16701
  : {};
16696
16702
 
@@ -18671,23 +18677,21 @@ var roosterjs_editor_dom_1 = __webpack_require__(/*! roosterjs-editor-dom */ "./
18671
18677
  /**
18672
18678
  * Generate event names and getXY function based on different platforms to be compatible with desktop and mobile browsers
18673
18679
  */
18674
- var MOUSE_EVENT_INFO = (function () {
18675
- if (roosterjs_editor_dom_1.Browser.isMobileOrTablet) {
18676
- return {
18677
- MOUSEDOWN: 'touchstart',
18678
- MOUSEMOVE: 'touchmove',
18679
- MOUSEUP: 'touchend',
18680
- getPageXY: getTouchEventPageXY,
18681
- };
18682
- }
18683
- else {
18684
- return {
18685
- MOUSEDOWN: 'mousedown',
18686
- MOUSEMOVE: 'mousemove',
18687
- MOUSEUP: 'mouseup',
18688
- getPageXY: getMouseEventPageXY,
18689
- };
18690
- }
18680
+ var MOUSE_EVENT_INFO_DESKTOP = (function () {
18681
+ return {
18682
+ MOUSEDOWN: 'mousedown',
18683
+ MOUSEMOVE: 'mousemove',
18684
+ MOUSEUP: 'mouseup',
18685
+ getPageXY: getMouseEventPageXY,
18686
+ };
18687
+ })();
18688
+ var MOUSE_EVENT_INFO_MOBILE = (function () {
18689
+ return {
18690
+ MOUSEDOWN: 'touchstart',
18691
+ MOUSEMOVE: 'touchmove',
18692
+ MOUSEUP: 'touchend',
18693
+ getPageXY: getTouchEventPageXY,
18694
+ };
18691
18695
  })();
18692
18696
  function getMouseEventPageXY(e) {
18693
18697
  return [e.pageX, e.pageY];
@@ -18715,8 +18719,10 @@ var DragAndDropHelper = /** @class */ (function () {
18715
18719
  * so that the handler object knows which element it is triggered from.
18716
18720
  * @param onSubmit A callback that will be invoked when event handler in handler object returns true
18717
18721
  * @param handler The event handler object, see DragAndDropHandler interface for more information
18722
+ * @param zoomScale The zoom scale of the editor
18723
+ * @param forceMobile A boolean to force the use of touch controls for the helper
18718
18724
  */
18719
- function DragAndDropHelper(trigger, context, onSubmit, handler, zoomScale) {
18725
+ function DragAndDropHelper(trigger, context, onSubmit, handler, zoomScale, forceMobile) {
18720
18726
  var _this = this;
18721
18727
  this.trigger = trigger;
18722
18728
  this.context = context;
@@ -18729,13 +18735,13 @@ var DragAndDropHelper = /** @class */ (function () {
18729
18735
  e.preventDefault();
18730
18736
  e.stopPropagation();
18731
18737
  _this.addDocumentEvents();
18732
- _a = MOUSE_EVENT_INFO.getPageXY(e), _this.initX = _a[0], _this.initY = _a[1];
18738
+ _a = _this.dndMouse.getPageXY(e), _this.initX = _a[0], _this.initY = _a[1];
18733
18739
  _this.initValue = (_c = (_b = _this.handler).onDragStart) === null || _c === void 0 ? void 0 : _c.call(_b, _this.context, e);
18734
18740
  };
18735
18741
  this.onMouseMove = function (e) {
18736
18742
  var _a, _b, _c;
18737
18743
  e.preventDefault();
18738
- var _d = MOUSE_EVENT_INFO.getPageXY(e), pageX = _d[0], pageY = _d[1];
18744
+ var _d = _this.dndMouse.getPageXY(e), pageX = _d[0], pageY = _d[1];
18739
18745
  var deltaX = (pageX - _this.initX) / _this.zoomScale;
18740
18746
  var deltaY = (pageY - _this.initY) / _this.zoomScale;
18741
18747
  if ((_b = (_a = _this.handler).onDragging) === null || _b === void 0 ? void 0 : _b.call(_a, _this.context, e, _this.initValue, deltaX, deltaY)) {
@@ -18750,24 +18756,28 @@ var DragAndDropHelper = /** @class */ (function () {
18750
18756
  (_c = _this.onSubmit) === null || _c === void 0 ? void 0 : _c.call(_this, _this.context, _this.trigger);
18751
18757
  }
18752
18758
  };
18753
- trigger.addEventListener(MOUSE_EVENT_INFO.MOUSEDOWN, this.onMouseDown);
18759
+ this.dndMouse =
18760
+ forceMobile || roosterjs_editor_dom_1.Browser.isMobileOrTablet
18761
+ ? MOUSE_EVENT_INFO_MOBILE
18762
+ : MOUSE_EVENT_INFO_DESKTOP;
18763
+ trigger.addEventListener(this.dndMouse.MOUSEDOWN, this.onMouseDown);
18754
18764
  }
18755
18765
  /**
18756
18766
  * Dispose this object, remove all event listeners that has been attached
18757
18767
  */
18758
18768
  DragAndDropHelper.prototype.dispose = function () {
18759
- this.trigger.removeEventListener(MOUSE_EVENT_INFO.MOUSEDOWN, this.onMouseDown);
18769
+ this.trigger.removeEventListener(this.dndMouse.MOUSEDOWN, this.onMouseDown);
18760
18770
  this.removeDocumentEvents();
18761
18771
  };
18762
18772
  DragAndDropHelper.prototype.addDocumentEvents = function () {
18763
18773
  var doc = this.trigger.ownerDocument;
18764
- doc.addEventListener(MOUSE_EVENT_INFO.MOUSEMOVE, this.onMouseMove, true /*useCapture*/);
18765
- doc.addEventListener(MOUSE_EVENT_INFO.MOUSEUP, this.onMouseUp, true /*useCapture*/);
18774
+ doc.addEventListener(this.dndMouse.MOUSEMOVE, this.onMouseMove, true /*useCapture*/);
18775
+ doc.addEventListener(this.dndMouse.MOUSEUP, this.onMouseUp, true /*useCapture*/);
18766
18776
  };
18767
18777
  DragAndDropHelper.prototype.removeDocumentEvents = function () {
18768
18778
  var doc = this.trigger.ownerDocument;
18769
- doc.removeEventListener(MOUSE_EVENT_INFO.MOUSEMOVE, this.onMouseMove, true /*useCapture*/);
18770
- doc.removeEventListener(MOUSE_EVENT_INFO.MOUSEUP, this.onMouseUp, true /*useCapture*/);
18779
+ doc.removeEventListener(this.dndMouse.MOUSEMOVE, this.onMouseMove, true /*useCapture*/);
18780
+ doc.removeEventListener(this.dndMouse.MOUSEUP, this.onMouseUp, true /*useCapture*/);
18771
18781
  };
18772
18782
  return DragAndDropHelper;
18773
18783
  }());
@@ -21137,7 +21147,7 @@ var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
21137
21147
  }
21138
21148
  return to.concat(ar || Array.prototype.slice.call(from));
21139
21149
  };
21140
- var _a, _b;
21150
+ var _a;
21141
21151
  Object.defineProperty(exports, "__esModule", { value: true });
21142
21152
  var applyChange_1 = __webpack_require__(/*! ./editInfoUtils/applyChange */ "./packages/roosterjs-editor-plugins/lib/plugins/ImageEdit/editInfoUtils/applyChange.ts");
21143
21153
  var canRegenerateImage_1 = __webpack_require__(/*! ./api/canRegenerateImage */ "./packages/roosterjs-editor-plugins/lib/plugins/ImageEdit/api/canRegenerateImage.ts");
@@ -21155,14 +21165,6 @@ var ALT_KEYCODE = 18;
21155
21165
  var DIRECTIONS = 8;
21156
21166
  var DirectionRad = (Math.PI * 2) / DIRECTIONS;
21157
21167
  var DirectionOrder = ['nw', 'n', 'ne', 'e', 'se', 's', 'sw', 'w'];
21158
- /**
21159
- * Map the experimental features to image edit operations to help determine which operation is allowed
21160
- */
21161
- var FeatureToOperationMap = (_a = {},
21162
- _a["SingleDirectionResize" /* SingleDirectionResize */] = 2 /* SideResize */,
21163
- _a["ImageRotate" /* ImageRotate */] = 4 /* Rotate */,
21164
- _a["ImageCrop" /* ImageCrop */] = 8 /* Crop */,
21165
- _a);
21166
21168
  /**
21167
21169
  * Default image edit options
21168
21170
  */
@@ -21174,17 +21176,20 @@ var DefaultOptions = {
21174
21176
  minRotateDeg: 5,
21175
21177
  imageSelector: 'img',
21176
21178
  rotateIconHTML: null,
21179
+ disableCrop: false,
21180
+ disableRotate: false,
21181
+ disableSideResize: false,
21177
21182
  };
21178
21183
  /**
21179
21184
  * Map the image edit operation to a function that returns editing elements HTML to help
21180
21185
  * build image editing UI
21181
21186
  */
21182
- var ImageEditHTMLMap = (_b = {},
21183
- _b[1 /* CornerResize */] = Resizer_1.getCornerResizeHTML,
21184
- _b[2 /* SideResize */] = Resizer_1.getSideResizeHTML,
21185
- _b[4 /* Rotate */] = Rotator_1.getRotateHTML,
21186
- _b[8 /* Crop */] = Cropper_1.getCropHTML,
21187
- _b);
21187
+ var ImageEditHTMLMap = (_a = {},
21188
+ _a[1 /* CornerResize */] = Resizer_1.getCornerResizeHTML,
21189
+ _a[2 /* SideResize */] = Resizer_1.getSideResizeHTML,
21190
+ _a[4 /* Rotate */] = Rotator_1.getRotateHTML,
21191
+ _a[8 /* Crop */] = Cropper_1.getCropHTML,
21192
+ _a);
21188
21193
  /**
21189
21194
  * Image edit entity name
21190
21195
  */
@@ -21212,8 +21217,6 @@ var ImageEdit = /** @class */ (function () {
21212
21217
  function ImageEdit(options, onShowResizeHandle) {
21213
21218
  var _this = this;
21214
21219
  this.onShowResizeHandle = onShowResizeHandle;
21215
- // Allowed editing operations
21216
- this.allowedOperations = 1 /* CornerResize */;
21217
21220
  /**
21218
21221
  * quit editing mode when editor lose focus
21219
21222
  */
@@ -21297,6 +21300,11 @@ var ImageEdit = /** @class */ (function () {
21297
21300
  }
21298
21301
  };
21299
21302
  this.options = __assign(__assign({}, DefaultOptions), (options || {}));
21303
+ this.allowedOperations =
21304
+ 1 /* CornerResize */ |
21305
+ (this.options.disableCrop ? 0 : 8 /* Crop */) |
21306
+ (this.options.disableRotate ? 0 : 4 /* Rotate */) |
21307
+ (this.options.disableSideResize ? 0 : 2 /* SideResize */);
21300
21308
  }
21301
21309
  /**
21302
21310
  * Get a friendly name of this plugin
@@ -21309,15 +21317,8 @@ var ImageEdit = /** @class */ (function () {
21309
21317
  * @param editor Editor instance
21310
21318
  */
21311
21319
  ImageEdit.prototype.initialize = function (editor) {
21312
- var _this = this;
21313
21320
  this.editor = editor;
21314
21321
  this.disposer = editor.addDomEventHandler('blur', this.onBlur);
21315
- // Read current enabled features from editor to determine which editing operations are allowed
21316
- (0, roosterjs_editor_dom_1.getObjectKeys)(FeatureToOperationMap).forEach(function (key) {
21317
- _this.allowedOperations |= _this.editor.isFeatureEnabled(key)
21318
- ? FeatureToOperationMap[key]
21319
- : 0;
21320
- });
21321
21322
  };
21322
21323
  /**
21323
21324
  * Dispose this plugin
@@ -21390,6 +21391,14 @@ var ImageEdit = /** @class */ (function () {
21390
21391
  break;
21391
21392
  }
21392
21393
  };
21394
+ /**
21395
+ * Check if the given image edit operation is allowed by this pluign
21396
+ * @param operation The image edit operation to check
21397
+ * @returns True means it is allowed, otherwise false
21398
+ */
21399
+ ImageEdit.prototype.isOperationAllowed = function (operation) {
21400
+ return !!(this.allowedOperations & operation);
21401
+ };
21393
21402
  ImageEdit.prototype.setEditingImage = function (image, operationOrSelect) {
21394
21403
  var _this = this;
21395
21404
  var operation = typeof operationOrSelect === 'number' ? operationOrSelect : 0 /* None */;
@@ -21442,7 +21451,9 @@ var ImageEdit = /** @class */ (function () {
21442
21451
  wrapper.style.position = 'relative';
21443
21452
  wrapper.style.maxWidth = '100%';
21444
21453
  // keep the same vertical align
21445
- var originalVerticalAlign = this.image.ownerDocument.defaultView.getComputedStyle(this.image).getPropertyValue('vertical-align');
21454
+ var originalVerticalAlign = this.image.ownerDocument.defaultView
21455
+ .getComputedStyle(this.image)
21456
+ .getPropertyValue('vertical-align');
21446
21457
  if (originalVerticalAlign) {
21447
21458
  wrapper.style.verticalAlign = originalVerticalAlign;
21448
21459
  }
@@ -23104,6 +23115,12 @@ var roosterjs_editor_dom_1 = __webpack_require__(/*! roosterjs-editor-dom */ "./
23104
23115
  var WORD_ONLINE_IDENTIFYING_SELECTOR = 'div.ListContainerWrapper>ul[class^="BulletListStyle"],div.ListContainerWrapper>ol[class^="NumberListStyle"],span.WACImageContainer > img';
23105
23116
  var LIST_CONTAINER_ELEMENT_CLASS_NAME = 'ListContainerWrapper';
23106
23117
  var IMAGE_CONTAINER_ELEMENT_CLASS_NAME = 'WACImageContainer';
23118
+ //When the list style is a symbol and the value is not in the clipboard, WordOnline
23119
+ var VALID_LIST_STYLE_CHAR_CODES = [
23120
+ '111',
23121
+ '9643',
23122
+ '9830', //'♦'
23123
+ ];
23107
23124
  /**
23108
23125
  * @internal
23109
23126
  */
@@ -23185,7 +23202,7 @@ function convertPastedContentFromWordOnline(fragment) {
23185
23202
  var listType = getContainerListType(listItemContainer); // list type that is contained by iterator.
23186
23203
  // Initialize processed element with proper listType if this is the first element
23187
23204
  if (!convertedListElement) {
23188
- convertedListElement = doc.createElement(listType);
23205
+ convertedListElement = createNewList(listItemContainer, doc, listType);
23189
23206
  }
23190
23207
  // Get all list items(<li>) in the current iterator element.
23191
23208
  var currentListItems = (0, roosterjs_editor_dom_1.toArray)(listItemContainer.querySelectorAll('li'));
@@ -23199,7 +23216,7 @@ function convertPastedContentFromWordOnline(fragment) {
23199
23216
  // and keep the processing going.
23200
23217
  if ((0, roosterjs_editor_dom_1.getTagOfNode)(convertedListElement) != listType && itemLevel == 1) {
23201
23218
  insertConvertedListToDoc(convertedListElement, fragment, itemBlock);
23202
- convertedListElement = doc.createElement(listType);
23219
+ convertedListElement = createNewList(listItemContainer, doc, listType);
23203
23220
  }
23204
23221
  insertListItem(convertedListElement, item, listType, doc);
23205
23222
  });
@@ -23236,6 +23253,15 @@ function convertPastedContentFromWordOnline(fragment) {
23236
23253
  });
23237
23254
  }
23238
23255
  exports.default = convertPastedContentFromWordOnline;
23256
+ function createNewList(listItemContainer, doc, tag) {
23257
+ var _a;
23258
+ var newList = doc.createElement(tag);
23259
+ var startAttribute = (_a = listItemContainer.firstElementChild) === null || _a === void 0 ? void 0 : _a.getAttribute('start');
23260
+ if (startAttribute) {
23261
+ newList.setAttribute('start', startAttribute);
23262
+ }
23263
+ return newList;
23264
+ }
23239
23265
  /**
23240
23266
  * The node processing is based on the premise of only ol/ul is in ListContainerWrapper class
23241
23267
  * However the html might be malformed, this function is to split all the other elements out of ListContainerWrapper
@@ -23318,11 +23344,19 @@ function getContainerListType(listItemContainer) {
23318
23344
  * @param listType Type of list(ul/ol)
23319
23345
  */
23320
23346
  function insertListItem(listRootElement, itemToInsert, listType, doc) {
23347
+ var _a;
23321
23348
  if (!listType) {
23322
23349
  return;
23323
23350
  }
23324
23351
  // Get item level from 'data-aria-level' attribute
23325
- var itemLevel = parseInt(itemToInsert.getAttribute('data-aria-level'));
23352
+ var itemLevel = parseInt((_a = itemToInsert.getAttribute('data-aria-level')) !== null && _a !== void 0 ? _a : '');
23353
+ // Try to reuse the List Marker
23354
+ var style = itemToInsert.getAttribute('data-leveltext');
23355
+ if (listType == 'UL' &&
23356
+ style &&
23357
+ VALID_LIST_STYLE_CHAR_CODES.indexOf(style.charCodeAt(0).toString()) > -1) {
23358
+ itemToInsert.style.listStyleType = "\"" + style + " \"";
23359
+ }
23326
23360
  var curListLevel = listRootElement; // Level iterator to find the correct place for the current element.
23327
23361
  // if the itemLevel is 1 it means the level iterator is at the correct place.
23328
23362
  while (itemLevel > 1) {
@@ -27491,15 +27525,15 @@ var CompatibleExperimentalFeatures;
27491
27525
  */
27492
27526
  CompatibleExperimentalFeatures["MergePastedLine"] = "MergePastedLine";
27493
27527
  /**
27494
- * Resize an image horizontally or vertically
27528
+ * @deprecated This feature is always enabled
27495
27529
  */
27496
27530
  CompatibleExperimentalFeatures["SingleDirectionResize"] = "SingleDirectionResize";
27497
27531
  /**
27498
- * Try retrieve link preview information when paste
27532
+ * @deprecated This feature is always enabled
27499
27533
  */
27500
27534
  CompatibleExperimentalFeatures["PasteWithLinkPreview"] = "PasteWithLinkPreview";
27501
27535
  /**
27502
- * Rotate an inline image (requires ImageEdit plugin)
27536
+ * @deprecated This feature is always enabled
27503
27537
  */
27504
27538
  CompatibleExperimentalFeatures["ImageRotate"] = "ImageRotate";
27505
27539
  /**
@@ -27546,6 +27580,11 @@ var CompatibleExperimentalFeatures;
27546
27580
  * when selection is collapsed. Instead, we will hold the pending format in memory and only apply it when type something
27547
27581
  */
27548
27582
  CompatibleExperimentalFeatures["PendingStyleBasedFormat"] = "PendingStyleBasedFormat";
27583
+ /**
27584
+ * Normalize list to make sure it can be displayed correctly in other client
27585
+ * e.g. We will move list items with "display: block" into previous list item and change tag to be DIV
27586
+ */
27587
+ CompatibleExperimentalFeatures["NormalizeList"] = "NormalizeList";
27549
27588
  })(CompatibleExperimentalFeatures = exports.CompatibleExperimentalFeatures || (exports.CompatibleExperimentalFeatures = {}));
27550
27589
 
27551
27590