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