tinymce-rails 4.9.4 → 4.9.11

Sign up to get free protection for your applications and to get access to all the features.
Files changed (25) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/source/tinymce/tinymce.js +1700 -1089
  3. data/lib/tinymce/rails/configuration.rb +1 -1
  4. data/lib/tinymce/rails/engine.rb +5 -1
  5. data/lib/tinymce/rails/helper.rb +1 -1
  6. data/lib/tinymce/rails/version.rb +2 -2
  7. data/vendor/assets/config/tinymce-rails.manifest.js +8 -0
  8. data/vendor/assets/javascripts/tinymce/plugins/help/plugin.js +1 -1
  9. data/vendor/assets/javascripts/tinymce/plugins/image/plugin.js +1 -1
  10. data/vendor/assets/javascripts/tinymce/plugins/imagetools/plugin.js +1 -1
  11. data/vendor/assets/javascripts/tinymce/plugins/lists/plugin.js +1 -1
  12. data/vendor/assets/javascripts/tinymce/plugins/media/plugin.js +1 -1
  13. data/vendor/assets/javascripts/tinymce/plugins/paste/plugin.js +1 -1
  14. data/vendor/assets/javascripts/tinymce/plugins/print/plugin.js +1 -1
  15. data/vendor/assets/javascripts/tinymce/plugins/table/plugin.js +1 -1
  16. data/vendor/assets/javascripts/tinymce/plugins/textpattern/plugin.js +1 -1
  17. data/vendor/assets/javascripts/tinymce/plugins/visualchars/plugin.js +1 -1
  18. data/vendor/assets/javascripts/tinymce/plugins/wordcount/plugin.js +1 -1
  19. data/vendor/assets/javascripts/tinymce/skins/lightgray/content.inline.min.css +1 -1
  20. data/vendor/assets/javascripts/tinymce/skins/lightgray/content.min.css +1 -1
  21. data/vendor/assets/javascripts/tinymce/themes/inlite/theme.js +1 -1
  22. data/vendor/assets/javascripts/tinymce/themes/mobile/theme.js +1 -1
  23. data/vendor/assets/javascripts/tinymce/themes/modern/theme.js +1 -1
  24. data/vendor/assets/javascripts/tinymce/tinymce.js +2 -2
  25. metadata +4 -3
