tinymce-rails 4.0.19 → 4.0.26
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +62 -36
- data/app/assets/source/tinymce/tinymce.jquery.js +1344 -760
- data/app/assets/source/tinymce/tinymce.js +1284 -700
- data/lib/tinymce/rails/engine.rb +4 -1
- data/lib/tinymce/rails/version.rb +2 -2
- data/vendor/assets/javascripts/tinymce/jquery.tinymce.js +1 -1
- data/vendor/assets/javascripts/tinymce/plugins/advlist/plugin.js +1 -1
- data/vendor/assets/javascripts/tinymce/plugins/anchor/plugin.js +1 -1
- data/vendor/assets/javascripts/tinymce/plugins/autolink/plugin.js +1 -1
- data/vendor/assets/javascripts/tinymce/plugins/autoresize/plugin.js +1 -1
- data/vendor/assets/javascripts/tinymce/plugins/charmap/plugin.js +1 -1
- data/vendor/assets/javascripts/tinymce/plugins/directionality/plugin.js +1 -1
- data/vendor/assets/javascripts/tinymce/plugins/emoticons/plugin.js +1 -1
- data/vendor/assets/javascripts/tinymce/plugins/example/dialog.html +8 -0
- data/vendor/assets/javascripts/tinymce/plugins/example/plugin.js +1 -1
- data/vendor/assets/javascripts/tinymce/plugins/fullpage/plugin.js +1 -1
- data/vendor/assets/javascripts/tinymce/plugins/image/plugin.js +1 -1
- data/vendor/assets/javascripts/tinymce/plugins/importcss/plugin.js +1 -1
- data/vendor/assets/javascripts/tinymce/plugins/insertdatetime/plugin.js +1 -1
- data/vendor/assets/javascripts/tinymce/plugins/layer/plugin.js +1 -1
- data/vendor/assets/javascripts/tinymce/plugins/legacyoutput/plugin.js +1 -1
- data/vendor/assets/javascripts/tinymce/plugins/link/plugin.js +1 -1
- data/vendor/assets/javascripts/tinymce/plugins/lists/plugin.js +1 -1
- data/vendor/assets/javascripts/tinymce/plugins/media/plugin.js +1 -1
- data/vendor/assets/javascripts/tinymce/plugins/noneditable/plugin.js +1 -1
- data/vendor/assets/javascripts/tinymce/plugins/pagebreak/plugin.js +1 -1
- data/vendor/assets/javascripts/tinymce/plugins/paste/plugin.js +1 -1
- data/vendor/assets/javascripts/tinymce/plugins/preview/plugin.js +1 -1
- data/vendor/assets/javascripts/tinymce/plugins/print/plugin.js +1 -1
- data/vendor/assets/javascripts/tinymce/plugins/save/plugin.js +1 -1
- data/vendor/assets/javascripts/tinymce/plugins/searchreplace/plugin.js +1 -1
- data/vendor/assets/javascripts/tinymce/plugins/spellchecker/plugin.js +1 -1
- data/vendor/assets/javascripts/tinymce/plugins/table/plugin.js +1 -1
- data/vendor/assets/javascripts/tinymce/plugins/template/plugin.js +1 -1
- data/vendor/assets/javascripts/tinymce/plugins/textcolor/plugin.js +1 -1
- data/vendor/assets/javascripts/tinymce/skins/lightgray/fonts/tinymce-small.dev.svg +175 -0
- data/vendor/assets/javascripts/tinymce/skins/lightgray/fonts/tinymce-small.eot +0 -0
- data/vendor/assets/javascripts/tinymce/skins/lightgray/fonts/tinymce-small.svg +55 -168
- data/vendor/assets/javascripts/tinymce/skins/lightgray/fonts/tinymce-small.ttf +0 -0
- data/vendor/assets/javascripts/tinymce/skins/lightgray/fonts/tinymce-small.woff +0 -0
- data/vendor/assets/javascripts/tinymce/skins/lightgray/fonts/tinymce.dev.svg +153 -0
- data/vendor/assets/javascripts/tinymce/skins/lightgray/fonts/tinymce.eot +0 -0
- data/vendor/assets/javascripts/tinymce/skins/lightgray/fonts/tinymce.svg +56 -146
- data/vendor/assets/javascripts/tinymce/skins/lightgray/fonts/tinymce.ttf +0 -0
- data/vendor/assets/javascripts/tinymce/skins/lightgray/fonts/tinymce.woff +0 -0
- data/vendor/assets/javascripts/tinymce/skins/lightgray/skin.ie7.min.css +1 -1
- data/vendor/assets/javascripts/tinymce/skins/lightgray/skin.min.css +1 -1
- data/vendor/assets/javascripts/tinymce/themes/modern/theme.js +1 -1
- data/vendor/assets/javascripts/tinymce/tinymce.jquery.js +10 -10
- data/vendor/assets/javascripts/tinymce/tinymce.js +10 -10
- metadata +5 -2
@@ -1,4 +1,4 @@
|
|
1
|
-
// 4.0.
|
1
|
+
// 4.0.26 (2014-05-06)
|
2
2
|
|
3
3
|
/**
|
4
4
|
* Compiled inline version. (Library mode)
|
@@ -487,10 +487,13 @@ define("tinymce/dom/EventUtils", [], function() {
|
|
487
487
|
while (ci--) {
|
488
488
|
if (callbackList[ci].func === callback) {
|
489
489
|
var nativeHandler = callbackList.nativeHandler;
|
490
|
+
var fakeName = callbackList.fakeName, capture = callbackList.capture;
|
490
491
|
|
491
492
|
// Clone callbackList since unbind inside a callback would otherwise break the handlers loop
|
492
493
|
callbackList = callbackList.slice(0, ci).concat(callbackList.slice(ci + 1));
|
493
494
|
callbackList.nativeHandler = nativeHandler;
|
495
|
+
callbackList.fakeName = fakeName;
|
496
|
+
callbackList.capture = capture;
|
494
497
|
|
495
498
|
eventMap[name] = callbackList;
|
496
499
|
}
|
@@ -3509,8 +3512,16 @@ define("tinymce/html/Styles", [], function() {
|
|
3509
3512
|
|
3510
3513
|
url = decode(url || url2 || url3);
|
3511
3514
|
|
3512
|
-
if (!settings.allow_script_urls
|
3513
|
-
|
3515
|
+
if (!settings.allow_script_urls) {
|
3516
|
+
var scriptUrl = url.replace(/[\s\r\n]+/, '');
|
3517
|
+
|
3518
|
+
if (/(java|vb)script:/i.test(scriptUrl)) {
|
3519
|
+
return "";
|
3520
|
+
}
|
3521
|
+
|
3522
|
+
if (!settings.allow_svg_data_urls && /^data:image\/svg/i.test(scriptUrl)) {
|
3523
|
+
return "";
|
3524
|
+
}
|
3514
3525
|
}
|
3515
3526
|
|
3516
3527
|
// Convert the URL to relative/absolute depending on config
|
@@ -3535,8 +3546,16 @@ define("tinymce/html/Styles", [], function() {
|
|
3535
3546
|
name = matches[1].replace(trimRightRegExp, '').toLowerCase();
|
3536
3547
|
value = matches[2].replace(trimRightRegExp, '');
|
3537
3548
|
|
3549
|
+
// Decode escaped sequences like \65 -> e
|
3550
|
+
/*jshint loopfunc:true*/
|
3551
|
+
/*eslint no-loop-func:0 */
|
3552
|
+
value = value.replace(/\\[0-9a-f]+/g, function(e) {
|
3553
|
+
return String.fromCharCode(parseInt(e.substr(1), 16));
|
3554
|
+
});
|
3555
|
+
|
3538
3556
|
if (name && value.length > 0) {
|
3539
|
-
|
3557
|
+
// Don't allow behavior name or expression/comments within the values
|
3558
|
+
if (!settings.allow_script_urls && (name == "behavior" || /expression\s*\(|\/\*|\*\//.test(value))) {
|
3540
3559
|
continue;
|
3541
3560
|
}
|
3542
3561
|
|
@@ -5026,7 +5045,7 @@ define("tinymce/html/Entities", [
|
|
5026
5045
|
var makeMap = Tools.makeMap;
|
5027
5046
|
|
5028
5047
|
var namedEntities, baseEntities, reverseEntities,
|
5029
|
-
attrsCharsRegExp = /[&<>\"\u007E-\uD7FF\uE000-\uFFEF]|[\uD800-\uDBFF][\uDC00-\uDFFF]/g,
|
5048
|
+
attrsCharsRegExp = /[&<>\"\u0060\u007E-\uD7FF\uE000-\uFFEF]|[\uD800-\uDBFF][\uDC00-\uDFFF]/g,
|
5030
5049
|
textCharsRegExp = /[<>&\u007E-\uD7FF\uE000-\uFFEF]|[\uD800-\uDBFF][\uDC00-\uDFFF]/g,
|
5031
5050
|
rawCharsRegExp = /[<>&\"\']/g,
|
5032
5051
|
entityRegExp = /&(#x|#)?([\w]+);/g,
|
@@ -5044,7 +5063,8 @@ define("tinymce/html/Entities", [
|
|
5044
5063
|
"'": ''',
|
5045
5064
|
'<': '<',
|
5046
5065
|
'>': '>',
|
5047
|
-
'&': '&'
|
5066
|
+
'&': '&',
|
5067
|
+
'\u0060': '`'
|
5048
5068
|
};
|
5049
5069
|
|
5050
5070
|
// Reverse lookup table for raw entities
|
@@ -6028,7 +6048,8 @@ define("tinymce/dom/DOMUtils", [
|
|
6028
6048
|
return false;
|
6029
6049
|
}
|
6030
6050
|
|
6031
|
-
|
6051
|
+
var elms = elm.nodeType ? [elm] : elm;
|
6052
|
+
return Sizzle(selector, elms[0].ownerDocument || elms[0], null, elms).length > 0;
|
6032
6053
|
},
|
6033
6054
|
|
6034
6055
|
// #endif
|
@@ -7316,9 +7337,9 @@ define("tinymce/dom/DOMUtils", [
|
|
7316
7337
|
|
7317
7338
|
// Keep elements with data-bookmark attributes or name attribute like <a name="1"></a>
|
7318
7339
|
attributes = self.getAttribs(node);
|
7319
|
-
i =
|
7340
|
+
i = attributes.length;
|
7320
7341
|
while (i--) {
|
7321
|
-
name =
|
7342
|
+
name = attributes[i].nodeName;
|
7322
7343
|
if (name === "name" || name === 'data-mce-bookmark') {
|
7323
7344
|
return false;
|
7324
7345
|
}
|
@@ -7576,7 +7597,7 @@ define("tinymce/dom/DOMUtils", [
|
|
7576
7597
|
var contentEditable;
|
7577
7598
|
|
7578
7599
|
// Check type
|
7579
|
-
if (node.nodeType != 1) {
|
7600
|
+
if (!node || node.nodeType != 1) {
|
7580
7601
|
return null;
|
7581
7602
|
}
|
7582
7603
|
|
@@ -7590,6 +7611,20 @@ define("tinymce/dom/DOMUtils", [
|
|
7590
7611
|
return node.contentEditable !== "inherit" ? node.contentEditable : null;
|
7591
7612
|
},
|
7592
7613
|
|
7614
|
+
getContentEditableParent: function(node) {
|
7615
|
+
var root = this.getRoot(), state = null;
|
7616
|
+
|
7617
|
+
for (; node && node !== root; node = node.parentNode) {
|
7618
|
+
state = this.getContentEditable(node);
|
7619
|
+
|
7620
|
+
if (state !== null) {
|
7621
|
+
break;
|
7622
|
+
}
|
7623
|
+
}
|
7624
|
+
|
7625
|
+
return state;
|
7626
|
+
},
|
7627
|
+
|
7593
7628
|
/**
|
7594
7629
|
* Destroys all internal references to the DOM to solve IE leak issues.
|
7595
7630
|
*
|
@@ -7619,6 +7654,18 @@ define("tinymce/dom/DOMUtils", [
|
|
7619
7654
|
self.win = self.doc = self.root = self.events = self.frag = null;
|
7620
7655
|
},
|
7621
7656
|
|
7657
|
+
isChildOf: function(node, parent) {
|
7658
|
+
while (node) {
|
7659
|
+
if (parent === node) {
|
7660
|
+
return true;
|
7661
|
+
}
|
7662
|
+
|
7663
|
+
node = node.parentNode;
|
7664
|
+
}
|
7665
|
+
|
7666
|
+
return false;
|
7667
|
+
},
|
7668
|
+
|
7622
7669
|
// #ifdef debug
|
7623
7670
|
|
7624
7671
|
dumpRng: function(r) {
|
@@ -7993,12 +8040,21 @@ define("tinymce/AddOnManager", [
|
|
7993
8040
|
* @param {String} languages Optional comma or space separated list of languages to check if it matches the name.
|
7994
8041
|
*/
|
7995
8042
|
requireLangPack: function(name, languages) {
|
7996
|
-
|
7997
|
-
|
7998
|
-
|
8043
|
+
var language = AddOnManager.language;
|
8044
|
+
|
8045
|
+
if (language && AddOnManager.languageLoad !== false) {
|
8046
|
+
if (languages) {
|
8047
|
+
languages = ',' + languages + ',';
|
8048
|
+
|
8049
|
+
// Load short form sv.js or long form sv_SE.js
|
8050
|
+
if (languages.indexOf(',' + language.substr(0, 2) + ',') != -1) {
|
8051
|
+
language = language.substr(0, 2);
|
8052
|
+
} else if (languages.indexOf(',' + language + ',') == -1) {
|
8053
|
+
return;
|
8054
|
+
}
|
7999
8055
|
}
|
8000
8056
|
|
8001
|
-
ScriptLoader.ScriptLoader.add(this.urls[name] + '/langs/' +
|
8057
|
+
ScriptLoader.ScriptLoader.add(this.urls[name] + '/langs/' + language + '.js');
|
8002
8058
|
}
|
8003
8059
|
},
|
8004
8060
|
|
@@ -8912,8 +8968,8 @@ define("tinymce/html/Schema", [
|
|
8912
8968
|
add("mark rt rp summary bdi", "", phrasingContent);
|
8913
8969
|
add("canvas", "width height", flowContent);
|
8914
8970
|
add("video", "src crossorigin poster preload autoplay mediagroup loop " +
|
8915
|
-
"muted controls width height", flowContent, "track source");
|
8916
|
-
add("audio", "src crossorigin preload autoplay mediagroup loop muted controls", flowContent, "track source");
|
8971
|
+
"muted controls width height buffered", flowContent, "track source");
|
8972
|
+
add("audio", "src crossorigin preload autoplay mediagroup loop muted controls buffered volume", flowContent, "track source");
|
8917
8973
|
add("source", "src type media");
|
8918
8974
|
add("track", "kind src srclang label default");
|
8919
8975
|
add("datalist", "", phrasingContent, "option");
|
@@ -8972,7 +9028,7 @@ define("tinymce/html/Schema", [
|
|
8972
9028
|
addAttrs("input textarea", "placeholder");
|
8973
9029
|
addAttrs("a", "download");
|
8974
9030
|
addAttrs("link script img", "crossorigin");
|
8975
|
-
addAttrs("iframe", "
|
9031
|
+
addAttrs("iframe", "sandbox seamless allowfullscreen"); // Excluded: srcdoc
|
8976
9032
|
}
|
8977
9033
|
|
8978
9034
|
// Special: iframe, ruby, video, audio, label
|
@@ -9031,7 +9087,7 @@ define("tinymce/html/Schema", [
|
|
9031
9087
|
}
|
9032
9088
|
} else {
|
9033
9089
|
// Create custom map
|
9034
|
-
value = makeMap(value,
|
9090
|
+
value = makeMap(value, /[, ]/, makeMap(value.toUpperCase(), /[, ]/));
|
9035
9091
|
}
|
9036
9092
|
|
9037
9093
|
return value;
|
@@ -9245,6 +9301,9 @@ define("tinymce/html/Schema", [
|
|
9245
9301
|
var customElementRegExp = /^(~)?(.+)$/;
|
9246
9302
|
|
9247
9303
|
if (custom_elements) {
|
9304
|
+
// Flush cached items since we are altering the default maps
|
9305
|
+
mapCache.text_block_elements = mapCache.block_elements = null;
|
9306
|
+
|
9248
9307
|
each(split(custom_elements, ','), function(rule) {
|
9249
9308
|
var matches = customElementRegExp.exec(rule),
|
9250
9309
|
inline = matches[1] === '~',
|
@@ -9272,8 +9331,9 @@ define("tinymce/html/Schema", [
|
|
9272
9331
|
}
|
9273
9332
|
|
9274
9333
|
// Add custom elements at span/div positions
|
9275
|
-
each(children, function(element) {
|
9334
|
+
each(children, function(element, elmName) {
|
9276
9335
|
if (element[cloneName]) {
|
9336
|
+
children[elmName] = element = extend({}, children[elmName]);
|
9277
9337
|
element[name] = element[cloneName];
|
9278
9338
|
}
|
9279
9339
|
});
|
@@ -9303,6 +9363,10 @@ define("tinymce/html/Schema", [
|
|
9303
9363
|
|
9304
9364
|
each(split(matches[3], '|'), function(child) {
|
9305
9365
|
if (prefix === '-') {
|
9366
|
+
// Clone the element before we delete
|
9367
|
+
// things in it to not mess up default schemas
|
9368
|
+
children[matches[2]] = parent = extend({}, children[matches[2]]);
|
9369
|
+
|
9306
9370
|
delete parent[child];
|
9307
9371
|
} else {
|
9308
9372
|
parent[child] = {};
|
@@ -9721,8 +9785,8 @@ define("tinymce/html/SaxParser", [
|
|
9721
9785
|
var validate, elementRule, isValidElement, attr, attribsValue, validAttributesMap, validAttributePatterns;
|
9722
9786
|
var attributesRequired, attributesDefault, attributesForced;
|
9723
9787
|
var anyAttributesRequired, selfClosing, tokenRegExp, attrRegExp, specialElements, attrValue, idCount = 0;
|
9724
|
-
var decode = Entities.decode, fixSelfClosing, filteredUrlAttrs = Tools.makeMap('src,href');
|
9725
|
-
var scriptUriRegExp = /(java|vb)script:/i;
|
9788
|
+
var decode = Entities.decode, fixSelfClosing, filteredUrlAttrs = Tools.makeMap('src,href,data,background,formaction,poster');
|
9789
|
+
var scriptUriRegExp = /((java|vb)script|mhtml):/i, dataUriRegExp = /^data:/i;
|
9726
9790
|
|
9727
9791
|
function processEndTag(name) {
|
9728
9792
|
var pos, i;
|
@@ -9788,22 +9852,24 @@ define("tinymce/html/SaxParser", [
|
|
9788
9852
|
}
|
9789
9853
|
}
|
9790
9854
|
|
9791
|
-
// Block any javascript: urls
|
9855
|
+
// Block any javascript: urls or non image data uris
|
9792
9856
|
if (filteredUrlAttrs[name] && !settings.allow_script_urls) {
|
9793
9857
|
var uri = value.replace(trimRegExp, '');
|
9794
9858
|
|
9795
9859
|
try {
|
9796
9860
|
// Might throw malformed URI sequence
|
9797
9861
|
uri = decodeURIComponent(uri);
|
9798
|
-
if (scriptUriRegExp.test(uri)) {
|
9799
|
-
return;
|
9800
|
-
}
|
9801
9862
|
} catch (ex) {
|
9802
9863
|
// Fallback to non UTF-8 decoder
|
9803
9864
|
uri = unescape(uri);
|
9804
|
-
|
9805
|
-
|
9806
|
-
|
9865
|
+
}
|
9866
|
+
|
9867
|
+
if (scriptUriRegExp.test(uri)) {
|
9868
|
+
return;
|
9869
|
+
}
|
9870
|
+
|
9871
|
+
if (!settings.allow_html_data_urls && dataUriRegExp.test(uri) && !/^data:image\//i.test(uri)) {
|
9872
|
+
return;
|
9807
9873
|
}
|
9808
9874
|
}
|
9809
9875
|
|
@@ -11220,6 +11286,17 @@ define("tinymce/dom/Serializer", [
|
|
11220
11286
|
|
11221
11287
|
htmlParser = new DomParser(settings, schema);
|
11222
11288
|
|
11289
|
+
// Convert tabindex back to elements when serializing contents
|
11290
|
+
htmlParser.addAttributeFilter('data-mce-tabindex', function(nodes, name) {
|
11291
|
+
var i = nodes.length, node;
|
11292
|
+
|
11293
|
+
while (i--) {
|
11294
|
+
node = nodes[i];
|
11295
|
+
node.attr('tabindex', node.attributes.map['data-mce-tabindex']);
|
11296
|
+
node.attr(name, null);
|
11297
|
+
}
|
11298
|
+
});
|
11299
|
+
|
11223
11300
|
// Convert move data-mce-src, data-mce-href and data-mce-style into nodes or process them if needed
|
11224
11301
|
htmlParser.addAttributeFilter('src,href,style', function(nodes, name) {
|
11225
11302
|
var i = nodes.length, node, value, internalName = 'data-mce-' + name;
|
@@ -12271,6 +12348,8 @@ define("tinymce/dom/ControlSelection", [
|
|
12271
12348
|
function showResizeRect(targetElm, mouseDownHandleName, mouseDownEvent) {
|
12272
12349
|
var position, targetWidth, targetHeight, e, rect, offsetParent = editor.getBody();
|
12273
12350
|
|
12351
|
+
unbindResizeHandleEvents();
|
12352
|
+
|
12274
12353
|
// Get position and size of target
|
12275
12354
|
position = dom.getPos(targetElm, offsetParent);
|
12276
12355
|
selectedElmX = position.x;
|
@@ -12350,14 +12429,18 @@ define("tinymce/dom/ControlSelection", [
|
|
12350
12429
|
if (Env.ie) {
|
12351
12430
|
handleElm.contentEditable = false;
|
12352
12431
|
}
|
12432
|
+
} else {
|
12433
|
+
dom.show(handleElm);
|
12434
|
+
}
|
12353
12435
|
|
12436
|
+
if (!handle.elm) {
|
12354
12437
|
dom.bind(handleElm, 'mousedown', function(e) {
|
12355
12438
|
e.stopImmediatePropagation();
|
12356
12439
|
e.preventDefault();
|
12357
12440
|
startDrag(e);
|
12358
12441
|
});
|
12359
|
-
|
12360
|
-
|
12442
|
+
|
12443
|
+
handle.elm = handleElm;
|
12361
12444
|
}
|
12362
12445
|
|
12363
12446
|
/*
|
@@ -12387,6 +12470,8 @@ define("tinymce/dom/ControlSelection", [
|
|
12387
12470
|
function hideResizeRect() {
|
12388
12471
|
var name, handleElm;
|
12389
12472
|
|
12473
|
+
unbindResizeHandleEvents();
|
12474
|
+
|
12390
12475
|
if (selectedElm) {
|
12391
12476
|
selectedElm.removeAttribute('data-mce-selected');
|
12392
12477
|
}
|
@@ -12496,6 +12581,17 @@ define("tinymce/dom/ControlSelection", [
|
|
12496
12581
|
detachEvent(selectedElm, 'resizestart', resizeNativeStart);
|
12497
12582
|
}
|
12498
12583
|
|
12584
|
+
function unbindResizeHandleEvents() {
|
12585
|
+
for (var name in resizeHandles) {
|
12586
|
+
var handle = resizeHandles[name];
|
12587
|
+
|
12588
|
+
if (handle.elm) {
|
12589
|
+
dom.unbind(handle.elm);
|
12590
|
+
delete handle.elm;
|
12591
|
+
}
|
12592
|
+
}
|
12593
|
+
}
|
12594
|
+
|
12499
12595
|
function disableGeckoResize() {
|
12500
12596
|
try {
|
12501
12597
|
// Disable object resizing on Gecko
|
@@ -12577,10 +12673,14 @@ define("tinymce/dom/ControlSelection", [
|
|
12577
12673
|
}
|
12578
12674
|
});
|
12579
12675
|
|
12676
|
+
editor.on('hide', hideResizeRect);
|
12677
|
+
|
12580
12678
|
// Hide rect on focusout since it would float on top of windows otherwise
|
12581
12679
|
//editor.on('focusout', hideResizeRect);
|
12582
12680
|
});
|
12583
12681
|
|
12682
|
+
editor.on('remove', unbindResizeHandleEvents);
|
12683
|
+
|
12584
12684
|
function destroy() {
|
12585
12685
|
selectedElm = selectedElmGhost = null;
|
12586
12686
|
|
@@ -12857,7 +12957,7 @@ define("tinymce/dom/RangeUtils", [
|
|
12857
12957
|
var normalized, collapsed;
|
12858
12958
|
|
12859
12959
|
function normalizeEndPoint(start) {
|
12860
|
-
var container, offset, walker, body = dom.getRoot(), node, nonEmptyElementsMap
|
12960
|
+
var container, offset, walker, body = dom.getRoot(), node, nonEmptyElementsMap;
|
12861
12961
|
var directionLeft, isAfterNode;
|
12862
12962
|
|
12863
12963
|
function hasBrBeforeAfter(node, left) {
|
@@ -12894,6 +12994,11 @@ define("tinymce/dom/RangeUtils", [
|
|
12894
12994
|
// Walk left until we hit a text node we can move to or a block/br/img
|
12895
12995
|
walker = new TreeWalker(startNode, parentBlockContainer);
|
12896
12996
|
while ((node = walker[left ? 'prev' : 'next']())) {
|
12997
|
+
// Break if we hit a non content editable node
|
12998
|
+
if (dom.getContentEditableParent(node) === "false") {
|
12999
|
+
return;
|
13000
|
+
}
|
13001
|
+
|
12897
13002
|
// Found text node that has a length
|
12898
13003
|
if (node.nodeType === 3 && node.nodeValue.length > 0) {
|
12899
13004
|
container = node;
|
@@ -12940,7 +13045,6 @@ define("tinymce/dom/RangeUtils", [
|
|
12940
13045
|
if (directionLeft) {
|
12941
13046
|
node = container.childNodes[offset > 0 ? offset - 1 : 0];
|
12942
13047
|
if (node) {
|
12943
|
-
nodeName = node.nodeName.toLowerCase();
|
12944
13048
|
if (nonEmptyElementsMap[node.nodeName] || node.nodeName == "TABLE") {
|
12945
13049
|
return;
|
12946
13050
|
}
|
@@ -14342,6 +14446,160 @@ define("tinymce/dom/Selection", [
|
|
14342
14446
|
return Selection;
|
14343
14447
|
});
|
14344
14448
|
|
14449
|
+
// Included from: js/tinymce/classes/fmt/Preview.js
|
14450
|
+
|
14451
|
+
/**
|
14452
|
+
* Preview.js
|
14453
|
+
*
|
14454
|
+
* Copyright, Moxiecode Systems AB
|
14455
|
+
* Released under LGPL License.
|
14456
|
+
*
|
14457
|
+
* License: http://www.tinymce.com/license
|
14458
|
+
* Contributing: http://www.tinymce.com/contributing
|
14459
|
+
*/
|
14460
|
+
|
14461
|
+
/**
|
14462
|
+
* Internal class for generating previews styles for formats.
|
14463
|
+
*
|
14464
|
+
* Example:
|
14465
|
+
* Preview.getCssText(editor, 'bold');
|
14466
|
+
*
|
14467
|
+
* @class tinymce.fmt.Preview
|
14468
|
+
* @private
|
14469
|
+
*/
|
14470
|
+
define("tinymce/fmt/Preview", [
|
14471
|
+
"tinymce/util/Tools"
|
14472
|
+
], function(Tools) {
|
14473
|
+
var each = Tools.each;
|
14474
|
+
|
14475
|
+
function getCssText(editor, format) {
|
14476
|
+
var name, previewElm, dom = editor.dom;
|
14477
|
+
var previewCss = '', parentFontSize, previewStyles;
|
14478
|
+
|
14479
|
+
previewStyles = editor.settings.preview_styles;
|
14480
|
+
|
14481
|
+
// No preview forced
|
14482
|
+
if (previewStyles === false) {
|
14483
|
+
return '';
|
14484
|
+
}
|
14485
|
+
|
14486
|
+
// Default preview
|
14487
|
+
if (!previewStyles) {
|
14488
|
+
previewStyles = 'font-family font-size font-weight font-style text-decoration ' +
|
14489
|
+
'text-transform color background-color border border-radius outline text-shadow';
|
14490
|
+
}
|
14491
|
+
|
14492
|
+
// Removes any variables since these can't be previewed
|
14493
|
+
function removeVars(val) {
|
14494
|
+
return val.replace(/%(\w+)/g, '');
|
14495
|
+
}
|
14496
|
+
|
14497
|
+
// Create block/inline element to use for preview
|
14498
|
+
if (typeof(format) == "string") {
|
14499
|
+
format = editor.formatter.get(format);
|
14500
|
+
if (!format) {
|
14501
|
+
return;
|
14502
|
+
}
|
14503
|
+
|
14504
|
+
format = format[0];
|
14505
|
+
}
|
14506
|
+
|
14507
|
+
name = format.block || format.inline || 'span';
|
14508
|
+
previewElm = dom.create(name);
|
14509
|
+
|
14510
|
+
// Add format styles to preview element
|
14511
|
+
each(format.styles, function(value, name) {
|
14512
|
+
value = removeVars(value);
|
14513
|
+
|
14514
|
+
if (value) {
|
14515
|
+
dom.setStyle(previewElm, name, value);
|
14516
|
+
}
|
14517
|
+
});
|
14518
|
+
|
14519
|
+
// Add attributes to preview element
|
14520
|
+
each(format.attributes, function(value, name) {
|
14521
|
+
value = removeVars(value);
|
14522
|
+
|
14523
|
+
if (value) {
|
14524
|
+
dom.setAttrib(previewElm, name, value);
|
14525
|
+
}
|
14526
|
+
});
|
14527
|
+
|
14528
|
+
// Add classes to preview element
|
14529
|
+
each(format.classes, function(value) {
|
14530
|
+
value = removeVars(value);
|
14531
|
+
|
14532
|
+
if (!dom.hasClass(previewElm, value)) {
|
14533
|
+
dom.addClass(previewElm, value);
|
14534
|
+
}
|
14535
|
+
});
|
14536
|
+
|
14537
|
+
editor.fire('PreviewFormats');
|
14538
|
+
|
14539
|
+
// Add the previewElm outside the visual area
|
14540
|
+
dom.setStyles(previewElm, {position: 'absolute', left: -0xFFFF});
|
14541
|
+
editor.getBody().appendChild(previewElm);
|
14542
|
+
|
14543
|
+
// Get parent container font size so we can compute px values out of em/% for older IE:s
|
14544
|
+
parentFontSize = dom.getStyle(editor.getBody(), 'fontSize', true);
|
14545
|
+
parentFontSize = /px$/.test(parentFontSize) ? parseInt(parentFontSize, 10) : 0;
|
14546
|
+
|
14547
|
+
each(previewStyles.split(' '), function(name) {
|
14548
|
+
var value = dom.getStyle(previewElm, name, true);
|
14549
|
+
|
14550
|
+
// If background is transparent then check if the body has a background color we can use
|
14551
|
+
if (name == 'background-color' && /transparent|rgba\s*\([^)]+,\s*0\)/.test(value)) {
|
14552
|
+
value = dom.getStyle(editor.getBody(), name, true);
|
14553
|
+
|
14554
|
+
// Ignore white since it's the default color, not the nicest fix
|
14555
|
+
// TODO: Fix this by detecting runtime style
|
14556
|
+
if (dom.toHex(value).toLowerCase() == '#ffffff') {
|
14557
|
+
return;
|
14558
|
+
}
|
14559
|
+
}
|
14560
|
+
|
14561
|
+
if (name == 'color') {
|
14562
|
+
// Ignore black since it's the default color, not the nicest fix
|
14563
|
+
// TODO: Fix this by detecting runtime style
|
14564
|
+
if (dom.toHex(value).toLowerCase() == '#000000') {
|
14565
|
+
return;
|
14566
|
+
}
|
14567
|
+
}
|
14568
|
+
|
14569
|
+
// Old IE won't calculate the font size so we need to do that manually
|
14570
|
+
if (name == 'font-size') {
|
14571
|
+
if (/em|%$/.test(value)) {
|
14572
|
+
if (parentFontSize === 0) {
|
14573
|
+
return;
|
14574
|
+
}
|
14575
|
+
|
14576
|
+
// Convert font size from em/% to px
|
14577
|
+
value = parseFloat(value, 10) / (/%$/.test(value) ? 100 : 1);
|
14578
|
+
value = (value * parentFontSize) + 'px';
|
14579
|
+
}
|
14580
|
+
}
|
14581
|
+
|
14582
|
+
if (name == "border" && value) {
|
14583
|
+
previewCss += 'padding:0 2px;';
|
14584
|
+
}
|
14585
|
+
|
14586
|
+
previewCss += name + ':' + value + ';';
|
14587
|
+
});
|
14588
|
+
|
14589
|
+
editor.fire('AfterPreviewFormats');
|
14590
|
+
|
14591
|
+
//previewCss += 'line-height:normal';
|
14592
|
+
|
14593
|
+
dom.remove(previewElm);
|
14594
|
+
|
14595
|
+
return previewCss;
|
14596
|
+
}
|
14597
|
+
|
14598
|
+
return {
|
14599
|
+
getCssText: getCssText
|
14600
|
+
};
|
14601
|
+
});
|
14602
|
+
|
14345
14603
|
// Included from: js/tinymce/classes/Formatter.js
|
14346
14604
|
|
14347
14605
|
/**
|
@@ -14371,8 +14629,9 @@ define("tinymce/dom/Selection", [
|
|
14371
14629
|
define("tinymce/Formatter", [
|
14372
14630
|
"tinymce/dom/TreeWalker",
|
14373
14631
|
"tinymce/dom/RangeUtils",
|
14374
|
-
"tinymce/util/Tools"
|
14375
|
-
|
14632
|
+
"tinymce/util/Tools",
|
14633
|
+
"tinymce/fmt/Preview"
|
14634
|
+
], function(TreeWalker, RangeUtils, Tools, Preview) {
|
14376
14635
|
/**
|
14377
14636
|
* Constructs a new formatter instance.
|
14378
14637
|
*
|
@@ -14421,6 +14680,19 @@ define("tinymce/Formatter", [
|
|
14421
14680
|
|
14422
14681
|
function defaultFormats() {
|
14423
14682
|
register({
|
14683
|
+
|
14684
|
+
valigntop: [
|
14685
|
+
{selector: 'td,th', styles: {'verticalAlign': 'top'}}
|
14686
|
+
],
|
14687
|
+
|
14688
|
+
valignmiddle: [
|
14689
|
+
{selector: 'td,th', styles: {'verticalAlign': 'middle'}}
|
14690
|
+
],
|
14691
|
+
|
14692
|
+
valignbottom: [
|
14693
|
+
{selector: 'td,th', styles: {'verticalAlign': 'bottom'}}
|
14694
|
+
],
|
14695
|
+
|
14424
14696
|
alignleft: [
|
14425
14697
|
{selector: 'figure,p,h1,h2,h3,h4,h5,h6,td,th,tr,div,ul,ol,li', styles: {textAlign: 'left'}, defaultBlock: 'div'},
|
14426
14698
|
{selector: 'img,table', collapsed: false, styles: {'float': 'left'}}
|
@@ -14635,6 +14907,16 @@ define("tinymce/Formatter", [
|
|
14635
14907
|
dom.setStyle(elm, name, replaceVars(value, vars));
|
14636
14908
|
});
|
14637
14909
|
|
14910
|
+
// Needed for the WebKit span spam bug
|
14911
|
+
// TODO: Remove this once WebKit/Blink fixes this
|
14912
|
+
if (fmt.styles) {
|
14913
|
+
var styleVal = dom.getAttrib(elm, 'style');
|
14914
|
+
|
14915
|
+
if (styleVal) {
|
14916
|
+
elm.setAttribute('data-mce-style', styleVal);
|
14917
|
+
}
|
14918
|
+
}
|
14919
|
+
|
14638
14920
|
each(fmt.attributes, function(value, name) {
|
14639
14921
|
dom.setAttrib(elm, name, replaceVars(value, vars));
|
14640
14922
|
});
|
@@ -15537,6 +15819,20 @@ define("tinymce/Formatter", [
|
|
15537
15819
|
return this;
|
15538
15820
|
}
|
15539
15821
|
|
15822
|
+
/**
|
15823
|
+
* Returns a preview css text for the specified format.
|
15824
|
+
*
|
15825
|
+
* @method getCssText
|
15826
|
+
* @param {String/Object} format Format to generate preview css text for.
|
15827
|
+
* @return {String} Css text for the specified format.
|
15828
|
+
* @example
|
15829
|
+
* var cssText1 = editor.formatter.getCssText('bold');
|
15830
|
+
* var cssText2 = editor.formatter.getCssText({inline: 'b'});
|
15831
|
+
*/
|
15832
|
+
function getCssText(format) {
|
15833
|
+
return Preview.getCssText(ed, format);
|
15834
|
+
}
|
15835
|
+
|
15540
15836
|
// Expose to public
|
15541
15837
|
extend(this, {
|
15542
15838
|
get: get,
|
@@ -15548,7 +15844,8 @@ define("tinymce/Formatter", [
|
|
15548
15844
|
matchAll: matchAll,
|
15549
15845
|
matchNode: matchNode,
|
15550
15846
|
canApply: canApply,
|
15551
|
-
formatChanged: formatChanged
|
15847
|
+
formatChanged: formatChanged,
|
15848
|
+
getCssText: getCssText
|
15552
15849
|
});
|
15553
15850
|
|
15554
15851
|
// Initialize
|
@@ -16801,7 +17098,7 @@ define("tinymce/UndoManager", [
|
|
16801
17098
|
].join('|'), 'gi');
|
16802
17099
|
|
16803
17100
|
return function(editor) {
|
16804
|
-
var self = this, index = 0, data = [], beforeBookmark, isFirstTypedCharacter,
|
17101
|
+
var self = this, index = 0, data = [], beforeBookmark, isFirstTypedCharacter, locks = 0;
|
16805
17102
|
|
16806
17103
|
// Returns a trimmed version of the current editor contents
|
16807
17104
|
function getContent() {
|
@@ -16841,7 +17138,7 @@ define("tinymce/UndoManager", [
|
|
16841
17138
|
});
|
16842
17139
|
|
16843
17140
|
editor.on('SaveContent ObjectResized blur', addNonTypingUndoLevel);
|
16844
|
-
editor.
|
17141
|
+
editor.on('DragEnd', addNonTypingUndoLevel);
|
16845
17142
|
|
16846
17143
|
editor.on('KeyUp', function(e) {
|
16847
17144
|
var keyCode = e.keyCode;
|
@@ -16929,7 +17226,7 @@ define("tinymce/UndoManager", [
|
|
16929
17226
|
* @method beforeChange
|
16930
17227
|
*/
|
16931
17228
|
beforeChange: function() {
|
16932
|
-
if (!
|
17229
|
+
if (!locks) {
|
16933
17230
|
beforeBookmark = editor.selection.getBookmark(2, true);
|
16934
17231
|
}
|
16935
17232
|
},
|
@@ -16948,16 +17245,16 @@ define("tinymce/UndoManager", [
|
|
16948
17245
|
level = level || {};
|
16949
17246
|
level.content = getContent();
|
16950
17247
|
|
16951
|
-
if (
|
17248
|
+
if (locks || editor.removed) {
|
16952
17249
|
return null;
|
16953
17250
|
}
|
16954
17251
|
|
16955
|
-
|
17252
|
+
lastLevel = data[index];
|
17253
|
+
if (editor.fire('BeforeAddUndo', {level: level, lastLevel: lastLevel, originalEvent: event}).isDefaultPrevented()) {
|
16956
17254
|
return null;
|
16957
17255
|
}
|
16958
17256
|
|
16959
17257
|
// Add undo level if needed
|
16960
|
-
lastLevel = data[index];
|
16961
17258
|
if (lastLevel && lastLevel.content == level.content) {
|
16962
17259
|
return null;
|
16963
17260
|
}
|
@@ -17099,9 +17396,12 @@ define("tinymce/UndoManager", [
|
|
17099
17396
|
transact: function(callback) {
|
17100
17397
|
self.beforeChange();
|
17101
17398
|
|
17102
|
-
|
17103
|
-
|
17104
|
-
|
17399
|
+
try {
|
17400
|
+
locks++;
|
17401
|
+
callback();
|
17402
|
+
} finally {
|
17403
|
+
locks--;
|
17404
|
+
}
|
17105
17405
|
|
17106
17406
|
self.add();
|
17107
17407
|
}
|
@@ -18662,7 +18962,13 @@ define("tinymce/EditorCommands", [
|
|
18662
18962
|
define("tinymce/util/URI", [
|
18663
18963
|
"tinymce/util/Tools"
|
18664
18964
|
], function(Tools) {
|
18665
|
-
var each = Tools.each, trim = Tools.trim
|
18965
|
+
var each = Tools.each, trim = Tools.trim,
|
18966
|
+
DEFAULT_PORTS = {
|
18967
|
+
'ftp': 21,
|
18968
|
+
'http': 80,
|
18969
|
+
'https': 443,
|
18970
|
+
'mailto': 25
|
18971
|
+
};
|
18666
18972
|
|
18667
18973
|
/**
|
18668
18974
|
* Constructs a new URI instance.
|
@@ -18834,7 +19140,31 @@ define("tinymce/util/URI", [
|
|
18834
19140
|
toAbsolute: function(uri, noHost) {
|
18835
19141
|
uri = new URI(uri, {base_uri: this});
|
18836
19142
|
|
18837
|
-
return uri.getURI(
|
19143
|
+
return uri.getURI(noHost && this.isSameOrigin(uri));
|
19144
|
+
},
|
19145
|
+
|
19146
|
+
/**
|
19147
|
+
* Determine whether the given URI has the same origin as this URI. Based on RFC-6454.
|
19148
|
+
* Supports default ports for protocols listed in DEFAULT_PORTS. Unsupported protocols will fail safe: they
|
19149
|
+
* won't match, if the port specifications differ.
|
19150
|
+
*
|
19151
|
+
* @method isSameOrigin
|
19152
|
+
* @param {tinymce.util.URI} uri Uri instance to compare.
|
19153
|
+
* @returns {Boolean} True if the origins are the same.
|
19154
|
+
*/
|
19155
|
+
isSameOrigin: function(uri) {
|
19156
|
+
if (this.host == uri.host && this.protocol == uri.protocol){
|
19157
|
+
if (this.port == uri.port) {
|
19158
|
+
return true;
|
19159
|
+
}
|
19160
|
+
|
19161
|
+
var defaultPort = DEFAULT_PORTS[this.protocol];
|
19162
|
+
if (defaultPort && ((this.port || defaultPort) == (uri.port || defaultPort))) {
|
19163
|
+
return true;
|
19164
|
+
}
|
19165
|
+
}
|
19166
|
+
|
19167
|
+
return false;
|
18838
19168
|
},
|
18839
19169
|
|
18840
19170
|
/**
|
@@ -19092,6 +19422,8 @@ define("tinymce/util/Class", [
|
|
19092
19422
|
// Instantiate a base class (but only create the instance,
|
19093
19423
|
// don't run the init constructor)
|
19094
19424
|
initializing = true;
|
19425
|
+
|
19426
|
+
/*eslint new-cap:0 */
|
19095
19427
|
prototype = new self();
|
19096
19428
|
initializing = false;
|
19097
19429
|
|
@@ -19178,6 +19510,269 @@ define("tinymce/util/Class", [
|
|
19178
19510
|
return Class;
|
19179
19511
|
});
|
19180
19512
|
|
19513
|
+
// Included from: js/tinymce/classes/util/EventDispatcher.js
|
19514
|
+
|
19515
|
+
/**
|
19516
|
+
* EventDispatcher.js
|
19517
|
+
*
|
19518
|
+
* Copyright, Moxiecode Systems AB
|
19519
|
+
* Released under LGPL License.
|
19520
|
+
*
|
19521
|
+
* License: http://www.tinymce.com/license
|
19522
|
+
* Contributing: http://www.tinymce.com/contributing
|
19523
|
+
*/
|
19524
|
+
|
19525
|
+
/**
|
19526
|
+
* This class lets you add/remove and fire events by name on the specified scope. This makes
|
19527
|
+
* it easy to add event listener logic to any class.
|
19528
|
+
*
|
19529
|
+
* @class tinymce.util.EventDispatcher
|
19530
|
+
* @example
|
19531
|
+
* var eventDispatcher = new EventDispatcher();
|
19532
|
+
*
|
19533
|
+
* eventDispatcher.on('click', function() {console.log('data');});
|
19534
|
+
* eventDispatcher.fire('click', {data: 123});
|
19535
|
+
*/
|
19536
|
+
define("tinymce/util/EventDispatcher", [
|
19537
|
+
"tinymce/util/Tools"
|
19538
|
+
], function(Tools) {
|
19539
|
+
var nativeEvents = Tools.makeMap(
|
19540
|
+
"focus blur focusin focusout click dblclick mousedown mouseup mousemove mouseover beforepaste paste cut copy selectionchange " +
|
19541
|
+
"mouseout mouseenter mouseleave wheel keydown keypress keyup input contextmenu dragstart dragend dragover " +
|
19542
|
+
"draggesture dragdrop drop drag submit",
|
19543
|
+
' '
|
19544
|
+
);
|
19545
|
+
|
19546
|
+
function Dispatcher(settings) {
|
19547
|
+
var self = this, scope, bindings = {}, toggleEvent;
|
19548
|
+
|
19549
|
+
function returnFalse() {
|
19550
|
+
return false;
|
19551
|
+
}
|
19552
|
+
|
19553
|
+
function returnTrue() {
|
19554
|
+
return true;
|
19555
|
+
}
|
19556
|
+
|
19557
|
+
settings = settings || {};
|
19558
|
+
scope = settings.scope || self;
|
19559
|
+
toggleEvent = settings.toggleEvent || returnFalse;
|
19560
|
+
|
19561
|
+
/**
|
19562
|
+
* Fires the specified event by name.
|
19563
|
+
*
|
19564
|
+
* @method fire
|
19565
|
+
* @param {String} name Name of the event to fire.
|
19566
|
+
* @param {Object?} args Event arguments.
|
19567
|
+
* @return {Object} Event args instance passed in.
|
19568
|
+
* @example
|
19569
|
+
* instance.fire('event', {...});
|
19570
|
+
*/
|
19571
|
+
function fire(name, args) {
|
19572
|
+
var handlers, i, l, callback;
|
19573
|
+
|
19574
|
+
name = name.toLowerCase();
|
19575
|
+
args = args || {};
|
19576
|
+
args.type = name;
|
19577
|
+
|
19578
|
+
// Setup target is there isn't one
|
19579
|
+
if (!args.target) {
|
19580
|
+
args.target = scope;
|
19581
|
+
}
|
19582
|
+
|
19583
|
+
// Add event delegation methods if they are missing
|
19584
|
+
if (!args.preventDefault) {
|
19585
|
+
// Add preventDefault method
|
19586
|
+
args.preventDefault = function() {
|
19587
|
+
args.isDefaultPrevented = returnTrue;
|
19588
|
+
};
|
19589
|
+
|
19590
|
+
// Add stopPropagation
|
19591
|
+
args.stopPropagation = function() {
|
19592
|
+
args.isPropagationStopped = returnTrue;
|
19593
|
+
};
|
19594
|
+
|
19595
|
+
// Add stopImmediatePropagation
|
19596
|
+
args.stopImmediatePropagation = function() {
|
19597
|
+
args.isImmediatePropagationStopped = returnTrue;
|
19598
|
+
};
|
19599
|
+
|
19600
|
+
// Add event delegation states
|
19601
|
+
args.isDefaultPrevented = returnFalse;
|
19602
|
+
args.isPropagationStopped = returnFalse;
|
19603
|
+
args.isImmediatePropagationStopped = returnFalse;
|
19604
|
+
}
|
19605
|
+
|
19606
|
+
if (settings.beforeFire) {
|
19607
|
+
settings.beforeFire(args);
|
19608
|
+
}
|
19609
|
+
|
19610
|
+
handlers = bindings[name];
|
19611
|
+
if (handlers) {
|
19612
|
+
for (i = 0, l = handlers.length; i < l; i++) {
|
19613
|
+
handlers[i] = callback = handlers[i];
|
19614
|
+
|
19615
|
+
// Stop immediate propagation if needed
|
19616
|
+
if (args.isImmediatePropagationStopped()) {
|
19617
|
+
args.stopPropagation();
|
19618
|
+
return args;
|
19619
|
+
}
|
19620
|
+
|
19621
|
+
// If callback returns false then prevent default and stop all propagation
|
19622
|
+
if (callback.call(scope, args) === false) {
|
19623
|
+
args.preventDefault();
|
19624
|
+
return args;
|
19625
|
+
}
|
19626
|
+
}
|
19627
|
+
}
|
19628
|
+
|
19629
|
+
return args;
|
19630
|
+
}
|
19631
|
+
|
19632
|
+
/**
|
19633
|
+
* Binds an event listener to a specific event by name.
|
19634
|
+
*
|
19635
|
+
* @method on
|
19636
|
+
* @param {String} name Event name or space separated list of events to bind.
|
19637
|
+
* @param {callback} callback Callback to be executed when the event occurs.
|
19638
|
+
* @param {Boolean} first Optional flag if the event should be prepended. Use this with care.
|
19639
|
+
* @return {Object} Current class instance.
|
19640
|
+
* @example
|
19641
|
+
* instance.on('event', function(e) {
|
19642
|
+
* // Callback logic
|
19643
|
+
* });
|
19644
|
+
*/
|
19645
|
+
function on(name, callback, prepend) {
|
19646
|
+
var handlers, names, i;
|
19647
|
+
|
19648
|
+
if (callback === false) {
|
19649
|
+
callback = returnFalse;
|
19650
|
+
}
|
19651
|
+
|
19652
|
+
if (callback) {
|
19653
|
+
names = name.toLowerCase().split(' ');
|
19654
|
+
i = names.length;
|
19655
|
+
while (i--) {
|
19656
|
+
name = names[i];
|
19657
|
+
handlers = bindings[name];
|
19658
|
+
if (!handlers) {
|
19659
|
+
handlers = bindings[name] = [];
|
19660
|
+
toggleEvent(name, true);
|
19661
|
+
}
|
19662
|
+
|
19663
|
+
if (prepend) {
|
19664
|
+
handlers.unshift(callback);
|
19665
|
+
} else {
|
19666
|
+
handlers.push(callback);
|
19667
|
+
}
|
19668
|
+
}
|
19669
|
+
}
|
19670
|
+
|
19671
|
+
return self;
|
19672
|
+
}
|
19673
|
+
|
19674
|
+
/**
|
19675
|
+
* Unbinds an event listener to a specific event by name.
|
19676
|
+
*
|
19677
|
+
* @method off
|
19678
|
+
* @param {String?} name Name of the event to unbind.
|
19679
|
+
* @param {callback?} callback Callback to unbind.
|
19680
|
+
* @return {Object} Current class instance.
|
19681
|
+
* @example
|
19682
|
+
* // Unbind specific callback
|
19683
|
+
* instance.off('event', handler);
|
19684
|
+
*
|
19685
|
+
* // Unbind all listeners by name
|
19686
|
+
* instance.off('event');
|
19687
|
+
*
|
19688
|
+
* // Unbind all events
|
19689
|
+
* instance.off();
|
19690
|
+
*/
|
19691
|
+
function off(name, callback) {
|
19692
|
+
var i, handlers, bindingName, names, hi;
|
19693
|
+
|
19694
|
+
if (name) {
|
19695
|
+
names = name.toLowerCase().split(' ');
|
19696
|
+
i = names.length;
|
19697
|
+
while (i--) {
|
19698
|
+
name = names[i];
|
19699
|
+
handlers = bindings[name];
|
19700
|
+
|
19701
|
+
// Unbind all handlers
|
19702
|
+
if (!name) {
|
19703
|
+
for (bindingName in bindings) {
|
19704
|
+
toggleEvent(bindingName, false);
|
19705
|
+
delete bindings[bindingName];
|
19706
|
+
}
|
19707
|
+
|
19708
|
+
return self;
|
19709
|
+
}
|
19710
|
+
|
19711
|
+
if (handlers) {
|
19712
|
+
// Unbind all by name
|
19713
|
+
if (!callback) {
|
19714
|
+
handlers.length = 0;
|
19715
|
+
} else {
|
19716
|
+
// Unbind specific ones
|
19717
|
+
hi = handlers.length;
|
19718
|
+
while (hi--) {
|
19719
|
+
if (handlers[hi] === callback) {
|
19720
|
+
handlers.splice(hi, 1);
|
19721
|
+
}
|
19722
|
+
}
|
19723
|
+
}
|
19724
|
+
|
19725
|
+
if (!handlers.length) {
|
19726
|
+
toggleEvent(name, false);
|
19727
|
+
delete bindings[name];
|
19728
|
+
}
|
19729
|
+
}
|
19730
|
+
}
|
19731
|
+
} else {
|
19732
|
+
for (name in bindings) {
|
19733
|
+
toggleEvent(name, false);
|
19734
|
+
}
|
19735
|
+
|
19736
|
+
bindings = {};
|
19737
|
+
}
|
19738
|
+
|
19739
|
+
return self;
|
19740
|
+
}
|
19741
|
+
|
19742
|
+
/**
|
19743
|
+
* Returns true/false if the dispatcher has a event of the specified name.
|
19744
|
+
*
|
19745
|
+
* @method has
|
19746
|
+
* @param {String} name Name of the event to check for.
|
19747
|
+
* @return {Boolean} true/false if the event exists or not.
|
19748
|
+
*/
|
19749
|
+
function has(name) {
|
19750
|
+
name = name.toLowerCase();
|
19751
|
+
return !(!bindings[name] || bindings[name].length === 0);
|
19752
|
+
}
|
19753
|
+
|
19754
|
+
// Expose
|
19755
|
+
self.fire = fire;
|
19756
|
+
self.on = on;
|
19757
|
+
self.off = off;
|
19758
|
+
self.has = has;
|
19759
|
+
}
|
19760
|
+
|
19761
|
+
/**
|
19762
|
+
* Returns true/false if the specified event name is a native browser event or not.
|
19763
|
+
*
|
19764
|
+
* @method isNative
|
19765
|
+
* @param {String} name Name to check if it's native.
|
19766
|
+
* @return {Boolean} true/false if the event is native or not.
|
19767
|
+
* @static
|
19768
|
+
*/
|
19769
|
+
Dispatcher.isNative = function(name) {
|
19770
|
+
return !!nativeEvents[name.toLowerCase()];
|
19771
|
+
};
|
19772
|
+
|
19773
|
+
return Dispatcher;
|
19774
|
+
});
|
19775
|
+
|
19181
19776
|
// Included from: js/tinymce/classes/ui/Selector.js
|
19182
19777
|
|
19183
19778
|
/**
|
@@ -20104,21 +20699,44 @@ define("tinymce/ui/DomUtils", [
|
|
20104
20699
|
define("tinymce/ui/Control", [
|
20105
20700
|
"tinymce/util/Class",
|
20106
20701
|
"tinymce/util/Tools",
|
20702
|
+
"tinymce/util/EventDispatcher",
|
20107
20703
|
"tinymce/ui/Collection",
|
20108
20704
|
"tinymce/ui/DomUtils"
|
20109
|
-
], function(Class, Tools, Collection, DomUtils) {
|
20705
|
+
], function(Class, Tools, EventDispatcher, Collection, DomUtils) {
|
20110
20706
|
"use strict";
|
20111
20707
|
|
20112
|
-
var nativeEvents = Tools.makeMap("focusin focusout scroll click dblclick mousedown mouseup mousemove mouseover" +
|
20113
|
-
" mouseout mouseenter mouseleave wheel keydown keypress keyup contextmenu", " ");
|
20114
|
-
|
20115
20708
|
var elementIdCache = {};
|
20116
20709
|
var hasMouseWheelEventSupport = "onmousewheel" in document;
|
20117
20710
|
var hasWheelEventSupport = false;
|
20711
|
+
var classPrefix = "mce-";
|
20712
|
+
|
20713
|
+
function getEventDispatcher(obj) {
|
20714
|
+
if (!obj._eventDispatcher) {
|
20715
|
+
obj._eventDispatcher = new EventDispatcher({
|
20716
|
+
scope: obj,
|
20717
|
+
toggleEvent: function(name, state) {
|
20718
|
+
if (state && EventDispatcher.isNative(name)) {
|
20719
|
+
if (!obj._nativeEvents) {
|
20720
|
+
obj._nativeEvents = {};
|
20721
|
+
}
|
20722
|
+
|
20723
|
+
obj._nativeEvents[name] = true;
|
20724
|
+
|
20725
|
+
if (obj._rendered) {
|
20726
|
+
obj.bindPendingEvents();
|
20727
|
+
}
|
20728
|
+
}
|
20729
|
+
}
|
20730
|
+
});
|
20731
|
+
}
|
20732
|
+
|
20733
|
+
return obj._eventDispatcher;
|
20734
|
+
}
|
20118
20735
|
|
20119
20736
|
var Control = Class.extend({
|
20120
20737
|
Statics: {
|
20121
|
-
elementIdCache: elementIdCache
|
20738
|
+
elementIdCache: elementIdCache,
|
20739
|
+
classPrefix: classPrefix
|
20122
20740
|
},
|
20123
20741
|
|
20124
20742
|
isRtl: function() {
|
@@ -20131,7 +20749,7 @@ define("tinymce/ui/Control", [
|
|
20131
20749
|
* @final
|
20132
20750
|
* @field {String} classPrefix
|
20133
20751
|
*/
|
20134
|
-
classPrefix:
|
20752
|
+
classPrefix: classPrefix,
|
20135
20753
|
|
20136
20754
|
/**
|
20137
20755
|
* Constructs a new control instance with the specified settings.
|
@@ -20588,14 +21206,18 @@ define("tinymce/ui/Control", [
|
|
20588
21206
|
* @return {tinymce.ui.Control} Current control object.
|
20589
21207
|
*/
|
20590
21208
|
on: function(name, callback) {
|
20591
|
-
var self = this
|
21209
|
+
var self = this;
|
20592
21210
|
|
20593
21211
|
function resolveCallbackName(name) {
|
20594
21212
|
var callback, scope;
|
20595
21213
|
|
21214
|
+
if (typeof(name) != 'string') {
|
21215
|
+
return name;
|
21216
|
+
}
|
21217
|
+
|
20596
21218
|
return function(e) {
|
20597
21219
|
if (!callback) {
|
20598
|
-
self.
|
21220
|
+
self.parentsAndSelf().each(function(ctrl) {
|
20599
21221
|
var callbacks = ctrl.settings.callbacks;
|
20600
21222
|
|
20601
21223
|
if (callbacks && (callback = callbacks[name])) {
|
@@ -20609,41 +21231,7 @@ define("tinymce/ui/Control", [
|
|
20609
21231
|
};
|
20610
21232
|
}
|
20611
21233
|
|
20612
|
-
|
20613
|
-
if (typeof(callback) == 'string') {
|
20614
|
-
callback = resolveCallbackName(callback);
|
20615
|
-
}
|
20616
|
-
|
20617
|
-
names = name.toLowerCase().split(' ');
|
20618
|
-
i = names.length;
|
20619
|
-
while (i--) {
|
20620
|
-
name = names[i];
|
20621
|
-
|
20622
|
-
bindings = self._bindings;
|
20623
|
-
if (!bindings) {
|
20624
|
-
bindings = self._bindings = {};
|
20625
|
-
}
|
20626
|
-
|
20627
|
-
handlers = bindings[name];
|
20628
|
-
if (!handlers) {
|
20629
|
-
handlers = bindings[name] = [];
|
20630
|
-
}
|
20631
|
-
|
20632
|
-
handlers.push(callback);
|
20633
|
-
|
20634
|
-
if (nativeEvents[name]) {
|
20635
|
-
if (!self._nativeEvents) {
|
20636
|
-
self._nativeEvents = {name: true};
|
20637
|
-
} else {
|
20638
|
-
self._nativeEvents[name] = true;
|
20639
|
-
}
|
20640
|
-
|
20641
|
-
if (self._rendered) {
|
20642
|
-
self.bindPendingEvents();
|
20643
|
-
}
|
20644
|
-
}
|
20645
|
-
}
|
20646
|
-
}
|
21234
|
+
getEventDispatcher(self).on(name, resolveCallbackName(callback));
|
20647
21235
|
|
20648
21236
|
return self;
|
20649
21237
|
},
|
@@ -20659,46 +21247,8 @@ define("tinymce/ui/Control", [
|
|
20659
21247
|
* @return {mxex.ui.Control} Current control object.
|
20660
21248
|
*/
|
20661
21249
|
off: function(name, callback) {
|
20662
|
-
|
20663
|
-
|
20664
|
-
if (bindings) {
|
20665
|
-
if (name) {
|
20666
|
-
names = name.toLowerCase().split(' ');
|
20667
|
-
i = names.length;
|
20668
|
-
while (i--) {
|
20669
|
-
name = names[i];
|
20670
|
-
handlers = bindings[name];
|
20671
|
-
|
20672
|
-
// Unbind all handlers
|
20673
|
-
if (!name) {
|
20674
|
-
for (bindingName in bindings) {
|
20675
|
-
bindings[bindingName].length = 0;
|
20676
|
-
}
|
20677
|
-
|
20678
|
-
return self;
|
20679
|
-
}
|
20680
|
-
|
20681
|
-
if (handlers) {
|
20682
|
-
// Unbind all by name
|
20683
|
-
if (!callback) {
|
20684
|
-
handlers.length = 0;
|
20685
|
-
} else {
|
20686
|
-
// Unbind specific ones
|
20687
|
-
hi = handlers.length;
|
20688
|
-
while (hi--) {
|
20689
|
-
if (handlers[hi] === callback) {
|
20690
|
-
handlers.splice(hi, 1);
|
20691
|
-
}
|
20692
|
-
}
|
20693
|
-
}
|
20694
|
-
}
|
20695
|
-
}
|
20696
|
-
} else {
|
20697
|
-
self._bindings = [];
|
20698
|
-
}
|
20699
|
-
}
|
20700
|
-
|
20701
|
-
return self;
|
21250
|
+
getEventDispatcher(this).off(name, callback);
|
21251
|
+
return this;
|
20702
21252
|
},
|
20703
21253
|
|
20704
21254
|
/**
|
@@ -20712,75 +21262,22 @@ define("tinymce/ui/Control", [
|
|
20712
21262
|
* @return {Object} Current arguments object.
|
20713
21263
|
*/
|
20714
21264
|
fire: function(name, args, bubble) {
|
20715
|
-
var self = this
|
20716
|
-
|
20717
|
-
name = name.toLowerCase();
|
20718
|
-
|
20719
|
-
// Dummy function that gets replaced on the delegation state functions
|
20720
|
-
function returnFalse() {
|
20721
|
-
return false;
|
20722
|
-
}
|
20723
|
-
|
20724
|
-
// Dummy function that gets replaced on the delegation state functions
|
20725
|
-
function returnTrue() {
|
20726
|
-
return true;
|
20727
|
-
}
|
21265
|
+
var self = this;
|
20728
21266
|
|
20729
|
-
// Setup empty object if args is omited
|
20730
21267
|
args = args || {};
|
20731
21268
|
|
20732
|
-
// Stick type into event object
|
20733
|
-
if (!args.type) {
|
20734
|
-
args.type = name;
|
20735
|
-
}
|
20736
|
-
|
20737
|
-
// Stick control into event
|
20738
21269
|
if (!args.control) {
|
20739
21270
|
args.control = self;
|
20740
21271
|
}
|
20741
21272
|
|
20742
|
-
|
20743
|
-
if (!args.preventDefault) {
|
20744
|
-
// Add preventDefault method
|
20745
|
-
args.preventDefault = function() {
|
20746
|
-
args.isDefaultPrevented = returnTrue;
|
20747
|
-
};
|
21273
|
+
args = getEventDispatcher(self).fire(name, args);
|
20748
21274
|
|
20749
|
-
|
20750
|
-
|
20751
|
-
|
20752
|
-
|
20753
|
-
|
20754
|
-
|
20755
|
-
args.stopImmediatePropagation = function() {
|
20756
|
-
args.isImmediatePropagationStopped = returnTrue;
|
20757
|
-
};
|
20758
|
-
|
20759
|
-
// Add event delegation states
|
20760
|
-
args.isDefaultPrevented = returnFalse;
|
20761
|
-
args.isPropagationStopped = returnFalse;
|
20762
|
-
args.isImmediatePropagationStopped = returnFalse;
|
20763
|
-
}
|
20764
|
-
|
20765
|
-
if (self._bindings) {
|
20766
|
-
handlers = self._bindings[name];
|
20767
|
-
|
20768
|
-
if (handlers) {
|
20769
|
-
for (i = 0, l = handlers.length; i < l; i++) {
|
20770
|
-
// Execute callback and break if the callback returns a false
|
20771
|
-
if (!args.isImmediatePropagationStopped() && handlers[i].call(self, args) === false) {
|
20772
|
-
break;
|
20773
|
-
}
|
20774
|
-
}
|
20775
|
-
}
|
20776
|
-
}
|
20777
|
-
|
20778
|
-
// Bubble event up to parent controls
|
20779
|
-
if (bubble !== false) {
|
20780
|
-
parentCtrl = self.parent();
|
20781
|
-
while (parentCtrl && !args.isPropagationStopped()) {
|
20782
|
-
parentCtrl.fire(name, args, false);
|
20783
|
-
parentCtrl = parentCtrl.parent();
|
21275
|
+
// Bubble event up to parents
|
21276
|
+
if (bubble !== false && self.parent) {
|
21277
|
+
var parent = self.parent();
|
21278
|
+
while (parent && !args.isPropagationStopped()) {
|
21279
|
+
parent.fire(name, args, false);
|
21280
|
+
parent = parent.parent();
|
20784
21281
|
}
|
20785
21282
|
}
|
20786
21283
|
|
@@ -20795,7 +21292,7 @@ define("tinymce/ui/Control", [
|
|
20795
21292
|
* @return {Boolean} True/false state if the event has listeners.
|
20796
21293
|
*/
|
20797
21294
|
hasEventListeners: function(name) {
|
20798
|
-
return
|
21295
|
+
return getEventDispatcher(this).has(name);
|
20799
21296
|
},
|
20800
21297
|
|
20801
21298
|
/**
|
@@ -20821,6 +21318,17 @@ define("tinymce/ui/Control", [
|
|
20821
21318
|
return parents;
|
20822
21319
|
},
|
20823
21320
|
|
21321
|
+
/**
|
21322
|
+
* Returns the current control and it's parents.
|
21323
|
+
*
|
21324
|
+
* @method parentsAndSelf
|
21325
|
+
* @param {String} selector Optional selector expression to find parents.
|
21326
|
+
* @return {tinymce.ui.Collection} Collection with all parent controls.
|
21327
|
+
*/
|
21328
|
+
parentsAndSelf: function(selector) {
|
21329
|
+
return new Collection(this).add(this.parents(selector));
|
21330
|
+
},
|
21331
|
+
|
20824
21332
|
/**
|
20825
21333
|
* Returns the control next to the current control.
|
20826
21334
|
*
|
@@ -21137,8 +21645,8 @@ define("tinymce/ui/Control", [
|
|
21137
21645
|
* @return {String} Encoded and possible traslated string.
|
21138
21646
|
*/
|
21139
21647
|
encode: function(text, translate) {
|
21140
|
-
if (translate !== false
|
21141
|
-
text =
|
21648
|
+
if (translate !== false) {
|
21649
|
+
text = this.translate(text);
|
21142
21650
|
}
|
21143
21651
|
|
21144
21652
|
return (text || '').replace(/[&<>"]/g, function(match) {
|
@@ -21146,6 +21654,17 @@ define("tinymce/ui/Control", [
|
|
21146
21654
|
});
|
21147
21655
|
},
|
21148
21656
|
|
21657
|
+
/**
|
21658
|
+
* Returns the translated string.
|
21659
|
+
*
|
21660
|
+
* @method translate
|
21661
|
+
* @param {String} text Text to translate.
|
21662
|
+
* @return {String} Translated string or the same as the input.
|
21663
|
+
*/
|
21664
|
+
translate: function(text) {
|
21665
|
+
return Control.translate ? Control.translate(text) : text;
|
21666
|
+
},
|
21667
|
+
|
21149
21668
|
/**
|
21150
21669
|
* Adds items before the current control.
|
21151
21670
|
*
|
@@ -21489,6 +22008,11 @@ define("tinymce/ui/Control", [
|
|
21489
22008
|
parents[i]._eventsRoot = eventRootCtrl;
|
21490
22009
|
}
|
21491
22010
|
|
22011
|
+
var eventRootDelegates = eventRootCtrl._delegates;
|
22012
|
+
if (!eventRootDelegates) {
|
22013
|
+
eventRootDelegates = eventRootCtrl._delegates = {};
|
22014
|
+
}
|
22015
|
+
|
21492
22016
|
// Bind native event delegates
|
21493
22017
|
for (name in nativeEvents) {
|
21494
22018
|
if (!nativeEvents) {
|
@@ -21513,9 +22037,9 @@ define("tinymce/ui/Control", [
|
|
21513
22037
|
DomUtils.on(eventRootCtrl.getEl(), "mouseover", mouseEnterHandler);
|
21514
22038
|
eventRootCtrl._hasMouseEnter = 1;
|
21515
22039
|
}
|
21516
|
-
} else if (!
|
22040
|
+
} else if (!eventRootDelegates[name]) {
|
21517
22041
|
DomUtils.on(eventRootCtrl.getEl(), name, delegate);
|
21518
|
-
|
22042
|
+
eventRootDelegates[name] = true;
|
21519
22043
|
}
|
21520
22044
|
|
21521
22045
|
// Remove the event once it's bound
|
@@ -21839,9 +22363,11 @@ define("tinymce/ui/KeyboardNavigation", [
|
|
21839
22363
|
* @return {Boolean} True/false if the element is a text element or not.
|
21840
22364
|
*/
|
21841
22365
|
function isTextInputElement(elm) {
|
22366
|
+
var tagName = elm.tagName.toUpperCase();
|
22367
|
+
|
21842
22368
|
// Notice: since type can be "email" etc we don't check the type
|
21843
22369
|
// So all input elements gets treated as text input elements
|
21844
|
-
return
|
22370
|
+
return tagName == "INPUT" || tagName == "TEXTAREA";
|
21845
22371
|
}
|
21846
22372
|
|
21847
22373
|
/**
|
@@ -22083,7 +22609,7 @@ define("tinymce/ui/KeyboardNavigation", [
|
|
22083
22609
|
}
|
22084
22610
|
|
22085
22611
|
root.on('keydown', function(e) {
|
22086
|
-
function
|
22612
|
+
function handleNonTabOrEscEvent(e, handler) {
|
22087
22613
|
// Ignore non tab keys for text elements
|
22088
22614
|
if (isTextInputElement(focusedElement)) {
|
22089
22615
|
return;
|
@@ -22100,29 +22626,29 @@ define("tinymce/ui/KeyboardNavigation", [
|
|
22100
22626
|
|
22101
22627
|
switch (e.keyCode) {
|
22102
22628
|
case 37: // DOM_VK_LEFT
|
22103
|
-
|
22629
|
+
handleNonTabOrEscEvent(e, left);
|
22104
22630
|
break;
|
22105
22631
|
|
22106
22632
|
case 39: // DOM_VK_RIGHT
|
22107
|
-
|
22633
|
+
handleNonTabOrEscEvent(e, right);
|
22108
22634
|
break;
|
22109
22635
|
|
22110
22636
|
case 38: // DOM_VK_UP
|
22111
|
-
|
22637
|
+
handleNonTabOrEscEvent(e, up);
|
22112
22638
|
break;
|
22113
22639
|
|
22114
22640
|
case 40: // DOM_VK_DOWN
|
22115
|
-
|
22641
|
+
handleNonTabOrEscEvent(e, down);
|
22116
22642
|
break;
|
22117
22643
|
|
22118
22644
|
case 27: // DOM_VK_ESCAPE
|
22119
|
-
|
22645
|
+
cancel();
|
22120
22646
|
break;
|
22121
22647
|
|
22122
22648
|
case 14: // DOM_VK_ENTER
|
22123
22649
|
case 13: // DOM_VK_RETURN
|
22124
22650
|
case 32: // DOM_VK_SPACE
|
22125
|
-
|
22651
|
+
handleNonTabOrEscEvent(e, enter);
|
22126
22652
|
break;
|
22127
22653
|
|
22128
22654
|
case 9: // DOM_VK_TAB
|
@@ -22994,7 +23520,7 @@ define("tinymce/ui/Panel", [
|
|
22994
23520
|
}
|
22995
23521
|
|
22996
23522
|
return (
|
22997
|
-
'<div id="' + self._id + '" class="' + self.classes() + '"
|
23523
|
+
'<div id="' + self._id + '" class="' + self.classes() + '" hidefocus="1" tabindex="-1" role="group">' +
|
22998
23524
|
(self._preBodyHtml || '') +
|
22999
23525
|
innerHtml +
|
23000
23526
|
'</div>'
|
@@ -23848,7 +24374,7 @@ define("tinymce/ui/Window", [
|
|
23848
24374
|
headerHtml = (
|
23849
24375
|
'<div id="' + id + '-head" class="' + prefix + 'window-head">' +
|
23850
24376
|
'<div id="' + id + '-title" class="' + prefix + 'title">' + self.encode(settings.title) + '</div>' +
|
23851
|
-
'<button type="button" class="' + prefix + 'close" aria-hidden="true"
|
24377
|
+
'<button type="button" class="' + prefix + 'close" aria-hidden="true">\u00d7</button>' +
|
23852
24378
|
'<div id="' + id + '-dragh" class="' + prefix + 'dragh"></div>' +
|
23853
24379
|
'</div>'
|
23854
24380
|
);
|
@@ -23867,7 +24393,7 @@ define("tinymce/ui/Window", [
|
|
23867
24393
|
}
|
23868
24394
|
|
23869
24395
|
return (
|
23870
|
-
'<div id="' + id + '" class="' + self.classes() + '"
|
24396
|
+
'<div id="' + id + '" class="' + self.classes() + '" hidefocus="1">' +
|
23871
24397
|
'<div class="' + self.classPrefix + 'reset" role="application">' +
|
23872
24398
|
headerHtml +
|
23873
24399
|
'<div id="' + id + '-body" class="' + self.classes('body') + '">' +
|
@@ -24016,6 +24542,17 @@ define("tinymce/ui/Window", [
|
|
24016
24542
|
DomUtils.removeClass(document.documentElement, prefix + 'fullscreen');
|
24017
24543
|
DomUtils.removeClass(document.body, prefix + 'fullscreen');
|
24018
24544
|
}
|
24545
|
+
},
|
24546
|
+
|
24547
|
+
/**
|
24548
|
+
* Returns the contentWindow object of the iframe if it exists.
|
24549
|
+
*
|
24550
|
+
* @method getContentWindow
|
24551
|
+
* @return {Window} window object or null.
|
24552
|
+
*/
|
24553
|
+
getContentWindow: function() {
|
24554
|
+
var ifr = this.getEl().getElementsByTagName('iframe')[0];
|
24555
|
+
return ifr ? ifr.contentWindow : null;
|
24019
24556
|
}
|
24020
24557
|
});
|
24021
24558
|
|
@@ -24324,7 +24861,6 @@ define("tinymce/WindowManager", [
|
|
24324
24861
|
args.buttons = [
|
24325
24862
|
{text: 'Ok', subtype: 'primary', onclick: function() {
|
24326
24863
|
win.find('form')[0].submit();
|
24327
|
-
win.close();
|
24328
24864
|
}},
|
24329
24865
|
|
24330
24866
|
{text: 'Cancel', onclick: function() {
|
@@ -24368,7 +24904,7 @@ define("tinymce/WindowManager", [
|
|
24368
24904
|
// Takes a snapshot in the FocusManager of the selection before focus is lost to dialog
|
24369
24905
|
editor.nodeChanged();
|
24370
24906
|
|
24371
|
-
return win.renderTo(
|
24907
|
+
return win.renderTo().reflow();
|
24372
24908
|
};
|
24373
24909
|
|
24374
24910
|
/**
|
@@ -24452,6 +24988,16 @@ define("tinymce/WindowManager", [
|
|
24452
24988
|
getTopMostWindow().params = params;
|
24453
24989
|
}
|
24454
24990
|
};
|
24991
|
+
|
24992
|
+
/**
|
24993
|
+
* Returns the currently opened window objects.
|
24994
|
+
*
|
24995
|
+
* @method getWindows
|
24996
|
+
* @return {Array} Array of the currently opened windows.
|
24997
|
+
*/
|
24998
|
+
self.getWindows = function() {
|
24999
|
+
return windows;
|
25000
|
+
};
|
24455
25001
|
};
|
24456
25002
|
});
|
24457
25003
|
|
@@ -24548,9 +25094,45 @@ define("tinymce/util/Quirks", [
|
|
24548
25094
|
*/
|
24549
25095
|
function cleanupStylesWhenDeleting() {
|
24550
25096
|
var doc = editor.getDoc(), urlPrefix = 'data:text/mce-internal,';
|
25097
|
+
var MutationObserver = window.MutationObserver, olderWebKit, dragStartRng;
|
24551
25098
|
|
24552
|
-
|
24553
|
-
|
25099
|
+
// Add mini polyfill for older WebKits
|
25100
|
+
// TODO: Remove this when old Safari versions gets updated
|
25101
|
+
if (!MutationObserver) {
|
25102
|
+
olderWebKit = true;
|
25103
|
+
|
25104
|
+
MutationObserver = function() {
|
25105
|
+
var records = [], target;
|
25106
|
+
|
25107
|
+
function nodeInsert(e) {
|
25108
|
+
var target = e.relatedNode || e.target;
|
25109
|
+
records.push({target: target, addedNodes: [target]});
|
25110
|
+
}
|
25111
|
+
|
25112
|
+
function attrModified(e) {
|
25113
|
+
var target = e.relatedNode || e.target;
|
25114
|
+
records.push({target: target, attributeName: e.attrName});
|
25115
|
+
}
|
25116
|
+
|
25117
|
+
this.observe = function(node) {
|
25118
|
+
target = node;
|
25119
|
+
target.addEventListener('DOMSubtreeModified', nodeInsert, false);
|
25120
|
+
target.addEventListener('DOMNodeInsertedIntoDocument', nodeInsert, false);
|
25121
|
+
target.addEventListener('DOMNodeInserted', nodeInsert, false);
|
25122
|
+
target.addEventListener('DOMAttrModified', attrModified, false);
|
25123
|
+
};
|
25124
|
+
|
25125
|
+
this.disconnect = function() {
|
25126
|
+
target.removeEventListener('DOMSubtreeModified', nodeInsert, false);
|
25127
|
+
target.removeEventListener('DOMNodeInsertedIntoDocument', nodeInsert, false);
|
25128
|
+
target.removeEventListener('DOMNodeInserted', nodeInsert, false);
|
25129
|
+
target.removeEventListener('DOMAttrModified', attrModified, false);
|
25130
|
+
};
|
25131
|
+
|
25132
|
+
this.takeRecords = function() {
|
25133
|
+
return records;
|
25134
|
+
};
|
25135
|
+
};
|
24554
25136
|
}
|
24555
25137
|
|
24556
25138
|
function customDelete(isForward) {
|
@@ -24582,6 +25164,10 @@ define("tinymce/util/Quirks", [
|
|
24582
25164
|
var caretElement = rng.startContainer.parentNode;
|
24583
25165
|
|
24584
25166
|
Tools.each(mutationObserver.takeRecords(), function(record) {
|
25167
|
+
if (!dom.isChildOf(record.target, editor.getBody())) {
|
25168
|
+
return;
|
25169
|
+
}
|
25170
|
+
|
24585
25171
|
// Restore style attribute to previous value
|
24586
25172
|
if (record.attributeName == "style") {
|
24587
25173
|
var oldValue = record.target.getAttribute('data-mce-style');
|
@@ -24661,9 +25247,25 @@ define("tinymce/util/Quirks", [
|
|
24661
25247
|
customDelete(true);
|
24662
25248
|
});
|
24663
25249
|
|
25250
|
+
// Older WebKits doesn't properly handle the clipboard so we can't add the rest
|
25251
|
+
if (olderWebKit) {
|
25252
|
+
return;
|
25253
|
+
}
|
25254
|
+
|
24664
25255
|
editor.on('dragstart', function(e) {
|
25256
|
+
var selectionHtml;
|
25257
|
+
|
25258
|
+
if (editor.selection.isCollapsed() && e.target.tagName == 'IMG') {
|
25259
|
+
selection.select(e.target);
|
25260
|
+
}
|
25261
|
+
|
25262
|
+
dragStartRng = selection.getRng();
|
25263
|
+
selectionHtml = editor.selection.getContent();
|
25264
|
+
|
24665
25265
|
// Safari doesn't support custom dataTransfer items so we can only use URL and Text
|
24666
|
-
|
25266
|
+
if (selectionHtml.length > 0) {
|
25267
|
+
e.dataTransfer.setData('URL', 'data:text/mce-internal,' + escape(selectionHtml));
|
25268
|
+
}
|
24667
25269
|
});
|
24668
25270
|
|
24669
25271
|
editor.on('drop', function(e) {
|
@@ -24677,10 +25279,26 @@ define("tinymce/util/Quirks", [
|
|
24677
25279
|
internalContent = unescape(internalContent.substr(urlPrefix.length));
|
24678
25280
|
if (doc.caretRangeFromPoint) {
|
24679
25281
|
e.preventDefault();
|
24680
|
-
|
24681
|
-
|
24682
|
-
|
25282
|
+
|
25283
|
+
// Safari has a weird issue where drag/dropping images sometimes
|
25284
|
+
// produces a green plus icon. When this happens the caretRangeFromPoint
|
25285
|
+
// will return "null" even though the x, y coordinate is correct.
|
25286
|
+
// But if we detach the insert from the drop event we will get a proper range
|
25287
|
+
window.setTimeout(function() {
|
25288
|
+
var pointRng = doc.caretRangeFromPoint(e.x, e.y);
|
25289
|
+
|
25290
|
+
if (dragStartRng) {
|
25291
|
+
selection.setRng(dragStartRng);
|
25292
|
+
dragStartRng = null;
|
25293
|
+
}
|
25294
|
+
|
25295
|
+
customDelete();
|
25296
|
+
|
25297
|
+
selection.setRng(pointRng);
|
25298
|
+
editor.insertContent(internalContent);
|
25299
|
+
}, 0);
|
24683
25300
|
}
|
25301
|
+
|
24684
25302
|
}
|
24685
25303
|
});
|
24686
25304
|
|
@@ -24961,6 +25579,10 @@ define("tinymce/util/Quirks", [
|
|
24961
25579
|
}
|
24962
25580
|
|
24963
25581
|
selectionTimer = window.setTimeout(function() {
|
25582
|
+
if (editor.removed) {
|
25583
|
+
return;
|
25584
|
+
}
|
25585
|
+
|
24964
25586
|
var rng = selection.getRng();
|
24965
25587
|
|
24966
25588
|
// Compare the ranges to see if it was a real change or not
|
@@ -25373,16 +25995,16 @@ define("tinymce/util/Quirks", [
|
|
25373
25995
|
}
|
25374
25996
|
|
25375
25997
|
/**
|
25376
|
-
* Fixes selection issues
|
25998
|
+
* Fixes selection issues where the caret can be placed between two inline elements like <b>a</b>|<b>b</b>
|
25377
25999
|
* this fix will lean the caret right into the closest inline element.
|
25378
26000
|
*/
|
25379
26001
|
function normalizeSelection() {
|
25380
26002
|
// Normalize selection for example <b>a</b><i>|a</i> becomes <b>a|</b><i>a</i> except for Ctrl+A since it selects everything
|
25381
|
-
editor.on('keyup focusin', function(e) {
|
26003
|
+
editor.on('keyup focusin mouseup', function(e) {
|
25382
26004
|
if (e.keyCode != 65 || !VK.metaKeyPressed(e)) {
|
25383
26005
|
selection.normalize();
|
25384
26006
|
}
|
25385
|
-
});
|
26007
|
+
}, true);
|
25386
26008
|
}
|
25387
26009
|
|
25388
26010
|
/**
|
@@ -25470,7 +26092,7 @@ define("tinymce/util/Quirks", [
|
|
25470
26092
|
*/
|
25471
26093
|
function doubleTrailingBrElements() {
|
25472
26094
|
if (!editor.inline) {
|
25473
|
-
editor.on('focus blur', function() {
|
26095
|
+
editor.on('focus blur beforegetcontent', function() {
|
25474
26096
|
var br = editor.dom.create('br');
|
25475
26097
|
editor.getBody().appendChild(br);
|
25476
26098
|
br.parentNode.removeChild(br);
|
@@ -25478,6 +26100,38 @@ define("tinymce/util/Quirks", [
|
|
25478
26100
|
}
|
25479
26101
|
}
|
25480
26102
|
|
26103
|
+
/**
|
26104
|
+
* iOS 7.1 introduced two new bugs:
|
26105
|
+
* 1) It's possible to open links within a contentEditable area by clicking on them.
|
26106
|
+
* 2) If you hold down the finger it will display the link/image touch callout menu.
|
26107
|
+
*/
|
26108
|
+
function tapLinksAndImages() {
|
26109
|
+
editor.on('click', function(e) {
|
26110
|
+
var elm = e.target;
|
26111
|
+
|
26112
|
+
do {
|
26113
|
+
if (elm.tagName === 'A') {
|
26114
|
+
e.preventDefault();
|
26115
|
+
return;
|
26116
|
+
}
|
26117
|
+
} while ((elm = elm.parentNode));
|
26118
|
+
});
|
26119
|
+
|
26120
|
+
editor.contentStyles.push('.mce-content-body {-webkit-touch-callout: none}');
|
26121
|
+
}
|
26122
|
+
|
26123
|
+
/**
|
26124
|
+
* WebKit has a bug where it will allow forms to be submitted if they are inside a contentEditable element.
|
26125
|
+
* For example this: <form><button></form>
|
26126
|
+
*/
|
26127
|
+
function blockFormSubmitInsideEditor() {
|
26128
|
+
editor.on('init', function() {
|
26129
|
+
editor.dom.bind(editor.getBody(), 'submit', function(e) {
|
26130
|
+
e.preventDefault();
|
26131
|
+
});
|
26132
|
+
});
|
26133
|
+
}
|
26134
|
+
|
25481
26135
|
// All browsers
|
25482
26136
|
disableBackspaceIntoATable();
|
25483
26137
|
removeBlockQuoteOnBackSpace();
|
@@ -25490,12 +26144,14 @@ define("tinymce/util/Quirks", [
|
|
25490
26144
|
inputMethodFocus();
|
25491
26145
|
selectControlElements();
|
25492
26146
|
setDefaultBlockType();
|
26147
|
+
blockFormSubmitInsideEditor();
|
25493
26148
|
|
25494
26149
|
// iOS
|
25495
26150
|
if (Env.iOS) {
|
25496
26151
|
selectionChangeNodeChanged();
|
25497
26152
|
restoreFocusOnKeyDown();
|
25498
26153
|
bodyHeight();
|
26154
|
+
tapLinksAndImages();
|
25499
26155
|
} else {
|
25500
26156
|
selectAll();
|
25501
26157
|
}
|
@@ -25555,20 +26211,21 @@ define("tinymce/util/Quirks", [
|
|
25555
26211
|
* @mixin tinymce.util.Observable
|
25556
26212
|
*/
|
25557
26213
|
define("tinymce/util/Observable", [
|
25558
|
-
"tinymce/util/
|
25559
|
-
], function(
|
25560
|
-
|
25561
|
-
|
25562
|
-
|
25563
|
-
|
25564
|
-
|
25565
|
-
|
25566
|
-
|
25567
|
-
|
25568
|
-
|
26214
|
+
"tinymce/util/EventDispatcher"
|
26215
|
+
], function(EventDispatcher) {
|
26216
|
+
function getEventDispatcher(obj) {
|
26217
|
+
if (!obj._eventDispatcher) {
|
26218
|
+
obj._eventDispatcher = new EventDispatcher({
|
26219
|
+
scope: obj,
|
26220
|
+
toggleEvent: function(name, state) {
|
26221
|
+
if (EventDispatcher.isNative(name) && obj.toggleNativeEvent) {
|
26222
|
+
obj.toggleNativeEvent(name, state);
|
26223
|
+
}
|
26224
|
+
}
|
26225
|
+
});
|
26226
|
+
}
|
25569
26227
|
|
25570
|
-
|
25571
|
-
return true;
|
26228
|
+
return obj._eventDispatcher;
|
25572
26229
|
}
|
25573
26230
|
|
25574
26231
|
return {
|
@@ -25577,77 +26234,25 @@ define("tinymce/util/Observable", [
|
|
25577
26234
|
*
|
25578
26235
|
* @method fire
|
25579
26236
|
* @param {String} name Name of the event to fire.
|
25580
|
-
* @param {
|
26237
|
+
* @param {Object?} args Event arguments.
|
25581
26238
|
* @param {Boolean?} bubble True/false if the event is to be bubbled.
|
25582
|
-
* @return {
|
26239
|
+
* @return {Object} Event args instance passed in.
|
25583
26240
|
* @example
|
25584
26241
|
* instance.fire('event', {...});
|
25585
26242
|
*/
|
25586
26243
|
fire: function(name, args, bubble) {
|
25587
|
-
var self = this
|
25588
|
-
|
25589
|
-
if (self.removed) {
|
25590
|
-
return;
|
25591
|
-
}
|
25592
|
-
|
25593
|
-
name = name.toLowerCase();
|
25594
|
-
args = args || {};
|
25595
|
-
args.type = name;
|
25596
|
-
|
25597
|
-
// Setup target is there isn't one
|
25598
|
-
if (!args.target) {
|
25599
|
-
args.target = self;
|
25600
|
-
}
|
25601
|
-
|
25602
|
-
// Add event delegation methods if they are missing
|
25603
|
-
if (!args.preventDefault) {
|
25604
|
-
// Add preventDefault method
|
25605
|
-
args.preventDefault = function() {
|
25606
|
-
args.isDefaultPrevented = returnTrue;
|
25607
|
-
};
|
25608
|
-
|
25609
|
-
// Add stopPropagation
|
25610
|
-
args.stopPropagation = function() {
|
25611
|
-
args.isPropagationStopped = returnTrue;
|
25612
|
-
};
|
25613
|
-
|
25614
|
-
// Add stopImmediatePropagation
|
25615
|
-
args.stopImmediatePropagation = function() {
|
25616
|
-
args.isImmediatePropagationStopped = returnTrue;
|
25617
|
-
};
|
26244
|
+
var self = this;
|
25618
26245
|
|
25619
|
-
|
25620
|
-
|
25621
|
-
args
|
25622
|
-
args.isImmediatePropagationStopped = returnFalse;
|
26246
|
+
// Prevent all events except the remove event after the instance has been removed
|
26247
|
+
if (self.removed && name !== "remove") {
|
26248
|
+
return args;
|
25623
26249
|
}
|
25624
26250
|
|
25625
|
-
|
25626
|
-
|
25627
|
-
if (self[bindingsName]) {
|
25628
|
-
handlers = self[bindingsName][name];
|
25629
|
-
|
25630
|
-
if (handlers) {
|
25631
|
-
for (i = 0, l = handlers.length; i < l; i++) {
|
25632
|
-
handlers[i] = callback = handlers[i];
|
25633
|
-
|
25634
|
-
// Stop immediate propagation if needed
|
25635
|
-
if (args.isImmediatePropagationStopped()) {
|
25636
|
-
break;
|
25637
|
-
}
|
25638
|
-
|
25639
|
-
// If callback returns false then prevent default and stop all propagation
|
25640
|
-
if (callback.call(self, args) === false) {
|
25641
|
-
args.preventDefault();
|
25642
|
-
return args;
|
25643
|
-
}
|
25644
|
-
}
|
25645
|
-
}
|
25646
|
-
}
|
26251
|
+
args = getEventDispatcher(self).fire(name, args, bubble);
|
25647
26252
|
|
25648
26253
|
// Bubble event up to parents
|
25649
26254
|
if (bubble !== false && self.parent) {
|
25650
|
-
parent = self.parent();
|
26255
|
+
var parent = self.parent();
|
25651
26256
|
while (parent && !args.isPropagationStopped()) {
|
25652
26257
|
parent.fire(name, args, false);
|
25653
26258
|
parent = parent.parent();
|
@@ -25671,42 +26276,7 @@ define("tinymce/util/Observable", [
|
|
25671
26276
|
* });
|
25672
26277
|
*/
|
25673
26278
|
on: function(name, callback, prepend) {
|
25674
|
-
|
25675
|
-
|
25676
|
-
if (callback === false) {
|
25677
|
-
callback = function() {
|
25678
|
-
return false;
|
25679
|
-
};
|
25680
|
-
}
|
25681
|
-
|
25682
|
-
if (callback) {
|
25683
|
-
names = name.toLowerCase().split(' ');
|
25684
|
-
i = names.length;
|
25685
|
-
while (i--) {
|
25686
|
-
name = names[i];
|
25687
|
-
|
25688
|
-
bindings = self[bindingsName];
|
25689
|
-
if (!bindings) {
|
25690
|
-
bindings = self[bindingsName] = {};
|
25691
|
-
}
|
25692
|
-
|
25693
|
-
handlers = bindings[name];
|
25694
|
-
if (!handlers) {
|
25695
|
-
handlers = bindings[name] = [];
|
25696
|
-
if (self.bindNative && nativeEvents[name]) {
|
25697
|
-
self.bindNative(name);
|
25698
|
-
}
|
25699
|
-
}
|
25700
|
-
|
25701
|
-
if (prepend) {
|
25702
|
-
handlers.unshift(callback);
|
25703
|
-
} else {
|
25704
|
-
handlers.push(callback);
|
25705
|
-
}
|
25706
|
-
}
|
25707
|
-
}
|
25708
|
-
|
25709
|
-
return self;
|
26279
|
+
return getEventDispatcher(this).on(name, callback, prepend);
|
25710
26280
|
},
|
25711
26281
|
|
25712
26282
|
/**
|
@@ -25727,67 +26297,150 @@ define("tinymce/util/Observable", [
|
|
25727
26297
|
* instance.off();
|
25728
26298
|
*/
|
25729
26299
|
off: function(name, callback) {
|
25730
|
-
|
26300
|
+
return getEventDispatcher(this).off(name, callback);
|
26301
|
+
},
|
25731
26302
|
|
25732
|
-
|
25733
|
-
|
25734
|
-
|
25735
|
-
|
25736
|
-
|
25737
|
-
|
25738
|
-
|
26303
|
+
/**
|
26304
|
+
* Returns true/false if the object has a event of the specified name.
|
26305
|
+
*
|
26306
|
+
* @method hasEventListeners
|
26307
|
+
* @param {String} name Name of the event to check for.
|
26308
|
+
* @return {Boolean} true/false if the event exists or not.
|
26309
|
+
*/
|
26310
|
+
hasEventListeners: function(name) {
|
26311
|
+
return getEventDispatcher(this).has(name);
|
26312
|
+
}
|
26313
|
+
};
|
26314
|
+
});
|
25739
26315
|
|
25740
|
-
|
25741
|
-
if (!name) {
|
25742
|
-
for (bindingName in bindings) {
|
25743
|
-
bindings[name].length = 0;
|
25744
|
-
}
|
26316
|
+
// Included from: js/tinymce/classes/EditorObservable.js
|
25745
26317
|
|
25746
|
-
|
25747
|
-
|
26318
|
+
/**
|
26319
|
+
* EditorObservable.js
|
26320
|
+
*
|
26321
|
+
* Copyright, Moxiecode Systems AB
|
26322
|
+
* Released under LGPL License.
|
26323
|
+
*
|
26324
|
+
* License: http://www.tinymce.com/license
|
26325
|
+
* Contributing: http://www.tinymce.com/contributing
|
26326
|
+
*/
|
25748
26327
|
|
25749
|
-
|
25750
|
-
|
25751
|
-
|
25752
|
-
|
25753
|
-
|
25754
|
-
|
25755
|
-
|
25756
|
-
|
25757
|
-
|
25758
|
-
|
25759
|
-
|
25760
|
-
|
25761
|
-
}
|
26328
|
+
/**
|
26329
|
+
* This mixin contains the event logic for the tinymce.Editor class.
|
26330
|
+
*
|
26331
|
+
* @mixin tinymce.EditorObservable
|
26332
|
+
* @extends tinymce.util.Observable
|
26333
|
+
*/
|
26334
|
+
define("tinymce/EditorObservable", [
|
26335
|
+
"tinymce/util/Observable",
|
26336
|
+
"tinymce/dom/DOMUtils",
|
26337
|
+
"tinymce/util/Tools"
|
26338
|
+
], function(Observable, DOMUtils, Tools) {
|
26339
|
+
var DOM = DOMUtils.DOM;
|
25762
26340
|
|
25763
|
-
|
25764
|
-
|
25765
|
-
|
25766
|
-
|
25767
|
-
|
26341
|
+
function getEventTarget(editor, eventName) {
|
26342
|
+
if (eventName == 'selectionchange') {
|
26343
|
+
return editor.getDoc();
|
26344
|
+
}
|
26345
|
+
|
26346
|
+
// Need to bind mousedown/mouseup etc to document not body in iframe mode
|
26347
|
+
// Since the user might click on the HTML element not the BODY
|
26348
|
+
if (!editor.inline && /^mouse|click|contextmenu|drop/.test(eventName)) {
|
26349
|
+
return editor.getDoc();
|
26350
|
+
}
|
26351
|
+
|
26352
|
+
return editor.getBody();
|
26353
|
+
}
|
26354
|
+
|
26355
|
+
function bindEventDelegate(editor, name) {
|
26356
|
+
var eventRootSelector = editor.settings.event_root, editorManager = editor.editorManager;
|
26357
|
+
var eventRootElm = editorManager.eventRootElm || getEventTarget(editor, name);
|
26358
|
+
|
26359
|
+
if (eventRootSelector) {
|
26360
|
+
if (!editorManager.rootEvents) {
|
26361
|
+
editorManager.rootEvents = {};
|
26362
|
+
|
26363
|
+
editorManager.on('RemoveEditor', function() {
|
26364
|
+
if (!editorManager.activeEditor) {
|
26365
|
+
DOM.unbind(eventRootElm);
|
26366
|
+
delete editorManager.rootEvents;
|
25768
26367
|
}
|
25769
|
-
}
|
25770
|
-
|
25771
|
-
|
25772
|
-
|
26368
|
+
});
|
26369
|
+
}
|
26370
|
+
|
26371
|
+
if (editorManager.rootEvents[name]) {
|
26372
|
+
return;
|
26373
|
+
}
|
26374
|
+
|
26375
|
+
if (eventRootElm == editor.getBody()) {
|
26376
|
+
eventRootElm = DOM.select(eventRootSelector)[0];
|
26377
|
+
editorManager.eventRootElm = eventRootElm;
|
26378
|
+
}
|
26379
|
+
|
26380
|
+
editorManager.rootEvents[name] = true;
|
26381
|
+
|
26382
|
+
DOM.bind(eventRootElm, name, function(e) {
|
26383
|
+
var target = e.target, editors = editorManager.editors, i = editors.length;
|
26384
|
+
|
26385
|
+
while (i--) {
|
26386
|
+
var body = editors[i].getBody();
|
26387
|
+
|
26388
|
+
if (body === target || DOM.isChildOf(target, body)) {
|
26389
|
+
if (!editors[i].hidden) {
|
26390
|
+
editors[i].fire(name, e);
|
25773
26391
|
}
|
25774
26392
|
}
|
25775
|
-
|
25776
|
-
self[bindingsName] = [];
|
25777
26393
|
}
|
25778
|
-
}
|
26394
|
+
});
|
26395
|
+
} else {
|
26396
|
+
editor.dom.bind(eventRootElm, name, function(e) {
|
26397
|
+
if (!editor.hidden) {
|
26398
|
+
editor.fire(name, e);
|
26399
|
+
}
|
26400
|
+
});
|
26401
|
+
}
|
26402
|
+
}
|
25779
26403
|
|
25780
|
-
|
26404
|
+
var EditorObservable = {
|
26405
|
+
bindPendingEventDelegates: function() {
|
26406
|
+
var self = this;
|
26407
|
+
|
26408
|
+
Tools.each(self._pendingNativeEvents, function(name) {
|
26409
|
+
bindEventDelegate(self, name);
|
26410
|
+
});
|
25781
26411
|
},
|
25782
26412
|
|
25783
|
-
|
25784
|
-
var
|
26413
|
+
toggleNativeEvent: function(name, state) {
|
26414
|
+
var self = this;
|
25785
26415
|
|
25786
|
-
|
26416
|
+
if (self.settings.readonly) {
|
26417
|
+
return;
|
26418
|
+
}
|
26419
|
+
|
26420
|
+
// Never bind focus/blur since the FocusManager fakes those
|
26421
|
+
if (name == "focus" || name == "blur") {
|
26422
|
+
return;
|
26423
|
+
}
|
25787
26424
|
|
25788
|
-
|
26425
|
+
if (state) {
|
26426
|
+
if (self.initialized) {
|
26427
|
+
bindEventDelegate(self, name);
|
26428
|
+
} else {
|
26429
|
+
if (!self._pendingNativeEvents) {
|
26430
|
+
self._pendingNativeEvents = [name];
|
26431
|
+
} else {
|
26432
|
+
self._pendingNativeEvents.push(name);
|
26433
|
+
}
|
26434
|
+
}
|
26435
|
+
} else if (self.initialized) {
|
26436
|
+
self.dom.unbind(getEventTarget(self, name), name);
|
26437
|
+
}
|
25789
26438
|
}
|
25790
26439
|
};
|
26440
|
+
|
26441
|
+
EditorObservable = Tools.extend({}, Observable, EditorObservable);
|
26442
|
+
|
26443
|
+
return EditorObservable;
|
25791
26444
|
});
|
25792
26445
|
|
25793
26446
|
// Included from: js/tinymce/classes/Shortcuts.js
|
@@ -25969,13 +26622,13 @@ define("tinymce/Editor", [
|
|
25969
26622
|
"tinymce/util/Quirks",
|
25970
26623
|
"tinymce/Env",
|
25971
26624
|
"tinymce/util/Tools",
|
25972
|
-
"tinymce/
|
26625
|
+
"tinymce/EditorObservable",
|
25973
26626
|
"tinymce/Shortcuts"
|
25974
26627
|
], function(
|
25975
26628
|
DOMUtils, AddOnManager, Node, DomSerializer, Serializer,
|
25976
26629
|
Selection, Formatter, UndoManager, EnterKey, ForceBlocks, EditorCommands,
|
25977
26630
|
URI, ScriptLoader, EventUtils, WindowManager,
|
25978
|
-
Schema, DomParser, Quirks, Env, Tools,
|
26631
|
+
Schema, DomParser, Quirks, Env, Tools, EditorObservable, Shortcuts
|
25979
26632
|
) {
|
25980
26633
|
// Shorten these names
|
25981
26634
|
var DOM = DOMUtils.DOM, ThemeManager = AddOnManager.ThemeManager, PluginManager = AddOnManager.PluginManager;
|
@@ -25984,20 +26637,6 @@ define("tinymce/Editor", [
|
|
25984
26637
|
var Event = EventUtils.Event;
|
25985
26638
|
var isGecko = Env.gecko, ie = Env.ie;
|
25986
26639
|
|
25987
|
-
function getEventTarget(editor, eventName) {
|
25988
|
-
if (eventName == 'selectionchange') {
|
25989
|
-
return editor.getDoc();
|
25990
|
-
}
|
25991
|
-
|
25992
|
-
// Need to bind mousedown/mouseup etc to document not body in iframe mode
|
25993
|
-
// Since the user might click on the HTML element not the BODY
|
25994
|
-
if (!editor.inline && /^mouse|click|contextmenu|drop/.test(eventName)) {
|
25995
|
-
return editor.getDoc();
|
25996
|
-
}
|
25997
|
-
|
25998
|
-
return editor.getBody();
|
25999
|
-
}
|
26000
|
-
|
26001
26640
|
/**
|
26002
26641
|
* Include documentation for all the events.
|
26003
26642
|
*
|
@@ -26627,12 +27266,10 @@ define("tinymce/Editor", [
|
|
26627
27266
|
|
26628
27267
|
DOM.removeClass(bodyEl, 'mce-content-body');
|
26629
27268
|
DOM.removeClass(bodyEl, 'mce-edit-focus');
|
26630
|
-
DOM.setAttrib(bodyEl, 'tabIndex', null);
|
26631
27269
|
DOM.setAttrib(bodyEl, 'contentEditable', null);
|
26632
27270
|
});
|
26633
27271
|
|
26634
27272
|
DOM.addClass(targetElm, 'mce-content-body');
|
26635
|
-
targetElm.tabIndex = -1;
|
26636
27273
|
self.contentDocument = doc = settings.content_document || document;
|
26637
27274
|
self.contentWindow = settings.content_window || window;
|
26638
27275
|
self.bodyElement = targetElm;
|
@@ -26699,7 +27336,7 @@ define("tinymce/Editor", [
|
|
26699
27336
|
self.parser = new DomParser(settings, self.schema);
|
26700
27337
|
|
26701
27338
|
// Convert src and href into data-mce-src, data-mce-href and data-mce-style
|
26702
|
-
self.parser.addAttributeFilter('src,href,style', function(nodes, name) {
|
27339
|
+
self.parser.addAttributeFilter('src,href,style,tabindex', function(nodes, name) {
|
26703
27340
|
var i = nodes.length, node, dom = self.dom, value, internalName;
|
26704
27341
|
|
26705
27342
|
while (i--) {
|
@@ -26711,6 +27348,9 @@ define("tinymce/Editor", [
|
|
26711
27348
|
if (!node.attributes.map[internalName]) {
|
26712
27349
|
if (name === "style") {
|
26713
27350
|
node.attr(internalName, dom.serializeStyle(dom.parseStyle(value), node.name));
|
27351
|
+
} else if (name === "tabindex") {
|
27352
|
+
node.attr(internalName, value);
|
27353
|
+
node.attr(name, null);
|
26714
27354
|
} else {
|
26715
27355
|
node.attr(internalName, self.convertURL(value, name, node.name));
|
26716
27356
|
}
|
@@ -26856,12 +27496,7 @@ define("tinymce/Editor", [
|
|
26856
27496
|
* }
|
26857
27497
|
*/
|
26858
27498
|
self.initialized = true;
|
26859
|
-
|
26860
|
-
each(self._pendingNativeEvents, function(name) {
|
26861
|
-
self.dom.bind(getEventTarget(self, name), name, function(e) {
|
26862
|
-
self.fire(e.type, e);
|
26863
|
-
});
|
26864
|
-
});
|
27499
|
+
self.bindPendingEventDelegates();
|
26865
27500
|
|
26866
27501
|
self.fire('init');
|
26867
27502
|
self.focus(true);
|
@@ -26939,8 +27574,13 @@ define("tinymce/Editor", [
|
|
26939
27574
|
body = self.getBody();
|
26940
27575
|
|
26941
27576
|
// Check for setActive since it doesn't scroll to the element
|
26942
|
-
if (body.setActive
|
26943
|
-
|
27577
|
+
if (body.setActive) {
|
27578
|
+
// IE 11 sometimes throws "Invalid function" then fallback to focus
|
27579
|
+
try {
|
27580
|
+
body.setActive();
|
27581
|
+
} catch (ex) {
|
27582
|
+
body.focus();
|
27583
|
+
}
|
26944
27584
|
} else {
|
26945
27585
|
body.focus();
|
26946
27586
|
}
|
@@ -27114,9 +27754,7 @@ define("tinymce/Editor", [
|
|
27114
27754
|
},
|
27115
27755
|
|
27116
27756
|
/**
|
27117
|
-
* Adds a button that later gets created by the
|
27118
|
-
* of adding buttons without the need to deal with the ControlManager directly. But it's also less
|
27119
|
-
* powerfull if you need more control use the ControlManagers factory methods instead.
|
27757
|
+
* Adds a button that later gets created by the theme in the editors toolbars.
|
27120
27758
|
*
|
27121
27759
|
* @method addButton
|
27122
27760
|
* @param {String} name Button name to add.
|
@@ -27158,7 +27796,9 @@ define("tinymce/Editor", [
|
|
27158
27796
|
},
|
27159
27797
|
|
27160
27798
|
/**
|
27161
|
-
* Adds a menu item to be used in the menus of the
|
27799
|
+
* Adds a menu item to be used in the menus of the theme. There might be multiple instances
|
27800
|
+
* of this menu item for example it might be used in the main menus of the theme but also in
|
27801
|
+
* the context menu so make sure that it's self contained and supports multiple instances.
|
27162
27802
|
*
|
27163
27803
|
* @method addMenuItem
|
27164
27804
|
* @param {String} name Menu item name to add.
|
@@ -27428,10 +28068,19 @@ define("tinymce/Editor", [
|
|
27428
28068
|
show: function() {
|
27429
28069
|
var self = this;
|
27430
28070
|
|
27431
|
-
|
27432
|
-
|
27433
|
-
|
27434
|
-
|
28071
|
+
if (self.hidden) {
|
28072
|
+
self.hidden = false;
|
28073
|
+
|
28074
|
+
if (self.inline) {
|
28075
|
+
self.getBody().contentEditable = true;
|
28076
|
+
} else {
|
28077
|
+
DOM.show(self.getContainer());
|
28078
|
+
DOM.hide(self.id);
|
28079
|
+
}
|
28080
|
+
|
28081
|
+
self.load();
|
28082
|
+
self.fire('show');
|
28083
|
+
}
|
27435
28084
|
},
|
27436
28085
|
|
27437
28086
|
/**
|
@@ -27442,18 +28091,31 @@ define("tinymce/Editor", [
|
|
27442
28091
|
hide: function() {
|
27443
28092
|
var self = this, doc = self.getDoc();
|
27444
28093
|
|
27445
|
-
|
27446
|
-
|
27447
|
-
|
27448
|
-
|
28094
|
+
if (!self.hidden) {
|
28095
|
+
self.hidden = true;
|
28096
|
+
|
28097
|
+
// Fixed bug where IE has a blinking cursor left from the editor
|
28098
|
+
if (ie && doc && !self.inline) {
|
28099
|
+
doc.execCommand('SelectAll');
|
28100
|
+
}
|
28101
|
+
|
28102
|
+
// We must save before we hide so Safari doesn't crash
|
28103
|
+
self.save();
|
27449
28104
|
|
27450
|
-
|
27451
|
-
|
28105
|
+
if (self.inline) {
|
28106
|
+
self.getBody().contentEditable = false;
|
27452
28107
|
|
27453
|
-
|
27454
|
-
|
27455
|
-
|
27456
|
-
|
28108
|
+
// Make sure the editor gets blurred
|
28109
|
+
if (self == self.editorManager.focusedEditor) {
|
28110
|
+
self.editorManager.focusedEditor = null;
|
28111
|
+
}
|
28112
|
+
} else {
|
28113
|
+
DOM.hide(self.getContainer());
|
28114
|
+
DOM.setStyle(self.id, 'display', self.orgDisplay);
|
28115
|
+
}
|
28116
|
+
|
28117
|
+
self.fire('hide');
|
28118
|
+
}
|
27457
28119
|
},
|
27458
28120
|
|
27459
28121
|
/**
|
@@ -27463,7 +28125,7 @@ define("tinymce/Editor", [
|
|
27463
28125
|
* @return {Boolean} True/false if the editor is hidden or not.
|
27464
28126
|
*/
|
27465
28127
|
isHidden: function() {
|
27466
|
-
return
|
28128
|
+
return !!this.hidden;
|
27467
28129
|
},
|
27468
28130
|
|
27469
28131
|
/**
|
@@ -27919,23 +28581,26 @@ define("tinymce/Editor", [
|
|
27919
28581
|
var self = this;
|
27920
28582
|
|
27921
28583
|
if (!self.removed) {
|
27922
|
-
self.
|
27923
|
-
self.
|
27924
|
-
self.removed = 1; // Cancels post remove event execution
|
28584
|
+
self.removed = 1;
|
28585
|
+
self.save();
|
27925
28586
|
|
27926
28587
|
// Remove any hidden input
|
27927
28588
|
if (self.hasHiddenInput) {
|
27928
28589
|
DOM.remove(self.getElement().nextSibling);
|
27929
28590
|
}
|
27930
28591
|
|
27931
|
-
|
27932
|
-
|
28592
|
+
if (!self.inline) {
|
28593
|
+
// IE 9 has a bug where the selection stops working if you place the
|
28594
|
+
// caret inside the editor then remove the iframe
|
28595
|
+
if (ie && ie < 10) {
|
28596
|
+
self.getDoc().execCommand('SelectAll', false, null);
|
28597
|
+
}
|
27933
28598
|
|
27934
|
-
|
28599
|
+
DOM.setStyle(self.id, 'display', self.orgDisplay);
|
28600
|
+
self.getBody().onload = null; // Prevent #6816
|
27935
28601
|
|
27936
|
-
|
27937
|
-
|
27938
|
-
if (!self.settings.content_editable) {
|
28602
|
+
// Don't clear the window or document if content editable
|
28603
|
+
// is enabled since other instances might still be present
|
27939
28604
|
Event.unbind(self.getWin());
|
27940
28605
|
Event.unbind(self.getDoc());
|
27941
28606
|
}
|
@@ -27944,40 +28609,14 @@ define("tinymce/Editor", [
|
|
27944
28609
|
Event.unbind(self.getBody());
|
27945
28610
|
Event.unbind(elm);
|
27946
28611
|
|
28612
|
+
self.fire('remove');
|
28613
|
+
|
27947
28614
|
self.editorManager.remove(self);
|
27948
28615
|
DOM.remove(elm);
|
27949
28616
|
self.destroy();
|
27950
28617
|
}
|
27951
28618
|
},
|
27952
28619
|
|
27953
|
-
bindNative: function(name) {
|
27954
|
-
var self = this;
|
27955
|
-
|
27956
|
-
if (self.settings.readonly) {
|
27957
|
-
return;
|
27958
|
-
}
|
27959
|
-
|
27960
|
-
if (self.initialized) {
|
27961
|
-
self.dom.bind(getEventTarget(self, name), name, function(e) {
|
27962
|
-
self.fire(name, e);
|
27963
|
-
});
|
27964
|
-
} else {
|
27965
|
-
if (!self._pendingNativeEvents) {
|
27966
|
-
self._pendingNativeEvents = [name];
|
27967
|
-
} else {
|
27968
|
-
self._pendingNativeEvents.push(name);
|
27969
|
-
}
|
27970
|
-
}
|
27971
|
-
},
|
27972
|
-
|
27973
|
-
unbindNative: function(name) {
|
27974
|
-
var self = this;
|
27975
|
-
|
27976
|
-
if (self.initialized) {
|
27977
|
-
self.dom.unbind(name);
|
27978
|
-
}
|
27979
|
-
},
|
27980
|
-
|
27981
28620
|
/**
|
27982
28621
|
* Destroys the editor instance by removing all events, element references or other resources
|
27983
28622
|
* that could leak memory. This method will be called automatically when the page is unloaded
|
@@ -28072,7 +28711,7 @@ define("tinymce/Editor", [
|
|
28072
28711
|
}
|
28073
28712
|
};
|
28074
28713
|
|
28075
|
-
extend(Editor.prototype,
|
28714
|
+
extend(Editor.prototype, EditorObservable);
|
28076
28715
|
|
28077
28716
|
return Editor;
|
28078
28717
|
});
|
@@ -28185,7 +28824,7 @@ define("tinymce/FocusManager", [
|
|
28185
28824
|
"tinymce/dom/DOMUtils",
|
28186
28825
|
"tinymce/Env"
|
28187
28826
|
], function(DOMUtils, Env) {
|
28188
|
-
var selectionChangeHandler, documentFocusInHandler, DOM = DOMUtils.DOM;
|
28827
|
+
var selectionChangeHandler, documentFocusInHandler, documentMouseUpHandler, DOM = DOMUtils.DOM;
|
28189
28828
|
|
28190
28829
|
/**
|
28191
28830
|
* Constructs a new focus manager instance.
|
@@ -28206,8 +28845,13 @@ define("tinymce/FocusManager", [
|
|
28206
28845
|
|
28207
28846
|
// We can't store a real range on IE 11 since it gets mutated so we need to use a bookmark object
|
28208
28847
|
// TODO: Move this to a separate range utils class since it's it's logic is present in Selection as well.
|
28209
|
-
function createBookmark(rng) {
|
28848
|
+
function createBookmark(dom, rng) {
|
28210
28849
|
if (rng && rng.startContainer) {
|
28850
|
+
// Verify that the range is within the root of the editor
|
28851
|
+
if (!dom.isChildOf(rng.startContainer, dom.getRoot()) || !dom.isChildOf(rng.endContainer, dom.getRoot())) {
|
28852
|
+
return;
|
28853
|
+
}
|
28854
|
+
|
28211
28855
|
return {
|
28212
28856
|
startContainer: rng.startContainer,
|
28213
28857
|
startOffset: rng.startOffset,
|
@@ -28237,44 +28881,12 @@ define("tinymce/FocusManager", [
|
|
28237
28881
|
return !!DOM.getParent(elm, FocusManager.isEditorUIElement);
|
28238
28882
|
}
|
28239
28883
|
|
28240
|
-
function isNodeInBodyOfEditor(node, editor) {
|
28241
|
-
var body = editor.getBody();
|
28242
|
-
|
28243
|
-
while (node) {
|
28244
|
-
if (node == body) {
|
28245
|
-
return true;
|
28246
|
-
}
|
28247
|
-
|
28248
|
-
node = node.parentNode;
|
28249
|
-
}
|
28250
|
-
}
|
28251
|
-
|
28252
28884
|
function registerEvents(e) {
|
28253
28885
|
var editor = e.editor;
|
28254
28886
|
|
28255
28887
|
editor.on('init', function() {
|
28256
|
-
//
|
28257
|
-
if (
|
28258
|
-
// Gets fired when the editor is about to be blurred but also when the selection
|
28259
|
-
// is moved into a table cell so we need to add the range as a pending range then
|
28260
|
-
// use that pending range on the blur event of the editor body
|
28261
|
-
editor.dom.bind(editor.getBody(), 'beforedeactivate', function() {
|
28262
|
-
try {
|
28263
|
-
editor.pendingRng = editor.selection.getRng();
|
28264
|
-
} catch (ex) {
|
28265
|
-
// IE throws "Unexcpected call to method or property access" some times so lets ignore it
|
28266
|
-
}
|
28267
|
-
});
|
28268
|
-
|
28269
|
-
// Set the pending range as the current last range if the blur event occurs
|
28270
|
-
editor.dom.bind(editor.getBody(), 'blur', function() {
|
28271
|
-
if (editor.pendingRng) {
|
28272
|
-
editor.lastRng = editor.pendingRng;
|
28273
|
-
editor.selection.lastFocusBookmark = createBookmark(editor.lastRng);
|
28274
|
-
editor.pendingRng = null;
|
28275
|
-
}
|
28276
|
-
});
|
28277
|
-
} else if (editor.inline || Env.ie > 10) {
|
28888
|
+
// Gecko/WebKit has ghost selections in iframes and IE only has one selection per browser tab
|
28889
|
+
if (editor.inline || Env.ie) {
|
28278
28890
|
// On other browsers take snapshot on nodechange in inline mode since they have Ghost selections for iframes
|
28279
28891
|
editor.on('nodechange keyup', function() {
|
28280
28892
|
var node = document.activeElement;
|
@@ -28284,7 +28896,7 @@ define("tinymce/FocusManager", [
|
|
28284
28896
|
node = editor.getBody();
|
28285
28897
|
}
|
28286
28898
|
|
28287
|
-
if (
|
28899
|
+
if (editor.dom.isChildOf(node, editor.getBody())) {
|
28288
28900
|
editor.lastRng = editor.selection.getRng();
|
28289
28901
|
}
|
28290
28902
|
});
|
@@ -28358,6 +28970,8 @@ define("tinymce/FocusManager", [
|
|
28358
28970
|
}, 0);
|
28359
28971
|
});
|
28360
28972
|
|
28973
|
+
// Check if focus is moved to an element outside the active editor by checking if the target node
|
28974
|
+
// isn't within the body of the activeEditor nor a UI element such as a dialog child control
|
28361
28975
|
if (!documentFocusInHandler) {
|
28362
28976
|
documentFocusInHandler = function(e) {
|
28363
28977
|
var activeEditor = editorManager.activeEditor;
|
@@ -28365,7 +28979,7 @@ define("tinymce/FocusManager", [
|
|
28365
28979
|
if (activeEditor && e.target.ownerDocument == document) {
|
28366
28980
|
// Check to make sure we have a valid selection
|
28367
28981
|
if (activeEditor.selection) {
|
28368
|
-
activeEditor.selection.lastFocusBookmark = createBookmark(activeEditor.lastRng);
|
28982
|
+
activeEditor.selection.lastFocusBookmark = createBookmark(activeEditor.dom, activeEditor.lastRng);
|
28369
28983
|
}
|
28370
28984
|
|
28371
28985
|
// Fire a blur event if the element isn't a UI element
|
@@ -28376,17 +28990,39 @@ define("tinymce/FocusManager", [
|
|
28376
28990
|
}
|
28377
28991
|
};
|
28378
28992
|
|
28379
|
-
// Check if focus is moved to an element outside the active editor by checking if the target node
|
28380
|
-
// isn't within the body of the activeEditor nor a UI element such as a dialog child control
|
28381
28993
|
DOM.bind(document, 'focusin', documentFocusInHandler);
|
28382
28994
|
}
|
28995
|
+
|
28996
|
+
// Handle edge case when user starts the selection inside the editor and releases
|
28997
|
+
// the mouse outside the editor producing a new selection. This weird workaround is needed since
|
28998
|
+
// Gecko doesn't have the "selectionchange" event we need to do this. Fixes: #6843
|
28999
|
+
if (editor.inline && !documentMouseUpHandler) {
|
29000
|
+
documentMouseUpHandler = function(e) {
|
29001
|
+
var activeEditor = editorManager.activeEditor;
|
29002
|
+
|
29003
|
+
if (activeEditor.inline && !activeEditor.dom.isChildOf(e.target, activeEditor.getBody())) {
|
29004
|
+
var rng = activeEditor.selection.getRng();
|
29005
|
+
|
29006
|
+
if (!rng.collapsed) {
|
29007
|
+
activeEditor.lastRng = rng;
|
29008
|
+
}
|
29009
|
+
}
|
29010
|
+
};
|
29011
|
+
|
29012
|
+
DOM.bind(document, 'mouseup', documentMouseUpHandler);
|
29013
|
+
}
|
28383
29014
|
}
|
28384
29015
|
|
28385
|
-
function unregisterDocumentEvents() {
|
29016
|
+
function unregisterDocumentEvents(e) {
|
29017
|
+
if (editorManager.focusedEditor == e.editor) {
|
29018
|
+
editorManager.focusedEditor = null;
|
29019
|
+
}
|
29020
|
+
|
28386
29021
|
if (!editorManager.activeEditor) {
|
28387
29022
|
DOM.unbind(document, 'selectionchange', selectionChangeHandler);
|
28388
29023
|
DOM.unbind(document, 'focusin', documentFocusInHandler);
|
28389
|
-
|
29024
|
+
DOM.unbind(document, 'mouseup', documentMouseUpHandler);
|
29025
|
+
selectionChangeHandler = documentFocusInHandler = documentMouseUpHandler = null;
|
28390
29026
|
}
|
28391
29027
|
}
|
28392
29028
|
|
@@ -28402,7 +29038,8 @@ define("tinymce/FocusManager", [
|
|
28402
29038
|
* @return {Boolean} True/false state if the element is part of the UI or not.
|
28403
29039
|
*/
|
28404
29040
|
FocusManager.isEditorUIElement = function(elm) {
|
28405
|
-
|
29041
|
+
// Needs to be converted to string since svg can have focus: #6776
|
29042
|
+
return elm.className.toString().indexOf('mce-') !== -1;
|
28406
29043
|
};
|
28407
29044
|
|
28408
29045
|
return FocusManager;
|
@@ -28442,9 +29079,46 @@ define("tinymce/EditorManager", [
|
|
28442
29079
|
], function(Editor, DOMUtils, URI, Env, Tools, Observable, I18n, FocusManager) {
|
28443
29080
|
var DOM = DOMUtils.DOM;
|
28444
29081
|
var explode = Tools.explode, each = Tools.each, extend = Tools.extend;
|
28445
|
-
var instanceCounter = 0, beforeUnloadDelegate;
|
29082
|
+
var instanceCounter = 0, beforeUnloadDelegate, EditorManager;
|
29083
|
+
|
29084
|
+
function removeEditorFromList(editor) {
|
29085
|
+
var editors = EditorManager.editors, removedFromList;
|
29086
|
+
|
29087
|
+
delete editors[editor.id];
|
29088
|
+
|
29089
|
+
for (var i = 0; i < editors.length; i++) {
|
29090
|
+
if (editors[i] == editor) {
|
29091
|
+
editors.splice(i, 1);
|
29092
|
+
removedFromList = true;
|
29093
|
+
break;
|
29094
|
+
}
|
29095
|
+
}
|
29096
|
+
|
29097
|
+
// Select another editor since the active one was removed
|
29098
|
+
if (EditorManager.activeEditor == editor) {
|
29099
|
+
EditorManager.activeEditor = editors[0];
|
29100
|
+
}
|
29101
|
+
|
29102
|
+
// Clear focusedEditor if necessary, so that we don't try to blur the destroyed editor
|
29103
|
+
if (EditorManager.focusedEditor == editor) {
|
29104
|
+
EditorManager.focusedEditor = null;
|
29105
|
+
}
|
29106
|
+
|
29107
|
+
return removedFromList;
|
29108
|
+
}
|
28446
29109
|
|
28447
|
-
|
29110
|
+
function purgeDestroyedEditor(editor) {
|
29111
|
+
// User has manually destroyed the editor lets clean up the mess
|
29112
|
+
if (editor && !(editor.getContainer() || editor.getBody()).parentNode) {
|
29113
|
+
removeEditorFromList(editor);
|
29114
|
+
editor.destroy(true);
|
29115
|
+
editor = null;
|
29116
|
+
}
|
29117
|
+
|
29118
|
+
return editor;
|
29119
|
+
}
|
29120
|
+
|
29121
|
+
EditorManager = {
|
28448
29122
|
/**
|
28449
29123
|
* Major version of TinyMCE build.
|
28450
29124
|
*
|
@@ -28459,7 +29133,7 @@ define("tinymce/EditorManager", [
|
|
28459
29133
|
* @property minorVersion
|
28460
29134
|
* @type String
|
28461
29135
|
*/
|
28462
|
-
minorVersion : '0.
|
29136
|
+
minorVersion : '0.26',
|
28463
29137
|
|
28464
29138
|
/**
|
28465
29139
|
* Release date of TinyMCE build.
|
@@ -28467,7 +29141,7 @@ define("tinymce/EditorManager", [
|
|
28467
29141
|
* @property releaseDate
|
28468
29142
|
* @type String
|
28469
29143
|
*/
|
28470
|
-
releaseDate: '2014-
|
29144
|
+
releaseDate: '2014-05-06',
|
28471
29145
|
|
28472
29146
|
/**
|
28473
29147
|
* Collection of editor instances.
|
@@ -28500,7 +29174,7 @@ define("tinymce/EditorManager", [
|
|
28500
29174
|
activeEditor: null,
|
28501
29175
|
|
28502
29176
|
setup: function() {
|
28503
|
-
var self = this, baseURL, documentBaseURL, suffix = "", preInit;
|
29177
|
+
var self = this, baseURL, documentBaseURL, suffix = "", preInit, src;
|
28504
29178
|
|
28505
29179
|
// Get base URL for the current document
|
28506
29180
|
documentBaseURL = document.location.href.replace(/[\?#].*$/, '').replace(/[\/\\][^\/]+$/, '');
|
@@ -28517,7 +29191,7 @@ define("tinymce/EditorManager", [
|
|
28517
29191
|
// Get base where the tinymce script is located
|
28518
29192
|
var scripts = document.getElementsByTagName('script');
|
28519
29193
|
for (var i = 0; i < scripts.length; i++) {
|
28520
|
-
|
29194
|
+
src = scripts[i].src;
|
28521
29195
|
|
28522
29196
|
// Script types supported:
|
28523
29197
|
// tinymce.js tinymce.min.js tinymce.dev.js
|
@@ -28532,6 +29206,18 @@ define("tinymce/EditorManager", [
|
|
28532
29206
|
break;
|
28533
29207
|
}
|
28534
29208
|
}
|
29209
|
+
|
29210
|
+
// We didn't find any baseURL by looking at the script elements
|
29211
|
+
// Try to use the document.currentScript as a fallback
|
29212
|
+
if (!baseURL && document.currentScript) {
|
29213
|
+
src = document.currentScript.src;
|
29214
|
+
|
29215
|
+
if (src.indexOf('.min') != -1) {
|
29216
|
+
suffix = '.min';
|
29217
|
+
}
|
29218
|
+
|
29219
|
+
baseURL = src.substring(0, src.lastIndexOf('/'));
|
29220
|
+
}
|
28535
29221
|
}
|
28536
29222
|
|
28537
29223
|
/**
|
@@ -28608,6 +29294,14 @@ define("tinymce/EditorManager", [
|
|
28608
29294
|
return id;
|
28609
29295
|
}
|
28610
29296
|
|
29297
|
+
function createEditor(id, settings) {
|
29298
|
+
if (!purgeDestroyedEditor(self.get(id))) {
|
29299
|
+
var editor = new Editor(id, settings, self);
|
29300
|
+
editors.push(editor);
|
29301
|
+
editor.render();
|
29302
|
+
}
|
29303
|
+
}
|
29304
|
+
|
28611
29305
|
function execCallback(se, n, s) {
|
28612
29306
|
var f = se[n];
|
28613
29307
|
|
@@ -28633,9 +29327,7 @@ define("tinymce/EditorManager", [
|
|
28633
29327
|
// Process type specific selector
|
28634
29328
|
each(settings.types, function(type) {
|
28635
29329
|
each(DOM.select(type.selector), function(elm) {
|
28636
|
-
|
28637
|
-
editors.push(editor);
|
28638
|
-
editor.render(1);
|
29330
|
+
createEditor(createId(elm), extend({}, settings, type));
|
28639
29331
|
});
|
28640
29332
|
});
|
28641
29333
|
|
@@ -28643,9 +29335,7 @@ define("tinymce/EditorManager", [
|
|
28643
29335
|
} else if (settings.selector) {
|
28644
29336
|
// Process global selector
|
28645
29337
|
each(DOM.select(settings.selector), function(elm) {
|
28646
|
-
|
28647
|
-
editors.push(editor);
|
28648
|
-
editor.render(1);
|
29338
|
+
createEditor(createId(elm), settings);
|
28649
29339
|
});
|
28650
29340
|
|
28651
29341
|
return;
|
@@ -28656,22 +29346,19 @@ define("tinymce/EditorManager", [
|
|
28656
29346
|
case "exact":
|
28657
29347
|
l = settings.elements || '';
|
28658
29348
|
|
28659
|
-
if(l.length > 0) {
|
29349
|
+
if (l.length > 0) {
|
28660
29350
|
each(explode(l), function(v) {
|
28661
29351
|
if (DOM.get(v)) {
|
28662
29352
|
editor = new Editor(v, settings, self);
|
28663
29353
|
editors.push(editor);
|
28664
|
-
editor.render(
|
29354
|
+
editor.render();
|
28665
29355
|
} else {
|
28666
29356
|
each(document.forms, function(f) {
|
28667
29357
|
each(f.elements, function(e) {
|
28668
29358
|
if (e.name === v) {
|
28669
29359
|
v = 'mce_editor_' + instanceCounter++;
|
28670
29360
|
DOM.setAttrib(e, 'id', v);
|
28671
|
-
|
28672
|
-
editor = new Editor(v, settings, self);
|
28673
|
-
editors.push(editor);
|
28674
|
-
editor.render(1);
|
29361
|
+
createEditor(v, settings);
|
28675
29362
|
}
|
28676
29363
|
});
|
28677
29364
|
});
|
@@ -28688,9 +29375,7 @@ define("tinymce/EditorManager", [
|
|
28688
29375
|
}
|
28689
29376
|
|
28690
29377
|
if (!settings.editor_selector || hasClass(elm, settings.editor_selector)) {
|
28691
|
-
|
28692
|
-
editors.push(editor);
|
28693
|
-
editor.render(true);
|
29378
|
+
createEditor(createId(elm), settings);
|
28694
29379
|
}
|
28695
29380
|
});
|
28696
29381
|
break;
|
@@ -28748,11 +29433,11 @@ define("tinymce/EditorManager", [
|
|
28748
29433
|
* });
|
28749
29434
|
*/
|
28750
29435
|
get: function(id) {
|
28751
|
-
if (
|
29436
|
+
if (!arguments.length) {
|
28752
29437
|
return this.editors;
|
28753
29438
|
}
|
28754
29439
|
|
28755
|
-
return this.editors[id];
|
29440
|
+
return id in this.editors ? this.editors[id] : null;
|
28756
29441
|
},
|
28757
29442
|
|
28758
29443
|
/**
|
@@ -28823,7 +29508,7 @@ define("tinymce/EditorManager", [
|
|
28823
29508
|
* @return {tinymce.Editor} The editor that got passed in will be return if it was found otherwise null.
|
28824
29509
|
*/
|
28825
29510
|
remove: function(selector) {
|
28826
|
-
var self = this, i, editors = self.editors, editor
|
29511
|
+
var self = this, i, editors = self.editors, editor;
|
28827
29512
|
|
28828
29513
|
// Remove all editors
|
28829
29514
|
if (!selector) {
|
@@ -28853,28 +29538,13 @@ define("tinymce/EditorManager", [
|
|
28853
29538
|
return null;
|
28854
29539
|
}
|
28855
29540
|
|
28856
|
-
delete editors[editor.id];
|
28857
|
-
|
28858
|
-
for (i = 0; i < editors.length; i++) {
|
28859
|
-
if (editors[i] == editor) {
|
28860
|
-
editors.splice(i, 1);
|
28861
|
-
removedFromList = true;
|
28862
|
-
break;
|
28863
|
-
}
|
28864
|
-
}
|
28865
|
-
|
28866
|
-
// Select another editor since the active one was removed
|
28867
|
-
if (self.activeEditor == editor) {
|
28868
|
-
self.activeEditor = editors[0];
|
28869
|
-
}
|
28870
|
-
|
28871
29541
|
/**
|
28872
29542
|
* Fires when an editor is removed from EditorManager collection.
|
28873
29543
|
*
|
28874
29544
|
* @event RemoveEditor
|
28875
29545
|
* @param {Object} e Event arguments.
|
28876
29546
|
*/
|
28877
|
-
if (
|
29547
|
+
if (removeEditorFromList(editor)) {
|
28878
29548
|
self.fire('RemoveEditor', {editor: editor});
|
28879
29549
|
}
|
28880
29550
|
|
@@ -30029,6 +30699,7 @@ define("tinymce/ui/Widget", [
|
|
30029
30699
|
var self = this;
|
30030
30700
|
|
30031
30701
|
self._super(settings);
|
30702
|
+
settings = self.settings;
|
30032
30703
|
self.canFocus = true;
|
30033
30704
|
|
30034
30705
|
if (settings.tooltip && Widget.tooltips !== false) {
|
@@ -30263,6 +30934,26 @@ define("tinymce/ui/Button", [
|
|
30263
30934
|
this._super();
|
30264
30935
|
},
|
30265
30936
|
|
30937
|
+
/**
|
30938
|
+
* Sets/gets the current button text.
|
30939
|
+
*
|
30940
|
+
* @method text
|
30941
|
+
* @param {String} [text] New button text.
|
30942
|
+
* @return {String|tinymce.ui.Button} Current text or current Button instance.
|
30943
|
+
*/
|
30944
|
+
text: function(text) {
|
30945
|
+
var self = this;
|
30946
|
+
|
30947
|
+
if (self._rendered) {
|
30948
|
+
var textNode = self.getEl().lastChild.lastChild;
|
30949
|
+
if (textNode) {
|
30950
|
+
textNode.data = self.translate(text);
|
30951
|
+
}
|
30952
|
+
}
|
30953
|
+
|
30954
|
+
return self._super(text);
|
30955
|
+
},
|
30956
|
+
|
30266
30957
|
/**
|
30267
30958
|
* Renders the control as a HTML string.
|
30268
30959
|
*
|
@@ -30271,11 +30962,20 @@ define("tinymce/ui/Button", [
|
|
30271
30962
|
*/
|
30272
30963
|
renderHtml: function() {
|
30273
30964
|
var self = this, id = self._id, prefix = self.classPrefix;
|
30274
|
-
var icon = self.settings.icon, image
|
30965
|
+
var icon = self.settings.icon, image;
|
30275
30966
|
|
30276
|
-
|
30967
|
+
image = self.settings.image;
|
30968
|
+
if (image) {
|
30277
30969
|
icon = 'none';
|
30278
|
-
|
30970
|
+
|
30971
|
+
// Support for [high dpi, low dpi] image sources
|
30972
|
+
if (typeof image != "string") {
|
30973
|
+
image = window.getSelection ? image[0] : image[1];
|
30974
|
+
}
|
30975
|
+
|
30976
|
+
image = ' style="background-image: url(\'' + image + '\')"';
|
30977
|
+
} else {
|
30978
|
+
image = '';
|
30279
30979
|
}
|
30280
30980
|
|
30281
30981
|
icon = self.settings.icon ? prefix + 'ico ' + prefix + 'i-' + icon : '';
|
@@ -30658,12 +31358,12 @@ define("tinymce/ui/ColorButton", [
|
|
30658
31358
|
|
30659
31359
|
return (
|
30660
31360
|
'<div id="' + id + '" class="' + self.classes() + '" role="button" tabindex="-1" aria-haspopup="true">' +
|
30661
|
-
'<button role="presentation" hidefocus type="button" tabindex="-1">' +
|
31361
|
+
'<button role="presentation" hidefocus="1" type="button" tabindex="-1">' +
|
30662
31362
|
(icon ? '<i class="' + icon + '"' + image + '></i>' : '') +
|
30663
31363
|
'<span id="' + id + '-preview" class="' + prefix + 'preview"></span>' +
|
30664
31364
|
(self._text ? (icon ? ' ' : '') + (self._text) : '') +
|
30665
31365
|
'</button>' +
|
30666
|
-
'<button type="button" class="' + prefix + 'open" hidefocus tabindex="-1">' +
|
31366
|
+
'<button type="button" class="' + prefix + 'open" hidefocus="1" tabindex="-1">' +
|
30667
31367
|
' <i class="' + prefix + 'caret"></i>' +
|
30668
31368
|
'</button>' +
|
30669
31369
|
'</div>'
|
@@ -30845,7 +31545,7 @@ define("tinymce/ui/ComboBox", [
|
|
30845
31545
|
});
|
30846
31546
|
|
30847
31547
|
self.on('focusin', function(e) {
|
30848
|
-
if (e.target.tagName == 'INPUT') {
|
31548
|
+
if (e.target.tagName.toUpperCase() == 'INPUT') {
|
30849
31549
|
self.menu.hide();
|
30850
31550
|
}
|
30851
31551
|
});
|
@@ -31011,7 +31711,7 @@ define("tinymce/ui/ComboBox", [
|
|
31011
31711
|
if (icon || text) {
|
31012
31712
|
openBtnHtml = (
|
31013
31713
|
'<div id="' + id + '-open" class="' + prefix + 'btn ' + prefix + 'open" tabIndex="-1" role="button">' +
|
31014
|
-
'<button id="' + id + '-action" type="button" hidefocus tabindex="-1">' +
|
31714
|
+
'<button id="' + id + '-action" type="button" hidefocus="1" tabindex="-1">' +
|
31015
31715
|
(icon != 'caret' ? '<i class="' + icon + '"></i>' : '<i class="' + prefix + 'caret"></i>') +
|
31016
31716
|
(text ? (icon ? ' ' : '') + text : '') +
|
31017
31717
|
'</button>' +
|
@@ -31024,7 +31724,7 @@ define("tinymce/ui/ComboBox", [
|
|
31024
31724
|
return (
|
31025
31725
|
'<div id="' + id + '" class="' + self.classes() + '">' +
|
31026
31726
|
'<input id="' + id + '-inp" class="' + prefix + 'textbox ' + prefix + 'placeholder" value="' +
|
31027
|
-
value + '" hidefocus="
|
31727
|
+
value + '" hidefocus="1"' + extraAttrs + ' />' +
|
31028
31728
|
openBtnHtml +
|
31029
31729
|
'</div>'
|
31030
31730
|
);
|
@@ -31167,7 +31867,7 @@ define("tinymce/ui/Path", [
|
|
31167
31867
|
}
|
31168
31868
|
|
31169
31869
|
if (!html) {
|
31170
|
-
html = '<div class="' + prefix + 'path-item"
|
31870
|
+
html = '<div class="' + prefix + 'path-item">\u00a0</div>';
|
31171
31871
|
}
|
31172
31872
|
|
31173
31873
|
return html;
|
@@ -31308,7 +32008,7 @@ define("tinymce/ui/FormItem", [
|
|
31308
32008
|
layout.preRender(self);
|
31309
32009
|
|
31310
32010
|
return (
|
31311
|
-
'<div id="' + self._id + '" class="' + self.classes() + '"
|
32011
|
+
'<div id="' + self._id + '" class="' + self.classes() + '" hidefocus="1" tabindex="-1">' +
|
31312
32012
|
(self.settings.title ? ('<div id="' + self._id + '-title" class="' + prefix + 'title">' +
|
31313
32013
|
self.settings.title + '</div>') : '') +
|
31314
32014
|
'<div id="' + self._id + '-body" class="' + self.classes('body') + '">' +
|
@@ -31527,7 +32227,7 @@ define("tinymce/ui/FieldSet", [
|
|
31527
32227
|
layout.preRender(self);
|
31528
32228
|
|
31529
32229
|
return (
|
31530
|
-
'<fieldset id="' + self._id + '" class="' + self.classes() + '"
|
32230
|
+
'<fieldset id="' + self._id + '" class="' + self.classes() + '" hidefocus="1" tabindex="-1">' +
|
31531
32231
|
(self.settings.title ? ('<legend id="' + self._id + '-title" class="' + prefix + 'fieldset-title">' +
|
31532
32232
|
self.settings.title + '</legend>') : '') +
|
31533
32233
|
'<div id="' + self._id + '-body" class="' + self.classes('body') + '">' +
|
@@ -31985,127 +32685,6 @@ define("tinymce/ui/FormatControls", [
|
|
31985
32685
|
function registerControls(editor) {
|
31986
32686
|
var formatMenu;
|
31987
32687
|
|
31988
|
-
// Generates a preview for a format
|
31989
|
-
function getPreviewCss(format) {
|
31990
|
-
var name, previewElm, dom = editor.dom;
|
31991
|
-
var previewCss = '', parentFontSize, previewStyles;
|
31992
|
-
|
31993
|
-
previewStyles = editor.settings.preview_styles;
|
31994
|
-
|
31995
|
-
// No preview forced
|
31996
|
-
if (previewStyles === false) {
|
31997
|
-
return '';
|
31998
|
-
}
|
31999
|
-
|
32000
|
-
// Default preview
|
32001
|
-
if (!previewStyles) {
|
32002
|
-
previewStyles = 'font-family font-size font-weight font-style text-decoration ' +
|
32003
|
-
'text-transform color background-color border border-radius outline text-shadow';
|
32004
|
-
}
|
32005
|
-
|
32006
|
-
// Removes any variables since these can't be previewed
|
32007
|
-
function removeVars(val) {
|
32008
|
-
return val.replace(/%(\w+)/g, '');
|
32009
|
-
}
|
32010
|
-
|
32011
|
-
// Create block/inline element to use for preview
|
32012
|
-
format = editor.formatter.get(format);
|
32013
|
-
if (!format) {
|
32014
|
-
return;
|
32015
|
-
}
|
32016
|
-
|
32017
|
-
format = format[0];
|
32018
|
-
name = format.block || format.inline || 'span';
|
32019
|
-
previewElm = dom.create(name);
|
32020
|
-
|
32021
|
-
// Add format styles to preview element
|
32022
|
-
each(format.styles, function(value, name) {
|
32023
|
-
value = removeVars(value);
|
32024
|
-
|
32025
|
-
if (value) {
|
32026
|
-
dom.setStyle(previewElm, name, value);
|
32027
|
-
}
|
32028
|
-
});
|
32029
|
-
|
32030
|
-
// Add attributes to preview element
|
32031
|
-
each(format.attributes, function(value, name) {
|
32032
|
-
value = removeVars(value);
|
32033
|
-
|
32034
|
-
if (value) {
|
32035
|
-
dom.setAttrib(previewElm, name, value);
|
32036
|
-
}
|
32037
|
-
});
|
32038
|
-
|
32039
|
-
// Add classes to preview element
|
32040
|
-
each(format.classes, function(value) {
|
32041
|
-
value = removeVars(value);
|
32042
|
-
|
32043
|
-
if (!dom.hasClass(previewElm, value)) {
|
32044
|
-
dom.addClass(previewElm, value);
|
32045
|
-
}
|
32046
|
-
});
|
32047
|
-
|
32048
|
-
editor.fire('PreviewFormats');
|
32049
|
-
|
32050
|
-
// Add the previewElm outside the visual area
|
32051
|
-
dom.setStyles(previewElm, {position: 'absolute', left: -0xFFFF});
|
32052
|
-
editor.getBody().appendChild(previewElm);
|
32053
|
-
|
32054
|
-
// Get parent container font size so we can compute px values out of em/% for older IE:s
|
32055
|
-
parentFontSize = dom.getStyle(editor.getBody(), 'fontSize', true);
|
32056
|
-
parentFontSize = /px$/.test(parentFontSize) ? parseInt(parentFontSize, 10) : 0;
|
32057
|
-
|
32058
|
-
each(previewStyles.split(' '), function(name) {
|
32059
|
-
var value = dom.getStyle(previewElm, name, true);
|
32060
|
-
|
32061
|
-
// If background is transparent then check if the body has a background color we can use
|
32062
|
-
if (name == 'background-color' && /transparent|rgba\s*\([^)]+,\s*0\)/.test(value)) {
|
32063
|
-
value = dom.getStyle(editor.getBody(), name, true);
|
32064
|
-
|
32065
|
-
// Ignore white since it's the default color, not the nicest fix
|
32066
|
-
// TODO: Fix this by detecting runtime style
|
32067
|
-
if (dom.toHex(value).toLowerCase() == '#ffffff') {
|
32068
|
-
return;
|
32069
|
-
}
|
32070
|
-
}
|
32071
|
-
|
32072
|
-
if (name == 'color') {
|
32073
|
-
// Ignore black since it's the default color, not the nicest fix
|
32074
|
-
// TODO: Fix this by detecting runtime style
|
32075
|
-
if (dom.toHex(value).toLowerCase() == '#000000') {
|
32076
|
-
return;
|
32077
|
-
}
|
32078
|
-
}
|
32079
|
-
|
32080
|
-
// Old IE won't calculate the font size so we need to do that manually
|
32081
|
-
if (name == 'font-size') {
|
32082
|
-
if (/em|%$/.test(value)) {
|
32083
|
-
if (parentFontSize === 0) {
|
32084
|
-
return;
|
32085
|
-
}
|
32086
|
-
|
32087
|
-
// Convert font size from em/% to px
|
32088
|
-
value = parseFloat(value, 10) / (/%$/.test(value) ? 100 : 1);
|
32089
|
-
value = (value * parentFontSize) + 'px';
|
32090
|
-
}
|
32091
|
-
}
|
32092
|
-
|
32093
|
-
if (name == "border" && value) {
|
32094
|
-
previewCss += 'padding:0 2px;';
|
32095
|
-
}
|
32096
|
-
|
32097
|
-
previewCss += name + ':' + value + ';';
|
32098
|
-
});
|
32099
|
-
|
32100
|
-
editor.fire('AfterPreviewFormats');
|
32101
|
-
|
32102
|
-
//previewCss += 'line-height:normal';
|
32103
|
-
|
32104
|
-
dom.remove(previewElm);
|
32105
|
-
|
32106
|
-
return previewCss;
|
32107
|
-
}
|
32108
|
-
|
32109
32688
|
function createListBoxChangeHandler(items, formatName) {
|
32110
32689
|
return function() {
|
32111
32690
|
var self = this;
|
@@ -32142,7 +32721,7 @@ define("tinymce/ui/FormatControls", [
|
|
32142
32721
|
}
|
32143
32722
|
|
32144
32723
|
function createFormats(formats) {
|
32145
|
-
formats = formats.split(';');
|
32724
|
+
formats = formats.replace(/;$/, '').split(';');
|
32146
32725
|
|
32147
32726
|
var i = formats.length;
|
32148
32727
|
while (i--) {
|
@@ -32156,13 +32735,13 @@ define("tinymce/ui/FormatControls", [
|
|
32156
32735
|
var count = 0, newFormats = [];
|
32157
32736
|
|
32158
32737
|
var defaultStyleFormats = [
|
32159
|
-
{title: '
|
32160
|
-
{title: '
|
32161
|
-
{title: '
|
32162
|
-
{title: '
|
32163
|
-
{title: '
|
32164
|
-
{title: '
|
32165
|
-
{title: '
|
32738
|
+
{title: 'Headings', items: [
|
32739
|
+
{title: 'Heading 1', format: 'h1'},
|
32740
|
+
{title: 'Heading 2', format: 'h2'},
|
32741
|
+
{title: 'Heading 3', format: 'h3'},
|
32742
|
+
{title: 'Heading 4', format: 'h4'},
|
32743
|
+
{title: 'Heading 5', format: 'h5'},
|
32744
|
+
{title: 'Heading 6', format: 'h6'}
|
32166
32745
|
]},
|
32167
32746
|
|
32168
32747
|
{title: 'Inline', items: [
|
@@ -32255,7 +32834,7 @@ define("tinymce/ui/FormatControls", [
|
|
32255
32834
|
|
32256
32835
|
textStyle: function() {
|
32257
32836
|
if (this.settings.format) {
|
32258
|
-
return
|
32837
|
+
return editor.formatter.getCssText(this.settings.format);
|
32259
32838
|
}
|
32260
32839
|
},
|
32261
32840
|
|
@@ -32492,12 +33071,12 @@ define("tinymce/ui/FormatControls", [
|
|
32492
33071
|
'Paragraph=p;' +
|
32493
33072
|
'Address=address;' +
|
32494
33073
|
'Pre=pre;' +
|
32495
|
-
'
|
32496
|
-
'
|
32497
|
-
'
|
32498
|
-
'
|
32499
|
-
'
|
32500
|
-
'
|
33074
|
+
'Heading 1=h1;' +
|
33075
|
+
'Heading 2=h2;' +
|
33076
|
+
'Heading 3=h3;' +
|
33077
|
+
'Heading 4=h4;' +
|
33078
|
+
'Heading 5=h5;' +
|
33079
|
+
'Heading 6=h6'
|
32501
33080
|
);
|
32502
33081
|
|
32503
33082
|
each(blocks, function(block) {
|
@@ -32505,7 +33084,7 @@ define("tinymce/ui/FormatControls", [
|
|
32505
33084
|
text: block[0],
|
32506
33085
|
value: block[1],
|
32507
33086
|
textStyle: function() {
|
32508
|
-
return
|
33087
|
+
return editor.formatter.getCssText(block[1]);
|
32509
33088
|
}
|
32510
33089
|
});
|
32511
33090
|
});
|
@@ -32865,6 +33444,7 @@ define("tinymce/ui/Iframe", [
|
|
32865
33444
|
self.addClass('iframe');
|
32866
33445
|
self.canFocus = false;
|
32867
33446
|
|
33447
|
+
/*eslint no-script-url:0 */
|
32868
33448
|
return (
|
32869
33449
|
'<iframe id="' + self._id + '" class="' + self.classes() + '" tabindex="-1" src="' +
|
32870
33450
|
(self.settings.url || "javascript:\'\'") + '" frameborder="0"></iframe>'
|
@@ -33586,7 +34166,7 @@ define("tinymce/ui/MenuItem", [
|
|
33586
34166
|
e.preventDefault();
|
33587
34167
|
});
|
33588
34168
|
|
33589
|
-
if (settings.menu) {
|
34169
|
+
if (settings.menu && !settings.ariaHideMenu) {
|
33590
34170
|
self.aria('haspopup', true);
|
33591
34171
|
}
|
33592
34172
|
},
|
@@ -33730,7 +34310,7 @@ define("tinymce/ui/MenuItem", [
|
|
33730
34310
|
|
33731
34311
|
return (
|
33732
34312
|
'<div id="' + id + '" class="' + self.classes() + '" tabindex="-1">' +
|
33733
|
-
(text !== '-' ? '<i class="' + icon + '"' + image + '></i
|
34313
|
+
(text !== '-' ? '<i class="' + icon + '"' + image + '></i>\u00a0' : '') +
|
33734
34314
|
(text !== '-' ? '<span id="' + id + '-text" class="' + prefix + 'text">' + text + '</span>' : '') +
|
33735
34315
|
(shortcut ? '<div id="' + id + '-shortcut" class="' + prefix + 'menu-shortcut">' + shortcut + '</div>' : '') +
|
33736
34316
|
(settings.menu ? '<div class="' + prefix + 'caret"></div>' : '') +
|
@@ -34184,11 +34764,11 @@ define("tinymce/ui/SplitButton", [
|
|
34184
34764
|
|
34185
34765
|
return (
|
34186
34766
|
'<div id="' + id + '" class="' + self.classes() + '" role="button" tabindex="-1">' +
|
34187
|
-
'<button type="button" hidefocus tabindex="-1">' +
|
34767
|
+
'<button type="button" hidefocus="1" tabindex="-1">' +
|
34188
34768
|
(icon ? '<i class="' + icon + '"></i>' : '') +
|
34189
34769
|
(self._text ? (icon ? ' ' : '') + self._text : '') +
|
34190
34770
|
'</button>' +
|
34191
|
-
'<button type="button" class="' + prefix + 'open" hidefocus tabindex="-1">' +
|
34771
|
+
'<button type="button" class="' + prefix + 'open" hidefocus="1" tabindex="-1">' +
|
34192
34772
|
//(icon ? '<i class="' + icon + '"></i>' : '') +
|
34193
34773
|
(self._menuBtnText ? (icon ? '\u00a0' : '') + self._menuBtnText : '') +
|
34194
34774
|
' <i class="' + prefix + 'caret"></i>' +
|
@@ -34356,7 +34936,7 @@ define("tinymce/ui/TabPanel", [
|
|
34356
34936
|
});
|
34357
34937
|
|
34358
34938
|
return (
|
34359
|
-
'<div id="' + self._id + '" class="' + self.classes() + '"
|
34939
|
+
'<div id="' + self._id + '" class="' + self.classes() + '" hidefocus="1" tabindex="-1">' +
|
34360
34940
|
'<div id="' + self._id + '-head" class="' + prefix + 'tabs" role="tablist">' +
|
34361
34941
|
tabsHtml +
|
34362
34942
|
'</div>' +
|
@@ -34632,12 +35212,12 @@ define("tinymce/ui/TextBox", [
|
|
34632
35212
|
return (
|
34633
35213
|
'<textarea id="' + id + '" class="' + self.classes() + '" ' +
|
34634
35214
|
(settings.rows ? ' rows="' + settings.rows + '"' : '') +
|
34635
|
-
' hidefocus="
|
35215
|
+
' hidefocus="1"' + extraAttrs + '>' + value +
|
34636
35216
|
'</textarea>'
|
34637
35217
|
);
|
34638
35218
|
}
|
34639
35219
|
|
34640
|
-
return '<input id="' + id + '" class="' + self.classes() + '" value="' + value + '" hidefocus="
|
35220
|
+
return '<input id="' + id + '" class="' + self.classes() + '" value="' + value + '" hidefocus="1"' + extraAttrs + ' />';
|
34641
35221
|
},
|
34642
35222
|
|
34643
35223
|
/**
|
@@ -34681,8 +35261,9 @@ define("tinymce/ui/TextBox", [
|
|
34681
35261
|
* @class tinymce.ui.Throbber
|
34682
35262
|
*/
|
34683
35263
|
define("tinymce/ui/Throbber", [
|
34684
|
-
"tinymce/ui/DomUtils"
|
34685
|
-
|
35264
|
+
"tinymce/ui/DomUtils",
|
35265
|
+
"tinymce/ui/Control"
|
35266
|
+
], function(DomUtils, Control) {
|
34686
35267
|
"use strict";
|
34687
35268
|
|
34688
35269
|
/**
|
@@ -34690,9 +35271,10 @@ define("tinymce/ui/Throbber", [
|
|
34690
35271
|
*
|
34691
35272
|
* @constructor
|
34692
35273
|
* @param {Element} elm DOM Html element to display throbber in.
|
35274
|
+
* @param {Boolean} inline Optional true/false state if the throbber should be appended to end of element for infinite scroll.
|
34693
35275
|
*/
|
34694
|
-
return function(elm) {
|
34695
|
-
var self = this, state;
|
35276
|
+
return function(elm, inline) {
|
35277
|
+
var self = this, state, classPrefix = Control.classPrefix;
|
34696
35278
|
|
34697
35279
|
/**
|
34698
35280
|
* Shows the throbber.
|
@@ -34708,7 +35290,9 @@ define("tinymce/ui/Throbber", [
|
|
34708
35290
|
|
34709
35291
|
window.setTimeout(function() {
|
34710
35292
|
if (state) {
|
34711
|
-
elm.appendChild(DomUtils.createFragment(
|
35293
|
+
elm.appendChild(DomUtils.createFragment(
|
35294
|
+
'<div class="' + classPrefix + 'throbber' + (inline ? ' ' + classPrefix + 'throbber-inline' : '') + '"></div>'
|
35295
|
+
));
|
34712
35296
|
}
|
34713
35297
|
}, time || 0);
|
34714
35298
|
|
@@ -34735,5 +35319,5 @@ define("tinymce/ui/Throbber", [
|
|
34735
35319
|
};
|
34736
35320
|
});
|
34737
35321
|
|
34738
|
-
expose(["tinymce/dom/EventUtils","tinymce/dom/Sizzle","tinymce/dom/DomQuery","tinymce/html/Styles","tinymce/dom/TreeWalker","tinymce/util/Tools","tinymce/dom/Range","tinymce/html/Entities","tinymce/Env","tinymce/dom/StyleSheetLoader","tinymce/dom/DOMUtils","tinymce/dom/ScriptLoader","tinymce/AddOnManager","tinymce/html/Node","tinymce/html/Schema","tinymce/html/SaxParser","tinymce/html/DomParser","tinymce/html/Writer","tinymce/html/Serializer","tinymce/dom/Serializer","tinymce/dom/TridentSelection","tinymce/util/VK","tinymce/dom/ControlSelection","tinymce/dom/RangeUtils","tinymce/dom/Selection","tinymce/Formatter","tinymce/UndoManager","tinymce/EnterKey","tinymce/ForceBlocks","tinymce/EditorCommands","tinymce/util/URI","tinymce/util/Class","tinymce/ui/Selector","tinymce/ui/Collection","tinymce/ui/DomUtils","tinymce/ui/Control","tinymce/ui/Factory","tinymce/ui/KeyboardNavigation","tinymce/ui/Container","tinymce/ui/DragHelper","tinymce/ui/Scrollable","tinymce/ui/Panel","tinymce/ui/Movable","tinymce/ui/Resizable","tinymce/ui/FloatPanel","tinymce/ui/Window","tinymce/ui/MessageBox","tinymce/WindowManager","tinymce/util/Quirks","tinymce/util/Observable","tinymce/Shortcuts","tinymce/Editor","tinymce/util/I18n","tinymce/FocusManager","tinymce/EditorManager","tinymce/LegacyInput","tinymce/util/XHR","tinymce/util/JSON","tinymce/util/JSONRequest","tinymce/util/JSONP","tinymce/util/LocalStorage","tinymce/Compat","tinymce/ui/Layout","tinymce/ui/AbsoluteLayout","tinymce/ui/Tooltip","tinymce/ui/Widget","tinymce/ui/Button","tinymce/ui/ButtonGroup","tinymce/ui/Checkbox","tinymce/ui/PanelButton","tinymce/ui/ColorButton","tinymce/ui/ComboBox","tinymce/ui/Path","tinymce/ui/ElementPath","tinymce/ui/FormItem","tinymce/ui/Form","tinymce/ui/FieldSet","tinymce/ui/FilePicker","tinymce/ui/FitLayout","tinymce/ui/FlexLayout","tinymce/ui/FlowLayout","tinymce/ui/FormatControls","tinymce/ui/GridLayout","tinymce/ui/Iframe","tinymce/ui/Label","tinymce/ui/Toolbar","tinymce/ui/MenuBar","tinymce/ui/MenuButton","tinymce/ui/ListBox","tinymce/ui/MenuItem","tinymce/ui/Menu","tinymce/ui/Radio","tinymce/ui/ResizeHandle","tinymce/ui/Spacer","tinymce/ui/SplitButton","tinymce/ui/StackLayout","tinymce/ui/TabPanel","tinymce/ui/TextBox","tinymce/ui/Throbber"]);
|
35322
|
+
expose(["tinymce/dom/EventUtils","tinymce/dom/Sizzle","tinymce/dom/DomQuery","tinymce/html/Styles","tinymce/dom/TreeWalker","tinymce/util/Tools","tinymce/dom/Range","tinymce/html/Entities","tinymce/Env","tinymce/dom/StyleSheetLoader","tinymce/dom/DOMUtils","tinymce/dom/ScriptLoader","tinymce/AddOnManager","tinymce/html/Node","tinymce/html/Schema","tinymce/html/SaxParser","tinymce/html/DomParser","tinymce/html/Writer","tinymce/html/Serializer","tinymce/dom/Serializer","tinymce/dom/TridentSelection","tinymce/util/VK","tinymce/dom/ControlSelection","tinymce/dom/RangeUtils","tinymce/dom/Selection","tinymce/fmt/Preview","tinymce/Formatter","tinymce/UndoManager","tinymce/EnterKey","tinymce/ForceBlocks","tinymce/EditorCommands","tinymce/util/URI","tinymce/util/Class","tinymce/util/EventDispatcher","tinymce/ui/Selector","tinymce/ui/Collection","tinymce/ui/DomUtils","tinymce/ui/Control","tinymce/ui/Factory","tinymce/ui/KeyboardNavigation","tinymce/ui/Container","tinymce/ui/DragHelper","tinymce/ui/Scrollable","tinymce/ui/Panel","tinymce/ui/Movable","tinymce/ui/Resizable","tinymce/ui/FloatPanel","tinymce/ui/Window","tinymce/ui/MessageBox","tinymce/WindowManager","tinymce/util/Quirks","tinymce/util/Observable","tinymce/EditorObservable","tinymce/Shortcuts","tinymce/Editor","tinymce/util/I18n","tinymce/FocusManager","tinymce/EditorManager","tinymce/LegacyInput","tinymce/util/XHR","tinymce/util/JSON","tinymce/util/JSONRequest","tinymce/util/JSONP","tinymce/util/LocalStorage","tinymce/Compat","tinymce/ui/Layout","tinymce/ui/AbsoluteLayout","tinymce/ui/Tooltip","tinymce/ui/Widget","tinymce/ui/Button","tinymce/ui/ButtonGroup","tinymce/ui/Checkbox","tinymce/ui/PanelButton","tinymce/ui/ColorButton","tinymce/ui/ComboBox","tinymce/ui/Path","tinymce/ui/ElementPath","tinymce/ui/FormItem","tinymce/ui/Form","tinymce/ui/FieldSet","tinymce/ui/FilePicker","tinymce/ui/FitLayout","tinymce/ui/FlexLayout","tinymce/ui/FlowLayout","tinymce/ui/FormatControls","tinymce/ui/GridLayout","tinymce/ui/Iframe","tinymce/ui/Label","tinymce/ui/Toolbar","tinymce/ui/MenuBar","tinymce/ui/MenuButton","tinymce/ui/ListBox","tinymce/ui/MenuItem","tinymce/ui/Menu","tinymce/ui/Radio","tinymce/ui/ResizeHandle","tinymce/ui/Spacer","tinymce/ui/SplitButton","tinymce/ui/StackLayout","tinymce/ui/TabPanel","tinymce/ui/TextBox","tinymce/ui/Throbber"]);
|
34739
35323
|
})(this);
|