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