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