tinymce-rails 7.5.0 → 7.6.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/app/assets/source/tinymce/tinymce.js +1803 -1597
- data/lib/tinymce/rails/version.rb +2 -2
- data/vendor/assets/javascripts/tinymce/icons/default/icons.js +1 -1
- data/vendor/assets/javascripts/tinymce/models/dom/model.js +2 -2
- data/vendor/assets/javascripts/tinymce/plugins/accordion/plugin.js +1 -1
- data/vendor/assets/javascripts/tinymce/plugins/advlist/plugin.js +2 -2
- data/vendor/assets/javascripts/tinymce/plugins/anchor/plugin.js +1 -1
- data/vendor/assets/javascripts/tinymce/plugins/autolink/plugin.js +1 -1
- data/vendor/assets/javascripts/tinymce/plugins/autoresize/plugin.js +1 -1
- data/vendor/assets/javascripts/tinymce/plugins/autosave/plugin.js +1 -1
- data/vendor/assets/javascripts/tinymce/plugins/charmap/plugin.js +1 -1
- data/vendor/assets/javascripts/tinymce/plugins/code/plugin.js +1 -1
- data/vendor/assets/javascripts/tinymce/plugins/codesample/plugin.js +1 -1
- data/vendor/assets/javascripts/tinymce/plugins/directionality/plugin.js +1 -1
- data/vendor/assets/javascripts/tinymce/plugins/emoticons/plugin.js +1 -1
- data/vendor/assets/javascripts/tinymce/plugins/fullscreen/plugin.js +1 -1
- data/vendor/assets/javascripts/tinymce/plugins/help/plugin.js +2 -2
- data/vendor/assets/javascripts/tinymce/plugins/image/plugin.js +1 -1
- data/vendor/assets/javascripts/tinymce/plugins/importcss/plugin.js +1 -1
- data/vendor/assets/javascripts/tinymce/plugins/insertdatetime/plugin.js +1 -1
- data/vendor/assets/javascripts/tinymce/plugins/link/plugin.js +1 -1
- data/vendor/assets/javascripts/tinymce/plugins/lists/plugin.js +1 -1
- data/vendor/assets/javascripts/tinymce/plugins/media/plugin.js +1 -1
- data/vendor/assets/javascripts/tinymce/plugins/nonbreaking/plugin.js +1 -1
- data/vendor/assets/javascripts/tinymce/plugins/pagebreak/plugin.js +1 -1
- data/vendor/assets/javascripts/tinymce/plugins/preview/plugin.js +1 -1
- data/vendor/assets/javascripts/tinymce/plugins/quickbars/plugin.js +2 -2
- data/vendor/assets/javascripts/tinymce/plugins/save/plugin.js +1 -1
- data/vendor/assets/javascripts/tinymce/plugins/searchreplace/plugin.js +1 -1
- data/vendor/assets/javascripts/tinymce/plugins/table/plugin.js +1 -1
- data/vendor/assets/javascripts/tinymce/plugins/visualblocks/plugin.js +1 -1
- data/vendor/assets/javascripts/tinymce/plugins/visualchars/plugin.js +1 -1
- data/vendor/assets/javascripts/tinymce/plugins/wordcount/plugin.js +1 -1
- data/vendor/assets/javascripts/tinymce/skins/ui/oxide/content.css +1 -1
- data/vendor/assets/javascripts/tinymce/skins/ui/oxide/content.inline.css +1 -1
- data/vendor/assets/javascripts/tinymce/skins/ui/oxide/content.inline.js +1 -1
- data/vendor/assets/javascripts/tinymce/skins/ui/oxide/content.inline.min.css +1 -1
- data/vendor/assets/javascripts/tinymce/skins/ui/oxide/content.js +1 -1
- data/vendor/assets/javascripts/tinymce/skins/ui/oxide/content.min.css +1 -1
- data/vendor/assets/javascripts/tinymce/skins/ui/oxide/skin.css +1 -1
- data/vendor/assets/javascripts/tinymce/skins/ui/oxide/skin.js +1 -1
- data/vendor/assets/javascripts/tinymce/skins/ui/oxide/skin.min.css +1 -1
- data/vendor/assets/javascripts/tinymce/skins/ui/oxide/skin.shadowdom.js +1 -1
- data/vendor/assets/javascripts/tinymce/skins/ui/oxide-dark/content.css +1 -1
- data/vendor/assets/javascripts/tinymce/skins/ui/oxide-dark/content.inline.css +1 -1
- data/vendor/assets/javascripts/tinymce/skins/ui/oxide-dark/content.inline.js +1 -1
- data/vendor/assets/javascripts/tinymce/skins/ui/oxide-dark/content.inline.min.css +1 -1
- data/vendor/assets/javascripts/tinymce/skins/ui/oxide-dark/content.js +1 -1
- data/vendor/assets/javascripts/tinymce/skins/ui/oxide-dark/content.min.css +1 -1
- data/vendor/assets/javascripts/tinymce/skins/ui/oxide-dark/skin.css +1 -1
- data/vendor/assets/javascripts/tinymce/skins/ui/oxide-dark/skin.js +1 -1
- data/vendor/assets/javascripts/tinymce/skins/ui/oxide-dark/skin.min.css +1 -1
- data/vendor/assets/javascripts/tinymce/skins/ui/oxide-dark/skin.shadowdom.js +1 -1
- data/vendor/assets/javascripts/tinymce/skins/ui/tinymce-5/content.css +1 -1
- data/vendor/assets/javascripts/tinymce/skins/ui/tinymce-5/content.inline.css +1 -1
- data/vendor/assets/javascripts/tinymce/skins/ui/tinymce-5/content.inline.js +1 -1
- data/vendor/assets/javascripts/tinymce/skins/ui/tinymce-5/content.inline.min.css +1 -1
- data/vendor/assets/javascripts/tinymce/skins/ui/tinymce-5/content.js +1 -1
- data/vendor/assets/javascripts/tinymce/skins/ui/tinymce-5/content.min.css +1 -1
- data/vendor/assets/javascripts/tinymce/skins/ui/tinymce-5/skin.css +1 -1
- data/vendor/assets/javascripts/tinymce/skins/ui/tinymce-5/skin.js +1 -1
- data/vendor/assets/javascripts/tinymce/skins/ui/tinymce-5/skin.min.css +1 -1
- data/vendor/assets/javascripts/tinymce/skins/ui/tinymce-5-dark/content.css +1 -1
- data/vendor/assets/javascripts/tinymce/skins/ui/tinymce-5-dark/content.inline.css +1 -1
- data/vendor/assets/javascripts/tinymce/skins/ui/tinymce-5-dark/content.inline.js +1 -1
- data/vendor/assets/javascripts/tinymce/skins/ui/tinymce-5-dark/content.inline.min.css +1 -1
- data/vendor/assets/javascripts/tinymce/skins/ui/tinymce-5-dark/content.js +1 -1
- data/vendor/assets/javascripts/tinymce/skins/ui/tinymce-5-dark/content.min.css +1 -1
- data/vendor/assets/javascripts/tinymce/skins/ui/tinymce-5-dark/skin.css +1 -1
- data/vendor/assets/javascripts/tinymce/skins/ui/tinymce-5-dark/skin.js +1 -1
- data/vendor/assets/javascripts/tinymce/skins/ui/tinymce-5-dark/skin.min.css +1 -1
- data/vendor/assets/javascripts/tinymce/themes/silver/theme.js +68 -68
- data/vendor/assets/javascripts/tinymce/tinymce.d.ts +51 -15
- data/vendor/assets/javascripts/tinymce/tinymce.js +57 -57
- metadata +5 -5
@@ -1,5 +1,5 @@
|
|
1
1
|
/**
|
2
|
-
* TinyMCE version 7.
|
2
|
+
* TinyMCE version 7.6.0 (2024-12-11)
|
3
3
|
*/
|
4
4
|
|
5
5
|
(function () {
|
@@ -1178,7 +1178,7 @@
|
|
1178
1178
|
throw new Error('Attribute value was not simple');
|
1179
1179
|
}
|
1180
1180
|
};
|
1181
|
-
const set$
|
1181
|
+
const set$4 = (element, key, value) => {
|
1182
1182
|
rawSet(element.dom, key, value);
|
1183
1183
|
};
|
1184
1184
|
const setAll$1 = (element, attrs) => {
|
@@ -1215,13 +1215,13 @@
|
|
1215
1215
|
const add$4 = (element, attr, id) => {
|
1216
1216
|
const old = read$4(element, attr);
|
1217
1217
|
const nu = old.concat([id]);
|
1218
|
-
set$
|
1218
|
+
set$4(element, attr, nu.join(' '));
|
1219
1219
|
return true;
|
1220
1220
|
};
|
1221
1221
|
const remove$8 = (element, attr, id) => {
|
1222
1222
|
const nu = filter$5(read$4(element, attr), v => v !== id);
|
1223
1223
|
if (nu.length > 0) {
|
1224
|
-
set$
|
1224
|
+
set$4(element, attr, nu.join(' '));
|
1225
1225
|
} else {
|
1226
1226
|
remove$9(element, attr);
|
1227
1227
|
}
|
@@ -1508,6 +1508,9 @@
|
|
1508
1508
|
}
|
1509
1509
|
};
|
1510
1510
|
const getRaw$1 = element => element.dom.contentEditable;
|
1511
|
+
const set$3 = (element, editable) => {
|
1512
|
+
element.dom.contentEditable = editable ? 'true' : 'false';
|
1513
|
+
};
|
1511
1514
|
|
1512
1515
|
const isSupported = dom => dom.style !== undefined && isFunction(dom.style.getPropertyValue);
|
1513
1516
|
|
@@ -2426,16 +2429,16 @@
|
|
2426
2429
|
id: state.id
|
2427
2430
|
});
|
2428
2431
|
if (settings.contentCssCors) {
|
2429
|
-
set$
|
2432
|
+
set$4(linkElem, 'crossOrigin', 'anonymous');
|
2430
2433
|
}
|
2431
2434
|
if (settings.referrerPolicy) {
|
2432
|
-
set$
|
2435
|
+
set$4(linkElem, 'referrerpolicy', settings.referrerPolicy);
|
2433
2436
|
}
|
2434
2437
|
link = linkElem.dom;
|
2435
2438
|
link.onload = passed;
|
2436
2439
|
link.onerror = failed;
|
2437
2440
|
addStyle(linkElem);
|
2438
|
-
set$
|
2441
|
+
set$4(linkElem, 'href', urlWithSuffix);
|
2439
2442
|
});
|
2440
2443
|
const loadRawCss = (key, css) => {
|
2441
2444
|
const state = getOrCreateState(key);
|
@@ -2443,9 +2446,10 @@
|
|
2443
2446
|
state.count++;
|
2444
2447
|
const styleElem = SugarElement.fromTag('style', doc.dom);
|
2445
2448
|
setAll$1(styleElem, {
|
2446
|
-
rel: 'stylesheet',
|
2447
|
-
type: 'text/css',
|
2448
|
-
id: state.id
|
2449
|
+
'rel': 'stylesheet',
|
2450
|
+
'type': 'text/css',
|
2451
|
+
'id': state.id,
|
2452
|
+
'data-mce-key': key
|
2449
2453
|
});
|
2450
2454
|
styleElem.dom.innerHTML = css;
|
2451
2455
|
addStyle(styleElem);
|
@@ -4148,7 +4152,7 @@
|
|
4148
4152
|
if (isNullable(value) || value === '') {
|
4149
4153
|
remove$9(elm, name);
|
4150
4154
|
} else {
|
4151
|
-
set$
|
4155
|
+
set$4(elm, name, value);
|
4152
4156
|
}
|
4153
4157
|
};
|
4154
4158
|
const camelCaseToHyphens = name => name.replace(/[A-Z]/g, v => '-' + v.toLowerCase());
|
@@ -5356,7 +5360,7 @@
|
|
5356
5360
|
const toggleActiveAttr = (uid, state) => {
|
5357
5361
|
each$e(findMarkers(editor, uid), elem => {
|
5358
5362
|
if (state) {
|
5359
|
-
set$
|
5363
|
+
set$4(elem, dataAnnotationActive(), 'true');
|
5360
5364
|
} else {
|
5361
5365
|
remove$9(elem, dataAnnotationActive());
|
5362
5366
|
}
|
@@ -5655,7 +5659,7 @@
|
|
5655
5659
|
};
|
5656
5660
|
const createPaddingBr = () => {
|
5657
5661
|
const br = SugarElement.fromTag('br');
|
5658
|
-
set$
|
5662
|
+
set$4(br, 'data-mce-bogus', '1');
|
5659
5663
|
return br;
|
5660
5664
|
};
|
5661
5665
|
const fillWithPaddingBr = elm => {
|
@@ -6826,6 +6830,90 @@
|
|
6826
6830
|
};
|
6827
6831
|
};
|
6828
6832
|
|
6833
|
+
const firePreProcess = (editor, args) => editor.dispatch('PreProcess', args);
|
6834
|
+
const firePostProcess = (editor, args) => editor.dispatch('PostProcess', args);
|
6835
|
+
const fireRemove = editor => {
|
6836
|
+
editor.dispatch('remove');
|
6837
|
+
};
|
6838
|
+
const fireDetach = editor => {
|
6839
|
+
editor.dispatch('detach');
|
6840
|
+
};
|
6841
|
+
const fireSwitchMode = (editor, mode) => {
|
6842
|
+
editor.dispatch('SwitchMode', { mode });
|
6843
|
+
};
|
6844
|
+
const fireObjectResizeStart = (editor, target, width, height, origin) => {
|
6845
|
+
editor.dispatch('ObjectResizeStart', {
|
6846
|
+
target,
|
6847
|
+
width,
|
6848
|
+
height,
|
6849
|
+
origin
|
6850
|
+
});
|
6851
|
+
};
|
6852
|
+
const fireObjectResized = (editor, target, width, height, origin) => {
|
6853
|
+
editor.dispatch('ObjectResized', {
|
6854
|
+
target,
|
6855
|
+
width,
|
6856
|
+
height,
|
6857
|
+
origin
|
6858
|
+
});
|
6859
|
+
};
|
6860
|
+
const firePreInit = editor => {
|
6861
|
+
editor.dispatch('PreInit');
|
6862
|
+
};
|
6863
|
+
const firePostRender = editor => {
|
6864
|
+
editor.dispatch('PostRender');
|
6865
|
+
};
|
6866
|
+
const fireInit = editor => {
|
6867
|
+
editor.dispatch('Init');
|
6868
|
+
};
|
6869
|
+
const firePlaceholderToggle = (editor, state) => {
|
6870
|
+
editor.dispatch('PlaceholderToggle', { state });
|
6871
|
+
};
|
6872
|
+
const fireError = (editor, errorType, error) => {
|
6873
|
+
editor.dispatch(errorType, error);
|
6874
|
+
};
|
6875
|
+
const fireFormatApply = (editor, format, node, vars) => {
|
6876
|
+
editor.dispatch('FormatApply', {
|
6877
|
+
format,
|
6878
|
+
node,
|
6879
|
+
vars
|
6880
|
+
});
|
6881
|
+
};
|
6882
|
+
const fireFormatRemove = (editor, format, node, vars) => {
|
6883
|
+
editor.dispatch('FormatRemove', {
|
6884
|
+
format,
|
6885
|
+
node,
|
6886
|
+
vars
|
6887
|
+
});
|
6888
|
+
};
|
6889
|
+
const fireBeforeSetContent = (editor, args) => editor.dispatch('BeforeSetContent', args);
|
6890
|
+
const fireSetContent = (editor, args) => editor.dispatch('SetContent', args);
|
6891
|
+
const fireBeforeGetContent = (editor, args) => editor.dispatch('BeforeGetContent', args);
|
6892
|
+
const fireGetContent = (editor, args) => editor.dispatch('GetContent', args);
|
6893
|
+
const fireAutocompleterStart = (editor, args) => {
|
6894
|
+
editor.dispatch('AutocompleterStart', args);
|
6895
|
+
};
|
6896
|
+
const fireAutocompleterUpdate = (editor, args) => {
|
6897
|
+
editor.dispatch('AutocompleterUpdate', args);
|
6898
|
+
};
|
6899
|
+
const fireAutocompleterUpdateActiveRange = (editor, args) => {
|
6900
|
+
editor.dispatch('AutocompleterUpdateActiveRange', args);
|
6901
|
+
};
|
6902
|
+
const fireAutocompleterEnd = editor => {
|
6903
|
+
editor.dispatch('AutocompleterEnd');
|
6904
|
+
};
|
6905
|
+
const firePastePreProcess = (editor, html, internal) => editor.dispatch('PastePreProcess', {
|
6906
|
+
content: html,
|
6907
|
+
internal
|
6908
|
+
});
|
6909
|
+
const firePastePostProcess = (editor, node, internal) => editor.dispatch('PastePostProcess', {
|
6910
|
+
node,
|
6911
|
+
internal
|
6912
|
+
});
|
6913
|
+
const firePastePlainTextToggle = (editor, state) => editor.dispatch('PastePlainTextToggle', { state });
|
6914
|
+
const fireEditableRootStateChange = (editor, state) => editor.dispatch('EditableRootStateChange', { state });
|
6915
|
+
const fireDisabledStateChange = (editor, state) => editor.dispatch('DisabledStateChange', { state });
|
6916
|
+
|
6829
6917
|
const deviceDetection$1 = detect$1().deviceType;
|
6830
6918
|
const isTouch = deviceDetection$1.isTouch();
|
6831
6919
|
const DOM$a = DOMUtils.DOM;
|
@@ -7219,6 +7307,26 @@
|
|
7219
7307
|
processor: 'boolean',
|
7220
7308
|
default: false
|
7221
7309
|
});
|
7310
|
+
registerOption('disabled', {
|
7311
|
+
processor: value => {
|
7312
|
+
if (isBoolean(value)) {
|
7313
|
+
if (editor.initialized && isDisabled$1(editor) !== value) {
|
7314
|
+
Promise.resolve().then(() => {
|
7315
|
+
fireDisabledStateChange(editor, value);
|
7316
|
+
});
|
7317
|
+
}
|
7318
|
+
return {
|
7319
|
+
valid: true,
|
7320
|
+
value
|
7321
|
+
};
|
7322
|
+
}
|
7323
|
+
return {
|
7324
|
+
valid: false,
|
7325
|
+
message: 'The value must be a boolean.'
|
7326
|
+
};
|
7327
|
+
},
|
7328
|
+
default: false
|
7329
|
+
});
|
7222
7330
|
registerOption('readonly', {
|
7223
7331
|
processor: 'boolean',
|
7224
7332
|
default: false
|
@@ -7738,6 +7846,7 @@
|
|
7738
7846
|
const shouldConvertUnsafeEmbeds = option('convert_unsafe_embeds');
|
7739
7847
|
const getLicenseKey = option('license_key');
|
7740
7848
|
const getApiKey = option('api_key');
|
7849
|
+
const isDisabled$1 = option('disabled');
|
7741
7850
|
|
7742
7851
|
const isElement$3 = isElement$6;
|
7743
7852
|
const isText$5 = isText$b;
|
@@ -9303,18 +9412,18 @@
|
|
9303
9412
|
const applyAnnotation = (elem, masterUId, data, annotationName, decorate, directAnnotation) => {
|
9304
9413
|
const {uid = masterUId, ...otherData} = data;
|
9305
9414
|
add$2(elem, annotation());
|
9306
|
-
set$
|
9307
|
-
set$
|
9415
|
+
set$4(elem, `${ dataAnnotationId() }`, uid);
|
9416
|
+
set$4(elem, `${ dataAnnotation() }`, annotationName);
|
9308
9417
|
const {attributes = {}, classes = []} = decorate(uid, otherData);
|
9309
9418
|
setAll$1(elem, attributes);
|
9310
9419
|
add(elem, classes);
|
9311
9420
|
if (directAnnotation) {
|
9312
9421
|
if (classes.length > 0) {
|
9313
|
-
set$
|
9422
|
+
set$4(elem, `${ dataAnnotationClasses() }`, classes.join(','));
|
9314
9423
|
}
|
9315
9424
|
const attributeNames = keys(attributes);
|
9316
9425
|
if (attributeNames.length > 0) {
|
9317
|
-
set$
|
9426
|
+
set$4(elem, `${ dataAnnotationAttributes() }`, attributeNames.join(','));
|
9318
9427
|
}
|
9319
9428
|
}
|
9320
9429
|
};
|
@@ -9470,1563 +9579,1480 @@
|
|
9470
9579
|
}
|
9471
9580
|
};
|
9472
9581
|
|
9473
|
-
const
|
9474
|
-
|
9475
|
-
const
|
9476
|
-
|
9477
|
-
|
9478
|
-
|
9479
|
-
editor.dispatch('detach');
|
9582
|
+
const getDocument = () => SugarElement.fromDom(document);
|
9583
|
+
|
9584
|
+
const focus$1 = (element, preventScroll = false) => element.dom.focus({ preventScroll });
|
9585
|
+
const hasFocus$1 = element => {
|
9586
|
+
const root = getRootNode(element).dom;
|
9587
|
+
return element.dom === root.activeElement;
|
9480
9588
|
};
|
9481
|
-
const
|
9482
|
-
|
9589
|
+
const active$1 = (root = getDocument()) => Optional.from(root.dom.activeElement).map(SugarElement.fromDom);
|
9590
|
+
const search = element => active$1(getRootNode(element)).filter(e => element.dom.contains(e.dom));
|
9591
|
+
|
9592
|
+
const create$9 = (start, soffset, finish, foffset) => ({
|
9593
|
+
start,
|
9594
|
+
soffset,
|
9595
|
+
finish,
|
9596
|
+
foffset
|
9597
|
+
});
|
9598
|
+
const SimRange = { create: create$9 };
|
9599
|
+
|
9600
|
+
const adt$3 = Adt.generate([
|
9601
|
+
{ before: ['element'] },
|
9602
|
+
{
|
9603
|
+
on: [
|
9604
|
+
'element',
|
9605
|
+
'offset'
|
9606
|
+
]
|
9607
|
+
},
|
9608
|
+
{ after: ['element'] }
|
9609
|
+
]);
|
9610
|
+
const cata = (subject, onBefore, onOn, onAfter) => subject.fold(onBefore, onOn, onAfter);
|
9611
|
+
const getStart$2 = situ => situ.fold(identity, identity, identity);
|
9612
|
+
const before$1 = adt$3.before;
|
9613
|
+
const on = adt$3.on;
|
9614
|
+
const after$1 = adt$3.after;
|
9615
|
+
const Situ = {
|
9616
|
+
before: before$1,
|
9617
|
+
on,
|
9618
|
+
after: after$1,
|
9619
|
+
cata,
|
9620
|
+
getStart: getStart$2
|
9483
9621
|
};
|
9484
|
-
|
9485
|
-
|
9486
|
-
|
9487
|
-
|
9488
|
-
|
9489
|
-
|
9490
|
-
|
9622
|
+
|
9623
|
+
const adt$2 = Adt.generate([
|
9624
|
+
{ domRange: ['rng'] },
|
9625
|
+
{
|
9626
|
+
relative: [
|
9627
|
+
'startSitu',
|
9628
|
+
'finishSitu'
|
9629
|
+
]
|
9630
|
+
},
|
9631
|
+
{
|
9632
|
+
exact: [
|
9633
|
+
'start',
|
9634
|
+
'soffset',
|
9635
|
+
'finish',
|
9636
|
+
'foffset'
|
9637
|
+
]
|
9638
|
+
}
|
9639
|
+
]);
|
9640
|
+
const exactFromRange = simRange => adt$2.exact(simRange.start, simRange.soffset, simRange.finish, simRange.foffset);
|
9641
|
+
const getStart$1 = selection => selection.match({
|
9642
|
+
domRange: rng => SugarElement.fromDom(rng.startContainer),
|
9643
|
+
relative: (startSitu, _finishSitu) => Situ.getStart(startSitu),
|
9644
|
+
exact: (start, _soffset, _finish, _foffset) => start
|
9645
|
+
});
|
9646
|
+
const domRange = adt$2.domRange;
|
9647
|
+
const relative = adt$2.relative;
|
9648
|
+
const exact = adt$2.exact;
|
9649
|
+
const getWin = selection => {
|
9650
|
+
const start = getStart$1(selection);
|
9651
|
+
return defaultView(start);
|
9491
9652
|
};
|
9492
|
-
const
|
9493
|
-
|
9494
|
-
|
9495
|
-
|
9496
|
-
|
9497
|
-
|
9498
|
-
|
9653
|
+
const range = SimRange.create;
|
9654
|
+
const SimSelection = {
|
9655
|
+
domRange,
|
9656
|
+
relative,
|
9657
|
+
exact,
|
9658
|
+
exactFromRange,
|
9659
|
+
getWin,
|
9660
|
+
range
|
9499
9661
|
};
|
9500
|
-
|
9501
|
-
|
9662
|
+
|
9663
|
+
const clamp$1 = (offset, element) => {
|
9664
|
+
const max = isText$c(element) ? get$3(element).length : children$1(element).length + 1;
|
9665
|
+
if (offset > max) {
|
9666
|
+
return max;
|
9667
|
+
} else if (offset < 0) {
|
9668
|
+
return 0;
|
9669
|
+
}
|
9670
|
+
return offset;
|
9502
9671
|
};
|
9503
|
-
const
|
9504
|
-
|
9672
|
+
const normalizeRng = rng => SimSelection.range(rng.start, clamp$1(rng.soffset, rng.start), rng.finish, clamp$1(rng.foffset, rng.finish));
|
9673
|
+
const isOrContains = (root, elm) => !isRestrictedNode(elm.dom) && (contains(root, elm) || eq(root, elm));
|
9674
|
+
const isRngInRoot = root => rng => isOrContains(root, rng.start) && isOrContains(root, rng.finish);
|
9675
|
+
const shouldStore = editor => editor.inline || Env.browser.isFirefox();
|
9676
|
+
const nativeRangeToSelectionRange = r => SimSelection.range(SugarElement.fromDom(r.startContainer), r.startOffset, SugarElement.fromDom(r.endContainer), r.endOffset);
|
9677
|
+
const readRange = win => {
|
9678
|
+
const selection = win.getSelection();
|
9679
|
+
const rng = !selection || selection.rangeCount === 0 ? Optional.none() : Optional.from(selection.getRangeAt(0));
|
9680
|
+
return rng.map(nativeRangeToSelectionRange);
|
9505
9681
|
};
|
9506
|
-
const
|
9507
|
-
|
9682
|
+
const getBookmark$1 = root => {
|
9683
|
+
const win = defaultView(root);
|
9684
|
+
return readRange(win.dom).filter(isRngInRoot(root));
|
9508
9685
|
};
|
9509
|
-
const
|
9510
|
-
|
9686
|
+
const validate = (root, bookmark) => Optional.from(bookmark).filter(isRngInRoot(root)).map(normalizeRng);
|
9687
|
+
const bookmarkToNativeRng = bookmark => {
|
9688
|
+
const rng = document.createRange();
|
9689
|
+
try {
|
9690
|
+
rng.setStart(bookmark.start.dom, bookmark.soffset);
|
9691
|
+
rng.setEnd(bookmark.finish.dom, bookmark.foffset);
|
9692
|
+
return Optional.some(rng);
|
9693
|
+
} catch (_) {
|
9694
|
+
return Optional.none();
|
9695
|
+
}
|
9511
9696
|
};
|
9512
|
-
const
|
9513
|
-
editor.
|
9697
|
+
const store = editor => {
|
9698
|
+
const newBookmark = shouldStore(editor) ? getBookmark$1(SugarElement.fromDom(editor.getBody())) : Optional.none();
|
9699
|
+
editor.bookmark = newBookmark.isSome() ? newBookmark : editor.bookmark;
|
9514
9700
|
};
|
9515
|
-
const
|
9516
|
-
editor.
|
9517
|
-
|
9518
|
-
node,
|
9519
|
-
vars
|
9520
|
-
});
|
9701
|
+
const getRng = editor => {
|
9702
|
+
const bookmark = editor.bookmark ? editor.bookmark : Optional.none();
|
9703
|
+
return bookmark.bind(x => validate(SugarElement.fromDom(editor.getBody()), x)).bind(bookmarkToNativeRng);
|
9521
9704
|
};
|
9522
|
-
const
|
9523
|
-
editor.
|
9524
|
-
format,
|
9525
|
-
node,
|
9526
|
-
vars
|
9527
|
-
});
|
9705
|
+
const restore = editor => {
|
9706
|
+
getRng(editor).each(rng => editor.selection.setRng(rng));
|
9528
9707
|
};
|
9529
|
-
|
9530
|
-
const
|
9531
|
-
|
9532
|
-
|
9533
|
-
const fireAutocompleterStart = (editor, args) => {
|
9534
|
-
editor.dispatch('AutocompleterStart', args);
|
9535
|
-
};
|
9536
|
-
const fireAutocompleterUpdate = (editor, args) => {
|
9537
|
-
editor.dispatch('AutocompleterUpdate', args);
|
9708
|
+
|
9709
|
+
const isEditorUIElement$1 = elm => {
|
9710
|
+
const className = elm.className.toString();
|
9711
|
+
return className.indexOf('tox-') !== -1 || className.indexOf('mce-') !== -1;
|
9538
9712
|
};
|
9539
|
-
const
|
9540
|
-
|
9713
|
+
const FocusManager = { isEditorUIElement: isEditorUIElement$1 };
|
9714
|
+
|
9715
|
+
const wrappedSetTimeout = (callback, time) => {
|
9716
|
+
if (!isNumber(time)) {
|
9717
|
+
time = 0;
|
9718
|
+
}
|
9719
|
+
return setTimeout(callback, time);
|
9541
9720
|
};
|
9542
|
-
const
|
9543
|
-
|
9721
|
+
const wrappedSetInterval = (callback, time) => {
|
9722
|
+
if (!isNumber(time)) {
|
9723
|
+
time = 0;
|
9724
|
+
}
|
9725
|
+
return setInterval(callback, time);
|
9544
9726
|
};
|
9545
|
-
const
|
9546
|
-
|
9547
|
-
|
9548
|
-
|
9549
|
-
|
9550
|
-
|
9551
|
-
|
9552
|
-
});
|
9553
|
-
const firePastePlainTextToggle = (editor, state) => editor.dispatch('PastePlainTextToggle', { state });
|
9554
|
-
const fireEditableRootStateChange = (editor, state) => editor.dispatch('EditableRootStateChange', { state });
|
9555
|
-
|
9556
|
-
const VK = {
|
9557
|
-
BACKSPACE: 8,
|
9558
|
-
DELETE: 46,
|
9559
|
-
DOWN: 40,
|
9560
|
-
ENTER: 13,
|
9561
|
-
ESC: 27,
|
9562
|
-
LEFT: 37,
|
9563
|
-
RIGHT: 39,
|
9564
|
-
SPACEBAR: 32,
|
9565
|
-
TAB: 9,
|
9566
|
-
UP: 38,
|
9567
|
-
PAGE_UP: 33,
|
9568
|
-
PAGE_DOWN: 34,
|
9569
|
-
END: 35,
|
9570
|
-
HOME: 36,
|
9571
|
-
modifierPressed: e => {
|
9572
|
-
return e.shiftKey || e.ctrlKey || e.altKey || VK.metaKeyPressed(e);
|
9727
|
+
const Delay = {
|
9728
|
+
setEditorTimeout: (editor, callback, time) => {
|
9729
|
+
return wrappedSetTimeout(() => {
|
9730
|
+
if (!editor.removed) {
|
9731
|
+
callback();
|
9732
|
+
}
|
9733
|
+
}, time);
|
9573
9734
|
},
|
9574
|
-
|
9575
|
-
|
9735
|
+
setEditorInterval: (editor, callback, time) => {
|
9736
|
+
const timer = wrappedSetInterval(() => {
|
9737
|
+
if (!editor.removed) {
|
9738
|
+
callback();
|
9739
|
+
} else {
|
9740
|
+
clearInterval(timer);
|
9741
|
+
}
|
9742
|
+
}, time);
|
9743
|
+
return timer;
|
9576
9744
|
}
|
9577
9745
|
};
|
9578
9746
|
|
9579
|
-
const
|
9580
|
-
|
9581
|
-
const abs = Math.abs;
|
9582
|
-
const round$1 = Math.round;
|
9583
|
-
const resizeHandles = {
|
9584
|
-
nw: [
|
9585
|
-
0,
|
9586
|
-
0,
|
9587
|
-
-1,
|
9588
|
-
-1
|
9589
|
-
],
|
9590
|
-
ne: [
|
9591
|
-
1,
|
9592
|
-
0,
|
9593
|
-
1,
|
9594
|
-
-1
|
9595
|
-
],
|
9596
|
-
se: [
|
9597
|
-
1,
|
9598
|
-
1,
|
9599
|
-
1,
|
9600
|
-
1
|
9601
|
-
],
|
9602
|
-
sw: [
|
9603
|
-
0,
|
9604
|
-
1,
|
9605
|
-
-1,
|
9606
|
-
1
|
9607
|
-
]
|
9747
|
+
const isManualNodeChange = e => {
|
9748
|
+
return e.type === 'nodechange' && e.selectionChange;
|
9608
9749
|
};
|
9609
|
-
const
|
9610
|
-
|
9611
|
-
|
9612
|
-
const editableDoc = editor.getDoc();
|
9613
|
-
const rootDocument = document;
|
9614
|
-
const rootElement = editor.getBody();
|
9615
|
-
let selectedElm, selectedElmGhost, resizeHelper, selectedHandle, resizeBackdrop;
|
9616
|
-
let startX, startY, selectedElmX, selectedElmY, startW, startH, ratio, resizeStarted;
|
9617
|
-
let width;
|
9618
|
-
let height;
|
9619
|
-
let startScrollWidth;
|
9620
|
-
let startScrollHeight;
|
9621
|
-
const isImage = elm => isNonNullable(elm) && (isImg(elm) || dom.is(elm, 'figure.image'));
|
9622
|
-
const isMedia = elm => isMedia$2(elm) || dom.hasClass(elm, 'mce-preview-object');
|
9623
|
-
const isEventOnImageOutsideRange = (evt, range) => {
|
9624
|
-
if (isTouchEvent(evt)) {
|
9625
|
-
const touch = evt.touches[0];
|
9626
|
-
return isImage(evt.target) && !isXYWithinRange(touch.clientX, touch.clientY, range);
|
9627
|
-
} else {
|
9628
|
-
return isImage(evt.target) && !isXYWithinRange(evt.clientX, evt.clientY, range);
|
9629
|
-
}
|
9630
|
-
};
|
9631
|
-
const contextMenuSelectImage = evt => {
|
9632
|
-
const target = evt.target;
|
9633
|
-
if (isEventOnImageOutsideRange(evt, editor.selection.getRng()) && !evt.isDefaultPrevented()) {
|
9634
|
-
editor.selection.select(target);
|
9635
|
-
}
|
9636
|
-
};
|
9637
|
-
const getResizeTargets = elm => {
|
9638
|
-
if (dom.hasClass(elm, 'mce-preview-object') && isNonNullable(elm.firstElementChild)) {
|
9639
|
-
return [
|
9640
|
-
elm,
|
9641
|
-
elm.firstElementChild
|
9642
|
-
];
|
9643
|
-
} else if (dom.is(elm, 'figure.image')) {
|
9644
|
-
return [elm.querySelector('img')];
|
9645
|
-
} else {
|
9646
|
-
return [elm];
|
9647
|
-
}
|
9750
|
+
const registerPageMouseUp = (editor, throttledStore) => {
|
9751
|
+
const mouseUpPage = () => {
|
9752
|
+
throttledStore.throttle();
|
9648
9753
|
};
|
9649
|
-
|
9650
|
-
|
9651
|
-
|
9652
|
-
|
9653
|
-
|
9654
|
-
|
9655
|
-
|
9754
|
+
DOMUtils.DOM.bind(document, 'mouseup', mouseUpPage);
|
9755
|
+
editor.on('remove', () => {
|
9756
|
+
DOMUtils.DOM.unbind(document, 'mouseup', mouseUpPage);
|
9757
|
+
});
|
9758
|
+
};
|
9759
|
+
const registerMouseUp = (editor, throttledStore) => {
|
9760
|
+
editor.on('mouseup touchend', _e => {
|
9761
|
+
throttledStore.throttle();
|
9762
|
+
});
|
9763
|
+
};
|
9764
|
+
const registerEditorEvents = (editor, throttledStore) => {
|
9765
|
+
registerMouseUp(editor, throttledStore);
|
9766
|
+
editor.on('keyup NodeChange AfterSetSelectionRange', e => {
|
9767
|
+
if (!isManualNodeChange(e)) {
|
9768
|
+
store(editor);
|
9656
9769
|
}
|
9657
|
-
|
9658
|
-
|
9770
|
+
});
|
9771
|
+
};
|
9772
|
+
const register$6 = editor => {
|
9773
|
+
const throttledStore = first$1(() => {
|
9774
|
+
store(editor);
|
9775
|
+
}, 0);
|
9776
|
+
editor.on('init', () => {
|
9777
|
+
if (editor.inline) {
|
9778
|
+
registerPageMouseUp(editor, throttledStore);
|
9659
9779
|
}
|
9660
|
-
|
9661
|
-
|
9662
|
-
|
9663
|
-
|
9780
|
+
registerEditorEvents(editor, throttledStore);
|
9781
|
+
});
|
9782
|
+
editor.on('remove', () => {
|
9783
|
+
throttledStore.cancel();
|
9784
|
+
});
|
9785
|
+
};
|
9786
|
+
|
9787
|
+
let documentFocusInHandler;
|
9788
|
+
const DOM$9 = DOMUtils.DOM;
|
9789
|
+
const isEditorUIElement = elm => {
|
9790
|
+
return isElement$6(elm) && FocusManager.isEditorUIElement(elm);
|
9791
|
+
};
|
9792
|
+
const isEditorContentAreaElement = elm => {
|
9793
|
+
const classList = elm.classList;
|
9794
|
+
if (classList !== undefined) {
|
9795
|
+
return classList.contains('tox-edit-area') || classList.contains('tox-edit-area__iframe') || classList.contains('mce-content-body');
|
9796
|
+
} else {
|
9797
|
+
return false;
|
9798
|
+
}
|
9799
|
+
};
|
9800
|
+
const isUIElement = (editor, elm) => {
|
9801
|
+
const customSelector = getCustomUiSelector(editor);
|
9802
|
+
const parent = DOM$9.getParent(elm, elm => {
|
9803
|
+
return isEditorUIElement(elm) || (customSelector ? editor.dom.is(elm, customSelector) : false);
|
9804
|
+
});
|
9805
|
+
return parent !== null;
|
9806
|
+
};
|
9807
|
+
const getActiveElement = editor => {
|
9808
|
+
try {
|
9809
|
+
const root = getRootNode(SugarElement.fromDom(editor.getElement()));
|
9810
|
+
return active$1(root).fold(() => document.body, x => x.dom);
|
9811
|
+
} catch (ex) {
|
9812
|
+
return document.body;
|
9813
|
+
}
|
9814
|
+
};
|
9815
|
+
const registerEvents$1 = (editorManager, e) => {
|
9816
|
+
const editor = e.editor;
|
9817
|
+
register$6(editor);
|
9818
|
+
const toggleContentAreaOnFocus = (editor, fn) => {
|
9819
|
+
if (shouldHighlightOnFocus(editor) && editor.inline !== true) {
|
9820
|
+
const contentArea = SugarElement.fromDom(editor.getContainer());
|
9821
|
+
fn(contentArea, 'tox-edit-focus');
|
9664
9822
|
}
|
9665
9823
|
};
|
9666
|
-
|
9667
|
-
|
9668
|
-
|
9669
|
-
|
9670
|
-
const isNorth = startsWith(selectedHandle.name, 'n');
|
9671
|
-
const rowSelect = isNorth ? head : last$2;
|
9672
|
-
const tableElm = elm.cloneNode(true);
|
9673
|
-
rowSelect(dom.select('tr', tableElm)).each(tr => {
|
9674
|
-
const cells = dom.select('td,th', tr);
|
9675
|
-
dom.setStyle(tr, 'height', null);
|
9676
|
-
each$e(cells, cell => dom.setStyle(cell, 'height', null));
|
9677
|
-
});
|
9678
|
-
return tableElm;
|
9679
|
-
} else {
|
9680
|
-
return elm.cloneNode(true);
|
9824
|
+
editor.on('focusin', () => {
|
9825
|
+
const focusedEditor = editorManager.focusedEditor;
|
9826
|
+
if (isEditorContentAreaElement(getActiveElement(editor))) {
|
9827
|
+
toggleContentAreaOnFocus(editor, add$2);
|
9681
9828
|
}
|
9682
|
-
|
9683
|
-
|
9684
|
-
|
9685
|
-
|
9686
|
-
|
9687
|
-
|
9688
|
-
|
9689
|
-
|
9690
|
-
dom.setAttrib(target, name, '' + value);
|
9691
|
-
}
|
9692
|
-
});
|
9693
|
-
}
|
9694
|
-
};
|
9695
|
-
const setGhostElmSize = (ghostElm, width, height) => {
|
9696
|
-
setSizeProp(ghostElm, 'width', width);
|
9697
|
-
setSizeProp(ghostElm, 'height', height);
|
9698
|
-
};
|
9699
|
-
const resizeGhostElement = e => {
|
9700
|
-
let deltaX, deltaY, proportional;
|
9701
|
-
let resizeHelperX, resizeHelperY;
|
9702
|
-
deltaX = e.screenX - startX;
|
9703
|
-
deltaY = e.screenY - startY;
|
9704
|
-
width = deltaX * selectedHandle[2] + startW;
|
9705
|
-
height = deltaY * selectedHandle[3] + startH;
|
9706
|
-
width = width < 5 ? 5 : width;
|
9707
|
-
height = height < 5 ? 5 : height;
|
9708
|
-
if ((isImage(selectedElm) || isMedia(selectedElm)) && getResizeImgProportional(editor) !== false) {
|
9709
|
-
proportional = !VK.modifierPressed(e);
|
9710
|
-
} else {
|
9711
|
-
proportional = VK.modifierPressed(e);
|
9712
|
-
}
|
9713
|
-
if (proportional) {
|
9714
|
-
if (abs(deltaX) > abs(deltaY)) {
|
9715
|
-
height = round$1(width * ratio);
|
9716
|
-
width = round$1(height / ratio);
|
9717
|
-
} else {
|
9718
|
-
width = round$1(height / ratio);
|
9719
|
-
height = round$1(width * ratio);
|
9720
|
-
}
|
9721
|
-
}
|
9722
|
-
setGhostElmSize(selectedElmGhost, width, height);
|
9723
|
-
resizeHelperX = selectedHandle.startPos.x + deltaX;
|
9724
|
-
resizeHelperY = selectedHandle.startPos.y + deltaY;
|
9725
|
-
resizeHelperX = resizeHelperX > 0 ? resizeHelperX : 0;
|
9726
|
-
resizeHelperY = resizeHelperY > 0 ? resizeHelperY : 0;
|
9727
|
-
dom.setStyles(resizeHelper, {
|
9728
|
-
left: resizeHelperX,
|
9729
|
-
top: resizeHelperY,
|
9730
|
-
display: 'block'
|
9731
|
-
});
|
9732
|
-
resizeHelper.innerHTML = width + ' × ' + height;
|
9733
|
-
if (selectedHandle[2] < 0 && selectedElmGhost.clientWidth <= width) {
|
9734
|
-
dom.setStyle(selectedElmGhost, 'left', selectedElmX + (startW - width));
|
9735
|
-
}
|
9736
|
-
if (selectedHandle[3] < 0 && selectedElmGhost.clientHeight <= height) {
|
9737
|
-
dom.setStyle(selectedElmGhost, 'top', selectedElmY + (startH - height));
|
9738
|
-
}
|
9739
|
-
deltaX = rootElement.scrollWidth - startScrollWidth;
|
9740
|
-
deltaY = rootElement.scrollHeight - startScrollHeight;
|
9741
|
-
if (deltaX + deltaY !== 0) {
|
9742
|
-
dom.setStyles(resizeHelper, {
|
9743
|
-
left: resizeHelperX - deltaX,
|
9744
|
-
top: resizeHelperY - deltaY
|
9745
|
-
});
|
9746
|
-
}
|
9747
|
-
if (!resizeStarted) {
|
9748
|
-
fireObjectResizeStart(editor, selectedElm, startW, startH, 'corner-' + selectedHandle.name);
|
9749
|
-
resizeStarted = true;
|
9750
|
-
}
|
9751
|
-
};
|
9752
|
-
const endGhostResize = () => {
|
9753
|
-
const wasResizeStarted = resizeStarted;
|
9754
|
-
resizeStarted = false;
|
9755
|
-
if (wasResizeStarted) {
|
9756
|
-
setSizeProp(selectedElm, 'width', width);
|
9757
|
-
setSizeProp(selectedElm, 'height', height);
|
9758
|
-
}
|
9759
|
-
dom.unbind(editableDoc, 'mousemove', resizeGhostElement);
|
9760
|
-
dom.unbind(editableDoc, 'mouseup', endGhostResize);
|
9761
|
-
if (rootDocument !== editableDoc) {
|
9762
|
-
dom.unbind(rootDocument, 'mousemove', resizeGhostElement);
|
9763
|
-
dom.unbind(rootDocument, 'mouseup', endGhostResize);
|
9764
|
-
}
|
9765
|
-
dom.remove(selectedElmGhost);
|
9766
|
-
dom.remove(resizeHelper);
|
9767
|
-
dom.remove(resizeBackdrop);
|
9768
|
-
showResizeRect(selectedElm);
|
9769
|
-
if (wasResizeStarted) {
|
9770
|
-
fireObjectResized(editor, selectedElm, width, height, 'corner-' + selectedHandle.name);
|
9771
|
-
dom.setAttrib(selectedElm, 'style', dom.getAttrib(selectedElm, 'style'));
|
9772
|
-
}
|
9773
|
-
editor.nodeChanged();
|
9774
|
-
};
|
9775
|
-
const showResizeRect = targetElm => {
|
9776
|
-
unbindResizeHandleEvents();
|
9777
|
-
const position = dom.getPos(targetElm, rootElement);
|
9778
|
-
const selectedElmX = position.x;
|
9779
|
-
const selectedElmY = position.y;
|
9780
|
-
const rect = targetElm.getBoundingClientRect();
|
9781
|
-
const targetWidth = rect.width || rect.right - rect.left;
|
9782
|
-
const targetHeight = rect.height || rect.bottom - rect.top;
|
9783
|
-
if (selectedElm !== targetElm) {
|
9784
|
-
hideResizeRect();
|
9785
|
-
selectedElm = targetElm;
|
9786
|
-
width = height = 0;
|
9787
|
-
}
|
9788
|
-
const e = editor.dispatch('ObjectSelected', { target: targetElm });
|
9789
|
-
if (isResizable(targetElm) && !e.isDefaultPrevented()) {
|
9790
|
-
each$d(resizeHandles, (handle, name) => {
|
9791
|
-
const startDrag = e => {
|
9792
|
-
const target = getResizeTargets(selectedElm)[0];
|
9793
|
-
startX = e.screenX;
|
9794
|
-
startY = e.screenY;
|
9795
|
-
startW = target.clientWidth;
|
9796
|
-
startH = target.clientHeight;
|
9797
|
-
ratio = startH / startW;
|
9798
|
-
selectedHandle = handle;
|
9799
|
-
selectedHandle.name = name;
|
9800
|
-
selectedHandle.startPos = {
|
9801
|
-
x: targetWidth * handle[0] + selectedElmX,
|
9802
|
-
y: targetHeight * handle[1] + selectedElmY
|
9803
|
-
};
|
9804
|
-
startScrollWidth = rootElement.scrollWidth;
|
9805
|
-
startScrollHeight = rootElement.scrollHeight;
|
9806
|
-
resizeBackdrop = dom.add(rootElement, 'div', {
|
9807
|
-
'class': 'mce-resize-backdrop',
|
9808
|
-
'data-mce-bogus': 'all'
|
9809
|
-
});
|
9810
|
-
dom.setStyles(resizeBackdrop, {
|
9811
|
-
position: 'fixed',
|
9812
|
-
left: '0',
|
9813
|
-
top: '0',
|
9814
|
-
width: '100%',
|
9815
|
-
height: '100%'
|
9816
|
-
});
|
9817
|
-
selectedElmGhost = createGhostElement(dom, selectedElm);
|
9818
|
-
dom.addClass(selectedElmGhost, 'mce-clonedresizable');
|
9819
|
-
dom.setAttrib(selectedElmGhost, 'data-mce-bogus', 'all');
|
9820
|
-
selectedElmGhost.contentEditable = 'false';
|
9821
|
-
dom.setStyles(selectedElmGhost, {
|
9822
|
-
left: selectedElmX,
|
9823
|
-
top: selectedElmY,
|
9824
|
-
margin: 0
|
9825
|
-
});
|
9826
|
-
setGhostElmSize(selectedElmGhost, targetWidth, targetHeight);
|
9827
|
-
selectedElmGhost.removeAttribute(elementSelectionAttr);
|
9828
|
-
rootElement.appendChild(selectedElmGhost);
|
9829
|
-
dom.bind(editableDoc, 'mousemove', resizeGhostElement);
|
9830
|
-
dom.bind(editableDoc, 'mouseup', endGhostResize);
|
9831
|
-
if (rootDocument !== editableDoc) {
|
9832
|
-
dom.bind(rootDocument, 'mousemove', resizeGhostElement);
|
9833
|
-
dom.bind(rootDocument, 'mouseup', endGhostResize);
|
9834
|
-
}
|
9835
|
-
resizeHelper = dom.add(rootElement, 'div', {
|
9836
|
-
'class': 'mce-resize-helper',
|
9837
|
-
'data-mce-bogus': 'all'
|
9838
|
-
}, startW + ' × ' + startH);
|
9839
|
-
};
|
9840
|
-
let handleElm = dom.get('mceResizeHandle' + name);
|
9841
|
-
if (handleElm) {
|
9842
|
-
dom.remove(handleElm);
|
9843
|
-
}
|
9844
|
-
handleElm = dom.add(rootElement, 'div', {
|
9845
|
-
'id': 'mceResizeHandle' + name,
|
9846
|
-
'data-mce-bogus': 'all',
|
9847
|
-
'class': 'mce-resizehandle',
|
9848
|
-
'unselectable': true,
|
9849
|
-
'style': 'cursor:' + name + '-resize; margin:0; padding:0'
|
9850
|
-
});
|
9851
|
-
dom.bind(handleElm, 'mousedown', e => {
|
9852
|
-
e.stopImmediatePropagation();
|
9853
|
-
e.preventDefault();
|
9854
|
-
startDrag(e);
|
9855
|
-
});
|
9856
|
-
handle.elm = handleElm;
|
9857
|
-
dom.setStyles(handleElm, {
|
9858
|
-
left: targetWidth * handle[0] + selectedElmX - handleElm.offsetWidth / 2,
|
9859
|
-
top: targetHeight * handle[1] + selectedElmY - handleElm.offsetHeight / 2
|
9860
|
-
});
|
9861
|
-
});
|
9862
|
-
} else {
|
9863
|
-
hideResizeRect(false);
|
9864
|
-
}
|
9865
|
-
};
|
9866
|
-
const throttledShowResizeRect = first$1(showResizeRect, 0);
|
9867
|
-
const hideResizeRect = (removeSelected = true) => {
|
9868
|
-
throttledShowResizeRect.cancel();
|
9869
|
-
unbindResizeHandleEvents();
|
9870
|
-
if (selectedElm && removeSelected) {
|
9871
|
-
selectedElm.removeAttribute(elementSelectionAttr);
|
9872
|
-
}
|
9873
|
-
each$d(resizeHandles, (value, name) => {
|
9874
|
-
const handleElm = dom.get('mceResizeHandle' + name);
|
9875
|
-
if (handleElm) {
|
9876
|
-
dom.unbind(handleElm);
|
9877
|
-
dom.remove(handleElm);
|
9878
|
-
}
|
9879
|
-
});
|
9880
|
-
};
|
9881
|
-
const isChildOrEqual = (node, parent) => dom.isChildOf(node, parent);
|
9882
|
-
const updateResizeRect = e => {
|
9883
|
-
if (resizeStarted || editor.removed || editor.composing) {
|
9884
|
-
return;
|
9885
|
-
}
|
9886
|
-
const targetElm = e.type === 'mousedown' ? e.target : selection.getNode();
|
9887
|
-
const controlElm = closest$3(SugarElement.fromDom(targetElm), controlElmSelector).map(e => e.dom).filter(e => dom.isEditable(e.parentElement) || e.nodeName === 'IMG' && dom.isEditable(e)).getOrUndefined();
|
9888
|
-
const selectedValue = isNonNullable(controlElm) ? dom.getAttrib(controlElm, elementSelectionAttr, '1') : '1';
|
9889
|
-
each$e(dom.select(`img[${ elementSelectionAttr }],hr[${ elementSelectionAttr }]`), img => {
|
9890
|
-
img.removeAttribute(elementSelectionAttr);
|
9891
|
-
});
|
9892
|
-
if (isNonNullable(controlElm) && isChildOrEqual(controlElm, rootElement) && editor.hasFocus()) {
|
9893
|
-
disableGeckoResize();
|
9894
|
-
const startElm = selection.getStart(true);
|
9895
|
-
if (isChildOrEqual(startElm, controlElm) && isChildOrEqual(selection.getEnd(true), controlElm)) {
|
9896
|
-
dom.setAttrib(controlElm, elementSelectionAttr, selectedValue);
|
9897
|
-
throttledShowResizeRect.throttle(controlElm);
|
9898
|
-
return;
|
9899
|
-
}
|
9900
|
-
}
|
9901
|
-
hideResizeRect();
|
9902
|
-
};
|
9903
|
-
const unbindResizeHandleEvents = () => {
|
9904
|
-
each$d(resizeHandles, handle => {
|
9905
|
-
if (handle.elm) {
|
9906
|
-
dom.unbind(handle.elm);
|
9907
|
-
delete handle.elm;
|
9908
|
-
}
|
9909
|
-
});
|
9910
|
-
};
|
9911
|
-
const disableGeckoResize = () => {
|
9912
|
-
try {
|
9913
|
-
editor.getDoc().execCommand('enableObjectResizing', false, 'false');
|
9914
|
-
} catch (ex) {
|
9915
|
-
}
|
9916
|
-
};
|
9917
|
-
editor.on('init', () => {
|
9918
|
-
disableGeckoResize();
|
9919
|
-
editor.on('NodeChange ResizeEditor ResizeWindow ResizeContent drop', updateResizeRect);
|
9920
|
-
editor.on('keyup compositionend', e => {
|
9921
|
-
if (selectedElm && selectedElm.nodeName === 'TABLE') {
|
9922
|
-
updateResizeRect(e);
|
9923
|
-
}
|
9924
|
-
});
|
9925
|
-
editor.on('hide blur', hideResizeRect);
|
9926
|
-
editor.on('contextmenu longpress', contextMenuSelectImage, true);
|
9927
|
-
});
|
9928
|
-
editor.on('remove', unbindResizeHandleEvents);
|
9929
|
-
const destroy = () => {
|
9930
|
-
throttledShowResizeRect.cancel();
|
9931
|
-
selectedElm = selectedElmGhost = resizeBackdrop = null;
|
9932
|
-
};
|
9933
|
-
return {
|
9934
|
-
isResizable,
|
9935
|
-
showResizeRect,
|
9936
|
-
hideResizeRect,
|
9937
|
-
updateResizeRect,
|
9938
|
-
destroy
|
9939
|
-
};
|
9940
|
-
};
|
9941
|
-
|
9942
|
-
const setStart = (rng, situ) => {
|
9943
|
-
situ.fold(e => {
|
9944
|
-
rng.setStartBefore(e.dom);
|
9945
|
-
}, (e, o) => {
|
9946
|
-
rng.setStart(e.dom, o);
|
9947
|
-
}, e => {
|
9948
|
-
rng.setStartAfter(e.dom);
|
9949
|
-
});
|
9950
|
-
};
|
9951
|
-
const setFinish = (rng, situ) => {
|
9952
|
-
situ.fold(e => {
|
9953
|
-
rng.setEndBefore(e.dom);
|
9954
|
-
}, (e, o) => {
|
9955
|
-
rng.setEnd(e.dom, o);
|
9956
|
-
}, e => {
|
9957
|
-
rng.setEndAfter(e.dom);
|
9958
|
-
});
|
9959
|
-
};
|
9960
|
-
const relativeToNative = (win, startSitu, finishSitu) => {
|
9961
|
-
const range = win.document.createRange();
|
9962
|
-
setStart(range, startSitu);
|
9963
|
-
setFinish(range, finishSitu);
|
9964
|
-
return range;
|
9965
|
-
};
|
9966
|
-
const exactToNative = (win, start, soffset, finish, foffset) => {
|
9967
|
-
const rng = win.document.createRange();
|
9968
|
-
rng.setStart(start.dom, soffset);
|
9969
|
-
rng.setEnd(finish.dom, foffset);
|
9970
|
-
return rng;
|
9971
|
-
};
|
9972
|
-
|
9973
|
-
const adt$3 = Adt.generate([
|
9974
|
-
{
|
9975
|
-
ltr: [
|
9976
|
-
'start',
|
9977
|
-
'soffset',
|
9978
|
-
'finish',
|
9979
|
-
'foffset'
|
9980
|
-
]
|
9981
|
-
},
|
9982
|
-
{
|
9983
|
-
rtl: [
|
9984
|
-
'start',
|
9985
|
-
'soffset',
|
9986
|
-
'finish',
|
9987
|
-
'foffset'
|
9988
|
-
]
|
9989
|
-
}
|
9990
|
-
]);
|
9991
|
-
const fromRange = (win, type, range) => type(SugarElement.fromDom(range.startContainer), range.startOffset, SugarElement.fromDom(range.endContainer), range.endOffset);
|
9992
|
-
const getRanges = (win, selection) => selection.match({
|
9993
|
-
domRange: rng => {
|
9994
|
-
return {
|
9995
|
-
ltr: constant(rng),
|
9996
|
-
rtl: Optional.none
|
9997
|
-
};
|
9998
|
-
},
|
9999
|
-
relative: (startSitu, finishSitu) => {
|
10000
|
-
return {
|
10001
|
-
ltr: cached(() => relativeToNative(win, startSitu, finishSitu)),
|
10002
|
-
rtl: cached(() => Optional.some(relativeToNative(win, finishSitu, startSitu)))
|
10003
|
-
};
|
10004
|
-
},
|
10005
|
-
exact: (start, soffset, finish, foffset) => {
|
10006
|
-
return {
|
10007
|
-
ltr: cached(() => exactToNative(win, start, soffset, finish, foffset)),
|
10008
|
-
rtl: cached(() => Optional.some(exactToNative(win, finish, foffset, start, soffset)))
|
10009
|
-
};
|
10010
|
-
}
|
10011
|
-
});
|
10012
|
-
const doDiagnose = (win, ranges) => {
|
10013
|
-
const rng = ranges.ltr();
|
10014
|
-
if (rng.collapsed) {
|
10015
|
-
const reversed = ranges.rtl().filter(rev => rev.collapsed === false);
|
10016
|
-
return reversed.map(rev => adt$3.rtl(SugarElement.fromDom(rev.endContainer), rev.endOffset, SugarElement.fromDom(rev.startContainer), rev.startOffset)).getOrThunk(() => fromRange(win, adt$3.ltr, rng));
|
10017
|
-
} else {
|
10018
|
-
return fromRange(win, adt$3.ltr, rng);
|
10019
|
-
}
|
10020
|
-
};
|
10021
|
-
const diagnose = (win, selection) => {
|
10022
|
-
const ranges = getRanges(win, selection);
|
10023
|
-
return doDiagnose(win, ranges);
|
10024
|
-
};
|
10025
|
-
adt$3.ltr;
|
10026
|
-
adt$3.rtl;
|
10027
|
-
|
10028
|
-
const create$9 = (start, soffset, finish, foffset) => ({
|
10029
|
-
start,
|
10030
|
-
soffset,
|
10031
|
-
finish,
|
10032
|
-
foffset
|
10033
|
-
});
|
10034
|
-
const SimRange = { create: create$9 };
|
10035
|
-
|
10036
|
-
const caretPositionFromPoint = (doc, x, y) => {
|
10037
|
-
var _a;
|
10038
|
-
return Optional.from((_a = doc.caretPositionFromPoint) === null || _a === void 0 ? void 0 : _a.call(doc, x, y)).bind(pos => {
|
10039
|
-
if (pos.offsetNode === null) {
|
10040
|
-
return Optional.none();
|
9829
|
+
if (focusedEditor !== editor) {
|
9830
|
+
if (focusedEditor) {
|
9831
|
+
focusedEditor.dispatch('blur', { focusedEditor: editor });
|
9832
|
+
}
|
9833
|
+
editorManager.setActive(editor);
|
9834
|
+
editorManager.focusedEditor = editor;
|
9835
|
+
editor.dispatch('focus', { blurredEditor: focusedEditor });
|
9836
|
+
editor.focus(true);
|
10041
9837
|
}
|
10042
|
-
const r = doc.createRange();
|
10043
|
-
r.setStart(pos.offsetNode, pos.offset);
|
10044
|
-
r.collapse();
|
10045
|
-
return Optional.some(r);
|
10046
9838
|
});
|
10047
|
-
|
10048
|
-
|
10049
|
-
|
10050
|
-
|
10051
|
-
|
10052
|
-
|
10053
|
-
|
10054
|
-
|
10055
|
-
|
10056
|
-
|
10057
|
-
|
10058
|
-
|
9839
|
+
editor.on('focusout', () => {
|
9840
|
+
Delay.setEditorTimeout(editor, () => {
|
9841
|
+
const focusedEditor = editorManager.focusedEditor;
|
9842
|
+
if (!isEditorContentAreaElement(getActiveElement(editor)) || focusedEditor !== editor) {
|
9843
|
+
toggleContentAreaOnFocus(editor, remove$6);
|
9844
|
+
}
|
9845
|
+
if (!isUIElement(editor, getActiveElement(editor)) && focusedEditor === editor) {
|
9846
|
+
editor.dispatch('blur', { focusedEditor: null });
|
9847
|
+
editorManager.focusedEditor = null;
|
9848
|
+
}
|
9849
|
+
});
|
9850
|
+
});
|
9851
|
+
if (!documentFocusInHandler) {
|
9852
|
+
documentFocusInHandler = e => {
|
9853
|
+
const activeEditor = editorManager.activeEditor;
|
9854
|
+
if (activeEditor) {
|
9855
|
+
getOriginalEventTarget(e).each(target => {
|
9856
|
+
const elem = target;
|
9857
|
+
if (elem.ownerDocument === document) {
|
9858
|
+
if (elem !== document.body && !isUIElement(activeEditor, elem) && editorManager.focusedEditor === activeEditor) {
|
9859
|
+
activeEditor.dispatch('blur', { focusedEditor: null });
|
9860
|
+
editorManager.focusedEditor = null;
|
9861
|
+
}
|
9862
|
+
}
|
9863
|
+
});
|
9864
|
+
}
|
9865
|
+
};
|
9866
|
+
DOM$9.bind(document, 'focusin', documentFocusInHandler);
|
10059
9867
|
}
|
10060
9868
|
};
|
10061
|
-
const
|
10062
|
-
|
10063
|
-
|
10064
|
-
|
10065
|
-
|
10066
|
-
|
10067
|
-
|
10068
|
-
{
|
10069
|
-
on: [
|
10070
|
-
'element',
|
10071
|
-
'offset'
|
10072
|
-
]
|
10073
|
-
},
|
10074
|
-
{ after: ['element'] }
|
10075
|
-
]);
|
10076
|
-
const cata = (subject, onBefore, onOn, onAfter) => subject.fold(onBefore, onOn, onAfter);
|
10077
|
-
const getStart$2 = situ => situ.fold(identity, identity, identity);
|
10078
|
-
const before$1 = adt$2.before;
|
10079
|
-
const on = adt$2.on;
|
10080
|
-
const after$1 = adt$2.after;
|
10081
|
-
const Situ = {
|
10082
|
-
before: before$1,
|
10083
|
-
on,
|
10084
|
-
after: after$1,
|
10085
|
-
cata,
|
10086
|
-
getStart: getStart$2
|
10087
|
-
};
|
10088
|
-
|
10089
|
-
const adt$1 = Adt.generate([
|
10090
|
-
{ domRange: ['rng'] },
|
10091
|
-
{
|
10092
|
-
relative: [
|
10093
|
-
'startSitu',
|
10094
|
-
'finishSitu'
|
10095
|
-
]
|
10096
|
-
},
|
10097
|
-
{
|
10098
|
-
exact: [
|
10099
|
-
'start',
|
10100
|
-
'soffset',
|
10101
|
-
'finish',
|
10102
|
-
'foffset'
|
10103
|
-
]
|
9869
|
+
const unregisterDocumentEvents = (editorManager, e) => {
|
9870
|
+
if (editorManager.focusedEditor === e.editor) {
|
9871
|
+
editorManager.focusedEditor = null;
|
9872
|
+
}
|
9873
|
+
if (!editorManager.activeEditor && documentFocusInHandler) {
|
9874
|
+
DOM$9.unbind(document, 'focusin', documentFocusInHandler);
|
9875
|
+
documentFocusInHandler = null;
|
10104
9876
|
}
|
10105
|
-
]);
|
10106
|
-
const exactFromRange = simRange => adt$1.exact(simRange.start, simRange.soffset, simRange.finish, simRange.foffset);
|
10107
|
-
const getStart$1 = selection => selection.match({
|
10108
|
-
domRange: rng => SugarElement.fromDom(rng.startContainer),
|
10109
|
-
relative: (startSitu, _finishSitu) => Situ.getStart(startSitu),
|
10110
|
-
exact: (start, _soffset, _finish, _foffset) => start
|
10111
|
-
});
|
10112
|
-
const domRange = adt$1.domRange;
|
10113
|
-
const relative = adt$1.relative;
|
10114
|
-
const exact = adt$1.exact;
|
10115
|
-
const getWin = selection => {
|
10116
|
-
const start = getStart$1(selection);
|
10117
|
-
return defaultView(start);
|
10118
9877
|
};
|
10119
|
-
const
|
10120
|
-
|
10121
|
-
|
10122
|
-
relative,
|
10123
|
-
exact,
|
10124
|
-
exactFromRange,
|
10125
|
-
getWin,
|
10126
|
-
range
|
9878
|
+
const setup$w = editorManager => {
|
9879
|
+
editorManager.on('AddEditor', curry(registerEvents$1, editorManager));
|
9880
|
+
editorManager.on('RemoveEditor', curry(unregisterDocumentEvents, editorManager));
|
10127
9881
|
};
|
10128
9882
|
|
10129
|
-
const
|
10130
|
-
|
10131
|
-
|
10132
|
-
|
10133
|
-
|
10134
|
-
|
10135
|
-
|
10136
|
-
|
10137
|
-
return Situ.on(element, offset);
|
9883
|
+
const getContentEditableHost = (editor, node) => editor.dom.getParent(node, node => editor.dom.getContentEditable(node) === 'true');
|
9884
|
+
const hasContentEditableFalseParent$1 = (editor, node) => editor.dom.getParent(node, node => editor.dom.getContentEditable(node) === 'false') !== null;
|
9885
|
+
const getCollapsedNode = rng => rng.collapsed ? Optional.from(getNode$1(rng.startContainer, rng.startOffset)).map(SugarElement.fromDom) : Optional.none();
|
9886
|
+
const getFocusInElement = (root, rng) => getCollapsedNode(rng).bind(node => {
|
9887
|
+
if (isTableSection(node)) {
|
9888
|
+
return Optional.some(node);
|
9889
|
+
} else if (!contains(root, node)) {
|
9890
|
+
return Optional.some(root);
|
10138
9891
|
} else {
|
10139
|
-
return
|
9892
|
+
return Optional.none();
|
10140
9893
|
}
|
10141
|
-
};
|
10142
|
-
const preprocessRelative = (startSitu, finishSitu) => {
|
10143
|
-
const start = startSitu.fold(Situ.before, beforeSpecial, Situ.after);
|
10144
|
-
const finish = finishSitu.fold(Situ.before, beforeSpecial, Situ.after);
|
10145
|
-
return SimSelection.relative(start, finish);
|
10146
|
-
};
|
10147
|
-
const preprocessExact = (start, soffset, finish, foffset) => {
|
10148
|
-
const startSitu = beforeSpecial(start, soffset);
|
10149
|
-
const finishSitu = beforeSpecial(finish, foffset);
|
10150
|
-
return SimSelection.relative(startSitu, finishSitu);
|
10151
|
-
};
|
10152
|
-
const preprocess = selection => selection.match({
|
10153
|
-
domRange: rng => {
|
10154
|
-
const start = SugarElement.fromDom(rng.startContainer);
|
10155
|
-
const finish = SugarElement.fromDom(rng.endContainer);
|
10156
|
-
return preprocessExact(start, rng.startOffset, finish, rng.endOffset);
|
10157
|
-
},
|
10158
|
-
relative: preprocessRelative,
|
10159
|
-
exact: preprocessExact
|
10160
9894
|
});
|
10161
|
-
|
10162
|
-
|
10163
|
-
|
10164
|
-
|
10165
|
-
|
10166
|
-
|
10167
|
-
});
|
10168
|
-
return SugarElement.fromDom(fragment);
|
10169
|
-
};
|
10170
|
-
|
10171
|
-
const toNative = selection => {
|
10172
|
-
const win = SimSelection.getWin(selection).dom;
|
10173
|
-
const getDomRange = (start, soffset, finish, foffset) => exactToNative(win, start, soffset, finish, foffset);
|
10174
|
-
const filtered = preprocess(selection);
|
10175
|
-
return diagnose(win, filtered).match({
|
10176
|
-
ltr: getDomRange,
|
10177
|
-
rtl: getDomRange
|
10178
|
-
});
|
10179
|
-
};
|
10180
|
-
const getAtPoint = (win, x, y) => fromPoint$1(win, x, y);
|
10181
|
-
|
10182
|
-
const fromPoint = (clientX, clientY, doc) => {
|
10183
|
-
const win = defaultView(SugarElement.fromDom(doc));
|
10184
|
-
return getAtPoint(win.dom, clientX, clientY).map(simRange => {
|
10185
|
-
const rng = doc.createRange();
|
10186
|
-
rng.setStart(simRange.start.dom, simRange.soffset);
|
10187
|
-
rng.setEnd(simRange.finish.dom, simRange.foffset);
|
10188
|
-
return rng;
|
10189
|
-
}).getOrUndefined();
|
10190
|
-
};
|
10191
|
-
|
10192
|
-
const isEq$4 = (rng1, rng2) => {
|
10193
|
-
return isNonNullable(rng1) && isNonNullable(rng2) && (rng1.startContainer === rng2.startContainer && rng1.startOffset === rng2.startOffset) && (rng1.endContainer === rng2.endContainer && rng1.endOffset === rng2.endOffset);
|
10194
|
-
};
|
10195
|
-
|
10196
|
-
const findParent = (node, rootNode, predicate) => {
|
10197
|
-
let currentNode = node;
|
10198
|
-
while (currentNode && currentNode !== rootNode) {
|
10199
|
-
if (predicate(currentNode)) {
|
10200
|
-
return currentNode;
|
10201
|
-
}
|
10202
|
-
currentNode = currentNode.parentNode;
|
10203
|
-
}
|
10204
|
-
return null;
|
10205
|
-
};
|
10206
|
-
const hasParent$1 = (node, rootNode, predicate) => findParent(node, rootNode, predicate) !== null;
|
10207
|
-
const hasParentWithName = (node, rootNode, name) => hasParent$1(node, rootNode, node => node.nodeName === name);
|
10208
|
-
const isCeFalseCaretContainer = (node, rootNode) => isCaretContainer$2(node) && !hasParent$1(node, rootNode, isCaretNode);
|
10209
|
-
const hasBrBeforeAfter = (dom, node, left) => {
|
10210
|
-
const parentNode = node.parentNode;
|
10211
|
-
if (parentNode) {
|
10212
|
-
const walker = new DomTreeWalker(node, dom.getParent(parentNode, dom.isBlock) || dom.getRoot());
|
10213
|
-
let currentNode;
|
10214
|
-
while (currentNode = walker[left ? 'prev' : 'next']()) {
|
10215
|
-
if (isBr$6(currentNode)) {
|
10216
|
-
return true;
|
10217
|
-
}
|
10218
|
-
}
|
10219
|
-
}
|
10220
|
-
return false;
|
10221
|
-
};
|
10222
|
-
const isPrevNode = (node, name) => {
|
10223
|
-
var _a;
|
10224
|
-
return ((_a = node.previousSibling) === null || _a === void 0 ? void 0 : _a.nodeName) === name;
|
9895
|
+
const normalizeSelection = (editor, rng) => {
|
9896
|
+
getFocusInElement(SugarElement.fromDom(editor.getBody()), rng).bind(elm => {
|
9897
|
+
return firstPositionIn(elm.dom);
|
9898
|
+
}).fold(() => {
|
9899
|
+
editor.selection.normalize();
|
9900
|
+
}, caretPos => editor.selection.setRng(caretPos.toRange()));
|
10225
9901
|
};
|
10226
|
-
const
|
10227
|
-
|
10228
|
-
|
10229
|
-
|
10230
|
-
|
9902
|
+
const focusBody = body => {
|
9903
|
+
if (body.setActive) {
|
9904
|
+
try {
|
9905
|
+
body.setActive();
|
9906
|
+
} catch (ex) {
|
9907
|
+
body.focus();
|
10231
9908
|
}
|
10232
|
-
|
10233
|
-
|
10234
|
-
return false;
|
10235
|
-
};
|
10236
|
-
const findTextNodeRelative = (dom, isAfterNode, collapsed, left, startNode) => {
|
10237
|
-
const body = dom.getRoot();
|
10238
|
-
const nonEmptyElementsMap = dom.schema.getNonEmptyElements();
|
10239
|
-
const parentNode = startNode.parentNode;
|
10240
|
-
let lastInlineElement;
|
10241
|
-
let node;
|
10242
|
-
if (!parentNode) {
|
10243
|
-
return Optional.none();
|
9909
|
+
} else {
|
9910
|
+
body.focus();
|
10244
9911
|
}
|
10245
|
-
|
10246
|
-
|
10247
|
-
|
9912
|
+
};
|
9913
|
+
const hasElementFocus = elm => hasFocus$1(elm) || search(elm).isSome();
|
9914
|
+
const hasIframeFocus = editor => isNonNullable(editor.iframeElement) && hasFocus$1(SugarElement.fromDom(editor.iframeElement));
|
9915
|
+
const hasInlineFocus = editor => {
|
9916
|
+
const rawBody = editor.getBody();
|
9917
|
+
return rawBody && hasElementFocus(SugarElement.fromDom(rawBody));
|
9918
|
+
};
|
9919
|
+
const hasUiFocus = editor => {
|
9920
|
+
const dos = getRootNode(SugarElement.fromDom(editor.getElement()));
|
9921
|
+
return active$1(dos).filter(elem => !isEditorContentAreaElement(elem.dom) && isUIElement(editor, elem.dom)).isSome();
|
9922
|
+
};
|
9923
|
+
const hasFocus = editor => editor.inline ? hasInlineFocus(editor) : hasIframeFocus(editor);
|
9924
|
+
const hasEditorOrUiFocus = editor => hasFocus(editor) || hasUiFocus(editor);
|
9925
|
+
const focusEditor = editor => {
|
9926
|
+
const selection = editor.selection;
|
9927
|
+
const body = editor.getBody();
|
9928
|
+
let rng = selection.getRng();
|
9929
|
+
editor.quirks.refreshContentEditable();
|
9930
|
+
const restoreBookmark = editor => {
|
9931
|
+
getRng(editor).each(bookmarkRng => {
|
9932
|
+
editor.selection.setRng(bookmarkRng);
|
9933
|
+
rng = bookmarkRng;
|
9934
|
+
});
|
9935
|
+
};
|
9936
|
+
if (!hasFocus(editor) && editor.hasEditableRoot()) {
|
9937
|
+
restoreBookmark(editor);
|
10248
9938
|
}
|
10249
|
-
const
|
10250
|
-
|
10251
|
-
if (
|
10252
|
-
|
10253
|
-
}
|
10254
|
-
if (isText$b(node) && node.data.length > 0) {
|
10255
|
-
if (!hasParentWithName(node, body, 'A')) {
|
10256
|
-
return Optional.some(CaretPosition(node, left ? node.data.length : 0));
|
10257
|
-
}
|
10258
|
-
return Optional.none();
|
9939
|
+
const contentEditableHost = getContentEditableHost(editor, selection.getNode());
|
9940
|
+
if (contentEditableHost && editor.dom.isChildOf(contentEditableHost, body)) {
|
9941
|
+
if (!hasContentEditableFalseParent$1(editor, contentEditableHost)) {
|
9942
|
+
focusBody(body);
|
10259
9943
|
}
|
10260
|
-
|
10261
|
-
|
9944
|
+
focusBody(contentEditableHost);
|
9945
|
+
if (!editor.hasEditableRoot()) {
|
9946
|
+
restoreBookmark(editor);
|
10262
9947
|
}
|
10263
|
-
|
9948
|
+
normalizeSelection(editor, rng);
|
9949
|
+
activateEditor(editor);
|
9950
|
+
return;
|
10264
9951
|
}
|
10265
|
-
if (
|
10266
|
-
|
9952
|
+
if (!editor.inline) {
|
9953
|
+
if (!Env.browser.isOpera()) {
|
9954
|
+
focusBody(body);
|
9955
|
+
}
|
9956
|
+
editor.getWin().focus();
|
10267
9957
|
}
|
10268
|
-
if (
|
10269
|
-
|
9958
|
+
if (Env.browser.isFirefox() || editor.inline) {
|
9959
|
+
focusBody(body);
|
9960
|
+
normalizeSelection(editor, rng);
|
10270
9961
|
}
|
10271
|
-
|
9962
|
+
activateEditor(editor);
|
10272
9963
|
};
|
10273
|
-
const
|
10274
|
-
|
10275
|
-
|
10276
|
-
|
10277
|
-
let container = start ? rng.startContainer : rng.endContainer;
|
10278
|
-
let offset = start ? rng.startOffset : rng.endOffset;
|
10279
|
-
const isAfterNode = isElement$6(container) && offset === container.childNodes.length;
|
10280
|
-
const nonEmptyElementsMap = dom.schema.getNonEmptyElements();
|
10281
|
-
let directionLeft = start;
|
10282
|
-
if (isCaretContainer$2(container)) {
|
10283
|
-
return Optional.none();
|
9964
|
+
const activateEditor = editor => editor.editorManager.setActive(editor);
|
9965
|
+
const focus = (editor, skipFocus) => {
|
9966
|
+
if (editor.removed) {
|
9967
|
+
return;
|
10284
9968
|
}
|
10285
|
-
if (
|
10286
|
-
|
9969
|
+
if (skipFocus) {
|
9970
|
+
activateEditor(editor);
|
9971
|
+
} else {
|
9972
|
+
focusEditor(editor);
|
10287
9973
|
}
|
10288
|
-
|
10289
|
-
|
10290
|
-
|
9974
|
+
};
|
9975
|
+
|
9976
|
+
const VK = {
|
9977
|
+
BACKSPACE: 8,
|
9978
|
+
DELETE: 46,
|
9979
|
+
DOWN: 40,
|
9980
|
+
ENTER: 13,
|
9981
|
+
ESC: 27,
|
9982
|
+
LEFT: 37,
|
9983
|
+
RIGHT: 39,
|
9984
|
+
SPACEBAR: 32,
|
9985
|
+
TAB: 9,
|
9986
|
+
UP: 38,
|
9987
|
+
PAGE_UP: 33,
|
9988
|
+
PAGE_DOWN: 34,
|
9989
|
+
END: 35,
|
9990
|
+
HOME: 36,
|
9991
|
+
modifierPressed: e => {
|
9992
|
+
return e.shiftKey || e.ctrlKey || e.altKey || VK.metaKeyPressed(e);
|
9993
|
+
},
|
9994
|
+
metaKeyPressed: e => {
|
9995
|
+
return Env.os.isMacOS() || Env.os.isiOS() ? e.metaKey : e.ctrlKey && !e.altKey;
|
10291
9996
|
}
|
10292
|
-
|
10293
|
-
|
10294
|
-
|
10295
|
-
|
10296
|
-
|
10297
|
-
|
10298
|
-
|
10299
|
-
|
10300
|
-
|
10301
|
-
|
10302
|
-
|
9997
|
+
};
|
9998
|
+
|
9999
|
+
const elementSelectionAttr = 'data-mce-selected';
|
10000
|
+
const controlElmSelector = 'table,img,figure.image,hr,video,span.mce-preview-object,details';
|
10001
|
+
const abs = Math.abs;
|
10002
|
+
const round$1 = Math.round;
|
10003
|
+
const resizeHandles = {
|
10004
|
+
nw: [
|
10005
|
+
0,
|
10006
|
+
0,
|
10007
|
+
-1,
|
10008
|
+
-1
|
10009
|
+
],
|
10010
|
+
ne: [
|
10011
|
+
1,
|
10012
|
+
0,
|
10013
|
+
1,
|
10014
|
+
-1
|
10015
|
+
],
|
10016
|
+
se: [
|
10017
|
+
1,
|
10018
|
+
1,
|
10019
|
+
1,
|
10020
|
+
1
|
10021
|
+
],
|
10022
|
+
sw: [
|
10023
|
+
0,
|
10024
|
+
1,
|
10025
|
+
-1,
|
10026
|
+
1
|
10027
|
+
]
|
10028
|
+
};
|
10029
|
+
const isTouchEvent = evt => evt.type === 'longpress' || evt.type.indexOf('touch') === 0;
|
10030
|
+
const ControlSelection = (selection, editor) => {
|
10031
|
+
const dom = editor.dom;
|
10032
|
+
const editableDoc = editor.getDoc();
|
10033
|
+
const rootDocument = document;
|
10034
|
+
const rootElement = editor.getBody();
|
10035
|
+
let selectedElm, selectedElmGhost, resizeHelper, selectedHandle, resizeBackdrop;
|
10036
|
+
let startX, startY, selectedElmX, selectedElmY, startW, startH, ratio, resizeStarted;
|
10037
|
+
let width;
|
10038
|
+
let height;
|
10039
|
+
let startScrollWidth;
|
10040
|
+
let startScrollHeight;
|
10041
|
+
const isImage = elm => isNonNullable(elm) && (isImg(elm) || dom.is(elm, 'figure.image'));
|
10042
|
+
const isMedia = elm => isMedia$2(elm) || dom.hasClass(elm, 'mce-preview-object');
|
10043
|
+
const isEventOnImageOutsideRange = (evt, range) => {
|
10044
|
+
if (isTouchEvent(evt)) {
|
10045
|
+
const touch = evt.touches[0];
|
10046
|
+
return isImage(evt.target) && !isXYWithinRange(touch.clientX, touch.clientY, range);
|
10047
|
+
} else {
|
10048
|
+
return isImage(evt.target) && !isXYWithinRange(evt.clientX, evt.clientY, range);
|
10303
10049
|
}
|
10304
|
-
|
10305
|
-
|
10306
|
-
|
10307
|
-
|
10308
|
-
|
10309
|
-
|
10310
|
-
|
10311
|
-
|
10312
|
-
|
10313
|
-
|
10314
|
-
|
10315
|
-
|
10316
|
-
|
10317
|
-
|
10318
|
-
|
10319
|
-
|
10320
|
-
|
10321
|
-
|
10322
|
-
|
10323
|
-
|
10324
|
-
|
10325
|
-
|
10326
|
-
|
10327
|
-
|
10328
|
-
|
10329
|
-
|
10330
|
-
|
10331
|
-
|
10332
|
-
|
10333
|
-
|
10334
|
-
|
10335
|
-
|
10336
|
-
|
10337
|
-
|
10338
|
-
|
10339
|
-
|
10340
|
-
|
10341
|
-
|
10050
|
+
};
|
10051
|
+
const contextMenuSelectImage = evt => {
|
10052
|
+
const target = evt.target;
|
10053
|
+
if (isEventOnImageOutsideRange(evt, editor.selection.getRng()) && !evt.isDefaultPrevented()) {
|
10054
|
+
editor.selection.select(target);
|
10055
|
+
}
|
10056
|
+
};
|
10057
|
+
const getResizeTargets = elm => {
|
10058
|
+
if (dom.hasClass(elm, 'mce-preview-object') && isNonNullable(elm.firstElementChild)) {
|
10059
|
+
return [
|
10060
|
+
elm,
|
10061
|
+
elm.firstElementChild
|
10062
|
+
];
|
10063
|
+
} else if (dom.is(elm, 'figure.image')) {
|
10064
|
+
return [elm.querySelector('img')];
|
10065
|
+
} else {
|
10066
|
+
return [elm];
|
10067
|
+
}
|
10068
|
+
};
|
10069
|
+
const isResizable = elm => {
|
10070
|
+
const selector = getObjectResizing(editor);
|
10071
|
+
if (!selector || editor.mode.isReadOnly()) {
|
10072
|
+
return false;
|
10073
|
+
}
|
10074
|
+
if (elm.getAttribute('data-mce-resize') === 'false') {
|
10075
|
+
return false;
|
10076
|
+
}
|
10077
|
+
if (elm === editor.getBody()) {
|
10078
|
+
return false;
|
10079
|
+
}
|
10080
|
+
if (dom.hasClass(elm, 'mce-preview-object') && isNonNullable(elm.firstElementChild)) {
|
10081
|
+
return is$1(SugarElement.fromDom(elm.firstElementChild), selector);
|
10082
|
+
} else {
|
10083
|
+
return is$1(SugarElement.fromDom(elm), selector);
|
10084
|
+
}
|
10085
|
+
};
|
10086
|
+
const createGhostElement = (dom, elm) => {
|
10087
|
+
if (isMedia(elm)) {
|
10088
|
+
return dom.create('img', { src: Env.transparentSrc });
|
10089
|
+
} else if (isTable$2(elm)) {
|
10090
|
+
const isNorth = startsWith(selectedHandle.name, 'n');
|
10091
|
+
const rowSelect = isNorth ? head : last$2;
|
10092
|
+
const tableElm = elm.cloneNode(true);
|
10093
|
+
rowSelect(dom.select('tr', tableElm)).each(tr => {
|
10094
|
+
const cells = dom.select('td,th', tr);
|
10095
|
+
dom.setStyle(tr, 'height', null);
|
10096
|
+
each$e(cells, cell => dom.setStyle(cell, 'height', null));
|
10097
|
+
});
|
10098
|
+
return tableElm;
|
10099
|
+
} else {
|
10100
|
+
return elm.cloneNode(true);
|
10342
10101
|
}
|
10343
|
-
}
|
10344
|
-
|
10345
|
-
if (
|
10346
|
-
|
10347
|
-
|
10348
|
-
|
10349
|
-
|
10102
|
+
};
|
10103
|
+
const setSizeProp = (element, name, value) => {
|
10104
|
+
if (isNonNullable(value)) {
|
10105
|
+
const targets = getResizeTargets(element);
|
10106
|
+
each$e(targets, target => {
|
10107
|
+
if (target.style[name] || !editor.schema.isValid(target.nodeName.toLowerCase(), name)) {
|
10108
|
+
dom.setStyle(target, name, value);
|
10109
|
+
} else {
|
10110
|
+
dom.setAttrib(target, name, '' + value);
|
10111
|
+
}
|
10350
10112
|
});
|
10351
10113
|
}
|
10352
|
-
|
10353
|
-
|
10354
|
-
|
10355
|
-
|
10356
|
-
|
10357
|
-
|
10358
|
-
|
10359
|
-
|
10360
|
-
|
10361
|
-
|
10362
|
-
|
10114
|
+
};
|
10115
|
+
const setGhostElmSize = (ghostElm, width, height) => {
|
10116
|
+
setSizeProp(ghostElm, 'width', width);
|
10117
|
+
setSizeProp(ghostElm, 'height', height);
|
10118
|
+
};
|
10119
|
+
const resizeGhostElement = e => {
|
10120
|
+
let deltaX, deltaY, proportional;
|
10121
|
+
let resizeHelperX, resizeHelperY;
|
10122
|
+
deltaX = e.screenX - startX;
|
10123
|
+
deltaY = e.screenY - startY;
|
10124
|
+
width = deltaX * selectedHandle[2] + startW;
|
10125
|
+
height = deltaY * selectedHandle[3] + startH;
|
10126
|
+
width = width < 5 ? 5 : width;
|
10127
|
+
height = height < 5 ? 5 : height;
|
10128
|
+
if ((isImage(selectedElm) || isMedia(selectedElm)) && getResizeImgProportional(editor) !== false) {
|
10129
|
+
proportional = !VK.modifierPressed(e);
|
10130
|
+
} else {
|
10131
|
+
proportional = VK.modifierPressed(e);
|
10132
|
+
}
|
10133
|
+
if (proportional) {
|
10134
|
+
if (abs(deltaX) > abs(deltaY)) {
|
10135
|
+
height = round$1(width * ratio);
|
10136
|
+
width = round$1(height / ratio);
|
10137
|
+
} else {
|
10138
|
+
width = round$1(height / ratio);
|
10139
|
+
height = round$1(width * ratio);
|
10363
10140
|
}
|
10364
10141
|
}
|
10365
|
-
|
10366
|
-
|
10367
|
-
|
10368
|
-
|
10369
|
-
|
10370
|
-
|
10142
|
+
setGhostElmSize(selectedElmGhost, width, height);
|
10143
|
+
resizeHelperX = selectedHandle.startPos.x + deltaX;
|
10144
|
+
resizeHelperY = selectedHandle.startPos.y + deltaY;
|
10145
|
+
resizeHelperX = resizeHelperX > 0 ? resizeHelperX : 0;
|
10146
|
+
resizeHelperY = resizeHelperY > 0 ? resizeHelperY : 0;
|
10147
|
+
dom.setStyles(resizeHelper, {
|
10148
|
+
left: resizeHelperX,
|
10149
|
+
top: resizeHelperY,
|
10150
|
+
display: 'block'
|
10371
10151
|
});
|
10372
|
-
|
10373
|
-
|
10374
|
-
|
10375
|
-
const normalize$2 = (dom, rng) => {
|
10376
|
-
const collapsed = rng.collapsed, normRng = rng.cloneRange();
|
10377
|
-
const startPos = CaretPosition.fromRangeStart(rng);
|
10378
|
-
normalizeEndPoint(dom, collapsed, true, normRng).each(pos => {
|
10379
|
-
if (!collapsed || !CaretPosition.isAbove(startPos, pos)) {
|
10380
|
-
normRng.setStart(pos.container(), pos.offset());
|
10152
|
+
resizeHelper.innerHTML = width + ' × ' + height;
|
10153
|
+
if (selectedHandle[2] < 0 && selectedElmGhost.clientWidth <= width) {
|
10154
|
+
dom.setStyle(selectedElmGhost, 'left', selectedElmX + (startW - width));
|
10381
10155
|
}
|
10382
|
-
|
10383
|
-
|
10384
|
-
normalizeEndPoint(dom, collapsed, false, normRng).each(pos => {
|
10385
|
-
normRng.setEnd(pos.container(), pos.offset());
|
10386
|
-
});
|
10387
|
-
}
|
10388
|
-
if (collapsed) {
|
10389
|
-
normRng.collapse(true);
|
10390
|
-
}
|
10391
|
-
return isEq$4(rng, normRng) ? Optional.none() : Optional.some(normRng);
|
10392
|
-
};
|
10393
|
-
|
10394
|
-
const splitText = (node, offset) => {
|
10395
|
-
return node.splitText(offset);
|
10396
|
-
};
|
10397
|
-
const split = rng => {
|
10398
|
-
let startContainer = rng.startContainer, startOffset = rng.startOffset, endContainer = rng.endContainer, endOffset = rng.endOffset;
|
10399
|
-
if (startContainer === endContainer && isText$b(startContainer)) {
|
10400
|
-
if (startOffset > 0 && startOffset < startContainer.data.length) {
|
10401
|
-
endContainer = splitText(startContainer, startOffset);
|
10402
|
-
startContainer = endContainer.previousSibling;
|
10403
|
-
if (endOffset > startOffset) {
|
10404
|
-
endOffset = endOffset - startOffset;
|
10405
|
-
const newContainer = splitText(endContainer, endOffset).previousSibling;
|
10406
|
-
startContainer = endContainer = newContainer;
|
10407
|
-
endOffset = newContainer.data.length;
|
10408
|
-
startOffset = 0;
|
10409
|
-
} else {
|
10410
|
-
endOffset = 0;
|
10411
|
-
}
|
10156
|
+
if (selectedHandle[3] < 0 && selectedElmGhost.clientHeight <= height) {
|
10157
|
+
dom.setStyle(selectedElmGhost, 'top', selectedElmY + (startH - height));
|
10412
10158
|
}
|
10413
|
-
|
10414
|
-
|
10415
|
-
|
10416
|
-
|
10159
|
+
deltaX = rootElement.scrollWidth - startScrollWidth;
|
10160
|
+
deltaY = rootElement.scrollHeight - startScrollHeight;
|
10161
|
+
if (deltaX + deltaY !== 0) {
|
10162
|
+
dom.setStyles(resizeHelper, {
|
10163
|
+
left: resizeHelperX - deltaX,
|
10164
|
+
top: resizeHelperY - deltaY
|
10165
|
+
});
|
10417
10166
|
}
|
10418
|
-
if (
|
10419
|
-
|
10420
|
-
|
10421
|
-
endOffset = newContainer.data.length;
|
10167
|
+
if (!resizeStarted) {
|
10168
|
+
fireObjectResizeStart(editor, selectedElm, startW, startH, 'corner-' + selectedHandle.name);
|
10169
|
+
resizeStarted = true;
|
10422
10170
|
}
|
10423
|
-
}
|
10424
|
-
return {
|
10425
|
-
startContainer,
|
10426
|
-
startOffset,
|
10427
|
-
endContainer,
|
10428
|
-
endOffset
|
10429
|
-
};
|
10430
|
-
};
|
10431
|
-
|
10432
|
-
const RangeUtils = dom => {
|
10433
|
-
const walk = (rng, callback) => {
|
10434
|
-
return walk$3(dom, rng, callback);
|
10435
10171
|
};
|
10436
|
-
const
|
10437
|
-
|
10438
|
-
|
10439
|
-
|
10440
|
-
|
10441
|
-
|
10442
|
-
}
|
10172
|
+
const endGhostResize = () => {
|
10173
|
+
const wasResizeStarted = resizeStarted;
|
10174
|
+
resizeStarted = false;
|
10175
|
+
if (wasResizeStarted) {
|
10176
|
+
setSizeProp(selectedElm, 'width', width);
|
10177
|
+
setSizeProp(selectedElm, 'height', height);
|
10178
|
+
}
|
10179
|
+
dom.unbind(editableDoc, 'mousemove', resizeGhostElement);
|
10180
|
+
dom.unbind(editableDoc, 'mouseup', endGhostResize);
|
10181
|
+
if (rootDocument !== editableDoc) {
|
10182
|
+
dom.unbind(rootDocument, 'mousemove', resizeGhostElement);
|
10183
|
+
dom.unbind(rootDocument, 'mouseup', endGhostResize);
|
10184
|
+
}
|
10185
|
+
dom.remove(selectedElmGhost);
|
10186
|
+
dom.remove(resizeHelper);
|
10187
|
+
dom.remove(resizeBackdrop);
|
10188
|
+
showResizeRect(selectedElm);
|
10189
|
+
if (wasResizeStarted) {
|
10190
|
+
fireObjectResized(editor, selectedElm, width, height, 'corner-' + selectedHandle.name);
|
10191
|
+
dom.setAttrib(selectedElm, 'style', dom.getAttrib(selectedElm, 'style'));
|
10192
|
+
}
|
10193
|
+
editor.nodeChanged();
|
10443
10194
|
};
|
10444
|
-
const
|
10445
|
-
|
10446
|
-
|
10447
|
-
|
10448
|
-
|
10449
|
-
|
10450
|
-
|
10195
|
+
const showResizeRect = targetElm => {
|
10196
|
+
unbindResizeHandleEvents();
|
10197
|
+
const position = dom.getPos(targetElm, rootElement);
|
10198
|
+
const selectedElmX = position.x;
|
10199
|
+
const selectedElmY = position.y;
|
10200
|
+
const rect = targetElm.getBoundingClientRect();
|
10201
|
+
const targetWidth = rect.width || rect.right - rect.left;
|
10202
|
+
const targetHeight = rect.height || rect.bottom - rect.top;
|
10203
|
+
if (selectedElm !== targetElm) {
|
10204
|
+
hideResizeRect();
|
10205
|
+
selectedElm = targetElm;
|
10206
|
+
width = height = 0;
|
10207
|
+
}
|
10208
|
+
const e = editor.dispatch('ObjectSelected', { target: targetElm });
|
10209
|
+
if (isResizable(targetElm) && !e.isDefaultPrevented()) {
|
10210
|
+
each$d(resizeHandles, (handle, name) => {
|
10211
|
+
const startDrag = e => {
|
10212
|
+
const target = getResizeTargets(selectedElm)[0];
|
10213
|
+
startX = e.screenX;
|
10214
|
+
startY = e.screenY;
|
10215
|
+
startW = target.clientWidth;
|
10216
|
+
startH = target.clientHeight;
|
10217
|
+
ratio = startH / startW;
|
10218
|
+
selectedHandle = handle;
|
10219
|
+
selectedHandle.name = name;
|
10220
|
+
selectedHandle.startPos = {
|
10221
|
+
x: targetWidth * handle[0] + selectedElmX,
|
10222
|
+
y: targetHeight * handle[1] + selectedElmY
|
10223
|
+
};
|
10224
|
+
startScrollWidth = rootElement.scrollWidth;
|
10225
|
+
startScrollHeight = rootElement.scrollHeight;
|
10226
|
+
resizeBackdrop = dom.add(rootElement, 'div', {
|
10227
|
+
'class': 'mce-resize-backdrop',
|
10228
|
+
'data-mce-bogus': 'all'
|
10229
|
+
});
|
10230
|
+
dom.setStyles(resizeBackdrop, {
|
10231
|
+
position: 'fixed',
|
10232
|
+
left: '0',
|
10233
|
+
top: '0',
|
10234
|
+
width: '100%',
|
10235
|
+
height: '100%'
|
10236
|
+
});
|
10237
|
+
selectedElmGhost = createGhostElement(dom, selectedElm);
|
10238
|
+
dom.addClass(selectedElmGhost, 'mce-clonedresizable');
|
10239
|
+
dom.setAttrib(selectedElmGhost, 'data-mce-bogus', 'all');
|
10240
|
+
selectedElmGhost.contentEditable = 'false';
|
10241
|
+
dom.setStyles(selectedElmGhost, {
|
10242
|
+
left: selectedElmX,
|
10243
|
+
top: selectedElmY,
|
10244
|
+
margin: 0
|
10245
|
+
});
|
10246
|
+
setGhostElmSize(selectedElmGhost, targetWidth, targetHeight);
|
10247
|
+
selectedElmGhost.removeAttribute(elementSelectionAttr);
|
10248
|
+
rootElement.appendChild(selectedElmGhost);
|
10249
|
+
dom.bind(editableDoc, 'mousemove', resizeGhostElement);
|
10250
|
+
dom.bind(editableDoc, 'mouseup', endGhostResize);
|
10251
|
+
if (rootDocument !== editableDoc) {
|
10252
|
+
dom.bind(rootDocument, 'mousemove', resizeGhostElement);
|
10253
|
+
dom.bind(rootDocument, 'mouseup', endGhostResize);
|
10254
|
+
}
|
10255
|
+
resizeHelper = dom.add(rootElement, 'div', {
|
10256
|
+
'class': 'mce-resize-helper',
|
10257
|
+
'data-mce-bogus': 'all'
|
10258
|
+
}, startW + ' × ' + startH);
|
10259
|
+
};
|
10260
|
+
let handleElm = dom.get('mceResizeHandle' + name);
|
10261
|
+
if (handleElm) {
|
10262
|
+
dom.remove(handleElm);
|
10263
|
+
}
|
10264
|
+
handleElm = dom.add(rootElement, 'div', {
|
10265
|
+
'id': 'mceResizeHandle' + name,
|
10266
|
+
'data-mce-bogus': 'all',
|
10267
|
+
'class': 'mce-resizehandle',
|
10268
|
+
'unselectable': true,
|
10269
|
+
'style': 'cursor:' + name + '-resize; margin:0; padding:0'
|
10270
|
+
});
|
10271
|
+
dom.bind(handleElm, 'mousedown', e => {
|
10272
|
+
e.stopImmediatePropagation();
|
10273
|
+
e.preventDefault();
|
10274
|
+
startDrag(e);
|
10275
|
+
});
|
10276
|
+
handle.elm = handleElm;
|
10277
|
+
dom.setStyles(handleElm, {
|
10278
|
+
left: targetWidth * handle[0] + selectedElmX - handleElm.offsetWidth / 2,
|
10279
|
+
top: targetHeight * handle[1] + selectedElmY - handleElm.offsetHeight / 2
|
10280
|
+
});
|
10281
|
+
});
|
10282
|
+
} else {
|
10283
|
+
hideResizeRect(false);
|
10451
10284
|
}
|
10452
|
-
return rng;
|
10453
10285
|
};
|
10454
|
-
|
10455
|
-
|
10456
|
-
|
10457
|
-
|
10458
|
-
|
10286
|
+
const throttledShowResizeRect = first$1(showResizeRect, 0);
|
10287
|
+
const hideResizeRect = (removeSelected = true) => {
|
10288
|
+
throttledShowResizeRect.cancel();
|
10289
|
+
unbindResizeHandleEvents();
|
10290
|
+
if (selectedElm && removeSelected) {
|
10291
|
+
selectedElm.removeAttribute(elementSelectionAttr);
|
10292
|
+
}
|
10293
|
+
each$d(resizeHandles, (value, name) => {
|
10294
|
+
const handleElm = dom.get('mceResizeHandle' + name);
|
10295
|
+
if (handleElm) {
|
10296
|
+
dom.unbind(handleElm);
|
10297
|
+
dom.remove(handleElm);
|
10298
|
+
}
|
10299
|
+
});
|
10459
10300
|
};
|
10460
|
-
|
10461
|
-
|
10462
|
-
|
10463
|
-
|
10464
|
-
RangeUtils.getNode = getNode$1;
|
10465
|
-
|
10466
|
-
const Dimension = (name, getOffset) => {
|
10467
|
-
const set = (element, h) => {
|
10468
|
-
if (!isNumber(h) && !h.match(/^[0-9]+$/)) {
|
10469
|
-
throw new Error(name + '.set accepts only positive integer values. Value was ' + h);
|
10301
|
+
const isChildOrEqual = (node, parent) => dom.isChildOf(node, parent);
|
10302
|
+
const updateResizeRect = e => {
|
10303
|
+
if (resizeStarted || editor.removed || editor.composing) {
|
10304
|
+
return;
|
10470
10305
|
}
|
10471
|
-
const
|
10472
|
-
|
10473
|
-
|
10306
|
+
const targetElm = e.type === 'mousedown' ? e.target : selection.getNode();
|
10307
|
+
const controlElm = closest$3(SugarElement.fromDom(targetElm), controlElmSelector).map(e => e.dom).filter(e => dom.isEditable(e.parentElement) || e.nodeName === 'IMG' && dom.isEditable(e)).getOrUndefined();
|
10308
|
+
const selectedValue = isNonNullable(controlElm) ? dom.getAttrib(controlElm, elementSelectionAttr, '1') : '1';
|
10309
|
+
each$e(dom.select(`img[${ elementSelectionAttr }],hr[${ elementSelectionAttr }]`), img => {
|
10310
|
+
img.removeAttribute(elementSelectionAttr);
|
10311
|
+
});
|
10312
|
+
if (isNonNullable(controlElm) && isChildOrEqual(controlElm, rootElement) && hasEditorOrUiFocus(editor)) {
|
10313
|
+
disableGeckoResize();
|
10314
|
+
const startElm = selection.getStart(true);
|
10315
|
+
if (isChildOrEqual(startElm, controlElm) && isChildOrEqual(selection.getEnd(true), controlElm)) {
|
10316
|
+
dom.setAttrib(controlElm, elementSelectionAttr, selectedValue);
|
10317
|
+
throttledShowResizeRect.throttle(controlElm);
|
10318
|
+
return;
|
10319
|
+
}
|
10474
10320
|
}
|
10321
|
+
hideResizeRect();
|
10475
10322
|
};
|
10476
|
-
const
|
10477
|
-
|
10478
|
-
|
10479
|
-
|
10480
|
-
|
10323
|
+
const unbindResizeHandleEvents = () => {
|
10324
|
+
each$d(resizeHandles, handle => {
|
10325
|
+
if (handle.elm) {
|
10326
|
+
dom.unbind(handle.elm);
|
10327
|
+
delete handle.elm;
|
10328
|
+
}
|
10329
|
+
});
|
10330
|
+
};
|
10331
|
+
const disableGeckoResize = () => {
|
10332
|
+
try {
|
10333
|
+
editor.getDoc().execCommand('enableObjectResizing', false, 'false');
|
10334
|
+
} catch (ex) {
|
10481
10335
|
}
|
10482
|
-
return r;
|
10483
10336
|
};
|
10484
|
-
|
10485
|
-
|
10486
|
-
|
10487
|
-
|
10488
|
-
|
10489
|
-
|
10490
|
-
|
10491
|
-
|
10492
|
-
|
10493
|
-
|
10337
|
+
editor.on('init', () => {
|
10338
|
+
disableGeckoResize();
|
10339
|
+
editor.on('NodeChange ResizeEditor ResizeWindow ResizeContent drop', updateResizeRect);
|
10340
|
+
editor.on('keyup compositionend', e => {
|
10341
|
+
if (selectedElm && selectedElm.nodeName === 'TABLE') {
|
10342
|
+
updateResizeRect(e);
|
10343
|
+
}
|
10344
|
+
});
|
10345
|
+
editor.on('hide blur', hideResizeRect);
|
10346
|
+
editor.on('contextmenu longpress', contextMenuSelectImage, true);
|
10347
|
+
});
|
10348
|
+
editor.on('remove', unbindResizeHandleEvents);
|
10349
|
+
const destroy = () => {
|
10350
|
+
throttledShowResizeRect.cancel();
|
10351
|
+
selectedElm = selectedElmGhost = resizeBackdrop = null;
|
10494
10352
|
};
|
10495
10353
|
return {
|
10496
|
-
|
10497
|
-
|
10498
|
-
|
10499
|
-
|
10500
|
-
|
10354
|
+
isResizable,
|
10355
|
+
showResizeRect,
|
10356
|
+
hideResizeRect,
|
10357
|
+
updateResizeRect,
|
10358
|
+
destroy
|
10501
10359
|
};
|
10502
10360
|
};
|
10503
10361
|
|
10504
|
-
const
|
10505
|
-
|
10506
|
-
|
10507
|
-
|
10508
|
-
|
10509
|
-
|
10510
|
-
|
10511
|
-
|
10512
|
-
const walkUp = (navigation, doc) => {
|
10513
|
-
const frame = navigation.view(doc);
|
10514
|
-
return frame.fold(constant([]), f => {
|
10515
|
-
const parent = navigation.owner(f);
|
10516
|
-
const rest = walkUp(navigation, parent);
|
10517
|
-
return [f].concat(rest);
|
10518
|
-
});
|
10519
|
-
};
|
10520
|
-
const pathTo = (element, navigation) => {
|
10521
|
-
const d = navigation.owner(element);
|
10522
|
-
return walkUp(navigation, d);
|
10523
|
-
};
|
10524
|
-
|
10525
|
-
const view = doc => {
|
10526
|
-
var _a;
|
10527
|
-
const element = doc.dom === document ? Optional.none() : Optional.from((_a = doc.dom.defaultView) === null || _a === void 0 ? void 0 : _a.frameElement);
|
10528
|
-
return element.map(SugarElement.fromDom);
|
10529
|
-
};
|
10530
|
-
const owner = element => documentOrOwner(element);
|
10531
|
-
|
10532
|
-
var Navigation = /*#__PURE__*/Object.freeze({
|
10533
|
-
__proto__: null,
|
10534
|
-
view: view,
|
10535
|
-
owner: owner
|
10536
|
-
});
|
10537
|
-
|
10538
|
-
const find = element => {
|
10539
|
-
const doc = getDocument();
|
10540
|
-
const scroll = get$5(doc);
|
10541
|
-
const frames = pathTo(element, Navigation);
|
10542
|
-
const offset = viewport(element);
|
10543
|
-
const r = foldr(frames, (b, a) => {
|
10544
|
-
const loc = viewport(a);
|
10545
|
-
return {
|
10546
|
-
left: b.left + loc.left,
|
10547
|
-
top: b.top + loc.top
|
10548
|
-
};
|
10549
|
-
}, {
|
10550
|
-
left: 0,
|
10551
|
-
top: 0
|
10552
|
-
});
|
10553
|
-
return SugarPosition(r.left + offset.left + scroll.left, r.top + offset.top + scroll.top);
|
10554
|
-
};
|
10555
|
-
|
10556
|
-
const excludeFromDescend = element => name(element) === 'textarea';
|
10557
|
-
const fireScrollIntoViewEvent = (editor, data) => {
|
10558
|
-
const scrollEvent = editor.dispatch('ScrollIntoView', data);
|
10559
|
-
return scrollEvent.isDefaultPrevented();
|
10560
|
-
};
|
10561
|
-
const fireAfterScrollIntoViewEvent = (editor, data) => {
|
10562
|
-
editor.dispatch('AfterScrollIntoView', data);
|
10563
|
-
};
|
10564
|
-
const descend = (element, offset) => {
|
10565
|
-
const children = children$1(element);
|
10566
|
-
if (children.length === 0 || excludeFromDescend(element)) {
|
10567
|
-
return {
|
10568
|
-
element,
|
10569
|
-
offset
|
10570
|
-
};
|
10571
|
-
} else if (offset < children.length && !excludeFromDescend(children[offset])) {
|
10572
|
-
return {
|
10573
|
-
element: children[offset],
|
10574
|
-
offset: 0
|
10575
|
-
};
|
10576
|
-
} else {
|
10577
|
-
const last = children[children.length - 1];
|
10578
|
-
if (excludeFromDescend(last)) {
|
10579
|
-
return {
|
10580
|
-
element,
|
10581
|
-
offset
|
10582
|
-
};
|
10583
|
-
} else {
|
10584
|
-
if (name(last) === 'img') {
|
10585
|
-
return {
|
10586
|
-
element: last,
|
10587
|
-
offset: 1
|
10588
|
-
};
|
10589
|
-
} else if (isText$c(last)) {
|
10590
|
-
return {
|
10591
|
-
element: last,
|
10592
|
-
offset: get$3(last).length
|
10593
|
-
};
|
10594
|
-
} else {
|
10595
|
-
return {
|
10596
|
-
element: last,
|
10597
|
-
offset: children$1(last).length
|
10598
|
-
};
|
10599
|
-
}
|
10600
|
-
}
|
10601
|
-
}
|
10602
|
-
};
|
10603
|
-
const markerInfo = (element, cleanupFun) => {
|
10604
|
-
const pos = absolute(element);
|
10605
|
-
const height = get$2(element);
|
10606
|
-
return {
|
10607
|
-
element,
|
10608
|
-
bottom: pos.top + height,
|
10609
|
-
height,
|
10610
|
-
pos,
|
10611
|
-
cleanup: cleanupFun
|
10612
|
-
};
|
10613
|
-
};
|
10614
|
-
const createMarker$1 = (element, offset) => {
|
10615
|
-
const startPoint = descend(element, offset);
|
10616
|
-
const span = SugarElement.fromHtml('<span data-mce-bogus="all" style="display: inline-block;">' + ZWSP$1 + '</span>');
|
10617
|
-
before$3(startPoint.element, span);
|
10618
|
-
return markerInfo(span, () => remove$4(span));
|
10619
|
-
};
|
10620
|
-
const elementMarker = element => markerInfo(SugarElement.fromDom(element), noop);
|
10621
|
-
const withMarker = (editor, f, rng, alignToTop) => {
|
10622
|
-
preserveWith(editor, (_s, _e) => applyWithMarker(editor, f, rng, alignToTop), rng);
|
10623
|
-
};
|
10624
|
-
const withScrollEvents = (editor, doc, f, marker, alignToTop) => {
|
10625
|
-
const data = {
|
10626
|
-
elm: marker.element.dom,
|
10627
|
-
alignToTop
|
10628
|
-
};
|
10629
|
-
if (fireScrollIntoViewEvent(editor, data)) {
|
10630
|
-
return;
|
10631
|
-
}
|
10632
|
-
const scrollTop = get$5(doc).top;
|
10633
|
-
f(editor, doc, scrollTop, marker, alignToTop);
|
10634
|
-
fireAfterScrollIntoViewEvent(editor, data);
|
10362
|
+
const setStart = (rng, situ) => {
|
10363
|
+
situ.fold(e => {
|
10364
|
+
rng.setStartBefore(e.dom);
|
10365
|
+
}, (e, o) => {
|
10366
|
+
rng.setStart(e.dom, o);
|
10367
|
+
}, e => {
|
10368
|
+
rng.setStartAfter(e.dom);
|
10369
|
+
});
|
10635
10370
|
};
|
10636
|
-
const
|
10637
|
-
|
10638
|
-
|
10639
|
-
|
10640
|
-
|
10641
|
-
|
10642
|
-
|
10371
|
+
const setFinish = (rng, situ) => {
|
10372
|
+
situ.fold(e => {
|
10373
|
+
rng.setEndBefore(e.dom);
|
10374
|
+
}, (e, o) => {
|
10375
|
+
rng.setEnd(e.dom, o);
|
10376
|
+
}, e => {
|
10377
|
+
rng.setEndAfter(e.dom);
|
10378
|
+
});
|
10643
10379
|
};
|
10644
|
-
const
|
10645
|
-
const
|
10646
|
-
|
10380
|
+
const relativeToNative = (win, startSitu, finishSitu) => {
|
10381
|
+
const range = win.document.createRange();
|
10382
|
+
setStart(range, startSitu);
|
10383
|
+
setFinish(range, finishSitu);
|
10384
|
+
return range;
|
10647
10385
|
};
|
10648
|
-
const
|
10649
|
-
const
|
10650
|
-
|
10651
|
-
|
10652
|
-
|
10653
|
-
f(SugarElement.fromDom(startElement), SugarElement.fromDom(endElement));
|
10654
|
-
const newRng = editor.dom.createRng();
|
10655
|
-
newRng.setStart(startElement, startOffset);
|
10656
|
-
newRng.setEnd(endElement, endOffset);
|
10657
|
-
editor.selection.setRng(rng);
|
10386
|
+
const exactToNative = (win, start, soffset, finish, foffset) => {
|
10387
|
+
const rng = win.document.createRange();
|
10388
|
+
rng.setStart(start.dom, soffset);
|
10389
|
+
rng.setEnd(finish.dom, foffset);
|
10390
|
+
return rng;
|
10658
10391
|
};
|
10659
|
-
|
10660
|
-
|
10661
|
-
|
10662
|
-
|
10663
|
-
|
10664
|
-
|
10665
|
-
|
10392
|
+
|
10393
|
+
const adt$1 = Adt.generate([
|
10394
|
+
{
|
10395
|
+
ltr: [
|
10396
|
+
'start',
|
10397
|
+
'soffset',
|
10398
|
+
'finish',
|
10399
|
+
'foffset'
|
10400
|
+
]
|
10401
|
+
},
|
10402
|
+
{
|
10403
|
+
rtl: [
|
10404
|
+
'start',
|
10405
|
+
'soffset',
|
10406
|
+
'finish',
|
10407
|
+
'foffset'
|
10408
|
+
]
|
10666
10409
|
}
|
10667
|
-
|
10668
|
-
const
|
10669
|
-
|
10670
|
-
|
10671
|
-
|
10672
|
-
|
10673
|
-
|
10674
|
-
|
10675
|
-
}
|
10676
|
-
|
10677
|
-
|
10678
|
-
|
10679
|
-
|
10410
|
+
]);
|
10411
|
+
const fromRange = (win, type, range) => type(SugarElement.fromDom(range.startContainer), range.startOffset, SugarElement.fromDom(range.endContainer), range.endOffset);
|
10412
|
+
const getRanges = (win, selection) => selection.match({
|
10413
|
+
domRange: rng => {
|
10414
|
+
return {
|
10415
|
+
ltr: constant(rng),
|
10416
|
+
rtl: Optional.none
|
10417
|
+
};
|
10418
|
+
},
|
10419
|
+
relative: (startSitu, finishSitu) => {
|
10420
|
+
return {
|
10421
|
+
ltr: cached(() => relativeToNative(win, startSitu, finishSitu)),
|
10422
|
+
rtl: cached(() => Optional.some(relativeToNative(win, finishSitu, startSitu)))
|
10423
|
+
};
|
10424
|
+
},
|
10425
|
+
exact: (start, soffset, finish, foffset) => {
|
10426
|
+
return {
|
10427
|
+
ltr: cached(() => exactToNative(win, start, soffset, finish, foffset)),
|
10428
|
+
rtl: cached(() => Optional.some(exactToNative(win, finish, foffset, start, soffset)))
|
10429
|
+
};
|
10680
10430
|
}
|
10681
|
-
};
|
10682
|
-
const
|
10683
|
-
const
|
10684
|
-
|
10685
|
-
|
10686
|
-
|
10687
|
-
|
10688
|
-
|
10689
|
-
const op = find(marker.element);
|
10690
|
-
const viewportBounds = getBounds(window);
|
10691
|
-
if (op.top < viewportBounds.y) {
|
10692
|
-
intoView(marker.element, alignToTop !== false);
|
10693
|
-
} else if (op.top > viewportBounds.bottom) {
|
10694
|
-
intoView(marker.element, alignToTop === true);
|
10431
|
+
});
|
10432
|
+
const doDiagnose = (win, ranges) => {
|
10433
|
+
const rng = ranges.ltr();
|
10434
|
+
if (rng.collapsed) {
|
10435
|
+
const reversed = ranges.rtl().filter(rev => rev.collapsed === false);
|
10436
|
+
return reversed.map(rev => adt$1.rtl(SugarElement.fromDom(rev.endContainer), rev.endOffset, SugarElement.fromDom(rev.startContainer), rev.startOffset)).getOrThunk(() => fromRange(win, adt$1.ltr, rng));
|
10437
|
+
} else {
|
10438
|
+
return fromRange(win, adt$1.ltr, rng);
|
10695
10439
|
}
|
10696
10440
|
};
|
10697
|
-
const
|
10698
|
-
|
10699
|
-
|
10700
|
-
const elementIntoFrame = (editor, element, alignToTop) => withElement(editor, element, intoFrame, alignToTop);
|
10701
|
-
const scrollElementIntoView = (editor, element, alignToTop) => {
|
10702
|
-
const scroller = editor.inline ? elementIntoWindow : elementIntoFrame;
|
10703
|
-
scroller(editor, element, alignToTop);
|
10704
|
-
};
|
10705
|
-
const scrollRangeIntoView = (editor, rng, alignToTop) => {
|
10706
|
-
const scroller = editor.inline ? rangeIntoWindow : rangeIntoFrame;
|
10707
|
-
scroller(editor, rng, alignToTop);
|
10708
|
-
};
|
10709
|
-
|
10710
|
-
const focus$1 = (element, preventScroll = false) => element.dom.focus({ preventScroll });
|
10711
|
-
const hasFocus$1 = element => {
|
10712
|
-
const root = getRootNode(element).dom;
|
10713
|
-
return element.dom === root.activeElement;
|
10441
|
+
const diagnose = (win, selection) => {
|
10442
|
+
const ranges = getRanges(win, selection);
|
10443
|
+
return doDiagnose(win, ranges);
|
10714
10444
|
};
|
10715
|
-
|
10716
|
-
|
10445
|
+
adt$1.ltr;
|
10446
|
+
adt$1.rtl;
|
10717
10447
|
|
10718
|
-
const
|
10719
|
-
|
10720
|
-
|
10721
|
-
|
10722
|
-
|
10723
|
-
|
10724
|
-
|
10725
|
-
|
10726
|
-
|
10727
|
-
|
10728
|
-
|
10729
|
-
const isRngInRoot = root => rng => isOrContains(root, rng.start) && isOrContains(root, rng.finish);
|
10730
|
-
const shouldStore = editor => editor.inline || Env.browser.isFirefox();
|
10731
|
-
const nativeRangeToSelectionRange = r => SimSelection.range(SugarElement.fromDom(r.startContainer), r.startOffset, SugarElement.fromDom(r.endContainer), r.endOffset);
|
10732
|
-
const readRange = win => {
|
10733
|
-
const selection = win.getSelection();
|
10734
|
-
const rng = !selection || selection.rangeCount === 0 ? Optional.none() : Optional.from(selection.getRangeAt(0));
|
10735
|
-
return rng.map(nativeRangeToSelectionRange);
|
10448
|
+
const caretPositionFromPoint = (doc, x, y) => {
|
10449
|
+
var _a;
|
10450
|
+
return Optional.from((_a = doc.caretPositionFromPoint) === null || _a === void 0 ? void 0 : _a.call(doc, x, y)).bind(pos => {
|
10451
|
+
if (pos.offsetNode === null) {
|
10452
|
+
return Optional.none();
|
10453
|
+
}
|
10454
|
+
const r = doc.createRange();
|
10455
|
+
r.setStart(pos.offsetNode, pos.offset);
|
10456
|
+
r.collapse();
|
10457
|
+
return Optional.some(r);
|
10458
|
+
});
|
10736
10459
|
};
|
10737
|
-
const
|
10738
|
-
|
10739
|
-
return
|
10460
|
+
const caretRangeFromPoint = (doc, x, y) => {
|
10461
|
+
var _a;
|
10462
|
+
return Optional.from((_a = doc.caretRangeFromPoint) === null || _a === void 0 ? void 0 : _a.call(doc, x, y));
|
10740
10463
|
};
|
10741
|
-
const
|
10742
|
-
|
10743
|
-
|
10744
|
-
|
10745
|
-
|
10746
|
-
|
10747
|
-
return Optional.some(rng);
|
10748
|
-
} catch (_) {
|
10464
|
+
const availableSearch = (doc, x, y) => {
|
10465
|
+
if (doc.caretPositionFromPoint) {
|
10466
|
+
return caretPositionFromPoint(doc, x, y);
|
10467
|
+
} else if (doc.caretRangeFromPoint) {
|
10468
|
+
return caretRangeFromPoint(doc, x, y);
|
10469
|
+
} else {
|
10749
10470
|
return Optional.none();
|
10750
10471
|
}
|
10751
10472
|
};
|
10752
|
-
const
|
10753
|
-
const
|
10754
|
-
|
10755
|
-
};
|
10756
|
-
const getRng = editor => {
|
10757
|
-
const bookmark = editor.bookmark ? editor.bookmark : Optional.none();
|
10758
|
-
return bookmark.bind(x => validate(SugarElement.fromDom(editor.getBody()), x)).bind(bookmarkToNativeRng);
|
10759
|
-
};
|
10760
|
-
const restore = editor => {
|
10761
|
-
getRng(editor).each(rng => editor.selection.setRng(rng));
|
10762
|
-
};
|
10763
|
-
|
10764
|
-
const isEditorUIElement$1 = elm => {
|
10765
|
-
const className = elm.className.toString();
|
10766
|
-
return className.indexOf('tox-') !== -1 || className.indexOf('mce-') !== -1;
|
10473
|
+
const fromPoint$1 = (win, x, y) => {
|
10474
|
+
const doc = win.document;
|
10475
|
+
return availableSearch(doc, x, y).map(rng => SimRange.create(SugarElement.fromDom(rng.startContainer), rng.startOffset, SugarElement.fromDom(rng.endContainer), rng.endOffset));
|
10767
10476
|
};
|
10768
|
-
const FocusManager = { isEditorUIElement: isEditorUIElement$1 };
|
10769
10477
|
|
10770
|
-
const
|
10771
|
-
|
10772
|
-
|
10478
|
+
const beforeSpecial = (element, offset) => {
|
10479
|
+
const name$1 = name(element);
|
10480
|
+
if ('input' === name$1) {
|
10481
|
+
return Situ.after(element);
|
10482
|
+
} else if (!contains$2([
|
10483
|
+
'br',
|
10484
|
+
'img'
|
10485
|
+
], name$1)) {
|
10486
|
+
return Situ.on(element, offset);
|
10487
|
+
} else {
|
10488
|
+
return offset === 0 ? Situ.before(element) : Situ.after(element);
|
10773
10489
|
}
|
10774
|
-
return setTimeout(callback, time);
|
10775
10490
|
};
|
10776
|
-
const
|
10777
|
-
|
10778
|
-
|
10779
|
-
|
10780
|
-
return setInterval(callback, time);
|
10491
|
+
const preprocessRelative = (startSitu, finishSitu) => {
|
10492
|
+
const start = startSitu.fold(Situ.before, beforeSpecial, Situ.after);
|
10493
|
+
const finish = finishSitu.fold(Situ.before, beforeSpecial, Situ.after);
|
10494
|
+
return SimSelection.relative(start, finish);
|
10781
10495
|
};
|
10782
|
-
const
|
10783
|
-
|
10784
|
-
|
10785
|
-
|
10786
|
-
callback();
|
10787
|
-
}
|
10788
|
-
}, time);
|
10789
|
-
},
|
10790
|
-
setEditorInterval: (editor, callback, time) => {
|
10791
|
-
const timer = wrappedSetInterval(() => {
|
10792
|
-
if (!editor.removed) {
|
10793
|
-
callback();
|
10794
|
-
} else {
|
10795
|
-
clearInterval(timer);
|
10796
|
-
}
|
10797
|
-
}, time);
|
10798
|
-
return timer;
|
10799
|
-
}
|
10496
|
+
const preprocessExact = (start, soffset, finish, foffset) => {
|
10497
|
+
const startSitu = beforeSpecial(start, soffset);
|
10498
|
+
const finishSitu = beforeSpecial(finish, foffset);
|
10499
|
+
return SimSelection.relative(startSitu, finishSitu);
|
10800
10500
|
};
|
10501
|
+
const preprocess = selection => selection.match({
|
10502
|
+
domRange: rng => {
|
10503
|
+
const start = SugarElement.fromDom(rng.startContainer);
|
10504
|
+
const finish = SugarElement.fromDom(rng.endContainer);
|
10505
|
+
return preprocessExact(start, rng.startOffset, finish, rng.endOffset);
|
10506
|
+
},
|
10507
|
+
relative: preprocessRelative,
|
10508
|
+
exact: preprocessExact
|
10509
|
+
});
|
10801
10510
|
|
10802
|
-
const
|
10803
|
-
|
10804
|
-
|
10805
|
-
|
10806
|
-
|
10807
|
-
throttledStore.throttle();
|
10808
|
-
};
|
10809
|
-
DOMUtils.DOM.bind(document, 'mouseup', mouseUpPage);
|
10810
|
-
editor.on('remove', () => {
|
10811
|
-
DOMUtils.DOM.unbind(document, 'mouseup', mouseUpPage);
|
10511
|
+
const fromElements = (elements, scope) => {
|
10512
|
+
const doc = scope || document;
|
10513
|
+
const fragment = doc.createDocumentFragment();
|
10514
|
+
each$e(elements, element => {
|
10515
|
+
fragment.appendChild(element.dom);
|
10812
10516
|
});
|
10517
|
+
return SugarElement.fromDom(fragment);
|
10813
10518
|
};
|
10814
|
-
|
10815
|
-
|
10816
|
-
|
10519
|
+
|
10520
|
+
const toNative = selection => {
|
10521
|
+
const win = SimSelection.getWin(selection).dom;
|
10522
|
+
const getDomRange = (start, soffset, finish, foffset) => exactToNative(win, start, soffset, finish, foffset);
|
10523
|
+
const filtered = preprocess(selection);
|
10524
|
+
return diagnose(win, filtered).match({
|
10525
|
+
ltr: getDomRange,
|
10526
|
+
rtl: getDomRange
|
10817
10527
|
});
|
10818
10528
|
};
|
10819
|
-
const
|
10820
|
-
|
10821
|
-
|
10822
|
-
|
10823
|
-
|
10824
|
-
|
10825
|
-
|
10529
|
+
const getAtPoint = (win, x, y) => fromPoint$1(win, x, y);
|
10530
|
+
|
10531
|
+
const fromPoint = (clientX, clientY, doc) => {
|
10532
|
+
const win = defaultView(SugarElement.fromDom(doc));
|
10533
|
+
return getAtPoint(win.dom, clientX, clientY).map(simRange => {
|
10534
|
+
const rng = doc.createRange();
|
10535
|
+
rng.setStart(simRange.start.dom, simRange.soffset);
|
10536
|
+
rng.setEnd(simRange.finish.dom, simRange.foffset);
|
10537
|
+
return rng;
|
10538
|
+
}).getOrUndefined();
|
10826
10539
|
};
|
10827
|
-
|
10828
|
-
|
10829
|
-
|
10830
|
-
}, 0);
|
10831
|
-
editor.on('init', () => {
|
10832
|
-
if (editor.inline) {
|
10833
|
-
registerPageMouseUp(editor, throttledStore);
|
10834
|
-
}
|
10835
|
-
registerEditorEvents(editor, throttledStore);
|
10836
|
-
});
|
10837
|
-
editor.on('remove', () => {
|
10838
|
-
throttledStore.cancel();
|
10839
|
-
});
|
10540
|
+
|
10541
|
+
const isEq$4 = (rng1, rng2) => {
|
10542
|
+
return isNonNullable(rng1) && isNonNullable(rng2) && (rng1.startContainer === rng2.startContainer && rng1.startOffset === rng2.startOffset) && (rng1.endContainer === rng2.endContainer && rng1.endOffset === rng2.endOffset);
|
10840
10543
|
};
|
10841
10544
|
|
10842
|
-
|
10843
|
-
|
10844
|
-
|
10845
|
-
|
10545
|
+
const findParent = (node, rootNode, predicate) => {
|
10546
|
+
let currentNode = node;
|
10547
|
+
while (currentNode && currentNode !== rootNode) {
|
10548
|
+
if (predicate(currentNode)) {
|
10549
|
+
return currentNode;
|
10550
|
+
}
|
10551
|
+
currentNode = currentNode.parentNode;
|
10552
|
+
}
|
10553
|
+
return null;
|
10846
10554
|
};
|
10847
|
-
const
|
10848
|
-
|
10849
|
-
|
10850
|
-
|
10851
|
-
|
10852
|
-
|
10555
|
+
const hasParent$1 = (node, rootNode, predicate) => findParent(node, rootNode, predicate) !== null;
|
10556
|
+
const hasParentWithName = (node, rootNode, name) => hasParent$1(node, rootNode, node => node.nodeName === name);
|
10557
|
+
const isCeFalseCaretContainer = (node, rootNode) => isCaretContainer$2(node) && !hasParent$1(node, rootNode, isCaretNode);
|
10558
|
+
const hasBrBeforeAfter = (dom, node, left) => {
|
10559
|
+
const parentNode = node.parentNode;
|
10560
|
+
if (parentNode) {
|
10561
|
+
const walker = new DomTreeWalker(node, dom.getParent(parentNode, dom.isBlock) || dom.getRoot());
|
10562
|
+
let currentNode;
|
10563
|
+
while (currentNode = walker[left ? 'prev' : 'next']()) {
|
10564
|
+
if (isBr$6(currentNode)) {
|
10565
|
+
return true;
|
10566
|
+
}
|
10567
|
+
}
|
10853
10568
|
}
|
10569
|
+
return false;
|
10854
10570
|
};
|
10855
|
-
const
|
10856
|
-
|
10857
|
-
|
10858
|
-
return isEditorUIElement(elm) || (customSelector ? editor.dom.is(elm, customSelector) : false);
|
10859
|
-
});
|
10860
|
-
return parent !== null;
|
10571
|
+
const isPrevNode = (node, name) => {
|
10572
|
+
var _a;
|
10573
|
+
return ((_a = node.previousSibling) === null || _a === void 0 ? void 0 : _a.nodeName) === name;
|
10861
10574
|
};
|
10862
|
-
const
|
10863
|
-
|
10864
|
-
|
10865
|
-
|
10866
|
-
|
10867
|
-
|
10575
|
+
const hasContentEditableFalseParent = (root, node) => {
|
10576
|
+
let currentNode = node;
|
10577
|
+
while (currentNode && currentNode !== root) {
|
10578
|
+
if (isContentEditableFalse$b(currentNode)) {
|
10579
|
+
return true;
|
10580
|
+
}
|
10581
|
+
currentNode = currentNode.parentNode;
|
10868
10582
|
}
|
10583
|
+
return false;
|
10869
10584
|
};
|
10870
|
-
const
|
10871
|
-
const
|
10872
|
-
|
10873
|
-
const
|
10874
|
-
|
10875
|
-
|
10876
|
-
|
10585
|
+
const findTextNodeRelative = (dom, isAfterNode, collapsed, left, startNode) => {
|
10586
|
+
const body = dom.getRoot();
|
10587
|
+
const nonEmptyElementsMap = dom.schema.getNonEmptyElements();
|
10588
|
+
const parentNode = startNode.parentNode;
|
10589
|
+
let lastInlineElement;
|
10590
|
+
let node;
|
10591
|
+
if (!parentNode) {
|
10592
|
+
return Optional.none();
|
10593
|
+
}
|
10594
|
+
const parentBlockContainer = dom.getParent(parentNode, dom.isBlock) || body;
|
10595
|
+
if (left && isBr$6(startNode) && isAfterNode && dom.isEmpty(parentBlockContainer)) {
|
10596
|
+
return Optional.some(CaretPosition(parentNode, dom.nodeIndex(startNode)));
|
10597
|
+
}
|
10598
|
+
const walker = new DomTreeWalker(startNode, parentBlockContainer);
|
10599
|
+
while (node = walker[left ? 'prev' : 'next']()) {
|
10600
|
+
if (dom.getContentEditableParent(node) === 'false' || isCeFalseCaretContainer(node, body)) {
|
10601
|
+
return Optional.none();
|
10877
10602
|
}
|
10878
|
-
|
10879
|
-
|
10880
|
-
|
10881
|
-
|
10882
|
-
|
10603
|
+
if (isText$b(node) && node.data.length > 0) {
|
10604
|
+
if (!hasParentWithName(node, body, 'A')) {
|
10605
|
+
return Optional.some(CaretPosition(node, left ? node.data.length : 0));
|
10606
|
+
}
|
10607
|
+
return Optional.none();
|
10883
10608
|
}
|
10884
|
-
if (
|
10885
|
-
|
10886
|
-
|
10609
|
+
if (dom.isBlock(node) || nonEmptyElementsMap[node.nodeName.toLowerCase()]) {
|
10610
|
+
return Optional.none();
|
10611
|
+
}
|
10612
|
+
lastInlineElement = node;
|
10613
|
+
}
|
10614
|
+
if (isComment(lastInlineElement)) {
|
10615
|
+
return Optional.none();
|
10616
|
+
}
|
10617
|
+
if (collapsed && lastInlineElement) {
|
10618
|
+
return Optional.some(CaretPosition(lastInlineElement, 0));
|
10619
|
+
}
|
10620
|
+
return Optional.none();
|
10621
|
+
};
|
10622
|
+
const normalizeEndPoint = (dom, collapsed, start, rng) => {
|
10623
|
+
const body = dom.getRoot();
|
10624
|
+
let node;
|
10625
|
+
let normalized = false;
|
10626
|
+
let container = start ? rng.startContainer : rng.endContainer;
|
10627
|
+
let offset = start ? rng.startOffset : rng.endOffset;
|
10628
|
+
const isAfterNode = isElement$6(container) && offset === container.childNodes.length;
|
10629
|
+
const nonEmptyElementsMap = dom.schema.getNonEmptyElements();
|
10630
|
+
let directionLeft = start;
|
10631
|
+
if (isCaretContainer$2(container)) {
|
10632
|
+
return Optional.none();
|
10633
|
+
}
|
10634
|
+
if (isElement$6(container) && offset > container.childNodes.length - 1) {
|
10635
|
+
directionLeft = false;
|
10636
|
+
}
|
10637
|
+
if (isDocument$1(container)) {
|
10638
|
+
container = body;
|
10639
|
+
offset = 0;
|
10640
|
+
}
|
10641
|
+
if (container === body) {
|
10642
|
+
if (directionLeft) {
|
10643
|
+
node = container.childNodes[offset > 0 ? offset - 1 : 0];
|
10644
|
+
if (node) {
|
10645
|
+
if (isCaretContainer$2(node)) {
|
10646
|
+
return Optional.none();
|
10647
|
+
}
|
10648
|
+
if (nonEmptyElementsMap[node.nodeName] || isTable$2(node)) {
|
10649
|
+
return Optional.none();
|
10650
|
+
}
|
10887
10651
|
}
|
10888
|
-
editorManager.setActive(editor);
|
10889
|
-
editorManager.focusedEditor = editor;
|
10890
|
-
editor.dispatch('focus', { blurredEditor: focusedEditor });
|
10891
|
-
editor.focus(true);
|
10892
10652
|
}
|
10893
|
-
|
10894
|
-
|
10895
|
-
|
10896
|
-
|
10897
|
-
if (!
|
10898
|
-
|
10653
|
+
if (container.hasChildNodes()) {
|
10654
|
+
offset = Math.min(!directionLeft && offset > 0 ? offset - 1 : offset, container.childNodes.length - 1);
|
10655
|
+
container = container.childNodes[offset];
|
10656
|
+
offset = isText$b(container) && isAfterNode ? container.data.length : 0;
|
10657
|
+
if (!collapsed && container === body.lastChild && isTable$2(container)) {
|
10658
|
+
return Optional.none();
|
10899
10659
|
}
|
10900
|
-
if (
|
10901
|
-
|
10902
|
-
editorManager.focusedEditor = null;
|
10660
|
+
if (hasContentEditableFalseParent(body, container) || isCaretContainer$2(container)) {
|
10661
|
+
return Optional.none();
|
10903
10662
|
}
|
10904
|
-
|
10905
|
-
|
10906
|
-
|
10907
|
-
|
10908
|
-
|
10909
|
-
|
10910
|
-
|
10911
|
-
|
10912
|
-
|
10913
|
-
|
10914
|
-
|
10915
|
-
|
10663
|
+
if (isDetails(container)) {
|
10664
|
+
return Optional.none();
|
10665
|
+
}
|
10666
|
+
if (container.hasChildNodes() && !isTable$2(container)) {
|
10667
|
+
node = container;
|
10668
|
+
const walker = new DomTreeWalker(container, body);
|
10669
|
+
do {
|
10670
|
+
if (isContentEditableFalse$b(node) || isCaretContainer$2(node)) {
|
10671
|
+
normalized = false;
|
10672
|
+
break;
|
10673
|
+
}
|
10674
|
+
if (isText$b(node) && node.data.length > 0) {
|
10675
|
+
offset = directionLeft ? 0 : node.data.length;
|
10676
|
+
container = node;
|
10677
|
+
normalized = true;
|
10678
|
+
break;
|
10679
|
+
}
|
10680
|
+
if (nonEmptyElementsMap[node.nodeName.toLowerCase()] && !isTableCellOrCaption(node)) {
|
10681
|
+
offset = dom.nodeIndex(node);
|
10682
|
+
container = node.parentNode;
|
10683
|
+
if (!directionLeft) {
|
10684
|
+
offset++;
|
10916
10685
|
}
|
10686
|
+
normalized = true;
|
10687
|
+
break;
|
10917
10688
|
}
|
10689
|
+
} while (node = directionLeft ? walker.next() : walker.prev());
|
10690
|
+
}
|
10691
|
+
}
|
10692
|
+
}
|
10693
|
+
if (collapsed) {
|
10694
|
+
if (isText$b(container) && offset === 0) {
|
10695
|
+
findTextNodeRelative(dom, isAfterNode, collapsed, true, container).each(pos => {
|
10696
|
+
container = pos.container();
|
10697
|
+
offset = pos.offset();
|
10698
|
+
normalized = true;
|
10699
|
+
});
|
10700
|
+
}
|
10701
|
+
if (isElement$6(container)) {
|
10702
|
+
node = container.childNodes[offset];
|
10703
|
+
if (!node) {
|
10704
|
+
node = container.childNodes[offset - 1];
|
10705
|
+
}
|
10706
|
+
if (node && isBr$6(node) && !isPrevNode(node, 'A') && !hasBrBeforeAfter(dom, node, false) && !hasBrBeforeAfter(dom, node, true)) {
|
10707
|
+
findTextNodeRelative(dom, isAfterNode, collapsed, true, node).each(pos => {
|
10708
|
+
container = pos.container();
|
10709
|
+
offset = pos.offset();
|
10710
|
+
normalized = true;
|
10918
10711
|
});
|
10919
10712
|
}
|
10920
|
-
}
|
10921
|
-
|
10713
|
+
}
|
10714
|
+
}
|
10715
|
+
if (directionLeft && !collapsed && isText$b(container) && offset === container.data.length) {
|
10716
|
+
findTextNodeRelative(dom, isAfterNode, collapsed, false, container).each(pos => {
|
10717
|
+
container = pos.container();
|
10718
|
+
offset = pos.offset();
|
10719
|
+
normalized = true;
|
10720
|
+
});
|
10922
10721
|
}
|
10722
|
+
return normalized && container ? Optional.some(CaretPosition(container, offset)) : Optional.none();
|
10923
10723
|
};
|
10924
|
-
const
|
10925
|
-
|
10926
|
-
|
10724
|
+
const normalize$2 = (dom, rng) => {
|
10725
|
+
const collapsed = rng.collapsed, normRng = rng.cloneRange();
|
10726
|
+
const startPos = CaretPosition.fromRangeStart(rng);
|
10727
|
+
normalizeEndPoint(dom, collapsed, true, normRng).each(pos => {
|
10728
|
+
if (!collapsed || !CaretPosition.isAbove(startPos, pos)) {
|
10729
|
+
normRng.setStart(pos.container(), pos.offset());
|
10730
|
+
}
|
10731
|
+
});
|
10732
|
+
if (!collapsed) {
|
10733
|
+
normalizeEndPoint(dom, collapsed, false, normRng).each(pos => {
|
10734
|
+
normRng.setEnd(pos.container(), pos.offset());
|
10735
|
+
});
|
10927
10736
|
}
|
10928
|
-
if (
|
10929
|
-
|
10930
|
-
documentFocusInHandler = null;
|
10737
|
+
if (collapsed) {
|
10738
|
+
normRng.collapse(true);
|
10931
10739
|
}
|
10932
|
-
|
10933
|
-
const setup$w = editorManager => {
|
10934
|
-
editorManager.on('AddEditor', curry(registerEvents$1, editorManager));
|
10935
|
-
editorManager.on('RemoveEditor', curry(unregisterDocumentEvents, editorManager));
|
10740
|
+
return isEq$4(rng, normRng) ? Optional.none() : Optional.some(normRng);
|
10936
10741
|
};
|
10937
10742
|
|
10938
|
-
const
|
10939
|
-
|
10940
|
-
|
10941
|
-
const
|
10942
|
-
|
10943
|
-
|
10944
|
-
|
10945
|
-
|
10743
|
+
const splitText = (node, offset) => {
|
10744
|
+
return node.splitText(offset);
|
10745
|
+
};
|
10746
|
+
const split = rng => {
|
10747
|
+
let startContainer = rng.startContainer, startOffset = rng.startOffset, endContainer = rng.endContainer, endOffset = rng.endOffset;
|
10748
|
+
if (startContainer === endContainer && isText$b(startContainer)) {
|
10749
|
+
if (startOffset > 0 && startOffset < startContainer.data.length) {
|
10750
|
+
endContainer = splitText(startContainer, startOffset);
|
10751
|
+
startContainer = endContainer.previousSibling;
|
10752
|
+
if (endOffset > startOffset) {
|
10753
|
+
endOffset = endOffset - startOffset;
|
10754
|
+
const newContainer = splitText(endContainer, endOffset).previousSibling;
|
10755
|
+
startContainer = endContainer = newContainer;
|
10756
|
+
endOffset = newContainer.data.length;
|
10757
|
+
startOffset = 0;
|
10758
|
+
} else {
|
10759
|
+
endOffset = 0;
|
10760
|
+
}
|
10761
|
+
}
|
10946
10762
|
} else {
|
10947
|
-
|
10763
|
+
if (isText$b(startContainer) && startOffset > 0 && startOffset < startContainer.data.length) {
|
10764
|
+
startContainer = splitText(startContainer, startOffset);
|
10765
|
+
startOffset = 0;
|
10766
|
+
}
|
10767
|
+
if (isText$b(endContainer) && endOffset > 0 && endOffset < endContainer.data.length) {
|
10768
|
+
const newContainer = splitText(endContainer, endOffset).previousSibling;
|
10769
|
+
endContainer = newContainer;
|
10770
|
+
endOffset = newContainer.data.length;
|
10771
|
+
}
|
10948
10772
|
}
|
10949
|
-
|
10950
|
-
|
10951
|
-
|
10952
|
-
|
10953
|
-
|
10954
|
-
|
10955
|
-
}, caretPos => editor.selection.setRng(caretPos.toRange()));
|
10773
|
+
return {
|
10774
|
+
startContainer,
|
10775
|
+
startOffset,
|
10776
|
+
endContainer,
|
10777
|
+
endOffset
|
10778
|
+
};
|
10956
10779
|
};
|
10957
|
-
|
10958
|
-
|
10959
|
-
|
10960
|
-
|
10961
|
-
|
10962
|
-
|
10780
|
+
|
10781
|
+
const RangeUtils = dom => {
|
10782
|
+
const walk = (rng, callback) => {
|
10783
|
+
return walk$3(dom, rng, callback);
|
10784
|
+
};
|
10785
|
+
const split$1 = split;
|
10786
|
+
const normalize = rng => {
|
10787
|
+
return normalize$2(dom, rng).fold(never, normalizedRng => {
|
10788
|
+
rng.setStart(normalizedRng.startContainer, normalizedRng.startOffset);
|
10789
|
+
rng.setEnd(normalizedRng.endContainer, normalizedRng.endOffset);
|
10790
|
+
return true;
|
10791
|
+
});
|
10792
|
+
};
|
10793
|
+
const expand = (rng, options = { type: 'word' }) => {
|
10794
|
+
if (options.type === 'word') {
|
10795
|
+
const rangeLike = expandRng(dom, rng, [{ inline: 'span' }]);
|
10796
|
+
const newRange = dom.createRng();
|
10797
|
+
newRange.setStart(rangeLike.startContainer, rangeLike.startOffset);
|
10798
|
+
newRange.setEnd(rangeLike.endContainer, rangeLike.endOffset);
|
10799
|
+
return newRange;
|
10800
|
+
}
|
10801
|
+
return rng;
|
10802
|
+
};
|
10803
|
+
return {
|
10804
|
+
walk,
|
10805
|
+
split: split$1,
|
10806
|
+
expand,
|
10807
|
+
normalize
|
10808
|
+
};
|
10809
|
+
};
|
10810
|
+
RangeUtils.compareRanges = isEq$4;
|
10811
|
+
RangeUtils.getCaretRangeFromPoint = fromPoint;
|
10812
|
+
RangeUtils.getSelectedNode = getSelectedNode;
|
10813
|
+
RangeUtils.getNode = getNode$1;
|
10814
|
+
|
10815
|
+
const Dimension = (name, getOffset) => {
|
10816
|
+
const set = (element, h) => {
|
10817
|
+
if (!isNumber(h) && !h.match(/^[0-9]+$/)) {
|
10818
|
+
throw new Error(name + '.set accepts only positive integer values. Value was ' + h);
|
10819
|
+
}
|
10820
|
+
const dom = element.dom;
|
10821
|
+
if (isSupported(dom)) {
|
10822
|
+
dom.style[name] = h + 'px';
|
10823
|
+
}
|
10824
|
+
};
|
10825
|
+
const get = element => {
|
10826
|
+
const r = getOffset(element);
|
10827
|
+
if (r <= 0 || r === null) {
|
10828
|
+
const css = get$7(element, name);
|
10829
|
+
return parseFloat(css) || 0;
|
10963
10830
|
}
|
10831
|
+
return r;
|
10832
|
+
};
|
10833
|
+
const getOuter = get;
|
10834
|
+
const aggregate = (element, properties) => foldl(properties, (acc, property) => {
|
10835
|
+
const val = get$7(element, property);
|
10836
|
+
const value = val === undefined ? 0 : parseInt(val, 10);
|
10837
|
+
return isNaN(value) ? acc : acc + value;
|
10838
|
+
}, 0);
|
10839
|
+
const max = (element, value, properties) => {
|
10840
|
+
const cumulativeInclusions = aggregate(element, properties);
|
10841
|
+
const absoluteMax = value > cumulativeInclusions ? value - cumulativeInclusions : 0;
|
10842
|
+
return absoluteMax;
|
10843
|
+
};
|
10844
|
+
return {
|
10845
|
+
set,
|
10846
|
+
get,
|
10847
|
+
getOuter,
|
10848
|
+
aggregate,
|
10849
|
+
max
|
10850
|
+
};
|
10851
|
+
};
|
10852
|
+
|
10853
|
+
const api = Dimension('height', element => {
|
10854
|
+
const dom = element.dom;
|
10855
|
+
return inBody(element) ? dom.getBoundingClientRect().height : dom.offsetHeight;
|
10856
|
+
});
|
10857
|
+
const get$2 = element => api.get(element);
|
10858
|
+
|
10859
|
+
const walkUp = (navigation, doc) => {
|
10860
|
+
const frame = navigation.view(doc);
|
10861
|
+
return frame.fold(constant([]), f => {
|
10862
|
+
const parent = navigation.owner(f);
|
10863
|
+
const rest = walkUp(navigation, parent);
|
10864
|
+
return [f].concat(rest);
|
10865
|
+
});
|
10866
|
+
};
|
10867
|
+
const pathTo = (element, navigation) => {
|
10868
|
+
const d = navigation.owner(element);
|
10869
|
+
return walkUp(navigation, d);
|
10870
|
+
};
|
10871
|
+
|
10872
|
+
const view = doc => {
|
10873
|
+
var _a;
|
10874
|
+
const element = doc.dom === document ? Optional.none() : Optional.from((_a = doc.dom.defaultView) === null || _a === void 0 ? void 0 : _a.frameElement);
|
10875
|
+
return element.map(SugarElement.fromDom);
|
10876
|
+
};
|
10877
|
+
const owner = element => documentOrOwner(element);
|
10878
|
+
|
10879
|
+
var Navigation = /*#__PURE__*/Object.freeze({
|
10880
|
+
__proto__: null,
|
10881
|
+
view: view,
|
10882
|
+
owner: owner
|
10883
|
+
});
|
10884
|
+
|
10885
|
+
const find = element => {
|
10886
|
+
const doc = getDocument();
|
10887
|
+
const scroll = get$5(doc);
|
10888
|
+
const frames = pathTo(element, Navigation);
|
10889
|
+
const offset = viewport(element);
|
10890
|
+
const r = foldr(frames, (b, a) => {
|
10891
|
+
const loc = viewport(a);
|
10892
|
+
return {
|
10893
|
+
left: b.left + loc.left,
|
10894
|
+
top: b.top + loc.top
|
10895
|
+
};
|
10896
|
+
}, {
|
10897
|
+
left: 0,
|
10898
|
+
top: 0
|
10899
|
+
});
|
10900
|
+
return SugarPosition(r.left + offset.left + scroll.left, r.top + offset.top + scroll.top);
|
10901
|
+
};
|
10902
|
+
|
10903
|
+
const excludeFromDescend = element => name(element) === 'textarea';
|
10904
|
+
const fireScrollIntoViewEvent = (editor, data) => {
|
10905
|
+
const scrollEvent = editor.dispatch('ScrollIntoView', data);
|
10906
|
+
return scrollEvent.isDefaultPrevented();
|
10907
|
+
};
|
10908
|
+
const fireAfterScrollIntoViewEvent = (editor, data) => {
|
10909
|
+
editor.dispatch('AfterScrollIntoView', data);
|
10910
|
+
};
|
10911
|
+
const descend = (element, offset) => {
|
10912
|
+
const children = children$1(element);
|
10913
|
+
if (children.length === 0 || excludeFromDescend(element)) {
|
10914
|
+
return {
|
10915
|
+
element,
|
10916
|
+
offset
|
10917
|
+
};
|
10918
|
+
} else if (offset < children.length && !excludeFromDescend(children[offset])) {
|
10919
|
+
return {
|
10920
|
+
element: children[offset],
|
10921
|
+
offset: 0
|
10922
|
+
};
|
10964
10923
|
} else {
|
10965
|
-
|
10924
|
+
const last = children[children.length - 1];
|
10925
|
+
if (excludeFromDescend(last)) {
|
10926
|
+
return {
|
10927
|
+
element,
|
10928
|
+
offset
|
10929
|
+
};
|
10930
|
+
} else {
|
10931
|
+
if (name(last) === 'img') {
|
10932
|
+
return {
|
10933
|
+
element: last,
|
10934
|
+
offset: 1
|
10935
|
+
};
|
10936
|
+
} else if (isText$c(last)) {
|
10937
|
+
return {
|
10938
|
+
element: last,
|
10939
|
+
offset: get$3(last).length
|
10940
|
+
};
|
10941
|
+
} else {
|
10942
|
+
return {
|
10943
|
+
element: last,
|
10944
|
+
offset: children$1(last).length
|
10945
|
+
};
|
10946
|
+
}
|
10947
|
+
}
|
10966
10948
|
}
|
10967
10949
|
};
|
10968
|
-
const
|
10969
|
-
|
10970
|
-
|
10971
|
-
|
10972
|
-
|
10950
|
+
const markerInfo = (element, cleanupFun) => {
|
10951
|
+
const pos = absolute(element);
|
10952
|
+
const height = get$2(element);
|
10953
|
+
return {
|
10954
|
+
element,
|
10955
|
+
bottom: pos.top + height,
|
10956
|
+
height,
|
10957
|
+
pos,
|
10958
|
+
cleanup: cleanupFun
|
10959
|
+
};
|
10973
10960
|
};
|
10974
|
-
const
|
10975
|
-
const
|
10976
|
-
|
10961
|
+
const createMarker$1 = (element, offset) => {
|
10962
|
+
const startPoint = descend(element, offset);
|
10963
|
+
const span = SugarElement.fromHtml('<span data-mce-bogus="all" style="display: inline-block;">' + ZWSP$1 + '</span>');
|
10964
|
+
before$3(startPoint.element, span);
|
10965
|
+
return markerInfo(span, () => remove$4(span));
|
10977
10966
|
};
|
10978
|
-
const
|
10979
|
-
const
|
10980
|
-
|
10981
|
-
|
10982
|
-
|
10983
|
-
|
10984
|
-
|
10985
|
-
|
10986
|
-
getRng(editor).each(bookmarkRng => {
|
10987
|
-
editor.selection.setRng(bookmarkRng);
|
10988
|
-
rng = bookmarkRng;
|
10989
|
-
});
|
10967
|
+
const elementMarker = element => markerInfo(SugarElement.fromDom(element), noop);
|
10968
|
+
const withMarker = (editor, f, rng, alignToTop) => {
|
10969
|
+
preserveWith(editor, (_s, _e) => applyWithMarker(editor, f, rng, alignToTop), rng);
|
10970
|
+
};
|
10971
|
+
const withScrollEvents = (editor, doc, f, marker, alignToTop) => {
|
10972
|
+
const data = {
|
10973
|
+
elm: marker.element.dom,
|
10974
|
+
alignToTop
|
10990
10975
|
};
|
10991
|
-
if (
|
10992
|
-
restoreBookmark(editor);
|
10993
|
-
}
|
10994
|
-
const contentEditableHost = getContentEditableHost(editor, selection.getNode());
|
10995
|
-
if (contentEditableHost && editor.dom.isChildOf(contentEditableHost, body)) {
|
10996
|
-
if (!hasContentEditableFalseParent(editor, contentEditableHost)) {
|
10997
|
-
focusBody(body);
|
10998
|
-
}
|
10999
|
-
focusBody(contentEditableHost);
|
11000
|
-
if (!editor.hasEditableRoot()) {
|
11001
|
-
restoreBookmark(editor);
|
11002
|
-
}
|
11003
|
-
normalizeSelection(editor, rng);
|
11004
|
-
activateEditor(editor);
|
10976
|
+
if (fireScrollIntoViewEvent(editor, data)) {
|
11005
10977
|
return;
|
11006
10978
|
}
|
11007
|
-
|
11008
|
-
|
11009
|
-
|
11010
|
-
|
11011
|
-
|
11012
|
-
|
11013
|
-
|
11014
|
-
|
11015
|
-
|
10979
|
+
const scrollTop = get$5(doc).top;
|
10980
|
+
f(editor, doc, scrollTop, marker, alignToTop);
|
10981
|
+
fireAfterScrollIntoViewEvent(editor, data);
|
10982
|
+
};
|
10983
|
+
const applyWithMarker = (editor, f, rng, alignToTop) => {
|
10984
|
+
const body = SugarElement.fromDom(editor.getBody());
|
10985
|
+
const doc = SugarElement.fromDom(editor.getDoc());
|
10986
|
+
reflow(body);
|
10987
|
+
const marker = createMarker$1(SugarElement.fromDom(rng.startContainer), rng.startOffset);
|
10988
|
+
withScrollEvents(editor, doc, f, marker, alignToTop);
|
10989
|
+
marker.cleanup();
|
10990
|
+
};
|
10991
|
+
const withElement = (editor, element, f, alignToTop) => {
|
10992
|
+
const doc = SugarElement.fromDom(editor.getDoc());
|
10993
|
+
withScrollEvents(editor, doc, f, elementMarker(element), alignToTop);
|
10994
|
+
};
|
10995
|
+
const preserveWith = (editor, f, rng) => {
|
10996
|
+
const startElement = rng.startContainer;
|
10997
|
+
const startOffset = rng.startOffset;
|
10998
|
+
const endElement = rng.endContainer;
|
10999
|
+
const endOffset = rng.endOffset;
|
11000
|
+
f(SugarElement.fromDom(startElement), SugarElement.fromDom(endElement));
|
11001
|
+
const newRng = editor.dom.createRng();
|
11002
|
+
newRng.setStart(startElement, startOffset);
|
11003
|
+
newRng.setEnd(endElement, endOffset);
|
11004
|
+
editor.selection.setRng(rng);
|
11005
|
+
};
|
11006
|
+
const scrollToMarker = (editor, marker, viewHeight, alignToTop, doc) => {
|
11007
|
+
const pos = marker.pos;
|
11008
|
+
if (alignToTop) {
|
11009
|
+
to(pos.left, pos.top, doc);
|
11010
|
+
} else {
|
11011
|
+
const y = pos.top - viewHeight + marker.height;
|
11012
|
+
to(-editor.getBody().getBoundingClientRect().left, y, doc);
|
11016
11013
|
}
|
11017
|
-
activateEditor(editor);
|
11018
11014
|
};
|
11019
|
-
const
|
11020
|
-
|
11021
|
-
|
11022
|
-
|
11015
|
+
const intoWindowIfNeeded = (editor, doc, scrollTop, viewHeight, marker, alignToTop) => {
|
11016
|
+
const viewportBottom = viewHeight + scrollTop;
|
11017
|
+
const markerTop = marker.pos.top;
|
11018
|
+
const markerBottom = marker.bottom;
|
11019
|
+
const largerThanViewport = markerBottom - markerTop >= viewHeight;
|
11020
|
+
if (markerTop < scrollTop) {
|
11021
|
+
scrollToMarker(editor, marker, viewHeight, alignToTop !== false, doc);
|
11022
|
+
} else if (markerTop > viewportBottom) {
|
11023
|
+
const align = largerThanViewport ? alignToTop !== false : alignToTop === true;
|
11024
|
+
scrollToMarker(editor, marker, viewHeight, align, doc);
|
11025
|
+
} else if (markerBottom > viewportBottom && !largerThanViewport) {
|
11026
|
+
scrollToMarker(editor, marker, viewHeight, alignToTop === true, doc);
|
11023
11027
|
}
|
11024
|
-
|
11025
|
-
|
11026
|
-
|
11027
|
-
|
11028
|
+
};
|
11029
|
+
const intoWindow = (editor, doc, scrollTop, marker, alignToTop) => {
|
11030
|
+
const viewHeight = defaultView(doc).dom.innerHeight;
|
11031
|
+
intoWindowIfNeeded(editor, doc, scrollTop, viewHeight, marker, alignToTop);
|
11032
|
+
};
|
11033
|
+
const intoFrame = (editor, doc, scrollTop, marker, alignToTop) => {
|
11034
|
+
const frameViewHeight = defaultView(doc).dom.innerHeight;
|
11035
|
+
intoWindowIfNeeded(editor, doc, scrollTop, frameViewHeight, marker, alignToTop);
|
11036
|
+
const op = find(marker.element);
|
11037
|
+
const viewportBounds = getBounds(window);
|
11038
|
+
if (op.top < viewportBounds.y) {
|
11039
|
+
intoView(marker.element, alignToTop !== false);
|
11040
|
+
} else if (op.top > viewportBounds.bottom) {
|
11041
|
+
intoView(marker.element, alignToTop === true);
|
11028
11042
|
}
|
11029
11043
|
};
|
11044
|
+
const rangeIntoWindow = (editor, rng, alignToTop) => withMarker(editor, intoWindow, rng, alignToTop);
|
11045
|
+
const elementIntoWindow = (editor, element, alignToTop) => withElement(editor, element, intoWindow, alignToTop);
|
11046
|
+
const rangeIntoFrame = (editor, rng, alignToTop) => withMarker(editor, intoFrame, rng, alignToTop);
|
11047
|
+
const elementIntoFrame = (editor, element, alignToTop) => withElement(editor, element, intoFrame, alignToTop);
|
11048
|
+
const scrollElementIntoView = (editor, element, alignToTop) => {
|
11049
|
+
const scroller = editor.inline ? elementIntoWindow : elementIntoFrame;
|
11050
|
+
scroller(editor, element, alignToTop);
|
11051
|
+
};
|
11052
|
+
const scrollRangeIntoView = (editor, rng, alignToTop) => {
|
11053
|
+
const scroller = editor.inline ? rangeIntoWindow : rangeIntoFrame;
|
11054
|
+
scroller(editor, rng, alignToTop);
|
11055
|
+
};
|
11030
11056
|
|
11031
11057
|
const isEditableRange = (dom, rng) => {
|
11032
11058
|
if (rng.collapsed) {
|
@@ -11521,7 +11547,7 @@
|
|
11521
11547
|
const doc = editor.getDoc();
|
11522
11548
|
const dos = getRootNode(SugarElement.fromDom(editor.getBody()));
|
11523
11549
|
const offscreenDiv = SugarElement.fromTag('div', doc);
|
11524
|
-
set$
|
11550
|
+
set$4(offscreenDiv, 'data-mce-bogus', 'all');
|
11525
11551
|
setAll(offscreenDiv, {
|
11526
11552
|
position: 'fixed',
|
11527
11553
|
left: '-9999999px',
|
@@ -12466,7 +12492,7 @@
|
|
12466
12492
|
editor.selection.collapse(true);
|
12467
12493
|
}
|
12468
12494
|
if (selectedCells.length > 1 && exists(selectedCells, cell => eq(cell, selectedNode))) {
|
12469
|
-
set$
|
12495
|
+
set$4(selectedNode, 'data-mce-selected', '1');
|
12470
12496
|
}
|
12471
12497
|
};
|
12472
12498
|
const emptySingleTableCells = (editor, cells, outsideDetails) => Optional.some(() => {
|
@@ -15001,13 +15027,21 @@
|
|
15001
15027
|
const matches = /([a-z0-9+\/=\s]+)/i.exec(data);
|
15002
15028
|
return matches ? matches[1] : '';
|
15003
15029
|
};
|
15030
|
+
const decodeData = data => {
|
15031
|
+
try {
|
15032
|
+
return decodeURIComponent(data);
|
15033
|
+
} catch (_a) {
|
15034
|
+
return data;
|
15035
|
+
}
|
15036
|
+
};
|
15004
15037
|
const parseDataUri = uri => {
|
15005
15038
|
const [type, ...rest] = uri.split(',');
|
15006
15039
|
const data = rest.join(',');
|
15007
15040
|
const matches = /data:([^/]+\/[^;]+)(;.+)?/.exec(type);
|
15008
15041
|
if (matches) {
|
15009
15042
|
const base64Encoded = matches[2] === ';base64';
|
15010
|
-
const
|
15043
|
+
const decodedData = decodeData(data);
|
15044
|
+
const extractedData = base64Encoded ? extractBase64Data(decodedData) : decodedData;
|
15011
15045
|
return Optional.some({
|
15012
15046
|
type: matches[1],
|
15013
15047
|
data: extractedData,
|
@@ -17182,11 +17216,11 @@
|
|
17182
17216
|
}
|
17183
17217
|
if (validate && rule && !isInternalElement) {
|
17184
17218
|
each$e((_c = rule.attributesForced) !== null && _c !== void 0 ? _c : [], attr => {
|
17185
|
-
set$
|
17219
|
+
set$4(element, attr.name, attr.value === '{$uid}' ? `mce_${ uid++ }` : attr.value);
|
17186
17220
|
});
|
17187
17221
|
each$e((_d = rule.attributesDefault) !== null && _d !== void 0 ? _d : [], attr => {
|
17188
17222
|
if (!has$1(element, attr.name)) {
|
17189
|
-
set$
|
17223
|
+
set$4(element, attr.name, attr.value === '{$uid}' ? `mce_${ uid++ }` : attr.value);
|
17190
17224
|
}
|
17191
17225
|
});
|
17192
17226
|
if (rule.attributesRequired && !exists(rule.attributesRequired, attr => has$1(element, attr))) {
|
@@ -19800,41 +19834,182 @@
|
|
19800
19834
|
fireError(editor, errorType, { message: msg });
|
19801
19835
|
console.error(msg);
|
19802
19836
|
};
|
19803
|
-
const createLoadError = (type, url, name) => name ? `Failed to load ${ type }: ${ name } from url ${ url }` : `Failed to load ${ type } url: ${ url }`;
|
19804
|
-
const pluginLoadError = (editor, url, name) => {
|
19805
|
-
logError(editor, 'PluginLoadError', createLoadError('plugin', url, name));
|
19837
|
+
const createLoadError = (type, url, name) => name ? `Failed to load ${ type }: ${ name } from url ${ url }` : `Failed to load ${ type } url: ${ url }`;
|
19838
|
+
const pluginLoadError = (editor, url, name) => {
|
19839
|
+
logError(editor, 'PluginLoadError', createLoadError('plugin', url, name));
|
19840
|
+
};
|
19841
|
+
const iconsLoadError = (editor, url, name) => {
|
19842
|
+
logError(editor, 'IconsLoadError', createLoadError('icons', url, name));
|
19843
|
+
};
|
19844
|
+
const languageLoadError = (editor, url, name) => {
|
19845
|
+
logError(editor, 'LanguageLoadError', createLoadError('language', url, name));
|
19846
|
+
};
|
19847
|
+
const themeLoadError = (editor, url, name) => {
|
19848
|
+
logError(editor, 'ThemeLoadError', createLoadError('theme', url, name));
|
19849
|
+
};
|
19850
|
+
const modelLoadError = (editor, url, name) => {
|
19851
|
+
logError(editor, 'ModelLoadError', createLoadError('model', url, name));
|
19852
|
+
};
|
19853
|
+
const pluginInitError = (editor, name, err) => {
|
19854
|
+
const message = I18n.translate([
|
19855
|
+
'Failed to initialize plugin: {0}',
|
19856
|
+
name
|
19857
|
+
]);
|
19858
|
+
fireError(editor, 'PluginLoadError', { message });
|
19859
|
+
initError(message, err);
|
19860
|
+
displayError(editor, message);
|
19861
|
+
};
|
19862
|
+
const initError = (message, ...x) => {
|
19863
|
+
const console = window.console;
|
19864
|
+
if (console) {
|
19865
|
+
if (console.error) {
|
19866
|
+
console.error(message, ...x);
|
19867
|
+
} else {
|
19868
|
+
console.log(message, ...x);
|
19869
|
+
}
|
19870
|
+
}
|
19871
|
+
};
|
19872
|
+
|
19873
|
+
const removeFakeSelection = editor => {
|
19874
|
+
Optional.from(editor.selection.getNode()).each(elm => {
|
19875
|
+
elm.removeAttribute('data-mce-selected');
|
19876
|
+
});
|
19877
|
+
};
|
19878
|
+
const setEditorCommandState = (editor, cmd, state) => {
|
19879
|
+
try {
|
19880
|
+
editor.getDoc().execCommand(cmd, false, String(state));
|
19881
|
+
} catch (ex) {
|
19882
|
+
}
|
19883
|
+
};
|
19884
|
+
const setCommonEditorCommands = (editor, state) => {
|
19885
|
+
setEditorCommandState(editor, 'StyleWithCSS', state);
|
19886
|
+
setEditorCommandState(editor, 'enableInlineTableEditing', state);
|
19887
|
+
setEditorCommandState(editor, 'enableObjectResizing', state);
|
19888
|
+
};
|
19889
|
+
const restoreFakeSelection = editor => {
|
19890
|
+
editor.selection.setRng(editor.selection.getRng());
|
19891
|
+
};
|
19892
|
+
const toggleClass = (elm, cls, state) => {
|
19893
|
+
if (has(elm, cls) && !state) {
|
19894
|
+
remove$6(elm, cls);
|
19895
|
+
} else if (state) {
|
19896
|
+
add$2(elm, cls);
|
19897
|
+
}
|
19898
|
+
};
|
19899
|
+
const disableEditor = editor => {
|
19900
|
+
const body = SugarElement.fromDom(editor.getBody());
|
19901
|
+
toggleClass(body, 'mce-content-readonly', true);
|
19902
|
+
editor.selection.controlSelection.hideResizeRect();
|
19903
|
+
editor._selectionOverrides.hideFakeCaret();
|
19904
|
+
removeFakeSelection(editor);
|
19905
|
+
};
|
19906
|
+
const enableEditor = editor => {
|
19907
|
+
const body = SugarElement.fromDom(editor.getBody());
|
19908
|
+
toggleClass(body, 'mce-content-readonly', false);
|
19909
|
+
if (editor.hasEditableRoot()) {
|
19910
|
+
set$3(body, true);
|
19911
|
+
}
|
19912
|
+
setCommonEditorCommands(editor, false);
|
19913
|
+
if (hasEditorOrUiFocus(editor)) {
|
19914
|
+
editor.focus();
|
19915
|
+
}
|
19916
|
+
restoreFakeSelection(editor);
|
19917
|
+
editor.nodeChanged();
|
19918
|
+
};
|
19919
|
+
|
19920
|
+
const isDisabled = editor => isDisabled$1(editor);
|
19921
|
+
const internalContentEditableAttr = 'data-mce-contenteditable';
|
19922
|
+
const switchOffContentEditableTrue = elm => {
|
19923
|
+
each$e(descendants(elm, '*[contenteditable="true"]'), elm => {
|
19924
|
+
set$4(elm, internalContentEditableAttr, 'true');
|
19925
|
+
set$3(elm, false);
|
19926
|
+
});
|
19806
19927
|
};
|
19807
|
-
const
|
19808
|
-
|
19928
|
+
const switchOnContentEditableTrue = elm => {
|
19929
|
+
each$e(descendants(elm, `*[${ internalContentEditableAttr }="true"]`), elm => {
|
19930
|
+
remove$9(elm, internalContentEditableAttr);
|
19931
|
+
set$3(elm, true);
|
19932
|
+
});
|
19809
19933
|
};
|
19810
|
-
const
|
19811
|
-
|
19934
|
+
const toggleDisabled = (editor, state) => {
|
19935
|
+
const body = SugarElement.fromDom(editor.getBody());
|
19936
|
+
if (state) {
|
19937
|
+
disableEditor(editor);
|
19938
|
+
set$3(body, false);
|
19939
|
+
switchOffContentEditableTrue(body);
|
19940
|
+
} else {
|
19941
|
+
switchOnContentEditableTrue(body);
|
19942
|
+
enableEditor(editor);
|
19943
|
+
}
|
19812
19944
|
};
|
19813
|
-
const
|
19814
|
-
|
19945
|
+
const registerDisabledContentFilters = editor => {
|
19946
|
+
if (editor.serializer) {
|
19947
|
+
registerFilters(editor);
|
19948
|
+
} else {
|
19949
|
+
editor.on('PreInit', () => {
|
19950
|
+
registerFilters(editor);
|
19951
|
+
});
|
19952
|
+
}
|
19815
19953
|
};
|
19816
|
-
const
|
19817
|
-
|
19954
|
+
const registerFilters = editor => {
|
19955
|
+
editor.parser.addAttributeFilter('contenteditable', nodes => {
|
19956
|
+
if (isDisabled(editor)) {
|
19957
|
+
each$e(nodes, node => {
|
19958
|
+
node.attr(internalContentEditableAttr, node.attr('contenteditable'));
|
19959
|
+
node.attr('contenteditable', 'false');
|
19960
|
+
});
|
19961
|
+
}
|
19962
|
+
});
|
19963
|
+
editor.serializer.addAttributeFilter(internalContentEditableAttr, nodes => {
|
19964
|
+
if (isDisabled(editor)) {
|
19965
|
+
each$e(nodes, node => {
|
19966
|
+
node.attr('contenteditable', node.attr(internalContentEditableAttr));
|
19967
|
+
});
|
19968
|
+
}
|
19969
|
+
});
|
19970
|
+
editor.serializer.addTempAttr(internalContentEditableAttr);
|
19818
19971
|
};
|
19819
|
-
const
|
19820
|
-
|
19821
|
-
|
19822
|
-
|
19823
|
-
|
19824
|
-
|
19825
|
-
initError(message, err);
|
19826
|
-
displayError(editor, message);
|
19972
|
+
const isClickEvent = e => e.type === 'click';
|
19973
|
+
const allowedEvents = ['copy'];
|
19974
|
+
const isAllowedEventInDisabledMode = e => contains$2(allowedEvents, e.type);
|
19975
|
+
const getAnchorHrefOpt = (editor, elm) => {
|
19976
|
+
const isRoot = elm => eq(elm, SugarElement.fromDom(editor.getBody()));
|
19977
|
+
return closest$3(elm, 'a', isRoot).bind(a => getOpt(a, 'href'));
|
19827
19978
|
};
|
19828
|
-
const
|
19829
|
-
|
19830
|
-
|
19831
|
-
|
19832
|
-
|
19833
|
-
|
19834
|
-
|
19835
|
-
|
19979
|
+
const processDisabledEvents = (editor, e) => {
|
19980
|
+
if (isClickEvent(e) && !VK.metaKeyPressed(e)) {
|
19981
|
+
const elm = SugarElement.fromDom(e.target);
|
19982
|
+
getAnchorHrefOpt(editor, elm).each(href => {
|
19983
|
+
e.preventDefault();
|
19984
|
+
if (/^#/.test(href)) {
|
19985
|
+
const targetEl = editor.dom.select(`${ href },[name="${ removeLeading(href, '#') }"]`);
|
19986
|
+
if (targetEl.length) {
|
19987
|
+
editor.selection.scrollIntoView(targetEl[0], true);
|
19988
|
+
}
|
19989
|
+
} else {
|
19990
|
+
window.open(href, '_blank', 'rel=noopener noreferrer,menubar=yes,toolbar=yes,location=yes,status=yes,resizable=yes,scrollbars=yes');
|
19991
|
+
}
|
19992
|
+
});
|
19993
|
+
} else if (isAllowedEventInDisabledMode(e)) {
|
19994
|
+
editor.dispatch(e.type, e);
|
19836
19995
|
}
|
19837
19996
|
};
|
19997
|
+
const registerDisabledModeEventHandlers = editor => {
|
19998
|
+
editor.on('ShowCaret ObjectSelected', e => {
|
19999
|
+
if (isDisabled(editor)) {
|
20000
|
+
e.preventDefault();
|
20001
|
+
}
|
20002
|
+
});
|
20003
|
+
editor.on('DisabledStateChange', e => {
|
20004
|
+
if (!e.isDefaultPrevented()) {
|
20005
|
+
toggleDisabled(editor, e.state);
|
20006
|
+
}
|
20007
|
+
});
|
20008
|
+
};
|
20009
|
+
const registerEventsAndFilters$1 = editor => {
|
20010
|
+
registerDisabledContentFilters(editor);
|
20011
|
+
registerDisabledModeEventHandlers(editor);
|
20012
|
+
};
|
19838
20013
|
|
19839
20014
|
const isContentCssSkinName = url => /^[a-z0-9\-]+$/i.test(url);
|
19840
20015
|
const toContentSkinResourceName = url => 'content/' + url + '/content.css';
|
@@ -20431,6 +20606,11 @@
|
|
20431
20606
|
styles: { float: 'left' },
|
20432
20607
|
preview: 'font-family font-size'
|
20433
20608
|
},
|
20609
|
+
{
|
20610
|
+
selector: '.mce-placeholder',
|
20611
|
+
styles: { float: 'left' },
|
20612
|
+
ceFalseOverride: true
|
20613
|
+
},
|
20434
20614
|
{
|
20435
20615
|
selector: 'table',
|
20436
20616
|
collapsed: false,
|
@@ -20473,6 +20653,15 @@
|
|
20473
20653
|
},
|
20474
20654
|
preview: false
|
20475
20655
|
},
|
20656
|
+
{
|
20657
|
+
selector: '.mce-placeholder',
|
20658
|
+
styles: {
|
20659
|
+
display: 'block',
|
20660
|
+
marginLeft: 'auto',
|
20661
|
+
marginRight: 'auto'
|
20662
|
+
},
|
20663
|
+
ceFalseOverride: true
|
20664
|
+
},
|
20476
20665
|
{
|
20477
20666
|
selector: 'table',
|
20478
20667
|
collapsed: false,
|
@@ -20522,6 +20711,11 @@
|
|
20522
20711
|
styles: { float: 'right' },
|
20523
20712
|
preview: 'font-family font-size'
|
20524
20713
|
},
|
20714
|
+
{
|
20715
|
+
selector: '.mce-placeholder',
|
20716
|
+
styles: { float: 'right' },
|
20717
|
+
ceFalseOverride: true
|
20718
|
+
},
|
20525
20719
|
{
|
20526
20720
|
selector: 'table',
|
20527
20721
|
collapsed: false,
|
@@ -20680,6 +20874,7 @@
|
|
20680
20874
|
subscript: { inline: 'sub' },
|
20681
20875
|
superscript: { inline: 'sup' },
|
20682
20876
|
code: { inline: 'code' },
|
20877
|
+
samp: { inline: 'samp' },
|
20683
20878
|
link: {
|
20684
20879
|
inline: 'a',
|
20685
20880
|
selector: 'a',
|
@@ -20739,7 +20934,7 @@
|
|
20739
20934
|
}
|
20740
20935
|
]
|
20741
20936
|
};
|
20742
|
-
Tools.each('p h1 h2 h3 h4 h5 h6 div address pre dt dd
|
20937
|
+
Tools.each('p h1 h2 h3 h4 h5 h6 div address pre dt dd'.split(/\s/), name => {
|
20743
20938
|
formats[name] = {
|
20744
20939
|
block: name,
|
20745
20940
|
remove: 'all'
|
@@ -24076,6 +24271,29 @@
|
|
24076
24271
|
toString
|
24077
24272
|
};
|
24078
24273
|
};
|
24274
|
+
const oneOf = (props, rawF) => {
|
24275
|
+
const f = rawF !== undefined ? rawF : identity;
|
24276
|
+
const extract = (path, val) => {
|
24277
|
+
const errors = [];
|
24278
|
+
for (const prop of props) {
|
24279
|
+
const res = prop.extract(path, val);
|
24280
|
+
if (res.stype === SimpleResultType.Value) {
|
24281
|
+
return {
|
24282
|
+
stype: SimpleResultType.Value,
|
24283
|
+
svalue: f(res.svalue)
|
24284
|
+
};
|
24285
|
+
}
|
24286
|
+
errors.push(res);
|
24287
|
+
}
|
24288
|
+
return ResultCombine.consolidateArr(errors);
|
24289
|
+
};
|
24290
|
+
const toString = () => 'oneOf(' + map$3(props, prop => prop.toString()).join(', ') + ')';
|
24291
|
+
return {
|
24292
|
+
extract,
|
24293
|
+
toString
|
24294
|
+
};
|
24295
|
+
};
|
24296
|
+
const arrOfObj = compose(arrOf, objOf);
|
24079
24297
|
|
24080
24298
|
const valueOf = validator => value(v => validator(v).fold(SimpleResult.serror, SimpleResult.svalue));
|
24081
24299
|
const extractValue = (label, prop, obj) => {
|
@@ -24106,6 +24324,7 @@
|
|
24106
24324
|
const validateEnum = values => valueOf(value => contains$2(values, value) ? Result.value(value) : Result.error(`Unsupported value: "${ value }", choose one of "${ values.join(', ') }".`));
|
24107
24325
|
const requiredOf = (key, schema) => field(key, key, required(), schema);
|
24108
24326
|
const requiredString = key => requiredOf(key, string);
|
24327
|
+
const requiredStringEnum = (key, values) => field(key, key, required(), validateEnum(values));
|
24109
24328
|
const requiredFunction = key => requiredOf(key, functionProcessor);
|
24110
24329
|
const requiredArrayOf = (key, schema) => field(key, key, required(), arrOf(schema));
|
24111
24330
|
const optionOf = (key, schema) => field(key, key, asOption(), schema);
|
@@ -24173,12 +24392,14 @@
|
|
24173
24392
|
|
24174
24393
|
const contextButtonFields = baseToolbarButtonFields.concat([
|
24175
24394
|
defaultedType('contextformbutton'),
|
24395
|
+
defaultedString('align', 'end'),
|
24176
24396
|
primary,
|
24177
24397
|
onAction,
|
24178
24398
|
customField('original', identity)
|
24179
24399
|
]);
|
24180
24400
|
const contextToggleButtonFields = baseToolbarToggleButtonFields.concat([
|
24181
24401
|
defaultedType('contextformbutton'),
|
24402
|
+
defaultedString('align', 'end'),
|
24182
24403
|
primary,
|
24183
24404
|
onAction,
|
24184
24405
|
customField('original', identity)
|
@@ -24189,15 +24410,56 @@
|
|
24189
24410
|
contextformbutton: contextButtonFields,
|
24190
24411
|
contextformtogglebutton: contextToggleButtonFields
|
24191
24412
|
});
|
24192
|
-
|
24193
|
-
defaultedType('contextform'),
|
24194
|
-
defaultedFunction('initValue', constant('')),
|
24413
|
+
const baseContextFormFields = [
|
24195
24414
|
optionalLabel,
|
24196
24415
|
requiredArrayOf('commands', toggleOrNormal),
|
24197
24416
|
optionOf('launch', choose('type', {
|
24198
24417
|
contextformbutton: launchButtonFields,
|
24199
24418
|
contextformtogglebutton: launchToggleButtonFields
|
24419
|
+
})),
|
24420
|
+
defaultedFunction('onInput', noop),
|
24421
|
+
defaultedFunction('onSetup', noop)
|
24422
|
+
];
|
24423
|
+
const contextFormFields = [
|
24424
|
+
...contextBarFields,
|
24425
|
+
...baseContextFormFields,
|
24426
|
+
requiredStringEnum('type', ['contextform']),
|
24427
|
+
defaultedFunction('initValue', constant('')),
|
24428
|
+
optionString('placeholder')
|
24429
|
+
];
|
24430
|
+
const contextSliderFormFields = [
|
24431
|
+
...contextBarFields,
|
24432
|
+
...baseContextFormFields,
|
24433
|
+
requiredStringEnum('type', ['contextsliderform']),
|
24434
|
+
defaultedFunction('initValue', constant(0)),
|
24435
|
+
defaultedFunction('min', constant(0)),
|
24436
|
+
defaultedFunction('max', constant(100))
|
24437
|
+
];
|
24438
|
+
const contextSizeInputFormFields = [
|
24439
|
+
...contextBarFields,
|
24440
|
+
...baseContextFormFields,
|
24441
|
+
requiredStringEnum('type', ['contextsizeinputform']),
|
24442
|
+
defaultedFunction('initValue', constant({
|
24443
|
+
width: '',
|
24444
|
+
height: ''
|
24200
24445
|
}))
|
24446
|
+
];
|
24447
|
+
choose('type', {
|
24448
|
+
contextform: contextFormFields,
|
24449
|
+
contextsliderform: contextSliderFormFields,
|
24450
|
+
contextsizeinputform: contextSizeInputFormFields
|
24451
|
+
});
|
24452
|
+
|
24453
|
+
objOf([
|
24454
|
+
defaultedType('contexttoolbar'),
|
24455
|
+
requiredOf('items', oneOf([
|
24456
|
+
string,
|
24457
|
+
arrOfObj([
|
24458
|
+
optionString('name'),
|
24459
|
+
optionString('label'),
|
24460
|
+
requiredArrayOf('items', string)
|
24461
|
+
])
|
24462
|
+
]))
|
24201
24463
|
].concat(contextBarFields));
|
24202
24464
|
|
24203
24465
|
const register$2 = editor => {
|
@@ -25930,7 +26192,7 @@
|
|
25930
26192
|
const editor = this.editor;
|
25931
26193
|
const selection = editor.selection;
|
25932
26194
|
let node;
|
25933
|
-
if (editor.initialized && selection && !shouldDisableNodeChange(editor)) {
|
26195
|
+
if (editor.initialized && selection && !shouldDisableNodeChange(editor) && !isDisabled$1(editor)) {
|
25934
26196
|
const root = editor.getBody();
|
25935
26197
|
node = selection.getStart(true) || root;
|
25936
26198
|
if (node.ownerDocument !== editor.getDoc() || !editor.dom.isChildOf(node, root)) {
|
@@ -27761,7 +28023,7 @@
|
|
27761
28023
|
const doc = editor.getDoc();
|
27762
28024
|
const realSelectionContainer = descendant$1(body, '#' + realSelectionId).getOrThunk(() => {
|
27763
28025
|
const newContainer = SugarElement.fromHtml('<div data-mce-bogus="all" class="mce-offscreen-selection"></div>', doc);
|
27764
|
-
set$
|
28026
|
+
set$4(newContainer, 'id', realSelectionId);
|
27765
28027
|
append$1(body, newContainer);
|
27766
28028
|
return newContainer;
|
27767
28029
|
});
|
@@ -28864,7 +29126,7 @@
|
|
28864
29126
|
const body = SugarElement.fromDom(editor.getBody());
|
28865
29127
|
const container = getStyleContainer(getRootNode(body));
|
28866
29128
|
const style = SugarElement.fromTag('style');
|
28867
|
-
set$
|
29129
|
+
set$4(style, 'type', 'text/css');
|
28868
29130
|
append$1(style, SugarElement.fromText(text));
|
28869
29131
|
append$1(container, style);
|
28870
29132
|
editor.on('remove', () => {
|
@@ -29038,6 +29300,9 @@
|
|
29038
29300
|
initInstanceCallback.call(editor, editor);
|
29039
29301
|
}
|
29040
29302
|
autoFocus(editor);
|
29303
|
+
if (isDisabled(editor)) {
|
29304
|
+
toggleDisabled(editor, true);
|
29305
|
+
}
|
29041
29306
|
};
|
29042
29307
|
const getStyleSheetLoader$1 = editor => editor.inline ? editor.ui.styleSheetLoader : editor.dom.styleSheetLoader;
|
29043
29308
|
const makeStylesheetLoadingPromises = (editor, css, framedFonts) => {
|
@@ -29165,7 +29430,7 @@
|
|
29165
29430
|
body.disabled = true;
|
29166
29431
|
editor.readonly = isReadOnly$1(editor);
|
29167
29432
|
editor._editableRoot = hasEditableRoot$1(editor);
|
29168
|
-
if (editor.hasEditableRoot()) {
|
29433
|
+
if (!isDisabled$1(editor) && editor.hasEditableRoot()) {
|
29169
29434
|
if (editor.inline && DOM$6.getStyle(body, 'position', true) === 'static') {
|
29170
29435
|
body.style.position = 'relative';
|
29171
29436
|
}
|
@@ -29242,7 +29507,7 @@
|
|
29242
29507
|
const DOM$5 = DOMUtils.DOM;
|
29243
29508
|
const createIframeElement = (id, title, customAttrs, tabindex) => {
|
29244
29509
|
const iframe = SugarElement.fromTag('iframe');
|
29245
|
-
tabindex.each(t => set$
|
29510
|
+
tabindex.each(t => set$4(iframe, 'tabindex', t));
|
29246
29511
|
setAll$1(iframe, customAttrs);
|
29247
29512
|
setAll$1(iframe, {
|
29248
29513
|
id: id + '_ifr',
|
@@ -29424,7 +29689,7 @@
|
|
29424
29689
|
hide: Optional.from(api.hide).getOr(noop),
|
29425
29690
|
isEnabled: Optional.from(api.isEnabled).getOr(always),
|
29426
29691
|
setEnabled: state => {
|
29427
|
-
const shouldSkip = state && editor.mode.get() === 'readonly';
|
29692
|
+
const shouldSkip = state && (editor.mode.get() === 'readonly' || isDisabled(editor));
|
29428
29693
|
if (!shouldSkip) {
|
29429
29694
|
Optional.from(api.setEnabled).each(f => f(state));
|
29430
29695
|
}
|
@@ -29638,8 +29903,10 @@
|
|
29638
29903
|
const setEditableRoot = (editor, state) => {
|
29639
29904
|
if (editor._editableRoot !== state) {
|
29640
29905
|
editor._editableRoot = state;
|
29641
|
-
|
29642
|
-
|
29906
|
+
if (!isDisabled(editor)) {
|
29907
|
+
editor.getBody().contentEditable = String(editor.hasEditableRoot());
|
29908
|
+
editor.nodeChanged();
|
29909
|
+
}
|
29643
29910
|
fireEditableRootStateChange(editor, state);
|
29644
29911
|
}
|
29645
29912
|
};
|
@@ -30327,120 +30594,6 @@
|
|
30327
30594
|
}
|
30328
30595
|
}
|
30329
30596
|
|
30330
|
-
const toggleClass = (elm, cls, state) => {
|
30331
|
-
if (has(elm, cls) && !state) {
|
30332
|
-
remove$6(elm, cls);
|
30333
|
-
} else if (state) {
|
30334
|
-
add$2(elm, cls);
|
30335
|
-
}
|
30336
|
-
};
|
30337
|
-
const setEditorCommandState = (editor, cmd, state) => {
|
30338
|
-
try {
|
30339
|
-
editor.getDoc().execCommand(cmd, false, String(state));
|
30340
|
-
} catch (ex) {
|
30341
|
-
}
|
30342
|
-
};
|
30343
|
-
const setContentEditable = (elm, state) => {
|
30344
|
-
elm.dom.contentEditable = state ? 'true' : 'false';
|
30345
|
-
};
|
30346
|
-
const removeFakeSelection = editor => {
|
30347
|
-
Optional.from(editor.selection.getNode()).each(elm => {
|
30348
|
-
elm.removeAttribute('data-mce-selected');
|
30349
|
-
});
|
30350
|
-
};
|
30351
|
-
const restoreFakeSelection = editor => {
|
30352
|
-
editor.selection.setRng(editor.selection.getRng());
|
30353
|
-
};
|
30354
|
-
const setCommonEditorCommands = (editor, state) => {
|
30355
|
-
setEditorCommandState(editor, 'StyleWithCSS', state);
|
30356
|
-
setEditorCommandState(editor, 'enableInlineTableEditing', state);
|
30357
|
-
setEditorCommandState(editor, 'enableObjectResizing', state);
|
30358
|
-
};
|
30359
|
-
const setEditorReadonly = editor => {
|
30360
|
-
editor.readonly = true;
|
30361
|
-
editor.selection.controlSelection.hideResizeRect();
|
30362
|
-
editor._selectionOverrides.hideFakeCaret();
|
30363
|
-
removeFakeSelection(editor);
|
30364
|
-
};
|
30365
|
-
const unsetEditorReadonly = (editor, body) => {
|
30366
|
-
editor.readonly = false;
|
30367
|
-
if (editor.hasEditableRoot()) {
|
30368
|
-
setContentEditable(body, true);
|
30369
|
-
}
|
30370
|
-
setCommonEditorCommands(editor, false);
|
30371
|
-
if (hasEditorOrUiFocus(editor)) {
|
30372
|
-
editor.focus();
|
30373
|
-
}
|
30374
|
-
restoreFakeSelection(editor);
|
30375
|
-
editor.nodeChanged();
|
30376
|
-
};
|
30377
|
-
const toggleReadOnly = (editor, state) => {
|
30378
|
-
const body = SugarElement.fromDom(editor.getBody());
|
30379
|
-
toggleClass(body, 'mce-content-readonly', state);
|
30380
|
-
if (state) {
|
30381
|
-
setEditorReadonly(editor);
|
30382
|
-
if (editor.hasEditableRoot()) {
|
30383
|
-
setContentEditable(body, true);
|
30384
|
-
}
|
30385
|
-
} else {
|
30386
|
-
unsetEditorReadonly(editor, body);
|
30387
|
-
}
|
30388
|
-
};
|
30389
|
-
const isReadOnly = editor => editor.readonly;
|
30390
|
-
const isClickEvent = e => e.type === 'click';
|
30391
|
-
const allowedEvents = ['copy'];
|
30392
|
-
const isReadOnlyAllowedEvent = e => contains$2(allowedEvents, e.type);
|
30393
|
-
const getAnchorHrefOpt = (editor, elm) => {
|
30394
|
-
const isRoot = elm => eq(elm, SugarElement.fromDom(editor.getBody()));
|
30395
|
-
return closest$3(elm, 'a', isRoot).bind(a => getOpt(a, 'href'));
|
30396
|
-
};
|
30397
|
-
const processReadonlyEvents = (editor, e) => {
|
30398
|
-
if (isClickEvent(e) && !VK.metaKeyPressed(e)) {
|
30399
|
-
const elm = SugarElement.fromDom(e.target);
|
30400
|
-
getAnchorHrefOpt(editor, elm).each(href => {
|
30401
|
-
e.preventDefault();
|
30402
|
-
if (/^#/.test(href)) {
|
30403
|
-
const targetEl = editor.dom.select(`${ href },[name="${ removeLeading(href, '#') }"]`);
|
30404
|
-
if (targetEl.length) {
|
30405
|
-
editor.selection.scrollIntoView(targetEl[0], true);
|
30406
|
-
}
|
30407
|
-
} else {
|
30408
|
-
window.open(href, '_blank', 'rel=noopener noreferrer,menubar=yes,toolbar=yes,location=yes,status=yes,resizable=yes,scrollbars=yes');
|
30409
|
-
}
|
30410
|
-
});
|
30411
|
-
} else if (isReadOnlyAllowedEvent(e)) {
|
30412
|
-
editor.dispatch(e.type, e);
|
30413
|
-
}
|
30414
|
-
};
|
30415
|
-
const registerReadOnlySelectionBlockers = editor => {
|
30416
|
-
editor.on('beforeinput paste cut dragend dragover draggesture dragdrop drop drag', e => {
|
30417
|
-
if (isReadOnly(editor)) {
|
30418
|
-
e.preventDefault();
|
30419
|
-
}
|
30420
|
-
});
|
30421
|
-
editor.on('BeforeExecCommand', e => {
|
30422
|
-
if ((e.command === 'Undo' || e.command === 'Redo') && isReadOnly(editor)) {
|
30423
|
-
e.preventDefault();
|
30424
|
-
}
|
30425
|
-
});
|
30426
|
-
editor.on('input', e => {
|
30427
|
-
if (!e.isComposing && isReadOnly(editor)) {
|
30428
|
-
const undoLevel = editor.undoManager.add();
|
30429
|
-
if (isNonNullable(undoLevel)) {
|
30430
|
-
editor.undoManager.undo();
|
30431
|
-
}
|
30432
|
-
}
|
30433
|
-
});
|
30434
|
-
editor.on('compositionend', () => {
|
30435
|
-
if (isReadOnly(editor)) {
|
30436
|
-
const undoLevel = editor.undoManager.add();
|
30437
|
-
if (isNonNullable(undoLevel)) {
|
30438
|
-
editor.undoManager.undo();
|
30439
|
-
}
|
30440
|
-
}
|
30441
|
-
});
|
30442
|
-
};
|
30443
|
-
|
30444
30597
|
const nativeEvents = Tools.makeMap('focus blur focusin focusout click dblclick mousedown mouseup mousemove mouseover beforepaste paste cut copy selectionchange ' + 'mouseout mouseenter mouseleave wheel keydown keypress keyup input beforeinput contextmenu dragstart dragend dragover ' + 'draggesture dragdrop drop drag submit ' + 'compositionstart compositionend compositionupdate touchstart touchmove touchend touchcancel', ' ');
|
30445
30598
|
class EventDispatcher {
|
30446
30599
|
static isNative(name) {
|
@@ -30632,12 +30785,12 @@
|
|
30632
30785
|
}
|
30633
30786
|
return editor.getBody();
|
30634
30787
|
};
|
30635
|
-
const isListening = editor => !editor.hidden;
|
30788
|
+
const isListening = editor => !editor.hidden && !isDisabled(editor);
|
30636
30789
|
const fireEvent = (editor, eventName, e) => {
|
30637
30790
|
if (isListening(editor)) {
|
30638
30791
|
editor.dispatch(eventName, e);
|
30639
|
-
} else if (
|
30640
|
-
|
30792
|
+
} else if (isDisabled(editor)) {
|
30793
|
+
processDisabledEvents(editor, e);
|
30641
30794
|
}
|
30642
30795
|
};
|
30643
30796
|
const bindEventDelegate = (editor, eventName) => {
|
@@ -30886,6 +31039,52 @@
|
|
30886
31039
|
};
|
30887
31040
|
};
|
30888
31041
|
|
31042
|
+
const setContentEditable = (elm, state) => {
|
31043
|
+
elm.dom.contentEditable = state ? 'true' : 'false';
|
31044
|
+
};
|
31045
|
+
const toggleReadOnly = (editor, state) => {
|
31046
|
+
const body = SugarElement.fromDom(editor.getBody());
|
31047
|
+
if (state) {
|
31048
|
+
editor.readonly = true;
|
31049
|
+
if (editor.hasEditableRoot()) {
|
31050
|
+
setContentEditable(body, true);
|
31051
|
+
}
|
31052
|
+
disableEditor(editor);
|
31053
|
+
} else {
|
31054
|
+
editor.readonly = false;
|
31055
|
+
enableEditor(editor);
|
31056
|
+
}
|
31057
|
+
};
|
31058
|
+
const isReadOnly = editor => editor.readonly;
|
31059
|
+
const registerReadOnlyInputBlockers = editor => {
|
31060
|
+
editor.on('beforeinput paste cut dragend dragover draggesture dragdrop drop drag', e => {
|
31061
|
+
if (isReadOnly(editor)) {
|
31062
|
+
e.preventDefault();
|
31063
|
+
}
|
31064
|
+
});
|
31065
|
+
editor.on('BeforeExecCommand', e => {
|
31066
|
+
if ((e.command === 'Undo' || e.command === 'Redo') && isReadOnly(editor)) {
|
31067
|
+
e.preventDefault();
|
31068
|
+
}
|
31069
|
+
});
|
31070
|
+
editor.on('input', e => {
|
31071
|
+
if (!e.isComposing && isReadOnly(editor)) {
|
31072
|
+
const undoLevel = editor.undoManager.add();
|
31073
|
+
if (isNonNullable(undoLevel)) {
|
31074
|
+
editor.undoManager.undo();
|
31075
|
+
}
|
31076
|
+
}
|
31077
|
+
});
|
31078
|
+
editor.on('compositionend', () => {
|
31079
|
+
if (isReadOnly(editor)) {
|
31080
|
+
const undoLevel = editor.undoManager.add();
|
31081
|
+
if (isNonNullable(undoLevel)) {
|
31082
|
+
editor.undoManager.undo();
|
31083
|
+
}
|
31084
|
+
}
|
31085
|
+
});
|
31086
|
+
};
|
31087
|
+
|
30889
31088
|
const defaultModes = [
|
30890
31089
|
'design',
|
30891
31090
|
'readonly'
|
@@ -30907,7 +31106,7 @@
|
|
30907
31106
|
fireSwitchMode(editor, mode);
|
30908
31107
|
};
|
30909
31108
|
const setMode = (editor, availableModes, activeMode, mode) => {
|
30910
|
-
if (mode === activeMode.get()) {
|
31109
|
+
if (mode === activeMode.get() || editor.initialized && isDisabled(editor)) {
|
30911
31110
|
return;
|
30912
31111
|
} else if (!has$2(availableModes, mode)) {
|
30913
31112
|
throw new Error(`Editor mode '${ mode }' is invalid`);
|
@@ -30951,7 +31150,8 @@
|
|
30951
31150
|
editorReadOnly: true
|
30952
31151
|
}
|
30953
31152
|
});
|
30954
|
-
|
31153
|
+
registerReadOnlyInputBlockers(editor);
|
31154
|
+
registerEventsAndFilters$1(editor);
|
30955
31155
|
return {
|
30956
31156
|
isReadOnly: () => isReadOnly(editor),
|
30957
31157
|
set: mode => setMode(editor, availableModes.get(), activeMode, mode),
|
@@ -31135,6 +31335,12 @@
|
|
31135
31335
|
type
|
31136
31336
|
};
|
31137
31337
|
};
|
31338
|
+
const addDefaulted = (collection, type) => (name, spec) => {
|
31339
|
+
collection[name.toLowerCase()] = {
|
31340
|
+
type,
|
31341
|
+
...spec
|
31342
|
+
};
|
31343
|
+
};
|
31138
31344
|
const addIcon = (name, svgData) => icons[name.toLowerCase()] = svgData;
|
31139
31345
|
const addContext = (name, pred) => contexts[name.toLowerCase()] = pred;
|
31140
31346
|
return {
|
@@ -31149,7 +31355,7 @@
|
|
31149
31355
|
addAutocompleter: add(popups, 'autocompleter'),
|
31150
31356
|
addContextMenu: add(contextMenus, 'contextmenu'),
|
31151
31357
|
addContextToolbar: add(contextToolbars, 'contexttoolbar'),
|
31152
|
-
addContextForm:
|
31358
|
+
addContextForm: addDefaulted(contextToolbars, 'contextform'),
|
31153
31359
|
addSidebar: add(sidebars, 'sidebar'),
|
31154
31360
|
addView: add(views, 'views'),
|
31155
31361
|
addIcon,
|
@@ -31623,8 +31829,8 @@
|
|
31623
31829
|
documentBaseURL: null,
|
31624
31830
|
suffix: null,
|
31625
31831
|
majorVersion: '7',
|
31626
|
-
minorVersion: '
|
31627
|
-
releaseDate: '2024-11
|
31832
|
+
minorVersion: '6.0',
|
31833
|
+
releaseDate: '2024-12-11',
|
31628
31834
|
i18n: I18n,
|
31629
31835
|
activeEditor: null,
|
31630
31836
|
focusedEditor: null,
|