roosterjs 8.29.3 → 8.30.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.
@@ -1336,13 +1336,12 @@ module.exports = {
1336
1336
  /* MIT license */
1337
1337
  var colorNames = __webpack_require__(/*! color-name */ "./node_modules/color-name/index.js");
1338
1338
  var swizzle = __webpack_require__(/*! simple-swizzle */ "./node_modules/simple-swizzle/index.js");
1339
- var hasOwnProperty = Object.hasOwnProperty;
1340
1339
 
1341
- var reverseNames = Object.create(null);
1340
+ var reverseNames = {};
1342
1341
 
1343
1342
  // create a list of reverse color names
1344
1343
  for (var name in colorNames) {
1345
- if (hasOwnProperty.call(colorNames, name)) {
1344
+ if (colorNames.hasOwnProperty(name)) {
1346
1345
  reverseNames[colorNames[name]] = name;
1347
1346
  }
1348
1347
  }
@@ -1385,9 +1384,9 @@ cs.get.rgb = function (string) {
1385
1384
 
1386
1385
  var abbr = /^#([a-f0-9]{3,4})$/i;
1387
1386
  var hex = /^#([a-f0-9]{6})([a-f0-9]{2})?$/i;
1388
- var rgba = /^rgba?\(\s*([+-]?\d+)(?=[\s,])\s*(?:,\s*)?([+-]?\d+)(?=[\s,])\s*(?:,\s*)?([+-]?\d+)\s*(?:[,|\/]\s*([+-]?[\d\.]+)(%?)\s*)?\)$/;
1389
- var per = /^rgba?\(\s*([+-]?[\d\.]+)\%\s*,?\s*([+-]?[\d\.]+)\%\s*,?\s*([+-]?[\d\.]+)\%\s*(?:[,|\/]\s*([+-]?[\d\.]+)(%?)\s*)?\)$/;
1390
- var keyword = /^(\w+)$/;
1387
+ var rgba = /^rgba?\(\s*([+-]?\d+)\s*,\s*([+-]?\d+)\s*,\s*([+-]?\d+)\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)$/;
1388
+ var per = /^rgba?\(\s*([+-]?[\d\.]+)\%\s*,\s*([+-]?[\d\.]+)\%\s*,\s*([+-]?[\d\.]+)\%\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)$/;
1389
+ var keyword = /(\D+)/;
1391
1390
 
1392
1391
  var rgb = [0, 0, 0, 1];
1393
1392
  var match;
@@ -1424,11 +1423,7 @@ cs.get.rgb = function (string) {
1424
1423
  }
1425
1424
 
1426
1425
  if (match[4]) {
1427
- if (match[5]) {
1428
- rgb[3] = parseFloat(match[4]) * 0.01;
1429
- } else {
1430
- rgb[3] = parseFloat(match[4]);
1431
- }
1426
+ rgb[3] = parseFloat(match[4]);
1432
1427
  }
1433
1428
  } else if (match = string.match(per)) {
1434
1429
  for (i = 0; i < 3; i++) {
@@ -1436,22 +1431,19 @@ cs.get.rgb = function (string) {
1436
1431
  }
1437
1432
 
1438
1433
  if (match[4]) {
1439
- if (match[5]) {
1440
- rgb[3] = parseFloat(match[4]) * 0.01;
1441
- } else {
1442
- rgb[3] = parseFloat(match[4]);
1443
- }
1434
+ rgb[3] = parseFloat(match[4]);
1444
1435
  }
1445
1436
  } else if (match = string.match(keyword)) {
1446
1437
  if (match[1] === 'transparent') {
1447
1438
  return [0, 0, 0, 0];
1448
1439
  }
1449
1440
 
1450
- if (!hasOwnProperty.call(colorNames, match[1])) {
1441
+ rgb = colorNames[match[1]];
1442
+
1443
+ if (!rgb) {
1451
1444
  return null;
1452
1445
  }
1453
1446
 
1454
- rgb = colorNames[match[1]];
1455
1447
  rgb[3] = 1;
1456
1448
 
1457
1449
  return rgb;
@@ -1472,12 +1464,12 @@ cs.get.hsl = function (string) {
1472
1464
  return null;
1473
1465
  }
1474
1466
 
1475
- var hsl = /^hsla?\(\s*([+-]?(?:\d{0,3}\.)?\d+)(?:deg)?\s*,?\s*([+-]?[\d\.]+)%\s*,?\s*([+-]?[\d\.]+)%\s*(?:[,|\/]\s*([+-]?(?=\.\d|\d)(?:0|[1-9]\d*)?(?:\.\d*)?(?:[eE][+-]?\d+)?)\s*)?\)$/;
1467
+ var hsl = /^hsla?\(\s*([+-]?(?:\d{0,3}\.)?\d+)(?:deg)?\s*,\s*([+-]?[\d\.]+)%\s*,\s*([+-]?[\d\.]+)%\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)$/;
1476
1468
  var match = string.match(hsl);
1477
1469
 
1478
1470
  if (match) {
1479
1471
  var alpha = parseFloat(match[4]);
1480
- var h = ((parseFloat(match[1]) % 360) + 360) % 360;
1472
+ var h = (parseFloat(match[1]) + 360) % 360;
1481
1473
  var s = clamp(parseFloat(match[2]), 0, 100);
1482
1474
  var l = clamp(parseFloat(match[3]), 0, 100);
1483
1475
  var a = clamp(isNaN(alpha) ? 1 : alpha, 0, 1);
@@ -1493,7 +1485,7 @@ cs.get.hwb = function (string) {
1493
1485
  return null;
1494
1486
  }
1495
1487
 
1496
- var hwb = /^hwb\(\s*([+-]?\d{0,3}(?:\.\d+)?)(?:deg)?\s*,\s*([+-]?[\d\.]+)%\s*,\s*([+-]?[\d\.]+)%\s*(?:,\s*([+-]?(?=\.\d|\d)(?:0|[1-9]\d*)?(?:\.\d*)?(?:[eE][+-]?\d+)?)\s*)?\)$/;
1488
+ var hwb = /^hwb\(\s*([+-]?\d{0,3}(?:\.\d+)?)(?:deg)?\s*,\s*([+-]?[\d\.]+)%\s*,\s*([+-]?[\d\.]+)%\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)$/;
1497
1489
  var match = string.match(hwb);
1498
1490
 
1499
1491
  if (match) {
@@ -1572,7 +1564,7 @@ function clamp(num, min, max) {
1572
1564
  }
1573
1565
 
1574
1566
  function hexDouble(num) {
1575
- var str = Math.round(num).toString(16).toUpperCase();
1567
+ var str = num.toString(16).toUpperCase();
1576
1568
  return (str.length < 2) ? '0' + str : str;
1577
1569
  }
1578
1570
 
@@ -2814,9 +2806,14 @@ function getElementBasedFormatState(editor, event) {
2814
2806
  if (range && !range.collapsed) {
2815
2807
  var startingBlock = editor.getBlockElementAtNode(range.startContainer);
2816
2808
  var endingBlock = editor.getBlockElementAtNode(range.endContainer);
2817
- multiline = endingBlock ? !endingBlock.equals(startingBlock) : false;
2809
+ multiline = endingBlock && startingBlock ? !endingBlock.equals(startingBlock) : false;
2818
2810
  }
2819
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;
2820
2817
  return {
2821
2818
  isBullet: listTag == 'UL',
2822
2819
  isNumbering: listTag == 'OL',
@@ -2825,7 +2822,9 @@ function getElementBasedFormatState(editor, event) {
2825
2822
  canUnlink: !!editor.queryElements('a[href]', 1 /* OnSelection */)[0],
2826
2823
  canAddImageAltText: !!editor.queryElements('img', 1 /* OnSelection */)[0],
2827
2824
  isBlockQuote: !!editor.queryElements('blockquote', 1 /* OnSelection */)[0],
2828
- isInTable: !!editor.queryElements('table', 1 /* OnSelection */)[0],
2825
+ isInTable: !!table,
2826
+ tableFormat: tableFormat,
2827
+ tableHasHeader: hasHeader,
2829
2828
  };
2830
2829
  }
2831
2830
  exports.getElementBasedFormatState = getElementBasedFormatState;
@@ -5835,7 +5834,6 @@ function buildCss(table, coordinates, contentDivSelector) {
5835
5834
  });
5836
5835
  (_a = vTable.cells) === null || _a === void 0 ? void 0 : _a.forEach(function (row, rowIndex) {
5837
5836
  var tdCount = 0;
5838
- var thCount = 0;
5839
5837
  firstSelected = null;
5840
5838
  lastSelected = null;
5841
5839
  //Get current TBODY/THEAD/TFOOT
@@ -5848,12 +5846,7 @@ function buildCss(table, coordinates, contentDivSelector) {
5848
5846
  var cell = row[cellIndex].td;
5849
5847
  if (cell) {
5850
5848
  var tag = (0, roosterjs_editor_dom_1.getTagOfNode)(cell);
5851
- if (tag == 'TD') {
5852
- tdCount++;
5853
- }
5854
- if (tag == 'TH') {
5855
- thCount++;
5856
- }
5849
+ tdCount++;
5857
5850
  if (rowIndex >= tr1 && rowIndex <= tr2 && cellIndex >= td1 && cellIndex <= td2) {
5858
5851
  if (isFirst) {
5859
5852
  isFirst = false;
@@ -5862,7 +5855,7 @@ function buildCss(table, coordinates, contentDivSelector) {
5862
5855
  css += ',';
5863
5856
  }
5864
5857
  removeImportant(cell);
5865
- var selector = generateCssFromCell(contentDivSelector, table.id, middleElSelector, currentRow, tag, tag == 'TD' ? tdCount : thCount);
5858
+ var selector = generateCssFromCell(contentDivSelector, table.id, middleElSelector, currentRow, tag, tdCount);
5866
5859
  css += selector;
5867
5860
  firstSelected = firstSelected || table.querySelector(selector);
5868
5861
  lastSelected = table.querySelector(selector);
@@ -6327,10 +6320,9 @@ var CopyPastePlugin = /** @class */ (function () {
6327
6320
  function CopyPastePlugin(options) {
6328
6321
  var _this = this;
6329
6322
  this.onPaste = function (event) {
6330
- var _a, _b;
6323
+ var _a;
6331
6324
  var range;
6332
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); }, {
6333
- allowLinkPreview: (_a = _this.editor) === null || _a === void 0 ? void 0 : _a.isFeatureEnabled("PasteWithLinkPreview" /* PasteWithLinkPreview */),
6334
6326
  allowedCustomPasteType: _this.state.allowedCustomPasteType,
6335
6327
  getTempDiv: function () {
6336
6328
  var _a;
@@ -6340,7 +6332,7 @@ var CopyPastePlugin = /** @class */ (function () {
6340
6332
  removeTempDiv: function (div) {
6341
6333
  _this.cleanUpAndRestoreSelection(div, range, false /* isCopy */);
6342
6334
  },
6343
- }, (_b = _this.editor) === null || _b === void 0 ? void 0 : _b.getSelectionRange());
6335
+ }, (_a = _this.editor) === null || _a === void 0 ? void 0 : _a.getSelectionRange());
6344
6336
  };
6345
6337
  this.state = {
6346
6338
  allowedCustomPasteType: options.allowedCustomPasteType || [],
@@ -6385,16 +6377,19 @@ var CopyPastePlugin = /** @class */ (function () {
6385
6377
  if (selection && !selection.areAllCollapsed) {
6386
6378
  var html = this.editor.getContent(2 /* RawHTMLWithSelection */);
6387
6379
  var tempDiv_1 = this.getTempDiv(true /*forceInLightMode*/);
6388
- var newRange = (0, roosterjs_editor_dom_1.setHtmlWithSelectionPath)(tempDiv_1, html, this.editor.getTrustedHTMLHandler());
6389
- if (newRange) {
6390
- (0, roosterjs_editor_dom_1.addRangeToSelection)(newRange);
6391
- }
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;
6392
6384
  this.editor.triggerPluginEvent(9 /* BeforeCutCopy */, {
6393
6385
  clonedRoot: tempDiv_1,
6394
6386
  range: newRange,
6395
6387
  rawEvent: event,
6396
6388
  isCut: isCut,
6397
6389
  });
6390
+ if (newRange) {
6391
+ (0, roosterjs_editor_dom_1.addRangeToSelection)(newRange);
6392
+ }
6398
6393
  this.editor.runAsync(function (editor) {
6399
6394
  _this.cleanUpAndRestoreSelection(tempDiv_1, selection, !isCut /* isCopy */);
6400
6395
  if (isCut) {
@@ -7413,6 +7408,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
7413
7408
  var roosterjs_editor_dom_1 = __webpack_require__(/*! roosterjs-editor-dom */ "./packages/roosterjs-editor-dom/lib/index.ts");
7414
7409
  /**
7415
7410
  * @internal
7411
+ * TODO: Rename this plugin since it is not only for table now
7412
+ *
7416
7413
  * NormalizeTable plugin makes sure each table in editor has TBODY/THEAD/TFOOT tag around TR tags
7417
7414
  *
7418
7415
  * When we retrieve HTML content using innerHTML, browser will always add TBODY around TR nodes if there is not.
@@ -7469,6 +7466,11 @@ var NormalizeTablePlugin = /** @class */ (function () {
7469
7466
  this.normalizeTableFromEvent(event.rawEvent);
7470
7467
  }
7471
7468
  break;
7469
+ case 8 /* ExtractContentWithDom */:
7470
+ if (this.editor.isFeatureEnabled("NormalizeList" /* NormalizeList */)) {
7471
+ normalizeListsForExport(event.clonedRoot);
7472
+ }
7473
+ break;
7472
7474
  }
7473
7475
  };
7474
7476
  NormalizeTablePlugin.prototype.normalizeTableFromEvent = function (event) {
@@ -7540,6 +7542,15 @@ function normalizeTables(tables) {
7540
7542
  });
7541
7543
  return isDOMChanged;
7542
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
+ }
7543
7554
 
7544
7555
 
7545
7556
  /***/ }),
@@ -9208,17 +9219,6 @@ function removeContents(range) {
9208
9219
 
9209
9220
  "use strict";
9210
9221
 
9211
- var __assign = (this && this.__assign) || function () {
9212
- __assign = Object.assign || function(t) {
9213
- for (var s, i = 1, n = arguments.length; i < n; i++) {
9214
- s = arguments[i];
9215
- for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
9216
- t[p] = s[p];
9217
- }
9218
- return t;
9219
- };
9220
- return __assign.apply(this, arguments);
9221
- };
9222
9222
  var _a;
9223
9223
  Object.defineProperty(exports, "__esModule", { value: true });
9224
9224
  var readFile_1 = __webpack_require__(/*! ../utils/readFile */ "./packages/roosterjs-editor-dom/lib/utils/readFile.ts");
@@ -9241,6 +9241,7 @@ var ContentHandlers = (_a = {},
9241
9241
  },
9242
9242
  _a["text/plain" /* PlainText */] = function (data, value) { return (data.text = value); },
9243
9243
  _a[OTHER_TEXT_TYPE] = function (data, value, type) { return !!type && (data.customValues[type] = value); },
9244
+ _a["text/" /* Text */ + EDGE_LINK_PREVIEW] = tryParseLinkPreview,
9244
9245
  _a);
9245
9246
  /**
9246
9247
  * Extract clipboard items to be a ClipboardData object for IE
@@ -9263,10 +9264,6 @@ function extractClipboardItems(items, options) {
9263
9264
  rawHtml: null,
9264
9265
  customValues: {},
9265
9266
  };
9266
- var contentHandlers = __assign({}, ContentHandlers);
9267
- if (options === null || options === void 0 ? void 0 : options.allowLinkPreview) {
9268
- contentHandlers["text/" /* Text */ + EDGE_LINK_PREVIEW] = tryParseLinkPreview;
9269
- }
9270
9267
  return Promise.all((items || []).map(function (item) {
9271
9268
  var type = item.type;
9272
9269
  if (type.indexOf("image/" /* Image */) == 0 && !data.image && item.kind == 'file') {
@@ -9296,7 +9293,7 @@ function extractClipboardItems(items, options) {
9296
9293
  }
9297
9294
  else {
9298
9295
  var customType_1 = getAllowedCustomType(type, options === null || options === void 0 ? void 0 : options.allowedCustomPasteType);
9299
- 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);
9300
9297
  return new Promise(function (resolve) {
9301
9298
  return handler_1
9302
9299
  ? item.getAsString(function (value) {
@@ -10324,21 +10321,23 @@ function adjustInsertPositionForTable(root, nodeToInsert, position, range) {
10324
10321
  var rangeToTraverse = (0, createRange_1.default)(posBefore, position);
10325
10322
  var contentTraverser = ContentTraverser_1.default.createSelectionTraverser(root, rangeToTraverse);
10326
10323
  var blockElement = contentTraverser && contentTraverser.currentBlockElement;
10327
- var nextBlockElement = blockElement;
10328
- while (!nextBlockElement) {
10329
- nextBlockElement = contentTraverser.getNextBlockElement();
10330
- if (nextBlockElement) {
10331
- blockElement = nextBlockElement;
10324
+ if (blockElement) {
10325
+ var nextBlockElement = blockElement;
10326
+ while (!nextBlockElement) {
10327
+ nextBlockElement = contentTraverser.getNextBlockElement();
10328
+ if (nextBlockElement) {
10329
+ blockElement = nextBlockElement;
10330
+ }
10331
+ }
10332
+ var prevElement = blockElement === null || blockElement === void 0 ? void 0 : blockElement.getEndNode();
10333
+ if (prevElement && (0, findClosestElementAncestor_1.default)(prevElement, root, 'TABLE')) {
10334
+ var tempRange = (0, createRange_1.default)(position);
10335
+ tempRange.collapse(false /* toStart */);
10336
+ var br = root.ownerDocument.createElement('br');
10337
+ tempRange.insertNode(br);
10338
+ tempRange = (0, createRange_1.default)(br);
10339
+ position = Position_1.default.getEnd(tempRange);
10332
10340
  }
10333
- }
10334
- var prevElement = blockElement === null || blockElement === void 0 ? void 0 : blockElement.getEndNode();
10335
- if (prevElement && (0, findClosestElementAncestor_1.default)(prevElement, root, 'TABLE')) {
10336
- var tempRange = (0, createRange_1.default)(position);
10337
- tempRange.collapse(false /* toStart */);
10338
- var br = root.ownerDocument.createElement('br');
10339
- tempRange.insertNode(br);
10340
- tempRange = (0, createRange_1.default)(br);
10341
- position = Position_1.default.getEnd(tempRange);
10342
10341
  }
10343
10342
  }
10344
10343
  return position;
@@ -11548,8 +11547,8 @@ exports.default = getPredefinedCssForElement;
11548
11547
 
11549
11548
  Object.defineProperty(exports, "__esModule", { value: true });
11550
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;
11551
- 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;
11552
- 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;
11553
11552
  var getBlockElementAtNode_1 = __webpack_require__(/*! ./blockElements/getBlockElementAtNode */ "./packages/roosterjs-editor-dom/lib/blockElements/getBlockElementAtNode.ts");
11554
11553
  Object.defineProperty(exports, "getBlockElementAtNode", { enumerable: true, get: function () { return getBlockElementAtNode_1.default; } });
11555
11554
  var getFirstLastBlockElement_1 = __webpack_require__(/*! ./blockElements/getFirstLastBlockElement */ "./packages/roosterjs-editor-dom/lib/blockElements/getFirstLastBlockElement.ts");
@@ -11655,6 +11654,8 @@ var VListChain_1 = __webpack_require__(/*! ./list/VListChain */ "./packages/roos
11655
11654
  Object.defineProperty(exports, "VListChain", { enumerable: true, get: function () { return VListChain_1.default; } });
11656
11655
  var setListItemStyle_1 = __webpack_require__(/*! ./list/setListItemStyle */ "./packages/roosterjs-editor-dom/lib/list/setListItemStyle.ts");
11657
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; } });
11658
11659
  var getRegionsFromRange_1 = __webpack_require__(/*! ./region/getRegionsFromRange */ "./packages/roosterjs-editor-dom/lib/region/getRegionsFromRange.ts");
11659
11660
  Object.defineProperty(exports, "getRegionsFromRange", { enumerable: true, get: function () { return getRegionsFromRange_1.default; } });
11660
11661
  var getSelectedBlockElementsInRegion_1 = __webpack_require__(/*! ./region/getSelectedBlockElementsInRegion */ "./packages/roosterjs-editor-dom/lib/region/getSelectedBlockElementsInRegion.ts");
@@ -16593,7 +16594,6 @@ var TableFormatMetadata = (0, definitionCreators_1.createObjectDefinition)({
16593
16594
  keepCellShade: BooleanDefinition,
16594
16595
  }, false /* isOptional */, true /** allowNull */);
16595
16596
  /**
16596
- * @internal
16597
16597
  * Get the format info of a table
16598
16598
  * If the table does not have a info saved, it will be retrieved from the css styles
16599
16599
  * @param table The table that has the info
@@ -18677,23 +18677,21 @@ var roosterjs_editor_dom_1 = __webpack_require__(/*! roosterjs-editor-dom */ "./
18677
18677
  /**
18678
18678
  * Generate event names and getXY function based on different platforms to be compatible with desktop and mobile browsers
18679
18679
  */
18680
- var MOUSE_EVENT_INFO = (function () {
18681
- if (roosterjs_editor_dom_1.Browser.isMobileOrTablet) {
18682
- return {
18683
- MOUSEDOWN: 'touchstart',
18684
- MOUSEMOVE: 'touchmove',
18685
- MOUSEUP: 'touchend',
18686
- getPageXY: getTouchEventPageXY,
18687
- };
18688
- }
18689
- else {
18690
- return {
18691
- MOUSEDOWN: 'mousedown',
18692
- MOUSEMOVE: 'mousemove',
18693
- MOUSEUP: 'mouseup',
18694
- getPageXY: getMouseEventPageXY,
18695
- };
18696
- }
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
+ };
18697
18695
  })();
18698
18696
  function getMouseEventPageXY(e) {
18699
18697
  return [e.pageX, e.pageY];
@@ -18721,8 +18719,10 @@ var DragAndDropHelper = /** @class */ (function () {
18721
18719
  * so that the handler object knows which element it is triggered from.
18722
18720
  * @param onSubmit A callback that will be invoked when event handler in handler object returns true
18723
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
18724
18724
  */
18725
- function DragAndDropHelper(trigger, context, onSubmit, handler, zoomScale) {
18725
+ function DragAndDropHelper(trigger, context, onSubmit, handler, zoomScale, forceMobile) {
18726
18726
  var _this = this;
18727
18727
  this.trigger = trigger;
18728
18728
  this.context = context;
@@ -18735,13 +18735,13 @@ var DragAndDropHelper = /** @class */ (function () {
18735
18735
  e.preventDefault();
18736
18736
  e.stopPropagation();
18737
18737
  _this.addDocumentEvents();
18738
- _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];
18739
18739
  _this.initValue = (_c = (_b = _this.handler).onDragStart) === null || _c === void 0 ? void 0 : _c.call(_b, _this.context, e);
18740
18740
  };
18741
18741
  this.onMouseMove = function (e) {
18742
18742
  var _a, _b, _c;
18743
18743
  e.preventDefault();
18744
- 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];
18745
18745
  var deltaX = (pageX - _this.initX) / _this.zoomScale;
18746
18746
  var deltaY = (pageY - _this.initY) / _this.zoomScale;
18747
18747
  if ((_b = (_a = _this.handler).onDragging) === null || _b === void 0 ? void 0 : _b.call(_a, _this.context, e, _this.initValue, deltaX, deltaY)) {
@@ -18756,24 +18756,28 @@ var DragAndDropHelper = /** @class */ (function () {
18756
18756
  (_c = _this.onSubmit) === null || _c === void 0 ? void 0 : _c.call(_this, _this.context, _this.trigger);
18757
18757
  }
18758
18758
  };
18759
- 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);
18760
18764
  }
18761
18765
  /**
18762
18766
  * Dispose this object, remove all event listeners that has been attached
18763
18767
  */
18764
18768
  DragAndDropHelper.prototype.dispose = function () {
18765
- this.trigger.removeEventListener(MOUSE_EVENT_INFO.MOUSEDOWN, this.onMouseDown);
18769
+ this.trigger.removeEventListener(this.dndMouse.MOUSEDOWN, this.onMouseDown);
18766
18770
  this.removeDocumentEvents();
18767
18771
  };
18768
18772
  DragAndDropHelper.prototype.addDocumentEvents = function () {
18769
18773
  var doc = this.trigger.ownerDocument;
18770
- doc.addEventListener(MOUSE_EVENT_INFO.MOUSEMOVE, this.onMouseMove, true /*useCapture*/);
18771
- 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*/);
18772
18776
  };
18773
18777
  DragAndDropHelper.prototype.removeDocumentEvents = function () {
18774
18778
  var doc = this.trigger.ownerDocument;
18775
- doc.removeEventListener(MOUSE_EVENT_INFO.MOUSEMOVE, this.onMouseMove, true /*useCapture*/);
18776
- 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*/);
18777
18781
  };
18778
18782
  return DragAndDropHelper;
18779
18783
  }());
@@ -21143,7 +21147,7 @@ var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
21143
21147
  }
21144
21148
  return to.concat(ar || Array.prototype.slice.call(from));
21145
21149
  };
21146
- var _a, _b;
21150
+ var _a;
21147
21151
  Object.defineProperty(exports, "__esModule", { value: true });
21148
21152
  var applyChange_1 = __webpack_require__(/*! ./editInfoUtils/applyChange */ "./packages/roosterjs-editor-plugins/lib/plugins/ImageEdit/editInfoUtils/applyChange.ts");
21149
21153
  var canRegenerateImage_1 = __webpack_require__(/*! ./api/canRegenerateImage */ "./packages/roosterjs-editor-plugins/lib/plugins/ImageEdit/api/canRegenerateImage.ts");
@@ -21161,14 +21165,6 @@ var ALT_KEYCODE = 18;
21161
21165
  var DIRECTIONS = 8;
21162
21166
  var DirectionRad = (Math.PI * 2) / DIRECTIONS;
21163
21167
  var DirectionOrder = ['nw', 'n', 'ne', 'e', 'se', 's', 'sw', 'w'];
21164
- /**
21165
- * Map the experimental features to image edit operations to help determine which operation is allowed
21166
- */
21167
- var FeatureToOperationMap = (_a = {},
21168
- _a["SingleDirectionResize" /* SingleDirectionResize */] = 2 /* SideResize */,
21169
- _a["ImageRotate" /* ImageRotate */] = 4 /* Rotate */,
21170
- _a["ImageCrop" /* ImageCrop */] = 8 /* Crop */,
21171
- _a);
21172
21168
  /**
21173
21169
  * Default image edit options
21174
21170
  */
@@ -21180,17 +21176,20 @@ var DefaultOptions = {
21180
21176
  minRotateDeg: 5,
21181
21177
  imageSelector: 'img',
21182
21178
  rotateIconHTML: null,
21179
+ disableCrop: false,
21180
+ disableRotate: false,
21181
+ disableSideResize: false,
21183
21182
  };
21184
21183
  /**
21185
21184
  * Map the image edit operation to a function that returns editing elements HTML to help
21186
21185
  * build image editing UI
21187
21186
  */
21188
- var ImageEditHTMLMap = (_b = {},
21189
- _b[1 /* CornerResize */] = Resizer_1.getCornerResizeHTML,
21190
- _b[2 /* SideResize */] = Resizer_1.getSideResizeHTML,
21191
- _b[4 /* Rotate */] = Rotator_1.getRotateHTML,
21192
- _b[8 /* Crop */] = Cropper_1.getCropHTML,
21193
- _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);
21194
21193
  /**
21195
21194
  * Image edit entity name
21196
21195
  */
@@ -21218,8 +21217,6 @@ var ImageEdit = /** @class */ (function () {
21218
21217
  function ImageEdit(options, onShowResizeHandle) {
21219
21218
  var _this = this;
21220
21219
  this.onShowResizeHandle = onShowResizeHandle;
21221
- // Allowed editing operations
21222
- this.allowedOperations = 1 /* CornerResize */;
21223
21220
  /**
21224
21221
  * quit editing mode when editor lose focus
21225
21222
  */
@@ -21303,6 +21300,11 @@ var ImageEdit = /** @class */ (function () {
21303
21300
  }
21304
21301
  };
21305
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 */);
21306
21308
  }
21307
21309
  /**
21308
21310
  * Get a friendly name of this plugin
@@ -21315,15 +21317,8 @@ var ImageEdit = /** @class */ (function () {
21315
21317
  * @param editor Editor instance
21316
21318
  */
21317
21319
  ImageEdit.prototype.initialize = function (editor) {
21318
- var _this = this;
21319
21320
  this.editor = editor;
21320
21321
  this.disposer = editor.addDomEventHandler('blur', this.onBlur);
21321
- // Read current enabled features from editor to determine which editing operations are allowed
21322
- (0, roosterjs_editor_dom_1.getObjectKeys)(FeatureToOperationMap).forEach(function (key) {
21323
- _this.allowedOperations |= _this.editor.isFeatureEnabled(key)
21324
- ? FeatureToOperationMap[key]
21325
- : 0;
21326
- });
21327
21322
  };
21328
21323
  /**
21329
21324
  * Dispose this plugin
@@ -21396,6 +21391,14 @@ var ImageEdit = /** @class */ (function () {
21396
21391
  break;
21397
21392
  }
21398
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
+ };
21399
21402
  ImageEdit.prototype.setEditingImage = function (image, operationOrSelect) {
21400
21403
  var _this = this;
21401
21404
  var operation = typeof operationOrSelect === 'number' ? operationOrSelect : 0 /* None */;
@@ -21448,7 +21451,9 @@ var ImageEdit = /** @class */ (function () {
21448
21451
  wrapper.style.position = 'relative';
21449
21452
  wrapper.style.maxWidth = '100%';
21450
21453
  // keep the same vertical align
21451
- 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');
21452
21457
  if (originalVerticalAlign) {
21453
21458
  wrapper.style.verticalAlign = originalVerticalAlign;
21454
21459
  }
@@ -23110,6 +23115,12 @@ var roosterjs_editor_dom_1 = __webpack_require__(/*! roosterjs-editor-dom */ "./
23110
23115
  var WORD_ONLINE_IDENTIFYING_SELECTOR = 'div.ListContainerWrapper>ul[class^="BulletListStyle"],div.ListContainerWrapper>ol[class^="NumberListStyle"],span.WACImageContainer > img';
23111
23116
  var LIST_CONTAINER_ELEMENT_CLASS_NAME = 'ListContainerWrapper';
23112
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
+ ];
23113
23124
  /**
23114
23125
  * @internal
23115
23126
  */
@@ -23191,7 +23202,7 @@ function convertPastedContentFromWordOnline(fragment) {
23191
23202
  var listType = getContainerListType(listItemContainer); // list type that is contained by iterator.
23192
23203
  // Initialize processed element with proper listType if this is the first element
23193
23204
  if (!convertedListElement) {
23194
- convertedListElement = doc.createElement(listType);
23205
+ convertedListElement = createNewList(listItemContainer, doc, listType);
23195
23206
  }
23196
23207
  // Get all list items(<li>) in the current iterator element.
23197
23208
  var currentListItems = (0, roosterjs_editor_dom_1.toArray)(listItemContainer.querySelectorAll('li'));
@@ -23205,7 +23216,7 @@ function convertPastedContentFromWordOnline(fragment) {
23205
23216
  // and keep the processing going.
23206
23217
  if ((0, roosterjs_editor_dom_1.getTagOfNode)(convertedListElement) != listType && itemLevel == 1) {
23207
23218
  insertConvertedListToDoc(convertedListElement, fragment, itemBlock);
23208
- convertedListElement = doc.createElement(listType);
23219
+ convertedListElement = createNewList(listItemContainer, doc, listType);
23209
23220
  }
23210
23221
  insertListItem(convertedListElement, item, listType, doc);
23211
23222
  });
@@ -23242,6 +23253,15 @@ function convertPastedContentFromWordOnline(fragment) {
23242
23253
  });
23243
23254
  }
23244
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
+ }
23245
23265
  /**
23246
23266
  * The node processing is based on the premise of only ol/ul is in ListContainerWrapper class
23247
23267
  * However the html might be malformed, this function is to split all the other elements out of ListContainerWrapper
@@ -23324,11 +23344,19 @@ function getContainerListType(listItemContainer) {
23324
23344
  * @param listType Type of list(ul/ol)
23325
23345
  */
23326
23346
  function insertListItem(listRootElement, itemToInsert, listType, doc) {
23347
+ var _a;
23327
23348
  if (!listType) {
23328
23349
  return;
23329
23350
  }
23330
23351
  // Get item level from 'data-aria-level' attribute
23331
- 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
+ }
23332
23360
  var curListLevel = listRootElement; // Level iterator to find the correct place for the current element.
23333
23361
  // if the itemLevel is 1 it means the level iterator is at the correct place.
23334
23362
  while (itemLevel > 1) {
@@ -27497,15 +27525,15 @@ var CompatibleExperimentalFeatures;
27497
27525
  */
27498
27526
  CompatibleExperimentalFeatures["MergePastedLine"] = "MergePastedLine";
27499
27527
  /**
27500
- * Resize an image horizontally or vertically
27528
+ * @deprecated This feature is always enabled
27501
27529
  */
27502
27530
  CompatibleExperimentalFeatures["SingleDirectionResize"] = "SingleDirectionResize";
27503
27531
  /**
27504
- * Try retrieve link preview information when paste
27532
+ * @deprecated This feature is always enabled
27505
27533
  */
27506
27534
  CompatibleExperimentalFeatures["PasteWithLinkPreview"] = "PasteWithLinkPreview";
27507
27535
  /**
27508
- * Rotate an inline image (requires ImageEdit plugin)
27536
+ * @deprecated This feature is always enabled
27509
27537
  */
27510
27538
  CompatibleExperimentalFeatures["ImageRotate"] = "ImageRotate";
27511
27539
  /**
@@ -27552,6 +27580,11 @@ var CompatibleExperimentalFeatures;
27552
27580
  * when selection is collapsed. Instead, we will hold the pending format in memory and only apply it when type something
27553
27581
  */
27554
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";
27555
27588
  })(CompatibleExperimentalFeatures = exports.CompatibleExperimentalFeatures || (exports.CompatibleExperimentalFeatures = {}));
27556
27589
 
27557
27590