tinymce-rails 4.0.2 → 4.0.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/app/assets/source/tinymce/tinymce.jquery.js +975 -599
- data/app/assets/source/tinymce/tinymce.js +975 -599
- data/lib/tinymce/rails/version.rb +2 -2
- data/vendor/assets/javascripts/tinymce/jquery.tinymce.js +1 -1
- data/vendor/assets/javascripts/tinymce/plugins/anchor/plugin.js +1 -1
- data/vendor/assets/javascripts/tinymce/plugins/autosave/plugin.js +1 -1
- data/vendor/assets/javascripts/tinymce/plugins/code/plugin.js +1 -1
- data/vendor/assets/javascripts/tinymce/plugins/example/plugin.js +1 -1
- data/vendor/assets/javascripts/tinymce/plugins/hr/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 -0
- data/vendor/assets/javascripts/tinymce/plugins/insertdatetime/plugin.js +1 -1
- data/vendor/assets/javascripts/tinymce/plugins/link/plugin.js +1 -1
- data/vendor/assets/javascripts/tinymce/plugins/lists/plugin.js +1 -1
- data/vendor/assets/javascripts/tinymce/plugins/media/plugin.js +1 -1
- data/vendor/assets/javascripts/tinymce/plugins/paste/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/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/plugins/visualblocks/css/visualblocks.css +14 -0
- data/vendor/assets/javascripts/tinymce/plugins/visualblocks/plugin.js +1 -1
- data/vendor/assets/javascripts/tinymce/skins/lightgray/fonts/icomoon-small.eot +0 -0
- data/vendor/assets/javascripts/tinymce/skins/lightgray/fonts/icomoon-small.svg +150 -141
- data/vendor/assets/javascripts/tinymce/skins/lightgray/fonts/icomoon-small.ttf +0 -0
- data/vendor/assets/javascripts/tinymce/skins/lightgray/fonts/icomoon-small.woff +0 -0
- data/vendor/assets/javascripts/tinymce/skins/lightgray/fonts/icomoon.eot +0 -0
- data/vendor/assets/javascripts/tinymce/skins/lightgray/fonts/icomoon.svg +132 -129
- data/vendor/assets/javascripts/tinymce/skins/lightgray/fonts/icomoon.ttf +0 -0
- data/vendor/assets/javascripts/tinymce/skins/lightgray/fonts/icomoon.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 +9 -9
- data/vendor/assets/javascripts/tinymce/tinymce.js +10 -10
- metadata +3 -7
- data/vendor/assets/javascripts/tinymce/plugins/compat3x/editable_selects.js +0 -70
- data/vendor/assets/javascripts/tinymce/plugins/compat3x/form_utils.js +0 -210
- data/vendor/assets/javascripts/tinymce/plugins/compat3x/mctabs.js +0 -162
- data/vendor/assets/javascripts/tinymce/plugins/compat3x/tiny_mce_popup.js +0 -435
- data/vendor/assets/javascripts/tinymce/plugins/compat3x/validate.js +0 -252
@@ -1,4 +1,4 @@
|
|
1
|
-
// 4.0.
|
1
|
+
// 4.0.6 (2013-09-12)
|
2
2
|
|
3
3
|
/**
|
4
4
|
* Compiled inline version. (Library mode)
|
@@ -101,6 +101,7 @@ define("tinymce/dom/EventUtils", [], function() {
|
|
101
101
|
|
102
102
|
var eventExpandoPrefix = "mce-data-";
|
103
103
|
var mouseEventRe = /^(?:mouse|contextmenu)|click/;
|
104
|
+
var deprecated = {keyLocation: 1, layerX: 1, layerY: 1, returnValue: 1};
|
104
105
|
|
105
106
|
/**
|
106
107
|
* Binds a native event to a callback on the speified target.
|
@@ -143,7 +144,7 @@ define("tinymce/dom/EventUtils", [], function() {
|
|
143
144
|
// Copy all properties from the original event
|
144
145
|
for (name in originalEvent) {
|
145
146
|
// layerX/layerY is deprecated in Chrome and produces a warning
|
146
|
-
if (name
|
147
|
+
if (!deprecated[name]) {
|
147
148
|
event[name] = originalEvent[name];
|
148
149
|
}
|
149
150
|
}
|
@@ -478,6 +479,13 @@ define("tinymce/dom/EventUtils", [], function() {
|
|
478
479
|
ci = callbackList.length;
|
479
480
|
while (ci--) {
|
480
481
|
if (callbackList[ci].func === callback) {
|
482
|
+
var nativeHandler = callbackList.nativeHandler;
|
483
|
+
|
484
|
+
// Clone callbackList since unbind inside a callback would otherwise break the handlers loop
|
485
|
+
callbackList = callbackList.slice(0, ci).concat(callbackList.slice(ci + 1));
|
486
|
+
callbackList.nativeHandler = nativeHandler;
|
487
|
+
|
488
|
+
eventMap[name] = callbackList;
|
481
489
|
callbackList.splice(ci, 1);
|
482
490
|
}
|
483
491
|
}
|
@@ -1236,7 +1244,7 @@ setDocument = Sizzle.setDocument = function( node ) {
|
|
1236
1244
|
rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join("|") );
|
1237
1245
|
|
1238
1246
|
// Element contains another
|
1239
|
-
// Purposefully does not implement inclusive
|
1247
|
+
// Purposefully does not implement inclusive descendant
|
1240
1248
|
// As in, an element does not contain itself
|
1241
1249
|
contains = isNative(docElem.contains) || docElem.compareDocumentPosition ?
|
1242
1250
|
function( a, b ) {
|
@@ -4311,7 +4319,11 @@ define("tinymce/dom/Range", [
|
|
4311
4319
|
if (o) {
|
4312
4320
|
startContainer.insertBefore(n, o);
|
4313
4321
|
} else {
|
4314
|
-
startContainer.
|
4322
|
+
if (startContainer.nodeType == 3) {
|
4323
|
+
dom.insertAfter(n, startContainer);
|
4324
|
+
} else {
|
4325
|
+
startContainer.appendChild(n);
|
4326
|
+
}
|
4315
4327
|
}
|
4316
4328
|
}
|
4317
4329
|
}
|
@@ -5231,12 +5243,14 @@ define("tinymce/html/Entities", [
|
|
5231
5243
|
*/
|
5232
5244
|
define("tinymce/Env", [], function() {
|
5233
5245
|
var nav = navigator, userAgent = nav.userAgent;
|
5234
|
-
var opera, webkit, ie, gecko, mac, iDevice;
|
5246
|
+
var opera, webkit, ie, ie11, gecko, mac, iDevice;
|
5235
5247
|
|
5236
5248
|
opera = window.opera && window.opera.buildNumber;
|
5237
5249
|
webkit = /WebKit/.test(userAgent);
|
5238
5250
|
ie = !webkit && !opera && (/MSIE/gi).test(userAgent) && (/Explorer/gi).test(nav.appName);
|
5239
5251
|
ie = ie && /MSIE (\w+)\./.exec(userAgent)[1];
|
5252
|
+
ie11 = userAgent.indexOf('Trident') != -1 ? 11 : false;
|
5253
|
+
ie = ie || ie11;
|
5240
5254
|
gecko = !webkit && /Gecko/.test(userAgent);
|
5241
5255
|
mac = userAgent.indexOf('Mac') != -1;
|
5242
5256
|
iDevice = /(iPad|iPhone)/.test(userAgent);
|
@@ -5403,6 +5417,7 @@ define("tinymce/dom/DOMUtils", [
|
|
5403
5417
|
self.stdMode = !isIE || doc.documentMode >= 8;
|
5404
5418
|
self.boxModel = !isIE || doc.compatMode == "CSS1Compat" || self.stdMode;
|
5405
5419
|
self.hasOuterHTML = "outerHTML" in doc.createElement("a");
|
5420
|
+
this.boundEvents = [];
|
5406
5421
|
|
5407
5422
|
self.settings = settings = extend({
|
5408
5423
|
keep_values: false,
|
@@ -6034,7 +6049,7 @@ define("tinymce/dom/DOMUtils", [
|
|
6034
6049
|
}
|
6035
6050
|
|
6036
6051
|
// IE & Opera
|
6037
|
-
if (
|
6052
|
+
if (elm.currentStyle && computed) {
|
6038
6053
|
return elm.currentStyle[name];
|
6039
6054
|
}
|
6040
6055
|
|
@@ -6331,8 +6346,8 @@ define("tinymce/dom/DOMUtils", [
|
|
6331
6346
|
* Returns the absolute x, y position of a node. The position will be returned in an object with x, y fields.
|
6332
6347
|
*
|
6333
6348
|
* @method getPos
|
6334
|
-
* @param {Element/String}
|
6335
|
-
* @param {Element}
|
6349
|
+
* @param {Element/String} elm HTML element or element id to get x, y position from.
|
6350
|
+
* @param {Element} rootElm Optional root element to stop calculations at.
|
6336
6351
|
* @return {object} Absolute position of the specified element object with x, y fields.
|
6337
6352
|
*/
|
6338
6353
|
getPos: function(elm, rootElm) {
|
@@ -6947,78 +6962,6 @@ define("tinymce/dom/DOMUtils", [
|
|
6947
6962
|
return this.styles.toHex(Tools.trim(rgbVal));
|
6948
6963
|
},
|
6949
6964
|
|
6950
|
-
/**
|
6951
|
-
* Returns an array of all single CSS classes in the document. A single CSS class is a simple
|
6952
|
-
* rule like ".class" - complex ones like "div td.class" will not be added to output.
|
6953
|
-
*
|
6954
|
-
* @method getClasses
|
6955
|
-
* @return {Array} Array with class objects - each object has a class field - might be other fields in the future.
|
6956
|
-
*/
|
6957
|
-
getClasses: function() {
|
6958
|
-
var self = this, classList = [], lookup = {}, filter = self.settings.class_filter, oldVal;
|
6959
|
-
|
6960
|
-
if (self.classes) {
|
6961
|
-
return self.classes;
|
6962
|
-
}
|
6963
|
-
|
6964
|
-
function addClasses(stylesheet) {
|
6965
|
-
// IE style imports
|
6966
|
-
each(stylesheet.imports, function(r) {
|
6967
|
-
addClasses(r);
|
6968
|
-
});
|
6969
|
-
|
6970
|
-
each(stylesheet.cssRules || stylesheet.rules, function(rule) {
|
6971
|
-
// Real type or fake it on IE
|
6972
|
-
switch (rule.type || 1) {
|
6973
|
-
// Rule
|
6974
|
-
case 1:
|
6975
|
-
if (rule.selectorText) {
|
6976
|
-
each(rule.selectorText.split(','), function(value) {
|
6977
|
-
value = value.replace(/^\s*|\s*$|^\s\./g, "");
|
6978
|
-
|
6979
|
-
// Is internal or it doesn't contain a class
|
6980
|
-
if (/\.mce/.test(value) || !/\.[\w\-]+$/.test(value)) {
|
6981
|
-
return;
|
6982
|
-
}
|
6983
|
-
|
6984
|
-
// Remove everything but class name
|
6985
|
-
oldVal = value;
|
6986
|
-
value = value.replace(/.*\.([a-z0-9_\-]+).*/i, '$1');
|
6987
|
-
|
6988
|
-
// Filter classes
|
6989
|
-
if (filter && !(value = filter(value, oldVal))) {
|
6990
|
-
return;
|
6991
|
-
}
|
6992
|
-
|
6993
|
-
if (!lookup[value]) {
|
6994
|
-
classList.push({'class': value});
|
6995
|
-
lookup[value] = 1;
|
6996
|
-
}
|
6997
|
-
});
|
6998
|
-
}
|
6999
|
-
break;
|
7000
|
-
|
7001
|
-
// Import
|
7002
|
-
case 3:
|
7003
|
-
addClasses(rule.styleSheet);
|
7004
|
-
break;
|
7005
|
-
}
|
7006
|
-
});
|
7007
|
-
}
|
7008
|
-
|
7009
|
-
try {
|
7010
|
-
each(self.doc.styleSheets, addClasses);
|
7011
|
-
} catch (ex) {
|
7012
|
-
// Ignore
|
7013
|
-
}
|
7014
|
-
|
7015
|
-
if (classList.length > 0) {
|
7016
|
-
self.classes = classList;
|
7017
|
-
}
|
7018
|
-
|
7019
|
-
return classList;
|
7020
|
-
},
|
7021
|
-
|
7022
6965
|
/**
|
7023
6966
|
* Executes the specified function on the element by id or dom element node or array of elements/id.
|
7024
6967
|
*
|
@@ -7315,28 +7258,70 @@ define("tinymce/dom/DOMUtils", [
|
|
7315
7258
|
* Adds an event handler to the specified object.
|
7316
7259
|
*
|
7317
7260
|
* @method bind
|
7318
|
-
* @param {Element/Document/Window/Array
|
7261
|
+
* @param {Element/Document/Window/Array} target Target element to bind events to.
|
7319
7262
|
* handler to or an array of elements/ids/documents.
|
7320
|
-
* @param {String}
|
7321
|
-
* @param {function}
|
7322
|
-
* @param {Object}
|
7263
|
+
* @param {String} name Name of event handler to add, for example: click.
|
7264
|
+
* @param {function} func Function to execute when the event occurs.
|
7265
|
+
* @param {Object} scope Optional scope to execute the function in.
|
7323
7266
|
* @return {function} Function callback handler the same as the one passed in.
|
7324
7267
|
*/
|
7325
7268
|
bind: function(target, name, func, scope) {
|
7326
|
-
|
7269
|
+
var self = this;
|
7270
|
+
|
7271
|
+
if (Tools.isArray(target)) {
|
7272
|
+
var i = target.length;
|
7273
|
+
|
7274
|
+
while (i--) {
|
7275
|
+
target[i] = self.bind(target[i], name, func, scope);
|
7276
|
+
}
|
7277
|
+
|
7278
|
+
return target;
|
7279
|
+
}
|
7280
|
+
|
7281
|
+
// Collect all window/document events bound by editor instance
|
7282
|
+
if (self.settings.collect && (target === self.doc || target === self.win)) {
|
7283
|
+
self.boundEvents.push([target, name, func, scope]);
|
7284
|
+
}
|
7285
|
+
|
7286
|
+
return self.events.bind(target, name, func, scope || self);
|
7327
7287
|
},
|
7328
7288
|
|
7329
7289
|
/**
|
7330
7290
|
* Removes the specified event handler by name and function from an element or collection of elements.
|
7331
7291
|
*
|
7332
7292
|
* @method unbind
|
7333
|
-
* @param {
|
7334
|
-
* @param {String}
|
7335
|
-
* @param {function}
|
7293
|
+
* @param {Element/Document/Window/Array} target Target element to unbind events on.
|
7294
|
+
* @param {String} name Event handler name, for example: "click"
|
7295
|
+
* @param {function} func Function to remove.
|
7336
7296
|
* @return {bool/Array} Bool state of true if the handler was removed, or an array of states if multiple input elements
|
7337
7297
|
* were passed in.
|
7338
7298
|
*/
|
7339
7299
|
unbind: function(target, name, func) {
|
7300
|
+
var self = this, i;
|
7301
|
+
|
7302
|
+
if (Tools.isArray(target)) {
|
7303
|
+
i = target.length;
|
7304
|
+
|
7305
|
+
while (i--) {
|
7306
|
+
target[i] = self.unbind(target[i], name, func);
|
7307
|
+
}
|
7308
|
+
|
7309
|
+
return target;
|
7310
|
+
}
|
7311
|
+
|
7312
|
+
// Remove any bound events matching the input
|
7313
|
+
if (self.boundEvents && (target === self.doc || target === self.win)) {
|
7314
|
+
i = self.boundEvents.length;
|
7315
|
+
|
7316
|
+
while (i--) {
|
7317
|
+
var item = self.boundEvents[i];
|
7318
|
+
|
7319
|
+
if (target == item[0] && (!name || name == item[1]) && (!func || func == item[2])) {
|
7320
|
+
this.events.unbind(item[0], item[1], item[2]);
|
7321
|
+
}
|
7322
|
+
}
|
7323
|
+
}
|
7324
|
+
|
7340
7325
|
return this.events.unbind(target, name, func);
|
7341
7326
|
},
|
7342
7327
|
|
@@ -7380,6 +7365,18 @@ define("tinymce/dom/DOMUtils", [
|
|
7380
7365
|
destroy: function() {
|
7381
7366
|
var self = this;
|
7382
7367
|
|
7368
|
+
// Unbind all events bound to window/document by editor instance
|
7369
|
+
if (self.boundEvents) {
|
7370
|
+
var i = self.boundEvents.length;
|
7371
|
+
|
7372
|
+
while (i--) {
|
7373
|
+
var item = self.boundEvents[i];
|
7374
|
+
this.events.unbind(item[0], item[1], item[2]);
|
7375
|
+
}
|
7376
|
+
|
7377
|
+
self.boundEvents = null;
|
7378
|
+
}
|
7379
|
+
|
7383
7380
|
self.win = self.doc = self.root = self.events = self.frag = null;
|
7384
7381
|
},
|
7385
7382
|
|
@@ -7708,182 +7705,180 @@ define("tinymce/dom/ScriptLoader", [
|
|
7708
7705
|
* @class tinymce.AddOnManager
|
7709
7706
|
*/
|
7710
7707
|
define("tinymce/AddOnManager", [
|
7711
|
-
|
7712
|
-
|
7708
|
+
"tinymce/dom/ScriptLoader",
|
7709
|
+
"tinymce/util/Tools"
|
7713
7710
|
], function(ScriptLoader, Tools) {
|
7714
|
-
|
7715
|
-
|
7716
|
-
|
7717
|
-
|
7718
|
-
|
7719
|
-
|
7720
|
-
|
7721
|
-
|
7722
|
-
|
7723
|
-
|
7724
|
-
|
7725
|
-
|
7726
|
-
|
7727
|
-
|
7728
|
-
|
7729
|
-
|
7730
|
-
|
7731
|
-
|
7732
|
-
|
7733
|
-
|
7734
|
-
|
7735
|
-
|
7736
|
-
|
7737
|
-
|
7738
|
-
|
7739
|
-
|
7740
|
-
|
7741
|
-
|
7742
|
-
|
7743
|
-
|
7744
|
-
|
7745
|
-
|
7746
|
-
|
7747
|
-
|
7748
|
-
|
7749
|
-
|
7750
|
-
|
7751
|
-
|
7752
|
-
|
7753
|
-
|
7754
|
-
|
7755
|
-
|
7756
|
-
|
7757
|
-
|
7758
|
-
|
7759
|
-
|
7760
|
-
|
7761
|
-
|
7762
|
-
|
7763
|
-
|
7764
|
-
|
7765
|
-
|
7766
|
-
|
7767
|
-
|
7768
|
-
|
7769
|
-
|
7770
|
-
|
7771
|
-
|
7772
|
-
|
7773
|
-
|
7774
|
-
|
7775
|
-
|
7776
|
-
|
7777
|
-
|
7778
|
-
|
7779
|
-
|
7780
|
-
|
7781
|
-
|
7782
|
-
|
7783
|
-
|
7784
|
-
|
7785
|
-
|
7786
|
-
|
7787
|
-
|
7788
|
-
|
7789
|
-
|
7790
|
-
|
7791
|
-
|
7792
|
-
|
7793
|
-
|
7794
|
-
|
7795
|
-
|
7796
|
-
|
7797
|
-
|
7798
|
-
|
7799
|
-
|
7800
|
-
|
7801
|
-
|
7802
|
-
|
7803
|
-
|
7804
|
-
|
7805
|
-
|
7806
|
-
|
7807
|
-
|
7808
|
-
|
7809
|
-
|
7810
|
-
|
7811
|
-
|
7812
|
-
|
7813
|
-
|
7814
|
-
|
7815
|
-
|
7816
|
-
|
7817
|
-
|
7818
|
-
|
7819
|
-
|
7820
|
-
|
7821
|
-
|
7822
|
-
|
7823
|
-
|
7824
|
-
|
7825
|
-
|
7826
|
-
|
7827
|
-
|
7828
|
-
|
7829
|
-
|
7830
|
-
|
7831
|
-
|
7832
|
-
|
7833
|
-
|
7834
|
-
|
7835
|
-
|
7836
|
-
|
7837
|
-
|
7838
|
-
|
7839
|
-
|
7840
|
-
|
7841
|
-
|
7842
|
-
|
7843
|
-
|
7844
|
-
|
7845
|
-
|
7846
|
-
|
7847
|
-
|
7848
|
-
|
7849
|
-
|
7850
|
-
|
7851
|
-
|
7852
|
-
|
7853
|
-
|
7854
|
-
|
7855
|
-
|
7856
|
-
|
7857
|
-
|
7858
|
-
|
7859
|
-
|
7860
|
-
|
7861
|
-
|
7862
|
-
|
7863
|
-
|
7864
|
-
|
7865
|
-
|
7866
|
-
|
7867
|
-
|
7868
|
-
|
7869
|
-
|
7870
|
-
|
7871
|
-
|
7872
|
-
|
7873
|
-
|
7874
|
-
|
7875
|
-
|
7876
|
-
|
7877
|
-
|
7878
|
-
|
7879
|
-
|
7880
|
-
|
7881
|
-
|
7882
|
-
|
7883
|
-
|
7884
|
-
|
7885
|
-
|
7886
|
-
return AddOnManager;
|
7711
|
+
var each = Tools.each;
|
7712
|
+
|
7713
|
+
function AddOnManager() {
|
7714
|
+
var self = this;
|
7715
|
+
|
7716
|
+
self.items = [];
|
7717
|
+
self.urls = {};
|
7718
|
+
self.lookup = {};
|
7719
|
+
}
|
7720
|
+
|
7721
|
+
AddOnManager.prototype = {
|
7722
|
+
/**
|
7723
|
+
* Returns the specified add on by the short name.
|
7724
|
+
*
|
7725
|
+
* @method get
|
7726
|
+
* @param {String} name Add-on to look for.
|
7727
|
+
* @return {tinymce.Theme/tinymce.Plugin} Theme or plugin add-on instance or undefined.
|
7728
|
+
*/
|
7729
|
+
get: function(name) {
|
7730
|
+
if (this.lookup[name]) {
|
7731
|
+
return this.lookup[name].instance;
|
7732
|
+
} else {
|
7733
|
+
return undefined;
|
7734
|
+
}
|
7735
|
+
},
|
7736
|
+
|
7737
|
+
dependencies: function(name) {
|
7738
|
+
var result;
|
7739
|
+
|
7740
|
+
if (this.lookup[name]) {
|
7741
|
+
result = this.lookup[name].dependencies;
|
7742
|
+
}
|
7743
|
+
|
7744
|
+
return result || [];
|
7745
|
+
},
|
7746
|
+
|
7747
|
+
/**
|
7748
|
+
* Loads a language pack for the specified add-on.
|
7749
|
+
*
|
7750
|
+
* @method requireLangPack
|
7751
|
+
* @param {String} name Short name of the add-on.
|
7752
|
+
*/
|
7753
|
+
requireLangPack: function(name) {
|
7754
|
+
if (AddOnManager.language && AddOnManager.languageLoad !== false) {
|
7755
|
+
ScriptLoader.ScriptLoader.add(this.urls[name] + '/langs/' + AddOnManager.language + '.js');
|
7756
|
+
}
|
7757
|
+
},
|
7758
|
+
|
7759
|
+
/**
|
7760
|
+
* Adds a instance of the add-on by it's short name.
|
7761
|
+
*
|
7762
|
+
* @method add
|
7763
|
+
* @param {String} id Short name/id for the add-on.
|
7764
|
+
* @param {tinymce.Theme/tinymce.Plugin} addOn Theme or plugin to add.
|
7765
|
+
* @return {tinymce.Theme/tinymce.Plugin} The same theme or plugin instance that got passed in.
|
7766
|
+
* @example
|
7767
|
+
* // Create a simple plugin
|
7768
|
+
* tinymce.create('tinymce.plugins.TestPlugin', {
|
7769
|
+
* TestPlugin: function(ed, url) {
|
7770
|
+
* ed.on('click', function(e) {
|
7771
|
+
* ed.windowManager.alert('Hello World!');
|
7772
|
+
* });
|
7773
|
+
* }
|
7774
|
+
* });
|
7775
|
+
*
|
7776
|
+
* // Register plugin using the add method
|
7777
|
+
* tinymce.PluginManager.add('test', tinymce.plugins.TestPlugin);
|
7778
|
+
*
|
7779
|
+
* // Initialize TinyMCE
|
7780
|
+
* tinymce.init({
|
7781
|
+
* ...
|
7782
|
+
* plugins: '-test' // Init the plugin but don't try to load it
|
7783
|
+
* });
|
7784
|
+
*/
|
7785
|
+
add: function(id, addOn, dependencies) {
|
7786
|
+
this.items.push(addOn);
|
7787
|
+
this.lookup[id] = {instance: addOn, dependencies: dependencies};
|
7788
|
+
|
7789
|
+
return addOn;
|
7790
|
+
},
|
7791
|
+
|
7792
|
+
createUrl: function(baseUrl, dep) {
|
7793
|
+
if (typeof dep === "object") {
|
7794
|
+
return dep;
|
7795
|
+
} else {
|
7796
|
+
return {prefix: baseUrl.prefix, resource: dep, suffix: baseUrl.suffix};
|
7797
|
+
}
|
7798
|
+
},
|
7799
|
+
|
7800
|
+
/**
|
7801
|
+
* Add a set of components that will make up the add-on. Using the url of the add-on name as the base url.
|
7802
|
+
* This should be used in development mode. A new compressor/javascript munger process will ensure that the
|
7803
|
+
* components are put together into the plugin.js file and compressed correctly.
|
7804
|
+
*
|
7805
|
+
* @method addComponents
|
7806
|
+
* @param {String} pluginName name of the plugin to load scripts from (will be used to get the base url for the plugins).
|
7807
|
+
* @param {Array} scripts Array containing the names of the scripts to load.
|
7808
|
+
*/
|
7809
|
+
addComponents: function(pluginName, scripts) {
|
7810
|
+
var pluginUrl = this.urls[pluginName];
|
7811
|
+
|
7812
|
+
each(scripts, function(script) {
|
7813
|
+
ScriptLoader.ScriptLoader.add(pluginUrl + "/" + script);
|
7814
|
+
});
|
7815
|
+
},
|
7816
|
+
|
7817
|
+
/**
|
7818
|
+
* Loads an add-on from a specific url.
|
7819
|
+
*
|
7820
|
+
* @method load
|
7821
|
+
* @param {String} n Short name of the add-on that gets loaded.
|
7822
|
+
* @param {String} u URL to the add-on that will get loaded.
|
7823
|
+
* @param {function} cb Optional callback to execute ones the add-on is loaded.
|
7824
|
+
* @param {Object} s Optional scope to execute the callback in.
|
7825
|
+
* @example
|
7826
|
+
* // Loads a plugin from an external URL
|
7827
|
+
* tinymce.PluginManager.load('myplugin', '/some/dir/someplugin/plugin.js');
|
7828
|
+
*
|
7829
|
+
* // Initialize TinyMCE
|
7830
|
+
* tinymce.init({
|
7831
|
+
* ...
|
7832
|
+
* plugins: '-myplugin' // Don't try to load it again
|
7833
|
+
* });
|
7834
|
+
*/
|
7835
|
+
load: function(n, u, cb, s) {
|
7836
|
+
var t = this, url = u;
|
7837
|
+
|
7838
|
+
function loadDependencies() {
|
7839
|
+
var dependencies = t.dependencies(n);
|
7840
|
+
|
7841
|
+
each(dependencies, function(dep) {
|
7842
|
+
var newUrl = t.createUrl(u, dep);
|
7843
|
+
|
7844
|
+
t.load(newUrl.resource, newUrl, undefined, undefined);
|
7845
|
+
});
|
7846
|
+
|
7847
|
+
if (cb) {
|
7848
|
+
if (s) {
|
7849
|
+
cb.call(s);
|
7850
|
+
} else {
|
7851
|
+
cb.call(ScriptLoader);
|
7852
|
+
}
|
7853
|
+
}
|
7854
|
+
}
|
7855
|
+
|
7856
|
+
if (t.urls[n]) {
|
7857
|
+
return;
|
7858
|
+
}
|
7859
|
+
|
7860
|
+
if (typeof u === "object") {
|
7861
|
+
url = u.prefix + u.resource + u.suffix;
|
7862
|
+
}
|
7863
|
+
|
7864
|
+
if (url.indexOf('/') !== 0 && url.indexOf('://') == -1) {
|
7865
|
+
url = AddOnManager.baseURL + '/' + url;
|
7866
|
+
}
|
7867
|
+
|
7868
|
+
t.urls[n] = url.substring(0, url.lastIndexOf('/'));
|
7869
|
+
|
7870
|
+
if (t.lookup[n]) {
|
7871
|
+
loadDependencies();
|
7872
|
+
} else {
|
7873
|
+
ScriptLoader.ScriptLoader.add(url, loadDependencies, s);
|
7874
|
+
}
|
7875
|
+
}
|
7876
|
+
};
|
7877
|
+
|
7878
|
+
AddOnManager.PluginManager = new AddOnManager();
|
7879
|
+
AddOnManager.ThemeManager = new AddOnManager();
|
7880
|
+
|
7881
|
+
return AddOnManager;
|
7887
7882
|
});
|
7888
7883
|
|
7889
7884
|
/**
|
@@ -9021,7 +9016,13 @@ define("tinymce/html/Schema", [
|
|
9021
9016
|
|
9022
9017
|
// Add elements clone if needed
|
9023
9018
|
if (!elements[name]) {
|
9024
|
-
|
9019
|
+
var customRule = elements[cloneName];
|
9020
|
+
|
9021
|
+
customRule = extend({}, customRule);
|
9022
|
+
delete customRule.removeEmptyAttrs;
|
9023
|
+
delete customRule.removeEmpty;
|
9024
|
+
|
9025
|
+
elements[name] = customRule;
|
9025
9026
|
}
|
9026
9027
|
|
9027
9028
|
// Add custom elements at span/div positions
|
@@ -10908,7 +10909,7 @@ define("tinymce/dom/Serializer", [
|
|
10908
10909
|
var DOM = DOMUtils.DOM;
|
10909
10910
|
|
10910
10911
|
/**
|
10911
|
-
*
|
10912
|
+
* Constructs a new DOM serializer class.
|
10912
10913
|
*
|
10913
10914
|
* @constructor
|
10914
10915
|
* @method Serializer
|
@@ -11021,8 +11022,9 @@ define("tinymce/dom/Serializer", [
|
|
11021
11022
|
value = node.firstChild ? node.firstChild.value : '';
|
11022
11023
|
|
11023
11024
|
if (name === "script") {
|
11024
|
-
// Remove mce- prefix from script elements
|
11025
|
-
|
11025
|
+
// Remove mce- prefix from script elements and remove default text/javascript mime type (HTML5)
|
11026
|
+
var type = (node.attr('type') || 'text/javascript').replace(/^mce\-/, '');
|
11027
|
+
node.attr('type', type === 'text/javascript' ? null : type);
|
11026
11028
|
|
11027
11029
|
if (value.length > 0) {
|
11028
11030
|
node.firstChild.value = '// <![CDATA[\n' + trim(value) + '\n// ]]>';
|
@@ -11835,10 +11837,9 @@ define("tinymce/dom/ControlSelection", [
|
|
11835
11837
|
], function(VK, Tools, Env) {
|
11836
11838
|
return function(selection, editor) {
|
11837
11839
|
var dom = editor.dom, each = Tools.each;
|
11838
|
-
var selectedElm, selectedElmGhost, resizeHandles, selectedHandle;
|
11840
|
+
var selectedElm, selectedElmGhost, resizeHandles, selectedHandle, lastMouseDownEvent;
|
11839
11841
|
var startX, startY, selectedElmX, selectedElmY, startW, startH, ratio, resizeStarted;
|
11840
|
-
var width, height, editableDoc = editor.getDoc(), rootDocument = document, isIE = Env.ie;
|
11841
|
-
var lastMouseDownEvent;
|
11842
|
+
var width, height, editableDoc = editor.getDoc(), rootDocument = document, isIE = Env.ie && Env.ie < 11;
|
11842
11843
|
|
11843
11844
|
// Details about each resize handle how to scale etc
|
11844
11845
|
resizeHandles = {
|
@@ -11979,8 +11980,11 @@ define("tinymce/dom/ControlSelection", [
|
|
11979
11980
|
function showResizeRect(targetElm, mouseDownHandleName, mouseDownEvent) {
|
11980
11981
|
var position, targetWidth, targetHeight, e, rect;
|
11981
11982
|
|
11983
|
+
// Fix when inline element is within a relaive container
|
11984
|
+
var offsetParent = editor.getBody().offsetParent || editor.getBody();
|
11985
|
+
|
11982
11986
|
// Get position and size of target
|
11983
|
-
position = dom.getPos(targetElm,
|
11987
|
+
position = dom.getPos(targetElm, offsetParent);
|
11984
11988
|
selectedElmX = position.x;
|
11985
11989
|
selectedElmY = position.y;
|
11986
11990
|
rect = targetElm.getBoundingClientRect(); // Fix for Gecko offsetHeight for table with caption
|
@@ -12242,6 +12246,16 @@ define("tinymce/dom/ControlSelection", [
|
|
12242
12246
|
});
|
12243
12247
|
} else {
|
12244
12248
|
disableGeckoResize();
|
12249
|
+
|
12250
|
+
if (Env.ie >= 11) {
|
12251
|
+
// TODO: Drag/drop doesn't work
|
12252
|
+
editor.on('mouseup mousedown', function(e) {
|
12253
|
+
if (e.target.nodeName == 'IMG' || editor.selection.getNode().nodeName == 'IMG') {
|
12254
|
+
e.preventDefault();
|
12255
|
+
editor.selection.select(e.target);
|
12256
|
+
}
|
12257
|
+
});
|
12258
|
+
}
|
12245
12259
|
}
|
12246
12260
|
|
12247
12261
|
editor.on('nodechange mousedown ResizeEditor', updateResizeRect);
|
@@ -12952,10 +12966,15 @@ define("tinymce/dom/Selection", [
|
|
12952
12966
|
* tinymce.activeEditor.selection.select(tinymce.activeEditor.dom.select('p')[0]);
|
12953
12967
|
*/
|
12954
12968
|
select: function(node, content) {
|
12955
|
-
var
|
12969
|
+
var self = this, dom = self.dom, rng = dom.createRng(), idx, nonEmptyElementsMap;
|
12970
|
+
|
12971
|
+
// Clear stored range set by FocusManager
|
12972
|
+
self.lastFocusBookmark = null;
|
12973
|
+
|
12974
|
+
nonEmptyElementsMap = dom.schema.getNonEmptyElements();
|
12956
12975
|
|
12957
12976
|
function setPoint(node, start) {
|
12958
|
-
var walker = new TreeWalker(node,
|
12977
|
+
var root = node, walker = new TreeWalker(node, root);
|
12959
12978
|
|
12960
12979
|
do {
|
12961
12980
|
// Text node
|
@@ -12969,21 +12988,34 @@ define("tinymce/dom/Selection", [
|
|
12969
12988
|
return;
|
12970
12989
|
}
|
12971
12990
|
|
12972
|
-
// BR
|
12973
|
-
if (node.nodeName
|
12991
|
+
// BR/IMG/INPUT elements
|
12992
|
+
if (nonEmptyElementsMap[node.nodeName]) {
|
12974
12993
|
if (start) {
|
12975
12994
|
rng.setStartBefore(node);
|
12976
12995
|
} else {
|
12977
|
-
|
12996
|
+
if (node.nodeName == 'BR') {
|
12997
|
+
rng.setEndBefore(node);
|
12998
|
+
} else {
|
12999
|
+
rng.setEndAfter(node);
|
13000
|
+
}
|
12978
13001
|
}
|
12979
13002
|
|
12980
13003
|
return;
|
12981
13004
|
}
|
12982
13005
|
} while ((node = (start ? walker.next() : walker.prev())));
|
13006
|
+
|
13007
|
+
// Failed to find any text node or other suitable location then move to the root of body
|
13008
|
+
if (root.nodeName == 'BODY') {
|
13009
|
+
if (start) {
|
13010
|
+
rng.setStart(root, 0);
|
13011
|
+
} else {
|
13012
|
+
rng.setEnd(root, root.childNodes.length);
|
13013
|
+
}
|
13014
|
+
}
|
12983
13015
|
}
|
12984
13016
|
|
12985
13017
|
if (node) {
|
12986
|
-
if (!content &&
|
13018
|
+
if (!content && self.controlSelection.controlSelect(node)) {
|
12987
13019
|
return;
|
12988
13020
|
}
|
12989
13021
|
|
@@ -12997,7 +13029,7 @@ define("tinymce/dom/Selection", [
|
|
12997
13029
|
setPoint(node);
|
12998
13030
|
}
|
12999
13031
|
|
13000
|
-
|
13032
|
+
self.setRng(rng);
|
13001
13033
|
}
|
13002
13034
|
|
13003
13035
|
return node;
|
@@ -13070,8 +13102,19 @@ define("tinymce/dom/Selection", [
|
|
13070
13102
|
|
13071
13103
|
// Use last rng passed from FocusManager if it's available this enables
|
13072
13104
|
// calls to editor.selection.getStart() to work when caret focus is lost on IE
|
13073
|
-
if (!w3c && self.
|
13074
|
-
|
13105
|
+
if (!w3c && self.lastFocusBookmark) {
|
13106
|
+
var bookmark = self.lastFocusBookmark;
|
13107
|
+
|
13108
|
+
// Convert bookmark to range IE 11 fix
|
13109
|
+
if (bookmark.startContainer) {
|
13110
|
+
rng = doc.createRange();
|
13111
|
+
rng.setStart(bookmark.startContainer, bookmark.startOffset);
|
13112
|
+
rng.setEnd(bookmark.endContainer, bookmark.endOffset);
|
13113
|
+
} else {
|
13114
|
+
rng = bookmark;
|
13115
|
+
}
|
13116
|
+
|
13117
|
+
return rng;
|
13075
13118
|
}
|
13076
13119
|
|
13077
13120
|
// Found tridentSel object then we need to use that one
|
@@ -13165,12 +13208,11 @@ define("tinymce/dom/Selection", [
|
|
13165
13208
|
|
13166
13209
|
try {
|
13167
13210
|
sel.removeAllRanges();
|
13211
|
+
sel.addRange(rng);
|
13168
13212
|
} catch (ex) {
|
13169
|
-
//
|
13213
|
+
// IE might throw errors here if the editor is within a hidden container and selection is changed
|
13170
13214
|
}
|
13171
13215
|
|
13172
|
-
sel.addRange(rng);
|
13173
|
-
|
13174
13216
|
// Forward is set to false and we have an extend function
|
13175
13217
|
if (forward === false && sel.extend) {
|
13176
13218
|
sel.collapse(rng.endContainer, rng.endOffset);
|
@@ -13574,13 +13616,57 @@ define("tinymce/dom/Selection", [
|
|
13574
13616
|
return self;
|
13575
13617
|
},
|
13576
13618
|
|
13619
|
+
getScrollContainer: function() {
|
13620
|
+
var scrollContainer, node = this.dom.getRoot();
|
13621
|
+
|
13622
|
+
while (node && node.nodeName != 'BODY') {
|
13623
|
+
if (node.scrollHeight > node.clientHeight) {
|
13624
|
+
scrollContainer = node;
|
13625
|
+
break;
|
13626
|
+
}
|
13627
|
+
|
13628
|
+
node = node.parentNode;
|
13629
|
+
}
|
13630
|
+
|
13631
|
+
return scrollContainer;
|
13632
|
+
},
|
13633
|
+
|
13577
13634
|
scrollIntoView: function(elm) {
|
13578
|
-
var y, viewPort, self = this, dom = self.dom;
|
13635
|
+
var y, viewPort, self = this, dom = self.dom, root = dom.getRoot(), viewPortY, viewPortH;
|
13636
|
+
|
13637
|
+
function getPos(elm) {
|
13638
|
+
var x = 0, y = 0;
|
13639
|
+
|
13640
|
+
var offsetParent = elm;
|
13641
|
+
while (offsetParent && offsetParent.nodeType) {
|
13642
|
+
x += offsetParent.offsetLeft || 0;
|
13643
|
+
y += offsetParent.offsetTop || 0;
|
13644
|
+
offsetParent = offsetParent.offsetParent;
|
13645
|
+
}
|
13646
|
+
|
13647
|
+
return {x: x, y: y};
|
13648
|
+
}
|
13649
|
+
|
13650
|
+
if (root.nodeName != 'BODY') {
|
13651
|
+
var scrollContainer = self.getScrollContainer();
|
13652
|
+
if (scrollContainer) {
|
13653
|
+
y = getPos(elm).y - getPos(scrollContainer).y;
|
13654
|
+
viewPortH = scrollContainer.clientHeight;
|
13655
|
+
viewPortY = scrollContainer.scrollTop;
|
13656
|
+
if (y < viewPortY || y + 25 > viewPortY + viewPortH) {
|
13657
|
+
scrollContainer.scrollTop = y < viewPortY ? y : y - viewPortH + 25;
|
13658
|
+
}
|
13659
|
+
|
13660
|
+
return;
|
13661
|
+
}
|
13662
|
+
}
|
13579
13663
|
|
13580
13664
|
viewPort = dom.getViewPort(self.editor.getWin());
|
13581
13665
|
y = dom.getPos(elm).y;
|
13582
|
-
|
13583
|
-
|
13666
|
+
viewPortY = viewPort.y;
|
13667
|
+
viewPortH = viewPort.h;
|
13668
|
+
if (y < viewPort.y || y + 25 > viewPortY + viewPortH) {
|
13669
|
+
self.editor.getWin().scrollTo(0, y < viewPortY ? y : y - viewPortH + 25);
|
13584
13670
|
}
|
13585
13671
|
},
|
13586
13672
|
|
@@ -13887,7 +13973,7 @@ define("tinymce/dom/RangeUtils", [
|
|
13887
13973
|
/**
|
13888
13974
|
* Text formatter engine class. This class is used to apply formats like bold, italic, font size
|
13889
13975
|
* etc to the current selection or specific nodes. This engine was build to replace the browsers
|
13890
|
-
* default formatting logic for execCommand due to it's
|
13976
|
+
* default formatting logic for execCommand due to it's inconsistent and buggy behavior.
|
13891
13977
|
*
|
13892
13978
|
* @class tinymce.Formatter
|
13893
13979
|
* @example
|
@@ -14016,7 +14102,14 @@ define("tinymce/Formatter", [
|
|
14016
14102
|
},
|
14017
14103
|
|
14018
14104
|
removeformat: [
|
14019
|
-
{
|
14105
|
+
{
|
14106
|
+
selector: 'b,strong,em,i,font,u,strike,sub,sup',
|
14107
|
+
remove: 'all',
|
14108
|
+
split: true,
|
14109
|
+
expand: false,
|
14110
|
+
block_expand: true,
|
14111
|
+
deep: true
|
14112
|
+
},
|
14020
14113
|
{selector: 'span', attributes: ['style', 'class'], remove: 'empty', split: true, expand: false, deep: true},
|
14021
14114
|
{selector: '*', attributes: ['style', 'class'], split: false, expand: false, deep: true}
|
14022
14115
|
]
|
@@ -14883,9 +14976,11 @@ define("tinymce/Formatter", [
|
|
14883
14976
|
var startNode;
|
14884
14977
|
|
14885
14978
|
function matchParents(node) {
|
14979
|
+
var root = dom.getRoot();
|
14980
|
+
|
14886
14981
|
// Find first node with similar format settings
|
14887
14982
|
node = dom.getParent(node, function(node) {
|
14888
|
-
return !!matchNode(node, name, vars, true);
|
14983
|
+
return node.parentNode === root || !!matchNode(node, name, vars, true);
|
14889
14984
|
});
|
14890
14985
|
|
14891
14986
|
// Do an exact check on the similar format element
|
@@ -14961,8 +15056,9 @@ define("tinymce/Formatter", [
|
|
14961
15056
|
for (x = formatList.length - 1; x >= 0; x--) {
|
14962
15057
|
selector = formatList[x].selector;
|
14963
15058
|
|
14964
|
-
// Format is not selector based
|
14965
|
-
|
15059
|
+
// Format is not selector based then always return TRUE
|
15060
|
+
// Is it has a defaultBlock then it's likely it can be applied for example align on a non block element line
|
15061
|
+
if (!selector || formatList[x].defaultBlock) {
|
14966
15062
|
return TRUE;
|
14967
15063
|
}
|
14968
15064
|
|
@@ -15392,7 +15488,7 @@ define("tinymce/Formatter", [
|
|
15392
15488
|
}
|
15393
15489
|
|
15394
15490
|
function findBlockEndPoint(container, sibling_name) {
|
15395
|
-
var node;
|
15491
|
+
var node, root = dom.getRoot();
|
15396
15492
|
|
15397
15493
|
// Expand to block of similar type
|
15398
15494
|
if (!format[0].wrapper) {
|
@@ -15401,7 +15497,10 @@ define("tinymce/Formatter", [
|
|
15401
15497
|
|
15402
15498
|
// Expand to first wrappable block element or any block element
|
15403
15499
|
if (!node) {
|
15404
|
-
node = dom.getParent(container.nodeType == 3 ? container.parentNode : container,
|
15500
|
+
node = dom.getParent(container.nodeType == 3 ? container.parentNode : container, function(node) {
|
15501
|
+
// Fixes #6183 where it would expand to editable parent element in inline mode
|
15502
|
+
return node != root && isTextBlock(node);
|
15503
|
+
});
|
15405
15504
|
}
|
15406
15505
|
|
15407
15506
|
// Exclude inner lists from wrapping
|
@@ -15452,14 +15551,14 @@ define("tinymce/Formatter", [
|
|
15452
15551
|
|
15453
15552
|
if (format[0].inline) {
|
15454
15553
|
if (rng.collapsed) {
|
15455
|
-
// Expand left to closest word
|
15554
|
+
// Expand left to closest word boundary
|
15456
15555
|
endPoint = findWordEndPoint(startContainer, startOffset, true);
|
15457
15556
|
if (endPoint) {
|
15458
15557
|
startContainer = endPoint.container;
|
15459
15558
|
startOffset = endPoint.offset;
|
15460
15559
|
}
|
15461
15560
|
|
15462
|
-
// Expand right to closest word
|
15561
|
+
// Expand right to closest word boundary
|
15463
15562
|
endPoint = findWordEndPoint(endContainer, endOffset);
|
15464
15563
|
if (endPoint) {
|
15465
15564
|
endContainer = endPoint.container;
|
@@ -16155,6 +16254,10 @@ define("tinymce/Formatter", [
|
|
16155
16254
|
|
16156
16255
|
// Move selection to text node
|
16157
16256
|
selection.setCursorLocation(node, 1);
|
16257
|
+
// If the formatNode is empty, we can remove it safely.
|
16258
|
+
if(dom.isEmpty(formatNode)) {
|
16259
|
+
dom.remove(formatNode);
|
16260
|
+
}
|
16158
16261
|
}
|
16159
16262
|
}
|
16160
16263
|
|
@@ -16295,7 +16398,7 @@ define("tinymce/UndoManager", [
|
|
16295
16398
|
].join('|'), 'gi');
|
16296
16399
|
|
16297
16400
|
return function(editor) {
|
16298
|
-
var self, index = 0, data = [], beforeBookmark, isFirstTypedCharacter;
|
16401
|
+
var self, index = 0, data = [], beforeBookmark, isFirstTypedCharacter, lock;
|
16299
16402
|
|
16300
16403
|
// Returns a trimmed version of the current editor contents
|
16301
16404
|
function getContent() {
|
@@ -16359,6 +16462,11 @@ define("tinymce/UndoManager", [
|
|
16359
16462
|
// Make the it dirty if the content was changed after typing the first character
|
16360
16463
|
if (!editor.isDirty()) {
|
16361
16464
|
editor.isNotDirty = !data[0] || getContent() == data[0].content;
|
16465
|
+
|
16466
|
+
// Fire initial change event
|
16467
|
+
if (!editor.isNotDirty) {
|
16468
|
+
editor.fire('change', {level: data[0], lastLevel: null});
|
16469
|
+
}
|
16362
16470
|
}
|
16363
16471
|
|
16364
16472
|
editor.fire('TypingUndo');
|
@@ -16423,7 +16531,9 @@ define("tinymce/UndoManager", [
|
|
16423
16531
|
* @method beforeChange
|
16424
16532
|
*/
|
16425
16533
|
beforeChange: function() {
|
16426
|
-
|
16534
|
+
if (!lock) {
|
16535
|
+
beforeBookmark = editor.selection.getBookmark(2, true);
|
16536
|
+
}
|
16427
16537
|
},
|
16428
16538
|
|
16429
16539
|
/**
|
@@ -16439,7 +16549,7 @@ define("tinymce/UndoManager", [
|
|
16439
16549
|
level = level || {};
|
16440
16550
|
level.content = getContent();
|
16441
16551
|
|
16442
|
-
if (editor.fire('BeforeAddUndo', {level: level}).isDefaultPrevented()) {
|
16552
|
+
if (lock || editor.fire('BeforeAddUndo', {level: level}).isDefaultPrevented()) {
|
16443
16553
|
return null;
|
16444
16554
|
}
|
16445
16555
|
|
@@ -16506,6 +16616,11 @@ define("tinymce/UndoManager", [
|
|
16506
16616
|
if (index > 0) {
|
16507
16617
|
level = data[--index];
|
16508
16618
|
|
16619
|
+
// Undo to first index then set dirty state to false
|
16620
|
+
if (index === 0) {
|
16621
|
+
editor.isNotDirty = true;
|
16622
|
+
}
|
16623
|
+
|
16509
16624
|
editor.setContent(level.content, {format: 'raw'});
|
16510
16625
|
editor.selection.moveToBookmark(level.beforeBookmark);
|
16511
16626
|
|
@@ -16572,14 +16687,19 @@ define("tinymce/UndoManager", [
|
|
16572
16687
|
/**
|
16573
16688
|
* Executes the specified function in an undo transation. The selection
|
16574
16689
|
* before the modification will be stored to the undo stack and if the DOM changes
|
16575
|
-
* it will add a new undo level.
|
16690
|
+
* it will add a new undo level. Any methods within the transation that adds undo levels will
|
16691
|
+
* be ignored. So a transation can include calls to execCommand or editor.insertContent.
|
16576
16692
|
*
|
16577
16693
|
* @method transact
|
16578
16694
|
* @param {function} callback Function to execute dom manipulation logic in.
|
16579
16695
|
*/
|
16580
16696
|
transact: function(callback) {
|
16581
16697
|
self.beforeChange();
|
16698
|
+
|
16699
|
+
lock = true;
|
16582
16700
|
callback();
|
16701
|
+
lock = false;
|
16702
|
+
|
16583
16703
|
self.add();
|
16584
16704
|
}
|
16585
16705
|
};
|
@@ -16607,7 +16727,7 @@ define("tinymce/EnterKey", [
|
|
16607
16727
|
"tinymce/dom/TreeWalker",
|
16608
16728
|
"tinymce/Env"
|
16609
16729
|
], function(TreeWalker, Env) {
|
16610
|
-
var isIE = Env.ie;
|
16730
|
+
var isIE = Env.ie && Env.ie < 11;
|
16611
16731
|
|
16612
16732
|
return function(editor) {
|
16613
16733
|
var dom = editor.dom, selection = editor.selection, settings = editor.settings;
|
@@ -17175,6 +17295,7 @@ define("tinymce/EnterKey", [
|
|
17175
17295
|
// Insert new block before
|
17176
17296
|
newBlock = parentBlock.parentNode.insertBefore(createNewBlock(), parentBlock);
|
17177
17297
|
renderBlockOnIE(newBlock);
|
17298
|
+
moveToCaretPosition(parentBlock);
|
17178
17299
|
} else {
|
17179
17300
|
// Extract after fragment and insert it after the current block
|
17180
17301
|
tmpRng = rng.cloneRange();
|
@@ -17332,7 +17453,7 @@ define("tinymce/ForceBlocks", [], function() {
|
|
17332
17453
|
|
17333
17454
|
// Force root blocks
|
17334
17455
|
if (settings.forced_root_block) {
|
17335
|
-
editor.on('
|
17456
|
+
editor.on('NodeChange', addRootBlocks);
|
17336
17457
|
}
|
17337
17458
|
};
|
17338
17459
|
});
|
@@ -17705,8 +17826,8 @@ define("tinymce/EditorCommands", [
|
|
17705
17826
|
parentNode = selection.getNode();
|
17706
17827
|
|
17707
17828
|
// Parse the fragment within the context of the parent node
|
17708
|
-
|
17709
|
-
fragment = parser.parse(value,
|
17829
|
+
var parserArgs = {context: parentNode.nodeName.toLowerCase()};
|
17830
|
+
fragment = parser.parse(value, parserArgs);
|
17710
17831
|
|
17711
17832
|
// Move the caret to a more suitable location
|
17712
17833
|
node = fragment.lastChild;
|
@@ -17722,7 +17843,7 @@ define("tinymce/EditorCommands", [
|
|
17722
17843
|
}
|
17723
17844
|
|
17724
17845
|
// If parser says valid we can insert the contents into that parent
|
17725
|
-
if (!
|
17846
|
+
if (!parserArgs.invalid) {
|
17726
17847
|
value = serializer.serialize(fragment);
|
17727
17848
|
|
17728
17849
|
// Check if parent is empty or only has one BR element then set the innerHTML of that parent
|
@@ -18045,7 +18166,7 @@ define("tinymce/util/URI", [
|
|
18045
18166
|
var each = Tools.each, trim = Tools.trim;
|
18046
18167
|
|
18047
18168
|
/**
|
18048
|
-
*
|
18169
|
+
* Constructs a new URI instance.
|
18049
18170
|
*
|
18050
18171
|
* @constructor
|
18051
18172
|
* @method URI
|
@@ -18575,7 +18696,7 @@ define("tinymce/util/Class", [
|
|
18575
18696
|
* element[attr^=value]
|
18576
18697
|
* element[attr$=value]
|
18577
18698
|
* element:<state>
|
18578
|
-
* element:not(<
|
18699
|
+
* element:not(<expression>)
|
18579
18700
|
* element:first
|
18580
18701
|
* element:last
|
18581
18702
|
* element:odd
|
@@ -18868,11 +18989,11 @@ define("tinymce/ui/Selector", [
|
|
18868
18989
|
|
18869
18990
|
// All filters matched the item
|
18870
18991
|
if (fi === fl) {
|
18871
|
-
// Matched item is on the last
|
18992
|
+
// Matched item is on the last expression like: panel toolbar [button]
|
18872
18993
|
if (index == selector.length - 1) {
|
18873
18994
|
matches.push(item);
|
18874
18995
|
} else {
|
18875
|
-
// Collect next
|
18996
|
+
// Collect next expression type
|
18876
18997
|
if (item.items) {
|
18877
18998
|
collect(item.items(), selector, index + 1);
|
18878
18999
|
}
|
@@ -19176,6 +19297,22 @@ define("tinymce/ui/Collection", [
|
|
19176
19297
|
});
|
19177
19298
|
|
19178
19299
|
return self;
|
19300
|
+
},
|
19301
|
+
|
19302
|
+
/**
|
19303
|
+
* Remove all items from collection and DOM.
|
19304
|
+
*
|
19305
|
+
* @method remove
|
19306
|
+
* @return {tinymce.ui.Collection} Current collection.
|
19307
|
+
*/
|
19308
|
+
remove: function() {
|
19309
|
+
var i = this.length;
|
19310
|
+
|
19311
|
+
while (i--) {
|
19312
|
+
this[i].remove();
|
19313
|
+
}
|
19314
|
+
|
19315
|
+
return this;
|
19179
19316
|
}
|
19180
19317
|
|
19181
19318
|
/**
|
@@ -19406,6 +19543,11 @@ define("tinymce/ui/DomUtils", [
|
|
19406
19543
|
|
19407
19544
|
fire: function(target, name, args) {
|
19408
19545
|
return DOMUtils.DOM.fire(target, name, args);
|
19546
|
+
},
|
19547
|
+
|
19548
|
+
innerHtml: function(elm, html) {
|
19549
|
+
// Workaround for <div> in <p> bug on IE 8 #6178
|
19550
|
+
DOMUtils.DOM.setHTML(elm, html);
|
19409
19551
|
}
|
19410
19552
|
};
|
19411
19553
|
});
|
@@ -20300,6 +20442,18 @@ define("tinymce/ui/Control", [
|
|
20300
20442
|
return classes ? classes.join(' ') : '';
|
20301
20443
|
},
|
20302
20444
|
|
20445
|
+
/**
|
20446
|
+
* Sets the inner HTML of the control element.
|
20447
|
+
*
|
20448
|
+
* @method innerHtml
|
20449
|
+
* @param {String} html Html string to set as inner html.
|
20450
|
+
* @return {tinymce.ui.Control} Current control object.
|
20451
|
+
*/
|
20452
|
+
innerHtml: function(html) {
|
20453
|
+
DomUtils.innerHtml(this.getEl(), html);
|
20454
|
+
return this;
|
20455
|
+
},
|
20456
|
+
|
20303
20457
|
/**
|
20304
20458
|
* Returns the control DOM element or sub element.
|
20305
20459
|
*
|
@@ -20485,11 +20639,11 @@ define("tinymce/ui/Control", [
|
|
20485
20639
|
* @return {tinymce.ui.Control} Current control instance.
|
20486
20640
|
*/
|
20487
20641
|
remove: function() {
|
20488
|
-
var self = this, elm = self.getEl(), parent = self.parent(), newItems;
|
20642
|
+
var self = this, elm = self.getEl(), parent = self.parent(), newItems, i;
|
20489
20643
|
|
20490
20644
|
if (self.items) {
|
20491
20645
|
var controls = self.items().toArray();
|
20492
|
-
|
20646
|
+
i = controls.length;
|
20493
20647
|
while (i--) {
|
20494
20648
|
controls[i].remove();
|
20495
20649
|
}
|
@@ -20513,8 +20667,16 @@ define("tinymce/ui/Control", [
|
|
20513
20667
|
}
|
20514
20668
|
|
20515
20669
|
delete Control.controlIdLookup[self._id];
|
20670
|
+
delete elementIdCache[self._id];
|
20671
|
+
|
20672
|
+
if (elm && elm.parentNode) {
|
20673
|
+
var nodes = elm.getElementsByTagName('*');
|
20674
|
+
|
20675
|
+
i = nodes.length;
|
20676
|
+
while (i--) {
|
20677
|
+
delete elementIdCache[nodes[i].id];
|
20678
|
+
}
|
20516
20679
|
|
20517
|
-
if (elm.parentNode) {
|
20518
20680
|
elm.parentNode.removeChild(elm);
|
20519
20681
|
}
|
20520
20682
|
|
@@ -20892,7 +21054,7 @@ define("tinymce/ui/Control", [
|
|
20892
21054
|
*/
|
20893
21055
|
// title: function(value) {} -- Generated
|
20894
21056
|
});
|
20895
|
-
|
21057
|
+
window.elementIdCache = elementIdCache;
|
20896
21058
|
return Control;
|
20897
21059
|
});
|
20898
21060
|
|
@@ -22484,7 +22646,7 @@ define("tinymce/ui/KeyboardNavigation", [
|
|
22484
22646
|
* @setting {tinymce.ui.Control} root the root control navigation focus movement is scoped to this root.
|
22485
22647
|
* @setting {Array} items an array containing the items to move focus between. Every object in this array must have an
|
22486
22648
|
* id attribute which maps to the actual DOM element and it must be able to have focus i.e. tabIndex=-1.
|
22487
|
-
* @setting {Function} onCancel the callback for when the user presses escape or otherwise indicates
|
22649
|
+
* @setting {Function} onCancel the callback for when the user presses escape or otherwise indicates canceling.
|
22488
22650
|
* @setting {Function} onAction (optional) the action handler to call when the user activates an item.
|
22489
22651
|
* @setting {Boolean} enableLeftRight (optional, default) when true, the up/down arrows move through items.
|
22490
22652
|
* @setting {Boolean} enableUpDown (optional) when true, the up/down arrows move through items.
|
@@ -23183,8 +23345,8 @@ define("tinymce/ui/Window", [
|
|
23183
23345
|
remove: function() {
|
23184
23346
|
var self = this;
|
23185
23347
|
|
23186
|
-
self._super();
|
23187
23348
|
self.dragHelper.destroy();
|
23349
|
+
self._super();
|
23188
23350
|
|
23189
23351
|
if (self.statusbar) {
|
23190
23352
|
this.statusbar.remove();
|
@@ -23440,6 +23602,12 @@ define("tinymce/WindowManager", [
|
|
23440
23602
|
return function(editor) {
|
23441
23603
|
var self = this, windows = [];
|
23442
23604
|
|
23605
|
+
function getTopMostWindow() {
|
23606
|
+
if (windows.length) {
|
23607
|
+
return windows[windows.length - 1];
|
23608
|
+
}
|
23609
|
+
}
|
23610
|
+
|
23443
23611
|
self.windows = windows;
|
23444
23612
|
|
23445
23613
|
/**
|
@@ -23459,6 +23627,10 @@ define("tinymce/WindowManager", [
|
|
23459
23627
|
self.open = function(args, params) {
|
23460
23628
|
var win;
|
23461
23629
|
|
23630
|
+
editor.editorManager.activeEditor = editor;
|
23631
|
+
|
23632
|
+
args.title = args.title || ' ';
|
23633
|
+
|
23462
23634
|
// Handle URL
|
23463
23635
|
args.url = args.url || args.file; // Legacy
|
23464
23636
|
if (args.url) {
|
@@ -23516,7 +23688,8 @@ define("tinymce/WindowManager", [
|
|
23516
23688
|
});
|
23517
23689
|
}
|
23518
23690
|
|
23519
|
-
// store parameters
|
23691
|
+
// store args and parameters
|
23692
|
+
win.features = args || {};
|
23520
23693
|
win.params = params || {};
|
23521
23694
|
|
23522
23695
|
// Takes a snapshot in the FocusManager of the selection before focus is lost to dialog
|
@@ -23572,8 +23745,8 @@ define("tinymce/WindowManager", [
|
|
23572
23745
|
* @method close
|
23573
23746
|
*/
|
23574
23747
|
self.close = function() {
|
23575
|
-
if (
|
23576
|
-
|
23748
|
+
if (getTopMostWindow()) {
|
23749
|
+
getTopMostWindow().close();
|
23577
23750
|
}
|
23578
23751
|
};
|
23579
23752
|
|
@@ -23588,11 +23761,7 @@ define("tinymce/WindowManager", [
|
|
23588
23761
|
* @return {Object} Name/value object with parameters passed from windowManager.open call.
|
23589
23762
|
*/
|
23590
23763
|
self.getParams = function() {
|
23591
|
-
|
23592
|
-
return windows[windows.length - 1].params;
|
23593
|
-
}
|
23594
|
-
|
23595
|
-
return null;
|
23764
|
+
return getTopMostWindow() ? getTopMostWindow().params : null;
|
23596
23765
|
};
|
23597
23766
|
|
23598
23767
|
/**
|
@@ -23602,8 +23771,8 @@ define("tinymce/WindowManager", [
|
|
23602
23771
|
* @param {Object} params Params object to set for the last opened window.
|
23603
23772
|
*/
|
23604
23773
|
self.setParams = function(params) {
|
23605
|
-
if (
|
23606
|
-
|
23774
|
+
if (getTopMostWindow()) {
|
23775
|
+
getTopMostWindow().params = params;
|
23607
23776
|
}
|
23608
23777
|
};
|
23609
23778
|
};
|
@@ -23876,7 +24045,9 @@ define("tinymce/util/Quirks", [
|
|
23876
24045
|
* browser just deletes the paragraph - the browser fails to merge the text node with a horizontal rule so it is
|
23877
24046
|
* left there. TinyMCE sees a floating text node and wraps it in a paragraph on the key up event (ForceBlocks.js
|
23878
24047
|
* addRootBlocks), meaning the action does nothing. With this code, FireFox/IE matche the behaviour of other
|
23879
|
-
* browsers
|
24048
|
+
* browsers.
|
24049
|
+
*
|
24050
|
+
* It also fixes a bug on Firefox where it's impossible to delete HR elements.
|
23880
24051
|
*/
|
23881
24052
|
function removeHrOnBackspace() {
|
23882
24053
|
editor.on('keydown', function(e) {
|
@@ -23885,6 +24056,12 @@ define("tinymce/util/Quirks", [
|
|
23885
24056
|
var node = selection.getNode();
|
23886
24057
|
var previousSibling = node.previousSibling;
|
23887
24058
|
|
24059
|
+
if (node.nodeName == 'HR') {
|
24060
|
+
dom.remove(node);
|
24061
|
+
e.preventDefault();
|
24062
|
+
return;
|
24063
|
+
}
|
24064
|
+
|
23888
24065
|
if (previousSibling && previousSibling.nodeName && previousSibling.nodeName.toLowerCase() === "hr") {
|
23889
24066
|
dom.remove(previousSibling);
|
23890
24067
|
e.preventDefault();
|
@@ -23953,7 +24130,7 @@ define("tinymce/util/Quirks", [
|
|
23953
24130
|
* Instead of:
|
23954
24131
|
* <p style="color:red">bla|ed</p>
|
23955
24132
|
*/
|
23956
|
-
function
|
24133
|
+
function removeStylesWhenDeletingAcrossBlockElements() {
|
23957
24134
|
function getAttributeApplyFunction() {
|
23958
24135
|
var template = dom.getAttribs(selection.getStart().cloneNode(false));
|
23959
24136
|
|
@@ -24513,6 +24690,44 @@ define("tinymce/util/Quirks", [
|
|
24513
24690
|
);
|
24514
24691
|
}
|
24515
24692
|
|
24693
|
+
/**
|
24694
|
+
* iOS has a bug where it's impossible to type if the document has a touchstart event
|
24695
|
+
* bound and the user touches the document while having the on screen keyboard visible.
|
24696
|
+
*
|
24697
|
+
* The touch event moves the focus to the parent document while having the caret inside the iframe
|
24698
|
+
* this fix moves the focus back into the iframe document.
|
24699
|
+
*/
|
24700
|
+
function restoreFocusOnKeyDown() {
|
24701
|
+
if (!editor.inline) {
|
24702
|
+
editor.on('keydown', function() {
|
24703
|
+
if (document.activeElement == document.body) {
|
24704
|
+
editor.getWin().focus();
|
24705
|
+
}
|
24706
|
+
});
|
24707
|
+
}
|
24708
|
+
}
|
24709
|
+
|
24710
|
+
/**
|
24711
|
+
* IE 11 has an annoying issue where you can't move focus into the editor
|
24712
|
+
* by clicking on the white area HTML element. We used to be able to to fix this with
|
24713
|
+
* the fixCaretSelectionOfDocumentElementOnIe fix. But since M$ removed the selection
|
24714
|
+
* object it's not possible anymore. So we need to hack in a ungly CSS to force the
|
24715
|
+
* body to be at least 150px. If the user clicks the HTML element out side this 150px region
|
24716
|
+
* we simply move the focus into the first paragraph. Not ideal since you loose the
|
24717
|
+
* positioning of the caret but goot enough for most cases.
|
24718
|
+
*/
|
24719
|
+
function bodyHeight() {
|
24720
|
+
if (!editor.inline) {
|
24721
|
+
editor.contentStyles.push('body {min-height: 150px}');
|
24722
|
+
editor.on('click', function(e) {
|
24723
|
+
if (e.target.nodeName == 'HTML') {
|
24724
|
+
editor.execCommand('SelectAll');
|
24725
|
+
editor.selection.collapse(true);
|
24726
|
+
}
|
24727
|
+
});
|
24728
|
+
}
|
24729
|
+
}
|
24730
|
+
|
24516
24731
|
// All browsers
|
24517
24732
|
disableBackspaceIntoATable();
|
24518
24733
|
removeBlockQuoteOnBackSpace();
|
@@ -24530,13 +24745,14 @@ define("tinymce/util/Quirks", [
|
|
24530
24745
|
// iOS
|
24531
24746
|
if (Env.iOS) {
|
24532
24747
|
selectionChangeNodeChanged();
|
24748
|
+
restoreFocusOnKeyDown();
|
24533
24749
|
} else {
|
24534
24750
|
selectAll();
|
24535
24751
|
}
|
24536
24752
|
}
|
24537
24753
|
|
24538
24754
|
// IE
|
24539
|
-
if (isIE) {
|
24755
|
+
if (isIE && Env.ie < 11) {
|
24540
24756
|
removeHrOnBackspace();
|
24541
24757
|
ensureBodyHasRoleApplication();
|
24542
24758
|
addNewLinesBeforeBrInPre();
|
@@ -24547,11 +24763,15 @@ define("tinymce/util/Quirks", [
|
|
24547
24763
|
fixCaretSelectionOfDocumentElementOnIe();
|
24548
24764
|
}
|
24549
24765
|
|
24766
|
+
if (Env.ie >= 11) {
|
24767
|
+
bodyHeight();
|
24768
|
+
}
|
24769
|
+
|
24550
24770
|
// Gecko
|
24551
24771
|
if (isGecko) {
|
24552
24772
|
removeHrOnBackspace();
|
24553
24773
|
focusBody();
|
24554
|
-
|
24774
|
+
removeStylesWhenDeletingAcrossBlockElements();
|
24555
24775
|
setGeckoEditingOptions();
|
24556
24776
|
addBrAfterLastLinks();
|
24557
24777
|
removeGhostSelection();
|
@@ -24988,7 +25208,7 @@ define("tinymce/Editor", [
|
|
24988
25208
|
var extend = Tools.extend, each = Tools.each, explode = Tools.explode;
|
24989
25209
|
var inArray = Tools.inArray, trim = Tools.trim, resolve = Tools.resolve;
|
24990
25210
|
var Event = EventUtils.Event;
|
24991
|
-
var isGecko = Env.gecko,
|
25211
|
+
var isGecko = Env.gecko, ie = Env.ie, isOpera = Env.opera;
|
24992
25212
|
|
24993
25213
|
function getEventTarget(editor, eventName) {
|
24994
25214
|
if (eventName == 'selectionchange' || eventName == 'drop') {
|
@@ -25075,8 +25295,9 @@ define("tinymce/Editor", [
|
|
25075
25295
|
ie7_compat: true
|
25076
25296
|
}, settings);
|
25077
25297
|
|
25078
|
-
|
25079
|
-
AddOnManager.
|
25298
|
+
AddOnManager.language = settings.language || 'en';
|
25299
|
+
AddOnManager.languageLoad = settings.language_load;
|
25300
|
+
|
25080
25301
|
AddOnManager.baseURL = editorManager.baseURL;
|
25081
25302
|
|
25082
25303
|
/**
|
@@ -25176,6 +25397,7 @@ define("tinymce/Editor", [
|
|
25176
25397
|
|
25177
25398
|
// Call setup
|
25178
25399
|
self.execCallback('setup', self);
|
25400
|
+
editorManager.fire('SetupEditor', self);
|
25179
25401
|
}
|
25180
25402
|
|
25181
25403
|
Editor.prototype = {
|
@@ -25187,16 +25409,17 @@ define("tinymce/Editor", [
|
|
25187
25409
|
render: function() {
|
25188
25410
|
var self = this, settings = self.settings, id = self.id, suffix = self.suffix;
|
25189
25411
|
|
25412
|
+
function readyHandler() {
|
25413
|
+
DOM.unbind(window, 'ready', readyHandler);
|
25414
|
+
self.render();
|
25415
|
+
}
|
25416
|
+
|
25190
25417
|
// Page is not loaded yet, wait for it
|
25191
25418
|
if (!Event.domLoaded) {
|
25192
|
-
DOM.bind(window, 'ready',
|
25193
|
-
self.render();
|
25194
|
-
});
|
25419
|
+
DOM.bind(window, 'ready', readyHandler);
|
25195
25420
|
return;
|
25196
25421
|
}
|
25197
25422
|
|
25198
|
-
self.editorManager.settings = settings;
|
25199
|
-
|
25200
25423
|
// Element not found, then skip initialization
|
25201
25424
|
if (!self.getElement()) {
|
25202
25425
|
return;
|
@@ -25281,7 +25504,6 @@ define("tinymce/Editor", [
|
|
25281
25504
|
self.on('submit', function() {
|
25282
25505
|
if (self.initialized) {
|
25283
25506
|
self.save();
|
25284
|
-
self.isNotDirty = true;
|
25285
25507
|
}
|
25286
25508
|
});
|
25287
25509
|
}
|
@@ -25289,7 +25511,7 @@ define("tinymce/Editor", [
|
|
25289
25511
|
if (settings.add_unload_trigger) {
|
25290
25512
|
self._beforeUnload = function() {
|
25291
25513
|
if (self.initialized && !self.destroyed && !self.isHidden()) {
|
25292
|
-
self.save({format: 'raw', no_events: true});
|
25514
|
+
self.save({format: 'raw', no_events: true, set_dirty: false});
|
25293
25515
|
}
|
25294
25516
|
};
|
25295
25517
|
|
@@ -25310,7 +25532,15 @@ define("tinymce/Editor", [
|
|
25310
25532
|
|
25311
25533
|
if (settings.theme && typeof settings.theme != "function" &&
|
25312
25534
|
settings.theme.charAt(0) != '-' && !ThemeManager.urls[settings.theme]) {
|
25313
|
-
|
25535
|
+
var themeUrl = settings.theme_url;
|
25536
|
+
|
25537
|
+
if (themeUrl) {
|
25538
|
+
themeUrl = self.documentBaseURI.toAbsolute(themeUrl);
|
25539
|
+
} else {
|
25540
|
+
themeUrl = 'themes/' + settings.theme + '/theme' + suffix + '.js';
|
25541
|
+
}
|
25542
|
+
|
25543
|
+
ThemeManager.load(settings.theme, themeUrl);
|
25314
25544
|
}
|
25315
25545
|
|
25316
25546
|
if (Tools.isArray(settings.plugins)) {
|
@@ -25548,7 +25778,7 @@ define("tinymce/Editor", [
|
|
25548
25778
|
|
25549
25779
|
// Domain relaxing enabled, then set document domain
|
25550
25780
|
// TODO: Fix this old stuff
|
25551
|
-
if (self.editorManager.relaxedDomain && (
|
25781
|
+
if (self.editorManager.relaxedDomain && (ie || (isOpera && parseFloat(window.opera.version()) < 11))) {
|
25552
25782
|
// We need to write the contents here in IE since multiple writes messes up refresh button and back button
|
25553
25783
|
url = 'javascript:(function(){document.open();document.domain="' + document.domain + '";' +
|
25554
25784
|
'var ed = window.parent.tinymce.get("' + self.id + '");document.write(ed.iframeHTML);' +
|
@@ -25605,7 +25835,7 @@ define("tinymce/Editor", [
|
|
25605
25835
|
}
|
25606
25836
|
|
25607
25837
|
// Setup iframe body
|
25608
|
-
if ((!
|
25838
|
+
if ((!ie || !self.editorManager.relaxedDomain) && !settings.content_editable) {
|
25609
25839
|
doc.open();
|
25610
25840
|
doc.write(self.iframeHTML);
|
25611
25841
|
doc.close();
|
@@ -25673,6 +25903,7 @@ define("tinymce/Editor", [
|
|
25673
25903
|
class_filter: settings.class_filter,
|
25674
25904
|
update_styles: true,
|
25675
25905
|
root_element: settings.content_editable ? self.id : null,
|
25906
|
+
collect: settings.content_editable,
|
25676
25907
|
schema: self.schema,
|
25677
25908
|
onSetAttrib: function(e) {
|
25678
25909
|
self.fire('SetAttrib', e);
|
@@ -26007,8 +26238,8 @@ define("tinymce/Editor", [
|
|
26007
26238
|
return '';
|
26008
26239
|
}
|
26009
26240
|
|
26010
|
-
return i18n[lang + '.' + text] || text.replace(/\{\#([^\}]+)\}/g, function(a, b) {
|
26011
|
-
return i18n[lang + '.' + b] || '{#' + b + '}';
|
26241
|
+
return i18n.data[lang + '.' + text] || text.replace(/\{\#([^\}]+)\}/g, function(a, b) {
|
26242
|
+
return i18n.data[lang + '.' + b] || '{#' + b + '}';
|
26012
26243
|
});
|
26013
26244
|
},
|
26014
26245
|
|
@@ -26021,7 +26252,7 @@ define("tinymce/Editor", [
|
|
26021
26252
|
*/
|
26022
26253
|
getLang: function(name, defaultVal) {
|
26023
26254
|
return (
|
26024
|
-
this.editorManager.i18n[(this.settings.language || 'en') + '.' + name] ||
|
26255
|
+
this.editorManager.i18n.data[(this.settings.language || 'en') + '.' + name] ||
|
26025
26256
|
(defaultVal !== undefined ? defaultVal : '{#' + name + '}')
|
26026
26257
|
);
|
26027
26258
|
},
|
@@ -26081,7 +26312,7 @@ define("tinymce/Editor", [
|
|
26081
26312
|
// Get start node
|
26082
26313
|
root = self.getBody();
|
26083
26314
|
node = selection.getStart() || root;
|
26084
|
-
node =
|
26315
|
+
node = ie && node.ownerDocument != self.getDoc() ? self.getBody() : node; // Fix for IE initial state
|
26085
26316
|
|
26086
26317
|
// Edge case for <p>|<img></p>
|
26087
26318
|
if (node.nodeName == 'IMG' && selection.isCollapsed()) {
|
@@ -26432,7 +26663,7 @@ define("tinymce/Editor", [
|
|
26432
26663
|
var self = this, doc = self.getDoc();
|
26433
26664
|
|
26434
26665
|
// Fixed bug where IE has a blinking cursor left from the editor
|
26435
|
-
if (
|
26666
|
+
if (ie && doc) {
|
26436
26667
|
doc.execCommand('SelectAll');
|
26437
26668
|
}
|
26438
26669
|
|
@@ -26551,7 +26782,10 @@ define("tinymce/Editor", [
|
|
26551
26782
|
}
|
26552
26783
|
|
26553
26784
|
args.element = elm = null;
|
26554
|
-
|
26785
|
+
|
26786
|
+
if (args.set_dirty !== false) {
|
26787
|
+
self.isNotDirty = true;
|
26788
|
+
}
|
26555
26789
|
|
26556
26790
|
return html;
|
26557
26791
|
},
|
@@ -26595,42 +26829,54 @@ define("tinymce/Editor", [
|
|
26595
26829
|
|
26596
26830
|
// Padd empty content in Gecko and Safari. Commands will otherwise fail on the content
|
26597
26831
|
// It will also be impossible to place the caret in the editor unless there is a BR element present
|
26598
|
-
if (
|
26832
|
+
if (content.length === 0 || /^\s+$/.test(content)) {
|
26599
26833
|
forcedRootBlockName = self.settings.forced_root_block;
|
26600
26834
|
|
26601
26835
|
// Check if forcedRootBlock is configured and that the block is a valid child of the body
|
26602
26836
|
if (forcedRootBlockName && self.schema.isValidChild(body.nodeName.toLowerCase(), forcedRootBlockName.toLowerCase())) {
|
26603
|
-
|
26604
|
-
|
26837
|
+
if (ie && ie < 11) {
|
26838
|
+
// IE renders BR elements in blocks so lets just add an empty block
|
26839
|
+
content = '<' + forcedRootBlockName + '></' + forcedRootBlockName + '>';
|
26840
|
+
} else {
|
26841
|
+
content = '<' + forcedRootBlockName + '><br data-mce-bogus="1"></' + forcedRootBlockName + '>';
|
26842
|
+
}
|
26843
|
+
} else if (!ie) {
|
26844
|
+
// We need to add a BR when forced_root_block is disabled on non IE browsers to place the caret
|
26605
26845
|
content = '<br data-mce-bogus="1">';
|
26606
26846
|
}
|
26607
26847
|
|
26608
26848
|
body.innerHTML = content;
|
26609
|
-
|
26610
|
-
self.selection.collapse(true);
|
26849
|
+
|
26611
26850
|
self.fire('SetContent', args);
|
26612
|
-
|
26613
|
-
|
26851
|
+
} else {
|
26852
|
+
// Parse and serialize the html
|
26853
|
+
if (args.format !== 'raw') {
|
26854
|
+
content = new Serializer({}, self.schema).serialize(
|
26855
|
+
self.parser.parse(content, {isRootContent: true})
|
26856
|
+
);
|
26857
|
+
}
|
26614
26858
|
|
26615
|
-
|
26616
|
-
|
26617
|
-
|
26618
|
-
self.parser.parse(content, {isRootContent: true})
|
26619
|
-
);
|
26620
|
-
}
|
26859
|
+
// Set the new cleaned contents to the editor
|
26860
|
+
args.content = trim(content);
|
26861
|
+
self.dom.setHTML(body, args.content);
|
26621
26862
|
|
26622
|
-
|
26623
|
-
|
26624
|
-
|
26863
|
+
// Do post processing
|
26864
|
+
if (!args.no_events) {
|
26865
|
+
self.fire('SetContent', args);
|
26866
|
+
}
|
26625
26867
|
|
26626
|
-
|
26627
|
-
|
26628
|
-
self.
|
26868
|
+
// Don't normalize selection if the focused element isn't the body in
|
26869
|
+
// content editable mode since it will steal focus otherwise
|
26870
|
+
/*if (!self.settings.content_editable || document.activeElement === self.getBody()) {
|
26871
|
+
self.selection.normalize();
|
26872
|
+
}*/
|
26629
26873
|
}
|
26630
26874
|
|
26631
|
-
//
|
26632
|
-
|
26633
|
-
|
26875
|
+
// Move selection to start of body if it's a after init setContent call
|
26876
|
+
// This prevents IE 7/8 from moving focus to empty editors
|
26877
|
+
if (!args.initial) {
|
26878
|
+
self.selection.select(body, true);
|
26879
|
+
self.selection.collapse(true);
|
26634
26880
|
}
|
26635
26881
|
|
26636
26882
|
return args.content;
|
@@ -26903,7 +27149,7 @@ define("tinymce/Editor", [
|
|
26903
27149
|
self.removed = 1; // Cancels post remove event execution
|
26904
27150
|
|
26905
27151
|
// Fixed bug where IE has a blinking cursor left from the editor
|
26906
|
-
if (
|
27152
|
+
if (ie && doc) {
|
26907
27153
|
doc.execCommand('SelectAll');
|
26908
27154
|
}
|
26909
27155
|
|
@@ -26926,6 +27172,7 @@ define("tinymce/Editor", [
|
|
26926
27172
|
|
26927
27173
|
self.editorManager.remove(self);
|
26928
27174
|
DOM.remove(elm);
|
27175
|
+
self.destroy();
|
26929
27176
|
}
|
26930
27177
|
},
|
26931
27178
|
|
@@ -26971,7 +27218,7 @@ define("tinymce/Editor", [
|
|
26971
27218
|
|
26972
27219
|
// We must unbind on Gecko since it would otherwise produce the pesky "attempt
|
26973
27220
|
// to run compile-and-go script on a cleared scope" message
|
26974
|
-
if (isGecko) {
|
27221
|
+
if (automatic && isGecko) {
|
26975
27222
|
Event.unbind(self.getDoc());
|
26976
27223
|
Event.unbind(self.getWin());
|
26977
27224
|
Event.unbind(self.getBody());
|
@@ -26992,8 +27239,11 @@ define("tinymce/Editor", [
|
|
26992
27239
|
|
26993
27240
|
form = self.formElement;
|
26994
27241
|
if (form) {
|
26995
|
-
|
26996
|
-
|
27242
|
+
if (form._mceOldSubmit) {
|
27243
|
+
form.submit = form._mceOldSubmit;
|
27244
|
+
form._mceOldSubmit = null;
|
27245
|
+
}
|
27246
|
+
|
26997
27247
|
DOM.unbind(form, 'submit reset', self.formEventDelegate);
|
26998
27248
|
}
|
26999
27249
|
|
@@ -27157,6 +27407,35 @@ define("tinymce/FocusManager", [
|
|
27157
27407
|
}
|
27158
27408
|
}
|
27159
27409
|
|
27410
|
+
// We can't store a real range on IE 11 since it gets mutated so we need to use a bookmark object
|
27411
|
+
// TODO: Move this to a separate range utils class since it's it's logic is present in Selection as well.
|
27412
|
+
function createBookmark(rng) {
|
27413
|
+
if (rng && rng.startContainer) {
|
27414
|
+
return {
|
27415
|
+
startContainer: rng.startContainer,
|
27416
|
+
startOffset: rng.startOffset,
|
27417
|
+
endContainer: rng.endContainer,
|
27418
|
+
endOffset: rng.endOffset
|
27419
|
+
};
|
27420
|
+
}
|
27421
|
+
|
27422
|
+
return rng;
|
27423
|
+
}
|
27424
|
+
|
27425
|
+
function bookmarkToRng(editor, bookmark) {
|
27426
|
+
var rng;
|
27427
|
+
|
27428
|
+
if (bookmark.startContainer) {
|
27429
|
+
rng = editor.getDoc().createRange();
|
27430
|
+
rng.setStart(bookmark.startContainer, bookmark.startOffset);
|
27431
|
+
rng.setEnd(bookmark.endContainer, bookmark.endOffset);
|
27432
|
+
} else {
|
27433
|
+
rng = bookmark;
|
27434
|
+
}
|
27435
|
+
|
27436
|
+
return rng;
|
27437
|
+
}
|
27438
|
+
|
27160
27439
|
function registerEvents(e) {
|
27161
27440
|
var editor = e.editor, lastRng, selectionChangeHandler;
|
27162
27441
|
|
@@ -27166,16 +27445,26 @@ define("tinymce/FocusManager", [
|
|
27166
27445
|
|
27167
27446
|
editor.on('init', function() {
|
27168
27447
|
// On IE take selection snapshot onbeforedeactivate
|
27169
|
-
if ("onbeforedeactivate" in document) {
|
27448
|
+
if ("onbeforedeactivate" in document && Env.ie < 11) {
|
27170
27449
|
editor.dom.bind(editor.getBody(), 'beforedeactivate', function() {
|
27171
27450
|
var ieSelection = editor.getDoc().selection;
|
27172
|
-
|
27451
|
+
|
27452
|
+
try {
|
27453
|
+
lastRng = ieSelection && ieSelection.createRange ? ieSelection.createRange() : editor.selection.getRng();
|
27454
|
+
} catch (ex) {
|
27455
|
+
// IE throws "Unexcpected call to method or property access" some times so lets ignore it
|
27456
|
+
}
|
27173
27457
|
});
|
27174
|
-
} else if (editor.inline) {
|
27458
|
+
} else if (editor.inline || Env.ie > 10) {
|
27175
27459
|
// On other browsers take snapshot on nodechange in inline mode since they have Ghost selections for iframes
|
27176
|
-
editor.on('nodechange', function() {
|
27460
|
+
editor.on('nodechange keyup', function() {
|
27177
27461
|
var isInBody, node = document.activeElement;
|
27178
27462
|
|
27463
|
+
// IE 11 reports active element as iframe not body of iframe
|
27464
|
+
if (node && node.id == editor.id + '_ifr') {
|
27465
|
+
node = editor.getBody();
|
27466
|
+
}
|
27467
|
+
|
27179
27468
|
// Check if selection is within editor body
|
27180
27469
|
while (node) {
|
27181
27470
|
if (node == editor.getBody()) {
|
@@ -27215,12 +27504,17 @@ define("tinymce/FocusManager", [
|
|
27215
27504
|
}
|
27216
27505
|
});
|
27217
27506
|
|
27507
|
+
// Remove last selection bookmark on mousedown see #6305
|
27508
|
+
editor.on('mousedown', function() {
|
27509
|
+
editor.selection.lastFocusBookmark = null;
|
27510
|
+
});
|
27511
|
+
|
27218
27512
|
editor.on('focusin', function() {
|
27219
27513
|
var focusedEditor = editorManager.focusedEditor;
|
27220
27514
|
|
27221
|
-
if (editor.selection.
|
27222
|
-
editor.selection.setRng(editor.selection.
|
27223
|
-
editor.selection.
|
27515
|
+
if (editor.selection.lastFocusBookmark) {
|
27516
|
+
editor.selection.setRng(bookmarkToRng(editor, editor.selection.lastFocusBookmark));
|
27517
|
+
editor.selection.lastFocusBookmark = null;
|
27224
27518
|
}
|
27225
27519
|
|
27226
27520
|
if (focusedEditor != editor) {
|
@@ -27228,6 +27522,7 @@ define("tinymce/FocusManager", [
|
|
27228
27522
|
focusedEditor.fire('blur', {focusedEditor: editor});
|
27229
27523
|
}
|
27230
27524
|
|
27525
|
+
editorManager.activeEditor = editor;
|
27231
27526
|
editor.fire('focus', {blurredEditor: focusedEditor});
|
27232
27527
|
editor.focus(false);
|
27233
27528
|
editorManager.focusedEditor = editor;
|
@@ -27235,21 +27530,21 @@ define("tinymce/FocusManager", [
|
|
27235
27530
|
});
|
27236
27531
|
|
27237
27532
|
editor.on('focusout', function() {
|
27238
|
-
editor.selection.
|
27533
|
+
editor.selection.lastFocusBookmark = createBookmark(lastRng);
|
27239
27534
|
|
27240
27535
|
window.setTimeout(function() {
|
27241
27536
|
var focusedEditor = editorManager.focusedEditor;
|
27242
27537
|
|
27243
27538
|
// Focus from editorA into editorB then don't restore selection
|
27244
27539
|
if (focusedEditor != editor) {
|
27245
|
-
editor.selection.
|
27540
|
+
editor.selection.lastFocusBookmark = null;
|
27246
27541
|
}
|
27247
27542
|
|
27248
|
-
// Still the same editor the the blur was outside any editor
|
27543
|
+
// Still the same editor the the blur was outside any editor UI
|
27249
27544
|
if (!isUIElement(getActiveElement()) && focusedEditor == editor) {
|
27250
27545
|
editor.fire('blur', {focusedEditor: null});
|
27251
27546
|
editorManager.focusedEditor = null;
|
27252
|
-
editor.selection.
|
27547
|
+
editor.selection.lastFocusBookmark = null;
|
27253
27548
|
}
|
27254
27549
|
}, 0);
|
27255
27550
|
});
|
@@ -27285,7 +27580,7 @@ define("tinymce/FocusManager", [
|
|
27285
27580
|
*/
|
27286
27581
|
|
27287
27582
|
/**
|
27288
|
-
* This class used as a factory for manager for tinymce.Editor
|
27583
|
+
* This class used as a factory for manager for tinymce.Editor instances.
|
27289
27584
|
*
|
27290
27585
|
* @example
|
27291
27586
|
* tinymce.EditorManager.init({});
|
@@ -27323,7 +27618,7 @@ define("tinymce/EditorManager", [
|
|
27323
27618
|
* @property minorVersion
|
27324
27619
|
* @type String
|
27325
27620
|
*/
|
27326
|
-
minorVersion : '0',
|
27621
|
+
minorVersion : '0.6',
|
27327
27622
|
|
27328
27623
|
/**
|
27329
27624
|
* Release date of TinyMCE build.
|
@@ -27331,7 +27626,7 @@ define("tinymce/EditorManager", [
|
|
27331
27626
|
* @property releaseDate
|
27332
27627
|
* @type String
|
27333
27628
|
*/
|
27334
|
-
releaseDate: '2013-
|
27629
|
+
releaseDate: '2013-09-12',
|
27335
27630
|
|
27336
27631
|
/**
|
27337
27632
|
* Collection of editor instances.
|
@@ -27482,11 +27777,11 @@ define("tinymce/EditorManager", [
|
|
27482
27777
|
return c.constructor === RegExp ? c.test(n.className) : DOM.hasClass(n, c);
|
27483
27778
|
}
|
27484
27779
|
|
27485
|
-
|
27486
|
-
|
27487
|
-
DOM.bind(window, 'ready', function() {
|
27780
|
+
function readyHandler() {
|
27488
27781
|
var l, co;
|
27489
27782
|
|
27783
|
+
DOM.unbind(window, 'ready', readyHandler);
|
27784
|
+
|
27490
27785
|
execCallback(settings, 'onpageload');
|
27491
27786
|
|
27492
27787
|
if (settings.types) {
|
@@ -27583,7 +27878,11 @@ define("tinymce/EditorManager", [
|
|
27583
27878
|
}
|
27584
27879
|
});
|
27585
27880
|
}
|
27586
|
-
}
|
27881
|
+
}
|
27882
|
+
|
27883
|
+
self.settings = settings;
|
27884
|
+
|
27885
|
+
DOM.bind(window, 'ready', readyHandler);
|
27587
27886
|
},
|
27588
27887
|
|
27589
27888
|
/**
|
@@ -27679,7 +27978,7 @@ define("tinymce/EditorManager", [
|
|
27679
27978
|
* @return {tinymce.Editor} The editor that got passed in will be return if it was found otherwise null.
|
27680
27979
|
*/
|
27681
27980
|
remove: function(selector) {
|
27682
|
-
var self = this, i, editors = self.editors, editor;
|
27981
|
+
var self = this, i, editors = self.editors, editor, removedFromList;
|
27683
27982
|
|
27684
27983
|
// Remove all editors
|
27685
27984
|
if (!selector) {
|
@@ -27714,6 +28013,7 @@ define("tinymce/EditorManager", [
|
|
27714
28013
|
for (i = 0; i < editors.length; i++) {
|
27715
28014
|
if (editors[i] == editor) {
|
27716
28015
|
editors.splice(i, 1);
|
28016
|
+
removedFromList = true;
|
27717
28017
|
break;
|
27718
28018
|
}
|
27719
28019
|
}
|
@@ -27723,26 +28023,22 @@ define("tinymce/EditorManager", [
|
|
27723
28023
|
self.activeEditor = editors[0];
|
27724
28024
|
}
|
27725
28025
|
|
27726
|
-
// Don't remove missing editor or removed instances
|
27727
|
-
if (!editor || editor.removed) {
|
27728
|
-
return;
|
27729
|
-
}
|
27730
|
-
|
27731
|
-
editor.remove();
|
27732
|
-
editor.destroy();
|
27733
|
-
|
27734
28026
|
/**
|
27735
28027
|
* Fires when an editor is removed from EditorManager collection.
|
27736
28028
|
*
|
27737
28029
|
* @event RemoveEditor
|
27738
28030
|
* @param {Object} e Event arguments.
|
27739
28031
|
*/
|
27740
|
-
|
28032
|
+
if (removedFromList) {
|
28033
|
+
self.fire('RemoveEditor', {editor: editor});
|
28034
|
+
}
|
27741
28035
|
|
27742
28036
|
if (!editors.length) {
|
27743
28037
|
DOM.unbind(window, 'beforeunload', beforeUnloadDelegate);
|
27744
28038
|
}
|
27745
28039
|
|
28040
|
+
editor.remove();
|
28041
|
+
|
27746
28042
|
return editor;
|
27747
28043
|
},
|
27748
28044
|
|
@@ -27863,10 +28159,10 @@ define("tinymce/LegacyInput", [
|
|
27863
28159
|
var each = Tools.each, explode = Tools.explode;
|
27864
28160
|
|
27865
28161
|
EditorManager.on('AddEditor', function(e) {
|
27866
|
-
var
|
28162
|
+
var editor = e.editor;
|
27867
28163
|
|
27868
|
-
|
27869
|
-
var filters, fontSizes, dom, settings =
|
28164
|
+
editor.on('preInit', function() {
|
28165
|
+
var filters, fontSizes, dom, settings = editor.settings;
|
27870
28166
|
|
27871
28167
|
function replaceWithSpan(node, styles) {
|
27872
28168
|
each(styles, function(value, name) {
|
@@ -27879,7 +28175,7 @@ define("tinymce/LegacyInput", [
|
|
27879
28175
|
}
|
27880
28176
|
|
27881
28177
|
function convert(e) {
|
27882
|
-
dom =
|
28178
|
+
dom = editor.dom;
|
27883
28179
|
|
27884
28180
|
if (settings.convert_fonts_to_spans) {
|
27885
28181
|
each(dom.select('font,u,strike', e.node), function(node) {
|
@@ -27914,7 +28210,7 @@ define("tinymce/LegacyInput", [
|
|
27914
28210
|
}
|
27915
28211
|
};
|
27916
28212
|
|
27917
|
-
|
28213
|
+
editor.on('PreProcess SetContent', convert);
|
27918
28214
|
}
|
27919
28215
|
});
|
27920
28216
|
});
|
@@ -28305,16 +28601,24 @@ define("tinymce/util/JSONP", [
|
|
28305
28601
|
* var value = tinymce.util.LocalStorage.getItem('key');
|
28306
28602
|
*/
|
28307
28603
|
define("tinymce/util/LocalStorage", [], function() {
|
28308
|
-
var LocalStorage, storageElm, items, keys, userDataKey;
|
28604
|
+
var LocalStorage, storageElm, items, keys, userDataKey, hasOldIEDataSupport;
|
28309
28605
|
|
28310
28606
|
// Check for native support
|
28311
|
-
|
28312
|
-
|
28607
|
+
try {
|
28608
|
+
if (window.localStorage) {
|
28609
|
+
return localStorage;
|
28610
|
+
}
|
28611
|
+
} catch (ex) {
|
28612
|
+
// Ignore
|
28313
28613
|
}
|
28314
28614
|
|
28315
28615
|
userDataKey = "tinymce";
|
28316
28616
|
storageElm = document.documentElement;
|
28317
|
-
storageElm.addBehavior
|
28617
|
+
hasOldIEDataSupport = !!storageElm.addBehavior;
|
28618
|
+
|
28619
|
+
if (hasOldIEDataSupport) {
|
28620
|
+
storageElm.addBehavior('#default#userData');
|
28621
|
+
}
|
28318
28622
|
|
28319
28623
|
/**
|
28320
28624
|
* Gets the keys names and updates LocalStorage.length property. Since IE7 doesn't have any getters/setters.
|
@@ -28337,6 +28641,11 @@ define("tinymce/util/LocalStorage", [], function() {
|
|
28337
28641
|
|
28338
28642
|
items = {};
|
28339
28643
|
|
28644
|
+
// localStorage can be disabled on WebKit/Gecko so make a dummy storage
|
28645
|
+
if (!hasOldIEDataSupport) {
|
28646
|
+
return;
|
28647
|
+
}
|
28648
|
+
|
28340
28649
|
function next(end) {
|
28341
28650
|
var value, nextPos;
|
28342
28651
|
|
@@ -28371,6 +28680,11 @@ define("tinymce/util/LocalStorage", [], function() {
|
|
28371
28680
|
function save() {
|
28372
28681
|
var value, data = '';
|
28373
28682
|
|
28683
|
+
// localStorage can be disabled on WebKit/Gecko so make a dummy storage
|
28684
|
+
if (!hasOldIEDataSupport) {
|
28685
|
+
return;
|
28686
|
+
}
|
28687
|
+
|
28374
28688
|
for (var key in items) {
|
28375
28689
|
value = items[key];
|
28376
28690
|
data += (data ? ',' : '') + key.length.toString(32) + ',' + key + ',' + value.length.toString(32) + ',' + value;
|
@@ -28987,7 +29301,7 @@ define("tinymce/ui/Widget", [
|
|
28987
29301
|
*
|
28988
29302
|
* @example
|
28989
29303
|
* // Create and render a button to the body element
|
28990
|
-
* tinymce.ui.Factory({
|
29304
|
+
* tinymce.ui.Factory.create({
|
28991
29305
|
* type: 'button',
|
28992
29306
|
* text: 'My button'
|
28993
29307
|
* }).renderTo(document.body);
|
@@ -29095,7 +29409,7 @@ define("tinymce/ui/Button", [
|
|
29095
29409
|
*
|
29096
29410
|
* @example
|
29097
29411
|
* // Create and render a buttongroup with two buttons to the body element
|
29098
|
-
* tinymce.ui.Factory({
|
29412
|
+
* tinymce.ui.Factory.create({
|
29099
29413
|
* type: 'buttongroup',
|
29100
29414
|
* items: [
|
29101
29415
|
* {text: 'Button A'},
|
@@ -29159,7 +29473,7 @@ define("tinymce/ui/ButtonGroup", [
|
|
29159
29473
|
*
|
29160
29474
|
* @example
|
29161
29475
|
* // Create and render a checkbox to the body element
|
29162
|
-
* tinymce.ui.Factory({
|
29476
|
+
* tinymce.ui.Factory.create({
|
29163
29477
|
* type: 'checkbox',
|
29164
29478
|
* checked: true,
|
29165
29479
|
* text: 'My checkbox'
|
@@ -29657,6 +29971,11 @@ define("tinymce/ui/ComboBox", [
|
|
29657
29971
|
return self._super();
|
29658
29972
|
},
|
29659
29973
|
|
29974
|
+
remove: function() {
|
29975
|
+
DomUtils.off(this.getEl('inp'));
|
29976
|
+
this._super();
|
29977
|
+
},
|
29978
|
+
|
29660
29979
|
/**
|
29661
29980
|
* Renders the control as a HTML string.
|
29662
29981
|
*
|
@@ -29792,7 +30111,7 @@ define("tinymce/ui/Path", [
|
|
29792
30111
|
* @private
|
29793
30112
|
*/
|
29794
30113
|
update: function() {
|
29795
|
-
this.
|
30114
|
+
this.innerHtml(this._getPathHtml());
|
29796
30115
|
},
|
29797
30116
|
|
29798
30117
|
/**
|
@@ -30622,191 +30941,195 @@ define("tinymce/ui/FlowLayout", [
|
|
30622
30941
|
* @class tinymce.ui.FormatControls
|
30623
30942
|
*/
|
30624
30943
|
define("tinymce/ui/FormatControls", [
|
30625
|
-
"tinymce/ui/Factory",
|
30626
30944
|
"tinymce/ui/Control",
|
30627
30945
|
"tinymce/ui/Widget",
|
30628
30946
|
"tinymce/ui/FloatPanel",
|
30629
30947
|
"tinymce/util/Tools",
|
30630
30948
|
"tinymce/EditorManager",
|
30631
30949
|
"tinymce/Env"
|
30632
|
-
], function(
|
30950
|
+
], function(Control, Widget, FloatPanel, Tools, EditorManager, Env) {
|
30633
30951
|
var each = Tools.each;
|
30634
30952
|
|
30953
|
+
EditorManager.on('AddEditor', function(e) {
|
30954
|
+
registerControls(e.editor);
|
30955
|
+
});
|
30956
|
+
|
30635
30957
|
Control.translate = function(text) {
|
30636
30958
|
return EditorManager.translate(text);
|
30637
30959
|
};
|
30638
30960
|
|
30639
30961
|
Widget.tooltips = !Env.iOS;
|
30640
30962
|
|
30641
|
-
|
30642
|
-
|
30643
|
-
var editor = EditorManager.activeEditor, name, previewElm, dom = editor.dom;
|
30644
|
-
var previewCss = '', parentFontSize, previewStyles;
|
30963
|
+
function registerControls(editor) {
|
30964
|
+
var formatMenu;
|
30645
30965
|
|
30646
|
-
|
30966
|
+
// Generates a preview for a format
|
30967
|
+
function getPreviewCss(format) {
|
30968
|
+
var name, previewElm, dom = editor.dom;
|
30969
|
+
var previewCss = '', parentFontSize, previewStyles;
|
30647
30970
|
|
30648
|
-
|
30649
|
-
if (previewStyles === false) {
|
30650
|
-
return '';
|
30651
|
-
}
|
30971
|
+
previewStyles = editor.settings.preview_styles;
|
30652
30972
|
|
30653
|
-
|
30654
|
-
|
30655
|
-
|
30656
|
-
|
30973
|
+
// No preview forced
|
30974
|
+
if (previewStyles === false) {
|
30975
|
+
return '';
|
30976
|
+
}
|
30657
30977
|
|
30658
|
-
|
30659
|
-
|
30660
|
-
|
30661
|
-
|
30978
|
+
// Default preview
|
30979
|
+
if (!previewStyles) {
|
30980
|
+
previewStyles = 'font-family font-size font-weight text-decoration ' +
|
30981
|
+
'text-transform color background-color border border-radius';
|
30982
|
+
}
|
30662
30983
|
|
30663
|
-
|
30664
|
-
|
30665
|
-
|
30666
|
-
|
30667
|
-
}
|
30984
|
+
// Removes any variables since these can't be previewed
|
30985
|
+
function removeVars(val) {
|
30986
|
+
return val.replace(/%(\w+)/g, '');
|
30987
|
+
}
|
30668
30988
|
|
30669
|
-
|
30670
|
-
|
30671
|
-
|
30989
|
+
// Create block/inline element to use for preview
|
30990
|
+
format = editor.formatter.get(format);
|
30991
|
+
if (!format) {
|
30992
|
+
return;
|
30993
|
+
}
|
30672
30994
|
|
30673
|
-
|
30674
|
-
|
30675
|
-
|
30995
|
+
format = format[0];
|
30996
|
+
name = format.block || format.inline || 'span';
|
30997
|
+
previewElm = dom.create(name);
|
30676
30998
|
|
30677
|
-
|
30678
|
-
|
30679
|
-
|
30680
|
-
});
|
30999
|
+
// Add format styles to preview element
|
31000
|
+
each(format.styles, function(value, name) {
|
31001
|
+
value = removeVars(value);
|
30681
31002
|
|
30682
|
-
|
30683
|
-
|
30684
|
-
|
31003
|
+
if (value) {
|
31004
|
+
dom.setStyle(previewElm, name, value);
|
31005
|
+
}
|
31006
|
+
});
|
30685
31007
|
|
30686
|
-
|
30687
|
-
|
30688
|
-
|
30689
|
-
});
|
31008
|
+
// Add attributes to preview element
|
31009
|
+
each(format.attributes, function(value, name) {
|
31010
|
+
value = removeVars(value);
|
30690
31011
|
|
30691
|
-
|
30692
|
-
|
30693
|
-
|
31012
|
+
if (value) {
|
31013
|
+
dom.setAttrib(previewElm, name, value);
|
31014
|
+
}
|
31015
|
+
});
|
30694
31016
|
|
30695
|
-
|
30696
|
-
|
30697
|
-
|
30698
|
-
});
|
31017
|
+
// Add classes to preview element
|
31018
|
+
each(format.classes, function(value) {
|
31019
|
+
value = removeVars(value);
|
30699
31020
|
|
30700
|
-
|
31021
|
+
if (!dom.hasClass(previewElm, value)) {
|
31022
|
+
dom.addClass(previewElm, value);
|
31023
|
+
}
|
31024
|
+
});
|
30701
31025
|
|
30702
|
-
|
30703
|
-
dom.setStyles(previewElm, {position: 'absolute', left: -0xFFFF});
|
30704
|
-
editor.getBody().appendChild(previewElm);
|
31026
|
+
editor.fire('PreviewFormats');
|
30705
31027
|
|
30706
|
-
|
30707
|
-
|
30708
|
-
|
31028
|
+
// Add the previewElm outside the visual area
|
31029
|
+
dom.setStyles(previewElm, {position: 'absolute', left: -0xFFFF});
|
31030
|
+
editor.getBody().appendChild(previewElm);
|
30709
31031
|
|
30710
|
-
|
30711
|
-
|
31032
|
+
// Get parent container font size so we can compute px values out of em/% for older IE:s
|
31033
|
+
parentFontSize = dom.getStyle(editor.getBody(), 'fontSize', true);
|
31034
|
+
parentFontSize = /px$/.test(parentFontSize) ? parseInt(parentFontSize, 10) : 0;
|
30712
31035
|
|
30713
|
-
|
30714
|
-
|
30715
|
-
value = dom.getStyle(editor.getBody(), name, true);
|
31036
|
+
each(previewStyles.split(' '), function(name) {
|
31037
|
+
var value = dom.getStyle(previewElm, name, true);
|
30716
31038
|
|
30717
|
-
//
|
30718
|
-
|
30719
|
-
|
30720
|
-
return;
|
30721
|
-
}
|
30722
|
-
}
|
31039
|
+
// If background is transparent then check if the body has a background color we can use
|
31040
|
+
if (name == 'background-color' && /transparent|rgba\s*\([^)]+,\s*0\)/.test(value)) {
|
31041
|
+
value = dom.getStyle(editor.getBody(), name, true);
|
30723
31042
|
|
30724
|
-
|
30725
|
-
|
30726
|
-
|
30727
|
-
|
30728
|
-
|
31043
|
+
// Ignore white since it's the default color, not the nicest fix
|
31044
|
+
// TODO: Fix this by detecting runtime style
|
31045
|
+
if (dom.toHex(value).toLowerCase() == '#ffffff') {
|
31046
|
+
return;
|
31047
|
+
}
|
30729
31048
|
}
|
30730
|
-
}
|
30731
31049
|
|
30732
|
-
|
30733
|
-
|
30734
|
-
|
30735
|
-
if (
|
31050
|
+
if (name == 'color') {
|
31051
|
+
// Ignore black since it's the default color, not the nicest fix
|
31052
|
+
// TODO: Fix this by detecting runtime style
|
31053
|
+
if (dom.toHex(value).toLowerCase() == '#000000') {
|
30736
31054
|
return;
|
30737
31055
|
}
|
31056
|
+
}
|
31057
|
+
|
31058
|
+
// Old IE won't calculate the font size so we need to do that manually
|
31059
|
+
if (name == 'font-size') {
|
31060
|
+
if (/em|%$/.test(value)) {
|
31061
|
+
if (parentFontSize === 0) {
|
31062
|
+
return;
|
31063
|
+
}
|
30738
31064
|
|
30739
|
-
|
30740
|
-
|
30741
|
-
|
31065
|
+
// Convert font size from em/% to px
|
31066
|
+
value = parseFloat(value, 10) / (/%$/.test(value) ? 100 : 1);
|
31067
|
+
value = (value * parentFontSize) + 'px';
|
31068
|
+
}
|
30742
31069
|
}
|
30743
|
-
}
|
30744
31070
|
|
30745
|
-
|
30746
|
-
|
30747
|
-
|
31071
|
+
if (name == "border" && value) {
|
31072
|
+
previewCss += 'padding:0 2px;';
|
31073
|
+
}
|
30748
31074
|
|
30749
|
-
|
30750
|
-
|
31075
|
+
previewCss += name + ':' + value + ';';
|
31076
|
+
});
|
30751
31077
|
|
30752
|
-
|
31078
|
+
editor.fire('AfterPreviewFormats');
|
30753
31079
|
|
30754
|
-
|
31080
|
+
//previewCss += 'line-height:normal';
|
30755
31081
|
|
30756
|
-
|
31082
|
+
dom.remove(previewElm);
|
30757
31083
|
|
30758
|
-
|
30759
|
-
|
31084
|
+
return previewCss;
|
31085
|
+
}
|
30760
31086
|
|
30761
|
-
|
30762
|
-
|
30763
|
-
|
31087
|
+
function createListBoxChangeHandler(items, formatName) {
|
31088
|
+
return function() {
|
31089
|
+
var self = this;
|
30764
31090
|
|
30765
|
-
|
30766
|
-
|
30767
|
-
|
31091
|
+
editor.on('nodeChange', function(e) {
|
31092
|
+
var formatter = editor.formatter;
|
31093
|
+
var value = null;
|
30768
31094
|
|
30769
|
-
|
30770
|
-
|
30771
|
-
|
30772
|
-
|
30773
|
-
|
31095
|
+
each(e.parents, function(node) {
|
31096
|
+
each(items, function(item) {
|
31097
|
+
if (formatName) {
|
31098
|
+
if (formatter.matchNode(node, formatName, {value: item.value})) {
|
31099
|
+
value = item.value;
|
31100
|
+
}
|
31101
|
+
} else {
|
31102
|
+
if (formatter.matchNode(node, item.value)) {
|
31103
|
+
value = item.value;
|
31104
|
+
}
|
30774
31105
|
}
|
30775
|
-
|
30776
|
-
if (
|
30777
|
-
|
31106
|
+
|
31107
|
+
if (value) {
|
31108
|
+
return false;
|
30778
31109
|
}
|
30779
|
-
}
|
31110
|
+
});
|
30780
31111
|
|
30781
31112
|
if (value) {
|
30782
31113
|
return false;
|
30783
31114
|
}
|
30784
31115
|
});
|
30785
31116
|
|
30786
|
-
|
30787
|
-
return false;
|
30788
|
-
}
|
31117
|
+
self.value(value);
|
30789
31118
|
});
|
31119
|
+
};
|
31120
|
+
}
|
30790
31121
|
|
30791
|
-
|
30792
|
-
|
30793
|
-
};
|
30794
|
-
}
|
31122
|
+
function createFormats(formats) {
|
31123
|
+
formats = formats.split(';');
|
30795
31124
|
|
30796
|
-
|
30797
|
-
|
31125
|
+
var i = formats.length;
|
31126
|
+
while (i--) {
|
31127
|
+
formats[i] = formats[i].split('=');
|
31128
|
+
}
|
30798
31129
|
|
30799
|
-
|
30800
|
-
while (i--) {
|
30801
|
-
formats[i] = formats[i].split('=');
|
31130
|
+
return formats;
|
30802
31131
|
}
|
30803
31132
|
|
30804
|
-
return formats;
|
30805
|
-
}
|
30806
|
-
|
30807
|
-
EditorManager.on('AddEditor', function(e) {
|
30808
|
-
var editor = e.editor, formatMenu;
|
30809
|
-
|
30810
31133
|
function createFormatMenu() {
|
30811
31134
|
var count = 0, newFormats = [];
|
30812
31135
|
|
@@ -30855,8 +31178,7 @@ define("tinymce/ui/FormatControls", [
|
|
30855
31178
|
each(formats, function(format) {
|
30856
31179
|
var menuItem = {
|
30857
31180
|
text: format.title,
|
30858
|
-
icon: format.icon
|
30859
|
-
preview: true
|
31181
|
+
icon: format.icon
|
30860
31182
|
};
|
30861
31183
|
|
30862
31184
|
if (format.items) {
|
@@ -30869,22 +31191,7 @@ define("tinymce/ui/FormatControls", [
|
|
30869
31191
|
newFormats.push(format);
|
30870
31192
|
}
|
30871
31193
|
|
30872
|
-
menuItem.
|
30873
|
-
return getPreviewCss(formatName);
|
30874
|
-
};
|
30875
|
-
|
30876
|
-
menuItem.onclick = function() {
|
30877
|
-
toggleFormat(formatName);
|
30878
|
-
};
|
30879
|
-
|
30880
|
-
menuItem.onPostRender = function() {
|
30881
|
-
var self = this;
|
30882
|
-
|
30883
|
-
self.parent().on('show', function() {
|
30884
|
-
self.disabled(!editor.formatter.canApply(formatName));
|
30885
|
-
self.active(editor.formatter.match(formatName));
|
30886
|
-
});
|
30887
|
-
};
|
31194
|
+
menuItem.format = formatName;
|
30888
31195
|
}
|
30889
31196
|
|
30890
31197
|
menu.push(menuItem);
|
@@ -30901,6 +31208,40 @@ define("tinymce/ui/FormatControls", [
|
|
30901
31208
|
|
30902
31209
|
var menu = createMenu(editor.settings.style_formats || defaultStyleFormats);
|
30903
31210
|
|
31211
|
+
menu = {
|
31212
|
+
type: 'menu',
|
31213
|
+
items: menu,
|
31214
|
+
onPostRender: function(e) {
|
31215
|
+
editor.fire('renderFormatsMenu', {control: e.control});
|
31216
|
+
},
|
31217
|
+
itemDefaults: {
|
31218
|
+
preview: true,
|
31219
|
+
|
31220
|
+
textStyle: function() {
|
31221
|
+
if (this.settings.format) {
|
31222
|
+
return getPreviewCss(this.settings.format);
|
31223
|
+
}
|
31224
|
+
},
|
31225
|
+
|
31226
|
+
onPostRender: function() {
|
31227
|
+
var self = this, formatName = this.settings.format;
|
31228
|
+
|
31229
|
+
if (formatName) {
|
31230
|
+
self.parent().on('show', function() {
|
31231
|
+
self.disabled(!editor.formatter.canApply(formatName));
|
31232
|
+
self.active(editor.formatter.match(formatName));
|
31233
|
+
});
|
31234
|
+
}
|
31235
|
+
},
|
31236
|
+
|
31237
|
+
onclick: function() {
|
31238
|
+
if (this.settings.format) {
|
31239
|
+
toggleFormat(this.settings.format);
|
31240
|
+
}
|
31241
|
+
}
|
31242
|
+
}
|
31243
|
+
};
|
31244
|
+
|
30904
31245
|
return menu;
|
30905
31246
|
}
|
30906
31247
|
|
@@ -30963,7 +31304,7 @@ define("tinymce/ui/FormatControls", [
|
|
30963
31304
|
each({
|
30964
31305
|
blockquote: ['Toggle blockquote', 'mceBlockQuote'],
|
30965
31306
|
numlist: ['Numbered list', 'InsertOrderedList'],
|
30966
|
-
bullist: ['
|
31307
|
+
bullist: ['Bullet list', 'InsertUnorderedList'],
|
30967
31308
|
subscript: ['Subscript', 'Subscript'],
|
30968
31309
|
superscript: ['Superscript', 'Superscript'],
|
30969
31310
|
alignleft: ['Align left', 'JustifyLeft'],
|
@@ -31102,31 +31443,17 @@ define("tinymce/ui/FormatControls", [
|
|
31102
31443
|
}
|
31103
31444
|
|
31104
31445
|
if (fmt) {
|
31105
|
-
|
31446
|
+
editor.execCommand('mceToggleFormat', false, fmt);
|
31106
31447
|
}
|
31107
31448
|
}
|
31108
31449
|
|
31109
|
-
|
31110
|
-
|
31111
|
-
|
31112
|
-
|
31113
|
-
menu.push({text: '-'});
|
31114
|
-
menu.push({
|
31115
|
-
text: 'Remove formatting',
|
31116
|
-
icon: 'removeformat',
|
31117
|
-
onclick: function() {
|
31118
|
-
editor.execCommand('RemoveFormat');
|
31119
|
-
}
|
31120
|
-
});
|
31121
|
-
*/
|
31122
|
-
|
31123
|
-
return Factory.create('menubutton', Tools.extend({
|
31124
|
-
text: 'Formats',
|
31125
|
-
menu: menu
|
31126
|
-
}, settings));
|
31450
|
+
editor.addButton('styleselect', {
|
31451
|
+
type: 'menubutton',
|
31452
|
+
text: 'Formats',
|
31453
|
+
menu: formatMenu
|
31127
31454
|
});
|
31128
31455
|
|
31129
|
-
|
31456
|
+
editor.addButton('formatselect', function() {
|
31130
31457
|
var items = [], blocks = createFormats(editor.settings.block_formats ||
|
31131
31458
|
'Paragraph=p;' +
|
31132
31459
|
'Address=address;' +
|
@@ -31141,7 +31468,7 @@ define("tinymce/ui/FormatControls", [
|
|
31141
31468
|
|
31142
31469
|
each(blocks, function(block) {
|
31143
31470
|
items.push({
|
31144
|
-
text:
|
31471
|
+
text: block[0],
|
31145
31472
|
value: block[1],
|
31146
31473
|
textStyle: function() {
|
31147
31474
|
return getPreviewCss(block[1]);
|
@@ -31149,16 +31476,17 @@ define("tinymce/ui/FormatControls", [
|
|
31149
31476
|
});
|
31150
31477
|
});
|
31151
31478
|
|
31152
|
-
return
|
31479
|
+
return {
|
31480
|
+
type: 'listbox',
|
31153
31481
|
text: {raw: blocks[0][0]},
|
31154
31482
|
values: items,
|
31155
31483
|
fixedWidth: true,
|
31156
31484
|
onselect: toggleFormat,
|
31157
31485
|
onPostRender: createListBoxChangeHandler(items)
|
31158
|
-
}
|
31486
|
+
};
|
31159
31487
|
});
|
31160
31488
|
|
31161
|
-
|
31489
|
+
editor.addButton('fontselect', function() {
|
31162
31490
|
var defaultFontsFormats =
|
31163
31491
|
'Andale Mono=andale mono,times;' +
|
31164
31492
|
'Arial=arial,helvetica,sans-serif;' +
|
@@ -31188,7 +31516,8 @@ define("tinymce/ui/FormatControls", [
|
|
31188
31516
|
});
|
31189
31517
|
});
|
31190
31518
|
|
31191
|
-
return
|
31519
|
+
return {
|
31520
|
+
type: 'listbox',
|
31192
31521
|
text: 'Font Family',
|
31193
31522
|
tooltip: 'Font Family',
|
31194
31523
|
values: items,
|
@@ -31196,13 +31525,13 @@ define("tinymce/ui/FormatControls", [
|
|
31196
31525
|
onPostRender: createListBoxChangeHandler(items, 'fontname'),
|
31197
31526
|
onselect: function(e) {
|
31198
31527
|
if (e.control.settings.value) {
|
31199
|
-
|
31528
|
+
editor.execCommand('FontName', false, e.control.settings.value);
|
31200
31529
|
}
|
31201
31530
|
}
|
31202
|
-
}
|
31531
|
+
};
|
31203
31532
|
});
|
31204
31533
|
|
31205
|
-
|
31534
|
+
editor.addButton('fontsizeselect', function() {
|
31206
31535
|
var items = [], defaultFontsizeFormats = '8pt 10pt 12pt 14pt 18pt 24pt 36pt';
|
31207
31536
|
var fontsize_formats = editor.settings.fontsize_formats || defaultFontsizeFormats;
|
31208
31537
|
|
@@ -31210,7 +31539,8 @@ define("tinymce/ui/FormatControls", [
|
|
31210
31539
|
items.push({text: item, value: item});
|
31211
31540
|
});
|
31212
31541
|
|
31213
|
-
return
|
31542
|
+
return {
|
31543
|
+
type: 'listbox',
|
31214
31544
|
text: 'Font Sizes',
|
31215
31545
|
tooltip: 'Font Sizes',
|
31216
31546
|
values: items,
|
@@ -31218,17 +31548,17 @@ define("tinymce/ui/FormatControls", [
|
|
31218
31548
|
onPostRender: createListBoxChangeHandler(items, 'fontsize'),
|
31219
31549
|
onclick: function(e) {
|
31220
31550
|
if (e.control.settings.value) {
|
31221
|
-
|
31551
|
+
editor.execCommand('FontSize', false, e.control.settings.value);
|
31222
31552
|
}
|
31223
31553
|
}
|
31224
|
-
}
|
31554
|
+
};
|
31225
31555
|
});
|
31226
31556
|
|
31227
31557
|
editor.addMenuItem('formats', {
|
31228
31558
|
text: 'Formats',
|
31229
31559
|
menu: formatMenu
|
31230
31560
|
});
|
31231
|
-
}
|
31561
|
+
}
|
31232
31562
|
});
|
31233
31563
|
|
31234
31564
|
// Included from: js/tinymce/classes/ui/GridLayout.js
|
@@ -31523,10 +31853,25 @@ define("tinymce/ui/Iframe", [
|
|
31523
31853
|
*
|
31524
31854
|
* @method html
|
31525
31855
|
* @param {String} html HTML string to set as HTML inside the iframe.
|
31856
|
+
* @param {function} callback Optional callback to execute when the iframe body is filled with contents.
|
31526
31857
|
* @return {tinymce.ui.Iframe} Current iframe control.
|
31527
31858
|
*/
|
31528
|
-
html: function(html) {
|
31529
|
-
this.getEl().contentWindow.document.body
|
31859
|
+
html: function(html, callback) {
|
31860
|
+
var self = this, body = this.getEl().contentWindow.document.body;
|
31861
|
+
|
31862
|
+
// Wait for iframe to initialize IE 10 takes time
|
31863
|
+
if (!body) {
|
31864
|
+
setTimeout(function() {
|
31865
|
+
self.html(html);
|
31866
|
+
}, 0);
|
31867
|
+
} else {
|
31868
|
+
body.innerHTML = html;
|
31869
|
+
|
31870
|
+
if (callback) {
|
31871
|
+
callback();
|
31872
|
+
}
|
31873
|
+
}
|
31874
|
+
|
31530
31875
|
return this;
|
31531
31876
|
}
|
31532
31877
|
});
|
@@ -31654,7 +31999,7 @@ define("tinymce/ui/Label", [
|
|
31654
31999
|
var self = this;
|
31655
32000
|
|
31656
32001
|
if (self._rendered && text) {
|
31657
|
-
|
32002
|
+
this.innerHtml(self.encode(text));
|
31658
32003
|
}
|
31659
32004
|
|
31660
32005
|
return self._super(text);
|
@@ -32254,9 +32599,9 @@ define("tinymce/ui/MenuItem", [
|
|
32254
32599
|
* @method showMenu
|
32255
32600
|
*/
|
32256
32601
|
showMenu: function() {
|
32257
|
-
var self = this, settings = self.settings, menu;
|
32602
|
+
var self = this, settings = self.settings, menu, parent = self.parent();
|
32258
32603
|
|
32259
|
-
|
32604
|
+
parent.items().each(function(ctrl) {
|
32260
32605
|
if (ctrl !== self) {
|
32261
32606
|
ctrl.hideMenu();
|
32262
32607
|
}
|
@@ -32278,6 +32623,10 @@ define("tinymce/ui/MenuItem", [
|
|
32278
32623
|
menu.type = menu.type || 'menu';
|
32279
32624
|
}
|
32280
32625
|
|
32626
|
+
if (parent.settings.itemDefaults) {
|
32627
|
+
menu.itemDefaults = parent.settings.itemDefaults;
|
32628
|
+
}
|
32629
|
+
|
32281
32630
|
menu = self.menu = Factory.create(menu).parent(self).renderTo(self.getContainerElm());
|
32282
32631
|
menu.reflow();
|
32283
32632
|
menu.fire('show');
|
@@ -32294,7 +32643,7 @@ define("tinymce/ui/MenuItem", [
|
|
32294
32643
|
menu.show();
|
32295
32644
|
}
|
32296
32645
|
|
32297
|
-
menu._parentMenu =
|
32646
|
+
menu._parentMenu = parent;
|
32298
32647
|
|
32299
32648
|
menu.addClass('menu-sub');
|
32300
32649
|
|
@@ -32341,17 +32690,22 @@ define("tinymce/ui/MenuItem", [
|
|
32341
32690
|
*/
|
32342
32691
|
renderHtml: function() {
|
32343
32692
|
var self = this, id = self._id, settings = self.settings, prefix = self.classPrefix, text = self.encode(self._text);
|
32344
|
-
var icon = self.settings.icon;
|
32693
|
+
var icon = self.settings.icon, image = '';
|
32345
32694
|
|
32346
32695
|
if (icon) {
|
32347
32696
|
self.parent().addClass('menu-has-icons');
|
32348
32697
|
}
|
32349
32698
|
|
32699
|
+
if (settings.image) {
|
32700
|
+
icon = 'none';
|
32701
|
+
image = ' style="background-image: url(\'' + settings.image + '\')"';
|
32702
|
+
}
|
32703
|
+
|
32350
32704
|
icon = prefix + 'ico ' + prefix + 'i-' + (self.settings.icon || 'none');
|
32351
32705
|
|
32352
32706
|
return (
|
32353
32707
|
'<div id="' + id + '" class="' + self.classes() + '" tabindex="-1">' +
|
32354
|
-
(text !== '-' ? '<i class="' + icon + '"></i> ' : '') +
|
32708
|
+
(text !== '-' ? '<i class="' + icon + '"' + image + '></i> ' : '') +
|
32355
32709
|
(text !== '-' ? '<span id="' + id + '-text" class="' + prefix + 'text">' + text + '</span>' : '') +
|
32356
32710
|
(settings.shortcut ? '<div id="' + id + '-shortcut" class="' + prefix + 'menu-shortcut">' +
|
32357
32711
|
settings.shortcut + '</div>' : '') +
|
@@ -32370,7 +32724,7 @@ define("tinymce/ui/MenuItem", [
|
|
32370
32724
|
|
32371
32725
|
var textStyle = settings.textStyle;
|
32372
32726
|
if (typeof(textStyle) == "function") {
|
32373
|
-
textStyle = textStyle();
|
32727
|
+
textStyle = textStyle.call(this);
|
32374
32728
|
}
|
32375
32729
|
|
32376
32730
|
if (textStyle) {
|
@@ -32420,8 +32774,9 @@ define("tinymce/ui/MenuItem", [
|
|
32420
32774
|
define("tinymce/ui/Menu", [
|
32421
32775
|
"tinymce/ui/FloatPanel",
|
32422
32776
|
"tinymce/ui/KeyboardNavigation",
|
32423
|
-
"tinymce/ui/MenuItem"
|
32424
|
-
|
32777
|
+
"tinymce/ui/MenuItem",
|
32778
|
+
"tinymce/util/Tools"
|
32779
|
+
], function(FloatPanel, KeyboardNavigation, MenuItem, Tools) {
|
32425
32780
|
"use strict";
|
32426
32781
|
|
32427
32782
|
var Menu = FloatPanel.extend({
|
@@ -32444,6 +32799,14 @@ define("tinymce/ui/Menu", [
|
|
32444
32799
|
settings.autohide = true;
|
32445
32800
|
settings.constrainToViewport = true;
|
32446
32801
|
|
32802
|
+
if (settings.itemDefaults) {
|
32803
|
+
var items = settings.items, i = items.length;
|
32804
|
+
|
32805
|
+
while (i--) {
|
32806
|
+
items[i] = Tools.extend({}, settings.itemDefaults, items[i]);
|
32807
|
+
}
|
32808
|
+
}
|
32809
|
+
|
32447
32810
|
self._super(settings);
|
32448
32811
|
self.addClass('menu');
|
32449
32812
|
|
@@ -32640,6 +33003,14 @@ define("tinymce/ui/ResizeHandle", [
|
|
32640
33003
|
self.fire('ResizeEnd');
|
32641
33004
|
}
|
32642
33005
|
});
|
33006
|
+
},
|
33007
|
+
|
33008
|
+
remove: function() {
|
33009
|
+
if (this.resizeDragHelper) {
|
33010
|
+
this.resizeDragHelper.destroy();
|
33011
|
+
}
|
33012
|
+
|
33013
|
+
return this._super();
|
32643
33014
|
}
|
32644
33015
|
});
|
32645
33016
|
});
|
@@ -33195,6 +33566,11 @@ define("tinymce/ui/TextBox", [
|
|
33195
33566
|
});
|
33196
33567
|
|
33197
33568
|
return self._super();
|
33569
|
+
},
|
33570
|
+
|
33571
|
+
remove: function() {
|
33572
|
+
DomUtils.off(this.getEl());
|
33573
|
+
this._super();
|
33198
33574
|
}
|
33199
33575
|
});
|
33200
33576
|
});
|