roosterjs 9.56.0 → 9.58.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.
@@ -1246,12 +1246,13 @@ module.exports = {
1246
1246
  /* MIT license */
1247
1247
  var colorNames = __webpack_require__(/*! color-name */ "./node_modules/color-name/index.js");
1248
1248
  var swizzle = __webpack_require__(/*! simple-swizzle */ "./node_modules/simple-swizzle/index.js");
1249
+ var hasOwnProperty = Object.hasOwnProperty;
1249
1250
 
1250
- var reverseNames = {};
1251
+ var reverseNames = Object.create(null);
1251
1252
 
1252
1253
  // create a list of reverse color names
1253
1254
  for (var name in colorNames) {
1254
- if (colorNames.hasOwnProperty(name)) {
1255
+ if (hasOwnProperty.call(colorNames, name)) {
1255
1256
  reverseNames[colorNames[name]] = name;
1256
1257
  }
1257
1258
  }
@@ -1294,9 +1295,9 @@ cs.get.rgb = function (string) {
1294
1295
 
1295
1296
  var abbr = /^#([a-f0-9]{3,4})$/i;
1296
1297
  var hex = /^#([a-f0-9]{6})([a-f0-9]{2})?$/i;
1297
- var rgba = /^rgba?\(\s*([+-]?\d+)\s*,\s*([+-]?\d+)\s*,\s*([+-]?\d+)\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)$/;
1298
- var per = /^rgba?\(\s*([+-]?[\d\.]+)\%\s*,\s*([+-]?[\d\.]+)\%\s*,\s*([+-]?[\d\.]+)\%\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)$/;
1299
- var keyword = /(\D+)/;
1298
+ var rgba = /^rgba?\(\s*([+-]?\d+)(?=[\s,])\s*(?:,\s*)?([+-]?\d+)(?=[\s,])\s*(?:,\s*)?([+-]?\d+)\s*(?:[,|\/]\s*([+-]?[\d\.]+)(%?)\s*)?\)$/;
1299
+ var per = /^rgba?\(\s*([+-]?[\d\.]+)\%\s*,?\s*([+-]?[\d\.]+)\%\s*,?\s*([+-]?[\d\.]+)\%\s*(?:[,|\/]\s*([+-]?[\d\.]+)(%?)\s*)?\)$/;
1300
+ var keyword = /^(\w+)$/;
1300
1301
 
1301
1302
  var rgb = [0, 0, 0, 1];
1302
1303
  var match;
@@ -1333,7 +1334,11 @@ cs.get.rgb = function (string) {
1333
1334
  }
1334
1335
 
1335
1336
  if (match[4]) {
1336
- rgb[3] = parseFloat(match[4]);
1337
+ if (match[5]) {
1338
+ rgb[3] = parseFloat(match[4]) * 0.01;
1339
+ } else {
1340
+ rgb[3] = parseFloat(match[4]);
1341
+ }
1337
1342
  }
1338
1343
  } else if (match = string.match(per)) {
1339
1344
  for (i = 0; i < 3; i++) {
@@ -1341,19 +1346,22 @@ cs.get.rgb = function (string) {
1341
1346
  }
1342
1347
 
1343
1348
  if (match[4]) {
1344
- rgb[3] = parseFloat(match[4]);
1349
+ if (match[5]) {
1350
+ rgb[3] = parseFloat(match[4]) * 0.01;
1351
+ } else {
1352
+ rgb[3] = parseFloat(match[4]);
1353
+ }
1345
1354
  }
1346
1355
  } else if (match = string.match(keyword)) {
1347
1356
  if (match[1] === 'transparent') {
1348
1357
  return [0, 0, 0, 0];
1349
1358
  }
1350
1359
 
1351
- rgb = colorNames[match[1]];
1352
-
1353
- if (!rgb) {
1360
+ if (!hasOwnProperty.call(colorNames, match[1])) {
1354
1361
  return null;
1355
1362
  }
1356
1363
 
1364
+ rgb = colorNames[match[1]];
1357
1365
  rgb[3] = 1;
1358
1366
 
1359
1367
  return rgb;
@@ -1374,12 +1382,12 @@ cs.get.hsl = function (string) {
1374
1382
  return null;
1375
1383
  }
1376
1384
 
1377
- var hsl = /^hsla?\(\s*([+-]?(?:\d{0,3}\.)?\d+)(?:deg)?\s*,\s*([+-]?[\d\.]+)%\s*,\s*([+-]?[\d\.]+)%\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)$/;
1385
+ 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*)?\)$/;
1378
1386
  var match = string.match(hsl);
1379
1387
 
1380
1388
  if (match) {
1381
1389
  var alpha = parseFloat(match[4]);
1382
- var h = (parseFloat(match[1]) + 360) % 360;
1390
+ var h = ((parseFloat(match[1]) % 360) + 360) % 360;
1383
1391
  var s = clamp(parseFloat(match[2]), 0, 100);
1384
1392
  var l = clamp(parseFloat(match[3]), 0, 100);
1385
1393
  var a = clamp(isNaN(alpha) ? 1 : alpha, 0, 1);
@@ -1395,7 +1403,7 @@ cs.get.hwb = function (string) {
1395
1403
  return null;
1396
1404
  }
1397
1405
 
1398
- var hwb = /^hwb\(\s*([+-]?\d{0,3}(?:\.\d+)?)(?:deg)?\s*,\s*([+-]?[\d\.]+)%\s*,\s*([+-]?[\d\.]+)%\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)$/;
1406
+ 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*)?\)$/;
1399
1407
  var match = string.match(hwb);
1400
1408
 
1401
1409
  if (match) {
@@ -1474,7 +1482,7 @@ function clamp(num, min, max) {
1474
1482
  }
1475
1483
 
1476
1484
  function hexDouble(num) {
1477
- var str = num.toString(16).toUpperCase();
1485
+ var str = Math.round(num).toString(16).toUpperCase();
1478
1486
  return (str.length < 2) ? '0' + str : str;
1479
1487
  }
1480
1488
 
@@ -2042,6 +2050,7 @@ swizzle.wrap = function (fn) {
2042
2050
  "use strict";
2043
2051
  __webpack_require__.r(__webpack_exports__);
2044
2052
  /* harmony export */ __webpack_require__.d(__webpack_exports__, {
2053
+ /* harmony export */ __addDisposableResource: () => (/* binding */ __addDisposableResource),
2045
2054
  /* harmony export */ __assign: () => (/* binding */ __assign),
2046
2055
  /* harmony export */ __asyncDelegator: () => (/* binding */ __asyncDelegator),
2047
2056
  /* harmony export */ __asyncGenerator: () => (/* binding */ __asyncGenerator),
@@ -2053,6 +2062,7 @@ __webpack_require__.r(__webpack_exports__);
2053
2062
  /* harmony export */ __classPrivateFieldSet: () => (/* binding */ __classPrivateFieldSet),
2054
2063
  /* harmony export */ __createBinding: () => (/* binding */ __createBinding),
2055
2064
  /* harmony export */ __decorate: () => (/* binding */ __decorate),
2065
+ /* harmony export */ __disposeResources: () => (/* binding */ __disposeResources),
2056
2066
  /* harmony export */ __esDecorate: () => (/* binding */ __esDecorate),
2057
2067
  /* harmony export */ __exportStar: () => (/* binding */ __exportStar),
2058
2068
  /* harmony export */ __extends: () => (/* binding */ __extends),
@@ -2065,6 +2075,7 @@ __webpack_require__.r(__webpack_exports__);
2065
2075
  /* harmony export */ __propKey: () => (/* binding */ __propKey),
2066
2076
  /* harmony export */ __read: () => (/* binding */ __read),
2067
2077
  /* harmony export */ __rest: () => (/* binding */ __rest),
2078
+ /* harmony export */ __rewriteRelativeImportExtension: () => (/* binding */ __rewriteRelativeImportExtension),
2068
2079
  /* harmony export */ __runInitializers: () => (/* binding */ __runInitializers),
2069
2080
  /* harmony export */ __setFunctionName: () => (/* binding */ __setFunctionName),
2070
2081
  /* harmony export */ __spread: () => (/* binding */ __spread),
@@ -2087,7 +2098,7 @@ LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
2087
2098
  OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
2088
2099
  PERFORMANCE OF THIS SOFTWARE.
2089
2100
  ***************************************************************************** */
2090
- /* global Reflect, Promise */
2101
+ /* global Reflect, Promise, SuppressedError, Symbol, Iterator */
2091
2102
 
2092
2103
  var extendStatics = function(d, b) {
2093
2104
  extendStatics = Object.setPrototypeOf ||
@@ -2198,8 +2209,8 @@ function __awaiter(thisArg, _arguments, P, generator) {
2198
2209
  }
2199
2210
 
2200
2211
  function __generator(thisArg, body) {
2201
- var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
2202
- return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
2212
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype);
2213
+ return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
2203
2214
  function verb(n) { return function (v) { return step([n, v]); }; }
2204
2215
  function step(op) {
2205
2216
  if (f) throw new TypeError("Generator is already executing.");
@@ -2303,8 +2314,9 @@ function __await(v) {
2303
2314
  function __asyncGenerator(thisArg, _arguments, generator) {
2304
2315
  if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
2305
2316
  var g = generator.apply(thisArg, _arguments || []), i, q = [];
2306
- return i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i;
2307
- function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }
2317
+ return i = Object.create((typeof AsyncIterator === "function" ? AsyncIterator : Object).prototype), verb("next"), verb("throw"), verb("return", awaitReturn), i[Symbol.asyncIterator] = function () { return this; }, i;
2318
+ function awaitReturn(f) { return function (v) { return Promise.resolve(v).then(f, reject); }; }
2319
+ function verb(n, f) { if (g[n]) { i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; if (f) i[n] = f(i[n]); } }
2308
2320
  function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }
2309
2321
  function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }
2310
2322
  function fulfill(value) { resume("next", value); }
@@ -2337,10 +2349,19 @@ var __setModuleDefault = Object.create ? (function(o, v) {
2337
2349
  o["default"] = v;
2338
2350
  };
2339
2351
 
2352
+ var ownKeys = function(o) {
2353
+ ownKeys = Object.getOwnPropertyNames || function (o) {
2354
+ var ar = [];
2355
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
2356
+ return ar;
2357
+ };
2358
+ return ownKeys(o);
2359
+ };
2360
+
2340
2361
  function __importStar(mod) {
2341
2362
  if (mod && mod.__esModule) return mod;
2342
2363
  var result = {};
2343
- if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
2364
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
2344
2365
  __setModuleDefault(result, mod);
2345
2366
  return result;
2346
2367
  }
@@ -2367,12 +2388,79 @@ function __classPrivateFieldIn(state, receiver) {
2367
2388
  return typeof state === "function" ? receiver === state : state.has(receiver);
2368
2389
  }
2369
2390
 
2391
+ function __addDisposableResource(env, value, async) {
2392
+ if (value !== null && value !== void 0) {
2393
+ if (typeof value !== "object" && typeof value !== "function") throw new TypeError("Object expected.");
2394
+ var dispose, inner;
2395
+ if (async) {
2396
+ if (!Symbol.asyncDispose) throw new TypeError("Symbol.asyncDispose is not defined.");
2397
+ dispose = value[Symbol.asyncDispose];
2398
+ }
2399
+ if (dispose === void 0) {
2400
+ if (!Symbol.dispose) throw new TypeError("Symbol.dispose is not defined.");
2401
+ dispose = value[Symbol.dispose];
2402
+ if (async) inner = dispose;
2403
+ }
2404
+ if (typeof dispose !== "function") throw new TypeError("Object not disposable.");
2405
+ if (inner) dispose = function() { try { inner.call(this); } catch (e) { return Promise.reject(e); } };
2406
+ env.stack.push({ value: value, dispose: dispose, async: async });
2407
+ }
2408
+ else if (async) {
2409
+ env.stack.push({ async: true });
2410
+ }
2411
+ return value;
2412
+ }
2413
+
2414
+ var _SuppressedError = typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) {
2415
+ var e = new Error(message);
2416
+ return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
2417
+ };
2418
+
2419
+ function __disposeResources(env) {
2420
+ function fail(e) {
2421
+ env.error = env.hasError ? new _SuppressedError(e, env.error, "An error was suppressed during disposal.") : e;
2422
+ env.hasError = true;
2423
+ }
2424
+ var r, s = 0;
2425
+ function next() {
2426
+ while (r = env.stack.pop()) {
2427
+ try {
2428
+ if (!r.async && s === 1) return s = 0, env.stack.push(r), Promise.resolve().then(next);
2429
+ if (r.dispose) {
2430
+ var result = r.dispose.call(r.value);
2431
+ if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) { fail(e); return next(); });
2432
+ }
2433
+ else s |= 1;
2434
+ }
2435
+ catch (e) {
2436
+ fail(e);
2437
+ }
2438
+ }
2439
+ if (s === 1) return env.hasError ? Promise.reject(env.error) : Promise.resolve();
2440
+ if (env.hasError) throw env.error;
2441
+ }
2442
+ return next();
2443
+ }
2444
+
2445
+ function __rewriteRelativeImportExtension(path, preserveJsx) {
2446
+ if (typeof path === "string" && /^\.\.?\//.test(path)) {
2447
+ return path.replace(/\.(tsx)$|((?:\.d)?)((?:\.[^./]+?)?)\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) {
2448
+ return tsx ? preserveJsx ? ".jsx" : ".js" : d && (!ext || !cm) ? m : (d + ext + "." + cm.toLowerCase() + "js");
2449
+ });
2450
+ }
2451
+ return path;
2452
+ }
2453
+
2370
2454
  /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({
2371
2455
  __extends,
2372
2456
  __assign,
2373
2457
  __rest,
2374
2458
  __decorate,
2375
2459
  __param,
2460
+ __esDecorate,
2461
+ __runInitializers,
2462
+ __propKey,
2463
+ __setFunctionName,
2376
2464
  __metadata,
2377
2465
  __awaiter,
2378
2466
  __generator,
@@ -2393,6 +2481,9 @@ function __classPrivateFieldIn(state, receiver) {
2393
2481
  __classPrivateFieldGet,
2394
2482
  __classPrivateFieldSet,
2395
2483
  __classPrivateFieldIn,
2484
+ __addDisposableResource,
2485
+ __disposeResources,
2486
+ __rewriteRelativeImportExtension,
2396
2487
  });
2397
2488
 
2398
2489
 
@@ -8544,9 +8635,9 @@ var DefaultSanitizingOption = {
8544
8635
  /**
8545
8636
  * @internal
8546
8637
  */
8547
- function createDomToModelContextForSanitizing(document, defaultFormat, defaultOption, additionalSanitizingOption, domHelper) {
8638
+ function createDomToModelContextForSanitizing(document, defaultFormat, defaultOption, additionalSanitizingOption, domHelper, experimentalFeatures) {
8548
8639
  var sanitizingOption = (0, tslib_1.__assign)((0, tslib_1.__assign)({}, DefaultSanitizingOption), additionalSanitizingOption);
8549
- return (0, roosterjs_content_model_dom_1.createDomToModelContext)((0, tslib_1.__assign)((0, tslib_1.__assign)({ defaultFormat: defaultFormat }, (0, getRootComputedStyleForContext_1.getRootComputedStyleForContext)(document)), { experimentalFeatures: [], editorViewWidth: domHelper === null || domHelper === void 0 ? void 0 : domHelper.getClientWidth() }), defaultOption, {
8640
+ return (0, roosterjs_content_model_dom_1.createDomToModelContext)((0, tslib_1.__assign)((0, tslib_1.__assign)({ defaultFormat: defaultFormat }, (0, getRootComputedStyleForContext_1.getRootComputedStyleForContext)(document)), { experimentalFeatures: experimentalFeatures !== null && experimentalFeatures !== void 0 ? experimentalFeatures : [], editorViewWidth: domHelper === null || domHelper === void 0 ? void 0 : domHelper.getClientWidth() }), defaultOption, {
8550
8641
  processorOverride: {
8551
8642
  '#text': pasteTextProcessor_1.pasteTextProcessor,
8552
8643
  entity: (0, pasteEntityProcessor_1.createPasteEntityProcessor)(sanitizingOption),
@@ -9233,95 +9324,6 @@ function removeCommentsFromHtml(html, marker, endId, startId) {
9233
9324
  }
9234
9325
 
9235
9326
 
9236
- /***/ },
9237
-
9238
- /***/ "./packages/roosterjs-content-model-core/lib/command/paste/createPasteFragment.ts"
9239
- /*!****************************************************************************************!*\
9240
- !*** ./packages/roosterjs-content-model-core/lib/command/paste/createPasteFragment.ts ***!
9241
- \****************************************************************************************/
9242
- (__unused_webpack_module, exports, __webpack_require__) {
9243
-
9244
- "use strict";
9245
-
9246
- Object.defineProperty(exports, "__esModule", ({ value: true }));
9247
- exports.createPasteFragment = void 0;
9248
- var roosterjs_content_model_dom_1 = __webpack_require__(/*! roosterjs-content-model-dom */ "./packages/roosterjs-content-model-dom/lib/index.ts");
9249
- var NBSP_HTML = '\u00A0';
9250
- var ENSP_HTML = '\u2002';
9251
- var TAB_SPACES = 6;
9252
- /**
9253
- * @internal
9254
- */
9255
- function createPasteFragment(document, clipboardData, pasteType, root) {
9256
- if (!clipboardData.text && pasteType === 'asPlainText' && root) {
9257
- clipboardData.text = root.textContent || clipboardData.text;
9258
- }
9259
- var imageDataUri = clipboardData.imageDataUri, text = clipboardData.text;
9260
- var fragment = document.createDocumentFragment();
9261
- if ((pasteType == 'asImage' && imageDataUri) ||
9262
- (pasteType != 'asPlainText' && !text && imageDataUri)) {
9263
- // Paste image
9264
- var img = document.createElement('img');
9265
- img.style.maxWidth = '100%';
9266
- img.src = imageDataUri;
9267
- fragment.appendChild(img);
9268
- }
9269
- else if (pasteType != 'asPlainText' && root) {
9270
- (0, roosterjs_content_model_dom_1.moveChildNodes)(fragment, root);
9271
- }
9272
- else if (text) {
9273
- text.split('\n').forEach(function (line, index, lines) {
9274
- line = line
9275
- .replace(/^ /g, NBSP_HTML)
9276
- .replace(/ $/g, NBSP_HTML)
9277
- .replace(/\r/g, '')
9278
- .replace(/ {2}/g, ' ' + NBSP_HTML);
9279
- if (line.includes('\t')) {
9280
- line = transformTabCharacters(line);
9281
- }
9282
- var textNode = document.createTextNode(line);
9283
- // There are 3 scenarios:
9284
- // 1. Single line: Paste as it is
9285
- // 2. Two lines: Add <br> between the lines
9286
- // 3. 3 or More lines, For first and last line, paste as it is. For middle lines, wrap with DIV, and add BR if it is empty line
9287
- if (lines.length == 2 && index == 0) {
9288
- // 1 of 2 lines scenario, add BR
9289
- fragment.appendChild(textNode);
9290
- fragment.appendChild(document.createElement('br'));
9291
- }
9292
- else if (index > 0 && index < lines.length - 1) {
9293
- // Middle line of >=3 lines scenario, wrap with DIV
9294
- fragment.appendChild((0, roosterjs_content_model_dom_1.wrap)(document, line == '' ? document.createElement('br') : textNode, 'div'));
9295
- }
9296
- else {
9297
- // All others, paste as it is
9298
- fragment.appendChild(textNode);
9299
- }
9300
- });
9301
- }
9302
- return fragment;
9303
- }
9304
- exports.createPasteFragment = createPasteFragment;
9305
- /**
9306
- * Transform \t characters into EN SPACE characters
9307
- * @param input string NOT containing \n characters
9308
- * @example t("\thello", 2) => "&ensp;&ensp;&ensp;&ensp;hello"
9309
- */
9310
- function transformTabCharacters(input, initialOffset) {
9311
- if (initialOffset === void 0) { initialOffset = 0; }
9312
- var line = input;
9313
- var tIndex;
9314
- while ((tIndex = line.indexOf('\t')) != -1) {
9315
- var lineBefore = line.slice(0, tIndex);
9316
- var lineAfter = line.slice(tIndex + 1);
9317
- var tabCount = TAB_SPACES - ((lineBefore.length + initialOffset) % TAB_SPACES);
9318
- var tabStr = Array(tabCount).fill(ENSP_HTML).join('');
9319
- line = lineBefore + tabStr + lineAfter;
9320
- }
9321
- return line;
9322
- }
9323
-
9324
-
9325
9327
  /***/ },
9326
9328
 
9327
9329
  /***/ "./packages/roosterjs-content-model-core/lib/command/paste/generatePasteOptionFromPlugins.ts"
@@ -9388,13 +9390,15 @@ var BlackColor = 'rgb(0,0,0)';
9388
9390
  */
9389
9391
  function mergePasteContent(editor, eventResult, isFirstPaste) {
9390
9392
  var fragment = eventResult.fragment, domToModelOption = eventResult.domToModelOption, customizedMerge = eventResult.customizedMerge, pasteType = eventResult.pasteType, clipboardData = eventResult.clipboardData, containsBlockElements = eventResult.containsBlockElements;
9393
+ var isImageOnly = isImageOnlyFragment(fragment);
9394
+ var shouldScrollCaretIntoView = !isImageOnly;
9391
9395
  editor.formatContentModel(function (model, context) {
9392
9396
  if (!isFirstPaste && clipboardData.modelBeforePaste) {
9393
9397
  var clonedModel = (0, roosterjs_content_model_dom_1.cloneModelForPaste)(clipboardData.modelBeforePaste);
9394
9398
  model.blocks = clonedModel.blocks;
9395
9399
  }
9396
- var domToModelContext = (0, createDomToModelContextForSanitizing_1.createDomToModelContextForSanitizing)(editor.getDocument(), undefined /*defaultFormat*/, editor.getEnvironment().domToModelSettings.customized, domToModelOption, editor.getDOMHelper());
9397
- domToModelContext.segmentFormat = getSegmentFormatForPaste(model, pasteType);
9400
+ var domToModelContext = (0, createDomToModelContextForSanitizing_1.createDomToModelContextForSanitizing)(editor.getDocument(), undefined /*defaultFormat*/, editor.getEnvironment().domToModelSettings.customized, domToModelOption, editor.getDOMHelper(), editor.getExperimentalFeatures());
9401
+ domToModelContext.segmentFormat = getSegmentFormatForPaste(model, pasteType, isImageOnly);
9398
9402
  var pasteModel = (0, roosterjs_content_model_dom_1.domToContentModel)(fragment, domToModelContext);
9399
9403
  var mergeOption = {
9400
9404
  mergeFormat: pasteType == 'mergeFormat' ? 'keepSourceEmphasisFormat' : 'none',
@@ -9413,19 +9417,21 @@ function mergePasteContent(editor, eventResult, isFirstPaste) {
9413
9417
  }, {
9414
9418
  changeSource: roosterjs_content_model_dom_1.ChangeSource.Paste,
9415
9419
  getChangeData: function () { return clipboardData; },
9416
- scrollCaretIntoView: true,
9420
+ scrollCaretIntoView: shouldScrollCaretIntoView,
9417
9421
  apiName: 'paste',
9418
9422
  });
9419
9423
  }
9420
9424
  exports.mergePasteContent = mergePasteContent;
9421
- function getSegmentFormatForPaste(model, pasteType) {
9425
+ function getSegmentFormatForPaste(model, pasteType, isImageOnly) {
9422
9426
  var selectedSegment = (0, roosterjs_content_model_dom_1.getSelectedSegments)(model, true /*includeFormatHolder*/)[0];
9423
9427
  if (selectedSegment) {
9424
9428
  var result = (0, roosterjs_content_model_dom_1.getSegmentTextFormat)(selectedSegment);
9425
- if (pasteType == 'normal') {
9429
+ if (pasteType == 'normal' && !isImageOnly) {
9426
9430
  // When using normal paste (Keep source formatting) set the default text color to black when creating the
9427
9431
  // Model from the clipboard content, so the elements that do not contain any text color in their style
9428
9432
  // Are set to black. Otherwise, These segments would get the selected segments format or the default text set in the content.
9433
+ // Skip this when pasting an image only, since there is no text to apply the default color to, and forcing
9434
+ // black here would incorrectly become the pending format used for text typed right after the pasted image.
9429
9435
  result.textColor = BlackColor;
9430
9436
  }
9431
9437
  return result;
@@ -9454,6 +9460,13 @@ function getLastSegmentFormat(pasteModel) {
9454
9460
  }
9455
9461
  return {};
9456
9462
  }
9463
+ function isImageOnlyFragment(pasteFragment) {
9464
+ var _a;
9465
+ var images = pasteFragment.querySelectorAll('img');
9466
+ return (images.length === 1 &&
9467
+ pasteFragment.childNodes.length === 1 &&
9468
+ ((_a = pasteFragment.textContent) === null || _a === void 0 ? void 0 : _a.trim()) === '');
9469
+ }
9457
9470
 
9458
9471
 
9459
9472
  /***/ },
@@ -9471,7 +9484,6 @@ exports.paste = void 0;
9471
9484
  var cleanHtmlComments_1 = __webpack_require__(/*! ./cleanHtmlComments */ "./packages/roosterjs-content-model-core/lib/command/paste/cleanHtmlComments.ts");
9472
9485
  var roosterjs_content_model_dom_1 = __webpack_require__(/*! roosterjs-content-model-dom */ "./packages/roosterjs-content-model-dom/lib/index.ts");
9473
9486
  var convertInlineCss_1 = __webpack_require__(/*! ../createModelFromHtml/convertInlineCss */ "./packages/roosterjs-content-model-core/lib/command/createModelFromHtml/convertInlineCss.ts");
9474
- var createPasteFragment_1 = __webpack_require__(/*! ./createPasteFragment */ "./packages/roosterjs-content-model-core/lib/command/paste/createPasteFragment.ts");
9475
9487
  var generatePasteOptionFromPlugins_1 = __webpack_require__(/*! ./generatePasteOptionFromPlugins */ "./packages/roosterjs-content-model-core/lib/command/paste/generatePasteOptionFromPlugins.ts");
9476
9488
  var mergePasteContent_1 = __webpack_require__(/*! ./mergePasteContent */ "./packages/roosterjs-content-model-core/lib/command/paste/mergePasteContent.ts");
9477
9489
  var retrieveHtmlInfo_1 = __webpack_require__(/*! ./retrieveHtmlInfo */ "./packages/roosterjs-content-model-core/lib/command/paste/retrieveHtmlInfo.ts");
@@ -9499,13 +9511,13 @@ function paste(editor, clipboardData, pasteTypeOrGetter) {
9499
9511
  clipboardData.rawHtml = (0, cleanHtmlComments_1.cleanHtmlComments)(clipboardData.rawHtml);
9500
9512
  }
9501
9513
  var doc = createDOMFromHtml(clipboardData.rawHtml, domCreator);
9502
- var pasteType = typeof pasteTypeOrGetter == 'function'
9503
- ? pasteTypeOrGetter(doc, clipboardData)
9504
- : pasteTypeOrGetter;
9505
9514
  // 2. Handle HTML from clipboard
9506
9515
  var htmlFromClipboard = (0, retrieveHtmlInfo_1.retrieveHtmlInfo)(doc, clipboardData);
9516
+ var pasteType = typeof pasteTypeOrGetter == 'function'
9517
+ ? pasteTypeOrGetter(doc, clipboardData, editor.getEnvironment(), htmlFromClipboard.metadata)
9518
+ : pasteTypeOrGetter;
9507
9519
  // 3. Create target fragment
9508
- var sourceFragment = (0, createPasteFragment_1.createPasteFragment)(editor.getDocument(), clipboardData, pasteType, (_a = (clipboardData.rawHtml == clipboardData.html
9520
+ var sourceFragment = (0, roosterjs_content_model_dom_1.createPasteFragment)(editor.getDocument(), clipboardData, pasteType, (_a = (clipboardData.rawHtml == clipboardData.html
9509
9521
  ? doc
9510
9522
  : createDOMFromHtml(clipboardData.html, domCreator))) === null || _a === void 0 ? void 0 : _a.body);
9511
9523
  // 4. Trigger BeforePaste event to allow plugins modify the fragment
@@ -10288,7 +10300,7 @@ var formatContentModel = function (core, formatter, options, domToModelOptions)
10288
10300
  try {
10289
10301
  handleImages(core, context);
10290
10302
  selection =
10291
- (_a = core.api.setContentModel(core, model, hasFocus ? undefined : { ignoreSelection: true }, // If editor did not have focus before format, do not set focus after format
10303
+ (_a = core.api.setContentModel(core, model, hasFocus && !(options === null || options === void 0 ? void 0 : options.skipDOMSelection) ? undefined : { ignoreSelection: true }, // If editor did not have focus before format, do not set focus after format
10292
10304
  onNodeCreated)) !== null && _a !== void 0 ? _a : undefined;
10293
10305
  handlePendingFormat(core, context, selection);
10294
10306
  if (scroll && ((selection === null || selection === void 0 ? void 0 : selection.type) == 'range' || (selection === null || selection === void 0 ? void 0 : selection.type) == 'image')) {
@@ -11147,10 +11159,13 @@ function setRangeSelection(core, element, collapse) {
11147
11159
  "use strict";
11148
11160
 
11149
11161
  Object.defineProperty(exports, "__esModule", ({ value: true }));
11150
- exports.setTableCellsStyle = exports.removeTableCellsStyle = void 0;
11162
+ exports.setTableCellsStyle = exports.removeTableCellsStyle = exports.DOM_SELECTION_CSS_KEY = void 0;
11151
11163
  var ensureUniqueId_1 = __webpack_require__(/*! ../setEditorStyle/ensureUniqueId */ "./packages/roosterjs-content-model-core/lib/coreApi/setEditorStyle/ensureUniqueId.ts");
11152
11164
  var roosterjs_content_model_dom_1 = __webpack_require__(/*! roosterjs-content-model-dom */ "./packages/roosterjs-content-model-dom/lib/index.ts");
11153
- var DOM_SELECTION_CSS_KEY = '_DOMSelection';
11165
+ /**
11166
+ * @internal
11167
+ */
11168
+ exports.DOM_SELECTION_CSS_KEY = '_DOMSelection';
11154
11169
  var TABLE_ID = 'table';
11155
11170
  /**
11156
11171
  * @internal
@@ -11158,7 +11173,7 @@ var TABLE_ID = 'table';
11158
11173
  * @param core The EditorCore object
11159
11174
  */
11160
11175
  function removeTableCellsStyle(core) {
11161
- core.api.setEditorStyle(core, DOM_SELECTION_CSS_KEY, '');
11176
+ core.api.setEditorStyle(core, exports.DOM_SELECTION_CSS_KEY, '');
11162
11177
  }
11163
11178
  exports.removeTableCellsStyle = removeTableCellsStyle;
11164
11179
  /**
@@ -11183,7 +11198,7 @@ function setTableCellsStyle(core, table, parsedTable, firstCell, lastCell) {
11183
11198
  lastCell.col == ((_b = (_a = parsedTable[lastCell.row]) === null || _a === void 0 ? void 0 : _a.length) !== null && _b !== void 0 ? _b : 0) - 1
11184
11199
  ? [tableSelector, tableSelector + " *"]
11185
11200
  : buildTableSelectors(parsedTable, tableSelector, table, firstCell, lastCell);
11186
- core.api.setEditorStyle(core, DOM_SELECTION_CSS_KEY, "background-color:" + tableSelectionColor + "!important;", tableSelectors);
11201
+ core.api.setEditorStyle(core, exports.DOM_SELECTION_CSS_KEY, "background-color:" + tableSelectionColor + "!important;", tableSelectors);
11187
11202
  }
11188
11203
  exports.setTableCellsStyle = setTableCellsStyle;
11189
11204
  /**
@@ -11242,16 +11257,19 @@ function buildTableSelectors(parsedTable, tableSelector, table, firstCell, lastC
11242
11257
  "use strict";
11243
11258
 
11244
11259
  Object.defineProperty(exports, "__esModule", ({ value: true }));
11245
- exports.toggleCaret = void 0;
11260
+ exports.toggleCaret = exports.HIDE_CURSOR_CSS_KEY = void 0;
11246
11261
  var CARET_CSS_RULE = 'caret-color: transparent';
11247
- var HIDE_CURSOR_CSS_KEY = '_DOMSelectionHideCursor';
11262
+ /**
11263
+ * @internal
11264
+ */
11265
+ exports.HIDE_CURSOR_CSS_KEY = '_DOMSelectionHideCursor';
11248
11266
  /**
11249
11267
  * @internal Show/Hide caret in editor
11250
11268
  * @param core The editor core
11251
11269
  * @param isHiding True to hide caret, false to show caret
11252
11270
  */
11253
11271
  function toggleCaret(core, isHiding) {
11254
- core.api.setEditorStyle(core, HIDE_CURSOR_CSS_KEY, isHiding ? CARET_CSS_RULE : null);
11272
+ core.api.setEditorStyle(core, exports.HIDE_CURSOR_CSS_KEY, isHiding ? CARET_CSS_RULE : null);
11255
11273
  }
11256
11274
  exports.toggleCaret = toggleCaret;
11257
11275
 
@@ -14483,6 +14501,8 @@ var findTableCellElement_1 = __webpack_require__(/*! ../../coreApi/setDOMSelecti
14483
14501
  var isSingleImageInSelection_1 = __webpack_require__(/*! ./isSingleImageInSelection */ "./packages/roosterjs-content-model-core/lib/corePlugin/selection/isSingleImageInSelection.ts");
14484
14502
  var normalizePos_1 = __webpack_require__(/*! ./normalizePos */ "./packages/roosterjs-content-model-core/lib/corePlugin/selection/normalizePos.ts");
14485
14503
  var roosterjs_content_model_dom_1 = __webpack_require__(/*! roosterjs-content-model-dom */ "./packages/roosterjs-content-model-dom/lib/index.ts");
14504
+ var setTableCellsStyle_1 = __webpack_require__(/*! ../../coreApi/setDOMSelection/setTableCellsStyle */ "./packages/roosterjs-content-model-core/lib/coreApi/setDOMSelection/setTableCellsStyle.ts");
14505
+ var toggleCaret_1 = __webpack_require__(/*! ../../coreApi/setDOMSelection/toggleCaret */ "./packages/roosterjs-content-model-core/lib/coreApi/setDOMSelection/toggleCaret.ts");
14486
14506
  var MouseLeftButton = 0;
14487
14507
  var MouseRightButton = 2;
14488
14508
  var Up = 'ArrowUp';
@@ -14490,6 +14510,7 @@ var Down = 'ArrowDown';
14490
14510
  var Left = 'ArrowLeft';
14491
14511
  var Right = 'ArrowRight';
14492
14512
  var Tab = 'Tab';
14513
+ var F10 = 'F10';
14493
14514
  /**
14494
14515
  * @internal
14495
14516
  */
@@ -14506,8 +14527,8 @@ var SelectionPlugin = /** @class */ (function () {
14506
14527
  this.disposer = null;
14507
14528
  this.logicalRootDisposer = null;
14508
14529
  this.isSafari = false;
14509
- this.isMac = false;
14510
14530
  this.scrollTopCache = 0;
14531
+ this.isInsideSelection = false;
14511
14532
  this.onMouseMove = function (event) {
14512
14533
  var _a, _b, _c;
14513
14534
  if (_this.editor && _this.state.tableSelection) {
@@ -14558,7 +14579,7 @@ var SelectionPlugin = /** @class */ (function () {
14558
14579
  // MacOS will not create a mouseUp event if contextMenu event is not prevent defaulted.
14559
14580
  // Make sure we capture image target even if image is wrapped
14560
14581
  this.getContainedTargetImage = function (event, previousSelection) {
14561
- if (!_this.isMac || !previousSelection || previousSelection.type !== 'image') {
14582
+ if (!previousSelection || previousSelection.type !== 'image') {
14562
14583
  return null;
14563
14584
  }
14564
14585
  var target = event.target;
@@ -14598,11 +14619,11 @@ var SelectionPlugin = /** @class */ (function () {
14598
14619
  if (((_a = _this.editor) === null || _a === void 0 ? void 0 : _a.hasFocus()) && !_this.editor.isInShadowEdit()) {
14599
14620
  var newSelection = _this.editor.getDOMSelection();
14600
14621
  var domHelper = _this.editor.getDOMHelper();
14601
- //If am image selection changed to a wider range due a keyboard event, we should update the selection
14622
+ // If an image selection changed to a wider range due to a keyboard event, we should update the selection
14602
14623
  var range = domHelper.getSelectionRange();
14603
14624
  if (range) {
14604
14625
  var image = (0, isSingleImageInSelection_1.isSingleImageInSelection)(range);
14605
- if ((newSelection === null || newSelection === void 0 ? void 0 : newSelection.type) == 'image' && !image) {
14626
+ if ((newSelection === null || newSelection === void 0 ? void 0 : newSelection.type) == 'image' && !image && !range.collapsed) {
14606
14627
  var sel = (_b = _this.editor.getDocument().defaultView) === null || _b === void 0 ? void 0 : _b.getSelection();
14607
14628
  var isReverted = sel
14608
14629
  ? sel.focusNode != range.endContainer || sel.focusOffset != range.endOffset
@@ -14661,7 +14682,6 @@ var SelectionPlugin = /** @class */ (function () {
14661
14682
  var env = this.editor.getEnvironment();
14662
14683
  var document = this.editor.getDocument();
14663
14684
  this.isSafari = !!env.isSafari;
14664
- this.isMac = !!env.isMac;
14665
14685
  document.addEventListener('selectionchange', this.onSelectionChange);
14666
14686
  if (this.isSafari) {
14667
14687
  this.disposer = this.editor.attachDomEvent({
@@ -14708,6 +14728,10 @@ var SelectionPlugin = /** @class */ (function () {
14708
14728
  this.onKeyDown(this.editor, event.rawEvent);
14709
14729
  break;
14710
14730
  case 'contentChanged':
14731
+ if (event.source == roosterjs_content_model_dom_1.ChangeSource.Drop && this.isInsideSelection) {
14732
+ this.setDOMSelection(null /* DOMSelection */, null /* tableSelection */);
14733
+ this.isInsideSelection = false;
14734
+ }
14711
14735
  this.state.tableSelection = null;
14712
14736
  break;
14713
14737
  case 'scroll':
@@ -14755,14 +14779,22 @@ var SelectionPlugin = /** @class */ (function () {
14755
14779
  return;
14756
14780
  }
14757
14781
  // Table selection
14782
+ var target = rawEvent.target;
14783
+ var tableSelection = target
14784
+ ? this.parseTableSelection(target, target, editor.getDOMHelper())
14785
+ : null;
14786
+ if ((selection === null || selection === void 0 ? void 0 : selection.type) == 'table' &&
14787
+ tableSelection &&
14788
+ this.isInsideTableSelection(selection, tableSelection) &&
14789
+ rawEvent.detail == 1) {
14790
+ this.isInsideSelection = true;
14791
+ this.setTableDragSelection(editor, rawEvent);
14792
+ return;
14793
+ }
14758
14794
  if ((selection === null || selection === void 0 ? void 0 : selection.type) == 'table' && rawEvent.button == MouseLeftButton) {
14759
14795
  this.setDOMSelection(null /*domSelection*/, null /*tableSelection*/);
14760
14796
  }
14761
- var tableSelection;
14762
- var target = rawEvent.target;
14763
- if (target &&
14764
- rawEvent.button == MouseLeftButton &&
14765
- (tableSelection = this.parseTableSelection(target, target, editor.getDOMHelper()))) {
14797
+ if (target && rawEvent.button == MouseLeftButton && tableSelection) {
14766
14798
  this.state.tableSelection = tableSelection;
14767
14799
  if (rawEvent.detail >= 3) {
14768
14800
  var lastCo = (0, findCoordinate_1.findCoordinate)(tableSelection.parsedTable, rawEvent.target, editor.getDOMHelper());
@@ -14782,6 +14814,10 @@ var SelectionPlugin = /** @class */ (function () {
14782
14814
  }
14783
14815
  };
14784
14816
  SelectionPlugin.prototype.onMouseUp = function () {
14817
+ if (this.isInsideSelection) {
14818
+ this.setDOMSelection(null /*domSelection*/, null /*tableSelection*/);
14819
+ this.isInsideSelection = false;
14820
+ }
14785
14821
  this.detachMouseEvent();
14786
14822
  };
14787
14823
  SelectionPlugin.prototype.onKeyDown = function (editor, rawEvent) {
@@ -14814,6 +14850,7 @@ var SelectionPlugin = /** @class */ (function () {
14814
14850
  }
14815
14851
  break;
14816
14852
  case 'range':
14853
+ var image = void 0;
14817
14854
  if (key == Up || key == Down || key == Left || key == Right || key == Tab) {
14818
14855
  var start = selection.range.startContainer;
14819
14856
  this.state.tableSelection = this.parseTableSelection(start, start, editor.getDOMHelper());
@@ -14829,6 +14866,14 @@ var SelectionPlugin = /** @class */ (function () {
14829
14866
  }
14830
14867
  }
14831
14868
  }
14869
+ else if (key == F10 &&
14870
+ rawEvent.shiftKey &&
14871
+ (image = (0, isSingleImageInSelection_1.isSingleImageInSelection)(selection.range))) {
14872
+ this.setDOMSelection({
14873
+ type: 'image',
14874
+ image: image,
14875
+ }, null /* tableSelection */);
14876
+ }
14832
14877
  break;
14833
14878
  case 'table':
14834
14879
  // After a content change event is handled tableSelection state is reset to null
@@ -14967,6 +15012,30 @@ var SelectionPlugin = /** @class */ (function () {
14967
15012
  }
14968
15013
  }
14969
15014
  };
15015
+ SelectionPlugin.prototype.isInsideTableSelection = function (prevSelection, tableSelection) {
15016
+ var selectedCell = tableSelection.firstCo;
15017
+ return (selectedCell.row >= prevSelection.firstRow &&
15018
+ selectedCell.row <= prevSelection.lastRow &&
15019
+ selectedCell.col >= prevSelection.firstColumn &&
15020
+ selectedCell.col <= prevSelection.lastColumn);
15021
+ };
15022
+ SelectionPlugin.prototype.setTableDragSelection = function (editor, rawEvent) {
15023
+ var doc = editor.getDocument();
15024
+ var cell = editor
15025
+ .getDOMHelper()
15026
+ .findClosestElementAncestor(rawEvent.target, 'td,th');
15027
+ if (cell) {
15028
+ // Hide the table cell selection styles (grey cell background applied by
15029
+ // setDOMSelection) and the native selection highlight so that only the
15030
+ // dragged content is visible while dragging. Also restore the caret which
15031
+ // is hidden while a table selection is active.
15032
+ editor.setEditorStyle(setTableCellsStyle_1.DOM_SELECTION_CSS_KEY, null /*cssRule*/);
15033
+ editor.setEditorStyle(toggleCaret_1.HIDE_CURSOR_CSS_KEY, null /*cssRule*/);
15034
+ var range = doc.createRange();
15035
+ range.selectNodeContents(cell);
15036
+ editor.getDOMHelper().setSelectionRange(range);
15037
+ }
15038
+ };
14970
15039
  SelectionPlugin.prototype.getTextOffset = function (editor, range, td, isKeyUp) {
14971
15040
  var doc = editor.getDocument();
14972
15041
  var cursorRect = range
@@ -15972,6 +16041,13 @@ var Editor = /** @class */ (function () {
15972
16041
  Editor.prototype.isExperimentalFeatureEnabled = function (featureName) {
15973
16042
  return this.getCore().experimentalFeatures.indexOf(featureName) >= 0;
15974
16043
  };
16044
+ /**
16045
+ * Get all experimental features enabled in this editor
16046
+ * @returns An array of experimental feature names
16047
+ * */
16048
+ Editor.prototype.getExperimentalFeatures = function () {
16049
+ return this.getCore().experimentalFeatures;
16050
+ };
15975
16051
  /**
15976
16052
  * @returns the current EditorCore object
15977
16053
  * @throws a standard Error if there's no core object
@@ -17203,6 +17279,10 @@ exports.ChangeSource = {
17203
17279
  * Content changed by paste
17204
17280
  */
17205
17281
  Paste: 'Paste',
17282
+ /**
17283
+ * Content changed by auto markdown conversion
17284
+ */
17285
+ AutoMarkdownConversion: 'AutoMarkdownConversion',
17206
17286
  /**
17207
17287
  * Content changed by setContent API
17208
17288
  */
@@ -17244,6 +17324,10 @@ exports.ChangeSource = {
17244
17324
  * Content changed by replace
17245
17325
  */
17246
17326
  Replace: 'Replace',
17327
+ /**
17328
+ * Content changed by dragging content out the editor
17329
+ */
17330
+ DragOutOfEditor: 'DragOutOfEditor',
17247
17331
  };
17248
17332
 
17249
17333
 
@@ -17732,6 +17816,7 @@ exports.defaultProcessorMap = {
17732
17816
  h5: headingProcessor_1.headingProcessor,
17733
17817
  h6: headingProcessor_1.headingProcessor,
17734
17818
  hr: hrProcessor_1.hrProcessor,
17819
+ label: knownElementProcessor_1.knownElementProcessor,
17735
17820
  li: listItemProcessor_1.listItemProcessor,
17736
17821
  ol: listProcessor_1.listProcessor,
17737
17822
  p: pProcessor_1.pProcessor,
@@ -19755,6 +19840,53 @@ function cacheGetEventData(event, key, getter) {
19755
19840
  exports.cacheGetEventData = cacheGetEventData;
19756
19841
 
19757
19842
 
19843
+ /***/ },
19844
+
19845
+ /***/ "./packages/roosterjs-content-model-dom/lib/domUtils/event/createPasteFragment.ts"
19846
+ /*!****************************************************************************************!*\
19847
+ !*** ./packages/roosterjs-content-model-dom/lib/domUtils/event/createPasteFragment.ts ***!
19848
+ \****************************************************************************************/
19849
+ (__unused_webpack_module, exports, __webpack_require__) {
19850
+
19851
+ "use strict";
19852
+
19853
+ Object.defineProperty(exports, "__esModule", ({ value: true }));
19854
+ exports.createPasteFragment = void 0;
19855
+ var moveChildNodes_1 = __webpack_require__(/*! ../moveChildNodes */ "./packages/roosterjs-content-model-dom/lib/domUtils/moveChildNodes.ts");
19856
+ var textToFragment_1 = __webpack_require__(/*! ../textToFragment */ "./packages/roosterjs-content-model-dom/lib/domUtils/textToFragment.ts");
19857
+ /**
19858
+ * Create a document fragment from clipboard content using the specified paste type
19859
+ * @param document The document used to create the fragment
19860
+ * @param clipboardData The clipboard data to convert
19861
+ * @param pasteType The paste type that determines which clipboard content to use
19862
+ * @param root The optional root element containing the parsed HTML content
19863
+ * @returns A document fragment containing the content to paste
19864
+ */
19865
+ function createPasteFragment(document, clipboardData, pasteType, root) {
19866
+ if (!clipboardData.text && pasteType === 'asPlainText' && root) {
19867
+ clipboardData.text = root.textContent || clipboardData.text;
19868
+ }
19869
+ var imageDataUri = clipboardData.imageDataUri, text = clipboardData.text;
19870
+ var fragment = document.createDocumentFragment();
19871
+ if ((pasteType == 'asImage' && imageDataUri) ||
19872
+ (pasteType != 'asPlainText' && !text && imageDataUri)) {
19873
+ // Paste image
19874
+ var img = document.createElement('img');
19875
+ img.style.maxWidth = '100%';
19876
+ img.src = imageDataUri;
19877
+ fragment.appendChild(img);
19878
+ }
19879
+ else if (pasteType != 'asPlainText' && root) {
19880
+ (0, moveChildNodes_1.moveChildNodes)(fragment, root);
19881
+ }
19882
+ else if (text) {
19883
+ return (0, textToFragment_1.textToFragment)(text, document);
19884
+ }
19885
+ return fragment;
19886
+ }
19887
+ exports.createPasteFragment = createPasteFragment;
19888
+
19889
+
19758
19890
  /***/ },
19759
19891
 
19760
19892
  /***/ "./packages/roosterjs-content-model-dom/lib/domUtils/event/eventUtils.ts"
@@ -19931,14 +20063,14 @@ function getNodePositionFromEvent(doc, domHelper, x, y) {
19931
20063
  // Firefox, Chrome, Edge, Safari, Opera
19932
20064
  var pos = doc.caretPositionFromPoint(x, y);
19933
20065
  if (pos && domHelper.isNodeInEditor(pos.offsetNode)) {
19934
- return { node: pos.offsetNode, offset: pos.offset };
20066
+ return normalizePosition(pos.offsetNode, pos.offset);
19935
20067
  }
19936
20068
  }
19937
20069
  if (doc.caretRangeFromPoint) {
19938
20070
  // Safari
19939
20071
  var range = doc.caretRangeFromPoint(x, y);
19940
20072
  if (range && domHelper.isNodeInEditor(range.startContainer)) {
19941
- return { node: range.startContainer, offset: range.startOffset };
20073
+ return normalizePosition(range.startContainer, range.startOffset);
19942
20074
  }
19943
20075
  }
19944
20076
  if (doc.elementFromPoint) {
@@ -19951,6 +20083,14 @@ function getNodePositionFromEvent(doc, domHelper, x, y) {
19951
20083
  return null;
19952
20084
  }
19953
20085
  exports.getNodePositionFromEvent = getNodePositionFromEvent;
20086
+ function normalizePosition(node, offset) {
20087
+ var _a;
20088
+ // Safari hit-testing in tableMoverTest returns offset 1 after the lone BR of an empty block.
20089
+ var normalizedOffset = offset == 1 && node.childNodes.length == 1 && ((_a = node.firstChild) === null || _a === void 0 ? void 0 : _a.nodeName) == 'BR'
20090
+ ? 0
20091
+ : offset;
20092
+ return { node: node, offset: normalizedOffset };
20093
+ }
19954
20094
 
19955
20095
 
19956
20096
  /***/ },
@@ -21253,6 +21393,78 @@ function parseTableCells(table) {
21253
21393
  exports.parseTableCells = parseTableCells;
21254
21394
 
21255
21395
 
21396
+ /***/ },
21397
+
21398
+ /***/ "./packages/roosterjs-content-model-dom/lib/domUtils/textToFragment.ts"
21399
+ /*!*****************************************************************************!*\
21400
+ !*** ./packages/roosterjs-content-model-dom/lib/domUtils/textToFragment.ts ***!
21401
+ \*****************************************************************************/
21402
+ (__unused_webpack_module, exports, __webpack_require__) {
21403
+
21404
+ "use strict";
21405
+
21406
+ Object.defineProperty(exports, "__esModule", ({ value: true }));
21407
+ exports.textToFragment = void 0;
21408
+ var wrap_1 = __webpack_require__(/*! ./wrap */ "./packages/roosterjs-content-model-dom/lib/domUtils/wrap.ts");
21409
+ var NBSP_HTML = '\u00A0';
21410
+ var ENSP_HTML = '\u2002';
21411
+ var TAB_SPACES = 6;
21412
+ /**
21413
+ * @internal
21414
+ */
21415
+ function textToFragment(text, doc) {
21416
+ var fragment = doc.createDocumentFragment();
21417
+ text.split('\n').forEach(function (line, index, lines) {
21418
+ line = line
21419
+ .replace(/^ /g, NBSP_HTML)
21420
+ .replace(/ $/g, NBSP_HTML)
21421
+ .replace(/\r/g, '')
21422
+ .replace(/ {2}/g, ' ' + NBSP_HTML);
21423
+ if (line.includes('\t')) {
21424
+ line = transformTabCharacters(line);
21425
+ }
21426
+ var textNode = doc.createTextNode(line);
21427
+ // There are 3 scenarios:
21428
+ // 1. Single line: Paste as it is
21429
+ // 2. Two lines: Add <br> between the lines
21430
+ // 3. 3 or More lines, For first and last line, paste as it is. For middle lines, wrap with DIV, and add BR if it is empty line
21431
+ if (lines.length == 2 && index == 0) {
21432
+ // 1 of 2 lines scenario, add BR
21433
+ fragment.appendChild(textNode);
21434
+ fragment.appendChild(doc.createElement('br'));
21435
+ }
21436
+ else if (index > 0 && index < lines.length - 1) {
21437
+ // Middle line of >=3 lines scenario, wrap with DIV
21438
+ fragment.appendChild((0, wrap_1.wrap)(doc, line == '' ? doc.createElement('br') : textNode, 'div'));
21439
+ }
21440
+ else {
21441
+ // All others, paste as it is
21442
+ fragment.appendChild(textNode);
21443
+ }
21444
+ });
21445
+ return fragment;
21446
+ }
21447
+ exports.textToFragment = textToFragment;
21448
+ /**
21449
+ * Transform \t characters into EN SPACE characters
21450
+ * @param input string NOT containing \n characters
21451
+ * @example t("\thello", 2) => "&ensp;&ensp;&ensp;&ensp;hello"
21452
+ */
21453
+ function transformTabCharacters(input, initialOffset) {
21454
+ if (initialOffset === void 0) { initialOffset = 0; }
21455
+ var line = input;
21456
+ var tIndex;
21457
+ while ((tIndex = line.indexOf('\t')) != -1) {
21458
+ var lineBefore = line.slice(0, tIndex);
21459
+ var lineAfter = line.slice(tIndex + 1);
21460
+ var tabCount = TAB_SPACES - ((lineBefore.length + initialOffset) % TAB_SPACES);
21461
+ var tabStr = Array(tabCount).fill(ENSP_HTML).join('');
21462
+ line = lineBefore + tabStr + lineAfter;
21463
+ }
21464
+ return line;
21465
+ }
21466
+
21467
+
21256
21468
  /***/ },
21257
21469
 
21258
21470
  /***/ "./packages/roosterjs-content-model-dom/lib/domUtils/toArray.ts"
@@ -23838,8 +24050,8 @@ exports.shouldSetValue = shouldSetValue;
23838
24050
  Object.defineProperty(exports, "__esModule", ({ value: true }));
23839
24051
  exports.createImage = exports.createText = exports.createTableCell = exports.createTable = exports.createSelectionMarker = exports.createParagraph = exports.createFormatContainer = exports.createListItem = exports.createBr = exports.isLinkUndeletable = exports.setLinkUndeletable = exports.scrollRectIntoView = exports.normalizeRect = exports.isWhiteSpacePreserved = exports.reuseCachedElement = exports.findClosestBlockEntityContainer = exports.isBlockEntityContainer = exports.isEntityDelimiter = exports.addDelimiters = exports.generateEntityClassNames = exports.parseEntityFormat = exports.getAllEntityWrappers = exports.findClosestEntityWrapper = exports.isEntityElement = exports.unwrap = exports.wrap = exports.wrapAllChildNodes = exports.moveChildNodes = exports.toArray = exports.getSafeIdSelector = exports.getObjectKeys = exports.isElementOfType = exports.isNodeOfType = exports.hasMetadata = exports.getMetadata = exports.updateMetadata = exports.buildSelectionMarker = exports.isBlockElement = exports.areSameFormats = exports.parseFormat = exports.getRegularSelectionOffsets = exports.formatContainerProcessor = exports.tableProcessor = exports.entityProcessor = exports.processChildNode = exports.handleRegularSelection = exports.childProcessor = exports.contentModelToText = exports.contentModelToDom = exports.domToContentModel = void 0;
23840
24052
  exports.getDOMInsertPointRect = exports.getSelectionRootNode = exports.isBold = exports.createModelToDomConfig = exports.createModelToDomContextWithConfig = exports.createModelToDomContext = exports.createDomToModelConfig = exports.createDomToModelContextWithConfig = exports.createDomToModelContext = exports.defaultGenerateColorKey = exports.parseColor = exports.setColor = exports.getColor = exports.DeprecatedColors = exports.BorderKeys = exports.parseValueWithUnit = exports.getAutoListStyleType = exports.getOrderedListNumberStr = exports.ParagraphFormats = exports.ListFormatsToMove = exports.ListFormatsToKeep = exports.ListFormats = exports.copyFormat = exports.setParagraphNotImplicit = exports.normalizeSegmentFormat = exports.mergeTextSegments = exports.normalizeSingleSegment = exports.isEmpty = exports.addSegment = exports.unwrapBlock = exports.isGeneralSegment = exports.normalizeContentModel = exports.normalizeParagraph = exports.addTextSegment = exports.addLink = exports.addData = exports.addCode = exports.addBlock = exports.mutateSegment = exports.mutateSegments = exports.mutateBlock = exports.createTableRow = exports.createEmptyModel = exports.createListLevel = exports.createDivider = exports.createEntity = exports.createGeneralBlock = exports.createGeneralSegment = exports.createParagraphDecorator = exports.createContentModelDocument = void 0;
23841
- exports.getSegmentTextFormat = exports.getListStyleTypeFromString = exports.retrieveModelFormatState = exports.setTableCellBackgroundColor = exports.MIN_ALLOWED_TABLE_CELL_HEIGHT = exports.MIN_ALLOWED_TABLE_CELL_WIDTH = exports.normalizeTable = exports.setFirstColumnFormatBorders = exports.applyTableFormat = exports.deleteBlock = exports.deleteSegment = exports.deleteSelection = exports.mergeModel = exports.cloneModelForPaste = exports.cloneModel = exports.setSelection = exports.hasSelectionInBlockGroup = exports.hasSelectionInSegment = exports.hasSelectionInBlock = exports.getSelectedCells = exports.getSelectedSegmentsAndParagraphs = exports.getSelectedSegments = exports.getSelectedParagraphs = exports.getOperationalBlocks = exports.getFirstSelectedTable = exports.getFirstSelectedListItem = exports.iterateSelections = exports.isBlockGroupOfType = exports.getRangesByText = exports.getImageState = exports.setImageState = exports.getParagraphMarker = exports.setParagraphMarker = exports.cacheGetEventData = exports.extractClipboardItems = exports.normalizeFontFamily = exports.transformColor = exports.retrieveDocumentMetadata = exports.readFile = exports.parseTableCells = exports.normalizeText = exports.isSpace = exports.isPunctuation = exports.extractBorderValues = exports.combineBorderValue = exports.getNodePositionFromEvent = exports.isCursorMovingKey = exports.isModifierKey = exports.isCharacterValue = exports.trimModelForSelection = void 0;
23842
- exports.EmptySegmentFormat = exports.UnorderedListStyleMap = exports.OrderedListStyleMap = exports.TableBorderFormat = exports.NumberingListType = exports.BulletListType = exports.ChangeSource = exports.ListMetadataDefinition = exports.getListMetadata = exports.updateListMetadata = exports.getTableMetadata = exports.updateTableMetadata = exports.getTableCellMetadata = exports.updateTableCellMetadata = exports.getImageMetadata = exports.updateImageMetadata = exports.runEditSteps = exports.getClosestAncestorBlockGroupIndex = void 0;
24053
+ exports.getListStyleTypeFromString = exports.retrieveModelFormatState = exports.setTableCellBackgroundColor = exports.MIN_ALLOWED_TABLE_CELL_HEIGHT = exports.MIN_ALLOWED_TABLE_CELL_WIDTH = exports.normalizeTable = exports.setFirstColumnFormatBorders = exports.applyTableFormat = exports.deleteBlock = exports.deleteSegment = exports.deleteSelection = exports.mergeModel = exports.cloneModelForPaste = exports.cloneModel = exports.setSelection = exports.hasSelectionInBlockGroup = exports.hasSelectionInSegment = exports.hasSelectionInBlock = exports.getSelectedCells = exports.getSelectedSegmentsAndParagraphs = exports.getSelectedSegments = exports.getSelectedParagraphs = exports.getOperationalBlocks = exports.getFirstSelectedTable = exports.getFirstSelectedListItem = exports.iterateSelections = exports.isBlockGroupOfType = exports.getRangesByText = exports.getImageState = exports.setImageState = exports.getParagraphMarker = exports.setParagraphMarker = exports.cacheGetEventData = exports.createPasteFragment = exports.extractClipboardItems = exports.normalizeFontFamily = exports.transformColor = exports.retrieveDocumentMetadata = exports.readFile = exports.parseTableCells = exports.normalizeText = exports.isSpace = exports.isPunctuation = exports.extractBorderValues = exports.combineBorderValue = exports.getNodePositionFromEvent = exports.isCursorMovingKey = exports.isModifierKey = exports.isCharacterValue = exports.trimModelForSelection = void 0;
24054
+ exports.EmptySegmentFormat = exports.UnorderedListStyleMap = exports.OrderedListStyleMap = exports.TableBorderFormat = exports.NumberingListType = exports.BulletListType = exports.ChangeSource = exports.ListMetadataDefinition = exports.getListMetadata = exports.updateListMetadata = exports.getTableMetadata = exports.updateTableMetadata = exports.getTableCellMetadata = exports.updateTableCellMetadata = exports.getImageMetadata = exports.updateImageMetadata = exports.runEditSteps = exports.getClosestAncestorBlockGroupIndex = exports.getSegmentTextFormat = void 0;
23843
24055
  var domToContentModel_1 = __webpack_require__(/*! ./domToModel/domToContentModel */ "./packages/roosterjs-content-model-dom/lib/domToModel/domToContentModel.ts");
23844
24056
  Object.defineProperty(exports, "domToContentModel", ({ enumerable: true, get: function () { return domToContentModel_1.domToContentModel; } }));
23845
24057
  var contentModelToDom_1 = __webpack_require__(/*! ./modelToDom/contentModelToDom */ "./packages/roosterjs-content-model-dom/lib/modelToDom/contentModelToDom.ts");
@@ -24039,6 +24251,8 @@ var normalizeFontFamily_1 = __webpack_require__(/*! ./domUtils/style/normalizeFo
24039
24251
  Object.defineProperty(exports, "normalizeFontFamily", ({ enumerable: true, get: function () { return normalizeFontFamily_1.normalizeFontFamily; } }));
24040
24252
  var extractClipboardItems_1 = __webpack_require__(/*! ./domUtils/event/extractClipboardItems */ "./packages/roosterjs-content-model-dom/lib/domUtils/event/extractClipboardItems.ts");
24041
24253
  Object.defineProperty(exports, "extractClipboardItems", ({ enumerable: true, get: function () { return extractClipboardItems_1.extractClipboardItems; } }));
24254
+ var createPasteFragment_1 = __webpack_require__(/*! ./domUtils/event/createPasteFragment */ "./packages/roosterjs-content-model-dom/lib/domUtils/event/createPasteFragment.ts");
24255
+ Object.defineProperty(exports, "createPasteFragment", ({ enumerable: true, get: function () { return createPasteFragment_1.createPasteFragment; } }));
24042
24256
  var cacheGetEventData_1 = __webpack_require__(/*! ./domUtils/event/cacheGetEventData */ "./packages/roosterjs-content-model-dom/lib/domUtils/event/cacheGetEventData.ts");
24043
24257
  Object.defineProperty(exports, "cacheGetEventData", ({ enumerable: true, get: function () { return cacheGetEventData_1.cacheGetEventData; } }));
24044
24258
  var paragraphMarker_1 = __webpack_require__(/*! ./domUtils/hiddenProperties/paragraphMarker */ "./packages/roosterjs-content-model-dom/lib/domUtils/hiddenProperties/paragraphMarker.ts");
@@ -26882,6 +27096,7 @@ var tslib_1 = __webpack_require__(/*! tslib */ "./node_modules/tslib/tslib.es6.m
26882
27096
  var addBlock_1 = __webpack_require__(/*! ../common/addBlock */ "./packages/roosterjs-content-model-dom/lib/modelApi/common/addBlock.ts");
26883
27097
  var addSegment_1 = __webpack_require__(/*! ../common/addSegment */ "./packages/roosterjs-content-model-dom/lib/modelApi/common/addSegment.ts");
26884
27098
  var applyTableFormat_1 = __webpack_require__(/*! ./applyTableFormat */ "./packages/roosterjs-content-model-dom/lib/modelApi/editing/applyTableFormat.ts");
27099
+ var createBr_1 = __webpack_require__(/*! ../creators/createBr */ "./packages/roosterjs-content-model-dom/lib/modelApi/creators/createBr.ts");
26885
27100
  var createListItem_1 = __webpack_require__(/*! ../creators/createListItem */ "./packages/roosterjs-content-model-dom/lib/modelApi/creators/createListItem.ts");
26886
27101
  var createParagraph_1 = __webpack_require__(/*! ../creators/createParagraph */ "./packages/roosterjs-content-model-dom/lib/modelApi/creators/createParagraph.ts");
26887
27102
  var createSelectionMarker_1 = __webpack_require__(/*! ../creators/createSelectionMarker */ "./packages/roosterjs-content-model-dom/lib/modelApi/creators/createSelectionMarker.ts");
@@ -26904,11 +27119,14 @@ var KeysOfSegmentFormat = (0, getObjectKeys_1.getObjectKeys)(EmptySegmentFormat_
26904
27119
  * @returns Insert point after merge, or null if there is no insert point
26905
27120
  */
26906
27121
  function mergeModel(target, source, context, options) {
26907
- var _a;
27122
+ var _a, _b;
26908
27123
  var insertPosition = (_a = options === null || options === void 0 ? void 0 : options.insertPosition) !== null && _a !== void 0 ? _a : (0, deleteSelection_1.deleteSelection)(target, [], context).insertPoint;
26909
- var _b = options || {}, addParagraphAfterMergedContent = _b.addParagraphAfterMergedContent, mergeFormat = _b.mergeFormat, mergeTable = _b.mergeTable;
27124
+ var _c = options || {}, addParagraphAfterMergedContent = _c.addParagraphAfterMergedContent, mergeFormat = _c.mergeFormat, mergeParagraphAfterList = _c.mergeParagraphAfterList, mergeTable = _c.mergeTable;
27125
+ if (mergeParagraphAfterList && insertPosition && ((_b = source.blocks[0]) === null || _b === void 0 ? void 0 : _b.blockType) == 'Paragraph') {
27126
+ moveParagraphAfterListIntoList(insertPosition);
27127
+ }
26910
27128
  if (addParagraphAfterMergedContent && !mergeTable) {
26911
- var _c = insertPosition || {}, paragraph = _c.paragraph, marker = _c.marker;
27129
+ var _d = insertPosition || {}, paragraph = _d.paragraph, marker = _d.marker;
26912
27130
  var newPara = (0, createParagraph_1.createParagraph)(false /* isImplicit */, paragraph === null || paragraph === void 0 ? void 0 : paragraph.format, marker === null || marker === void 0 ? void 0 : marker.format);
26913
27131
  (0, addBlock_1.addBlock)(source, newPara);
26914
27132
  }
@@ -26956,6 +27174,22 @@ function mergeModel(target, source, context, options) {
26956
27174
  return insertPosition;
26957
27175
  }
26958
27176
  exports.mergeModel = mergeModel;
27177
+ function moveParagraphAfterListIntoList(insertPosition) {
27178
+ var paragraph = insertPosition.paragraph, path = insertPosition.path;
27179
+ var parent = path[0];
27180
+ var paragraphIndex = parent.blocks.indexOf(paragraph);
27181
+ var previousBlock = parent.blocks[paragraphIndex - 1];
27182
+ if (paragraph.segments.every(function (segment) { return segment.segmentType == 'SelectionMarker' || segment.segmentType == 'Br'; }) &&
27183
+ (previousBlock === null || previousBlock === void 0 ? void 0 : previousBlock.blockType) == 'BlockGroup' &&
27184
+ previousBlock.blockGroupType == 'ListItem') {
27185
+ var newListItem = (0, createListItem_1.createListItem)(previousBlock.levels, previousBlock.formatHolder.format);
27186
+ var paragraphAfterList = (0, createParagraph_1.createParagraph)(false, paragraph.format);
27187
+ (0, addBlock_1.addBlock)(newListItem, paragraph);
27188
+ paragraphAfterList.segments.push((0, createBr_1.createBr)());
27189
+ (0, mutate_1.mutateBlock)(parent).blocks.splice(paragraphIndex, 1, newListItem, paragraphAfterList);
27190
+ path.unshift(newListItem);
27191
+ }
27192
+ }
26959
27193
  function mergeParagraph(markerPosition, newPara, mergeToCurrentParagraph, context, option) {
26960
27194
  var paragraph = markerPosition.paragraph, marker = markerPosition.marker;
26961
27195
  var newParagraph = mergeToCurrentParagraph
@@ -27012,6 +27246,11 @@ function mergeTables(markerPosition, newTable, source) {
27012
27246
  var newTableRowCount = newTable.rows.length;
27013
27247
  var lastTargetColIndex = getTargetColIndex(table, rowIndex, colIndex, newTableColCount);
27014
27248
  var extraColsNeeded = lastTargetColIndex - table.rows[0].cells.length;
27249
+ newTable.rows.forEach(function (row) {
27250
+ row.cells.forEach(function (cell) {
27251
+ cell.spanAbove = false;
27252
+ });
27253
+ });
27015
27254
  if (extraColsNeeded > 0) {
27016
27255
  var currentColCount = table.rows[0].cells.length;
27017
27256
  for (var col = 0; col < extraColsNeeded; col++) {
@@ -31043,9 +31282,9 @@ var MarkdownBlockGroupType = {
31043
31282
  /**
31044
31283
  * @internal
31045
31284
  */
31046
- function createBlockGroupFromMarkdown(text, patternName, options, group) {
31285
+ function createBlockGroupFromMarkdown(text, patternName, options, group, list) {
31047
31286
  if (MarkdownBlockGroupType[patternName] === 'ListItem') {
31048
- return (0, createListFromMarkdown_1.createListFromMarkdown)(text, patternName === 'ordered_list' ? 'OL' : 'UL', options);
31287
+ return (0, createListFromMarkdown_1.createListFromMarkdown)(text, patternName === 'ordered_list' ? 'OL' : 'UL', options, list);
31049
31288
  }
31050
31289
  else {
31051
31290
  return (0, createBlockQuoteFromMarkdown_1.createBlockQuoteFromMarkdown)(text, options, group);
@@ -31133,12 +31372,13 @@ var createParagraphFromMarkdown_1 = __webpack_require__(/*! ./createParagraphFro
31133
31372
  /**
31134
31373
  * @internal
31135
31374
  */
31136
- function createListFromMarkdown(text, listType, options) {
31375
+ function createListFromMarkdown(text, listType, options, list) {
31137
31376
  var marker = text.trim().split(' ')[0];
31138
31377
  var isDummy = isDummyListItem(marker);
31378
+ var startNumber = listType === 'OL' && !list ? parseInt(marker, 10) : undefined;
31139
31379
  var itemText = isDummy ? text : text.trim().substring(marker.length);
31140
31380
  var paragraph = (0, createParagraphFromMarkdown_1.createParagraphFromMarkdown)(itemText.trim(), options);
31141
- var levels = createLevels(text, listType, isDummy, options);
31381
+ var levels = createLevels(text, listType, isDummy, options, startNumber);
31142
31382
  var listModel = (0, roosterjs_content_model_dom_1.createListItem)(levels);
31143
31383
  if (options.direction) {
31144
31384
  listModel.format.direction = options.direction;
@@ -31147,8 +31387,11 @@ function createListFromMarkdown(text, listType, options) {
31147
31387
  return listModel;
31148
31388
  }
31149
31389
  exports.createListFromMarkdown = createListFromMarkdown;
31150
- function createLevels(text, listType, isDummy, options) {
31390
+ function createLevels(text, listType, isDummy, options, startNumberOverride) {
31151
31391
  var level = (0, roosterjs_content_model_dom_1.createListLevel)(listType, options.direction ? { direction: options.direction } : undefined);
31392
+ if (startNumberOverride) {
31393
+ level.format.startNumberOverride = startNumberOverride;
31394
+ }
31152
31395
  if (isDummy) {
31153
31396
  level.format.displayForDummyItem = 'block';
31154
31397
  }
@@ -31437,7 +31680,7 @@ function addMarkdownBlockToModel(model, blockType, markdown, patternName, markdo
31437
31680
  model.blocks.push(divider);
31438
31681
  break;
31439
31682
  case 'BlockGroup':
31440
- var blockGroup = (0, createBlockGroupFromMarkdown_1.createBlockGroupFromMarkdown)(markdown, patternName, options, markdownContext.lastQuote);
31683
+ var blockGroup = (0, createBlockGroupFromMarkdown_1.createBlockGroupFromMarkdown)(markdown, patternName, options, markdownContext.lastQuote, markdownContext.lastList);
31441
31684
  if (!markdownContext.lastQuote) {
31442
31685
  model.blocks.push(blockGroup);
31443
31686
  }
@@ -32280,7 +32523,11 @@ var MarkdownPastePlugin = /** @class */ (function () {
32280
32523
  (0, isPastedContentMarkdown_1.isPastedContentMarkdown)(this.editor, clipboardData) &&
32281
32524
  clipboardData.modelBeforePaste) {
32282
32525
  var modelBeforePaste_1 = (0, roosterjs_content_model_dom_1.cloneModelForPaste)(clipboardData.modelBeforePaste);
32283
- (0, roosterjs_content_model_dom_1.mergeModel)(modelBeforePaste_1, (0, convertMarkdownToContentModel_1.convertMarkdownToContentModel)(clipboardData.text, { emptyLine: 'merge' }));
32526
+ (0, roosterjs_content_model_dom_1.mergeModel)(modelBeforePaste_1, (0, convertMarkdownToContentModel_1.convertMarkdownToContentModel)(clipboardData.text, {
32527
+ emptyLine: 'merge',
32528
+ }), undefined /*context*/, {
32529
+ mergeFormat: 'preferTarget',
32530
+ });
32284
32531
  if (this.options.undoConversion) {
32285
32532
  this.editor.takeSnapshot();
32286
32533
  }
@@ -32289,6 +32536,7 @@ var MarkdownPastePlugin = /** @class */ (function () {
32289
32536
  return true;
32290
32537
  }, {
32291
32538
  apiName: 'MarkdownConversion',
32539
+ changeSource: roosterjs_content_model_dom_1.ChangeSource.AutoMarkdownConversion,
32292
32540
  scrollCaretIntoView: true,
32293
32541
  });
32294
32542
  }
@@ -32333,7 +32581,7 @@ var BlockPatterns = [
32333
32581
  /^\s*>\s.+/,
32334
32582
  /^\s*[\*\-\+]\s.+/,
32335
32583
  /^\s*\d+\.\s.+/,
32336
- /^---+$/,
32584
+ /^---$/,
32337
32585
  /^\s*\|.*\|\s*$/, // table row: "| a | b |"
32338
32586
  ];
32339
32587
  // Inline markdown patterns. The text contains markdown if any of these match anywhere.
@@ -33870,10 +34118,14 @@ exports.CustomReplacePlugin = CustomReplacePlugin;
33870
34118
 
33871
34119
  Object.defineProperty(exports, "__esModule", ({ value: true }));
33872
34120
  exports.DragAndDropPlugin = void 0;
33873
- var handleDroppedContent_1 = __webpack_require__(/*! ./utils/handleDroppedContent */ "./packages/roosterjs-content-model-plugins/lib/dragAndDrop/utils/handleDroppedContent.ts");
34121
+ var handleDroppedExternalContent_1 = __webpack_require__(/*! ./utils/handleDroppedExternalContent */ "./packages/roosterjs-content-model-plugins/lib/dragAndDrop/utils/handleDroppedExternalContent.ts");
34122
+ var handleDroppedInternalContent_1 = __webpack_require__(/*! ./utils/handleDroppedInternalContent */ "./packages/roosterjs-content-model-plugins/lib/dragAndDrop/utils/handleDroppedInternalContent.ts");
34123
+ var roosterjs_content_model_dom_1 = __webpack_require__(/*! roosterjs-content-model-dom */ "./packages/roosterjs-content-model-dom/lib/index.ts");
34124
+ var reorderList_1 = __webpack_require__(/*! ./utils/reorderList */ "./packages/roosterjs-content-model-plugins/lib/dragAndDrop/utils/reorderList.ts");
33874
34125
  var DefaultOptions = {
33875
34126
  forbiddenElements: ['iframe'],
33876
34127
  };
34128
+ var DeleteByDragInputType = 'deleteByDrag';
33877
34129
  /**
33878
34130
  * DragAndDrop plugin, handles ContentChanged event when change source is "Drop"
33879
34131
  * to sanitize dropped content, similar to how PastePlugin sanitizes pasted content.
@@ -33887,7 +34139,7 @@ var DragAndDropPlugin = /** @class */ (function () {
33887
34139
  var _a;
33888
34140
  this.editor = null;
33889
34141
  this.forbiddenElements = [];
33890
- this.isInternalDragging = false;
34142
+ this.internalDrag = false;
33891
34143
  this.disposer = null;
33892
34144
  this.forbiddenElements = (_a = options.forbiddenElements) !== null && _a !== void 0 ? _a : [];
33893
34145
  }
@@ -33908,8 +34160,21 @@ var DragAndDropPlugin = /** @class */ (function () {
33908
34160
  this.editor = editor;
33909
34161
  this.disposer = editor.attachDomEvent({
33910
34162
  dragstart: {
33911
- beforeDispatch: function (_ev) {
33912
- _this.isInternalDragging = true;
34163
+ beforeDispatch: function (ev) {
34164
+ _this.internalDrag = true;
34165
+ if (_this.editor &&
34166
+ _this.editor.isExperimentalFeatureEnabled('HandleDropInternalContent')) {
34167
+ _this.adjustDraggingCursor(_this.editor, ev);
34168
+ }
34169
+ },
34170
+ },
34171
+ beforeinput: {
34172
+ beforeDispatch: function (event) {
34173
+ var ev = event;
34174
+ if (_this.internalDrag) {
34175
+ _this.handleDragOutOfTheEditor(editor, ev);
34176
+ _this.internalDrag = false;
34177
+ }
33913
34178
  },
33914
34179
  },
33915
34180
  });
@@ -33925,8 +34190,8 @@ var DragAndDropPlugin = /** @class */ (function () {
33925
34190
  this.disposer();
33926
34191
  this.disposer = null;
33927
34192
  }
33928
- this.isInternalDragging = false;
33929
34193
  this.forbiddenElements = [];
34194
+ this.internalDrag = false;
33930
34195
  };
33931
34196
  /**
33932
34197
  * Core method for a plugin. Once an event happens in editor, editor will call this
@@ -33935,19 +34200,41 @@ var DragAndDropPlugin = /** @class */ (function () {
33935
34200
  * @param event The event to handle:
33936
34201
  */
33937
34202
  DragAndDropPlugin.prototype.onPluginEvent = function (event) {
33938
- var _a;
33939
34203
  if (this.editor && event.eventType == 'beforeDrop') {
33940
- if (this.isInternalDragging) {
33941
- this.isInternalDragging = false;
34204
+ var dropEvent = event.rawEvent;
34205
+ if (this.internalDrag &&
34206
+ this.editor.isExperimentalFeatureEnabled('HandleDropInternalContent')) {
34207
+ (0, handleDroppedInternalContent_1.handleDroppedInternalContent)(this.editor, dropEvent);
33942
34208
  }
33943
- else {
33944
- var dropEvent = event.rawEvent;
33945
- var html = (_a = dropEvent.dataTransfer) === null || _a === void 0 ? void 0 : _a.getData('text/html');
33946
- if (html) {
33947
- (0, handleDroppedContent_1.handleDroppedContent)(this.editor, dropEvent, html, this.forbiddenElements);
33948
- }
34209
+ else if (!this.internalDrag) {
34210
+ (0, handleDroppedExternalContent_1.handleDroppedExternalContent)(this.editor, dropEvent, this.forbiddenElements);
33949
34211
  }
33950
- return;
34212
+ this.internalDrag = false;
34213
+ }
34214
+ };
34215
+ DragAndDropPlugin.prototype.adjustDraggingCursor = function (editor, dragEvent) {
34216
+ var _a, _b;
34217
+ var selection = editor.getDOMSelection();
34218
+ if ((selection === null || selection === void 0 ? void 0 : selection.type) == 'table') {
34219
+ var doc = (_a = this.editor) === null || _a === void 0 ? void 0 : _a.getDocument();
34220
+ if (doc && dragEvent.dataTransfer) {
34221
+ var ghost_1 = doc.createElement('span');
34222
+ ghost_1.textContent = '|';
34223
+ doc.body.appendChild(ghost_1);
34224
+ dragEvent.dataTransfer.setDragImage(ghost_1, 0, 0);
34225
+ (_b = doc.defaultView) === null || _b === void 0 ? void 0 : _b.requestAnimationFrame(function () { return ghost_1.remove(); });
34226
+ }
34227
+ }
34228
+ };
34229
+ DragAndDropPlugin.prototype.handleDragOutOfTheEditor = function (editor, inputEvent) {
34230
+ if (inputEvent.inputType == DeleteByDragInputType) {
34231
+ inputEvent.preventDefault();
34232
+ editor.formatContentModel(function (model, context) {
34233
+ (0, roosterjs_content_model_dom_1.deleteSelection)(model, [reorderList_1.reorderList], context);
34234
+ return true;
34235
+ }, {
34236
+ changeSource: roosterjs_content_model_dom_1.ChangeSource.DragOutOfEditor,
34237
+ });
33951
34238
  }
33952
34239
  };
33953
34240
  return DragAndDropPlugin;
@@ -34001,47 +34288,186 @@ exports.cleanForbiddenElements = cleanForbiddenElements;
34001
34288
 
34002
34289
  /***/ },
34003
34290
 
34004
- /***/ "./packages/roosterjs-content-model-plugins/lib/dragAndDrop/utils/handleDroppedContent.ts"
34005
- /*!************************************************************************************************!*\
34006
- !*** ./packages/roosterjs-content-model-plugins/lib/dragAndDrop/utils/handleDroppedContent.ts ***!
34007
- \************************************************************************************************/
34291
+ /***/ "./packages/roosterjs-content-model-plugins/lib/dragAndDrop/utils/handleDroppedExternalContent.ts"
34292
+ /*!********************************************************************************************************!*\
34293
+ !*** ./packages/roosterjs-content-model-plugins/lib/dragAndDrop/utils/handleDroppedExternalContent.ts ***!
34294
+ \********************************************************************************************************/
34008
34295
  (__unused_webpack_module, exports, __webpack_require__) {
34009
34296
 
34010
34297
  "use strict";
34011
34298
 
34012
34299
  Object.defineProperty(exports, "__esModule", ({ value: true }));
34013
- exports.handleDroppedContent = void 0;
34300
+ exports.handleDroppedExternalContent = void 0;
34301
+ var tslib_1 = __webpack_require__(/*! tslib */ "./node_modules/tslib/tslib.es6.mjs");
34014
34302
  var cleanForbiddenElements_1 = __webpack_require__(/*! ./cleanForbiddenElements */ "./packages/roosterjs-content-model-plugins/lib/dragAndDrop/utils/cleanForbiddenElements.ts");
34015
34303
  var roosterjs_content_model_dom_1 = __webpack_require__(/*! roosterjs-content-model-dom */ "./packages/roosterjs-content-model-dom/lib/index.ts");
34016
34304
  /**
34017
34305
  * @internal
34018
34306
  * Handle dropped HTML content by inserting it at the drop position
34019
34307
  */
34020
- function handleDroppedContent(editor, event, html, forbiddenElements) {
34308
+ function handleDroppedExternalContent(editor, event, forbiddenElements) {
34309
+ return (0, tslib_1.__awaiter)(this, void 0, void 0, function () {
34310
+ var items, doc, domPosition, droppedModel_1, range;
34311
+ return (0, tslib_1.__generator)(this, function (_a) {
34312
+ switch (_a.label) {
34313
+ case 0:
34314
+ items = getSupportedItems(event.dataTransfer);
34315
+ if (items.length == 0) {
34316
+ return [2 /*return*/];
34317
+ }
34318
+ doc = editor.getDocument();
34319
+ domPosition = (0, roosterjs_content_model_dom_1.getNodePositionFromEvent)(doc, editor.getDOMHelper(), event.x, event.y);
34320
+ if (!domPosition) return [3 /*break*/, 2];
34321
+ event.preventDefault();
34322
+ event.stopPropagation();
34323
+ return [4 /*yield*/, getDroppedModel(editor, items, forbiddenElements)];
34324
+ case 1:
34325
+ droppedModel_1 = _a.sent();
34326
+ if (!droppedModel_1) {
34327
+ return [2 /*return*/];
34328
+ }
34329
+ range = doc.createRange();
34330
+ range.setStart(domPosition.node, domPosition.offset);
34331
+ range.collapse(true);
34332
+ editor.formatContentModel(function (model, context) {
34333
+ (0, roosterjs_content_model_dom_1.mergeModel)(model, droppedModel_1, context, {
34334
+ mergeParagraphAfterList: true,
34335
+ });
34336
+ return true;
34337
+ }, {
34338
+ selectionOverride: {
34339
+ type: 'range',
34340
+ range: range,
34341
+ isReverted: false,
34342
+ },
34343
+ });
34344
+ _a.label = 2;
34345
+ case 2: return [2 /*return*/];
34346
+ }
34347
+ });
34348
+ });
34349
+ }
34350
+ exports.handleDroppedExternalContent = handleDroppedExternalContent;
34351
+ function getDroppedModel(editor, items, forbiddenElements) {
34352
+ return (0, tslib_1.__awaiter)(this, void 0, void 0, function () {
34353
+ var clipboardData, domCreator, doc, fragment;
34354
+ return (0, tslib_1.__generator)(this, function (_a) {
34355
+ switch (_a.label) {
34356
+ case 0: return [4 /*yield*/, (0, roosterjs_content_model_dom_1.extractClipboardItems)(items, undefined)];
34357
+ case 1:
34358
+ clipboardData = _a.sent();
34359
+ domCreator = editor.getDOMCreator();
34360
+ doc = clipboardData.rawHtml ? domCreator.htmlToDOM(clipboardData.rawHtml) : null;
34361
+ if (doc) {
34362
+ (0, cleanForbiddenElements_1.cleanForbiddenElements)(doc, forbiddenElements);
34363
+ }
34364
+ fragment = (0, roosterjs_content_model_dom_1.createPasteFragment)(editor.getDocument(), clipboardData, 'normal', doc === null || doc === void 0 ? void 0 : doc.body);
34365
+ return [2 /*return*/, (0, roosterjs_content_model_dom_1.domToContentModel)(fragment, (0, roosterjs_content_model_dom_1.createDomToModelContext)())];
34366
+ }
34367
+ });
34368
+ });
34369
+ }
34370
+ function getSupportedItems(dataTransfer) {
34371
+ var _a;
34372
+ var result = [];
34373
+ for (var i = 0; i < ((_a = dataTransfer === null || dataTransfer === void 0 ? void 0 : dataTransfer.items.length) !== null && _a !== void 0 ? _a : 0); i++) {
34374
+ var item = dataTransfer.items[i];
34375
+ if ((item.kind == 'string' &&
34376
+ (item.type == 'text/html' ||
34377
+ item.type == 'text/plain' ||
34378
+ item.type == 'text/uri-list')) ||
34379
+ (item.kind == 'file' && item.type.indexOf('image/') == 0)) {
34380
+ result.push(item);
34381
+ }
34382
+ }
34383
+ return result;
34384
+ }
34385
+
34386
+
34387
+ /***/ },
34388
+
34389
+ /***/ "./packages/roosterjs-content-model-plugins/lib/dragAndDrop/utils/handleDroppedInternalContent.ts"
34390
+ /*!********************************************************************************************************!*\
34391
+ !*** ./packages/roosterjs-content-model-plugins/lib/dragAndDrop/utils/handleDroppedInternalContent.ts ***!
34392
+ \********************************************************************************************************/
34393
+ (__unused_webpack_module, exports, __webpack_require__) {
34394
+
34395
+ "use strict";
34396
+
34397
+ Object.defineProperty(exports, "__esModule", ({ value: true }));
34398
+ exports.handleDroppedInternalContent = void 0;
34399
+ var roosterjs_content_model_api_1 = __webpack_require__(/*! roosterjs-content-model-api */ "./packages/roosterjs-content-model-api/lib/index.ts");
34400
+ var roosterjs_content_model_dom_1 = __webpack_require__(/*! roosterjs-content-model-dom */ "./packages/roosterjs-content-model-dom/lib/index.ts");
34401
+ var reorderList_1 = __webpack_require__(/*! ./reorderList */ "./packages/roosterjs-content-model-plugins/lib/dragAndDrop/utils/reorderList.ts");
34402
+ /**
34403
+ * @internal
34404
+ * Handle dropped internal HTML content by inserting it at the drop position
34405
+ */
34406
+ function handleDroppedInternalContent(editor, event) {
34021
34407
  var doc = editor.getDocument();
34022
34408
  var domPosition = (0, roosterjs_content_model_dom_1.getNodePositionFromEvent)(doc, editor.getDOMHelper(), event.x, event.y);
34023
- if (domPosition) {
34409
+ var selection = editor.getDOMSelection();
34410
+ if (domPosition && selection) {
34024
34411
  event.preventDefault();
34025
34412
  event.stopPropagation();
34026
- var range = doc.createRange();
34027
- range.setStart(domPosition.node, domPosition.offset);
34028
- range.collapse(true);
34029
- var parsedHtml = editor.getDOMCreator().htmlToDOM(html);
34030
- (0, cleanForbiddenElements_1.cleanForbiddenElements)(parsedHtml, forbiddenElements);
34031
- var droppedModel_1 = (0, roosterjs_content_model_dom_1.domToContentModel)(parsedHtml.body, (0, roosterjs_content_model_dom_1.createDomToModelContext)());
34032
- editor.formatContentModel(function (model, context) {
34033
- (0, roosterjs_content_model_dom_1.mergeModel)(model, droppedModel_1, context);
34034
- return true;
34035
- }, {
34036
- selectionOverride: {
34037
- type: 'range',
34038
- range: range,
34039
- isReverted: false,
34040
- },
34413
+ (0, roosterjs_content_model_api_1.formatInsertPointWithContentModel)(editor, domPosition, function (model, context, insertPoint) {
34414
+ if (insertPoint) {
34415
+ var cloneModel = (0, roosterjs_content_model_dom_1.cloneModelForPaste)(model);
34416
+ (0, roosterjs_content_model_dom_1.trimModelForSelection)(cloneModel, selection);
34417
+ if (!event.ctrlKey && !event.metaKey) {
34418
+ if ((0, roosterjs_content_model_dom_1.deleteSelection)(model, [reorderList_1.reorderList], context).deleteResult == 'range') {
34419
+ (0, roosterjs_content_model_dom_1.normalizeContentModel)(model);
34420
+ }
34421
+ }
34422
+ var startMarker = (0, roosterjs_content_model_dom_1.createSelectionMarker)(insertPoint.marker.format);
34423
+ var startParagraph = (0, roosterjs_content_model_dom_1.mutateBlock)(insertPoint.paragraph);
34424
+ var startIndex = startParagraph.segments.indexOf(insertPoint.marker);
34425
+ startParagraph.segments.splice(startIndex, 0, startMarker);
34426
+ var newInsertPoint = (0, roosterjs_content_model_dom_1.mergeModel)(model, cloneModel, context, {
34427
+ insertPosition: insertPoint,
34428
+ mergeParagraphAfterList: true,
34429
+ });
34430
+ if (newInsertPoint) {
34431
+ (0, roosterjs_content_model_dom_1.setSelection)(model, startMarker, newInsertPoint.marker);
34432
+ }
34433
+ }
34041
34434
  });
34042
34435
  }
34043
34436
  }
34044
- exports.handleDroppedContent = handleDroppedContent;
34437
+ exports.handleDroppedInternalContent = handleDroppedInternalContent;
34438
+
34439
+
34440
+ /***/ },
34441
+
34442
+ /***/ "./packages/roosterjs-content-model-plugins/lib/dragAndDrop/utils/reorderList.ts"
34443
+ /*!***************************************************************************************!*\
34444
+ !*** ./packages/roosterjs-content-model-plugins/lib/dragAndDrop/utils/reorderList.ts ***!
34445
+ \***************************************************************************************/
34446
+ (__unused_webpack_module, exports, __webpack_require__) {
34447
+
34448
+ "use strict";
34449
+
34450
+ Object.defineProperty(exports, "__esModule", ({ value: true }));
34451
+ exports.reorderList = void 0;
34452
+ var tslib_1 = __webpack_require__(/*! tslib */ "./node_modules/tslib/tslib.es6.mjs");
34453
+ var getListItemFromInsertPoint_1 = __webpack_require__(/*! ../../edit/utils/getListItemFromInsertPoint */ "./packages/roosterjs-content-model-plugins/lib/edit/utils/getListItemFromInsertPoint.ts");
34454
+ var roosterjs_content_model_dom_1 = __webpack_require__(/*! roosterjs-content-model-dom */ "./packages/roosterjs-content-model-dom/lib/index.ts");
34455
+ /**
34456
+ * @internal
34457
+ */
34458
+ var reorderList = function (context) {
34459
+ if (context.deleteResult != 'range') {
34460
+ return;
34461
+ }
34462
+ var paragraph = context.insertPoint.paragraph;
34463
+ var listItemAndParent = (0, getListItemFromInsertPoint_1.getListItemFromInsertPoint)(context.insertPoint);
34464
+ if (listItemAndParent) {
34465
+ var _a = (0, tslib_1.__read)(listItemAndParent, 1), item = _a[0];
34466
+ var mutableList = (0, roosterjs_content_model_dom_1.mutateBlock)(item);
34467
+ mutableList.blocks.splice(mutableList.blocks.indexOf(paragraph), mutableList.blocks.length);
34468
+ }
34469
+ };
34470
+ exports.reorderList = reorderList;
34045
34471
 
34046
34472
 
34047
34473
  /***/ },
@@ -34327,6 +34753,9 @@ var deleteAllSegmentBefore = function (context) {
34327
34753
  context.deleteResult = 'range';
34328
34754
  }
34329
34755
  }
34756
+ if (mutableParagraph.segments.length == 1 && mutableParagraph.segments[0] == marker) {
34757
+ mutableParagraph.segments.push((0, roosterjs_content_model_dom_1.createBr)(marker.format));
34758
+ }
34330
34759
  };
34331
34760
  exports.deleteAllSegmentBefore = deleteAllSegmentBefore;
34332
34761
 
@@ -34542,6 +34971,7 @@ var insertNewLine = function (quote, parent, quoteIndex, paragraph) {
34542
34971
  Object.defineProperty(exports, "__esModule", ({ value: true }));
34543
34972
  exports.deleteList = void 0;
34544
34973
  var tslib_1 = __webpack_require__(/*! tslib */ "./node_modules/tslib/tslib.es6.mjs");
34974
+ var getListItemFromInsertPoint_1 = __webpack_require__(/*! ../utils/getListItemFromInsertPoint */ "./packages/roosterjs-content-model-plugins/lib/edit/utils/getListItemFromInsertPoint.ts");
34545
34975
  var roosterjs_content_model_dom_1 = __webpack_require__(/*! roosterjs-content-model-dom */ "./packages/roosterjs-content-model-dom/lib/index.ts");
34546
34976
  /**
34547
34977
  * @internal
@@ -34551,18 +34981,14 @@ var deleteList = function (context) {
34551
34981
  if (context.deleteResult != 'notDeleted') {
34552
34982
  return;
34553
34983
  }
34554
- var _c = context.insertPoint, paragraph = _c.paragraph, marker = _c.marker, path = _c.path;
34555
- var index = (0, roosterjs_content_model_dom_1.getClosestAncestorBlockGroupIndex)(path, ['ListItem'], ['TableCell', 'FormatContainer']);
34556
- var item = path[index];
34557
- var parent = path[index + 1];
34558
- if ((item === null || item === void 0 ? void 0 : item.blockGroupType) == 'ListItem' &&
34559
- item.levels.length > 0 &&
34560
- paragraph.segments[0] == marker &&
34561
- parent) {
34984
+ var paragraph = context.insertPoint.paragraph;
34985
+ var listItemAndParent = (0, getListItemFromInsertPoint_1.getListItemFromInsertPoint)(context.insertPoint);
34986
+ if (listItemAndParent) {
34987
+ var _c = (0, tslib_1.__read)(listItemAndParent, 2), item = _c[0], parent_1 = _c[1];
34562
34988
  var mutableList = (0, roosterjs_content_model_dom_1.mutateBlock)(item);
34563
34989
  var lastLevel = mutableList.levels[mutableList.levels.length - 1];
34564
- var listItemIndex = parent.blocks.indexOf(item);
34565
- var previousItem = parent.blocks[listItemIndex - 1];
34990
+ var listItemIndex = parent_1.blocks.indexOf(item);
34991
+ var previousItem = parent_1.blocks[listItemIndex - 1];
34566
34992
  // 1. If the last level is dummy, just remove it (legacy behavior)
34567
34993
  // 2. If focus is at the beginning of list item and previous block is a list item with the same level count,
34568
34994
  // merge current list item into previous one
@@ -34578,7 +35004,7 @@ var deleteList = function (context) {
34578
35004
  previousItem.levels.length == mutableList.levels.length) {
34579
35005
  var mutablePreviousItem = (0, roosterjs_content_model_dom_1.mutateBlock)(previousItem);
34580
35006
  (_a = mutablePreviousItem.blocks).push.apply(_a, (0, tslib_1.__spreadArray)([], (0, tslib_1.__read)(mutableList.blocks), false));
34581
- (0, roosterjs_content_model_dom_1.mutateBlock)(parent).blocks.splice(listItemIndex, 1);
35007
+ (0, roosterjs_content_model_dom_1.mutateBlock)(parent_1).blocks.splice(listItemIndex, 1);
34582
35008
  context.deleteResult = 'range';
34583
35009
  }
34584
35010
  else {
@@ -34586,10 +35012,10 @@ var deleteList = function (context) {
34586
35012
  if (mutableList.levels.length > 1) {
34587
35013
  var newListItem = (0, roosterjs_content_model_dom_1.createListItem)(mutableList.levels.slice(0, -1), mutableList.formatHolder.format);
34588
35014
  newListItem.blocks = removedBlocks.map(function (block) { return (0, roosterjs_content_model_dom_1.mutateBlock)(block); });
34589
- (0, roosterjs_content_model_dom_1.mutateBlock)(parent).blocks.splice(listItemIndex + 1, 0, newListItem);
35015
+ (0, roosterjs_content_model_dom_1.mutateBlock)(parent_1).blocks.splice(listItemIndex + 1, 0, newListItem);
34590
35016
  }
34591
35017
  else {
34592
- (_b = (0, roosterjs_content_model_dom_1.mutateBlock)(parent).blocks).splice.apply(_b, (0, tslib_1.__spreadArray)([listItemIndex + 1, 0], (0, tslib_1.__read)(removedBlocks), false));
35018
+ (_b = (0, roosterjs_content_model_dom_1.mutateBlock)(parent_1).blocks).splice.apply(_b, (0, tslib_1.__spreadArray)([listItemIndex + 1, 0], (0, tslib_1.__read)(removedBlocks), false));
34593
35019
  }
34594
35020
  context.deleteResult = 'range';
34595
35021
  }
@@ -35054,6 +35480,11 @@ var handleEnterOnParagraph = function (formatsToPreserveOnMerge) { return functi
35054
35480
  context.deleteResult = 'range';
35055
35481
  context.lastParagraph = newPara;
35056
35482
  context.insertPoint.paragraph = newPara;
35483
+ if (context.formatContext) {
35484
+ context.formatContext.announceData = {
35485
+ defaultStrings: 'newLineInserted',
35486
+ };
35487
+ }
35057
35488
  }
35058
35489
  }; };
35059
35490
  exports.handleEnterOnParagraph = handleEnterOnParagraph;
@@ -35758,6 +36189,37 @@ function getLeafSiblingBlock(path, block, isNext) {
35758
36189
  exports.getLeafSiblingBlock = getLeafSiblingBlock;
35759
36190
 
35760
36191
 
36192
+ /***/ },
36193
+
36194
+ /***/ "./packages/roosterjs-content-model-plugins/lib/edit/utils/getListItemFromInsertPoint.ts"
36195
+ /*!***********************************************************************************************!*\
36196
+ !*** ./packages/roosterjs-content-model-plugins/lib/edit/utils/getListItemFromInsertPoint.ts ***!
36197
+ \***********************************************************************************************/
36198
+ (__unused_webpack_module, exports, __webpack_require__) {
36199
+
36200
+ "use strict";
36201
+
36202
+ Object.defineProperty(exports, "__esModule", ({ value: true }));
36203
+ exports.getListItemFromInsertPoint = void 0;
36204
+ var roosterjs_content_model_dom_1 = __webpack_require__(/*! roosterjs-content-model-dom */ "./packages/roosterjs-content-model-dom/lib/index.ts");
36205
+ /**
36206
+ * @internal
36207
+ */
36208
+ function getListItemFromInsertPoint(insertPoint) {
36209
+ var paragraph = insertPoint.paragraph, marker = insertPoint.marker, path = insertPoint.path;
36210
+ var index = (0, roosterjs_content_model_dom_1.getClosestAncestorBlockGroupIndex)(path, ['ListItem'], ['TableCell', 'FormatContainer']);
36211
+ var item = path[index];
36212
+ var parent = path[index + 1];
36213
+ return (item === null || item === void 0 ? void 0 : item.blockGroupType) == 'ListItem' &&
36214
+ item.levels.length > 0 &&
36215
+ paragraph.segments[0] == marker &&
36216
+ parent
36217
+ ? [item, parent]
36218
+ : null;
36219
+ }
36220
+ exports.getListItemFromInsertPoint = getListItemFromInsertPoint;
36221
+
36222
+
35761
36223
  /***/ },
35762
36224
 
35763
36225
  /***/ "./packages/roosterjs-content-model-plugins/lib/edit/utils/preserveParagraphFormat.ts"
@@ -37115,7 +37577,7 @@ var ImageEditPlugin = /** @class */ (function () {
37115
37577
  if (event.rawEvent.key == 'Enter' && this.isCropMode) {
37116
37578
  event.rawEvent.preventDefault();
37117
37579
  }
37118
- this.applyFormatWithContentModel(editor, this.isCropMode, true /** should selectImage */, false /* isApiOperation */);
37580
+ this.applyFormatWithContentModel(editor, this.isCropMode, false /** should selectImage */, false /* isApiOperation */);
37119
37581
  }
37120
37582
  }
37121
37583
  };
@@ -37155,6 +37617,28 @@ var ImageEditPlugin = /** @class */ (function () {
37155
37617
  var editingImageModel;
37156
37618
  var selection = editor.getDOMSelection();
37157
37619
  var isRTL = false;
37620
+ var formatContentModelOptions = {
37621
+ onNodeCreated: function (model, node) {
37622
+ var _a;
37623
+ if (!isApiOperation &&
37624
+ editingImageModel &&
37625
+ editingImageModel == model &&
37626
+ editingImageModel.format.imageState == findEditingImage_1.EDITING_MARKER &&
37627
+ (0, roosterjs_content_model_dom_1.isNodeOfType)(node, 'ELEMENT_NODE') &&
37628
+ (0, roosterjs_content_model_dom_1.isElementOfType)(node, 'img')) {
37629
+ if (_this.isCropMode) {
37630
+ _this.startCropMode(editor, node, isRTL);
37631
+ }
37632
+ else {
37633
+ (_a = editor.getDocument().defaultView) === null || _a === void 0 ? void 0 : _a.requestAnimationFrame(function () {
37634
+ _this.startRotateAndResize(editor, node, isRTL);
37635
+ });
37636
+ }
37637
+ }
37638
+ },
37639
+ apiName: IMAGE_EDIT_FORMAT_EVENT,
37640
+ skipDOMSelection: false,
37641
+ };
37158
37642
  editor.formatContentModel(function (model, context) {
37159
37643
  var editingImage = (0, getSelectedImage_1.getSelectedImage)(model);
37160
37644
  var previousSelectedImage = isApiOperation
@@ -37213,28 +37697,12 @@ var ImageEditPlugin = /** @class */ (function () {
37213
37697
  _this.imageEditInfo = (0, updateImageEditInfo_1.updateImageEditInfo)(image, selection.image);
37214
37698
  image.format.imageState = 'isEditing';
37215
37699
  });
37700
+ formatContentModelOptions.skipDOMSelection = !isCropMode;
37216
37701
  result = true;
37217
37702
  }
37218
37703
  }
37219
37704
  return result;
37220
- }, {
37221
- onNodeCreated: function (model, node) {
37222
- if (!isApiOperation &&
37223
- editingImageModel &&
37224
- editingImageModel == model &&
37225
- editingImageModel.format.imageState == findEditingImage_1.EDITING_MARKER &&
37226
- (0, roosterjs_content_model_dom_1.isNodeOfType)(node, 'ELEMENT_NODE') &&
37227
- (0, roosterjs_content_model_dom_1.isElementOfType)(node, 'img')) {
37228
- if (isCropMode) {
37229
- _this.startCropMode(editor, node, isRTL);
37230
- }
37231
- else {
37232
- _this.startRotateAndResize(editor, node, isRTL);
37233
- }
37234
- }
37235
- },
37236
- apiName: IMAGE_EDIT_FORMAT_EVENT,
37237
- }, {
37705
+ }, formatContentModelOptions, {
37238
37706
  tryGetFromCache: true,
37239
37707
  });
37240
37708
  };
@@ -38220,7 +38688,6 @@ var createImageCropper_1 = __webpack_require__(/*! ../Cropper/createImageCropper
38220
38688
  var createImageResizer_1 = __webpack_require__(/*! ../Resizer/createImageResizer */ "./packages/roosterjs-content-model-plugins/lib/imageEdit/Resizer/createImageResizer.ts");
38221
38689
  var createImageRotator_1 = __webpack_require__(/*! ../Rotator/createImageRotator */ "./packages/roosterjs-content-model-plugins/lib/imageEdit/Rotator/createImageRotator.ts");
38222
38690
  var roosterjs_content_model_dom_1 = __webpack_require__(/*! roosterjs-content-model-dom */ "./packages/roosterjs-content-model-dom/lib/index.ts");
38223
- var IMAGE_EDIT_SHADOW_ROOT = 'ImageEditShadowRoot';
38224
38691
  /**
38225
38692
  * @internal
38226
38693
  */
@@ -38253,15 +38720,8 @@ var createShadowSpan = function (wrapper, imageSpan, imageWidth, imageHeight) {
38253
38720
  var shadowRoot = imageSpan.attachShadow({
38254
38721
  mode: 'open',
38255
38722
  });
38256
- imageSpan.id = IMAGE_EDIT_SHADOW_ROOT;
38257
- // Pin the shadow host to the original image's box so that wrapping the image does not grow the
38258
- // surrounding line box. Without this, the taller edit wrapper enlarges the line and the browser
38259
- // scrolls the selection back into view, making the editor jump. The wrapper and handles still
38260
- // overflow the host visually because overflow is left visible.
38261
38723
  if (imageWidth > 0 && imageHeight > 0) {
38262
38724
  imageSpan.style.display = 'inline-block';
38263
- imageSpan.style.width = imageWidth + "px";
38264
- imageSpan.style.height = imageHeight + "px";
38265
38725
  imageSpan.style.verticalAlign = 'bottom';
38266
38726
  imageSpan.style.overflow = 'visible';
38267
38727
  }
@@ -38935,7 +39395,7 @@ function getSelectedImageMetadata(editor, image) {
38935
39395
  (0, roosterjs_content_model_dom_1.mutateSegment)(selectedImage.paragraph, selectedImage === null || selectedImage === void 0 ? void 0 : selectedImage.image, function (modelImage) {
38936
39396
  imageMetadata = updateImageEditInfo(modelImage, image);
38937
39397
  });
38938
- return true;
39398
+ return false;
38939
39399
  }
38940
39400
  return false;
38941
39401
  });
@@ -39745,6 +40205,7 @@ var BulletSelector = '* > span > span[style*=mso-special-format]';
39745
40205
  var MsOfficeSpecialFormat = 'mso-special-format';
39746
40206
  var CssStyleKey = 'style';
39747
40207
  var MsoSpecialFormatRegex = /mso-special-format:\s*([^;]*)/;
40208
+ var TableElementTags = new Set(['TABLE', 'THEAD', 'TBODY', 'TFOOT', 'TR', 'TD', 'TH']);
39748
40209
  var clearListItemStyles = function (format) {
39749
40210
  delete format.textAlign;
39750
40211
  delete format.marginLeft;
@@ -39771,7 +40232,9 @@ function processPastedContentFromPowerPoint(event, domCreator) {
39771
40232
  if (style.includes(MsOfficeSpecialFormat) && context.listFormat.levels.length > 0) {
39772
40233
  return;
39773
40234
  }
39774
- var bulletElement = element.querySelector(BulletSelector);
40235
+ var bulletElement = !TableElementTags.has(element.tagName)
40236
+ ? element.querySelector(BulletSelector)
40237
+ : null;
39775
40238
  if (bulletElement) {
39776
40239
  var _c = extractPowerPointListInfo(element, bulletElement), depth = _c.depth, unorderedBulletType = _c.unorderedBulletType, orderedBulletType = _c.orderedBulletType, startNumberOverrideOrBullet_1 = _c.startNumberOverrideOrBullet, isOrderedList = _c.isOrderedList, isNewList_1 = _c.isNewList;
39777
40240
  // Setup the listformat with the metadata extracted from the bullet element
@@ -39792,6 +40255,12 @@ function processPastedContentFromPowerPoint(event, domCreator) {
39792
40255
  }
39793
40256
  clearListItemStyles(listItem.levels[listItem.levels.length - 1].format);
39794
40257
  clearListItemStyles(listItem.format);
40258
+ // When the list is inside a table cell, remove the font size from the
40259
+ // list marker so it does not inherit the list's font size. Otherwise a
40260
+ // large marker may be rendered outside of the table cell.
40261
+ if (element.closest('td,th')) {
40262
+ delete listItem.formatHolder.format.fontSize;
40263
+ }
39795
40264
  });
39796
40265
  }
39797
40266
  else {