tinymce-rails 4.1.6 → 4.1.10
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.
- checksums.yaml +4 -4
- data/README.md +19 -2
- data/app/assets/source/tinymce/tinymce.jquery.js +1259 -591
- data/app/assets/source/tinymce/tinymce.js +1260 -592
- data/lib/tasks/tinymce-assets.rake +6 -3
- data/lib/tinymce/rails.rb +1 -1
- data/lib/tinymce/rails/asset_installer.rb +34 -36
- data/lib/tinymce/rails/asset_installer/compile.rb +44 -0
- data/lib/tinymce/rails/asset_installer/copy.rb +52 -0
- data/lib/tinymce/rails/asset_manifest.rb +108 -89
- data/lib/tinymce/rails/configuration.rb +14 -4
- data/lib/tinymce/rails/engine.rb +13 -0
- data/lib/tinymce/rails/version.rb +2 -2
- data/vendor/assets/javascripts/tinymce/jquery.tinymce.js +1 -1
- data/vendor/assets/javascripts/tinymce/plugins/advlist/plugin.js +1 -1
- data/vendor/assets/javascripts/tinymce/plugins/autolink/plugin.js +1 -1
- data/vendor/assets/javascripts/tinymce/plugins/autoresize/plugin.js +1 -1
- data/vendor/assets/javascripts/tinymce/plugins/charmap/plugin.js +1 -1
- data/vendor/assets/javascripts/tinymce/plugins/fullscreen/plugin.js +1 -1
- data/vendor/assets/javascripts/tinymce/plugins/image/plugin.js +1 -1
- data/vendor/assets/javascripts/tinymce/plugins/legacyoutput/plugin.js +1 -1
- data/vendor/assets/javascripts/tinymce/plugins/link/plugin.js +1 -1
- data/vendor/assets/javascripts/tinymce/plugins/lists/plugin.js +1 -1
- data/vendor/assets/javascripts/tinymce/plugins/media/plugin.js +1 -1
- data/vendor/assets/javascripts/tinymce/plugins/noneditable/plugin.js +1 -1
- data/vendor/assets/javascripts/tinymce/plugins/paste/plugin.js +1 -1
- data/vendor/assets/javascripts/tinymce/plugins/print/plugin.js +1 -1
- data/vendor/assets/javascripts/tinymce/plugins/save/plugin.js +1 -1
- data/vendor/assets/javascripts/tinymce/plugins/searchreplace/plugin.js +1 -1
- data/vendor/assets/javascripts/tinymce/plugins/table/plugin.js +1 -1
- data/vendor/assets/javascripts/tinymce/plugins/textcolor/plugin.js +1 -1
- data/vendor/assets/javascripts/tinymce/plugins/visualchars/plugin.js +1 -1
- data/vendor/assets/javascripts/tinymce/skins/lightgray/content.inline.min.css +1 -1
- data/vendor/assets/javascripts/tinymce/skins/lightgray/content.min.css +1 -1
- data/vendor/assets/javascripts/tinymce/skins/lightgray/fonts/tinymce-small.eot +0 -0
- data/vendor/assets/javascripts/tinymce/skins/lightgray/fonts/tinymce-small.svg +56 -56
- data/vendor/assets/javascripts/tinymce/skins/lightgray/fonts/tinymce-small.ttf +0 -0
- data/vendor/assets/javascripts/tinymce/skins/lightgray/fonts/tinymce-small.woff +0 -0
- data/vendor/assets/javascripts/tinymce/skins/lightgray/fonts/tinymce.eot +0 -0
- data/vendor/assets/javascripts/tinymce/skins/lightgray/fonts/tinymce.svg +57 -57
- data/vendor/assets/javascripts/tinymce/skins/lightgray/fonts/tinymce.ttf +0 -0
- data/vendor/assets/javascripts/tinymce/skins/lightgray/fonts/tinymce.woff +0 -0
- data/vendor/assets/javascripts/tinymce/skins/lightgray/skin.ie7.min.css +1 -1
- data/vendor/assets/javascripts/tinymce/themes/modern/theme.js +1 -1
- data/vendor/assets/javascripts/tinymce/tinymce.jquery.js +16 -10
- data/vendor/assets/javascripts/tinymce/tinymce.js +13 -11
- metadata +6 -3
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 4d2fae378258790499baa18b3c24339a9bd7cdbb
|
|
4
|
+
data.tar.gz: 5584c277b163e6a331a685640c9dc55085817c1c
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 7330d8ab350d64af447cbbe84f951350d23e3798e8c77d9edb66939b7dd82587757cc49602a853a97580ce29a6649ae680b7a6ea5f93a6a06e20e3f7144b1f4e
|
|
7
|
+
data.tar.gz: 5dcf9451e066fdf91c84fe036c8e26aa0105b51e0d014375ee53c4539b5ca3a6cff86e9d2aa525c0ccc18fba63911d9fc5473c52c1066624a70709d887584e24
|
data/README.md
CHANGED
|
@@ -9,6 +9,7 @@ This is the branch for TinyMCE 4. For TinyMCE 3.5.x, please see the [tinymce-3 b
|
|
|
9
9
|
|
|
10
10
|
[](https://travis-ci.org/spohlenz/tinymce-rails)
|
|
11
11
|
|
|
12
|
+
**New in 3.5.11, 4.1.10 and 4.2.1:** Alternative asset installation methods (copy vs compile/symlink). See the [Asset Compilation](#asset-compilation) section below for details.
|
|
12
13
|
|
|
13
14
|
Instructions
|
|
14
15
|
------------
|
|
@@ -135,9 +136,25 @@ Using the `tinymce` helper and global configuration file is entirely optional. T
|
|
|
135
136
|
Asset Compilation
|
|
136
137
|
-----------------
|
|
137
138
|
|
|
138
|
-
|
|
139
|
+
Since TinyMCE loads most of its files dynamically, some workarounds are required to ensure that the TinyMCE asset files are accessible using non-digested filenames.
|
|
139
140
|
|
|
140
|
-
|
|
141
|
+
As of tinymce-rails 3.5.11, 4.1.10 and 4.2.1, two alternative asset installation methods are available, which can be changed by setting `config.tinymce.install` within your `config/application.rb` file. Both methods are called when you run `rake asset:precompile` (via `Rake::Task#enhance`) after the regular application assets are compiled.
|
|
142
|
+
|
|
143
|
+
The default method, `copy`, copies the TinyMCE assets directly into `public/assets` and appends the file information into the asset manifest.
|
|
144
|
+
|
|
145
|
+
```ruby
|
|
146
|
+
config.tinymce.install = :copy
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
The new method, `compile`, adds the TinyMCE paths to the Sprockets precompilation paths and then creates symlinks from the non-digested filenames to their digested versions.
|
|
150
|
+
|
|
151
|
+
```ruby
|
|
152
|
+
config.tinymce.install = :compile
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
Due to compilation times, this method is only recommended using Rails 4 and up. This method is intended to eventually become the default, so please try it if it suits your environment and report any issues.
|
|
156
|
+
|
|
157
|
+
If you are including TinyMCE via `application.js` or using the `tinymce_assets` helper, you do not need to manually alter the precompile paths. However if you wish to include `tinymce-jquery.js` independently (i.e. using `javascript_include_tag`), you will need to add it to the precompile list in `config/environments/production.rb`:
|
|
141
158
|
|
|
142
159
|
```ruby
|
|
143
160
|
config.assets.precompile << "tinymce-jquery.js"
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
// 4.1.
|
|
1
|
+
// 4.1.10 (2015-05-05)
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
4
|
* Compiled inline version. (Library mode)
|
|
@@ -169,8 +169,8 @@ define("tinymce/dom/EventUtils", [], function() {
|
|
|
169
169
|
event.pageX = originalEvent.clientX + (doc && doc.scrollLeft || body && body.scrollLeft || 0) -
|
|
170
170
|
(doc && doc.clientLeft || body && body.clientLeft || 0);
|
|
171
171
|
|
|
172
|
-
event.pageY = originalEvent.clientY + (doc && doc.scrollTop
|
|
173
|
-
(doc && doc.clientTop
|
|
172
|
+
event.pageY = originalEvent.clientY + (doc && doc.scrollTop || body && body.scrollTop || 0) -
|
|
173
|
+
(doc && doc.clientTop || body && body.clientTop || 0);
|
|
174
174
|
}
|
|
175
175
|
|
|
176
176
|
// Add preventDefault method
|
|
@@ -674,6 +674,159 @@ define("tinymce/dom/Sizzle", [], function() {
|
|
|
674
674
|
return jQuery.find;
|
|
675
675
|
});
|
|
676
676
|
|
|
677
|
+
// Included from: js/tinymce/classes/Env.js
|
|
678
|
+
|
|
679
|
+
/**
|
|
680
|
+
* Env.js
|
|
681
|
+
*
|
|
682
|
+
* Copyright, Moxiecode Systems AB
|
|
683
|
+
* Released under LGPL License.
|
|
684
|
+
*
|
|
685
|
+
* License: http://www.tinymce.com/license
|
|
686
|
+
* Contributing: http://www.tinymce.com/contributing
|
|
687
|
+
*/
|
|
688
|
+
|
|
689
|
+
/**
|
|
690
|
+
* This class contains various environment constants like browser versions etc.
|
|
691
|
+
* Normally you don't want to sniff specific browser versions but sometimes you have
|
|
692
|
+
* to when it's impossible to feature detect. So use this with care.
|
|
693
|
+
*
|
|
694
|
+
* @class tinymce.Env
|
|
695
|
+
* @static
|
|
696
|
+
*/
|
|
697
|
+
define("tinymce/Env", [], function() {
|
|
698
|
+
var nav = navigator, userAgent = nav.userAgent;
|
|
699
|
+
var opera, webkit, ie, ie11, ie12, gecko, mac, iDevice, android;
|
|
700
|
+
|
|
701
|
+
opera = window.opera && window.opera.buildNumber;
|
|
702
|
+
android = /Android/.test(userAgent);
|
|
703
|
+
webkit = /WebKit/.test(userAgent);
|
|
704
|
+
ie = !webkit && !opera && (/MSIE/gi).test(userAgent) && (/Explorer/gi).test(nav.appName);
|
|
705
|
+
ie = ie && /MSIE (\w+)\./.exec(userAgent)[1];
|
|
706
|
+
ie11 = userAgent.indexOf('Trident/') != -1 && (userAgent.indexOf('rv:') != -1 || nav.appName.indexOf('Netscape') != -1) ? 11 : false;
|
|
707
|
+
ie12 = (document.msElementsFromPoint && !ie && !ie11) ? 12 : false;
|
|
708
|
+
ie = ie || ie11 || ie12;
|
|
709
|
+
gecko = !webkit && !ie11 && /Gecko/.test(userAgent);
|
|
710
|
+
mac = userAgent.indexOf('Mac') != -1;
|
|
711
|
+
iDevice = /(iPad|iPhone)/.test(userAgent);
|
|
712
|
+
|
|
713
|
+
if (ie12) {
|
|
714
|
+
webkit = false;
|
|
715
|
+
}
|
|
716
|
+
|
|
717
|
+
// Is a iPad/iPhone and not on iOS5 sniff the WebKit version since older iOS WebKit versions
|
|
718
|
+
// says it has contentEditable support but there is no visible caret.
|
|
719
|
+
var contentEditable = !iDevice || userAgent.match(/AppleWebKit\/(\d*)/)[1] >= 534;
|
|
720
|
+
|
|
721
|
+
return {
|
|
722
|
+
/**
|
|
723
|
+
* Constant that is true if the browser is Opera.
|
|
724
|
+
*
|
|
725
|
+
* @property opera
|
|
726
|
+
* @type Boolean
|
|
727
|
+
* @final
|
|
728
|
+
*/
|
|
729
|
+
opera: opera,
|
|
730
|
+
|
|
731
|
+
/**
|
|
732
|
+
* Constant that is true if the browser is WebKit (Safari/Chrome).
|
|
733
|
+
*
|
|
734
|
+
* @property webKit
|
|
735
|
+
* @type Boolean
|
|
736
|
+
* @final
|
|
737
|
+
*/
|
|
738
|
+
webkit: webkit,
|
|
739
|
+
|
|
740
|
+
/**
|
|
741
|
+
* Constant that is more than zero if the browser is IE.
|
|
742
|
+
*
|
|
743
|
+
* @property ie
|
|
744
|
+
* @type Boolean
|
|
745
|
+
* @final
|
|
746
|
+
*/
|
|
747
|
+
ie: ie,
|
|
748
|
+
|
|
749
|
+
/**
|
|
750
|
+
* Constant that is true if the browser is Gecko.
|
|
751
|
+
*
|
|
752
|
+
* @property gecko
|
|
753
|
+
* @type Boolean
|
|
754
|
+
* @final
|
|
755
|
+
*/
|
|
756
|
+
gecko: gecko,
|
|
757
|
+
|
|
758
|
+
/**
|
|
759
|
+
* Constant that is true if the os is Mac OS.
|
|
760
|
+
*
|
|
761
|
+
* @property mac
|
|
762
|
+
* @type Boolean
|
|
763
|
+
* @final
|
|
764
|
+
*/
|
|
765
|
+
mac: mac,
|
|
766
|
+
|
|
767
|
+
/**
|
|
768
|
+
* Constant that is true if the os is iOS.
|
|
769
|
+
*
|
|
770
|
+
* @property iOS
|
|
771
|
+
* @type Boolean
|
|
772
|
+
* @final
|
|
773
|
+
*/
|
|
774
|
+
iOS: iDevice,
|
|
775
|
+
|
|
776
|
+
/**
|
|
777
|
+
* Constant that is true if the os is android.
|
|
778
|
+
*
|
|
779
|
+
* @property android
|
|
780
|
+
* @type Boolean
|
|
781
|
+
* @final
|
|
782
|
+
*/
|
|
783
|
+
android: android,
|
|
784
|
+
|
|
785
|
+
/**
|
|
786
|
+
* Constant that is true if the browser supports editing.
|
|
787
|
+
*
|
|
788
|
+
* @property contentEditable
|
|
789
|
+
* @type Boolean
|
|
790
|
+
* @final
|
|
791
|
+
*/
|
|
792
|
+
contentEditable: contentEditable,
|
|
793
|
+
|
|
794
|
+
/**
|
|
795
|
+
* Transparent image data url.
|
|
796
|
+
*
|
|
797
|
+
* @property transparentSrc
|
|
798
|
+
* @type Boolean
|
|
799
|
+
* @final
|
|
800
|
+
*/
|
|
801
|
+
transparentSrc: "data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7",
|
|
802
|
+
|
|
803
|
+
/**
|
|
804
|
+
* Returns true/false if the browser can or can't place the caret after a inline block like an image.
|
|
805
|
+
*
|
|
806
|
+
* @property noCaretAfter
|
|
807
|
+
* @type Boolean
|
|
808
|
+
* @final
|
|
809
|
+
*/
|
|
810
|
+
caretAfter: ie != 8,
|
|
811
|
+
|
|
812
|
+
/**
|
|
813
|
+
* Constant that is true if the browser supports native DOM Ranges. IE 9+.
|
|
814
|
+
*
|
|
815
|
+
* @property range
|
|
816
|
+
* @type Boolean
|
|
817
|
+
*/
|
|
818
|
+
range: window.getSelection && "Range" in window,
|
|
819
|
+
|
|
820
|
+
/**
|
|
821
|
+
* Returns the IE document mode for non IE browsers this will fake IE 10.
|
|
822
|
+
*
|
|
823
|
+
* @property documentMode
|
|
824
|
+
* @type Number
|
|
825
|
+
*/
|
|
826
|
+
documentMode: ie && !ie12 ? (document.documentMode || 7) : 10
|
|
827
|
+
};
|
|
828
|
+
});
|
|
829
|
+
|
|
677
830
|
// Included from: js/tinymce/classes/util/Tools.js
|
|
678
831
|
|
|
679
832
|
/**
|
|
@@ -692,7 +845,9 @@ define("tinymce/dom/Sizzle", [], function() {
|
|
|
692
845
|
*
|
|
693
846
|
* @class tinymce.util.Tools
|
|
694
847
|
*/
|
|
695
|
-
define("tinymce/util/Tools", [
|
|
848
|
+
define("tinymce/util/Tools", [
|
|
849
|
+
"tinymce/Env"
|
|
850
|
+
], function(Env) {
|
|
696
851
|
/**
|
|
697
852
|
* Removes whitespace from the beginning and end of a string.
|
|
698
853
|
*
|
|
@@ -721,20 +876,20 @@ define("tinymce/util/Tools", [], function() {
|
|
|
721
876
|
* Checks if a object is of a specific type for example an array.
|
|
722
877
|
*
|
|
723
878
|
* @method is
|
|
724
|
-
* @param {Object}
|
|
725
|
-
* @param {string}
|
|
879
|
+
* @param {Object} obj Object to check type of.
|
|
880
|
+
* @param {string} type Optional type to check for.
|
|
726
881
|
* @return {Boolean} true/false if the object is of the specified type.
|
|
727
882
|
*/
|
|
728
|
-
function is(
|
|
729
|
-
if (!
|
|
730
|
-
return
|
|
883
|
+
function is(obj, type) {
|
|
884
|
+
if (!type) {
|
|
885
|
+
return obj !== undefined;
|
|
731
886
|
}
|
|
732
887
|
|
|
733
|
-
if (
|
|
888
|
+
if (type == 'array' && isArray(obj)) {
|
|
734
889
|
return true;
|
|
735
890
|
}
|
|
736
891
|
|
|
737
|
-
return typeof
|
|
892
|
+
return typeof obj == type;
|
|
738
893
|
}
|
|
739
894
|
|
|
740
895
|
/**
|
|
@@ -772,7 +927,7 @@ define("tinymce/util/Tools", [], function() {
|
|
|
772
927
|
items = items || [];
|
|
773
928
|
delim = delim || ',';
|
|
774
929
|
|
|
775
|
-
if (typeof
|
|
930
|
+
if (typeof items == "string") {
|
|
776
931
|
items = items.split(delim);
|
|
777
932
|
}
|
|
778
933
|
|
|
@@ -841,18 +996,18 @@ define("tinymce/util/Tools", [], function() {
|
|
|
841
996
|
* one array list into another.
|
|
842
997
|
*
|
|
843
998
|
* @method map
|
|
844
|
-
* @param {Array}
|
|
845
|
-
* @param {function}
|
|
999
|
+
* @param {Array} array Array of items to iterate.
|
|
1000
|
+
* @param {function} callback Function to call for each item. It's return value will be the new value.
|
|
846
1001
|
* @return {Array} Array with new values based on function return values.
|
|
847
1002
|
*/
|
|
848
|
-
function map(
|
|
849
|
-
var
|
|
1003
|
+
function map(array, callback) {
|
|
1004
|
+
var out = [];
|
|
850
1005
|
|
|
851
|
-
each(
|
|
852
|
-
|
|
1006
|
+
each(array, function(item) {
|
|
1007
|
+
out.push(callback(item));
|
|
853
1008
|
});
|
|
854
1009
|
|
|
855
|
-
return
|
|
1010
|
+
return out;
|
|
856
1011
|
}
|
|
857
1012
|
|
|
858
1013
|
/**
|
|
@@ -1005,6 +1160,7 @@ define("tinymce/util/Tools", [], function() {
|
|
|
1005
1160
|
|
|
1006
1161
|
// Add static methods
|
|
1007
1162
|
/*jshint sub:true*/
|
|
1163
|
+
/*eslint dot-notation:0*/
|
|
1008
1164
|
self.each(p['static'], function(f, n) {
|
|
1009
1165
|
ns[cn][n] = f;
|
|
1010
1166
|
});
|
|
@@ -1164,6 +1320,16 @@ define("tinymce/util/Tools", [], function() {
|
|
|
1164
1320
|
return map(s.split(d || ','), trim);
|
|
1165
1321
|
}
|
|
1166
1322
|
|
|
1323
|
+
function _addCacheSuffix(url) {
|
|
1324
|
+
var cacheSuffix = Env.cacheSuffix;
|
|
1325
|
+
|
|
1326
|
+
if (cacheSuffix) {
|
|
1327
|
+
url += (url.indexOf('?') === -1 ? '?' : '&') + cacheSuffix;
|
|
1328
|
+
}
|
|
1329
|
+
|
|
1330
|
+
return url;
|
|
1331
|
+
}
|
|
1332
|
+
|
|
1167
1333
|
return {
|
|
1168
1334
|
trim: trim,
|
|
1169
1335
|
isArray: isArray,
|
|
@@ -1179,145 +1345,8 @@ define("tinymce/util/Tools", [], function() {
|
|
|
1179
1345
|
walk: walk,
|
|
1180
1346
|
createNS: createNS,
|
|
1181
1347
|
resolve: resolve,
|
|
1182
|
-
explode: explode
|
|
1183
|
-
|
|
1184
|
-
});
|
|
1185
|
-
|
|
1186
|
-
// Included from: js/tinymce/classes/Env.js
|
|
1187
|
-
|
|
1188
|
-
/**
|
|
1189
|
-
* Env.js
|
|
1190
|
-
*
|
|
1191
|
-
* Copyright, Moxiecode Systems AB
|
|
1192
|
-
* Released under LGPL License.
|
|
1193
|
-
*
|
|
1194
|
-
* License: http://www.tinymce.com/license
|
|
1195
|
-
* Contributing: http://www.tinymce.com/contributing
|
|
1196
|
-
*/
|
|
1197
|
-
|
|
1198
|
-
/**
|
|
1199
|
-
* This class contains various environment constants like browser versions etc.
|
|
1200
|
-
* Normally you don't want to sniff specific browser versions but sometimes you have
|
|
1201
|
-
* to when it's impossible to feature detect. So use this with care.
|
|
1202
|
-
*
|
|
1203
|
-
* @class tinymce.Env
|
|
1204
|
-
* @static
|
|
1205
|
-
*/
|
|
1206
|
-
define("tinymce/Env", [], function() {
|
|
1207
|
-
var nav = navigator, userAgent = nav.userAgent;
|
|
1208
|
-
var opera, webkit, ie, ie11, gecko, mac, iDevice;
|
|
1209
|
-
|
|
1210
|
-
opera = window.opera && window.opera.buildNumber;
|
|
1211
|
-
webkit = /WebKit/.test(userAgent);
|
|
1212
|
-
ie = !webkit && !opera && (/MSIE/gi).test(userAgent) && (/Explorer/gi).test(nav.appName);
|
|
1213
|
-
ie = ie && /MSIE (\w+)\./.exec(userAgent)[1];
|
|
1214
|
-
ie11 = userAgent.indexOf('Trident/') != -1 && (userAgent.indexOf('rv:') != -1 || nav.appName.indexOf('Netscape') != -1) ? 11 : false;
|
|
1215
|
-
ie = ie || ie11;
|
|
1216
|
-
gecko = !webkit && !ie11 && /Gecko/.test(userAgent);
|
|
1217
|
-
mac = userAgent.indexOf('Mac') != -1;
|
|
1218
|
-
iDevice = /(iPad|iPhone)/.test(userAgent);
|
|
1219
|
-
|
|
1220
|
-
// Is a iPad/iPhone and not on iOS5 sniff the WebKit version since older iOS WebKit versions
|
|
1221
|
-
// says it has contentEditable support but there is no visible caret.
|
|
1222
|
-
var contentEditable = !iDevice || userAgent.match(/AppleWebKit\/(\d*)/)[1] >= 534;
|
|
1223
|
-
|
|
1224
|
-
return {
|
|
1225
|
-
/**
|
|
1226
|
-
* Constant that is true if the browser is Opera.
|
|
1227
|
-
*
|
|
1228
|
-
* @property opera
|
|
1229
|
-
* @type Boolean
|
|
1230
|
-
* @final
|
|
1231
|
-
*/
|
|
1232
|
-
opera: opera,
|
|
1233
|
-
|
|
1234
|
-
/**
|
|
1235
|
-
* Constant that is true if the browser is WebKit (Safari/Chrome).
|
|
1236
|
-
*
|
|
1237
|
-
* @property webKit
|
|
1238
|
-
* @type Boolean
|
|
1239
|
-
* @final
|
|
1240
|
-
*/
|
|
1241
|
-
webkit: webkit,
|
|
1242
|
-
|
|
1243
|
-
/**
|
|
1244
|
-
* Constant that is more than zero if the browser is IE.
|
|
1245
|
-
*
|
|
1246
|
-
* @property ie
|
|
1247
|
-
* @type Boolean
|
|
1248
|
-
* @final
|
|
1249
|
-
*/
|
|
1250
|
-
ie: ie,
|
|
1251
|
-
|
|
1252
|
-
/**
|
|
1253
|
-
* Constant that is true if the browser is Gecko.
|
|
1254
|
-
*
|
|
1255
|
-
* @property gecko
|
|
1256
|
-
* @type Boolean
|
|
1257
|
-
* @final
|
|
1258
|
-
*/
|
|
1259
|
-
gecko: gecko,
|
|
1260
|
-
|
|
1261
|
-
/**
|
|
1262
|
-
* Constant that is true if the os is Mac OS.
|
|
1263
|
-
*
|
|
1264
|
-
* @property mac
|
|
1265
|
-
* @type Boolean
|
|
1266
|
-
* @final
|
|
1267
|
-
*/
|
|
1268
|
-
mac: mac,
|
|
1269
|
-
|
|
1270
|
-
/**
|
|
1271
|
-
* Constant that is true if the os is iOS.
|
|
1272
|
-
*
|
|
1273
|
-
* @property iOS
|
|
1274
|
-
* @type Boolean
|
|
1275
|
-
* @final
|
|
1276
|
-
*/
|
|
1277
|
-
iOS: iDevice,
|
|
1278
|
-
|
|
1279
|
-
/**
|
|
1280
|
-
* Constant that is true if the browser supports editing.
|
|
1281
|
-
*
|
|
1282
|
-
* @property contentEditable
|
|
1283
|
-
* @type Boolean
|
|
1284
|
-
* @final
|
|
1285
|
-
*/
|
|
1286
|
-
contentEditable: contentEditable,
|
|
1287
|
-
|
|
1288
|
-
/**
|
|
1289
|
-
* Transparent image data url.
|
|
1290
|
-
*
|
|
1291
|
-
* @property transparentSrc
|
|
1292
|
-
* @type Boolean
|
|
1293
|
-
* @final
|
|
1294
|
-
*/
|
|
1295
|
-
transparentSrc: "data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7",
|
|
1296
|
-
|
|
1297
|
-
/**
|
|
1298
|
-
* Returns true/false if the browser can or can't place the caret after a inline block like an image.
|
|
1299
|
-
*
|
|
1300
|
-
* @property noCaretAfter
|
|
1301
|
-
* @type Boolean
|
|
1302
|
-
* @final
|
|
1303
|
-
*/
|
|
1304
|
-
caretAfter: ie != 8,
|
|
1305
|
-
|
|
1306
|
-
/**
|
|
1307
|
-
* Constant that is true if the browser supports native DOM Ranges. IE 9+.
|
|
1308
|
-
*
|
|
1309
|
-
* @property range
|
|
1310
|
-
* @type Boolean
|
|
1311
|
-
*/
|
|
1312
|
-
range: window.getSelection && "Range" in window,
|
|
1313
|
-
|
|
1314
|
-
/**
|
|
1315
|
-
* Returns the IE document mode for non IE browsers this will fake IE 10.
|
|
1316
|
-
*
|
|
1317
|
-
* @property documentMode
|
|
1318
|
-
* @type Number
|
|
1319
|
-
*/
|
|
1320
|
-
documentMode: ie ? (document.documentMode || 7) : 10
|
|
1348
|
+
explode: explode,
|
|
1349
|
+
_addCacheSuffix: _addCacheSuffix
|
|
1321
1350
|
};
|
|
1322
1351
|
});
|
|
1323
1352
|
|
|
@@ -1372,6 +1401,10 @@ define("tinymce/dom/DomQuery", [
|
|
|
1372
1401
|
return typeof obj === 'string';
|
|
1373
1402
|
}
|
|
1374
1403
|
|
|
1404
|
+
function isWindow(obj) {
|
|
1405
|
+
return obj && obj == obj.window;
|
|
1406
|
+
}
|
|
1407
|
+
|
|
1375
1408
|
function createFragment(html, fragDoc) {
|
|
1376
1409
|
var frag, node, container;
|
|
1377
1410
|
|
|
@@ -1662,10 +1695,6 @@ define("tinymce/dom/DomQuery", [
|
|
|
1662
1695
|
return self.add(DomQuery(items));
|
|
1663
1696
|
}
|
|
1664
1697
|
|
|
1665
|
-
if (items.nodeType) {
|
|
1666
|
-
return self.add([items]);
|
|
1667
|
-
}
|
|
1668
|
-
|
|
1669
1698
|
if (sort !== false) {
|
|
1670
1699
|
nodes = DomQuery.unique(self.toArray().concat(DomQuery.makeArray(items)));
|
|
1671
1700
|
self.length = nodes.length;
|
|
@@ -1813,7 +1842,7 @@ define("tinymce/dom/DomQuery", [
|
|
|
1813
1842
|
name = camel(name);
|
|
1814
1843
|
|
|
1815
1844
|
// Default px suffix on these
|
|
1816
|
-
if (typeof
|
|
1845
|
+
if (typeof value === 'number' && !numericCssMap[name]) {
|
|
1817
1846
|
value += 'px';
|
|
1818
1847
|
}
|
|
1819
1848
|
|
|
@@ -2446,7 +2475,13 @@ define("tinymce/dom/DomQuery", [
|
|
|
2446
2475
|
* @param {Object} object Object to convert to array.
|
|
2447
2476
|
* @return {Arrau} Array produced from object.
|
|
2448
2477
|
*/
|
|
2449
|
-
makeArray:
|
|
2478
|
+
makeArray: function(array) {
|
|
2479
|
+
if (isWindow(array) || array.nodeType) {
|
|
2480
|
+
return [array];
|
|
2481
|
+
}
|
|
2482
|
+
|
|
2483
|
+
return Tools.toArray(array);
|
|
2484
|
+
},
|
|
2450
2485
|
|
|
2451
2486
|
/**
|
|
2452
2487
|
* Returns the index of the specified item inside the array.
|
|
@@ -4159,7 +4194,7 @@ define("tinymce/html/Entities", [
|
|
|
4159
4194
|
attrsCharsRegExp = /[&<>\"\u0060\u007E-\uD7FF\uE000-\uFFEF]|[\uD800-\uDBFF][\uDC00-\uDFFF]/g,
|
|
4160
4195
|
textCharsRegExp = /[<>&\u007E-\uD7FF\uE000-\uFFEF]|[\uD800-\uDBFF][\uDC00-\uDFFF]/g,
|
|
4161
4196
|
rawCharsRegExp = /[<>&\"\']/g,
|
|
4162
|
-
entityRegExp =
|
|
4197
|
+
entityRegExp = /&#([a-z0-9]+);?|&([a-z0-9]+);/gi,
|
|
4163
4198
|
asciiMap = {
|
|
4164
4199
|
128: "\u20AC", 130: "\u201A", 131: "\u0192", 132: "\u201E", 133: "\u2026", 134: "\u2020",
|
|
4165
4200
|
135: "\u2021", 136: "\u02C6", 137: "\u2030", 138: "\u0160", 139: "\u2039", 140: "\u0152",
|
|
@@ -4373,17 +4408,21 @@ define("tinymce/html/Entities", [
|
|
|
4373
4408
|
* @return {String} Entity decoded string.
|
|
4374
4409
|
*/
|
|
4375
4410
|
decode: function(text) {
|
|
4376
|
-
return text.replace(entityRegExp, function(all, numeric
|
|
4411
|
+
return text.replace(entityRegExp, function(all, numeric) {
|
|
4377
4412
|
if (numeric) {
|
|
4378
|
-
|
|
4413
|
+
if (numeric.charAt(0).toLowerCase() === 'x') {
|
|
4414
|
+
numeric = parseInt(numeric.substr(1), 16);
|
|
4415
|
+
} else {
|
|
4416
|
+
numeric = parseInt(numeric, 10);
|
|
4417
|
+
}
|
|
4379
4418
|
|
|
4380
4419
|
// Support upper UTF
|
|
4381
|
-
if (
|
|
4382
|
-
|
|
4420
|
+
if (numeric > 0xFFFF) {
|
|
4421
|
+
numeric -= 0x10000;
|
|
4383
4422
|
|
|
4384
|
-
return String.fromCharCode(0xD800 + (
|
|
4423
|
+
return String.fromCharCode(0xD800 + (numeric >> 10), 0xDC00 + (numeric & 0x3FF));
|
|
4385
4424
|
} else {
|
|
4386
|
-
return asciiMap[
|
|
4425
|
+
return asciiMap[numeric] || String.fromCharCode(numeric);
|
|
4387
4426
|
}
|
|
4388
4427
|
}
|
|
4389
4428
|
|
|
@@ -4413,7 +4452,9 @@ define("tinymce/html/Entities", [
|
|
|
4413
4452
|
* @class tinymce.dom.StyleSheetLoader
|
|
4414
4453
|
* @private
|
|
4415
4454
|
*/
|
|
4416
|
-
define("tinymce/dom/StyleSheetLoader", [
|
|
4455
|
+
define("tinymce/dom/StyleSheetLoader", [
|
|
4456
|
+
"tinymce/util/Tools"
|
|
4457
|
+
], function(Tools) {
|
|
4417
4458
|
"use strict";
|
|
4418
4459
|
|
|
4419
4460
|
return function(document, settings) {
|
|
@@ -4510,6 +4551,8 @@ define("tinymce/dom/StyleSheetLoader", [], function() {
|
|
|
4510
4551
|
}, waitForGeckoLinkLoaded);
|
|
4511
4552
|
}
|
|
4512
4553
|
|
|
4554
|
+
url = Tools._addCacheSuffix(url);
|
|
4555
|
+
|
|
4513
4556
|
if (!loadedStates[url]) {
|
|
4514
4557
|
state = {
|
|
4515
4558
|
passed: [],
|
|
@@ -4956,7 +4999,7 @@ define("tinymce/dom/DOMUtils", [
|
|
|
4956
4999
|
get: function(elm) {
|
|
4957
5000
|
var name;
|
|
4958
5001
|
|
|
4959
|
-
if (elm && this.doc && typeof
|
|
5002
|
+
if (elm && this.doc && typeof elm == 'string') {
|
|
4960
5003
|
name = elm;
|
|
4961
5004
|
elm = this.doc.getElementById(elm);
|
|
4962
5005
|
|
|
@@ -5139,7 +5182,7 @@ define("tinymce/dom/DOMUtils", [
|
|
|
5139
5182
|
}
|
|
5140
5183
|
|
|
5141
5184
|
// A call to tinymce.is doesn't work for some odd reason on IE9 possible bug inside their JS runtime
|
|
5142
|
-
if (typeof
|
|
5185
|
+
if (typeof html != "undefined") {
|
|
5143
5186
|
return outHtml + '>' + html + '</' + name + '>';
|
|
5144
5187
|
}
|
|
5145
5188
|
|
|
@@ -5546,6 +5589,8 @@ define("tinymce/dom/DOMUtils", [
|
|
|
5546
5589
|
each(url.split(','), function(url) {
|
|
5547
5590
|
var link;
|
|
5548
5591
|
|
|
5592
|
+
url = Tools._addCacheSuffix(url);
|
|
5593
|
+
|
|
5549
5594
|
if (self.files[url]) {
|
|
5550
5595
|
return;
|
|
5551
5596
|
}
|
|
@@ -5738,7 +5783,9 @@ define("tinymce/dom/DOMUtils", [
|
|
|
5738
5783
|
*/
|
|
5739
5784
|
getOuterHTML: function(elm) {
|
|
5740
5785
|
elm = this.get(elm);
|
|
5741
|
-
|
|
5786
|
+
|
|
5787
|
+
// Older FF doesn't have outerHTML 3.6 is still used by some orgaizations
|
|
5788
|
+
return elm.nodeType == 1 && "outerHTML" in elm ? elm.outerHTML : $('<div>').append($(elm).clone()).html();
|
|
5742
5789
|
},
|
|
5743
5790
|
|
|
5744
5791
|
/**
|
|
@@ -5760,11 +5807,17 @@ define("tinymce/dom/DOMUtils", [
|
|
|
5760
5807
|
|
|
5761
5808
|
self.$$(elm).each(function() {
|
|
5762
5809
|
try {
|
|
5763
|
-
|
|
5810
|
+
// Older FF doesn't have outerHTML 3.6 is still used by some orgaizations
|
|
5811
|
+
if ("outerHTML" in this) {
|
|
5812
|
+
this.outerHTML = html;
|
|
5813
|
+
return;
|
|
5814
|
+
}
|
|
5764
5815
|
} catch (ex) {
|
|
5765
|
-
//
|
|
5766
|
-
self.remove($(this).html(html), true);
|
|
5816
|
+
// Ignore
|
|
5767
5817
|
}
|
|
5818
|
+
|
|
5819
|
+
// OuterHTML for IE it sometimes produces an "unknown runtime error"
|
|
5820
|
+
self.remove($(this).html(html), true);
|
|
5768
5821
|
});
|
|
5769
5822
|
},
|
|
5770
5823
|
|
|
@@ -5922,7 +5975,7 @@ define("tinymce/dom/DOMUtils", [
|
|
|
5922
5975
|
run: function(elm, func, scope) {
|
|
5923
5976
|
var self = this, result;
|
|
5924
5977
|
|
|
5925
|
-
if (typeof
|
|
5978
|
+
if (typeof elm === 'string') {
|
|
5926
5979
|
elm = self.get(elm);
|
|
5927
5980
|
}
|
|
5928
5981
|
|
|
@@ -5936,7 +5989,7 @@ define("tinymce/dom/DOMUtils", [
|
|
|
5936
5989
|
|
|
5937
5990
|
each(elm, function(elm, i) {
|
|
5938
5991
|
if (elm) {
|
|
5939
|
-
if (typeof
|
|
5992
|
+
if (typeof elm == 'string') {
|
|
5940
5993
|
elm = self.get(elm);
|
|
5941
5994
|
}
|
|
5942
5995
|
|
|
@@ -6378,7 +6431,7 @@ define("tinymce/dom/DOMUtils", [
|
|
|
6378
6431
|
|
|
6379
6432
|
if (node) {
|
|
6380
6433
|
// If expression make a function of it using is
|
|
6381
|
-
if (typeof
|
|
6434
|
+
if (typeof func == 'string') {
|
|
6382
6435
|
func = function(node) {
|
|
6383
6436
|
return self.is(node, selector);
|
|
6384
6437
|
};
|
|
@@ -6494,7 +6547,7 @@ define("tinymce/dom/ScriptLoader", [
|
|
|
6494
6547
|
/*eslint no-console:0 */
|
|
6495
6548
|
|
|
6496
6549
|
// Report the error so it's easier for people to spot loading errors
|
|
6497
|
-
if (typeof
|
|
6550
|
+
if (typeof console !== "undefined" && console.log) {
|
|
6498
6551
|
console.log("Failed to load: " + url);
|
|
6499
6552
|
}
|
|
6500
6553
|
|
|
@@ -6510,7 +6563,7 @@ define("tinymce/dom/ScriptLoader", [
|
|
|
6510
6563
|
elm = document.createElement('script');
|
|
6511
6564
|
elm.id = id;
|
|
6512
6565
|
elm.type = 'text/javascript';
|
|
6513
|
-
elm.src = url;
|
|
6566
|
+
elm.src = Tools._addCacheSuffix(url);
|
|
6514
6567
|
|
|
6515
6568
|
// Seems that onreadystatechange works better on IE 10 onload seems to fire incorrectly
|
|
6516
6569
|
if ("onreadystatechange" in elm) {
|
|
@@ -6953,7 +7006,6 @@ define("tinymce/AddOnManager", [
|
|
|
6953
7006
|
* This class contains a few utility methods for ranges.
|
|
6954
7007
|
*
|
|
6955
7008
|
* @class tinymce.dom.RangeUtils
|
|
6956
|
-
* @private
|
|
6957
7009
|
*/
|
|
6958
7010
|
define("tinymce/dom/RangeUtils", [
|
|
6959
7011
|
"tinymce/util/Tools",
|
|
@@ -7328,7 +7380,7 @@ define("tinymce/dom/RangeUtils", [
|
|
|
7328
7380
|
container = node.parentNode;
|
|
7329
7381
|
|
|
7330
7382
|
// Put caret after image when moving the end point
|
|
7331
|
-
if (node.nodeName ==
|
|
7383
|
+
if (node.nodeName == "IMG" && !directionLeft) {
|
|
7332
7384
|
offset++;
|
|
7333
7385
|
}
|
|
7334
7386
|
|
|
@@ -7431,6 +7483,53 @@ define("tinymce/dom/RangeUtils", [
|
|
|
7431
7483
|
return false;
|
|
7432
7484
|
};
|
|
7433
7485
|
|
|
7486
|
+
/**
|
|
7487
|
+
* Gets the caret range for the given x/y location.
|
|
7488
|
+
*
|
|
7489
|
+
* @static
|
|
7490
|
+
* @method getCaretRangeFromPoint
|
|
7491
|
+
* @param {Number} x X coordinate for range
|
|
7492
|
+
* @param {Number} y Y coordinate for range
|
|
7493
|
+
* @param {Document} doc Document that x/y are relative to
|
|
7494
|
+
* @returns {Range} caret range
|
|
7495
|
+
*/
|
|
7496
|
+
RangeUtils.getCaretRangeFromPoint = function(x, y, doc) {
|
|
7497
|
+
var rng, point;
|
|
7498
|
+
|
|
7499
|
+
if (doc.caretPositionFromPoint) {
|
|
7500
|
+
point = doc.caretPositionFromPoint(x, y);
|
|
7501
|
+
rng = doc.createRange();
|
|
7502
|
+
rng.setStart(point.offsetNode, point.offset);
|
|
7503
|
+
rng.collapse(true);
|
|
7504
|
+
} else if (doc.caretRangeFromPoint) {
|
|
7505
|
+
rng = doc.caretRangeFromPoint(x, y);
|
|
7506
|
+
} else if (doc.body.createTextRange) {
|
|
7507
|
+
rng = doc.body.createTextRange();
|
|
7508
|
+
|
|
7509
|
+
try {
|
|
7510
|
+
rng.moveToPoint(x, y);
|
|
7511
|
+
rng.collapse(true);
|
|
7512
|
+
} catch (ex) {
|
|
7513
|
+
// Append to top or bottom depending on drop location
|
|
7514
|
+
rng.collapse(y < doc.body.clientHeight);
|
|
7515
|
+
}
|
|
7516
|
+
}
|
|
7517
|
+
|
|
7518
|
+
return rng;
|
|
7519
|
+
};
|
|
7520
|
+
|
|
7521
|
+
RangeUtils.getNode = function(container, offset) {
|
|
7522
|
+
if (container.nodeType == 1 && container.hasChildNodes()) {
|
|
7523
|
+
if (offset >= container.childNodes.length) {
|
|
7524
|
+
offset = container.childNodes.length - 1;
|
|
7525
|
+
}
|
|
7526
|
+
|
|
7527
|
+
container = container.childNodes[offset];
|
|
7528
|
+
}
|
|
7529
|
+
|
|
7530
|
+
return container;
|
|
7531
|
+
};
|
|
7532
|
+
|
|
7434
7533
|
return RangeUtils;
|
|
7435
7534
|
});
|
|
7436
7535
|
|
|
@@ -7453,8 +7552,9 @@ define("tinymce/dom/RangeUtils", [
|
|
|
7453
7552
|
* @private
|
|
7454
7553
|
*/
|
|
7455
7554
|
define("tinymce/NodeChange", [
|
|
7456
|
-
"tinymce/dom/RangeUtils"
|
|
7457
|
-
|
|
7555
|
+
"tinymce/dom/RangeUtils",
|
|
7556
|
+
"tinymce/Env"
|
|
7557
|
+
], function(RangeUtils, Env) {
|
|
7458
7558
|
return function(editor) {
|
|
7459
7559
|
var lastRng, lastPath = [];
|
|
7460
7560
|
|
|
@@ -7517,11 +7617,17 @@ define("tinymce/NodeChange", [
|
|
|
7517
7617
|
editor.fire('SelectionChange');
|
|
7518
7618
|
});
|
|
7519
7619
|
|
|
7620
|
+
// Selection change is delayed ~200ms on IE when you click inside the current range
|
|
7520
7621
|
editor.on('SelectionChange', function() {
|
|
7521
7622
|
var startElm = editor.selection.getStart(true);
|
|
7522
7623
|
|
|
7523
|
-
//
|
|
7524
|
-
|
|
7624
|
+
// IE 8 will fire a selectionchange event with an incorrect selection
|
|
7625
|
+
// when focusing out of table cells. Click inside cell -> toolbar = Invalid SelectionChange event
|
|
7626
|
+
if (!Env.range && editor.selection.isCollapsed()) {
|
|
7627
|
+
return;
|
|
7628
|
+
}
|
|
7629
|
+
|
|
7630
|
+
if (!isSameElementPath(startElm) && editor.dom.isChildOf(startElm, editor.getBody())) {
|
|
7525
7631
|
editor.nodeChanged({selectionChange: true});
|
|
7526
7632
|
}
|
|
7527
7633
|
});
|
|
@@ -7531,9 +7637,13 @@ define("tinymce/NodeChange", [
|
|
|
7531
7637
|
if (!e.isDefaultPrevented()) {
|
|
7532
7638
|
// Delay nodeChanged call for WebKit edge case issue where the range
|
|
7533
7639
|
// isn't updated until after you click outside a selected image
|
|
7534
|
-
|
|
7640
|
+
if (editor.selection.getNode().nodeName == 'IMG') {
|
|
7641
|
+
setTimeout(function() {
|
|
7642
|
+
editor.nodeChanged();
|
|
7643
|
+
}, 0);
|
|
7644
|
+
} else {
|
|
7535
7645
|
editor.nodeChanged();
|
|
7536
|
-
}
|
|
7646
|
+
}
|
|
7537
7647
|
}
|
|
7538
7648
|
});
|
|
7539
7649
|
|
|
@@ -8141,13 +8251,13 @@ define("tinymce/html/Schema", [
|
|
|
8141
8251
|
children = children || [];
|
|
8142
8252
|
attributes = attributes || "";
|
|
8143
8253
|
|
|
8144
|
-
if (typeof
|
|
8254
|
+
if (typeof children === "string") {
|
|
8145
8255
|
children = split(children);
|
|
8146
8256
|
}
|
|
8147
8257
|
|
|
8148
8258
|
// Split string children
|
|
8149
8259
|
for (i = 3; i < args.length; i++) {
|
|
8150
|
-
if (typeof
|
|
8260
|
+
if (typeof args[i] === "string") {
|
|
8151
8261
|
args[i] = split(args[i]);
|
|
8152
8262
|
}
|
|
8153
8263
|
|
|
@@ -8267,7 +8377,7 @@ define("tinymce/html/Schema", [
|
|
|
8267
8377
|
add("a", "href target rel media hreflang type", phrasingContent);
|
|
8268
8378
|
add("q", "cite", phrasingContent);
|
|
8269
8379
|
add("ins del", "cite datetime", flowContent);
|
|
8270
|
-
add("img", "src alt usemap ismap width height");
|
|
8380
|
+
add("img", "src sizes srcset alt usemap ismap width height");
|
|
8271
8381
|
add("iframe", "src name width height", flowContent);
|
|
8272
8382
|
add("embed", "src type width height");
|
|
8273
8383
|
add("object", "data type typemustmatch name usemap form width height", flowContent, "param");
|
|
@@ -8306,7 +8416,8 @@ define("tinymce/html/Schema", [
|
|
|
8306
8416
|
add("video", "src crossorigin poster preload autoplay mediagroup loop " +
|
|
8307
8417
|
"muted controls width height buffered", flowContent, "track source");
|
|
8308
8418
|
add("audio", "src crossorigin preload autoplay mediagroup loop muted controls buffered volume", flowContent, "track source");
|
|
8309
|
-
add("
|
|
8419
|
+
add("picture", "", "img source");
|
|
8420
|
+
add("source", "src srcset type media sizes");
|
|
8310
8421
|
add("track", "kind src srclang label default");
|
|
8311
8422
|
add("datalist", "", phrasingContent, "option");
|
|
8312
8423
|
add("article section nav aside header footer", "", flowContent);
|
|
@@ -8410,7 +8521,7 @@ define("tinymce/html/Schema", [
|
|
|
8410
8521
|
|
|
8411
8522
|
// Convert styles into a rule list
|
|
8412
8523
|
each(value, function(value, key) {
|
|
8413
|
-
styles[key] = mode == 'map' ? makeMap(value, /[, ]/) : explode(value, /[, ]/);
|
|
8524
|
+
styles[key] = styles[key.toUpperCase()] = mode == 'map' ? makeMap(value, /[, ]/) : explode(value, /[, ]/);
|
|
8414
8525
|
});
|
|
8415
8526
|
}
|
|
8416
8527
|
|
|
@@ -8427,7 +8538,7 @@ define("tinymce/html/Schema", [
|
|
|
8427
8538
|
return function(settings) {
|
|
8428
8539
|
var self = this, elements = {}, children = {}, patternElements = [], validStyles, invalidStyles, schemaItems;
|
|
8429
8540
|
var whiteSpaceElementsMap, selfClosingElementsMap, shortEndedElementsMap, boolAttrMap, validClasses;
|
|
8430
|
-
var blockElementsMap, nonEmptyElementsMap, textBlockElementsMap, textInlineElementsMap;
|
|
8541
|
+
var blockElementsMap, nonEmptyElementsMap, moveCaretBeforeOnEnterElementsMap, textBlockElementsMap, textInlineElementsMap;
|
|
8431
8542
|
var customElementsMap = {}, specialElements = {};
|
|
8432
8543
|
|
|
8433
8544
|
// Creates an lookup table map object for the specified option or the default value
|
|
@@ -8472,6 +8583,7 @@ define("tinymce/html/Schema", [
|
|
|
8472
8583
|
boolAttrMap = createLookupTable('boolean_attributes', 'checked compact declare defer disabled ismap multiple nohref noresize ' +
|
|
8473
8584
|
'noshade nowrap readonly selected autoplay loop controls');
|
|
8474
8585
|
nonEmptyElementsMap = createLookupTable('non_empty_elements', 'td th iframe video audio object script', shortEndedElementsMap);
|
|
8586
|
+
moveCaretBeforeOnEnterElementsMap = createLookupTable('move_caret_before_on_enter_elements', 'table', nonEmptyElementsMap);
|
|
8475
8587
|
textBlockElementsMap = createLookupTable('text_block_elements', 'h1 h2 h3 h4 h5 h6 p div address pre form ' +
|
|
8476
8588
|
'blockquote center dir fieldset header footer article section hgroup aside nav figure');
|
|
8477
8589
|
blockElementsMap = createLookupTable('block_elements', 'hr table tbody thead tfoot ' +
|
|
@@ -8933,6 +9045,17 @@ define("tinymce/html/Schema", [
|
|
|
8933
9045
|
return nonEmptyElementsMap;
|
|
8934
9046
|
};
|
|
8935
9047
|
|
|
9048
|
+
/**
|
|
9049
|
+
* Returns a map with elements that the caret should be moved in front of after enter is
|
|
9050
|
+
* pressed
|
|
9051
|
+
*
|
|
9052
|
+
* @method getMoveCaretBeforeOnEnterElements
|
|
9053
|
+
* @return {Object} Name/value lookup map for elements to place the caret in front of.
|
|
9054
|
+
*/
|
|
9055
|
+
self.getMoveCaretBeforeOnEnterElements = function() {
|
|
9056
|
+
return moveCaretBeforeOnEnterElementsMap;
|
|
9057
|
+
};
|
|
9058
|
+
|
|
8936
9059
|
/**
|
|
8937
9060
|
* Returns a map with elements where white space is to be preserved like PRE or SCRIPT.
|
|
8938
9061
|
*
|
|
@@ -10330,7 +10453,7 @@ define("tinymce/html/DomParser", [
|
|
|
10330
10453
|
}
|
|
10331
10454
|
|
|
10332
10455
|
validClassesMap = validClasses[node.name];
|
|
10333
|
-
if (!valid && validClassesMap &&
|
|
10456
|
+
if (!valid && validClassesMap && validClassesMap[className]) {
|
|
10334
10457
|
valid = true;
|
|
10335
10458
|
}
|
|
10336
10459
|
|
|
@@ -10514,7 +10637,7 @@ define("tinymce/html/Writer", [
|
|
|
10514
10637
|
*/
|
|
10515
10638
|
pi: function(name, text) {
|
|
10516
10639
|
if (text) {
|
|
10517
|
-
html.push('<?', name, ' ', text, '?>');
|
|
10640
|
+
html.push('<?', name, ' ', encode(text), '?>');
|
|
10518
10641
|
} else {
|
|
10519
10642
|
html.push('<?', name, '?>');
|
|
10520
10643
|
}
|
|
@@ -11659,7 +11782,7 @@ define("tinymce/util/VK", [
|
|
|
11659
11782
|
UP: 38,
|
|
11660
11783
|
|
|
11661
11784
|
modifierPressed: function(e) {
|
|
11662
|
-
return e.shiftKey || e.ctrlKey || e.altKey;
|
|
11785
|
+
return e.shiftKey || e.ctrlKey || e.altKey || this.metaKeyPressed(e);
|
|
11663
11786
|
},
|
|
11664
11787
|
|
|
11665
11788
|
metaKeyPressed: function(e) {
|
|
@@ -11703,14 +11826,14 @@ define("tinymce/dom/ControlSelection", [
|
|
|
11703
11826
|
// Details about each resize handle how to scale etc
|
|
11704
11827
|
resizeHandles = {
|
|
11705
11828
|
// Name: x multiplier, y multiplier, delta size x, delta size y
|
|
11706
|
-
n:
|
|
11707
|
-
e:
|
|
11708
|
-
s:
|
|
11709
|
-
w:
|
|
11710
|
-
nw: [0,
|
|
11711
|
-
ne: [1,
|
|
11712
|
-
se: [1,
|
|
11713
|
-
sw: [0,
|
|
11829
|
+
n: [0.5, 0, 0, -1],
|
|
11830
|
+
e: [1, 0.5, 1, 0],
|
|
11831
|
+
s: [0.5, 1, 0, 1],
|
|
11832
|
+
w: [0, 0.5, -1, 0],
|
|
11833
|
+
nw: [0, 0, -1, -1],
|
|
11834
|
+
ne: [1, 0, 1, -1],
|
|
11835
|
+
se: [1, 1, 1, 1],
|
|
11836
|
+
sw: [0, 1, -1, 1]
|
|
11714
11837
|
};
|
|
11715
11838
|
|
|
11716
11839
|
// Add CSS for resize handles, cloned element and selected
|
|
@@ -13443,7 +13566,7 @@ define("tinymce/dom/Selection", [
|
|
|
13443
13566
|
normalize: function() {
|
|
13444
13567
|
var self = this, rng = self.getRng();
|
|
13445
13568
|
|
|
13446
|
-
if (
|
|
13569
|
+
if (Env.range && new RangeUtils(self.dom).normalize(rng)) {
|
|
13447
13570
|
self.setRng(rng, self.isForward());
|
|
13448
13571
|
}
|
|
13449
13572
|
|
|
@@ -13451,7 +13574,8 @@ define("tinymce/dom/Selection", [
|
|
|
13451
13574
|
},
|
|
13452
13575
|
|
|
13453
13576
|
/**
|
|
13454
|
-
* Executes callback
|
|
13577
|
+
* Executes callback when the current selection starts/stops matching the specified selector. The current
|
|
13578
|
+
* state will be passed to the callback as it's first argument.
|
|
13455
13579
|
*
|
|
13456
13580
|
* @method selectorChanged
|
|
13457
13581
|
* @param {String} selector CSS selector to check for.
|
|
@@ -13818,7 +13942,7 @@ define("tinymce/fmt/Preview", [
|
|
|
13818
13942
|
}
|
|
13819
13943
|
|
|
13820
13944
|
// Create block/inline element to use for preview
|
|
13821
|
-
if (typeof
|
|
13945
|
+
if (typeof format == "string") {
|
|
13822
13946
|
format = editor.formatter.get(format);
|
|
13823
13947
|
if (!format) {
|
|
13824
13948
|
return;
|
|
@@ -13996,6 +14120,10 @@ define("tinymce/Formatter", [
|
|
|
13996
14120
|
return !!ed.schema.getTextBlockElements()[name.toLowerCase()];
|
|
13997
14121
|
}
|
|
13998
14122
|
|
|
14123
|
+
function isTableCell(node) {
|
|
14124
|
+
return /^(TH|TD)$/.test(node.nodeName);
|
|
14125
|
+
}
|
|
14126
|
+
|
|
13999
14127
|
function getParents(node, selector) {
|
|
14000
14128
|
return dom.getParents(node, selector, dom.getRoot());
|
|
14001
14129
|
}
|
|
@@ -14084,7 +14212,7 @@ define("tinymce/Formatter", [
|
|
|
14084
14212
|
|
|
14085
14213
|
removeformat: [
|
|
14086
14214
|
{
|
|
14087
|
-
selector: 'b,strong,em,i,font,u,strike,sub,sup,dfn,code,samp,kbd,var,cite,mark,q',
|
|
14215
|
+
selector: 'b,strong,em,i,font,u,strike,sub,sup,dfn,code,samp,kbd,var,cite,mark,q,del,ins',
|
|
14088
14216
|
remove: 'all',
|
|
14089
14217
|
split: true,
|
|
14090
14218
|
expand: false,
|
|
@@ -14107,18 +14235,18 @@ define("tinymce/Formatter", [
|
|
|
14107
14235
|
|
|
14108
14236
|
function addKeyboardShortcuts() {
|
|
14109
14237
|
// Add some inline shortcuts
|
|
14110
|
-
ed.addShortcut('
|
|
14111
|
-
ed.addShortcut('
|
|
14112
|
-
ed.addShortcut('
|
|
14238
|
+
ed.addShortcut('meta+b', 'bold_desc', 'Bold');
|
|
14239
|
+
ed.addShortcut('meta+i', 'italic_desc', 'Italic');
|
|
14240
|
+
ed.addShortcut('meta+u', 'underline_desc', 'Underline');
|
|
14113
14241
|
|
|
14114
14242
|
// BlockFormat shortcuts keys
|
|
14115
14243
|
for (var i = 1; i <= 6; i++) {
|
|
14116
|
-
ed.addShortcut('
|
|
14244
|
+
ed.addShortcut('access+' + i, '', ['FormatBlock', false, 'h' + i]);
|
|
14117
14245
|
}
|
|
14118
14246
|
|
|
14119
|
-
ed.addShortcut('
|
|
14120
|
-
ed.addShortcut('
|
|
14121
|
-
ed.addShortcut('
|
|
14247
|
+
ed.addShortcut('access+7', '', ['FormatBlock', false, 'p']);
|
|
14248
|
+
ed.addShortcut('access+8', '', ['FormatBlock', false, 'div']);
|
|
14249
|
+
ed.addShortcut('access+9', '', ['FormatBlock', false, 'address']);
|
|
14122
14250
|
}
|
|
14123
14251
|
|
|
14124
14252
|
// Public functions
|
|
@@ -14144,7 +14272,7 @@ define("tinymce/Formatter", [
|
|
|
14144
14272
|
*/
|
|
14145
14273
|
function register(name, format) {
|
|
14146
14274
|
if (name) {
|
|
14147
|
-
if (typeof
|
|
14275
|
+
if (typeof name !== 'string') {
|
|
14148
14276
|
each(name, function(format, name) {
|
|
14149
14277
|
register(name, format);
|
|
14150
14278
|
});
|
|
@@ -14176,7 +14304,7 @@ define("tinymce/Formatter", [
|
|
|
14176
14304
|
}
|
|
14177
14305
|
|
|
14178
14306
|
// Split classes if needed
|
|
14179
|
-
if (typeof
|
|
14307
|
+
if (typeof format.classes === 'string') {
|
|
14180
14308
|
format.classes = format.classes.split(/\s+/);
|
|
14181
14309
|
}
|
|
14182
14310
|
});
|
|
@@ -14217,7 +14345,7 @@ define("tinymce/Formatter", [
|
|
|
14217
14345
|
textDecoration = getTextDecoration(node.parentNode);
|
|
14218
14346
|
if (ed.dom.getStyle(node, 'color') && textDecoration) {
|
|
14219
14347
|
ed.dom.setStyle(node, 'text-decoration', textDecoration);
|
|
14220
|
-
} else if (ed.dom.getStyle(node, '
|
|
14348
|
+
} else if (ed.dom.getStyle(node, 'text-decoration') === textDecoration) {
|
|
14221
14349
|
ed.dom.setStyle(node, 'text-decoration', null);
|
|
14222
14350
|
}
|
|
14223
14351
|
}
|
|
@@ -14693,6 +14821,11 @@ define("tinymce/Formatter", [
|
|
|
14693
14821
|
out = out[start ? 'firstChild' : 'lastChild'];
|
|
14694
14822
|
}
|
|
14695
14823
|
|
|
14824
|
+
// Since dom.remove removes empty text nodes then we need to try to find a better node
|
|
14825
|
+
if (out.nodeType == 3 && out.data.length === 0) {
|
|
14826
|
+
out = start ? node.previousSibling || node.nextSibling : node.nextSibling || node.previousSibling;
|
|
14827
|
+
}
|
|
14828
|
+
|
|
14696
14829
|
dom.remove(node, true);
|
|
14697
14830
|
|
|
14698
14831
|
return out;
|
|
@@ -14723,29 +14856,36 @@ define("tinymce/Formatter", [
|
|
|
14723
14856
|
// Try to adjust endContainer as well if cells on the same row were selected - bug #6410
|
|
14724
14857
|
if (commonAncestorContainer &&
|
|
14725
14858
|
/^T(HEAD|BODY|FOOT|R)$/.test(commonAncestorContainer.nodeName) &&
|
|
14726
|
-
|
|
14859
|
+
isTableCell(endContainer) && endContainer.firstChild) {
|
|
14727
14860
|
endContainer = endContainer.firstChild || endContainer;
|
|
14728
14861
|
}
|
|
14729
14862
|
|
|
14730
|
-
|
|
14731
|
-
|
|
14732
|
-
|
|
14863
|
+
if (dom.isChildOf(startContainer, endContainer) && !isTableCell(startContainer) && !isTableCell(endContainer)) {
|
|
14864
|
+
startContainer = wrap(startContainer, 'span', {id: '_start', 'data-mce-type': 'bookmark'});
|
|
14865
|
+
splitToFormatRoot(startContainer);
|
|
14866
|
+
startContainer = unwrap(TRUE);
|
|
14867
|
+
return;
|
|
14868
|
+
} else {
|
|
14869
|
+
// Wrap start/end nodes in span element since these might be cloned/moved
|
|
14870
|
+
startContainer = wrap(startContainer, 'span', {id: '_start', 'data-mce-type': 'bookmark'});
|
|
14871
|
+
endContainer = wrap(endContainer, 'span', {id: '_end', 'data-mce-type': 'bookmark'});
|
|
14733
14872
|
|
|
14734
|
-
|
|
14735
|
-
|
|
14736
|
-
|
|
14873
|
+
// Split start/end
|
|
14874
|
+
splitToFormatRoot(startContainer);
|
|
14875
|
+
splitToFormatRoot(endContainer);
|
|
14737
14876
|
|
|
14738
|
-
|
|
14739
|
-
|
|
14740
|
-
|
|
14877
|
+
// Unwrap start/end to get real elements again
|
|
14878
|
+
startContainer = unwrap(TRUE);
|
|
14879
|
+
endContainer = unwrap();
|
|
14880
|
+
}
|
|
14741
14881
|
} else {
|
|
14742
14882
|
startContainer = endContainer = splitToFormatRoot(startContainer);
|
|
14743
14883
|
}
|
|
14744
14884
|
|
|
14745
14885
|
// Update range positions since they might have changed after the split operations
|
|
14746
|
-
rng.startContainer = startContainer.parentNode;
|
|
14886
|
+
rng.startContainer = startContainer.parentNode ? startContainer.parentNode : startContainer;
|
|
14747
14887
|
rng.startOffset = nodeIndex(startContainer);
|
|
14748
|
-
rng.endContainer = endContainer.parentNode;
|
|
14888
|
+
rng.endContainer = endContainer.parentNode ? endContainer.parentNode : endContainer;
|
|
14749
14889
|
rng.endOffset = nodeIndex(endContainer) + 1;
|
|
14750
14890
|
}
|
|
14751
14891
|
|
|
@@ -15218,7 +15358,7 @@ define("tinymce/Formatter", [
|
|
|
15218
15358
|
* @return {String} New value with replaced variables.
|
|
15219
15359
|
*/
|
|
15220
15360
|
function replaceVars(value, vars) {
|
|
15221
|
-
if (typeof
|
|
15361
|
+
if (typeof value != "string") {
|
|
15222
15362
|
value = value(vars);
|
|
15223
15363
|
} else if (vars) {
|
|
15224
15364
|
value = value.replace(/%(\w+)/g, function(str, name) {
|
|
@@ -15362,7 +15502,7 @@ define("tinymce/Formatter", [
|
|
|
15362
15502
|
function findSpace(node, offset) {
|
|
15363
15503
|
var pos, pos2, str = node.nodeValue;
|
|
15364
15504
|
|
|
15365
|
-
if (typeof
|
|
15505
|
+
if (typeof offset == "undefined") {
|
|
15366
15506
|
offset = start ? str.length : 0;
|
|
15367
15507
|
}
|
|
15368
15508
|
|
|
@@ -15633,7 +15773,7 @@ define("tinymce/Formatter", [
|
|
|
15633
15773
|
value = normalizeStyleValue(replaceVars(value, vars), name);
|
|
15634
15774
|
|
|
15635
15775
|
// Indexed array
|
|
15636
|
-
if (typeof
|
|
15776
|
+
if (typeof name === 'number') {
|
|
15637
15777
|
name = value;
|
|
15638
15778
|
compare_node = 0;
|
|
15639
15779
|
}
|
|
@@ -15658,7 +15798,7 @@ define("tinymce/Formatter", [
|
|
|
15658
15798
|
value = replaceVars(value, vars);
|
|
15659
15799
|
|
|
15660
15800
|
// Indexed array
|
|
15661
|
-
if (typeof
|
|
15801
|
+
if (typeof name === 'number') {
|
|
15662
15802
|
name = value;
|
|
15663
15803
|
compare_node = 0;
|
|
15664
15804
|
}
|
|
@@ -15671,7 +15811,7 @@ define("tinymce/Formatter", [
|
|
|
15671
15811
|
// Build new class value where everything is removed except the internal prefixed classes
|
|
15672
15812
|
valueOut = '';
|
|
15673
15813
|
each(value.split(/\s+/), function(cls) {
|
|
15674
|
-
if (/mce
|
|
15814
|
+
if (/mce\-\w+/.test(cls)) {
|
|
15675
15815
|
valueOut += (valueOut ? ' ' : '') + cls;
|
|
15676
15816
|
}
|
|
15677
15817
|
});
|
|
@@ -16168,7 +16308,8 @@ define("tinymce/Formatter", [
|
|
|
16168
16308
|
removeCaretContainer();
|
|
16169
16309
|
|
|
16170
16310
|
// Remove caret container on keydown and it's a backspace, enter or left/right arrow keys
|
|
16171
|
-
|
|
16311
|
+
// Backspace key needs to check if the range is collapsed due to bug #6780
|
|
16312
|
+
if ((keyCode == 8 && selection.isCollapsed()) || keyCode == 37 || keyCode == 39) {
|
|
16172
16313
|
removeCaretContainer(getParentCaretContainer(selection.getStart()));
|
|
16173
16314
|
}
|
|
16174
16315
|
|
|
@@ -16257,10 +16398,11 @@ define("tinymce/Formatter", [
|
|
|
16257
16398
|
* @class tinymce.UndoManager
|
|
16258
16399
|
*/
|
|
16259
16400
|
define("tinymce/UndoManager", [
|
|
16401
|
+
"tinymce/util/VK",
|
|
16260
16402
|
"tinymce/Env",
|
|
16261
16403
|
"tinymce/util/Tools",
|
|
16262
16404
|
"tinymce/html/SaxParser"
|
|
16263
|
-
], function(Env, Tools, SaxParser) {
|
|
16405
|
+
], function(VK, Env, Tools, SaxParser) {
|
|
16264
16406
|
var trim = Tools.trim, trimContentRegExp;
|
|
16265
16407
|
|
|
16266
16408
|
trimContentRegExp = new RegExp([
|
|
@@ -16307,6 +16449,10 @@ define("tinymce/UndoManager", [
|
|
|
16307
16449
|
return trim(content);
|
|
16308
16450
|
}
|
|
16309
16451
|
|
|
16452
|
+
function setDirty(state) {
|
|
16453
|
+
editor.isNotDirty = !state;
|
|
16454
|
+
}
|
|
16455
|
+
|
|
16310
16456
|
function addNonTypingUndoLevel(e) {
|
|
16311
16457
|
self.typing = false;
|
|
16312
16458
|
self.add({}, e);
|
|
@@ -16356,9 +16502,9 @@ define("tinymce/UndoManager", [
|
|
|
16356
16502
|
|
|
16357
16503
|
// Fire a TypingUndo event on the first character entered
|
|
16358
16504
|
if (isFirstTypedCharacter && self.typing) {
|
|
16359
|
-
// Make
|
|
16505
|
+
// Make it dirty if the content was changed after typing the first character
|
|
16360
16506
|
if (!editor.isDirty()) {
|
|
16361
|
-
|
|
16507
|
+
setDirty(data[0] && getContent() != data[0].content);
|
|
16362
16508
|
|
|
16363
16509
|
// Fire initial change event
|
|
16364
16510
|
if (!editor.isNotDirty) {
|
|
@@ -16384,8 +16530,9 @@ define("tinymce/UndoManager", [
|
|
|
16384
16530
|
return;
|
|
16385
16531
|
}
|
|
16386
16532
|
|
|
16387
|
-
// If key isn't
|
|
16388
|
-
|
|
16533
|
+
// If key isn't Ctrl+Alt/AltGr
|
|
16534
|
+
var modKey = (e.ctrlKey && !e.altKey) || e.metaKey;
|
|
16535
|
+
if ((keyCode < 16 || keyCode > 20) && keyCode != 224 && keyCode != 91 && !self.typing && !modKey) {
|
|
16389
16536
|
self.beforeChange();
|
|
16390
16537
|
self.typing = true;
|
|
16391
16538
|
self.add({}, e);
|
|
@@ -16400,8 +16547,8 @@ define("tinymce/UndoManager", [
|
|
|
16400
16547
|
});
|
|
16401
16548
|
|
|
16402
16549
|
// Add keyboard shortcuts for undo/redo keys
|
|
16403
|
-
editor.addShortcut('
|
|
16404
|
-
editor.addShortcut('
|
|
16550
|
+
editor.addShortcut('meta+z', '', 'Undo');
|
|
16551
|
+
editor.addShortcut('meta+y,meta+shift+z', '', 'Redo');
|
|
16405
16552
|
|
|
16406
16553
|
editor.on('AddUndo Undo Redo ClearUndos', function(e) {
|
|
16407
16554
|
if (!e.isDefaultPrevented()) {
|
|
@@ -16409,6 +16556,7 @@ define("tinymce/UndoManager", [
|
|
|
16409
16556
|
}
|
|
16410
16557
|
});
|
|
16411
16558
|
|
|
16559
|
+
/*eslint consistent-this:0 */
|
|
16412
16560
|
self = {
|
|
16413
16561
|
// Explose for debugging reasons
|
|
16414
16562
|
data: data,
|
|
@@ -16494,7 +16642,7 @@ define("tinymce/UndoManager", [
|
|
|
16494
16642
|
editor.fire('AddUndo', args);
|
|
16495
16643
|
|
|
16496
16644
|
if (index > 0) {
|
|
16497
|
-
|
|
16645
|
+
setDirty(true);
|
|
16498
16646
|
editor.fire('change', args);
|
|
16499
16647
|
}
|
|
16500
16648
|
|
|
@@ -16520,7 +16668,7 @@ define("tinymce/UndoManager", [
|
|
|
16520
16668
|
|
|
16521
16669
|
// Undo to first index then set dirty state to false
|
|
16522
16670
|
if (index === 0) {
|
|
16523
|
-
|
|
16671
|
+
setDirty(false);
|
|
16524
16672
|
}
|
|
16525
16673
|
|
|
16526
16674
|
editor.setContent(level.content, {format: 'raw'});
|
|
@@ -16546,6 +16694,7 @@ define("tinymce/UndoManager", [
|
|
|
16546
16694
|
|
|
16547
16695
|
editor.setContent(level.content, {format: 'raw'});
|
|
16548
16696
|
editor.selection.moveToBookmark(level.bookmark);
|
|
16697
|
+
setDirty(true);
|
|
16549
16698
|
|
|
16550
16699
|
editor.fire('redo', {level: level});
|
|
16551
16700
|
}
|
|
@@ -16637,7 +16786,8 @@ define("tinymce/EnterKey", [
|
|
|
16637
16786
|
|
|
16638
16787
|
return function(editor) {
|
|
16639
16788
|
var dom = editor.dom, selection = editor.selection, settings = editor.settings;
|
|
16640
|
-
var undoManager = editor.undoManager, schema = editor.schema, nonEmptyElementsMap = schema.getNonEmptyElements()
|
|
16789
|
+
var undoManager = editor.undoManager, schema = editor.schema, nonEmptyElementsMap = schema.getNonEmptyElements(),
|
|
16790
|
+
moveCaretBeforeOnEnterElementsMap = schema.getMoveCaretBeforeOnEnterElements();
|
|
16641
16791
|
|
|
16642
16792
|
function handleEnterKey(evt) {
|
|
16643
16793
|
var rng, tmpRng, editableRoot, container, offset, parentBlock, documentMode, shiftKey,
|
|
@@ -16702,7 +16852,6 @@ define("tinymce/EnterKey", [
|
|
|
16702
16852
|
// pure whitespace text node or before an image
|
|
16703
16853
|
function moveToCaretPosition(root) {
|
|
16704
16854
|
var walker, node, rng, lastNode = root, tempElm;
|
|
16705
|
-
|
|
16706
16855
|
function firstNonWhiteSpaceNodeSibling(node) {
|
|
16707
16856
|
while (node) {
|
|
16708
16857
|
if (node.nodeType == 1 || (node.nodeType == 3 && node.data && /[\r\n\s]/.test(node.data))) {
|
|
@@ -16753,7 +16902,7 @@ define("tinymce/EnterKey", [
|
|
|
16753
16902
|
break;
|
|
16754
16903
|
}
|
|
16755
16904
|
|
|
16756
|
-
if (
|
|
16905
|
+
if (moveCaretBeforeOnEnterElementsMap[node.nodeName.toLowerCase()]) {
|
|
16757
16906
|
rng.setStartBefore(node);
|
|
16758
16907
|
rng.setEndBefore(node);
|
|
16759
16908
|
break;
|
|
@@ -17422,13 +17571,18 @@ define("tinymce/EditorCommands", [
|
|
|
17422
17571
|
var TRUE = true, FALSE = false;
|
|
17423
17572
|
|
|
17424
17573
|
return function(editor) {
|
|
17425
|
-
var dom
|
|
17426
|
-
selection = editor.selection,
|
|
17574
|
+
var dom, selection, formatter,
|
|
17427
17575
|
commands = {state: {}, exec: {}, value: {}},
|
|
17428
17576
|
settings = editor.settings,
|
|
17429
|
-
formatter = editor.formatter,
|
|
17430
17577
|
bookmark;
|
|
17431
17578
|
|
|
17579
|
+
editor.on('PreInit', function() {
|
|
17580
|
+
dom = editor.dom;
|
|
17581
|
+
selection = editor.selection;
|
|
17582
|
+
settings = editor.settings;
|
|
17583
|
+
formatter = editor.formatter;
|
|
17584
|
+
});
|
|
17585
|
+
|
|
17432
17586
|
/**
|
|
17433
17587
|
* Executes the specified command.
|
|
17434
17588
|
*
|
|
@@ -17438,16 +17592,58 @@ define("tinymce/EditorCommands", [
|
|
|
17438
17592
|
* @param {Object} value Optional value for command.
|
|
17439
17593
|
* @return {Boolean} true/false if the command was found or not.
|
|
17440
17594
|
*/
|
|
17441
|
-
function execCommand(command, ui, value) {
|
|
17442
|
-
var func;
|
|
17595
|
+
function execCommand(command, ui, value, args) {
|
|
17596
|
+
var func, customCommand, state = 0;
|
|
17443
17597
|
|
|
17444
|
-
command
|
|
17445
|
-
|
|
17446
|
-
func(command, ui, value);
|
|
17447
|
-
return TRUE;
|
|
17598
|
+
if (!/^(mceAddUndoLevel|mceEndUndoLevel|mceBeginUndoLevel|mceRepaint)$/.test(command) && (!args || !args.skip_focus)) {
|
|
17599
|
+
editor.focus();
|
|
17448
17600
|
}
|
|
17449
17601
|
|
|
17450
|
-
|
|
17602
|
+
args = extend({}, args);
|
|
17603
|
+
args = editor.fire('BeforeExecCommand', {command: command, ui: ui, value: value});
|
|
17604
|
+
if (args.isDefaultPrevented()) {
|
|
17605
|
+
return false;
|
|
17606
|
+
}
|
|
17607
|
+
|
|
17608
|
+
customCommand = command.toLowerCase();
|
|
17609
|
+
if ((func = commands.exec[customCommand])) {
|
|
17610
|
+
func(customCommand, ui, value);
|
|
17611
|
+
editor.fire('ExecCommand', {command: command, ui: ui, value: value});
|
|
17612
|
+
return true;
|
|
17613
|
+
}
|
|
17614
|
+
|
|
17615
|
+
// Plugin commands
|
|
17616
|
+
each(editor.plugins, function(p) {
|
|
17617
|
+
if (p.execCommand && p.execCommand(command, ui, value)) {
|
|
17618
|
+
editor.fire('ExecCommand', {command: command, ui: ui, value: value});
|
|
17619
|
+
state = true;
|
|
17620
|
+
return false;
|
|
17621
|
+
}
|
|
17622
|
+
});
|
|
17623
|
+
|
|
17624
|
+
if (state) {
|
|
17625
|
+
return state;
|
|
17626
|
+
}
|
|
17627
|
+
|
|
17628
|
+
// Theme commands
|
|
17629
|
+
if (editor.theme && editor.theme.execCommand && editor.theme.execCommand(command, ui, value)) {
|
|
17630
|
+
editor.fire('ExecCommand', {command: command, ui: ui, value: value});
|
|
17631
|
+
return true;
|
|
17632
|
+
}
|
|
17633
|
+
|
|
17634
|
+
// Browser commands
|
|
17635
|
+
try {
|
|
17636
|
+
state = editor.getDoc().execCommand(command, ui, value);
|
|
17637
|
+
} catch (ex) {
|
|
17638
|
+
// Ignore old IE errors
|
|
17639
|
+
}
|
|
17640
|
+
|
|
17641
|
+
if (state) {
|
|
17642
|
+
editor.fire('ExecCommand', {command: command, ui: ui, value: value});
|
|
17643
|
+
return true;
|
|
17644
|
+
}
|
|
17645
|
+
|
|
17646
|
+
return false;
|
|
17451
17647
|
}
|
|
17452
17648
|
|
|
17453
17649
|
/**
|
|
@@ -17460,12 +17656,24 @@ define("tinymce/EditorCommands", [
|
|
|
17460
17656
|
function queryCommandState(command) {
|
|
17461
17657
|
var func;
|
|
17462
17658
|
|
|
17659
|
+
// Is hidden then return undefined
|
|
17660
|
+
if (editor._isHidden()) {
|
|
17661
|
+
return;
|
|
17662
|
+
}
|
|
17663
|
+
|
|
17463
17664
|
command = command.toLowerCase();
|
|
17464
17665
|
if ((func = commands.state[command])) {
|
|
17465
17666
|
return func(command);
|
|
17466
17667
|
}
|
|
17467
17668
|
|
|
17468
|
-
|
|
17669
|
+
// Browser commands
|
|
17670
|
+
try {
|
|
17671
|
+
return editor.getDoc().queryCommandState(command);
|
|
17672
|
+
} catch (ex) {
|
|
17673
|
+
// Fails sometimes see bug: 1896577
|
|
17674
|
+
}
|
|
17675
|
+
|
|
17676
|
+
return false;
|
|
17469
17677
|
}
|
|
17470
17678
|
|
|
17471
17679
|
/**
|
|
@@ -17478,12 +17686,22 @@ define("tinymce/EditorCommands", [
|
|
|
17478
17686
|
function queryCommandValue(command) {
|
|
17479
17687
|
var func;
|
|
17480
17688
|
|
|
17689
|
+
// Is hidden then return undefined
|
|
17690
|
+
if (editor._isHidden()) {
|
|
17691
|
+
return;
|
|
17692
|
+
}
|
|
17693
|
+
|
|
17481
17694
|
command = command.toLowerCase();
|
|
17482
17695
|
if ((func = commands.value[command])) {
|
|
17483
17696
|
return func(command);
|
|
17484
17697
|
}
|
|
17485
17698
|
|
|
17486
|
-
|
|
17699
|
+
// Browser commands
|
|
17700
|
+
try {
|
|
17701
|
+
return editor.getDoc().queryCommandValue(command);
|
|
17702
|
+
} catch (ex) {
|
|
17703
|
+
// Fails sometimes see bug: 1896577
|
|
17704
|
+
}
|
|
17487
17705
|
}
|
|
17488
17706
|
|
|
17489
17707
|
/**
|
|
@@ -17503,12 +17721,67 @@ define("tinymce/EditorCommands", [
|
|
|
17503
17721
|
});
|
|
17504
17722
|
}
|
|
17505
17723
|
|
|
17724
|
+
function addCommand(command, callback, scope) {
|
|
17725
|
+
command = command.toLowerCase();
|
|
17726
|
+
commands.exec[command] = function(command, ui, value, args) {
|
|
17727
|
+
return callback.call(scope || editor, ui, value, args);
|
|
17728
|
+
};
|
|
17729
|
+
}
|
|
17730
|
+
|
|
17731
|
+
/**
|
|
17732
|
+
* Returns true/false if the command is supported or not.
|
|
17733
|
+
*
|
|
17734
|
+
* @method queryCommandSupported
|
|
17735
|
+
* @param {String} cmd Command that we check support for.
|
|
17736
|
+
* @return {Boolean} true/false if the command is supported or not.
|
|
17737
|
+
*/
|
|
17738
|
+
function queryCommandSupported(command) {
|
|
17739
|
+
command = command.toLowerCase();
|
|
17740
|
+
|
|
17741
|
+
if (commands.exec[command]) {
|
|
17742
|
+
return true;
|
|
17743
|
+
}
|
|
17744
|
+
|
|
17745
|
+
// Browser commands
|
|
17746
|
+
try {
|
|
17747
|
+
return editor.getDoc().queryCommandSupported(command);
|
|
17748
|
+
} catch (ex) {
|
|
17749
|
+
// Fails sometimes see bug: 1896577
|
|
17750
|
+
}
|
|
17751
|
+
|
|
17752
|
+
return false;
|
|
17753
|
+
}
|
|
17754
|
+
|
|
17755
|
+
function addQueryStateHandler(command, callback, scope) {
|
|
17756
|
+
command = command.toLowerCase();
|
|
17757
|
+
commands.state[command] = function() {
|
|
17758
|
+
return callback.call(scope || editor);
|
|
17759
|
+
};
|
|
17760
|
+
}
|
|
17761
|
+
|
|
17762
|
+
function addQueryValueHandler(command, callback, scope) {
|
|
17763
|
+
command = command.toLowerCase();
|
|
17764
|
+
commands.value[command] = function() {
|
|
17765
|
+
return callback.call(scope || editor);
|
|
17766
|
+
};
|
|
17767
|
+
}
|
|
17768
|
+
|
|
17769
|
+
function hasCustomCommand(command) {
|
|
17770
|
+
command = command.toLowerCase();
|
|
17771
|
+
return !!commands.exec[command];
|
|
17772
|
+
}
|
|
17773
|
+
|
|
17506
17774
|
// Expose public methods
|
|
17507
17775
|
extend(this, {
|
|
17508
17776
|
execCommand: execCommand,
|
|
17509
17777
|
queryCommandState: queryCommandState,
|
|
17510
17778
|
queryCommandValue: queryCommandValue,
|
|
17511
|
-
|
|
17779
|
+
queryCommandSupported: queryCommandSupported,
|
|
17780
|
+
addCommands: addCommands,
|
|
17781
|
+
addCommand: addCommand,
|
|
17782
|
+
addQueryStateHandler: addQueryStateHandler,
|
|
17783
|
+
addQueryValueHandler: addQueryValueHandler,
|
|
17784
|
+
hasCustomCommand: hasCustomCommand
|
|
17512
17785
|
});
|
|
17513
17786
|
|
|
17514
17787
|
// Private methods
|
|
@@ -17740,6 +18013,31 @@ define("tinymce/EditorCommands", [
|
|
|
17740
18013
|
return html;
|
|
17741
18014
|
}
|
|
17742
18015
|
|
|
18016
|
+
// Removes from a [b] c -> a c -> a c
|
|
18017
|
+
function trimNbspAfterDeleteAndPaddValue() {
|
|
18018
|
+
var rng, container, offset;
|
|
18019
|
+
|
|
18020
|
+
rng = selection.getRng(true);
|
|
18021
|
+
container = rng.startContainer;
|
|
18022
|
+
offset = rng.startOffset;
|
|
18023
|
+
|
|
18024
|
+
if (container.nodeType == 3 && rng.collapsed) {
|
|
18025
|
+
if (container.data[offset] === '\u00a0') {
|
|
18026
|
+
container.deleteData(offset, 1);
|
|
18027
|
+
|
|
18028
|
+
if (!/[\u00a0| ]$/.test(value)) {
|
|
18029
|
+
value += ' ';
|
|
18030
|
+
}
|
|
18031
|
+
} else if (container.data[offset - 1] === '\u00a0') {
|
|
18032
|
+
container.deleteData(offset - 1, 1);
|
|
18033
|
+
|
|
18034
|
+
if (!/[\u00a0| ]$/.test(value)) {
|
|
18035
|
+
value = ' ' + value;
|
|
18036
|
+
}
|
|
18037
|
+
}
|
|
18038
|
+
}
|
|
18039
|
+
}
|
|
18040
|
+
|
|
17743
18041
|
function markInlineFormatElements(fragment) {
|
|
17744
18042
|
if (merge) {
|
|
17745
18043
|
for (node = fragment.firstChild; node; node = node.walk(true)) {
|
|
@@ -17766,7 +18064,7 @@ define("tinymce/EditorCommands", [
|
|
|
17766
18064
|
}
|
|
17767
18065
|
}
|
|
17768
18066
|
|
|
17769
|
-
if (typeof
|
|
18067
|
+
if (typeof value != 'string') {
|
|
17770
18068
|
merge = value.merge;
|
|
17771
18069
|
value = value.content;
|
|
17772
18070
|
}
|
|
@@ -17810,6 +18108,7 @@ define("tinymce/EditorCommands", [
|
|
|
17810
18108
|
// Insert node maker where we will insert the new HTML and get it's parent
|
|
17811
18109
|
if (!selection.isCollapsed()) {
|
|
17812
18110
|
editor.getDoc().execCommand('Delete', false, null);
|
|
18111
|
+
trimNbspAfterDeleteAndPaddValue();
|
|
17813
18112
|
}
|
|
17814
18113
|
|
|
17815
18114
|
parentNode = selection.getNode();
|
|
@@ -18008,7 +18307,7 @@ define("tinymce/EditorCommands", [
|
|
|
18008
18307
|
mceInsertLink: function(command, ui, value) {
|
|
18009
18308
|
var anchor;
|
|
18010
18309
|
|
|
18011
|
-
if (typeof
|
|
18310
|
+
if (typeof value == 'string') {
|
|
18012
18311
|
value = {href: value};
|
|
18013
18312
|
}
|
|
18014
18313
|
|
|
@@ -18908,11 +19207,11 @@ define("tinymce/util/EventDispatcher", [
|
|
|
18908
19207
|
handlers = bindings[name];
|
|
18909
19208
|
if (handlers) {
|
|
18910
19209
|
for (i = 0, l = handlers.length; i < l; i++) {
|
|
18911
|
-
|
|
19210
|
+
callback = handlers[i];
|
|
18912
19211
|
|
|
18913
19212
|
// Unbind handlers marked with "once"
|
|
18914
19213
|
if (callback.once) {
|
|
18915
|
-
off(name, callback);
|
|
19214
|
+
off(name, callback.func);
|
|
18916
19215
|
}
|
|
18917
19216
|
|
|
18918
19217
|
// Stop immediate propagation if needed
|
|
@@ -18922,7 +19221,7 @@ define("tinymce/util/EventDispatcher", [
|
|
|
18922
19221
|
}
|
|
18923
19222
|
|
|
18924
19223
|
// If callback returns false then prevent default and stop all propagation
|
|
18925
|
-
if (callback.call(scope, args) === false) {
|
|
19224
|
+
if (callback.func.call(scope, args) === false) {
|
|
18926
19225
|
args.preventDefault();
|
|
18927
19226
|
return args;
|
|
18928
19227
|
}
|
|
@@ -18945,7 +19244,7 @@ define("tinymce/util/EventDispatcher", [
|
|
|
18945
19244
|
* // Callback logic
|
|
18946
19245
|
* });
|
|
18947
19246
|
*/
|
|
18948
|
-
function on(name, callback, prepend) {
|
|
19247
|
+
function on(name, callback, prepend, extra) {
|
|
18949
19248
|
var handlers, names, i;
|
|
18950
19249
|
|
|
18951
19250
|
if (callback === false) {
|
|
@@ -18953,6 +19252,14 @@ define("tinymce/util/EventDispatcher", [
|
|
|
18953
19252
|
}
|
|
18954
19253
|
|
|
18955
19254
|
if (callback) {
|
|
19255
|
+
callback = {
|
|
19256
|
+
func: callback
|
|
19257
|
+
};
|
|
19258
|
+
|
|
19259
|
+
if (extra) {
|
|
19260
|
+
Tools.extend(callback, extra);
|
|
19261
|
+
}
|
|
19262
|
+
|
|
18956
19263
|
names = name.toLowerCase().split(' ');
|
|
18957
19264
|
i = names.length;
|
|
18958
19265
|
while (i--) {
|
|
@@ -19019,7 +19326,7 @@ define("tinymce/util/EventDispatcher", [
|
|
|
19019
19326
|
// Unbind specific ones
|
|
19020
19327
|
hi = handlers.length;
|
|
19021
19328
|
while (hi--) {
|
|
19022
|
-
if (handlers[hi] === callback) {
|
|
19329
|
+
if (handlers[hi].func === callback) {
|
|
19023
19330
|
handlers = handlers.slice(0, hi).concat(handlers.slice(hi + 1));
|
|
19024
19331
|
bindings[name] = handlers;
|
|
19025
19332
|
}
|
|
@@ -19058,8 +19365,7 @@ define("tinymce/util/EventDispatcher", [
|
|
|
19058
19365
|
* });
|
|
19059
19366
|
*/
|
|
19060
19367
|
function once(name, callback, prepend) {
|
|
19061
|
-
callback
|
|
19062
|
-
return on(name, callback, prepend);
|
|
19368
|
+
return on(name, callback, prepend, {once: true});
|
|
19063
19369
|
}
|
|
19064
19370
|
|
|
19065
19371
|
/**
|
|
@@ -19578,7 +19884,7 @@ define("tinymce/ui/Collection", [
|
|
|
19578
19884
|
var self = this, i, l, matches = [], item, match;
|
|
19579
19885
|
|
|
19580
19886
|
// Compile string into selector expression
|
|
19581
|
-
if (typeof
|
|
19887
|
+
if (typeof selector === "string") {
|
|
19582
19888
|
selector = new Selector(selector);
|
|
19583
19889
|
|
|
19584
19890
|
match = function(item) {
|
|
@@ -19963,15 +20269,15 @@ define("tinymce/ui/DomUtils", [
|
|
|
19963
20269
|
return document.getElementById(id);
|
|
19964
20270
|
},
|
|
19965
20271
|
|
|
19966
|
-
addClass
|
|
20272
|
+
addClass: function(elm, cls) {
|
|
19967
20273
|
return DOMUtils.DOM.addClass(elm, cls);
|
|
19968
20274
|
},
|
|
19969
20275
|
|
|
19970
|
-
removeClass
|
|
20276
|
+
removeClass: function(elm, cls) {
|
|
19971
20277
|
return DOMUtils.DOM.removeClass(elm, cls);
|
|
19972
20278
|
},
|
|
19973
20279
|
|
|
19974
|
-
hasClass
|
|
20280
|
+
hasClass: function(elm, cls) {
|
|
19975
20281
|
return DOMUtils.DOM.hasClass(elm, cls);
|
|
19976
20282
|
},
|
|
19977
20283
|
|
|
@@ -20215,7 +20521,7 @@ define("tinymce/ui/Control", [
|
|
|
20215
20521
|
return;
|
|
20216
20522
|
}
|
|
20217
20523
|
|
|
20218
|
-
if (typeof
|
|
20524
|
+
if (typeof value === "number") {
|
|
20219
20525
|
value = value || 0;
|
|
20220
20526
|
|
|
20221
20527
|
return {
|
|
@@ -20315,7 +20621,7 @@ define("tinymce/ui/Control", [
|
|
|
20315
20621
|
width = settings.width;
|
|
20316
20622
|
height = settings.height;
|
|
20317
20623
|
autoResize = settings.autoResize;
|
|
20318
|
-
autoResize = typeof
|
|
20624
|
+
autoResize = typeof autoResize != "undefined" ? autoResize : !width && !height;
|
|
20319
20625
|
|
|
20320
20626
|
width = width || minWidth;
|
|
20321
20627
|
height = height || minHeight;
|
|
@@ -20540,7 +20846,7 @@ define("tinymce/ui/Control", [
|
|
|
20540
20846
|
function resolveCallbackName(name) {
|
|
20541
20847
|
var callback, scope;
|
|
20542
20848
|
|
|
20543
|
-
if (typeof
|
|
20849
|
+
if (typeof name != 'string') {
|
|
20544
20850
|
return name;
|
|
20545
20851
|
}
|
|
20546
20852
|
|
|
@@ -20870,7 +21176,7 @@ define("tinymce/ui/Control", [
|
|
|
20870
21176
|
visible: function(state) {
|
|
20871
21177
|
var self = this, parentCtrl;
|
|
20872
21178
|
|
|
20873
|
-
if (typeof
|
|
21179
|
+
if (typeof state !== "undefined") {
|
|
20874
21180
|
if (self._visible !== state) {
|
|
20875
21181
|
if (self._rendered) {
|
|
20876
21182
|
self.getEl().style.display = state ? '' : 'none';
|
|
@@ -20952,7 +21258,7 @@ define("tinymce/ui/Control", [
|
|
|
20952
21258
|
aria: function(name, value) {
|
|
20953
21259
|
var self = this, elm = self.getEl(self.ariaTarget);
|
|
20954
21260
|
|
|
20955
|
-
if (typeof
|
|
21261
|
+
if (typeof value === "undefined") {
|
|
20956
21262
|
return self._aria[name];
|
|
20957
21263
|
} else {
|
|
20958
21264
|
self._aria[name] = value;
|
|
@@ -21276,7 +21582,7 @@ define("tinymce/ui/Control", [
|
|
|
21276
21582
|
for (i = lastParents.length - 1; i >= idx; i--) {
|
|
21277
21583
|
lastCtrl = lastParents[i];
|
|
21278
21584
|
lastCtrl.fire("mouseleave", {
|
|
21279
|
-
target
|
|
21585
|
+
target: lastCtrl.getEl()
|
|
21280
21586
|
});
|
|
21281
21587
|
}
|
|
21282
21588
|
}
|
|
@@ -21284,7 +21590,7 @@ define("tinymce/ui/Control", [
|
|
|
21284
21590
|
for (i = idx; i < parents.length; i++) {
|
|
21285
21591
|
ctrl = parents[i];
|
|
21286
21592
|
ctrl.fire("mouseenter", {
|
|
21287
|
-
target
|
|
21593
|
+
target: ctrl.getEl()
|
|
21288
21594
|
});
|
|
21289
21595
|
}
|
|
21290
21596
|
}
|
|
@@ -21568,7 +21874,7 @@ define("tinymce/ui/Factory", [], function() {
|
|
|
21568
21874
|
}
|
|
21569
21875
|
|
|
21570
21876
|
// If string is specified then use it as the type
|
|
21571
|
-
if (typeof
|
|
21877
|
+
if (typeof type == 'string') {
|
|
21572
21878
|
settings = settings || {};
|
|
21573
21879
|
settings.type = type;
|
|
21574
21880
|
} else {
|
|
@@ -22215,7 +22521,7 @@ define("tinymce/ui/Container", [
|
|
|
22215
22521
|
// Construct item if needed
|
|
22216
22522
|
if (!(item instanceof Control)) {
|
|
22217
22523
|
// Name only then convert it to an object
|
|
22218
|
-
if (typeof
|
|
22524
|
+
if (typeof item == "string") {
|
|
22219
22525
|
item = {type: item};
|
|
22220
22526
|
}
|
|
22221
22527
|
|
|
@@ -22353,7 +22659,7 @@ define("tinymce/ui/Container", [
|
|
|
22353
22659
|
self.find('*').each(function(ctrl) {
|
|
22354
22660
|
var name = ctrl.name(), value = ctrl.value();
|
|
22355
22661
|
|
|
22356
|
-
if (name && typeof
|
|
22662
|
+
if (name && typeof value != "undefined") {
|
|
22357
22663
|
data[name] = value;
|
|
22358
22664
|
}
|
|
22359
22665
|
});
|
|
@@ -22831,14 +23137,14 @@ define("tinymce/ui/Panel", [
|
|
|
22831
23137
|
self.preRender();
|
|
22832
23138
|
layout.preRender(self);
|
|
22833
23139
|
|
|
22834
|
-
if (typeof
|
|
23140
|
+
if (typeof innerHtml == "undefined") {
|
|
22835
23141
|
innerHtml = (
|
|
22836
23142
|
'<div id="' + self._id + '-body" class="' + self.classes('body') + '">' +
|
|
22837
23143
|
layout.renderHtml(self) +
|
|
22838
23144
|
'</div>'
|
|
22839
23145
|
);
|
|
22840
23146
|
} else {
|
|
22841
|
-
if (typeof
|
|
23147
|
+
if (typeof innerHtml == 'function') {
|
|
22842
23148
|
innerHtml = innerHtml.call(self);
|
|
22843
23149
|
}
|
|
22844
23150
|
|
|
@@ -22987,7 +23293,7 @@ define("tinymce/ui/Movable", [
|
|
|
22987
23293
|
* @return {tinymce.ui.Control} Current control instance.
|
|
22988
23294
|
*/
|
|
22989
23295
|
moveRel: function(elm, rel) {
|
|
22990
|
-
if (typeof
|
|
23296
|
+
if (typeof rel != 'string') {
|
|
22991
23297
|
rel = this.testMoveRel(elm, rel);
|
|
22992
23298
|
}
|
|
22993
23299
|
|
|
@@ -23744,7 +24050,7 @@ define("tinymce/ui/Window", [
|
|
|
23744
24050
|
html = '<iframe src="' + settings.url + '" tabindex="-1"></iframe>';
|
|
23745
24051
|
}
|
|
23746
24052
|
|
|
23747
|
-
if (typeof
|
|
24053
|
+
if (typeof html == "undefined") {
|
|
23748
24054
|
html = layout.renderHtml(self);
|
|
23749
24055
|
}
|
|
23750
24056
|
|
|
@@ -24093,7 +24399,7 @@ define("tinymce/ui/MessageBox", [
|
|
|
24093
24399
|
* @param {function} [callback] Callback to execute when the user makes a choice.
|
|
24094
24400
|
*/
|
|
24095
24401
|
alert: function(settings, callback) {
|
|
24096
|
-
if (typeof
|
|
24402
|
+
if (typeof settings == "string") {
|
|
24097
24403
|
settings = {text: settings};
|
|
24098
24404
|
}
|
|
24099
24405
|
|
|
@@ -24109,7 +24415,7 @@ define("tinymce/ui/MessageBox", [
|
|
|
24109
24415
|
* @param {function} [callback] Callback to execute when the user makes a choice.
|
|
24110
24416
|
*/
|
|
24111
24417
|
confirm: function(settings, callback) {
|
|
24112
|
-
if (typeof
|
|
24418
|
+
if (typeof settings == "string") {
|
|
24113
24419
|
settings = {text: settings};
|
|
24114
24420
|
}
|
|
24115
24421
|
|
|
@@ -24194,9 +24500,7 @@ define("tinymce/WindowManager", [
|
|
|
24194
24500
|
* @option {String} file URL of the file to open in the window.
|
|
24195
24501
|
* @option {Number} width Width in pixels.
|
|
24196
24502
|
* @option {Number} height Height in pixels.
|
|
24197
|
-
* @option {Boolean}
|
|
24198
|
-
* @option {Boolean} maximizable Specifies whether the popup window has a "maximize" button and can get maximized or not.
|
|
24199
|
-
* @option {String/Boolean} scrollbars Specifies whether the popup window can have scrollbars if required (i.e. content
|
|
24503
|
+
* @option {Boolean} autoScroll Specifies whether the popup window can have scrollbars if required (i.e. content
|
|
24200
24504
|
* larger than the popup size specified).
|
|
24201
24505
|
*/
|
|
24202
24506
|
self.open = function(args, params) {
|
|
@@ -24392,16 +24696,19 @@ define("tinymce/WindowManager", [
|
|
|
24392
24696
|
define("tinymce/util/Quirks", [
|
|
24393
24697
|
"tinymce/util/VK",
|
|
24394
24698
|
"tinymce/dom/RangeUtils",
|
|
24699
|
+
"tinymce/dom/TreeWalker",
|
|
24395
24700
|
"tinymce/html/Node",
|
|
24396
24701
|
"tinymce/html/Entities",
|
|
24397
24702
|
"tinymce/Env",
|
|
24398
24703
|
"tinymce/util/Tools"
|
|
24399
|
-
], function(VK, RangeUtils, Node, Entities, Env, Tools) {
|
|
24704
|
+
], function(VK, RangeUtils, TreeWalker, Node, Entities, Env, Tools) {
|
|
24400
24705
|
return function(editor) {
|
|
24401
|
-
var each = Tools.each
|
|
24706
|
+
var each = Tools.each, $ = editor.$;
|
|
24402
24707
|
var BACKSPACE = VK.BACKSPACE, DELETE = VK.DELETE, dom = editor.dom, selection = editor.selection,
|
|
24403
24708
|
settings = editor.settings, parser = editor.parser, serializer = editor.serializer;
|
|
24404
24709
|
var isGecko = Env.gecko, isIE = Env.ie, isWebKit = Env.webkit;
|
|
24710
|
+
var mceInternalUrlPrefix = 'data:text/mce-internal,';
|
|
24711
|
+
var mceInternalDataType = isIE ? 'Text' : 'URL';
|
|
24405
24712
|
|
|
24406
24713
|
/**
|
|
24407
24714
|
* Executes a command with a specific state this can be to enable/disable browser editing features.
|
|
@@ -24434,6 +24741,69 @@ define("tinymce/util/Quirks", [
|
|
|
24434
24741
|
return e.isDefaultPrevented();
|
|
24435
24742
|
}
|
|
24436
24743
|
|
|
24744
|
+
/**
|
|
24745
|
+
* Sets Text/URL data on the event's dataTransfer object to a special data:text/mce-internal url.
|
|
24746
|
+
* This is to workaround the inability to set custom contentType on IE and Safari.
|
|
24747
|
+
* The editor's selected content is encoded into this url so drag and drop between editors will work.
|
|
24748
|
+
*
|
|
24749
|
+
* @private
|
|
24750
|
+
* @param {DragEvent} e Event object
|
|
24751
|
+
*/
|
|
24752
|
+
function setMceInteralContent(e) {
|
|
24753
|
+
var selectionHtml;
|
|
24754
|
+
|
|
24755
|
+
if (e.dataTransfer) {
|
|
24756
|
+
if (editor.selection.isCollapsed() && e.target.tagName == 'IMG') {
|
|
24757
|
+
selection.select(e.target);
|
|
24758
|
+
}
|
|
24759
|
+
|
|
24760
|
+
selectionHtml = editor.selection.getContent();
|
|
24761
|
+
|
|
24762
|
+
// Safari/IE doesn't support custom dataTransfer items so we can only use URL and Text
|
|
24763
|
+
if (selectionHtml.length > 0) {
|
|
24764
|
+
e.dataTransfer.setData(mceInternalDataType, mceInternalUrlPrefix + escape(selectionHtml));
|
|
24765
|
+
}
|
|
24766
|
+
}
|
|
24767
|
+
}
|
|
24768
|
+
|
|
24769
|
+
/**
|
|
24770
|
+
* Gets content of special data:text/mce-internal url on the event's dataTransfer object.
|
|
24771
|
+
* This is to workaround the inability to set custom contentType on IE and Safari.
|
|
24772
|
+
* The editor's selected content is encoded into this url so drag and drop between editors will work.
|
|
24773
|
+
*
|
|
24774
|
+
* @private
|
|
24775
|
+
* @param {DragEvent} e Event object
|
|
24776
|
+
* @returns {String} mce-internal content
|
|
24777
|
+
*/
|
|
24778
|
+
function getMceInternalContent(e) {
|
|
24779
|
+
var internalContent, content;
|
|
24780
|
+
|
|
24781
|
+
if (e.dataTransfer) {
|
|
24782
|
+
internalContent = e.dataTransfer.getData(mceInternalDataType);
|
|
24783
|
+
|
|
24784
|
+
if (internalContent && internalContent.indexOf(mceInternalUrlPrefix) >= 0) {
|
|
24785
|
+
content = unescape(internalContent.substr(mceInternalUrlPrefix.length));
|
|
24786
|
+
}
|
|
24787
|
+
}
|
|
24788
|
+
|
|
24789
|
+
return content;
|
|
24790
|
+
}
|
|
24791
|
+
|
|
24792
|
+
/**
|
|
24793
|
+
* Inserts contents using the paste clipboard command if it's available if it isn't it will fallback
|
|
24794
|
+
* to the core command.
|
|
24795
|
+
*
|
|
24796
|
+
* @private
|
|
24797
|
+
* @param {String} content Content to insert at selection.
|
|
24798
|
+
*/
|
|
24799
|
+
function insertClipboardContents(content) {
|
|
24800
|
+
if (editor.queryCommandSupported('mceInsertClipboardContent')) {
|
|
24801
|
+
editor.execCommand('mceInsertClipboardContent', false, {content: content});
|
|
24802
|
+
} else {
|
|
24803
|
+
editor.execCommand('mceInsertContent', false, content);
|
|
24804
|
+
}
|
|
24805
|
+
}
|
|
24806
|
+
|
|
24437
24807
|
/**
|
|
24438
24808
|
* Fixes a WebKit bug when deleting contents using backspace or delete key.
|
|
24439
24809
|
* WebKit will produce a span element if you delete across two block elements.
|
|
@@ -24456,13 +24826,13 @@ define("tinymce/util/Quirks", [
|
|
|
24456
24826
|
* 4. Delete by pressing delete key with ctrl/cmd (Word delete).
|
|
24457
24827
|
* 5. Delete by drag/dropping contents inside the editor.
|
|
24458
24828
|
* 6. Delete by using Cut Ctrl+X/Cmd+X.
|
|
24459
|
-
* 7. Delete by selecting contents and writing a character.
|
|
24829
|
+
* 7. Delete by selecting contents and writing a character.
|
|
24460
24830
|
*
|
|
24461
24831
|
* This code is a ugly hack since writing full custom delete logic for just this bug
|
|
24462
24832
|
* fix seemed like a huge task. I hope we can remove this before the year 2030.
|
|
24463
24833
|
*/
|
|
24464
24834
|
function cleanupStylesWhenDeleting() {
|
|
24465
|
-
var doc = editor.getDoc(),
|
|
24835
|
+
var doc = editor.getDoc(), dom = editor.dom, selection = editor.selection;
|
|
24466
24836
|
var MutationObserver = window.MutationObserver, olderWebKit, dragStartRng;
|
|
24467
24837
|
|
|
24468
24838
|
// Add mini polyfill for older WebKits
|
|
@@ -24504,8 +24874,212 @@ define("tinymce/util/Quirks", [
|
|
|
24504
24874
|
};
|
|
24505
24875
|
}
|
|
24506
24876
|
|
|
24877
|
+
function isTrailingBr(node) {
|
|
24878
|
+
var blockElements = dom.schema.getBlockElements(), rootNode = editor.getBody();
|
|
24879
|
+
|
|
24880
|
+
if (node.nodeName != 'BR') {
|
|
24881
|
+
return false;
|
|
24882
|
+
}
|
|
24883
|
+
|
|
24884
|
+
for (node = node; node != rootNode && !blockElements[node.nodeName]; node = node.parentNode) {
|
|
24885
|
+
if (node.nextSibling) {
|
|
24886
|
+
return false;
|
|
24887
|
+
}
|
|
24888
|
+
}
|
|
24889
|
+
|
|
24890
|
+
return true;
|
|
24891
|
+
}
|
|
24892
|
+
|
|
24893
|
+
function isSiblingsIgnoreWhiteSpace(node1, node2) {
|
|
24894
|
+
var node;
|
|
24895
|
+
|
|
24896
|
+
for (node = node1.nextSibling; node && node != node2; node = node.nextSibling) {
|
|
24897
|
+
if (node.nodeType == 3 && $.trim(node.data).length === 0) {
|
|
24898
|
+
continue;
|
|
24899
|
+
}
|
|
24900
|
+
|
|
24901
|
+
if (node !== node2) {
|
|
24902
|
+
return false;
|
|
24903
|
+
}
|
|
24904
|
+
}
|
|
24905
|
+
|
|
24906
|
+
return node === node2;
|
|
24907
|
+
}
|
|
24908
|
+
|
|
24909
|
+
function findCaretNode(node, forward, startNode) {
|
|
24910
|
+
var walker, current, nonEmptyElements;
|
|
24911
|
+
|
|
24912
|
+
nonEmptyElements = dom.schema.getNonEmptyElements();
|
|
24913
|
+
|
|
24914
|
+
walker = new TreeWalker(startNode || node, node);
|
|
24915
|
+
|
|
24916
|
+
while ((current = walker[forward ? 'next' : 'prev']())) {
|
|
24917
|
+
if (nonEmptyElements[current.nodeName] && !isTrailingBr(current)) {
|
|
24918
|
+
return current;
|
|
24919
|
+
}
|
|
24920
|
+
|
|
24921
|
+
if (current.nodeType == 3 && current.data.length > 0) {
|
|
24922
|
+
return current;
|
|
24923
|
+
}
|
|
24924
|
+
}
|
|
24925
|
+
}
|
|
24926
|
+
|
|
24927
|
+
function deleteRangeBetweenTextBlocks(rng) {
|
|
24928
|
+
var startBlock, endBlock, caretNodeBefore, caretNodeAfter, textBlockElements;
|
|
24929
|
+
|
|
24930
|
+
if (rng.collapsed) {
|
|
24931
|
+
return;
|
|
24932
|
+
}
|
|
24933
|
+
|
|
24934
|
+
startBlock = dom.getParent(RangeUtils.getNode(rng.startContainer, rng.startOffset), dom.isBlock);
|
|
24935
|
+
endBlock = dom.getParent(RangeUtils.getNode(rng.endContainer, rng.endOffset), dom.isBlock);
|
|
24936
|
+
textBlockElements = editor.schema.getTextBlockElements();
|
|
24937
|
+
|
|
24938
|
+
if (startBlock == endBlock) {
|
|
24939
|
+
return;
|
|
24940
|
+
}
|
|
24941
|
+
|
|
24942
|
+
if (!textBlockElements[startBlock.nodeName] || !textBlockElements[endBlock.nodeName]) {
|
|
24943
|
+
return;
|
|
24944
|
+
}
|
|
24945
|
+
|
|
24946
|
+
if (dom.getContentEditable(startBlock) === "false" || dom.getContentEditable(endBlock) === "false") {
|
|
24947
|
+
return;
|
|
24948
|
+
}
|
|
24949
|
+
|
|
24950
|
+
rng.deleteContents();
|
|
24951
|
+
|
|
24952
|
+
caretNodeBefore = findCaretNode(startBlock, false);
|
|
24953
|
+
caretNodeAfter = findCaretNode(endBlock, true);
|
|
24954
|
+
|
|
24955
|
+
if (!dom.isEmpty(endBlock)) {
|
|
24956
|
+
$(startBlock).append(endBlock.childNodes);
|
|
24957
|
+
}
|
|
24958
|
+
|
|
24959
|
+
$(endBlock).remove();
|
|
24960
|
+
|
|
24961
|
+
if (caretNodeBefore) {
|
|
24962
|
+
if (caretNodeBefore.nodeType == 1) {
|
|
24963
|
+
if (caretNodeBefore.nodeName == "BR") {
|
|
24964
|
+
rng.setStartBefore(caretNodeBefore);
|
|
24965
|
+
rng.setEndBefore(caretNodeBefore);
|
|
24966
|
+
} else {
|
|
24967
|
+
rng.setStartAfter(caretNodeBefore);
|
|
24968
|
+
rng.setEndAfter(caretNodeBefore);
|
|
24969
|
+
}
|
|
24970
|
+
} else {
|
|
24971
|
+
rng.setStart(caretNodeBefore, caretNodeBefore.data.length);
|
|
24972
|
+
rng.setEnd(caretNodeBefore, caretNodeBefore.data.length);
|
|
24973
|
+
}
|
|
24974
|
+
} else if (caretNodeAfter) {
|
|
24975
|
+
if (caretNodeAfter.nodeType == 1) {
|
|
24976
|
+
rng.setStartBefore(caretNodeAfter);
|
|
24977
|
+
rng.setEndBefore(caretNodeAfter);
|
|
24978
|
+
} else {
|
|
24979
|
+
rng.setStart(caretNodeAfter, 0);
|
|
24980
|
+
rng.setEnd(caretNodeAfter, 0);
|
|
24981
|
+
}
|
|
24982
|
+
}
|
|
24983
|
+
|
|
24984
|
+
selection.setRng(rng);
|
|
24985
|
+
|
|
24986
|
+
return true;
|
|
24987
|
+
}
|
|
24988
|
+
|
|
24989
|
+
function expandBetweenBlocks(rng, isForward) {
|
|
24990
|
+
var caretNode, targetCaretNode, textBlock, targetTextBlock, container, offset;
|
|
24991
|
+
|
|
24992
|
+
if (!rng.collapsed) {
|
|
24993
|
+
return rng;
|
|
24994
|
+
}
|
|
24995
|
+
|
|
24996
|
+
container = rng.startContainer;
|
|
24997
|
+
offset = rng.startOffset;
|
|
24998
|
+
|
|
24999
|
+
if (container.nodeType == 3) {
|
|
25000
|
+
if (isForward) {
|
|
25001
|
+
if (offset < container.data.length) {
|
|
25002
|
+
return rng;
|
|
25003
|
+
}
|
|
25004
|
+
} else {
|
|
25005
|
+
if (offset > 0) {
|
|
25006
|
+
return rng;
|
|
25007
|
+
}
|
|
25008
|
+
}
|
|
25009
|
+
}
|
|
25010
|
+
|
|
25011
|
+
caretNode = RangeUtils.getNode(rng.startContainer, rng.startOffset);
|
|
25012
|
+
textBlock = dom.getParent(caretNode, dom.isBlock);
|
|
25013
|
+
targetCaretNode = findCaretNode(editor.getBody(), isForward, caretNode);
|
|
25014
|
+
targetTextBlock = dom.getParent(targetCaretNode, dom.isBlock);
|
|
25015
|
+
|
|
25016
|
+
if (!caretNode || !targetCaretNode) {
|
|
25017
|
+
return rng;
|
|
25018
|
+
}
|
|
25019
|
+
|
|
25020
|
+
if (targetTextBlock && textBlock != targetTextBlock) {
|
|
25021
|
+
if (!isForward) {
|
|
25022
|
+
if (!isSiblingsIgnoreWhiteSpace(targetTextBlock, textBlock)) {
|
|
25023
|
+
return rng;
|
|
25024
|
+
}
|
|
25025
|
+
|
|
25026
|
+
if (targetCaretNode.nodeType == 1) {
|
|
25027
|
+
if (targetCaretNode.nodeName == "BR") {
|
|
25028
|
+
rng.setStartBefore(targetCaretNode);
|
|
25029
|
+
} else {
|
|
25030
|
+
rng.setStartAfter(targetCaretNode);
|
|
25031
|
+
}
|
|
25032
|
+
} else {
|
|
25033
|
+
rng.setStart(targetCaretNode, targetCaretNode.data.length);
|
|
25034
|
+
}
|
|
25035
|
+
|
|
25036
|
+
if (caretNode.nodeType == 1) {
|
|
25037
|
+
rng.setEnd(caretNode, 0);
|
|
25038
|
+
} else {
|
|
25039
|
+
rng.setEndBefore(caretNode);
|
|
25040
|
+
}
|
|
25041
|
+
} else {
|
|
25042
|
+
if (!isSiblingsIgnoreWhiteSpace(textBlock, targetTextBlock)) {
|
|
25043
|
+
return rng;
|
|
25044
|
+
}
|
|
25045
|
+
|
|
25046
|
+
if (caretNode.nodeType == 1) {
|
|
25047
|
+
if (caretNode.nodeName == "BR") {
|
|
25048
|
+
rng.setStartBefore(caretNode);
|
|
25049
|
+
} else {
|
|
25050
|
+
rng.setStartAfter(caretNode);
|
|
25051
|
+
}
|
|
25052
|
+
} else {
|
|
25053
|
+
rng.setStart(caretNode, caretNode.data.length);
|
|
25054
|
+
}
|
|
25055
|
+
|
|
25056
|
+
if (targetCaretNode.nodeType == 1) {
|
|
25057
|
+
rng.setEnd(targetCaretNode, 0);
|
|
25058
|
+
} else {
|
|
25059
|
+
rng.setEndBefore(targetCaretNode);
|
|
25060
|
+
}
|
|
25061
|
+
}
|
|
25062
|
+
}
|
|
25063
|
+
|
|
25064
|
+
return rng;
|
|
25065
|
+
}
|
|
25066
|
+
|
|
25067
|
+
function handleTextBlockMergeDelete(isForward) {
|
|
25068
|
+
var rng = selection.getRng();
|
|
25069
|
+
|
|
25070
|
+
rng = expandBetweenBlocks(rng, isForward);
|
|
25071
|
+
|
|
25072
|
+
if (deleteRangeBetweenTextBlocks(rng)) {
|
|
25073
|
+
return true;
|
|
25074
|
+
}
|
|
25075
|
+
}
|
|
25076
|
+
|
|
24507
25077
|
function customDelete(isForward) {
|
|
24508
|
-
var mutationObserver
|
|
25078
|
+
var mutationObserver, rng, caretElement;
|
|
25079
|
+
|
|
25080
|
+
if (handleTextBlockMergeDelete(isForward)) {
|
|
25081
|
+
return;
|
|
25082
|
+
}
|
|
24509
25083
|
|
|
24510
25084
|
Tools.each(editor.getBody().getElementsByTagName('*'), function(elm) {
|
|
24511
25085
|
// Mark existing spans
|
|
@@ -24520,6 +25094,7 @@ define("tinymce/util/Quirks", [
|
|
|
24520
25094
|
});
|
|
24521
25095
|
|
|
24522
25096
|
// Observe added nodes and style attribute changes
|
|
25097
|
+
mutationObserver = new MutationObserver(function() {});
|
|
24523
25098
|
mutationObserver.observe(editor.getDoc(), {
|
|
24524
25099
|
childList: true,
|
|
24525
25100
|
attributes: true,
|
|
@@ -24529,8 +25104,8 @@ define("tinymce/util/Quirks", [
|
|
|
24529
25104
|
|
|
24530
25105
|
editor.getDoc().execCommand(isForward ? 'ForwardDelete' : 'Delete', false, null);
|
|
24531
25106
|
|
|
24532
|
-
|
|
24533
|
-
|
|
25107
|
+
rng = editor.selection.getRng();
|
|
25108
|
+
caretElement = rng.startContainer.parentNode;
|
|
24534
25109
|
|
|
24535
25110
|
Tools.each(mutationObserver.takeRecords(), function(record) {
|
|
24536
25111
|
if (!dom.isChildOf(record.target, editor.getBody())) {
|
|
@@ -24578,13 +25153,13 @@ define("tinymce/util/Quirks", [
|
|
|
24578
25153
|
}
|
|
24579
25154
|
|
|
24580
25155
|
editor.on('keydown', function(e) {
|
|
24581
|
-
var isForward = e.keyCode == DELETE,
|
|
25156
|
+
var isForward = e.keyCode == DELETE, isMetaOrCtrl = e.ctrlKey || e.metaKey;
|
|
24582
25157
|
|
|
24583
25158
|
if (!isDefaultPrevented(e) && (isForward || e.keyCode == BACKSPACE)) {
|
|
24584
25159
|
var rng = editor.selection.getRng(), container = rng.startContainer, offset = rng.startOffset;
|
|
24585
25160
|
|
|
24586
25161
|
// Ignore non meta delete in the where there is text before/after the caret
|
|
24587
|
-
if (!
|
|
25162
|
+
if (!isMetaOrCtrl && rng.collapsed && container.nodeType == 3) {
|
|
24588
25163
|
if (isForward ? offset < container.data.length : offset > 0) {
|
|
24589
25164
|
return;
|
|
24590
25165
|
}
|
|
@@ -24592,19 +25167,69 @@ define("tinymce/util/Quirks", [
|
|
|
24592
25167
|
|
|
24593
25168
|
e.preventDefault();
|
|
24594
25169
|
|
|
24595
|
-
if (
|
|
24596
|
-
editor.selection.getSel().modify("extend", isForward ? "forward" : "backward", "word");
|
|
25170
|
+
if (isMetaOrCtrl) {
|
|
25171
|
+
editor.selection.getSel().modify("extend", isForward ? "forward" : "backward", e.metaKey ? "lineboundary" : "word");
|
|
24597
25172
|
}
|
|
24598
25173
|
|
|
24599
25174
|
customDelete(isForward);
|
|
24600
25175
|
}
|
|
24601
25176
|
});
|
|
24602
25177
|
|
|
25178
|
+
// Handle case where text is deleted by typing over
|
|
24603
25179
|
editor.on('keypress', function(e) {
|
|
24604
25180
|
if (!isDefaultPrevented(e) && !selection.isCollapsed() && e.charCode && !VK.metaKeyPressed(e)) {
|
|
25181
|
+
var rng, currentFormatNodes, fragmentNode, blockParent, caretNode, charText;
|
|
25182
|
+
|
|
25183
|
+
rng = editor.selection.getRng();
|
|
25184
|
+
charText = String.fromCharCode(e.charCode);
|
|
24605
25185
|
e.preventDefault();
|
|
25186
|
+
|
|
25187
|
+
// Keep track of current format nodes
|
|
25188
|
+
currentFormatNodes = $(rng.startContainer).parents().filter(function(idx, node) {
|
|
25189
|
+
return !!editor.schema.getTextInlineElements()[node.nodeName];
|
|
25190
|
+
});
|
|
25191
|
+
|
|
24606
25192
|
customDelete(true);
|
|
24607
|
-
|
|
25193
|
+
|
|
25194
|
+
// Check if the browser removed them
|
|
25195
|
+
currentFormatNodes = currentFormatNodes.filter(function(idx, node) {
|
|
25196
|
+
return !$.contains(editor.getBody(), node);
|
|
25197
|
+
});
|
|
25198
|
+
|
|
25199
|
+
// Then re-add them
|
|
25200
|
+
if (currentFormatNodes.length) {
|
|
25201
|
+
fragmentNode = dom.createFragment();
|
|
25202
|
+
|
|
25203
|
+
currentFormatNodes.each(function(idx, formatNode) {
|
|
25204
|
+
formatNode = formatNode.cloneNode(false);
|
|
25205
|
+
|
|
25206
|
+
if (fragmentNode.hasChildNodes()) {
|
|
25207
|
+
formatNode.appendChild(fragmentNode.firstChild);
|
|
25208
|
+
fragmentNode.appendChild(formatNode);
|
|
25209
|
+
} else {
|
|
25210
|
+
caretNode = formatNode;
|
|
25211
|
+
fragmentNode.appendChild(formatNode);
|
|
25212
|
+
}
|
|
25213
|
+
|
|
25214
|
+
fragmentNode.appendChild(formatNode);
|
|
25215
|
+
});
|
|
25216
|
+
|
|
25217
|
+
caretNode.appendChild(editor.getDoc().createTextNode(charText));
|
|
25218
|
+
|
|
25219
|
+
// Prevent edge case where older WebKit would add an extra BR element
|
|
25220
|
+
blockParent = dom.getParent(rng.startContainer, dom.isBlock);
|
|
25221
|
+
if (dom.isEmpty(blockParent)) {
|
|
25222
|
+
$(blockParent).empty().append(fragmentNode);
|
|
25223
|
+
} else {
|
|
25224
|
+
rng.insertNode(fragmentNode);
|
|
25225
|
+
}
|
|
25226
|
+
|
|
25227
|
+
rng.setStart(caretNode.firstChild, 1);
|
|
25228
|
+
rng.setEnd(caretNode.firstChild, 1);
|
|
25229
|
+
editor.selection.setRng(rng);
|
|
25230
|
+
} else {
|
|
25231
|
+
editor.selection.setContent(charText);
|
|
25232
|
+
}
|
|
24608
25233
|
}
|
|
24609
25234
|
});
|
|
24610
25235
|
|
|
@@ -24622,31 +25247,14 @@ define("tinymce/util/Quirks", [
|
|
|
24622
25247
|
}
|
|
24623
25248
|
|
|
24624
25249
|
editor.on('dragstart', function(e) {
|
|
24625
|
-
var selectionHtml;
|
|
24626
|
-
|
|
24627
|
-
if (editor.selection.isCollapsed() && e.target.tagName == 'IMG') {
|
|
24628
|
-
selection.select(e.target);
|
|
24629
|
-
}
|
|
24630
|
-
|
|
24631
25250
|
dragStartRng = selection.getRng();
|
|
24632
|
-
|
|
24633
|
-
|
|
24634
|
-
// Safari doesn't support custom dataTransfer items so we can only use URL and Text
|
|
24635
|
-
if (selectionHtml.length > 0) {
|
|
24636
|
-
e.dataTransfer.setData('URL', 'data:text/mce-internal,' + escape(selectionHtml));
|
|
24637
|
-
}
|
|
25251
|
+
setMceInteralContent(e);
|
|
24638
25252
|
});
|
|
24639
25253
|
|
|
24640
25254
|
editor.on('drop', function(e) {
|
|
24641
25255
|
if (!isDefaultPrevented(e)) {
|
|
24642
|
-
var internalContent = e
|
|
24643
|
-
|
|
24644
|
-
if (!internalContent || internalContent.indexOf(urlPrefix) == -1 || !doc.caretRangeFromPoint) {
|
|
24645
|
-
return;
|
|
24646
|
-
}
|
|
24647
|
-
|
|
24648
|
-
internalContent = unescape(internalContent.substr(urlPrefix.length));
|
|
24649
|
-
if (doc.caretRangeFromPoint) {
|
|
25256
|
+
var internalContent = getMceInternalContent(e);
|
|
25257
|
+
if (internalContent) {
|
|
24650
25258
|
e.preventDefault();
|
|
24651
25259
|
|
|
24652
25260
|
// Safari has a weird issue where drag/dropping images sometimes
|
|
@@ -24654,7 +25262,7 @@ define("tinymce/util/Quirks", [
|
|
|
24654
25262
|
// will return "null" even though the x, y coordinate is correct.
|
|
24655
25263
|
// But if we detach the insert from the drop event we will get a proper range
|
|
24656
25264
|
window.setTimeout(function() {
|
|
24657
|
-
var pointRng =
|
|
25265
|
+
var pointRng = RangeUtils.getCaretRangeFromPoint(e.x, e.y, doc);
|
|
24658
25266
|
|
|
24659
25267
|
if (dragStartRng) {
|
|
24660
25268
|
selection.setRng(dragStartRng);
|
|
@@ -24662,12 +25270,10 @@ define("tinymce/util/Quirks", [
|
|
|
24662
25270
|
}
|
|
24663
25271
|
|
|
24664
25272
|
customDelete();
|
|
24665
|
-
|
|
24666
25273
|
selection.setRng(pointRng);
|
|
24667
|
-
|
|
25274
|
+
insertClipboardContents(internalContent);
|
|
24668
25275
|
}, 0);
|
|
24669
25276
|
}
|
|
24670
|
-
|
|
24671
25277
|
}
|
|
24672
25278
|
});
|
|
24673
25279
|
|
|
@@ -24761,7 +25367,7 @@ define("tinymce/util/Quirks", [
|
|
|
24761
25367
|
* This selects the whole body so that backspace/delete logic will delete everything
|
|
24762
25368
|
*/
|
|
24763
25369
|
function selectAll() {
|
|
24764
|
-
editor.shortcuts.add('
|
|
25370
|
+
editor.shortcuts.add('meta+a', null, 'SelectAll');
|
|
24765
25371
|
}
|
|
24766
25372
|
|
|
24767
25373
|
/**
|
|
@@ -25399,7 +26005,12 @@ define("tinymce/util/Quirks", [
|
|
|
25399
26005
|
editor.contentStyles.push('body {min-height: 150px}');
|
|
25400
26006
|
editor.on('click', function(e) {
|
|
25401
26007
|
if (e.target.nodeName == 'HTML') {
|
|
26008
|
+
var rng;
|
|
26009
|
+
|
|
26010
|
+
// Need to store away non collapsed ranges since the focus call will mess that up see #7382
|
|
26011
|
+
rng = editor.selection.getRng();
|
|
25402
26012
|
editor.getBody().focus();
|
|
26013
|
+
editor.selection.setRng(rng);
|
|
25403
26014
|
editor.selection.normalize();
|
|
25404
26015
|
editor.nodeChanged();
|
|
25405
26016
|
}
|
|
@@ -25416,7 +26027,7 @@ define("tinymce/util/Quirks", [
|
|
|
25416
26027
|
editor.on('keydown', function(e) {
|
|
25417
26028
|
if (VK.metaKeyPressed(e) && (e.keyCode == 37 || e.keyCode == 39)) {
|
|
25418
26029
|
e.preventDefault();
|
|
25419
|
-
editor.selection.getSel().modify('move', e.keyCode == 37 ? 'backward' : 'forward', '
|
|
26030
|
+
editor.selection.getSel().modify('move', e.keyCode == 37 ? 'backward' : 'forward', 'lineboundary');
|
|
25420
26031
|
}
|
|
25421
26032
|
});
|
|
25422
26033
|
}
|
|
@@ -25555,6 +26166,29 @@ define("tinymce/util/Quirks", [
|
|
|
25555
26166
|
});
|
|
25556
26167
|
}
|
|
25557
26168
|
|
|
26169
|
+
/**
|
|
26170
|
+
* IE cannot set custom contentType's on drag events, and also does not properly drag/drop between
|
|
26171
|
+
* editors. This uses a special data:text/mce-internal URL to pass data when drag/drop between editors.
|
|
26172
|
+
*/
|
|
26173
|
+
function ieInternalDragAndDrop() {
|
|
26174
|
+
editor.on('dragstart', function(e) {
|
|
26175
|
+
setMceInteralContent(e);
|
|
26176
|
+
});
|
|
26177
|
+
|
|
26178
|
+
editor.on('drop', function(e) {
|
|
26179
|
+
if (!isDefaultPrevented(e)) {
|
|
26180
|
+
var internalContent = getMceInternalContent(e);
|
|
26181
|
+
if (internalContent) {
|
|
26182
|
+
e.preventDefault();
|
|
26183
|
+
|
|
26184
|
+
var rng = RangeUtils.getCaretRangeFromPoint(e.x, e.y, editor.getDoc());
|
|
26185
|
+
selection.setRng(rng);
|
|
26186
|
+
insertClipboardContents(internalContent);
|
|
26187
|
+
}
|
|
26188
|
+
}
|
|
26189
|
+
});
|
|
26190
|
+
}
|
|
26191
|
+
|
|
25558
26192
|
// All browsers
|
|
25559
26193
|
removeBlockQuoteOnBackSpace();
|
|
25560
26194
|
emptyEditorWhenDeleting();
|
|
@@ -25602,6 +26236,7 @@ define("tinymce/util/Quirks", [
|
|
|
25602
26236
|
if (Env.ie) {
|
|
25603
26237
|
selectAll();
|
|
25604
26238
|
disableAutoUrlDetect();
|
|
26239
|
+
ieInternalDragAndDrop();
|
|
25605
26240
|
}
|
|
25606
26241
|
|
|
25607
26242
|
// Gecko
|
|
@@ -25972,6 +26607,12 @@ define("tinymce/EditorObservable", [
|
|
|
25972
26607
|
|
|
25973
26608
|
/**
|
|
25974
26609
|
* Contains all logic for handling of keyboard shortcuts.
|
|
26610
|
+
*
|
|
26611
|
+
* @example
|
|
26612
|
+
* editor.shortcuts.add('ctrl+a', function() {});
|
|
26613
|
+
* editor.shortcuts.add('meta+a', function() {}); // "meta" maps to Command on Mac and Ctrl on PC
|
|
26614
|
+
* editor.shortcuts.add('ctrl+alt+a', function() {});
|
|
26615
|
+
* editor.shortcuts.add('access+a', function() {}); // "access" maps to ctrl+alt on Mac and shift+alt on PC
|
|
25975
26616
|
*/
|
|
25976
26617
|
define("tinymce/Shortcuts", [
|
|
25977
26618
|
"tinymce/util/Tools",
|
|
@@ -25985,15 +26626,78 @@ define("tinymce/Shortcuts", [
|
|
|
25985
26626
|
"f11": 122
|
|
25986
26627
|
};
|
|
25987
26628
|
|
|
26629
|
+
var modifierNames = Tools.makeMap('alt,ctrl,shift,meta,access');
|
|
26630
|
+
|
|
25988
26631
|
return function(editor) {
|
|
25989
26632
|
var self = this, shortcuts = {};
|
|
25990
26633
|
|
|
26634
|
+
function createShortcut(pattern, desc, cmdFunc, scope) {
|
|
26635
|
+
var id, key, shortcut;
|
|
26636
|
+
|
|
26637
|
+
shortcut = {
|
|
26638
|
+
func: cmdFunc,
|
|
26639
|
+
scope: scope || editor,
|
|
26640
|
+
desc: editor.translate(desc)
|
|
26641
|
+
};
|
|
26642
|
+
|
|
26643
|
+
// Parse modifiers and keys ctrl+alt+b for example
|
|
26644
|
+
each(explode(pattern, '+'), function(value) {
|
|
26645
|
+
if (value in modifierNames) {
|
|
26646
|
+
shortcut[value] = true;
|
|
26647
|
+
} else {
|
|
26648
|
+
// Allow numeric keycodes like ctrl+219 for ctrl+[
|
|
26649
|
+
if (/^[0-9]{2,}$/.test(value)) {
|
|
26650
|
+
shortcut.keyCode = parseInt(value, 10);
|
|
26651
|
+
} else {
|
|
26652
|
+
shortcut.charCode = value.charCodeAt(0);
|
|
26653
|
+
shortcut.keyCode = keyCodeLookup[value] || value.toUpperCase().charCodeAt(0);
|
|
26654
|
+
}
|
|
26655
|
+
}
|
|
26656
|
+
});
|
|
26657
|
+
|
|
26658
|
+
// Generate unique id for modifier combination and set default state for unused modifiers
|
|
26659
|
+
id = [shortcut.keyCode];
|
|
26660
|
+
for (key in modifierNames) {
|
|
26661
|
+
if (shortcut[key]) {
|
|
26662
|
+
id.push(key);
|
|
26663
|
+
} else {
|
|
26664
|
+
shortcut[key] = false;
|
|
26665
|
+
}
|
|
26666
|
+
}
|
|
26667
|
+
shortcut.id = id.join(',');
|
|
26668
|
+
|
|
26669
|
+
// Handle special access modifier differently depending on Mac/Win
|
|
26670
|
+
if (shortcut.access) {
|
|
26671
|
+
shortcut.alt = true;
|
|
26672
|
+
|
|
26673
|
+
if (Env.mac) {
|
|
26674
|
+
shortcut.ctrl = true;
|
|
26675
|
+
} else {
|
|
26676
|
+
shortcut.shift = true;
|
|
26677
|
+
}
|
|
26678
|
+
}
|
|
26679
|
+
|
|
26680
|
+
// Handle special meta modifier differently depending on Mac/Win
|
|
26681
|
+
if (shortcut.meta) {
|
|
26682
|
+
if (Env.mac) {
|
|
26683
|
+
shortcut.meta = true;
|
|
26684
|
+
} else {
|
|
26685
|
+
shortcut.ctrl = true;
|
|
26686
|
+
shortcut.meta = false;
|
|
26687
|
+
}
|
|
26688
|
+
}
|
|
26689
|
+
|
|
26690
|
+
return shortcut;
|
|
26691
|
+
}
|
|
26692
|
+
|
|
25991
26693
|
editor.on('keyup keypress keydown', function(e) {
|
|
25992
26694
|
if ((e.altKey || e.ctrlKey || e.metaKey) && !e.isDefaultPrevented()) {
|
|
25993
26695
|
each(shortcuts, function(shortcut) {
|
|
25994
|
-
|
|
26696
|
+
if (shortcut.ctrl != e.ctrlKey || shortcut.meta != e.metaKey) {
|
|
26697
|
+
return;
|
|
26698
|
+
}
|
|
25995
26699
|
|
|
25996
|
-
if (shortcut.
|
|
26700
|
+
if (shortcut.alt != e.altKey || shortcut.shift != e.shiftKey) {
|
|
25997
26701
|
return;
|
|
25998
26702
|
}
|
|
25999
26703
|
|
|
@@ -26025,7 +26729,7 @@ define("tinymce/Shortcuts", [
|
|
|
26025
26729
|
|
|
26026
26730
|
cmd = cmdFunc;
|
|
26027
26731
|
|
|
26028
|
-
if (typeof
|
|
26732
|
+
if (typeof cmdFunc === 'string') {
|
|
26029
26733
|
cmdFunc = function() {
|
|
26030
26734
|
editor.execCommand(cmd, false, null);
|
|
26031
26735
|
};
|
|
@@ -26036,43 +26740,29 @@ define("tinymce/Shortcuts", [
|
|
|
26036
26740
|
}
|
|
26037
26741
|
|
|
26038
26742
|
each(explode(pattern.toLowerCase()), function(pattern) {
|
|
26039
|
-
var shortcut =
|
|
26040
|
-
|
|
26041
|
-
|
|
26042
|
-
desc: editor.translate(desc),
|
|
26043
|
-
alt: false,
|
|
26044
|
-
ctrl: false,
|
|
26045
|
-
shift: false
|
|
26046
|
-
};
|
|
26743
|
+
var shortcut = createShortcut(pattern, desc, cmdFunc, scope);
|
|
26744
|
+
shortcuts[shortcut.id] = shortcut;
|
|
26745
|
+
});
|
|
26047
26746
|
|
|
26048
|
-
|
|
26049
|
-
|
|
26050
|
-
case 'alt':
|
|
26051
|
-
case 'ctrl':
|
|
26052
|
-
case 'shift':
|
|
26053
|
-
shortcut[value] = true;
|
|
26054
|
-
break;
|
|
26747
|
+
return true;
|
|
26748
|
+
};
|
|
26055
26749
|
|
|
26056
|
-
|
|
26057
|
-
|
|
26058
|
-
|
|
26059
|
-
|
|
26060
|
-
|
|
26061
|
-
|
|
26062
|
-
|
|
26063
|
-
|
|
26064
|
-
|
|
26065
|
-
});
|
|
26750
|
+
/**
|
|
26751
|
+
* Remove a keyboard shortcut by pattern.
|
|
26752
|
+
*
|
|
26753
|
+
* @method remove
|
|
26754
|
+
* @param {String} pattern Shortcut pattern. Like for example: ctrl+alt+o.
|
|
26755
|
+
* @return {Boolean} true/false state if the shortcut was removed or not.
|
|
26756
|
+
*/
|
|
26757
|
+
self.remove = function(pattern) {
|
|
26758
|
+
var shortcut = createShortcut(pattern);
|
|
26066
26759
|
|
|
26067
|
-
|
|
26068
|
-
|
|
26069
|
-
|
|
26070
|
-
|
|
26071
|
-
shortcut.keyCode
|
|
26072
|
-
] = shortcut;
|
|
26073
|
-
});
|
|
26760
|
+
if (shortcuts[shortcut.id]) {
|
|
26761
|
+
delete shortcuts[shortcut.id];
|
|
26762
|
+
return true;
|
|
26763
|
+
}
|
|
26074
26764
|
|
|
26075
|
-
return
|
|
26765
|
+
return false;
|
|
26076
26766
|
};
|
|
26077
26767
|
};
|
|
26078
26768
|
});
|
|
@@ -26219,9 +26909,9 @@ define("tinymce/Editor", [
|
|
|
26219
26909
|
inline_styles: true,
|
|
26220
26910
|
convert_fonts_to_spans: true,
|
|
26221
26911
|
indent: 'simple',
|
|
26222
|
-
indent_before: 'p,h1,h2,h3,h4,h5,h6,blockquote,div,title,style,pre,script,td,ul,ol,li,dl,dt,dd,area,table,thead,' +
|
|
26912
|
+
indent_before: 'p,h1,h2,h3,h4,h5,h6,blockquote,div,title,style,pre,script,td,th,ul,ol,li,dl,dt,dd,area,table,thead,' +
|
|
26223
26913
|
'tfoot,tbody,tr,section,article,hgroup,aside,figure,option,optgroup,datalist',
|
|
26224
|
-
indent_after: 'p,h1,h2,h3,h4,h5,h6,blockquote,div,title,style,pre,script,td,ul,ol,li,dl,dt,dd,area,table,thead,' +
|
|
26914
|
+
indent_after: 'p,h1,h2,h3,h4,h5,h6,blockquote,div,title,style,pre,script,td,th,ul,ol,li,dl,dt,dd,area,table,thead,' +
|
|
26225
26915
|
'tfoot,tbody,tr,section,article,hgroup,aside,figure,option,optgroup,datalist',
|
|
26226
26916
|
validate: true,
|
|
26227
26917
|
entity_encoding: 'named',
|
|
@@ -26319,12 +27009,8 @@ define("tinymce/Editor", [
|
|
|
26319
27009
|
|
|
26320
27010
|
// Creates all events like onClick, onSetContent etc see Editor.Events.js for the actual logic
|
|
26321
27011
|
self.shortcuts = new Shortcuts(self);
|
|
26322
|
-
|
|
26323
|
-
// Internal command handler objects
|
|
26324
|
-
self.execCommands = {};
|
|
26325
|
-
self.queryStateCommands = {};
|
|
26326
|
-
self.queryValueCommands = {};
|
|
26327
27012
|
self.loadedCSS = {};
|
|
27013
|
+
self.editorCommands = new EditorCommands(self);
|
|
26328
27014
|
|
|
26329
27015
|
if (settings.target) {
|
|
26330
27016
|
self.targetElm = settings.target;
|
|
@@ -26334,6 +27020,10 @@ define("tinymce/Editor", [
|
|
|
26334
27020
|
self.editorManager = editorManager;
|
|
26335
27021
|
self.inline = settings.inline;
|
|
26336
27022
|
|
|
27023
|
+
if (settings.cache_suffix) {
|
|
27024
|
+
Env.cacheSuffix = settings.cache_suffix.replace(/^[\?\&]+/, '');
|
|
27025
|
+
}
|
|
27026
|
+
|
|
26337
27027
|
// Call setup
|
|
26338
27028
|
editorManager.fire('SetupEditor', self);
|
|
26339
27029
|
self.execCallback('setup', self);
|
|
@@ -26558,6 +27248,7 @@ define("tinymce/Editor", [
|
|
|
26558
27248
|
var self = this, settings = self.settings, elm = self.getElement();
|
|
26559
27249
|
var w, h, minHeight, n, o, Theme, url, bodyId, bodyClass, re, i, initializedPlugins = [];
|
|
26560
27250
|
|
|
27251
|
+
this.editorManager.i18n.setCode(settings.language);
|
|
26561
27252
|
self.rtl = this.editorManager.i18n.rtl;
|
|
26562
27253
|
self.editorManager.add(self);
|
|
26563
27254
|
|
|
@@ -26639,7 +27330,7 @@ define("tinymce/Editor", [
|
|
|
26639
27330
|
|
|
26640
27331
|
// Resize editor
|
|
26641
27332
|
if (!settings.content_editable) {
|
|
26642
|
-
h = (o.iframeHeight || h) + (typeof
|
|
27333
|
+
h = (o.iframeHeight || h) + (typeof h == 'number' ? (o.deltaHeight || 0) : '');
|
|
26643
27334
|
if (h < minHeight) {
|
|
26644
27335
|
h = minHeight;
|
|
26645
27336
|
}
|
|
@@ -26700,7 +27391,11 @@ define("tinymce/Editor", [
|
|
|
26700
27391
|
// Load the CSS by injecting them into the HTML this will reduce "flicker"
|
|
26701
27392
|
for (i = 0; i < self.contentCSS.length; i++) {
|
|
26702
27393
|
var cssUrl = self.contentCSS[i];
|
|
26703
|
-
self.iframeHTML +=
|
|
27394
|
+
self.iframeHTML += (
|
|
27395
|
+
'<link type="text/css" ' +
|
|
27396
|
+
'rel="stylesheet" ' +
|
|
27397
|
+
'href="' + Tools._addCacheSuffix(cssUrl) + '" />'
|
|
27398
|
+
);
|
|
26704
27399
|
self.loadedCSS[cssUrl] = true;
|
|
26705
27400
|
}
|
|
26706
27401
|
|
|
@@ -26999,7 +27694,6 @@ define("tinymce/Editor", [
|
|
|
26999
27694
|
|
|
27000
27695
|
self.forceBlocks = new ForceBlocks(self);
|
|
27001
27696
|
self.enterKey = new EnterKey(self);
|
|
27002
|
-
self.editorCommands = new EditorCommands(self);
|
|
27003
27697
|
self._nodeChangeDispatcher = new NodeChange(self);
|
|
27004
27698
|
|
|
27005
27699
|
self.fire('PreInit');
|
|
@@ -27093,7 +27787,9 @@ define("tinymce/Editor", [
|
|
|
27093
27787
|
editor = self.editorManager.get(settings.auto_focus);
|
|
27094
27788
|
}
|
|
27095
27789
|
|
|
27096
|
-
editor.
|
|
27790
|
+
if (!editor.destroyed) {
|
|
27791
|
+
editor.focus();
|
|
27792
|
+
}
|
|
27097
27793
|
}, 100);
|
|
27098
27794
|
}
|
|
27099
27795
|
|
|
@@ -27187,7 +27883,7 @@ define("tinymce/Editor", [
|
|
|
27187
27883
|
scope = scope.scope;
|
|
27188
27884
|
}
|
|
27189
27885
|
|
|
27190
|
-
if (typeof
|
|
27886
|
+
if (typeof callback === 'string') {
|
|
27191
27887
|
scope = callback.replace(/\.\w+$/, '');
|
|
27192
27888
|
scope = scope ? resolve(scope) : 0;
|
|
27193
27889
|
callback = resolve(callback);
|
|
@@ -27253,7 +27949,7 @@ define("tinymce/Editor", [
|
|
|
27253
27949
|
if (type === 'hash') {
|
|
27254
27950
|
output = {};
|
|
27255
27951
|
|
|
27256
|
-
if (typeof
|
|
27952
|
+
if (typeof value === 'string') {
|
|
27257
27953
|
each(value.indexOf('=') > 0 ? value.split(/[;,](?![^=;,]*(?:[;,]|$))/) : value.split(','), function(value) {
|
|
27258
27954
|
value = value.split('=');
|
|
27259
27955
|
|
|
@@ -27394,7 +28090,7 @@ define("tinymce/Editor", [
|
|
|
27394
28090
|
* @param {Object} value Optional value for command.
|
|
27395
28091
|
* @return {Boolean} True/false state if the command was handled or not.
|
|
27396
28092
|
*/
|
|
27397
|
-
this.
|
|
28093
|
+
this.editorCommands.addCommand(name, callback, scope);
|
|
27398
28094
|
},
|
|
27399
28095
|
|
|
27400
28096
|
/**
|
|
@@ -27413,7 +28109,7 @@ define("tinymce/Editor", [
|
|
|
27413
28109
|
* @callback addQueryStateHandlerCallback
|
|
27414
28110
|
* @return {Boolean} True/false state if the command is enabled or not like is it bold.
|
|
27415
28111
|
*/
|
|
27416
|
-
this.
|
|
28112
|
+
this.editorCommands.addQueryStateHandler(name, callback, scope);
|
|
27417
28113
|
},
|
|
27418
28114
|
|
|
27419
28115
|
/**
|
|
@@ -27432,7 +28128,7 @@ define("tinymce/Editor", [
|
|
|
27432
28128
|
* @callback addQueryValueHandlerCallback
|
|
27433
28129
|
* @return {Object} Value of the command or undefined.
|
|
27434
28130
|
*/
|
|
27435
|
-
this.
|
|
28131
|
+
this.editorCommands.addQueryValueHandler(name, callback, scope);
|
|
27436
28132
|
},
|
|
27437
28133
|
|
|
27438
28134
|
/**
|
|
@@ -27459,68 +28155,10 @@ define("tinymce/Editor", [
|
|
|
27459
28155
|
* @param {String} cmd Command name to execute, for example mceLink or Bold.
|
|
27460
28156
|
* @param {Boolean} ui True/false state if a UI (dialog) should be presented or not.
|
|
27461
28157
|
* @param {mixed} value Optional command value, this can be anything.
|
|
27462
|
-
* @param {Object}
|
|
28158
|
+
* @param {Object} args Optional arguments object.
|
|
27463
28159
|
*/
|
|
27464
28160
|
execCommand: function(cmd, ui, value, args) {
|
|
27465
|
-
|
|
27466
|
-
|
|
27467
|
-
if (!/^(mceAddUndoLevel|mceEndUndoLevel|mceBeginUndoLevel|mceRepaint)$/.test(cmd) && (!args || !args.skip_focus)) {
|
|
27468
|
-
self.focus();
|
|
27469
|
-
}
|
|
27470
|
-
|
|
27471
|
-
args = extend({}, args);
|
|
27472
|
-
args = self.fire('BeforeExecCommand', {command: cmd, ui: ui, value: value});
|
|
27473
|
-
if (args.isDefaultPrevented()) {
|
|
27474
|
-
return false;
|
|
27475
|
-
}
|
|
27476
|
-
|
|
27477
|
-
// Registred commands
|
|
27478
|
-
if ((cmdItem = self.execCommands[cmd])) {
|
|
27479
|
-
// Fall through on true
|
|
27480
|
-
if (cmdItem.func.call(cmdItem.scope, ui, value) !== true) {
|
|
27481
|
-
self.fire('ExecCommand', {command: cmd, ui: ui, value: value});
|
|
27482
|
-
return true;
|
|
27483
|
-
}
|
|
27484
|
-
}
|
|
27485
|
-
|
|
27486
|
-
// Plugin commands
|
|
27487
|
-
each(self.plugins, function(p) {
|
|
27488
|
-
if (p.execCommand && p.execCommand(cmd, ui, value)) {
|
|
27489
|
-
self.fire('ExecCommand', {command: cmd, ui: ui, value: value});
|
|
27490
|
-
state = true;
|
|
27491
|
-
return false;
|
|
27492
|
-
}
|
|
27493
|
-
});
|
|
27494
|
-
|
|
27495
|
-
if (state) {
|
|
27496
|
-
return state;
|
|
27497
|
-
}
|
|
27498
|
-
|
|
27499
|
-
// Theme commands
|
|
27500
|
-
if (self.theme && self.theme.execCommand && self.theme.execCommand(cmd, ui, value)) {
|
|
27501
|
-
self.fire('ExecCommand', {command: cmd, ui: ui, value: value});
|
|
27502
|
-
return true;
|
|
27503
|
-
}
|
|
27504
|
-
|
|
27505
|
-
// Editor commands
|
|
27506
|
-
if (self.editorCommands.execCommand(cmd, ui, value)) {
|
|
27507
|
-
self.fire('ExecCommand', {command: cmd, ui: ui, value: value});
|
|
27508
|
-
return true;
|
|
27509
|
-
}
|
|
27510
|
-
|
|
27511
|
-
// Browser commands
|
|
27512
|
-
try {
|
|
27513
|
-
state = self.getDoc().execCommand(cmd, ui, value);
|
|
27514
|
-
} catch (ex) {
|
|
27515
|
-
// Ignore old IE errors
|
|
27516
|
-
}
|
|
27517
|
-
|
|
27518
|
-
if (state) {
|
|
27519
|
-
self.fire('ExecCommand', {command: cmd, ui: ui, value: value});
|
|
27520
|
-
return true;
|
|
27521
|
-
}
|
|
27522
|
-
|
|
27523
|
-
return false;
|
|
28161
|
+
return this.editorCommands.execCommand(cmd, ui, value, args);
|
|
27524
28162
|
},
|
|
27525
28163
|
|
|
27526
28164
|
/**
|
|
@@ -27531,35 +28169,7 @@ define("tinymce/Editor", [
|
|
|
27531
28169
|
* @return {Boolean} Command specific state, for example if bold is enabled or not.
|
|
27532
28170
|
*/
|
|
27533
28171
|
queryCommandState: function(cmd) {
|
|
27534
|
-
|
|
27535
|
-
|
|
27536
|
-
// Is hidden then return undefined
|
|
27537
|
-
if (self._isHidden()) {
|
|
27538
|
-
return;
|
|
27539
|
-
}
|
|
27540
|
-
|
|
27541
|
-
// Registred commands
|
|
27542
|
-
if ((queryItem = self.queryStateCommands[cmd])) {
|
|
27543
|
-
returnVal = queryItem.func.call(queryItem.scope);
|
|
27544
|
-
|
|
27545
|
-
// Fall though on non boolean returns
|
|
27546
|
-
if (returnVal === true || returnVal === false) {
|
|
27547
|
-
return returnVal;
|
|
27548
|
-
}
|
|
27549
|
-
}
|
|
27550
|
-
|
|
27551
|
-
// Editor commands
|
|
27552
|
-
returnVal = self.editorCommands.queryCommandState(cmd);
|
|
27553
|
-
if (returnVal !== -1) {
|
|
27554
|
-
return returnVal;
|
|
27555
|
-
}
|
|
27556
|
-
|
|
27557
|
-
// Browser commands
|
|
27558
|
-
try {
|
|
27559
|
-
return self.getDoc().queryCommandState(cmd);
|
|
27560
|
-
} catch (ex) {
|
|
27561
|
-
// Fails sometimes see bug: 1896577
|
|
27562
|
-
}
|
|
28172
|
+
return this.editorCommands.queryCommandState(cmd);
|
|
27563
28173
|
},
|
|
27564
28174
|
|
|
27565
28175
|
/**
|
|
@@ -27570,35 +28180,18 @@ define("tinymce/Editor", [
|
|
|
27570
28180
|
* @return {Object} Command specific value, for example the current font size.
|
|
27571
28181
|
*/
|
|
27572
28182
|
queryCommandValue: function(cmd) {
|
|
27573
|
-
|
|
27574
|
-
|
|
27575
|
-
// Is hidden then return undefined
|
|
27576
|
-
if (self._isHidden()) {
|
|
27577
|
-
return;
|
|
27578
|
-
}
|
|
27579
|
-
|
|
27580
|
-
// Registred commands
|
|
27581
|
-
if ((queryItem = self.queryValueCommands[cmd])) {
|
|
27582
|
-
returnVal = queryItem.func.call(queryItem.scope);
|
|
27583
|
-
|
|
27584
|
-
// Fall though on true
|
|
27585
|
-
if (returnVal !== true) {
|
|
27586
|
-
return returnVal;
|
|
27587
|
-
}
|
|
27588
|
-
}
|
|
27589
|
-
|
|
27590
|
-
// Editor commands
|
|
27591
|
-
returnVal = self.editorCommands.queryCommandValue(cmd);
|
|
27592
|
-
if (returnVal !== undefined) {
|
|
27593
|
-
return returnVal;
|
|
27594
|
-
}
|
|
28183
|
+
return this.editorCommands.queryCommandValue(cmd);
|
|
28184
|
+
},
|
|
27595
28185
|
|
|
27596
|
-
|
|
27597
|
-
|
|
27598
|
-
|
|
27599
|
-
|
|
27600
|
-
|
|
27601
|
-
|
|
28186
|
+
/**
|
|
28187
|
+
* Returns true/false if the command is supported or not.
|
|
28188
|
+
*
|
|
28189
|
+
* @method queryCommandSupported
|
|
28190
|
+
* @param {String} cmd Command that we check support for.
|
|
28191
|
+
* @return {Boolean} true/false if the command is supported or not.
|
|
28192
|
+
*/
|
|
28193
|
+
queryCommandSupported: function(cmd) {
|
|
28194
|
+
return this.editorCommands.queryCommandSupported(cmd);
|
|
27602
28195
|
},
|
|
27603
28196
|
|
|
27604
28197
|
/**
|
|
@@ -28023,10 +28616,11 @@ define("tinymce/Editor", [
|
|
|
28023
28616
|
},
|
|
28024
28617
|
|
|
28025
28618
|
/**
|
|
28026
|
-
* Returns the
|
|
28619
|
+
* Returns the root element of the editable area.
|
|
28620
|
+
* For a non-inline iframe-based editor, returns the iframe's body element.
|
|
28027
28621
|
*
|
|
28028
28622
|
* @method getBody
|
|
28029
|
-
* @return {Element}
|
|
28623
|
+
* @return {Element} The root element of the editable area.
|
|
28030
28624
|
*/
|
|
28031
28625
|
getBody: function() {
|
|
28032
28626
|
return this.bodyElement || this.getDoc().body;
|
|
@@ -28267,9 +28861,31 @@ define("tinymce/Editor", [
|
|
|
28267
28861
|
define("tinymce/util/I18n", [], function() {
|
|
28268
28862
|
"use strict";
|
|
28269
28863
|
|
|
28270
|
-
var data = {};
|
|
28864
|
+
var data = {}, code = "en";
|
|
28271
28865
|
|
|
28272
28866
|
return {
|
|
28867
|
+
/**
|
|
28868
|
+
* Sets the current language code.
|
|
28869
|
+
*
|
|
28870
|
+
* @method setCode
|
|
28871
|
+
* @param {String} newCode Current language code.
|
|
28872
|
+
*/
|
|
28873
|
+
setCode: function(newCode) {
|
|
28874
|
+
if (newCode) {
|
|
28875
|
+
code = newCode;
|
|
28876
|
+
this.rtl = this.data[newCode] ? this.data[newCode]._dir === 'rtl' : false;
|
|
28877
|
+
}
|
|
28878
|
+
},
|
|
28879
|
+
|
|
28880
|
+
/**
|
|
28881
|
+
* Returns the current language code.
|
|
28882
|
+
*
|
|
28883
|
+
* @return {String} Current language code.
|
|
28884
|
+
*/
|
|
28885
|
+
getCode: function() {
|
|
28886
|
+
return code;
|
|
28887
|
+
},
|
|
28888
|
+
|
|
28273
28889
|
/**
|
|
28274
28890
|
* Property gets set to true if a RTL language pack was loaded.
|
|
28275
28891
|
*
|
|
@@ -28286,11 +28902,17 @@ define("tinymce/util/I18n", [], function() {
|
|
|
28286
28902
|
* @param {Array} items Name/value array with English en_US to sv_SE.
|
|
28287
28903
|
*/
|
|
28288
28904
|
add: function(code, items) {
|
|
28905
|
+
var langData = data[code];
|
|
28906
|
+
|
|
28907
|
+
if (!langData) {
|
|
28908
|
+
data[code] = langData = {};
|
|
28909
|
+
}
|
|
28910
|
+
|
|
28289
28911
|
for (var name in items) {
|
|
28290
|
-
|
|
28912
|
+
langData[name] = items[name];
|
|
28291
28913
|
}
|
|
28292
28914
|
|
|
28293
|
-
this.
|
|
28915
|
+
this.setCode(code);
|
|
28294
28916
|
},
|
|
28295
28917
|
|
|
28296
28918
|
/**
|
|
@@ -28306,23 +28928,30 @@ define("tinymce/util/I18n", [], function() {
|
|
|
28306
28928
|
* @return {String} String that got translated.
|
|
28307
28929
|
*/
|
|
28308
28930
|
translate: function(text) {
|
|
28309
|
-
|
|
28931
|
+
var langData;
|
|
28932
|
+
|
|
28933
|
+
langData = data[code];
|
|
28934
|
+
if (!langData) {
|
|
28935
|
+
langData = {};
|
|
28936
|
+
}
|
|
28937
|
+
|
|
28938
|
+
if (typeof text == "undefined") {
|
|
28310
28939
|
return text;
|
|
28311
28940
|
}
|
|
28312
28941
|
|
|
28313
|
-
if (typeof
|
|
28942
|
+
if (typeof text != "string" && text.raw) {
|
|
28314
28943
|
return text.raw;
|
|
28315
28944
|
}
|
|
28316
28945
|
|
|
28317
28946
|
if (text.push) {
|
|
28318
28947
|
var values = text.slice(1);
|
|
28319
28948
|
|
|
28320
|
-
text = (
|
|
28949
|
+
text = (langData[text[0]] || text[0]).replace(/\{([0-9]+)\}/g, function(match1, match2) {
|
|
28321
28950
|
return values[match2];
|
|
28322
28951
|
});
|
|
28323
28952
|
}
|
|
28324
28953
|
|
|
28325
|
-
return
|
|
28954
|
+
return (langData[text] || text).replace(/{context:\w+}$/, '');
|
|
28326
28955
|
},
|
|
28327
28956
|
|
|
28328
28957
|
data: data
|
|
@@ -28694,7 +29323,7 @@ define("tinymce/EditorManager", [
|
|
|
28694
29323
|
* @property minorVersion
|
|
28695
29324
|
* @type String
|
|
28696
29325
|
*/
|
|
28697
|
-
minorVersion: '1.
|
|
29326
|
+
minorVersion: '1.10',
|
|
28698
29327
|
|
|
28699
29328
|
/**
|
|
28700
29329
|
* Release date of TinyMCE build.
|
|
@@ -28702,7 +29331,7 @@ define("tinymce/EditorManager", [
|
|
|
28702
29331
|
* @property releaseDate
|
|
28703
29332
|
* @type String
|
|
28704
29333
|
*/
|
|
28705
|
-
releaseDate: '
|
|
29334
|
+
releaseDate: '2015-05-05',
|
|
28706
29335
|
|
|
28707
29336
|
/**
|
|
28708
29337
|
* Collection of editor instances.
|
|
@@ -29094,7 +29723,7 @@ define("tinymce/EditorManager", [
|
|
|
29094
29723
|
}
|
|
29095
29724
|
|
|
29096
29725
|
// Remove editors by selector
|
|
29097
|
-
if (typeof
|
|
29726
|
+
if (typeof selector == "string") {
|
|
29098
29727
|
selector = selector.selector || selector;
|
|
29099
29728
|
|
|
29100
29729
|
each(DOM.select(selector), function(elm) {
|
|
@@ -29311,9 +29940,12 @@ define("tinymce/LegacyInput", [
|
|
|
29311
29940
|
},
|
|
29312
29941
|
|
|
29313
29942
|
u: function(dom, node) {
|
|
29314
|
-
|
|
29315
|
-
|
|
29316
|
-
|
|
29943
|
+
// HTML5 allows U element
|
|
29944
|
+
if (editor.settings.schema === "html4") {
|
|
29945
|
+
replaceWithSpan(node, {
|
|
29946
|
+
textDecoration: 'underline'
|
|
29947
|
+
});
|
|
29948
|
+
}
|
|
29317
29949
|
},
|
|
29318
29950
|
|
|
29319
29951
|
strike: function(dom, node) {
|
|
@@ -29624,9 +30256,9 @@ define("tinymce/util/JSONRequest", [
|
|
|
29624
30256
|
args.success = function(c, x) {
|
|
29625
30257
|
c = JSON.parse(c);
|
|
29626
30258
|
|
|
29627
|
-
if (typeof
|
|
30259
|
+
if (typeof c == 'undefined') {
|
|
29628
30260
|
c = {
|
|
29629
|
-
error
|
|
30261
|
+
error: 'JSON Parse error.'
|
|
29630
30262
|
};
|
|
29631
30263
|
}
|
|
29632
30264
|
|
|
@@ -30227,7 +30859,7 @@ define("tinymce/ui/Tooltip", [
|
|
|
30227
30859
|
text: function(value) {
|
|
30228
30860
|
var self = this;
|
|
30229
30861
|
|
|
30230
|
-
if (typeof
|
|
30862
|
+
if (typeof value != "undefined") {
|
|
30231
30863
|
self._value = value;
|
|
30232
30864
|
|
|
30233
30865
|
if (self._rendered) {
|
|
@@ -30510,7 +31142,7 @@ define("tinymce/ui/Button", [
|
|
|
30510
31142
|
icon: function(icon) {
|
|
30511
31143
|
var self = this, prefix = self.classPrefix;
|
|
30512
31144
|
|
|
30513
|
-
if (typeof
|
|
31145
|
+
if (typeof icon == 'undefined') {
|
|
30514
31146
|
return self.settings.icon;
|
|
30515
31147
|
}
|
|
30516
31148
|
|
|
@@ -30966,7 +31598,7 @@ define("tinymce/ui/ComboBox", [
|
|
|
30966
31598
|
value: function(value) {
|
|
30967
31599
|
var self = this;
|
|
30968
31600
|
|
|
30969
|
-
if (typeof
|
|
31601
|
+
if (typeof value != "undefined") {
|
|
30970
31602
|
self._value = value;
|
|
30971
31603
|
self.removeClass('placeholder');
|
|
30972
31604
|
|
|
@@ -31000,7 +31632,7 @@ define("tinymce/ui/ComboBox", [
|
|
|
31000
31632
|
disabled: function(state) {
|
|
31001
31633
|
var self = this;
|
|
31002
31634
|
|
|
31003
|
-
if (self._rendered && typeof
|
|
31635
|
+
if (self._rendered && typeof state != 'undefined') {
|
|
31004
31636
|
self.getEl('inp').disabled = state;
|
|
31005
31637
|
}
|
|
31006
31638
|
|
|
@@ -31380,6 +32012,18 @@ define("tinymce/ui/ColorButton", [
|
|
|
31380
32012
|
return this._color;
|
|
31381
32013
|
},
|
|
31382
32014
|
|
|
32015
|
+
/**
|
|
32016
|
+
* Resets the current color.
|
|
32017
|
+
*
|
|
32018
|
+
* @method resetColor
|
|
32019
|
+
* @return {tinymce.ui.ColorButton} Current instance.
|
|
32020
|
+
*/
|
|
32021
|
+
resetColor: function() {
|
|
32022
|
+
this._color = null;
|
|
32023
|
+
this.getEl('preview').style.backgroundColor = null;
|
|
32024
|
+
return this;
|
|
32025
|
+
},
|
|
32026
|
+
|
|
31383
32027
|
/**
|
|
31384
32028
|
* Renders the control as a HTML string.
|
|
31385
32029
|
*
|
|
@@ -31953,7 +32597,7 @@ define("tinymce/ui/Path", [
|
|
|
31953
32597
|
data: function(data) {
|
|
31954
32598
|
var self = this;
|
|
31955
32599
|
|
|
31956
|
-
if (typeof
|
|
32600
|
+
if (typeof data !== "undefined") {
|
|
31957
32601
|
self._data = data;
|
|
31958
32602
|
self.update();
|
|
31959
32603
|
|
|
@@ -32067,34 +32711,36 @@ define("tinymce/ui/ElementPath", [
|
|
|
32067
32711
|
return false;
|
|
32068
32712
|
}
|
|
32069
32713
|
|
|
32070
|
-
|
|
32071
|
-
|
|
32072
|
-
|
|
32073
|
-
|
|
32074
|
-
|
|
32714
|
+
if (editor.settings.elementpath !== false) {
|
|
32715
|
+
self.on('select', function(e) {
|
|
32716
|
+
editor.focus();
|
|
32717
|
+
editor.selection.select(this.data()[e.index].element);
|
|
32718
|
+
editor.nodeChanged();
|
|
32719
|
+
});
|
|
32075
32720
|
|
|
32076
|
-
|
|
32077
|
-
|
|
32721
|
+
editor.on('nodeChange', function(e) {
|
|
32722
|
+
var outParents = [], parents = e.parents, i = parents.length;
|
|
32078
32723
|
|
|
32079
|
-
|
|
32080
|
-
|
|
32081
|
-
|
|
32082
|
-
|
|
32083
|
-
|
|
32084
|
-
|
|
32724
|
+
while (i--) {
|
|
32725
|
+
if (parents[i].nodeType == 1 && !isHidden(parents[i])) {
|
|
32726
|
+
var args = editor.fire('ResolveName', {
|
|
32727
|
+
name: parents[i].nodeName.toLowerCase(),
|
|
32728
|
+
target: parents[i]
|
|
32729
|
+
});
|
|
32085
32730
|
|
|
32086
|
-
|
|
32087
|
-
|
|
32088
|
-
|
|
32731
|
+
if (!args.isDefaultPrevented()) {
|
|
32732
|
+
outParents.push({name: args.name, element: parents[i]});
|
|
32733
|
+
}
|
|
32089
32734
|
|
|
32090
|
-
|
|
32091
|
-
|
|
32735
|
+
if (args.isPropagationStopped()) {
|
|
32736
|
+
break;
|
|
32737
|
+
}
|
|
32092
32738
|
}
|
|
32093
32739
|
}
|
|
32094
|
-
}
|
|
32095
32740
|
|
|
32096
|
-
|
|
32097
|
-
|
|
32741
|
+
self.data(outParents);
|
|
32742
|
+
});
|
|
32743
|
+
}
|
|
32098
32744
|
|
|
32099
32745
|
return self._super();
|
|
32100
32746
|
}
|
|
@@ -32248,7 +32894,7 @@ define("tinymce/ui/Form", [
|
|
|
32248
32894
|
formItem.type = 'formitem';
|
|
32249
32895
|
ctrl.aria('labelledby', ctrl._id + '-l');
|
|
32250
32896
|
|
|
32251
|
-
if (typeof
|
|
32897
|
+
if (typeof ctrl.settings.flex == "undefined") {
|
|
32252
32898
|
ctrl.settings.flex = 1;
|
|
32253
32899
|
}
|
|
32254
32900
|
|
|
@@ -32760,7 +33406,7 @@ define("tinymce/ui/FlexLayout", [
|
|
|
32760
33406
|
);
|
|
32761
33407
|
rect[alignAxisName] = contPaddingBox[alignBeforeName];
|
|
32762
33408
|
} else if (align === "end") {
|
|
32763
|
-
rect[alignAxisName] = contLayoutRect[alignInnerSizeName]
|
|
33409
|
+
rect[alignAxisName] = contLayoutRect[alignInnerSizeName] - ctrlLayoutRect[alignSizeName] - contPaddingBox.top;
|
|
32764
33410
|
}
|
|
32765
33411
|
|
|
32766
33412
|
// Calculate new size based on flex
|
|
@@ -32810,7 +33456,7 @@ define("tinymce/ui/FlowLayout", [
|
|
|
32810
33456
|
Defaults: {
|
|
32811
33457
|
containerClass: 'flow-layout',
|
|
32812
33458
|
controlClass: 'flow-layout-item',
|
|
32813
|
-
endClass
|
|
33459
|
+
endClass: 'break'
|
|
32814
33460
|
},
|
|
32815
33461
|
|
|
32816
33462
|
/**
|
|
@@ -33189,7 +33835,6 @@ define("tinymce/ui/FormatControls", [
|
|
|
33189
33835
|
|
|
33190
33836
|
editor.addMenuItem('newdocument', {
|
|
33191
33837
|
text: 'New document',
|
|
33192
|
-
shortcut: 'Ctrl+N',
|
|
33193
33838
|
icon: 'newdocument',
|
|
33194
33839
|
cmd: 'mceNewDocument'
|
|
33195
33840
|
});
|
|
@@ -33197,7 +33842,7 @@ define("tinymce/ui/FormatControls", [
|
|
|
33197
33842
|
editor.addMenuItem('undo', {
|
|
33198
33843
|
text: 'Undo',
|
|
33199
33844
|
icon: 'undo',
|
|
33200
|
-
shortcut: '
|
|
33845
|
+
shortcut: 'Meta+Z',
|
|
33201
33846
|
onPostRender: toggleUndoRedoState('undo'),
|
|
33202
33847
|
cmd: 'undo'
|
|
33203
33848
|
});
|
|
@@ -33205,7 +33850,7 @@ define("tinymce/ui/FormatControls", [
|
|
|
33205
33850
|
editor.addMenuItem('redo', {
|
|
33206
33851
|
text: 'Redo',
|
|
33207
33852
|
icon: 'redo',
|
|
33208
|
-
shortcut: '
|
|
33853
|
+
shortcut: 'Meta+Y',
|
|
33209
33854
|
onPostRender: toggleUndoRedoState('redo'),
|
|
33210
33855
|
cmd: 'redo'
|
|
33211
33856
|
});
|
|
@@ -33218,12 +33863,12 @@ define("tinymce/ui/FormatControls", [
|
|
|
33218
33863
|
});
|
|
33219
33864
|
|
|
33220
33865
|
each({
|
|
33221
|
-
cut: ['Cut', 'Cut', '
|
|
33222
|
-
copy: ['Copy', 'Copy', '
|
|
33223
|
-
paste: ['Paste', 'Paste', '
|
|
33224
|
-
selectall: ['Select all', 'SelectAll', '
|
|
33225
|
-
bold: ['Bold', 'Bold', '
|
|
33226
|
-
italic: ['Italic', 'Italic', '
|
|
33866
|
+
cut: ['Cut', 'Cut', 'Meta+X'],
|
|
33867
|
+
copy: ['Copy', 'Copy', 'Meta+C'],
|
|
33868
|
+
paste: ['Paste', 'Paste', 'Meta+V'],
|
|
33869
|
+
selectall: ['Select all', 'SelectAll', 'Meta+A'],
|
|
33870
|
+
bold: ['Bold', 'Bold', 'Meta+B'],
|
|
33871
|
+
italic: ['Italic', 'Italic', 'Meta+I'],
|
|
33227
33872
|
underline: ['Underline', 'Underline'],
|
|
33228
33873
|
strikethrough: ['Strikethrough', 'Strikethrough'],
|
|
33229
33874
|
subscript: ['Subscript', 'Subscript'],
|
|
@@ -33261,14 +33906,13 @@ define("tinymce/ui/FormatControls", [
|
|
|
33261
33906
|
editor.addButton('formatselect', function() {
|
|
33262
33907
|
var items = [], blocks = createFormats(editor.settings.block_formats ||
|
|
33263
33908
|
'Paragraph=p;' +
|
|
33264
|
-
'Address=address;' +
|
|
33265
|
-
'Pre=pre;' +
|
|
33266
33909
|
'Heading 1=h1;' +
|
|
33267
33910
|
'Heading 2=h2;' +
|
|
33268
33911
|
'Heading 3=h3;' +
|
|
33269
33912
|
'Heading 4=h4;' +
|
|
33270
33913
|
'Heading 5=h5;' +
|
|
33271
|
-
'Heading 6=h6'
|
|
33914
|
+
'Heading 6=h6;' +
|
|
33915
|
+
'Preformatted=pre'
|
|
33272
33916
|
);
|
|
33273
33917
|
|
|
33274
33918
|
each(blocks, function(block) {
|
|
@@ -33293,21 +33937,21 @@ define("tinymce/ui/FormatControls", [
|
|
|
33293
33937
|
|
|
33294
33938
|
editor.addButton('fontselect', function() {
|
|
33295
33939
|
var defaultFontsFormats =
|
|
33296
|
-
'Andale Mono=andale mono,
|
|
33940
|
+
'Andale Mono=andale mono,monospace;' +
|
|
33297
33941
|
'Arial=arial,helvetica,sans-serif;' +
|
|
33298
|
-
'Arial Black=arial black,
|
|
33299
|
-
'Book Antiqua=book antiqua,palatino;' +
|
|
33942
|
+
'Arial Black=arial black,sans-serif;' +
|
|
33943
|
+
'Book Antiqua=book antiqua,palatino,serif;' +
|
|
33300
33944
|
'Comic Sans MS=comic sans ms,sans-serif;' +
|
|
33301
|
-
'Courier New=courier new,courier;' +
|
|
33302
|
-
'Georgia=georgia,palatino;' +
|
|
33303
|
-
'Helvetica=helvetica;' +
|
|
33304
|
-
'Impact=impact,
|
|
33945
|
+
'Courier New=courier new,courier,monospace;' +
|
|
33946
|
+
'Georgia=georgia,palatino,serif;' +
|
|
33947
|
+
'Helvetica=helvetica,arial,sans-serif;' +
|
|
33948
|
+
'Impact=impact,sans-serif;' +
|
|
33305
33949
|
'Symbol=symbol;' +
|
|
33306
33950
|
'Tahoma=tahoma,arial,helvetica,sans-serif;' +
|
|
33307
|
-
'Terminal=terminal,monaco;' +
|
|
33308
|
-
'Times New Roman=times new roman,times;' +
|
|
33309
|
-
'Trebuchet MS=trebuchet ms,geneva;' +
|
|
33310
|
-
'Verdana=verdana,geneva;' +
|
|
33951
|
+
'Terminal=terminal,monaco,monospace;' +
|
|
33952
|
+
'Times New Roman=times new roman,times,serif;' +
|
|
33953
|
+
'Trebuchet MS=trebuchet ms,geneva,sans-serif;' +
|
|
33954
|
+
'Verdana=verdana,geneva,sans-serif;' +
|
|
33311
33955
|
'Webdings=webdings;' +
|
|
33312
33956
|
'Wingdings=wingdings,zapf dingbats';
|
|
33313
33957
|
|
|
@@ -33429,11 +34073,11 @@ define("tinymce/ui/GridLayout", [
|
|
|
33429
34073
|
contPaddingBox = container._paddingBox;
|
|
33430
34074
|
reverseRows = 'reverseRows' in settings ? settings.reverseRows : container.isRtl();
|
|
33431
34075
|
|
|
33432
|
-
if (alignH && typeof
|
|
34076
|
+
if (alignH && typeof alignH == "string") {
|
|
33433
34077
|
alignH = [alignH];
|
|
33434
34078
|
}
|
|
33435
34079
|
|
|
33436
|
-
if (alignV && typeof
|
|
34080
|
+
if (alignV && typeof alignV == "string") {
|
|
33437
34081
|
alignV = [alignV];
|
|
33438
34082
|
}
|
|
33439
34083
|
|
|
@@ -34235,9 +34879,7 @@ define("tinymce/ui/ListBox", [
|
|
|
34235
34879
|
|
|
34236
34880
|
self._values = values = settings.values;
|
|
34237
34881
|
if (values) {
|
|
34238
|
-
|
|
34239
|
-
setSelected(values);
|
|
34240
|
-
}
|
|
34882
|
+
setSelected(values);
|
|
34241
34883
|
|
|
34242
34884
|
// Default with first item
|
|
34243
34885
|
if (!selected && values.length > 0) {
|
|
@@ -34312,7 +34954,7 @@ define("tinymce/ui/ListBox", [
|
|
|
34312
34954
|
}
|
|
34313
34955
|
}
|
|
34314
34956
|
|
|
34315
|
-
if (typeof
|
|
34957
|
+
if (typeof value != "undefined") {
|
|
34316
34958
|
if (self.menu) {
|
|
34317
34959
|
activateByValue(self.menu, value);
|
|
34318
34960
|
} else {
|
|
@@ -34535,6 +35177,36 @@ define("tinymce/ui/MenuItem", [
|
|
|
34535
35177
|
var self = this, id = self._id, settings = self.settings, prefix = self.classPrefix, text = self.encode(self._text);
|
|
34536
35178
|
var icon = self.settings.icon, image = '', shortcut = settings.shortcut;
|
|
34537
35179
|
|
|
35180
|
+
// Converts shortcut format to Mac/PC variants
|
|
35181
|
+
function convertShortcut(shortcut) {
|
|
35182
|
+
var i, value, replace = {};
|
|
35183
|
+
|
|
35184
|
+
if (Env.mac) {
|
|
35185
|
+
replace = {
|
|
35186
|
+
alt: '⌥',
|
|
35187
|
+
ctrl: '⌘',
|
|
35188
|
+
shift: '⇧',
|
|
35189
|
+
meta: '⌘'
|
|
35190
|
+
};
|
|
35191
|
+
} else {
|
|
35192
|
+
replace = {
|
|
35193
|
+
meta: 'Ctrl'
|
|
35194
|
+
};
|
|
35195
|
+
}
|
|
35196
|
+
|
|
35197
|
+
shortcut = shortcut.split('+');
|
|
35198
|
+
|
|
35199
|
+
for (i = 0; i < shortcut.length; i++) {
|
|
35200
|
+
value = replace[shortcut[i].toLowerCase()];
|
|
35201
|
+
|
|
35202
|
+
if (value) {
|
|
35203
|
+
shortcut[i] = value;
|
|
35204
|
+
}
|
|
35205
|
+
}
|
|
35206
|
+
|
|
35207
|
+
return shortcut.join('+');
|
|
35208
|
+
}
|
|
35209
|
+
|
|
34538
35210
|
if (icon) {
|
|
34539
35211
|
self.parent().addClass('menu-has-icons');
|
|
34540
35212
|
}
|
|
@@ -34544,12 +35216,8 @@ define("tinymce/ui/MenuItem", [
|
|
|
34544
35216
|
image = ' style="background-image: url(\'' + settings.image + '\')"';
|
|
34545
35217
|
}
|
|
34546
35218
|
|
|
34547
|
-
if (shortcut
|
|
34548
|
-
|
|
34549
|
-
shortcut = shortcut.replace(/ctrl\+alt\+/i, '⌥⌘'); // ctrl+cmd
|
|
34550
|
-
shortcut = shortcut.replace(/ctrl\+/i, '⌘'); // ctrl symbol
|
|
34551
|
-
shortcut = shortcut.replace(/alt\+/i, '⌥'); // cmd symbol
|
|
34552
|
-
shortcut = shortcut.replace(/shift\+/i, '⇧'); // shift symbol
|
|
35219
|
+
if (shortcut) {
|
|
35220
|
+
shortcut = convertShortcut(shortcut);
|
|
34553
35221
|
}
|
|
34554
35222
|
|
|
34555
35223
|
icon = prefix + 'ico ' + prefix + 'i-' + (self.settings.icon || 'none');
|
|
@@ -34573,7 +35241,7 @@ define("tinymce/ui/MenuItem", [
|
|
|
34573
35241
|
var self = this, settings = self.settings;
|
|
34574
35242
|
|
|
34575
35243
|
var textStyle = settings.textStyle;
|
|
34576
|
-
if (typeof
|
|
35244
|
+
if (typeof textStyle == "function") {
|
|
34577
35245
|
textStyle = textStyle.call(this);
|
|
34578
35246
|
}
|
|
34579
35247
|
|
|
@@ -34605,7 +35273,7 @@ define("tinymce/ui/MenuItem", [
|
|
|
34605
35273
|
},
|
|
34606
35274
|
|
|
34607
35275
|
active: function(state) {
|
|
34608
|
-
if (typeof
|
|
35276
|
+
if (typeof state != "undefined") {
|
|
34609
35277
|
this.aria('checked', state);
|
|
34610
35278
|
}
|
|
34611
35279
|
|
|
@@ -35099,7 +35767,7 @@ define("tinymce/ui/StackLayout", [
|
|
|
35099
35767
|
Defaults: {
|
|
35100
35768
|
containerClass: 'stack-layout',
|
|
35101
35769
|
controlClass: 'stack-layout-item',
|
|
35102
|
-
endClass
|
|
35770
|
+
endClass: 'break'
|
|
35103
35771
|
}
|
|
35104
35772
|
});
|
|
35105
35773
|
});
|
|
@@ -35356,7 +36024,7 @@ define("tinymce/ui/TextBox", [
|
|
|
35356
36024
|
disabled: function(state) {
|
|
35357
36025
|
var self = this;
|
|
35358
36026
|
|
|
35359
|
-
if (self._rendered && typeof
|
|
36027
|
+
if (self._rendered && typeof state != 'undefined') {
|
|
35360
36028
|
self.getEl().disabled = state;
|
|
35361
36029
|
}
|
|
35362
36030
|
|
|
@@ -35373,7 +36041,7 @@ define("tinymce/ui/TextBox", [
|
|
|
35373
36041
|
value: function(value) {
|
|
35374
36042
|
var self = this;
|
|
35375
36043
|
|
|
35376
|
-
if (typeof
|
|
36044
|
+
if (typeof value != "undefined") {
|
|
35377
36045
|
self._value = value;
|
|
35378
36046
|
|
|
35379
36047
|
if (self._rendered) {
|
|
@@ -35578,5 +36246,5 @@ define("tinymce/ui/Throbber", [
|
|
|
35578
36246
|
};
|
|
35579
36247
|
});
|
|
35580
36248
|
|
|
35581
|
-
expose(["tinymce/dom/EventUtils","tinymce/dom/Sizzle","tinymce/
|
|
36249
|
+
expose(["tinymce/dom/EventUtils","tinymce/dom/Sizzle","tinymce/Env","tinymce/util/Tools","tinymce/dom/DomQuery","tinymce/html/Styles","tinymce/dom/TreeWalker","tinymce/dom/Range","tinymce/html/Entities","tinymce/dom/DOMUtils","tinymce/dom/ScriptLoader","tinymce/AddOnManager","tinymce/dom/RangeUtils","tinymce/html/Node","tinymce/html/Schema","tinymce/html/SaxParser","tinymce/html/DomParser","tinymce/html/Writer","tinymce/html/Serializer","tinymce/dom/Serializer","tinymce/dom/TridentSelection","tinymce/util/VK","tinymce/dom/ControlSelection","tinymce/dom/BookmarkManager","tinymce/dom/Selection","tinymce/dom/ElementUtils","tinymce/Formatter","tinymce/UndoManager","tinymce/EnterKey","tinymce/ForceBlocks","tinymce/EditorCommands","tinymce/util/URI","tinymce/util/Class","tinymce/util/EventDispatcher","tinymce/ui/Selector","tinymce/ui/Collection","tinymce/ui/DomUtils","tinymce/ui/Control","tinymce/ui/Factory","tinymce/ui/KeyboardNavigation","tinymce/ui/Container","tinymce/ui/DragHelper","tinymce/ui/Scrollable","tinymce/ui/Panel","tinymce/ui/Movable","tinymce/ui/Resizable","tinymce/ui/FloatPanel","tinymce/ui/Window","tinymce/ui/MessageBox","tinymce/WindowManager","tinymce/util/Quirks","tinymce/util/Observable","tinymce/EditorObservable","tinymce/Shortcuts","tinymce/Editor","tinymce/util/I18n","tinymce/FocusManager","tinymce/EditorManager","tinymce/LegacyInput","tinymce/util/XHR","tinymce/util/JSON","tinymce/util/JSONRequest","tinymce/util/JSONP","tinymce/util/LocalStorage","tinymce/Compat","tinymce/ui/Layout","tinymce/ui/AbsoluteLayout","tinymce/ui/Tooltip","tinymce/ui/Widget","tinymce/ui/Button","tinymce/ui/ButtonGroup","tinymce/ui/Checkbox","tinymce/ui/ComboBox","tinymce/ui/ColorBox","tinymce/ui/PanelButton","tinymce/ui/ColorButton","tinymce/util/Color","tinymce/ui/ColorPicker","tinymce/ui/Path","tinymce/ui/ElementPath","tinymce/ui/FormItem","tinymce/ui/Form","tinymce/ui/FieldSet","tinymce/ui/FilePicker","tinymce/ui/FitLayout","tinymce/ui/FlexLayout","tinymce/ui/FlowLayout","tinymce/ui/FormatControls","tinymce/ui/GridLayout","tinymce/ui/Iframe","tinymce/ui/Label","tinymce/ui/Toolbar","tinymce/ui/MenuBar","tinymce/ui/MenuButton","tinymce/ui/ListBox","tinymce/ui/MenuItem","tinymce/ui/Menu","tinymce/ui/Radio","tinymce/ui/ResizeHandle","tinymce/ui/Spacer","tinymce/ui/SplitButton","tinymce/ui/StackLayout","tinymce/ui/TabPanel","tinymce/ui/TextBox","tinymce/ui/Throbber"]);
|
|
35582
36250
|
})(this);
|