tinymce-rails 6.6.1 → 6.7.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +4 -4
- data/app/assets/source/tinymce/tinymce.js +911 -691
- data/lib/tinymce/rails/version.rb +2 -2
- data/vendor/assets/javascripts/tinymce/models/dom/model.js +1 -1
- data/vendor/assets/javascripts/tinymce/plugins/accordion/plugin.js +1 -1
- data/vendor/assets/javascripts/tinymce/plugins/advlist/plugin.js +1 -1
- 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 +2 -2
- data/vendor/assets/javascripts/tinymce/plugins/media/plugin.js +2 -2
- 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 +2 -2
- data/vendor/assets/javascripts/tinymce/plugins/template/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.min.css +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.min.css +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.min.css +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.min.css +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.min.css +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.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.min.css +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.min.css +1 -1
- data/vendor/assets/javascripts/tinymce/themes/silver/theme.js +2 -2
- data/vendor/assets/javascripts/tinymce/tinymce.d.ts +4 -6
- data/vendor/assets/javascripts/tinymce/tinymce.js +2 -2
- metadata +3 -3
@@ -1,5 +1,5 @@
|
|
1
1
|
/**
|
2
|
-
* TinyMCE version 6.
|
2
|
+
* TinyMCE version 6.7.0 (2023-08-30)
|
3
3
|
*/
|
4
4
|
|
5
5
|
(function () {
|
@@ -960,26 +960,26 @@
|
|
960
960
|
|
961
961
|
const userAgent = navigator.userAgent;
|
962
962
|
const platform$3 = detect$2();
|
963
|
-
const browser$
|
963
|
+
const browser$3 = platform$3.browser;
|
964
964
|
const os$1 = platform$3.os;
|
965
965
|
const deviceType = platform$3.deviceType;
|
966
966
|
const windowsPhone = userAgent.indexOf('Windows Phone') !== -1;
|
967
967
|
const Env = {
|
968
968
|
transparentSrc: 'data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7',
|
969
|
-
documentMode: browser$
|
969
|
+
documentMode: browser$3.isIE() ? document.documentMode || 7 : 10,
|
970
970
|
cacheSuffix: null,
|
971
971
|
container: null,
|
972
|
-
canHaveCSP: !browser$
|
972
|
+
canHaveCSP: !browser$3.isIE(),
|
973
973
|
windowsPhone,
|
974
974
|
browser: {
|
975
|
-
current: browser$
|
976
|
-
version: browser$
|
977
|
-
isChromium: browser$
|
978
|
-
isEdge: browser$
|
979
|
-
isFirefox: browser$
|
980
|
-
isIE: browser$
|
981
|
-
isOpera: browser$
|
982
|
-
isSafari: browser$
|
975
|
+
current: browser$3.current,
|
976
|
+
version: browser$3.version,
|
977
|
+
isChromium: browser$3.isChromium,
|
978
|
+
isEdge: browser$3.isEdge,
|
979
|
+
isFirefox: browser$3.isFirefox,
|
980
|
+
isIE: browser$3.isIE,
|
981
|
+
isOpera: browser$3.isOpera,
|
982
|
+
isSafari: browser$3.isSafari
|
983
983
|
},
|
984
984
|
os: {
|
985
985
|
current: os$1.current,
|
@@ -1101,6 +1101,7 @@
|
|
1101
1101
|
};
|
1102
1102
|
|
1103
1103
|
const is$2 = (lhs, rhs, comparator = tripleEquals) => lhs.exists(left => comparator(left, rhs));
|
1104
|
+
const equals = (lhs, rhs, comparator = tripleEquals) => lift2(lhs, rhs, comparator).getOr(lhs.isNone() && rhs.isNone());
|
1104
1105
|
const cat = arr => {
|
1105
1106
|
const r = [];
|
1106
1107
|
const push = x => {
|
@@ -1744,6 +1745,13 @@
|
|
1744
1745
|
const y = doc.body.scrollTop || doc.documentElement.scrollTop;
|
1745
1746
|
return SugarPosition(x, y);
|
1746
1747
|
};
|
1748
|
+
const to = (x, y, _DOC) => {
|
1749
|
+
const doc = _DOC !== undefined ? _DOC.dom : document;
|
1750
|
+
const win = doc.defaultView;
|
1751
|
+
if (win) {
|
1752
|
+
win.scrollTo(x, y);
|
1753
|
+
}
|
1754
|
+
};
|
1747
1755
|
const intoView = (element, alignToTop) => {
|
1748
1756
|
const isSafari = detect$2().browser.isSafari();
|
1749
1757
|
if (isSafari && isFunction(element.dom.scrollIntoViewIfNeeded)) {
|
@@ -2524,10 +2532,10 @@
|
|
2524
2532
|
const isTransparentInline = (schema, node) => isTransparentElement(schema, node) && !hasBlockAttr(node);
|
2525
2533
|
const isTransparentAstBlock = (schema, node) => node.type === 1 && isTransparentElementName(schema, node.name) && isString(node.attr(transparentBlockAttr));
|
2526
2534
|
|
2527
|
-
const browser$
|
2535
|
+
const browser$2 = detect$2().browser;
|
2528
2536
|
const firstElement = nodes => find$2(nodes, isElement$7);
|
2529
2537
|
const getTableCaptionDeltaY = elm => {
|
2530
|
-
if (browser$
|
2538
|
+
if (browser$2.isFirefox() && name(elm) === 'table') {
|
2531
2539
|
return firstElement(children$1(elm)).filter(elm => {
|
2532
2540
|
return name(elm) === 'caption';
|
2533
2541
|
}).bind(caption => {
|
@@ -2890,23 +2898,75 @@
|
|
2890
2898
|
decode
|
2891
2899
|
};
|
2892
2900
|
|
2893
|
-
const lookupCache = {};
|
2894
|
-
const mapCache = {};
|
2895
|
-
const dummyObj = {};
|
2896
|
-
const makeMap$2 = Tools.makeMap, each$b = Tools.each, extend$2 = Tools.extend, explode$2 = Tools.explode, inArray = Tools.inArray;
|
2897
2901
|
const split$1 = (items, delim) => {
|
2898
2902
|
items = Tools.trim(items);
|
2899
2903
|
return items ? items.split(delim || ' ') : [];
|
2900
2904
|
};
|
2901
|
-
const
|
2902
|
-
|
2903
|
-
|
2905
|
+
const patternToRegExp = str => new RegExp('^' + str.replace(/([?+*])/g, '.$1') + '$');
|
2906
|
+
|
2907
|
+
const parseCustomElementsRules = value => {
|
2908
|
+
const customElementRegExp = /^(~)?(.+)$/;
|
2909
|
+
return bind$3(split$1(value, ','), rule => {
|
2910
|
+
const matches = customElementRegExp.exec(rule);
|
2911
|
+
if (matches) {
|
2912
|
+
const inline = matches[1] === '~';
|
2913
|
+
const cloneName = inline ? 'span' : 'div';
|
2914
|
+
const name = matches[2];
|
2915
|
+
return [{
|
2916
|
+
inline,
|
2917
|
+
cloneName,
|
2918
|
+
name
|
2919
|
+
}];
|
2920
|
+
} else {
|
2921
|
+
return [];
|
2922
|
+
}
|
2923
|
+
});
|
2904
2924
|
};
|
2905
|
-
|
2906
|
-
const
|
2907
|
-
const schema = {};
|
2925
|
+
|
2926
|
+
const getElementSetsAsStrings = type => {
|
2908
2927
|
let globalAttributes, blockContent;
|
2909
2928
|
let phrasingContent, flowContent;
|
2929
|
+
globalAttributes = 'id accesskey class dir lang style tabindex title role';
|
2930
|
+
blockContent = 'address blockquote div dl fieldset form h1 h2 h3 h4 h5 h6 hr menu ol p pre table ul';
|
2931
|
+
phrasingContent = 'a abbr b bdo br button cite code del dfn em embed i iframe img input ins kbd ' + 'label map noscript object q s samp script select small span strong sub sup ' + 'textarea u var #text #comment';
|
2932
|
+
if (type !== 'html4') {
|
2933
|
+
const transparentContent = 'a ins del canvas map';
|
2934
|
+
globalAttributes += ' contenteditable contextmenu draggable dropzone ' + 'hidden spellcheck translate';
|
2935
|
+
blockContent += ' article aside details dialog figure main header footer hgroup section nav ' + transparentContent;
|
2936
|
+
phrasingContent += ' audio canvas command datalist mark meter output picture ' + 'progress time wbr video ruby bdi keygen';
|
2937
|
+
}
|
2938
|
+
if (type !== 'html5-strict') {
|
2939
|
+
globalAttributes += ' xml:lang';
|
2940
|
+
const html4PhrasingContent = 'acronym applet basefont big font strike tt';
|
2941
|
+
phrasingContent = [
|
2942
|
+
phrasingContent,
|
2943
|
+
html4PhrasingContent
|
2944
|
+
].join(' ');
|
2945
|
+
const html4BlockContent = 'center dir isindex noframes';
|
2946
|
+
blockContent = [
|
2947
|
+
blockContent,
|
2948
|
+
html4BlockContent
|
2949
|
+
].join(' ');
|
2950
|
+
flowContent = [
|
2951
|
+
blockContent,
|
2952
|
+
phrasingContent
|
2953
|
+
].join(' ');
|
2954
|
+
}
|
2955
|
+
flowContent = flowContent || [
|
2956
|
+
blockContent,
|
2957
|
+
phrasingContent
|
2958
|
+
].join(' ');
|
2959
|
+
return {
|
2960
|
+
globalAttributes,
|
2961
|
+
blockContent,
|
2962
|
+
phrasingContent,
|
2963
|
+
flowContent
|
2964
|
+
};
|
2965
|
+
};
|
2966
|
+
|
2967
|
+
const makeSchema = type => {
|
2968
|
+
const {globalAttributes, phrasingContent, flowContent} = getElementSetsAsStrings(type);
|
2969
|
+
const schema = {};
|
2910
2970
|
const add = (name, attributes = '', children = '') => {
|
2911
2971
|
const childNames = split$1(children);
|
2912
2972
|
const names = split$1(name);
|
@@ -2917,9 +2977,9 @@
|
|
2917
2977
|
attributes
|
2918
2978
|
].join(' '));
|
2919
2979
|
schema[names[ni]] = {
|
2920
|
-
attributes: mapToObject(attributesOrder, (
|
2980
|
+
attributes: mapToObject(attributesOrder, constant({})),
|
2921
2981
|
attributesOrder,
|
2922
|
-
children: mapToObject(childNames, constant(
|
2982
|
+
children: mapToObject(childNames, constant({}))
|
2923
2983
|
};
|
2924
2984
|
}
|
2925
2985
|
};
|
@@ -2935,45 +2995,16 @@
|
|
2935
2995
|
}
|
2936
2996
|
}
|
2937
2997
|
};
|
2938
|
-
if (lookupCache[type]) {
|
2939
|
-
return lookupCache[type];
|
2940
|
-
}
|
2941
|
-
globalAttributes = 'id accesskey class dir lang style tabindex title role';
|
2942
|
-
blockContent = 'address blockquote div dl fieldset form h1 h2 h3 h4 h5 h6 hr menu ol p pre table ul';
|
2943
|
-
phrasingContent = 'a abbr b bdo br button cite code del dfn em embed i iframe img input ins kbd ' + 'label map noscript object q s samp script select small span strong sub sup ' + 'textarea u var #text #comment';
|
2944
|
-
if (type !== 'html4') {
|
2945
|
-
const transparentContent = 'a ins del canvas map';
|
2946
|
-
globalAttributes += ' contenteditable contextmenu draggable dropzone ' + 'hidden spellcheck translate';
|
2947
|
-
blockContent += ' article aside details dialog figure main header footer hgroup section nav ' + transparentContent;
|
2948
|
-
phrasingContent += ' audio canvas command datalist mark meter output picture ' + 'progress time wbr video ruby bdi keygen';
|
2949
|
-
}
|
2950
2998
|
if (type !== 'html5-strict') {
|
2951
|
-
globalAttributes += ' xml:lang';
|
2952
2999
|
const html4PhrasingContent = 'acronym applet basefont big font strike tt';
|
2953
|
-
|
2954
|
-
phrasingContent,
|
2955
|
-
html4PhrasingContent
|
2956
|
-
].join(' ');
|
2957
|
-
each$b(split$1(html4PhrasingContent), name => {
|
3000
|
+
each$e(split$1(html4PhrasingContent), name => {
|
2958
3001
|
add(name, '', phrasingContent);
|
2959
3002
|
});
|
2960
3003
|
const html4BlockContent = 'center dir isindex noframes';
|
2961
|
-
|
2962
|
-
blockContent,
|
2963
|
-
html4BlockContent
|
2964
|
-
].join(' ');
|
2965
|
-
flowContent = [
|
2966
|
-
blockContent,
|
2967
|
-
phrasingContent
|
2968
|
-
].join(' ');
|
2969
|
-
each$b(split$1(html4BlockContent), name => {
|
3004
|
+
each$e(split$1(html4BlockContent), name => {
|
2970
3005
|
add(name, '', flowContent);
|
2971
3006
|
});
|
2972
3007
|
}
|
2973
|
-
flowContent = flowContent || [
|
2974
|
-
blockContent,
|
2975
|
-
phrasingContent
|
2976
|
-
].join(' ');
|
2977
3008
|
add('html', 'manifest', 'head body');
|
2978
3009
|
add('head', '', 'base command link meta noscript script style title');
|
2979
3010
|
add('title hr noscript br');
|
@@ -3125,16 +3156,155 @@
|
|
3125
3156
|
delete item.children.video;
|
3126
3157
|
});
|
3127
3158
|
}
|
3128
|
-
each$
|
3159
|
+
each$e(split$1('a form meter progress dfn'), name => {
|
3129
3160
|
if (schema[name]) {
|
3130
3161
|
delete schema[name].children[name];
|
3131
3162
|
}
|
3132
3163
|
});
|
3133
3164
|
delete schema.caption.children.table;
|
3134
3165
|
delete schema.script;
|
3135
|
-
lookupCache[type] = schema;
|
3136
3166
|
return schema;
|
3137
3167
|
};
|
3168
|
+
|
3169
|
+
const prefixToOperation = prefix => prefix === '-' ? 'remove' : 'add';
|
3170
|
+
const parseValidChildrenRules = value => {
|
3171
|
+
const childRuleRegExp = /^([+\-]?)([A-Za-z0-9_\-.\u00b7\u00c0-\u00d6\u00d8-\u00f6\u00f8-\u037d\u037f-\u1fff\u200c-\u200d\u203f-\u2040\u2070-\u218f\u2c00-\u2fef\u3001-\ud7ff\uf900-\ufdcf\ufdf0-\ufffd]+)\[([^\]]+)]$/;
|
3172
|
+
return bind$3(split$1(value, ','), rule => {
|
3173
|
+
const matches = childRuleRegExp.exec(rule);
|
3174
|
+
if (matches) {
|
3175
|
+
const prefix = matches[1];
|
3176
|
+
const operation = prefix ? prefixToOperation(prefix) : 'replace';
|
3177
|
+
const name = matches[2];
|
3178
|
+
const validChildren = split$1(matches[3], '|');
|
3179
|
+
return [{
|
3180
|
+
operation,
|
3181
|
+
name,
|
3182
|
+
validChildren
|
3183
|
+
}];
|
3184
|
+
} else {
|
3185
|
+
return [];
|
3186
|
+
}
|
3187
|
+
});
|
3188
|
+
};
|
3189
|
+
|
3190
|
+
const parseValidElementsAttrDataIntoElement = (attrData, targetElement) => {
|
3191
|
+
const attrRuleRegExp = /^([!\-])?(\w+[\\:]:\w+|[^=~<]+)?(?:([=~<])(.*))?$/;
|
3192
|
+
const hasPatternsRegExp = /[*?+]/;
|
3193
|
+
const {attributes, attributesOrder} = targetElement;
|
3194
|
+
return each$e(split$1(attrData, '|'), rule => {
|
3195
|
+
const matches = attrRuleRegExp.exec(rule);
|
3196
|
+
if (matches) {
|
3197
|
+
const attr = {};
|
3198
|
+
const attrType = matches[1];
|
3199
|
+
const attrName = matches[2].replace(/[\\:]:/g, ':');
|
3200
|
+
const attrPrefix = matches[3];
|
3201
|
+
const value = matches[4];
|
3202
|
+
if (attrType === '!') {
|
3203
|
+
targetElement.attributesRequired = targetElement.attributesRequired || [];
|
3204
|
+
targetElement.attributesRequired.push(attrName);
|
3205
|
+
attr.required = true;
|
3206
|
+
}
|
3207
|
+
if (attrType === '-') {
|
3208
|
+
delete attributes[attrName];
|
3209
|
+
attributesOrder.splice(Tools.inArray(attributesOrder, attrName), 1);
|
3210
|
+
return;
|
3211
|
+
}
|
3212
|
+
if (attrPrefix) {
|
3213
|
+
if (attrPrefix === '=') {
|
3214
|
+
targetElement.attributesDefault = targetElement.attributesDefault || [];
|
3215
|
+
targetElement.attributesDefault.push({
|
3216
|
+
name: attrName,
|
3217
|
+
value
|
3218
|
+
});
|
3219
|
+
attr.defaultValue = value;
|
3220
|
+
} else if (attrPrefix === '~') {
|
3221
|
+
targetElement.attributesForced = targetElement.attributesForced || [];
|
3222
|
+
targetElement.attributesForced.push({
|
3223
|
+
name: attrName,
|
3224
|
+
value
|
3225
|
+
});
|
3226
|
+
attr.forcedValue = value;
|
3227
|
+
} else if (attrPrefix === '<') {
|
3228
|
+
attr.validValues = Tools.makeMap(value, '?');
|
3229
|
+
}
|
3230
|
+
}
|
3231
|
+
if (hasPatternsRegExp.test(attrName)) {
|
3232
|
+
const attrPattern = attr;
|
3233
|
+
targetElement.attributePatterns = targetElement.attributePatterns || [];
|
3234
|
+
attrPattern.pattern = patternToRegExp(attrName);
|
3235
|
+
targetElement.attributePatterns.push(attrPattern);
|
3236
|
+
} else {
|
3237
|
+
if (!attributes[attrName]) {
|
3238
|
+
attributesOrder.push(attrName);
|
3239
|
+
}
|
3240
|
+
attributes[attrName] = attr;
|
3241
|
+
}
|
3242
|
+
}
|
3243
|
+
});
|
3244
|
+
};
|
3245
|
+
const cloneAttributesInto = (from, to) => {
|
3246
|
+
each$d(from.attributes, (value, key) => {
|
3247
|
+
to.attributes[key] = value;
|
3248
|
+
});
|
3249
|
+
to.attributesOrder.push(...from.attributesOrder);
|
3250
|
+
};
|
3251
|
+
const parseValidElementsRules = (globalElement, validElements) => {
|
3252
|
+
const elementRuleRegExp = /^([#+\-])?([^\[!\/]+)(?:\/([^\[!]+))?(?:(!?)\[([^\]]+)])?$/;
|
3253
|
+
return bind$3(split$1(validElements, ','), rule => {
|
3254
|
+
const matches = elementRuleRegExp.exec(rule);
|
3255
|
+
if (matches) {
|
3256
|
+
const prefix = matches[1];
|
3257
|
+
const elementName = matches[2];
|
3258
|
+
const outputName = matches[3];
|
3259
|
+
const attrsPrefix = matches[4];
|
3260
|
+
const attrData = matches[5];
|
3261
|
+
const element = {
|
3262
|
+
attributes: {},
|
3263
|
+
attributesOrder: []
|
3264
|
+
};
|
3265
|
+
globalElement.each(el => cloneAttributesInto(el, element));
|
3266
|
+
if (prefix === '#') {
|
3267
|
+
element.paddEmpty = true;
|
3268
|
+
} else if (prefix === '-') {
|
3269
|
+
element.removeEmpty = true;
|
3270
|
+
}
|
3271
|
+
if (attrsPrefix === '!') {
|
3272
|
+
element.removeEmptyAttrs = true;
|
3273
|
+
}
|
3274
|
+
if (attrData) {
|
3275
|
+
parseValidElementsAttrDataIntoElement(attrData, element);
|
3276
|
+
}
|
3277
|
+
if (outputName) {
|
3278
|
+
element.outputName = elementName;
|
3279
|
+
}
|
3280
|
+
if (elementName === '@') {
|
3281
|
+
if (globalElement.isNone()) {
|
3282
|
+
globalElement = Optional.some(element);
|
3283
|
+
} else {
|
3284
|
+
return [];
|
3285
|
+
}
|
3286
|
+
}
|
3287
|
+
return [outputName ? {
|
3288
|
+
name: elementName,
|
3289
|
+
element,
|
3290
|
+
aliasName: outputName
|
3291
|
+
} : {
|
3292
|
+
name: elementName,
|
3293
|
+
element
|
3294
|
+
}];
|
3295
|
+
} else {
|
3296
|
+
return [];
|
3297
|
+
}
|
3298
|
+
});
|
3299
|
+
};
|
3300
|
+
|
3301
|
+
const mapCache = {};
|
3302
|
+
const makeMap$2 = Tools.makeMap, each$b = Tools.each, extend$2 = Tools.extend, explode$2 = Tools.explode;
|
3303
|
+
const createMap = (defaultValue, extendWith = {}) => {
|
3304
|
+
const value = makeMap$2(defaultValue, ' ', makeMap$2(defaultValue.toUpperCase(), ' '));
|
3305
|
+
return extend$2(value, extendWith);
|
3306
|
+
};
|
3307
|
+
const getTextRootBlockElements = schema => createMap('td th li dt dd figcaption caption details summary', schema.getTextBlockElements());
|
3138
3308
|
const compileElementMap = (value, mode) => {
|
3139
3309
|
if (value) {
|
3140
3310
|
const styles = {};
|
@@ -3170,7 +3340,7 @@
|
|
3170
3340
|
}
|
3171
3341
|
};
|
3172
3342
|
const schemaType = (_a = settings.schema) !== null && _a !== void 0 ? _a : 'html5';
|
3173
|
-
const schemaItems =
|
3343
|
+
const schemaItems = makeSchema(schemaType);
|
3174
3344
|
if (settings.verify_html === false) {
|
3175
3345
|
settings.valid_elements = '*[*]';
|
3176
3346
|
}
|
@@ -3191,122 +3361,21 @@
|
|
3191
3361
|
each$b('script noscript iframe noframes noembed title style textarea xmp plaintext'.split(' '), name => {
|
3192
3362
|
specialElements[name] = new RegExp('</' + name + '[^>]*>', 'gi');
|
3193
3363
|
});
|
3194
|
-
const patternToRegExp = str => new RegExp('^' + str.replace(/([?+*])/g, '.$1') + '$');
|
3195
3364
|
const addValidElements = validElements => {
|
3196
|
-
const
|
3197
|
-
const attrRuleRegExp = /^([!\-])?(\w+[\\:]:\w+|[^=~<]+)?(?:([=~<])(.*))?$/;
|
3365
|
+
const globalElement = Optional.from(elements['@']);
|
3198
3366
|
const hasPatternsRegExp = /[*?+]/;
|
3199
|
-
|
3200
|
-
|
3201
|
-
|
3202
|
-
|
3203
|
-
if (
|
3204
|
-
|
3205
|
-
|
3206
|
-
|
3207
|
-
|
3208
|
-
|
3209
|
-
if (matches) {
|
3210
|
-
const prefix = matches[1];
|
3211
|
-
const elementName = matches[2];
|
3212
|
-
const outputName = matches[3];
|
3213
|
-
const attrData = matches[5];
|
3214
|
-
const attributes = {};
|
3215
|
-
const attributesOrder = [];
|
3216
|
-
const element = {
|
3217
|
-
attributes,
|
3218
|
-
attributesOrder
|
3219
|
-
};
|
3220
|
-
if (prefix === '#') {
|
3221
|
-
element.paddEmpty = true;
|
3222
|
-
}
|
3223
|
-
if (prefix === '-') {
|
3224
|
-
element.removeEmpty = true;
|
3225
|
-
}
|
3226
|
-
if (matches[4] === '!') {
|
3227
|
-
element.removeEmptyAttrs = true;
|
3228
|
-
}
|
3229
|
-
if (globalAttributes) {
|
3230
|
-
each$d(globalAttributes, (value, key) => {
|
3231
|
-
attributes[key] = value;
|
3232
|
-
});
|
3233
|
-
if (globalAttributesOrder) {
|
3234
|
-
attributesOrder.push(...globalAttributesOrder);
|
3235
|
-
}
|
3236
|
-
}
|
3237
|
-
if (attrData) {
|
3238
|
-
const attrDatas = split$1(attrData, '|');
|
3239
|
-
for (let ai = 0, al = attrDatas.length; ai < al; ai++) {
|
3240
|
-
matches = attrRuleRegExp.exec(attrDatas[ai]);
|
3241
|
-
if (matches) {
|
3242
|
-
const attr = {};
|
3243
|
-
const attrType = matches[1];
|
3244
|
-
const attrName = matches[2].replace(/[\\:]:/g, ':');
|
3245
|
-
const attrPrefix = matches[3];
|
3246
|
-
const value = matches[4];
|
3247
|
-
if (attrType === '!') {
|
3248
|
-
element.attributesRequired = element.attributesRequired || [];
|
3249
|
-
element.attributesRequired.push(attrName);
|
3250
|
-
attr.required = true;
|
3251
|
-
}
|
3252
|
-
if (attrType === '-') {
|
3253
|
-
delete attributes[attrName];
|
3254
|
-
attributesOrder.splice(inArray(attributesOrder, attrName), 1);
|
3255
|
-
continue;
|
3256
|
-
}
|
3257
|
-
if (attrPrefix) {
|
3258
|
-
if (attrPrefix === '=') {
|
3259
|
-
element.attributesDefault = element.attributesDefault || [];
|
3260
|
-
element.attributesDefault.push({
|
3261
|
-
name: attrName,
|
3262
|
-
value
|
3263
|
-
});
|
3264
|
-
attr.defaultValue = value;
|
3265
|
-
}
|
3266
|
-
if (attrPrefix === '~') {
|
3267
|
-
element.attributesForced = element.attributesForced || [];
|
3268
|
-
element.attributesForced.push({
|
3269
|
-
name: attrName,
|
3270
|
-
value
|
3271
|
-
});
|
3272
|
-
attr.forcedValue = value;
|
3273
|
-
}
|
3274
|
-
if (attrPrefix === '<') {
|
3275
|
-
attr.validValues = makeMap$2(value, '?');
|
3276
|
-
}
|
3277
|
-
}
|
3278
|
-
if (hasPatternsRegExp.test(attrName)) {
|
3279
|
-
const attrPattern = attr;
|
3280
|
-
element.attributePatterns = element.attributePatterns || [];
|
3281
|
-
attrPattern.pattern = patternToRegExp(attrName);
|
3282
|
-
element.attributePatterns.push(attrPattern);
|
3283
|
-
} else {
|
3284
|
-
if (!attributes[attrName]) {
|
3285
|
-
attributesOrder.push(attrName);
|
3286
|
-
}
|
3287
|
-
attributes[attrName] = attr;
|
3288
|
-
}
|
3289
|
-
}
|
3290
|
-
}
|
3291
|
-
}
|
3292
|
-
if (!globalAttributes && elementName === '@') {
|
3293
|
-
globalAttributes = attributes;
|
3294
|
-
globalAttributesOrder = attributesOrder;
|
3295
|
-
}
|
3296
|
-
if (outputName) {
|
3297
|
-
element.outputName = elementName;
|
3298
|
-
elements[outputName] = element;
|
3299
|
-
}
|
3300
|
-
if (hasPatternsRegExp.test(elementName)) {
|
3301
|
-
const patternElement = element;
|
3302
|
-
patternElement.pattern = patternToRegExp(elementName);
|
3303
|
-
patternElements.push(patternElement);
|
3304
|
-
} else {
|
3305
|
-
elements[elementName] = element;
|
3306
|
-
}
|
3307
|
-
}
|
3367
|
+
each$e(parseValidElementsRules(globalElement, validElements !== null && validElements !== void 0 ? validElements : ''), ({name, element, aliasName}) => {
|
3368
|
+
if (aliasName) {
|
3369
|
+
elements[aliasName] = element;
|
3370
|
+
}
|
3371
|
+
if (hasPatternsRegExp.test(name)) {
|
3372
|
+
const patternElement = element;
|
3373
|
+
patternElement.pattern = patternToRegExp(name);
|
3374
|
+
patternElements.push(patternElement);
|
3375
|
+
} else {
|
3376
|
+
elements[name] = element;
|
3308
3377
|
}
|
3309
|
-
}
|
3378
|
+
});
|
3310
3379
|
};
|
3311
3380
|
const setValidElements = validElements => {
|
3312
3381
|
patternElements = [];
|
@@ -3314,71 +3383,46 @@
|
|
3314
3383
|
delete elements[name];
|
3315
3384
|
});
|
3316
3385
|
addValidElements(validElements);
|
3317
|
-
each$b(schemaItems, (element, name) => {
|
3318
|
-
children[name] = element.children;
|
3319
|
-
});
|
3320
3386
|
};
|
3321
3387
|
const addCustomElements = customElements => {
|
3322
|
-
|
3323
|
-
|
3324
|
-
|
3325
|
-
|
3326
|
-
|
3327
|
-
|
3328
|
-
|
3329
|
-
|
3330
|
-
|
3331
|
-
|
3332
|
-
|
3333
|
-
|
3334
|
-
|
3335
|
-
|
3336
|
-
|
3337
|
-
|
3338
|
-
|
3339
|
-
|
3340
|
-
|
3341
|
-
|
3342
|
-
|
3343
|
-
|
3344
|
-
delete customRule.removeEmpty;
|
3345
|
-
elements[name] = customRule;
|
3346
|
-
}
|
3347
|
-
each$b(children, (element, elmName) => {
|
3348
|
-
if (element[cloneName]) {
|
3349
|
-
children[elmName] = element = extend$2({}, children[elmName]);
|
3350
|
-
element[name] = element[cloneName];
|
3351
|
-
}
|
3352
|
-
});
|
3388
|
+
delete mapCache.text_block_elements;
|
3389
|
+
delete mapCache.block_elements;
|
3390
|
+
each$e(parseCustomElementsRules(customElements !== null && customElements !== void 0 ? customElements : ''), ({inline, name, cloneName}) => {
|
3391
|
+
children[name] = children[cloneName];
|
3392
|
+
customElementsMap[name] = cloneName;
|
3393
|
+
nonEmptyElementsMap[name.toUpperCase()] = {};
|
3394
|
+
nonEmptyElementsMap[name] = {};
|
3395
|
+
if (!inline) {
|
3396
|
+
blockElementsMap[name.toUpperCase()] = {};
|
3397
|
+
blockElementsMap[name] = {};
|
3398
|
+
}
|
3399
|
+
if (!elements[name]) {
|
3400
|
+
let customRule = elements[cloneName];
|
3401
|
+
customRule = extend$2({}, customRule);
|
3402
|
+
delete customRule.removeEmptyAttrs;
|
3403
|
+
delete customRule.removeEmpty;
|
3404
|
+
elements[name] = customRule;
|
3405
|
+
}
|
3406
|
+
each$d(children, (element, elmName) => {
|
3407
|
+
if (element[cloneName]) {
|
3408
|
+
children[elmName] = element = extend$2({}, children[elmName]);
|
3409
|
+
element[name] = element[cloneName];
|
3353
3410
|
}
|
3354
3411
|
});
|
3355
|
-
}
|
3412
|
+
});
|
3356
3413
|
};
|
3357
3414
|
const addValidChildren = validChildren => {
|
3358
|
-
|
3359
|
-
|
3360
|
-
|
3361
|
-
|
3362
|
-
|
3363
|
-
|
3364
|
-
|
3365
|
-
let parent;
|
3366
|
-
if (prefix) {
|
3367
|
-
parent = children[matches[2]];
|
3368
|
-
} else {
|
3369
|
-
parent = children[matches[2]] = { '#comment': {} };
|
3370
|
-
}
|
3371
|
-
parent = children[matches[2]];
|
3372
|
-
each$b(split$1(matches[3], '|'), child => {
|
3373
|
-
if (prefix === '-') {
|
3374
|
-
delete parent[child];
|
3375
|
-
} else {
|
3376
|
-
parent[child] = {};
|
3377
|
-
}
|
3378
|
-
});
|
3415
|
+
each$e(parseValidChildrenRules(validChildren !== null && validChildren !== void 0 ? validChildren : ''), ({operation, name, validChildren}) => {
|
3416
|
+
const parent = operation === 'replace' ? { '#comment': {} } : children[name];
|
3417
|
+
each$e(validChildren, child => {
|
3418
|
+
if (operation === 'remove') {
|
3419
|
+
delete parent[child];
|
3420
|
+
} else {
|
3421
|
+
parent[child] = {};
|
3379
3422
|
}
|
3380
3423
|
});
|
3381
|
-
|
3424
|
+
children[name] = parent;
|
3425
|
+
});
|
3382
3426
|
};
|
3383
3427
|
const getElementRule = name => {
|
3384
3428
|
const element = elements[name];
|
@@ -3429,6 +3473,9 @@
|
|
3429
3473
|
});
|
3430
3474
|
} else {
|
3431
3475
|
setValidElements(settings.valid_elements);
|
3476
|
+
each$b(schemaItems, (element, name) => {
|
3477
|
+
children[name] = element.children;
|
3478
|
+
});
|
3432
3479
|
}
|
3433
3480
|
addCustomElements(settings.custom_elements);
|
3434
3481
|
addValidChildren(settings.valid_children);
|
@@ -3598,7 +3645,7 @@
|
|
3598
3645
|
if (!value) {
|
3599
3646
|
return;
|
3600
3647
|
}
|
3601
|
-
const values = value.split(' ');
|
3648
|
+
const values = value.indexOf(',') > -1 ? [value] : value.split(' ');
|
3602
3649
|
let i = values.length;
|
3603
3650
|
while (i--) {
|
3604
3651
|
if (values[i] !== values[0]) {
|
@@ -5023,6 +5070,10 @@
|
|
5023
5070
|
};
|
5024
5071
|
};
|
5025
5072
|
|
5073
|
+
const isDuplicated = (items, item) => {
|
5074
|
+
const firstIndex = items.indexOf(item);
|
5075
|
+
return firstIndex !== -1 && items.indexOf(item, firstIndex + 1) > firstIndex;
|
5076
|
+
};
|
5026
5077
|
const isRaw = str => isObject(str) && has$2(str, 'raw');
|
5027
5078
|
const isTokenised = str => isArray$1(str) && str.length > 1;
|
5028
5079
|
const data = {};
|
@@ -5040,8 +5091,17 @@
|
|
5040
5091
|
if (!langData) {
|
5041
5092
|
data[code] = langData = {};
|
5042
5093
|
}
|
5094
|
+
const lcNames = map$3(keys(items), name => name.toLowerCase());
|
5043
5095
|
each$d(items, (translation, name) => {
|
5044
|
-
|
5096
|
+
const lcName = name.toLowerCase();
|
5097
|
+
if (lcName !== name && isDuplicated(lcNames, lcName)) {
|
5098
|
+
if (!has$2(items, lcName)) {
|
5099
|
+
langData[lcName] = translation;
|
5100
|
+
}
|
5101
|
+
langData[name] = translation;
|
5102
|
+
} else {
|
5103
|
+
langData[lcName] = translation;
|
5104
|
+
}
|
5045
5105
|
});
|
5046
5106
|
};
|
5047
5107
|
const translate = text => {
|
@@ -5054,8 +5114,8 @@
|
|
5054
5114
|
};
|
5055
5115
|
const isEmpty = text => text === '' || text === null || text === undefined;
|
5056
5116
|
const getLangData = text => {
|
5057
|
-
const
|
5058
|
-
return get$a(langData,
|
5117
|
+
const textStr = toString(text);
|
5118
|
+
return has$2(langData, textStr) ? toString(langData[textStr]) : get$a(langData, textStr.toLowerCase()).map(toString).getOr(textStr);
|
5059
5119
|
};
|
5060
5120
|
const removeContext = str => str.replace(/{context:\w+}$/, '');
|
5061
5121
|
if (isEmpty(text)) {
|
@@ -10278,7 +10338,7 @@
|
|
10278
10338
|
return;
|
10279
10339
|
}
|
10280
10340
|
const scrollTop = get$5(doc).top;
|
10281
|
-
f(doc, scrollTop, marker, alignToTop);
|
10341
|
+
f(editor, doc, scrollTop, marker, alignToTop);
|
10282
10342
|
fireAfterScrollIntoViewEvent(editor, data);
|
10283
10343
|
};
|
10284
10344
|
const applyWithMarker = (editor, f, rng, alignToTop) => {
|
@@ -10304,28 +10364,36 @@
|
|
10304
10364
|
newRng.setEnd(endElement, endOffset);
|
10305
10365
|
editor.selection.setRng(rng);
|
10306
10366
|
};
|
10307
|
-
const scrollToMarker = (marker, alignToTop) =>
|
10308
|
-
|
10367
|
+
const scrollToMarker = (editor, marker, viewHeight, alignToTop, doc) => {
|
10368
|
+
const pos = marker.pos;
|
10369
|
+
if (alignToTop) {
|
10370
|
+
to(pos.left, pos.top, doc);
|
10371
|
+
} else {
|
10372
|
+
const y = pos.top - viewHeight + marker.height;
|
10373
|
+
to(-editor.getBody().getBoundingClientRect().left, y, doc);
|
10374
|
+
}
|
10375
|
+
};
|
10376
|
+
const intoWindowIfNeeded = (editor, doc, scrollTop, viewHeight, marker, alignToTop) => {
|
10309
10377
|
const viewportBottom = viewHeight + scrollTop;
|
10310
10378
|
const markerTop = marker.pos.top;
|
10311
10379
|
const markerBottom = marker.bottom;
|
10312
10380
|
const largerThanViewport = markerBottom - markerTop >= viewHeight;
|
10313
10381
|
if (markerTop < scrollTop) {
|
10314
|
-
scrollToMarker(marker, alignToTop !== false);
|
10382
|
+
scrollToMarker(editor, marker, viewHeight, alignToTop !== false, doc);
|
10315
10383
|
} else if (markerTop > viewportBottom) {
|
10316
10384
|
const align = largerThanViewport ? alignToTop !== false : alignToTop === true;
|
10317
|
-
scrollToMarker(marker, align);
|
10385
|
+
scrollToMarker(editor, marker, viewHeight, align, doc);
|
10318
10386
|
} else if (markerBottom > viewportBottom && !largerThanViewport) {
|
10319
|
-
scrollToMarker(marker, alignToTop === true);
|
10387
|
+
scrollToMarker(editor, marker, viewHeight, alignToTop === true, doc);
|
10320
10388
|
}
|
10321
10389
|
};
|
10322
|
-
const intoWindow = (doc, scrollTop, marker, alignToTop) => {
|
10390
|
+
const intoWindow = (editor, doc, scrollTop, marker, alignToTop) => {
|
10323
10391
|
const viewHeight = defaultView(doc).dom.innerHeight;
|
10324
|
-
intoWindowIfNeeded(scrollTop, viewHeight, marker, alignToTop);
|
10392
|
+
intoWindowIfNeeded(editor, doc, scrollTop, viewHeight, marker, alignToTop);
|
10325
10393
|
};
|
10326
|
-
const intoFrame = (doc, scrollTop, marker, alignToTop) => {
|
10394
|
+
const intoFrame = (editor, doc, scrollTop, marker, alignToTop) => {
|
10327
10395
|
const frameViewHeight = defaultView(doc).dom.innerHeight;
|
10328
|
-
intoWindowIfNeeded(scrollTop, frameViewHeight, marker, alignToTop);
|
10396
|
+
intoWindowIfNeeded(editor, doc, scrollTop, frameViewHeight, marker, alignToTop);
|
10329
10397
|
const op = find(marker.element);
|
10330
10398
|
const viewportBounds = getBounds(window);
|
10331
10399
|
if (op.top < viewportBounds.y) {
|
@@ -12183,7 +12251,7 @@
|
|
12183
12251
|
const rootElm = SugarElement.fromDom(editor.getBody());
|
12184
12252
|
return getParentCaption(rootElm, startElm).fold(() => deleteCaretCells(editor, forward, rootElm, startElm).orThunk(() => someIf(isBeforeOrAfterTable(editor, forward), noop)), fromCaption => deleteCaretCaption(editor, forward, rootElm, fromCaption));
|
12185
12253
|
};
|
12186
|
-
const backspaceDelete$
|
12254
|
+
const backspaceDelete$a = (editor, forward) => {
|
12187
12255
|
const startElm = SugarElement.fromDom(editor.selection.getStart(true));
|
12188
12256
|
const cells = getCellsFromEditor(editor);
|
12189
12257
|
return editor.selection.isCollapsed() && cells.length === 0 ? deleteCaret$3(editor, forward, startElm) : deleteRange$3(editor, startElm, cells);
|
@@ -12396,7 +12464,7 @@
|
|
12396
12464
|
const textBlockElements = schema.getTextBlockElements();
|
12397
12465
|
const nonEmptyElements = schema.getNonEmptyElements();
|
12398
12466
|
const whitespaceElements = schema.getWhitespaceElements();
|
12399
|
-
const nonSplittableElements = Tools.makeMap('tr,td,th,tbody,thead,tfoot,table');
|
12467
|
+
const nonSplittableElements = Tools.makeMap('tr,td,th,tbody,thead,tfoot,table,summary');
|
12400
12468
|
const fixed = new Set();
|
12401
12469
|
const isSplittableElement = node => node !== rootNode && !nonSplittableElements[node.name];
|
12402
12470
|
for (let ni = 0; ni < nodes.length; ni++) {
|
@@ -12635,7 +12703,7 @@
|
|
12635
12703
|
}
|
12636
12704
|
return findLastOf(elms[elms.length - 1], rootNode);
|
12637
12705
|
};
|
12638
|
-
const insertBefore$
|
12706
|
+
const insertBefore$2 = (target, elms, rootNode) => {
|
12639
12707
|
const parentElm = target.parentNode;
|
12640
12708
|
if (parentElm) {
|
12641
12709
|
Tools.each(elms, elm => {
|
@@ -12644,7 +12712,7 @@
|
|
12644
12712
|
}
|
12645
12713
|
return findFirstIn(target, rootNode);
|
12646
12714
|
};
|
12647
|
-
const insertAfter$
|
12715
|
+
const insertAfter$2 = (target, elms, rootNode, dom) => {
|
12648
12716
|
dom.insertAfter(elms.reverse(), target);
|
12649
12717
|
return findLastOf(elms[0], rootNode);
|
12650
12718
|
};
|
@@ -12664,9 +12732,9 @@
|
|
12664
12732
|
if (!liTarget) {
|
12665
12733
|
return null;
|
12666
12734
|
} else if (isAt(BEGINNING)) {
|
12667
|
-
return insertBefore$
|
12735
|
+
return insertBefore$2(liTarget, liElms, rootNode);
|
12668
12736
|
} else if (isAt(END)) {
|
12669
|
-
return insertAfter$
|
12737
|
+
return insertAfter$2(liTarget, liElms, rootNode, dom);
|
12670
12738
|
} else {
|
12671
12739
|
return insertMiddle(liTarget, liElms, rootNode, rng);
|
12672
12740
|
}
|
@@ -12794,14 +12862,15 @@
|
|
12794
12862
|
const parentBlock = dom.getParent(marker, dom.isBlock);
|
12795
12863
|
dom.remove(marker);
|
12796
12864
|
if (parentBlock && dom.isEmpty(parentBlock)) {
|
12865
|
+
const isCell = isTableCell(parentBlock);
|
12797
12866
|
empty(SugarElement.fromDom(parentBlock));
|
12798
12867
|
rng.setStart(parentBlock, 0);
|
12799
12868
|
rng.setEnd(parentBlock, 0);
|
12800
|
-
if (!
|
12869
|
+
if (!isCell && !isPartOfFragment(parentBlock) && (nextRng = findNextCaretRng(rng))) {
|
12801
12870
|
rng = nextRng;
|
12802
12871
|
dom.remove(parentBlock);
|
12803
12872
|
} else {
|
12804
|
-
dom.add(parentBlock, dom.create('br', { 'data-mce-bogus': '1' }));
|
12873
|
+
dom.add(parentBlock, dom.create('br', isCell ? {} : { 'data-mce-bogus': '1' }));
|
12805
12874
|
}
|
12806
12875
|
}
|
12807
12876
|
selection.setRng(rng);
|
@@ -12827,18 +12896,6 @@
|
|
12827
12896
|
}
|
12828
12897
|
return Optional.none();
|
12829
12898
|
};
|
12830
|
-
const preventSplittingSummary = editor => {
|
12831
|
-
each$e(from(editor.getBody().querySelectorAll('details')), accordion => {
|
12832
|
-
const summaries = filter$5(from(accordion.children), node => node.nodeName === 'SUMMARY');
|
12833
|
-
if (summaries.length > 1) {
|
12834
|
-
each$e(summaries.slice(1), summary => {
|
12835
|
-
const element = SugarElement.fromDom(summary);
|
12836
|
-
remove$7(element, 'mce-accordion-summary');
|
12837
|
-
mutate(element, 'p');
|
12838
|
-
});
|
12839
|
-
}
|
12840
|
-
});
|
12841
|
-
};
|
12842
12899
|
const insertHtmlAtCaret = (editor, value, details) => {
|
12843
12900
|
var _a, _b;
|
12844
12901
|
const selection = editor.selection;
|
@@ -12935,7 +12992,6 @@
|
|
12935
12992
|
moveSelectionToMarker(editor, dom.get('mce_marker'));
|
12936
12993
|
unmarkFragmentElements(editor.getBody());
|
12937
12994
|
trimBrsFromTableCell(dom, selection.getStart());
|
12938
|
-
preventSplittingSummary(editor);
|
12939
12995
|
updateCaret(editor.schema, editor.getBody(), selection.getStart());
|
12940
12996
|
return value;
|
12941
12997
|
};
|
@@ -20958,7 +21014,7 @@
|
|
20958
21014
|
};
|
20959
21015
|
const mergeBlocks = (rootNode, forward, block1, block2) => forward ? mergeBlockInto(rootNode, block2, block1) : mergeBlockInto(rootNode, block1, block2);
|
20960
21016
|
|
20961
|
-
const backspaceDelete$
|
21017
|
+
const backspaceDelete$9 = (editor, forward) => {
|
20962
21018
|
const rootNode = SugarElement.fromDom(editor.getBody());
|
20963
21019
|
const position = read$1(rootNode.dom, forward, editor.selection.getRng()).map(blockBoundary => () => {
|
20964
21020
|
mergeBlocks(rootNode, forward, blockBoundary.from.block, blockBoundary.to.block).each(pos => {
|
@@ -21005,7 +21061,7 @@
|
|
21005
21061
|
const rng = editor.selection.getRng();
|
21006
21062
|
return isEverythingSelected(rootNode, rng) ? emptyEditor(editor) : deleteRangeMergeBlocks(rootNode, editor.selection);
|
21007
21063
|
};
|
21008
|
-
const backspaceDelete$
|
21064
|
+
const backspaceDelete$8 = (editor, _forward) => editor.selection.isCollapsed() ? Optional.none() : deleteRange$2(editor);
|
21009
21065
|
|
21010
21066
|
const showCaret = (direction, editor, node, before, scrollIntoView) => Optional.from(editor._selectionOverrides.showCaret(direction, node, before, scrollIntoView));
|
21011
21067
|
const getNodeRange = node => {
|
@@ -21088,7 +21144,7 @@
|
|
21088
21144
|
}
|
21089
21145
|
return Optional.none();
|
21090
21146
|
};
|
21091
|
-
const backspaceDelete$
|
21147
|
+
const backspaceDelete$7 = (editor, forward) => deleteBoundaryText(editor, forward);
|
21092
21148
|
|
21093
21149
|
const getEdgeCefPosition = (editor, atStart) => {
|
21094
21150
|
const root = editor.getBody();
|
@@ -21227,7 +21283,7 @@
|
|
21227
21283
|
}
|
21228
21284
|
return true;
|
21229
21285
|
};
|
21230
|
-
const backspaceDelete$
|
21286
|
+
const backspaceDelete$6 = (editor, forward) => {
|
21231
21287
|
if (editor.selection.isCollapsed()) {
|
21232
21288
|
return backspaceDeleteCaret(editor, forward);
|
21233
21289
|
} else {
|
@@ -21239,7 +21295,7 @@
|
|
21239
21295
|
const fromPos = CaretPosition.fromRangeStart(editor.selection.getRng());
|
21240
21296
|
return fromPosition(forward, editor.getBody(), fromPos).filter(pos => forward ? isBeforeImageBlock(pos) : isAfterImageBlock(pos)).bind(pos => getChildNodeAtRelativeOffset(forward ? 0 : -1, pos)).map(elm => () => editor.selection.select(elm));
|
21241
21297
|
};
|
21242
|
-
const backspaceDelete$
|
21298
|
+
const backspaceDelete$5 = (editor, forward) => editor.selection.isCollapsed() ? deleteCaret$2(editor, forward) : Optional.none();
|
21243
21299
|
|
21244
21300
|
const isText$2 = isText$a;
|
21245
21301
|
const startsWithCaretContainer = node => isText$2(node) && node.data[0] === ZWSP$1;
|
@@ -21249,7 +21305,7 @@
|
|
21249
21305
|
const doc = (_a = node.ownerDocument) !== null && _a !== void 0 ? _a : document;
|
21250
21306
|
return doc.createTextNode(ZWSP$1);
|
21251
21307
|
};
|
21252
|
-
const insertBefore = node => {
|
21308
|
+
const insertBefore$1 = node => {
|
21253
21309
|
var _a;
|
21254
21310
|
if (isText$2(node.previousSibling)) {
|
21255
21311
|
if (endsWithCaretContainer(node.previousSibling)) {
|
@@ -21271,7 +21327,7 @@
|
|
21271
21327
|
return newNode;
|
21272
21328
|
}
|
21273
21329
|
};
|
21274
|
-
const insertAfter = node => {
|
21330
|
+
const insertAfter$1 = node => {
|
21275
21331
|
var _a, _b;
|
21276
21332
|
if (isText$2(node.nextSibling)) {
|
21277
21333
|
if (startsWithCaretContainer(node.nextSibling)) {
|
@@ -21297,7 +21353,7 @@
|
|
21297
21353
|
return newNode;
|
21298
21354
|
}
|
21299
21355
|
};
|
21300
|
-
const insertInline = (before, node) => before ? insertBefore(node) : insertAfter(node);
|
21356
|
+
const insertInline = (before, node) => before ? insertBefore$1(node) : insertAfter$1(node);
|
21301
21357
|
const insertInlineBefore = curry(insertInline, true);
|
21302
21358
|
const insertInlineAfter = curry(insertInline, false);
|
21303
21359
|
|
@@ -21847,7 +21903,7 @@
|
|
21847
21903
|
});
|
21848
21904
|
}
|
21849
21905
|
};
|
21850
|
-
const move$
|
21906
|
+
const move$3 = (editor, caret, forward) => isInlineBoundariesEnabled(editor) ? findLocation(editor, caret, forward).isSome() : false;
|
21851
21907
|
const moveWord = (forward, editor, _caret) => isInlineBoundariesEnabled(editor) ? moveByWord(forward, editor) : false;
|
21852
21908
|
const setupSelectedState = editor => {
|
21853
21909
|
const caret = Cell(null);
|
@@ -21940,7 +21996,7 @@
|
|
21940
21996
|
})));
|
21941
21997
|
});
|
21942
21998
|
};
|
21943
|
-
const backspaceDelete$
|
21999
|
+
const backspaceDelete$4 = (editor, caret, forward) => {
|
21944
22000
|
if (editor.selection.isCollapsed() && isInlineBoundariesEnabled(editor)) {
|
21945
22001
|
const from = CaretPosition.fromRangeStart(editor.selection.getRng());
|
21946
22002
|
return backspaceDeleteCollapsed(editor, caret, forward, from);
|
@@ -22035,7 +22091,7 @@
|
|
22035
22091
|
return Optional.none();
|
22036
22092
|
}
|
22037
22093
|
};
|
22038
|
-
const backspaceDelete$
|
22094
|
+
const backspaceDelete$3 = (editor, forward) => editor.selection.isCollapsed() ? deleteCaret$1(editor, forward) : deleteRange$1(editor);
|
22039
22095
|
const hasAncestorInlineCaret = elm => ancestor$1(elm, node => isCaretNode(node.dom), isBlock$2);
|
22040
22096
|
const hasAncestorInlineCaretAtStart = editor => hasAncestorInlineCaret(SugarElement.fromDom(editor.selection.getStart()));
|
22041
22097
|
const requiresRefreshCaretOverride = editor => {
|
@@ -22073,7 +22129,7 @@
|
|
22073
22129
|
const selectedNode = editor.selection.getNode();
|
22074
22130
|
return isMedia$2(selectedNode) ? deleteElement(editor, forward, selectedNode) : Optional.none();
|
22075
22131
|
};
|
22076
|
-
const backspaceDelete$
|
22132
|
+
const backspaceDelete$2 = (editor, forward) => editor.selection.isCollapsed() ? deleteCaret(editor, forward) : deleteRange(editor, forward);
|
22077
22133
|
|
22078
22134
|
const isEditable = target => closest$4(target, elm => isContentEditableTrue$3(elm.dom) || isContentEditableFalse$b(elm.dom)).exists(elm => isContentEditableTrue$3(elm.dom));
|
22079
22135
|
const parseIndentValue = value => toInt(value !== null && value !== void 0 ? value : '').getOr(0);
|
@@ -22120,7 +22176,7 @@
|
|
22120
22176
|
const indent = editor => handle(editor, 'indent');
|
22121
22177
|
const outdent = editor => handle(editor, 'outdent');
|
22122
22178
|
|
22123
|
-
const backspaceDelete = editor => {
|
22179
|
+
const backspaceDelete$1 = editor => {
|
22124
22180
|
if (editor.selection.isCollapsed() && canOutdent(editor)) {
|
22125
22181
|
const dom = editor.dom;
|
22126
22182
|
const rng = editor.selection.getRng();
|
@@ -22134,16 +22190,16 @@
|
|
22134
22190
|
};
|
22135
22191
|
|
22136
22192
|
const findAction = (editor, caret, forward) => findMap([
|
22137
|
-
backspaceDelete,
|
22138
|
-
backspaceDelete$5,
|
22139
|
-
backspaceDelete$6,
|
22140
|
-
(editor, forward) => backspaceDelete$3(editor, caret, forward),
|
22141
|
-
backspaceDelete$8,
|
22142
|
-
backspaceDelete$9,
|
22143
|
-
backspaceDelete$4,
|
22144
22193
|
backspaceDelete$1,
|
22194
|
+
backspaceDelete$6,
|
22145
22195
|
backspaceDelete$7,
|
22146
|
-
backspaceDelete$
|
22196
|
+
(editor, forward) => backspaceDelete$4(editor, caret, forward),
|
22197
|
+
backspaceDelete$9,
|
22198
|
+
backspaceDelete$a,
|
22199
|
+
backspaceDelete$5,
|
22200
|
+
backspaceDelete$2,
|
22201
|
+
backspaceDelete$8,
|
22202
|
+
backspaceDelete$3
|
22147
22203
|
], item => item(editor, forward)).filter(_ => editor.selection.isEditable());
|
22148
22204
|
const deleteCommand = (editor, caret) => {
|
22149
22205
|
const result = findAction(editor, caret, false);
|
@@ -22480,7 +22536,7 @@
|
|
22480
22536
|
moveToRange(editor, newRange);
|
22481
22537
|
return true;
|
22482
22538
|
});
|
22483
|
-
const moveV$
|
22539
|
+
const moveV$4 = (editor, down) => getVerticalRange(editor, down).exists(newRange => {
|
22484
22540
|
moveToRange(editor, newRange);
|
22485
22541
|
return true;
|
22486
22542
|
});
|
@@ -22522,7 +22578,7 @@
|
|
22522
22578
|
}
|
22523
22579
|
});
|
22524
22580
|
};
|
22525
|
-
const moveV$
|
22581
|
+
const moveV$3 = (editor, forward) => {
|
22526
22582
|
if (editor.selection.isCollapsed()) {
|
22527
22583
|
return moveCaretToNewEmptyLine(editor, forward);
|
22528
22584
|
} else {
|
@@ -22530,6 +22586,37 @@
|
|
22530
22586
|
}
|
22531
22587
|
};
|
22532
22588
|
|
22589
|
+
const moveUp = (editor, details, summary) => {
|
22590
|
+
const rng = editor.selection.getRng();
|
22591
|
+
const pos = CaretPosition.fromRangeStart(rng);
|
22592
|
+
const root = editor.getBody();
|
22593
|
+
if (root.firstChild === details && isAtFirstLine(summary, pos)) {
|
22594
|
+
editor.execCommand('InsertNewBlockBefore');
|
22595
|
+
return true;
|
22596
|
+
} else {
|
22597
|
+
return false;
|
22598
|
+
}
|
22599
|
+
};
|
22600
|
+
const moveDown = (editor, details) => {
|
22601
|
+
const rng = editor.selection.getRng();
|
22602
|
+
const pos = CaretPosition.fromRangeStart(rng);
|
22603
|
+
const root = editor.getBody();
|
22604
|
+
if (root.lastChild === details && isAtLastLine(details, pos)) {
|
22605
|
+
editor.execCommand('InsertNewBlockAfter');
|
22606
|
+
return true;
|
22607
|
+
} else {
|
22608
|
+
return false;
|
22609
|
+
}
|
22610
|
+
};
|
22611
|
+
const move$2 = (editor, forward) => {
|
22612
|
+
if (forward) {
|
22613
|
+
return Optional.from(editor.dom.getParent(editor.selection.getNode(), 'details')).map(details => moveDown(editor, details)).getOr(false);
|
22614
|
+
} else {
|
22615
|
+
return Optional.from(editor.dom.getParent(editor.selection.getNode(), 'summary')).bind(summary => Optional.from(editor.dom.getParent(summary, 'details')).map(details => moveUp(editor, details, summary))).getOr(false);
|
22616
|
+
}
|
22617
|
+
};
|
22618
|
+
const moveV$2 = (editor, forward) => move$2(editor, forward);
|
22619
|
+
|
22533
22620
|
const baseKeyPattern = {
|
22534
22621
|
shiftKey: false,
|
22535
22622
|
altKey: false,
|
@@ -22822,11 +22909,11 @@
|
|
22822
22909
|
},
|
22823
22910
|
{
|
22824
22911
|
keyCode: VK.UP,
|
22825
|
-
action: action(moveV$
|
22912
|
+
action: action(moveV$4, editor, false)
|
22826
22913
|
},
|
22827
22914
|
{
|
22828
22915
|
keyCode: VK.DOWN,
|
22829
|
-
action: action(moveV$
|
22916
|
+
action: action(moveV$4, editor, true)
|
22830
22917
|
},
|
22831
22918
|
...isMac ? [
|
22832
22919
|
{
|
@@ -22858,6 +22945,18 @@
|
|
22858
22945
|
keyCode: VK.DOWN,
|
22859
22946
|
action: action(moveV, editor, true)
|
22860
22947
|
},
|
22948
|
+
{
|
22949
|
+
keyCode: VK.UP,
|
22950
|
+
action: action(moveV, editor, false)
|
22951
|
+
},
|
22952
|
+
{
|
22953
|
+
keyCode: VK.UP,
|
22954
|
+
action: action(moveV$2, editor, false)
|
22955
|
+
},
|
22956
|
+
{
|
22957
|
+
keyCode: VK.DOWN,
|
22958
|
+
action: action(moveV$2, editor, true)
|
22959
|
+
},
|
22861
22960
|
{
|
22862
22961
|
keyCode: VK.RIGHT,
|
22863
22962
|
action: action(moveH$1, editor, true)
|
@@ -22876,11 +22975,11 @@
|
|
22876
22975
|
},
|
22877
22976
|
{
|
22878
22977
|
keyCode: VK.RIGHT,
|
22879
|
-
action: action(move$
|
22978
|
+
action: action(move$3, editor, caret, true)
|
22880
22979
|
},
|
22881
22980
|
{
|
22882
22981
|
keyCode: VK.LEFT,
|
22883
|
-
action: action(move$
|
22982
|
+
action: action(move$3, editor, caret, false)
|
22884
22983
|
},
|
22885
22984
|
{
|
22886
22985
|
keyCode: VK.RIGHT,
|
@@ -22896,11 +22995,11 @@
|
|
22896
22995
|
},
|
22897
22996
|
{
|
22898
22997
|
keyCode: VK.UP,
|
22899
|
-
action: action(moveV$
|
22998
|
+
action: action(moveV$3, editor, false)
|
22900
22999
|
},
|
22901
23000
|
{
|
22902
23001
|
keyCode: VK.DOWN,
|
22903
|
-
action: action(moveV$
|
23002
|
+
action: action(moveV$3, editor, true)
|
22904
23003
|
}
|
22905
23004
|
], evt).each(_ => {
|
22906
23005
|
evt.preventDefault();
|
@@ -23597,98 +23696,318 @@
|
|
23597
23696
|
});
|
23598
23697
|
};
|
23599
23698
|
|
23600
|
-
const
|
23601
|
-
|
23602
|
-
|
23603
|
-
|
23604
|
-
|
23605
|
-
|
23606
|
-
|
23607
|
-
|
23608
|
-
|
23609
|
-
|
23610
|
-
|
23611
|
-
|
23612
|
-
|
23613
|
-
|
23614
|
-
|
23615
|
-
|
23616
|
-
|
23617
|
-
|
23618
|
-
|
23619
|
-
}
|
23620
|
-
|
23621
|
-
|
23622
|
-
|
23623
|
-
|
23624
|
-
|
23699
|
+
const browser$1 = detect$2().browser;
|
23700
|
+
const isSafari = browser$1.isSafari();
|
23701
|
+
const emptyNodeContents = node => fillWithPaddingBr(SugarElement.fromDom(node));
|
23702
|
+
const isEntireNodeSelected = (rng, node) => {
|
23703
|
+
var _a;
|
23704
|
+
return rng.startOffset === 0 && rng.endOffset === ((_a = node.textContent) === null || _a === void 0 ? void 0 : _a.length);
|
23705
|
+
};
|
23706
|
+
const getParentDetailsElementAtPos = (dom, pos) => Optional.from(dom.getParent(pos.container(), 'details'));
|
23707
|
+
const isInDetailsElement = (dom, pos) => getParentDetailsElementAtPos(dom, pos).isSome();
|
23708
|
+
const getDetailsElements = (dom, rng) => {
|
23709
|
+
const startDetails = Optional.from(dom.getParent(rng.startContainer, 'details'));
|
23710
|
+
const endDetails = Optional.from(dom.getParent(rng.endContainer, 'details'));
|
23711
|
+
if (startDetails.isSome() || endDetails.isSome()) {
|
23712
|
+
const startSummary = startDetails.bind(details => Optional.from(dom.select('summary', details)[0]));
|
23713
|
+
return Optional.some({
|
23714
|
+
startSummary,
|
23715
|
+
startDetails,
|
23716
|
+
endDetails
|
23717
|
+
});
|
23718
|
+
} else {
|
23719
|
+
return Optional.none();
|
23720
|
+
}
|
23721
|
+
};
|
23722
|
+
const isCaretInTheBeginningOf = (caretPos, element) => firstPositionIn(element).exists(pos => pos.isEqual(caretPos));
|
23723
|
+
const isCaretInTheEndOf = (caretPos, element) => {
|
23724
|
+
return lastPositionIn(element).exists(pos => {
|
23725
|
+
if (isBr$6(pos.getNode())) {
|
23726
|
+
return prevPosition(element, pos).exists(pos2 => pos2.isEqual(caretPos)) || pos.isEqual(caretPos);
|
23727
|
+
} else {
|
23728
|
+
return pos.isEqual(caretPos);
|
23729
|
+
}
|
23730
|
+
});
|
23731
|
+
};
|
23732
|
+
const isCaretAtStartOfSummary = (caretPos, detailsElements) => detailsElements.startSummary.exists(summary => isCaretInTheBeginningOf(caretPos, summary));
|
23733
|
+
const isCaretAtEndOfSummary = (caretPos, detailsElements) => detailsElements.startSummary.exists(summary => isCaretInTheEndOf(caretPos, summary));
|
23734
|
+
const isCaretInFirstPositionInBody = (caretPos, detailsElements) => detailsElements.startDetails.exists(details => prevPosition(details, caretPos).forall(pos => detailsElements.startSummary.exists(summary => !summary.contains(caretPos.container()) && summary.contains(pos.container()))));
|
23735
|
+
const isCaretInLastPositionInBody = (root, caretPos, detailsElements) => detailsElements.startDetails.exists(details => nextPosition(root, caretPos).forall(pos => !details.contains(pos.container())));
|
23736
|
+
const setCaretToPosition = (editor, position) => {
|
23737
|
+
const node = position.getNode();
|
23738
|
+
if (!isUndefined(node)) {
|
23739
|
+
editor.selection.setCursorLocation(node, position.offset());
|
23740
|
+
}
|
23741
|
+
};
|
23742
|
+
const moveCaretToDetailsPos = (editor, pos, forward) => {
|
23743
|
+
const details = editor.dom.getParent(pos.container(), 'details');
|
23744
|
+
if (details && !details.open) {
|
23745
|
+
const summary = editor.dom.select('summary', details)[0];
|
23746
|
+
if (summary) {
|
23747
|
+
const newPos = forward ? firstPositionIn(summary) : lastPositionIn(summary);
|
23748
|
+
newPos.each(pos => setCaretToPosition(editor, pos));
|
23749
|
+
}
|
23750
|
+
} else {
|
23751
|
+
setCaretToPosition(editor, pos);
|
23752
|
+
}
|
23753
|
+
};
|
23754
|
+
const isPartialDelete = (rng, detailsElements) => {
|
23755
|
+
const containsStart = element => element.contains(rng.startContainer);
|
23756
|
+
const containsEnd = element => element.contains(rng.endContainer);
|
23757
|
+
const startInSummary = detailsElements.startSummary.exists(containsStart);
|
23758
|
+
const endInSummary = detailsElements.startSummary.exists(containsEnd);
|
23759
|
+
const isPartiallySelectedDetailsElements = detailsElements.startDetails.forall(startDetails => detailsElements.endDetails.forall(endDetails => startDetails !== endDetails));
|
23760
|
+
const isInPartiallySelectedSummary = (startInSummary || endInSummary) && !(startInSummary && endInSummary);
|
23761
|
+
return isInPartiallySelectedSummary || isPartiallySelectedDetailsElements;
|
23762
|
+
};
|
23763
|
+
const shouldPreventDeleteIntoDetails = (editor, forward, granularity) => {
|
23764
|
+
const {dom, selection} = editor;
|
23765
|
+
const root = editor.getBody();
|
23766
|
+
if (granularity === 'character') {
|
23767
|
+
const caretPos = CaretPosition.fromRangeStart(selection.getRng());
|
23768
|
+
const parentBlock = dom.getParent(caretPos.container(), dom.isBlock);
|
23769
|
+
const parentDetailsAtCaret = getParentDetailsElementAtPos(dom, caretPos);
|
23770
|
+
const inEmptyParentBlock = parentBlock && dom.isEmpty(parentBlock);
|
23771
|
+
const isFirstBlock = isNull(parentBlock === null || parentBlock === void 0 ? void 0 : parentBlock.previousSibling);
|
23772
|
+
const isLastBlock = isNull(parentBlock === null || parentBlock === void 0 ? void 0 : parentBlock.nextSibling);
|
23773
|
+
if (inEmptyParentBlock) {
|
23774
|
+
const firstOrLast = forward ? isLastBlock : isFirstBlock;
|
23775
|
+
if (firstOrLast) {
|
23776
|
+
const isBeforeAfterDetails = navigate(!forward, root, caretPos).exists(pos => {
|
23777
|
+
return isInDetailsElement(dom, pos) && !equals(parentDetailsAtCaret, getParentDetailsElementAtPos(dom, pos));
|
23778
|
+
});
|
23779
|
+
if (isBeforeAfterDetails) {
|
23780
|
+
return true;
|
23781
|
+
}
|
23782
|
+
}
|
23783
|
+
}
|
23784
|
+
return navigate(forward, root, caretPos).fold(never, pos => {
|
23785
|
+
const parentDetailsAtNewPos = getParentDetailsElementAtPos(dom, pos);
|
23786
|
+
if (isInDetailsElement(dom, pos) && !equals(parentDetailsAtCaret, parentDetailsAtNewPos)) {
|
23787
|
+
if (!forward) {
|
23788
|
+
moveCaretToDetailsPos(editor, pos, false);
|
23789
|
+
}
|
23790
|
+
if (parentBlock && inEmptyParentBlock) {
|
23791
|
+
if (forward && isFirstBlock) {
|
23792
|
+
return true;
|
23793
|
+
} else if (!forward && isLastBlock) {
|
23794
|
+
return true;
|
23795
|
+
}
|
23796
|
+
moveCaretToDetailsPos(editor, pos, forward);
|
23797
|
+
editor.dom.remove(parentBlock);
|
23798
|
+
}
|
23799
|
+
return true;
|
23800
|
+
} else {
|
23801
|
+
return false;
|
23802
|
+
}
|
23803
|
+
});
|
23804
|
+
} else {
|
23805
|
+
return false;
|
23806
|
+
}
|
23807
|
+
};
|
23808
|
+
const shouldPreventDeleteSummaryAction = (editor, detailElements, forward, granularity) => {
|
23809
|
+
const selection = editor.selection;
|
23810
|
+
const rng = selection.getRng();
|
23811
|
+
const caretPos = CaretPosition.fromRangeStart(rng);
|
23812
|
+
const root = editor.getBody();
|
23813
|
+
if (granularity === 'selection') {
|
23814
|
+
return isPartialDelete(rng, detailElements);
|
23815
|
+
} else if (forward) {
|
23816
|
+
return isCaretAtEndOfSummary(caretPos, detailElements) || isCaretInLastPositionInBody(root, caretPos, detailElements);
|
23817
|
+
} else {
|
23818
|
+
return isCaretAtStartOfSummary(caretPos, detailElements) || isCaretInFirstPositionInBody(caretPos, detailElements);
|
23819
|
+
}
|
23820
|
+
};
|
23821
|
+
const shouldPreventDeleteAction = (editor, forward, granularity) => getDetailsElements(editor.dom, editor.selection.getRng()).fold(() => shouldPreventDeleteIntoDetails(editor, forward, granularity), detailsElements => shouldPreventDeleteSummaryAction(editor, detailsElements, forward, granularity) || shouldPreventDeleteIntoDetails(editor, forward, granularity));
|
23822
|
+
const handleDeleteActionSafari = (editor, forward, granularity) => {
|
23823
|
+
const selection = editor.selection;
|
23824
|
+
const node = selection.getNode();
|
23825
|
+
const rng = selection.getRng();
|
23826
|
+
const caretPos = CaretPosition.fromRangeStart(rng);
|
23827
|
+
if (isSummary(node)) {
|
23828
|
+
if (granularity === 'selection' && isEntireNodeSelected(rng, node) || willDeleteLastPositionInElement(forward, caretPos, node)) {
|
23829
|
+
emptyNodeContents(node);
|
23830
|
+
} else {
|
23831
|
+
editor.undoManager.transact(() => {
|
23832
|
+
const sel = selection.getSel();
|
23833
|
+
let {anchorNode, anchorOffset, focusNode, focusOffset} = sel !== null && sel !== void 0 ? sel : {};
|
23834
|
+
const applySelection = () => {
|
23835
|
+
if (isNonNullable(anchorNode) && isNonNullable(anchorOffset) && isNonNullable(focusNode) && isNonNullable(focusOffset)) {
|
23836
|
+
sel === null || sel === void 0 ? void 0 : sel.setBaseAndExtent(anchorNode, anchorOffset, focusNode, focusOffset);
|
23837
|
+
}
|
23838
|
+
};
|
23839
|
+
const updateSelection = () => {
|
23840
|
+
anchorNode = sel === null || sel === void 0 ? void 0 : sel.anchorNode;
|
23841
|
+
anchorOffset = sel === null || sel === void 0 ? void 0 : sel.anchorOffset;
|
23842
|
+
focusNode = sel === null || sel === void 0 ? void 0 : sel.focusNode;
|
23843
|
+
focusOffset = sel === null || sel === void 0 ? void 0 : sel.focusOffset;
|
23844
|
+
};
|
23845
|
+
const appendAllChildNodes = (from, to) => {
|
23846
|
+
each$e(from.childNodes, child => {
|
23847
|
+
if (isNode(child)) {
|
23848
|
+
to.appendChild(child);
|
23849
|
+
}
|
23850
|
+
});
|
23851
|
+
};
|
23852
|
+
const container = editor.dom.create('span', { 'data-mce-bogus': '1' });
|
23853
|
+
appendAllChildNodes(node, container);
|
23854
|
+
node.appendChild(container);
|
23855
|
+
applySelection();
|
23856
|
+
if (granularity === 'word' || granularity === 'line') {
|
23857
|
+
sel === null || sel === void 0 ? void 0 : sel.modify('extend', forward ? 'right' : 'left', granularity);
|
23858
|
+
}
|
23859
|
+
if (!selection.isCollapsed() && isEntireNodeSelected(selection.getRng(), container)) {
|
23860
|
+
emptyNodeContents(node);
|
23861
|
+
} else {
|
23862
|
+
editor.execCommand(forward ? 'ForwardDelete' : 'Delete');
|
23863
|
+
updateSelection();
|
23864
|
+
appendAllChildNodes(container, node);
|
23865
|
+
applySelection();
|
23866
|
+
}
|
23867
|
+
editor.dom.remove(container);
|
23868
|
+
});
|
23869
|
+
}
|
23870
|
+
return true;
|
23871
|
+
} else {
|
23872
|
+
return false;
|
23873
|
+
}
|
23874
|
+
};
|
23875
|
+
const backspaceDelete = (editor, forward, granularity) => shouldPreventDeleteAction(editor, forward, granularity) || isSafari && handleDeleteActionSafari(editor, forward, granularity) ? Optional.some(noop) : Optional.none();
|
23876
|
+
|
23877
|
+
const createAndFireInputEvent = eventType => (editor, inputType, specifics = {}) => {
|
23878
|
+
const target = editor.getBody();
|
23879
|
+
const overrides = {
|
23880
|
+
bubbles: true,
|
23881
|
+
composed: true,
|
23882
|
+
data: null,
|
23883
|
+
isComposing: false,
|
23884
|
+
detail: 0,
|
23885
|
+
view: null,
|
23886
|
+
target,
|
23887
|
+
currentTarget: target,
|
23888
|
+
eventPhase: Event.AT_TARGET,
|
23889
|
+
originalTarget: target,
|
23890
|
+
explicitOriginalTarget: target,
|
23891
|
+
isTrusted: false,
|
23892
|
+
srcElement: target,
|
23893
|
+
cancelable: false,
|
23894
|
+
preventDefault: noop,
|
23895
|
+
inputType
|
23896
|
+
};
|
23897
|
+
const input = clone$3(new InputEvent(eventType));
|
23898
|
+
return editor.dispatch(eventType, {
|
23899
|
+
...input,
|
23900
|
+
...overrides,
|
23901
|
+
...specifics
|
23625
23902
|
});
|
23626
23903
|
};
|
23627
23904
|
const fireInputEvent = createAndFireInputEvent('input');
|
23628
23905
|
const fireBeforeInputEvent = createAndFireInputEvent('beforeinput');
|
23629
23906
|
|
23907
|
+
const platform$2 = detect$2();
|
23908
|
+
const os = platform$2.os;
|
23909
|
+
const isMacOSOriOS = os.isMacOS() || os.isiOS();
|
23910
|
+
const browser = platform$2.browser;
|
23911
|
+
const isFirefox = browser.isFirefox();
|
23630
23912
|
const executeKeydownOverride$3 = (editor, caret, evt) => {
|
23631
23913
|
const inputType = evt.keyCode === VK.BACKSPACE ? 'deleteContentBackward' : 'deleteContentForward';
|
23914
|
+
const isCollapsed = editor.selection.isCollapsed();
|
23915
|
+
const unmodifiedGranularity = isCollapsed ? 'character' : 'selection';
|
23916
|
+
const getModifiedGranularity = isWord => {
|
23917
|
+
if (isCollapsed) {
|
23918
|
+
return isWord ? 'word' : 'line';
|
23919
|
+
} else {
|
23920
|
+
return 'selection';
|
23921
|
+
}
|
23922
|
+
};
|
23632
23923
|
executeWithDelayedAction([
|
23633
23924
|
{
|
23634
23925
|
keyCode: VK.BACKSPACE,
|
23635
|
-
action: action(backspaceDelete, editor)
|
23926
|
+
action: action(backspaceDelete$1, editor)
|
23636
23927
|
},
|
23637
23928
|
{
|
23638
23929
|
keyCode: VK.BACKSPACE,
|
23639
|
-
action: action(backspaceDelete$
|
23930
|
+
action: action(backspaceDelete$6, editor, false)
|
23640
23931
|
},
|
23641
23932
|
{
|
23642
23933
|
keyCode: VK.DELETE,
|
23643
|
-
action: action(backspaceDelete$
|
23934
|
+
action: action(backspaceDelete$6, editor, true)
|
23644
23935
|
},
|
23645
23936
|
{
|
23646
23937
|
keyCode: VK.BACKSPACE,
|
23647
|
-
action: action(backspaceDelete$
|
23938
|
+
action: action(backspaceDelete$7, editor, false)
|
23648
23939
|
},
|
23649
23940
|
{
|
23650
23941
|
keyCode: VK.DELETE,
|
23651
|
-
action: action(backspaceDelete$
|
23942
|
+
action: action(backspaceDelete$7, editor, true)
|
23652
23943
|
},
|
23653
23944
|
{
|
23654
23945
|
keyCode: VK.BACKSPACE,
|
23655
|
-
action: action(backspaceDelete$
|
23946
|
+
action: action(backspaceDelete$4, editor, caret, false)
|
23656
23947
|
},
|
23657
23948
|
{
|
23658
23949
|
keyCode: VK.DELETE,
|
23659
|
-
action: action(backspaceDelete$
|
23950
|
+
action: action(backspaceDelete$4, editor, caret, true)
|
23660
23951
|
},
|
23661
23952
|
{
|
23662
23953
|
keyCode: VK.BACKSPACE,
|
23663
|
-
action: action(backspaceDelete$
|
23954
|
+
action: action(backspaceDelete$a, editor, false)
|
23664
23955
|
},
|
23665
23956
|
{
|
23666
23957
|
keyCode: VK.DELETE,
|
23667
|
-
action: action(backspaceDelete$
|
23958
|
+
action: action(backspaceDelete$a, editor, true)
|
23668
23959
|
},
|
23669
23960
|
{
|
23670
23961
|
keyCode: VK.BACKSPACE,
|
23671
|
-
action: action(backspaceDelete
|
23962
|
+
action: action(backspaceDelete, editor, false, unmodifiedGranularity)
|
23672
23963
|
},
|
23673
23964
|
{
|
23674
23965
|
keyCode: VK.DELETE,
|
23675
|
-
action: action(backspaceDelete
|
23966
|
+
action: action(backspaceDelete, editor, true, unmodifiedGranularity)
|
23676
23967
|
},
|
23968
|
+
...isMacOSOriOS ? [
|
23969
|
+
{
|
23970
|
+
keyCode: VK.BACKSPACE,
|
23971
|
+
altKey: true,
|
23972
|
+
action: action(backspaceDelete, editor, false, getModifiedGranularity(true))
|
23973
|
+
},
|
23974
|
+
{
|
23975
|
+
keyCode: VK.DELETE,
|
23976
|
+
altKey: true,
|
23977
|
+
action: action(backspaceDelete, editor, true, getModifiedGranularity(true))
|
23978
|
+
},
|
23979
|
+
{
|
23980
|
+
keyCode: VK.BACKSPACE,
|
23981
|
+
metaKey: true,
|
23982
|
+
action: action(backspaceDelete, editor, false, getModifiedGranularity(false))
|
23983
|
+
}
|
23984
|
+
] : [
|
23985
|
+
{
|
23986
|
+
keyCode: VK.BACKSPACE,
|
23987
|
+
ctrlKey: true,
|
23988
|
+
action: action(backspaceDelete, editor, false, getModifiedGranularity(true))
|
23989
|
+
},
|
23990
|
+
{
|
23991
|
+
keyCode: VK.DELETE,
|
23992
|
+
ctrlKey: true,
|
23993
|
+
action: action(backspaceDelete, editor, true, getModifiedGranularity(true))
|
23994
|
+
}
|
23995
|
+
],
|
23677
23996
|
{
|
23678
23997
|
keyCode: VK.BACKSPACE,
|
23679
|
-
action: action(backspaceDelete$
|
23998
|
+
action: action(backspaceDelete$5, editor, false)
|
23680
23999
|
},
|
23681
24000
|
{
|
23682
24001
|
keyCode: VK.DELETE,
|
23683
|
-
action: action(backspaceDelete$
|
24002
|
+
action: action(backspaceDelete$5, editor, true)
|
23684
24003
|
},
|
23685
24004
|
{
|
23686
24005
|
keyCode: VK.BACKSPACE,
|
23687
|
-
action: action(backspaceDelete$
|
24006
|
+
action: action(backspaceDelete$2, editor, false)
|
23688
24007
|
},
|
23689
24008
|
{
|
23690
24009
|
keyCode: VK.DELETE,
|
23691
|
-
action: action(backspaceDelete$
|
24010
|
+
action: action(backspaceDelete$2, editor, true)
|
23692
24011
|
},
|
23693
24012
|
{
|
23694
24013
|
keyCode: VK.BACKSPACE,
|
@@ -23700,11 +24019,19 @@
|
|
23700
24019
|
},
|
23701
24020
|
{
|
23702
24021
|
keyCode: VK.BACKSPACE,
|
23703
|
-
action: action(backspaceDelete$
|
24022
|
+
action: action(backspaceDelete$9, editor, false)
|
23704
24023
|
},
|
23705
24024
|
{
|
23706
24025
|
keyCode: VK.DELETE,
|
23707
|
-
action: action(backspaceDelete$
|
24026
|
+
action: action(backspaceDelete$9, editor, true)
|
24027
|
+
},
|
24028
|
+
{
|
24029
|
+
keyCode: VK.BACKSPACE,
|
24030
|
+
action: action(backspaceDelete$3, editor, false)
|
24031
|
+
},
|
24032
|
+
{
|
24033
|
+
keyCode: VK.DELETE,
|
24034
|
+
action: action(backspaceDelete$3, editor, true)
|
23708
24035
|
}
|
23709
24036
|
], evt).filter(_ => editor.selection.isEditable()).each(applyAction => {
|
23710
24037
|
evt.preventDefault();
|
@@ -23715,11 +24042,16 @@
|
|
23715
24042
|
}
|
23716
24043
|
});
|
23717
24044
|
};
|
23718
|
-
const executeKeyupOverride = (editor, evt, isBackspaceKeydown) =>
|
23719
|
-
|
23720
|
-
|
23721
|
-
|
23722
|
-
|
24045
|
+
const executeKeyupOverride = (editor, evt, isBackspaceKeydown) => execute([
|
24046
|
+
{
|
24047
|
+
keyCode: VK.BACKSPACE,
|
24048
|
+
action: action(paddEmptyElement, editor)
|
24049
|
+
},
|
24050
|
+
{
|
24051
|
+
keyCode: VK.DELETE,
|
24052
|
+
action: action(paddEmptyElement, editor)
|
24053
|
+
},
|
24054
|
+
...isMacOSOriOS ? [
|
23723
24055
|
{
|
23724
24056
|
keyCode: VK.BACKSPACE,
|
23725
24057
|
altKey: true,
|
@@ -23729,7 +24061,11 @@
|
|
23729
24061
|
keyCode: VK.DELETE,
|
23730
24062
|
altKey: true,
|
23731
24063
|
action: action(refreshCaret, editor)
|
23732
|
-
}
|
24064
|
+
},
|
24065
|
+
...isBackspaceKeydown ? [{
|
24066
|
+
keyCode: isFirefox ? 224 : 91,
|
24067
|
+
action: action(refreshCaret, editor)
|
24068
|
+
}] : []
|
23733
24069
|
] : [
|
23734
24070
|
{
|
23735
24071
|
keyCode: VK.BACKSPACE,
|
@@ -23741,25 +24077,8 @@
|
|
23741
24077
|
ctrlKey: true,
|
23742
24078
|
action: action(refreshCaret, editor)
|
23743
24079
|
}
|
23744
|
-
]
|
23745
|
-
|
23746
|
-
multiDeleteKeyPatterns.push({
|
23747
|
-
keyCode: browser.isFirefox() ? 224 : 91,
|
23748
|
-
action: action(refreshCaret, editor)
|
23749
|
-
});
|
23750
|
-
}
|
23751
|
-
execute([
|
23752
|
-
{
|
23753
|
-
keyCode: VK.BACKSPACE,
|
23754
|
-
action: action(paddEmptyElement, editor)
|
23755
|
-
},
|
23756
|
-
{
|
23757
|
-
keyCode: VK.DELETE,
|
23758
|
-
action: action(paddEmptyElement, editor)
|
23759
|
-
},
|
23760
|
-
...multiDeleteKeyPatterns
|
23761
|
-
], evt);
|
23762
|
-
};
|
24080
|
+
]
|
24081
|
+
], evt);
|
23763
24082
|
const setup$i = (editor, caret) => {
|
23764
24083
|
let isBackspaceKeydown = false;
|
23765
24084
|
editor.on('keydown', evt => {
|
@@ -23845,6 +24164,7 @@
|
|
23845
24164
|
while (parent !== root && parent && dom.getContentEditable(parent) !== 'false') {
|
23846
24165
|
if (dom.getContentEditable(parent) === 'true') {
|
23847
24166
|
editableRoot = parent;
|
24167
|
+
break;
|
23848
24168
|
}
|
23849
24169
|
parent = parent.parentNode;
|
23850
24170
|
}
|
@@ -23863,6 +24183,82 @@
|
|
23863
24183
|
return isListItem$1(SugarElement.fromDom(elm));
|
23864
24184
|
}).isSome();
|
23865
24185
|
};
|
24186
|
+
const emptyBlock = elm => {
|
24187
|
+
elm.innerHTML = '<br data-mce-bogus="1">';
|
24188
|
+
};
|
24189
|
+
const applyAttributes = (editor, node, forcedRootBlockAttrs) => {
|
24190
|
+
const dom = editor.dom;
|
24191
|
+
Optional.from(forcedRootBlockAttrs.style).map(dom.parseStyle).each(attrStyles => {
|
24192
|
+
const currentStyles = getAllRaw(SugarElement.fromDom(node));
|
24193
|
+
const newStyles = {
|
24194
|
+
...currentStyles,
|
24195
|
+
...attrStyles
|
24196
|
+
};
|
24197
|
+
dom.setStyles(node, newStyles);
|
24198
|
+
});
|
24199
|
+
const attrClassesOpt = Optional.from(forcedRootBlockAttrs.class).map(attrClasses => attrClasses.split(/\s+/));
|
24200
|
+
const currentClassesOpt = Optional.from(node.className).map(currentClasses => filter$5(currentClasses.split(/\s+/), clazz => clazz !== ''));
|
24201
|
+
lift2(attrClassesOpt, currentClassesOpt, (attrClasses, currentClasses) => {
|
24202
|
+
const filteredClasses = filter$5(currentClasses, clazz => !contains$2(attrClasses, clazz));
|
24203
|
+
const newClasses = [
|
24204
|
+
...attrClasses,
|
24205
|
+
...filteredClasses
|
24206
|
+
];
|
24207
|
+
dom.setAttrib(node, 'class', newClasses.join(' '));
|
24208
|
+
});
|
24209
|
+
const appliedAttrs = [
|
24210
|
+
'style',
|
24211
|
+
'class'
|
24212
|
+
];
|
24213
|
+
const remainingAttrs = filter$4(forcedRootBlockAttrs, (_, attrs) => !contains$2(appliedAttrs, attrs));
|
24214
|
+
dom.setAttribs(node, remainingAttrs);
|
24215
|
+
};
|
24216
|
+
const setForcedBlockAttrs = (editor, node) => {
|
24217
|
+
const forcedRootBlockName = getForcedRootBlock(editor);
|
24218
|
+
if (forcedRootBlockName.toLowerCase() === node.tagName.toLowerCase()) {
|
24219
|
+
const forcedRootBlockAttrs = getForcedRootBlockAttrs(editor);
|
24220
|
+
applyAttributes(editor, node, forcedRootBlockAttrs);
|
24221
|
+
}
|
24222
|
+
};
|
24223
|
+
const createNewBlock = (editor, container, parentBlock, editableRoot, keepStyles = true, name) => {
|
24224
|
+
const dom = editor.dom;
|
24225
|
+
const schema = editor.schema;
|
24226
|
+
const newBlockName = getForcedRootBlock(editor);
|
24227
|
+
const parentBlockName = parentBlock ? parentBlock.nodeName.toUpperCase() : '';
|
24228
|
+
let node = container;
|
24229
|
+
const textInlineElements = schema.getTextInlineElements();
|
24230
|
+
let block;
|
24231
|
+
if (name || parentBlockName === 'TABLE' || parentBlockName === 'HR') {
|
24232
|
+
block = dom.create(name || newBlockName);
|
24233
|
+
} else {
|
24234
|
+
block = parentBlock.cloneNode(false);
|
24235
|
+
}
|
24236
|
+
let caretNode = block;
|
24237
|
+
if (!keepStyles) {
|
24238
|
+
dom.setAttrib(block, 'style', null);
|
24239
|
+
dom.setAttrib(block, 'class', null);
|
24240
|
+
} else {
|
24241
|
+
do {
|
24242
|
+
if (textInlineElements[node.nodeName]) {
|
24243
|
+
if (isCaretNode(node) || isBookmarkNode$1(node)) {
|
24244
|
+
continue;
|
24245
|
+
}
|
24246
|
+
const clonedNode = node.cloneNode(false);
|
24247
|
+
dom.setAttrib(clonedNode, 'id', '');
|
24248
|
+
if (block.hasChildNodes()) {
|
24249
|
+
clonedNode.appendChild(block.firstChild);
|
24250
|
+
block.appendChild(clonedNode);
|
24251
|
+
} else {
|
24252
|
+
caretNode = clonedNode;
|
24253
|
+
block.appendChild(clonedNode);
|
24254
|
+
}
|
24255
|
+
}
|
24256
|
+
} while ((node = node.parentNode) && node !== editableRoot);
|
24257
|
+
}
|
24258
|
+
setForcedBlockAttrs(editor, block);
|
24259
|
+
emptyBlock(caretNode);
|
24260
|
+
return block;
|
24261
|
+
};
|
23866
24262
|
|
23867
24263
|
const getDetailsRoot = (editor, element) => editor.dom.getParent(element, isDetails);
|
23868
24264
|
const isAtDetailsEdge = (root, element, isTextBlock) => {
|
@@ -23925,7 +24321,7 @@
|
|
23925
24321
|
}
|
23926
24322
|
return node === parentBlock;
|
23927
24323
|
};
|
23928
|
-
const insert$
|
24324
|
+
const insert$4 = (editor, createNewBlock, containerBlock, parentBlock, newBlockName) => {
|
23929
24325
|
const dom = editor.dom;
|
23930
24326
|
const rng = editor.selection.getRng();
|
23931
24327
|
const containerParent = containerBlock.parentNode;
|
@@ -23991,9 +24387,6 @@
|
|
23991
24387
|
const isEmptyAnchor = (dom, elm) => {
|
23992
24388
|
return elm && elm.nodeName === 'A' && dom.isEmpty(elm);
|
23993
24389
|
};
|
23994
|
-
const emptyBlock = elm => {
|
23995
|
-
elm.innerHTML = '<br data-mce-bogus="1">';
|
23996
|
-
};
|
23997
24390
|
const containerAndSiblingName = (container, nodeName) => {
|
23998
24391
|
return container.nodeName === nodeName || container.previousSibling && container.previousSibling.nodeName === nodeName;
|
23999
24392
|
};
|
@@ -24027,64 +24420,30 @@
|
|
24027
24420
|
}
|
24028
24421
|
}
|
24029
24422
|
};
|
24030
|
-
const normalizeZwspOffset = (start, container, offset) => {
|
24031
|
-
if (!isText$a(container)) {
|
24032
|
-
return offset;
|
24033
|
-
} else if (start) {
|
24034
|
-
return offset === 1 && container.data.charAt(offset - 1) === ZWSP$1 ? 0 : offset;
|
24035
|
-
} else {
|
24036
|
-
return offset === container.data.length - 1 && container.data.charAt(offset) === ZWSP$1 ? container.data.length : offset;
|
24037
|
-
}
|
24038
|
-
};
|
24039
|
-
const includeZwspInRange = rng => {
|
24040
|
-
const newRng = rng.cloneRange();
|
24041
|
-
newRng.setStart(rng.startContainer, normalizeZwspOffset(true, rng.startContainer, rng.startOffset));
|
24042
|
-
newRng.setEnd(rng.endContainer, normalizeZwspOffset(false, rng.endContainer, rng.endOffset));
|
24043
|
-
return newRng;
|
24044
|
-
};
|
24045
|
-
const trimLeadingLineBreaks = node => {
|
24046
|
-
let currentNode = node;
|
24047
|
-
do {
|
24048
|
-
if (isText$a(currentNode)) {
|
24049
|
-
currentNode.data = currentNode.data.replace(/^[\r\n]+/, '');
|
24050
|
-
}
|
24051
|
-
currentNode = currentNode.firstChild;
|
24052
|
-
} while (currentNode);
|
24053
|
-
};
|
24054
|
-
const applyAttributes = (editor, node, forcedRootBlockAttrs) => {
|
24055
|
-
const dom = editor.dom;
|
24056
|
-
Optional.from(forcedRootBlockAttrs.style).map(dom.parseStyle).each(attrStyles => {
|
24057
|
-
const currentStyles = getAllRaw(SugarElement.fromDom(node));
|
24058
|
-
const newStyles = {
|
24059
|
-
...currentStyles,
|
24060
|
-
...attrStyles
|
24061
|
-
};
|
24062
|
-
dom.setStyles(node, newStyles);
|
24063
|
-
});
|
24064
|
-
const attrClassesOpt = Optional.from(forcedRootBlockAttrs.class).map(attrClasses => attrClasses.split(/\s+/));
|
24065
|
-
const currentClassesOpt = Optional.from(node.className).map(currentClasses => filter$5(currentClasses.split(/\s+/), clazz => clazz !== ''));
|
24066
|
-
lift2(attrClassesOpt, currentClassesOpt, (attrClasses, currentClasses) => {
|
24067
|
-
const filteredClasses = filter$5(currentClasses, clazz => !contains$2(attrClasses, clazz));
|
24068
|
-
const newClasses = [
|
24069
|
-
...attrClasses,
|
24070
|
-
...filteredClasses
|
24071
|
-
];
|
24072
|
-
dom.setAttrib(node, 'class', newClasses.join(' '));
|
24073
|
-
});
|
24074
|
-
const appliedAttrs = [
|
24075
|
-
'style',
|
24076
|
-
'class'
|
24077
|
-
];
|
24078
|
-
const remainingAttrs = filter$4(forcedRootBlockAttrs, (_, attrs) => !contains$2(appliedAttrs, attrs));
|
24079
|
-
dom.setAttribs(node, remainingAttrs);
|
24080
|
-
};
|
24081
|
-
const setForcedBlockAttrs = (editor, node) => {
|
24082
|
-
const forcedRootBlockName = getForcedRootBlock(editor);
|
24083
|
-
if (forcedRootBlockName.toLowerCase() === node.tagName.toLowerCase()) {
|
24084
|
-
const forcedRootBlockAttrs = getForcedRootBlockAttrs(editor);
|
24085
|
-
applyAttributes(editor, node, forcedRootBlockAttrs);
|
24423
|
+
const normalizeZwspOffset = (start, container, offset) => {
|
24424
|
+
if (!isText$a(container)) {
|
24425
|
+
return offset;
|
24426
|
+
} else if (start) {
|
24427
|
+
return offset === 1 && container.data.charAt(offset - 1) === ZWSP$1 ? 0 : offset;
|
24428
|
+
} else {
|
24429
|
+
return offset === container.data.length - 1 && container.data.charAt(offset) === ZWSP$1 ? container.data.length : offset;
|
24086
24430
|
}
|
24087
24431
|
};
|
24432
|
+
const includeZwspInRange = rng => {
|
24433
|
+
const newRng = rng.cloneRange();
|
24434
|
+
newRng.setStart(rng.startContainer, normalizeZwspOffset(true, rng.startContainer, rng.startOffset));
|
24435
|
+
newRng.setEnd(rng.endContainer, normalizeZwspOffset(false, rng.endContainer, rng.endOffset));
|
24436
|
+
return newRng;
|
24437
|
+
};
|
24438
|
+
const trimLeadingLineBreaks = node => {
|
24439
|
+
let currentNode = node;
|
24440
|
+
do {
|
24441
|
+
if (isText$a(currentNode)) {
|
24442
|
+
currentNode.data = currentNode.data.replace(/^[\r\n]+/, '');
|
24443
|
+
}
|
24444
|
+
currentNode = currentNode.firstChild;
|
24445
|
+
} while (currentNode);
|
24446
|
+
};
|
24088
24447
|
const wrapSelfAndSiblingsInDefaultBlock = (editor, newBlockName, rng, container, offset) => {
|
24089
24448
|
var _a, _b;
|
24090
24449
|
const dom = editor.dom;
|
@@ -24144,7 +24503,7 @@
|
|
24144
24503
|
return optionValue;
|
24145
24504
|
}
|
24146
24505
|
};
|
24147
|
-
const insert$
|
24506
|
+
const insert$3 = (editor, evt) => {
|
24148
24507
|
let container;
|
24149
24508
|
let offset;
|
24150
24509
|
let parentBlockName;
|
@@ -24154,45 +24513,12 @@
|
|
24154
24513
|
const schema = editor.schema, nonEmptyElementsMap = schema.getNonEmptyElements();
|
24155
24514
|
const rng = editor.selection.getRng();
|
24156
24515
|
const newBlockName = getForcedRootBlock(editor);
|
24157
|
-
const isInRoot = rng.collapsed && rng.startContainer === editor.dom.getRoot();
|
24158
24516
|
const start = SugarElement.fromDom(rng.startContainer);
|
24159
24517
|
const child = child$1(start, rng.startOffset);
|
24160
24518
|
const isCef = child.exists(element => isHTMLElement(element) && !isEditable$3(element));
|
24161
|
-
const
|
24162
|
-
const createNewBlock = name => {
|
24163
|
-
|
24164
|
-
const textInlineElements = schema.getTextInlineElements();
|
24165
|
-
let block;
|
24166
|
-
if (name || parentBlockName === 'TABLE' || parentBlockName === 'HR') {
|
24167
|
-
block = dom.create(name || newBlockName);
|
24168
|
-
} else {
|
24169
|
-
block = parentBlock.cloneNode(false);
|
24170
|
-
}
|
24171
|
-
let caretNode = block;
|
24172
|
-
if (shouldKeepStyles(editor) === false) {
|
24173
|
-
dom.setAttrib(block, 'style', null);
|
24174
|
-
dom.setAttrib(block, 'class', null);
|
24175
|
-
} else {
|
24176
|
-
do {
|
24177
|
-
if (textInlineElements[node.nodeName]) {
|
24178
|
-
if (isCaretNode(node) || isBookmarkNode$1(node)) {
|
24179
|
-
continue;
|
24180
|
-
}
|
24181
|
-
const clonedNode = node.cloneNode(false);
|
24182
|
-
dom.setAttrib(clonedNode, 'id', '');
|
24183
|
-
if (block.hasChildNodes()) {
|
24184
|
-
clonedNode.appendChild(block.firstChild);
|
24185
|
-
block.appendChild(clonedNode);
|
24186
|
-
} else {
|
24187
|
-
caretNode = clonedNode;
|
24188
|
-
block.appendChild(clonedNode);
|
24189
|
-
}
|
24190
|
-
}
|
24191
|
-
} while ((node = node.parentNode) && node !== editableRoot);
|
24192
|
-
}
|
24193
|
-
setForcedBlockAttrs(editor, block);
|
24194
|
-
emptyBlock(caretNode);
|
24195
|
-
return block;
|
24519
|
+
const collapsedAndCef = rng.collapsed && isCef;
|
24520
|
+
const createNewBlock$1 = name => {
|
24521
|
+
return createNewBlock(editor, container, parentBlock, editableRoot, shouldKeepStyles(editor), name);
|
24196
24522
|
};
|
24197
24523
|
const isCaretAtStartOrEndOfBlock = start => {
|
24198
24524
|
const normalizedOffset = normalizeZwspOffset(start, container, offset);
|
@@ -24239,9 +24565,9 @@
|
|
24239
24565
|
const insertNewBlockAfter = () => {
|
24240
24566
|
let block;
|
24241
24567
|
if (/^(H[1-6]|PRE|FIGURE)$/.test(parentBlockName) && containerBlockName !== 'HGROUP') {
|
24242
|
-
block = createNewBlock(newBlockName);
|
24568
|
+
block = createNewBlock$1(newBlockName);
|
24243
24569
|
} else {
|
24244
|
-
block = createNewBlock();
|
24570
|
+
block = createNewBlock$1();
|
24245
24571
|
}
|
24246
24572
|
if (shouldEndContainer(editor, containerBlock) && canSplitBlock(dom, containerBlock) && dom.isEmpty(parentBlock, undefined, { includeZwsp: true })) {
|
24247
24573
|
block = dom.split(containerBlock, parentBlock);
|
@@ -24259,7 +24585,7 @@
|
|
24259
24585
|
offset = rng.startOffset;
|
24260
24586
|
const shiftKey = !!(evt && evt.shiftKey);
|
24261
24587
|
const ctrlKey = !!(evt && evt.ctrlKey);
|
24262
|
-
if (isElement$6(container) && container.hasChildNodes() && !
|
24588
|
+
if (isElement$6(container) && container.hasChildNodes() && !collapsedAndCef) {
|
24263
24589
|
isAfterLastNodeInContainer = offset > container.childNodes.length - 1;
|
24264
24590
|
container = container.childNodes[Math.min(offset, container.childNodes.length - 1)] || container;
|
24265
24591
|
if (isAfterLastNodeInContainer && isText$a(container)) {
|
@@ -24286,21 +24612,21 @@
|
|
24286
24612
|
parentBlockName = containerBlockName;
|
24287
24613
|
}
|
24288
24614
|
if (isElement$6(containerBlock) && isLastEmptyBlockInDetails(editor, shiftKey, parentBlock)) {
|
24289
|
-
return insertNewLine(editor, createNewBlock, parentBlock);
|
24615
|
+
return insertNewLine(editor, createNewBlock$1, parentBlock);
|
24290
24616
|
}
|
24291
24617
|
if (/^(LI|DT|DD)$/.test(parentBlockName) && isElement$6(containerBlock)) {
|
24292
24618
|
if (dom.isEmpty(parentBlock)) {
|
24293
|
-
insert$
|
24619
|
+
insert$4(editor, createNewBlock$1, containerBlock, parentBlock, newBlockName);
|
24294
24620
|
return;
|
24295
24621
|
}
|
24296
24622
|
}
|
24297
|
-
if (!
|
24623
|
+
if (!collapsedAndCef && (parentBlock === editor.getBody() || !canSplitBlock(dom, parentBlock))) {
|
24298
24624
|
return;
|
24299
24625
|
}
|
24300
24626
|
const parentBlockParent = parentBlock.parentNode;
|
24301
24627
|
let newBlock;
|
24302
|
-
if (
|
24303
|
-
newBlock = createNewBlock(newBlockName);
|
24628
|
+
if (collapsedAndCef) {
|
24629
|
+
newBlock = createNewBlock$1(newBlockName);
|
24304
24630
|
child.fold(() => {
|
24305
24631
|
append$1(start, SugarElement.fromDom(newBlock));
|
24306
24632
|
}, child => {
|
@@ -24317,7 +24643,7 @@
|
|
24317
24643
|
} else if (isCaretAtStartOrEndOfBlock(false)) {
|
24318
24644
|
newBlock = insertNewBlockAfter();
|
24319
24645
|
} else if (isCaretAtStartOrEndOfBlock(true) && parentBlockParent) {
|
24320
|
-
newBlock = parentBlockParent.insertBefore(createNewBlock(), parentBlock);
|
24646
|
+
newBlock = parentBlockParent.insertBefore(createNewBlock$1(), parentBlock);
|
24321
24647
|
const isNearChildren = hasChildNodes(SugarElement.fromDom(rng.startContainer)) && rng.collapsed;
|
24322
24648
|
moveToCaretPosition(editor, containerAndSiblingName(parentBlock, 'HR') || isNearChildren ? newBlock : parentBlock);
|
24323
24649
|
} else {
|
@@ -24347,7 +24673,7 @@
|
|
24347
24673
|
};
|
24348
24674
|
const fakeEventName$1 = 'insertParagraph';
|
24349
24675
|
const blockbreak = {
|
24350
|
-
insert: insert$
|
24676
|
+
insert: insert$3,
|
24351
24677
|
fakeEventName: fakeEventName$1
|
24352
24678
|
};
|
24353
24679
|
|
@@ -24456,7 +24782,7 @@
|
|
24456
24782
|
const insertBrOutsideAnchor = (editor, location) => {
|
24457
24783
|
location.fold(noop, curry(insertBrBefore, editor), curry(insertBrAfter, editor), noop);
|
24458
24784
|
};
|
24459
|
-
const insert$
|
24785
|
+
const insert$2 = (editor, evt) => {
|
24460
24786
|
const anchorLocation = readInlineAnchorLocation(editor);
|
24461
24787
|
if (anchorLocation.isSome()) {
|
24462
24788
|
anchorLocation.each(curry(insertBrOutsideAnchor, editor));
|
@@ -24466,7 +24792,7 @@
|
|
24466
24792
|
};
|
24467
24793
|
const fakeEventName = 'insertLineBreak';
|
24468
24794
|
const linebreak = {
|
24469
|
-
insert: insert$
|
24795
|
+
insert: insert$2,
|
24470
24796
|
fakeEventName
|
24471
24797
|
};
|
24472
24798
|
|
@@ -24523,11 +24849,10 @@
|
|
24523
24849
|
};
|
24524
24850
|
const isInRootWithEmptyOrCEF = editor => {
|
24525
24851
|
const rng = editor.selection.getRng();
|
24526
|
-
const isInRoot = rng.collapsed && rng.startContainer === editor.dom.getRoot();
|
24527
24852
|
const start = SugarElement.fromDom(rng.startContainer);
|
24528
24853
|
const child = child$1(start, rng.startOffset);
|
24529
24854
|
const isCefOpt = child.map(element => isHTMLElement(element) && !isEditable$3(element));
|
24530
|
-
return
|
24855
|
+
return rng.collapsed && isCefOpt.getOr(true);
|
24531
24856
|
};
|
24532
24857
|
const match = (predicates, action) => {
|
24533
24858
|
return (editor, shiftKey) => {
|
@@ -24593,7 +24918,7 @@
|
|
24593
24918
|
fireInputEvent(editor, breakType.fakeEventName);
|
24594
24919
|
}
|
24595
24920
|
};
|
24596
|
-
const insert = (editor, evt) => {
|
24921
|
+
const insert$1 = (editor, evt) => {
|
24597
24922
|
const br = () => insertBreak(linebreak, editor, evt);
|
24598
24923
|
const block = () => insertBreak(blockbreak, editor, evt);
|
24599
24924
|
const logicalAction = getAction(editor, evt);
|
@@ -24613,8 +24938,8 @@
|
|
24613
24938
|
}
|
24614
24939
|
};
|
24615
24940
|
|
24616
|
-
const platform$
|
24617
|
-
const isIOSSafari = platform$
|
24941
|
+
const platform$1 = detect$2();
|
24942
|
+
const isIOSSafari = platform$1.os.isiOS() && platform$1.browser.isSafari();
|
24618
24943
|
const handleEnterKeyEvent = (editor, event) => {
|
24619
24944
|
if (event.isDefaultPrevented()) {
|
24620
24945
|
return;
|
@@ -24622,7 +24947,7 @@
|
|
24622
24947
|
event.preventDefault();
|
24623
24948
|
endTypingLevelIgnoreLocks(editor.undoManager);
|
24624
24949
|
editor.undoManager.transact(() => {
|
24625
|
-
insert(editor, event);
|
24950
|
+
insert$1(editor, event);
|
24626
24951
|
});
|
24627
24952
|
};
|
24628
24953
|
const isCaretAfterKoreanCharacter = rng => {
|
@@ -24727,7 +25052,7 @@
|
|
24727
25052
|
});
|
24728
25053
|
};
|
24729
25054
|
|
24730
|
-
const platform
|
25055
|
+
const platform = detect$2();
|
24731
25056
|
const executeKeyupAction = (editor, caret, evt) => {
|
24732
25057
|
execute([
|
24733
25058
|
{
|
@@ -24751,7 +25076,7 @@
|
|
24751
25076
|
blocked.set(block);
|
24752
25077
|
};
|
24753
25078
|
const setup$e = (editor, caret) => {
|
24754
|
-
if (platform
|
25079
|
+
if (platform.os.isMacOS()) {
|
24755
25080
|
return;
|
24756
25081
|
}
|
24757
25082
|
const blocked = Cell(false);
|
@@ -25781,15 +26106,34 @@
|
|
25781
26106
|
}
|
25782
26107
|
};
|
25783
26108
|
const hasImage = dataTransfer => exists(dataTransfer.files, file => /^image\//.test(file.type));
|
25784
|
-
const
|
26109
|
+
const needsCustomInternalDrop = (dom, schema, target, dropContent) => {
|
25785
26110
|
const parentTransparent = dom.getParent(target, node => isTransparentBlock(schema, node));
|
25786
|
-
|
26111
|
+
const inSummary = !isNull(dom.getParent(target, 'summary'));
|
26112
|
+
if (inSummary) {
|
26113
|
+
return true;
|
26114
|
+
} else if (parentTransparent && has$2(dropContent, 'text/html')) {
|
25787
26115
|
const fragment = new DOMParser().parseFromString(dropContent['text/html'], 'text/html').body;
|
25788
26116
|
return !isNull(fragment.querySelector(parentTransparent.nodeName.toLowerCase()));
|
25789
26117
|
} else {
|
25790
26118
|
return false;
|
25791
26119
|
}
|
25792
26120
|
};
|
26121
|
+
const setupSummaryDeleteByDragFix = editor => {
|
26122
|
+
editor.on('input', e => {
|
26123
|
+
const hasNoSummary = el => isNull(el.querySelector('summary'));
|
26124
|
+
if (e.inputType === 'deleteByDrag') {
|
26125
|
+
const brokenDetailElements = filter$5(editor.dom.select('details'), hasNoSummary);
|
26126
|
+
each$e(brokenDetailElements, details => {
|
26127
|
+
if (isBr$6(details.firstChild)) {
|
26128
|
+
details.firstChild.remove();
|
26129
|
+
}
|
26130
|
+
const summary = editor.dom.create('summary');
|
26131
|
+
summary.appendChild(createPaddingBr().dom);
|
26132
|
+
details.prepend(summary);
|
26133
|
+
});
|
26134
|
+
}
|
26135
|
+
});
|
26136
|
+
};
|
25793
26137
|
const setup$a = (editor, draggingInternallyState) => {
|
25794
26138
|
if (shouldPasteBlockDrop(editor)) {
|
25795
26139
|
editor.on('dragend dragover draggesture dragdrop drop drag', e => {
|
@@ -25820,15 +26164,16 @@
|
|
25820
26164
|
}
|
25821
26165
|
const internalContent = dropContent[internalHtmlMime()];
|
25822
26166
|
const content = internalContent || dropContent['text/html'] || dropContent['text/plain'];
|
25823
|
-
const
|
25824
|
-
|
26167
|
+
const needsInternalDrop = needsCustomInternalDrop(editor.dom, editor.schema, rng.startContainer, dropContent);
|
26168
|
+
const isInternalDrop = draggingInternallyState.get();
|
26169
|
+
if (isInternalDrop && !needsInternalDrop) {
|
25825
26170
|
return;
|
25826
26171
|
}
|
25827
26172
|
if (content) {
|
25828
26173
|
e.preventDefault();
|
25829
26174
|
Delay.setEditorTimeout(editor, () => {
|
25830
26175
|
editor.undoManager.transact(() => {
|
25831
|
-
if (internalContent) {
|
26176
|
+
if (internalContent || isInternalDrop && needsInternalDrop) {
|
25832
26177
|
editor.execCommand('Delete');
|
25833
26178
|
}
|
25834
26179
|
setFocusedRange(editor, rng);
|
@@ -25854,6 +26199,7 @@
|
|
25854
26199
|
draggingInternallyState.set(false);
|
25855
26200
|
}
|
25856
26201
|
});
|
26202
|
+
setupSummaryDeleteByDragFix(editor);
|
25857
26203
|
};
|
25858
26204
|
|
25859
26205
|
const setup$9 = editor => {
|
@@ -25963,197 +26309,9 @@
|
|
25963
26309
|
});
|
25964
26310
|
});
|
25965
26311
|
};
|
25966
|
-
const emptyNodeContents = node => fillWithPaddingBr(SugarElement.fromDom(node));
|
25967
|
-
const setCaretToPosition = (editor, position) => {
|
25968
|
-
const node = position.getNode();
|
25969
|
-
if (!isUndefined(node)) {
|
25970
|
-
editor.selection.setCursorLocation(node, position.offset());
|
25971
|
-
}
|
25972
|
-
};
|
25973
|
-
const isEntireNodeSelected = (rng, node) => {
|
25974
|
-
var _a;
|
25975
|
-
return rng.startOffset === 0 && rng.endOffset === ((_a = node.textContent) === null || _a === void 0 ? void 0 : _a.length);
|
25976
|
-
};
|
25977
|
-
const platform = detect$2();
|
25978
|
-
const browser = platform.browser;
|
25979
|
-
const os = platform.os;
|
25980
|
-
const isSafari = browser.isSafari();
|
25981
|
-
const isMacOSOriOS = os.isMacOS() || os.isiOS();
|
25982
|
-
const isCaretInTheBeginningOf = (caretPos, element) => firstPositionIn(element).exists(pos => pos.isEqual(caretPos));
|
25983
|
-
const isCaretInTheEndOf = (caretPos, element) => {
|
25984
|
-
return lastPositionIn(element).exists(pos => {
|
25985
|
-
if (isBr$6(pos.getNode())) {
|
25986
|
-
return prevPosition(element, pos).exists(pos2 => pos2.isEqual(caretPos)) || pos.isEqual(caretPos);
|
25987
|
-
} else {
|
25988
|
-
return pos.isEqual(caretPos);
|
25989
|
-
}
|
25990
|
-
});
|
25991
|
-
};
|
25992
|
-
const getDetailsElements = (dom, rng) => {
|
25993
|
-
const startDetails = Optional.from(dom.getParent(rng.startContainer, 'details'));
|
25994
|
-
const endDetails = Optional.from(dom.getParent(rng.endContainer, 'details'));
|
25995
|
-
if (startDetails.isSome() || endDetails.isSome()) {
|
25996
|
-
const startSummary = startDetails.bind(details => Optional.from(dom.select('summary', details)[0]));
|
25997
|
-
return Optional.some({
|
25998
|
-
startSummary,
|
25999
|
-
startDetails,
|
26000
|
-
endDetails
|
26001
|
-
});
|
26002
|
-
} else {
|
26003
|
-
return Optional.none();
|
26004
|
-
}
|
26005
|
-
};
|
26006
|
-
const isPartialDelete = (rng, detailsElements) => {
|
26007
|
-
const containsStart = element => element.contains(rng.startContainer);
|
26008
|
-
const containsEnd = element => element.contains(rng.endContainer);
|
26009
|
-
const startInSummary = detailsElements.startSummary.exists(containsStart);
|
26010
|
-
const endInSummary = detailsElements.startSummary.exists(containsEnd);
|
26011
|
-
const isPartiallySelectedDetailsElements = detailsElements.startDetails.forall(startDetails => detailsElements.endDetails.forall(endDetails => startDetails !== endDetails));
|
26012
|
-
const isInPartiallySelectedSummary = (startInSummary || endInSummary) && !(startInSummary && endInSummary);
|
26013
|
-
return isInPartiallySelectedSummary || isPartiallySelectedDetailsElements;
|
26014
|
-
};
|
26015
|
-
const isCaretAtStartOfSummary = (caretPos, detailsElements) => detailsElements.startSummary.exists(summary => isCaretInTheBeginningOf(caretPos, summary));
|
26016
|
-
const isCaretAtEndOfSummary = (caretPos, detailsElements) => detailsElements.startSummary.exists(summary => isCaretInTheEndOf(caretPos, summary));
|
26017
|
-
const isCaretInFirstPositionInBody = (caretPos, detailsElements) => detailsElements.startDetails.exists(details => prevPosition(details, caretPos).forall(pos => detailsElements.startSummary.exists(summary => !summary.contains(caretPos.container()) && summary.contains(pos.container()))));
|
26018
|
-
const isCaretInLastPositionInBody = (root, caretPos, detailsElements) => detailsElements.startDetails.exists(details => nextPosition(root, caretPos).forall(pos => !details.contains(pos.container())));
|
26019
|
-
const isInDetailsElement = (dom, pos) => isNonNullable(dom.getParent(pos.container(), 'details'));
|
26020
|
-
const moveCaretToDetailsPos = (editor, pos) => {
|
26021
|
-
const details = editor.dom.getParent(pos.container(), 'details');
|
26022
|
-
if (details && !details.open) {
|
26023
|
-
const summary = editor.dom.select('summary', details)[0];
|
26024
|
-
if (summary) {
|
26025
|
-
lastPositionIn(summary).each(pos => setCaretToPosition(editor, pos));
|
26026
|
-
}
|
26027
|
-
} else {
|
26028
|
-
setCaretToPosition(editor, pos);
|
26029
|
-
}
|
26030
|
-
};
|
26031
|
-
const preventDeleteIntoDetails = (editor, forward) => {
|
26032
|
-
const {dom, selection} = editor;
|
26033
|
-
const root = editor.getBody();
|
26034
|
-
if (editor.selection.isCollapsed()) {
|
26035
|
-
const caretPos = CaretPosition.fromRangeStart(selection.getRng());
|
26036
|
-
const parentBlock = dom.getParent(caretPos.container(), dom.isBlock);
|
26037
|
-
if (parentBlock && dom.isEmpty(parentBlock)) {
|
26038
|
-
if (isNull(parentBlock.nextSibling)) {
|
26039
|
-
const pos = prevPosition(root, caretPos).filter(pos => isInDetailsElement(dom, pos));
|
26040
|
-
if (pos.isSome()) {
|
26041
|
-
pos.each(pos => {
|
26042
|
-
if (!forward) {
|
26043
|
-
moveCaretToDetailsPos(editor, pos);
|
26044
|
-
}
|
26045
|
-
});
|
26046
|
-
return true;
|
26047
|
-
}
|
26048
|
-
} else if (isNull(parentBlock.previousSibling)) {
|
26049
|
-
const pos = nextPosition(root, caretPos).filter(pos => isInDetailsElement(dom, pos));
|
26050
|
-
if (pos) {
|
26051
|
-
return true;
|
26052
|
-
}
|
26053
|
-
}
|
26054
|
-
}
|
26055
|
-
return navigate(forward, root, caretPos).fold(never, pos => {
|
26056
|
-
if (isInDetailsElement(dom, pos)) {
|
26057
|
-
if (parentBlock && dom.isEmpty(parentBlock)) {
|
26058
|
-
editor.dom.remove(parentBlock);
|
26059
|
-
}
|
26060
|
-
if (!forward) {
|
26061
|
-
moveCaretToDetailsPos(editor, pos);
|
26062
|
-
}
|
26063
|
-
return true;
|
26064
|
-
} else {
|
26065
|
-
return false;
|
26066
|
-
}
|
26067
|
-
});
|
26068
|
-
} else {
|
26069
|
-
return false;
|
26070
|
-
}
|
26071
|
-
};
|
26072
|
-
const preventDeleteSummaryAction = (editor, detailElements, e) => {
|
26073
|
-
const selection = editor.selection;
|
26074
|
-
const node = selection.getNode();
|
26075
|
-
const rng = selection.getRng();
|
26076
|
-
const isBackspace = e.keyCode === VK.BACKSPACE;
|
26077
|
-
const isDelete = e.keyCode === VK.DELETE;
|
26078
|
-
const isCollapsed = editor.selection.isCollapsed();
|
26079
|
-
const caretPos = CaretPosition.fromRangeStart(rng);
|
26080
|
-
const root = editor.getBody();
|
26081
|
-
if (!isCollapsed && isPartialDelete(rng, detailElements)) {
|
26082
|
-
return true;
|
26083
|
-
} else if (isCollapsed && isBackspace && isCaretAtStartOfSummary(caretPos, detailElements)) {
|
26084
|
-
return true;
|
26085
|
-
} else if (isCollapsed && isDelete && isCaretAtEndOfSummary(caretPos, detailElements)) {
|
26086
|
-
return true;
|
26087
|
-
} else if (isCollapsed && isBackspace && isCaretInFirstPositionInBody(caretPos, detailElements)) {
|
26088
|
-
return true;
|
26089
|
-
} else if (isCollapsed && isDelete && isCaretInLastPositionInBody(root, caretPos, detailElements)) {
|
26090
|
-
return true;
|
26091
|
-
} else if (isSafari && isSummary(node)) {
|
26092
|
-
if (!isCollapsed && isEntireNodeSelected(rng, node) || willDeleteLastPositionInElement(isDelete, caretPos, node)) {
|
26093
|
-
emptyNodeContents(node);
|
26094
|
-
} else {
|
26095
|
-
editor.undoManager.transact(() => {
|
26096
|
-
const sel = selection.getSel();
|
26097
|
-
let {anchorNode, anchorOffset, focusNode, focusOffset} = sel !== null && sel !== void 0 ? sel : {};
|
26098
|
-
const applySelection = () => {
|
26099
|
-
if (isNonNullable(anchorNode) && isNonNullable(anchorOffset) && isNonNullable(focusNode) && isNonNullable(focusOffset)) {
|
26100
|
-
sel === null || sel === void 0 ? void 0 : sel.setBaseAndExtent(anchorNode, anchorOffset, focusNode, focusOffset);
|
26101
|
-
}
|
26102
|
-
};
|
26103
|
-
const updateSelection = () => {
|
26104
|
-
anchorNode = sel === null || sel === void 0 ? void 0 : sel.anchorNode;
|
26105
|
-
anchorOffset = sel === null || sel === void 0 ? void 0 : sel.anchorOffset;
|
26106
|
-
focusNode = sel === null || sel === void 0 ? void 0 : sel.focusNode;
|
26107
|
-
focusOffset = sel === null || sel === void 0 ? void 0 : sel.focusOffset;
|
26108
|
-
};
|
26109
|
-
const appendAllChildNodes = (from, to) => {
|
26110
|
-
each$e(from.childNodes, child => {
|
26111
|
-
if (isNode(child)) {
|
26112
|
-
to.appendChild(child);
|
26113
|
-
}
|
26114
|
-
});
|
26115
|
-
};
|
26116
|
-
const container = editor.dom.create('span', { 'data-mce-bogus': 'all' });
|
26117
|
-
appendAllChildNodes(node, container);
|
26118
|
-
node.appendChild(container);
|
26119
|
-
applySelection();
|
26120
|
-
if (isCollapsed && (isMacOSOriOS && (e.altKey || isBackspace && e.metaKey) || !isMacOSOriOS && e.ctrlKey)) {
|
26121
|
-
sel === null || sel === void 0 ? void 0 : sel.modify('extend', isBackspace ? 'left' : 'right', e.metaKey ? 'line' : 'word');
|
26122
|
-
}
|
26123
|
-
if (!selection.isCollapsed() && isEntireNodeSelected(selection.getRng(), container)) {
|
26124
|
-
emptyNodeContents(node);
|
26125
|
-
} else {
|
26126
|
-
editor.execCommand(isBackspace ? 'Delete' : 'ForwardDelete');
|
26127
|
-
updateSelection();
|
26128
|
-
appendAllChildNodes(container, node);
|
26129
|
-
applySelection();
|
26130
|
-
}
|
26131
|
-
editor.dom.remove(container);
|
26132
|
-
});
|
26133
|
-
}
|
26134
|
-
return true;
|
26135
|
-
}
|
26136
|
-
return false;
|
26137
|
-
};
|
26138
|
-
const preventDeletingSummary = editor => {
|
26139
|
-
editor.on('keydown', e => {
|
26140
|
-
if (e.keyCode === VK.BACKSPACE || e.keyCode === VK.DELETE) {
|
26141
|
-
getDetailsElements(editor.dom, editor.selection.getRng()).fold(() => {
|
26142
|
-
if (preventDeleteIntoDetails(editor, e.keyCode === VK.DELETE)) {
|
26143
|
-
e.preventDefault();
|
26144
|
-
}
|
26145
|
-
}, detailsElements => {
|
26146
|
-
if (preventDeleteSummaryAction(editor, detailsElements, e)) {
|
26147
|
-
e.preventDefault();
|
26148
|
-
}
|
26149
|
-
});
|
26150
|
-
}
|
26151
|
-
});
|
26152
|
-
};
|
26153
26312
|
const setup$6 = editor => {
|
26154
26313
|
preventSummaryToggle(editor);
|
26155
26314
|
filterDetails(editor);
|
26156
|
-
preventDeletingSummary(editor);
|
26157
26315
|
};
|
26158
26316
|
|
26159
26317
|
const isBr = isBr$6;
|
@@ -27130,7 +27288,7 @@
|
|
27130
27288
|
const cleanEmptyNodes = (dom, node, isRoot) => {
|
27131
27289
|
if (node && dom.isEmpty(node) && !isRoot(node)) {
|
27132
27290
|
const parent = node.parentNode;
|
27133
|
-
dom.remove(node);
|
27291
|
+
dom.remove(node, isText$a(node.firstChild) && isWhitespaceText(node.firstChild.data));
|
27134
27292
|
cleanEmptyNodes(dom, parent, isRoot);
|
27135
27293
|
}
|
27136
27294
|
};
|
@@ -27622,12 +27780,17 @@
|
|
27622
27780
|
const allSelection = serializeRng(allRng);
|
27623
27781
|
return selection === allSelection;
|
27624
27782
|
};
|
27783
|
+
const hasPreservedEmptyElements = elm => {
|
27784
|
+
const scope = SugarElement.fromDom(elm);
|
27785
|
+
const isEditableHost = elm => parentElement(elm).exists(elm => !isEditable$3(elm));
|
27786
|
+
return exists(descendants(scope, '[contenteditable="true"]'), isEditableHost);
|
27787
|
+
};
|
27625
27788
|
editor.on('keydown', e => {
|
27626
27789
|
const keyCode = e.keyCode;
|
27627
27790
|
if (!isDefaultPrevented(e) && (keyCode === DELETE || keyCode === BACKSPACE) && editor.selection.isEditable()) {
|
27628
27791
|
const isCollapsed = editor.selection.isCollapsed();
|
27629
27792
|
const body = editor.getBody();
|
27630
|
-
if (isCollapsed && !dom.isEmpty(body)) {
|
27793
|
+
if (isCollapsed && (!dom.isEmpty(body) || hasPreservedEmptyElements(body))) {
|
27631
27794
|
return;
|
27632
27795
|
}
|
27633
27796
|
if (!isCollapsed && !allContentsSelected(editor.selection.getRng())) {
|
@@ -28252,6 +28415,19 @@
|
|
28252
28415
|
initEditor(editor);
|
28253
28416
|
}
|
28254
28417
|
};
|
28418
|
+
const startProgress = editor => {
|
28419
|
+
let canceled = false;
|
28420
|
+
const progressTimeout = setTimeout(() => {
|
28421
|
+
if (!canceled) {
|
28422
|
+
editor.setProgressState(true);
|
28423
|
+
}
|
28424
|
+
}, 500);
|
28425
|
+
return () => {
|
28426
|
+
clearTimeout(progressTimeout);
|
28427
|
+
canceled = true;
|
28428
|
+
editor.setProgressState(false);
|
28429
|
+
};
|
28430
|
+
};
|
28255
28431
|
const contentBodyLoaded = editor => {
|
28256
28432
|
const targetElm = editor.getElement();
|
28257
28433
|
let doc = editor.getDoc();
|
@@ -28312,7 +28488,11 @@
|
|
28312
28488
|
const setupRtcThunk = setup$s(editor);
|
28313
28489
|
preInit(editor);
|
28314
28490
|
setupRtcThunk.fold(() => {
|
28315
|
-
|
28491
|
+
const cancelProgress = startProgress(editor);
|
28492
|
+
loadContentCss(editor).then(() => {
|
28493
|
+
initEditorWithInitialContent(editor);
|
28494
|
+
cancelProgress();
|
28495
|
+
});
|
28316
28496
|
}, setupRtc => {
|
28317
28497
|
editor.setProgressState(true);
|
28318
28498
|
loadContentCss(editor).then(() => {
|
@@ -28870,12 +29050,12 @@
|
|
28870
29050
|
JustifyFull: alignStates('alignjustify')
|
28871
29051
|
}, 'state');
|
28872
29052
|
};
|
28873
|
-
const registerCommands$
|
29053
|
+
const registerCommands$b = editor => {
|
28874
29054
|
registerExecCommands$3(editor);
|
28875
29055
|
registerQueryStateCommands$1(editor);
|
28876
29056
|
};
|
28877
29057
|
|
28878
|
-
const registerCommands$
|
29058
|
+
const registerCommands$a = editor => {
|
28879
29059
|
editor.editorCommands.addCommands({
|
28880
29060
|
'Cut,Copy,Paste': command => {
|
28881
29061
|
const doc = editor.getDoc();
|
@@ -28959,7 +29139,7 @@
|
|
28959
29139
|
}
|
28960
29140
|
};
|
28961
29141
|
|
28962
|
-
const registerCommands$
|
29142
|
+
const registerCommands$9 = editor => {
|
28963
29143
|
editor.editorCommands.addCommands({
|
28964
29144
|
mceCleanup: () => {
|
28965
29145
|
const bm = editor.selection.getBookmark();
|
@@ -29137,12 +29317,12 @@
|
|
29137
29317
|
editor.editorCommands.addQueryValueHandler('FontSize', () => fontSizeQuery(editor));
|
29138
29318
|
editor.editorCommands.addQueryValueHandler('LineHeight', () => lineHeightQuery(editor));
|
29139
29319
|
};
|
29140
|
-
const registerCommands$
|
29320
|
+
const registerCommands$8 = editor => {
|
29141
29321
|
registerExecCommands$2(editor);
|
29142
29322
|
registerQueryValueCommands(editor);
|
29143
29323
|
};
|
29144
29324
|
|
29145
|
-
const registerCommands$
|
29325
|
+
const registerCommands$7 = editor => {
|
29146
29326
|
editor.editorCommands.addCommands({
|
29147
29327
|
mceAddUndoLevel: () => {
|
29148
29328
|
editor.undoManager.add();
|
@@ -29159,7 +29339,7 @@
|
|
29159
29339
|
});
|
29160
29340
|
};
|
29161
29341
|
|
29162
|
-
const registerCommands$
|
29342
|
+
const registerCommands$6 = editor => {
|
29163
29343
|
editor.editorCommands.addCommands({
|
29164
29344
|
Indent: () => {
|
29165
29345
|
indent(editor);
|
@@ -29171,7 +29351,7 @@
|
|
29171
29351
|
editor.editorCommands.addCommands({ Outdent: () => canOutdent(editor) }, 'state');
|
29172
29352
|
};
|
29173
29353
|
|
29174
|
-
const registerCommands$
|
29354
|
+
const registerCommands$5 = editor => {
|
29175
29355
|
const applyLinkToSelection = (_command, _ui, value) => {
|
29176
29356
|
const linkDetails = isString(value) ? { href: value } : value;
|
29177
29357
|
const anchor = editor.dom.getParent(editor.selection.getNode(), 'a');
|
@@ -29227,18 +29407,57 @@
|
|
29227
29407
|
}
|
29228
29408
|
}, 'state');
|
29229
29409
|
};
|
29230
|
-
const registerCommands$
|
29410
|
+
const registerCommands$4 = editor => {
|
29231
29411
|
registerExecCommands$1(editor);
|
29232
29412
|
registerQueryStateCommands(editor);
|
29233
29413
|
};
|
29234
29414
|
|
29415
|
+
const getTopParentBlock = (editor, node, root, container) => {
|
29416
|
+
const dom = editor.dom;
|
29417
|
+
const selector = node => dom.isBlock(node) && node.parentElement === root;
|
29418
|
+
const topParentBlock = selector(node) ? node : dom.getParent(container, selector, root);
|
29419
|
+
return Optional.from(topParentBlock).map(SugarElement.fromDom);
|
29420
|
+
};
|
29421
|
+
const insert = (editor, before) => {
|
29422
|
+
const dom = editor.dom;
|
29423
|
+
const rng = editor.selection.getRng();
|
29424
|
+
const node = before ? editor.selection.getStart() : editor.selection.getEnd();
|
29425
|
+
const container = before ? rng.startContainer : rng.endContainer;
|
29426
|
+
const root = getEditableRoot(dom, container);
|
29427
|
+
if (!root || !root.isContentEditable) {
|
29428
|
+
return;
|
29429
|
+
}
|
29430
|
+
const insertFn = before ? before$3 : after$4;
|
29431
|
+
const newBlockName = getForcedRootBlock(editor);
|
29432
|
+
getTopParentBlock(editor, node, root, container).each(parentBlock => {
|
29433
|
+
const newBlock = createNewBlock(editor, container, parentBlock.dom, root, false, newBlockName);
|
29434
|
+
insertFn(parentBlock, SugarElement.fromDom(newBlock));
|
29435
|
+
editor.selection.setCursorLocation(newBlock, 0);
|
29436
|
+
editor.dispatch('NewBlock', { newBlock });
|
29437
|
+
fireInputEvent(editor, 'insertParagraph');
|
29438
|
+
});
|
29439
|
+
};
|
29440
|
+
const insertBefore = editor => insert(editor, true);
|
29441
|
+
const insertAfter = editor => insert(editor, false);
|
29442
|
+
|
29443
|
+
const registerCommands$3 = editor => {
|
29444
|
+
editor.editorCommands.addCommands({
|
29445
|
+
InsertNewBlockBefore: () => {
|
29446
|
+
insertBefore(editor);
|
29447
|
+
},
|
29448
|
+
InsertNewBlockAfter: () => {
|
29449
|
+
insertAfter(editor);
|
29450
|
+
}
|
29451
|
+
});
|
29452
|
+
};
|
29453
|
+
|
29235
29454
|
const registerCommands$2 = editor => {
|
29236
29455
|
editor.editorCommands.addCommands({
|
29237
29456
|
insertParagraph: () => {
|
29238
29457
|
insertBreak(blockbreak, editor);
|
29239
29458
|
},
|
29240
29459
|
mceInsertNewLine: (_command, _ui, value) => {
|
29241
|
-
insert(editor, value);
|
29460
|
+
insert$1(editor, value);
|
29242
29461
|
},
|
29243
29462
|
InsertLineBreak: (_command, _ui, _value) => {
|
29244
29463
|
insertBreak(linebreak, editor);
|
@@ -29296,16 +29515,17 @@
|
|
29296
29515
|
});
|
29297
29516
|
};
|
29298
29517
|
const registerCommands = editor => {
|
29518
|
+
registerCommands$b(editor);
|
29299
29519
|
registerCommands$a(editor);
|
29300
|
-
registerCommands$
|
29301
|
-
registerCommands$6(editor);
|
29520
|
+
registerCommands$7(editor);
|
29302
29521
|
registerCommands$1(editor);
|
29303
|
-
registerCommands$
|
29304
|
-
registerCommands$4(editor);
|
29522
|
+
registerCommands$9(editor);
|
29305
29523
|
registerCommands$5(editor);
|
29306
|
-
registerCommands$
|
29524
|
+
registerCommands$6(editor);
|
29307
29525
|
registerCommands$3(editor);
|
29308
|
-
registerCommands$
|
29526
|
+
registerCommands$2(editor);
|
29527
|
+
registerCommands$4(editor);
|
29528
|
+
registerCommands$8(editor);
|
29309
29529
|
registerExecCommands(editor);
|
29310
29530
|
};
|
29311
29531
|
|
@@ -30694,8 +30914,8 @@
|
|
30694
30914
|
documentBaseURL: null,
|
30695
30915
|
suffix: null,
|
30696
30916
|
majorVersion: '6',
|
30697
|
-
minorVersion: '
|
30698
|
-
releaseDate: '2023-08-
|
30917
|
+
minorVersion: '7.0',
|
30918
|
+
releaseDate: '2023-08-30',
|
30699
30919
|
i18n: I18n,
|
30700
30920
|
activeEditor: null,
|
30701
30921
|
focusedEditor: null,
|