@dangl/angular-material-shared 2.9.0-beta0047 → 2.9.0-beta0048
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/tinymce-assets/icons/default/icons.js +9 -46
- package/tinymce-assets/icons/default/icons.min.js +1 -1
- package/tinymce-assets/models/dom/model.js +7239 -8193
- package/tinymce-assets/models/dom/model.min.js +1 -1
- package/tinymce-assets/plugins/accordion/plugin.js +879 -1174
- package/tinymce-assets/plugins/accordion/plugin.min.js +5 -1
- package/tinymce-assets/plugins/advlist/plugin.js +200 -412
- package/tinymce-assets/plugins/advlist/plugin.min.js +5 -1
- package/tinymce-assets/plugins/anchor/plugin.js +166 -189
- package/tinymce-assets/plugins/anchor/plugin.min.js +5 -1
- package/tinymce-assets/plugins/autolink/plugin.js +220 -310
- package/tinymce-assets/plugins/autolink/plugin.min.js +5 -1
- package/tinymce-assets/plugins/autoresize/plugin.js +149 -180
- package/tinymce-assets/plugins/autoresize/plugin.min.js +5 -1
- package/tinymce-assets/plugins/autosave/plugin.js +189 -208
- package/tinymce-assets/plugins/autosave/plugin.min.js +5 -1
- package/tinymce-assets/plugins/charmap/plugin.js +1566 -905
- package/tinymce-assets/plugins/charmap/plugin.min.js +5 -1
- package/tinymce-assets/plugins/code/plugin.js +61 -73
- package/tinymce-assets/plugins/code/plugin.min.js +4 -0
- package/tinymce-assets/plugins/codesample/plugin.js +2409 -3592
- package/tinymce-assets/plugins/codesample/plugin.min.js +12 -8
- package/tinymce-assets/plugins/directionality/plugin.js +304 -545
- package/tinymce-assets/plugins/directionality/plugin.min.js +5 -1
- package/tinymce-assets/plugins/emoticons/plugin.js +488 -702
- package/tinymce-assets/plugins/emoticons/plugin.min.js +5 -1
- package/tinymce-assets/plugins/fullscreen/plugin.js +1049 -1409
- package/tinymce-assets/plugins/fullscreen/plugin.min.js +5 -1
- package/tinymce-assets/plugins/help/js/i18n/keynav/ar.js +1 -4
- package/tinymce-assets/plugins/help/js/i18n/keynav/bg_BG.js +1 -4
- package/tinymce-assets/plugins/help/js/i18n/keynav/ca.js +1 -4
- package/tinymce-assets/plugins/help/js/i18n/keynav/cs.js +1 -4
- package/tinymce-assets/plugins/help/js/i18n/keynav/da.js +1 -4
- package/tinymce-assets/plugins/help/js/i18n/keynav/de.js +1 -4
- package/tinymce-assets/plugins/help/js/i18n/keynav/el.js +1 -4
- package/tinymce-assets/plugins/help/js/i18n/keynav/en.js +1 -4
- package/tinymce-assets/plugins/help/js/i18n/keynav/es.js +1 -4
- package/tinymce-assets/plugins/help/js/i18n/keynav/eu.js +1 -4
- package/tinymce-assets/plugins/help/js/i18n/keynav/fa.js +1 -4
- package/tinymce-assets/plugins/help/js/i18n/keynav/fi.js +1 -4
- package/tinymce-assets/plugins/help/js/i18n/keynav/fr_FR.js +1 -4
- package/tinymce-assets/plugins/help/js/i18n/keynav/he_IL.js +1 -4
- package/tinymce-assets/plugins/help/js/i18n/keynav/hi.js +1 -4
- package/tinymce-assets/plugins/help/js/i18n/keynav/hr.js +1 -4
- package/tinymce-assets/plugins/help/js/i18n/keynav/hu_HU.js +1 -4
- package/tinymce-assets/plugins/help/js/i18n/keynav/id.js +1 -4
- package/tinymce-assets/plugins/help/js/i18n/keynav/it.js +1 -4
- package/tinymce-assets/plugins/help/js/i18n/keynav/ja.js +1 -4
- package/tinymce-assets/plugins/help/js/i18n/keynav/kk.js +1 -4
- package/tinymce-assets/plugins/help/js/i18n/keynav/ko_KR.js +1 -4
- package/tinymce-assets/plugins/help/js/i18n/keynav/ms.js +1 -4
- package/tinymce-assets/plugins/help/js/i18n/keynav/nb_NO.js +1 -4
- package/tinymce-assets/plugins/help/js/i18n/keynav/nl.js +1 -4
- package/tinymce-assets/plugins/help/js/i18n/keynav/pl.js +1 -4
- package/tinymce-assets/plugins/help/js/i18n/keynav/pt_BR.js +1 -4
- package/tinymce-assets/plugins/help/js/i18n/keynav/pt_PT.js +1 -4
- package/tinymce-assets/plugins/help/js/i18n/keynav/ro.js +1 -4
- package/tinymce-assets/plugins/help/js/i18n/keynav/ru.js +1 -4
- package/tinymce-assets/plugins/help/js/i18n/keynav/sk.js +1 -4
- package/tinymce-assets/plugins/help/js/i18n/keynav/sl_SI.js +2 -5
- package/tinymce-assets/plugins/help/js/i18n/keynav/sv_SE.js +1 -4
- package/tinymce-assets/plugins/help/js/i18n/keynav/th_TH.js +1 -4
- package/tinymce-assets/plugins/help/js/i18n/keynav/tr.js +1 -4
- package/tinymce-assets/plugins/help/js/i18n/keynav/uk.js +1 -4
- package/tinymce-assets/plugins/help/js/i18n/keynav/vi.js +1 -4
- package/tinymce-assets/plugins/help/js/i18n/keynav/zh_CN.js +5 -8
- package/tinymce-assets/plugins/help/js/i18n/keynav/zh_TW.js +1 -4
- package/tinymce-assets/plugins/help/plugin.js +809 -739
- package/tinymce-assets/plugins/help/plugin.min.js +5 -1
- package/tinymce-assets/plugins/image/plugin.js +1291 -1475
- package/tinymce-assets/plugins/image/plugin.min.js +5 -1
- package/tinymce-assets/plugins/importcss/plugin.js +269 -328
- package/tinymce-assets/plugins/importcss/plugin.min.js +5 -1
- package/tinymce-assets/plugins/insertdatetime/plugin.js +141 -140
- package/tinymce-assets/plugins/insertdatetime/plugin.min.js +5 -1
- package/tinymce-assets/plugins/link/plugin.js +1084 -1419
- package/tinymce-assets/plugins/link/plugin.min.js +5 -1
- package/tinymce-assets/plugins/lists/plugin.js +1805 -2177
- package/tinymce-assets/plugins/lists/plugin.min.js +5 -1
- package/tinymce-assets/plugins/media/plugin.js +1047 -1305
- package/tinymce-assets/plugins/media/plugin.min.js +5 -1
- package/tinymce-assets/plugins/nonbreaking/plugin.js +88 -93
- package/tinymce-assets/plugins/nonbreaking/plugin.min.js +4 -0
- package/tinymce-assets/plugins/pagebreak/plugin.js +85 -91
- package/tinymce-assets/plugins/pagebreak/plugin.min.js +4 -0
- package/tinymce-assets/plugins/preview/plugin.js +74 -742
- package/tinymce-assets/plugins/preview/plugin.min.js +5 -1
- package/tinymce-assets/plugins/quickbars/plugin.js +375 -582
- package/tinymce-assets/plugins/quickbars/plugin.min.js +5 -1
- package/tinymce-assets/plugins/save/plugin.js +82 -100
- package/tinymce-assets/plugins/save/plugin.min.js +5 -1
- package/tinymce-assets/plugins/searchreplace/plugin.js +906 -1183
- package/tinymce-assets/plugins/searchreplace/plugin.min.js +5 -1
- package/tinymce-assets/plugins/table/plugin.js +3094 -3651
- package/tinymce-assets/plugins/table/plugin.min.js +5 -1
- package/tinymce-assets/plugins/template/index.js +7 -0
- package/tinymce-assets/plugins/template/plugin.js +567 -0
- package/tinymce-assets/plugins/template/plugin.min.js +5 -0
- package/tinymce-assets/plugins/visualblocks/plugin.js +63 -71
- package/tinymce-assets/plugins/visualblocks/plugin.min.js +5 -1
- package/tinymce-assets/plugins/visualchars/plugin.js +436 -685
- package/tinymce-assets/plugins/visualchars/plugin.min.js +5 -1
- package/tinymce-assets/plugins/wordcount/plugin.js +307 -382
- package/tinymce-assets/plugins/wordcount/plugin.min.js +5 -1
- package/tinymce-assets/skins/content/dark/content.css +4 -0
- package/tinymce-assets/skins/content/dark/content.js +6 -1
- package/tinymce-assets/skins/content/dark/content.min.css +4 -0
- package/tinymce-assets/skins/content/default/content.css +4 -0
- package/tinymce-assets/skins/content/default/content.js +6 -1
- package/tinymce-assets/skins/content/default/content.min.css +4 -0
- package/tinymce-assets/skins/content/document/content.css +4 -0
- package/tinymce-assets/skins/content/document/content.js +6 -1
- package/tinymce-assets/skins/content/document/content.min.css +4 -0
- package/tinymce-assets/skins/content/tinymce-5/content.css +4 -0
- package/tinymce-assets/skins/content/tinymce-5/content.js +6 -1
- package/tinymce-assets/skins/content/tinymce-5/content.min.css +4 -0
- package/tinymce-assets/skins/content/tinymce-5-dark/content.css +4 -0
- package/tinymce-assets/skins/content/tinymce-5-dark/content.js +6 -1
- package/tinymce-assets/skins/content/tinymce-5-dark/content.min.css +4 -0
- package/tinymce-assets/skins/content/writer/content.css +4 -0
- package/tinymce-assets/skins/content/writer/content.js +6 -1
- package/tinymce-assets/skins/content/writer/content.min.css +4 -0
- package/tinymce-assets/skins/ui/oxide/content.css +53 -148
- package/tinymce-assets/skins/ui/oxide/content.inline.css +53 -148
- package/tinymce-assets/skins/ui/oxide/content.inline.js +6 -1
- package/tinymce-assets/skins/ui/oxide/content.inline.min.css +5 -1
- package/tinymce-assets/skins/ui/oxide/content.js +6 -1
- package/tinymce-assets/skins/ui/oxide/content.min.css +5 -1
- package/tinymce-assets/skins/ui/oxide/skin.css +207 -1585
- package/tinymce-assets/skins/ui/oxide/skin.js +2 -1
- package/tinymce-assets/skins/ui/oxide/skin.min.css +1 -1
- package/tinymce-assets/skins/ui/oxide/skin.shadowdom.js +2 -1
- package/tinymce-assets/skins/ui/oxide-dark/content.css +46 -148
- package/tinymce-assets/skins/ui/oxide-dark/content.inline.css +53 -148
- package/tinymce-assets/skins/ui/oxide-dark/content.inline.js +6 -1
- package/tinymce-assets/skins/ui/oxide-dark/content.inline.min.css +5 -1
- package/tinymce-assets/skins/ui/oxide-dark/content.js +6 -1
- package/tinymce-assets/skins/ui/oxide-dark/content.min.css +5 -1
- package/tinymce-assets/skins/ui/oxide-dark/skin.css +219 -1597
- package/tinymce-assets/skins/ui/oxide-dark/skin.js +2 -1
- package/tinymce-assets/skins/ui/oxide-dark/skin.min.css +1 -1
- package/tinymce-assets/skins/ui/oxide-dark/skin.shadowdom.js +2 -1
- package/tinymce-assets/skins/ui/tinymce-5/content.css +53 -148
- package/tinymce-assets/skins/ui/tinymce-5/content.inline.css +53 -148
- package/tinymce-assets/skins/ui/tinymce-5/content.inline.js +6 -1
- package/tinymce-assets/skins/ui/tinymce-5/content.inline.min.css +5 -1
- package/tinymce-assets/skins/ui/tinymce-5/content.js +6 -1
- package/tinymce-assets/skins/ui/tinymce-5/content.min.css +5 -1
- package/tinymce-assets/skins/ui/tinymce-5/skin.css +194 -1597
- package/tinymce-assets/skins/ui/tinymce-5/skin.js +2 -1
- package/tinymce-assets/skins/ui/tinymce-5/skin.min.css +1 -1
- package/tinymce-assets/skins/ui/tinymce-5/skin.shadowdom.js +2 -1
- package/tinymce-assets/skins/ui/tinymce-5-dark/content.css +46 -148
- package/tinymce-assets/skins/ui/tinymce-5-dark/content.inline.css +53 -148
- package/tinymce-assets/skins/ui/tinymce-5-dark/content.inline.js +6 -1
- package/tinymce-assets/skins/ui/tinymce-5-dark/content.inline.min.css +5 -1
- package/tinymce-assets/skins/ui/tinymce-5-dark/content.js +6 -1
- package/tinymce-assets/skins/ui/tinymce-5-dark/content.min.css +5 -1
- package/tinymce-assets/skins/ui/tinymce-5-dark/skin.css +202 -1605
- package/tinymce-assets/skins/ui/tinymce-5-dark/skin.js +2 -1
- package/tinymce-assets/skins/ui/tinymce-5-dark/skin.min.css +1 -1
- package/tinymce-assets/skins/ui/tinymce-5-dark/skin.shadowdom.js +2 -1
- package/tinymce-assets/themes/silver/theme.js +28439 -32466
- package/tinymce-assets/themes/silver/theme.min.js +1 -1
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* TinyMCE version
|
|
2
|
+
* TinyMCE version 6.8.6 (TBD)
|
|
3
3
|
*/
|
|
4
4
|
|
|
5
5
|
(function () {
|
|
@@ -7,400 +7,200 @@
|
|
|
7
7
|
|
|
8
8
|
var global$6 = tinymce.util.Tools.resolve('tinymce.PluginManager');
|
|
9
9
|
|
|
10
|
-
/* eslint-disable @typescript-eslint/no-wrapper-object-types */
|
|
11
10
|
const hasProto = (v, constructor, predicate) => {
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
return ((_a = v.constructor) === null || _a === void 0 ? void 0 : _a.name) === constructor.name;
|
|
19
|
-
}
|
|
11
|
+
var _a;
|
|
12
|
+
if (predicate(v, constructor.prototype)) {
|
|
13
|
+
return true;
|
|
14
|
+
} else {
|
|
15
|
+
return ((_a = v.constructor) === null || _a === void 0 ? void 0 : _a.name) === constructor.name;
|
|
16
|
+
}
|
|
20
17
|
};
|
|
21
|
-
const typeOf =
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
else {
|
|
33
|
-
return t;
|
|
34
|
-
}
|
|
18
|
+
const typeOf = x => {
|
|
19
|
+
const t = typeof x;
|
|
20
|
+
if (x === null) {
|
|
21
|
+
return 'null';
|
|
22
|
+
} else if (t === 'object' && Array.isArray(x)) {
|
|
23
|
+
return 'array';
|
|
24
|
+
} else if (t === 'object' && hasProto(x, String, (o, proto) => proto.isPrototypeOf(o))) {
|
|
25
|
+
return 'string';
|
|
26
|
+
} else {
|
|
27
|
+
return t;
|
|
28
|
+
}
|
|
35
29
|
};
|
|
36
|
-
const isType =
|
|
37
|
-
const isSimpleType = (type) => (value) => typeof value === type;
|
|
30
|
+
const isType = type => value => typeOf(value) === type;
|
|
38
31
|
const isString = isType('string');
|
|
39
32
|
const isObject = isType('object');
|
|
40
33
|
const isArray = isType('array');
|
|
41
|
-
const isNullable =
|
|
42
|
-
const isNonNullable =
|
|
43
|
-
const isFunction = isSimpleType('function');
|
|
34
|
+
const isNullable = a => a === null || a === undefined;
|
|
35
|
+
const isNonNullable = a => !isNullable(a);
|
|
44
36
|
|
|
45
|
-
/**
|
|
46
|
-
* The `Optional` type represents a value (of any type) that potentially does
|
|
47
|
-
* not exist. Any `Optional<T>` can either be a `Some<T>` (in which case the
|
|
48
|
-
* value does exist) or a `None` (in which case the value does not exist). This
|
|
49
|
-
* module defines a whole lot of FP-inspired utility functions for dealing with
|
|
50
|
-
* `Optional` objects.
|
|
51
|
-
*
|
|
52
|
-
* Comparison with null or undefined:
|
|
53
|
-
* - We don't get fancy null coalescing operators with `Optional`
|
|
54
|
-
* - We do get fancy helper functions with `Optional`
|
|
55
|
-
* - `Optional` support nesting, and allow for the type to still be nullable (or
|
|
56
|
-
* another `Optional`)
|
|
57
|
-
* - There is no option to turn off strict-optional-checks like there is for
|
|
58
|
-
* strict-null-checks
|
|
59
|
-
*/
|
|
60
37
|
class Optional {
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
return this.tag && predicate(this.value);
|
|
151
|
-
}
|
|
152
|
-
/**
|
|
153
|
-
* For a given predicate, this function finds out if **all** the values inside
|
|
154
|
-
* this `Optional` object meet the predicate. In practice, this means that
|
|
155
|
-
* for `Optional`s that do not contain a value it returns true (as all 0
|
|
156
|
-
* objects do meet the predicate).
|
|
157
|
-
*/
|
|
158
|
-
forall(predicate) {
|
|
159
|
-
return !this.tag || predicate(this.value);
|
|
160
|
-
}
|
|
161
|
-
filter(predicate) {
|
|
162
|
-
if (!this.tag || predicate(this.value)) {
|
|
163
|
-
return this;
|
|
164
|
-
}
|
|
165
|
-
else {
|
|
166
|
-
return Optional.none();
|
|
167
|
-
}
|
|
168
|
-
}
|
|
169
|
-
// --- Getters ---
|
|
170
|
-
/**
|
|
171
|
-
* Get the value out of the inside of the `Optional` object, using a default
|
|
172
|
-
* `replacement` value if the provided `Optional` object does not contain a
|
|
173
|
-
* value.
|
|
174
|
-
*/
|
|
175
|
-
getOr(replacement) {
|
|
176
|
-
return this.tag ? this.value : replacement;
|
|
177
|
-
}
|
|
178
|
-
/**
|
|
179
|
-
* Get the value out of the inside of the `Optional` object, using a default
|
|
180
|
-
* `replacement` value if the provided `Optional` object does not contain a
|
|
181
|
-
* value. Unlike `getOr`, in this method the `replacement` object is also
|
|
182
|
-
* `Optional` - meaning that this method will always return an `Optional`.
|
|
183
|
-
*/
|
|
184
|
-
or(replacement) {
|
|
185
|
-
return this.tag ? this : replacement;
|
|
186
|
-
}
|
|
187
|
-
/**
|
|
188
|
-
* Get the value out of the inside of the `Optional` object, using a default
|
|
189
|
-
* `replacement` value if the provided `Optional` object does not contain a
|
|
190
|
-
* value. Unlike `getOr`, in this method the `replacement` value is
|
|
191
|
-
* "thunked" - that is to say that you don't pass a value to `getOrThunk`, you
|
|
192
|
-
* pass a function which (if called) will **return** the `value` you want to
|
|
193
|
-
* use.
|
|
194
|
-
*/
|
|
195
|
-
getOrThunk(thunk) {
|
|
196
|
-
return this.tag ? this.value : thunk();
|
|
197
|
-
}
|
|
198
|
-
/**
|
|
199
|
-
* Get the value out of the inside of the `Optional` object, using a default
|
|
200
|
-
* `replacement` value if the provided Optional object does not contain a
|
|
201
|
-
* value.
|
|
202
|
-
*
|
|
203
|
-
* Unlike `or`, in this method the `replacement` value is "thunked" - that is
|
|
204
|
-
* to say that you don't pass a value to `orThunk`, you pass a function which
|
|
205
|
-
* (if called) will **return** the `value` you want to use.
|
|
206
|
-
*
|
|
207
|
-
* Unlike `getOrThunk`, in this method the `replacement` value is also
|
|
208
|
-
* `Optional`, meaning that this method will always return an `Optional`.
|
|
209
|
-
*/
|
|
210
|
-
orThunk(thunk) {
|
|
211
|
-
return this.tag ? this : thunk();
|
|
212
|
-
}
|
|
213
|
-
/**
|
|
214
|
-
* Get the value out of the inside of the `Optional` object, throwing an
|
|
215
|
-
* exception if the provided `Optional` object does not contain a value.
|
|
216
|
-
*
|
|
217
|
-
* WARNING:
|
|
218
|
-
* You should only be using this function if you know that the `Optional`
|
|
219
|
-
* object **is not** empty (otherwise you're throwing exceptions in production
|
|
220
|
-
* code, which is bad).
|
|
221
|
-
*
|
|
222
|
-
* In tests this is more acceptable.
|
|
223
|
-
*
|
|
224
|
-
* Prefer other methods to this, such as `.each`.
|
|
225
|
-
*/
|
|
226
|
-
getOrDie(message) {
|
|
227
|
-
if (!this.tag) {
|
|
228
|
-
throw new Error(message !== null && message !== void 0 ? message : 'Called getOrDie on None');
|
|
229
|
-
}
|
|
230
|
-
else {
|
|
231
|
-
return this.value;
|
|
232
|
-
}
|
|
233
|
-
}
|
|
234
|
-
// --- Interop with null and undefined ---
|
|
235
|
-
/**
|
|
236
|
-
* Creates an `Optional` value from a nullable (or undefined-able) input.
|
|
237
|
-
* Null, or undefined, is converted to `None`, and anything else is converted
|
|
238
|
-
* to `Some`.
|
|
239
|
-
*/
|
|
240
|
-
static from(value) {
|
|
241
|
-
return isNonNullable(value) ? Optional.some(value) : Optional.none();
|
|
242
|
-
}
|
|
243
|
-
/**
|
|
244
|
-
* Converts an `Optional` to a nullable type, by getting the value if it
|
|
245
|
-
* exists, or returning `null` if it does not.
|
|
246
|
-
*/
|
|
247
|
-
getOrNull() {
|
|
248
|
-
return this.tag ? this.value : null;
|
|
249
|
-
}
|
|
250
|
-
/**
|
|
251
|
-
* Converts an `Optional` to an undefined-able type, by getting the value if
|
|
252
|
-
* it exists, or returning `undefined` if it does not.
|
|
253
|
-
*/
|
|
254
|
-
getOrUndefined() {
|
|
255
|
-
return this.value;
|
|
256
|
-
}
|
|
257
|
-
// --- Utilities ---
|
|
258
|
-
/**
|
|
259
|
-
* If the `Optional` contains a value, perform an action on that value.
|
|
260
|
-
* Unlike the rest of the methods on this type, `.each` has side-effects. If
|
|
261
|
-
* you want to transform an `Optional<T>` **into** something, then this is not
|
|
262
|
-
* the method for you. If you want to use an `Optional<T>` to **do**
|
|
263
|
-
* something, then this is the method for you - provided you're okay with not
|
|
264
|
-
* doing anything in the case where the `Optional` doesn't have a value inside
|
|
265
|
-
* it. If you're not sure whether your use-case fits into transforming
|
|
266
|
-
* **into** something or **doing** something, check whether it has a return
|
|
267
|
-
* value. If it does, you should be performing a transform.
|
|
268
|
-
*/
|
|
269
|
-
each(worker) {
|
|
270
|
-
if (this.tag) {
|
|
271
|
-
worker(this.value);
|
|
272
|
-
}
|
|
273
|
-
}
|
|
274
|
-
/**
|
|
275
|
-
* Turn the `Optional` object into an array that contains all of the values
|
|
276
|
-
* stored inside the `Optional`. In practice, this means the output will have
|
|
277
|
-
* either 0 or 1 elements.
|
|
278
|
-
*/
|
|
279
|
-
toArray() {
|
|
280
|
-
return this.tag ? [this.value] : [];
|
|
281
|
-
}
|
|
282
|
-
/**
|
|
283
|
-
* Turn the `Optional` object into a string for debugging or printing. Not
|
|
284
|
-
* recommended for production code, but good for debugging. Also note that
|
|
285
|
-
* these days an `Optional` object can be logged to the console directly, and
|
|
286
|
-
* its inner value (if it exists) will be visible.
|
|
287
|
-
*/
|
|
288
|
-
toString() {
|
|
289
|
-
return this.tag ? `some(${this.value})` : 'none()';
|
|
290
|
-
}
|
|
38
|
+
constructor(tag, value) {
|
|
39
|
+
this.tag = tag;
|
|
40
|
+
this.value = value;
|
|
41
|
+
}
|
|
42
|
+
static some(value) {
|
|
43
|
+
return new Optional(true, value);
|
|
44
|
+
}
|
|
45
|
+
static none() {
|
|
46
|
+
return Optional.singletonNone;
|
|
47
|
+
}
|
|
48
|
+
fold(onNone, onSome) {
|
|
49
|
+
if (this.tag) {
|
|
50
|
+
return onSome(this.value);
|
|
51
|
+
} else {
|
|
52
|
+
return onNone();
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
isSome() {
|
|
56
|
+
return this.tag;
|
|
57
|
+
}
|
|
58
|
+
isNone() {
|
|
59
|
+
return !this.tag;
|
|
60
|
+
}
|
|
61
|
+
map(mapper) {
|
|
62
|
+
if (this.tag) {
|
|
63
|
+
return Optional.some(mapper(this.value));
|
|
64
|
+
} else {
|
|
65
|
+
return Optional.none();
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
bind(binder) {
|
|
69
|
+
if (this.tag) {
|
|
70
|
+
return binder(this.value);
|
|
71
|
+
} else {
|
|
72
|
+
return Optional.none();
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
exists(predicate) {
|
|
76
|
+
return this.tag && predicate(this.value);
|
|
77
|
+
}
|
|
78
|
+
forall(predicate) {
|
|
79
|
+
return !this.tag || predicate(this.value);
|
|
80
|
+
}
|
|
81
|
+
filter(predicate) {
|
|
82
|
+
if (!this.tag || predicate(this.value)) {
|
|
83
|
+
return this;
|
|
84
|
+
} else {
|
|
85
|
+
return Optional.none();
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
getOr(replacement) {
|
|
89
|
+
return this.tag ? this.value : replacement;
|
|
90
|
+
}
|
|
91
|
+
or(replacement) {
|
|
92
|
+
return this.tag ? this : replacement;
|
|
93
|
+
}
|
|
94
|
+
getOrThunk(thunk) {
|
|
95
|
+
return this.tag ? this.value : thunk();
|
|
96
|
+
}
|
|
97
|
+
orThunk(thunk) {
|
|
98
|
+
return this.tag ? this : thunk();
|
|
99
|
+
}
|
|
100
|
+
getOrDie(message) {
|
|
101
|
+
if (!this.tag) {
|
|
102
|
+
throw new Error(message !== null && message !== void 0 ? message : 'Called getOrDie on None');
|
|
103
|
+
} else {
|
|
104
|
+
return this.value;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
static from(value) {
|
|
108
|
+
return isNonNullable(value) ? Optional.some(value) : Optional.none();
|
|
109
|
+
}
|
|
110
|
+
getOrNull() {
|
|
111
|
+
return this.tag ? this.value : null;
|
|
112
|
+
}
|
|
113
|
+
getOrUndefined() {
|
|
114
|
+
return this.value;
|
|
115
|
+
}
|
|
116
|
+
each(worker) {
|
|
117
|
+
if (this.tag) {
|
|
118
|
+
worker(this.value);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
toArray() {
|
|
122
|
+
return this.tag ? [this.value] : [];
|
|
123
|
+
}
|
|
124
|
+
toString() {
|
|
125
|
+
return this.tag ? `some(${ this.value })` : 'none()';
|
|
126
|
+
}
|
|
291
127
|
}
|
|
292
|
-
// Sneaky optimisation: every instance of Optional.none is identical, so just
|
|
293
|
-
// reuse the same object
|
|
294
128
|
Optional.singletonNone = new Optional(false);
|
|
295
129
|
|
|
296
|
-
/* eslint-disable @typescript-eslint/unbound-method */
|
|
297
|
-
const nativeSlice = Array.prototype.slice;
|
|
298
130
|
const nativePush = Array.prototype.push;
|
|
299
|
-
// Unwound implementing other functions in terms of each.
|
|
300
|
-
// The code size is roughly the same, and it should allow for better optimisation.
|
|
301
|
-
// const each = function<T, U>(xs: T[], f: (x: T, i?: number, xs?: T[]) => void): void {
|
|
302
131
|
const each$1 = (xs, f) => {
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
132
|
+
for (let i = 0, len = xs.length; i < len; i++) {
|
|
133
|
+
const x = xs[i];
|
|
134
|
+
f(x, i);
|
|
135
|
+
}
|
|
307
136
|
};
|
|
308
|
-
const flatten =
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
137
|
+
const flatten = xs => {
|
|
138
|
+
const r = [];
|
|
139
|
+
for (let i = 0, len = xs.length; i < len; ++i) {
|
|
140
|
+
if (!isArray(xs[i])) {
|
|
141
|
+
throw new Error('Arr.flatten item ' + i + ' was not an array, input: ' + xs);
|
|
142
|
+
}
|
|
143
|
+
nativePush.apply(r, xs[i]);
|
|
144
|
+
}
|
|
145
|
+
return r;
|
|
146
|
+
};
|
|
147
|
+
|
|
148
|
+
const Cell = initial => {
|
|
149
|
+
let value = initial;
|
|
150
|
+
const get = () => {
|
|
151
|
+
return value;
|
|
152
|
+
};
|
|
153
|
+
const set = v => {
|
|
154
|
+
value = v;
|
|
155
|
+
};
|
|
156
|
+
return {
|
|
157
|
+
get,
|
|
158
|
+
set
|
|
159
|
+
};
|
|
322
160
|
};
|
|
323
|
-
isFunction(Array.from) ? Array.from : (x) => nativeSlice.call(x);
|
|
324
161
|
|
|
325
|
-
// There are many variations of Object iteration that are faster than the 'for-in' style:
|
|
326
|
-
// http://jsperf.com/object-keys-iteration/107
|
|
327
|
-
//
|
|
328
|
-
// Use the native keys if it is available (IE9+), otherwise fall back to manually filtering
|
|
329
162
|
const keys = Object.keys;
|
|
330
|
-
// eslint-disable-next-line @typescript-eslint/unbound-method
|
|
331
163
|
const hasOwnProperty = Object.hasOwnProperty;
|
|
332
164
|
const each = (obj, f) => {
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
165
|
+
const props = keys(obj);
|
|
166
|
+
for (let k = 0, len = props.length; k < len; k++) {
|
|
167
|
+
const i = props[k];
|
|
168
|
+
const x = obj[i];
|
|
169
|
+
f(x, i);
|
|
170
|
+
}
|
|
339
171
|
};
|
|
340
172
|
const get$1 = (obj, key) => {
|
|
341
|
-
|
|
173
|
+
return has(obj, key) ? Optional.from(obj[key]) : Optional.none();
|
|
342
174
|
};
|
|
343
175
|
const has = (obj, key) => hasOwnProperty.call(obj, key);
|
|
344
176
|
|
|
345
|
-
const
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
registerOption('audio_template_callback', {
|
|
373
|
-
processor: 'function'
|
|
374
|
-
});
|
|
375
|
-
registerOption('video_template_callback', {
|
|
376
|
-
processor: 'function'
|
|
377
|
-
});
|
|
378
|
-
registerOption('iframe_template_callback', {
|
|
379
|
-
processor: 'function'
|
|
380
|
-
});
|
|
381
|
-
registerOption('media_live_embeds', {
|
|
382
|
-
processor: 'boolean',
|
|
383
|
-
default: true
|
|
384
|
-
});
|
|
385
|
-
registerOption('media_filter_html', {
|
|
386
|
-
processor: 'boolean',
|
|
387
|
-
default: true
|
|
388
|
-
});
|
|
389
|
-
registerOption('media_url_resolver', {
|
|
390
|
-
processor: 'function'
|
|
391
|
-
});
|
|
392
|
-
registerOption('media_alt_source', {
|
|
393
|
-
processor: 'boolean',
|
|
394
|
-
default: true
|
|
395
|
-
});
|
|
396
|
-
registerOption('media_poster', {
|
|
397
|
-
processor: 'boolean',
|
|
398
|
-
default: true
|
|
399
|
-
});
|
|
400
|
-
registerOption('media_dimensions', {
|
|
401
|
-
processor: 'boolean',
|
|
402
|
-
default: true
|
|
403
|
-
});
|
|
177
|
+
const option = name => editor => editor.options.get(name);
|
|
178
|
+
const register$2 = editor => {
|
|
179
|
+
const registerOption = editor.options.register;
|
|
180
|
+
registerOption('audio_template_callback', { processor: 'function' });
|
|
181
|
+
registerOption('video_template_callback', { processor: 'function' });
|
|
182
|
+
registerOption('iframe_template_callback', { processor: 'function' });
|
|
183
|
+
registerOption('media_live_embeds', {
|
|
184
|
+
processor: 'boolean',
|
|
185
|
+
default: true
|
|
186
|
+
});
|
|
187
|
+
registerOption('media_filter_html', {
|
|
188
|
+
processor: 'boolean',
|
|
189
|
+
default: true
|
|
190
|
+
});
|
|
191
|
+
registerOption('media_url_resolver', { processor: 'function' });
|
|
192
|
+
registerOption('media_alt_source', {
|
|
193
|
+
processor: 'boolean',
|
|
194
|
+
default: true
|
|
195
|
+
});
|
|
196
|
+
registerOption('media_poster', {
|
|
197
|
+
processor: 'boolean',
|
|
198
|
+
default: true
|
|
199
|
+
});
|
|
200
|
+
registerOption('media_dimensions', {
|
|
201
|
+
processor: 'boolean',
|
|
202
|
+
default: true
|
|
203
|
+
});
|
|
404
204
|
};
|
|
405
205
|
const getAudioTemplateCallback = option('audio_template_callback');
|
|
406
206
|
const getVideoTemplateCallback = option('video_template_callback');
|
|
@@ -419,75 +219,74 @@
|
|
|
419
219
|
var global$3 = tinymce.util.Tools.resolve('tinymce.html.DomParser');
|
|
420
220
|
|
|
421
221
|
const DOM$1 = global$4.DOM;
|
|
422
|
-
const trimPx =
|
|
423
|
-
const getEphoxEmbedData =
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
222
|
+
const trimPx = value => value.replace(/px$/, '');
|
|
223
|
+
const getEphoxEmbedData = node => {
|
|
224
|
+
const style = node.attr('style');
|
|
225
|
+
const styles = style ? DOM$1.parseStyle(style) : {};
|
|
226
|
+
return {
|
|
227
|
+
type: 'ephox-embed-iri',
|
|
228
|
+
source: node.attr('data-ephox-embed-iri'),
|
|
229
|
+
altsource: '',
|
|
230
|
+
poster: '',
|
|
231
|
+
width: get$1(styles, 'max-width').map(trimPx).getOr(''),
|
|
232
|
+
height: get$1(styles, 'max-height').map(trimPx).getOr('')
|
|
233
|
+
};
|
|
434
234
|
};
|
|
435
235
|
const htmlToData = (html, schema) => {
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
}
|
|
458
|
-
if (name === 'source') {
|
|
459
|
-
if (!data.source) {
|
|
460
|
-
data.source = node.attr('src');
|
|
461
|
-
}
|
|
462
|
-
else if (!data.altsource) {
|
|
463
|
-
data.altsource = node.attr('src');
|
|
464
|
-
}
|
|
465
|
-
}
|
|
466
|
-
if (name === 'img' && !data.poster) {
|
|
467
|
-
data.poster = node.attr('src');
|
|
468
|
-
}
|
|
469
|
-
}
|
|
236
|
+
let data = {};
|
|
237
|
+
const parser = global$3({
|
|
238
|
+
validate: false,
|
|
239
|
+
forced_root_block: false
|
|
240
|
+
}, schema);
|
|
241
|
+
const rootNode = parser.parse(html);
|
|
242
|
+
for (let node = rootNode; node; node = node.walk()) {
|
|
243
|
+
if (node.type === 1) {
|
|
244
|
+
const name = node.name;
|
|
245
|
+
if (node.attr('data-ephox-embed-iri')) {
|
|
246
|
+
data = getEphoxEmbedData(node);
|
|
247
|
+
break;
|
|
248
|
+
} else {
|
|
249
|
+
if (!data.source && name === 'param') {
|
|
250
|
+
data.source = node.attr('movie');
|
|
251
|
+
}
|
|
252
|
+
if (name === 'iframe' || name === 'object' || name === 'embed' || name === 'video' || name === 'audio') {
|
|
253
|
+
if (!data.type) {
|
|
254
|
+
data.type = name;
|
|
255
|
+
}
|
|
256
|
+
data = global$5.extend(node.attributes.map, data);
|
|
470
257
|
}
|
|
258
|
+
if (name === 'source') {
|
|
259
|
+
if (!data.source) {
|
|
260
|
+
data.source = node.attr('src');
|
|
261
|
+
} else if (!data.altsource) {
|
|
262
|
+
data.altsource = node.attr('src');
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
if (name === 'img' && !data.poster) {
|
|
266
|
+
data.poster = node.attr('src');
|
|
267
|
+
}
|
|
268
|
+
}
|
|
471
269
|
}
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
270
|
+
}
|
|
271
|
+
data.source = data.source || data.src || '';
|
|
272
|
+
data.altsource = data.altsource || '';
|
|
273
|
+
data.poster = data.poster || '';
|
|
274
|
+
return data;
|
|
476
275
|
};
|
|
477
276
|
|
|
478
|
-
const guess =
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
277
|
+
const guess = url => {
|
|
278
|
+
var _a;
|
|
279
|
+
const mimes = {
|
|
280
|
+
mp3: 'audio/mpeg',
|
|
281
|
+
m4a: 'audio/x-m4a',
|
|
282
|
+
wav: 'audio/wav',
|
|
283
|
+
mp4: 'video/mp4',
|
|
284
|
+
webm: 'video/webm',
|
|
285
|
+
ogg: 'video/ogg',
|
|
286
|
+
swf: 'application/x-shockwave-flash'
|
|
287
|
+
};
|
|
288
|
+
const fileEnd = (_a = url.toLowerCase().split('.').pop()) !== null && _a !== void 0 ? _a : '';
|
|
289
|
+
return get$1(mimes, fileEnd).getOr('');
|
|
491
290
|
};
|
|
492
291
|
|
|
493
292
|
var global$2 = tinymce.util.Tools.resolve('tinymce.html.Node');
|
|
@@ -495,981 +294,924 @@
|
|
|
495
294
|
var global$1 = tinymce.util.Tools.resolve('tinymce.html.Serializer');
|
|
496
295
|
|
|
497
296
|
const Parser = (schema, settings = {}) => global$3({
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
297
|
+
forced_root_block: false,
|
|
298
|
+
validate: false,
|
|
299
|
+
allow_conditional_comments: true,
|
|
300
|
+
...settings
|
|
502
301
|
}, schema);
|
|
503
302
|
|
|
504
303
|
const DOM = global$4.DOM;
|
|
505
|
-
const addPx =
|
|
304
|
+
const addPx = value => /^[0-9.]+$/.test(value) ? value + 'px' : value;
|
|
506
305
|
const updateEphoxEmbed = (data, node) => {
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
306
|
+
const style = node.attr('style');
|
|
307
|
+
const styleMap = style ? DOM.parseStyle(style) : {};
|
|
308
|
+
if (isNonNullable(data.width)) {
|
|
309
|
+
styleMap['max-width'] = addPx(data.width);
|
|
310
|
+
}
|
|
311
|
+
if (isNonNullable(data.height)) {
|
|
312
|
+
styleMap['max-height'] = addPx(data.height);
|
|
313
|
+
}
|
|
314
|
+
node.attr('style', DOM.serializeStyle(styleMap));
|
|
516
315
|
};
|
|
517
|
-
const sources = [
|
|
316
|
+
const sources = [
|
|
317
|
+
'source',
|
|
318
|
+
'altsource'
|
|
319
|
+
];
|
|
518
320
|
const updateHtml = (html, data, updateAll, schema) => {
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
321
|
+
let numSources = 0;
|
|
322
|
+
let sourceCount = 0;
|
|
323
|
+
const parser = Parser(schema);
|
|
324
|
+
parser.addNodeFilter('source', nodes => numSources = nodes.length);
|
|
325
|
+
const rootNode = parser.parse(html);
|
|
326
|
+
for (let node = rootNode; node; node = node.walk()) {
|
|
327
|
+
if (node.type === 1) {
|
|
328
|
+
const name = node.name;
|
|
329
|
+
if (node.attr('data-ephox-embed-iri')) {
|
|
330
|
+
updateEphoxEmbed(data, node);
|
|
331
|
+
break;
|
|
332
|
+
} else {
|
|
333
|
+
switch (name) {
|
|
334
|
+
case 'video':
|
|
335
|
+
case 'object':
|
|
336
|
+
case 'embed':
|
|
337
|
+
case 'img':
|
|
338
|
+
case 'iframe':
|
|
339
|
+
if (data.height !== undefined && data.width !== undefined) {
|
|
340
|
+
node.attr('width', data.width);
|
|
341
|
+
node.attr('height', data.height);
|
|
342
|
+
}
|
|
343
|
+
break;
|
|
344
|
+
}
|
|
345
|
+
if (updateAll) {
|
|
346
|
+
switch (name) {
|
|
347
|
+
case 'video':
|
|
348
|
+
node.attr('poster', data.poster);
|
|
349
|
+
node.attr('src', null);
|
|
350
|
+
for (let index = numSources; index < 2; index++) {
|
|
351
|
+
if (data[sources[index]]) {
|
|
352
|
+
const source = new global$2('source', 1);
|
|
353
|
+
source.attr('src', data[sources[index]]);
|
|
354
|
+
source.attr('type', data[sources[index] + 'mime'] || null);
|
|
355
|
+
node.append(source);
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
break;
|
|
359
|
+
case 'iframe':
|
|
360
|
+
node.attr('src', data.source);
|
|
361
|
+
break;
|
|
362
|
+
case 'object':
|
|
363
|
+
const hasImage = node.getAll('img').length > 0;
|
|
364
|
+
if (data.poster && !hasImage) {
|
|
365
|
+
node.attr('src', data.poster);
|
|
366
|
+
const img = new global$2('img', 1);
|
|
367
|
+
img.attr('src', data.poster);
|
|
368
|
+
img.attr('width', data.width);
|
|
369
|
+
img.attr('height', data.height);
|
|
370
|
+
node.append(img);
|
|
371
|
+
}
|
|
372
|
+
break;
|
|
373
|
+
case 'source':
|
|
374
|
+
if (sourceCount < 2) {
|
|
375
|
+
node.attr('src', data[sources[sourceCount]]);
|
|
376
|
+
node.attr('type', data[sources[sourceCount] + 'mime'] || null);
|
|
377
|
+
if (!data[sources[sourceCount]]) {
|
|
378
|
+
node.remove();
|
|
379
|
+
continue;
|
|
380
|
+
}
|
|
531
381
|
}
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
case 'img':
|
|
538
|
-
case 'iframe':
|
|
539
|
-
if (data.height !== undefined && data.width !== undefined) {
|
|
540
|
-
node.attr('width', data.width);
|
|
541
|
-
node.attr('height', data.height);
|
|
542
|
-
}
|
|
543
|
-
break;
|
|
544
|
-
}
|
|
545
|
-
if (updateAll) {
|
|
546
|
-
switch (name) {
|
|
547
|
-
case 'video':
|
|
548
|
-
node.attr('poster', data.poster);
|
|
549
|
-
node.attr('src', null);
|
|
550
|
-
// Add <source> child elements
|
|
551
|
-
for (let index = numSources; index < 2; index++) {
|
|
552
|
-
if (data[sources[index]]) {
|
|
553
|
-
const source = new global$2('source', 1);
|
|
554
|
-
source.attr('src', data[sources[index]]);
|
|
555
|
-
source.attr('type', data[sources[index] + 'mime'] || null);
|
|
556
|
-
node.append(source);
|
|
557
|
-
}
|
|
558
|
-
}
|
|
559
|
-
break;
|
|
560
|
-
case 'iframe':
|
|
561
|
-
node.attr('src', data.source);
|
|
562
|
-
break;
|
|
563
|
-
case 'object':
|
|
564
|
-
const hasImage = node.getAll('img').length > 0;
|
|
565
|
-
if (data.poster && !hasImage) {
|
|
566
|
-
node.attr('src', data.poster);
|
|
567
|
-
const img = new global$2('img', 1);
|
|
568
|
-
img.attr('src', data.poster);
|
|
569
|
-
img.attr('width', data.width);
|
|
570
|
-
img.attr('height', data.height);
|
|
571
|
-
node.append(img);
|
|
572
|
-
}
|
|
573
|
-
break;
|
|
574
|
-
case 'source':
|
|
575
|
-
if (sourceCount < 2) {
|
|
576
|
-
node.attr('src', data[sources[sourceCount]]);
|
|
577
|
-
node.attr('type', data[sources[sourceCount] + 'mime'] || null);
|
|
578
|
-
if (!data[sources[sourceCount]]) {
|
|
579
|
-
node.remove();
|
|
580
|
-
continue;
|
|
581
|
-
}
|
|
582
|
-
}
|
|
583
|
-
sourceCount++;
|
|
584
|
-
break;
|
|
585
|
-
case 'img':
|
|
586
|
-
if (!data.poster) {
|
|
587
|
-
node.remove();
|
|
588
|
-
}
|
|
589
|
-
break;
|
|
590
|
-
}
|
|
591
|
-
}
|
|
382
|
+
sourceCount++;
|
|
383
|
+
break;
|
|
384
|
+
case 'img':
|
|
385
|
+
if (!data.poster) {
|
|
386
|
+
node.remove();
|
|
592
387
|
}
|
|
388
|
+
break;
|
|
389
|
+
}
|
|
593
390
|
}
|
|
391
|
+
}
|
|
594
392
|
}
|
|
595
|
-
|
|
393
|
+
}
|
|
394
|
+
return global$1({}, schema).serialize(rootNode);
|
|
596
395
|
};
|
|
597
396
|
|
|
598
397
|
const urlPatterns = [
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
|
|
645
|
-
|
|
646
|
-
|
|
647
|
-
|
|
648
|
-
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
|
|
398
|
+
{
|
|
399
|
+
regex: /youtu\.be\/([\w\-_\?&=.]+)/i,
|
|
400
|
+
type: 'iframe',
|
|
401
|
+
w: 560,
|
|
402
|
+
h: 314,
|
|
403
|
+
url: 'www.youtube.com/embed/$1',
|
|
404
|
+
allowFullscreen: true
|
|
405
|
+
},
|
|
406
|
+
{
|
|
407
|
+
regex: /youtube\.com(.+)v=([^&]+)(&([a-z0-9&=\-_]+))?/i,
|
|
408
|
+
type: 'iframe',
|
|
409
|
+
w: 560,
|
|
410
|
+
h: 314,
|
|
411
|
+
url: 'www.youtube.com/embed/$2?$4',
|
|
412
|
+
allowFullscreen: true
|
|
413
|
+
},
|
|
414
|
+
{
|
|
415
|
+
regex: /youtube.com\/embed\/([a-z0-9\?&=\-_]+)/i,
|
|
416
|
+
type: 'iframe',
|
|
417
|
+
w: 560,
|
|
418
|
+
h: 314,
|
|
419
|
+
url: 'www.youtube.com/embed/$1',
|
|
420
|
+
allowFullscreen: true
|
|
421
|
+
},
|
|
422
|
+
{
|
|
423
|
+
regex: /vimeo\.com\/([0-9]+)\?h=(\w+)/,
|
|
424
|
+
type: 'iframe',
|
|
425
|
+
w: 425,
|
|
426
|
+
h: 350,
|
|
427
|
+
url: 'player.vimeo.com/video/$1?h=$2&title=0&byline=0&portrait=0&color=8dc7dc',
|
|
428
|
+
allowFullscreen: true
|
|
429
|
+
},
|
|
430
|
+
{
|
|
431
|
+
regex: /vimeo\.com\/(.*)\/([0-9]+)\?h=(\w+)/,
|
|
432
|
+
type: 'iframe',
|
|
433
|
+
w: 425,
|
|
434
|
+
h: 350,
|
|
435
|
+
url: 'player.vimeo.com/video/$2?h=$3&title=0&byline=0',
|
|
436
|
+
allowFullscreen: true
|
|
437
|
+
},
|
|
438
|
+
{
|
|
439
|
+
regex: /vimeo\.com\/([0-9]+)/,
|
|
440
|
+
type: 'iframe',
|
|
441
|
+
w: 425,
|
|
442
|
+
h: 350,
|
|
443
|
+
url: 'player.vimeo.com/video/$1?title=0&byline=0&portrait=0&color=8dc7dc',
|
|
444
|
+
allowFullscreen: true
|
|
445
|
+
},
|
|
446
|
+
{
|
|
447
|
+
regex: /vimeo\.com\/(.*)\/([0-9]+)/,
|
|
448
|
+
type: 'iframe',
|
|
449
|
+
w: 425,
|
|
450
|
+
h: 350,
|
|
451
|
+
url: 'player.vimeo.com/video/$2?title=0&byline=0',
|
|
452
|
+
allowFullscreen: true
|
|
453
|
+
},
|
|
454
|
+
{
|
|
455
|
+
regex: /maps\.google\.([a-z]{2,3})\/maps\/(.+)msid=(.+)/,
|
|
456
|
+
type: 'iframe',
|
|
457
|
+
w: 425,
|
|
458
|
+
h: 350,
|
|
459
|
+
url: 'maps.google.com/maps/ms?msid=$2&output=embed"',
|
|
460
|
+
allowFullscreen: false
|
|
461
|
+
},
|
|
462
|
+
{
|
|
463
|
+
regex: /dailymotion\.com\/video\/([^_]+)/,
|
|
464
|
+
type: 'iframe',
|
|
465
|
+
w: 480,
|
|
466
|
+
h: 270,
|
|
467
|
+
url: 'www.dailymotion.com/embed/video/$1',
|
|
468
|
+
allowFullscreen: true
|
|
469
|
+
},
|
|
470
|
+
{
|
|
471
|
+
regex: /dai\.ly\/([^_]+)/,
|
|
472
|
+
type: 'iframe',
|
|
473
|
+
w: 480,
|
|
474
|
+
h: 270,
|
|
475
|
+
url: 'www.dailymotion.com/embed/video/$1',
|
|
476
|
+
allowFullscreen: true
|
|
477
|
+
}
|
|
659
478
|
];
|
|
660
|
-
const getProtocol =
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
}
|
|
479
|
+
const getProtocol = url => {
|
|
480
|
+
const protocolMatches = url.match(/^(https?:\/\/|www\.)(.+)$/i);
|
|
481
|
+
if (protocolMatches && protocolMatches.length > 1) {
|
|
482
|
+
return protocolMatches[1] === 'www.' ? 'https://' : protocolMatches[1];
|
|
483
|
+
} else {
|
|
484
|
+
return 'https://';
|
|
485
|
+
}
|
|
668
486
|
};
|
|
669
487
|
const getUrl = (pattern, url) => {
|
|
670
|
-
|
|
671
|
-
|
|
672
|
-
|
|
673
|
-
|
|
674
|
-
|
|
675
|
-
|
|
676
|
-
|
|
677
|
-
|
|
678
|
-
|
|
488
|
+
const protocol = getProtocol(url);
|
|
489
|
+
const match = pattern.regex.exec(url);
|
|
490
|
+
let newUrl = protocol + pattern.url;
|
|
491
|
+
if (isNonNullable(match)) {
|
|
492
|
+
for (let i = 0; i < match.length; i++) {
|
|
493
|
+
newUrl = newUrl.replace('$' + i, () => match[i] ? match[i] : '');
|
|
494
|
+
}
|
|
495
|
+
}
|
|
496
|
+
return newUrl.replace(/\?$/, '');
|
|
679
497
|
};
|
|
680
|
-
const matchPattern =
|
|
681
|
-
|
|
682
|
-
|
|
683
|
-
|
|
684
|
-
|
|
685
|
-
|
|
686
|
-
|
|
687
|
-
}
|
|
498
|
+
const matchPattern = url => {
|
|
499
|
+
const patterns = urlPatterns.filter(pattern => pattern.regex.test(url));
|
|
500
|
+
if (patterns.length > 0) {
|
|
501
|
+
return global$5.extend({}, patterns[0], { url: getUrl(patterns[0], url) });
|
|
502
|
+
} else {
|
|
503
|
+
return null;
|
|
504
|
+
}
|
|
688
505
|
};
|
|
689
506
|
|
|
690
507
|
const getIframeHtml = (data, iframeTemplateCallback) => {
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
|
|
696
|
-
|
|
697
|
-
}
|
|
508
|
+
if (iframeTemplateCallback) {
|
|
509
|
+
return iframeTemplateCallback(data);
|
|
510
|
+
} else {
|
|
511
|
+
const allowFullscreen = data.allowfullscreen ? ' allowFullscreen="1"' : '';
|
|
512
|
+
return '<iframe src="' + data.source + '" width="' + data.width + '" height="' + data.height + '"' + allowFullscreen + '></iframe>';
|
|
513
|
+
}
|
|
698
514
|
};
|
|
699
|
-
const getFlashHtml =
|
|
700
|
-
|
|
701
|
-
|
|
702
|
-
|
|
703
|
-
|
|
704
|
-
|
|
705
|
-
|
|
515
|
+
const getFlashHtml = data => {
|
|
516
|
+
let html = '<object data="' + data.source + '" width="' + data.width + '" height="' + data.height + '" type="application/x-shockwave-flash">';
|
|
517
|
+
if (data.poster) {
|
|
518
|
+
html += '<img src="' + data.poster + '" width="' + data.width + '" height="' + data.height + '" />';
|
|
519
|
+
}
|
|
520
|
+
html += '</object>';
|
|
521
|
+
return html;
|
|
706
522
|
};
|
|
707
523
|
const getAudioHtml = (data, audioTemplateCallback) => {
|
|
708
|
-
|
|
709
|
-
|
|
710
|
-
|
|
711
|
-
|
|
712
|
-
|
|
713
|
-
(data.altsource ?
|
|
714
|
-
'\n<source src="' + data.altsource + '"' +
|
|
715
|
-
(data.altsourcemime ? ' type="' + data.altsourcemime + '"' : '') +
|
|
716
|
-
' />\n' : '') +
|
|
717
|
-
'</audio>');
|
|
718
|
-
}
|
|
524
|
+
if (audioTemplateCallback) {
|
|
525
|
+
return audioTemplateCallback(data);
|
|
526
|
+
} else {
|
|
527
|
+
return '<audio controls="controls" src="' + data.source + '">' + (data.altsource ? '\n<source src="' + data.altsource + '"' + (data.altsourcemime ? ' type="' + data.altsourcemime + '"' : '') + ' />\n' : '') + '</audio>';
|
|
528
|
+
}
|
|
719
529
|
};
|
|
720
530
|
const getVideoHtml = (data, videoTemplateCallback) => {
|
|
721
|
-
|
|
722
|
-
|
|
723
|
-
|
|
724
|
-
|
|
725
|
-
|
|
726
|
-
'" height="' + data.height + '"' +
|
|
727
|
-
(data.poster ? ' poster="' + data.poster + '"' : '') + ' controls="controls">\n' +
|
|
728
|
-
'<source src="' + data.source + '"' +
|
|
729
|
-
(data.sourcemime ? ' type="' + data.sourcemime + '"' : '') + ' />\n' +
|
|
730
|
-
(data.altsource ? '<source src="' + data.altsource + '"' +
|
|
731
|
-
(data.altsourcemime ? ' type="' + data.altsourcemime + '"' : '') + ' />\n' : '') +
|
|
732
|
-
'</video>');
|
|
733
|
-
}
|
|
531
|
+
if (videoTemplateCallback) {
|
|
532
|
+
return videoTemplateCallback(data);
|
|
533
|
+
} else {
|
|
534
|
+
return '<video width="' + data.width + '" height="' + data.height + '"' + (data.poster ? ' poster="' + data.poster + '"' : '') + ' controls="controls">\n' + '<source src="' + data.source + '"' + (data.sourcemime ? ' type="' + data.sourcemime + '"' : '') + ' />\n' + (data.altsource ? '<source src="' + data.altsource + '"' + (data.altsourcemime ? ' type="' + data.altsourcemime + '"' : '') + ' />\n' : '') + '</video>';
|
|
535
|
+
}
|
|
734
536
|
};
|
|
735
537
|
const dataToHtml = (editor, dataIn) => {
|
|
736
|
-
|
|
737
|
-
|
|
538
|
+
var _a;
|
|
539
|
+
const data = global$5.extend({}, dataIn);
|
|
540
|
+
if (!data.source) {
|
|
541
|
+
global$5.extend(data, htmlToData((_a = data.embed) !== null && _a !== void 0 ? _a : '', editor.schema));
|
|
738
542
|
if (!data.source) {
|
|
739
|
-
|
|
740
|
-
|
|
741
|
-
|
|
742
|
-
|
|
743
|
-
|
|
744
|
-
|
|
745
|
-
|
|
746
|
-
|
|
747
|
-
|
|
748
|
-
|
|
749
|
-
|
|
750
|
-
|
|
751
|
-
|
|
752
|
-
|
|
753
|
-
|
|
754
|
-
|
|
755
|
-
|
|
756
|
-
|
|
757
|
-
|
|
758
|
-
|
|
759
|
-
|
|
760
|
-
|
|
761
|
-
|
|
762
|
-
|
|
763
|
-
|
|
764
|
-
|
|
765
|
-
|
|
766
|
-
|
|
767
|
-
|
|
768
|
-
|
|
769
|
-
|
|
770
|
-
|
|
771
|
-
|
|
772
|
-
|
|
773
|
-
|
|
774
|
-
|
|
775
|
-
|
|
776
|
-
|
|
777
|
-
|
|
778
|
-
|
|
779
|
-
|
|
780
|
-
|
|
781
|
-
|
|
782
|
-
return getAudioHtml(data, audioTemplateCallback);
|
|
783
|
-
}
|
|
784
|
-
else {
|
|
785
|
-
return getVideoHtml(data, videoTemplateCallback);
|
|
786
|
-
}
|
|
787
|
-
}
|
|
543
|
+
return '';
|
|
544
|
+
}
|
|
545
|
+
}
|
|
546
|
+
if (!data.altsource) {
|
|
547
|
+
data.altsource = '';
|
|
548
|
+
}
|
|
549
|
+
if (!data.poster) {
|
|
550
|
+
data.poster = '';
|
|
551
|
+
}
|
|
552
|
+
data.source = editor.convertURL(data.source, 'source');
|
|
553
|
+
data.altsource = editor.convertURL(data.altsource, 'source');
|
|
554
|
+
data.sourcemime = guess(data.source);
|
|
555
|
+
data.altsourcemime = guess(data.altsource);
|
|
556
|
+
data.poster = editor.convertURL(data.poster, 'poster');
|
|
557
|
+
const pattern = matchPattern(data.source);
|
|
558
|
+
if (pattern) {
|
|
559
|
+
data.source = pattern.url;
|
|
560
|
+
data.type = pattern.type;
|
|
561
|
+
data.allowfullscreen = pattern.allowFullscreen;
|
|
562
|
+
data.width = data.width || String(pattern.w);
|
|
563
|
+
data.height = data.height || String(pattern.h);
|
|
564
|
+
}
|
|
565
|
+
if (data.embed) {
|
|
566
|
+
return updateHtml(data.embed, data, true, editor.schema);
|
|
567
|
+
} else {
|
|
568
|
+
const audioTemplateCallback = getAudioTemplateCallback(editor);
|
|
569
|
+
const videoTemplateCallback = getVideoTemplateCallback(editor);
|
|
570
|
+
const iframeTemplateCallback = getIframeTemplateCallback(editor);
|
|
571
|
+
data.width = data.width || '300';
|
|
572
|
+
data.height = data.height || '150';
|
|
573
|
+
global$5.each(data, (value, key) => {
|
|
574
|
+
data[key] = editor.dom.encode('' + value);
|
|
575
|
+
});
|
|
576
|
+
if (data.type === 'iframe') {
|
|
577
|
+
return getIframeHtml(data, iframeTemplateCallback);
|
|
578
|
+
} else if (data.sourcemime === 'application/x-shockwave-flash') {
|
|
579
|
+
return getFlashHtml(data);
|
|
580
|
+
} else if (data.sourcemime.indexOf('audio') !== -1) {
|
|
581
|
+
return getAudioHtml(data, audioTemplateCallback);
|
|
582
|
+
} else {
|
|
583
|
+
return getVideoHtml(data, videoTemplateCallback);
|
|
584
|
+
}
|
|
585
|
+
}
|
|
788
586
|
};
|
|
789
587
|
|
|
790
|
-
const isMediaElement =
|
|
791
|
-
const setup$2 =
|
|
792
|
-
|
|
793
|
-
editor.
|
|
794
|
-
|
|
795
|
-
|
|
796
|
-
|
|
797
|
-
|
|
798
|
-
}
|
|
799
|
-
|
|
800
|
-
|
|
801
|
-
|
|
802
|
-
|
|
803
|
-
|
|
804
|
-
|
|
805
|
-
|
|
806
|
-
|
|
807
|
-
|
|
808
|
-
|
|
809
|
-
|
|
810
|
-
|
|
811
|
-
|
|
812
|
-
|
|
813
|
-
target.setAttribute('data-mce-html', escape(updateHtml(html, {
|
|
814
|
-
width: String(e.width),
|
|
815
|
-
height: String(e.height)
|
|
816
|
-
}, false, editor.schema)));
|
|
817
|
-
}
|
|
818
|
-
}
|
|
819
|
-
});
|
|
588
|
+
const isMediaElement = element => element.hasAttribute('data-mce-object') || element.hasAttribute('data-ephox-embed-iri');
|
|
589
|
+
const setup$2 = editor => {
|
|
590
|
+
editor.on('click keyup touchend', () => {
|
|
591
|
+
const selectedNode = editor.selection.getNode();
|
|
592
|
+
if (selectedNode && editor.dom.hasClass(selectedNode, 'mce-preview-object')) {
|
|
593
|
+
if (editor.dom.getAttrib(selectedNode, 'data-mce-selected')) {
|
|
594
|
+
selectedNode.setAttribute('data-mce-selected', '2');
|
|
595
|
+
}
|
|
596
|
+
}
|
|
597
|
+
});
|
|
598
|
+
editor.on('ObjectResized', e => {
|
|
599
|
+
const target = e.target;
|
|
600
|
+
if (target.getAttribute('data-mce-object')) {
|
|
601
|
+
let html = target.getAttribute('data-mce-html');
|
|
602
|
+
if (html) {
|
|
603
|
+
html = unescape(html);
|
|
604
|
+
target.setAttribute('data-mce-html', escape(updateHtml(html, {
|
|
605
|
+
width: String(e.width),
|
|
606
|
+
height: String(e.height)
|
|
607
|
+
}, false, editor.schema)));
|
|
608
|
+
}
|
|
609
|
+
}
|
|
610
|
+
});
|
|
820
611
|
};
|
|
821
612
|
|
|
822
613
|
const cache = {};
|
|
823
614
|
const embedPromise = (data, dataToHtml, handler) => {
|
|
824
|
-
|
|
825
|
-
|
|
826
|
-
|
|
827
|
-
|
|
828
|
-
|
|
829
|
-
|
|
830
|
-
|
|
831
|
-
|
|
832
|
-
|
|
833
|
-
|
|
834
|
-
|
|
835
|
-
|
|
836
|
-
|
|
837
|
-
|
|
838
|
-
|
|
839
|
-
|
|
840
|
-
});
|
|
615
|
+
return new Promise((res, rej) => {
|
|
616
|
+
const wrappedResolve = response => {
|
|
617
|
+
if (response.html) {
|
|
618
|
+
cache[data.source] = response;
|
|
619
|
+
}
|
|
620
|
+
return res({
|
|
621
|
+
url: data.source,
|
|
622
|
+
html: response.html ? response.html : dataToHtml(data)
|
|
623
|
+
});
|
|
624
|
+
};
|
|
625
|
+
if (cache[data.source]) {
|
|
626
|
+
wrappedResolve(cache[data.source]);
|
|
627
|
+
} else {
|
|
628
|
+
handler({ url: data.source }, wrappedResolve, rej);
|
|
629
|
+
}
|
|
630
|
+
});
|
|
841
631
|
};
|
|
842
|
-
const defaultPromise = (data, dataToHtml) => Promise.resolve({
|
|
843
|
-
|
|
632
|
+
const defaultPromise = (data, dataToHtml) => Promise.resolve({
|
|
633
|
+
html: dataToHtml(data),
|
|
634
|
+
url: data.source
|
|
635
|
+
});
|
|
636
|
+
const loadedData = editor => data => dataToHtml(editor, data);
|
|
844
637
|
const getEmbedHtml = (editor, data) => {
|
|
845
|
-
|
|
846
|
-
|
|
638
|
+
const embedHandler = getUrlResolver(editor);
|
|
639
|
+
return embedHandler ? embedPromise(data, loadedData(editor), embedHandler) : defaultPromise(data, loadedData(editor));
|
|
847
640
|
};
|
|
848
|
-
const isCached =
|
|
641
|
+
const isCached = url => has(cache, url);
|
|
849
642
|
|
|
850
|
-
const extractMeta = (sourceInput, data) => get$1(data, sourceInput).bind(
|
|
851
|
-
const getValue = (data, metaData, sourceInput) =>
|
|
852
|
-
|
|
853
|
-
|
|
854
|
-
|
|
855
|
-
|
|
856
|
-
|
|
857
|
-
|
|
858
|
-
const getFromData = () => get$1(data, prop);
|
|
859
|
-
const getFromMetaData = () => get$1(metaData, prop);
|
|
860
|
-
const getNonEmptyValue = (c) => get$1(c, 'value').bind((v) => v.length > 0 ? Optional.some(v) : Optional.none());
|
|
861
|
-
const getFromValueFirst = () => getFromData().bind((child) => isObject(child)
|
|
862
|
-
? getNonEmptyValue(child).orThunk(getFromMetaData)
|
|
863
|
-
: getFromMetaData().orThunk(() => Optional.from(child)));
|
|
864
|
-
const getFromMetaFirst = () => getFromMetaData().orThunk(() => getFromData().bind((child) => isObject(child)
|
|
865
|
-
? getNonEmptyValue(child)
|
|
866
|
-
: Optional.from(child)));
|
|
867
|
-
return { [prop]: (prop === sourceInput ? getFromValueFirst() : getFromMetaFirst()).getOr('') };
|
|
643
|
+
const extractMeta = (sourceInput, data) => get$1(data, sourceInput).bind(mainData => get$1(mainData, 'meta'));
|
|
644
|
+
const getValue = (data, metaData, sourceInput) => prop => {
|
|
645
|
+
const getFromData = () => get$1(data, prop);
|
|
646
|
+
const getFromMetaData = () => get$1(metaData, prop);
|
|
647
|
+
const getNonEmptyValue = c => get$1(c, 'value').bind(v => v.length > 0 ? Optional.some(v) : Optional.none());
|
|
648
|
+
const getFromValueFirst = () => getFromData().bind(child => isObject(child) ? getNonEmptyValue(child).orThunk(getFromMetaData) : getFromMetaData().orThunk(() => Optional.from(child)));
|
|
649
|
+
const getFromMetaFirst = () => getFromMetaData().orThunk(() => getFromData().bind(child => isObject(child) ? getNonEmptyValue(child) : Optional.from(child)));
|
|
650
|
+
return { [prop]: (prop === sourceInput ? getFromValueFirst() : getFromMetaFirst()).getOr('') };
|
|
868
651
|
};
|
|
869
652
|
const getDimensions = (data, metaData) => {
|
|
870
|
-
|
|
871
|
-
|
|
872
|
-
|
|
873
|
-
|
|
874
|
-
|
|
653
|
+
const dimensions = {};
|
|
654
|
+
get$1(data, 'dimensions').each(dims => {
|
|
655
|
+
each$1([
|
|
656
|
+
'width',
|
|
657
|
+
'height'
|
|
658
|
+
], prop => {
|
|
659
|
+
get$1(metaData, prop).orThunk(() => get$1(dims, prop)).each(value => dimensions[prop] = value);
|
|
875
660
|
});
|
|
876
|
-
|
|
661
|
+
});
|
|
662
|
+
return dimensions;
|
|
877
663
|
};
|
|
878
664
|
const unwrap = (data, sourceInput) => {
|
|
879
|
-
|
|
880
|
-
|
|
881
|
-
|
|
882
|
-
|
|
883
|
-
|
|
884
|
-
|
|
885
|
-
|
|
886
|
-
|
|
887
|
-
|
|
665
|
+
const metaData = sourceInput && sourceInput !== 'dimensions' ? extractMeta(sourceInput, data).getOr({}) : {};
|
|
666
|
+
const get = getValue(data, metaData, sourceInput);
|
|
667
|
+
return {
|
|
668
|
+
...get('source'),
|
|
669
|
+
...get('altsource'),
|
|
670
|
+
...get('poster'),
|
|
671
|
+
...get('embed'),
|
|
672
|
+
...getDimensions(data, metaData)
|
|
673
|
+
};
|
|
888
674
|
};
|
|
889
|
-
const wrap =
|
|
890
|
-
|
|
891
|
-
|
|
892
|
-
|
|
893
|
-
|
|
894
|
-
|
|
895
|
-
|
|
896
|
-
|
|
897
|
-
|
|
898
|
-
|
|
899
|
-
|
|
900
|
-
|
|
901
|
-
|
|
902
|
-
|
|
675
|
+
const wrap = data => {
|
|
676
|
+
const wrapped = {
|
|
677
|
+
...data,
|
|
678
|
+
source: { value: get$1(data, 'source').getOr('') },
|
|
679
|
+
altsource: { value: get$1(data, 'altsource').getOr('') },
|
|
680
|
+
poster: { value: get$1(data, 'poster').getOr('') }
|
|
681
|
+
};
|
|
682
|
+
each$1([
|
|
683
|
+
'width',
|
|
684
|
+
'height'
|
|
685
|
+
], prop => {
|
|
686
|
+
get$1(data, prop).each(value => {
|
|
687
|
+
const dimensions = wrapped.dimensions || {};
|
|
688
|
+
dimensions[prop] = value;
|
|
689
|
+
wrapped.dimensions = dimensions;
|
|
903
690
|
});
|
|
904
|
-
|
|
691
|
+
});
|
|
692
|
+
return wrapped;
|
|
905
693
|
};
|
|
906
|
-
const handleError =
|
|
907
|
-
|
|
908
|
-
|
|
909
|
-
|
|
910
|
-
|
|
694
|
+
const handleError = editor => error => {
|
|
695
|
+
const errorMessage = error && error.msg ? 'Media embed handler error: ' + error.msg : 'Media embed handler threw unknown error.';
|
|
696
|
+
editor.notificationManager.open({
|
|
697
|
+
type: 'error',
|
|
698
|
+
text: errorMessage
|
|
699
|
+
});
|
|
911
700
|
};
|
|
912
|
-
const getEditorData =
|
|
913
|
-
|
|
914
|
-
|
|
915
|
-
|
|
916
|
-
|
|
917
|
-
|
|
918
|
-
|
|
919
|
-
|
|
920
|
-
|
|
921
|
-
|
|
922
|
-
|
|
923
|
-
|
|
924
|
-
|
|
925
|
-
|
|
926
|
-
|
|
927
|
-
|
|
928
|
-
|
|
929
|
-
|
|
930
|
-
|
|
931
|
-
|
|
932
|
-
|
|
933
|
-
};
|
|
701
|
+
const getEditorData = editor => {
|
|
702
|
+
const element = editor.selection.getNode();
|
|
703
|
+
const snippet = isMediaElement(element) ? editor.serializer.serialize(element, { selection: true }) : '';
|
|
704
|
+
const data = htmlToData(snippet, editor.schema);
|
|
705
|
+
const getDimensionsOfElement = () => {
|
|
706
|
+
if (isEmbedIframe(data.source, data.type)) {
|
|
707
|
+
const rect = editor.dom.getRect(element);
|
|
708
|
+
return {
|
|
709
|
+
width: rect.w.toString().replace(/px$/, ''),
|
|
710
|
+
height: rect.h.toString().replace(/px$/, '')
|
|
711
|
+
};
|
|
712
|
+
} else {
|
|
713
|
+
return {};
|
|
714
|
+
}
|
|
715
|
+
};
|
|
716
|
+
const dimensions = getDimensionsOfElement();
|
|
717
|
+
return {
|
|
718
|
+
embed: snippet,
|
|
719
|
+
...data,
|
|
720
|
+
...dimensions
|
|
721
|
+
};
|
|
934
722
|
};
|
|
935
|
-
const addEmbedHtml = (api, editor) =>
|
|
936
|
-
|
|
937
|
-
|
|
938
|
-
|
|
939
|
-
|
|
940
|
-
|
|
941
|
-
|
|
942
|
-
|
|
943
|
-
|
|
944
|
-
|
|
945
|
-
|
|
946
|
-
}
|
|
723
|
+
const addEmbedHtml = (api, editor) => response => {
|
|
724
|
+
if (isString(response.url) && response.url.trim().length > 0) {
|
|
725
|
+
const html = response.html;
|
|
726
|
+
const snippetData = htmlToData(html, editor.schema);
|
|
727
|
+
const nuData = {
|
|
728
|
+
...snippetData,
|
|
729
|
+
source: response.url,
|
|
730
|
+
embed: html
|
|
731
|
+
};
|
|
732
|
+
api.setData(wrap(nuData));
|
|
733
|
+
}
|
|
947
734
|
};
|
|
948
735
|
const selectPlaceholder = (editor, beforeObjects) => {
|
|
949
|
-
|
|
950
|
-
|
|
951
|
-
for (let
|
|
952
|
-
|
|
953
|
-
|
|
954
|
-
|
|
955
|
-
|
|
956
|
-
|
|
957
|
-
|
|
958
|
-
editor.selection.select(afterObjects[0]);
|
|
736
|
+
const afterObjects = editor.dom.select('*[data-mce-object]');
|
|
737
|
+
for (let i = 0; i < beforeObjects.length; i++) {
|
|
738
|
+
for (let y = afterObjects.length - 1; y >= 0; y--) {
|
|
739
|
+
if (beforeObjects[i] === afterObjects[y]) {
|
|
740
|
+
afterObjects.splice(y, 1);
|
|
741
|
+
}
|
|
742
|
+
}
|
|
743
|
+
}
|
|
744
|
+
editor.selection.select(afterObjects[0]);
|
|
959
745
|
};
|
|
960
746
|
const handleInsert = (editor, html) => {
|
|
961
|
-
|
|
962
|
-
|
|
963
|
-
|
|
964
|
-
|
|
747
|
+
const beforeObjects = editor.dom.select('*[data-mce-object]');
|
|
748
|
+
editor.insertContent(html);
|
|
749
|
+
selectPlaceholder(editor, beforeObjects);
|
|
750
|
+
editor.nodeChanged();
|
|
965
751
|
};
|
|
966
752
|
const isEmbedIframe = (url, mediaDataType) => isNonNullable(mediaDataType) && mediaDataType === 'ephox-embed-iri' && isNonNullable(matchPattern(url));
|
|
967
753
|
const shouldInsertAsNewIframe = (prevData, newData) => {
|
|
968
|
-
|
|
969
|
-
|
|
754
|
+
const hasDimensionsChanged = (prevData, newData) => prevData.width !== newData.width || prevData.height !== newData.height;
|
|
755
|
+
return hasDimensionsChanged(prevData, newData) && isEmbedIframe(newData.source, prevData.type);
|
|
970
756
|
};
|
|
971
757
|
const submitForm = (prevData, newData, editor) => {
|
|
972
|
-
|
|
973
|
-
|
|
974
|
-
|
|
975
|
-
|
|
976
|
-
|
|
977
|
-
|
|
978
|
-
|
|
979
|
-
|
|
980
|
-
|
|
981
|
-
|
|
982
|
-
|
|
983
|
-
|
|
984
|
-
handleInsert(editor, response.html);
|
|
985
|
-
}).catch(handleError(editor));
|
|
986
|
-
}
|
|
758
|
+
var _a;
|
|
759
|
+
newData.embed = shouldInsertAsNewIframe(prevData, newData) && hasDimensions(editor) ? dataToHtml(editor, {
|
|
760
|
+
...newData,
|
|
761
|
+
embed: ''
|
|
762
|
+
}) : updateHtml((_a = newData.embed) !== null && _a !== void 0 ? _a : '', newData, false, editor.schema);
|
|
763
|
+
if (newData.embed && (prevData.source === newData.source || isCached(newData.source))) {
|
|
764
|
+
handleInsert(editor, newData.embed);
|
|
765
|
+
} else {
|
|
766
|
+
getEmbedHtml(editor, newData).then(response => {
|
|
767
|
+
handleInsert(editor, response.html);
|
|
768
|
+
}).catch(handleError(editor));
|
|
769
|
+
}
|
|
987
770
|
};
|
|
988
|
-
const showDialog =
|
|
989
|
-
|
|
990
|
-
|
|
991
|
-
|
|
992
|
-
|
|
993
|
-
|
|
994
|
-
|
|
995
|
-
|
|
996
|
-
|
|
997
|
-
|
|
998
|
-
|
|
999
|
-
|
|
1000
|
-
|
|
1001
|
-
|
|
1002
|
-
|
|
1003
|
-
|
|
1004
|
-
|
|
1005
|
-
|
|
1006
|
-
|
|
1007
|
-
|
|
1008
|
-
|
|
1009
|
-
|
|
1010
|
-
|
|
1011
|
-
|
|
1012
|
-
|
|
1013
|
-
|
|
1014
|
-
|
|
1015
|
-
|
|
1016
|
-
|
|
1017
|
-
|
|
1018
|
-
};
|
|
1019
|
-
|
|
1020
|
-
|
|
1021
|
-
|
|
1022
|
-
|
|
1023
|
-
|
|
1024
|
-
|
|
1025
|
-
|
|
1026
|
-
|
|
1027
|
-
|
|
1028
|
-
|
|
1029
|
-
|
|
1030
|
-
|
|
1031
|
-
|
|
1032
|
-
|
|
1033
|
-
|
|
1034
|
-
|
|
1035
|
-
|
|
1036
|
-
|
|
1037
|
-
|
|
1038
|
-
|
|
1039
|
-
|
|
1040
|
-
|
|
1041
|
-
|
|
1042
|
-
|
|
1043
|
-
|
|
1044
|
-
|
|
1045
|
-
|
|
1046
|
-
|
|
1047
|
-
|
|
1048
|
-
|
|
1049
|
-
|
|
1050
|
-
|
|
1051
|
-
|
|
1052
|
-
|
|
1053
|
-
|
|
1054
|
-
|
|
1055
|
-
|
|
1056
|
-
|
|
1057
|
-
|
|
1058
|
-
|
|
1059
|
-
|
|
1060
|
-
|
|
1061
|
-
|
|
1062
|
-
|
|
1063
|
-
|
|
1064
|
-
|
|
1065
|
-
const advancedTab = {
|
|
1066
|
-
title: 'Advanced',
|
|
1067
|
-
name: 'advanced',
|
|
1068
|
-
items: advancedFormItems
|
|
1069
|
-
};
|
|
1070
|
-
const tabs = [
|
|
1071
|
-
generalTab,
|
|
1072
|
-
embedTab
|
|
1073
|
-
];
|
|
1074
|
-
if (advancedFormItems.length > 0) {
|
|
1075
|
-
tabs.push(advancedTab);
|
|
1076
|
-
}
|
|
1077
|
-
const body = {
|
|
1078
|
-
type: 'tabpanel',
|
|
1079
|
-
tabs
|
|
1080
|
-
};
|
|
1081
|
-
const win = editor.windowManager.open({
|
|
1082
|
-
title: 'Insert/Edit Media',
|
|
1083
|
-
size: 'normal',
|
|
1084
|
-
body,
|
|
1085
|
-
buttons: [
|
|
1086
|
-
{
|
|
1087
|
-
type: 'cancel',
|
|
1088
|
-
name: 'cancel',
|
|
1089
|
-
text: 'Cancel'
|
|
1090
|
-
},
|
|
1091
|
-
{
|
|
1092
|
-
type: 'submit',
|
|
1093
|
-
name: 'save',
|
|
1094
|
-
text: 'Save',
|
|
1095
|
-
primary: true
|
|
1096
|
-
}
|
|
1097
|
-
],
|
|
1098
|
-
onSubmit: (api) => {
|
|
1099
|
-
const serviceData = unwrap(api.getData());
|
|
1100
|
-
submitForm(currentData.get(), serviceData, editor);
|
|
1101
|
-
api.close();
|
|
1102
|
-
},
|
|
1103
|
-
onChange: (api, detail) => {
|
|
1104
|
-
switch (detail.name) {
|
|
1105
|
-
case 'source':
|
|
1106
|
-
handleSource(currentData.get(), api);
|
|
1107
|
-
break;
|
|
1108
|
-
case 'embed':
|
|
1109
|
-
handleEmbed(api);
|
|
1110
|
-
break;
|
|
1111
|
-
case 'dimensions':
|
|
1112
|
-
case 'altsource':
|
|
1113
|
-
case 'poster':
|
|
1114
|
-
handleUpdate(api, detail.name, currentData.get());
|
|
1115
|
-
break;
|
|
1116
|
-
}
|
|
1117
|
-
currentData.set(unwrap(api.getData()));
|
|
1118
|
-
},
|
|
1119
|
-
initialData
|
|
771
|
+
const showDialog = editor => {
|
|
772
|
+
const editorData = getEditorData(editor);
|
|
773
|
+
const currentData = Cell(editorData);
|
|
774
|
+
const initialData = wrap(editorData);
|
|
775
|
+
const handleSource = (prevData, api) => {
|
|
776
|
+
const serviceData = unwrap(api.getData(), 'source');
|
|
777
|
+
if (prevData.source !== serviceData.source) {
|
|
778
|
+
addEmbedHtml(win, editor)({
|
|
779
|
+
url: serviceData.source,
|
|
780
|
+
html: ''
|
|
781
|
+
});
|
|
782
|
+
getEmbedHtml(editor, serviceData).then(addEmbedHtml(win, editor)).catch(handleError(editor));
|
|
783
|
+
}
|
|
784
|
+
};
|
|
785
|
+
const handleEmbed = api => {
|
|
786
|
+
var _a;
|
|
787
|
+
const data = unwrap(api.getData());
|
|
788
|
+
const dataFromEmbed = htmlToData((_a = data.embed) !== null && _a !== void 0 ? _a : '', editor.schema);
|
|
789
|
+
api.setData(wrap(dataFromEmbed));
|
|
790
|
+
};
|
|
791
|
+
const handleUpdate = (api, sourceInput, prevData) => {
|
|
792
|
+
const dialogData = unwrap(api.getData(), sourceInput);
|
|
793
|
+
const data = shouldInsertAsNewIframe(prevData, dialogData) && hasDimensions(editor) ? {
|
|
794
|
+
...dialogData,
|
|
795
|
+
embed: ''
|
|
796
|
+
} : dialogData;
|
|
797
|
+
const embed = dataToHtml(editor, data);
|
|
798
|
+
api.setData(wrap({
|
|
799
|
+
...data,
|
|
800
|
+
embed
|
|
801
|
+
}));
|
|
802
|
+
};
|
|
803
|
+
const mediaInput = [{
|
|
804
|
+
name: 'source',
|
|
805
|
+
type: 'urlinput',
|
|
806
|
+
filetype: 'media',
|
|
807
|
+
label: 'Source',
|
|
808
|
+
picker_text: 'Browse files'
|
|
809
|
+
}];
|
|
810
|
+
const sizeInput = !hasDimensions(editor) ? [] : [{
|
|
811
|
+
type: 'sizeinput',
|
|
812
|
+
name: 'dimensions',
|
|
813
|
+
label: 'Constrain proportions',
|
|
814
|
+
constrain: true
|
|
815
|
+
}];
|
|
816
|
+
const generalTab = {
|
|
817
|
+
title: 'General',
|
|
818
|
+
name: 'general',
|
|
819
|
+
items: flatten([
|
|
820
|
+
mediaInput,
|
|
821
|
+
sizeInput
|
|
822
|
+
])
|
|
823
|
+
};
|
|
824
|
+
const embedTextarea = {
|
|
825
|
+
type: 'textarea',
|
|
826
|
+
name: 'embed',
|
|
827
|
+
label: 'Paste your embed code below:'
|
|
828
|
+
};
|
|
829
|
+
const embedTab = {
|
|
830
|
+
title: 'Embed',
|
|
831
|
+
items: [embedTextarea]
|
|
832
|
+
};
|
|
833
|
+
const advancedFormItems = [];
|
|
834
|
+
if (hasAltSource(editor)) {
|
|
835
|
+
advancedFormItems.push({
|
|
836
|
+
name: 'altsource',
|
|
837
|
+
type: 'urlinput',
|
|
838
|
+
filetype: 'media',
|
|
839
|
+
label: 'Alternative source URL'
|
|
840
|
+
});
|
|
841
|
+
}
|
|
842
|
+
if (hasPoster(editor)) {
|
|
843
|
+
advancedFormItems.push({
|
|
844
|
+
name: 'poster',
|
|
845
|
+
type: 'urlinput',
|
|
846
|
+
filetype: 'image',
|
|
847
|
+
label: 'Media poster (Image URL)'
|
|
1120
848
|
});
|
|
849
|
+
}
|
|
850
|
+
const advancedTab = {
|
|
851
|
+
title: 'Advanced',
|
|
852
|
+
name: 'advanced',
|
|
853
|
+
items: advancedFormItems
|
|
854
|
+
};
|
|
855
|
+
const tabs = [
|
|
856
|
+
generalTab,
|
|
857
|
+
embedTab
|
|
858
|
+
];
|
|
859
|
+
if (advancedFormItems.length > 0) {
|
|
860
|
+
tabs.push(advancedTab);
|
|
861
|
+
}
|
|
862
|
+
const body = {
|
|
863
|
+
type: 'tabpanel',
|
|
864
|
+
tabs
|
|
865
|
+
};
|
|
866
|
+
const win = editor.windowManager.open({
|
|
867
|
+
title: 'Insert/Edit Media',
|
|
868
|
+
size: 'normal',
|
|
869
|
+
body,
|
|
870
|
+
buttons: [
|
|
871
|
+
{
|
|
872
|
+
type: 'cancel',
|
|
873
|
+
name: 'cancel',
|
|
874
|
+
text: 'Cancel'
|
|
875
|
+
},
|
|
876
|
+
{
|
|
877
|
+
type: 'submit',
|
|
878
|
+
name: 'save',
|
|
879
|
+
text: 'Save',
|
|
880
|
+
primary: true
|
|
881
|
+
}
|
|
882
|
+
],
|
|
883
|
+
onSubmit: api => {
|
|
884
|
+
const serviceData = unwrap(api.getData());
|
|
885
|
+
submitForm(currentData.get(), serviceData, editor);
|
|
886
|
+
api.close();
|
|
887
|
+
},
|
|
888
|
+
onChange: (api, detail) => {
|
|
889
|
+
switch (detail.name) {
|
|
890
|
+
case 'source':
|
|
891
|
+
handleSource(currentData.get(), api);
|
|
892
|
+
break;
|
|
893
|
+
case 'embed':
|
|
894
|
+
handleEmbed(api);
|
|
895
|
+
break;
|
|
896
|
+
case 'dimensions':
|
|
897
|
+
case 'altsource':
|
|
898
|
+
case 'poster':
|
|
899
|
+
handleUpdate(api, detail.name, currentData.get());
|
|
900
|
+
break;
|
|
901
|
+
}
|
|
902
|
+
currentData.set(unwrap(api.getData()));
|
|
903
|
+
},
|
|
904
|
+
initialData
|
|
905
|
+
});
|
|
1121
906
|
};
|
|
1122
907
|
|
|
1123
|
-
const get =
|
|
1124
|
-
|
|
1125
|
-
|
|
1126
|
-
|
|
1127
|
-
|
|
1128
|
-
showDialog: showDialog$1
|
|
1129
|
-
};
|
|
908
|
+
const get = editor => {
|
|
909
|
+
const showDialog$1 = () => {
|
|
910
|
+
showDialog(editor);
|
|
911
|
+
};
|
|
912
|
+
return { showDialog: showDialog$1 };
|
|
1130
913
|
};
|
|
1131
914
|
|
|
1132
|
-
const register$1 =
|
|
1133
|
-
|
|
1134
|
-
|
|
1135
|
-
|
|
1136
|
-
|
|
915
|
+
const register$1 = editor => {
|
|
916
|
+
const showDialog$1 = () => {
|
|
917
|
+
showDialog(editor);
|
|
918
|
+
};
|
|
919
|
+
editor.addCommand('mceMedia', showDialog$1);
|
|
920
|
+
};
|
|
921
|
+
|
|
922
|
+
const checkRange = (str, substr, start) => substr === '' || str.length >= substr.length && str.substr(start, start + substr.length) === substr;
|
|
923
|
+
const startsWith = (str, prefix) => {
|
|
924
|
+
return checkRange(str, prefix, 0);
|
|
1137
925
|
};
|
|
1138
926
|
|
|
1139
927
|
var global = tinymce.util.Tools.resolve('tinymce.Env');
|
|
1140
928
|
|
|
1141
|
-
const isLiveEmbedNode =
|
|
1142
|
-
|
|
1143
|
-
|
|
929
|
+
const isLiveEmbedNode = node => {
|
|
930
|
+
const name = node.name;
|
|
931
|
+
return name === 'iframe' || name === 'video' || name === 'audio';
|
|
1144
932
|
};
|
|
1145
933
|
const getDimension = (node, styles, dimension, defaultValue = null) => {
|
|
1146
|
-
|
|
1147
|
-
|
|
1148
|
-
|
|
1149
|
-
|
|
1150
|
-
|
|
1151
|
-
|
|
1152
|
-
|
|
1153
|
-
|
|
1154
|
-
return null;
|
|
1155
|
-
}
|
|
934
|
+
const value = node.attr(dimension);
|
|
935
|
+
if (isNonNullable(value)) {
|
|
936
|
+
return value;
|
|
937
|
+
} else if (!has(styles, dimension)) {
|
|
938
|
+
return defaultValue;
|
|
939
|
+
} else {
|
|
940
|
+
return null;
|
|
941
|
+
}
|
|
1156
942
|
};
|
|
1157
943
|
const setDimensions = (node, previewNode, styles) => {
|
|
1158
|
-
|
|
1159
|
-
|
|
1160
|
-
|
|
1161
|
-
|
|
1162
|
-
|
|
1163
|
-
|
|
1164
|
-
|
|
1165
|
-
|
|
1166
|
-
height: getDimension(node, styles, 'height', defaultHeight)
|
|
1167
|
-
});
|
|
944
|
+
const useDefaults = previewNode.name === 'img' || node.name === 'video';
|
|
945
|
+
const defaultWidth = useDefaults ? '300' : null;
|
|
946
|
+
const fallbackHeight = node.name === 'audio' ? '30' : '150';
|
|
947
|
+
const defaultHeight = useDefaults ? fallbackHeight : null;
|
|
948
|
+
previewNode.attr({
|
|
949
|
+
width: getDimension(node, styles, 'width', defaultWidth),
|
|
950
|
+
height: getDimension(node, styles, 'height', defaultHeight)
|
|
951
|
+
});
|
|
1168
952
|
};
|
|
1169
953
|
const appendNodeContent = (editor, nodeName, previewNode, html) => {
|
|
1170
|
-
|
|
1171
|
-
|
|
1172
|
-
|
|
1173
|
-
|
|
954
|
+
const newNode = Parser(editor.schema).parse(html, { context: nodeName });
|
|
955
|
+
while (newNode.firstChild) {
|
|
956
|
+
previewNode.append(newNode.firstChild);
|
|
957
|
+
}
|
|
1174
958
|
};
|
|
1175
959
|
const createPlaceholderNode = (editor, node) => {
|
|
1176
|
-
|
|
1177
|
-
|
|
1178
|
-
|
|
1179
|
-
|
|
1180
|
-
|
|
1181
|
-
|
|
1182
|
-
|
|
1183
|
-
|
|
1184
|
-
|
|
1185
|
-
|
|
1186
|
-
|
|
960
|
+
const name = node.name;
|
|
961
|
+
const placeHolder = new global$2('img', 1);
|
|
962
|
+
retainAttributesAndInnerHtml(editor, node, placeHolder);
|
|
963
|
+
setDimensions(node, placeHolder, {});
|
|
964
|
+
placeHolder.attr({
|
|
965
|
+
'style': node.attr('style'),
|
|
966
|
+
'src': global.transparentSrc,
|
|
967
|
+
'data-mce-object': name,
|
|
968
|
+
'class': 'mce-object mce-object-' + name
|
|
969
|
+
});
|
|
970
|
+
return placeHolder;
|
|
1187
971
|
};
|
|
1188
972
|
const createPreviewNode = (editor, node) => {
|
|
1189
|
-
|
|
1190
|
-
|
|
1191
|
-
|
|
1192
|
-
|
|
1193
|
-
|
|
1194
|
-
|
|
1195
|
-
|
|
1196
|
-
|
|
1197
|
-
|
|
1198
|
-
|
|
1199
|
-
|
|
1200
|
-
|
|
1201
|
-
|
|
973
|
+
var _a;
|
|
974
|
+
const name = node.name;
|
|
975
|
+
const previewWrapper = new global$2('span', 1);
|
|
976
|
+
previewWrapper.attr({
|
|
977
|
+
'contentEditable': 'false',
|
|
978
|
+
'style': node.attr('style'),
|
|
979
|
+
'data-mce-object': name,
|
|
980
|
+
'class': 'mce-preview-object mce-object-' + name
|
|
981
|
+
});
|
|
982
|
+
retainAttributesAndInnerHtml(editor, node, previewWrapper);
|
|
983
|
+
const styles = editor.dom.parseStyle((_a = node.attr('style')) !== null && _a !== void 0 ? _a : '');
|
|
984
|
+
const previewNode = new global$2(name, 1);
|
|
985
|
+
setDimensions(node, previewNode, styles);
|
|
986
|
+
previewNode.attr({
|
|
987
|
+
src: node.attr('src'),
|
|
988
|
+
style: node.attr('style'),
|
|
989
|
+
class: node.attr('class')
|
|
990
|
+
});
|
|
991
|
+
if (name === 'iframe') {
|
|
1202
992
|
previewNode.attr({
|
|
1203
|
-
|
|
1204
|
-
|
|
1205
|
-
|
|
993
|
+
allowfullscreen: node.attr('allowfullscreen'),
|
|
994
|
+
frameborder: '0',
|
|
995
|
+
sandbox: node.attr('sandbox')
|
|
1206
996
|
});
|
|
1207
|
-
|
|
1208
|
-
|
|
1209
|
-
|
|
1210
|
-
|
|
1211
|
-
|
|
1212
|
-
|
|
1213
|
-
|
|
1214
|
-
|
|
1215
|
-
|
|
1216
|
-
|
|
1217
|
-
|
|
1218
|
-
|
|
1219
|
-
|
|
1220
|
-
|
|
1221
|
-
|
|
1222
|
-
|
|
1223
|
-
|
|
1224
|
-
|
|
1225
|
-
|
|
1226
|
-
|
|
1227
|
-
|
|
1228
|
-
|
|
1229
|
-
|
|
1230
|
-
previewWrapper.append(shimNode);
|
|
1231
|
-
return previewWrapper;
|
|
997
|
+
} else {
|
|
998
|
+
const attrs = [
|
|
999
|
+
'controls',
|
|
1000
|
+
'crossorigin',
|
|
1001
|
+
'currentTime',
|
|
1002
|
+
'loop',
|
|
1003
|
+
'muted',
|
|
1004
|
+
'poster',
|
|
1005
|
+
'preload'
|
|
1006
|
+
];
|
|
1007
|
+
each$1(attrs, attrName => {
|
|
1008
|
+
previewNode.attr(attrName, node.attr(attrName));
|
|
1009
|
+
});
|
|
1010
|
+
const sanitizedHtml = previewWrapper.attr('data-mce-html');
|
|
1011
|
+
if (isNonNullable(sanitizedHtml)) {
|
|
1012
|
+
appendNodeContent(editor, name, previewNode, unescape(sanitizedHtml));
|
|
1013
|
+
}
|
|
1014
|
+
}
|
|
1015
|
+
const shimNode = new global$2('span', 1);
|
|
1016
|
+
shimNode.attr('class', 'mce-shim');
|
|
1017
|
+
previewWrapper.append(previewNode);
|
|
1018
|
+
previewWrapper.append(shimNode);
|
|
1019
|
+
return previewWrapper;
|
|
1232
1020
|
};
|
|
1233
1021
|
const retainAttributesAndInnerHtml = (editor, sourceNode, targetNode) => {
|
|
1234
|
-
|
|
1235
|
-
|
|
1236
|
-
|
|
1237
|
-
|
|
1238
|
-
|
|
1239
|
-
|
|
1240
|
-
|
|
1241
|
-
|
|
1242
|
-
|
|
1243
|
-
|
|
1244
|
-
|
|
1245
|
-
|
|
1246
|
-
|
|
1247
|
-
|
|
1248
|
-
|
|
1249
|
-
|
|
1250
|
-
|
|
1251
|
-
|
|
1252
|
-
|
|
1253
|
-
|
|
1254
|
-
|
|
1255
|
-
if (innerHtml) {
|
|
1256
|
-
targetNode.attr('data-mce-html', escape(innerHtml));
|
|
1257
|
-
targetNode.empty();
|
|
1258
|
-
}
|
|
1022
|
+
var _a;
|
|
1023
|
+
const attribs = (_a = sourceNode.attributes) !== null && _a !== void 0 ? _a : [];
|
|
1024
|
+
let ai = attribs.length;
|
|
1025
|
+
while (ai--) {
|
|
1026
|
+
const attrName = attribs[ai].name;
|
|
1027
|
+
let attrValue = attribs[ai].value;
|
|
1028
|
+
if (attrName !== 'width' && attrName !== 'height' && attrName !== 'style' && !startsWith(attrName, 'data-mce-')) {
|
|
1029
|
+
if (attrName === 'data' || attrName === 'src') {
|
|
1030
|
+
attrValue = editor.convertURL(attrValue, attrName);
|
|
1031
|
+
}
|
|
1032
|
+
targetNode.attr('data-mce-p-' + attrName, attrValue);
|
|
1033
|
+
}
|
|
1034
|
+
}
|
|
1035
|
+
const serializer = global$1({ inner: true }, editor.schema);
|
|
1036
|
+
const tempNode = new global$2('div', 1);
|
|
1037
|
+
each$1(sourceNode.children(), child => tempNode.append(child));
|
|
1038
|
+
const innerHtml = serializer.serialize(tempNode);
|
|
1039
|
+
if (innerHtml) {
|
|
1040
|
+
targetNode.attr('data-mce-html', escape(innerHtml));
|
|
1041
|
+
targetNode.empty();
|
|
1042
|
+
}
|
|
1259
1043
|
};
|
|
1260
|
-
const isPageEmbedWrapper =
|
|
1261
|
-
|
|
1262
|
-
|
|
1044
|
+
const isPageEmbedWrapper = node => {
|
|
1045
|
+
const nodeClass = node.attr('class');
|
|
1046
|
+
return isString(nodeClass) && /\btiny-pageembed\b/.test(nodeClass);
|
|
1263
1047
|
};
|
|
1264
|
-
const isWithinEmbedWrapper =
|
|
1265
|
-
|
|
1266
|
-
|
|
1267
|
-
|
|
1268
|
-
|
|
1269
|
-
|
|
1270
|
-
|
|
1271
|
-
|
|
1048
|
+
const isWithinEmbedWrapper = node => {
|
|
1049
|
+
let tempNode = node;
|
|
1050
|
+
while (tempNode = tempNode.parent) {
|
|
1051
|
+
if (tempNode.attr('data-ephox-embed-iri') || isPageEmbedWrapper(tempNode)) {
|
|
1052
|
+
return true;
|
|
1053
|
+
}
|
|
1054
|
+
}
|
|
1055
|
+
return false;
|
|
1272
1056
|
};
|
|
1273
|
-
const placeHolderConverter =
|
|
1274
|
-
|
|
1275
|
-
|
|
1276
|
-
|
|
1277
|
-
|
|
1278
|
-
|
|
1279
|
-
|
|
1280
|
-
|
|
1281
|
-
|
|
1282
|
-
|
|
1283
|
-
|
|
1284
|
-
|
|
1285
|
-
|
|
1286
|
-
|
|
1287
|
-
|
|
1288
|
-
|
|
1289
|
-
|
|
1290
|
-
|
|
1291
|
-
|
|
1292
|
-
|
|
1293
|
-
|
|
1294
|
-
}
|
|
1057
|
+
const placeHolderConverter = editor => nodes => {
|
|
1058
|
+
let i = nodes.length;
|
|
1059
|
+
let node;
|
|
1060
|
+
while (i--) {
|
|
1061
|
+
node = nodes[i];
|
|
1062
|
+
if (!node.parent) {
|
|
1063
|
+
continue;
|
|
1064
|
+
}
|
|
1065
|
+
if (node.parent.attr('data-mce-object')) {
|
|
1066
|
+
continue;
|
|
1067
|
+
}
|
|
1068
|
+
if (isLiveEmbedNode(node) && hasLiveEmbeds(editor)) {
|
|
1069
|
+
if (!isWithinEmbedWrapper(node)) {
|
|
1070
|
+
node.replace(createPreviewNode(editor, node));
|
|
1071
|
+
}
|
|
1072
|
+
} else {
|
|
1073
|
+
if (!isWithinEmbedWrapper(node)) {
|
|
1074
|
+
node.replace(createPlaceholderNode(editor, node));
|
|
1075
|
+
}
|
|
1076
|
+
}
|
|
1077
|
+
}
|
|
1295
1078
|
};
|
|
1296
1079
|
|
|
1297
|
-
const parseAndSanitize = (editor, html) => {
|
|
1298
|
-
|
|
1299
|
-
|
|
1300
|
-
|
|
1301
|
-
|
|
1080
|
+
const parseAndSanitize = (editor, context, html) => {
|
|
1081
|
+
const getEditorOption = editor.options.get;
|
|
1082
|
+
const sanitize = getEditorOption('xss_sanitization');
|
|
1083
|
+
const validate = shouldFilterHtml(editor);
|
|
1084
|
+
return Parser(editor.schema, {
|
|
1085
|
+
sanitize,
|
|
1086
|
+
validate
|
|
1087
|
+
}).parse(html, { context });
|
|
1302
1088
|
};
|
|
1303
1089
|
|
|
1304
|
-
const
|
|
1305
|
-
|
|
1306
|
-
const
|
|
1307
|
-
const
|
|
1308
|
-
|
|
1309
|
-
|
|
1310
|
-
|
|
1311
|
-
|
|
1312
|
-
|
|
1313
|
-
|
|
1314
|
-
|
|
1315
|
-
|
|
1316
|
-
|
|
1317
|
-
|
|
1318
|
-
|
|
1319
|
-
|
|
1320
|
-
|
|
1090
|
+
const setup$1 = editor => {
|
|
1091
|
+
editor.on('PreInit', () => {
|
|
1092
|
+
const {schema, serializer, parser} = editor;
|
|
1093
|
+
const boolAttrs = schema.getBoolAttrs();
|
|
1094
|
+
each$1('webkitallowfullscreen mozallowfullscreen'.split(' '), name => {
|
|
1095
|
+
boolAttrs[name] = {};
|
|
1096
|
+
});
|
|
1097
|
+
each({ embed: ['wmode'] }, (attrs, name) => {
|
|
1098
|
+
const rule = schema.getElementRule(name);
|
|
1099
|
+
if (rule) {
|
|
1100
|
+
each$1(attrs, attr => {
|
|
1101
|
+
rule.attributes[attr] = {};
|
|
1102
|
+
rule.attributesOrder.push(attr);
|
|
1103
|
+
});
|
|
1104
|
+
}
|
|
1105
|
+
});
|
|
1106
|
+
parser.addNodeFilter('iframe,video,audio,object,embed', placeHolderConverter(editor));
|
|
1107
|
+
serializer.addAttributeFilter('data-mce-object', (nodes, name) => {
|
|
1108
|
+
var _a;
|
|
1109
|
+
let i = nodes.length;
|
|
1110
|
+
while (i--) {
|
|
1111
|
+
const node = nodes[i];
|
|
1112
|
+
if (!node.parent) {
|
|
1113
|
+
continue;
|
|
1321
1114
|
}
|
|
1322
|
-
|
|
1323
|
-
|
|
1324
|
-
|
|
1325
|
-
|
|
1326
|
-
|
|
1327
|
-
|
|
1328
|
-
|
|
1329
|
-
|
|
1330
|
-
}
|
|
1115
|
+
const realElmName = node.attr(name);
|
|
1116
|
+
const realElm = new global$2(realElmName, 1);
|
|
1117
|
+
if (realElmName !== 'audio') {
|
|
1118
|
+
const className = node.attr('class');
|
|
1119
|
+
if (className && className.indexOf('mce-preview-object') !== -1 && node.firstChild) {
|
|
1120
|
+
realElm.attr({
|
|
1121
|
+
width: node.firstChild.attr('width'),
|
|
1122
|
+
height: node.firstChild.attr('height')
|
|
1123
|
+
});
|
|
1124
|
+
} else {
|
|
1125
|
+
realElm.attr({
|
|
1126
|
+
width: node.attr('width'),
|
|
1127
|
+
height: node.attr('height')
|
|
1128
|
+
});
|
|
1129
|
+
}
|
|
1331
1130
|
}
|
|
1332
|
-
|
|
1333
|
-
|
|
1334
|
-
|
|
1335
|
-
|
|
1336
|
-
|
|
1337
|
-
|
|
1338
|
-
|
|
1339
|
-
|
|
1340
|
-
while (ai--) {
|
|
1341
|
-
const attrName = attribs[ai].name;
|
|
1342
|
-
if (attrName.indexOf('data-mce-p-') === 0) {
|
|
1343
|
-
element.setAttribute(attrName.substr(11), attribs[ai].value);
|
|
1131
|
+
realElm.attr({ style: node.attr('style') });
|
|
1132
|
+
const attribs = (_a = node.attributes) !== null && _a !== void 0 ? _a : [];
|
|
1133
|
+
let ai = attribs.length;
|
|
1134
|
+
while (ai--) {
|
|
1135
|
+
const attrName = attribs[ai].name;
|
|
1136
|
+
if (attrName.indexOf('data-mce-p-') === 0) {
|
|
1137
|
+
realElm.attr(attrName.substr(11), attribs[ai].value);
|
|
1138
|
+
}
|
|
1344
1139
|
}
|
|
1345
|
-
|
|
1346
|
-
|
|
1347
|
-
|
|
1348
|
-
|
|
1349
|
-
element.innerHTML = unescape(innerHtml);
|
|
1350
|
-
}
|
|
1351
|
-
else {
|
|
1352
|
-
element.innerHTML = '\u00a0';
|
|
1353
|
-
}
|
|
1354
|
-
const fragment = parseAndSanitize(editor, element.outerHTML);
|
|
1355
|
-
const newElement = fragment.getAll(realElmName)[0];
|
|
1356
|
-
if (isNonNullable(newElement)) {
|
|
1357
|
-
if (!isString(innerHtml)) {
|
|
1358
|
-
newElement.empty();
|
|
1140
|
+
const innerHtml = node.attr('data-mce-html');
|
|
1141
|
+
if (innerHtml) {
|
|
1142
|
+
const fragment = parseAndSanitize(editor, realElmName, unescape(innerHtml));
|
|
1143
|
+
each$1(fragment.children(), child => realElm.append(child));
|
|
1359
1144
|
}
|
|
1360
|
-
|
|
1361
|
-
|
|
1362
|
-
else {
|
|
1363
|
-
return Optional.none();
|
|
1364
|
-
}
|
|
1365
|
-
};
|
|
1366
|
-
const setup$1 = (editor) => {
|
|
1367
|
-
editor.on('PreInit', () => {
|
|
1368
|
-
const { schema, serializer, parser } = editor;
|
|
1369
|
-
// Set browser specific allowFullscreen attribs as boolean
|
|
1370
|
-
const boolAttrs = schema.getBoolAttrs();
|
|
1371
|
-
each$1('webkitallowfullscreen mozallowfullscreen'.split(' '), (name) => {
|
|
1372
|
-
boolAttrs[name] = {};
|
|
1373
|
-
});
|
|
1374
|
-
// Add some non-standard attributes to the schema
|
|
1375
|
-
each({
|
|
1376
|
-
embed: ['wmode']
|
|
1377
|
-
}, (attrs, name) => {
|
|
1378
|
-
const rule = schema.getElementRule(name);
|
|
1379
|
-
if (rule) {
|
|
1380
|
-
each$1(attrs, (attr) => {
|
|
1381
|
-
rule.attributes[attr] = {};
|
|
1382
|
-
rule.attributesOrder.push(attr);
|
|
1383
|
-
});
|
|
1384
|
-
}
|
|
1385
|
-
});
|
|
1386
|
-
// Converts iframe, video etc into placeholder images
|
|
1387
|
-
parser.addNodeFilter('iframe,video,audio,object,embed', placeHolderConverter(editor));
|
|
1388
|
-
// Replaces placeholder images with real elements for video, object, iframe etc
|
|
1389
|
-
serializer.addAttributeFilter('data-mce-object', (nodes) => {
|
|
1390
|
-
let i = nodes.length;
|
|
1391
|
-
while (i--) {
|
|
1392
|
-
const node = nodes[i];
|
|
1393
|
-
if (!node.parent) {
|
|
1394
|
-
continue;
|
|
1395
|
-
}
|
|
1396
|
-
buildMediaElement(editor, node).fold(() => node.remove(), (realElm) => node.replace(realElm));
|
|
1397
|
-
}
|
|
1398
|
-
});
|
|
1145
|
+
node.replace(realElm);
|
|
1146
|
+
}
|
|
1399
1147
|
});
|
|
1400
|
-
|
|
1401
|
-
|
|
1402
|
-
|
|
1403
|
-
|
|
1404
|
-
|
|
1405
|
-
|
|
1406
|
-
|
|
1407
|
-
}
|
|
1408
|
-
});
|
|
1148
|
+
});
|
|
1149
|
+
editor.on('SetContent', () => {
|
|
1150
|
+
const dom = editor.dom;
|
|
1151
|
+
each$1(dom.select('span.mce-preview-object'), elm => {
|
|
1152
|
+
if (dom.select('span.mce-shim', elm).length === 0) {
|
|
1153
|
+
dom.add(elm, 'span', { class: 'mce-shim' });
|
|
1154
|
+
}
|
|
1409
1155
|
});
|
|
1156
|
+
});
|
|
1410
1157
|
};
|
|
1411
1158
|
|
|
1412
|
-
const setup =
|
|
1413
|
-
|
|
1414
|
-
|
|
1415
|
-
|
|
1416
|
-
|
|
1417
|
-
|
|
1418
|
-
|
|
1159
|
+
const setup = editor => {
|
|
1160
|
+
editor.on('ResolveName', e => {
|
|
1161
|
+
let name;
|
|
1162
|
+
if (e.target.nodeType === 1 && (name = e.target.getAttribute('data-mce-object'))) {
|
|
1163
|
+
e.name = name;
|
|
1164
|
+
}
|
|
1165
|
+
});
|
|
1419
1166
|
};
|
|
1420
1167
|
|
|
1421
|
-
const onSetupEditable =
|
|
1422
|
-
|
|
1423
|
-
|
|
1424
|
-
|
|
1425
|
-
|
|
1426
|
-
|
|
1427
|
-
|
|
1428
|
-
|
|
1429
|
-
|
|
1168
|
+
const onSetupEditable = editor => api => {
|
|
1169
|
+
const nodeChanged = () => {
|
|
1170
|
+
api.setEnabled(editor.selection.isEditable());
|
|
1171
|
+
};
|
|
1172
|
+
editor.on('NodeChange', nodeChanged);
|
|
1173
|
+
nodeChanged();
|
|
1174
|
+
return () => {
|
|
1175
|
+
editor.off('NodeChange', nodeChanged);
|
|
1176
|
+
};
|
|
1430
1177
|
};
|
|
1431
|
-
const register =
|
|
1432
|
-
|
|
1433
|
-
|
|
1434
|
-
|
|
1435
|
-
|
|
1436
|
-
|
|
1437
|
-
|
|
1438
|
-
|
|
1439
|
-
|
|
1440
|
-
|
|
1441
|
-
|
|
1442
|
-
|
|
1443
|
-
|
|
1444
|
-
|
|
1445
|
-
|
|
1446
|
-
|
|
1447
|
-
|
|
1448
|
-
|
|
1449
|
-
|
|
1450
|
-
|
|
1451
|
-
|
|
1452
|
-
|
|
1453
|
-
|
|
1178
|
+
const register = editor => {
|
|
1179
|
+
const onAction = () => editor.execCommand('mceMedia');
|
|
1180
|
+
editor.ui.registry.addToggleButton('media', {
|
|
1181
|
+
tooltip: 'Insert/edit media',
|
|
1182
|
+
icon: 'embed',
|
|
1183
|
+
onAction,
|
|
1184
|
+
onSetup: buttonApi => {
|
|
1185
|
+
const selection = editor.selection;
|
|
1186
|
+
buttonApi.setActive(isMediaElement(selection.getNode()));
|
|
1187
|
+
const unbindSelectorChanged = selection.selectorChangedWithUnbind('img[data-mce-object],span[data-mce-object],div[data-ephox-embed-iri]', buttonApi.setActive).unbind;
|
|
1188
|
+
const unbindEditable = onSetupEditable(editor)(buttonApi);
|
|
1189
|
+
return () => {
|
|
1190
|
+
unbindSelectorChanged();
|
|
1191
|
+
unbindEditable();
|
|
1192
|
+
};
|
|
1193
|
+
}
|
|
1194
|
+
});
|
|
1195
|
+
editor.ui.registry.addMenuItem('media', {
|
|
1196
|
+
icon: 'embed',
|
|
1197
|
+
text: 'Media...',
|
|
1198
|
+
onAction,
|
|
1199
|
+
onSetup: onSetupEditable(editor)
|
|
1200
|
+
});
|
|
1454
1201
|
};
|
|
1455
1202
|
|
|
1456
1203
|
var Plugin = () => {
|
|
1457
|
-
|
|
1458
|
-
|
|
1459
|
-
|
|
1460
|
-
|
|
1461
|
-
|
|
1462
|
-
|
|
1463
|
-
|
|
1464
|
-
|
|
1465
|
-
|
|
1204
|
+
global$6.add('media', editor => {
|
|
1205
|
+
register$2(editor);
|
|
1206
|
+
register$1(editor);
|
|
1207
|
+
register(editor);
|
|
1208
|
+
setup(editor);
|
|
1209
|
+
setup$1(editor);
|
|
1210
|
+
setup$2(editor);
|
|
1211
|
+
return get(editor);
|
|
1212
|
+
});
|
|
1466
1213
|
};
|
|
1467
1214
|
|
|
1468
1215
|
Plugin();
|
|
1469
|
-
/** *****
|
|
1470
|
-
* DO NOT EXPORT ANYTHING
|
|
1471
|
-
*
|
|
1472
|
-
* IF YOU DO ROLLUP WILL LEAVE A GLOBAL ON THE PAGE
|
|
1473
|
-
*******/
|
|
1474
1216
|
|
|
1475
1217
|
})();
|