roosterjs 8.44.0 → 8.44.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/rooster-amd-min.js +1 -1
- package/dist/rooster-amd-min.js.map +1 -1
- package/dist/rooster-amd.d.ts +16 -4
- package/dist/rooster-amd.js +262 -120
- package/dist/rooster-amd.js.map +1 -1
- package/dist/rooster-min.js +1 -1
- package/dist/rooster-min.js.map +1 -1
- package/dist/rooster.d.ts +16 -4
- package/dist/rooster.js +262 -120
- package/dist/rooster.js.map +1 -1
- package/package.json +7 -7
- package/tsconfig.child.tsbuildinfo +1 -1
package/dist/rooster-amd.js
CHANGED
|
@@ -3028,7 +3028,6 @@ function insertImageWithSrc(editor, src, attributes) {
|
|
|
3028
3028
|
return image.setAttribute(attribute, attributes[attribute]);
|
|
3029
3029
|
});
|
|
3030
3030
|
}
|
|
3031
|
-
image.style.maxWidth = '100%';
|
|
3032
3031
|
editor.insertNode(image);
|
|
3033
3032
|
}, 'insertImage');
|
|
3034
3033
|
}
|
|
@@ -4097,12 +4096,21 @@ function editTable(editor, operation) {
|
|
|
4097
4096
|
vtable.writeBack();
|
|
4098
4097
|
editor.transformToDarkColor(vtable.table);
|
|
4099
4098
|
editor.focus();
|
|
4100
|
-
|
|
4101
|
-
|
|
4099
|
+
if (isUndefined(vtable.row) || isUndefined(vtable.col)) {
|
|
4100
|
+
return;
|
|
4101
|
+
}
|
|
4102
|
+
var _a = calculateCellToSelect(operation, vtable.row, vtable.col), newCol = _a.newCol, newRow = _a.newRow;
|
|
4103
|
+
var newTd = vtable.getCell(newRow, newCol).td;
|
|
4104
|
+
if (newTd) {
|
|
4105
|
+
editor.select(newTd, 0 /* Begin */);
|
|
4106
|
+
}
|
|
4102
4107
|
}, 'editTable');
|
|
4103
4108
|
}
|
|
4104
4109
|
}
|
|
4105
4110
|
exports.default = editTable;
|
|
4111
|
+
function isUndefined(n) {
|
|
4112
|
+
return n == undefined;
|
|
4113
|
+
}
|
|
4106
4114
|
function calculateCellToSelect(operation, currentRow, currentCol) {
|
|
4107
4115
|
var newRow = currentRow;
|
|
4108
4116
|
var newCol = currentCol;
|
|
@@ -4128,9 +4136,10 @@ function calculateCellToSelect(operation, currentRow, currentCol) {
|
|
|
4128
4136
|
};
|
|
4129
4137
|
}
|
|
4130
4138
|
function saveTableSelection(editor, vtable) {
|
|
4139
|
+
var _a;
|
|
4131
4140
|
var selection = editor.getSelectionRangeEx();
|
|
4132
4141
|
if (selection && selection.type === 1 /* TableSelection */) {
|
|
4133
|
-
vtable.selection = selection.coordinates;
|
|
4142
|
+
vtable.selection = (_a = selection.coordinates) !== null && _a !== void 0 ? _a : null;
|
|
4134
4143
|
}
|
|
4135
4144
|
}
|
|
4136
4145
|
|
|
@@ -4159,12 +4168,17 @@ function formatTable(editor, format, table) {
|
|
|
4159
4168
|
table = table || editor.getElementAtCursor('TABLE');
|
|
4160
4169
|
if (table) {
|
|
4161
4170
|
(0, formatUndoSnapshot_1.default)(editor, function (start, end) {
|
|
4171
|
+
if (!table) {
|
|
4172
|
+
return;
|
|
4173
|
+
}
|
|
4162
4174
|
var vtable = new roosterjs_editor_dom_1.VTable(table);
|
|
4163
4175
|
vtable.applyFormat(format);
|
|
4164
4176
|
vtable.writeBack();
|
|
4165
4177
|
editor.transformToDarkColor(vtable.table);
|
|
4166
4178
|
editor.focus();
|
|
4167
|
-
|
|
4179
|
+
if (start && end) {
|
|
4180
|
+
editor.select(start, end);
|
|
4181
|
+
}
|
|
4168
4182
|
}, 'formatTable');
|
|
4169
4183
|
}
|
|
4170
4184
|
}
|
|
@@ -4217,7 +4231,7 @@ function insertTable(editor, columns, rows, format) {
|
|
|
4217
4231
|
(0, setBackgroundColor_1.default)(editor, 'transparent');
|
|
4218
4232
|
}
|
|
4219
4233
|
var vtable = new roosterjs_editor_dom_1.VTable(table);
|
|
4220
|
-
vtable.applyFormat(format);
|
|
4234
|
+
vtable.applyFormat(format || {});
|
|
4221
4235
|
vtable.writeBack();
|
|
4222
4236
|
editor.insertNode(table);
|
|
4223
4237
|
editor.runAsync(function (editor) {
|
|
@@ -4293,6 +4307,9 @@ function applyInlineStyle(editor, callback, apiName) {
|
|
|
4293
4307
|
var lastNode;
|
|
4294
4308
|
selection.ranges.forEach(function (range) {
|
|
4295
4309
|
var contentTraverser = editor.getSelectionTraverser(range);
|
|
4310
|
+
if (!contentTraverser) {
|
|
4311
|
+
return;
|
|
4312
|
+
}
|
|
4296
4313
|
var inlineElement = contentTraverser && contentTraverser.currentInlineElement;
|
|
4297
4314
|
while (inlineElement) {
|
|
4298
4315
|
var nextInlineElement = contentTraverser.getNextInlineElement();
|
|
@@ -4391,7 +4408,7 @@ function blockFormat(editor, callback, beforeRunCallback, apiName) {
|
|
|
4391
4408
|
(0, commitListChains_1.default)(editor, chains_1);
|
|
4392
4409
|
}
|
|
4393
4410
|
}
|
|
4394
|
-
if (selection.type == 0 /* Normal */) {
|
|
4411
|
+
if (selection.type == 0 /* Normal */ && start && end) {
|
|
4395
4412
|
editor.select(start, end);
|
|
4396
4413
|
}
|
|
4397
4414
|
else {
|
|
@@ -4440,9 +4457,11 @@ function blockWrap(editor, wrapFunction, beforeRunCallback, apiName) {
|
|
|
4440
4457
|
}
|
|
4441
4458
|
}
|
|
4442
4459
|
while (nodes[0] &&
|
|
4460
|
+
nodes[0].parentNode &&
|
|
4443
4461
|
(0, roosterjs_editor_dom_1.isNodeInRegion)(region, nodes[0].parentNode) &&
|
|
4444
4462
|
nodes.some(function (node) { return (0, roosterjs_editor_dom_1.getTagOfNode)(node) == 'LI'; })) {
|
|
4445
|
-
|
|
4463
|
+
var result = (0, roosterjs_editor_dom_1.splitBalancedNodeRange)(nodes);
|
|
4464
|
+
nodes = result ? [result] : [];
|
|
4446
4465
|
}
|
|
4447
4466
|
wrapFunction(nodes);
|
|
4448
4467
|
}
|
|
@@ -4472,7 +4491,10 @@ var roosterjs_editor_dom_1 = __webpack_require__(/*! roosterjs-editor-dom */ "./
|
|
|
4472
4491
|
*/
|
|
4473
4492
|
function collapseSelectedBlocks(editor, forEachCallback) {
|
|
4474
4493
|
var traverser = editor.getSelectionTraverser();
|
|
4475
|
-
|
|
4494
|
+
if (!traverser) {
|
|
4495
|
+
return;
|
|
4496
|
+
}
|
|
4497
|
+
var block = traverser.currentBlockElement;
|
|
4476
4498
|
var blocks = [];
|
|
4477
4499
|
while (block) {
|
|
4478
4500
|
if (!isEmptyBlockUnderTR(block)) {
|
|
@@ -4520,7 +4542,9 @@ function commitListChains(editor, chains) {
|
|
|
4520
4542
|
var end = range && roosterjs_editor_dom_1.Position.getEnd(range);
|
|
4521
4543
|
var shouldReuseAllAncestorListElements_1 = editor.isFeatureEnabled("ReuseAllAncestorListElements" /* ReuseAllAncestorListElements */);
|
|
4522
4544
|
chains.forEach(function (chain) { return chain.commit(shouldReuseAllAncestorListElements_1); });
|
|
4523
|
-
|
|
4545
|
+
if (start && end) {
|
|
4546
|
+
editor.select(start, end);
|
|
4547
|
+
}
|
|
4524
4548
|
}
|
|
4525
4549
|
}
|
|
4526
4550
|
exports.default = commitListChains;
|
|
@@ -4557,7 +4581,7 @@ var roosterjs_editor_dom_1 = __webpack_require__(/*! roosterjs-editor-dom */ "./
|
|
|
4557
4581
|
*/
|
|
4558
4582
|
function execCommand(editor, command, apiName) {
|
|
4559
4583
|
editor.focus();
|
|
4560
|
-
var formatter = function () { return editor.getDocument().execCommand(command, false,
|
|
4584
|
+
var formatter = function () { return editor.getDocument().execCommand(command, false, undefined); };
|
|
4561
4585
|
var selection = editor.getSelectionRangeEx();
|
|
4562
4586
|
if (selection && selection.areAllCollapsed) {
|
|
4563
4587
|
editor.addUndoSnapshot();
|
|
@@ -4610,9 +4634,11 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
4610
4634
|
* Default value is false.
|
|
4611
4635
|
*/
|
|
4612
4636
|
function formatUndoSnapshot(editor, callback, apiName) {
|
|
4613
|
-
editor.addUndoSnapshot(callback, "Format" /* Format */, undefined /* canUndoByBackspace */, apiName &&
|
|
4614
|
-
|
|
4615
|
-
|
|
4637
|
+
editor.addUndoSnapshot(callback, "Format" /* Format */, undefined /* canUndoByBackspace */, apiName && apiName != ''
|
|
4638
|
+
? {
|
|
4639
|
+
formatApiName: apiName,
|
|
4640
|
+
}
|
|
4641
|
+
: undefined);
|
|
4616
4642
|
}
|
|
4617
4643
|
exports.default = formatUndoSnapshot;
|
|
4618
4644
|
|
|
@@ -4640,6 +4666,9 @@ function normalizeBlockquote(node, quotesHandled) {
|
|
|
4640
4666
|
if ((0, roosterjs_editor_dom_1.safeInstanceOf)(node, 'HTMLElement')) {
|
|
4641
4667
|
var alignment = node.style.textAlign;
|
|
4642
4668
|
var quote = (0, roosterjs_editor_dom_1.findClosestElementAncestor)(node, undefined /* root */, 'blockquote');
|
|
4669
|
+
if (!quote) {
|
|
4670
|
+
return;
|
|
4671
|
+
}
|
|
4643
4672
|
var isNodeRTL = isRTL(node);
|
|
4644
4673
|
if (quotesHandled) {
|
|
4645
4674
|
if (quotesHandled.indexOf(quote) > -1) {
|
|
@@ -4650,17 +4679,17 @@ function normalizeBlockquote(node, quotesHandled) {
|
|
|
4650
4679
|
while (quote) {
|
|
4651
4680
|
if (alignment == 'center') {
|
|
4652
4681
|
if (isNodeRTL) {
|
|
4653
|
-
|
|
4682
|
+
quote.style.removeProperty('marginInlineEnd');
|
|
4654
4683
|
quote.style.marginInlineStart = 'auto';
|
|
4655
4684
|
}
|
|
4656
4685
|
else {
|
|
4657
|
-
|
|
4686
|
+
quote.style.removeProperty('marginInlineStart');
|
|
4658
4687
|
quote.style.marginInlineEnd = 'auto';
|
|
4659
4688
|
}
|
|
4660
4689
|
}
|
|
4661
4690
|
else {
|
|
4662
|
-
|
|
4663
|
-
|
|
4691
|
+
quote.style.removeProperty('marginInlineEnd');
|
|
4692
|
+
quote.style.removeProperty('marginInlineStart');
|
|
4664
4693
|
}
|
|
4665
4694
|
quote = (0, roosterjs_editor_dom_1.findClosestElementAncestor)(quote.parentElement, undefined /* root */, 'blockquote');
|
|
4666
4695
|
}
|
|
@@ -4707,14 +4736,19 @@ var roosterjs_editor_dom_1 = __webpack_require__(/*! roosterjs-editor-dom */ "./
|
|
|
4707
4736
|
* @param apiNameOverride (Optional) Set a new api name, if empty the api name will be 'toggleListType'.
|
|
4708
4737
|
*/
|
|
4709
4738
|
function toggleListType(editor, listType, startNumber, includeSiblingLists, orderedStyle, unorderedStyle, apiNameOverride) {
|
|
4739
|
+
if (startNumber === void 0) { startNumber = 0; }
|
|
4710
4740
|
if (includeSiblingLists === void 0) { includeSiblingLists = true; }
|
|
4711
4741
|
(0, blockFormat_1.default)(editor, function (region, start, end, chains) {
|
|
4712
|
-
var _a;
|
|
4742
|
+
var _a, _b;
|
|
4713
4743
|
var chain = startNumber > 0 && chains.filter(function (chain) { return chain.canAppendAtCursor(startNumber); })[0];
|
|
4714
|
-
var
|
|
4715
|
-
|
|
4744
|
+
var block = (_b = (0, roosterjs_editor_dom_1.getBlockElementAtNode)(region.rootNode, (_a = start === null || start === void 0 ? void 0 : start.node) !== null && _a !== void 0 ? _a : null)) === null || _b === void 0 ? void 0 : _b.collapseToSingleElement();
|
|
4745
|
+
if (!block) {
|
|
4746
|
+
return;
|
|
4747
|
+
}
|
|
4748
|
+
var vList = chain && end && (start === null || start === void 0 ? void 0 : start.equalTo(end))
|
|
4749
|
+
? chain.createVListAtBlock(block, startNumber)
|
|
4716
4750
|
: (0, roosterjs_editor_dom_1.createVListFromRegion)(region, startNumber === 1 ? false : includeSiblingLists);
|
|
4717
|
-
if (vList) {
|
|
4751
|
+
if (vList && start && end) {
|
|
4718
4752
|
vList.changeListType(start, end, listType);
|
|
4719
4753
|
if (editor.isFeatureEnabled("AutoFormatList" /* AutoFormatList */)) {
|
|
4720
4754
|
vList.setListStyleType(orderedStyle, unorderedStyle);
|
|
@@ -8806,7 +8840,6 @@ var roosterjs_editor_dom_1 = __webpack_require__(/*! roosterjs-editor-dom */ "./
|
|
|
8806
8840
|
var DELIMITER_SELECTOR = '.' + "entityDelimiterAfter" /* DELIMITER_AFTER */ + ',.' + "entityDelimiterBefore" /* DELIMITER_BEFORE */;
|
|
8807
8841
|
var ZERO_WIDTH_SPACE = '\u200B';
|
|
8808
8842
|
var INLINE_ENTITY_SELECTOR = 'span' + (0, roosterjs_editor_dom_1.getEntitySelector)();
|
|
8809
|
-
var NBSP = '\u00A0';
|
|
8810
8843
|
function inlineEntityOnPluginEvent(event, editor) {
|
|
8811
8844
|
switch (event.eventType) {
|
|
8812
8845
|
case 7 /* ContentChanged */:
|
|
@@ -8818,7 +8851,14 @@ function inlineEntityOnPluginEvent(event, editor) {
|
|
|
8818
8851
|
normalizeDelimitersInEditor(editor);
|
|
8819
8852
|
break;
|
|
8820
8853
|
case 10 /* BeforePaste */:
|
|
8821
|
-
|
|
8854
|
+
var fragment = event.fragment, sanitizingOption = event.sanitizingOption;
|
|
8855
|
+
addDelimitersIfNeeded(fragment.querySelectorAll(INLINE_ENTITY_SELECTOR));
|
|
8856
|
+
if (sanitizingOption.additionalAllowedCssClasses) {
|
|
8857
|
+
(0, roosterjs_editor_dom_1.arrayPush)(sanitizingOption.additionalAllowedCssClasses, [
|
|
8858
|
+
"entityDelimiterAfter" /* DELIMITER_AFTER */,
|
|
8859
|
+
"entityDelimiterBefore" /* DELIMITER_BEFORE */,
|
|
8860
|
+
]);
|
|
8861
|
+
}
|
|
8822
8862
|
break;
|
|
8823
8863
|
case 8 /* ExtractContentWithDom */:
|
|
8824
8864
|
case 9 /* BeforeCutCopy */:
|
|
@@ -8864,12 +8904,12 @@ function normalizeDelimitersInEditor(editor) {
|
|
|
8864
8904
|
exports.normalizeDelimitersInEditor = normalizeDelimitersInEditor;
|
|
8865
8905
|
function addDelimitersIfNeeded(nodes) {
|
|
8866
8906
|
nodes.forEach(function (node) {
|
|
8867
|
-
if (
|
|
8907
|
+
if (isEntityElement(node)) {
|
|
8868
8908
|
(0, roosterjs_editor_dom_1.addDelimiters)(node);
|
|
8869
8909
|
}
|
|
8870
8910
|
});
|
|
8871
8911
|
}
|
|
8872
|
-
function
|
|
8912
|
+
function isEntityElement(node) {
|
|
8873
8913
|
return !!(node &&
|
|
8874
8914
|
(0, roosterjs_editor_dom_1.safeInstanceOf)(node, 'HTMLElement') &&
|
|
8875
8915
|
isReadOnly((0, roosterjs_editor_dom_1.getEntityFromElement)(node)));
|
|
@@ -8898,13 +8938,14 @@ function removeInvalidDelimiters(nodes) {
|
|
|
8898
8938
|
}
|
|
8899
8939
|
});
|
|
8900
8940
|
}
|
|
8901
|
-
function removeDelimiterAttr(node) {
|
|
8941
|
+
function removeDelimiterAttr(node, checkEntity) {
|
|
8942
|
+
if (checkEntity === void 0) { checkEntity = true; }
|
|
8902
8943
|
if (!node) {
|
|
8903
8944
|
return;
|
|
8904
8945
|
}
|
|
8905
8946
|
var isAfter = node.classList.contains("entityDelimiterAfter" /* DELIMITER_AFTER */);
|
|
8906
8947
|
var entitySibling = isAfter ? node.previousElementSibling : node.nextElementSibling;
|
|
8907
|
-
if (entitySibling &&
|
|
8948
|
+
if (checkEntity && entitySibling && isEntityElement(entitySibling)) {
|
|
8908
8949
|
return;
|
|
8909
8950
|
}
|
|
8910
8951
|
node.classList.remove("entityDelimiterAfter" /* DELIMITER_AFTER */, "entityDelimiterBefore" /* DELIMITER_BEFORE */);
|
|
@@ -8918,31 +8959,34 @@ function removeDelimiterAttr(node) {
|
|
|
8918
8959
|
});
|
|
8919
8960
|
}
|
|
8920
8961
|
function handleCollapsedEnter(editor, delimiter) {
|
|
8962
|
+
var _a;
|
|
8921
8963
|
var isAfter = delimiter.classList.contains("entityDelimiterAfter" /* DELIMITER_AFTER */);
|
|
8922
|
-
var
|
|
8923
|
-
var
|
|
8924
|
-
|
|
8925
|
-
|
|
8926
|
-
positionToUse = new roosterjs_editor_dom_1.Position(sibling, isAfter ? 0 /* Begin */ : -1 /* End */);
|
|
8927
|
-
}
|
|
8928
|
-
else {
|
|
8929
|
-
element = delimiter.insertAdjacentElement(isAfter ? 'afterend' : 'beforebegin', (0, roosterjs_editor_dom_1.createElement)({
|
|
8930
|
-
tag: 'span',
|
|
8931
|
-
children: [NBSP],
|
|
8932
|
-
}, editor.getDocument()));
|
|
8933
|
-
if (!element) {
|
|
8964
|
+
var entity = !isAfter ? delimiter.nextSibling : delimiter.previousSibling;
|
|
8965
|
+
var block = (_a = editor.getBlockElementAtNode(delimiter)) === null || _a === void 0 ? void 0 : _a.getStartNode();
|
|
8966
|
+
editor.runAsync(function () {
|
|
8967
|
+
if (!block) {
|
|
8934
8968
|
return;
|
|
8935
8969
|
}
|
|
8936
|
-
|
|
8937
|
-
|
|
8938
|
-
|
|
8939
|
-
|
|
8940
|
-
|
|
8941
|
-
|
|
8942
|
-
|
|
8943
|
-
|
|
8944
|
-
|
|
8945
|
-
|
|
8970
|
+
var blockToCheck = isAfter ? block.nextSibling : block.previousSibling;
|
|
8971
|
+
if (blockToCheck && (0, roosterjs_editor_dom_1.safeInstanceOf)(blockToCheck, 'HTMLElement')) {
|
|
8972
|
+
var delimiters = blockToCheck.querySelectorAll(DELIMITER_SELECTOR);
|
|
8973
|
+
// Check if the last or first delimiter still contain the delimiter class and remove it.
|
|
8974
|
+
var delimiterToCheck = delimiters.item(isAfter ? 0 : delimiters.length - 1);
|
|
8975
|
+
removeDelimiterAttr(delimiterToCheck);
|
|
8976
|
+
}
|
|
8977
|
+
if (isEntityElement(entity)) {
|
|
8978
|
+
var nextElementSibling = entity.nextElementSibling, previousElementSibling = entity.previousElementSibling;
|
|
8979
|
+
[nextElementSibling, previousElementSibling].forEach(function (el) {
|
|
8980
|
+
// Check if after Enter the ZWS got removed but we still have a element with the class
|
|
8981
|
+
// Remove the attributes of the element if it is invalid now.
|
|
8982
|
+
if (el && (0, roosterjs_editor_dom_1.matchesSelector)(el, DELIMITER_SELECTOR) && !(0, roosterjs_editor_dom_1.getDelimiterFromElement)(el)) {
|
|
8983
|
+
removeDelimiterAttr(el, false /* checkEntity */);
|
|
8984
|
+
}
|
|
8985
|
+
});
|
|
8986
|
+
// Add delimiters to the entity if needed because on Enter we can sometimes lose the ZWS of the element.
|
|
8987
|
+
(0, roosterjs_editor_dom_1.addDelimiters)(entity);
|
|
8988
|
+
}
|
|
8989
|
+
});
|
|
8946
8990
|
}
|
|
8947
8991
|
var getPosition = function (container) {
|
|
8948
8992
|
if (container && (0, roosterjs_editor_dom_1.getDelimiterFromElement)(container)) {
|
|
@@ -11503,7 +11547,7 @@ function insertDelimiter(element, delimiterClass) {
|
|
|
11503
11547
|
var insertPosition = delimiterClass == "entityDelimiterAfter" /* DELIMITER_AFTER */ ? 'afterend' : 'beforebegin';
|
|
11504
11548
|
element.insertAdjacentElement(insertPosition, span);
|
|
11505
11549
|
}
|
|
11506
|
-
return
|
|
11550
|
+
return span;
|
|
11507
11551
|
}
|
|
11508
11552
|
|
|
11509
11553
|
|
|
@@ -21279,6 +21323,7 @@ exports.CursorFeatures = {
|
|
|
21279
21323
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
21280
21324
|
exports.EntityFeatures = void 0;
|
|
21281
21325
|
var roosterjs_editor_dom_1 = __webpack_require__(/*! roosterjs-editor-dom */ "./packages/roosterjs-editor-dom/lib/index.ts");
|
|
21326
|
+
var roosterjs_editor_dom_2 = __webpack_require__(/*! roosterjs-editor-dom */ "./packages/roosterjs-editor-dom/lib/index.ts");
|
|
21282
21327
|
/**
|
|
21283
21328
|
* A content edit feature to trigger EntityOperation event with operation "Click" when user
|
|
21284
21329
|
* clicks on a readonly entity.
|
|
@@ -21302,13 +21347,13 @@ var EscapeFromEntityFeature = {
|
|
|
21302
21347
|
},
|
|
21303
21348
|
};
|
|
21304
21349
|
function cacheGetReadonlyEntityElement(event, editor, operation) {
|
|
21305
|
-
var element = (0,
|
|
21350
|
+
var element = (0, roosterjs_editor_dom_2.cacheGetEventData)(event, 'READONLY_ENTITY_ELEMENT', function () {
|
|
21306
21351
|
var node = event.rawEvent.target;
|
|
21307
|
-
var entityElement = node && editor.getElementAtCursor((0,
|
|
21352
|
+
var entityElement = node && editor.getElementAtCursor((0, roosterjs_editor_dom_2.getEntitySelector)(), node);
|
|
21308
21353
|
return entityElement && !entityElement.isContentEditable ? entityElement : null;
|
|
21309
21354
|
});
|
|
21310
21355
|
if (element && operation !== undefined) {
|
|
21311
|
-
var entity = (0,
|
|
21356
|
+
var entity = (0, roosterjs_editor_dom_2.getEntityFromElement)(element);
|
|
21312
21357
|
if (entity) {
|
|
21313
21358
|
editor.triggerPluginEvent(15 /* EntityOperation */, {
|
|
21314
21359
|
operation: operation,
|
|
@@ -21337,7 +21382,7 @@ var EnterBeforeReadonlyEntityFeature = {
|
|
|
21337
21382
|
if (!range) {
|
|
21338
21383
|
return;
|
|
21339
21384
|
}
|
|
21340
|
-
var node =
|
|
21385
|
+
var node = roosterjs_editor_dom_2.Position.getEnd(range).normalize().node;
|
|
21341
21386
|
var br = editor.getDocument().createElement('BR');
|
|
21342
21387
|
(_a = node.parentNode) === null || _a === void 0 ? void 0 : _a.insertBefore(br, node.nextSibling);
|
|
21343
21388
|
var block = editor.getBlockElementAtNode(node);
|
|
@@ -21379,13 +21424,13 @@ var DeleteBeforeEntityFeature = {
|
|
|
21379
21424
|
},
|
|
21380
21425
|
};
|
|
21381
21426
|
function cacheGetNeighborEntityElement(event, editor, isNext, collapseOnly, operation) {
|
|
21382
|
-
var element = (0,
|
|
21427
|
+
var element = (0, roosterjs_editor_dom_2.cacheGetEventData)(event, 'NEIGHBOR_ENTITY_ELEMENT_' + isNext + '_' + collapseOnly, function () {
|
|
21383
21428
|
var range = editor.getSelectionRange();
|
|
21384
21429
|
if (!range || (collapseOnly && !range.collapsed)) {
|
|
21385
21430
|
return null;
|
|
21386
21431
|
}
|
|
21387
21432
|
range.commonAncestorContainer.normalize();
|
|
21388
|
-
var pos =
|
|
21433
|
+
var pos = roosterjs_editor_dom_2.Position.getEnd(range).normalize();
|
|
21389
21434
|
var isAtBeginOrEnd = pos.offset == 0 || pos.isAtEnd;
|
|
21390
21435
|
var entityNode = null;
|
|
21391
21436
|
if (isAtBeginOrEnd) {
|
|
@@ -21404,12 +21449,12 @@ function cacheGetNeighborEntityElement(event, editor, isNext, collapseOnly, oper
|
|
|
21404
21449
|
node = null;
|
|
21405
21450
|
}
|
|
21406
21451
|
}
|
|
21407
|
-
entityNode = node && editor.getElementAtCursor((0,
|
|
21452
|
+
entityNode = node && editor.getElementAtCursor((0, roosterjs_editor_dom_2.getEntitySelector)(), node);
|
|
21408
21453
|
}
|
|
21409
21454
|
return entityNode;
|
|
21410
21455
|
});
|
|
21411
21456
|
if (element && operation !== undefined) {
|
|
21412
|
-
var entity = (0,
|
|
21457
|
+
var entity = (0, roosterjs_editor_dom_2.getEntityFromElement)(element);
|
|
21413
21458
|
if (entity) {
|
|
21414
21459
|
triggerOperation(entity, editor, operation, event);
|
|
21415
21460
|
}
|
|
@@ -21422,15 +21467,17 @@ function cacheGetNeighborEntityElement(event, editor, isNext, collapseOnly, oper
|
|
|
21422
21467
|
*/
|
|
21423
21468
|
var MoveBetweenDelimitersFeature = {
|
|
21424
21469
|
keys: [39 /* RIGHT */, 37 /* LEFT */],
|
|
21470
|
+
allowFunctionKeys: true,
|
|
21425
21471
|
shouldHandleEvent: function (event, editor) {
|
|
21426
|
-
if (
|
|
21472
|
+
if (event.rawEvent.altKey ||
|
|
21473
|
+
!editor.isFeatureEnabled("InlineEntityReadOnlyDelimiters" /* InlineEntityReadOnlyDelimiters */)) {
|
|
21427
21474
|
return false;
|
|
21428
21475
|
}
|
|
21429
21476
|
var element = editor.getElementAtCursor();
|
|
21430
21477
|
if (!element) {
|
|
21431
21478
|
return false;
|
|
21432
21479
|
}
|
|
21433
|
-
var isRTL = (0,
|
|
21480
|
+
var isRTL = (0, roosterjs_editor_dom_2.getComputedStyle)(element, 'direction') === 'rtl';
|
|
21434
21481
|
var shouldCheckBefore = isRTL == (event.rawEvent.which === 37 /* LEFT */);
|
|
21435
21482
|
return getIsDelimiterAtCursor(event, editor, shouldCheckBefore);
|
|
21436
21483
|
},
|
|
@@ -21440,8 +21487,8 @@ var MoveBetweenDelimitersFeature = {
|
|
|
21440
21487
|
if (!delimiter) {
|
|
21441
21488
|
return;
|
|
21442
21489
|
}
|
|
21443
|
-
var _a = getRelatedElements(delimiter, checkBefore), delimiterPair = _a.delimiterPair, entity = _a.entity;
|
|
21444
|
-
if (delimiterPair && entity && (0,
|
|
21490
|
+
var _a = getRelatedElements(delimiter, checkBefore, editor), delimiterPair = _a.delimiterPair, entity = _a.entity;
|
|
21491
|
+
if (delimiterPair && entity && (0, roosterjs_editor_dom_2.matchesSelector)(entity, (0, roosterjs_editor_dom_2.getEntitySelector)())) {
|
|
21445
21492
|
event.rawEvent.preventDefault();
|
|
21446
21493
|
editor.runAsync(function () {
|
|
21447
21494
|
var positionType = checkBefore
|
|
@@ -21449,7 +21496,7 @@ var MoveBetweenDelimitersFeature = {
|
|
|
21449
21496
|
? -3 /* After */
|
|
21450
21497
|
: -1 /* End */
|
|
21451
21498
|
: -2 /* Before */;
|
|
21452
|
-
var position = new
|
|
21499
|
+
var position = new roosterjs_editor_dom_2.Position(delimiterPair, positionType);
|
|
21453
21500
|
if (event.rawEvent.shiftKey) {
|
|
21454
21501
|
var selection = delimiterPair.ownerDocument.getSelection();
|
|
21455
21502
|
selection === null || selection === void 0 ? void 0 : selection.extend(position.node, position.offset);
|
|
@@ -21503,51 +21550,65 @@ function getIsDelimiterAtCursor(event, editor, checkBefore) {
|
|
|
21503
21550
|
: position.node == position.element
|
|
21504
21551
|
? position.element.childNodes.item(position.offset)
|
|
21505
21552
|
: position.element;
|
|
21506
|
-
var searcher = editor.getContentSearcherOfCursor(event);
|
|
21507
21553
|
var data = checkBefore
|
|
21508
21554
|
? {
|
|
21509
21555
|
class: "entityDelimiterBefore" /* DELIMITER_BEFORE */,
|
|
21510
21556
|
pairClass: "entityDelimiterAfter" /* DELIMITER_AFTER */,
|
|
21511
|
-
getDelimiterPair: function (element) { var _a; return (_a = element.nextElementSibling) === null || _a === void 0 ? void 0 : _a.nextElementSibling; },
|
|
21512
|
-
getNextSibling: function () {
|
|
21513
|
-
var _a;
|
|
21514
|
-
return (_a = searcher === null || searcher === void 0 ? void 0 : searcher.getInlineElementAfter()) === null || _a === void 0 ? void 0 : _a.getContainerNode();
|
|
21515
|
-
},
|
|
21516
21557
|
isAtEndOrBeginning: position.isAtEnd,
|
|
21517
21558
|
}
|
|
21518
21559
|
: {
|
|
21519
21560
|
class: "entityDelimiterAfter" /* DELIMITER_AFTER */,
|
|
21520
21561
|
pairClass: "entityDelimiterBefore" /* DELIMITER_BEFORE */,
|
|
21521
|
-
getDelimiterPair: function (element) { var _a; return (_a = element.previousElementSibling) === null || _a === void 0 ? void 0 : _a.previousElementSibling; },
|
|
21522
|
-
getNextSibling: function () {
|
|
21523
|
-
var _a;
|
|
21524
|
-
return (_a = searcher === null || searcher === void 0 ? void 0 : searcher.getInlineElementBefore()) === null || _a === void 0 ? void 0 : _a.getContainerNode();
|
|
21525
|
-
},
|
|
21526
21562
|
isAtEndOrBeginning: position.offset == 0,
|
|
21527
21563
|
};
|
|
21528
|
-
var sibling =
|
|
21564
|
+
var sibling = getNextSibling(editor, focusedElement, checkBefore);
|
|
21529
21565
|
if (data.isAtEndOrBeginning && sibling) {
|
|
21530
21566
|
var elAtCursor = editor.getElementAtCursor('.' + data.class, sibling);
|
|
21531
21567
|
if (elAtCursor && !!shouldHandle(elAtCursor)) {
|
|
21532
21568
|
return true;
|
|
21533
21569
|
}
|
|
21534
21570
|
}
|
|
21535
|
-
var entityAtCursor = editor.getElementAtCursor('.' + data.class, focusedElement);
|
|
21571
|
+
var entityAtCursor = focusedElement && editor.getElementAtCursor('.' + data.class, focusedElement);
|
|
21536
21572
|
return !!shouldHandle(entityAtCursor);
|
|
21537
21573
|
function shouldHandle(element) {
|
|
21538
|
-
|
|
21539
|
-
|
|
21540
|
-
|
|
21574
|
+
if (!element) {
|
|
21575
|
+
return false;
|
|
21576
|
+
}
|
|
21577
|
+
var delimiterPair = getRelatedElements(element, checkBefore, editor).delimiterPair;
|
|
21578
|
+
return (delimiterPair &&
|
|
21579
|
+
(delimiterPair.className || '').indexOf(data.pairClass) > -1 &&
|
|
21541
21580
|
cacheDelimiter(event, checkBefore, element));
|
|
21542
21581
|
}
|
|
21543
21582
|
}
|
|
21583
|
+
function getNextSibling(editor, element, checkBefore) {
|
|
21584
|
+
var traverser = getBlockTraverser(editor, element);
|
|
21585
|
+
if (!traverser) {
|
|
21586
|
+
return undefined;
|
|
21587
|
+
}
|
|
21588
|
+
var traverseFn = function (t) {
|
|
21589
|
+
return checkBefore ? t.getNextInlineElement() : t.getPreviousInlineElement();
|
|
21590
|
+
};
|
|
21591
|
+
var currentInline = traverser.currentInlineElement;
|
|
21592
|
+
while (currentInline && currentInline.getContainerNode() === element) {
|
|
21593
|
+
currentInline = traverseFn(traverser);
|
|
21594
|
+
}
|
|
21595
|
+
return currentInline === null || currentInline === void 0 ? void 0 : currentInline.getContainerNode();
|
|
21596
|
+
}
|
|
21597
|
+
function getBlockTraverser(editor, element) {
|
|
21598
|
+
var _a;
|
|
21599
|
+
if (!element) {
|
|
21600
|
+
return undefined;
|
|
21601
|
+
}
|
|
21602
|
+
var blockElement = (_a = editor.getBlockElementAtNode(element)) === null || _a === void 0 ? void 0 : _a.getStartNode();
|
|
21603
|
+
return blockElement ? roosterjs_editor_dom_1.ContentTraverser.createBodyTraverser(blockElement, element) : undefined;
|
|
21604
|
+
}
|
|
21544
21605
|
function cacheDelimiter(event, checkBefore, delimiter) {
|
|
21545
|
-
return (0,
|
|
21606
|
+
return (0, roosterjs_editor_dom_2.cacheGetEventData)(event, 'delimiter_cache_key_' + checkBefore, function () { return delimiter; });
|
|
21546
21607
|
}
|
|
21547
21608
|
function cacheEntityBetweenDelimiter(event, editor, checkBefore, entity, operation) {
|
|
21548
|
-
var element = (0,
|
|
21609
|
+
var element = (0, roosterjs_editor_dom_2.cacheGetEventData)(event, 'entity_delimiter_cache_key_' + checkBefore, function () { return entity && editor.getElementAtCursor((0, roosterjs_editor_dom_2.getEntitySelector)(), entity); });
|
|
21549
21610
|
if (element && operation !== undefined) {
|
|
21550
|
-
var entity_1 = (0,
|
|
21611
|
+
var entity_1 = (0, roosterjs_editor_dom_2.getEntityFromElement)(element);
|
|
21551
21612
|
if (entity_1) {
|
|
21552
21613
|
triggerOperation(entity_1, editor, operation, event);
|
|
21553
21614
|
}
|
|
@@ -21562,7 +21623,7 @@ function triggerOperation(entity, editor, operation, event) {
|
|
|
21562
21623
|
entity: entity,
|
|
21563
21624
|
});
|
|
21564
21625
|
if (entity.isReadonly &&
|
|
21565
|
-
!(0,
|
|
21626
|
+
!(0, roosterjs_editor_dom_2.isBlockElement)(entity.wrapper) &&
|
|
21566
21627
|
editor.isFeatureEnabled("InlineEntityReadOnlyDelimiters" /* InlineEntityReadOnlyDelimiters */)) {
|
|
21567
21628
|
if (event.rawEvent.defaultPrevented) {
|
|
21568
21629
|
editor.runAsync(function () {
|
|
@@ -21570,41 +21631,58 @@ function triggerOperation(entity, editor, operation, event) {
|
|
|
21570
21631
|
removeDelimiters(nextElementSibling, previousElementSibling);
|
|
21571
21632
|
}
|
|
21572
21633
|
else {
|
|
21573
|
-
var delimiterAfter = (0,
|
|
21634
|
+
var delimiterAfter = (0, roosterjs_editor_dom_2.addDelimiters)(entity.wrapper)[0];
|
|
21574
21635
|
if (delimiterAfter) {
|
|
21575
21636
|
editor.select(delimiterAfter, -3 /* After */);
|
|
21576
21637
|
}
|
|
21577
21638
|
}
|
|
21578
21639
|
});
|
|
21579
21640
|
}
|
|
21580
|
-
else if ((0,
|
|
21581
|
-
(0,
|
|
21582
|
-
editor.select((0,
|
|
21641
|
+
else if ((0, roosterjs_editor_dom_2.getDelimiterFromElement)(nextElementSibling) &&
|
|
21642
|
+
(0, roosterjs_editor_dom_2.getDelimiterFromElement)(previousElementSibling)) {
|
|
21643
|
+
editor.select((0, roosterjs_editor_dom_2.createRange)(previousElementSibling, nextElementSibling));
|
|
21583
21644
|
}
|
|
21584
21645
|
}
|
|
21585
21646
|
}
|
|
21586
21647
|
function removeDelimiters(nextElementSibling, previousElementSibling) {
|
|
21587
21648
|
[nextElementSibling, previousElementSibling].forEach(function (sibling) {
|
|
21588
21649
|
var _a;
|
|
21589
|
-
if ((0,
|
|
21650
|
+
if ((0, roosterjs_editor_dom_2.getDelimiterFromElement)(sibling)) {
|
|
21590
21651
|
(_a = sibling === null || sibling === void 0 ? void 0 : sibling.parentElement) === null || _a === void 0 ? void 0 : _a.removeChild(sibling);
|
|
21591
21652
|
}
|
|
21592
21653
|
});
|
|
21593
21654
|
}
|
|
21594
21655
|
function cacheGetCheckBefore(event, checkBefore) {
|
|
21595
|
-
return !!(0,
|
|
21656
|
+
return !!(0, roosterjs_editor_dom_2.cacheGetEventData)(event, 'Check_Before', function () { return checkBefore; });
|
|
21596
21657
|
}
|
|
21597
|
-
function getRelatedElements(delimiter, checkBefore) {
|
|
21598
|
-
var
|
|
21599
|
-
var
|
|
21600
|
-
var
|
|
21601
|
-
if (
|
|
21602
|
-
entity
|
|
21603
|
-
delimiterPair = (_a = entity === null || entity === void 0 ? void 0 : entity.nextElementSibling) !== null && _a !== void 0 ? _a : null;
|
|
21658
|
+
function getRelatedElements(delimiter, checkBefore, editor) {
|
|
21659
|
+
var entity = null;
|
|
21660
|
+
var delimiterPair = null;
|
|
21661
|
+
var traverser = getBlockTraverser(editor, delimiter);
|
|
21662
|
+
if (!traverser) {
|
|
21663
|
+
return { delimiterPair: delimiterPair, entity: entity };
|
|
21604
21664
|
}
|
|
21605
|
-
|
|
21606
|
-
|
|
21607
|
-
|
|
21665
|
+
var selector = "." + (checkBefore ? "entityDelimiterAfter" /* DELIMITER_AFTER */ : "entityDelimiterBefore" /* DELIMITER_BEFORE */);
|
|
21666
|
+
var traverseFn = function (t) {
|
|
21667
|
+
return checkBefore ? t.getNextInlineElement() : t.getPreviousInlineElement();
|
|
21668
|
+
};
|
|
21669
|
+
var getElementFromInline = function (element, selector) {
|
|
21670
|
+
var _a;
|
|
21671
|
+
var node = element === null || element === void 0 ? void 0 : element.getContainerNode();
|
|
21672
|
+
return (_a = (node && editor.getElementAtCursor(selector, node))) !== null && _a !== void 0 ? _a : null;
|
|
21673
|
+
};
|
|
21674
|
+
var entitySelector = (0, roosterjs_editor_dom_2.getEntitySelector)();
|
|
21675
|
+
var current = traverser.currentInlineElement;
|
|
21676
|
+
while (current && (!entity || !delimiterPair)) {
|
|
21677
|
+
entity = entity || getElementFromInline(current, entitySelector);
|
|
21678
|
+
delimiterPair = delimiterPair || getElementFromInline(current, selector);
|
|
21679
|
+
// If we found the entity but the next inline after the entity is not a delimiter,
|
|
21680
|
+
// it means that the delimiter pair got removed or is invalid, return null instead.
|
|
21681
|
+
if (entity && !delimiterPair && !getElementFromInline(current, entitySelector)) {
|
|
21682
|
+
delimiterPair = null;
|
|
21683
|
+
break;
|
|
21684
|
+
}
|
|
21685
|
+
current = traverseFn(traverser);
|
|
21608
21686
|
}
|
|
21609
21687
|
return { entity: entity, delimiterPair: delimiterPair };
|
|
21610
21688
|
}
|
|
@@ -21664,21 +21742,19 @@ var handleIndentationEvent = function (indenting) { return function (event, edit
|
|
|
21664
21742
|
* IndentWhenTab edit feature, provides the ability to indent current list when user press TAB
|
|
21665
21743
|
*/
|
|
21666
21744
|
var IndentWhenTab = {
|
|
21667
|
-
keys: [9 /* TAB */, 39 /* RIGHT */],
|
|
21745
|
+
keys: roosterjs_editor_dom_1.Browser.isMac ? [9 /* TAB */] : [9 /* TAB */, 39 /* RIGHT */],
|
|
21668
21746
|
shouldHandleEvent: shouldHandleIndentationEvent(true),
|
|
21669
21747
|
handleEvent: handleIndentationEvent(true),
|
|
21670
21748
|
allowFunctionKeys: true,
|
|
21671
|
-
defaultDisabled: roosterjs_editor_dom_1.Browser.isMac,
|
|
21672
21749
|
};
|
|
21673
21750
|
/**
|
|
21674
21751
|
* OutdentWhenShiftTab edit feature, provides the ability to outdent current list when user press Shift+TAB
|
|
21675
21752
|
*/
|
|
21676
21753
|
var OutdentWhenShiftTab = {
|
|
21677
|
-
keys: [9 /* TAB */, 37 /* LEFT */],
|
|
21754
|
+
keys: roosterjs_editor_dom_1.Browser.isMac ? [9 /* TAB */] : [9 /* TAB */, 37 /* LEFT */],
|
|
21678
21755
|
shouldHandleEvent: shouldHandleIndentationEvent(false),
|
|
21679
21756
|
handleEvent: handleIndentationEvent(false),
|
|
21680
21757
|
allowFunctionKeys: true,
|
|
21681
|
-
defaultDisabled: roosterjs_editor_dom_1.Browser.isMac,
|
|
21682
21758
|
};
|
|
21683
21759
|
/**
|
|
21684
21760
|
* MergeInNewLine edit feature, provides the ability to merge current line into a new line when user press
|
|
@@ -23832,12 +23908,8 @@ var ImageEdit = /** @class */ (function () {
|
|
|
23832
23908
|
* Remove the temp wrapper of the image
|
|
23833
23909
|
*/
|
|
23834
23910
|
this.removeWrapper = function () {
|
|
23835
|
-
if (_this.
|
|
23836
|
-
_this.
|
|
23837
|
-
_this.image.parentNode &&
|
|
23838
|
-
_this.editor.contains(_this.image) &&
|
|
23839
|
-
_this.wrapper) {
|
|
23840
|
-
(0, roosterjs_editor_dom_1.unwrap)(_this.image.parentNode);
|
|
23911
|
+
if (_this.shadowSpan) {
|
|
23912
|
+
(0, roosterjs_editor_dom_1.unwrap)(_this.shadowSpan);
|
|
23841
23913
|
}
|
|
23842
23914
|
_this.wrapper = null;
|
|
23843
23915
|
_this.shadowSpan = null;
|
|
@@ -23905,7 +23977,7 @@ var ImageEdit = /** @class */ (function () {
|
|
|
23905
23977
|
}
|
|
23906
23978
|
var viewport = (_b = _this.editor) === null || _b === void 0 ? void 0 : _b.getVisibleViewport();
|
|
23907
23979
|
if (rotateHandle && rotateCenter && viewport) {
|
|
23908
|
-
(0, Rotator_1.updateRotateHandlePosition)(
|
|
23980
|
+
(0, Rotator_1.updateRotateHandlePosition)(viewport, rotateCenter, rotateHandle);
|
|
23909
23981
|
}
|
|
23910
23982
|
updateHandleCursor(resizeHandles, angleRad);
|
|
23911
23983
|
}
|
|
@@ -24048,6 +24120,54 @@ var ImageEdit = /** @class */ (function () {
|
|
|
24048
24120
|
this.editor.select(this.image);
|
|
24049
24121
|
}
|
|
24050
24122
|
};
|
|
24123
|
+
/**
|
|
24124
|
+
* Flip the image.
|
|
24125
|
+
* @param image The image to be flipped
|
|
24126
|
+
* @param direction
|
|
24127
|
+
*/
|
|
24128
|
+
ImageEdit.prototype.flipImage = function (image, direction) {
|
|
24129
|
+
var _a;
|
|
24130
|
+
this.image = image;
|
|
24131
|
+
this.editInfo = (0, editInfo_1.getEditInfoFromImage)(image);
|
|
24132
|
+
var angleRad = this.editInfo.angleRad;
|
|
24133
|
+
var isInVerticalPostion = (angleRad >= Math.PI / 2 && angleRad < (3 * Math.PI) / 4) ||
|
|
24134
|
+
(angleRad <= -Math.PI / 2 && angleRad > (-3 * Math.PI) / 4);
|
|
24135
|
+
if (isInVerticalPostion) {
|
|
24136
|
+
if (direction === 'horizontal') {
|
|
24137
|
+
this.editInfo.flippedVertical = !this.editInfo.flippedVertical;
|
|
24138
|
+
}
|
|
24139
|
+
else {
|
|
24140
|
+
this.editInfo.flippedHorizontal = !this.editInfo.flippedHorizontal;
|
|
24141
|
+
}
|
|
24142
|
+
}
|
|
24143
|
+
else {
|
|
24144
|
+
if (direction === 'vertical') {
|
|
24145
|
+
this.editInfo.flippedVertical = !this.editInfo.flippedVertical;
|
|
24146
|
+
}
|
|
24147
|
+
else {
|
|
24148
|
+
this.editInfo.flippedHorizontal = !this.editInfo.flippedHorizontal;
|
|
24149
|
+
}
|
|
24150
|
+
}
|
|
24151
|
+
this.createWrapper(4 /* Rotate */);
|
|
24152
|
+
this.updateWrapper();
|
|
24153
|
+
this.setEditingImage(null);
|
|
24154
|
+
(_a = this.editor) === null || _a === void 0 ? void 0 : _a.select(image);
|
|
24155
|
+
};
|
|
24156
|
+
/**
|
|
24157
|
+
* Rotate the image in radian angle.
|
|
24158
|
+
* @param image The image to be rotated
|
|
24159
|
+
* @param angleRad The angle in radian that the image must be rotated.
|
|
24160
|
+
*/
|
|
24161
|
+
ImageEdit.prototype.rotateImage = function (image, angleRad) {
|
|
24162
|
+
var _a;
|
|
24163
|
+
this.image = image;
|
|
24164
|
+
this.editInfo = (0, editInfo_1.getEditInfoFromImage)(image);
|
|
24165
|
+
this.editInfo.angleRad = this.editInfo.angleRad + angleRad;
|
|
24166
|
+
this.createWrapper(4 /* Rotate */);
|
|
24167
|
+
this.updateWrapper();
|
|
24168
|
+
this.setEditingImage(null);
|
|
24169
|
+
(_a = this.editor) === null || _a === void 0 ? void 0 : _a.select(image);
|
|
24170
|
+
};
|
|
24051
24171
|
/**
|
|
24052
24172
|
* Create editing wrapper for the image
|
|
24053
24173
|
*/
|
|
@@ -24066,6 +24186,7 @@ var ImageEdit = /** @class */ (function () {
|
|
|
24066
24186
|
// Set image src to original src to help show editing UI, also it will be used when regenerate image dataURL after editing
|
|
24067
24187
|
if (this.clonedImage) {
|
|
24068
24188
|
this.clonedImage.src = this.editInfo.src;
|
|
24189
|
+
setFlipped(this.clonedImage, this.editInfo.flippedHorizontal, this.editInfo.flippedVertical);
|
|
24069
24190
|
this.clonedImage.style.position = 'absolute';
|
|
24070
24191
|
}
|
|
24071
24192
|
// Get HTML for all edit elements (resize handle, rotate handle, crop handle and overlay, ...) and create HTML element
|
|
@@ -24223,6 +24344,9 @@ function getColorString(color, isDarkMode) {
|
|
|
24223
24344
|
}
|
|
24224
24345
|
return isDarkMode ? color.darkModeColor.trim() : color.lightModeColor.trim();
|
|
24225
24346
|
}
|
|
24347
|
+
function setFlipped(element, flipppedHorizontally, flipppedVertically) {
|
|
24348
|
+
element.style.transform = "scale(" + (flipppedHorizontally ? '-1' : '1') + ", " + (flipppedVertically ? '-1' : '1') + ")";
|
|
24349
|
+
}
|
|
24226
24350
|
|
|
24227
24351
|
|
|
24228
24352
|
/***/ }),
|
|
@@ -24509,13 +24633,18 @@ function checkEditInfoState(editInfo, compareTo) {
|
|
|
24509
24633
|
if (!editInfo || !editInfo.src || ALL_KEYS.some(function (key) { return !isNumber(editInfo[key]); })) {
|
|
24510
24634
|
return 0 /* Invalid */;
|
|
24511
24635
|
}
|
|
24512
|
-
else if (ROTATE_CROP_KEYS.every(function (key) { return areSameNumber(editInfo[key], 0); })
|
|
24636
|
+
else if (ROTATE_CROP_KEYS.every(function (key) { return areSameNumber(editInfo[key], 0); }) &&
|
|
24637
|
+
!editInfo.flippedHorizontal &&
|
|
24638
|
+
!editInfo.flippedVertical &&
|
|
24639
|
+
(!compareTo || (compareTo && editInfo.angleRad === compareTo.angleRad))) {
|
|
24513
24640
|
return 1 /* ResizeOnly */;
|
|
24514
24641
|
}
|
|
24515
24642
|
else if (compareTo &&
|
|
24516
24643
|
ROTATE_KEYS.every(function (key) { return areSameNumber(editInfo[key], 0); }) &&
|
|
24517
24644
|
ROTATE_KEYS.every(function (key) { return areSameNumber(compareTo[key], 0); }) &&
|
|
24518
|
-
CROP_KEYS.every(function (key) { return areSameNumber(editInfo[key], compareTo[key]); })
|
|
24645
|
+
CROP_KEYS.every(function (key) { return areSameNumber(editInfo[key], compareTo[key]); }) &&
|
|
24646
|
+
compareTo.flippedHorizontal === editInfo.flippedHorizontal &&
|
|
24647
|
+
compareTo.flippedVertical === editInfo.flippedVertical) {
|
|
24519
24648
|
return 2 /* SameWithLast */;
|
|
24520
24649
|
}
|
|
24521
24650
|
else {
|
|
@@ -24636,6 +24765,7 @@ function generateDataURL(image, editInfo) {
|
|
|
24636
24765
|
if (context) {
|
|
24637
24766
|
context.translate(targetWidth / 2, targetHeight / 2);
|
|
24638
24767
|
context.rotate(angle);
|
|
24768
|
+
context.scale(editInfo.flippedHorizontal ? -1 : 1, editInfo.flippedVertical ? -1 : 1);
|
|
24639
24769
|
context.drawImage(image, naturalWidth * left, naturalHeight * top, imageWidth, imageHeight, -width / 2, -height / 2, width, height);
|
|
24640
24770
|
}
|
|
24641
24771
|
return canvas.toDataURL('image/png', 1.0);
|
|
@@ -25141,15 +25271,26 @@ exports.Rotator = {
|
|
|
25141
25271
|
* Move rotate handle. When image is very close to the border of editor, rotate handle may not be visible.
|
|
25142
25272
|
* Fix it by reduce the distance from image to rotate handle
|
|
25143
25273
|
*/
|
|
25144
|
-
function updateRotateHandlePosition(
|
|
25274
|
+
function updateRotateHandlePosition(editorRect, rotateCenter, rotateHandle) {
|
|
25145
25275
|
var rotateHandleRect = rotateHandle.getBoundingClientRect();
|
|
25146
25276
|
if (rotateHandleRect) {
|
|
25147
25277
|
var top_1 = rotateHandleRect.top - editorRect.top;
|
|
25148
|
-
var
|
|
25149
|
-
var
|
|
25150
|
-
var
|
|
25151
|
-
|
|
25152
|
-
|
|
25278
|
+
var left = rotateHandleRect.left - editorRect.left;
|
|
25279
|
+
var right = rotateHandleRect.right - editorRect.right;
|
|
25280
|
+
var bottom = rotateHandleRect.bottom - editorRect.bottom;
|
|
25281
|
+
var adjustedDistance = Number.MAX_SAFE_INTEGER;
|
|
25282
|
+
if (top_1 <= 0) {
|
|
25283
|
+
adjustedDistance = top_1;
|
|
25284
|
+
}
|
|
25285
|
+
else if (left <= 0) {
|
|
25286
|
+
adjustedDistance = left;
|
|
25287
|
+
}
|
|
25288
|
+
else if (right >= 0) {
|
|
25289
|
+
adjustedDistance = right;
|
|
25290
|
+
}
|
|
25291
|
+
else if (bottom >= 0) {
|
|
25292
|
+
adjustedDistance = bottom;
|
|
25293
|
+
}
|
|
25153
25294
|
var rotateGap = Math.max(Math.min(ROTATE_GAP, adjustedDistance), 0);
|
|
25154
25295
|
var rotateTop = Math.max(Math.min(ROTATE_SIZE, adjustedDistance - rotateGap), 0);
|
|
25155
25296
|
rotateCenter.style.top = -rotateGap + 'px';
|
|
@@ -25671,7 +25812,8 @@ function checkAndAddBr(root, block, isFirst, firstBlock) {
|
|
|
25671
25812
|
// If the first block and the last block are Siblings, add a BR before so the only two
|
|
25672
25813
|
// lines that are being pasted are not merged.
|
|
25673
25814
|
var previousSibling = (0, roosterjs_editor_dom_1.getPreviousLeafSibling)(root, block.start);
|
|
25674
|
-
if (firstBlock.end.contains(previousSibling)
|
|
25815
|
+
if (firstBlock.end.contains(previousSibling) &&
|
|
25816
|
+
!(0, roosterjs_editor_dom_1.findClosestElementAncestor)(block.start, root, 'li')) {
|
|
25675
25817
|
var br = (_c = block.start.ownerDocument) === null || _c === void 0 ? void 0 : _c.createElement('br');
|
|
25676
25818
|
if (br) {
|
|
25677
25819
|
(_d = block.start.parentNode) === null || _d === void 0 ? void 0 : _d.insertBefore(br, block.start);
|