tinymce-rails 4.0.19 → 4.0.26
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +62 -36
- data/app/assets/source/tinymce/tinymce.jquery.js +1344 -760
- data/app/assets/source/tinymce/tinymce.js +1284 -700
- data/lib/tinymce/rails/engine.rb +4 -1
- data/lib/tinymce/rails/version.rb +2 -2
- data/vendor/assets/javascripts/tinymce/jquery.tinymce.js +1 -1
- data/vendor/assets/javascripts/tinymce/plugins/advlist/plugin.js +1 -1
- data/vendor/assets/javascripts/tinymce/plugins/anchor/plugin.js +1 -1
- data/vendor/assets/javascripts/tinymce/plugins/autolink/plugin.js +1 -1
- data/vendor/assets/javascripts/tinymce/plugins/autoresize/plugin.js +1 -1
- data/vendor/assets/javascripts/tinymce/plugins/charmap/plugin.js +1 -1
- data/vendor/assets/javascripts/tinymce/plugins/directionality/plugin.js +1 -1
- data/vendor/assets/javascripts/tinymce/plugins/emoticons/plugin.js +1 -1
- data/vendor/assets/javascripts/tinymce/plugins/example/dialog.html +8 -0
- data/vendor/assets/javascripts/tinymce/plugins/example/plugin.js +1 -1
- data/vendor/assets/javascripts/tinymce/plugins/fullpage/plugin.js +1 -1
- data/vendor/assets/javascripts/tinymce/plugins/image/plugin.js +1 -1
- data/vendor/assets/javascripts/tinymce/plugins/importcss/plugin.js +1 -1
- data/vendor/assets/javascripts/tinymce/plugins/insertdatetime/plugin.js +1 -1
- data/vendor/assets/javascripts/tinymce/plugins/layer/plugin.js +1 -1
- data/vendor/assets/javascripts/tinymce/plugins/legacyoutput/plugin.js +1 -1
- data/vendor/assets/javascripts/tinymce/plugins/link/plugin.js +1 -1
- data/vendor/assets/javascripts/tinymce/plugins/lists/plugin.js +1 -1
- data/vendor/assets/javascripts/tinymce/plugins/media/plugin.js +1 -1
- data/vendor/assets/javascripts/tinymce/plugins/noneditable/plugin.js +1 -1
- data/vendor/assets/javascripts/tinymce/plugins/pagebreak/plugin.js +1 -1
- data/vendor/assets/javascripts/tinymce/plugins/paste/plugin.js +1 -1
- data/vendor/assets/javascripts/tinymce/plugins/preview/plugin.js +1 -1
- data/vendor/assets/javascripts/tinymce/plugins/print/plugin.js +1 -1
- data/vendor/assets/javascripts/tinymce/plugins/save/plugin.js +1 -1
- data/vendor/assets/javascripts/tinymce/plugins/searchreplace/plugin.js +1 -1
- data/vendor/assets/javascripts/tinymce/plugins/spellchecker/plugin.js +1 -1
- data/vendor/assets/javascripts/tinymce/plugins/table/plugin.js +1 -1
- data/vendor/assets/javascripts/tinymce/plugins/template/plugin.js +1 -1
- data/vendor/assets/javascripts/tinymce/plugins/textcolor/plugin.js +1 -1
- data/vendor/assets/javascripts/tinymce/skins/lightgray/fonts/tinymce-small.dev.svg +175 -0
- data/vendor/assets/javascripts/tinymce/skins/lightgray/fonts/tinymce-small.eot +0 -0
- data/vendor/assets/javascripts/tinymce/skins/lightgray/fonts/tinymce-small.svg +55 -168
- data/vendor/assets/javascripts/tinymce/skins/lightgray/fonts/tinymce-small.ttf +0 -0
- data/vendor/assets/javascripts/tinymce/skins/lightgray/fonts/tinymce-small.woff +0 -0
- data/vendor/assets/javascripts/tinymce/skins/lightgray/fonts/tinymce.dev.svg +153 -0
- data/vendor/assets/javascripts/tinymce/skins/lightgray/fonts/tinymce.eot +0 -0
- data/vendor/assets/javascripts/tinymce/skins/lightgray/fonts/tinymce.svg +56 -146
- data/vendor/assets/javascripts/tinymce/skins/lightgray/fonts/tinymce.ttf +0 -0
- data/vendor/assets/javascripts/tinymce/skins/lightgray/fonts/tinymce.woff +0 -0
- data/vendor/assets/javascripts/tinymce/skins/lightgray/skin.ie7.min.css +1 -1
- data/vendor/assets/javascripts/tinymce/skins/lightgray/skin.min.css +1 -1
- data/vendor/assets/javascripts/tinymce/themes/modern/theme.js +1 -1
- data/vendor/assets/javascripts/tinymce/tinymce.jquery.js +10 -10
- data/vendor/assets/javascripts/tinymce/tinymce.js +10 -10
- metadata +5 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 98010f91779772edeb4ccd7b425414a2715f5d21
|
4
|
+
data.tar.gz: cf3ffd85b9a52c9ec7a6bae0cc07cafe5b9de8de
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 46b1d81eda6b817413d6620ec69693c45c080f44eeb8be4e629cfd7ef05fbd6810e19e343c5a778ed5b5189f4addf28246bc308d87c9d3cddd8ec5f001be5144
|
7
|
+
data.tar.gz: c4fce036672158aa0a41f7c664030e011e6a6bf7bf300141a1fdf7a0c0133c29c829b570eca9ea154b4d0efb7000244fa29eb4be48b552d246b85c2c8b86892d
|
data/README.md
CHANGED
@@ -5,9 +5,9 @@ The `tinymce-rails` gem integrates the [TinyMCE](http://www.tinymce.com/) editor
|
|
5
5
|
|
6
6
|
This gem is compatible with Rails 3.1.1 and higher (including Rails 4).
|
7
7
|
|
8
|
-
This is the branch for TinyMCE 4. TinyMCE 3.5.x
|
8
|
+
This is the branch for TinyMCE 4. For TinyMCE 3.5.x, please see the [tinymce-3 branch](https://github.com/spohlenz/tinymce-rails/tree/tinymce-3).
|
9
9
|
|
10
|
-
[![Build Status](https://travis-ci.org/spohlenz/tinymce-rails.png?branch=
|
10
|
+
[![Build Status](https://travis-ci.org/spohlenz/tinymce-rails.png?branch=master)](https://travis-ci.org/spohlenz/tinymce-rails)
|
11
11
|
|
12
12
|
|
13
13
|
Instructions
|
@@ -15,33 +15,39 @@ Instructions
|
|
15
15
|
|
16
16
|
**1. Add `tinymce-rails` to your Gemfile**
|
17
17
|
|
18
|
-
|
18
|
+
```ruby
|
19
|
+
gem 'tinymce-rails'
|
20
|
+
```
|
19
21
|
|
20
22
|
Be sure to add to the global group, not the `assets` group. Then run `bundle install`.
|
21
23
|
|
22
24
|
|
23
25
|
**2. Create a `config/tinymce.yml` file with your global configuration options:**
|
24
26
|
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
27
|
+
```yml
|
28
|
+
toolbar1: styleselect | bold italic | link image | undo redo
|
29
|
+
toolbar2: table | fullscreen
|
30
|
+
plugins:
|
31
|
+
- table
|
32
|
+
- fullscreen
|
33
|
+
```
|
34
|
+
|
31
35
|
The Rails server no longer needs to be restarted when this file is updated in development mode.
|
32
36
|
|
33
37
|
To define multiple configuration sets, follow this syntax (a default configuration must be specified):
|
34
38
|
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
39
|
+
```yml
|
40
|
+
default:
|
41
|
+
plugins:
|
42
|
+
- image
|
43
|
+
- link
|
44
|
+
|
45
|
+
alternate:
|
46
|
+
selector: textarea.table-editor
|
47
|
+
toolbar: styleselect | bold italic | link image | undo redo | table
|
48
|
+
plugins:
|
49
|
+
- table
|
50
|
+
```
|
45
51
|
|
46
52
|
See the [TinyMCE 4 Documentation](http://www.tinymce.com/wiki.php/Configuration) for a full list of configuration options.
|
47
53
|
|
@@ -52,39 +58,55 @@ Use *one* of the following options to include TinyMCE assets.
|
|
52
58
|
|
53
59
|
(1) Add to your application.js:
|
54
60
|
|
55
|
-
|
61
|
+
```js
|
62
|
+
//= require tinymce
|
63
|
+
```
|
56
64
|
|
57
65
|
or (2) with jQuery integration:
|
58
66
|
|
59
|
-
|
67
|
+
```js
|
68
|
+
//= require tinymce-jquery
|
69
|
+
```
|
60
70
|
|
61
71
|
(3) The TinyMCE assets can be included on a per-page basis using the `tinymce_assets` helper:
|
62
72
|
|
63
|
-
|
64
|
-
|
73
|
+
```erb
|
74
|
+
<%= tinymce_assets %>
|
75
|
+
#=> <script type="text/javascript" src="/assets/tinymce.js">
|
76
|
+
```
|
65
77
|
|
66
78
|
|
67
79
|
**4. Initialize TinyMCE**
|
68
80
|
|
69
81
|
For each textarea that you want to use with TinyMCE, add the "tinymce" class and ensure it has a unique ID:
|
70
82
|
|
71
|
-
|
72
|
-
|
83
|
+
```erb
|
84
|
+
<%= text_area_tag :content, "", :class => "tinymce", :rows => 40, :cols => 120 %>
|
85
|
+
```
|
86
|
+
|
73
87
|
or if you are using Rails' form builders:
|
74
88
|
|
75
|
-
|
89
|
+
```erb
|
90
|
+
<%= f.text_area :content, :class => "tinymce", :rows => 40, :cols => 120 %>
|
91
|
+
```
|
76
92
|
|
77
93
|
Then invoke the `tinymce` helper to initialize TinyMCE:
|
78
94
|
|
79
|
-
|
95
|
+
```erb
|
96
|
+
<%= tinymce %>
|
97
|
+
```
|
80
98
|
|
81
99
|
Custom options can be passed to `tinymce` to override the global options specified in `config/tinymce.yml`:
|
82
100
|
|
83
|
-
|
101
|
+
```erb
|
102
|
+
<%= tinymce :theme => "simple", :language => "de", :plugins => ["wordcount", "paste"] %>
|
103
|
+
```
|
84
104
|
|
85
105
|
Alternate configurations defined in 'config/tinymce.yml' can be used with:
|
86
106
|
|
87
|
-
|
107
|
+
```erb
|
108
|
+
<%= tinymce :alternate %>
|
109
|
+
```
|
88
110
|
|
89
111
|
|
90
112
|
Language Packs
|
@@ -98,13 +120,15 @@ Manual Initialization
|
|
98
120
|
|
99
121
|
Using the `tinymce` helper and global configuration file is entirely optional. The `tinyMCE.init` function can be invoked manually if desired.
|
100
122
|
|
101
|
-
|
123
|
+
```erb
|
124
|
+
<%= text_area_tag :editor, "", :rows => 40, :cols => 120 %>
|
102
125
|
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
126
|
+
<script type="text/javascript">
|
127
|
+
tinyMCE.init({
|
128
|
+
selector: 'textarea.editor'
|
129
|
+
});
|
130
|
+
</script>
|
131
|
+
```
|
108
132
|
|
109
133
|
|
110
134
|
Asset Compilation
|
@@ -114,7 +138,9 @@ If you are including TinyMCE via `application.js` or using the `tinymce_assets`
|
|
114
138
|
|
115
139
|
However if you wish to include `tinymce-jquery.js` independently, you will need to add it to the precompile list in `config/environments/production.rb`:
|
116
140
|
|
117
|
-
|
141
|
+
```ruby
|
142
|
+
config.assets.precompile << "tinymce-jquery.js"
|
143
|
+
```
|
118
144
|
|
119
145
|
|
120
146
|
Custom Plugins & Skins
|
@@ -1,4 +1,4 @@
|
|
1
|
-
// 4.0.
|
1
|
+
// 4.0.26 (2014-05-06)
|
2
2
|
|
3
3
|
/**
|
4
4
|
* Compiled inline version. (Library mode)
|
@@ -314,8 +314,16 @@ define("tinymce/html/Styles", [], function() {
|
|
314
314
|
|
315
315
|
url = decode(url || url2 || url3);
|
316
316
|
|
317
|
-
if (!settings.allow_script_urls
|
318
|
-
|
317
|
+
if (!settings.allow_script_urls) {
|
318
|
+
var scriptUrl = url.replace(/[\s\r\n]+/, '');
|
319
|
+
|
320
|
+
if (/(java|vb)script:/i.test(scriptUrl)) {
|
321
|
+
return "";
|
322
|
+
}
|
323
|
+
|
324
|
+
if (!settings.allow_svg_data_urls && /^data:image\/svg/i.test(scriptUrl)) {
|
325
|
+
return "";
|
326
|
+
}
|
319
327
|
}
|
320
328
|
|
321
329
|
// Convert the URL to relative/absolute depending on config
|
@@ -340,8 +348,16 @@ define("tinymce/html/Styles", [], function() {
|
|
340
348
|
name = matches[1].replace(trimRightRegExp, '').toLowerCase();
|
341
349
|
value = matches[2].replace(trimRightRegExp, '');
|
342
350
|
|
351
|
+
// Decode escaped sequences like \65 -> e
|
352
|
+
/*jshint loopfunc:true*/
|
353
|
+
/*eslint no-loop-func:0 */
|
354
|
+
value = value.replace(/\\[0-9a-f]+/g, function(e) {
|
355
|
+
return String.fromCharCode(parseInt(e.substr(1), 16));
|
356
|
+
});
|
357
|
+
|
343
358
|
if (name && value.length > 0) {
|
344
|
-
|
359
|
+
// Don't allow behavior name or expression/comments within the values
|
360
|
+
if (!settings.allow_script_urls && (name == "behavior" || /expression\s*\(|\/\*|\*\//.test(value))) {
|
345
361
|
continue;
|
346
362
|
}
|
347
363
|
|
@@ -840,10 +856,13 @@ define("tinymce/dom/EventUtils", [], function() {
|
|
840
856
|
while (ci--) {
|
841
857
|
if (callbackList[ci].func === callback) {
|
842
858
|
var nativeHandler = callbackList.nativeHandler;
|
859
|
+
var fakeName = callbackList.fakeName, capture = callbackList.capture;
|
843
860
|
|
844
861
|
// Clone callbackList since unbind inside a callback would otherwise break the handlers loop
|
845
862
|
callbackList = callbackList.slice(0, ci).concat(callbackList.slice(ci + 1));
|
846
863
|
callbackList.nativeHandler = nativeHandler;
|
864
|
+
callbackList.fakeName = fakeName;
|
865
|
+
callbackList.capture = capture;
|
847
866
|
|
848
867
|
eventMap[name] = callbackList;
|
849
868
|
}
|
@@ -2388,7 +2407,7 @@ define("tinymce/html/Entities", [
|
|
2388
2407
|
var makeMap = Tools.makeMap;
|
2389
2408
|
|
2390
2409
|
var namedEntities, baseEntities, reverseEntities,
|
2391
|
-
attrsCharsRegExp = /[&<>\"\u007E-\uD7FF\uE000-\uFFEF]|[\uD800-\uDBFF][\uDC00-\uDFFF]/g,
|
2410
|
+
attrsCharsRegExp = /[&<>\"\u0060\u007E-\uD7FF\uE000-\uFFEF]|[\uD800-\uDBFF][\uDC00-\uDFFF]/g,
|
2392
2411
|
textCharsRegExp = /[<>&\u007E-\uD7FF\uE000-\uFFEF]|[\uD800-\uDBFF][\uDC00-\uDFFF]/g,
|
2393
2412
|
rawCharsRegExp = /[<>&\"\']/g,
|
2394
2413
|
entityRegExp = /&(#x|#)?([\w]+);/g,
|
@@ -2406,7 +2425,8 @@ define("tinymce/html/Entities", [
|
|
2406
2425
|
"'": ''',
|
2407
2426
|
'<': '<',
|
2408
2427
|
'>': '>',
|
2409
|
-
'&': '&'
|
2428
|
+
'&': '&',
|
2429
|
+
'\u0060': '`'
|
2410
2430
|
};
|
2411
2431
|
|
2412
2432
|
// Reverse lookup table for raw entities
|
@@ -3390,7 +3410,8 @@ define("tinymce/dom/DOMUtils", [
|
|
3390
3410
|
return false;
|
3391
3411
|
}
|
3392
3412
|
|
3393
|
-
|
3413
|
+
var elms = elm.nodeType ? [elm] : elm;
|
3414
|
+
return Sizzle(selector, elms[0].ownerDocument || elms[0], null, elms).length > 0;
|
3394
3415
|
},
|
3395
3416
|
|
3396
3417
|
// #endif
|
@@ -4678,9 +4699,9 @@ define("tinymce/dom/DOMUtils", [
|
|
4678
4699
|
|
4679
4700
|
// Keep elements with data-bookmark attributes or name attribute like <a name="1"></a>
|
4680
4701
|
attributes = self.getAttribs(node);
|
4681
|
-
i =
|
4702
|
+
i = attributes.length;
|
4682
4703
|
while (i--) {
|
4683
|
-
name =
|
4704
|
+
name = attributes[i].nodeName;
|
4684
4705
|
if (name === "name" || name === 'data-mce-bookmark') {
|
4685
4706
|
return false;
|
4686
4707
|
}
|
@@ -4938,7 +4959,7 @@ define("tinymce/dom/DOMUtils", [
|
|
4938
4959
|
var contentEditable;
|
4939
4960
|
|
4940
4961
|
// Check type
|
4941
|
-
if (node.nodeType != 1) {
|
4962
|
+
if (!node || node.nodeType != 1) {
|
4942
4963
|
return null;
|
4943
4964
|
}
|
4944
4965
|
|
@@ -4952,6 +4973,20 @@ define("tinymce/dom/DOMUtils", [
|
|
4952
4973
|
return node.contentEditable !== "inherit" ? node.contentEditable : null;
|
4953
4974
|
},
|
4954
4975
|
|
4976
|
+
getContentEditableParent: function(node) {
|
4977
|
+
var root = this.getRoot(), state = null;
|
4978
|
+
|
4979
|
+
for (; node && node !== root; node = node.parentNode) {
|
4980
|
+
state = this.getContentEditable(node);
|
4981
|
+
|
4982
|
+
if (state !== null) {
|
4983
|
+
break;
|
4984
|
+
}
|
4985
|
+
}
|
4986
|
+
|
4987
|
+
return state;
|
4988
|
+
},
|
4989
|
+
|
4955
4990
|
/**
|
4956
4991
|
* Destroys all internal references to the DOM to solve IE leak issues.
|
4957
4992
|
*
|
@@ -4981,6 +5016,18 @@ define("tinymce/dom/DOMUtils", [
|
|
4981
5016
|
self.win = self.doc = self.root = self.events = self.frag = null;
|
4982
5017
|
},
|
4983
5018
|
|
5019
|
+
isChildOf: function(node, parent) {
|
5020
|
+
while (node) {
|
5021
|
+
if (parent === node) {
|
5022
|
+
return true;
|
5023
|
+
}
|
5024
|
+
|
5025
|
+
node = node.parentNode;
|
5026
|
+
}
|
5027
|
+
|
5028
|
+
return false;
|
5029
|
+
},
|
5030
|
+
|
4984
5031
|
// #ifdef debug
|
4985
5032
|
|
4986
5033
|
dumpRng: function(r) {
|
@@ -5355,12 +5402,21 @@ define("tinymce/AddOnManager", [
|
|
5355
5402
|
* @param {String} languages Optional comma or space separated list of languages to check if it matches the name.
|
5356
5403
|
*/
|
5357
5404
|
requireLangPack: function(name, languages) {
|
5358
|
-
|
5359
|
-
|
5360
|
-
|
5405
|
+
var language = AddOnManager.language;
|
5406
|
+
|
5407
|
+
if (language && AddOnManager.languageLoad !== false) {
|
5408
|
+
if (languages) {
|
5409
|
+
languages = ',' + languages + ',';
|
5410
|
+
|
5411
|
+
// Load short form sv.js or long form sv_SE.js
|
5412
|
+
if (languages.indexOf(',' + language.substr(0, 2) + ',') != -1) {
|
5413
|
+
language = language.substr(0, 2);
|
5414
|
+
} else if (languages.indexOf(',' + language + ',') == -1) {
|
5415
|
+
return;
|
5416
|
+
}
|
5361
5417
|
}
|
5362
5418
|
|
5363
|
-
ScriptLoader.ScriptLoader.add(this.urls[name] + '/langs/' +
|
5419
|
+
ScriptLoader.ScriptLoader.add(this.urls[name] + '/langs/' + language + '.js');
|
5364
5420
|
}
|
5365
5421
|
},
|
5366
5422
|
|
@@ -6274,8 +6330,8 @@ define("tinymce/html/Schema", [
|
|
6274
6330
|
add("mark rt rp summary bdi", "", phrasingContent);
|
6275
6331
|
add("canvas", "width height", flowContent);
|
6276
6332
|
add("video", "src crossorigin poster preload autoplay mediagroup loop " +
|
6277
|
-
"muted controls width height", flowContent, "track source");
|
6278
|
-
add("audio", "src crossorigin preload autoplay mediagroup loop muted controls", flowContent, "track source");
|
6333
|
+
"muted controls width height buffered", flowContent, "track source");
|
6334
|
+
add("audio", "src crossorigin preload autoplay mediagroup loop muted controls buffered volume", flowContent, "track source");
|
6279
6335
|
add("source", "src type media");
|
6280
6336
|
add("track", "kind src srclang label default");
|
6281
6337
|
add("datalist", "", phrasingContent, "option");
|
@@ -6334,7 +6390,7 @@ define("tinymce/html/Schema", [
|
|
6334
6390
|
addAttrs("input textarea", "placeholder");
|
6335
6391
|
addAttrs("a", "download");
|
6336
6392
|
addAttrs("link script img", "crossorigin");
|
6337
|
-
addAttrs("iframe", "
|
6393
|
+
addAttrs("iframe", "sandbox seamless allowfullscreen"); // Excluded: srcdoc
|
6338
6394
|
}
|
6339
6395
|
|
6340
6396
|
// Special: iframe, ruby, video, audio, label
|
@@ -6393,7 +6449,7 @@ define("tinymce/html/Schema", [
|
|
6393
6449
|
}
|
6394
6450
|
} else {
|
6395
6451
|
// Create custom map
|
6396
|
-
value = makeMap(value,
|
6452
|
+
value = makeMap(value, /[, ]/, makeMap(value.toUpperCase(), /[, ]/));
|
6397
6453
|
}
|
6398
6454
|
|
6399
6455
|
return value;
|
@@ -6607,6 +6663,9 @@ define("tinymce/html/Schema", [
|
|
6607
6663
|
var customElementRegExp = /^(~)?(.+)$/;
|
6608
6664
|
|
6609
6665
|
if (custom_elements) {
|
6666
|
+
// Flush cached items since we are altering the default maps
|
6667
|
+
mapCache.text_block_elements = mapCache.block_elements = null;
|
6668
|
+
|
6610
6669
|
each(split(custom_elements, ','), function(rule) {
|
6611
6670
|
var matches = customElementRegExp.exec(rule),
|
6612
6671
|
inline = matches[1] === '~',
|
@@ -6634,8 +6693,9 @@ define("tinymce/html/Schema", [
|
|
6634
6693
|
}
|
6635
6694
|
|
6636
6695
|
// Add custom elements at span/div positions
|
6637
|
-
each(children, function(element) {
|
6696
|
+
each(children, function(element, elmName) {
|
6638
6697
|
if (element[cloneName]) {
|
6698
|
+
children[elmName] = element = extend({}, children[elmName]);
|
6639
6699
|
element[name] = element[cloneName];
|
6640
6700
|
}
|
6641
6701
|
});
|
@@ -6665,6 +6725,10 @@ define("tinymce/html/Schema", [
|
|
6665
6725
|
|
6666
6726
|
each(split(matches[3], '|'), function(child) {
|
6667
6727
|
if (prefix === '-') {
|
6728
|
+
// Clone the element before we delete
|
6729
|
+
// things in it to not mess up default schemas
|
6730
|
+
children[matches[2]] = parent = extend({}, children[matches[2]]);
|
6731
|
+
|
6668
6732
|
delete parent[child];
|
6669
6733
|
} else {
|
6670
6734
|
parent[child] = {};
|
@@ -7083,8 +7147,8 @@ define("tinymce/html/SaxParser", [
|
|
7083
7147
|
var validate, elementRule, isValidElement, attr, attribsValue, validAttributesMap, validAttributePatterns;
|
7084
7148
|
var attributesRequired, attributesDefault, attributesForced;
|
7085
7149
|
var anyAttributesRequired, selfClosing, tokenRegExp, attrRegExp, specialElements, attrValue, idCount = 0;
|
7086
|
-
var decode = Entities.decode, fixSelfClosing, filteredUrlAttrs = Tools.makeMap('src,href');
|
7087
|
-
var scriptUriRegExp = /(java|vb)script:/i;
|
7150
|
+
var decode = Entities.decode, fixSelfClosing, filteredUrlAttrs = Tools.makeMap('src,href,data,background,formaction,poster');
|
7151
|
+
var scriptUriRegExp = /((java|vb)script|mhtml):/i, dataUriRegExp = /^data:/i;
|
7088
7152
|
|
7089
7153
|
function processEndTag(name) {
|
7090
7154
|
var pos, i;
|
@@ -7150,22 +7214,24 @@ define("tinymce/html/SaxParser", [
|
|
7150
7214
|
}
|
7151
7215
|
}
|
7152
7216
|
|
7153
|
-
// Block any javascript: urls
|
7217
|
+
// Block any javascript: urls or non image data uris
|
7154
7218
|
if (filteredUrlAttrs[name] && !settings.allow_script_urls) {
|
7155
7219
|
var uri = value.replace(trimRegExp, '');
|
7156
7220
|
|
7157
7221
|
try {
|
7158
7222
|
// Might throw malformed URI sequence
|
7159
7223
|
uri = decodeURIComponent(uri);
|
7160
|
-
if (scriptUriRegExp.test(uri)) {
|
7161
|
-
return;
|
7162
|
-
}
|
7163
7224
|
} catch (ex) {
|
7164
7225
|
// Fallback to non UTF-8 decoder
|
7165
7226
|
uri = unescape(uri);
|
7166
|
-
|
7167
|
-
|
7168
|
-
|
7227
|
+
}
|
7228
|
+
|
7229
|
+
if (scriptUriRegExp.test(uri)) {
|
7230
|
+
return;
|
7231
|
+
}
|
7232
|
+
|
7233
|
+
if (!settings.allow_html_data_urls && dataUriRegExp.test(uri) && !/^data:image\//i.test(uri)) {
|
7234
|
+
return;
|
7169
7235
|
}
|
7170
7236
|
}
|
7171
7237
|
|
@@ -8582,6 +8648,17 @@ define("tinymce/dom/Serializer", [
|
|
8582
8648
|
|
8583
8649
|
htmlParser = new DomParser(settings, schema);
|
8584
8650
|
|
8651
|
+
// Convert tabindex back to elements when serializing contents
|
8652
|
+
htmlParser.addAttributeFilter('data-mce-tabindex', function(nodes, name) {
|
8653
|
+
var i = nodes.length, node;
|
8654
|
+
|
8655
|
+
while (i--) {
|
8656
|
+
node = nodes[i];
|
8657
|
+
node.attr('tabindex', node.attributes.map['data-mce-tabindex']);
|
8658
|
+
node.attr(name, null);
|
8659
|
+
}
|
8660
|
+
});
|
8661
|
+
|
8585
8662
|
// Convert move data-mce-src, data-mce-href and data-mce-style into nodes or process them if needed
|
8586
8663
|
htmlParser.addAttributeFilter('src,href,style', function(nodes, name) {
|
8587
8664
|
var i = nodes.length, node, value, internalName = 'data-mce-' + name;
|
@@ -9633,6 +9710,8 @@ define("tinymce/dom/ControlSelection", [
|
|
9633
9710
|
function showResizeRect(targetElm, mouseDownHandleName, mouseDownEvent) {
|
9634
9711
|
var position, targetWidth, targetHeight, e, rect, offsetParent = editor.getBody();
|
9635
9712
|
|
9713
|
+
unbindResizeHandleEvents();
|
9714
|
+
|
9636
9715
|
// Get position and size of target
|
9637
9716
|
position = dom.getPos(targetElm, offsetParent);
|
9638
9717
|
selectedElmX = position.x;
|
@@ -9712,14 +9791,18 @@ define("tinymce/dom/ControlSelection", [
|
|
9712
9791
|
if (Env.ie) {
|
9713
9792
|
handleElm.contentEditable = false;
|
9714
9793
|
}
|
9794
|
+
} else {
|
9795
|
+
dom.show(handleElm);
|
9796
|
+
}
|
9715
9797
|
|
9798
|
+
if (!handle.elm) {
|
9716
9799
|
dom.bind(handleElm, 'mousedown', function(e) {
|
9717
9800
|
e.stopImmediatePropagation();
|
9718
9801
|
e.preventDefault();
|
9719
9802
|
startDrag(e);
|
9720
9803
|
});
|
9721
|
-
|
9722
|
-
|
9804
|
+
|
9805
|
+
handle.elm = handleElm;
|
9723
9806
|
}
|
9724
9807
|
|
9725
9808
|
/*
|
@@ -9749,6 +9832,8 @@ define("tinymce/dom/ControlSelection", [
|
|
9749
9832
|
function hideResizeRect() {
|
9750
9833
|
var name, handleElm;
|
9751
9834
|
|
9835
|
+
unbindResizeHandleEvents();
|
9836
|
+
|
9752
9837
|
if (selectedElm) {
|
9753
9838
|
selectedElm.removeAttribute('data-mce-selected');
|
9754
9839
|
}
|
@@ -9858,6 +9943,17 @@ define("tinymce/dom/ControlSelection", [
|
|
9858
9943
|
detachEvent(selectedElm, 'resizestart', resizeNativeStart);
|
9859
9944
|
}
|
9860
9945
|
|
9946
|
+
function unbindResizeHandleEvents() {
|
9947
|
+
for (var name in resizeHandles) {
|
9948
|
+
var handle = resizeHandles[name];
|
9949
|
+
|
9950
|
+
if (handle.elm) {
|
9951
|
+
dom.unbind(handle.elm);
|
9952
|
+
delete handle.elm;
|
9953
|
+
}
|
9954
|
+
}
|
9955
|
+
}
|
9956
|
+
|
9861
9957
|
function disableGeckoResize() {
|
9862
9958
|
try {
|
9863
9959
|
// Disable object resizing on Gecko
|
@@ -9939,10 +10035,14 @@ define("tinymce/dom/ControlSelection", [
|
|
9939
10035
|
}
|
9940
10036
|
});
|
9941
10037
|
|
10038
|
+
editor.on('hide', hideResizeRect);
|
10039
|
+
|
9942
10040
|
// Hide rect on focusout since it would float on top of windows otherwise
|
9943
10041
|
//editor.on('focusout', hideResizeRect);
|
9944
10042
|
});
|
9945
10043
|
|
10044
|
+
editor.on('remove', unbindResizeHandleEvents);
|
10045
|
+
|
9946
10046
|
function destroy() {
|
9947
10047
|
selectedElm = selectedElmGhost = null;
|
9948
10048
|
|
@@ -10219,7 +10319,7 @@ define("tinymce/dom/RangeUtils", [
|
|
10219
10319
|
var normalized, collapsed;
|
10220
10320
|
|
10221
10321
|
function normalizeEndPoint(start) {
|
10222
|
-
var container, offset, walker, body = dom.getRoot(), node, nonEmptyElementsMap
|
10322
|
+
var container, offset, walker, body = dom.getRoot(), node, nonEmptyElementsMap;
|
10223
10323
|
var directionLeft, isAfterNode;
|
10224
10324
|
|
10225
10325
|
function hasBrBeforeAfter(node, left) {
|
@@ -10256,6 +10356,11 @@ define("tinymce/dom/RangeUtils", [
|
|
10256
10356
|
// Walk left until we hit a text node we can move to or a block/br/img
|
10257
10357
|
walker = new TreeWalker(startNode, parentBlockContainer);
|
10258
10358
|
while ((node = walker[left ? 'prev' : 'next']())) {
|
10359
|
+
// Break if we hit a non content editable node
|
10360
|
+
if (dom.getContentEditableParent(node) === "false") {
|
10361
|
+
return;
|
10362
|
+
}
|
10363
|
+
|
10259
10364
|
// Found text node that has a length
|
10260
10365
|
if (node.nodeType === 3 && node.nodeValue.length > 0) {
|
10261
10366
|
container = node;
|
@@ -10302,7 +10407,6 @@ define("tinymce/dom/RangeUtils", [
|
|
10302
10407
|
if (directionLeft) {
|
10303
10408
|
node = container.childNodes[offset > 0 ? offset - 1 : 0];
|
10304
10409
|
if (node) {
|
10305
|
-
nodeName = node.nodeName.toLowerCase();
|
10306
10410
|
if (nonEmptyElementsMap[node.nodeName] || node.nodeName == "TABLE") {
|
10307
10411
|
return;
|
10308
10412
|
}
|
@@ -11704,6 +11808,160 @@ define("tinymce/dom/Selection", [
|
|
11704
11808
|
return Selection;
|
11705
11809
|
});
|
11706
11810
|
|
11811
|
+
// Included from: js/tinymce/classes/fmt/Preview.js
|
11812
|
+
|
11813
|
+
/**
|
11814
|
+
* Preview.js
|
11815
|
+
*
|
11816
|
+
* Copyright, Moxiecode Systems AB
|
11817
|
+
* Released under LGPL License.
|
11818
|
+
*
|
11819
|
+
* License: http://www.tinymce.com/license
|
11820
|
+
* Contributing: http://www.tinymce.com/contributing
|
11821
|
+
*/
|
11822
|
+
|
11823
|
+
/**
|
11824
|
+
* Internal class for generating previews styles for formats.
|
11825
|
+
*
|
11826
|
+
* Example:
|
11827
|
+
* Preview.getCssText(editor, 'bold');
|
11828
|
+
*
|
11829
|
+
* @class tinymce.fmt.Preview
|
11830
|
+
* @private
|
11831
|
+
*/
|
11832
|
+
define("tinymce/fmt/Preview", [
|
11833
|
+
"tinymce/util/Tools"
|
11834
|
+
], function(Tools) {
|
11835
|
+
var each = Tools.each;
|
11836
|
+
|
11837
|
+
function getCssText(editor, format) {
|
11838
|
+
var name, previewElm, dom = editor.dom;
|
11839
|
+
var previewCss = '', parentFontSize, previewStyles;
|
11840
|
+
|
11841
|
+
previewStyles = editor.settings.preview_styles;
|
11842
|
+
|
11843
|
+
// No preview forced
|
11844
|
+
if (previewStyles === false) {
|
11845
|
+
return '';
|
11846
|
+
}
|
11847
|
+
|
11848
|
+
// Default preview
|
11849
|
+
if (!previewStyles) {
|
11850
|
+
previewStyles = 'font-family font-size font-weight font-style text-decoration ' +
|
11851
|
+
'text-transform color background-color border border-radius outline text-shadow';
|
11852
|
+
}
|
11853
|
+
|
11854
|
+
// Removes any variables since these can't be previewed
|
11855
|
+
function removeVars(val) {
|
11856
|
+
return val.replace(/%(\w+)/g, '');
|
11857
|
+
}
|
11858
|
+
|
11859
|
+
// Create block/inline element to use for preview
|
11860
|
+
if (typeof(format) == "string") {
|
11861
|
+
format = editor.formatter.get(format);
|
11862
|
+
if (!format) {
|
11863
|
+
return;
|
11864
|
+
}
|
11865
|
+
|
11866
|
+
format = format[0];
|
11867
|
+
}
|
11868
|
+
|
11869
|
+
name = format.block || format.inline || 'span';
|
11870
|
+
previewElm = dom.create(name);
|
11871
|
+
|
11872
|
+
// Add format styles to preview element
|
11873
|
+
each(format.styles, function(value, name) {
|
11874
|
+
value = removeVars(value);
|
11875
|
+
|
11876
|
+
if (value) {
|
11877
|
+
dom.setStyle(previewElm, name, value);
|
11878
|
+
}
|
11879
|
+
});
|
11880
|
+
|
11881
|
+
// Add attributes to preview element
|
11882
|
+
each(format.attributes, function(value, name) {
|
11883
|
+
value = removeVars(value);
|
11884
|
+
|
11885
|
+
if (value) {
|
11886
|
+
dom.setAttrib(previewElm, name, value);
|
11887
|
+
}
|
11888
|
+
});
|
11889
|
+
|
11890
|
+
// Add classes to preview element
|
11891
|
+
each(format.classes, function(value) {
|
11892
|
+
value = removeVars(value);
|
11893
|
+
|
11894
|
+
if (!dom.hasClass(previewElm, value)) {
|
11895
|
+
dom.addClass(previewElm, value);
|
11896
|
+
}
|
11897
|
+
});
|
11898
|
+
|
11899
|
+
editor.fire('PreviewFormats');
|
11900
|
+
|
11901
|
+
// Add the previewElm outside the visual area
|
11902
|
+
dom.setStyles(previewElm, {position: 'absolute', left: -0xFFFF});
|
11903
|
+
editor.getBody().appendChild(previewElm);
|
11904
|
+
|
11905
|
+
// Get parent container font size so we can compute px values out of em/% for older IE:s
|
11906
|
+
parentFontSize = dom.getStyle(editor.getBody(), 'fontSize', true);
|
11907
|
+
parentFontSize = /px$/.test(parentFontSize) ? parseInt(parentFontSize, 10) : 0;
|
11908
|
+
|
11909
|
+
each(previewStyles.split(' '), function(name) {
|
11910
|
+
var value = dom.getStyle(previewElm, name, true);
|
11911
|
+
|
11912
|
+
// If background is transparent then check if the body has a background color we can use
|
11913
|
+
if (name == 'background-color' && /transparent|rgba\s*\([^)]+,\s*0\)/.test(value)) {
|
11914
|
+
value = dom.getStyle(editor.getBody(), name, true);
|
11915
|
+
|
11916
|
+
// Ignore white since it's the default color, not the nicest fix
|
11917
|
+
// TODO: Fix this by detecting runtime style
|
11918
|
+
if (dom.toHex(value).toLowerCase() == '#ffffff') {
|
11919
|
+
return;
|
11920
|
+
}
|
11921
|
+
}
|
11922
|
+
|
11923
|
+
if (name == 'color') {
|
11924
|
+
// Ignore black since it's the default color, not the nicest fix
|
11925
|
+
// TODO: Fix this by detecting runtime style
|
11926
|
+
if (dom.toHex(value).toLowerCase() == '#000000') {
|
11927
|
+
return;
|
11928
|
+
}
|
11929
|
+
}
|
11930
|
+
|
11931
|
+
// Old IE won't calculate the font size so we need to do that manually
|
11932
|
+
if (name == 'font-size') {
|
11933
|
+
if (/em|%$/.test(value)) {
|
11934
|
+
if (parentFontSize === 0) {
|
11935
|
+
return;
|
11936
|
+
}
|
11937
|
+
|
11938
|
+
// Convert font size from em/% to px
|
11939
|
+
value = parseFloat(value, 10) / (/%$/.test(value) ? 100 : 1);
|
11940
|
+
value = (value * parentFontSize) + 'px';
|
11941
|
+
}
|
11942
|
+
}
|
11943
|
+
|
11944
|
+
if (name == "border" && value) {
|
11945
|
+
previewCss += 'padding:0 2px;';
|
11946
|
+
}
|
11947
|
+
|
11948
|
+
previewCss += name + ':' + value + ';';
|
11949
|
+
});
|
11950
|
+
|
11951
|
+
editor.fire('AfterPreviewFormats');
|
11952
|
+
|
11953
|
+
//previewCss += 'line-height:normal';
|
11954
|
+
|
11955
|
+
dom.remove(previewElm);
|
11956
|
+
|
11957
|
+
return previewCss;
|
11958
|
+
}
|
11959
|
+
|
11960
|
+
return {
|
11961
|
+
getCssText: getCssText
|
11962
|
+
};
|
11963
|
+
});
|
11964
|
+
|
11707
11965
|
// Included from: js/tinymce/classes/Formatter.js
|
11708
11966
|
|
11709
11967
|
/**
|
@@ -11733,8 +11991,9 @@ define("tinymce/dom/Selection", [
|
|
11733
11991
|
define("tinymce/Formatter", [
|
11734
11992
|
"tinymce/dom/TreeWalker",
|
11735
11993
|
"tinymce/dom/RangeUtils",
|
11736
|
-
"tinymce/util/Tools"
|
11737
|
-
|
11994
|
+
"tinymce/util/Tools",
|
11995
|
+
"tinymce/fmt/Preview"
|
11996
|
+
], function(TreeWalker, RangeUtils, Tools, Preview) {
|
11738
11997
|
/**
|
11739
11998
|
* Constructs a new formatter instance.
|
11740
11999
|
*
|
@@ -11783,6 +12042,19 @@ define("tinymce/Formatter", [
|
|
11783
12042
|
|
11784
12043
|
function defaultFormats() {
|
11785
12044
|
register({
|
12045
|
+
|
12046
|
+
valigntop: [
|
12047
|
+
{selector: 'td,th', styles: {'verticalAlign': 'top'}}
|
12048
|
+
],
|
12049
|
+
|
12050
|
+
valignmiddle: [
|
12051
|
+
{selector: 'td,th', styles: {'verticalAlign': 'middle'}}
|
12052
|
+
],
|
12053
|
+
|
12054
|
+
valignbottom: [
|
12055
|
+
{selector: 'td,th', styles: {'verticalAlign': 'bottom'}}
|
12056
|
+
],
|
12057
|
+
|
11786
12058
|
alignleft: [
|
11787
12059
|
{selector: 'figure,p,h1,h2,h3,h4,h5,h6,td,th,tr,div,ul,ol,li', styles: {textAlign: 'left'}, defaultBlock: 'div'},
|
11788
12060
|
{selector: 'img,table', collapsed: false, styles: {'float': 'left'}}
|
@@ -11997,6 +12269,16 @@ define("tinymce/Formatter", [
|
|
11997
12269
|
dom.setStyle(elm, name, replaceVars(value, vars));
|
11998
12270
|
});
|
11999
12271
|
|
12272
|
+
// Needed for the WebKit span spam bug
|
12273
|
+
// TODO: Remove this once WebKit/Blink fixes this
|
12274
|
+
if (fmt.styles) {
|
12275
|
+
var styleVal = dom.getAttrib(elm, 'style');
|
12276
|
+
|
12277
|
+
if (styleVal) {
|
12278
|
+
elm.setAttribute('data-mce-style', styleVal);
|
12279
|
+
}
|
12280
|
+
}
|
12281
|
+
|
12000
12282
|
each(fmt.attributes, function(value, name) {
|
12001
12283
|
dom.setAttrib(elm, name, replaceVars(value, vars));
|
12002
12284
|
});
|
@@ -12899,6 +13181,20 @@ define("tinymce/Formatter", [
|
|
12899
13181
|
return this;
|
12900
13182
|
}
|
12901
13183
|
|
13184
|
+
/**
|
13185
|
+
* Returns a preview css text for the specified format.
|
13186
|
+
*
|
13187
|
+
* @method getCssText
|
13188
|
+
* @param {String/Object} format Format to generate preview css text for.
|
13189
|
+
* @return {String} Css text for the specified format.
|
13190
|
+
* @example
|
13191
|
+
* var cssText1 = editor.formatter.getCssText('bold');
|
13192
|
+
* var cssText2 = editor.formatter.getCssText({inline: 'b'});
|
13193
|
+
*/
|
13194
|
+
function getCssText(format) {
|
13195
|
+
return Preview.getCssText(ed, format);
|
13196
|
+
}
|
13197
|
+
|
12902
13198
|
// Expose to public
|
12903
13199
|
extend(this, {
|
12904
13200
|
get: get,
|
@@ -12910,7 +13206,8 @@ define("tinymce/Formatter", [
|
|
12910
13206
|
matchAll: matchAll,
|
12911
13207
|
matchNode: matchNode,
|
12912
13208
|
canApply: canApply,
|
12913
|
-
formatChanged: formatChanged
|
13209
|
+
formatChanged: formatChanged,
|
13210
|
+
getCssText: getCssText
|
12914
13211
|
});
|
12915
13212
|
|
12916
13213
|
// Initialize
|
@@ -14163,7 +14460,7 @@ define("tinymce/UndoManager", [
|
|
14163
14460
|
].join('|'), 'gi');
|
14164
14461
|
|
14165
14462
|
return function(editor) {
|
14166
|
-
var self = this, index = 0, data = [], beforeBookmark, isFirstTypedCharacter,
|
14463
|
+
var self = this, index = 0, data = [], beforeBookmark, isFirstTypedCharacter, locks = 0;
|
14167
14464
|
|
14168
14465
|
// Returns a trimmed version of the current editor contents
|
14169
14466
|
function getContent() {
|
@@ -14203,7 +14500,7 @@ define("tinymce/UndoManager", [
|
|
14203
14500
|
});
|
14204
14501
|
|
14205
14502
|
editor.on('SaveContent ObjectResized blur', addNonTypingUndoLevel);
|
14206
|
-
editor.
|
14503
|
+
editor.on('DragEnd', addNonTypingUndoLevel);
|
14207
14504
|
|
14208
14505
|
editor.on('KeyUp', function(e) {
|
14209
14506
|
var keyCode = e.keyCode;
|
@@ -14291,7 +14588,7 @@ define("tinymce/UndoManager", [
|
|
14291
14588
|
* @method beforeChange
|
14292
14589
|
*/
|
14293
14590
|
beforeChange: function() {
|
14294
|
-
if (!
|
14591
|
+
if (!locks) {
|
14295
14592
|
beforeBookmark = editor.selection.getBookmark(2, true);
|
14296
14593
|
}
|
14297
14594
|
},
|
@@ -14310,16 +14607,16 @@ define("tinymce/UndoManager", [
|
|
14310
14607
|
level = level || {};
|
14311
14608
|
level.content = getContent();
|
14312
14609
|
|
14313
|
-
if (
|
14610
|
+
if (locks || editor.removed) {
|
14314
14611
|
return null;
|
14315
14612
|
}
|
14316
14613
|
|
14317
|
-
|
14614
|
+
lastLevel = data[index];
|
14615
|
+
if (editor.fire('BeforeAddUndo', {level: level, lastLevel: lastLevel, originalEvent: event}).isDefaultPrevented()) {
|
14318
14616
|
return null;
|
14319
14617
|
}
|
14320
14618
|
|
14321
14619
|
// Add undo level if needed
|
14322
|
-
lastLevel = data[index];
|
14323
14620
|
if (lastLevel && lastLevel.content == level.content) {
|
14324
14621
|
return null;
|
14325
14622
|
}
|
@@ -14461,9 +14758,12 @@ define("tinymce/UndoManager", [
|
|
14461
14758
|
transact: function(callback) {
|
14462
14759
|
self.beforeChange();
|
14463
14760
|
|
14464
|
-
|
14465
|
-
|
14466
|
-
|
14761
|
+
try {
|
14762
|
+
locks++;
|
14763
|
+
callback();
|
14764
|
+
} finally {
|
14765
|
+
locks--;
|
14766
|
+
}
|
14467
14767
|
|
14468
14768
|
self.add();
|
14469
14769
|
}
|
@@ -16024,7 +16324,13 @@ define("tinymce/EditorCommands", [
|
|
16024
16324
|
define("tinymce/util/URI", [
|
16025
16325
|
"tinymce/util/Tools"
|
16026
16326
|
], function(Tools) {
|
16027
|
-
var each = Tools.each, trim = Tools.trim
|
16327
|
+
var each = Tools.each, trim = Tools.trim,
|
16328
|
+
DEFAULT_PORTS = {
|
16329
|
+
'ftp': 21,
|
16330
|
+
'http': 80,
|
16331
|
+
'https': 443,
|
16332
|
+
'mailto': 25
|
16333
|
+
};
|
16028
16334
|
|
16029
16335
|
/**
|
16030
16336
|
* Constructs a new URI instance.
|
@@ -16196,7 +16502,31 @@ define("tinymce/util/URI", [
|
|
16196
16502
|
toAbsolute: function(uri, noHost) {
|
16197
16503
|
uri = new URI(uri, {base_uri: this});
|
16198
16504
|
|
16199
|
-
return uri.getURI(
|
16505
|
+
return uri.getURI(noHost && this.isSameOrigin(uri));
|
16506
|
+
},
|
16507
|
+
|
16508
|
+
/**
|
16509
|
+
* Determine whether the given URI has the same origin as this URI. Based on RFC-6454.
|
16510
|
+
* Supports default ports for protocols listed in DEFAULT_PORTS. Unsupported protocols will fail safe: they
|
16511
|
+
* won't match, if the port specifications differ.
|
16512
|
+
*
|
16513
|
+
* @method isSameOrigin
|
16514
|
+
* @param {tinymce.util.URI} uri Uri instance to compare.
|
16515
|
+
* @returns {Boolean} True if the origins are the same.
|
16516
|
+
*/
|
16517
|
+
isSameOrigin: function(uri) {
|
16518
|
+
if (this.host == uri.host && this.protocol == uri.protocol){
|
16519
|
+
if (this.port == uri.port) {
|
16520
|
+
return true;
|
16521
|
+
}
|
16522
|
+
|
16523
|
+
var defaultPort = DEFAULT_PORTS[this.protocol];
|
16524
|
+
if (defaultPort && ((this.port || defaultPort) == (uri.port || defaultPort))) {
|
16525
|
+
return true;
|
16526
|
+
}
|
16527
|
+
}
|
16528
|
+
|
16529
|
+
return false;
|
16200
16530
|
},
|
16201
16531
|
|
16202
16532
|
/**
|
@@ -16454,6 +16784,8 @@ define("tinymce/util/Class", [
|
|
16454
16784
|
// Instantiate a base class (but only create the instance,
|
16455
16785
|
// don't run the init constructor)
|
16456
16786
|
initializing = true;
|
16787
|
+
|
16788
|
+
/*eslint new-cap:0 */
|
16457
16789
|
prototype = new self();
|
16458
16790
|
initializing = false;
|
16459
16791
|
|
@@ -16540,10 +16872,10 @@ define("tinymce/util/Class", [
|
|
16540
16872
|
return Class;
|
16541
16873
|
});
|
16542
16874
|
|
16543
|
-
// Included from: js/tinymce/classes/
|
16875
|
+
// Included from: js/tinymce/classes/util/EventDispatcher.js
|
16544
16876
|
|
16545
16877
|
/**
|
16546
|
-
*
|
16878
|
+
* EventDispatcher.js
|
16547
16879
|
*
|
16548
16880
|
* Copyright, Moxiecode Systems AB
|
16549
16881
|
* Released under LGPL License.
|
@@ -16552,75 +16884,338 @@ define("tinymce/util/Class", [
|
|
16552
16884
|
* Contributing: http://www.tinymce.com/contributing
|
16553
16885
|
*/
|
16554
16886
|
|
16555
|
-
/*eslint no-nested-ternary:0 */
|
16556
|
-
|
16557
16887
|
/**
|
16558
|
-
*
|
16559
|
-
*
|
16560
|
-
* and the ones we support should be enough for most cases.
|
16888
|
+
* This class lets you add/remove and fire events by name on the specified scope. This makes
|
16889
|
+
* it easy to add event listener logic to any class.
|
16561
16890
|
*
|
16891
|
+
* @class tinymce.util.EventDispatcher
|
16562
16892
|
* @example
|
16563
|
-
*
|
16564
|
-
* element
|
16565
|
-
* element#name
|
16566
|
-
* element.class
|
16567
|
-
* element[attr]
|
16568
|
-
* element[attr*=value]
|
16569
|
-
* element[attr~=value]
|
16570
|
-
* element[attr!=value]
|
16571
|
-
* element[attr^=value]
|
16572
|
-
* element[attr$=value]
|
16573
|
-
* element:<state>
|
16574
|
-
* element:not(<expression>)
|
16575
|
-
* element:first
|
16576
|
-
* element:last
|
16577
|
-
* element:odd
|
16578
|
-
* element:even
|
16579
|
-
* element element
|
16580
|
-
* element > element
|
16893
|
+
* var eventDispatcher = new EventDispatcher();
|
16581
16894
|
*
|
16582
|
-
*
|
16895
|
+
* eventDispatcher.on('click', function() {console.log('data');});
|
16896
|
+
* eventDispatcher.fire('click', {data: 123});
|
16583
16897
|
*/
|
16584
|
-
define("tinymce/
|
16585
|
-
"tinymce/util/
|
16586
|
-
], function(
|
16587
|
-
|
16588
|
-
|
16589
|
-
|
16590
|
-
|
16591
|
-
|
16592
|
-
|
16593
|
-
* @private
|
16594
|
-
* @method unqiue
|
16595
|
-
* @param {Array} array Array to make into an array with unique items.
|
16596
|
-
* @return {Array} Array with unique items.
|
16597
|
-
*/
|
16598
|
-
function unique(array) {
|
16599
|
-
var uniqueItems = [], i = array.length, item;
|
16898
|
+
define("tinymce/util/EventDispatcher", [
|
16899
|
+
"tinymce/util/Tools"
|
16900
|
+
], function(Tools) {
|
16901
|
+
var nativeEvents = Tools.makeMap(
|
16902
|
+
"focus blur focusin focusout click dblclick mousedown mouseup mousemove mouseover beforepaste paste cut copy selectionchange " +
|
16903
|
+
"mouseout mouseenter mouseleave wheel keydown keypress keyup input contextmenu dragstart dragend dragover " +
|
16904
|
+
"draggesture dragdrop drop drag submit",
|
16905
|
+
' '
|
16906
|
+
);
|
16600
16907
|
|
16601
|
-
|
16602
|
-
|
16908
|
+
function Dispatcher(settings) {
|
16909
|
+
var self = this, scope, bindings = {}, toggleEvent;
|
16603
16910
|
|
16604
|
-
|
16605
|
-
|
16606
|
-
item.__checked = 1;
|
16607
|
-
}
|
16911
|
+
function returnFalse() {
|
16912
|
+
return false;
|
16608
16913
|
}
|
16609
16914
|
|
16610
|
-
|
16611
|
-
|
16612
|
-
delete uniqueItems[i].__checked;
|
16915
|
+
function returnTrue() {
|
16916
|
+
return true;
|
16613
16917
|
}
|
16614
16918
|
|
16615
|
-
|
16616
|
-
|
16617
|
-
|
16618
|
-
var expression = /^([\w\\*]+)?(?:#([\w\\]+))?(?:\.([\w\\\.]+))?(?:\[\@?([\w\\]+)([\^\$\*!~]?=)([\w\\]+)\])?(?:\:(.+))?/i;
|
16919
|
+
settings = settings || {};
|
16920
|
+
scope = settings.scope || self;
|
16921
|
+
toggleEvent = settings.toggleEvent || returnFalse;
|
16619
16922
|
|
16620
|
-
|
16621
|
-
|
16622
|
-
|
16623
|
-
|
16923
|
+
/**
|
16924
|
+
* Fires the specified event by name.
|
16925
|
+
*
|
16926
|
+
* @method fire
|
16927
|
+
* @param {String} name Name of the event to fire.
|
16928
|
+
* @param {Object?} args Event arguments.
|
16929
|
+
* @return {Object} Event args instance passed in.
|
16930
|
+
* @example
|
16931
|
+
* instance.fire('event', {...});
|
16932
|
+
*/
|
16933
|
+
function fire(name, args) {
|
16934
|
+
var handlers, i, l, callback;
|
16935
|
+
|
16936
|
+
name = name.toLowerCase();
|
16937
|
+
args = args || {};
|
16938
|
+
args.type = name;
|
16939
|
+
|
16940
|
+
// Setup target is there isn't one
|
16941
|
+
if (!args.target) {
|
16942
|
+
args.target = scope;
|
16943
|
+
}
|
16944
|
+
|
16945
|
+
// Add event delegation methods if they are missing
|
16946
|
+
if (!args.preventDefault) {
|
16947
|
+
// Add preventDefault method
|
16948
|
+
args.preventDefault = function() {
|
16949
|
+
args.isDefaultPrevented = returnTrue;
|
16950
|
+
};
|
16951
|
+
|
16952
|
+
// Add stopPropagation
|
16953
|
+
args.stopPropagation = function() {
|
16954
|
+
args.isPropagationStopped = returnTrue;
|
16955
|
+
};
|
16956
|
+
|
16957
|
+
// Add stopImmediatePropagation
|
16958
|
+
args.stopImmediatePropagation = function() {
|
16959
|
+
args.isImmediatePropagationStopped = returnTrue;
|
16960
|
+
};
|
16961
|
+
|
16962
|
+
// Add event delegation states
|
16963
|
+
args.isDefaultPrevented = returnFalse;
|
16964
|
+
args.isPropagationStopped = returnFalse;
|
16965
|
+
args.isImmediatePropagationStopped = returnFalse;
|
16966
|
+
}
|
16967
|
+
|
16968
|
+
if (settings.beforeFire) {
|
16969
|
+
settings.beforeFire(args);
|
16970
|
+
}
|
16971
|
+
|
16972
|
+
handlers = bindings[name];
|
16973
|
+
if (handlers) {
|
16974
|
+
for (i = 0, l = handlers.length; i < l; i++) {
|
16975
|
+
handlers[i] = callback = handlers[i];
|
16976
|
+
|
16977
|
+
// Stop immediate propagation if needed
|
16978
|
+
if (args.isImmediatePropagationStopped()) {
|
16979
|
+
args.stopPropagation();
|
16980
|
+
return args;
|
16981
|
+
}
|
16982
|
+
|
16983
|
+
// If callback returns false then prevent default and stop all propagation
|
16984
|
+
if (callback.call(scope, args) === false) {
|
16985
|
+
args.preventDefault();
|
16986
|
+
return args;
|
16987
|
+
}
|
16988
|
+
}
|
16989
|
+
}
|
16990
|
+
|
16991
|
+
return args;
|
16992
|
+
}
|
16993
|
+
|
16994
|
+
/**
|
16995
|
+
* Binds an event listener to a specific event by name.
|
16996
|
+
*
|
16997
|
+
* @method on
|
16998
|
+
* @param {String} name Event name or space separated list of events to bind.
|
16999
|
+
* @param {callback} callback Callback to be executed when the event occurs.
|
17000
|
+
* @param {Boolean} first Optional flag if the event should be prepended. Use this with care.
|
17001
|
+
* @return {Object} Current class instance.
|
17002
|
+
* @example
|
17003
|
+
* instance.on('event', function(e) {
|
17004
|
+
* // Callback logic
|
17005
|
+
* });
|
17006
|
+
*/
|
17007
|
+
function on(name, callback, prepend) {
|
17008
|
+
var handlers, names, i;
|
17009
|
+
|
17010
|
+
if (callback === false) {
|
17011
|
+
callback = returnFalse;
|
17012
|
+
}
|
17013
|
+
|
17014
|
+
if (callback) {
|
17015
|
+
names = name.toLowerCase().split(' ');
|
17016
|
+
i = names.length;
|
17017
|
+
while (i--) {
|
17018
|
+
name = names[i];
|
17019
|
+
handlers = bindings[name];
|
17020
|
+
if (!handlers) {
|
17021
|
+
handlers = bindings[name] = [];
|
17022
|
+
toggleEvent(name, true);
|
17023
|
+
}
|
17024
|
+
|
17025
|
+
if (prepend) {
|
17026
|
+
handlers.unshift(callback);
|
17027
|
+
} else {
|
17028
|
+
handlers.push(callback);
|
17029
|
+
}
|
17030
|
+
}
|
17031
|
+
}
|
17032
|
+
|
17033
|
+
return self;
|
17034
|
+
}
|
17035
|
+
|
17036
|
+
/**
|
17037
|
+
* Unbinds an event listener to a specific event by name.
|
17038
|
+
*
|
17039
|
+
* @method off
|
17040
|
+
* @param {String?} name Name of the event to unbind.
|
17041
|
+
* @param {callback?} callback Callback to unbind.
|
17042
|
+
* @return {Object} Current class instance.
|
17043
|
+
* @example
|
17044
|
+
* // Unbind specific callback
|
17045
|
+
* instance.off('event', handler);
|
17046
|
+
*
|
17047
|
+
* // Unbind all listeners by name
|
17048
|
+
* instance.off('event');
|
17049
|
+
*
|
17050
|
+
* // Unbind all events
|
17051
|
+
* instance.off();
|
17052
|
+
*/
|
17053
|
+
function off(name, callback) {
|
17054
|
+
var i, handlers, bindingName, names, hi;
|
17055
|
+
|
17056
|
+
if (name) {
|
17057
|
+
names = name.toLowerCase().split(' ');
|
17058
|
+
i = names.length;
|
17059
|
+
while (i--) {
|
17060
|
+
name = names[i];
|
17061
|
+
handlers = bindings[name];
|
17062
|
+
|
17063
|
+
// Unbind all handlers
|
17064
|
+
if (!name) {
|
17065
|
+
for (bindingName in bindings) {
|
17066
|
+
toggleEvent(bindingName, false);
|
17067
|
+
delete bindings[bindingName];
|
17068
|
+
}
|
17069
|
+
|
17070
|
+
return self;
|
17071
|
+
}
|
17072
|
+
|
17073
|
+
if (handlers) {
|
17074
|
+
// Unbind all by name
|
17075
|
+
if (!callback) {
|
17076
|
+
handlers.length = 0;
|
17077
|
+
} else {
|
17078
|
+
// Unbind specific ones
|
17079
|
+
hi = handlers.length;
|
17080
|
+
while (hi--) {
|
17081
|
+
if (handlers[hi] === callback) {
|
17082
|
+
handlers.splice(hi, 1);
|
17083
|
+
}
|
17084
|
+
}
|
17085
|
+
}
|
17086
|
+
|
17087
|
+
if (!handlers.length) {
|
17088
|
+
toggleEvent(name, false);
|
17089
|
+
delete bindings[name];
|
17090
|
+
}
|
17091
|
+
}
|
17092
|
+
}
|
17093
|
+
} else {
|
17094
|
+
for (name in bindings) {
|
17095
|
+
toggleEvent(name, false);
|
17096
|
+
}
|
17097
|
+
|
17098
|
+
bindings = {};
|
17099
|
+
}
|
17100
|
+
|
17101
|
+
return self;
|
17102
|
+
}
|
17103
|
+
|
17104
|
+
/**
|
17105
|
+
* Returns true/false if the dispatcher has a event of the specified name.
|
17106
|
+
*
|
17107
|
+
* @method has
|
17108
|
+
* @param {String} name Name of the event to check for.
|
17109
|
+
* @return {Boolean} true/false if the event exists or not.
|
17110
|
+
*/
|
17111
|
+
function has(name) {
|
17112
|
+
name = name.toLowerCase();
|
17113
|
+
return !(!bindings[name] || bindings[name].length === 0);
|
17114
|
+
}
|
17115
|
+
|
17116
|
+
// Expose
|
17117
|
+
self.fire = fire;
|
17118
|
+
self.on = on;
|
17119
|
+
self.off = off;
|
17120
|
+
self.has = has;
|
17121
|
+
}
|
17122
|
+
|
17123
|
+
/**
|
17124
|
+
* Returns true/false if the specified event name is a native browser event or not.
|
17125
|
+
*
|
17126
|
+
* @method isNative
|
17127
|
+
* @param {String} name Name to check if it's native.
|
17128
|
+
* @return {Boolean} true/false if the event is native or not.
|
17129
|
+
* @static
|
17130
|
+
*/
|
17131
|
+
Dispatcher.isNative = function(name) {
|
17132
|
+
return !!nativeEvents[name.toLowerCase()];
|
17133
|
+
};
|
17134
|
+
|
17135
|
+
return Dispatcher;
|
17136
|
+
});
|
17137
|
+
|
17138
|
+
// Included from: js/tinymce/classes/ui/Selector.js
|
17139
|
+
|
17140
|
+
/**
|
17141
|
+
* Selector.js
|
17142
|
+
*
|
17143
|
+
* Copyright, Moxiecode Systems AB
|
17144
|
+
* Released under LGPL License.
|
17145
|
+
*
|
17146
|
+
* License: http://www.tinymce.com/license
|
17147
|
+
* Contributing: http://www.tinymce.com/contributing
|
17148
|
+
*/
|
17149
|
+
|
17150
|
+
/*eslint no-nested-ternary:0 */
|
17151
|
+
|
17152
|
+
/**
|
17153
|
+
* Selector engine, enables you to select controls by using CSS like expressions.
|
17154
|
+
* We currently only support basic CSS expressions to reduce the size of the core
|
17155
|
+
* and the ones we support should be enough for most cases.
|
17156
|
+
*
|
17157
|
+
* @example
|
17158
|
+
* Supported expressions:
|
17159
|
+
* element
|
17160
|
+
* element#name
|
17161
|
+
* element.class
|
17162
|
+
* element[attr]
|
17163
|
+
* element[attr*=value]
|
17164
|
+
* element[attr~=value]
|
17165
|
+
* element[attr!=value]
|
17166
|
+
* element[attr^=value]
|
17167
|
+
* element[attr$=value]
|
17168
|
+
* element:<state>
|
17169
|
+
* element:not(<expression>)
|
17170
|
+
* element:first
|
17171
|
+
* element:last
|
17172
|
+
* element:odd
|
17173
|
+
* element:even
|
17174
|
+
* element element
|
17175
|
+
* element > element
|
17176
|
+
*
|
17177
|
+
* @class tinymce.ui.Selector
|
17178
|
+
*/
|
17179
|
+
define("tinymce/ui/Selector", [
|
17180
|
+
"tinymce/util/Class"
|
17181
|
+
], function(Class) {
|
17182
|
+
"use strict";
|
17183
|
+
|
17184
|
+
/**
|
17185
|
+
* Produces an array with a unique set of objects. It will not compare the values
|
17186
|
+
* but the references of the objects.
|
17187
|
+
*
|
17188
|
+
* @private
|
17189
|
+
* @method unqiue
|
17190
|
+
* @param {Array} array Array to make into an array with unique items.
|
17191
|
+
* @return {Array} Array with unique items.
|
17192
|
+
*/
|
17193
|
+
function unique(array) {
|
17194
|
+
var uniqueItems = [], i = array.length, item;
|
17195
|
+
|
17196
|
+
while (i--) {
|
17197
|
+
item = array[i];
|
17198
|
+
|
17199
|
+
if (!item.__checked) {
|
17200
|
+
uniqueItems.push(item);
|
17201
|
+
item.__checked = 1;
|
17202
|
+
}
|
17203
|
+
}
|
17204
|
+
|
17205
|
+
i = uniqueItems.length;
|
17206
|
+
while (i--) {
|
17207
|
+
delete uniqueItems[i].__checked;
|
17208
|
+
}
|
17209
|
+
|
17210
|
+
return uniqueItems;
|
17211
|
+
}
|
17212
|
+
|
17213
|
+
var expression = /^([\w\\*]+)?(?:#([\w\\]+))?(?:\.([\w\\\.]+))?(?:\[\@?([\w\\]+)([\^\$\*!~]?=)([\w\\]+)\])?(?:\:(.+))?/i;
|
17214
|
+
|
17215
|
+
/*jshint maxlen:255 */
|
17216
|
+
/*eslint max-len:0 */
|
17217
|
+
var chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,
|
17218
|
+
whiteSpace = /^\s*|\s*$/g,
|
16624
17219
|
Collection;
|
16625
17220
|
|
16626
17221
|
var Selector = Class.extend({
|
@@ -17466,21 +18061,44 @@ define("tinymce/ui/DomUtils", [
|
|
17466
18061
|
define("tinymce/ui/Control", [
|
17467
18062
|
"tinymce/util/Class",
|
17468
18063
|
"tinymce/util/Tools",
|
18064
|
+
"tinymce/util/EventDispatcher",
|
17469
18065
|
"tinymce/ui/Collection",
|
17470
18066
|
"tinymce/ui/DomUtils"
|
17471
|
-
], function(Class, Tools, Collection, DomUtils) {
|
18067
|
+
], function(Class, Tools, EventDispatcher, Collection, DomUtils) {
|
17472
18068
|
"use strict";
|
17473
18069
|
|
17474
|
-
var nativeEvents = Tools.makeMap("focusin focusout scroll click dblclick mousedown mouseup mousemove mouseover" +
|
17475
|
-
" mouseout mouseenter mouseleave wheel keydown keypress keyup contextmenu", " ");
|
17476
|
-
|
17477
18070
|
var elementIdCache = {};
|
17478
18071
|
var hasMouseWheelEventSupport = "onmousewheel" in document;
|
17479
18072
|
var hasWheelEventSupport = false;
|
18073
|
+
var classPrefix = "mce-";
|
18074
|
+
|
18075
|
+
function getEventDispatcher(obj) {
|
18076
|
+
if (!obj._eventDispatcher) {
|
18077
|
+
obj._eventDispatcher = new EventDispatcher({
|
18078
|
+
scope: obj,
|
18079
|
+
toggleEvent: function(name, state) {
|
18080
|
+
if (state && EventDispatcher.isNative(name)) {
|
18081
|
+
if (!obj._nativeEvents) {
|
18082
|
+
obj._nativeEvents = {};
|
18083
|
+
}
|
18084
|
+
|
18085
|
+
obj._nativeEvents[name] = true;
|
18086
|
+
|
18087
|
+
if (obj._rendered) {
|
18088
|
+
obj.bindPendingEvents();
|
18089
|
+
}
|
18090
|
+
}
|
18091
|
+
}
|
18092
|
+
});
|
18093
|
+
}
|
18094
|
+
|
18095
|
+
return obj._eventDispatcher;
|
18096
|
+
}
|
17480
18097
|
|
17481
18098
|
var Control = Class.extend({
|
17482
18099
|
Statics: {
|
17483
|
-
elementIdCache: elementIdCache
|
18100
|
+
elementIdCache: elementIdCache,
|
18101
|
+
classPrefix: classPrefix
|
17484
18102
|
},
|
17485
18103
|
|
17486
18104
|
isRtl: function() {
|
@@ -17493,7 +18111,7 @@ define("tinymce/ui/Control", [
|
|
17493
18111
|
* @final
|
17494
18112
|
* @field {String} classPrefix
|
17495
18113
|
*/
|
17496
|
-
classPrefix:
|
18114
|
+
classPrefix: classPrefix,
|
17497
18115
|
|
17498
18116
|
/**
|
17499
18117
|
* Constructs a new control instance with the specified settings.
|
@@ -17950,14 +18568,18 @@ define("tinymce/ui/Control", [
|
|
17950
18568
|
* @return {tinymce.ui.Control} Current control object.
|
17951
18569
|
*/
|
17952
18570
|
on: function(name, callback) {
|
17953
|
-
var self = this
|
18571
|
+
var self = this;
|
17954
18572
|
|
17955
18573
|
function resolveCallbackName(name) {
|
17956
18574
|
var callback, scope;
|
17957
18575
|
|
18576
|
+
if (typeof(name) != 'string') {
|
18577
|
+
return name;
|
18578
|
+
}
|
18579
|
+
|
17958
18580
|
return function(e) {
|
17959
18581
|
if (!callback) {
|
17960
|
-
self.
|
18582
|
+
self.parentsAndSelf().each(function(ctrl) {
|
17961
18583
|
var callbacks = ctrl.settings.callbacks;
|
17962
18584
|
|
17963
18585
|
if (callbacks && (callback = callbacks[name])) {
|
@@ -17971,41 +18593,7 @@ define("tinymce/ui/Control", [
|
|
17971
18593
|
};
|
17972
18594
|
}
|
17973
18595
|
|
17974
|
-
|
17975
|
-
if (typeof(callback) == 'string') {
|
17976
|
-
callback = resolveCallbackName(callback);
|
17977
|
-
}
|
17978
|
-
|
17979
|
-
names = name.toLowerCase().split(' ');
|
17980
|
-
i = names.length;
|
17981
|
-
while (i--) {
|
17982
|
-
name = names[i];
|
17983
|
-
|
17984
|
-
bindings = self._bindings;
|
17985
|
-
if (!bindings) {
|
17986
|
-
bindings = self._bindings = {};
|
17987
|
-
}
|
17988
|
-
|
17989
|
-
handlers = bindings[name];
|
17990
|
-
if (!handlers) {
|
17991
|
-
handlers = bindings[name] = [];
|
17992
|
-
}
|
17993
|
-
|
17994
|
-
handlers.push(callback);
|
17995
|
-
|
17996
|
-
if (nativeEvents[name]) {
|
17997
|
-
if (!self._nativeEvents) {
|
17998
|
-
self._nativeEvents = {name: true};
|
17999
|
-
} else {
|
18000
|
-
self._nativeEvents[name] = true;
|
18001
|
-
}
|
18002
|
-
|
18003
|
-
if (self._rendered) {
|
18004
|
-
self.bindPendingEvents();
|
18005
|
-
}
|
18006
|
-
}
|
18007
|
-
}
|
18008
|
-
}
|
18596
|
+
getEventDispatcher(self).on(name, resolveCallbackName(callback));
|
18009
18597
|
|
18010
18598
|
return self;
|
18011
18599
|
},
|
@@ -18021,46 +18609,8 @@ define("tinymce/ui/Control", [
|
|
18021
18609
|
* @return {mxex.ui.Control} Current control object.
|
18022
18610
|
*/
|
18023
18611
|
off: function(name, callback) {
|
18024
|
-
|
18025
|
-
|
18026
|
-
if (bindings) {
|
18027
|
-
if (name) {
|
18028
|
-
names = name.toLowerCase().split(' ');
|
18029
|
-
i = names.length;
|
18030
|
-
while (i--) {
|
18031
|
-
name = names[i];
|
18032
|
-
handlers = bindings[name];
|
18033
|
-
|
18034
|
-
// Unbind all handlers
|
18035
|
-
if (!name) {
|
18036
|
-
for (bindingName in bindings) {
|
18037
|
-
bindings[bindingName].length = 0;
|
18038
|
-
}
|
18039
|
-
|
18040
|
-
return self;
|
18041
|
-
}
|
18042
|
-
|
18043
|
-
if (handlers) {
|
18044
|
-
// Unbind all by name
|
18045
|
-
if (!callback) {
|
18046
|
-
handlers.length = 0;
|
18047
|
-
} else {
|
18048
|
-
// Unbind specific ones
|
18049
|
-
hi = handlers.length;
|
18050
|
-
while (hi--) {
|
18051
|
-
if (handlers[hi] === callback) {
|
18052
|
-
handlers.splice(hi, 1);
|
18053
|
-
}
|
18054
|
-
}
|
18055
|
-
}
|
18056
|
-
}
|
18057
|
-
}
|
18058
|
-
} else {
|
18059
|
-
self._bindings = [];
|
18060
|
-
}
|
18061
|
-
}
|
18062
|
-
|
18063
|
-
return self;
|
18612
|
+
getEventDispatcher(this).off(name, callback);
|
18613
|
+
return this;
|
18064
18614
|
},
|
18065
18615
|
|
18066
18616
|
/**
|
@@ -18074,75 +18624,22 @@ define("tinymce/ui/Control", [
|
|
18074
18624
|
* @return {Object} Current arguments object.
|
18075
18625
|
*/
|
18076
18626
|
fire: function(name, args, bubble) {
|
18077
|
-
var self = this
|
18078
|
-
|
18079
|
-
name = name.toLowerCase();
|
18080
|
-
|
18081
|
-
// Dummy function that gets replaced on the delegation state functions
|
18082
|
-
function returnFalse() {
|
18083
|
-
return false;
|
18084
|
-
}
|
18085
|
-
|
18086
|
-
// Dummy function that gets replaced on the delegation state functions
|
18087
|
-
function returnTrue() {
|
18088
|
-
return true;
|
18089
|
-
}
|
18627
|
+
var self = this;
|
18090
18628
|
|
18091
|
-
// Setup empty object if args is omited
|
18092
18629
|
args = args || {};
|
18093
18630
|
|
18094
|
-
// Stick type into event object
|
18095
|
-
if (!args.type) {
|
18096
|
-
args.type = name;
|
18097
|
-
}
|
18098
|
-
|
18099
|
-
// Stick control into event
|
18100
18631
|
if (!args.control) {
|
18101
18632
|
args.control = self;
|
18102
18633
|
}
|
18103
18634
|
|
18104
|
-
|
18105
|
-
if (!args.preventDefault) {
|
18106
|
-
// Add preventDefault method
|
18107
|
-
args.preventDefault = function() {
|
18108
|
-
args.isDefaultPrevented = returnTrue;
|
18109
|
-
};
|
18110
|
-
|
18111
|
-
// Add stopPropagation
|
18112
|
-
args.stopPropagation = function() {
|
18113
|
-
args.isPropagationStopped = returnTrue;
|
18114
|
-
};
|
18115
|
-
|
18116
|
-
// Add stopImmediatePropagation
|
18117
|
-
args.stopImmediatePropagation = function() {
|
18118
|
-
args.isImmediatePropagationStopped = returnTrue;
|
18119
|
-
};
|
18120
|
-
|
18121
|
-
// Add event delegation states
|
18122
|
-
args.isDefaultPrevented = returnFalse;
|
18123
|
-
args.isPropagationStopped = returnFalse;
|
18124
|
-
args.isImmediatePropagationStopped = returnFalse;
|
18125
|
-
}
|
18126
|
-
|
18127
|
-
if (self._bindings) {
|
18128
|
-
handlers = self._bindings[name];
|
18129
|
-
|
18130
|
-
if (handlers) {
|
18131
|
-
for (i = 0, l = handlers.length; i < l; i++) {
|
18132
|
-
// Execute callback and break if the callback returns a false
|
18133
|
-
if (!args.isImmediatePropagationStopped() && handlers[i].call(self, args) === false) {
|
18134
|
-
break;
|
18135
|
-
}
|
18136
|
-
}
|
18137
|
-
}
|
18138
|
-
}
|
18635
|
+
args = getEventDispatcher(self).fire(name, args);
|
18139
18636
|
|
18140
|
-
// Bubble event up to
|
18141
|
-
if (bubble !== false) {
|
18142
|
-
|
18143
|
-
while (
|
18144
|
-
|
18145
|
-
|
18637
|
+
// Bubble event up to parents
|
18638
|
+
if (bubble !== false && self.parent) {
|
18639
|
+
var parent = self.parent();
|
18640
|
+
while (parent && !args.isPropagationStopped()) {
|
18641
|
+
parent.fire(name, args, false);
|
18642
|
+
parent = parent.parent();
|
18146
18643
|
}
|
18147
18644
|
}
|
18148
18645
|
|
@@ -18157,7 +18654,7 @@ define("tinymce/ui/Control", [
|
|
18157
18654
|
* @return {Boolean} True/false state if the event has listeners.
|
18158
18655
|
*/
|
18159
18656
|
hasEventListeners: function(name) {
|
18160
|
-
return
|
18657
|
+
return getEventDispatcher(this).has(name);
|
18161
18658
|
},
|
18162
18659
|
|
18163
18660
|
/**
|
@@ -18183,6 +18680,17 @@ define("tinymce/ui/Control", [
|
|
18183
18680
|
return parents;
|
18184
18681
|
},
|
18185
18682
|
|
18683
|
+
/**
|
18684
|
+
* Returns the current control and it's parents.
|
18685
|
+
*
|
18686
|
+
* @method parentsAndSelf
|
18687
|
+
* @param {String} selector Optional selector expression to find parents.
|
18688
|
+
* @return {tinymce.ui.Collection} Collection with all parent controls.
|
18689
|
+
*/
|
18690
|
+
parentsAndSelf: function(selector) {
|
18691
|
+
return new Collection(this).add(this.parents(selector));
|
18692
|
+
},
|
18693
|
+
|
18186
18694
|
/**
|
18187
18695
|
* Returns the control next to the current control.
|
18188
18696
|
*
|
@@ -18499,8 +19007,8 @@ define("tinymce/ui/Control", [
|
|
18499
19007
|
* @return {String} Encoded and possible traslated string.
|
18500
19008
|
*/
|
18501
19009
|
encode: function(text, translate) {
|
18502
|
-
if (translate !== false
|
18503
|
-
text =
|
19010
|
+
if (translate !== false) {
|
19011
|
+
text = this.translate(text);
|
18504
19012
|
}
|
18505
19013
|
|
18506
19014
|
return (text || '').replace(/[&<>"]/g, function(match) {
|
@@ -18508,6 +19016,17 @@ define("tinymce/ui/Control", [
|
|
18508
19016
|
});
|
18509
19017
|
},
|
18510
19018
|
|
19019
|
+
/**
|
19020
|
+
* Returns the translated string.
|
19021
|
+
*
|
19022
|
+
* @method translate
|
19023
|
+
* @param {String} text Text to translate.
|
19024
|
+
* @return {String} Translated string or the same as the input.
|
19025
|
+
*/
|
19026
|
+
translate: function(text) {
|
19027
|
+
return Control.translate ? Control.translate(text) : text;
|
19028
|
+
},
|
19029
|
+
|
18511
19030
|
/**
|
18512
19031
|
* Adds items before the current control.
|
18513
19032
|
*
|
@@ -18851,6 +19370,11 @@ define("tinymce/ui/Control", [
|
|
18851
19370
|
parents[i]._eventsRoot = eventRootCtrl;
|
18852
19371
|
}
|
18853
19372
|
|
19373
|
+
var eventRootDelegates = eventRootCtrl._delegates;
|
19374
|
+
if (!eventRootDelegates) {
|
19375
|
+
eventRootDelegates = eventRootCtrl._delegates = {};
|
19376
|
+
}
|
19377
|
+
|
18854
19378
|
// Bind native event delegates
|
18855
19379
|
for (name in nativeEvents) {
|
18856
19380
|
if (!nativeEvents) {
|
@@ -18875,9 +19399,9 @@ define("tinymce/ui/Control", [
|
|
18875
19399
|
DomUtils.on(eventRootCtrl.getEl(), "mouseover", mouseEnterHandler);
|
18876
19400
|
eventRootCtrl._hasMouseEnter = 1;
|
18877
19401
|
}
|
18878
|
-
} else if (!
|
19402
|
+
} else if (!eventRootDelegates[name]) {
|
18879
19403
|
DomUtils.on(eventRootCtrl.getEl(), name, delegate);
|
18880
|
-
|
19404
|
+
eventRootDelegates[name] = true;
|
18881
19405
|
}
|
18882
19406
|
|
18883
19407
|
// Remove the event once it's bound
|
@@ -19201,9 +19725,11 @@ define("tinymce/ui/KeyboardNavigation", [
|
|
19201
19725
|
* @return {Boolean} True/false if the element is a text element or not.
|
19202
19726
|
*/
|
19203
19727
|
function isTextInputElement(elm) {
|
19728
|
+
var tagName = elm.tagName.toUpperCase();
|
19729
|
+
|
19204
19730
|
// Notice: since type can be "email" etc we don't check the type
|
19205
19731
|
// So all input elements gets treated as text input elements
|
19206
|
-
return
|
19732
|
+
return tagName == "INPUT" || tagName == "TEXTAREA";
|
19207
19733
|
}
|
19208
19734
|
|
19209
19735
|
/**
|
@@ -19445,7 +19971,7 @@ define("tinymce/ui/KeyboardNavigation", [
|
|
19445
19971
|
}
|
19446
19972
|
|
19447
19973
|
root.on('keydown', function(e) {
|
19448
|
-
function
|
19974
|
+
function handleNonTabOrEscEvent(e, handler) {
|
19449
19975
|
// Ignore non tab keys for text elements
|
19450
19976
|
if (isTextInputElement(focusedElement)) {
|
19451
19977
|
return;
|
@@ -19462,29 +19988,29 @@ define("tinymce/ui/KeyboardNavigation", [
|
|
19462
19988
|
|
19463
19989
|
switch (e.keyCode) {
|
19464
19990
|
case 37: // DOM_VK_LEFT
|
19465
|
-
|
19991
|
+
handleNonTabOrEscEvent(e, left);
|
19466
19992
|
break;
|
19467
19993
|
|
19468
19994
|
case 39: // DOM_VK_RIGHT
|
19469
|
-
|
19995
|
+
handleNonTabOrEscEvent(e, right);
|
19470
19996
|
break;
|
19471
19997
|
|
19472
19998
|
case 38: // DOM_VK_UP
|
19473
|
-
|
19999
|
+
handleNonTabOrEscEvent(e, up);
|
19474
20000
|
break;
|
19475
20001
|
|
19476
20002
|
case 40: // DOM_VK_DOWN
|
19477
|
-
|
20003
|
+
handleNonTabOrEscEvent(e, down);
|
19478
20004
|
break;
|
19479
20005
|
|
19480
20006
|
case 27: // DOM_VK_ESCAPE
|
19481
|
-
|
20007
|
+
cancel();
|
19482
20008
|
break;
|
19483
20009
|
|
19484
20010
|
case 14: // DOM_VK_ENTER
|
19485
20011
|
case 13: // DOM_VK_RETURN
|
19486
20012
|
case 32: // DOM_VK_SPACE
|
19487
|
-
|
20013
|
+
handleNonTabOrEscEvent(e, enter);
|
19488
20014
|
break;
|
19489
20015
|
|
19490
20016
|
case 9: // DOM_VK_TAB
|
@@ -20356,7 +20882,7 @@ define("tinymce/ui/Panel", [
|
|
20356
20882
|
}
|
20357
20883
|
|
20358
20884
|
return (
|
20359
|
-
'<div id="' + self._id + '" class="' + self.classes() + '"
|
20885
|
+
'<div id="' + self._id + '" class="' + self.classes() + '" hidefocus="1" tabindex="-1" role="group">' +
|
20360
20886
|
(self._preBodyHtml || '') +
|
20361
20887
|
innerHtml +
|
20362
20888
|
'</div>'
|
@@ -21210,7 +21736,7 @@ define("tinymce/ui/Window", [
|
|
21210
21736
|
headerHtml = (
|
21211
21737
|
'<div id="' + id + '-head" class="' + prefix + 'window-head">' +
|
21212
21738
|
'<div id="' + id + '-title" class="' + prefix + 'title">' + self.encode(settings.title) + '</div>' +
|
21213
|
-
'<button type="button" class="' + prefix + 'close" aria-hidden="true"
|
21739
|
+
'<button type="button" class="' + prefix + 'close" aria-hidden="true">\u00d7</button>' +
|
21214
21740
|
'<div id="' + id + '-dragh" class="' + prefix + 'dragh"></div>' +
|
21215
21741
|
'</div>'
|
21216
21742
|
);
|
@@ -21229,7 +21755,7 @@ define("tinymce/ui/Window", [
|
|
21229
21755
|
}
|
21230
21756
|
|
21231
21757
|
return (
|
21232
|
-
'<div id="' + id + '" class="' + self.classes() + '"
|
21758
|
+
'<div id="' + id + '" class="' + self.classes() + '" hidefocus="1">' +
|
21233
21759
|
'<div class="' + self.classPrefix + 'reset" role="application">' +
|
21234
21760
|
headerHtml +
|
21235
21761
|
'<div id="' + id + '-body" class="' + self.classes('body') + '">' +
|
@@ -21378,6 +21904,17 @@ define("tinymce/ui/Window", [
|
|
21378
21904
|
DomUtils.removeClass(document.documentElement, prefix + 'fullscreen');
|
21379
21905
|
DomUtils.removeClass(document.body, prefix + 'fullscreen');
|
21380
21906
|
}
|
21907
|
+
},
|
21908
|
+
|
21909
|
+
/**
|
21910
|
+
* Returns the contentWindow object of the iframe if it exists.
|
21911
|
+
*
|
21912
|
+
* @method getContentWindow
|
21913
|
+
* @return {Window} window object or null.
|
21914
|
+
*/
|
21915
|
+
getContentWindow: function() {
|
21916
|
+
var ifr = this.getEl().getElementsByTagName('iframe')[0];
|
21917
|
+
return ifr ? ifr.contentWindow : null;
|
21381
21918
|
}
|
21382
21919
|
});
|
21383
21920
|
|
@@ -21686,7 +22223,6 @@ define("tinymce/WindowManager", [
|
|
21686
22223
|
args.buttons = [
|
21687
22224
|
{text: 'Ok', subtype: 'primary', onclick: function() {
|
21688
22225
|
win.find('form')[0].submit();
|
21689
|
-
win.close();
|
21690
22226
|
}},
|
21691
22227
|
|
21692
22228
|
{text: 'Cancel', onclick: function() {
|
@@ -21730,7 +22266,7 @@ define("tinymce/WindowManager", [
|
|
21730
22266
|
// Takes a snapshot in the FocusManager of the selection before focus is lost to dialog
|
21731
22267
|
editor.nodeChanged();
|
21732
22268
|
|
21733
|
-
return win.renderTo(
|
22269
|
+
return win.renderTo().reflow();
|
21734
22270
|
};
|
21735
22271
|
|
21736
22272
|
/**
|
@@ -21814,6 +22350,16 @@ define("tinymce/WindowManager", [
|
|
21814
22350
|
getTopMostWindow().params = params;
|
21815
22351
|
}
|
21816
22352
|
};
|
22353
|
+
|
22354
|
+
/**
|
22355
|
+
* Returns the currently opened window objects.
|
22356
|
+
*
|
22357
|
+
* @method getWindows
|
22358
|
+
* @return {Array} Array of the currently opened windows.
|
22359
|
+
*/
|
22360
|
+
self.getWindows = function() {
|
22361
|
+
return windows;
|
22362
|
+
};
|
21817
22363
|
};
|
21818
22364
|
});
|
21819
22365
|
|
@@ -21910,9 +22456,45 @@ define("tinymce/util/Quirks", [
|
|
21910
22456
|
*/
|
21911
22457
|
function cleanupStylesWhenDeleting() {
|
21912
22458
|
var doc = editor.getDoc(), urlPrefix = 'data:text/mce-internal,';
|
22459
|
+
var MutationObserver = window.MutationObserver, olderWebKit, dragStartRng;
|
21913
22460
|
|
21914
|
-
|
21915
|
-
|
22461
|
+
// Add mini polyfill for older WebKits
|
22462
|
+
// TODO: Remove this when old Safari versions gets updated
|
22463
|
+
if (!MutationObserver) {
|
22464
|
+
olderWebKit = true;
|
22465
|
+
|
22466
|
+
MutationObserver = function() {
|
22467
|
+
var records = [], target;
|
22468
|
+
|
22469
|
+
function nodeInsert(e) {
|
22470
|
+
var target = e.relatedNode || e.target;
|
22471
|
+
records.push({target: target, addedNodes: [target]});
|
22472
|
+
}
|
22473
|
+
|
22474
|
+
function attrModified(e) {
|
22475
|
+
var target = e.relatedNode || e.target;
|
22476
|
+
records.push({target: target, attributeName: e.attrName});
|
22477
|
+
}
|
22478
|
+
|
22479
|
+
this.observe = function(node) {
|
22480
|
+
target = node;
|
22481
|
+
target.addEventListener('DOMSubtreeModified', nodeInsert, false);
|
22482
|
+
target.addEventListener('DOMNodeInsertedIntoDocument', nodeInsert, false);
|
22483
|
+
target.addEventListener('DOMNodeInserted', nodeInsert, false);
|
22484
|
+
target.addEventListener('DOMAttrModified', attrModified, false);
|
22485
|
+
};
|
22486
|
+
|
22487
|
+
this.disconnect = function() {
|
22488
|
+
target.removeEventListener('DOMSubtreeModified', nodeInsert, false);
|
22489
|
+
target.removeEventListener('DOMNodeInsertedIntoDocument', nodeInsert, false);
|
22490
|
+
target.removeEventListener('DOMNodeInserted', nodeInsert, false);
|
22491
|
+
target.removeEventListener('DOMAttrModified', attrModified, false);
|
22492
|
+
};
|
22493
|
+
|
22494
|
+
this.takeRecords = function() {
|
22495
|
+
return records;
|
22496
|
+
};
|
22497
|
+
};
|
21916
22498
|
}
|
21917
22499
|
|
21918
22500
|
function customDelete(isForward) {
|
@@ -21944,6 +22526,10 @@ define("tinymce/util/Quirks", [
|
|
21944
22526
|
var caretElement = rng.startContainer.parentNode;
|
21945
22527
|
|
21946
22528
|
Tools.each(mutationObserver.takeRecords(), function(record) {
|
22529
|
+
if (!dom.isChildOf(record.target, editor.getBody())) {
|
22530
|
+
return;
|
22531
|
+
}
|
22532
|
+
|
21947
22533
|
// Restore style attribute to previous value
|
21948
22534
|
if (record.attributeName == "style") {
|
21949
22535
|
var oldValue = record.target.getAttribute('data-mce-style');
|
@@ -22023,9 +22609,25 @@ define("tinymce/util/Quirks", [
|
|
22023
22609
|
customDelete(true);
|
22024
22610
|
});
|
22025
22611
|
|
22612
|
+
// Older WebKits doesn't properly handle the clipboard so we can't add the rest
|
22613
|
+
if (olderWebKit) {
|
22614
|
+
return;
|
22615
|
+
}
|
22616
|
+
|
22026
22617
|
editor.on('dragstart', function(e) {
|
22618
|
+
var selectionHtml;
|
22619
|
+
|
22620
|
+
if (editor.selection.isCollapsed() && e.target.tagName == 'IMG') {
|
22621
|
+
selection.select(e.target);
|
22622
|
+
}
|
22623
|
+
|
22624
|
+
dragStartRng = selection.getRng();
|
22625
|
+
selectionHtml = editor.selection.getContent();
|
22626
|
+
|
22027
22627
|
// Safari doesn't support custom dataTransfer items so we can only use URL and Text
|
22028
|
-
|
22628
|
+
if (selectionHtml.length > 0) {
|
22629
|
+
e.dataTransfer.setData('URL', 'data:text/mce-internal,' + escape(selectionHtml));
|
22630
|
+
}
|
22029
22631
|
});
|
22030
22632
|
|
22031
22633
|
editor.on('drop', function(e) {
|
@@ -22039,10 +22641,26 @@ define("tinymce/util/Quirks", [
|
|
22039
22641
|
internalContent = unescape(internalContent.substr(urlPrefix.length));
|
22040
22642
|
if (doc.caretRangeFromPoint) {
|
22041
22643
|
e.preventDefault();
|
22042
|
-
|
22043
|
-
|
22044
|
-
|
22644
|
+
|
22645
|
+
// Safari has a weird issue where drag/dropping images sometimes
|
22646
|
+
// produces a green plus icon. When this happens the caretRangeFromPoint
|
22647
|
+
// will return "null" even though the x, y coordinate is correct.
|
22648
|
+
// But if we detach the insert from the drop event we will get a proper range
|
22649
|
+
window.setTimeout(function() {
|
22650
|
+
var pointRng = doc.caretRangeFromPoint(e.x, e.y);
|
22651
|
+
|
22652
|
+
if (dragStartRng) {
|
22653
|
+
selection.setRng(dragStartRng);
|
22654
|
+
dragStartRng = null;
|
22655
|
+
}
|
22656
|
+
|
22657
|
+
customDelete();
|
22658
|
+
|
22659
|
+
selection.setRng(pointRng);
|
22660
|
+
editor.insertContent(internalContent);
|
22661
|
+
}, 0);
|
22045
22662
|
}
|
22663
|
+
|
22046
22664
|
}
|
22047
22665
|
});
|
22048
22666
|
|
@@ -22323,6 +22941,10 @@ define("tinymce/util/Quirks", [
|
|
22323
22941
|
}
|
22324
22942
|
|
22325
22943
|
selectionTimer = window.setTimeout(function() {
|
22944
|
+
if (editor.removed) {
|
22945
|
+
return;
|
22946
|
+
}
|
22947
|
+
|
22326
22948
|
var rng = selection.getRng();
|
22327
22949
|
|
22328
22950
|
// Compare the ranges to see if it was a real change or not
|
@@ -22735,16 +23357,16 @@ define("tinymce/util/Quirks", [
|
|
22735
23357
|
}
|
22736
23358
|
|
22737
23359
|
/**
|
22738
|
-
* Fixes selection issues
|
23360
|
+
* Fixes selection issues where the caret can be placed between two inline elements like <b>a</b>|<b>b</b>
|
22739
23361
|
* this fix will lean the caret right into the closest inline element.
|
22740
23362
|
*/
|
22741
23363
|
function normalizeSelection() {
|
22742
23364
|
// Normalize selection for example <b>a</b><i>|a</i> becomes <b>a|</b><i>a</i> except for Ctrl+A since it selects everything
|
22743
|
-
editor.on('keyup focusin', function(e) {
|
23365
|
+
editor.on('keyup focusin mouseup', function(e) {
|
22744
23366
|
if (e.keyCode != 65 || !VK.metaKeyPressed(e)) {
|
22745
23367
|
selection.normalize();
|
22746
23368
|
}
|
22747
|
-
});
|
23369
|
+
}, true);
|
22748
23370
|
}
|
22749
23371
|
|
22750
23372
|
/**
|
@@ -22832,7 +23454,7 @@ define("tinymce/util/Quirks", [
|
|
22832
23454
|
*/
|
22833
23455
|
function doubleTrailingBrElements() {
|
22834
23456
|
if (!editor.inline) {
|
22835
|
-
editor.on('focus blur', function() {
|
23457
|
+
editor.on('focus blur beforegetcontent', function() {
|
22836
23458
|
var br = editor.dom.create('br');
|
22837
23459
|
editor.getBody().appendChild(br);
|
22838
23460
|
br.parentNode.removeChild(br);
|
@@ -22840,6 +23462,38 @@ define("tinymce/util/Quirks", [
|
|
22840
23462
|
}
|
22841
23463
|
}
|
22842
23464
|
|
23465
|
+
/**
|
23466
|
+
* iOS 7.1 introduced two new bugs:
|
23467
|
+
* 1) It's possible to open links within a contentEditable area by clicking on them.
|
23468
|
+
* 2) If you hold down the finger it will display the link/image touch callout menu.
|
23469
|
+
*/
|
23470
|
+
function tapLinksAndImages() {
|
23471
|
+
editor.on('click', function(e) {
|
23472
|
+
var elm = e.target;
|
23473
|
+
|
23474
|
+
do {
|
23475
|
+
if (elm.tagName === 'A') {
|
23476
|
+
e.preventDefault();
|
23477
|
+
return;
|
23478
|
+
}
|
23479
|
+
} while ((elm = elm.parentNode));
|
23480
|
+
});
|
23481
|
+
|
23482
|
+
editor.contentStyles.push('.mce-content-body {-webkit-touch-callout: none}');
|
23483
|
+
}
|
23484
|
+
|
23485
|
+
/**
|
23486
|
+
* WebKit has a bug where it will allow forms to be submitted if they are inside a contentEditable element.
|
23487
|
+
* For example this: <form><button></form>
|
23488
|
+
*/
|
23489
|
+
function blockFormSubmitInsideEditor() {
|
23490
|
+
editor.on('init', function() {
|
23491
|
+
editor.dom.bind(editor.getBody(), 'submit', function(e) {
|
23492
|
+
e.preventDefault();
|
23493
|
+
});
|
23494
|
+
});
|
23495
|
+
}
|
23496
|
+
|
22843
23497
|
// All browsers
|
22844
23498
|
disableBackspaceIntoATable();
|
22845
23499
|
removeBlockQuoteOnBackSpace();
|
@@ -22852,12 +23506,14 @@ define("tinymce/util/Quirks", [
|
|
22852
23506
|
inputMethodFocus();
|
22853
23507
|
selectControlElements();
|
22854
23508
|
setDefaultBlockType();
|
23509
|
+
blockFormSubmitInsideEditor();
|
22855
23510
|
|
22856
23511
|
// iOS
|
22857
23512
|
if (Env.iOS) {
|
22858
23513
|
selectionChangeNodeChanged();
|
22859
23514
|
restoreFocusOnKeyDown();
|
22860
23515
|
bodyHeight();
|
23516
|
+
tapLinksAndImages();
|
22861
23517
|
} else {
|
22862
23518
|
selectAll();
|
22863
23519
|
}
|
@@ -22917,20 +23573,21 @@ define("tinymce/util/Quirks", [
|
|
22917
23573
|
* @mixin tinymce.util.Observable
|
22918
23574
|
*/
|
22919
23575
|
define("tinymce/util/Observable", [
|
22920
|
-
"tinymce/util/
|
22921
|
-
], function(
|
22922
|
-
|
22923
|
-
|
22924
|
-
|
22925
|
-
|
22926
|
-
|
22927
|
-
|
22928
|
-
|
22929
|
-
|
22930
|
-
|
23576
|
+
"tinymce/util/EventDispatcher"
|
23577
|
+
], function(EventDispatcher) {
|
23578
|
+
function getEventDispatcher(obj) {
|
23579
|
+
if (!obj._eventDispatcher) {
|
23580
|
+
obj._eventDispatcher = new EventDispatcher({
|
23581
|
+
scope: obj,
|
23582
|
+
toggleEvent: function(name, state) {
|
23583
|
+
if (EventDispatcher.isNative(name) && obj.toggleNativeEvent) {
|
23584
|
+
obj.toggleNativeEvent(name, state);
|
23585
|
+
}
|
23586
|
+
}
|
23587
|
+
});
|
23588
|
+
}
|
22931
23589
|
|
22932
|
-
|
22933
|
-
return true;
|
23590
|
+
return obj._eventDispatcher;
|
22934
23591
|
}
|
22935
23592
|
|
22936
23593
|
return {
|
@@ -22939,77 +23596,25 @@ define("tinymce/util/Observable", [
|
|
22939
23596
|
*
|
22940
23597
|
* @method fire
|
22941
23598
|
* @param {String} name Name of the event to fire.
|
22942
|
-
* @param {
|
23599
|
+
* @param {Object?} args Event arguments.
|
22943
23600
|
* @param {Boolean?} bubble True/false if the event is to be bubbled.
|
22944
|
-
* @return {
|
23601
|
+
* @return {Object} Event args instance passed in.
|
22945
23602
|
* @example
|
22946
23603
|
* instance.fire('event', {...});
|
22947
23604
|
*/
|
22948
23605
|
fire: function(name, args, bubble) {
|
22949
|
-
var self = this
|
22950
|
-
|
22951
|
-
if (self.removed) {
|
22952
|
-
return;
|
22953
|
-
}
|
22954
|
-
|
22955
|
-
name = name.toLowerCase();
|
22956
|
-
args = args || {};
|
22957
|
-
args.type = name;
|
22958
|
-
|
22959
|
-
// Setup target is there isn't one
|
22960
|
-
if (!args.target) {
|
22961
|
-
args.target = self;
|
22962
|
-
}
|
22963
|
-
|
22964
|
-
// Add event delegation methods if they are missing
|
22965
|
-
if (!args.preventDefault) {
|
22966
|
-
// Add preventDefault method
|
22967
|
-
args.preventDefault = function() {
|
22968
|
-
args.isDefaultPrevented = returnTrue;
|
22969
|
-
};
|
22970
|
-
|
22971
|
-
// Add stopPropagation
|
22972
|
-
args.stopPropagation = function() {
|
22973
|
-
args.isPropagationStopped = returnTrue;
|
22974
|
-
};
|
22975
|
-
|
22976
|
-
// Add stopImmediatePropagation
|
22977
|
-
args.stopImmediatePropagation = function() {
|
22978
|
-
args.isImmediatePropagationStopped = returnTrue;
|
22979
|
-
};
|
23606
|
+
var self = this;
|
22980
23607
|
|
22981
|
-
|
22982
|
-
|
22983
|
-
args
|
22984
|
-
args.isImmediatePropagationStopped = returnFalse;
|
23608
|
+
// Prevent all events except the remove event after the instance has been removed
|
23609
|
+
if (self.removed && name !== "remove") {
|
23610
|
+
return args;
|
22985
23611
|
}
|
22986
23612
|
|
22987
|
-
|
22988
|
-
|
22989
|
-
if (self[bindingsName]) {
|
22990
|
-
handlers = self[bindingsName][name];
|
22991
|
-
|
22992
|
-
if (handlers) {
|
22993
|
-
for (i = 0, l = handlers.length; i < l; i++) {
|
22994
|
-
handlers[i] = callback = handlers[i];
|
22995
|
-
|
22996
|
-
// Stop immediate propagation if needed
|
22997
|
-
if (args.isImmediatePropagationStopped()) {
|
22998
|
-
break;
|
22999
|
-
}
|
23000
|
-
|
23001
|
-
// If callback returns false then prevent default and stop all propagation
|
23002
|
-
if (callback.call(self, args) === false) {
|
23003
|
-
args.preventDefault();
|
23004
|
-
return args;
|
23005
|
-
}
|
23006
|
-
}
|
23007
|
-
}
|
23008
|
-
}
|
23613
|
+
args = getEventDispatcher(self).fire(name, args, bubble);
|
23009
23614
|
|
23010
23615
|
// Bubble event up to parents
|
23011
23616
|
if (bubble !== false && self.parent) {
|
23012
|
-
parent = self.parent();
|
23617
|
+
var parent = self.parent();
|
23013
23618
|
while (parent && !args.isPropagationStopped()) {
|
23014
23619
|
parent.fire(name, args, false);
|
23015
23620
|
parent = parent.parent();
|
@@ -23033,42 +23638,7 @@ define("tinymce/util/Observable", [
|
|
23033
23638
|
* });
|
23034
23639
|
*/
|
23035
23640
|
on: function(name, callback, prepend) {
|
23036
|
-
|
23037
|
-
|
23038
|
-
if (callback === false) {
|
23039
|
-
callback = function() {
|
23040
|
-
return false;
|
23041
|
-
};
|
23042
|
-
}
|
23043
|
-
|
23044
|
-
if (callback) {
|
23045
|
-
names = name.toLowerCase().split(' ');
|
23046
|
-
i = names.length;
|
23047
|
-
while (i--) {
|
23048
|
-
name = names[i];
|
23049
|
-
|
23050
|
-
bindings = self[bindingsName];
|
23051
|
-
if (!bindings) {
|
23052
|
-
bindings = self[bindingsName] = {};
|
23053
|
-
}
|
23054
|
-
|
23055
|
-
handlers = bindings[name];
|
23056
|
-
if (!handlers) {
|
23057
|
-
handlers = bindings[name] = [];
|
23058
|
-
if (self.bindNative && nativeEvents[name]) {
|
23059
|
-
self.bindNative(name);
|
23060
|
-
}
|
23061
|
-
}
|
23062
|
-
|
23063
|
-
if (prepend) {
|
23064
|
-
handlers.unshift(callback);
|
23065
|
-
} else {
|
23066
|
-
handlers.push(callback);
|
23067
|
-
}
|
23068
|
-
}
|
23069
|
-
}
|
23070
|
-
|
23071
|
-
return self;
|
23641
|
+
return getEventDispatcher(this).on(name, callback, prepend);
|
23072
23642
|
},
|
23073
23643
|
|
23074
23644
|
/**
|
@@ -23089,67 +23659,150 @@ define("tinymce/util/Observable", [
|
|
23089
23659
|
* instance.off();
|
23090
23660
|
*/
|
23091
23661
|
off: function(name, callback) {
|
23092
|
-
|
23662
|
+
return getEventDispatcher(this).off(name, callback);
|
23663
|
+
},
|
23093
23664
|
|
23094
|
-
|
23095
|
-
|
23096
|
-
|
23097
|
-
|
23098
|
-
|
23099
|
-
|
23100
|
-
|
23665
|
+
/**
|
23666
|
+
* Returns true/false if the object has a event of the specified name.
|
23667
|
+
*
|
23668
|
+
* @method hasEventListeners
|
23669
|
+
* @param {String} name Name of the event to check for.
|
23670
|
+
* @return {Boolean} true/false if the event exists or not.
|
23671
|
+
*/
|
23672
|
+
hasEventListeners: function(name) {
|
23673
|
+
return getEventDispatcher(this).has(name);
|
23674
|
+
}
|
23675
|
+
};
|
23676
|
+
});
|
23677
|
+
|
23678
|
+
// Included from: js/tinymce/classes/EditorObservable.js
|
23679
|
+
|
23680
|
+
/**
|
23681
|
+
* EditorObservable.js
|
23682
|
+
*
|
23683
|
+
* Copyright, Moxiecode Systems AB
|
23684
|
+
* Released under LGPL License.
|
23685
|
+
*
|
23686
|
+
* License: http://www.tinymce.com/license
|
23687
|
+
* Contributing: http://www.tinymce.com/contributing
|
23688
|
+
*/
|
23689
|
+
|
23690
|
+
/**
|
23691
|
+
* This mixin contains the event logic for the tinymce.Editor class.
|
23692
|
+
*
|
23693
|
+
* @mixin tinymce.EditorObservable
|
23694
|
+
* @extends tinymce.util.Observable
|
23695
|
+
*/
|
23696
|
+
define("tinymce/EditorObservable", [
|
23697
|
+
"tinymce/util/Observable",
|
23698
|
+
"tinymce/dom/DOMUtils",
|
23699
|
+
"tinymce/util/Tools"
|
23700
|
+
], function(Observable, DOMUtils, Tools) {
|
23701
|
+
var DOM = DOMUtils.DOM;
|
23702
|
+
|
23703
|
+
function getEventTarget(editor, eventName) {
|
23704
|
+
if (eventName == 'selectionchange') {
|
23705
|
+
return editor.getDoc();
|
23706
|
+
}
|
23707
|
+
|
23708
|
+
// Need to bind mousedown/mouseup etc to document not body in iframe mode
|
23709
|
+
// Since the user might click on the HTML element not the BODY
|
23710
|
+
if (!editor.inline && /^mouse|click|contextmenu|drop/.test(eventName)) {
|
23711
|
+
return editor.getDoc();
|
23712
|
+
}
|
23713
|
+
|
23714
|
+
return editor.getBody();
|
23715
|
+
}
|
23716
|
+
|
23717
|
+
function bindEventDelegate(editor, name) {
|
23718
|
+
var eventRootSelector = editor.settings.event_root, editorManager = editor.editorManager;
|
23719
|
+
var eventRootElm = editorManager.eventRootElm || getEventTarget(editor, name);
|
23720
|
+
|
23721
|
+
if (eventRootSelector) {
|
23722
|
+
if (!editorManager.rootEvents) {
|
23723
|
+
editorManager.rootEvents = {};
|
23724
|
+
|
23725
|
+
editorManager.on('RemoveEditor', function() {
|
23726
|
+
if (!editorManager.activeEditor) {
|
23727
|
+
DOM.unbind(eventRootElm);
|
23728
|
+
delete editorManager.rootEvents;
|
23729
|
+
}
|
23730
|
+
});
|
23731
|
+
}
|
23732
|
+
|
23733
|
+
if (editorManager.rootEvents[name]) {
|
23734
|
+
return;
|
23735
|
+
}
|
23101
23736
|
|
23102
|
-
|
23103
|
-
|
23104
|
-
|
23105
|
-
|
23106
|
-
}
|
23737
|
+
if (eventRootElm == editor.getBody()) {
|
23738
|
+
eventRootElm = DOM.select(eventRootSelector)[0];
|
23739
|
+
editorManager.eventRootElm = eventRootElm;
|
23740
|
+
}
|
23107
23741
|
|
23108
|
-
|
23109
|
-
}
|
23742
|
+
editorManager.rootEvents[name] = true;
|
23110
23743
|
|
23111
|
-
|
23112
|
-
|
23113
|
-
if (!callback) {
|
23114
|
-
handlers.length = 0;
|
23115
|
-
} else {
|
23116
|
-
// Unbind specific ones
|
23117
|
-
hi = handlers.length;
|
23118
|
-
while (hi--) {
|
23119
|
-
if (handlers[hi] === callback) {
|
23120
|
-
handlers.splice(hi, 1);
|
23121
|
-
}
|
23122
|
-
}
|
23123
|
-
}
|
23744
|
+
DOM.bind(eventRootElm, name, function(e) {
|
23745
|
+
var target = e.target, editors = editorManager.editors, i = editors.length;
|
23124
23746
|
|
23125
|
-
|
23126
|
-
|
23127
|
-
|
23128
|
-
|
23129
|
-
|
23130
|
-
|
23131
|
-
} else {
|
23132
|
-
if (self.unbindNative) {
|
23133
|
-
for (name in bindings) {
|
23134
|
-
self.unbindNative(name);
|
23747
|
+
while (i--) {
|
23748
|
+
var body = editors[i].getBody();
|
23749
|
+
|
23750
|
+
if (body === target || DOM.isChildOf(target, body)) {
|
23751
|
+
if (!editors[i].hidden) {
|
23752
|
+
editors[i].fire(name, e);
|
23135
23753
|
}
|
23136
23754
|
}
|
23137
|
-
|
23138
|
-
self[bindingsName] = [];
|
23139
23755
|
}
|
23140
|
-
}
|
23756
|
+
});
|
23757
|
+
} else {
|
23758
|
+
editor.dom.bind(eventRootElm, name, function(e) {
|
23759
|
+
if (!editor.hidden) {
|
23760
|
+
editor.fire(name, e);
|
23761
|
+
}
|
23762
|
+
});
|
23763
|
+
}
|
23764
|
+
}
|
23141
23765
|
|
23142
|
-
|
23766
|
+
var EditorObservable = {
|
23767
|
+
bindPendingEventDelegates: function() {
|
23768
|
+
var self = this;
|
23769
|
+
|
23770
|
+
Tools.each(self._pendingNativeEvents, function(name) {
|
23771
|
+
bindEventDelegate(self, name);
|
23772
|
+
});
|
23143
23773
|
},
|
23144
23774
|
|
23145
|
-
|
23146
|
-
var
|
23775
|
+
toggleNativeEvent: function(name, state) {
|
23776
|
+
var self = this;
|
23147
23777
|
|
23148
|
-
|
23778
|
+
if (self.settings.readonly) {
|
23779
|
+
return;
|
23780
|
+
}
|
23781
|
+
|
23782
|
+
// Never bind focus/blur since the FocusManager fakes those
|
23783
|
+
if (name == "focus" || name == "blur") {
|
23784
|
+
return;
|
23785
|
+
}
|
23149
23786
|
|
23150
|
-
|
23787
|
+
if (state) {
|
23788
|
+
if (self.initialized) {
|
23789
|
+
bindEventDelegate(self, name);
|
23790
|
+
} else {
|
23791
|
+
if (!self._pendingNativeEvents) {
|
23792
|
+
self._pendingNativeEvents = [name];
|
23793
|
+
} else {
|
23794
|
+
self._pendingNativeEvents.push(name);
|
23795
|
+
}
|
23796
|
+
}
|
23797
|
+
} else if (self.initialized) {
|
23798
|
+
self.dom.unbind(getEventTarget(self, name), name);
|
23799
|
+
}
|
23151
23800
|
}
|
23152
23801
|
};
|
23802
|
+
|
23803
|
+
EditorObservable = Tools.extend({}, Observable, EditorObservable);
|
23804
|
+
|
23805
|
+
return EditorObservable;
|
23153
23806
|
});
|
23154
23807
|
|
23155
23808
|
// Included from: js/tinymce/classes/Shortcuts.js
|
@@ -23331,13 +23984,13 @@ define("tinymce/Editor", [
|
|
23331
23984
|
"tinymce/util/Quirks",
|
23332
23985
|
"tinymce/Env",
|
23333
23986
|
"tinymce/util/Tools",
|
23334
|
-
"tinymce/
|
23987
|
+
"tinymce/EditorObservable",
|
23335
23988
|
"tinymce/Shortcuts"
|
23336
23989
|
], function(
|
23337
23990
|
DOMUtils, AddOnManager, Node, DomSerializer, Serializer,
|
23338
23991
|
Selection, Formatter, UndoManager, EnterKey, ForceBlocks, EditorCommands,
|
23339
23992
|
URI, ScriptLoader, EventUtils, WindowManager,
|
23340
|
-
Schema, DomParser, Quirks, Env, Tools,
|
23993
|
+
Schema, DomParser, Quirks, Env, Tools, EditorObservable, Shortcuts
|
23341
23994
|
) {
|
23342
23995
|
// Shorten these names
|
23343
23996
|
var DOM = DOMUtils.DOM, ThemeManager = AddOnManager.ThemeManager, PluginManager = AddOnManager.PluginManager;
|
@@ -23346,20 +23999,6 @@ define("tinymce/Editor", [
|
|
23346
23999
|
var Event = EventUtils.Event;
|
23347
24000
|
var isGecko = Env.gecko, ie = Env.ie;
|
23348
24001
|
|
23349
|
-
function getEventTarget(editor, eventName) {
|
23350
|
-
if (eventName == 'selectionchange') {
|
23351
|
-
return editor.getDoc();
|
23352
|
-
}
|
23353
|
-
|
23354
|
-
// Need to bind mousedown/mouseup etc to document not body in iframe mode
|
23355
|
-
// Since the user might click on the HTML element not the BODY
|
23356
|
-
if (!editor.inline && /^mouse|click|contextmenu|drop/.test(eventName)) {
|
23357
|
-
return editor.getDoc();
|
23358
|
-
}
|
23359
|
-
|
23360
|
-
return editor.getBody();
|
23361
|
-
}
|
23362
|
-
|
23363
24002
|
/**
|
23364
24003
|
* Include documentation for all the events.
|
23365
24004
|
*
|
@@ -23989,12 +24628,10 @@ define("tinymce/Editor", [
|
|
23989
24628
|
|
23990
24629
|
DOM.removeClass(bodyEl, 'mce-content-body');
|
23991
24630
|
DOM.removeClass(bodyEl, 'mce-edit-focus');
|
23992
|
-
DOM.setAttrib(bodyEl, 'tabIndex', null);
|
23993
24631
|
DOM.setAttrib(bodyEl, 'contentEditable', null);
|
23994
24632
|
});
|
23995
24633
|
|
23996
24634
|
DOM.addClass(targetElm, 'mce-content-body');
|
23997
|
-
targetElm.tabIndex = -1;
|
23998
24635
|
self.contentDocument = doc = settings.content_document || document;
|
23999
24636
|
self.contentWindow = settings.content_window || window;
|
24000
24637
|
self.bodyElement = targetElm;
|
@@ -24061,7 +24698,7 @@ define("tinymce/Editor", [
|
|
24061
24698
|
self.parser = new DomParser(settings, self.schema);
|
24062
24699
|
|
24063
24700
|
// Convert src and href into data-mce-src, data-mce-href and data-mce-style
|
24064
|
-
self.parser.addAttributeFilter('src,href,style', function(nodes, name) {
|
24701
|
+
self.parser.addAttributeFilter('src,href,style,tabindex', function(nodes, name) {
|
24065
24702
|
var i = nodes.length, node, dom = self.dom, value, internalName;
|
24066
24703
|
|
24067
24704
|
while (i--) {
|
@@ -24073,6 +24710,9 @@ define("tinymce/Editor", [
|
|
24073
24710
|
if (!node.attributes.map[internalName]) {
|
24074
24711
|
if (name === "style") {
|
24075
24712
|
node.attr(internalName, dom.serializeStyle(dom.parseStyle(value), node.name));
|
24713
|
+
} else if (name === "tabindex") {
|
24714
|
+
node.attr(internalName, value);
|
24715
|
+
node.attr(name, null);
|
24076
24716
|
} else {
|
24077
24717
|
node.attr(internalName, self.convertURL(value, name, node.name));
|
24078
24718
|
}
|
@@ -24218,12 +24858,7 @@ define("tinymce/Editor", [
|
|
24218
24858
|
* }
|
24219
24859
|
*/
|
24220
24860
|
self.initialized = true;
|
24221
|
-
|
24222
|
-
each(self._pendingNativeEvents, function(name) {
|
24223
|
-
self.dom.bind(getEventTarget(self, name), name, function(e) {
|
24224
|
-
self.fire(e.type, e);
|
24225
|
-
});
|
24226
|
-
});
|
24861
|
+
self.bindPendingEventDelegates();
|
24227
24862
|
|
24228
24863
|
self.fire('init');
|
24229
24864
|
self.focus(true);
|
@@ -24301,8 +24936,13 @@ define("tinymce/Editor", [
|
|
24301
24936
|
body = self.getBody();
|
24302
24937
|
|
24303
24938
|
// Check for setActive since it doesn't scroll to the element
|
24304
|
-
if (body.setActive
|
24305
|
-
|
24939
|
+
if (body.setActive) {
|
24940
|
+
// IE 11 sometimes throws "Invalid function" then fallback to focus
|
24941
|
+
try {
|
24942
|
+
body.setActive();
|
24943
|
+
} catch (ex) {
|
24944
|
+
body.focus();
|
24945
|
+
}
|
24306
24946
|
} else {
|
24307
24947
|
body.focus();
|
24308
24948
|
}
|
@@ -24476,9 +25116,7 @@ define("tinymce/Editor", [
|
|
24476
25116
|
},
|
24477
25117
|
|
24478
25118
|
/**
|
24479
|
-
* Adds a button that later gets created by the
|
24480
|
-
* of adding buttons without the need to deal with the ControlManager directly. But it's also less
|
24481
|
-
* powerfull if you need more control use the ControlManagers factory methods instead.
|
25119
|
+
* Adds a button that later gets created by the theme in the editors toolbars.
|
24482
25120
|
*
|
24483
25121
|
* @method addButton
|
24484
25122
|
* @param {String} name Button name to add.
|
@@ -24520,7 +25158,9 @@ define("tinymce/Editor", [
|
|
24520
25158
|
},
|
24521
25159
|
|
24522
25160
|
/**
|
24523
|
-
* Adds a menu item to be used in the menus of the
|
25161
|
+
* Adds a menu item to be used in the menus of the theme. There might be multiple instances
|
25162
|
+
* of this menu item for example it might be used in the main menus of the theme but also in
|
25163
|
+
* the context menu so make sure that it's self contained and supports multiple instances.
|
24524
25164
|
*
|
24525
25165
|
* @method addMenuItem
|
24526
25166
|
* @param {String} name Menu item name to add.
|
@@ -24790,10 +25430,19 @@ define("tinymce/Editor", [
|
|
24790
25430
|
show: function() {
|
24791
25431
|
var self = this;
|
24792
25432
|
|
24793
|
-
|
24794
|
-
|
24795
|
-
|
24796
|
-
|
25433
|
+
if (self.hidden) {
|
25434
|
+
self.hidden = false;
|
25435
|
+
|
25436
|
+
if (self.inline) {
|
25437
|
+
self.getBody().contentEditable = true;
|
25438
|
+
} else {
|
25439
|
+
DOM.show(self.getContainer());
|
25440
|
+
DOM.hide(self.id);
|
25441
|
+
}
|
25442
|
+
|
25443
|
+
self.load();
|
25444
|
+
self.fire('show');
|
25445
|
+
}
|
24797
25446
|
},
|
24798
25447
|
|
24799
25448
|
/**
|
@@ -24804,18 +25453,31 @@ define("tinymce/Editor", [
|
|
24804
25453
|
hide: function() {
|
24805
25454
|
var self = this, doc = self.getDoc();
|
24806
25455
|
|
24807
|
-
|
24808
|
-
|
24809
|
-
|
24810
|
-
|
25456
|
+
if (!self.hidden) {
|
25457
|
+
self.hidden = true;
|
25458
|
+
|
25459
|
+
// Fixed bug where IE has a blinking cursor left from the editor
|
25460
|
+
if (ie && doc && !self.inline) {
|
25461
|
+
doc.execCommand('SelectAll');
|
25462
|
+
}
|
25463
|
+
|
25464
|
+
// We must save before we hide so Safari doesn't crash
|
25465
|
+
self.save();
|
24811
25466
|
|
24812
|
-
|
24813
|
-
|
25467
|
+
if (self.inline) {
|
25468
|
+
self.getBody().contentEditable = false;
|
25469
|
+
|
25470
|
+
// Make sure the editor gets blurred
|
25471
|
+
if (self == self.editorManager.focusedEditor) {
|
25472
|
+
self.editorManager.focusedEditor = null;
|
25473
|
+
}
|
25474
|
+
} else {
|
25475
|
+
DOM.hide(self.getContainer());
|
25476
|
+
DOM.setStyle(self.id, 'display', self.orgDisplay);
|
25477
|
+
}
|
24814
25478
|
|
24815
|
-
|
24816
|
-
|
24817
|
-
DOM.setStyle(self.id, 'display', self.orgDisplay);
|
24818
|
-
self.fire('hide');
|
25479
|
+
self.fire('hide');
|
25480
|
+
}
|
24819
25481
|
},
|
24820
25482
|
|
24821
25483
|
/**
|
@@ -24825,7 +25487,7 @@ define("tinymce/Editor", [
|
|
24825
25487
|
* @return {Boolean} True/false if the editor is hidden or not.
|
24826
25488
|
*/
|
24827
25489
|
isHidden: function() {
|
24828
|
-
return
|
25490
|
+
return !!this.hidden;
|
24829
25491
|
},
|
24830
25492
|
|
24831
25493
|
/**
|
@@ -25281,23 +25943,26 @@ define("tinymce/Editor", [
|
|
25281
25943
|
var self = this;
|
25282
25944
|
|
25283
25945
|
if (!self.removed) {
|
25284
|
-
self.
|
25285
|
-
self.
|
25286
|
-
self.removed = 1; // Cancels post remove event execution
|
25946
|
+
self.removed = 1;
|
25947
|
+
self.save();
|
25287
25948
|
|
25288
25949
|
// Remove any hidden input
|
25289
25950
|
if (self.hasHiddenInput) {
|
25290
25951
|
DOM.remove(self.getElement().nextSibling);
|
25291
25952
|
}
|
25292
25953
|
|
25293
|
-
|
25294
|
-
|
25954
|
+
if (!self.inline) {
|
25955
|
+
// IE 9 has a bug where the selection stops working if you place the
|
25956
|
+
// caret inside the editor then remove the iframe
|
25957
|
+
if (ie && ie < 10) {
|
25958
|
+
self.getDoc().execCommand('SelectAll', false, null);
|
25959
|
+
}
|
25295
25960
|
|
25296
|
-
|
25961
|
+
DOM.setStyle(self.id, 'display', self.orgDisplay);
|
25962
|
+
self.getBody().onload = null; // Prevent #6816
|
25297
25963
|
|
25298
|
-
|
25299
|
-
|
25300
|
-
if (!self.settings.content_editable) {
|
25964
|
+
// Don't clear the window or document if content editable
|
25965
|
+
// is enabled since other instances might still be present
|
25301
25966
|
Event.unbind(self.getWin());
|
25302
25967
|
Event.unbind(self.getDoc());
|
25303
25968
|
}
|
@@ -25306,40 +25971,14 @@ define("tinymce/Editor", [
|
|
25306
25971
|
Event.unbind(self.getBody());
|
25307
25972
|
Event.unbind(elm);
|
25308
25973
|
|
25974
|
+
self.fire('remove');
|
25975
|
+
|
25309
25976
|
self.editorManager.remove(self);
|
25310
25977
|
DOM.remove(elm);
|
25311
25978
|
self.destroy();
|
25312
25979
|
}
|
25313
25980
|
},
|
25314
25981
|
|
25315
|
-
bindNative: function(name) {
|
25316
|
-
var self = this;
|
25317
|
-
|
25318
|
-
if (self.settings.readonly) {
|
25319
|
-
return;
|
25320
|
-
}
|
25321
|
-
|
25322
|
-
if (self.initialized) {
|
25323
|
-
self.dom.bind(getEventTarget(self, name), name, function(e) {
|
25324
|
-
self.fire(name, e);
|
25325
|
-
});
|
25326
|
-
} else {
|
25327
|
-
if (!self._pendingNativeEvents) {
|
25328
|
-
self._pendingNativeEvents = [name];
|
25329
|
-
} else {
|
25330
|
-
self._pendingNativeEvents.push(name);
|
25331
|
-
}
|
25332
|
-
}
|
25333
|
-
},
|
25334
|
-
|
25335
|
-
unbindNative: function(name) {
|
25336
|
-
var self = this;
|
25337
|
-
|
25338
|
-
if (self.initialized) {
|
25339
|
-
self.dom.unbind(name);
|
25340
|
-
}
|
25341
|
-
},
|
25342
|
-
|
25343
25982
|
/**
|
25344
25983
|
* Destroys the editor instance by removing all events, element references or other resources
|
25345
25984
|
* that could leak memory. This method will be called automatically when the page is unloaded
|
@@ -25434,7 +26073,7 @@ define("tinymce/Editor", [
|
|
25434
26073
|
}
|
25435
26074
|
};
|
25436
26075
|
|
25437
|
-
extend(Editor.prototype,
|
26076
|
+
extend(Editor.prototype, EditorObservable);
|
25438
26077
|
|
25439
26078
|
return Editor;
|
25440
26079
|
});
|
@@ -25547,7 +26186,7 @@ define("tinymce/FocusManager", [
|
|
25547
26186
|
"tinymce/dom/DOMUtils",
|
25548
26187
|
"tinymce/Env"
|
25549
26188
|
], function(DOMUtils, Env) {
|
25550
|
-
var selectionChangeHandler, documentFocusInHandler, DOM = DOMUtils.DOM;
|
26189
|
+
var selectionChangeHandler, documentFocusInHandler, documentMouseUpHandler, DOM = DOMUtils.DOM;
|
25551
26190
|
|
25552
26191
|
/**
|
25553
26192
|
* Constructs a new focus manager instance.
|
@@ -25568,8 +26207,13 @@ define("tinymce/FocusManager", [
|
|
25568
26207
|
|
25569
26208
|
// We can't store a real range on IE 11 since it gets mutated so we need to use a bookmark object
|
25570
26209
|
// TODO: Move this to a separate range utils class since it's it's logic is present in Selection as well.
|
25571
|
-
function createBookmark(rng) {
|
26210
|
+
function createBookmark(dom, rng) {
|
25572
26211
|
if (rng && rng.startContainer) {
|
26212
|
+
// Verify that the range is within the root of the editor
|
26213
|
+
if (!dom.isChildOf(rng.startContainer, dom.getRoot()) || !dom.isChildOf(rng.endContainer, dom.getRoot())) {
|
26214
|
+
return;
|
26215
|
+
}
|
26216
|
+
|
25573
26217
|
return {
|
25574
26218
|
startContainer: rng.startContainer,
|
25575
26219
|
startOffset: rng.startOffset,
|
@@ -25599,44 +26243,12 @@ define("tinymce/FocusManager", [
|
|
25599
26243
|
return !!DOM.getParent(elm, FocusManager.isEditorUIElement);
|
25600
26244
|
}
|
25601
26245
|
|
25602
|
-
function isNodeInBodyOfEditor(node, editor) {
|
25603
|
-
var body = editor.getBody();
|
25604
|
-
|
25605
|
-
while (node) {
|
25606
|
-
if (node == body) {
|
25607
|
-
return true;
|
25608
|
-
}
|
25609
|
-
|
25610
|
-
node = node.parentNode;
|
25611
|
-
}
|
25612
|
-
}
|
25613
|
-
|
25614
26246
|
function registerEvents(e) {
|
25615
26247
|
var editor = e.editor;
|
25616
26248
|
|
25617
26249
|
editor.on('init', function() {
|
25618
|
-
//
|
25619
|
-
if (
|
25620
|
-
// Gets fired when the editor is about to be blurred but also when the selection
|
25621
|
-
// is moved into a table cell so we need to add the range as a pending range then
|
25622
|
-
// use that pending range on the blur event of the editor body
|
25623
|
-
editor.dom.bind(editor.getBody(), 'beforedeactivate', function() {
|
25624
|
-
try {
|
25625
|
-
editor.pendingRng = editor.selection.getRng();
|
25626
|
-
} catch (ex) {
|
25627
|
-
// IE throws "Unexcpected call to method or property access" some times so lets ignore it
|
25628
|
-
}
|
25629
|
-
});
|
25630
|
-
|
25631
|
-
// Set the pending range as the current last range if the blur event occurs
|
25632
|
-
editor.dom.bind(editor.getBody(), 'blur', function() {
|
25633
|
-
if (editor.pendingRng) {
|
25634
|
-
editor.lastRng = editor.pendingRng;
|
25635
|
-
editor.selection.lastFocusBookmark = createBookmark(editor.lastRng);
|
25636
|
-
editor.pendingRng = null;
|
25637
|
-
}
|
25638
|
-
});
|
25639
|
-
} else if (editor.inline || Env.ie > 10) {
|
26250
|
+
// Gecko/WebKit has ghost selections in iframes and IE only has one selection per browser tab
|
26251
|
+
if (editor.inline || Env.ie) {
|
25640
26252
|
// On other browsers take snapshot on nodechange in inline mode since they have Ghost selections for iframes
|
25641
26253
|
editor.on('nodechange keyup', function() {
|
25642
26254
|
var node = document.activeElement;
|
@@ -25646,7 +26258,7 @@ define("tinymce/FocusManager", [
|
|
25646
26258
|
node = editor.getBody();
|
25647
26259
|
}
|
25648
26260
|
|
25649
|
-
if (
|
26261
|
+
if (editor.dom.isChildOf(node, editor.getBody())) {
|
25650
26262
|
editor.lastRng = editor.selection.getRng();
|
25651
26263
|
}
|
25652
26264
|
});
|
@@ -25720,6 +26332,8 @@ define("tinymce/FocusManager", [
|
|
25720
26332
|
}, 0);
|
25721
26333
|
});
|
25722
26334
|
|
26335
|
+
// Check if focus is moved to an element outside the active editor by checking if the target node
|
26336
|
+
// isn't within the body of the activeEditor nor a UI element such as a dialog child control
|
25723
26337
|
if (!documentFocusInHandler) {
|
25724
26338
|
documentFocusInHandler = function(e) {
|
25725
26339
|
var activeEditor = editorManager.activeEditor;
|
@@ -25727,7 +26341,7 @@ define("tinymce/FocusManager", [
|
|
25727
26341
|
if (activeEditor && e.target.ownerDocument == document) {
|
25728
26342
|
// Check to make sure we have a valid selection
|
25729
26343
|
if (activeEditor.selection) {
|
25730
|
-
activeEditor.selection.lastFocusBookmark = createBookmark(activeEditor.lastRng);
|
26344
|
+
activeEditor.selection.lastFocusBookmark = createBookmark(activeEditor.dom, activeEditor.lastRng);
|
25731
26345
|
}
|
25732
26346
|
|
25733
26347
|
// Fire a blur event if the element isn't a UI element
|
@@ -25738,17 +26352,39 @@ define("tinymce/FocusManager", [
|
|
25738
26352
|
}
|
25739
26353
|
};
|
25740
26354
|
|
25741
|
-
// Check if focus is moved to an element outside the active editor by checking if the target node
|
25742
|
-
// isn't within the body of the activeEditor nor a UI element such as a dialog child control
|
25743
26355
|
DOM.bind(document, 'focusin', documentFocusInHandler);
|
25744
26356
|
}
|
26357
|
+
|
26358
|
+
// Handle edge case when user starts the selection inside the editor and releases
|
26359
|
+
// the mouse outside the editor producing a new selection. This weird workaround is needed since
|
26360
|
+
// Gecko doesn't have the "selectionchange" event we need to do this. Fixes: #6843
|
26361
|
+
if (editor.inline && !documentMouseUpHandler) {
|
26362
|
+
documentMouseUpHandler = function(e) {
|
26363
|
+
var activeEditor = editorManager.activeEditor;
|
26364
|
+
|
26365
|
+
if (activeEditor.inline && !activeEditor.dom.isChildOf(e.target, activeEditor.getBody())) {
|
26366
|
+
var rng = activeEditor.selection.getRng();
|
26367
|
+
|
26368
|
+
if (!rng.collapsed) {
|
26369
|
+
activeEditor.lastRng = rng;
|
26370
|
+
}
|
26371
|
+
}
|
26372
|
+
};
|
26373
|
+
|
26374
|
+
DOM.bind(document, 'mouseup', documentMouseUpHandler);
|
26375
|
+
}
|
25745
26376
|
}
|
25746
26377
|
|
25747
|
-
function unregisterDocumentEvents() {
|
26378
|
+
function unregisterDocumentEvents(e) {
|
26379
|
+
if (editorManager.focusedEditor == e.editor) {
|
26380
|
+
editorManager.focusedEditor = null;
|
26381
|
+
}
|
26382
|
+
|
25748
26383
|
if (!editorManager.activeEditor) {
|
25749
26384
|
DOM.unbind(document, 'selectionchange', selectionChangeHandler);
|
25750
26385
|
DOM.unbind(document, 'focusin', documentFocusInHandler);
|
25751
|
-
|
26386
|
+
DOM.unbind(document, 'mouseup', documentMouseUpHandler);
|
26387
|
+
selectionChangeHandler = documentFocusInHandler = documentMouseUpHandler = null;
|
25752
26388
|
}
|
25753
26389
|
}
|
25754
26390
|
|
@@ -25764,7 +26400,8 @@ define("tinymce/FocusManager", [
|
|
25764
26400
|
* @return {Boolean} True/false state if the element is part of the UI or not.
|
25765
26401
|
*/
|
25766
26402
|
FocusManager.isEditorUIElement = function(elm) {
|
25767
|
-
|
26403
|
+
// Needs to be converted to string since svg can have focus: #6776
|
26404
|
+
return elm.className.toString().indexOf('mce-') !== -1;
|
25768
26405
|
};
|
25769
26406
|
|
25770
26407
|
return FocusManager;
|
@@ -25804,9 +26441,46 @@ define("tinymce/EditorManager", [
|
|
25804
26441
|
], function(Editor, DOMUtils, URI, Env, Tools, Observable, I18n, FocusManager) {
|
25805
26442
|
var DOM = DOMUtils.DOM;
|
25806
26443
|
var explode = Tools.explode, each = Tools.each, extend = Tools.extend;
|
25807
|
-
var instanceCounter = 0, beforeUnloadDelegate;
|
26444
|
+
var instanceCounter = 0, beforeUnloadDelegate, EditorManager;
|
26445
|
+
|
26446
|
+
function removeEditorFromList(editor) {
|
26447
|
+
var editors = EditorManager.editors, removedFromList;
|
26448
|
+
|
26449
|
+
delete editors[editor.id];
|
26450
|
+
|
26451
|
+
for (var i = 0; i < editors.length; i++) {
|
26452
|
+
if (editors[i] == editor) {
|
26453
|
+
editors.splice(i, 1);
|
26454
|
+
removedFromList = true;
|
26455
|
+
break;
|
26456
|
+
}
|
26457
|
+
}
|
26458
|
+
|
26459
|
+
// Select another editor since the active one was removed
|
26460
|
+
if (EditorManager.activeEditor == editor) {
|
26461
|
+
EditorManager.activeEditor = editors[0];
|
26462
|
+
}
|
26463
|
+
|
26464
|
+
// Clear focusedEditor if necessary, so that we don't try to blur the destroyed editor
|
26465
|
+
if (EditorManager.focusedEditor == editor) {
|
26466
|
+
EditorManager.focusedEditor = null;
|
26467
|
+
}
|
26468
|
+
|
26469
|
+
return removedFromList;
|
26470
|
+
}
|
26471
|
+
|
26472
|
+
function purgeDestroyedEditor(editor) {
|
26473
|
+
// User has manually destroyed the editor lets clean up the mess
|
26474
|
+
if (editor && !(editor.getContainer() || editor.getBody()).parentNode) {
|
26475
|
+
removeEditorFromList(editor);
|
26476
|
+
editor.destroy(true);
|
26477
|
+
editor = null;
|
26478
|
+
}
|
26479
|
+
|
26480
|
+
return editor;
|
26481
|
+
}
|
25808
26482
|
|
25809
|
-
|
26483
|
+
EditorManager = {
|
25810
26484
|
/**
|
25811
26485
|
* Major version of TinyMCE build.
|
25812
26486
|
*
|
@@ -25821,7 +26495,7 @@ define("tinymce/EditorManager", [
|
|
25821
26495
|
* @property minorVersion
|
25822
26496
|
* @type String
|
25823
26497
|
*/
|
25824
|
-
minorVersion : '0.
|
26498
|
+
minorVersion : '0.26',
|
25825
26499
|
|
25826
26500
|
/**
|
25827
26501
|
* Release date of TinyMCE build.
|
@@ -25829,7 +26503,7 @@ define("tinymce/EditorManager", [
|
|
25829
26503
|
* @property releaseDate
|
25830
26504
|
* @type String
|
25831
26505
|
*/
|
25832
|
-
releaseDate: '2014-
|
26506
|
+
releaseDate: '2014-05-06',
|
25833
26507
|
|
25834
26508
|
/**
|
25835
26509
|
* Collection of editor instances.
|
@@ -25862,7 +26536,7 @@ define("tinymce/EditorManager", [
|
|
25862
26536
|
activeEditor: null,
|
25863
26537
|
|
25864
26538
|
setup: function() {
|
25865
|
-
var self = this, baseURL, documentBaseURL, suffix = "", preInit;
|
26539
|
+
var self = this, baseURL, documentBaseURL, suffix = "", preInit, src;
|
25866
26540
|
|
25867
26541
|
// Get base URL for the current document
|
25868
26542
|
documentBaseURL = document.location.href.replace(/[\?#].*$/, '').replace(/[\/\\][^\/]+$/, '');
|
@@ -25879,7 +26553,7 @@ define("tinymce/EditorManager", [
|
|
25879
26553
|
// Get base where the tinymce script is located
|
25880
26554
|
var scripts = document.getElementsByTagName('script');
|
25881
26555
|
for (var i = 0; i < scripts.length; i++) {
|
25882
|
-
|
26556
|
+
src = scripts[i].src;
|
25883
26557
|
|
25884
26558
|
// Script types supported:
|
25885
26559
|
// tinymce.js tinymce.min.js tinymce.dev.js
|
@@ -25894,6 +26568,18 @@ define("tinymce/EditorManager", [
|
|
25894
26568
|
break;
|
25895
26569
|
}
|
25896
26570
|
}
|
26571
|
+
|
26572
|
+
// We didn't find any baseURL by looking at the script elements
|
26573
|
+
// Try to use the document.currentScript as a fallback
|
26574
|
+
if (!baseURL && document.currentScript) {
|
26575
|
+
src = document.currentScript.src;
|
26576
|
+
|
26577
|
+
if (src.indexOf('.min') != -1) {
|
26578
|
+
suffix = '.min';
|
26579
|
+
}
|
26580
|
+
|
26581
|
+
baseURL = src.substring(0, src.lastIndexOf('/'));
|
26582
|
+
}
|
25897
26583
|
}
|
25898
26584
|
|
25899
26585
|
/**
|
@@ -25970,6 +26656,14 @@ define("tinymce/EditorManager", [
|
|
25970
26656
|
return id;
|
25971
26657
|
}
|
25972
26658
|
|
26659
|
+
function createEditor(id, settings) {
|
26660
|
+
if (!purgeDestroyedEditor(self.get(id))) {
|
26661
|
+
var editor = new Editor(id, settings, self);
|
26662
|
+
editors.push(editor);
|
26663
|
+
editor.render();
|
26664
|
+
}
|
26665
|
+
}
|
26666
|
+
|
25973
26667
|
function execCallback(se, n, s) {
|
25974
26668
|
var f = se[n];
|
25975
26669
|
|
@@ -25995,9 +26689,7 @@ define("tinymce/EditorManager", [
|
|
25995
26689
|
// Process type specific selector
|
25996
26690
|
each(settings.types, function(type) {
|
25997
26691
|
each(DOM.select(type.selector), function(elm) {
|
25998
|
-
|
25999
|
-
editors.push(editor);
|
26000
|
-
editor.render(1);
|
26692
|
+
createEditor(createId(elm), extend({}, settings, type));
|
26001
26693
|
});
|
26002
26694
|
});
|
26003
26695
|
|
@@ -26005,9 +26697,7 @@ define("tinymce/EditorManager", [
|
|
26005
26697
|
} else if (settings.selector) {
|
26006
26698
|
// Process global selector
|
26007
26699
|
each(DOM.select(settings.selector), function(elm) {
|
26008
|
-
|
26009
|
-
editors.push(editor);
|
26010
|
-
editor.render(1);
|
26700
|
+
createEditor(createId(elm), settings);
|
26011
26701
|
});
|
26012
26702
|
|
26013
26703
|
return;
|
@@ -26018,22 +26708,19 @@ define("tinymce/EditorManager", [
|
|
26018
26708
|
case "exact":
|
26019
26709
|
l = settings.elements || '';
|
26020
26710
|
|
26021
|
-
if(l.length > 0) {
|
26711
|
+
if (l.length > 0) {
|
26022
26712
|
each(explode(l), function(v) {
|
26023
26713
|
if (DOM.get(v)) {
|
26024
26714
|
editor = new Editor(v, settings, self);
|
26025
26715
|
editors.push(editor);
|
26026
|
-
editor.render(
|
26716
|
+
editor.render();
|
26027
26717
|
} else {
|
26028
26718
|
each(document.forms, function(f) {
|
26029
26719
|
each(f.elements, function(e) {
|
26030
26720
|
if (e.name === v) {
|
26031
26721
|
v = 'mce_editor_' + instanceCounter++;
|
26032
26722
|
DOM.setAttrib(e, 'id', v);
|
26033
|
-
|
26034
|
-
editor = new Editor(v, settings, self);
|
26035
|
-
editors.push(editor);
|
26036
|
-
editor.render(1);
|
26723
|
+
createEditor(v, settings);
|
26037
26724
|
}
|
26038
26725
|
});
|
26039
26726
|
});
|
@@ -26050,9 +26737,7 @@ define("tinymce/EditorManager", [
|
|
26050
26737
|
}
|
26051
26738
|
|
26052
26739
|
if (!settings.editor_selector || hasClass(elm, settings.editor_selector)) {
|
26053
|
-
|
26054
|
-
editors.push(editor);
|
26055
|
-
editor.render(true);
|
26740
|
+
createEditor(createId(elm), settings);
|
26056
26741
|
}
|
26057
26742
|
});
|
26058
26743
|
break;
|
@@ -26110,11 +26795,11 @@ define("tinymce/EditorManager", [
|
|
26110
26795
|
* });
|
26111
26796
|
*/
|
26112
26797
|
get: function(id) {
|
26113
|
-
if (
|
26798
|
+
if (!arguments.length) {
|
26114
26799
|
return this.editors;
|
26115
26800
|
}
|
26116
26801
|
|
26117
|
-
return this.editors[id];
|
26802
|
+
return id in this.editors ? this.editors[id] : null;
|
26118
26803
|
},
|
26119
26804
|
|
26120
26805
|
/**
|
@@ -26185,7 +26870,7 @@ define("tinymce/EditorManager", [
|
|
26185
26870
|
* @return {tinymce.Editor} The editor that got passed in will be return if it was found otherwise null.
|
26186
26871
|
*/
|
26187
26872
|
remove: function(selector) {
|
26188
|
-
var self = this, i, editors = self.editors, editor
|
26873
|
+
var self = this, i, editors = self.editors, editor;
|
26189
26874
|
|
26190
26875
|
// Remove all editors
|
26191
26876
|
if (!selector) {
|
@@ -26215,28 +26900,13 @@ define("tinymce/EditorManager", [
|
|
26215
26900
|
return null;
|
26216
26901
|
}
|
26217
26902
|
|
26218
|
-
delete editors[editor.id];
|
26219
|
-
|
26220
|
-
for (i = 0; i < editors.length; i++) {
|
26221
|
-
if (editors[i] == editor) {
|
26222
|
-
editors.splice(i, 1);
|
26223
|
-
removedFromList = true;
|
26224
|
-
break;
|
26225
|
-
}
|
26226
|
-
}
|
26227
|
-
|
26228
|
-
// Select another editor since the active one was removed
|
26229
|
-
if (self.activeEditor == editor) {
|
26230
|
-
self.activeEditor = editors[0];
|
26231
|
-
}
|
26232
|
-
|
26233
26903
|
/**
|
26234
26904
|
* Fires when an editor is removed from EditorManager collection.
|
26235
26905
|
*
|
26236
26906
|
* @event RemoveEditor
|
26237
26907
|
* @param {Object} e Event arguments.
|
26238
26908
|
*/
|
26239
|
-
if (
|
26909
|
+
if (removeEditorFromList(editor)) {
|
26240
26910
|
self.fire('RemoveEditor', {editor: editor});
|
26241
26911
|
}
|
26242
26912
|
|
@@ -27391,6 +28061,7 @@ define("tinymce/ui/Widget", [
|
|
27391
28061
|
var self = this;
|
27392
28062
|
|
27393
28063
|
self._super(settings);
|
28064
|
+
settings = self.settings;
|
27394
28065
|
self.canFocus = true;
|
27395
28066
|
|
27396
28067
|
if (settings.tooltip && Widget.tooltips !== false) {
|
@@ -27625,6 +28296,26 @@ define("tinymce/ui/Button", [
|
|
27625
28296
|
this._super();
|
27626
28297
|
},
|
27627
28298
|
|
28299
|
+
/**
|
28300
|
+
* Sets/gets the current button text.
|
28301
|
+
*
|
28302
|
+
* @method text
|
28303
|
+
* @param {String} [text] New button text.
|
28304
|
+
* @return {String|tinymce.ui.Button} Current text or current Button instance.
|
28305
|
+
*/
|
28306
|
+
text: function(text) {
|
28307
|
+
var self = this;
|
28308
|
+
|
28309
|
+
if (self._rendered) {
|
28310
|
+
var textNode = self.getEl().lastChild.lastChild;
|
28311
|
+
if (textNode) {
|
28312
|
+
textNode.data = self.translate(text);
|
28313
|
+
}
|
28314
|
+
}
|
28315
|
+
|
28316
|
+
return self._super(text);
|
28317
|
+
},
|
28318
|
+
|
27628
28319
|
/**
|
27629
28320
|
* Renders the control as a HTML string.
|
27630
28321
|
*
|
@@ -27633,11 +28324,20 @@ define("tinymce/ui/Button", [
|
|
27633
28324
|
*/
|
27634
28325
|
renderHtml: function() {
|
27635
28326
|
var self = this, id = self._id, prefix = self.classPrefix;
|
27636
|
-
var icon = self.settings.icon, image
|
28327
|
+
var icon = self.settings.icon, image;
|
27637
28328
|
|
27638
|
-
|
28329
|
+
image = self.settings.image;
|
28330
|
+
if (image) {
|
27639
28331
|
icon = 'none';
|
27640
|
-
|
28332
|
+
|
28333
|
+
// Support for [high dpi, low dpi] image sources
|
28334
|
+
if (typeof image != "string") {
|
28335
|
+
image = window.getSelection ? image[0] : image[1];
|
28336
|
+
}
|
28337
|
+
|
28338
|
+
image = ' style="background-image: url(\'' + image + '\')"';
|
28339
|
+
} else {
|
28340
|
+
image = '';
|
27641
28341
|
}
|
27642
28342
|
|
27643
28343
|
icon = self.settings.icon ? prefix + 'ico ' + prefix + 'i-' + icon : '';
|
@@ -28020,12 +28720,12 @@ define("tinymce/ui/ColorButton", [
|
|
28020
28720
|
|
28021
28721
|
return (
|
28022
28722
|
'<div id="' + id + '" class="' + self.classes() + '" role="button" tabindex="-1" aria-haspopup="true">' +
|
28023
|
-
'<button role="presentation" hidefocus type="button" tabindex="-1">' +
|
28723
|
+
'<button role="presentation" hidefocus="1" type="button" tabindex="-1">' +
|
28024
28724
|
(icon ? '<i class="' + icon + '"' + image + '></i>' : '') +
|
28025
28725
|
'<span id="' + id + '-preview" class="' + prefix + 'preview"></span>' +
|
28026
28726
|
(self._text ? (icon ? ' ' : '') + (self._text) : '') +
|
28027
28727
|
'</button>' +
|
28028
|
-
'<button type="button" class="' + prefix + 'open" hidefocus tabindex="-1">' +
|
28728
|
+
'<button type="button" class="' + prefix + 'open" hidefocus="1" tabindex="-1">' +
|
28029
28729
|
' <i class="' + prefix + 'caret"></i>' +
|
28030
28730
|
'</button>' +
|
28031
28731
|
'</div>'
|
@@ -28207,7 +28907,7 @@ define("tinymce/ui/ComboBox", [
|
|
28207
28907
|
});
|
28208
28908
|
|
28209
28909
|
self.on('focusin', function(e) {
|
28210
|
-
if (e.target.tagName == 'INPUT') {
|
28910
|
+
if (e.target.tagName.toUpperCase() == 'INPUT') {
|
28211
28911
|
self.menu.hide();
|
28212
28912
|
}
|
28213
28913
|
});
|
@@ -28373,7 +29073,7 @@ define("tinymce/ui/ComboBox", [
|
|
28373
29073
|
if (icon || text) {
|
28374
29074
|
openBtnHtml = (
|
28375
29075
|
'<div id="' + id + '-open" class="' + prefix + 'btn ' + prefix + 'open" tabIndex="-1" role="button">' +
|
28376
|
-
'<button id="' + id + '-action" type="button" hidefocus tabindex="-1">' +
|
29076
|
+
'<button id="' + id + '-action" type="button" hidefocus="1" tabindex="-1">' +
|
28377
29077
|
(icon != 'caret' ? '<i class="' + icon + '"></i>' : '<i class="' + prefix + 'caret"></i>') +
|
28378
29078
|
(text ? (icon ? ' ' : '') + text : '') +
|
28379
29079
|
'</button>' +
|
@@ -28386,7 +29086,7 @@ define("tinymce/ui/ComboBox", [
|
|
28386
29086
|
return (
|
28387
29087
|
'<div id="' + id + '" class="' + self.classes() + '">' +
|
28388
29088
|
'<input id="' + id + '-inp" class="' + prefix + 'textbox ' + prefix + 'placeholder" value="' +
|
28389
|
-
value + '" hidefocus="
|
29089
|
+
value + '" hidefocus="1"' + extraAttrs + ' />' +
|
28390
29090
|
openBtnHtml +
|
28391
29091
|
'</div>'
|
28392
29092
|
);
|
@@ -28529,7 +29229,7 @@ define("tinymce/ui/Path", [
|
|
28529
29229
|
}
|
28530
29230
|
|
28531
29231
|
if (!html) {
|
28532
|
-
html = '<div class="' + prefix + 'path-item"
|
29232
|
+
html = '<div class="' + prefix + 'path-item">\u00a0</div>';
|
28533
29233
|
}
|
28534
29234
|
|
28535
29235
|
return html;
|
@@ -28670,7 +29370,7 @@ define("tinymce/ui/FormItem", [
|
|
28670
29370
|
layout.preRender(self);
|
28671
29371
|
|
28672
29372
|
return (
|
28673
|
-
'<div id="' + self._id + '" class="' + self.classes() + '"
|
29373
|
+
'<div id="' + self._id + '" class="' + self.classes() + '" hidefocus="1" tabindex="-1">' +
|
28674
29374
|
(self.settings.title ? ('<div id="' + self._id + '-title" class="' + prefix + 'title">' +
|
28675
29375
|
self.settings.title + '</div>') : '') +
|
28676
29376
|
'<div id="' + self._id + '-body" class="' + self.classes('body') + '">' +
|
@@ -28889,7 +29589,7 @@ define("tinymce/ui/FieldSet", [
|
|
28889
29589
|
layout.preRender(self);
|
28890
29590
|
|
28891
29591
|
return (
|
28892
|
-
'<fieldset id="' + self._id + '" class="' + self.classes() + '"
|
29592
|
+
'<fieldset id="' + self._id + '" class="' + self.classes() + '" hidefocus="1" tabindex="-1">' +
|
28893
29593
|
(self.settings.title ? ('<legend id="' + self._id + '-title" class="' + prefix + 'fieldset-title">' +
|
28894
29594
|
self.settings.title + '</legend>') : '') +
|
28895
29595
|
'<div id="' + self._id + '-body" class="' + self.classes('body') + '">' +
|
@@ -29347,127 +30047,6 @@ define("tinymce/ui/FormatControls", [
|
|
29347
30047
|
function registerControls(editor) {
|
29348
30048
|
var formatMenu;
|
29349
30049
|
|
29350
|
-
// Generates a preview for a format
|
29351
|
-
function getPreviewCss(format) {
|
29352
|
-
var name, previewElm, dom = editor.dom;
|
29353
|
-
var previewCss = '', parentFontSize, previewStyles;
|
29354
|
-
|
29355
|
-
previewStyles = editor.settings.preview_styles;
|
29356
|
-
|
29357
|
-
// No preview forced
|
29358
|
-
if (previewStyles === false) {
|
29359
|
-
return '';
|
29360
|
-
}
|
29361
|
-
|
29362
|
-
// Default preview
|
29363
|
-
if (!previewStyles) {
|
29364
|
-
previewStyles = 'font-family font-size font-weight font-style text-decoration ' +
|
29365
|
-
'text-transform color background-color border border-radius outline text-shadow';
|
29366
|
-
}
|
29367
|
-
|
29368
|
-
// Removes any variables since these can't be previewed
|
29369
|
-
function removeVars(val) {
|
29370
|
-
return val.replace(/%(\w+)/g, '');
|
29371
|
-
}
|
29372
|
-
|
29373
|
-
// Create block/inline element to use for preview
|
29374
|
-
format = editor.formatter.get(format);
|
29375
|
-
if (!format) {
|
29376
|
-
return;
|
29377
|
-
}
|
29378
|
-
|
29379
|
-
format = format[0];
|
29380
|
-
name = format.block || format.inline || 'span';
|
29381
|
-
previewElm = dom.create(name);
|
29382
|
-
|
29383
|
-
// Add format styles to preview element
|
29384
|
-
each(format.styles, function(value, name) {
|
29385
|
-
value = removeVars(value);
|
29386
|
-
|
29387
|
-
if (value) {
|
29388
|
-
dom.setStyle(previewElm, name, value);
|
29389
|
-
}
|
29390
|
-
});
|
29391
|
-
|
29392
|
-
// Add attributes to preview element
|
29393
|
-
each(format.attributes, function(value, name) {
|
29394
|
-
value = removeVars(value);
|
29395
|
-
|
29396
|
-
if (value) {
|
29397
|
-
dom.setAttrib(previewElm, name, value);
|
29398
|
-
}
|
29399
|
-
});
|
29400
|
-
|
29401
|
-
// Add classes to preview element
|
29402
|
-
each(format.classes, function(value) {
|
29403
|
-
value = removeVars(value);
|
29404
|
-
|
29405
|
-
if (!dom.hasClass(previewElm, value)) {
|
29406
|
-
dom.addClass(previewElm, value);
|
29407
|
-
}
|
29408
|
-
});
|
29409
|
-
|
29410
|
-
editor.fire('PreviewFormats');
|
29411
|
-
|
29412
|
-
// Add the previewElm outside the visual area
|
29413
|
-
dom.setStyles(previewElm, {position: 'absolute', left: -0xFFFF});
|
29414
|
-
editor.getBody().appendChild(previewElm);
|
29415
|
-
|
29416
|
-
// Get parent container font size so we can compute px values out of em/% for older IE:s
|
29417
|
-
parentFontSize = dom.getStyle(editor.getBody(), 'fontSize', true);
|
29418
|
-
parentFontSize = /px$/.test(parentFontSize) ? parseInt(parentFontSize, 10) : 0;
|
29419
|
-
|
29420
|
-
each(previewStyles.split(' '), function(name) {
|
29421
|
-
var value = dom.getStyle(previewElm, name, true);
|
29422
|
-
|
29423
|
-
// If background is transparent then check if the body has a background color we can use
|
29424
|
-
if (name == 'background-color' && /transparent|rgba\s*\([^)]+,\s*0\)/.test(value)) {
|
29425
|
-
value = dom.getStyle(editor.getBody(), name, true);
|
29426
|
-
|
29427
|
-
// Ignore white since it's the default color, not the nicest fix
|
29428
|
-
// TODO: Fix this by detecting runtime style
|
29429
|
-
if (dom.toHex(value).toLowerCase() == '#ffffff') {
|
29430
|
-
return;
|
29431
|
-
}
|
29432
|
-
}
|
29433
|
-
|
29434
|
-
if (name == 'color') {
|
29435
|
-
// Ignore black since it's the default color, not the nicest fix
|
29436
|
-
// TODO: Fix this by detecting runtime style
|
29437
|
-
if (dom.toHex(value).toLowerCase() == '#000000') {
|
29438
|
-
return;
|
29439
|
-
}
|
29440
|
-
}
|
29441
|
-
|
29442
|
-
// Old IE won't calculate the font size so we need to do that manually
|
29443
|
-
if (name == 'font-size') {
|
29444
|
-
if (/em|%$/.test(value)) {
|
29445
|
-
if (parentFontSize === 0) {
|
29446
|
-
return;
|
29447
|
-
}
|
29448
|
-
|
29449
|
-
// Convert font size from em/% to px
|
29450
|
-
value = parseFloat(value, 10) / (/%$/.test(value) ? 100 : 1);
|
29451
|
-
value = (value * parentFontSize) + 'px';
|
29452
|
-
}
|
29453
|
-
}
|
29454
|
-
|
29455
|
-
if (name == "border" && value) {
|
29456
|
-
previewCss += 'padding:0 2px;';
|
29457
|
-
}
|
29458
|
-
|
29459
|
-
previewCss += name + ':' + value + ';';
|
29460
|
-
});
|
29461
|
-
|
29462
|
-
editor.fire('AfterPreviewFormats');
|
29463
|
-
|
29464
|
-
//previewCss += 'line-height:normal';
|
29465
|
-
|
29466
|
-
dom.remove(previewElm);
|
29467
|
-
|
29468
|
-
return previewCss;
|
29469
|
-
}
|
29470
|
-
|
29471
30050
|
function createListBoxChangeHandler(items, formatName) {
|
29472
30051
|
return function() {
|
29473
30052
|
var self = this;
|
@@ -29504,7 +30083,7 @@ define("tinymce/ui/FormatControls", [
|
|
29504
30083
|
}
|
29505
30084
|
|
29506
30085
|
function createFormats(formats) {
|
29507
|
-
formats = formats.split(';');
|
30086
|
+
formats = formats.replace(/;$/, '').split(';');
|
29508
30087
|
|
29509
30088
|
var i = formats.length;
|
29510
30089
|
while (i--) {
|
@@ -29518,13 +30097,13 @@ define("tinymce/ui/FormatControls", [
|
|
29518
30097
|
var count = 0, newFormats = [];
|
29519
30098
|
|
29520
30099
|
var defaultStyleFormats = [
|
29521
|
-
{title: '
|
29522
|
-
{title: '
|
29523
|
-
{title: '
|
29524
|
-
{title: '
|
29525
|
-
{title: '
|
29526
|
-
{title: '
|
29527
|
-
{title: '
|
30100
|
+
{title: 'Headings', items: [
|
30101
|
+
{title: 'Heading 1', format: 'h1'},
|
30102
|
+
{title: 'Heading 2', format: 'h2'},
|
30103
|
+
{title: 'Heading 3', format: 'h3'},
|
30104
|
+
{title: 'Heading 4', format: 'h4'},
|
30105
|
+
{title: 'Heading 5', format: 'h5'},
|
30106
|
+
{title: 'Heading 6', format: 'h6'}
|
29528
30107
|
]},
|
29529
30108
|
|
29530
30109
|
{title: 'Inline', items: [
|
@@ -29617,7 +30196,7 @@ define("tinymce/ui/FormatControls", [
|
|
29617
30196
|
|
29618
30197
|
textStyle: function() {
|
29619
30198
|
if (this.settings.format) {
|
29620
|
-
return
|
30199
|
+
return editor.formatter.getCssText(this.settings.format);
|
29621
30200
|
}
|
29622
30201
|
},
|
29623
30202
|
|
@@ -29854,12 +30433,12 @@ define("tinymce/ui/FormatControls", [
|
|
29854
30433
|
'Paragraph=p;' +
|
29855
30434
|
'Address=address;' +
|
29856
30435
|
'Pre=pre;' +
|
29857
|
-
'
|
29858
|
-
'
|
29859
|
-
'
|
29860
|
-
'
|
29861
|
-
'
|
29862
|
-
'
|
30436
|
+
'Heading 1=h1;' +
|
30437
|
+
'Heading 2=h2;' +
|
30438
|
+
'Heading 3=h3;' +
|
30439
|
+
'Heading 4=h4;' +
|
30440
|
+
'Heading 5=h5;' +
|
30441
|
+
'Heading 6=h6'
|
29863
30442
|
);
|
29864
30443
|
|
29865
30444
|
each(blocks, function(block) {
|
@@ -29867,7 +30446,7 @@ define("tinymce/ui/FormatControls", [
|
|
29867
30446
|
text: block[0],
|
29868
30447
|
value: block[1],
|
29869
30448
|
textStyle: function() {
|
29870
|
-
return
|
30449
|
+
return editor.formatter.getCssText(block[1]);
|
29871
30450
|
}
|
29872
30451
|
});
|
29873
30452
|
});
|
@@ -30227,6 +30806,7 @@ define("tinymce/ui/Iframe", [
|
|
30227
30806
|
self.addClass('iframe');
|
30228
30807
|
self.canFocus = false;
|
30229
30808
|
|
30809
|
+
/*eslint no-script-url:0 */
|
30230
30810
|
return (
|
30231
30811
|
'<iframe id="' + self._id + '" class="' + self.classes() + '" tabindex="-1" src="' +
|
30232
30812
|
(self.settings.url || "javascript:\'\'") + '" frameborder="0"></iframe>'
|
@@ -30948,7 +31528,7 @@ define("tinymce/ui/MenuItem", [
|
|
30948
31528
|
e.preventDefault();
|
30949
31529
|
});
|
30950
31530
|
|
30951
|
-
if (settings.menu) {
|
31531
|
+
if (settings.menu && !settings.ariaHideMenu) {
|
30952
31532
|
self.aria('haspopup', true);
|
30953
31533
|
}
|
30954
31534
|
},
|
@@ -31092,7 +31672,7 @@ define("tinymce/ui/MenuItem", [
|
|
31092
31672
|
|
31093
31673
|
return (
|
31094
31674
|
'<div id="' + id + '" class="' + self.classes() + '" tabindex="-1">' +
|
31095
|
-
(text !== '-' ? '<i class="' + icon + '"' + image + '></i
|
31675
|
+
(text !== '-' ? '<i class="' + icon + '"' + image + '></i>\u00a0' : '') +
|
31096
31676
|
(text !== '-' ? '<span id="' + id + '-text" class="' + prefix + 'text">' + text + '</span>' : '') +
|
31097
31677
|
(shortcut ? '<div id="' + id + '-shortcut" class="' + prefix + 'menu-shortcut">' + shortcut + '</div>' : '') +
|
31098
31678
|
(settings.menu ? '<div class="' + prefix + 'caret"></div>' : '') +
|
@@ -31546,11 +32126,11 @@ define("tinymce/ui/SplitButton", [
|
|
31546
32126
|
|
31547
32127
|
return (
|
31548
32128
|
'<div id="' + id + '" class="' + self.classes() + '" role="button" tabindex="-1">' +
|
31549
|
-
'<button type="button" hidefocus tabindex="-1">' +
|
32129
|
+
'<button type="button" hidefocus="1" tabindex="-1">' +
|
31550
32130
|
(icon ? '<i class="' + icon + '"></i>' : '') +
|
31551
32131
|
(self._text ? (icon ? ' ' : '') + self._text : '') +
|
31552
32132
|
'</button>' +
|
31553
|
-
'<button type="button" class="' + prefix + 'open" hidefocus tabindex="-1">' +
|
32133
|
+
'<button type="button" class="' + prefix + 'open" hidefocus="1" tabindex="-1">' +
|
31554
32134
|
//(icon ? '<i class="' + icon + '"></i>' : '') +
|
31555
32135
|
(self._menuBtnText ? (icon ? '\u00a0' : '') + self._menuBtnText : '') +
|
31556
32136
|
' <i class="' + prefix + 'caret"></i>' +
|
@@ -31718,7 +32298,7 @@ define("tinymce/ui/TabPanel", [
|
|
31718
32298
|
});
|
31719
32299
|
|
31720
32300
|
return (
|
31721
|
-
'<div id="' + self._id + '" class="' + self.classes() + '"
|
32301
|
+
'<div id="' + self._id + '" class="' + self.classes() + '" hidefocus="1" tabindex="-1">' +
|
31722
32302
|
'<div id="' + self._id + '-head" class="' + prefix + 'tabs" role="tablist">' +
|
31723
32303
|
tabsHtml +
|
31724
32304
|
'</div>' +
|
@@ -31994,12 +32574,12 @@ define("tinymce/ui/TextBox", [
|
|
31994
32574
|
return (
|
31995
32575
|
'<textarea id="' + id + '" class="' + self.classes() + '" ' +
|
31996
32576
|
(settings.rows ? ' rows="' + settings.rows + '"' : '') +
|
31997
|
-
' hidefocus="
|
32577
|
+
' hidefocus="1"' + extraAttrs + '>' + value +
|
31998
32578
|
'</textarea>'
|
31999
32579
|
);
|
32000
32580
|
}
|
32001
32581
|
|
32002
|
-
return '<input id="' + id + '" class="' + self.classes() + '" value="' + value + '" hidefocus="
|
32582
|
+
return '<input id="' + id + '" class="' + self.classes() + '" value="' + value + '" hidefocus="1"' + extraAttrs + ' />';
|
32003
32583
|
},
|
32004
32584
|
|
32005
32585
|
/**
|
@@ -32043,8 +32623,9 @@ define("tinymce/ui/TextBox", [
|
|
32043
32623
|
* @class tinymce.ui.Throbber
|
32044
32624
|
*/
|
32045
32625
|
define("tinymce/ui/Throbber", [
|
32046
|
-
"tinymce/ui/DomUtils"
|
32047
|
-
|
32626
|
+
"tinymce/ui/DomUtils",
|
32627
|
+
"tinymce/ui/Control"
|
32628
|
+
], function(DomUtils, Control) {
|
32048
32629
|
"use strict";
|
32049
32630
|
|
32050
32631
|
/**
|
@@ -32052,9 +32633,10 @@ define("tinymce/ui/Throbber", [
|
|
32052
32633
|
*
|
32053
32634
|
* @constructor
|
32054
32635
|
* @param {Element} elm DOM Html element to display throbber in.
|
32636
|
+
* @param {Boolean} inline Optional true/false state if the throbber should be appended to end of element for infinite scroll.
|
32055
32637
|
*/
|
32056
|
-
return function(elm) {
|
32057
|
-
var self = this, state;
|
32638
|
+
return function(elm, inline) {
|
32639
|
+
var self = this, state, classPrefix = Control.classPrefix;
|
32058
32640
|
|
32059
32641
|
/**
|
32060
32642
|
* Shows the throbber.
|
@@ -32070,7 +32652,9 @@ define("tinymce/ui/Throbber", [
|
|
32070
32652
|
|
32071
32653
|
window.setTimeout(function() {
|
32072
32654
|
if (state) {
|
32073
|
-
elm.appendChild(DomUtils.createFragment(
|
32655
|
+
elm.appendChild(DomUtils.createFragment(
|
32656
|
+
'<div class="' + classPrefix + 'throbber' + (inline ? ' ' + classPrefix + 'throbber-inline' : '') + '"></div>'
|
32657
|
+
));
|
32074
32658
|
}
|
32075
32659
|
}, time || 0);
|
32076
32660
|
|
@@ -32097,5 +32681,5 @@ define("tinymce/ui/Throbber", [
|
|
32097
32681
|
};
|
32098
32682
|
});
|
32099
32683
|
|
32100
|
-
expose(["tinymce/dom/Sizzle","tinymce/html/Styles","tinymce/dom/EventUtils","tinymce/dom/TreeWalker","tinymce/util/Tools","tinymce/dom/Range","tinymce/html/Entities","tinymce/Env","tinymce/dom/StyleSheetLoader","tinymce/dom/DOMUtils","tinymce/dom/ScriptLoader","tinymce/AddOnManager","tinymce/html/Node","tinymce/html/Schema","tinymce/html/SaxParser","tinymce/html/DomParser","tinymce/html/Writer","tinymce/html/Serializer","tinymce/dom/Serializer","tinymce/dom/TridentSelection","tinymce/util/VK","tinymce/dom/ControlSelection","tinymce/dom/RangeUtils","tinymce/dom/Selection","tinymce/Formatter","tinymce/UndoManager","tinymce/EnterKey","tinymce/ForceBlocks","tinymce/EditorCommands","tinymce/util/URI","tinymce/util/Class","tinymce/ui/Selector","tinymce/ui/Collection","tinymce/ui/DomUtils","tinymce/ui/Control","tinymce/ui/Factory","tinymce/ui/KeyboardNavigation","tinymce/ui/Container","tinymce/ui/DragHelper","tinymce/ui/Scrollable","tinymce/ui/Panel","tinymce/ui/Movable","tinymce/ui/Resizable","tinymce/ui/FloatPanel","tinymce/ui/Window","tinymce/ui/MessageBox","tinymce/WindowManager","tinymce/util/Quirks","tinymce/util/Observable","tinymce/Shortcuts","tinymce/Editor","tinymce/util/I18n","tinymce/FocusManager","tinymce/EditorManager","tinymce/LegacyInput","tinymce/util/XHR","tinymce/util/JSON","tinymce/util/JSONRequest","tinymce/util/JSONP","tinymce/util/LocalStorage","tinymce/Compat","tinymce/ui/Layout","tinymce/ui/AbsoluteLayout","tinymce/ui/Tooltip","tinymce/ui/Widget","tinymce/ui/Button","tinymce/ui/ButtonGroup","tinymce/ui/Checkbox","tinymce/ui/PanelButton","tinymce/ui/ColorButton","tinymce/ui/ComboBox","tinymce/ui/Path","tinymce/ui/ElementPath","tinymce/ui/FormItem","tinymce/ui/Form","tinymce/ui/FieldSet","tinymce/ui/FilePicker","tinymce/ui/FitLayout","tinymce/ui/FlexLayout","tinymce/ui/FlowLayout","tinymce/ui/FormatControls","tinymce/ui/GridLayout","tinymce/ui/Iframe","tinymce/ui/Label","tinymce/ui/Toolbar","tinymce/ui/MenuBar","tinymce/ui/MenuButton","tinymce/ui/ListBox","tinymce/ui/MenuItem","tinymce/ui/Menu","tinymce/ui/Radio","tinymce/ui/ResizeHandle","tinymce/ui/Spacer","tinymce/ui/SplitButton","tinymce/ui/StackLayout","tinymce/ui/TabPanel","tinymce/ui/TextBox","tinymce/ui/Throbber"]);
|
32684
|
+
expose(["tinymce/dom/Sizzle","tinymce/html/Styles","tinymce/dom/EventUtils","tinymce/dom/TreeWalker","tinymce/util/Tools","tinymce/dom/Range","tinymce/html/Entities","tinymce/Env","tinymce/dom/StyleSheetLoader","tinymce/dom/DOMUtils","tinymce/dom/ScriptLoader","tinymce/AddOnManager","tinymce/html/Node","tinymce/html/Schema","tinymce/html/SaxParser","tinymce/html/DomParser","tinymce/html/Writer","tinymce/html/Serializer","tinymce/dom/Serializer","tinymce/dom/TridentSelection","tinymce/util/VK","tinymce/dom/ControlSelection","tinymce/dom/RangeUtils","tinymce/dom/Selection","tinymce/fmt/Preview","tinymce/Formatter","tinymce/UndoManager","tinymce/EnterKey","tinymce/ForceBlocks","tinymce/EditorCommands","tinymce/util/URI","tinymce/util/Class","tinymce/util/EventDispatcher","tinymce/ui/Selector","tinymce/ui/Collection","tinymce/ui/DomUtils","tinymce/ui/Control","tinymce/ui/Factory","tinymce/ui/KeyboardNavigation","tinymce/ui/Container","tinymce/ui/DragHelper","tinymce/ui/Scrollable","tinymce/ui/Panel","tinymce/ui/Movable","tinymce/ui/Resizable","tinymce/ui/FloatPanel","tinymce/ui/Window","tinymce/ui/MessageBox","tinymce/WindowManager","tinymce/util/Quirks","tinymce/util/Observable","tinymce/EditorObservable","tinymce/Shortcuts","tinymce/Editor","tinymce/util/I18n","tinymce/FocusManager","tinymce/EditorManager","tinymce/LegacyInput","tinymce/util/XHR","tinymce/util/JSON","tinymce/util/JSONRequest","tinymce/util/JSONP","tinymce/util/LocalStorage","tinymce/Compat","tinymce/ui/Layout","tinymce/ui/AbsoluteLayout","tinymce/ui/Tooltip","tinymce/ui/Widget","tinymce/ui/Button","tinymce/ui/ButtonGroup","tinymce/ui/Checkbox","tinymce/ui/PanelButton","tinymce/ui/ColorButton","tinymce/ui/ComboBox","tinymce/ui/Path","tinymce/ui/ElementPath","tinymce/ui/FormItem","tinymce/ui/Form","tinymce/ui/FieldSet","tinymce/ui/FilePicker","tinymce/ui/FitLayout","tinymce/ui/FlexLayout","tinymce/ui/FlowLayout","tinymce/ui/FormatControls","tinymce/ui/GridLayout","tinymce/ui/Iframe","tinymce/ui/Label","tinymce/ui/Toolbar","tinymce/ui/MenuBar","tinymce/ui/MenuButton","tinymce/ui/ListBox","tinymce/ui/MenuItem","tinymce/ui/Menu","tinymce/ui/Radio","tinymce/ui/ResizeHandle","tinymce/ui/Spacer","tinymce/ui/SplitButton","tinymce/ui/StackLayout","tinymce/ui/TabPanel","tinymce/ui/TextBox","tinymce/ui/Throbber"]);
|
32101
32685
|
})(this);
|