@@ -1,13 +1,9 @@
1
- // 4.9.4 (2019-03-20)
1
+ // 4.9.11 (2020-07-13)
2
2
  (function () {
3
3
  (function (domGlobals) {
4
4
  'use strict';
5
5
 
6
6
  var noop = function () {
7
- var args = [];
8
- for (var _i = 0; _i < arguments.length; _i++) {
9
- args[_i] = arguments[_i];
10
- }
11
7
  };
12
8
  var compose = function (fa, fb) {
13
9
  return function () {
@@ -57,8 +53,6 @@
57
53
  var never = constant(false);
58
54
  var always = constant(true);
59
55
 
60
- var never$1 = never;
61
- var always$1 = always;
62
56
  var none = function () {
63
57
  return NONE;
64
58
  };
@@ -72,37 +66,27 @@
72
66
  var id = function (n) {
73
67
  return n;
74
68
  };
75
- var noop = function () {
76
- };
77
- var nul = function () {
78
- return null;
79
- };
80
- var undef = function () {
81
- return undefined;
82
- };
83
69
  var me = {
84
70
  fold: function (n, s) {
85
71
  return n();
86
72
  },
87
- is: never$1,
88
- isSome: never$1,
89
- isNone: always$1,
73
+ is: never,
74
+ isSome: never,
75
+ isNone: always,
90
76
  getOr: id,
91
77
  getOrThunk: call,
92
78
  getOrDie: function (msg) {
93
79
  throw new Error(msg || 'error: getOrDie called on none.');
94
80
  },
95
- getOrNull: nul,
96
- getOrUndefined: undef,
81
+ getOrNull: constant(null),
82
+ getOrUndefined: constant(undefined),
97
83
  or: id,
98
84
  orThunk: call,
99
85
  map: none,
100
- ap: none,
101
86
  each: noop,
102
87
  bind: none,
103
- flatten: none,
104
- exists: never$1,
105
- forall: always$1,
88
+ exists: never,
89
+ forall: always,
106
90
  filter: none,
107
91
  equals: eq,
108
92
  equals_: eq,
@@ -111,20 +95,16 @@
111
95
  },
112
96
  toString: constant('none()')
113
97
  };
114
- if (Object.freeze)
98
+ if (Object.freeze) {
115
99
  Object.freeze(me);
100
+ }
116
101
  return me;
117
102
  }();
118
103
  var some = function (a) {
119
- var constant_a = function () {
120
- return a;
121
- };
104
+ var constant_a = constant(a);
122
105
  var self = function () {
123
106
  return me;
124
107
  };
125
- var map = function (f) {
126
- return some(f(a));
127
- };
128
108
  var bind = function (f) {
129
109
  return f(a);
130
110
  };
@@ -135,8 +115,8 @@
135
115
  is: function (v) {
136
116
  return a === v;
137
117
  },
138
- isSome: always$1,
139
- isNone: never$1,
118
+ isSome: always,
119
+ isNone: never,
140
120
  getOr: constant_a,
141
121
  getOrThunk: constant_a,
142
122
  getOrDie: constant_a,
@@ -144,35 +124,31 @@
144
124
  getOrUndefined: constant_a,
145
125
  or: self,
146
126
  orThunk: self,
147
- map: map,
148
- ap: function (optfab) {
149
- return optfab.fold(none, function (fab) {
150
- return some(fab(a));
151
- });
127
+ map: function (f) {
128
+ return some(f(a));
152
129
  },
153
130
  each: function (f) {
154
131
  f(a);
155
132
  },
156
133
  bind: bind,
157
- flatten: constant_a,
158
134
  exists: bind,
159
135
  forall: bind,
160
136
  filter: function (f) {
161
137
  return f(a) ? me : NONE;
162
138
  },
139
+ toArray: function () {
140
+ return [a];
141
+ },
142
+ toString: function () {
143
+ return 'some(' + a + ')';
144
+ },
163
145
  equals: function (o) {
164
146
  return o.is(a);
165
147
  },
166
148
  equals_: function (o, elementEq) {
167
- return o.fold(never$1, function (b) {
149
+ return o.fold(never, function (b) {
168
150
  return elementEq(a, b);
169
151
  });
170
- },
171
- toArray: function () {
172
- return [a];
173
- },
174
- toString: function () {
175
- return 'some(' + a + ')';
176
152
  }
177
153
  };
178
154
  return me;
@@ -187,13 +163,16 @@
187
163
  };
188
164
 
189
165
  var typeOf = function (x) {
190
- if (x === null)
166
+ if (x === null) {
191
167
  return 'null';
168
+ }
192
169
  var t = typeof x;
193
- if (t === 'object' && Array.prototype.isPrototypeOf(x))
170
+ if (t === 'object' && (Array.prototype.isPrototypeOf(x) || x.constructor && x.constructor.name === 'Array')) {
194
171
  return 'array';
195
- if (t === 'object' && String.prototype.isPrototypeOf(x))
172
+ }
173
+ if (t === 'object' && (String.prototype.isPrototypeOf(x) || x.constructor && x.constructor.name === 'String')) {
196
174
  return 'string';
175
+ }
197
176
  return t;
198
177
  };
199
178
  var isType = function (type) {
@@ -209,16 +188,12 @@
209
188
  var isFunction = isType('function');
210
189
  var isNumber = isType('number');
211
190
 
212
- var rawIndexOf = function () {
213
- var pIndexOf = Array.prototype.indexOf;
214
- var fastIndex = function (xs, x) {
215
- return pIndexOf.call(xs, x);
216
- };
217
- var slowIndex = function (xs, x) {
218
- return slowIndexOf(xs, x);
219
- };
220
- return pIndexOf === undefined ? slowIndex : fastIndex;
221
- }();
191
+ var nativeSlice = Array.prototype.slice;
192
+ var nativeIndexOf = Array.prototype.indexOf;
193
+ var nativePush = Array.prototype.push;
194
+ var rawIndexOf = function (ts, t) {
195
+ return nativeIndexOf.call(ts, t);
196
+ };
222
197
  var indexOf = function (xs, x) {
223
198
  var r = rawIndexOf(xs, x);
224
199
  return r === -1 ? Option.none() : Option.some(r);
@@ -227,27 +202,33 @@
227
202
  return rawIndexOf(xs, x) > -1;
228
203
  };
229
204
  var exists = function (xs, pred) {
230
- return findIndex(xs, pred).isSome();
205
+ for (var i = 0, len = xs.length; i < len; i++) {
206
+ var x = xs[i];
207
+ if (pred(x, i)) {
208
+ return true;
209
+ }
210
+ }
211
+ return false;
231
212
  };
232
213
  var map = function (xs, f) {
233
214
  var len = xs.length;
234
215
  var r = new Array(len);
235
216
  for (var i = 0; i < len; i++) {
236
217
  var x = xs[i];
237
- r[i] = f(x, i, xs);
218
+ r[i] = f(x, i);
238
219
  }
239
220
  return r;
240
221
  };
241
222
  var each = function (xs, f) {
242
223
  for (var i = 0, len = xs.length; i < len; i++) {
243
224
  var x = xs[i];
244
- f(x, i, xs);
225
+ f(x, i);
245
226
  }
246
227
  };
247
228
  var eachr = function (xs, f) {
248
229
  for (var i = xs.length - 1; i >= 0; i--) {
249
230
  var x = xs[i];
250
- f(x, i, xs);
231
+ f(x, i);
251
232
  }
252
233
  };
253
234
  var partition = function (xs, pred) {
@@ -255,7 +236,7 @@
255
236
  var fail = [];
256
237
  for (var i = 0, len = xs.length; i < len; i++) {
257
238
  var x = xs[i];
258
- var arr = pred(x, i, xs) ? pass : fail;
239
+ var arr = pred(x, i) ? pass : fail;
259
240
  arr.push(x);
260
241
  }
261
242
  return {
@@ -267,7 +248,7 @@
267
248
  var r = [];
268
249
  for (var i = 0, len = xs.length; i < len; i++) {
269
250
  var x = xs[i];
270
- if (pred(x, i, xs)) {
251
+ if (pred(x, i)) {
271
252
  r.push(x);
272
253
  }
273
254
  }
@@ -288,7 +269,7 @@
288
269
  var find = function (xs, pred) {
289
270
  for (var i = 0, len = xs.length; i < len; i++) {
290
271
  var x = xs[i];
291
- if (pred(x, i, xs)) {
272
+ if (pred(x, i)) {
292
273
  return Option.some(x);
293
274
  }
294
275
  }
@@ -297,27 +278,19 @@
297
278
  var findIndex = function (xs, pred) {
298
279
  for (var i = 0, len = xs.length; i < len; i++) {
299
280
  var x = xs[i];
300
- if (pred(x, i, xs)) {
281
+ if (pred(x, i)) {
301
282
  return Option.some(i);
302
283
  }
303
284
  }
304
285
  return Option.none();
305
286
  };
306
- var slowIndexOf = function (xs, x) {
307
- for (var i = 0, len = xs.length; i < len; ++i) {
308
- if (xs[i] === x) {
309
- return i;
310
- }
311
- }
312
- return -1;
313
- };
314
- var push = Array.prototype.push;
315
287
  var flatten = function (xs) {
316
288
  var r = [];
317
289
  for (var i = 0, len = xs.length; i < len; ++i) {
318
- if (!Array.prototype.isPrototypeOf(xs[i]))
290
+ if (!isArray(xs[i])) {
319
291
  throw new Error('Arr.flatten item ' + i + ' was not an array, input: ' + xs);
320
- push.apply(r, xs[i]);
292
+ }
293
+ nativePush.apply(r, xs[i]);
321
294
  }
322
295
  return r;
323
296
  };
@@ -328,15 +301,14 @@
328
301
  var forall = function (xs, pred) {
329
302
  for (var i = 0, len = xs.length; i < len; ++i) {
330
303
  var x = xs[i];
331
- if (pred(x, i, xs) !== true) {
304
+ if (pred(x, i) !== true) {
332
305
  return false;
333
306
  }
334
307
  }
335
308
  return true;
336
309
  };
337
- var slice = Array.prototype.slice;
338
310
  var reverse = function (xs) {
339
- var r = slice.call(xs, 0);
311
+ var r = nativeSlice.call(xs, 0);
340
312
  r.reverse();
341
313
  return r;
342
314
  };
@@ -354,7 +326,7 @@
354
326
  return r;
355
327
  };
356
328
  var sort = function (xs, comparator) {
357
- var copy = slice.call(xs, 0);
329
+ var copy = nativeSlice.call(xs, 0);
358
330
  copy.sort(comparator);
359
331
  return copy;
360
332
  };
@@ -365,15 +337,16 @@
365
337
  return xs.length === 0 ? Option.none() : Option.some(xs[xs.length - 1]);
366
338
  };
367
339
  var from$1 = isFunction(Array.from) ? Array.from : function (x) {
368
- return slice.call(x);
340
+ return nativeSlice.call(x);
369
341
  };
370
342
 
371
343
  var Global = typeof domGlobals.window !== 'undefined' ? domGlobals.window : Function('return this;')();
372
344
 
373
345
  var path = function (parts, scope) {
374
346
  var o = scope !== undefined && scope !== null ? scope : Global;
375
- for (var i = 0; i < parts.length && o !== undefined && o !== null; ++i)
347
+ for (var i = 0; i < parts.length && o !== undefined && o !== null; ++i) {
376
348
  o = o[parts[i]];
349
+ }
377
350
  return o;
378
351
  };
379
352
  var resolve = function (p, scope) {
@@ -386,8 +359,9 @@
386
359
  };
387
360
  var getOrDie = function (name, scope) {
388
361
  var actual = unsafe(name, scope);
389
- if (actual === undefined || actual === null)
390
- throw name + ' not available on this browser';
362
+ if (actual === undefined || actual === null) {
363
+ throw new Error(name + ' not available on this browser');
364
+ }
391
365
  return actual;
392
366
  };
393
367
  var Global$1 = { getOrDie: getOrDie };
@@ -1091,7 +1065,7 @@
1091
1065
  hasDuplicate = true;
1092
1066
  }
1093
1067
  return 0;
1094
- }, strundefined = typeof undefined, MAX_NEGATIVE = 1 << 31, hasOwn = {}.hasOwnProperty, arr = [], pop = arr.pop, push_native = arr.push, push$1 = arr.push, slice$1 = arr.slice, indexOf$1 = arr.indexOf || function (elem) {
1068
+ }, strundefined = typeof undefined, MAX_NEGATIVE = 1 << 31, hasOwn = {}.hasOwnProperty, arr = [], pop = arr.pop, push_native = arr.push, push = arr.push, slice = arr.slice, indexOf$1 = arr.indexOf || function (elem) {
1095
1069
  var i = 0, len = this.length;
1096
1070
  for (; i < len; i++) {
1097
1071
  if (this[i] === elem) {
@@ -1113,12 +1087,12 @@
1113
1087
  return high !== high || escapedWhitespace ? escaped : high < 0 ? String.fromCharCode(high + 65536) : String.fromCharCode(high >> 10 | 55296, high & 1023 | 56320);
1114
1088
  };
1115
1089
  try {
1116
- push$1.apply(arr = slice$1.call(preferredDoc.childNodes), preferredDoc.childNodes);
1090
+ push.apply(arr = slice.call(preferredDoc.childNodes), preferredDoc.childNodes);
1117
1091
  arr[preferredDoc.childNodes.length].nodeType;
1118
1092
  } catch (e) {
1119
- push$1 = {
1093
+ push = {
1120
1094
  apply: arr.length ? function (target, els) {
1121
- push_native.apply(target, slice$1.call(els));
1095
+ push_native.apply(target, slice.call(els));
1122
1096
  } : function (target, els) {
1123
1097
  var j = target.length, i = 0;
1124
1098
  while (target[j++] = els[i++]) {
@@ -1160,10 +1134,10 @@
1160
1134
  }
1161
1135
  }
1162
1136
  } else if (match[2]) {
1163
- push$1.apply(results, context.getElementsByTagName(selector));
1137
+ push.apply(results, context.getElementsByTagName(selector));
1164
1138
  return results;
1165
1139
  } else if ((m = match[3]) && support.getElementsByClassName) {
1166
- push$1.apply(results, context.getElementsByClassName(m));
1140
+ push.apply(results, context.getElementsByClassName(m));
1167
1141
  return results;
1168
1142
  }
1169
1143
  }
@@ -1188,7 +1162,7 @@
1188
1162
  }
1189
1163
  if (newSelector) {
1190
1164
  try {
1191
- push$1.apply(results, newContext.querySelectorAll(newSelector));
1165
+ push.apply(results, newContext.querySelectorAll(newSelector));
1192
1166
  return results;
1193
1167
  } catch (qsaError) {
1194
1168
  } finally {
@@ -1944,7 +1918,7 @@
1944
1918
  if (postFinder) {
1945
1919
  postFinder(null, results, matcherOut, xml);
1946
1920
  } else {
1947
- push$1.apply(results, matcherOut);
1921
+ push.apply(results, matcherOut);
1948
1922
  }
1949
1923
  }
1950
1924
  });
@@ -2020,7 +1994,7 @@
2020
1994
  }
2021
1995
  setMatched = condense(setMatched);
2022
1996
  }
2023
- push$1.apply(results, setMatched);
1997
+ push.apply(results, setMatched);
2024
1998
  if (outermost && !seed && setMatched.length > 0 && matchedCount + setMatchers.length > 1) {
2025
1999
  Sizzle.uniqueSort(results);
2026
2000
  }
@@ -2078,7 +2052,7 @@
2078
2052
  tokens.splice(i, 1);
2079
2053
  selector = seed.length && toSelector(tokens);
2080
2054
  if (!selector) {
2081
- push$1.apply(results, seed);
2055
+ push.apply(results, seed);
2082
2056
  return results;
2083
2057
  }
2084
2058
  break;
@@ -2378,7 +2352,7 @@
2378
2352
  _addCacheSuffix: _addCacheSuffix
2379
2353
  };
2380
2354
 
2381
- var doc = domGlobals.document, push$2 = Array.prototype.push, slice$2 = Array.prototype.slice;
2355
+ var doc = domGlobals.document, push$1 = Array.prototype.push, slice$1 = Array.prototype.slice;
2382
2356
  var rquickExpr$1 = /^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/;
2383
2357
  var Event = EventUtils.Event;
2384
2358
  var skipUniques = Tools.makeMap('children,contents,next,prev');
@@ -2556,7 +2530,7 @@
2556
2530
  if (match[1]) {
2557
2531
  node = createFragment(selector, getElementDocument(context)).firstChild;
2558
2532
  while (node) {
2559
- push$2.call(self, node);
2533
+ push$1.call(self, node);
2560
2534
  node = node.nextSibling;
2561
2535
  }
2562
2536
  } else {
@@ -2594,7 +2568,7 @@
2594
2568
  self[i] = nodes[i];
2595
2569
  }
2596
2570
  } else {
2597
- push$2.apply(self, DomQuery.makeArray(items));
2571
+ push$1.apply(self, DomQuery.makeArray(items));
2598
2572
  }
2599
2573
  return self;
2600
2574
  },
@@ -2911,7 +2885,7 @@
2911
2885
  return this.css('display', 'none');
2912
2886
  },
2913
2887
  slice: function () {
2914
- return new DomQuery(slice$2.apply(this, arguments));
2888
+ return new DomQuery(slice$1.apply(this, arguments));
2915
2889
  },
2916
2890
  eq: function (index) {
2917
2891
  return index === -1 ? this.slice(index) : this.slice(index, +index + 1);
@@ -2978,7 +2952,7 @@
2978
2952
  }
2979
2953
  return this.css(offset);
2980
2954
  },
2981
- push: push$2,
2955
+ push: push$1,
2982
2956
  sort: [].sort,
2983
2957
  splice: [].splice
2984
2958
  };
@@ -3252,18 +3226,20 @@
3252
3226
  var firstMatch = function (regexes, s) {
3253
3227
  for (var i = 0; i < regexes.length; i++) {
3254
3228
  var x = regexes[i];
3255
- if (x.test(s))
3229
+ if (x.test(s)) {
3256
3230
  return x;
3231
+ }
3257
3232
  }
3258
3233
  return undefined;
3259
3234
  };
3260
3235
  var find$2 = function (regexes, agent) {
3261
3236
  var r = firstMatch(regexes, agent);
3262
- if (!r)
3237
+ if (!r) {
3263
3238
  return {
3264
3239
  major: 0,
3265
3240
  minor: 0
3266
3241
  };
3242
+ }
3267
3243
  var group = function (i) {
3268
3244
  return Number(agent.replace(r, '$' + i));
3269
3245
  };
@@ -3271,8 +3247,9 @@
3271
3247
  };
3272
3248
  var detect = function (versionRegexes, agent) {
3273
3249
  var cleanedAgent = String(agent).toLowerCase();
3274
- if (versionRegexes.length === 0)
3250
+ if (versionRegexes.length === 0) {
3275
3251
  return unknown();
3252
+ }
3276
3253
  return find$2(versionRegexes, cleanedAgent);
3277
3254
  };
3278
3255
  var unknown = function () {
@@ -3451,8 +3428,7 @@
3451
3428
  name: 'Edge',
3452
3429
  versionRegexes: [/.*?edge\/ ?([0-9]+)\.([0-9]+)$/],
3453
3430
  search: function (uastring) {
3454
- var monstrosity = contains$2(uastring, 'edge/') && contains$2(uastring, 'chrome') && contains$2(uastring, 'safari') && contains$2(uastring, 'applewebkit');
3455
- return monstrosity;
3431
+ return contains$2(uastring, 'edge/') && contains$2(uastring, 'chrome') && contains$2(uastring, 'safari') && contains$2(uastring, 'applewebkit');
3456
3432
  }
3457
3433
  },
3458
3434
  {
@@ -3640,21 +3616,21 @@
3640
3616
  for (var k = 0, len = props.length; k < len; k++) {
3641
3617
  var i = props[k];
3642
3618
  var x = obj[i];
3643
- f(x, i, obj);
3619
+ f(x, i);
3644
3620
  }
3645
3621
  };
3646
3622
  var map$2 = function (obj, f) {
3647
- return tupleMap(obj, function (x, i, obj) {
3623
+ return tupleMap(obj, function (x, i) {
3648
3624
  return {
3649
3625
  k: i,
3650
- v: f(x, i, obj)
3626
+ v: f(x, i)
3651
3627
  };
3652
3628
  });
3653
3629
  };
3654
3630
  var tupleMap = function (obj, f) {
3655
3631
  var r = {};
3656
3632
  each$3(obj, function (x, i) {
3657
- var tuple = f(x, i, obj);
3633
+ var tuple = f(x, i);
3658
3634
  r[tuple.k] = tuple.v;
3659
3635
  });
3660
3636
  return r;
@@ -3676,7 +3652,7 @@
3676
3652
  };
3677
3653
 
3678
3654
  var isSupported = function (dom) {
3679
- return dom.style !== undefined;
3655
+ return dom.style !== undefined && isFunction(dom.style.getPropertyValue);
3680
3656
  };
3681
3657
 
3682
3658
  var inBody = function (element) {
@@ -3745,6 +3721,17 @@
3745
3721
  return r.length > 0;
3746
3722
  });
3747
3723
  };
3724
+ var getAllRaw = function (element) {
3725
+ var css = {};
3726
+ var dom = element.dom();
3727
+ if (isSupported(dom)) {
3728
+ for (var i = 0; i < dom.style.length; i++) {
3729
+ var ruleName = dom.style.item(i);
3730
+ css[ruleName] = dom.style[ruleName];
3731
+ }
3732
+ }
3733
+ return css;
3734
+ };
3748
3735
 
3749
3736
  var Immutable = function () {
3750
3737
  var fields = [];
@@ -3802,19 +3789,22 @@
3802
3789
  var ELEMENT$1 = ELEMENT;
3803
3790
  var DOCUMENT$1 = DOCUMENT;
3804
3791
  var is$1 = function (element, selector) {
3805
- var elem = element.dom();
3806
- if (elem.nodeType !== ELEMENT$1) {
3792
+ var dom = element.dom();
3793
+ if (dom.nodeType !== ELEMENT$1) {
3807
3794
  return false;
3808
- } else if (elem.matches !== undefined) {
3809
- return elem.matches(selector);
3810
- } else if (elem.msMatchesSelector !== undefined) {
3811
- return elem.msMatchesSelector(selector);
3812
- } else if (elem.webkitMatchesSelector !== undefined) {
3813
- return elem.webkitMatchesSelector(selector);
3814
- } else if (elem.mozMatchesSelector !== undefined) {
3815
- return elem.mozMatchesSelector(selector);
3816
3795
  } else {
3817
- throw new Error('Browser lacks native selectors');
3796
+ var elem = dom;
3797
+ if (elem.matches !== undefined) {
3798
+ return elem.matches(selector);
3799
+ } else if (elem.msMatchesSelector !== undefined) {
3800
+ return elem.msMatchesSelector(selector);
3801
+ } else if (elem.webkitMatchesSelector !== undefined) {
3802
+ return elem.webkitMatchesSelector(selector);
3803
+ } else if (elem.mozMatchesSelector !== undefined) {
3804
+ return elem.mozMatchesSelector(selector);
3805
+ } else {
3806
+ throw new Error('Browser lacks native selectors');
3807
+ }
3818
3808
  }
3819
3809
  };
3820
3810
  var bypassSelector = function (dom) {
@@ -3850,16 +3840,13 @@
3850
3840
  return Element.fromDom(element.dom().ownerDocument.documentElement);
3851
3841
  };
3852
3842
  var defaultView = function (element) {
3853
- var el = element.dom();
3854
- var defView = el.ownerDocument.defaultView;
3855
- return Element.fromDom(defView);
3843
+ return Element.fromDom(element.dom().ownerDocument.defaultView);
3856
3844
  };
3857
3845
  var parent = function (element) {
3858
- var dom = element.dom();
3859
- return Option.from(dom.parentNode).map(Element.fromDom);
3846
+ return Option.from(element.dom().parentNode).map(Element.fromDom);
3860
3847
  };
3861
3848
  var parents = function (element, isRoot) {
3862
- var stop = isFunction(isRoot) ? isRoot : constant(false);
3849
+ var stop = isFunction(isRoot) ? isRoot : never;
3863
3850
  var dom = element.dom();
3864
3851
  var ret = [];
3865
3852
  while (dom.parentNode !== null && dom.parentNode !== undefined) {
@@ -3875,12 +3862,10 @@
3875
3862
  return ret;
3876
3863
  };
3877
3864
  var prevSibling = function (element) {
3878
- var dom = element.dom();
3879
- return Option.from(dom.previousSibling).map(Element.fromDom);
3865
+ return Option.from(element.dom().previousSibling).map(Element.fromDom);
3880
3866
  };
3881
3867
  var nextSibling = function (element) {
3882
- var dom = element.dom();
3883
- return Option.from(dom.nextSibling).map(Element.fromDom);
3868
+ return Option.from(element.dom().nextSibling).map(Element.fromDom);
3884
3869
  };
3885
3870
  var prevSiblings = function (element) {
3886
3871
  return reverse(Recurse.toArray(element, prevSibling));
@@ -3889,8 +3874,7 @@
3889
3874
  return Recurse.toArray(element, nextSibling);
3890
3875
  };
3891
3876
  var children = function (element) {
3892
- var dom = element.dom();
3893
- return map(dom.childNodes, Element.fromDom);
3877
+ return map(element.dom().childNodes, Element.fromDom);
3894
3878
  };
3895
3879
  var child = function (element, index) {
3896
3880
  var cs = element.dom().childNodes;
@@ -3963,6 +3947,503 @@
3963
3947
  };
3964
3948
  var Position = { getPos: getPos };
3965
3949
 
3950
+ var exports$1 = {}, module$1 = { exports: exports$1 };
3951
+ (function (define, exports, module, require) {
3952
+ (function (f) {
3953
+ if (typeof exports === 'object' && typeof module !== 'undefined') {
3954
+ module.exports = f();
3955
+ } else if (typeof define === 'function' && define.amd) {
3956
+ define([], f);
3957
+ } else {
3958
+ var g;
3959
+ if (typeof window !== 'undefined') {
3960
+ g = window;
3961
+ } else if (typeof global !== 'undefined') {
3962
+ g = global;
3963
+ } else if (typeof self !== 'undefined') {
3964
+ g = self;
3965
+ } else {
3966
+ g = this;
3967
+ }
3968
+ g.EphoxContactWrapper = f();
3969
+ }
3970
+ }(function () {
3971
+ return function () {
3972
+ function r(e, n, t) {
3973
+ function o(i, f) {
3974
+ if (!n[i]) {
3975
+ if (!e[i]) {
3976
+ var c = 'function' == typeof require && require;
3977
+ if (!f && c)
3978
+ return c(i, !0);
3979
+ if (u)
3980
+ return u(i, !0);
3981
+ var a = new Error('Cannot find module \'' + i + '\'');
3982
+ throw a.code = 'MODULE_NOT_FOUND', a;
3983
+ }
3984
+ var p = n[i] = { exports: {} };
3985
+ e[i][0].call(p.exports, function (r) {
3986
+ var n = e[i][1][r];
3987
+ return o(n || r);
3988
+ }, p, p.exports, r, e, n, t);
3989
+ }
3990
+ return n[i].exports;
3991
+ }
3992
+ for (var u = 'function' == typeof require && require, i = 0; i < t.length; i++)
3993
+ o(t[i]);
3994
+ return o;
3995
+ }
3996
+ return r;
3997
+ }()({
3998
+ 1: [
3999
+ function (require, module, exports) {
4000
+ var process = module.exports = {};
4001
+ var cachedSetTimeout;
4002
+ var cachedClearTimeout;
4003
+ function defaultSetTimout() {
4004
+ throw new Error('setTimeout has not been defined');
4005
+ }
4006
+ function defaultClearTimeout() {
4007
+ throw new Error('clearTimeout has not been defined');
4008
+ }
4009
+ (function () {
4010
+ try {
4011
+ if (typeof setTimeout === 'function') {
4012
+ cachedSetTimeout = setTimeout;
4013
+ } else {
4014
+ cachedSetTimeout = defaultSetTimout;
4015
+ }
4016
+ } catch (e) {
4017
+ cachedSetTimeout = defaultSetTimout;
4018
+ }
4019
+ try {
4020
+ if (typeof clearTimeout === 'function') {
4021
+ cachedClearTimeout = clearTimeout;
4022
+ } else {
4023
+ cachedClearTimeout = defaultClearTimeout;
4024
+ }
4025
+ } catch (e) {
4026
+ cachedClearTimeout = defaultClearTimeout;
4027
+ }
4028
+ }());
4029
+ function runTimeout(fun) {
4030
+ if (cachedSetTimeout === setTimeout) {
4031
+ return setTimeout(fun, 0);
4032
+ }
4033
+ if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {
4034
+ cachedSetTimeout = setTimeout;
4035
+ return setTimeout(fun, 0);
4036
+ }
4037
+ try {
4038
+ return cachedSetTimeout(fun, 0);
4039
+ } catch (e) {
4040
+ try {
4041
+ return cachedSetTimeout.call(null, fun, 0);
4042
+ } catch (e) {
4043
+ return cachedSetTimeout.call(this, fun, 0);
4044
+ }
4045
+ }
4046
+ }
4047
+ function runClearTimeout(marker) {
4048
+ if (cachedClearTimeout === clearTimeout) {
4049
+ return clearTimeout(marker);
4050
+ }
4051
+ if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {
4052
+ cachedClearTimeout = clearTimeout;
4053
+ return clearTimeout(marker);
4054
+ }
4055
+ try {
4056
+ return cachedClearTimeout(marker);
4057
+ } catch (e) {
4058
+ try {
4059
+ return cachedClearTimeout.call(null, marker);
4060
+ } catch (e) {
4061
+ return cachedClearTimeout.call(this, marker);
4062
+ }
4063
+ }
4064
+ }
4065
+ var queue = [];
4066
+ var draining = false;
4067
+ var currentQueue;
4068
+ var queueIndex = -1;
4069
+ function cleanUpNextTick() {
4070
+ if (!draining || !currentQueue) {
4071
+ return;
4072
+ }
4073
+ draining = false;
4074
+ if (currentQueue.length) {
4075
+ queue = currentQueue.concat(queue);
4076
+ } else {
4077
+ queueIndex = -1;
4078
+ }
4079
+ if (queue.length) {
4080
+ drainQueue();
4081
+ }
4082
+ }
4083
+ function drainQueue() {
4084
+ if (draining) {
4085
+ return;
4086
+ }
4087
+ var timeout = runTimeout(cleanUpNextTick);
4088
+ draining = true;
4089
+ var len = queue.length;
4090
+ while (len) {
4091
+ currentQueue = queue;
4092
+ queue = [];
4093
+ while (++queueIndex < len) {
4094
+ if (currentQueue) {
4095
+ currentQueue[queueIndex].run();
4096
+ }
4097
+ }
4098
+ queueIndex = -1;
4099
+ len = queue.length;
4100
+ }
4101
+ currentQueue = null;
4102
+ draining = false;
4103
+ runClearTimeout(timeout);
4104
+ }
4105
+ process.nextTick = function (fun) {
4106
+ var args = new Array(arguments.length - 1);
4107
+ if (arguments.length > 1) {
4108
+ for (var i = 1; i < arguments.length; i++) {
4109
+ args[i - 1] = arguments[i];
4110
+ }
4111
+ }
4112
+ queue.push(new Item(fun, args));
4113
+ if (queue.length === 1 && !draining) {
4114
+ runTimeout(drainQueue);
4115
+ }
4116
+ };
4117
+ function Item(fun, array) {
4118
+ this.fun = fun;
4119
+ this.array = array;
4120
+ }
4121
+ Item.prototype.run = function () {
4122
+ this.fun.apply(null, this.array);
4123
+ };
4124
+ process.title = 'browser';
4125
+ process.browser = true;
4126
+ process.env = {};
4127
+ process.argv = [];
4128
+ process.version = '';
4129
+ process.versions = {};
4130
+ function noop() {
4131
+ }
4132
+ process.on = noop;
4133
+ process.addListener = noop;
4134
+ process.once = noop;
4135
+ process.off = noop;
4136
+ process.removeListener = noop;
4137
+ process.removeAllListeners = noop;
4138
+ process.emit = noop;
4139
+ process.prependListener = noop;
4140
+ process.prependOnceListener = noop;
4141
+ process.listeners = function (name) {
4142
+ return [];
4143
+ };
4144
+ process.binding = function (name) {
4145
+ throw new Error('process.binding is not supported');
4146
+ };
4147
+ process.cwd = function () {
4148
+ return '/';
4149
+ };
4150
+ process.chdir = function (dir) {
4151
+ throw new Error('process.chdir is not supported');
4152
+ };
4153
+ process.umask = function () {
4154
+ return 0;
4155
+ };
4156
+ },
4157
+ {}
4158
+ ],
4159
+ 2: [
4160
+ function (require, module, exports) {
4161
+ (function (setImmediate) {
4162
+ (function (root) {
4163
+ var setTimeoutFunc = setTimeout;
4164
+ function noop() {
4165
+ }
4166
+ function bind(fn, thisArg) {
4167
+ return function () {
4168
+ fn.apply(thisArg, arguments);
4169
+ };
4170
+ }
4171
+ function Promise(fn) {
4172
+ if (typeof this !== 'object')
4173
+ throw new TypeError('Promises must be constructed via new');
4174
+ if (typeof fn !== 'function')
4175
+ throw new TypeError('not a function');
4176
+ this._state = 0;
4177
+ this._handled = false;
4178
+ this._value = undefined;
4179
+ this._deferreds = [];
4180
+ doResolve(fn, this);
4181
+ }
4182
+ function handle(self, deferred) {
4183
+ while (self._state === 3) {
4184
+ self = self._value;
4185
+ }
4186
+ if (self._state === 0) {
4187
+ self._deferreds.push(deferred);
4188
+ return;
4189
+ }
4190
+ self._handled = true;
4191
+ Promise._immediateFn(function () {
4192
+ var cb = self._state === 1 ? deferred.onFulfilled : deferred.onRejected;
4193
+ if (cb === null) {
4194
+ (self._state === 1 ? resolve : reject)(deferred.promise, self._value);
4195
+ return;
4196
+ }
4197
+ var ret;
4198
+ try {
4199
+ ret = cb(self._value);
4200
+ } catch (e) {
4201
+ reject(deferred.promise, e);
4202
+ return;
4203
+ }
4204
+ resolve(deferred.promise, ret);
4205
+ });
4206
+ }
4207
+ function resolve(self, newValue) {
4208
+ try {
4209
+ if (newValue === self)
4210
+ throw new TypeError('A promise cannot be resolved with itself.');
4211
+ if (newValue && (typeof newValue === 'object' || typeof newValue === 'function')) {
4212
+ var then = newValue.then;
4213
+ if (newValue instanceof Promise) {
4214
+ self._state = 3;
4215
+ self._value = newValue;
4216
+ finale(self);
4217
+ return;
4218
+ } else if (typeof then === 'function') {
4219
+ doResolve(bind(then, newValue), self);
4220
+ return;
4221
+ }
4222
+ }
4223
+ self._state = 1;
4224
+ self._value = newValue;
4225
+ finale(self);
4226
+ } catch (e) {
4227
+ reject(self, e);
4228
+ }
4229
+ }
4230
+ function reject(self, newValue) {
4231
+ self._state = 2;
4232
+ self._value = newValue;
4233
+ finale(self);
4234
+ }
4235
+ function finale(self) {
4236
+ if (self._state === 2 && self._deferreds.length === 0) {
4237
+ Promise._immediateFn(function () {
4238
+ if (!self._handled) {
4239
+ Promise._unhandledRejectionFn(self._value);
4240
+ }
4241
+ });
4242
+ }
4243
+ for (var i = 0, len = self._deferreds.length; i < len; i++) {
4244
+ handle(self, self._deferreds[i]);
4245
+ }
4246
+ self._deferreds = null;
4247
+ }
4248
+ function Handler(onFulfilled, onRejected, promise) {
4249
+ this.onFulfilled = typeof onFulfilled === 'function' ? onFulfilled : null;
4250
+ this.onRejected = typeof onRejected === 'function' ? onRejected : null;
4251
+ this.promise = promise;
4252
+ }
4253
+ function doResolve(fn, self) {
4254
+ var done = false;
4255
+ try {
4256
+ fn(function (value) {
4257
+ if (done)
4258
+ return;
4259
+ done = true;
4260
+ resolve(self, value);
4261
+ }, function (reason) {
4262
+ if (done)
4263
+ return;
4264
+ done = true;
4265
+ reject(self, reason);
4266
+ });
4267
+ } catch (ex) {
4268
+ if (done)
4269
+ return;
4270
+ done = true;
4271
+ reject(self, ex);
4272
+ }
4273
+ }
4274
+ Promise.prototype['catch'] = function (onRejected) {
4275
+ return this.then(null, onRejected);
4276
+ };
4277
+ Promise.prototype.then = function (onFulfilled, onRejected) {
4278
+ var prom = new this.constructor(noop);
4279
+ handle(this, new Handler(onFulfilled, onRejected, prom));
4280
+ return prom;
4281
+ };
4282
+ Promise.all = function (arr) {
4283
+ var args = Array.prototype.slice.call(arr);
4284
+ return new Promise(function (resolve, reject) {
4285
+ if (args.length === 0)
4286
+ return resolve([]);
4287
+ var remaining = args.length;
4288
+ function res(i, val) {
4289
+ try {
4290
+ if (val && (typeof val === 'object' || typeof val === 'function')) {
4291
+ var then = val.then;
4292
+ if (typeof then === 'function') {
4293
+ then.call(val, function (val) {
4294
+ res(i, val);
4295
+ }, reject);
4296
+ return;
4297
+ }
4298
+ }
4299
+ args[i] = val;
4300
+ if (--remaining === 0) {
4301
+ resolve(args);
4302
+ }
4303
+ } catch (ex) {
4304
+ reject(ex);
4305
+ }
4306
+ }
4307
+ for (var i = 0; i < args.length; i++) {
4308
+ res(i, args[i]);
4309
+ }
4310
+ });
4311
+ };
4312
+ Promise.resolve = function (value) {
4313
+ if (value && typeof value === 'object' && value.constructor === Promise) {
4314
+ return value;
4315
+ }
4316
+ return new Promise(function (resolve) {
4317
+ resolve(value);
4318
+ });
4319
+ };
4320
+ Promise.reject = function (value) {
4321
+ return new Promise(function (resolve, reject) {
4322
+ reject(value);
4323
+ });
4324
+ };
4325
+ Promise.race = function (values) {
4326
+ return new Promise(function (resolve, reject) {
4327
+ for (var i = 0, len = values.length; i < len; i++) {
4328
+ values[i].then(resolve, reject);
4329
+ }
4330
+ });
4331
+ };
4332
+ Promise._immediateFn = typeof setImmediate === 'function' ? function (fn) {
4333
+ setImmediate(fn);
4334
+ } : function (fn) {
4335
+ setTimeoutFunc(fn, 0);
4336
+ };
4337
+ Promise._unhandledRejectionFn = function _unhandledRejectionFn(err) {
4338
+ if (typeof console !== 'undefined' && console) {
4339
+ console.warn('Possible Unhandled Promise Rejection:', err);
4340
+ }
4341
+ };
4342
+ Promise._setImmediateFn = function _setImmediateFn(fn) {
4343
+ Promise._immediateFn = fn;
4344
+ };
4345
+ Promise._setUnhandledRejectionFn = function _setUnhandledRejectionFn(fn) {
4346
+ Promise._unhandledRejectionFn = fn;
4347
+ };
4348
+ if (typeof module !== 'undefined' && module.exports) {
4349
+ module.exports = Promise;
4350
+ } else if (!root.Promise) {
4351
+ root.Promise = Promise;
4352
+ }
4353
+ }(this));
4354
+ }.call(this, require('timers').setImmediate));
4355
+ },
4356
+ { 'timers': 3 }
4357
+ ],
4358
+ 3: [
4359
+ function (require, module, exports) {
4360
+ (function (setImmediate, clearImmediate) {
4361
+ var nextTick = require('process/browser.js').nextTick;
4362
+ var apply = Function.prototype.apply;
4363
+ var slice = Array.prototype.slice;
4364
+ var immediateIds = {};
4365
+ var nextImmediateId = 0;
4366
+ exports.setTimeout = function () {
4367
+ return new Timeout(apply.call(setTimeout, window, arguments), clearTimeout);
4368
+ };
4369
+ exports.setInterval = function () {
4370
+ return new Timeout(apply.call(setInterval, window, arguments), clearInterval);
4371
+ };
4372
+ exports.clearTimeout = exports.clearInterval = function (timeout) {
4373
+ timeout.close();
4374
+ };
4375
+ function Timeout(id, clearFn) {
4376
+ this._id = id;
4377
+ this._clearFn = clearFn;
4378
+ }
4379
+ Timeout.prototype.unref = Timeout.prototype.ref = function () {
4380
+ };
4381
+ Timeout.prototype.close = function () {
4382
+ this._clearFn.call(window, this._id);
4383
+ };
4384
+ exports.enroll = function (item, msecs) {
4385
+ clearTimeout(item._idleTimeoutId);
4386
+ item._idleTimeout = msecs;
4387
+ };
4388
+ exports.unenroll = function (item) {
4389
+ clearTimeout(item._idleTimeoutId);
4390
+ item._idleTimeout = -1;
4391
+ };
4392
+ exports._unrefActive = exports.active = function (item) {
4393
+ clearTimeout(item._idleTimeoutId);
4394
+ var msecs = item._idleTimeout;
4395
+ if (msecs >= 0) {
4396
+ item._idleTimeoutId = setTimeout(function onTimeout() {
4397
+ if (item._onTimeout)
4398
+ item._onTimeout();
4399
+ }, msecs);
4400
+ }
4401
+ };
4402
+ exports.setImmediate = typeof setImmediate === 'function' ? setImmediate : function (fn) {
4403
+ var id = nextImmediateId++;
4404
+ var args = arguments.length < 2 ? false : slice.call(arguments, 1);
4405
+ immediateIds[id] = true;
4406
+ nextTick(function onNextTick() {
4407
+ if (immediateIds[id]) {
4408
+ if (args) {
4409
+ fn.apply(null, args);
4410
+ } else {
4411
+ fn.call(null);
4412
+ }
4413
+ exports.clearImmediate(id);
4414
+ }
4415
+ });
4416
+ return id;
4417
+ };
4418
+ exports.clearImmediate = typeof clearImmediate === 'function' ? clearImmediate : function (id) {
4419
+ delete immediateIds[id];
4420
+ };
4421
+ }.call(this, require('timers').setImmediate, require('timers').clearImmediate));
4422
+ },
4423
+ {
4424
+ 'process/browser.js': 1,
4425
+ 'timers': 3
4426
+ }
4427
+ ],
4428
+ 4: [
4429
+ function (require, module, exports) {
4430
+ var promisePolyfill = require('promise-polyfill');
4431
+ var Global = function () {
4432
+ if (typeof window !== 'undefined') {
4433
+ return window;
4434
+ } else {
4435
+ return Function('return this;')();
4436
+ }
4437
+ }();
4438
+ module.exports = { boltExport: Global.Promise || promisePolyfill };
4439
+ },
4440
+ { 'promise-polyfill': 2 }
4441
+ ]
4442
+ }, {}, [4])(4);
4443
+ }));
4444
+ }(undefined, exports$1, module$1, undefined));
4445
+ var Promise = module$1.exports.boltExport;
4446
+
3966
4447
  var nu$3 = function (baseFn) {
3967
4448
  var data = Option.none();
3968
4449
  var callbacks = [];
@@ -3974,10 +4455,11 @@
3974
4455
  });
3975
4456
  };
3976
4457
  var get = function (nCallback) {
3977
- if (isReady())
4458
+ if (isReady()) {
3978
4459
  call(nCallback);
3979
- else
4460
+ } else {
3980
4461
  callbacks.push(nCallback);
4462
+ }
3981
4463
  };
3982
4464
  var set = function (x) {
3983
4465
  data = Option.some(x);
@@ -4014,42 +4496,31 @@
4014
4496
  pure: pure
4015
4497
  };
4016
4498
 
4017
- var bounce = function (f) {
4018
- return function () {
4019
- var args = [];
4020
- for (var _i = 0; _i < arguments.length; _i++) {
4021
- args[_i] = arguments[_i];
4022
- }
4023
- var me = this;
4024
- domGlobals.setTimeout(function () {
4025
- f.apply(me, args);
4026
- }, 0);
4027
- };
4499
+ var errorReporter = function (err) {
4500
+ domGlobals.setTimeout(function () {
4501
+ throw err;
4502
+ }, 0);
4028
4503
  };
4029
-
4030
- var nu$4 = function (baseFn) {
4504
+ var make = function (run) {
4031
4505
  var get = function (callback) {
4032
- baseFn(bounce(callback));
4506
+ run().then(callback, errorReporter);
4033
4507
  };
4034
4508
  var map = function (fab) {
4035
- return nu$4(function (callback) {
4036
- get(function (a) {
4037
- var value = fab(a);
4038
- callback(value);
4039
- });
4509
+ return make(function () {
4510
+ return run().then(fab);
4040
4511
  });
4041
4512
  };
4042
4513
  var bind = function (aFutureB) {
4043
- return nu$4(function (callback) {
4044
- get(function (a) {
4045
- aFutureB(a).get(callback);
4514
+ return make(function () {
4515
+ return run().then(function (v) {
4516
+ return aFutureB(v).toPromise();
4046
4517
  });
4047
4518
  });
4048
4519
  };
4049
4520
  var anonBind = function (futureB) {
4050
- return nu$4(function (callback) {
4051
- get(function (a) {
4052
- futureB.get(callback);
4521
+ return make(function () {
4522
+ return run().then(function () {
4523
+ return futureB.toPromise();
4053
4524
  });
4054
4525
  });
4055
4526
  };
@@ -4058,25 +4529,32 @@
4058
4529
  };
4059
4530
  var toCached = function () {
4060
4531
  var cache = null;
4061
- return nu$4(function (callback) {
4532
+ return make(function () {
4062
4533
  if (cache === null) {
4063
- cache = toLazy();
4534
+ cache = run();
4064
4535
  }
4065
- cache.get(callback);
4536
+ return cache;
4066
4537
  });
4067
4538
  };
4539
+ var toPromise = run;
4068
4540
  return {
4069
4541
  map: map,
4070
4542
  bind: bind,
4071
4543
  anonBind: anonBind,
4072
4544
  toLazy: toLazy,
4073
4545
  toCached: toCached,
4546
+ toPromise: toPromise,
4074
4547
  get: get
4075
4548
  };
4076
4549
  };
4550
+ var nu$4 = function (baseFn) {
4551
+ return make(function () {
4552
+ return new Promise(baseFn);
4553
+ });
4554
+ };
4077
4555
  var pure$1 = function (a) {
4078
- return nu$4(function (callback) {
4079
- callback(a);
4556
+ return make(function () {
4557
+ return Promise.resolve(a);
4080
4558
  });
4081
4559
  };
4082
4560
  var Future = {
@@ -4208,9 +4686,15 @@
4208
4686
  toOption: Option.none
4209
4687
  };
4210
4688
  };
4689
+ var fromOption = function (opt, err) {
4690
+ return opt.fold(function () {
4691
+ return error(err);
4692
+ }, value);
4693
+ };
4211
4694
  var Result = {
4212
4695
  value: value,
4213
- error: error
4696
+ error: error,
4697
+ fromOption: fromOption
4214
4698
  };
4215
4699
 
4216
4700
  function StyleSheetLoader(document, settings) {
@@ -4581,6 +5065,9 @@
4581
5065
  return !!node && node.nodeType === type;
4582
5066
  };
4583
5067
  };
5068
+ var isRestrictedNode = function (node) {
5069
+ return !!node && !Object.getPrototypeOf(node);
5070
+ };
4584
5071
  var isElement$1 = isNodeType(1);
4585
5072
  var matchNodeNames = function (names) {
4586
5073
  var items = names.toLowerCase().split(' ');
@@ -4666,6 +5153,7 @@
4666
5153
  isBr: isBr$1,
4667
5154
  isContentEditableTrue: isContentEditableTrue,
4668
5155
  isContentEditableFalse: isContentEditableFalse,
5156
+ isRestrictedNode: isRestrictedNode,
4669
5157
  matchNodeNames: matchNodeNames,
4670
5158
  hasPropValue: hasPropValue,
4671
5159
  hasAttribute: hasAttribute,
@@ -5169,7 +5657,7 @@
5169
5657
  textBlockElementsMap = createLookupTable('text_block_elements', 'h1 h2 h3 h4 h5 h6 p div address pre form ' + 'blockquote center dir fieldset header footer article section hgroup aside main nav figure');
5170
5658
  blockElementsMap = createLookupTable('block_elements', 'hr table tbody thead tfoot ' + 'th tr td li ol ul caption dl dt dd noscript menu isindex option ' + 'datalist select optgroup figcaption details summary', textBlockElementsMap);
5171
5659
  textInlineElementsMap = createLookupTable('text_inline_elements', 'span strong b em i font strike u var cite ' + 'dfn code mark q sup sub samp');
5172
- each$4((settings.special || 'script noscript noframes noembed title style textarea xmp').split(' '), function (name) {
5660
+ each$4((settings.special || 'script noscript iframe noframes noembed title style textarea xmp').split(' '), function (name) {
5173
5661
  specialElements[name] = new RegExp('</' + name + '[^>]*>', 'gi');
5174
5662
  });
5175
5663
  var patternToRegExp = function (str) {
@@ -5938,7 +6426,7 @@
5938
6426
  var getViewPort = function (argWin) {
5939
6427
  var actWin = !argWin ? win : argWin;
5940
6428
  var doc = actWin.document;
5941
- var rootElm = doc.documentElement;
6429
+ var rootElm = doc.documentElement ;
5942
6430
  return {
5943
6431
  x: actWin.pageXOffset || rootElm.scrollLeft,
5944
6432
  y: actWin.pageYOffset || rootElm.scrollTop,
@@ -6176,12 +6664,14 @@
6176
6664
  var node;
6177
6665
  var container = doc.createElement('div');
6178
6666
  var frag = doc.createDocumentFragment();
6667
+ frag.appendChild(container);
6179
6668
  if (html) {
6180
6669
  container.innerHTML = html;
6181
6670
  }
6182
6671
  while (node = container.firstChild) {
6183
6672
  frag.appendChild(node);
6184
6673
  }
6674
+ frag.removeChild(container);
6185
6675
  return frag;
6186
6676
  };
6187
6677
  var remove = function (node, keepChildren) {
@@ -6993,8 +7483,9 @@
6993
7483
  for (var _i = 0; _i < arguments.length; _i++) {
6994
7484
  args[_i] = arguments[_i];
6995
7485
  }
6996
- if (timer !== null)
7486
+ if (timer !== null) {
6997
7487
  domGlobals.clearTimeout(timer);
7488
+ }
6998
7489
  timer = domGlobals.setTimeout(function () {
6999
7490
  fn.apply(null, args);
7000
7491
  timer = null;
@@ -7119,8 +7610,8 @@
7119
7610
  return Option.none();
7120
7611
  };
7121
7612
  var closest = function (scope, predicate, isRoot) {
7122
- var is = function (s) {
7123
- return predicate(s);
7613
+ var is = function (s, test) {
7614
+ return test(s);
7124
7615
  };
7125
7616
  return ClosestOrAncestor(is, ancestor, scope, predicate, isRoot);
7126
7617
  };
@@ -7312,17 +7803,38 @@
7312
7803
  };
7313
7804
  };
7314
7805
 
7806
+ var __assign = function () {
7807
+ __assign = Object.assign || function __assign(t) {
7808
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
7809
+ s = arguments[i];
7810
+ for (var p in s)
7811
+ if (Object.prototype.hasOwnProperty.call(s, p))
7812
+ t[p] = s[p];
7813
+ }
7814
+ return t;
7815
+ };
7816
+ return __assign.apply(this, arguments);
7817
+ };
7315
7818
  function __rest(s, e) {
7316
7819
  var t = {};
7317
7820
  for (var p in s)
7318
7821
  if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
7319
7822
  t[p] = s[p];
7320
7823
  if (s != null && typeof Object.getOwnPropertySymbols === 'function')
7321
- for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++)
7322
- if (e.indexOf(p[i]) < 0)
7824
+ for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
7825
+ if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
7323
7826
  t[p[i]] = s[p[i]];
7827
+ }
7324
7828
  return t;
7325
7829
  }
7830
+ function __spreadArrays() {
7831
+ for (var s = 0, i = 0, il = arguments.length; i < il; i++)
7832
+ s += arguments[i].length;
7833
+ for (var r = Array(s), k = 0, i = 0; i < il; i++)
7834
+ for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)
7835
+ r[k] = a[j];
7836
+ return r;
7837
+ }
7326
7838
 
7327
7839
  var unique = 0;
7328
7840
  var generate = function (prefix) {
@@ -7591,7 +8103,8 @@
7591
8103
  return overflowY >= 0 && overflowY <= Math.min(rect1.height, rect2.height) / 2;
7592
8104
  };
7593
8105
  var isAbove = function (rect1, rect2) {
7594
- if (rect1.bottom - rect1.height / 2 < rect2.top) {
8106
+ var halfHeight = Math.min(rect2.height / 2, rect1.height / 2);
8107
+ if (rect1.bottom - halfHeight < rect2.top) {
7595
8108
  return true;
7596
8109
  }
7597
8110
  if (rect1.top > rect2.bottom) {
@@ -7649,31 +8162,25 @@
7649
8162
  return container;
7650
8163
  };
7651
8164
 
7652
- var extendingChars = new RegExp('[\u0300-\u036f\u0483-\u0487\u0488-\u0489\u0591-\u05bd\u05bf\u05c1-\u05c2\u05c4-\u05c5\u05c7\u0610-\u061a' + '\u064b-\u065f\u0670\u06d6-\u06dc\u06df-\u06e4\u06e7-\u06e8\u06ea-\u06ed\u0711\u0730-\u074a\u07a6-\u07b0' + '\u07eb-\u07f3\u0816-\u0819\u081b-\u0823\u0825-\u0827\u0829-\u082d\u0859-\u085b\u08E3-\u0902\u093a\u093c' + '\u0941-\u0948\u094d\u0951-\u0957\u0962-\u0963\u0981\u09bc\u09be\u09c1-\u09c4\u09cd\u09d7\u09e2-\u09e3' + '\u0a01-\u0a02\u0a3c\u0a41-\u0a42\u0a47-\u0a48\u0a4b-\u0a4d\u0a51\u0a70-\u0a71\u0a75\u0a81-\u0a82\u0abc' + '\u0ac1-\u0ac5\u0ac7-\u0ac8\u0acd\u0ae2-\u0ae3\u0b01\u0b3c\u0b3e\u0b3f\u0b41-\u0b44\u0b4d\u0b56\u0b57' + '\u0b62-\u0b63\u0b82\u0bbe\u0bc0\u0bcd\u0bd7\u0c00\u0c3e-\u0c40\u0c46-\u0c48\u0c4a-\u0c4d\u0c55-\u0c56' + '\u0c62-\u0c63\u0c81\u0cbc\u0cbf\u0cc2\u0cc6\u0ccc-\u0ccd\u0cd5-\u0cd6\u0ce2-\u0ce3\u0d01\u0d3e\u0d41-\u0d44' + '\u0d4d\u0d57\u0d62-\u0d63\u0dca\u0dcf\u0dd2-\u0dd4\u0dd6\u0ddf\u0e31\u0e34-\u0e3a\u0e47-\u0e4e\u0eb1\u0eb4-\u0eb9' + '\u0ebb-\u0ebc\u0ec8-\u0ecd\u0f18-\u0f19\u0f35\u0f37\u0f39\u0f71-\u0f7e\u0f80-\u0f84\u0f86-\u0f87\u0f8d-\u0f97' + '\u0f99-\u0fbc\u0fc6\u102d-\u1030\u1032-\u1037\u1039-\u103a\u103d-\u103e\u1058-\u1059\u105e-\u1060\u1071-\u1074' + '\u1082\u1085-\u1086\u108d\u109d\u135d-\u135f\u1712-\u1714\u1732-\u1734\u1752-\u1753\u1772-\u1773\u17b4-\u17b5' + '\u17b7-\u17bd\u17c6\u17c9-\u17d3\u17dd\u180b-\u180d\u18a9\u1920-\u1922\u1927-\u1928\u1932\u1939-\u193b\u1a17-\u1a18' + '\u1a1b\u1a56\u1a58-\u1a5e\u1a60\u1a62\u1a65-\u1a6c\u1a73-\u1a7c\u1a7f\u1ab0-\u1abd\u1ABE\u1b00-\u1b03\u1b34' + '\u1b36-\u1b3a\u1b3c\u1b42\u1b6b-\u1b73\u1b80-\u1b81\u1ba2-\u1ba5\u1ba8-\u1ba9\u1bab-\u1bad\u1be6\u1be8-\u1be9' + '\u1bed\u1bef-\u1bf1\u1c2c-\u1c33\u1c36-\u1c37\u1cd0-\u1cd2\u1cd4-\u1ce0\u1ce2-\u1ce8\u1ced\u1cf4\u1cf8-\u1cf9' + '\u1dc0-\u1df5\u1dfc-\u1dff\u200c-\u200d\u20d0-\u20dc\u20DD-\u20E0\u20e1\u20E2-\u20E4\u20e5-\u20f0\u2cef-\u2cf1' + '\u2d7f\u2de0-\u2dff\u302a-\u302d\u302e-\u302f\u3099-\u309a\ua66f\uA670-\uA672\ua674-\ua67d\uA69E-\ua69f\ua6f0-\ua6f1' + '\ua802\ua806\ua80b\ua825-\ua826\ua8c4\ua8e0-\ua8f1\ua926-\ua92d\ua947-\ua951\ua980-\ua982\ua9b3\ua9b6-\ua9b9\ua9bc' + '\ua9e5\uaa29-\uaa2e\uaa31-\uaa32\uaa35-\uaa36\uaa43\uaa4c\uaa7c\uaab0\uaab2-\uaab4\uaab7-\uaab8\uaabe-\uaabf\uaac1' + '\uaaec-\uaaed\uaaf6\uabe5\uabe8\uabed\ufb1e\ufe00-\ufe0f\ufe20-\uFE2F\uff9e-\uff9f]');
8165
+ var extendingChars = new RegExp('[\u0300-\u036f\u0483-\u0487\u0488-\u0489\u0591-\u05bd\u05bf\u05c1-\u05c2\u05c4-\u05c5\u05c7\u0610-\u061a' + '\u064b-\u065f\u0670\u06d6-\u06dc\u06df-\u06e4\u06e7-\u06e8\u06ea-\u06ed\u0711\u0730-\u074a\u07a6-\u07b0' + '\u07eb-\u07f3\u0816-\u0819\u081b-\u0823\u0825-\u0827\u0829-\u082d\u0859-\u085b\u08e3-\u0902\u093a\u093c' + '\u0941-\u0948\u094d\u0951-\u0957\u0962-\u0963\u0981\u09bc\u09be\u09c1-\u09c4\u09cd\u09d7\u09e2-\u09e3' + '\u0a01-\u0a02\u0a3c\u0a41-\u0a42\u0a47-\u0a48\u0a4b-\u0a4d\u0a51\u0a70-\u0a71\u0a75\u0a81-\u0a82\u0abc' + '\u0ac1-\u0ac5\u0ac7-\u0ac8\u0acd\u0ae2-\u0ae3\u0b01\u0b3c\u0b3e\u0b3f\u0b41-\u0b44\u0b4d\u0b56\u0b57' + '\u0b62-\u0b63\u0b82\u0bbe\u0bc0\u0bcd\u0bd7\u0c00\u0c3e-\u0c40\u0c46-\u0c48\u0c4a-\u0c4d\u0c55-\u0c56' + '\u0c62-\u0c63\u0c81\u0cbc\u0cbf\u0cc2\u0cc6\u0ccc-\u0ccd\u0cd5-\u0cd6\u0ce2-\u0ce3\u0d01\u0d3e\u0d41-\u0d44' + '\u0d4d\u0d57\u0d62-\u0d63\u0dca\u0dcf\u0dd2-\u0dd4\u0dd6\u0ddf\u0e31\u0e34-\u0e3a\u0e47-\u0e4e\u0eb1\u0eb4-\u0eb9' + '\u0ebb-\u0ebc\u0ec8-\u0ecd\u0f18-\u0f19\u0f35\u0f37\u0f39\u0f71-\u0f7e\u0f80-\u0f84\u0f86-\u0f87\u0f8d-\u0f97' + '\u0f99-\u0fbc\u0fc6\u102d-\u1030\u1032-\u1037\u1039-\u103a\u103d-\u103e\u1058-\u1059\u105e-\u1060\u1071-\u1074' + '\u1082\u1085-\u1086\u108d\u109d\u135d-\u135f\u1712-\u1714\u1732-\u1734\u1752-\u1753\u1772-\u1773\u17b4-\u17b5' + '\u17b7-\u17bd\u17c6\u17c9-\u17d3\u17dd\u180b-\u180d\u18a9\u1920-\u1922\u1927-\u1928\u1932\u1939-\u193b\u1a17-\u1a18' + '\u1a1b\u1a56\u1a58-\u1a5e\u1a60\u1a62\u1a65-\u1a6c\u1a73-\u1a7c\u1a7f\u1ab0-\u1abd\u1ABE\u1b00-\u1b03\u1b34' + '\u1b36-\u1b3a\u1b3c\u1b42\u1b6b-\u1b73\u1b80-\u1b81\u1ba2-\u1ba5\u1ba8-\u1ba9\u1bab-\u1bad\u1be6\u1be8-\u1be9' + '\u1bed\u1bef-\u1bf1\u1c2c-\u1c33\u1c36-\u1c37\u1cd0-\u1cd2\u1cd4-\u1ce0\u1ce2-\u1ce8\u1ced\u1cf4\u1cf8-\u1cf9' + '\u1dc0-\u1df5\u1dfc-\u1dff\u200c-\u200d\u20d0-\u20dc\u20DD-\u20E0\u20e1\u20E2-\u20E4\u20e5-\u20f0\u2cef-\u2cf1' + '\u2d7f\u2de0-\u2dff\u302a-\u302d\u302e-\u302f\u3099-\u309a\ua66f\uA670-\uA672\ua674-\ua67d\ua69e-\ua69f\ua6f0-\ua6f1' + '\ua802\ua806\ua80b\ua825-\ua826\ua8c4\ua8e0-\ua8f1\ua926-\ua92d\ua947-\ua951\ua980-\ua982\ua9b3\ua9b6-\ua9b9\ua9bc' + '\ua9e5\uaa29-\uaa2e\uaa31-\uaa32\uaa35-\uaa36\uaa43\uaa4c\uaa7c\uaab0\uaab2-\uaab4\uaab7-\uaab8\uaabe-\uaabf\uaac1' + '\uaaec-\uaaed\uaaf6\uabe5\uabe8\uabed\ufb1e\ufe00-\ufe0f\ufe20-\ufe2f\uff9e-\uff9f]');
7653
8166
  var isExtendingChar = function (ch) {
7654
8167
  return typeof ch === 'string' && ch.charCodeAt(0) >= 768 && extendingChars.test(ch);
7655
8168
  };
7656
8169
 
7657
- var liftN = function (arr, f) {
7658
- var r = [];
7659
- for (var i = 0; i < arr.length; i++) {
7660
- var x = arr[i];
7661
- if (x.isSome()) {
7662
- r.push(x.getOrDie());
7663
- } else {
7664
- return Option.none();
7665
- }
7666
- }
7667
- return Option.some(f.apply(null, r));
8170
+ var lift2 = function (oa, ob, f) {
8171
+ return oa.isSome() && ob.isSome() ? Option.some(f(oa.getOrDie(), ob.getOrDie())) : Option.none();
8172
+ };
8173
+ var lift3 = function (oa, ob, oc, f) {
8174
+ return oa.isSome() && ob.isSome() && oc.isSome() ? Option.some(f(oa.getOrDie(), ob.getOrDie(), oc.getOrDie())) : Option.none();
7668
8175
  };
7669
8176
 
7670
- var slice$3 = [].slice;
8177
+ var slice$2 = [].slice;
7671
8178
  var or = function () {
7672
8179
  var x = [];
7673
8180
  for (var _i = 0; _i < arguments.length; _i++) {
7674
8181
  x[_i] = arguments[_i];
7675
8182
  }
7676
- var args = slice$3.call(arguments);
8183
+ var args = slice$2.call(arguments);
7677
8184
  return function (x) {
7678
8185
  for (var i = 0; i < args.length; i++) {
7679
8186
  if (args[i](x)) {
@@ -7688,7 +8195,7 @@
7688
8195
  for (var _i = 0; _i < arguments.length; _i++) {
7689
8196
  x[_i] = arguments[_i];
7690
8197
  }
7691
- var args = slice$3.call(arguments);
8198
+ var args = slice$2.call(arguments);
7692
8199
  return function (x) {
7693
8200
  for (var i = 0; i < args.length; i++) {
7694
8201
  if (!args[i](x)) {
@@ -7925,16 +8432,10 @@
7925
8432
  return CaretPosition(node.parentNode, nodeIndex(node));
7926
8433
  };
7927
8434
  CaretPosition.isAbove = function (pos1, pos2) {
7928
- return liftN([
7929
- head(pos2.getClientRects()),
7930
- last(pos1.getClientRects())
7931
- ], isAbove).getOr(false);
8435
+ return lift2(head(pos2.getClientRects()), last(pos1.getClientRects()), isAbove).getOr(false);
7932
8436
  };
7933
8437
  CaretPosition.isBelow = function (pos1, pos2) {
7934
- return liftN([
7935
- last(pos2.getClientRects()),
7936
- head(pos1.getClientRects())
7937
- ], isBelow).getOr(false);
8438
+ return lift2(last(pos2.getClientRects()), head(pos1.getClientRects()), isBelow).getOr(false);
7938
8439
  };
7939
8440
  CaretPosition.isAtStart = function (pos) {
7940
8441
  return pos ? pos.isAtStart() : false;
@@ -9048,7 +9549,7 @@
9048
9549
  };
9049
9550
 
9050
9551
  var addBogus = function (dom, node) {
9051
- if (dom.isBlock(node) && !node.innerHTML && !Env.ie) {
9552
+ if (NodeType.isElement(node) && dom.isBlock(node) && !node.innerHTML && !Env.ie) {
9052
9553
  node.innerHTML = '<br data-mce-bogus="1" />';
9053
9554
  }
9054
9555
  return node;
@@ -9211,10 +9712,7 @@
9211
9712
  var resolveId = function (dom, bookmark) {
9212
9713
  var startPos = restoreEndPoint(dom, 'start', bookmark);
9213
9714
  var endPos = restoreEndPoint(dom, 'end', bookmark);
9214
- return liftN([
9215
- startPos,
9216
- alt(endPos, startPos)
9217
- ], function (spos, epos) {
9715
+ return lift2(startPos, alt(endPos, startPos), function (spos, epos) {
9218
9716
  var rng = dom.createRng();
9219
9717
  rng.setStart(addBogus(dom, spos.container()), spos.offset());
9220
9718
  rng.setEnd(addBogus(dom, epos.container()), epos.offset());
@@ -9764,18 +10262,9 @@
9764
10262
  }
9765
10263
  return getOption(element).getOr('');
9766
10264
  };
9767
- var getOptionIE10 = function (element) {
9768
- try {
9769
- return getOptionSafe(element);
9770
- } catch (e) {
9771
- return Option.none();
9772
- }
9773
- };
9774
- var getOptionSafe = function (element) {
10265
+ var getOption = function (element) {
9775
10266
  return is(element) ? Option.from(element.dom().nodeValue) : Option.none();
9776
10267
  };
9777
- var browser = PlatformDetection$1.detect().browser;
9778
- var getOption = browser.isIE() && browser.version.major === 10 ? getOptionIE10 : getOptionSafe;
9779
10268
  var set = function (element, value) {
9780
10269
  if (!is(element)) {
9781
10270
  throw new Error('Can only set raw ' + name + ' value of a ' + name + ' node');
@@ -9906,7 +10395,7 @@
9906
10395
  function Annotator (editor) {
9907
10396
  var registry = create$1();
9908
10397
  setup$1(editor, registry);
9909
- var changes = setup(editor, registry);
10398
+ var changes = setup(editor);
9910
10399
  return {
9911
10400
  register: function (name, settings) {
9912
10401
  registry.register(name, settings);
@@ -10665,165 +11154,129 @@
10665
11154
  };
10666
11155
  var InsertContent = { insertAtCaret: insertAtCaret$1 };
10667
11156
 
10668
- var sectionResult = Immutable('sections', 'settings');
10669
- var detection = PlatformDetection$1.detect();
10670
- var isTouch = detection.deviceType.isTouch();
10671
- var mobilePlugins = [
10672
- 'lists',
10673
- 'autolink',
10674
- 'autosave'
10675
- ];
10676
- var defaultMobileSettings = { theme: 'mobile' };
10677
- var normalizePlugins = function (plugins) {
10678
- var pluginNames = isArray(plugins) ? plugins.join(' ') : plugins;
10679
- var trimmedPlugins = map(isString(pluginNames) ? pluginNames.split(' ') : [], trim$2);
10680
- return filter(trimmedPlugins, function (item) {
10681
- return item.length > 0;
10682
- });
11157
+ var strongRtl = /[\u0591-\u07FF\uFB1D-\uFDFF\uFE70-\uFEFC]/;
11158
+ var hasStrongRtl = function (text) {
11159
+ return strongRtl.test(text);
10683
11160
  };
10684
- var filterMobilePlugins = function (plugins) {
10685
- return filter(plugins, curry(contains, mobilePlugins));
11161
+
11162
+ var getBodySetting = function (editor, name, defaultValue) {
11163
+ var value = editor.getParam(name, defaultValue);
11164
+ if (value.indexOf('=') !== -1) {
11165
+ var bodyObj = editor.getParam(name, '', 'hash');
11166
+ return bodyObj.hasOwnProperty(editor.id) ? bodyObj[editor.id] : defaultValue;
11167
+ } else {
11168
+ return value;
11169
+ }
10686
11170
  };
10687
- var extractSections = function (keys, settings) {
10688
- var result = bifilter(settings, function (value, key) {
10689
- return contains(keys, key);
10690
- });
10691
- return sectionResult(result.t, result.f);
11171
+ var getIframeAttrs = function (editor) {
11172
+ return editor.getParam('iframe_attrs', {});
10692
11173
  };
10693
- var getSection = function (sectionResult, name, defaults) {
10694
- var sections = sectionResult.sections();
10695
- var sectionSettings = sections.hasOwnProperty(name) ? sections[name] : {};
10696
- return Tools.extend({}, defaults, sectionSettings);
11174
+ var getDocType = function (editor) {
11175
+ return editor.getParam('doctype', '<!DOCTYPE html>');
10697
11176
  };
10698
- var hasSection = function (sectionResult, name) {
10699
- return sectionResult.sections().hasOwnProperty(name);
11177
+ var getDocumentBaseUrl = function (editor) {
11178
+ return editor.getParam('document_base_url', '');
10700
11179
  };
10701
- var getDefaultSettings = function (id, documentBaseUrl, editor) {
10702
- return {
10703
- id: id,
10704
- theme: 'modern',
10705
- delta_width: 0,
10706
- delta_height: 0,
10707
- popup_css: '',
10708
- plugins: '',
10709
- document_base_url: documentBaseUrl,
10710
- add_form_submit_trigger: true,
10711
- submit_patch: true,
10712
- add_unload_trigger: true,
10713
- convert_urls: true,
10714
- relative_urls: true,
10715
- remove_script_host: true,
10716
- object_resizing: true,
10717
- doctype: '<!DOCTYPE html>',
10718
- visual: true,
10719
- font_size_style_values: 'xx-small,x-small,small,medium,large,x-large,xx-large',
10720
- font_size_legacy_values: 'xx-small,small,medium,large,x-large,xx-large,300%',
10721
- forced_root_block: 'p',
10722
- hidden_input: true,
10723
- render_ui: true,
10724
- indentation: '40px',
10725
- inline_styles: true,
10726
- convert_fonts_to_spans: true,
10727
- indent: 'simple',
10728
- indent_before: 'p,h1,h2,h3,h4,h5,h6,blockquote,div,title,style,pre,script,td,th,ul,ol,li,dl,dt,dd,area,table,thead,' + 'tfoot,tbody,tr,section,summary,article,hgroup,aside,figure,figcaption,option,optgroup,datalist',
10729
- indent_after: 'p,h1,h2,h3,h4,h5,h6,blockquote,div,title,style,pre,script,td,th,ul,ol,li,dl,dt,dd,area,table,thead,' + 'tfoot,tbody,tr,section,summary,article,hgroup,aside,figure,figcaption,option,optgroup,datalist',
10730
- entity_encoding: 'named',
10731
- url_converter: editor.convertURL,
10732
- url_converter_scope: editor,
10733
- ie7_compat: true
10734
- };
11180
+ var getBodyId = function (editor) {
11181
+ return getBodySetting(editor, 'body_id', 'tinymce');
10735
11182
  };
10736
- var getExternalPlugins = function (overrideSettings, settings) {
10737
- var userDefinedExternalPlugins = settings.external_plugins ? settings.external_plugins : {};
10738
- if (overrideSettings && overrideSettings.external_plugins) {
10739
- return Tools.extend({}, overrideSettings.external_plugins, userDefinedExternalPlugins);
10740
- } else {
10741
- return userDefinedExternalPlugins;
11183
+ var getBodyClass = function (editor) {
11184
+ return getBodySetting(editor, 'body_class', '');
11185
+ };
11186
+ var getContentSecurityPolicy = function (editor) {
11187
+ return editor.getParam('content_security_policy', '');
11188
+ };
11189
+ var shouldPutBrInPre = function (editor) {
11190
+ return editor.getParam('br_in_pre', true);
11191
+ };
11192
+ var getForcedRootBlock = function (editor) {
11193
+ if (editor.getParam('force_p_newlines', false)) {
11194
+ return 'p';
10742
11195
  }
11196
+ var block = editor.getParam('forced_root_block', 'p');
11197
+ return block === false ? '' : block;
10743
11198
  };
10744
- var combinePlugins = function (forcedPlugins, plugins) {
10745
- return [].concat(normalizePlugins(forcedPlugins)).concat(normalizePlugins(plugins));
11199
+ var getForcedRootBlockAttrs = function (editor) {
11200
+ return editor.getParam('forced_root_block_attrs', {});
10746
11201
  };
10747
- var processPlugins = function (isTouchDevice, sectionResult, defaultOverrideSettings, settings) {
10748
- var forcedPlugins = normalizePlugins(defaultOverrideSettings.forced_plugins);
10749
- var plugins = normalizePlugins(settings.plugins);
10750
- var platformPlugins = isTouchDevice && hasSection(sectionResult, 'mobile') ? filterMobilePlugins(plugins) : plugins;
10751
- var combinedPlugins = combinePlugins(forcedPlugins, platformPlugins);
10752
- return Tools.extend(settings, { plugins: combinedPlugins.join(' ') });
11202
+ var getBrNewLineSelector = function (editor) {
11203
+ return editor.getParam('br_newline_selector', '.mce-toc h2,figcaption,caption');
10753
11204
  };
10754
- var isOnMobile = function (isTouchDevice, sectionResult) {
10755
- var isInline = sectionResult.settings().inline;
10756
- return isTouchDevice && hasSection(sectionResult, 'mobile') && !isInline;
11205
+ var getNoNewLineSelector = function (editor) {
11206
+ return editor.getParam('no_newline_selector', '');
10757
11207
  };
10758
- var combineSettings = function (isTouchDevice, defaultSettings, defaultOverrideSettings, settings) {
10759
- var sectionResult = extractSections(['mobile'], settings);
10760
- var extendedSettings = Tools.extend(defaultSettings, defaultOverrideSettings, sectionResult.settings(), isOnMobile(isTouchDevice, sectionResult) ? getSection(sectionResult, 'mobile', defaultMobileSettings) : {}, {
10761
- validate: true,
10762
- content_editable: sectionResult.settings().inline,
10763
- external_plugins: getExternalPlugins(defaultOverrideSettings, sectionResult.settings())
10764
- });
10765
- return processPlugins(isTouchDevice, sectionResult, defaultOverrideSettings, extendedSettings);
11208
+ var shouldKeepStyles = function (editor) {
11209
+ return editor.getParam('keep_styles', true);
10766
11210
  };
10767
- var getEditorSettings = function (editor, id, documentBaseUrl, defaultOverrideSettings, settings) {
10768
- var defaultSettings = getDefaultSettings(id, documentBaseUrl, editor);
10769
- return combineSettings(isTouch, defaultSettings, defaultOverrideSettings, settings);
11211
+ var shouldEndContainerOnEmptyBlock = function (editor) {
11212
+ return editor.getParam('end_container_on_empty_block', false);
10770
11213
  };
10771
- var getFiltered = function (predicate, editor, name) {
10772
- return Option.from(editor.settings[name]).filter(predicate);
11214
+ var getFontStyleValues = function (editor) {
11215
+ return Tools.explode(editor.getParam('font_size_style_values', ''));
10773
11216
  };
10774
- var getString = curry(getFiltered, isString);
10775
- var getParamObject = function (value) {
10776
- var output = {};
10777
- if (typeof value === 'string') {
10778
- each(value.indexOf('=') > 0 ? value.split(/[;,](?![^=;,]*(?:[;,]|$))/) : value.split(','), function (val) {
10779
- var arr = val.split('=');
10780
- if (arr.length > 1) {
10781
- output[Tools.trim(arr[0])] = Tools.trim(arr[1]);
10782
- } else {
10783
- output[Tools.trim(arr[0])] = Tools.trim(arr);
10784
- }
10785
- });
10786
- } else {
10787
- output = value;
10788
- }
10789
- return output;
11217
+ var getFontSizeClasses = function (editor) {
11218
+ return Tools.explode(editor.getParam('font_size_classes', ''));
10790
11219
  };
10791
- var isArrayOf = function (p) {
10792
- return function (a) {
10793
- return isArray(a) && forall(a, p);
10794
- };
11220
+ var getImagesDataImgFilter = function (editor) {
11221
+ return editor.getParam('images_dataimg_filter', constant(true), 'function');
10795
11222
  };
10796
- var getParam = function (editor, name, defaultVal, type) {
10797
- var value = name in editor.settings ? editor.settings[name] : defaultVal;
10798
- if (type === 'hash') {
10799
- return getParamObject(value);
10800
- } else if (type === 'string') {
10801
- return getFiltered(isString, editor, name).getOr(defaultVal);
10802
- } else if (type === 'number') {
10803
- return getFiltered(isNumber, editor, name).getOr(defaultVal);
10804
- } else if (type === 'boolean') {
10805
- return getFiltered(isBoolean, editor, name).getOr(defaultVal);
10806
- } else if (type === 'object') {
10807
- return getFiltered(isObject, editor, name).getOr(defaultVal);
10808
- } else if (type === 'array') {
10809
- return getFiltered(isArray, editor, name).getOr(defaultVal);
10810
- } else if (type === 'string[]') {
10811
- return getFiltered(isArrayOf(isString), editor, name).getOr(defaultVal);
10812
- } else if (type === 'function') {
10813
- return getFiltered(isFunction, editor, name).getOr(defaultVal);
10814
- } else {
10815
- return value;
10816
- }
11223
+ var isAutomaticUploadsEnabled = function (editor) {
11224
+ return editor.getParam('automatic_uploads', true, 'boolean');
10817
11225
  };
10818
-
10819
- var strongRtl = /[\u0591-\u07FF\uFB1D-\uFDFF\uFE70-\uFEFC]/;
10820
- var hasStrongRtl = function (text) {
10821
- return strongRtl.test(text);
11226
+ var shouldReuseFileName = function (editor) {
11227
+ return editor.getParam('images_reuse_filename', false, 'boolean');
11228
+ };
11229
+ var shouldReplaceBlobUris = function (editor) {
11230
+ return editor.getParam('images_replace_blob_uris', true, 'boolean');
11231
+ };
11232
+ var getImageUploadUrl = function (editor) {
11233
+ return editor.getParam('images_upload_url', '', 'string');
11234
+ };
11235
+ var getImageUploadBasePath = function (editor) {
11236
+ return editor.getParam('images_upload_base_path', '', 'string');
11237
+ };
11238
+ var getImagesUploadCredentials = function (editor) {
11239
+ return editor.getParam('images_upload_credentials', false, 'boolean');
11240
+ };
11241
+ var getImagesUploadHandler = function (editor) {
11242
+ return editor.getParam('images_upload_handler', null, 'function');
11243
+ };
11244
+ var shouldUseContentCssCors = function (editor) {
11245
+ return editor.getParam('content_css_cors', false, 'boolean');
11246
+ };
11247
+ var getInlineBoundarySelector = function (editor) {
11248
+ return editor.getParam('inline_boundaries_selector', 'a[href],code,.mce-annotation', 'string');
11249
+ };
11250
+ var Settings = {
11251
+ getIframeAttrs: getIframeAttrs,
11252
+ getDocType: getDocType,
11253
+ getDocumentBaseUrl: getDocumentBaseUrl,
11254
+ getBodyId: getBodyId,
11255
+ getBodyClass: getBodyClass,
11256
+ getContentSecurityPolicy: getContentSecurityPolicy,
11257
+ shouldPutBrInPre: shouldPutBrInPre,
11258
+ getForcedRootBlock: getForcedRootBlock,
11259
+ getForcedRootBlockAttrs: getForcedRootBlockAttrs,
11260
+ getBrNewLineSelector: getBrNewLineSelector,
11261
+ getNoNewLineSelector: getNoNewLineSelector,
11262
+ shouldKeepStyles: shouldKeepStyles,
11263
+ shouldEndContainerOnEmptyBlock: shouldEndContainerOnEmptyBlock,
11264
+ getFontStyleValues: getFontStyleValues,
11265
+ getFontSizeClasses: getFontSizeClasses,
11266
+ getImagesDataImgFilter: getImagesDataImgFilter,
11267
+ isAutomaticUploadsEnabled: isAutomaticUploadsEnabled,
11268
+ shouldReuseFileName: shouldReuseFileName,
11269
+ shouldReplaceBlobUris: shouldReplaceBlobUris,
11270
+ getImageUploadUrl: getImageUploadUrl,
11271
+ getImageUploadBasePath: getImageUploadBasePath,
11272
+ getImagesUploadCredentials: getImagesUploadCredentials,
11273
+ getImagesUploadHandler: getImagesUploadHandler,
11274
+ shouldUseContentCssCors: shouldUseContentCssCors,
11275
+ getInlineBoundarySelector: getInlineBoundarySelector
10822
11276
  };
10823
11277
 
10824
11278
  var isInlineTarget = function (editor, elm) {
10825
- var selector = getString(editor, 'inline_boundaries_selector').getOr('a[href],code');
10826
- return is$1(Element.fromDom(elm), selector);
11279
+ return is$1(Element.fromDom(elm), Settings.getInlineBoundarySelector(editor));
10827
11280
  };
10828
11281
  var isRtl = function (element) {
10829
11282
  return DOMUtils$1.DOM.getStyle(element, 'direction', true) === 'rtl' || hasStrongRtl(element.textContent);
@@ -10905,10 +11358,7 @@
10905
11358
  }
10906
11359
  };
10907
11360
  var willDeleteLastPositionInElement = function (forward, fromPos, elm) {
10908
- return liftN([
10909
- CaretFinder.firstPositionIn(elm),
10910
- CaretFinder.lastPositionIn(elm)
10911
- ], function (firstPos, lastPos) {
11361
+ return lift2(CaretFinder.firstPositionIn(elm), CaretFinder.lastPositionIn(elm), function (firstPos, lastPos) {
10912
11362
  var normalizedFirstPos = InlineUtils.normalizePosition(true, firstPos);
10913
11363
  var normalizedLastPos = InlineUtils.normalizePosition(false, lastPos);
10914
11364
  var normalizedFromPos = InlineUtils.normalizePosition(false, fromPos);
@@ -11007,7 +11457,7 @@
11007
11457
  }).isSome();
11008
11458
  };
11009
11459
  var isEditable = function (blockBoundary) {
11010
- return NodeType.isContentEditableFalse(blockBoundary.from().block()) === false && NodeType.isContentEditableFalse(blockBoundary.to().block()) === false;
11460
+ return NodeType.isContentEditableFalse(blockBoundary.from().block().dom()) === false && NodeType.isContentEditableFalse(blockBoundary.to().block().dom()) === false;
11011
11461
  };
11012
11462
  var skipLastBr = function (rootNode, forward, blockPosition) {
11013
11463
  if (NodeType.isBr(blockPosition.position().getNode()) && Empty.isEmpty(blockPosition.block()) === false) {
@@ -11033,10 +11483,7 @@
11033
11483
  });
11034
11484
  });
11035
11485
  });
11036
- return liftN([
11037
- fromBlockPos,
11038
- toBlockPos
11039
- ], BlockBoundary).filter(function (blockBoundary) {
11486
+ return lift2(fromBlockPos, toBlockPos, BlockBoundary).filter(function (blockBoundary) {
11040
11487
  return isDifferentBlocks(blockBoundary) && hasSameParent(blockBoundary) && isEditable(blockBoundary);
11041
11488
  });
11042
11489
  };
@@ -11158,10 +11605,7 @@
11158
11605
 
11159
11606
  var deleteRangeMergeBlocks = function (rootNode, selection) {
11160
11607
  var rng = selection.getRng();
11161
- return liftN([
11162
- DeleteUtils.getParentBlock(rootNode, Element.fromDom(rng.startContainer)),
11163
- DeleteUtils.getParentBlock(rootNode, Element.fromDom(rng.endContainer))
11164
- ], function (block1, block2) {
11608
+ return lift2(DeleteUtils.getParentBlock(rootNode, Element.fromDom(rng.startContainer)), DeleteUtils.getParentBlock(rootNode, Element.fromDom(rng.endContainer)), function (block1, block2) {
11165
11609
  if (eq(block1, block2) === false) {
11166
11610
  rng.deleteContents();
11167
11611
  MergeBlocks.mergeBlocks(rootNode, true, block1, block2).each(function (pos) {
@@ -11231,8 +11675,9 @@
11231
11675
  throw new Error('Wrong number of arguments to case ' + key + '. Expected ' + value.length + ' (' + value + '), got ' + argLength);
11232
11676
  }
11233
11677
  var args = new Array(argLength);
11234
- for (var i = 0; i < args.length; i++)
11678
+ for (var i = 0; i < args.length; i++) {
11235
11679
  args[i] = arguments[i];
11680
+ }
11236
11681
  var match = function (branches) {
11237
11682
  var branchKeys = keys(branches);
11238
11683
  if (constructors.length !== branchKeys.length) {
@@ -11241,8 +11686,9 @@
11241
11686
  var allReqd = forall(constructors, function (reqKey) {
11242
11687
  return contains(branchKeys, reqKey);
11243
11688
  });
11244
- if (!allReqd)
11689
+ if (!allReqd) {
11245
11690
  throw new Error('Not all branches were specified when using match. Specified: ' + branchKeys.join(', ') + '\nRequired: ' + constructors.join(', '));
11691
+ }
11246
11692
  return branches[key].apply(null, args);
11247
11693
  };
11248
11694
  return {
@@ -11567,18 +12013,10 @@
11567
12013
  }
11568
12014
  };
11569
12015
  var deleteNormalized = function (elm, afterDeletePosOpt, normalizeWhitespace) {
11570
- var prevTextOpt = prevSibling(elm).filter(function (e) {
11571
- return NodeType.isText(e.dom());
11572
- });
11573
- var nextTextOpt = nextSibling(elm).filter(function (e) {
11574
- return NodeType.isText(e.dom());
11575
- });
12016
+ var prevTextOpt = prevSibling(elm).filter(isText);
12017
+ var nextTextOpt = nextSibling(elm).filter(isText);
11576
12018
  remove$1(elm);
11577
- return liftN([
11578
- prevTextOpt,
11579
- nextTextOpt,
11580
- afterDeletePosOpt
11581
- ], function (prev, next, pos) {
12019
+ return lift3(prevTextOpt, nextTextOpt, afterDeletePosOpt, function (prev, next, pos) {
11582
12020
  var prevNode = prev.dom(), nextNode = next.dom();
11583
12021
  var offset = prevNode.data.length;
11584
12022
  mergeTextNodes(prevNode, nextNode, normalizeWhitespace);
@@ -11895,10 +12333,7 @@
11895
12333
  return getName(location1) === getName(location2) && getElement(location1) === getElement(location2);
11896
12334
  };
11897
12335
  var betweenInlines = function (forward, isInlineTarget, rootNode, from, to, location) {
11898
- return liftN([
11899
- InlineUtils.findRootInline(isInlineTarget, rootNode, from),
11900
- InlineUtils.findRootInline(isInlineTarget, rootNode, to)
11901
- ], function (fromInline, toInline) {
12336
+ return lift2(InlineUtils.findRootInline(isInlineTarget, rootNode, from), InlineUtils.findRootInline(isInlineTarget, rootNode, to), function (fromInline, toInline) {
11902
12337
  if (fromInline !== toInline && InlineUtils.hasSameParentBlock(rootNode, fromInline, toInline)) {
11903
12338
  return Location.after(forward ? fromInline : toInline);
11904
12339
  } else {
@@ -12071,10 +12506,7 @@
12071
12506
  return range;
12072
12507
  };
12073
12508
  var hasOnlyTwoOrLessPositionsLeft = function (elm) {
12074
- return liftN([
12075
- CaretFinder.firstPositionIn(elm),
12076
- CaretFinder.lastPositionIn(elm)
12077
- ], function (firstPos, lastPos) {
12509
+ return lift2(CaretFinder.firstPositionIn(elm), CaretFinder.lastPositionIn(elm), function (firstPos, lastPos) {
12078
12510
  var normalizedFirstPos = InlineUtils.normalizePosition(true, firstPos);
12079
12511
  var normalizedLastPos = InlineUtils.normalizePosition(false, lastPos);
12080
12512
  return CaretFinder.nextPosition(elm, normalizedFirstPos).map(function (pos) {
@@ -12189,10 +12621,7 @@
12189
12621
  var partialSelection = function (isRoot, rng) {
12190
12622
  var startCell = getClosestCell(rng.startContainer, isRoot);
12191
12623
  var endCell = getClosestCell(rng.endContainer, isRoot);
12192
- return rng.collapsed ? Option.none() : liftN([
12193
- startCell,
12194
- endCell
12195
- ], tableCellRng).fold(function () {
12624
+ return rng.collapsed ? Option.none() : lift2(startCell, endCell, tableCellRng).fold(function () {
12196
12625
  return startCell.fold(function () {
12197
12626
  return endCell.bind(function (endCell) {
12198
12627
  return getClosestTable(endCell, isRoot).bind(function (table) {
@@ -12218,10 +12647,7 @@
12218
12647
  var getCellRng = function (rng, isRoot) {
12219
12648
  var startCell = getClosestCell(rng.startContainer, isRoot);
12220
12649
  var endCell = getClosestCell(rng.endContainer, isRoot);
12221
- return liftN([
12222
- startCell,
12223
- endCell
12224
- ], tableCellRng).filter(isExpandedCellRng).filter(function (cellRng) {
12650
+ return lift2(startCell, endCell, tableCellRng).filter(isExpandedCellRng).filter(function (cellRng) {
12225
12651
  return isWithinSameTable(isRoot, cellRng);
12226
12652
  }).orThunk(function () {
12227
12653
  return partialSelection(isRoot, rng);
@@ -12244,10 +12670,7 @@
12244
12670
  });
12245
12671
  };
12246
12672
  var getSelectedCells = function (tableSelection) {
12247
- return liftN([
12248
- getCellIndex(tableSelection.cells(), tableSelection.rng().start()),
12249
- getCellIndex(tableSelection.cells(), tableSelection.rng().end())
12250
- ], function (startIndex, endIndex) {
12673
+ return lift2(getCellIndex(tableSelection.cells(), tableSelection.rng().start()), getCellIndex(tableSelection.cells(), tableSelection.rng().end()), function (startIndex, endIndex) {
12251
12674
  return tableSelection.cells().slice(startIndex, endIndex + 1);
12252
12675
  });
12253
12676
  };
@@ -12868,42 +13291,135 @@
12868
13291
  };
12869
13292
  var InlineFormatDelete = { backspaceDelete: backspaceDelete$5 };
12870
13293
 
12871
- var isContentEditableTrue$2 = NodeType.isContentEditableTrue;
12872
- var isContentEditableFalse$6 = NodeType.isContentEditableFalse;
12873
- var showCaret = function (direction, editor, node, before, scrollIntoView) {
12874
- return editor._selectionOverrides.showCaret(direction, node, before, scrollIntoView);
12875
- };
12876
- var getNodeRange = function (node) {
12877
- var rng = node.ownerDocument.createRange();
12878
- rng.selectNode(node);
12879
- return rng;
12880
- };
12881
- var selectNode = function (editor, node) {
12882
- var e = editor.fire('BeforeObjectSelected', { target: node });
12883
- if (e.isDefaultPrevented()) {
12884
- return null;
13294
+ var getPos$1 = function (elm) {
13295
+ var x = 0, y = 0;
13296
+ var offsetParent = elm;
13297
+ while (offsetParent && offsetParent.nodeType) {
13298
+ x += offsetParent.offsetLeft || 0;
13299
+ y += offsetParent.offsetTop || 0;
13300
+ offsetParent = offsetParent.offsetParent;
12885
13301
  }
12886
- return getNodeRange(node);
13302
+ return {
13303
+ x: x,
13304
+ y: y
13305
+ };
12887
13306
  };
12888
- var renderCaretAtRange = function (editor, range, scrollIntoView) {
12889
- var normalizedRange = normalizeRange(1, editor.getBody(), range);
12890
- var caretPosition = CaretPosition$1.fromRangeStart(normalizedRange);
12891
- var caretPositionNode = caretPosition.getNode();
12892
- if (isContentEditableFalse$6(caretPositionNode)) {
12893
- return showCaret(1, editor, caretPositionNode, !caretPosition.isAtEnd(), false);
13307
+ var fireScrollIntoViewEvent = function (editor, elm, alignToTop) {
13308
+ var scrollEvent = {
13309
+ elm: elm,
13310
+ alignToTop: alignToTop
13311
+ };
13312
+ editor.fire('scrollIntoView', scrollEvent);
13313
+ return scrollEvent.isDefaultPrevented();
13314
+ };
13315
+ var scrollElementIntoView = function (editor, elm, alignToTop) {
13316
+ var y, viewPort;
13317
+ var dom = editor.dom;
13318
+ var root = dom.getRoot();
13319
+ var viewPortY, viewPortH, offsetY = 0;
13320
+ if (fireScrollIntoViewEvent(editor, elm, alignToTop)) {
13321
+ return;
12894
13322
  }
12895
- var caretPositionBeforeNode = caretPosition.getNode(true);
12896
- if (isContentEditableFalse$6(caretPositionBeforeNode)) {
12897
- return showCaret(1, editor, caretPositionBeforeNode, false, false);
13323
+ if (!NodeType.isElement(elm)) {
13324
+ return;
12898
13325
  }
12899
- var ceRoot = editor.dom.getParent(caretPosition.getNode(), function (node) {
12900
- return isContentEditableFalse$6(node) || isContentEditableTrue$2(node);
12901
- });
12902
- if (isContentEditableFalse$6(ceRoot)) {
12903
- return showCaret(1, editor, ceRoot, false, scrollIntoView);
13326
+ if (alignToTop === false) {
13327
+ offsetY = elm.offsetHeight;
12904
13328
  }
12905
- return null;
12906
- };
13329
+ if (root.nodeName !== 'BODY') {
13330
+ var scrollContainer = editor.selection.getScrollContainer();
13331
+ if (scrollContainer) {
13332
+ y = getPos$1(elm).y - getPos$1(scrollContainer).y + offsetY;
13333
+ viewPortH = scrollContainer.clientHeight;
13334
+ viewPortY = scrollContainer.scrollTop;
13335
+ if (y < viewPortY || y + 25 > viewPortY + viewPortH) {
13336
+ scrollContainer.scrollTop = y < viewPortY ? y : y - viewPortH + 25;
13337
+ }
13338
+ return;
13339
+ }
13340
+ }
13341
+ viewPort = dom.getViewPort(editor.getWin());
13342
+ y = dom.getPos(elm).y + offsetY;
13343
+ viewPortY = viewPort.y;
13344
+ viewPortH = viewPort.h;
13345
+ if (y < viewPort.y || y + 25 > viewPortY + viewPortH) {
13346
+ editor.getWin().scrollTo(0, y < viewPortY ? y : y - viewPortH + 25);
13347
+ }
13348
+ };
13349
+ var getViewPortRect = function (editor) {
13350
+ if (editor.inline) {
13351
+ return editor.getBody().getBoundingClientRect();
13352
+ } else {
13353
+ var win = editor.getWin();
13354
+ return {
13355
+ left: 0,
13356
+ right: win.innerWidth,
13357
+ top: 0,
13358
+ bottom: win.innerHeight,
13359
+ width: win.innerWidth,
13360
+ height: win.innerHeight
13361
+ };
13362
+ }
13363
+ };
13364
+ var scrollBy = function (editor, dx, dy) {
13365
+ if (editor.inline) {
13366
+ editor.getBody().scrollLeft += dx;
13367
+ editor.getBody().scrollTop += dy;
13368
+ } else {
13369
+ editor.getWin().scrollBy(dx, dy);
13370
+ }
13371
+ };
13372
+ var scrollRangeIntoView = function (editor, rng) {
13373
+ head(CaretPosition.fromRangeStart(rng).getClientRects()).each(function (rngRect) {
13374
+ var bodyRect = getViewPortRect(editor);
13375
+ var overflow = getOverflow(bodyRect, rngRect);
13376
+ var margin = 4;
13377
+ var dx = overflow.x > 0 ? overflow.x + margin : overflow.x - margin;
13378
+ var dy = overflow.y > 0 ? overflow.y + margin : overflow.y - margin;
13379
+ scrollBy(editor, overflow.x !== 0 ? dx : 0, overflow.y !== 0 ? dy : 0);
13380
+ });
13381
+ };
13382
+ var ScrollIntoView = {
13383
+ scrollElementIntoView: scrollElementIntoView,
13384
+ scrollRangeIntoView: scrollRangeIntoView
13385
+ };
13386
+
13387
+ var isContentEditableTrue$2 = NodeType.isContentEditableTrue;
13388
+ var isContentEditableFalse$6 = NodeType.isContentEditableFalse;
13389
+ var showCaret = function (direction, editor, node, before, scrollIntoView) {
13390
+ return editor._selectionOverrides.showCaret(direction, node, before, scrollIntoView);
13391
+ };
13392
+ var getNodeRange = function (node) {
13393
+ var rng = node.ownerDocument.createRange();
13394
+ rng.selectNode(node);
13395
+ return rng;
13396
+ };
13397
+ var selectNode = function (editor, node) {
13398
+ var e = editor.fire('BeforeObjectSelected', { target: node });
13399
+ if (e.isDefaultPrevented()) {
13400
+ return null;
13401
+ }
13402
+ return getNodeRange(node);
13403
+ };
13404
+ var renderCaretAtRange = function (editor, range, scrollIntoView) {
13405
+ var normalizedRange = normalizeRange(1, editor.getBody(), range);
13406
+ var caretPosition = CaretPosition$1.fromRangeStart(normalizedRange);
13407
+ var caretPositionNode = caretPosition.getNode();
13408
+ if (isContentEditableFalse$6(caretPositionNode)) {
13409
+ return showCaret(1, editor, caretPositionNode, !caretPosition.isAtEnd(), false);
13410
+ }
13411
+ var caretPositionBeforeNode = caretPosition.getNode(true);
13412
+ if (isContentEditableFalse$6(caretPositionBeforeNode)) {
13413
+ return showCaret(1, editor, caretPositionBeforeNode, false, false);
13414
+ }
13415
+ var ceRoot = editor.dom.getParent(caretPosition.getNode(), function (node) {
13416
+ return isContentEditableFalse$6(node) || isContentEditableTrue$2(node);
13417
+ });
13418
+ if (isContentEditableFalse$6(ceRoot)) {
13419
+ return showCaret(1, editor, ceRoot, false, scrollIntoView);
13420
+ }
13421
+ return null;
13422
+ };
12907
13423
  var renderRangeCaret = function (editor, range, scrollIntoView) {
12908
13424
  if (!range || !range.collapsed) {
12909
13425
  return range;
@@ -12914,6 +13430,10 @@
12914
13430
  }
12915
13431
  return range;
12916
13432
  };
13433
+ var moveToRange = function (editor, rng) {
13434
+ editor.selection.setRng(rng);
13435
+ ScrollIntoView.scrollRangeIntoView(editor, editor.selection.getRng());
13436
+ };
12917
13437
 
12918
13438
  var trimEmptyTextNode$1 = function (dom, node) {
12919
13439
  if (NodeType.isText(node) && node.data.length === 0) {
@@ -13015,118 +13535,6 @@
13015
13535
  forwardDeleteCommand: forwardDeleteCommand
13016
13536
  };
13017
13537
 
13018
- var getBodySetting = function (editor, name, defaultValue) {
13019
- var value = editor.getParam(name, defaultValue);
13020
- if (value.indexOf('=') !== -1) {
13021
- var bodyObj = editor.getParam(name, '', 'hash');
13022
- return bodyObj.hasOwnProperty(editor.id) ? bodyObj[editor.id] : defaultValue;
13023
- } else {
13024
- return value;
13025
- }
13026
- };
13027
- var getIframeAttrs = function (editor) {
13028
- return editor.getParam('iframe_attrs', {});
13029
- };
13030
- var getDocType = function (editor) {
13031
- return editor.getParam('doctype', '<!DOCTYPE html>');
13032
- };
13033
- var getDocumentBaseUrl = function (editor) {
13034
- return editor.getParam('document_base_url', '');
13035
- };
13036
- var getBodyId = function (editor) {
13037
- return getBodySetting(editor, 'body_id', 'tinymce');
13038
- };
13039
- var getBodyClass = function (editor) {
13040
- return getBodySetting(editor, 'body_class', '');
13041
- };
13042
- var getContentSecurityPolicy = function (editor) {
13043
- return editor.getParam('content_security_policy', '');
13044
- };
13045
- var shouldPutBrInPre = function (editor) {
13046
- return editor.getParam('br_in_pre', true);
13047
- };
13048
- var getForcedRootBlock = function (editor) {
13049
- if (editor.getParam('force_p_newlines', false)) {
13050
- return 'p';
13051
- }
13052
- var block = editor.getParam('forced_root_block', 'p');
13053
- return block === false ? '' : block;
13054
- };
13055
- var getForcedRootBlockAttrs = function (editor) {
13056
- return editor.getParam('forced_root_block_attrs', {});
13057
- };
13058
- var getBrNewLineSelector = function (editor) {
13059
- return editor.getParam('br_newline_selector', '.mce-toc h2,figcaption,caption');
13060
- };
13061
- var getNoNewLineSelector = function (editor) {
13062
- return editor.getParam('no_newline_selector', '');
13063
- };
13064
- var shouldKeepStyles = function (editor) {
13065
- return editor.getParam('keep_styles', true);
13066
- };
13067
- var shouldEndContainerOnEmptyBlock = function (editor) {
13068
- return editor.getParam('end_container_on_empty_block', false);
13069
- };
13070
- var getFontStyleValues = function (editor) {
13071
- return Tools.explode(editor.getParam('font_size_style_values', ''));
13072
- };
13073
- var getFontSizeClasses = function (editor) {
13074
- return Tools.explode(editor.getParam('font_size_classes', ''));
13075
- };
13076
- var getImagesDataImgFilter = function (editor) {
13077
- return editor.getParam('images_dataimg_filter', constant(true), 'function');
13078
- };
13079
- var isAutomaticUploadsEnabled = function (editor) {
13080
- return editor.getParam('automatic_uploads', true, 'boolean');
13081
- };
13082
- var shouldReuseFileName = function (editor) {
13083
- return editor.getParam('images_reuse_filename', false, 'boolean');
13084
- };
13085
- var shouldReplaceBlobUris = function (editor) {
13086
- return editor.getParam('images_replace_blob_uris', true, 'boolean');
13087
- };
13088
- var getImageUploadUrl = function (editor) {
13089
- return editor.getParam('images_upload_url', '', 'string');
13090
- };
13091
- var getImageUploadBasePath = function (editor) {
13092
- return editor.getParam('images_upload_base_path', '', 'string');
13093
- };
13094
- var getImagesUploadCredentials = function (editor) {
13095
- return editor.getParam('images_upload_credentials', false, 'boolean');
13096
- };
13097
- var getImagesUploadHandler = function (editor) {
13098
- return editor.getParam('images_upload_handler', null, 'function');
13099
- };
13100
- var shouldUseContentCssCors = function (editor) {
13101
- return editor.getParam('content_css_cors', false, 'boolean');
13102
- };
13103
- var Settings = {
13104
- getIframeAttrs: getIframeAttrs,
13105
- getDocType: getDocType,
13106
- getDocumentBaseUrl: getDocumentBaseUrl,
13107
- getBodyId: getBodyId,
13108
- getBodyClass: getBodyClass,
13109
- getContentSecurityPolicy: getContentSecurityPolicy,
13110
- shouldPutBrInPre: shouldPutBrInPre,
13111
- getForcedRootBlock: getForcedRootBlock,
13112
- getForcedRootBlockAttrs: getForcedRootBlockAttrs,
13113
- getBrNewLineSelector: getBrNewLineSelector,
13114
- getNoNewLineSelector: getNoNewLineSelector,
13115
- shouldKeepStyles: shouldKeepStyles,
13116
- shouldEndContainerOnEmptyBlock: shouldEndContainerOnEmptyBlock,
13117
- getFontStyleValues: getFontStyleValues,
13118
- getFontSizeClasses: getFontSizeClasses,
13119
- getImagesDataImgFilter: getImagesDataImgFilter,
13120
- isAutomaticUploadsEnabled: isAutomaticUploadsEnabled,
13121
- shouldReuseFileName: shouldReuseFileName,
13122
- shouldReplaceBlobUris: shouldReplaceBlobUris,
13123
- getImageUploadUrl: getImageUploadUrl,
13124
- getImageUploadBasePath: getImageUploadBasePath,
13125
- getImagesUploadCredentials: getImagesUploadCredentials,
13126
- getImagesUploadHandler: getImagesUploadHandler,
13127
- shouldUseContentCssCors: shouldUseContentCssCors
13128
- };
13129
-
13130
13538
  var getSpecifiedFontProp = function (propName, rootElm, elm) {
13131
13539
  var getProperty = function (elm) {
13132
13540
  return getRaw(elm, propName);
@@ -13549,6 +13957,9 @@
13549
13957
  };
13550
13958
  var InsertBr = { insert: insert };
13551
13959
 
13960
+ var create$3 = Immutable('start', 'soffset', 'finish', 'foffset');
13961
+ var SimRange = { create: create$3 };
13962
+
13552
13963
  var adt = Adt.generate([
13553
13964
  { before: ['element'] },
13554
13965
  {
@@ -13559,8 +13970,24 @@
13559
13970
  },
13560
13971
  { after: ['element'] }
13561
13972
  ]);
13973
+ var cata = function (subject, onBefore, onOn, onAfter) {
13974
+ return subject.fold(onBefore, onOn, onAfter);
13975
+ };
13976
+ var getStart = function (situ) {
13977
+ return situ.fold(identity, identity, identity);
13978
+ };
13979
+ var before$4 = adt.before;
13980
+ var on = adt.on;
13981
+ var after$3 = adt.after;
13982
+ var Situ = {
13983
+ before: before$4,
13984
+ on: on,
13985
+ after: after$3,
13986
+ cata: cata,
13987
+ getStart: getStart
13988
+ };
13562
13989
 
13563
- var type$1 = Adt.generate([
13990
+ var adt$1 = Adt.generate([
13564
13991
  { domRange: ['rng'] },
13565
13992
  {
13566
13993
  relative: [
@@ -13577,7 +14004,38 @@
13577
14004
  ]
13578
14005
  }
13579
14006
  ]);
13580
- var range = Immutable('start', 'soffset', 'finish', 'foffset');
14007
+ var exactFromRange = function (simRange) {
14008
+ return adt$1.exact(simRange.start(), simRange.soffset(), simRange.finish(), simRange.foffset());
14009
+ };
14010
+ var getStart$1 = function (selection) {
14011
+ return selection.match({
14012
+ domRange: function (rng) {
14013
+ return Element.fromDom(rng.startContainer);
14014
+ },
14015
+ relative: function (startSitu, finishSitu) {
14016
+ return Situ.getStart(startSitu);
14017
+ },
14018
+ exact: function (start, soffset, finish, foffset) {
14019
+ return start;
14020
+ }
14021
+ });
14022
+ };
14023
+ var domRange = adt$1.domRange;
14024
+ var relative = adt$1.relative;
14025
+ var exact = adt$1.exact;
14026
+ var getWin = function (selection) {
14027
+ var start = getStart$1(selection);
14028
+ return defaultView(start);
14029
+ };
14030
+ var range = SimRange.create;
14031
+ var Selection = {
14032
+ domRange: domRange,
14033
+ relative: relative,
14034
+ exact: exact,
14035
+ exactFromRange: exactFromRange,
14036
+ getWin: getWin,
14037
+ range: range
14038
+ };
13581
14039
 
13582
14040
  var browser$3 = PlatformDetection$1.detect().browser;
13583
14041
  var clamp = function (offset, element) {
@@ -13590,10 +14048,10 @@
13590
14048
  return offset;
13591
14049
  };
13592
14050
  var normalizeRng = function (rng) {
13593
- return range(rng.start(), clamp(rng.soffset(), rng.start()), rng.finish(), clamp(rng.foffset(), rng.finish()));
14051
+ return Selection.range(rng.start(), clamp(rng.soffset(), rng.start()), rng.finish(), clamp(rng.foffset(), rng.finish()));
13594
14052
  };
13595
14053
  var isOrContains = function (root, elm) {
13596
- return contains$3(root, elm) || eq(root, elm);
14054
+ return !NodeType.isRestrictedNode(elm.dom()) && (contains$3(root, elm) || eq(root, elm));
13597
14055
  };
13598
14056
  var isRngInRoot = function (root) {
13599
14057
  return function (rng) {
@@ -13604,7 +14062,7 @@
13604
14062
  return editor.inline === true || browser$3.isIE();
13605
14063
  };
13606
14064
  var nativeRangeToSelectionRange = function (r) {
13607
- return range(Element.fromDom(r.startContainer), r.startOffset, Element.fromDom(r.endContainer), r.endOffset);
14065
+ return Selection.range(Element.fromDom(r.startContainer), r.startOffset, Element.fromDom(r.endContainer), r.endOffset);
13608
14066
  };
13609
14067
  var readRange = function (win) {
13610
14068
  var selection = win.getSelection();
@@ -14513,28 +14971,178 @@
14513
14971
  EditorObservable = Tools.extend({}, Observable, EditorObservable);
14514
14972
  var EditorObservable$1 = EditorObservable;
14515
14973
 
14516
- var each$b = Tools.each, explode$2 = Tools.explode;
14517
- var keyCodeLookup = {
14518
- f1: 112,
14519
- f2: 113,
14520
- f3: 114,
14521
- f4: 115,
14522
- f5: 116,
14523
- f6: 117,
14524
- f7: 118,
14525
- f8: 119,
14526
- f9: 120,
14527
- f10: 121,
14528
- f11: 122,
14529
- f12: 123
14974
+ var sectionResult = Immutable('sections', 'settings');
14975
+ var detection = PlatformDetection$1.detect();
14976
+ var isTouch = detection.deviceType.isTouch();
14977
+ var mobilePlugins = [
14978
+ 'lists',
14979
+ 'autolink',
14980
+ 'autosave'
14981
+ ];
14982
+ var defaultMobileSettings = { theme: 'mobile' };
14983
+ var normalizePlugins = function (plugins) {
14984
+ var pluginNames = isArray(plugins) ? plugins.join(' ') : plugins;
14985
+ var trimmedPlugins = map(isString(pluginNames) ? pluginNames.split(' ') : [], trim$2);
14986
+ return filter(trimmedPlugins, function (item) {
14987
+ return item.length > 0;
14988
+ });
14530
14989
  };
14531
- var modifierNames = Tools.makeMap('alt,ctrl,shift,meta,access');
14532
- function Shortcuts (editor) {
14533
- var self = this;
14534
- var shortcuts = {};
14535
- var pendingPatterns = [];
14536
- var parseShortcut = function (pattern) {
14537
- var id, key;
14990
+ var filterMobilePlugins = function (plugins) {
14991
+ return filter(plugins, curry(contains, mobilePlugins));
14992
+ };
14993
+ var extractSections = function (keys, settings) {
14994
+ var result = bifilter(settings, function (value, key) {
14995
+ return contains(keys, key);
14996
+ });
14997
+ return sectionResult(result.t, result.f);
14998
+ };
14999
+ var getSection = function (sectionResult, name, defaults) {
15000
+ var sections = sectionResult.sections();
15001
+ var sectionSettings = sections.hasOwnProperty(name) ? sections[name] : {};
15002
+ return Tools.extend({}, defaults, sectionSettings);
15003
+ };
15004
+ var hasSection = function (sectionResult, name) {
15005
+ return sectionResult.sections().hasOwnProperty(name);
15006
+ };
15007
+ var getDefaultSettings = function (id, documentBaseUrl, editor) {
15008
+ return {
15009
+ id: id,
15010
+ theme: 'modern',
15011
+ delta_width: 0,
15012
+ delta_height: 0,
15013
+ popup_css: '',
15014
+ plugins: '',
15015
+ document_base_url: documentBaseUrl,
15016
+ add_form_submit_trigger: true,
15017
+ submit_patch: true,
15018
+ add_unload_trigger: true,
15019
+ convert_urls: true,
15020
+ relative_urls: true,
15021
+ remove_script_host: true,
15022
+ object_resizing: true,
15023
+ doctype: '<!DOCTYPE html>',
15024
+ visual: true,
15025
+ font_size_style_values: 'xx-small,x-small,small,medium,large,x-large,xx-large',
15026
+ font_size_legacy_values: 'xx-small,small,medium,large,x-large,xx-large,300%',
15027
+ forced_root_block: 'p',
15028
+ hidden_input: true,
15029
+ render_ui: true,
15030
+ indentation: '40px',
15031
+ inline_styles: true,
15032
+ convert_fonts_to_spans: true,
15033
+ indent: 'simple',
15034
+ indent_before: 'p,h1,h2,h3,h4,h5,h6,blockquote,div,title,style,pre,script,td,th,ul,ol,li,dl,dt,dd,area,table,thead,' + 'tfoot,tbody,tr,section,summary,article,hgroup,aside,figure,figcaption,option,optgroup,datalist',
15035
+ indent_after: 'p,h1,h2,h3,h4,h5,h6,blockquote,div,title,style,pre,script,td,th,ul,ol,li,dl,dt,dd,area,table,thead,' + 'tfoot,tbody,tr,section,summary,article,hgroup,aside,figure,figcaption,option,optgroup,datalist',
15036
+ entity_encoding: 'named',
15037
+ url_converter: editor.convertURL,
15038
+ url_converter_scope: editor,
15039
+ ie7_compat: true
15040
+ };
15041
+ };
15042
+ var getExternalPlugins = function (overrideSettings, settings) {
15043
+ var userDefinedExternalPlugins = settings.external_plugins ? settings.external_plugins : {};
15044
+ if (overrideSettings && overrideSettings.external_plugins) {
15045
+ return Tools.extend({}, overrideSettings.external_plugins, userDefinedExternalPlugins);
15046
+ } else {
15047
+ return userDefinedExternalPlugins;
15048
+ }
15049
+ };
15050
+ var combinePlugins = function (forcedPlugins, plugins) {
15051
+ return [].concat(normalizePlugins(forcedPlugins)).concat(normalizePlugins(plugins));
15052
+ };
15053
+ var processPlugins = function (isTouchDevice, sectionResult, defaultOverrideSettings, settings) {
15054
+ var forcedPlugins = normalizePlugins(defaultOverrideSettings.forced_plugins);
15055
+ var plugins = normalizePlugins(settings.plugins);
15056
+ var platformPlugins = isTouchDevice && hasSection(sectionResult, 'mobile') ? filterMobilePlugins(plugins) : plugins;
15057
+ var combinedPlugins = combinePlugins(forcedPlugins, platformPlugins);
15058
+ return Tools.extend(settings, { plugins: combinedPlugins.join(' ') });
15059
+ };
15060
+ var isOnMobile = function (isTouchDevice, sectionResult) {
15061
+ var isInline = sectionResult.settings().inline;
15062
+ return isTouchDevice && hasSection(sectionResult, 'mobile') && !isInline;
15063
+ };
15064
+ var combineSettings = function (isTouchDevice, defaultSettings, defaultOverrideSettings, settings) {
15065
+ var sectionResult = extractSections(['mobile'], settings);
15066
+ var extendedSettings = Tools.extend(defaultSettings, defaultOverrideSettings, sectionResult.settings(), isOnMobile(isTouchDevice, sectionResult) ? getSection(sectionResult, 'mobile', defaultMobileSettings) : {}, {
15067
+ validate: true,
15068
+ content_editable: sectionResult.settings().inline,
15069
+ external_plugins: getExternalPlugins(defaultOverrideSettings, sectionResult.settings())
15070
+ });
15071
+ return processPlugins(isTouchDevice, sectionResult, defaultOverrideSettings, extendedSettings);
15072
+ };
15073
+ var getEditorSettings = function (editor, id, documentBaseUrl, defaultOverrideSettings, settings) {
15074
+ var defaultSettings = getDefaultSettings(id, documentBaseUrl, editor);
15075
+ return combineSettings(isTouch, defaultSettings, defaultOverrideSettings, settings);
15076
+ };
15077
+ var getFiltered = function (predicate, editor, name) {
15078
+ return Option.from(editor.settings[name]).filter(predicate);
15079
+ };
15080
+ var getParamObject = function (value) {
15081
+ var output = {};
15082
+ if (typeof value === 'string') {
15083
+ each(value.indexOf('=') > 0 ? value.split(/[;,](?![^=;,]*(?:[;,]|$))/) : value.split(','), function (val) {
15084
+ var arr = val.split('=');
15085
+ if (arr.length > 1) {
15086
+ output[Tools.trim(arr[0])] = Tools.trim(arr[1]);
15087
+ } else {
15088
+ output[Tools.trim(arr[0])] = Tools.trim(arr);
15089
+ }
15090
+ });
15091
+ } else {
15092
+ output = value;
15093
+ }
15094
+ return output;
15095
+ };
15096
+ var isArrayOf = function (p) {
15097
+ return function (a) {
15098
+ return isArray(a) && forall(a, p);
15099
+ };
15100
+ };
15101
+ var getParam = function (editor, name, defaultVal, type) {
15102
+ var value = name in editor.settings ? editor.settings[name] : defaultVal;
15103
+ if (type === 'hash') {
15104
+ return getParamObject(value);
15105
+ } else if (type === 'string') {
15106
+ return getFiltered(isString, editor, name).getOr(defaultVal);
15107
+ } else if (type === 'number') {
15108
+ return getFiltered(isNumber, editor, name).getOr(defaultVal);
15109
+ } else if (type === 'boolean') {
15110
+ return getFiltered(isBoolean, editor, name).getOr(defaultVal);
15111
+ } else if (type === 'object') {
15112
+ return getFiltered(isObject, editor, name).getOr(defaultVal);
15113
+ } else if (type === 'array') {
15114
+ return getFiltered(isArray, editor, name).getOr(defaultVal);
15115
+ } else if (type === 'string[]') {
15116
+ return getFiltered(isArrayOf(isString), editor, name).getOr(defaultVal);
15117
+ } else if (type === 'function') {
15118
+ return getFiltered(isFunction, editor, name).getOr(defaultVal);
15119
+ } else {
15120
+ return value;
15121
+ }
15122
+ };
15123
+
15124
+ var each$b = Tools.each, explode$2 = Tools.explode;
15125
+ var keyCodeLookup = {
15126
+ f1: 112,
15127
+ f2: 113,
15128
+ f3: 114,
15129
+ f4: 115,
15130
+ f5: 116,
15131
+ f6: 117,
15132
+ f7: 118,
15133
+ f8: 119,
15134
+ f9: 120,
15135
+ f10: 121,
15136
+ f11: 122,
15137
+ f12: 123
15138
+ };
15139
+ var modifierNames = Tools.makeMap('alt,ctrl,shift,meta,access');
15140
+ function Shortcuts (editor) {
15141
+ var self = this;
15142
+ var shortcuts = {};
15143
+ var pendingPatterns = [];
15144
+ var parseShortcut = function (pattern) {
15145
+ var id, key;
14538
15146
  var shortcut = {};
14539
15147
  each$b(explode$2(pattern, '+'), function (value) {
14540
15148
  if (value in modifierNames) {
@@ -14665,8 +15273,8 @@
14665
15273
  var doc = owner(element).dom();
14666
15274
  return element.dom() === doc.activeElement;
14667
15275
  };
14668
- var active = function (_DOC) {
14669
- var doc = _DOC !== undefined ? _DOC.dom() : domGlobals.document;
15276
+ var active = function (_doc) {
15277
+ var doc = _doc !== undefined ? _doc.dom() : domGlobals.document;
14670
15278
  return Option.from(doc.activeElement).map(Element.fromDom);
14671
15279
  };
14672
15280
  var search = function (element) {
@@ -15959,10 +16567,7 @@
15959
16567
  });
15960
16568
  };
15961
16569
  var hasAllContentsSelected = function (elm, rng) {
15962
- return liftN([
15963
- getStartNode(rng),
15964
- getEndNode(rng)
15965
- ], function (startNode, endNode) {
16570
+ return lift2(getStartNode(rng), getEndNode(rng), function (startNode, endNode) {
15966
16571
  var start = find(getFirstChildren(elm), curry(eq, startNode));
15967
16572
  var end = find(getLastChildren$1(elm), curry(eq, endNode));
15968
16573
  return start.isSome() && end.isSome();
@@ -16096,288 +16701,42 @@
16096
16701
  };
16097
16702
  }
16098
16703
 
16099
- var getAbsolutePosition = function (elm) {
16100
- var doc, docElem, win, clientRect;
16101
- clientRect = elm.getBoundingClientRect();
16102
- doc = elm.ownerDocument;
16103
- docElem = doc.documentElement;
16104
- win = doc.defaultView;
16105
- return {
16106
- top: clientRect.top + win.pageYOffset - docElem.clientTop,
16107
- left: clientRect.left + win.pageXOffset - docElem.clientLeft
16108
- };
16109
- };
16110
- var getBodyPosition = function (editor) {
16111
- return editor.inline ? getAbsolutePosition(editor.getBody()) : {
16112
- left: 0,
16113
- top: 0
16114
- };
16115
- };
16116
- var getScrollPosition = function (editor) {
16117
- var body = editor.getBody();
16118
- return editor.inline ? {
16119
- left: body.scrollLeft,
16120
- top: body.scrollTop
16121
- } : {
16122
- left: 0,
16123
- top: 0
16124
- };
16125
- };
16126
- var getBodyScroll = function (editor) {
16127
- var body = editor.getBody(), docElm = editor.getDoc().documentElement;
16128
- var inlineScroll = {
16129
- left: body.scrollLeft,
16130
- top: body.scrollTop
16131
- };
16132
- var iframeScroll = {
16133
- left: body.scrollLeft || docElm.scrollLeft,
16134
- top: body.scrollTop || docElm.scrollTop
16135
- };
16136
- return editor.inline ? inlineScroll : iframeScroll;
16137
- };
16138
- var getMousePosition = function (editor, event) {
16139
- if (event.target.ownerDocument !== editor.getDoc()) {
16140
- var iframePosition = getAbsolutePosition(editor.getContentAreaContainer());
16141
- var scrollPosition = getBodyScroll(editor);
16142
- return {
16143
- left: event.pageX - iframePosition.left + scrollPosition.left,
16144
- top: event.pageY - iframePosition.top + scrollPosition.top
16145
- };
16704
+ var VK = {
16705
+ BACKSPACE: 8,
16706
+ DELETE: 46,
16707
+ DOWN: 40,
16708
+ ENTER: 13,
16709
+ LEFT: 37,
16710
+ RIGHT: 39,
16711
+ SPACEBAR: 32,
16712
+ TAB: 9,
16713
+ UP: 38,
16714
+ END: 35,
16715
+ HOME: 36,
16716
+ modifierPressed: function (e) {
16717
+ return e.shiftKey || e.ctrlKey || e.altKey || this.metaKeyPressed(e);
16718
+ },
16719
+ metaKeyPressed: function (e) {
16720
+ return Env.mac ? e.metaKey : e.ctrlKey && !e.altKey;
16146
16721
  }
16147
- return {
16148
- left: event.pageX,
16149
- top: event.pageY
16150
- };
16151
16722
  };
16152
- var calculatePosition = function (bodyPosition, scrollPosition, mousePosition) {
16153
- return {
16154
- pageX: mousePosition.left - bodyPosition.left + scrollPosition.left,
16155
- pageY: mousePosition.top - bodyPosition.top + scrollPosition.top
16156
- };
16157
- };
16158
- var calc = function (editor, event) {
16159
- return calculatePosition(getBodyPosition(editor), getScrollPosition(editor), getMousePosition(editor, event));
16160
- };
16161
- var MousePosition = { calc: calc };
16162
16723
 
16163
- var isContentEditableFalse$7 = NodeType.isContentEditableFalse, isContentEditableTrue$3 = NodeType.isContentEditableTrue;
16164
- var isDraggable = function (rootElm, elm) {
16165
- return isContentEditableFalse$7(elm) && elm !== rootElm;
16166
- };
16167
- var isValidDropTarget = function (editor, targetElement, dragElement) {
16168
- if (targetElement === dragElement || editor.dom.isChildOf(targetElement, dragElement)) {
16169
- return false;
16724
+ var getNodeClientRects = function (node) {
16725
+ var toArrayWithNode = function (clientRects) {
16726
+ return map(clientRects, function (clientRect) {
16727
+ clientRect = clone$1(clientRect);
16728
+ clientRect.node = node;
16729
+ return clientRect;
16730
+ });
16731
+ };
16732
+ if (NodeType.isElement(node)) {
16733
+ return toArrayWithNode(node.getClientRects());
16170
16734
  }
16171
- if (isContentEditableFalse$7(targetElement)) {
16172
- return false;
16173
- }
16174
- return true;
16175
- };
16176
- var cloneElement = function (elm) {
16177
- var cloneElm = elm.cloneNode(true);
16178
- cloneElm.removeAttribute('data-mce-selected');
16179
- return cloneElm;
16180
- };
16181
- var createGhost = function (editor, elm, width, height) {
16182
- var clonedElm = elm.cloneNode(true);
16183
- editor.dom.setStyles(clonedElm, {
16184
- width: width,
16185
- height: height
16186
- });
16187
- editor.dom.setAttrib(clonedElm, 'data-mce-selected', null);
16188
- var ghostElm = editor.dom.create('div', {
16189
- 'class': 'mce-drag-container',
16190
- 'data-mce-bogus': 'all',
16191
- 'unselectable': 'on',
16192
- 'contenteditable': 'false'
16193
- });
16194
- editor.dom.setStyles(ghostElm, {
16195
- position: 'absolute',
16196
- opacity: 0.5,
16197
- overflow: 'hidden',
16198
- border: 0,
16199
- padding: 0,
16200
- margin: 0,
16201
- width: width,
16202
- height: height
16203
- });
16204
- editor.dom.setStyles(clonedElm, {
16205
- margin: 0,
16206
- boxSizing: 'border-box'
16207
- });
16208
- ghostElm.appendChild(clonedElm);
16209
- return ghostElm;
16210
- };
16211
- var appendGhostToBody = function (ghostElm, bodyElm) {
16212
- if (ghostElm.parentNode !== bodyElm) {
16213
- bodyElm.appendChild(ghostElm);
16214
- }
16215
- };
16216
- var moveGhost = function (ghostElm, position, width, height, maxX, maxY) {
16217
- var overflowX = 0, overflowY = 0;
16218
- ghostElm.style.left = position.pageX + 'px';
16219
- ghostElm.style.top = position.pageY + 'px';
16220
- if (position.pageX + width > maxX) {
16221
- overflowX = position.pageX + width - maxX;
16222
- }
16223
- if (position.pageY + height > maxY) {
16224
- overflowY = position.pageY + height - maxY;
16225
- }
16226
- ghostElm.style.width = width - overflowX + 'px';
16227
- ghostElm.style.height = height - overflowY + 'px';
16228
- };
16229
- var removeElement = function (elm) {
16230
- if (elm && elm.parentNode) {
16231
- elm.parentNode.removeChild(elm);
16232
- }
16233
- };
16234
- var isLeftMouseButtonPressed = function (e) {
16235
- return e.button === 0;
16236
- };
16237
- var hasDraggableElement = function (state) {
16238
- return state.element;
16239
- };
16240
- var applyRelPos = function (state, position) {
16241
- return {
16242
- pageX: position.pageX - state.relX,
16243
- pageY: position.pageY + 5
16244
- };
16245
- };
16246
- var start$1 = function (state, editor) {
16247
- return function (e) {
16248
- if (isLeftMouseButtonPressed(e)) {
16249
- var ceElm = find(editor.dom.getParents(e.target), Predicate.or(isContentEditableFalse$7, isContentEditableTrue$3)).getOr(null);
16250
- if (isDraggable(editor.getBody(), ceElm)) {
16251
- var elmPos = editor.dom.getPos(ceElm);
16252
- var bodyElm = editor.getBody();
16253
- var docElm = editor.getDoc().documentElement;
16254
- state.element = ceElm;
16255
- state.screenX = e.screenX;
16256
- state.screenY = e.screenY;
16257
- state.maxX = (editor.inline ? bodyElm.scrollWidth : docElm.offsetWidth) - 2;
16258
- state.maxY = (editor.inline ? bodyElm.scrollHeight : docElm.offsetHeight) - 2;
16259
- state.relX = e.pageX - elmPos.x;
16260
- state.relY = e.pageY - elmPos.y;
16261
- state.width = ceElm.offsetWidth;
16262
- state.height = ceElm.offsetHeight;
16263
- state.ghost = createGhost(editor, ceElm, state.width, state.height);
16264
- }
16265
- }
16266
- };
16267
- };
16268
- var move$1 = function (state, editor) {
16269
- var throttledPlaceCaretAt = Delay.throttle(function (clientX, clientY) {
16270
- editor._selectionOverrides.hideFakeCaret();
16271
- editor.selection.placeCaretAt(clientX, clientY);
16272
- }, 0);
16273
- return function (e) {
16274
- var movement = Math.max(Math.abs(e.screenX - state.screenX), Math.abs(e.screenY - state.screenY));
16275
- if (hasDraggableElement(state) && !state.dragging && movement > 10) {
16276
- var args = editor.fire('dragstart', { target: state.element });
16277
- if (args.isDefaultPrevented()) {
16278
- return;
16279
- }
16280
- state.dragging = true;
16281
- editor.focus();
16282
- }
16283
- if (state.dragging) {
16284
- var targetPos = applyRelPos(state, MousePosition.calc(editor, e));
16285
- appendGhostToBody(state.ghost, editor.getBody());
16286
- moveGhost(state.ghost, targetPos, state.width, state.height, state.maxX, state.maxY);
16287
- throttledPlaceCaretAt(e.clientX, e.clientY);
16288
- }
16289
- };
16290
- };
16291
- var getRawTarget = function (selection) {
16292
- var rng = selection.getSel().getRangeAt(0);
16293
- var startContainer = rng.startContainer;
16294
- return startContainer.nodeType === 3 ? startContainer.parentNode : startContainer;
16295
- };
16296
- var drop = function (state, editor) {
16297
- return function (e) {
16298
- if (state.dragging) {
16299
- if (isValidDropTarget(editor, getRawTarget(editor.selection), state.element)) {
16300
- var targetClone_1 = cloneElement(state.element);
16301
- var args = editor.fire('drop', {
16302
- targetClone: targetClone_1,
16303
- clientX: e.clientX,
16304
- clientY: e.clientY
16305
- });
16306
- if (!args.isDefaultPrevented()) {
16307
- targetClone_1 = args.targetClone;
16308
- editor.undoManager.transact(function () {
16309
- removeElement(state.element);
16310
- editor.insertContent(editor.dom.getOuterHTML(targetClone_1));
16311
- editor._selectionOverrides.hideFakeCaret();
16312
- });
16313
- }
16314
- }
16315
- }
16316
- removeDragState(state);
16317
- };
16318
- };
16319
- var stop = function (state, editor) {
16320
- return function () {
16321
- if (state.dragging) {
16322
- editor.fire('dragend');
16323
- }
16324
- removeDragState(state);
16325
- };
16326
- };
16327
- var removeDragState = function (state) {
16328
- state.dragging = false;
16329
- state.element = null;
16330
- removeElement(state.ghost);
16331
- };
16332
- var bindFakeDragEvents = function (editor) {
16333
- var state = {};
16334
- var pageDom, dragStartHandler, dragHandler, dropHandler, dragEndHandler, rootDocument;
16335
- pageDom = DOMUtils$1.DOM;
16336
- rootDocument = domGlobals.document;
16337
- dragStartHandler = start$1(state, editor);
16338
- dragHandler = move$1(state, editor);
16339
- dropHandler = drop(state, editor);
16340
- dragEndHandler = stop(state, editor);
16341
- editor.on('mousedown', dragStartHandler);
16342
- editor.on('mousemove', dragHandler);
16343
- editor.on('mouseup', dropHandler);
16344
- pageDom.bind(rootDocument, 'mousemove', dragHandler);
16345
- pageDom.bind(rootDocument, 'mouseup', dragEndHandler);
16346
- editor.on('remove', function () {
16347
- pageDom.unbind(rootDocument, 'mousemove', dragHandler);
16348
- pageDom.unbind(rootDocument, 'mouseup', dragEndHandler);
16349
- });
16350
- };
16351
- var blockIeDrop = function (editor) {
16352
- editor.on('drop', function (e) {
16353
- var realTarget = typeof e.clientX !== 'undefined' ? editor.getDoc().elementFromPoint(e.clientX, e.clientY) : null;
16354
- if (isContentEditableFalse$7(realTarget) || isContentEditableFalse$7(editor.dom.getContentEditableParent(realTarget))) {
16355
- e.preventDefault();
16356
- }
16357
- });
16358
- };
16359
- var init = function (editor) {
16360
- bindFakeDragEvents(editor);
16361
- blockIeDrop(editor);
16362
- };
16363
- var DragDropOverrides = { init: init };
16364
-
16365
- var getNodeClientRects = function (node) {
16366
- var toArrayWithNode = function (clientRects) {
16367
- return map(clientRects, function (clientRect) {
16368
- clientRect = clone$1(clientRect);
16369
- clientRect.node = node;
16370
- return clientRect;
16371
- });
16372
- };
16373
- if (NodeType.isElement(node)) {
16374
- return toArrayWithNode(node.getClientRects());
16375
- }
16376
- if (NodeType.isText(node)) {
16377
- var rng = node.ownerDocument.createRange();
16378
- rng.setStart(node, 0);
16379
- rng.setEnd(node, node.data.length);
16380
- return toArrayWithNode(rng.getClientRects());
16735
+ if (NodeType.isText(node)) {
16736
+ var rng = node.ownerDocument.createRange();
16737
+ rng.setStart(node, 0);
16738
+ rng.setEnd(node, node.data.length);
16739
+ return toArrayWithNode(rng.getClientRects());
16381
16740
  }
16382
16741
  };
16383
16742
  var getClientRects = function (node) {
@@ -16495,7 +16854,7 @@
16495
16854
  };
16496
16855
  };
16497
16856
 
16498
- var isContentEditableFalse$8 = NodeType.isContentEditableFalse;
16857
+ var isContentEditableFalse$7 = NodeType.isContentEditableFalse;
16499
16858
  var findNode$1 = findNode;
16500
16859
  var distanceToRectLeft = function (clientRect, clientX) {
16501
16860
  return Math.abs(clientRect.left - clientX);
@@ -16517,71 +16876,345 @@
16517
16876
  if (isInside(clientX, oldClientRect)) {
16518
16877
  return oldClientRect;
16519
16878
  }
16520
- if (newDistance === oldDistance && isContentEditableFalse$8(clientRect.node)) {
16879
+ if (newDistance === oldDistance && isContentEditableFalse$7(clientRect.node)) {
16521
16880
  return clientRect;
16522
16881
  }
16523
16882
  if (newDistance < oldDistance) {
16524
16883
  return clientRect;
16525
16884
  }
16526
- return oldClientRect;
16527
- });
16885
+ return oldClientRect;
16886
+ });
16887
+ };
16888
+ var walkUntil$1 = function (direction, root, predicateFn, node) {
16889
+ while (node = findNode$1(node, direction, isEditableCaretCandidate, root)) {
16890
+ if (predicateFn(node)) {
16891
+ return;
16892
+ }
16893
+ }
16894
+ };
16895
+ var findLineNodeRects = function (root, targetNodeRect) {
16896
+ var clientRects = [];
16897
+ var collect = function (checkPosFn, node) {
16898
+ var lineRects;
16899
+ lineRects = filter(getClientRects([node]), function (clientRect) {
16900
+ return !checkPosFn(clientRect, targetNodeRect);
16901
+ });
16902
+ clientRects = clientRects.concat(lineRects);
16903
+ return lineRects.length === 0;
16904
+ };
16905
+ clientRects.push(targetNodeRect);
16906
+ walkUntil$1(VDirection.Up, root, curry(collect, isAbove), targetNodeRect.node);
16907
+ walkUntil$1(VDirection.Down, root, curry(collect, isBelow), targetNodeRect.node);
16908
+ return clientRects;
16909
+ };
16910
+ var getFakeCaretTargets = function (root) {
16911
+ return filter(from$1(root.getElementsByTagName('*')), isFakeCaretTarget);
16912
+ };
16913
+ var caretInfo = function (clientRect, clientX) {
16914
+ return {
16915
+ node: clientRect.node,
16916
+ before: distanceToRectLeft(clientRect, clientX) < distanceToRectRight(clientRect, clientX)
16917
+ };
16918
+ };
16919
+ var closestCaret = function (root, clientX, clientY) {
16920
+ var closestNodeRect;
16921
+ var contentEditableFalseNodeRects = getClientRects(getFakeCaretTargets(root));
16922
+ var targetNodeRects = filter(contentEditableFalseNodeRects, function (rect) {
16923
+ return clientY >= rect.top && clientY <= rect.bottom;
16924
+ });
16925
+ closestNodeRect = findClosestClientRect(targetNodeRects, clientX);
16926
+ if (closestNodeRect) {
16927
+ closestNodeRect = findClosestClientRect(findLineNodeRects(root, closestNodeRect), clientX);
16928
+ if (closestNodeRect && isFakeCaretTarget(closestNodeRect.node)) {
16929
+ return caretInfo(closestNodeRect, clientX);
16930
+ }
16931
+ }
16932
+ return null;
16933
+ };
16934
+
16935
+ var isXYWithinRange = function (clientX, clientY, range) {
16936
+ if (range.collapsed) {
16937
+ return false;
16938
+ }
16939
+ if (Env.ie && Env.ie <= 11 && range.startOffset === range.endOffset - 1 && range.startContainer === range.endContainer) {
16940
+ var elm = range.startContainer.childNodes[range.startOffset];
16941
+ if (NodeType.isElement(elm)) {
16942
+ return exists(elm.getClientRects(), function (rect) {
16943
+ return containsXY(rect, clientX, clientY);
16944
+ });
16945
+ }
16946
+ }
16947
+ return exists(range.getClientRects(), function (rect) {
16948
+ return containsXY(rect, clientX, clientY);
16949
+ });
16950
+ };
16951
+ var RangePoint = { isXYWithinRange: isXYWithinRange };
16952
+
16953
+ var getAbsolutePosition = function (elm) {
16954
+ var doc, docElem, win, clientRect;
16955
+ clientRect = elm.getBoundingClientRect();
16956
+ doc = elm.ownerDocument;
16957
+ docElem = doc.documentElement;
16958
+ win = doc.defaultView;
16959
+ return {
16960
+ top: clientRect.top + win.pageYOffset - docElem.clientTop,
16961
+ left: clientRect.left + win.pageXOffset - docElem.clientLeft
16962
+ };
16963
+ };
16964
+ var getBodyPosition = function (editor) {
16965
+ return editor.inline ? getAbsolutePosition(editor.getBody()) : {
16966
+ left: 0,
16967
+ top: 0
16968
+ };
16969
+ };
16970
+ var getScrollPosition = function (editor) {
16971
+ var body = editor.getBody();
16972
+ return editor.inline ? {
16973
+ left: body.scrollLeft,
16974
+ top: body.scrollTop
16975
+ } : {
16976
+ left: 0,
16977
+ top: 0
16978
+ };
16979
+ };
16980
+ var getBodyScroll = function (editor) {
16981
+ var body = editor.getBody(), docElm = editor.getDoc().documentElement;
16982
+ var inlineScroll = {
16983
+ left: body.scrollLeft,
16984
+ top: body.scrollTop
16985
+ };
16986
+ var iframeScroll = {
16987
+ left: body.scrollLeft || docElm.scrollLeft,
16988
+ top: body.scrollTop || docElm.scrollTop
16989
+ };
16990
+ return editor.inline ? inlineScroll : iframeScroll;
16991
+ };
16992
+ var getMousePosition = function (editor, event) {
16993
+ if (event.target.ownerDocument !== editor.getDoc()) {
16994
+ var iframePosition = getAbsolutePosition(editor.getContentAreaContainer());
16995
+ var scrollPosition = getBodyScroll(editor);
16996
+ return {
16997
+ left: event.pageX - iframePosition.left + scrollPosition.left,
16998
+ top: event.pageY - iframePosition.top + scrollPosition.top
16999
+ };
17000
+ }
17001
+ return {
17002
+ left: event.pageX,
17003
+ top: event.pageY
17004
+ };
17005
+ };
17006
+ var calculatePosition = function (bodyPosition, scrollPosition, mousePosition) {
17007
+ return {
17008
+ pageX: mousePosition.left - bodyPosition.left + scrollPosition.left,
17009
+ pageY: mousePosition.top - bodyPosition.top + scrollPosition.top
17010
+ };
17011
+ };
17012
+ var calc = function (editor, event) {
17013
+ return calculatePosition(getBodyPosition(editor), getScrollPosition(editor), getMousePosition(editor, event));
17014
+ };
17015
+ var MousePosition = { calc: calc };
17016
+
17017
+ var isContentEditableFalse$8 = NodeType.isContentEditableFalse, isContentEditableTrue$3 = NodeType.isContentEditableTrue;
17018
+ var isDraggable = function (rootElm, elm) {
17019
+ return isContentEditableFalse$8(elm) && elm !== rootElm;
17020
+ };
17021
+ var isValidDropTarget = function (editor, targetElement, dragElement) {
17022
+ if (targetElement === dragElement || editor.dom.isChildOf(targetElement, dragElement)) {
17023
+ return false;
17024
+ }
17025
+ if (isContentEditableFalse$8(targetElement)) {
17026
+ return false;
17027
+ }
17028
+ return true;
17029
+ };
17030
+ var cloneElement = function (elm) {
17031
+ var cloneElm = elm.cloneNode(true);
17032
+ cloneElm.removeAttribute('data-mce-selected');
17033
+ return cloneElm;
17034
+ };
17035
+ var createGhost = function (editor, elm, width, height) {
17036
+ var clonedElm = elm.cloneNode(true);
17037
+ editor.dom.setStyles(clonedElm, {
17038
+ width: width,
17039
+ height: height
17040
+ });
17041
+ editor.dom.setAttrib(clonedElm, 'data-mce-selected', null);
17042
+ var ghostElm = editor.dom.create('div', {
17043
+ 'class': 'mce-drag-container',
17044
+ 'data-mce-bogus': 'all',
17045
+ 'unselectable': 'on',
17046
+ 'contenteditable': 'false'
17047
+ });
17048
+ editor.dom.setStyles(ghostElm, {
17049
+ position: 'absolute',
17050
+ opacity: 0.5,
17051
+ overflow: 'hidden',
17052
+ border: 0,
17053
+ padding: 0,
17054
+ margin: 0,
17055
+ width: width,
17056
+ height: height
17057
+ });
17058
+ editor.dom.setStyles(clonedElm, {
17059
+ margin: 0,
17060
+ boxSizing: 'border-box'
17061
+ });
17062
+ ghostElm.appendChild(clonedElm);
17063
+ return ghostElm;
17064
+ };
17065
+ var appendGhostToBody = function (ghostElm, bodyElm) {
17066
+ if (ghostElm.parentNode !== bodyElm) {
17067
+ bodyElm.appendChild(ghostElm);
17068
+ }
17069
+ };
17070
+ var moveGhost = function (ghostElm, position, width, height, maxX, maxY) {
17071
+ var overflowX = 0, overflowY = 0;
17072
+ ghostElm.style.left = position.pageX + 'px';
17073
+ ghostElm.style.top = position.pageY + 'px';
17074
+ if (position.pageX + width > maxX) {
17075
+ overflowX = position.pageX + width - maxX;
17076
+ }
17077
+ if (position.pageY + height > maxY) {
17078
+ overflowY = position.pageY + height - maxY;
17079
+ }
17080
+ ghostElm.style.width = width - overflowX + 'px';
17081
+ ghostElm.style.height = height - overflowY + 'px';
17082
+ };
17083
+ var removeElement = function (elm) {
17084
+ if (elm && elm.parentNode) {
17085
+ elm.parentNode.removeChild(elm);
17086
+ }
17087
+ };
17088
+ var isLeftMouseButtonPressed = function (e) {
17089
+ return e.button === 0;
17090
+ };
17091
+ var hasDraggableElement = function (state) {
17092
+ return state.element;
17093
+ };
17094
+ var applyRelPos = function (state, position) {
17095
+ return {
17096
+ pageX: position.pageX - state.relX,
17097
+ pageY: position.pageY + 5
17098
+ };
17099
+ };
17100
+ var start$1 = function (state, editor) {
17101
+ return function (e) {
17102
+ if (isLeftMouseButtonPressed(e)) {
17103
+ var ceElm = find(editor.dom.getParents(e.target), Predicate.or(isContentEditableFalse$8, isContentEditableTrue$3)).getOr(null);
17104
+ if (isDraggable(editor.getBody(), ceElm)) {
17105
+ var elmPos = editor.dom.getPos(ceElm);
17106
+ var bodyElm = editor.getBody();
17107
+ var docElm = editor.getDoc().documentElement;
17108
+ state.element = ceElm;
17109
+ state.screenX = e.screenX;
17110
+ state.screenY = e.screenY;
17111
+ state.maxX = (editor.inline ? bodyElm.scrollWidth : docElm.offsetWidth) - 2;
17112
+ state.maxY = (editor.inline ? bodyElm.scrollHeight : docElm.offsetHeight) - 2;
17113
+ state.relX = e.pageX - elmPos.x;
17114
+ state.relY = e.pageY - elmPos.y;
17115
+ state.width = ceElm.offsetWidth;
17116
+ state.height = ceElm.offsetHeight;
17117
+ state.ghost = createGhost(editor, ceElm, state.width, state.height);
17118
+ }
17119
+ }
17120
+ };
17121
+ };
17122
+ var move$1 = function (state, editor) {
17123
+ var throttledPlaceCaretAt = Delay.throttle(function (clientX, clientY) {
17124
+ editor._selectionOverrides.hideFakeCaret();
17125
+ editor.selection.placeCaretAt(clientX, clientY);
17126
+ }, 0);
17127
+ return function (e) {
17128
+ var movement = Math.max(Math.abs(e.screenX - state.screenX), Math.abs(e.screenY - state.screenY));
17129
+ if (hasDraggableElement(state) && !state.dragging && movement > 10) {
17130
+ var args = editor.fire('dragstart', { target: state.element });
17131
+ if (args.isDefaultPrevented()) {
17132
+ return;
17133
+ }
17134
+ state.dragging = true;
17135
+ editor.focus();
17136
+ }
17137
+ if (state.dragging) {
17138
+ var targetPos = applyRelPos(state, MousePosition.calc(editor, e));
17139
+ appendGhostToBody(state.ghost, editor.getBody());
17140
+ moveGhost(state.ghost, targetPos, state.width, state.height, state.maxX, state.maxY);
17141
+ throttledPlaceCaretAt(e.clientX, e.clientY);
17142
+ }
17143
+ };
17144
+ };
17145
+ var getRawTarget = function (selection) {
17146
+ var rng = selection.getSel().getRangeAt(0);
17147
+ var startContainer = rng.startContainer;
17148
+ return startContainer.nodeType === 3 ? startContainer.parentNode : startContainer;
17149
+ };
17150
+ var drop = function (state, editor) {
17151
+ return function (e) {
17152
+ if (state.dragging) {
17153
+ if (isValidDropTarget(editor, getRawTarget(editor.selection), state.element)) {
17154
+ var targetClone_1 = cloneElement(state.element);
17155
+ var args = editor.fire('drop', {
17156
+ targetClone: targetClone_1,
17157
+ clientX: e.clientX,
17158
+ clientY: e.clientY
17159
+ });
17160
+ if (!args.isDefaultPrevented()) {
17161
+ targetClone_1 = args.targetClone;
17162
+ editor.undoManager.transact(function () {
17163
+ removeElement(state.element);
17164
+ editor.insertContent(editor.dom.getOuterHTML(targetClone_1));
17165
+ editor._selectionOverrides.hideFakeCaret();
17166
+ });
17167
+ }
17168
+ }
17169
+ }
17170
+ removeDragState(state);
17171
+ };
16528
17172
  };
16529
- var walkUntil$1 = function (direction, root, predicateFn, node) {
16530
- while (node = findNode$1(node, direction, isEditableCaretCandidate, root)) {
16531
- if (predicateFn(node)) {
16532
- return;
17173
+ var stop = function (state, editor) {
17174
+ return function () {
17175
+ if (state.dragging) {
17176
+ editor.fire('dragend');
16533
17177
  }
16534
- }
16535
- };
16536
- var findLineNodeRects = function (root, targetNodeRect) {
16537
- var clientRects = [];
16538
- var collect = function (checkPosFn, node) {
16539
- var lineRects;
16540
- lineRects = filter(getClientRects([node]), function (clientRect) {
16541
- return !checkPosFn(clientRect, targetNodeRect);
16542
- });
16543
- clientRects = clientRects.concat(lineRects);
16544
- return lineRects.length === 0;
17178
+ removeDragState(state);
16545
17179
  };
16546
- clientRects.push(targetNodeRect);
16547
- walkUntil$1(VDirection.Up, root, curry(collect, isAbove), targetNodeRect.node);
16548
- walkUntil$1(VDirection.Down, root, curry(collect, isBelow), targetNodeRect.node);
16549
- return clientRects;
16550
17180
  };
16551
- var getFakeCaretTargets = function (root) {
16552
- return filter(from$1(root.getElementsByTagName('*')), isFakeCaretTarget);
16553
- };
16554
- var caretInfo = function (clientRect, clientX) {
16555
- return {
16556
- node: clientRect.node,
16557
- before: distanceToRectLeft(clientRect, clientX) < distanceToRectRight(clientRect, clientX)
16558
- };
17181
+ var removeDragState = function (state) {
17182
+ state.dragging = false;
17183
+ state.element = null;
17184
+ removeElement(state.ghost);
16559
17185
  };
16560
- var closestCaret = function (root, clientX, clientY) {
16561
- var closestNodeRect;
16562
- var contentEditableFalseNodeRects = getClientRects(getFakeCaretTargets(root));
16563
- var targetNodeRects = filter(contentEditableFalseNodeRects, function (rect) {
16564
- return clientY >= rect.top && clientY <= rect.bottom;
17186
+ var bindFakeDragEvents = function (editor) {
17187
+ var state = {};
17188
+ var pageDom, dragStartHandler, dragHandler, dropHandler, dragEndHandler, rootDocument;
17189
+ pageDom = DOMUtils$1.DOM;
17190
+ rootDocument = domGlobals.document;
17191
+ dragStartHandler = start$1(state, editor);
17192
+ dragHandler = move$1(state, editor);
17193
+ dropHandler = drop(state, editor);
17194
+ dragEndHandler = stop(state, editor);
17195
+ editor.on('mousedown', dragStartHandler);
17196
+ editor.on('mousemove', dragHandler);
17197
+ editor.on('mouseup', dropHandler);
17198
+ pageDom.bind(rootDocument, 'mousemove', dragHandler);
17199
+ pageDom.bind(rootDocument, 'mouseup', dragEndHandler);
17200
+ editor.on('remove', function () {
17201
+ pageDom.unbind(rootDocument, 'mousemove', dragHandler);
17202
+ pageDom.unbind(rootDocument, 'mouseup', dragEndHandler);
16565
17203
  });
16566
- closestNodeRect = findClosestClientRect(targetNodeRects, clientX);
16567
- if (closestNodeRect) {
16568
- closestNodeRect = findClosestClientRect(findLineNodeRects(root, closestNodeRect), clientX);
16569
- if (closestNodeRect && isFakeCaretTarget(closestNodeRect.node)) {
16570
- return caretInfo(closestNodeRect, clientX);
17204
+ };
17205
+ var blockIeDrop = function (editor) {
17206
+ editor.on('drop', function (e) {
17207
+ var realTarget = typeof e.clientX !== 'undefined' ? editor.getDoc().elementFromPoint(e.clientX, e.clientY) : null;
17208
+ if (isContentEditableFalse$8(realTarget) || isContentEditableFalse$8(editor.dom.getContentEditableParent(realTarget))) {
17209
+ e.preventDefault();
16571
17210
  }
16572
- }
16573
- return null;
17211
+ });
16574
17212
  };
16575
-
16576
- var isXYWithinRange = function (clientX, clientY, range) {
16577
- if (range.collapsed) {
16578
- return false;
16579
- }
16580
- return foldl(range.getClientRects(), function (state, rect) {
16581
- return state || containsXY(rect, clientX, clientY);
16582
- }, false);
17213
+ var init = function (editor) {
17214
+ bindFakeDragEvents(editor);
17215
+ blockIeDrop(editor);
16583
17216
  };
16584
- var RangePoint = { isXYWithinRange: isXYWithinRange };
17217
+ var DragDropOverrides = { init: init };
16585
17218
 
16586
17219
  var setup$4 = function (editor) {
16587
17220
  var renderFocusCaret = first(function () {
@@ -16602,26 +17235,6 @@
16602
17235
  };
16603
17236
  var CefFocus = { setup: setup$4 };
16604
17237
 
16605
- var VK = {
16606
- BACKSPACE: 8,
16607
- DELETE: 46,
16608
- DOWN: 40,
16609
- ENTER: 13,
16610
- LEFT: 37,
16611
- RIGHT: 39,
16612
- SPACEBAR: 32,
16613
- TAB: 9,
16614
- UP: 38,
16615
- END: 35,
16616
- HOME: 36,
16617
- modifierPressed: function (e) {
16618
- return e.shiftKey || e.ctrlKey || e.altKey || this.metaKeyPressed(e);
16619
- },
16620
- metaKeyPressed: function (e) {
16621
- return Env.mac ? e.metaKey : e.ctrlKey && !e.altKey;
16622
- }
16623
- };
16624
-
16625
17238
  var isContentEditableTrue$4 = NodeType.isContentEditableTrue;
16626
17239
  var isContentEditableFalse$9 = NodeType.isContentEditableFalse;
16627
17240
  var getContentEditableRoot$1 = function (editor, node) {
@@ -16820,8 +17433,8 @@
16820
17433
  }
16821
17434
  });
16822
17435
  editor.on('setSelectionRange', function (e) {
16823
- var rng;
16824
- rng = setContentEditableSelection(e.range, e.forward);
17436
+ e.range = normalizeShortEndedElementSelection(e.range);
17437
+ var rng = setContentEditableSelection(e.range, e.forward);
16825
17438
  if (rng) {
16826
17439
  e.range = rng;
16827
17440
  }
@@ -16864,6 +17477,33 @@
16864
17477
  var isRangeInCaretContainer = function (rng) {
16865
17478
  return isWithinCaretContainer(rng.startContainer) || isWithinCaretContainer(rng.endContainer);
16866
17479
  };
17480
+ var normalizeShortEndedElementSelection = function (rng) {
17481
+ var shortEndedElements = editor.schema.getShortEndedElements();
17482
+ var newRng = editor.dom.createRng();
17483
+ var startContainer = rng.startContainer;
17484
+ var startOffset = rng.startOffset;
17485
+ var endContainer = rng.endContainer;
17486
+ var endOffset = rng.endOffset;
17487
+ if (has(shortEndedElements, startContainer.nodeName.toLowerCase())) {
17488
+ if (startOffset === 0) {
17489
+ newRng.setStartBefore(startContainer);
17490
+ } else {
17491
+ newRng.setStartAfter(startContainer);
17492
+ }
17493
+ } else {
17494
+ newRng.setStart(startContainer, startOffset);
17495
+ }
17496
+ if (has(shortEndedElements, endContainer.nodeName.toLowerCase())) {
17497
+ if (endOffset === 0) {
17498
+ newRng.setEndBefore(endContainer);
17499
+ } else {
17500
+ newRng.setEndAfter(endContainer);
17501
+ }
17502
+ } else {
17503
+ newRng.setEnd(endContainer, endOffset);
17504
+ }
17505
+ return newRng;
17506
+ };
16867
17507
  var setContentEditableSelection = function (range, forward) {
16868
17508
  var node;
16869
17509
  var $ = editor.$;
@@ -16905,7 +17545,7 @@
16905
17545
  if (startContainer.nodeType !== 1) {
16906
17546
  return null;
16907
17547
  }
16908
- if (endOffset === startOffset + 1) {
17548
+ if (endOffset === startOffset + 1 && startContainer === range.endContainer) {
16909
17549
  node = startContainer.childNodes[startOffset];
16910
17550
  }
16911
17551
  if (!isContentEditableFalse$9(node)) {
@@ -16984,7 +17624,11 @@
16984
17624
  return name.indexOf('data-') === 0 || name.indexOf('aria-') === 0;
16985
17625
  };
16986
17626
  var trimComments = function (text) {
16987
- return text.replace(/<!--|-->/g, '');
17627
+ var sanitizedText = text;
17628
+ while (/<!--|--!?>/g.test(sanitizedText)) {
17629
+ sanitizedText = sanitizedText.replace(/<!--|--!?>/g, '');
17630
+ }
17631
+ return sanitizedText;
16988
17632
  };
16989
17633
  var isInvalidUri = function (settings, uri) {
16990
17634
  if (settings.allow_html_data_urls) {
@@ -17122,7 +17766,7 @@
17122
17766
  value: value
17123
17767
  });
17124
17768
  };
17125
- tokenRegExp = new RegExp('<(?:' + '(?:!--([\\w\\W]*?)-->)|' + '(?:!\\[CDATA\\[([\\w\\W]*?)\\]\\]>)|' + '(?:!DOCTYPE([\\w\\W]*?)>)|' + '(?:\\?([^\\s\\/<>]+) ?([\\w\\W]*?)[?/]>)|' + '(?:\\/([A-Za-z][A-Za-z0-9\\-_\\:\\.]*)>)|' + '(?:([A-Za-z][A-Za-z0-9\\-_\\:\\.]*)((?:\\s+[^"\'>]+(?:(?:"[^"]*")|(?:\'[^\']*\')|[^>]*))*|\\/|\\s+)>)' + ')', 'g');
17769
+ tokenRegExp = new RegExp('<(?:' + '(?:!--([\\w\\W]*?)--!?>)|' + '(?:!\\[CDATA\\[([\\w\\W]*?)\\]\\]>)|' + '(?:!DOCTYPE([\\w\\W]*?)>)|' + '(?:\\?([^\\s\\/<>]+) ?([\\w\\W]*?)[?/]>)|' + '(?:\\/([A-Za-z][A-Za-z0-9\\-_\\:\\.]*)>)|' + '(?:([A-Za-z][A-Za-z0-9\\-_\\:\\.]*)((?:\\s+[^"\'>]+(?:(?:"[^"]*")|(?:\'[^\']*\')|[^>]*))*|\\/|\\s+)>)' + ')', 'g');
17126
17770
  attrRegExp = /([\w:\-]+)(?:\s*=\s*(?:(?:\"((?:[^\"])*)\")|(?:\'((?:[^\'])*)\')|([^>\s]+)))?/g;
17127
17771
  shortEndedElements = schema.getShortEndedElements();
17128
17772
  selfClosing = settings.self_closing_elements || schema.getSelfClosingElements();
@@ -18618,7 +19262,7 @@
18618
19262
  }
18619
19263
  ed.selection.setRng(RangeNormalizer.normalize(ed.selection.getRng()));
18620
19264
  bookmark = GetBookmark.getPersistentBookmark(ed.selection, true);
18621
- applyRngStyle(dom, ExpandRange.expandRng(ed, selection.getRng(), formatList), bookmark);
19265
+ applyRngStyle(dom, ExpandRange.expandRng(ed, selection.getRng(), formatList));
18622
19266
  if (format.styles) {
18623
19267
  MergeFormats.mergeUnderlineAndColor(dom, format, vars, curSelNode);
18624
19268
  }
@@ -19289,17 +19933,20 @@
19289
19933
  var baseMerge = function (merger) {
19290
19934
  return function () {
19291
19935
  var objects = new Array(arguments.length);
19292
- for (var i = 0; i < objects.length; i++)
19936
+ for (var i = 0; i < objects.length; i++) {
19293
19937
  objects[i] = arguments[i];
19294
- if (objects.length === 0)
19938
+ }
19939
+ if (objects.length === 0) {
19295
19940
  throw new Error('Can\'t merge zero objects');
19941
+ }
19296
19942
  var ret = {};
19297
19943
  for (var j = 0; j < objects.length; j++) {
19298
19944
  var curObject = objects[j];
19299
- for (var key in curObject)
19945
+ for (var key in curObject) {
19300
19946
  if (hasOwnProperty$2.call(curObject, key)) {
19301
19947
  ret[key] = merger(ret[key], curObject[key]);
19302
19948
  }
19949
+ }
19303
19950
  }
19304
19951
  return ret;
19305
19952
  };
@@ -19866,7 +20513,7 @@
19866
20513
  var blockElements = Tools.extend({}, schema.getBlockElements());
19867
20514
  var nonEmptyElements = schema.getNonEmptyElements();
19868
20515
  var parent, lastParent, prev, prevName;
19869
- var whiteSpaceElements = schema.getNonEmptyElements();
20516
+ var whiteSpaceElements = schema.getWhiteSpaceElements();
19870
20517
  var elementRule, textNode;
19871
20518
  blockElements.body = 1;
19872
20519
  for (i = 0; i < l; i++) {
@@ -20632,7 +21279,6 @@
20632
21279
  var contextMenuSelectImage = function (evt) {
20633
21280
  var target = evt.target;
20634
21281
  if (isEventOnImageOutsideRange(evt, editor.selection.getRng()) && !evt.isDefaultPrevented()) {
20635
- evt.preventDefault();
20636
21282
  editor.selection.select(target);
20637
21283
  }
20638
21284
  };
@@ -20942,99 +21588,6 @@
20942
21588
  };
20943
21589
  };
20944
21590
 
20945
- var getPos$1 = function (elm) {
20946
- var x = 0, y = 0;
20947
- var offsetParent = elm;
20948
- while (offsetParent && offsetParent.nodeType) {
20949
- x += offsetParent.offsetLeft || 0;
20950
- y += offsetParent.offsetTop || 0;
20951
- offsetParent = offsetParent.offsetParent;
20952
- }
20953
- return {
20954
- x: x,
20955
- y: y
20956
- };
20957
- };
20958
- var fireScrollIntoViewEvent = function (editor, elm, alignToTop) {
20959
- var scrollEvent = {
20960
- elm: elm,
20961
- alignToTop: alignToTop
20962
- };
20963
- editor.fire('scrollIntoView', scrollEvent);
20964
- return scrollEvent.isDefaultPrevented();
20965
- };
20966
- var scrollElementIntoView = function (editor, elm, alignToTop) {
20967
- var y, viewPort;
20968
- var dom = editor.dom;
20969
- var root = dom.getRoot();
20970
- var viewPortY, viewPortH, offsetY = 0;
20971
- if (fireScrollIntoViewEvent(editor, elm, alignToTop)) {
20972
- return;
20973
- }
20974
- if (!NodeType.isElement(elm)) {
20975
- return;
20976
- }
20977
- if (alignToTop === false) {
20978
- offsetY = elm.offsetHeight;
20979
- }
20980
- if (root.nodeName !== 'BODY') {
20981
- var scrollContainer = editor.selection.getScrollContainer();
20982
- if (scrollContainer) {
20983
- y = getPos$1(elm).y - getPos$1(scrollContainer).y + offsetY;
20984
- viewPortH = scrollContainer.clientHeight;
20985
- viewPortY = scrollContainer.scrollTop;
20986
- if (y < viewPortY || y + 25 > viewPortY + viewPortH) {
20987
- scrollContainer.scrollTop = y < viewPortY ? y : y - viewPortH + 25;
20988
- }
20989
- return;
20990
- }
20991
- }
20992
- viewPort = dom.getViewPort(editor.getWin());
20993
- y = dom.getPos(elm).y + offsetY;
20994
- viewPortY = viewPort.y;
20995
- viewPortH = viewPort.h;
20996
- if (y < viewPort.y || y + 25 > viewPortY + viewPortH) {
20997
- editor.getWin().scrollTo(0, y < viewPortY ? y : y - viewPortH + 25);
20998
- }
20999
- };
21000
- var getViewPortRect = function (editor) {
21001
- if (editor.inline) {
21002
- return editor.getBody().getBoundingClientRect();
21003
- } else {
21004
- var win = editor.getWin();
21005
- return {
21006
- left: 0,
21007
- right: win.innerWidth,
21008
- top: 0,
21009
- bottom: win.innerHeight,
21010
- width: win.innerWidth,
21011
- height: win.innerHeight
21012
- };
21013
- }
21014
- };
21015
- var scrollBy = function (editor, dx, dy) {
21016
- if (editor.inline) {
21017
- editor.getBody().scrollLeft += dx;
21018
- editor.getBody().scrollTop += dy;
21019
- } else {
21020
- editor.getWin().scrollBy(dx, dy);
21021
- }
21022
- };
21023
- var scrollRangeIntoView = function (editor, rng) {
21024
- head(CaretPosition.fromRangeStart(rng).getClientRects()).each(function (rngRect) {
21025
- var bodyRect = getViewPortRect(editor);
21026
- var overflow = getOverflow(bodyRect, rngRect);
21027
- var margin = 4;
21028
- var dx = overflow.x > 0 ? overflow.x + margin : overflow.x - margin;
21029
- var dy = overflow.y > 0 ? overflow.y + margin : overflow.y - margin;
21030
- scrollBy(editor, overflow.x !== 0 ? dx : 0, overflow.y !== 0 ? dy : 0);
21031
- });
21032
- };
21033
- var ScrollIntoView = {
21034
- scrollElementIntoView: scrollElementIntoView,
21035
- scrollRangeIntoView: scrollRangeIntoView
21036
- };
21037
-
21038
21591
  var hasCeProperty = function (node) {
21039
21592
  return NodeType.isContentEditableTrue(node) || NodeType.isContentEditableFalse(node);
21040
21593
  };
@@ -21353,22 +21906,37 @@
21353
21906
  };
21354
21907
  var GetSelectionContent = { getContent: getContent };
21355
21908
 
21909
+ var setupArgs = function (args, content) {
21910
+ return __assign(__assign({ format: 'html' }, args), {
21911
+ set: true,
21912
+ selection: true,
21913
+ content: content
21914
+ });
21915
+ };
21916
+ var cleanContent = function (editor, args) {
21917
+ if (args.format !== 'raw') {
21918
+ var node = editor.parser.parse(args.content, __assign({
21919
+ isRootContent: true,
21920
+ forced_root_block: false
21921
+ }, args));
21922
+ return HtmlSerializer({ validate: editor.validate }, editor.schema).serialize(node);
21923
+ } else {
21924
+ return args.content;
21925
+ }
21926
+ };
21356
21927
  var setContent = function (editor, content, args) {
21928
+ var contentArgs = setupArgs(args, content);
21357
21929
  var rng = editor.selection.getRng(), caretNode;
21358
21930
  var doc = editor.getDoc();
21359
21931
  var frag, temp;
21360
- args = args || { format: 'html' };
21361
- args.set = true;
21362
- args.selection = true;
21363
- args.content = content;
21364
- if (!args.no_events) {
21365
- args = editor.fire('BeforeSetContent', args);
21366
- if (args.isDefaultPrevented()) {
21367
- editor.fire('SetContent', args);
21932
+ if (!contentArgs.no_events) {
21933
+ contentArgs = editor.fire('BeforeSetContent', contentArgs);
21934
+ if (contentArgs.isDefaultPrevented()) {
21935
+ editor.fire('SetContent', contentArgs);
21368
21936
  return;
21369
21937
  }
21370
21938
  }
21371
- content = args.content;
21939
+ content = cleanContent(editor, contentArgs);
21372
21940
  if (rng.insertNode) {
21373
21941
  content += '<span id="__caret">_</span>';
21374
21942
  if (rng.startContainer === doc && rng.endContainer === doc) {
@@ -21400,19 +21968,20 @@
21400
21968
  } catch (ex) {
21401
21969
  }
21402
21970
  } else {
21403
- if (rng.item) {
21971
+ var anyRng = rng;
21972
+ if (anyRng.item) {
21404
21973
  doc.execCommand('Delete', false, null);
21405
- rng = editor.getRng();
21974
+ anyRng = editor.selection.getRng();
21406
21975
  }
21407
21976
  if (/^\s+/.test(content)) {
21408
- rng.pasteHTML('<span id="__mce_tmp">_</span>' + content);
21977
+ anyRng.pasteHTML('<span id="__mce_tmp">_</span>' + content);
21409
21978
  editor.dom.remove('__mce_tmp');
21410
21979
  } else {
21411
- rng.pasteHTML(content);
21980
+ anyRng.pasteHTML(content);
21412
21981
  }
21413
21982
  }
21414
- if (!args.no_events) {
21415
- editor.fire('SetContent', args);
21983
+ if (!contentArgs.no_events) {
21984
+ editor.fire('SetContent', contentArgs);
21416
21985
  }
21417
21986
  };
21418
21987
  var SetSelectionContent = { setContent: setContent };
@@ -21428,7 +21997,7 @@
21428
21997
  return elm.dom();
21429
21998
  }).getOr(root);
21430
21999
  };
21431
- var getStart = function (root, rng, real) {
22000
+ var getStart$2 = function (root, rng, real) {
21432
22001
  return getEndpointElement(root, rng, true, real, function (elm, offset) {
21433
22002
  return Math.min(childNodesCount(elm), offset);
21434
22003
  });
@@ -21488,7 +22057,7 @@
21488
22057
  var node, root;
21489
22058
  var selectedBlocks = [];
21490
22059
  root = dom.getRoot();
21491
- startElm = dom.getParent(startElm || getStart(root, rng, rng.collapsed), dom.isBlock);
22060
+ startElm = dom.getParent(startElm || getStart$2(root, rng, rng.collapsed), dom.isBlock);
21492
22061
  endElm = dom.getParent(endElm || getEnd(root, rng, rng.collapsed), dom.isBlock);
21493
22062
  if (startElm && startElm !== root) {
21494
22063
  selectedBlocks.push(startElm);
@@ -21537,7 +22106,7 @@
21537
22106
  return isAttachedToDom(rng.startContainer) && isAttachedToDom(rng.endContainer);
21538
22107
  }
21539
22108
  };
21540
- var Selection = function (dom, win, serializer, editor) {
22109
+ var Selection$1 = function (dom, win, serializer, editor) {
21541
22110
  var bookmarkManager, controlSelection;
21542
22111
  var selectedRange, explicitRange, selectorChangedData;
21543
22112
  var setCursorLocation = function (node, offset) {
@@ -21558,8 +22127,8 @@
21558
22127
  var setContent = function (content, args) {
21559
22128
  return SetSelectionContent.setContent(editor, content, args);
21560
22129
  };
21561
- var getStart$1 = function (real) {
21562
- return getStart(editor.getBody(), getRng(), real);
22130
+ var getStart = function (real) {
22131
+ return getStart$2(editor.getBody(), getRng(), real);
21563
22132
  };
21564
22133
  var getEnd$1 = function (real) {
21565
22134
  return getEnd(editor.getBody(), getRng(), real);
@@ -21617,7 +22186,7 @@
21617
22186
  }
21618
22187
  }
21619
22188
  try {
21620
- if (selection = getSel()) {
22189
+ if ((selection = getSel()) && !NodeType.isRestrictedNode(selection.anchorNode)) {
21621
22190
  if (selection.rangeCount > 0) {
21622
22191
  rng = selection.getRangeAt(0);
21623
22192
  } else {
@@ -21824,7 +22393,7 @@
21824
22393
  getSel: getSel,
21825
22394
  setRng: setRng,
21826
22395
  getRng: getRng,
21827
- getStart: getStart$1,
22396
+ getStart: getStart,
21828
22397
  getEnd: getEnd$1,
21829
22398
  getSelectedBlocks: getSelectedBlocks$1,
21830
22399
  normalize: normalize,
@@ -21920,10 +22489,7 @@
21920
22489
  return acc.fold(function () {
21921
22490
  return Option.some(newPos);
21922
22491
  }, function (lastPos) {
21923
- return liftN([
21924
- head(lastPos.getClientRects()),
21925
- head(newPos.getClientRects())
21926
- ], function (lastRect, newRect) {
22492
+ return lift2(head(lastPos.getClientRects()), head(newPos.getClientRects()), function (lastRect, newRect) {
21927
22493
  var lastDist = Math.abs(x - lastRect.left);
21928
22494
  var newDist = Math.abs(x - newRect.left);
21929
22495
  return newDist <= lastDist ? newPos : lastPos;
@@ -22104,7 +22670,7 @@
22104
22670
  return function () {
22105
22671
  var newRng = getHorizontalRange(editor, forward);
22106
22672
  if (newRng) {
22107
- editor.selection.setRng(newRng);
22673
+ moveToRange(editor, newRng);
22108
22674
  return true;
22109
22675
  } else {
22110
22676
  return false;
@@ -22115,7 +22681,7 @@
22115
22681
  return function () {
22116
22682
  var newRng = getVerticalRange(editor, down);
22117
22683
  if (newRng) {
22118
- editor.selection.setRng(newRng);
22684
+ moveToRange(editor, newRng);
22119
22685
  return true;
22120
22686
  } else {
22121
22687
  return false;
@@ -22217,10 +22783,6 @@
22217
22783
  });
22218
22784
  };
22219
22785
 
22220
- var moveToRange = function (editor, rng) {
22221
- editor.selection.setRng(rng);
22222
- ScrollIntoView.scrollRangeIntoView(editor, rng);
22223
- };
22224
22786
  var hasNextBreak = function (getPositionsUntil, scope, lineInfo) {
22225
22787
  return lineInfo.breakAt.map(function (breakPos) {
22226
22788
  return getPositionsUntil(scope, breakPos).breakAt.isSome();
@@ -22332,7 +22894,7 @@
22332
22894
  return function () {
22333
22895
  return Option.from(editor.dom.getParent(editor.selection.getNode(), 'td,th')).bind(function (td) {
22334
22896
  return Option.from(editor.dom.getParent(td, 'table')).map(function (table) {
22335
- return navigateHorizontally(editor, forward, table, td);
22897
+ return navigateHorizontally(editor, forward, table);
22336
22898
  });
22337
22899
  }).getOr(false);
22338
22900
  };
@@ -22871,10 +23433,41 @@
22871
23433
  }
22872
23434
  return parent !== root ? editableRoot : root;
22873
23435
  };
23436
+ var applyAttributes = function (editor, node, forcedRootBlockAttrs) {
23437
+ Option.from(forcedRootBlockAttrs.style).map(editor.dom.parseStyle).each(function (attrStyles) {
23438
+ var currentStyles = getAllRaw(Element.fromDom(node));
23439
+ var newStyles = __assign(__assign({}, currentStyles), attrStyles);
23440
+ editor.dom.setStyles(node, newStyles);
23441
+ });
23442
+ var attrClassesOpt = Option.from(forcedRootBlockAttrs.class).map(function (attrClasses) {
23443
+ return attrClasses.split(/\s+/);
23444
+ });
23445
+ var currentClassesOpt = Option.from(node.className).map(function (currentClasses) {
23446
+ return filter(currentClasses.split(/\s+/), function (clazz) {
23447
+ return clazz !== '';
23448
+ });
23449
+ });
23450
+ lift2(attrClassesOpt, currentClassesOpt, function (attrClasses, currentClasses) {
23451
+ var filteredClasses = filter(currentClasses, function (clazz) {
23452
+ return !contains(attrClasses, clazz);
23453
+ });
23454
+ var newClasses = __spreadArrays(attrClasses, filteredClasses);
23455
+ editor.dom.setAttrib(node, 'class', newClasses.join(' '));
23456
+ });
23457
+ var appliedAttrs = [
23458
+ 'style',
23459
+ 'class'
23460
+ ];
23461
+ var remainingAttrs = bifilter(forcedRootBlockAttrs, function (_, attrs) {
23462
+ return !contains(appliedAttrs, attrs);
23463
+ }).t;
23464
+ editor.dom.setAttribs(node, remainingAttrs);
23465
+ };
22874
23466
  var setForcedBlockAttrs = function (editor, node) {
22875
23467
  var forcedRootBlockName = Settings.getForcedRootBlock(editor);
22876
23468
  if (forcedRootBlockName && forcedRootBlockName.toLowerCase() === node.tagName.toLowerCase()) {
22877
- editor.dom.setAttribs(node, Settings.getForcedRootBlockAttrs(editor));
23469
+ var forcedRootBlockAttrs = Settings.getForcedRootBlockAttrs(editor);
23470
+ applyAttributes(editor, node, forcedRootBlockAttrs);
22878
23471
  }
22879
23472
  };
22880
23473
  var wrapSelfAndSiblingsInDefaultBlock = function (editor, newBlockName, rng, container, offset) {
@@ -22940,7 +23533,6 @@
22940
23533
  var textInlineElements = schema.getTextInlineElements();
22941
23534
  if (name || parentBlockName === 'TABLE' || parentBlockName === 'HR') {
22942
23535
  block = dom.create(name || newBlockName);
22943
- setForcedBlockAttrs(editor, block);
22944
23536
  } else {
22945
23537
  block = parentBlock.cloneNode(false);
22946
23538
  }
@@ -22966,6 +23558,7 @@
22966
23558
  }
22967
23559
  } while ((node = node.parentNode) && node !== editableRoot);
22968
23560
  }
23561
+ setForcedBlockAttrs(editor, block);
22969
23562
  emptyBlock(caretNode);
22970
23563
  return block;
22971
23564
  };
@@ -23072,6 +23665,7 @@
23072
23665
  if (dom.isEmpty(parentBlock)) {
23073
23666
  emptyBlock(parentBlock);
23074
23667
  }
23668
+ setForcedBlockAttrs(editor, newBlock);
23075
23669
  NewLineUtils.moveToCaretPosition(editor, newBlock);
23076
23670
  } else if (isCaretAtStartOrEndOfBlock()) {
23077
23671
  insertNewBlockAfter();
@@ -23096,6 +23690,7 @@
23096
23690
  dom.remove(newBlock);
23097
23691
  insertNewBlockAfter();
23098
23692
  } else {
23693
+ setForcedBlockAttrs(editor, newBlock);
23099
23694
  NewLineUtils.moveToCaretPosition(editor, newBlock);
23100
23695
  }
23101
23696
  }
@@ -23282,9 +23877,20 @@
23282
23877
  var navigateIgnoreEmptyTextNodes = function (forward, root, from) {
23283
23878
  return CaretFinder.navigateIgnore(forward, root, from, isEmptyText);
23284
23879
  };
23880
+ var getClosestBlock = function (root, pos) {
23881
+ return find(Parents.parentsAndSelf(Element.fromDom(pos.container()), root), isBlock);
23882
+ };
23883
+ var isAtBeforeAfterBlockBoundary = function (forward, root, pos) {
23884
+ return navigateIgnoreEmptyTextNodes(forward, root.dom(), pos).forall(function (newPos) {
23885
+ return getClosestBlock(root, pos).fold(function () {
23886
+ return isInSameBlock(newPos, pos, root.dom()) === false;
23887
+ }, function (fromBlock) {
23888
+ return isInSameBlock(newPos, pos, root.dom()) === false && contains$3(fromBlock, Element.fromDom(newPos.container()));
23889
+ });
23890
+ });
23891
+ };
23285
23892
  var isAtBlockBoundary = function (forward, root, pos) {
23286
- var parentBlocks = filter(Parents.parentsAndSelf(Element.fromDom(pos.container()), root), isBlock);
23287
- return head(parentBlocks).fold(function () {
23893
+ return getClosestBlock(root, pos).fold(function () {
23288
23894
  return navigateIgnoreEmptyTextNodes(forward, root.dom(), pos).forall(function (newPos) {
23289
23895
  return isInSameBlock(newPos, pos, root.dom()) === false;
23290
23896
  });
@@ -23294,12 +23900,14 @@
23294
23900
  };
23295
23901
  var isAtStartOfBlock = curry(isAtBlockBoundary, false);
23296
23902
  var isAtEndOfBlock = curry(isAtBlockBoundary, true);
23903
+ var isBeforeBlock = curry(isAtBeforeAfterBlockBoundary, false);
23904
+ var isAfterBlock = curry(isAtBeforeAfterBlockBoundary, true);
23297
23905
 
23298
23906
  var nbsp = '\xA0';
23299
23907
  var isInMiddleOfText = function (pos) {
23300
23908
  return CaretPosition.isTextPosition(pos) && !pos.isAtStart() && !pos.isAtEnd();
23301
23909
  };
23302
- var getClosestBlock = function (root, pos) {
23910
+ var getClosestBlock$1 = function (root, pos) {
23303
23911
  var parentBlocks = filter(Parents.parentsAndSelf(Element.fromDom(pos.container()), root), isBlock);
23304
23912
  return head(parentBlocks).getOr(root);
23305
23913
  };
@@ -23307,20 +23915,19 @@
23307
23915
  if (isInMiddleOfText(pos)) {
23308
23916
  return isAfterSpace(pos);
23309
23917
  } else {
23310
- return isAfterSpace(pos) || CaretFinder.prevPosition(getClosestBlock(root, pos).dom(), pos).exists(isAfterSpace);
23918
+ return isAfterSpace(pos) || CaretFinder.prevPosition(getClosestBlock$1(root, pos).dom(), pos).exists(isAfterSpace);
23311
23919
  }
23312
23920
  };
23313
23921
  var hasSpaceAfter = function (root, pos) {
23314
23922
  if (isInMiddleOfText(pos)) {
23315
23923
  return isBeforeSpace(pos);
23316
23924
  } else {
23317
- return isBeforeSpace(pos) || CaretFinder.nextPosition(getClosestBlock(root, pos).dom(), pos).exists(isBeforeSpace);
23925
+ return isBeforeSpace(pos) || CaretFinder.nextPosition(getClosestBlock$1(root, pos).dom(), pos).exists(isBeforeSpace);
23318
23926
  }
23319
23927
  };
23320
23928
  var isPreValue = function (value) {
23321
23929
  return contains([
23322
23930
  'pre',
23323
- 'pre-line',
23324
23931
  'pre-wrap'
23325
23932
  ], value);
23326
23933
  };
@@ -23351,7 +23958,7 @@
23351
23958
  if (isInPre(pos)) {
23352
23959
  return false;
23353
23960
  } else {
23354
- return isAtStartOfBlock(root, pos) || isAfterBr(root, pos) || hasSpaceBefore(root, pos);
23961
+ return isAtStartOfBlock(root, pos) || isBeforeBlock(root, pos) || isAfterBr(root, pos) || hasSpaceBefore(root, pos);
23355
23962
  }
23356
23963
  };
23357
23964
  var leanRight = function (pos) {
@@ -23368,7 +23975,7 @@
23368
23975
  if (isInPre(afterPos)) {
23369
23976
  return false;
23370
23977
  } else {
23371
- return isAtEndOfBlock(root, afterPos) || isBeforeBr(root, afterPos) || hasSpaceAfter(root, afterPos);
23978
+ return isAtEndOfBlock(root, afterPos) || isAfterBlock(root, afterPos) || isBeforeBr(root, afterPos) || hasSpaceAfter(root, afterPos);
23372
23979
  }
23373
23980
  };
23374
23981
  var needsToBeNbsp = function (root, pos) {
@@ -23382,7 +23989,8 @@
23382
23989
  return NodeType.isText(container) && contains$2(container.data, nbsp);
23383
23990
  };
23384
23991
  var normalizeNbspMiddle = function (text) {
23385
- return map(text.split(''), function (chr, i, chars) {
23992
+ var chars = text.split('');
23993
+ return map(chars, function (chr, i) {
23386
23994
  if (isNbsp(chr) && i > 0 && i < chars.length - 1 && isContent$1(chars[i - 1]) && isContent$1(chars[i + 1])) {
23387
23995
  return ' ';
23388
23996
  } else {
@@ -24224,7 +24832,7 @@
24224
24832
  });
24225
24833
  editor.parser = createParser(editor);
24226
24834
  editor.serializer = DomSerializer$1(settings, editor);
24227
- editor.selection = Selection(editor.dom, editor.getWin(), editor.serializer, editor);
24835
+ editor.selection = Selection$1(editor.dom, editor.getWin(), editor.serializer, editor);
24228
24836
  editor.annotator = Annotator(editor);
24229
24837
  editor.formatter = Formatter(editor);
24230
24838
  editor.undoManager = UndoManager(editor);
@@ -25773,15 +26381,15 @@
25773
26381
  defaultSettings: {},
25774
26382
  $: DomQuery,
25775
26383
  majorVersion: '4',
25776
- minorVersion: '9.4',
25777
- releaseDate: '2019-03-20',
26384
+ minorVersion: '9.11',
26385
+ releaseDate: '2020-07-13',
25778
26386
  editors: legacyEditors,
25779
26387
  i18n: I18n,
25780
26388
  activeEditor: null,
25781
26389
  settings: {},
25782
26390
  setup: function () {
25783
26391
  var self = this;
25784
- var baseURL, documentBaseURL, suffix = '', preInit, src;
26392
+ var baseURL, documentBaseURL, suffix = '';
25785
26393
  documentBaseURL = URI.getDocumentBaseUrl(domGlobals.document.location);
25786
26394
  if (/^[^:]+:\/\/\/?[^\/]+\//.test(documentBaseURL)) {
25787
26395
  documentBaseURL = documentBaseURL.replace(/[\?#].*$/, '').replace(/[\/\\][^\/]+$/, '');
@@ -25789,14 +26397,17 @@
25789
26397
  documentBaseURL += '/';
25790
26398
  }
25791
26399
  }
25792
- preInit = window.tinymce || window.tinyMCEPreInit;
26400
+ var preInit = window.tinymce || window.tinyMCEPreInit;
25793
26401
  if (preInit) {
25794
26402
  baseURL = preInit.base || preInit.baseURL;
25795
26403
  suffix = preInit.suffix;
25796
26404
  } else {
25797
26405
  var scripts = domGlobals.document.getElementsByTagName('script');
25798
26406
  for (var i = 0; i < scripts.length; i++) {
25799
- src = scripts[i].src;
26407
+ var src = scripts[i].src || '';
26408
+ if (src === '') {
26409
+ continue;
26410
+ }
25800
26411
  var srcScript = src.substring(src.lastIndexOf('/'));
25801
26412
  if (/tinymce(\.full|\.jquery|)(\.min|\.dev|)\.js/.test(src)) {
25802
26413
  if (srcScript.indexOf('.min') !== -1) {
@@ -25807,7 +26418,7 @@
25807
26418
  }
25808
26419
  }
25809
26420
  if (!baseURL && domGlobals.document.currentScript) {
25810
- src = domGlobals.document.currentScript.src;
26421
+ var src = domGlobals.document.currentScript.src;
25811
26422
  if (src.indexOf('.min') !== -1) {
25812
26423
  suffix = '.min';
25813
26424
  }
@@ -26171,7 +26782,7 @@
26171
26782
  if (rel[4] === 'c') {
26172
26783
  x -= round$2(w / 2);
26173
26784
  }
26174
- return create$3(x, y, w, h);
26785
+ return create$4(x, y, w, h);
26175
26786
  };
26176
26787
  var findBestRelativePosition = function (rect, targetRect, constrainRect, rels) {
26177
26788
  var pos, i;
@@ -26184,7 +26795,7 @@
26184
26795
  return null;
26185
26796
  };
26186
26797
  var inflate = function (rect, w, h) {
26187
- return create$3(rect.x - w, rect.y - h, rect.w + w * 2, rect.h + h * 2);
26798
+ return create$4(rect.x - w, rect.y - h, rect.w + w * 2, rect.h + h * 2);
26188
26799
  };
26189
26800
  var intersect = function (rect, cropRect) {
26190
26801
  var x1, y1, x2, y2;
@@ -26195,7 +26806,7 @@
26195
26806
  if (x2 - x1 < 0 || y2 - y1 < 0) {
26196
26807
  return null;
26197
26808
  }
26198
- return create$3(x1, y1, x2 - x1, y2 - y1);
26809
+ return create$4(x1, y1, x2 - x1, y2 - y1);
26199
26810
  };
26200
26811
  var clamp$1 = function (rect, clampRect, fixedSize) {
26201
26812
  var underflowX1, underflowY1, overflowX2, overflowY2, x1, y1, x2, y2, cx2, cy2;
@@ -26219,9 +26830,9 @@
26219
26830
  }
26220
26831
  x2 -= overflowX2;
26221
26832
  y2 -= overflowY2;
26222
- return create$3(x1, y1, x2 - x1, y2 - y1);
26833
+ return create$4(x1, y1, x2 - x1, y2 - y1);
26223
26834
  };
26224
- var create$3 = function (x, y, w, h) {
26835
+ var create$4 = function (x, y, w, h) {
26225
26836
  return {
26226
26837
  x: x,
26227
26838
  y: y,
@@ -26230,7 +26841,7 @@
26230
26841
  };
26231
26842
  };
26232
26843
  var fromClientRect = function (clientRect) {
26233
- return create$3(clientRect.left, clientRect.top, clientRect.width, clientRect.height);
26844
+ return create$4(clientRect.left, clientRect.top, clientRect.width, clientRect.height);
26234
26845
  };
26235
26846
  var Rect = {
26236
26847
  inflate: inflate,
@@ -26238,7 +26849,7 @@
26238
26849
  findBestRelativePosition: findBestRelativePosition,
26239
26850
  intersect: intersect,
26240
26851
  clamp: clamp$1,
26241
- create: create$3,
26852
+ create: create$4,
26242
26853
  fromClientRect: fromClientRect
26243
26854
  };
26244
26855
 
@@ -26676,7 +27287,7 @@
26676
27287
  }
26677
27288
  };
26678
27289
 
26679
- var create$4 = function () {
27290
+ var create$5 = function () {
26680
27291
  return function () {
26681
27292
  var data = {};
26682
27293
  var keys = [];
@@ -26719,7 +27330,7 @@
26719
27330
  try {
26720
27331
  localStorage = domGlobals.window.localStorage;
26721
27332
  } catch (e) {
26722
- localStorage = create$4();
27333
+ localStorage = create$5();
26723
27334
  }
26724
27335
  var LocalStorage = localStorage;
26725
27336
 
@@ -26754,7 +27365,7 @@
26754
27365
  Serializer: DomSerializer$1,
26755
27366
  ControlSelection: ControlSelection,
26756
27367
  BookmarkManager: BookmarkManager$1,
26757
- Selection: Selection,
27368
+ Selection: Selection$1,
26758
27369
  Event: EventUtils.Event
26759
27370
  },
26760
27371
  html: {