@dangl/angular-material-shared 2.9.0-beta0040 → 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,1004 +7,727 @@
|
|
|
7
7
|
|
|
8
8
|
var global$4 = tinymce.util.Tools.resolve('tinymce.PluginManager');
|
|
9
9
|
|
|
10
|
-
|
|
11
|
-
const
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
// String-based fallback time
|
|
18
|
-
return ((_a = v.constructor) === null || _a === void 0 ? void 0 : _a.name) === constructor.name;
|
|
19
|
-
}
|
|
20
|
-
};
|
|
21
|
-
const typeOf = (x) => {
|
|
22
|
-
const t = typeof x;
|
|
23
|
-
if (x === null) {
|
|
24
|
-
return 'null';
|
|
25
|
-
}
|
|
26
|
-
else if (t === 'object' && Array.isArray(x)) {
|
|
27
|
-
return 'array';
|
|
28
|
-
}
|
|
29
|
-
else if (t === 'object' && hasProto(x, String, (o, proto) => proto.isPrototypeOf(o))) {
|
|
30
|
-
return 'string';
|
|
31
|
-
}
|
|
32
|
-
else {
|
|
33
|
-
return t;
|
|
34
|
-
}
|
|
10
|
+
let unique = 0;
|
|
11
|
+
const generate = prefix => {
|
|
12
|
+
const date = new Date();
|
|
13
|
+
const time = date.getTime();
|
|
14
|
+
const random = Math.floor(Math.random() * 1000000000);
|
|
15
|
+
unique++;
|
|
16
|
+
return prefix + '_' + random + unique + String(time);
|
|
35
17
|
};
|
|
36
|
-
|
|
37
|
-
const
|
|
18
|
+
|
|
19
|
+
const hasProto = (v, constructor, predicate) => {
|
|
20
|
+
var _a;
|
|
21
|
+
if (predicate(v, constructor.prototype)) {
|
|
22
|
+
return true;
|
|
23
|
+
} else {
|
|
24
|
+
return ((_a = v.constructor) === null || _a === void 0 ? void 0 : _a.name) === constructor.name;
|
|
25
|
+
}
|
|
26
|
+
};
|
|
27
|
+
const typeOf = x => {
|
|
28
|
+
const t = typeof x;
|
|
29
|
+
if (x === null) {
|
|
30
|
+
return 'null';
|
|
31
|
+
} else if (t === 'object' && Array.isArray(x)) {
|
|
32
|
+
return 'array';
|
|
33
|
+
} else if (t === 'object' && hasProto(x, String, (o, proto) => proto.isPrototypeOf(o))) {
|
|
34
|
+
return 'string';
|
|
35
|
+
} else {
|
|
36
|
+
return t;
|
|
37
|
+
}
|
|
38
|
+
};
|
|
39
|
+
const isType$1 = type => value => typeOf(value) === type;
|
|
40
|
+
const isSimpleType = type => value => typeof value === type;
|
|
38
41
|
const isString = isType$1('string');
|
|
39
42
|
const isBoolean = isSimpleType('boolean');
|
|
40
|
-
const isNullable =
|
|
41
|
-
const isNonNullable =
|
|
43
|
+
const isNullable = a => a === null || a === undefined;
|
|
44
|
+
const isNonNullable = a => !isNullable(a);
|
|
42
45
|
const isFunction = isSimpleType('function');
|
|
43
46
|
const isNumber = isSimpleType('number');
|
|
44
47
|
|
|
45
|
-
|
|
46
|
-
const
|
|
47
|
-
|
|
48
|
-
return
|
|
49
|
-
|
|
50
|
-
};
|
|
48
|
+
const compose1 = (fbc, fab) => a => fbc(fab(a));
|
|
49
|
+
const constant = value => {
|
|
50
|
+
return () => {
|
|
51
|
+
return value;
|
|
52
|
+
};
|
|
51
53
|
};
|
|
52
54
|
const tripleEquals = (a, b) => {
|
|
53
|
-
|
|
55
|
+
return a === b;
|
|
54
56
|
};
|
|
55
57
|
const never = constant(false);
|
|
56
58
|
|
|
57
|
-
/**
|
|
58
|
-
* The `Optional` type represents a value (of any type) that potentially does
|
|
59
|
-
* not exist. Any `Optional<T>` can either be a `Some<T>` (in which case the
|
|
60
|
-
* value does exist) or a `None` (in which case the value does not exist). This
|
|
61
|
-
* module defines a whole lot of FP-inspired utility functions for dealing with
|
|
62
|
-
* `Optional` objects.
|
|
63
|
-
*
|
|
64
|
-
* Comparison with null or undefined:
|
|
65
|
-
* - We don't get fancy null coalescing operators with `Optional`
|
|
66
|
-
* - We do get fancy helper functions with `Optional`
|
|
67
|
-
* - `Optional` support nesting, and allow for the type to still be nullable (or
|
|
68
|
-
* another `Optional`)
|
|
69
|
-
* - There is no option to turn off strict-optional-checks like there is for
|
|
70
|
-
* strict-null-checks
|
|
71
|
-
*/
|
|
72
59
|
class Optional {
|
|
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
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
return this.tag && predicate(this.value);
|
|
163
|
-
}
|
|
164
|
-
/**
|
|
165
|
-
* For a given predicate, this function finds out if **all** the values inside
|
|
166
|
-
* this `Optional` object meet the predicate. In practice, this means that
|
|
167
|
-
* for `Optional`s that do not contain a value it returns true (as all 0
|
|
168
|
-
* objects do meet the predicate).
|
|
169
|
-
*/
|
|
170
|
-
forall(predicate) {
|
|
171
|
-
return !this.tag || predicate(this.value);
|
|
172
|
-
}
|
|
173
|
-
filter(predicate) {
|
|
174
|
-
if (!this.tag || predicate(this.value)) {
|
|
175
|
-
return this;
|
|
176
|
-
}
|
|
177
|
-
else {
|
|
178
|
-
return Optional.none();
|
|
179
|
-
}
|
|
180
|
-
}
|
|
181
|
-
// --- Getters ---
|
|
182
|
-
/**
|
|
183
|
-
* Get the value out of the inside of the `Optional` object, using a default
|
|
184
|
-
* `replacement` value if the provided `Optional` object does not contain a
|
|
185
|
-
* value.
|
|
186
|
-
*/
|
|
187
|
-
getOr(replacement) {
|
|
188
|
-
return this.tag ? this.value : replacement;
|
|
189
|
-
}
|
|
190
|
-
/**
|
|
191
|
-
* Get the value out of the inside of the `Optional` object, using a default
|
|
192
|
-
* `replacement` value if the provided `Optional` object does not contain a
|
|
193
|
-
* value. Unlike `getOr`, in this method the `replacement` object is also
|
|
194
|
-
* `Optional` - meaning that this method will always return an `Optional`.
|
|
195
|
-
*/
|
|
196
|
-
or(replacement) {
|
|
197
|
-
return this.tag ? this : replacement;
|
|
198
|
-
}
|
|
199
|
-
/**
|
|
200
|
-
* Get the value out of the inside of the `Optional` object, using a default
|
|
201
|
-
* `replacement` value if the provided `Optional` object does not contain a
|
|
202
|
-
* value. Unlike `getOr`, in this method the `replacement` value is
|
|
203
|
-
* "thunked" - that is to say that you don't pass a value to `getOrThunk`, you
|
|
204
|
-
* pass a function which (if called) will **return** the `value` you want to
|
|
205
|
-
* use.
|
|
206
|
-
*/
|
|
207
|
-
getOrThunk(thunk) {
|
|
208
|
-
return this.tag ? this.value : thunk();
|
|
209
|
-
}
|
|
210
|
-
/**
|
|
211
|
-
* Get the value out of the inside of the `Optional` object, using a default
|
|
212
|
-
* `replacement` value if the provided Optional object does not contain a
|
|
213
|
-
* value.
|
|
214
|
-
*
|
|
215
|
-
* Unlike `or`, in this method the `replacement` value is "thunked" - that is
|
|
216
|
-
* to say that you don't pass a value to `orThunk`, you pass a function which
|
|
217
|
-
* (if called) will **return** the `value` you want to use.
|
|
218
|
-
*
|
|
219
|
-
* Unlike `getOrThunk`, in this method the `replacement` value is also
|
|
220
|
-
* `Optional`, meaning that this method will always return an `Optional`.
|
|
221
|
-
*/
|
|
222
|
-
orThunk(thunk) {
|
|
223
|
-
return this.tag ? this : thunk();
|
|
224
|
-
}
|
|
225
|
-
/**
|
|
226
|
-
* Get the value out of the inside of the `Optional` object, throwing an
|
|
227
|
-
* exception if the provided `Optional` object does not contain a value.
|
|
228
|
-
*
|
|
229
|
-
* WARNING:
|
|
230
|
-
* You should only be using this function if you know that the `Optional`
|
|
231
|
-
* object **is not** empty (otherwise you're throwing exceptions in production
|
|
232
|
-
* code, which is bad).
|
|
233
|
-
*
|
|
234
|
-
* In tests this is more acceptable.
|
|
235
|
-
*
|
|
236
|
-
* Prefer other methods to this, such as `.each`.
|
|
237
|
-
*/
|
|
238
|
-
getOrDie(message) {
|
|
239
|
-
if (!this.tag) {
|
|
240
|
-
throw new Error(message !== null && message !== void 0 ? message : 'Called getOrDie on None');
|
|
241
|
-
}
|
|
242
|
-
else {
|
|
243
|
-
return this.value;
|
|
244
|
-
}
|
|
245
|
-
}
|
|
246
|
-
// --- Interop with null and undefined ---
|
|
247
|
-
/**
|
|
248
|
-
* Creates an `Optional` value from a nullable (or undefined-able) input.
|
|
249
|
-
* Null, or undefined, is converted to `None`, and anything else is converted
|
|
250
|
-
* to `Some`.
|
|
251
|
-
*/
|
|
252
|
-
static from(value) {
|
|
253
|
-
return isNonNullable(value) ? Optional.some(value) : Optional.none();
|
|
254
|
-
}
|
|
255
|
-
/**
|
|
256
|
-
* Converts an `Optional` to a nullable type, by getting the value if it
|
|
257
|
-
* exists, or returning `null` if it does not.
|
|
258
|
-
*/
|
|
259
|
-
getOrNull() {
|
|
260
|
-
return this.tag ? this.value : null;
|
|
261
|
-
}
|
|
262
|
-
/**
|
|
263
|
-
* Converts an `Optional` to an undefined-able type, by getting the value if
|
|
264
|
-
* it exists, or returning `undefined` if it does not.
|
|
265
|
-
*/
|
|
266
|
-
getOrUndefined() {
|
|
267
|
-
return this.value;
|
|
268
|
-
}
|
|
269
|
-
// --- Utilities ---
|
|
270
|
-
/**
|
|
271
|
-
* If the `Optional` contains a value, perform an action on that value.
|
|
272
|
-
* Unlike the rest of the methods on this type, `.each` has side-effects. If
|
|
273
|
-
* you want to transform an `Optional<T>` **into** something, then this is not
|
|
274
|
-
* the method for you. If you want to use an `Optional<T>` to **do**
|
|
275
|
-
* something, then this is the method for you - provided you're okay with not
|
|
276
|
-
* doing anything in the case where the `Optional` doesn't have a value inside
|
|
277
|
-
* it. If you're not sure whether your use-case fits into transforming
|
|
278
|
-
* **into** something or **doing** something, check whether it has a return
|
|
279
|
-
* value. If it does, you should be performing a transform.
|
|
280
|
-
*/
|
|
281
|
-
each(worker) {
|
|
282
|
-
if (this.tag) {
|
|
283
|
-
worker(this.value);
|
|
284
|
-
}
|
|
285
|
-
}
|
|
286
|
-
/**
|
|
287
|
-
* Turn the `Optional` object into an array that contains all of the values
|
|
288
|
-
* stored inside the `Optional`. In practice, this means the output will have
|
|
289
|
-
* either 0 or 1 elements.
|
|
290
|
-
*/
|
|
291
|
-
toArray() {
|
|
292
|
-
return this.tag ? [this.value] : [];
|
|
293
|
-
}
|
|
294
|
-
/**
|
|
295
|
-
* Turn the `Optional` object into a string for debugging or printing. Not
|
|
296
|
-
* recommended for production code, but good for debugging. Also note that
|
|
297
|
-
* these days an `Optional` object can be logged to the console directly, and
|
|
298
|
-
* its inner value (if it exists) will be visible.
|
|
299
|
-
*/
|
|
300
|
-
toString() {
|
|
301
|
-
return this.tag ? `some(${this.value})` : 'none()';
|
|
302
|
-
}
|
|
60
|
+
constructor(tag, value) {
|
|
61
|
+
this.tag = tag;
|
|
62
|
+
this.value = value;
|
|
63
|
+
}
|
|
64
|
+
static some(value) {
|
|
65
|
+
return new Optional(true, value);
|
|
66
|
+
}
|
|
67
|
+
static none() {
|
|
68
|
+
return Optional.singletonNone;
|
|
69
|
+
}
|
|
70
|
+
fold(onNone, onSome) {
|
|
71
|
+
if (this.tag) {
|
|
72
|
+
return onSome(this.value);
|
|
73
|
+
} else {
|
|
74
|
+
return onNone();
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
isSome() {
|
|
78
|
+
return this.tag;
|
|
79
|
+
}
|
|
80
|
+
isNone() {
|
|
81
|
+
return !this.tag;
|
|
82
|
+
}
|
|
83
|
+
map(mapper) {
|
|
84
|
+
if (this.tag) {
|
|
85
|
+
return Optional.some(mapper(this.value));
|
|
86
|
+
} else {
|
|
87
|
+
return Optional.none();
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
bind(binder) {
|
|
91
|
+
if (this.tag) {
|
|
92
|
+
return binder(this.value);
|
|
93
|
+
} else {
|
|
94
|
+
return Optional.none();
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
exists(predicate) {
|
|
98
|
+
return this.tag && predicate(this.value);
|
|
99
|
+
}
|
|
100
|
+
forall(predicate) {
|
|
101
|
+
return !this.tag || predicate(this.value);
|
|
102
|
+
}
|
|
103
|
+
filter(predicate) {
|
|
104
|
+
if (!this.tag || predicate(this.value)) {
|
|
105
|
+
return this;
|
|
106
|
+
} else {
|
|
107
|
+
return Optional.none();
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
getOr(replacement) {
|
|
111
|
+
return this.tag ? this.value : replacement;
|
|
112
|
+
}
|
|
113
|
+
or(replacement) {
|
|
114
|
+
return this.tag ? this : replacement;
|
|
115
|
+
}
|
|
116
|
+
getOrThunk(thunk) {
|
|
117
|
+
return this.tag ? this.value : thunk();
|
|
118
|
+
}
|
|
119
|
+
orThunk(thunk) {
|
|
120
|
+
return this.tag ? this : thunk();
|
|
121
|
+
}
|
|
122
|
+
getOrDie(message) {
|
|
123
|
+
if (!this.tag) {
|
|
124
|
+
throw new Error(message !== null && message !== void 0 ? message : 'Called getOrDie on None');
|
|
125
|
+
} else {
|
|
126
|
+
return this.value;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
static from(value) {
|
|
130
|
+
return isNonNullable(value) ? Optional.some(value) : Optional.none();
|
|
131
|
+
}
|
|
132
|
+
getOrNull() {
|
|
133
|
+
return this.tag ? this.value : null;
|
|
134
|
+
}
|
|
135
|
+
getOrUndefined() {
|
|
136
|
+
return this.value;
|
|
137
|
+
}
|
|
138
|
+
each(worker) {
|
|
139
|
+
if (this.tag) {
|
|
140
|
+
worker(this.value);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
toArray() {
|
|
144
|
+
return this.tag ? [this.value] : [];
|
|
145
|
+
}
|
|
146
|
+
toString() {
|
|
147
|
+
return this.tag ? `some(${ this.value })` : 'none()';
|
|
148
|
+
}
|
|
303
149
|
}
|
|
304
|
-
// Sneaky optimisation: every instance of Optional.none is identical, so just
|
|
305
|
-
// reuse the same object
|
|
306
150
|
Optional.singletonNone = new Optional(false);
|
|
307
151
|
|
|
308
152
|
const nativeIndexOf = Array.prototype.indexOf;
|
|
309
|
-
/* eslint-enable */
|
|
310
153
|
const rawIndexOf = (ts, t) => nativeIndexOf.call(ts, t);
|
|
311
154
|
const contains = (xs, x) => rawIndexOf(xs, x) > -1;
|
|
312
155
|
const map = (xs, f) => {
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
const
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
}
|
|
321
|
-
return r;
|
|
156
|
+
const len = xs.length;
|
|
157
|
+
const r = new Array(len);
|
|
158
|
+
for (let i = 0; i < len; i++) {
|
|
159
|
+
const x = xs[i];
|
|
160
|
+
r[i] = f(x, i);
|
|
161
|
+
}
|
|
162
|
+
return r;
|
|
322
163
|
};
|
|
323
|
-
// Unwound implementing other functions in terms of each.
|
|
324
|
-
// The code size is roughly the same, and it should allow for better optimisation.
|
|
325
|
-
// const each = function<T, U>(xs: T[], f: (x: T, i?: number, xs?: T[]) => void): void {
|
|
326
164
|
const each$1 = (xs, f) => {
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
165
|
+
for (let i = 0, len = xs.length; i < len; i++) {
|
|
166
|
+
const x = xs[i];
|
|
167
|
+
f(x, i);
|
|
168
|
+
}
|
|
331
169
|
};
|
|
332
170
|
const filter = (xs, pred) => {
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
}
|
|
171
|
+
const r = [];
|
|
172
|
+
for (let i = 0, len = xs.length; i < len; i++) {
|
|
173
|
+
const x = xs[i];
|
|
174
|
+
if (pred(x, i)) {
|
|
175
|
+
r.push(x);
|
|
339
176
|
}
|
|
340
|
-
|
|
177
|
+
}
|
|
178
|
+
return r;
|
|
341
179
|
};
|
|
342
180
|
const foldl = (xs, f, acc) => {
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
181
|
+
each$1(xs, (x, i) => {
|
|
182
|
+
acc = f(acc, x, i);
|
|
183
|
+
});
|
|
184
|
+
return acc;
|
|
347
185
|
};
|
|
348
186
|
|
|
349
|
-
// There are many variations of Object iteration that are faster than the 'for-in' style:
|
|
350
|
-
// http://jsperf.com/object-keys-iteration/107
|
|
351
|
-
//
|
|
352
|
-
// Use the native keys if it is available (IE9+), otherwise fall back to manually filtering
|
|
353
187
|
const keys = Object.keys;
|
|
354
188
|
const each = (obj, f) => {
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
189
|
+
const props = keys(obj);
|
|
190
|
+
for (let k = 0, len = props.length; k < len; k++) {
|
|
191
|
+
const i = props[k];
|
|
192
|
+
const x = obj[i];
|
|
193
|
+
f(x, i);
|
|
194
|
+
}
|
|
361
195
|
};
|
|
362
196
|
|
|
363
|
-
|
|
364
|
-
* Adds two numbers, and wrap to a range.
|
|
365
|
-
* If the result overflows to the right, snap to the left.
|
|
366
|
-
* If the result overflows to the left, snap to the right.
|
|
367
|
-
*/
|
|
368
|
-
// the division is meant to get a number between 0 and 1 for more information check this discussion: https://stackoverflow.com/questions/58285941/how-to-replace-math-random-with-crypto-getrandomvalues-and-keep-same-result
|
|
369
|
-
const random = () => window.crypto.getRandomValues(new Uint32Array(1))[0] / 4294967295;
|
|
197
|
+
typeof window !== 'undefined' ? window : Function('return this;')();
|
|
370
198
|
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
*
|
|
377
|
-
* The chance of generating a non-unique identifier has been minimized
|
|
378
|
-
* by combining the current time, a random number and a one-up counter.
|
|
379
|
-
*
|
|
380
|
-
* generate :: String -> String
|
|
381
|
-
*/
|
|
382
|
-
let unique = 0;
|
|
383
|
-
const generate = (prefix) => {
|
|
384
|
-
const date = new Date();
|
|
385
|
-
const time = date.getTime();
|
|
386
|
-
const random$1 = Math.floor(random() * 1000000000);
|
|
387
|
-
unique++;
|
|
388
|
-
return prefix + '_' + random$1 + unique + String(time);
|
|
389
|
-
};
|
|
390
|
-
|
|
391
|
-
/**
|
|
392
|
-
* **Is** the value stored inside this Optional object equal to `rhs`?
|
|
393
|
-
*/
|
|
394
|
-
const is$2 = (lhs, rhs, comparator = tripleEquals) => lhs.exists((left) => comparator(left, rhs));
|
|
199
|
+
const COMMENT = 8;
|
|
200
|
+
const DOCUMENT = 9;
|
|
201
|
+
const DOCUMENT_FRAGMENT = 11;
|
|
202
|
+
const ELEMENT = 1;
|
|
203
|
+
const TEXT = 3;
|
|
395
204
|
|
|
396
|
-
const
|
|
397
|
-
|
|
398
|
-
|
|
205
|
+
const name = element => {
|
|
206
|
+
const r = element.dom.nodeName;
|
|
207
|
+
return r.toLowerCase();
|
|
208
|
+
};
|
|
209
|
+
const type = element => element.dom.nodeType;
|
|
210
|
+
const isType = t => element => type(element) === t;
|
|
211
|
+
const isComment = element => type(element) === COMMENT || name(element) === '#comment';
|
|
212
|
+
const isElement = isType(ELEMENT);
|
|
213
|
+
const isText = isType(TEXT);
|
|
214
|
+
const isDocument = isType(DOCUMENT);
|
|
215
|
+
const isDocumentFragment = isType(DOCUMENT_FRAGMENT);
|
|
399
216
|
|
|
400
|
-
const
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
217
|
+
const rawSet = (dom, key, value) => {
|
|
218
|
+
if (isString(value) || isBoolean(value) || isNumber(value)) {
|
|
219
|
+
dom.setAttribute(key, value + '');
|
|
220
|
+
} else {
|
|
221
|
+
console.error('Invalid call to Attribute.set. Key ', key, ':: Value ', value, ':: Element ', dom);
|
|
222
|
+
throw new Error('Attribute value was not simple');
|
|
223
|
+
}
|
|
224
|
+
};
|
|
225
|
+
const set$2 = (element, key, value) => {
|
|
226
|
+
rawSet(element.dom, key, value);
|
|
227
|
+
};
|
|
228
|
+
const setAll = (element, attrs) => {
|
|
229
|
+
const dom = element.dom;
|
|
230
|
+
each(attrs, (v, k) => {
|
|
231
|
+
rawSet(dom, k, v);
|
|
232
|
+
});
|
|
233
|
+
};
|
|
234
|
+
const get$2 = (element, key) => {
|
|
235
|
+
const v = element.dom.getAttribute(key);
|
|
236
|
+
return v === null ? undefined : v;
|
|
237
|
+
};
|
|
238
|
+
const getOpt = (element, key) => Optional.from(get$2(element, key));
|
|
239
|
+
const remove$2 = (element, key) => {
|
|
240
|
+
element.dom.removeAttribute(key);
|
|
241
|
+
};
|
|
242
|
+
const clone = element => foldl(element.dom.attributes, (acc, attr) => {
|
|
243
|
+
acc[attr.name] = attr.value;
|
|
244
|
+
return acc;
|
|
245
|
+
}, {});
|
|
404
246
|
|
|
405
247
|
const fromHtml = (html, scope) => {
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
return fromDom(div.childNodes[0]);
|
|
248
|
+
const doc = scope || document;
|
|
249
|
+
const div = doc.createElement('div');
|
|
250
|
+
div.innerHTML = html;
|
|
251
|
+
if (!div.hasChildNodes() || div.childNodes.length > 1) {
|
|
252
|
+
const message = 'HTML does not have a single root node';
|
|
253
|
+
console.error(message, html);
|
|
254
|
+
throw new Error(message);
|
|
255
|
+
}
|
|
256
|
+
return fromDom(div.childNodes[0]);
|
|
416
257
|
};
|
|
417
258
|
const fromTag = (tag, scope) => {
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
259
|
+
const doc = scope || document;
|
|
260
|
+
const node = doc.createElement(tag);
|
|
261
|
+
return fromDom(node);
|
|
421
262
|
};
|
|
422
263
|
const fromText = (text, scope) => {
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
};
|
|
427
|
-
const fromDom =
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
return {
|
|
433
|
-
dom: node
|
|
434
|
-
};
|
|
264
|
+
const doc = scope || document;
|
|
265
|
+
const node = doc.createTextNode(text);
|
|
266
|
+
return fromDom(node);
|
|
267
|
+
};
|
|
268
|
+
const fromDom = node => {
|
|
269
|
+
if (node === null || node === undefined) {
|
|
270
|
+
throw new Error('Node cannot be null or undefined');
|
|
271
|
+
}
|
|
272
|
+
return { dom: node };
|
|
435
273
|
};
|
|
436
274
|
const fromPoint = (docElm, x, y) => Optional.from(docElm.dom.elementFromPoint(x, y)).map(fromDom);
|
|
437
|
-
// tslint:disable-next-line:variable-name
|
|
438
275
|
const SugarElement = {
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
276
|
+
fromHtml,
|
|
277
|
+
fromTag,
|
|
278
|
+
fromText,
|
|
279
|
+
fromDom,
|
|
280
|
+
fromPoint
|
|
444
281
|
};
|
|
445
282
|
|
|
446
|
-
const
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
if (
|
|
455
|
-
|
|
456
|
-
}
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
return elem.webkitMatchesSelector(selector);
|
|
467
|
-
}
|
|
468
|
-
else if (elem.mozMatchesSelector !== undefined) {
|
|
469
|
-
// cast to any as mozMatchesSelector doesn't exist in TS DOM lib
|
|
470
|
-
return elem.mozMatchesSelector(selector);
|
|
471
|
-
}
|
|
472
|
-
else {
|
|
473
|
-
throw new Error('Browser lacks native selectors');
|
|
474
|
-
} // unfortunately we can't throw this on startup :(
|
|
475
|
-
}
|
|
476
|
-
};
|
|
477
|
-
const bypassSelector = (dom) =>
|
|
478
|
-
// Only elements, documents and shadow roots support querySelector
|
|
479
|
-
// shadow root element type is DOCUMENT_FRAGMENT
|
|
480
|
-
dom.nodeType !== ELEMENT && dom.nodeType !== DOCUMENT && dom.nodeType !== DOCUMENT_FRAGMENT ||
|
|
481
|
-
// IE fix for complex queries on empty nodes: http://jsfiddle.net/spyder/fv9ptr5L/
|
|
482
|
-
dom.childElementCount === 0;
|
|
283
|
+
const is$2 = (element, selector) => {
|
|
284
|
+
const dom = element.dom;
|
|
285
|
+
if (dom.nodeType !== ELEMENT) {
|
|
286
|
+
return false;
|
|
287
|
+
} else {
|
|
288
|
+
const elem = dom;
|
|
289
|
+
if (elem.matches !== undefined) {
|
|
290
|
+
return elem.matches(selector);
|
|
291
|
+
} else if (elem.msMatchesSelector !== undefined) {
|
|
292
|
+
return elem.msMatchesSelector(selector);
|
|
293
|
+
} else if (elem.webkitMatchesSelector !== undefined) {
|
|
294
|
+
return elem.webkitMatchesSelector(selector);
|
|
295
|
+
} else if (elem.mozMatchesSelector !== undefined) {
|
|
296
|
+
return elem.mozMatchesSelector(selector);
|
|
297
|
+
} else {
|
|
298
|
+
throw new Error('Browser lacks native selectors');
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
};
|
|
302
|
+
const bypassSelector = dom => dom.nodeType !== ELEMENT && dom.nodeType !== DOCUMENT && dom.nodeType !== DOCUMENT_FRAGMENT || dom.childElementCount === 0;
|
|
483
303
|
const all = (selector, scope) => {
|
|
484
|
-
|
|
485
|
-
|
|
304
|
+
const base = scope === undefined ? document : scope.dom;
|
|
305
|
+
return bypassSelector(base) ? [] : map(base.querySelectorAll(selector), SugarElement.fromDom);
|
|
486
306
|
};
|
|
487
307
|
const one = (selector, scope) => {
|
|
488
|
-
|
|
489
|
-
|
|
308
|
+
const base = scope === undefined ? document : scope.dom;
|
|
309
|
+
return bypassSelector(base) ? Optional.none() : Optional.from(base.querySelector(selector)).map(SugarElement.fromDom);
|
|
490
310
|
};
|
|
491
311
|
|
|
492
312
|
const eq = (e1, e2) => e1.dom === e2.dom;
|
|
493
|
-
const is = is$
|
|
313
|
+
const is$1 = is$2;
|
|
494
314
|
|
|
495
|
-
const
|
|
496
|
-
const r = element.dom.nodeName;
|
|
497
|
-
return r.toLowerCase();
|
|
498
|
-
};
|
|
499
|
-
const type = (element) => element.dom.nodeType;
|
|
500
|
-
const isType = (t) => (element) => type(element) === t;
|
|
501
|
-
const isComment = (element) => type(element) === COMMENT || name(element) === '#comment';
|
|
502
|
-
const isElement = isType(ELEMENT);
|
|
503
|
-
const isText = isType(TEXT);
|
|
504
|
-
const isDocument = isType(DOCUMENT);
|
|
505
|
-
const isDocumentFragment = isType(DOCUMENT_FRAGMENT);
|
|
315
|
+
const is = (lhs, rhs, comparator = tripleEquals) => lhs.exists(left => comparator(left, rhs));
|
|
506
316
|
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
*/
|
|
516
|
-
const documentOrOwner = (dos) => isDocument(dos) ? dos : owner(dos);
|
|
517
|
-
const parent = (element) => Optional.from(element.dom.parentNode).map(SugarElement.fromDom);
|
|
317
|
+
const blank = r => s => s.replace(r, '');
|
|
318
|
+
const trim = blank(/^\s+|\s+$/g);
|
|
319
|
+
|
|
320
|
+
const isSupported = dom => dom.style !== undefined && isFunction(dom.style.getPropertyValue);
|
|
321
|
+
|
|
322
|
+
const owner = element => SugarElement.fromDom(element.dom.ownerDocument);
|
|
323
|
+
const documentOrOwner = dos => isDocument(dos) ? dos : owner(dos);
|
|
324
|
+
const parent = element => Optional.from(element.dom.parentNode).map(SugarElement.fromDom);
|
|
518
325
|
const parents = (element, isRoot) => {
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
const
|
|
537
|
-
const nextSibling = (element) => Optional.from(element.dom.nextSibling).map(SugarElement.fromDom);
|
|
538
|
-
const children = (element) => map(element.dom.childNodes, SugarElement.fromDom);
|
|
326
|
+
const stop = isFunction(isRoot) ? isRoot : never;
|
|
327
|
+
let dom = element.dom;
|
|
328
|
+
const ret = [];
|
|
329
|
+
while (dom.parentNode !== null && dom.parentNode !== undefined) {
|
|
330
|
+
const rawParent = dom.parentNode;
|
|
331
|
+
const p = SugarElement.fromDom(rawParent);
|
|
332
|
+
ret.push(p);
|
|
333
|
+
if (stop(p) === true) {
|
|
334
|
+
break;
|
|
335
|
+
} else {
|
|
336
|
+
dom = rawParent;
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
return ret;
|
|
340
|
+
};
|
|
341
|
+
const prevSibling = element => Optional.from(element.dom.previousSibling).map(SugarElement.fromDom);
|
|
342
|
+
const nextSibling = element => Optional.from(element.dom.nextSibling).map(SugarElement.fromDom);
|
|
343
|
+
const children = element => map(element.dom.childNodes, SugarElement.fromDom);
|
|
539
344
|
const child = (element, index) => {
|
|
540
|
-
|
|
541
|
-
|
|
345
|
+
const cs = element.dom.childNodes;
|
|
346
|
+
return Optional.from(cs[index]).map(SugarElement.fromDom);
|
|
542
347
|
};
|
|
543
|
-
const firstChild =
|
|
348
|
+
const firstChild = element => child(element, 0);
|
|
544
349
|
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
const
|
|
553
|
-
/** If this element is in a ShadowRoot, return it. */
|
|
554
|
-
const getShadowRoot = (e) => {
|
|
555
|
-
const r = getRootNode(e);
|
|
556
|
-
return isShadowRoot(r) ? Optional.some(r) : Optional.none();
|
|
557
|
-
};
|
|
558
|
-
/** Return the host of a ShadowRoot.
|
|
559
|
-
*
|
|
560
|
-
* This function will throw if Shadow DOM is unsupported in the browser, or if the host is null.
|
|
561
|
-
* If you actually have a ShadowRoot, this shouldn't happen.
|
|
562
|
-
*/
|
|
563
|
-
const getShadowHost = (e) => SugarElement.fromDom(e.dom.host);
|
|
350
|
+
const isShadowRoot = dos => isDocumentFragment(dos) && isNonNullable(dos.dom.host);
|
|
351
|
+
const supported = isFunction(Element.prototype.attachShadow) && isFunction(Node.prototype.getRootNode);
|
|
352
|
+
const getRootNode = supported ? e => SugarElement.fromDom(e.dom.getRootNode()) : documentOrOwner;
|
|
353
|
+
const getShadowRoot = e => {
|
|
354
|
+
const r = getRootNode(e);
|
|
355
|
+
return isShadowRoot(r) ? Optional.some(r) : Optional.none();
|
|
356
|
+
};
|
|
357
|
+
const getShadowHost = e => SugarElement.fromDom(e.dom.host);
|
|
564
358
|
|
|
565
|
-
const
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
359
|
+
const inBody = element => {
|
|
360
|
+
const dom = isText(element) ? element.dom.parentNode : element.dom;
|
|
361
|
+
if (dom === undefined || dom === null || dom.ownerDocument === null) {
|
|
362
|
+
return false;
|
|
363
|
+
}
|
|
364
|
+
const doc = dom.ownerDocument;
|
|
365
|
+
return getShadowRoot(SugarElement.fromDom(dom)).fold(() => doc.body.contains(dom), compose1(inBody, getShadowHost));
|
|
570
366
|
};
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
});
|
|
367
|
+
|
|
368
|
+
const internalSet = (dom, property, value) => {
|
|
369
|
+
if (!isString(value)) {
|
|
370
|
+
console.error('Invalid call to CSS.set. Property ', property, ':: Value ', value, ':: Element ', dom);
|
|
371
|
+
throw new Error('CSS value must be a string: ' + value);
|
|
372
|
+
}
|
|
373
|
+
if (isSupported(dom)) {
|
|
374
|
+
dom.style.setProperty(property, value);
|
|
375
|
+
}
|
|
581
376
|
};
|
|
582
|
-
const
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
}, (v) => {
|
|
587
|
-
parent.dom.insertBefore(element.dom, v.dom);
|
|
588
|
-
});
|
|
377
|
+
const internalRemove = (dom, property) => {
|
|
378
|
+
if (isSupported(dom)) {
|
|
379
|
+
dom.style.removeProperty(property);
|
|
380
|
+
}
|
|
589
381
|
};
|
|
590
|
-
const
|
|
591
|
-
|
|
382
|
+
const set$1 = (element, property, value) => {
|
|
383
|
+
const dom = element.dom;
|
|
384
|
+
internalSet(dom, property, value);
|
|
592
385
|
};
|
|
593
|
-
const
|
|
594
|
-
|
|
595
|
-
|
|
386
|
+
const get$1 = (element, property) => {
|
|
387
|
+
const dom = element.dom;
|
|
388
|
+
const styles = window.getComputedStyle(dom);
|
|
389
|
+
const r = styles.getPropertyValue(property);
|
|
390
|
+
return r === '' && !inBody(element) ? getUnsafeProperty(dom, property) : r;
|
|
596
391
|
};
|
|
597
|
-
|
|
598
|
-
const
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
});
|
|
392
|
+
const getUnsafeProperty = (dom, property) => isSupported(dom) ? dom.style.getPropertyValue(property) : '';
|
|
393
|
+
const getRaw = (element, property) => {
|
|
394
|
+
const dom = element.dom;
|
|
395
|
+
const raw = getUnsafeProperty(dom, property);
|
|
396
|
+
return Optional.from(raw).filter(r => r.length > 0);
|
|
603
397
|
};
|
|
604
|
-
const
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
398
|
+
const remove$1 = (element, property) => {
|
|
399
|
+
const dom = element.dom;
|
|
400
|
+
internalRemove(dom, property);
|
|
401
|
+
if (is(getOpt(element, 'style').map(trim), '')) {
|
|
402
|
+
remove$2(element, 'style');
|
|
403
|
+
}
|
|
608
404
|
};
|
|
609
405
|
|
|
610
|
-
const
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
*/
|
|
616
|
-
if (isString(value) || isBoolean(value) || isNumber(value)) {
|
|
617
|
-
dom.setAttribute(key, value + '');
|
|
618
|
-
}
|
|
619
|
-
else {
|
|
620
|
-
// eslint-disable-next-line no-console
|
|
621
|
-
console.error('Invalid call to Attribute.set. Key ', key, ':: Value ', value, ':: Element ', dom);
|
|
622
|
-
throw new Error('Attribute value was not simple');
|
|
623
|
-
}
|
|
624
|
-
};
|
|
625
|
-
const set$2 = (element, key, value) => {
|
|
626
|
-
rawSet(element.dom, key, value);
|
|
406
|
+
const before = (marker, element) => {
|
|
407
|
+
const parent$1 = parent(marker);
|
|
408
|
+
parent$1.each(v => {
|
|
409
|
+
v.dom.insertBefore(element.dom, marker.dom);
|
|
410
|
+
});
|
|
627
411
|
};
|
|
628
|
-
const
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
|
|
412
|
+
const after$1 = (marker, element) => {
|
|
413
|
+
const sibling = nextSibling(marker);
|
|
414
|
+
sibling.fold(() => {
|
|
415
|
+
const parent$1 = parent(marker);
|
|
416
|
+
parent$1.each(v => {
|
|
417
|
+
append$1(v, element);
|
|
632
418
|
});
|
|
419
|
+
}, v => {
|
|
420
|
+
before(v, element);
|
|
421
|
+
});
|
|
633
422
|
};
|
|
634
|
-
const
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
|
|
423
|
+
const prepend = (parent, element) => {
|
|
424
|
+
const firstChild$1 = firstChild(parent);
|
|
425
|
+
firstChild$1.fold(() => {
|
|
426
|
+
append$1(parent, element);
|
|
427
|
+
}, v => {
|
|
428
|
+
parent.dom.insertBefore(element.dom, v.dom);
|
|
429
|
+
});
|
|
638
430
|
};
|
|
639
|
-
const
|
|
640
|
-
|
|
641
|
-
|
|
431
|
+
const append$1 = (parent, element) => {
|
|
432
|
+
parent.dom.appendChild(element.dom);
|
|
433
|
+
};
|
|
434
|
+
const wrap = (element, wrapper) => {
|
|
435
|
+
before(element, wrapper);
|
|
436
|
+
append$1(wrapper, element);
|
|
642
437
|
};
|
|
643
|
-
const clone = (element) => foldl(element.dom.attributes, (acc, attr) => {
|
|
644
|
-
acc[attr.name] = attr.value;
|
|
645
|
-
return acc;
|
|
646
|
-
}, {});
|
|
647
438
|
|
|
648
|
-
const
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
|
|
652
|
-
|
|
439
|
+
const after = (marker, elements) => {
|
|
440
|
+
each$1(elements, (x, i) => {
|
|
441
|
+
const e = i === 0 ? marker : elements[i - 1];
|
|
442
|
+
after$1(e, x);
|
|
443
|
+
});
|
|
653
444
|
};
|
|
654
|
-
const
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
}
|
|
659
|
-
remove$1(wrapper);
|
|
445
|
+
const append = (parent, elements) => {
|
|
446
|
+
each$1(elements, x => {
|
|
447
|
+
append$1(parent, x);
|
|
448
|
+
});
|
|
660
449
|
};
|
|
661
450
|
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
// Node.contains() is very, very, very good performance
|
|
669
|
-
// http://jsperf.com/closest-vs-contains/5
|
|
670
|
-
const inBody = (element) => {
|
|
671
|
-
// Technically this is only required on IE, where contains() returns false for text nodes.
|
|
672
|
-
// But it's cheap enough to run everywhere and Sugar doesn't have platform detection (yet).
|
|
673
|
-
const dom = isText(element) ? element.dom.parentNode : element.dom;
|
|
674
|
-
// use ownerDocument.body to ensure this works inside iframes.
|
|
675
|
-
// Normally contains is bad because an element "contains" itself, but here we want that.
|
|
676
|
-
if (dom === undefined || dom === null || dom.ownerDocument === null) {
|
|
677
|
-
return false;
|
|
451
|
+
const descendants$1 = (scope, predicate) => {
|
|
452
|
+
let result = [];
|
|
453
|
+
each$1(children(scope), x => {
|
|
454
|
+
if (predicate(x)) {
|
|
455
|
+
result = result.concat([x]);
|
|
678
456
|
}
|
|
679
|
-
|
|
680
|
-
|
|
457
|
+
result = result.concat(descendants$1(x, predicate));
|
|
458
|
+
});
|
|
459
|
+
return result;
|
|
681
460
|
};
|
|
682
461
|
|
|
683
|
-
|
|
684
|
-
|
|
685
|
-
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
}
|
|
692
|
-
// removed: support for dom().style[property] where prop is camel case instead of normal property name
|
|
693
|
-
if (isSupported(dom)) {
|
|
694
|
-
dom.style.setProperty(property, value);
|
|
695
|
-
}
|
|
696
|
-
};
|
|
697
|
-
const internalRemove = (dom, property) => {
|
|
698
|
-
/*
|
|
699
|
-
* IE9 and above - MDN doesn't have details, but here's a couple of random internet claims
|
|
700
|
-
*
|
|
701
|
-
* http://help.dottoro.com/ljopsjck.php
|
|
702
|
-
* http://stackoverflow.com/a/7901886/7546
|
|
703
|
-
*/
|
|
704
|
-
if (isSupported(dom)) {
|
|
705
|
-
dom.style.removeProperty(property);
|
|
706
|
-
}
|
|
707
|
-
};
|
|
708
|
-
const set$1 = (element, property, value) => {
|
|
709
|
-
const dom = element.dom;
|
|
710
|
-
internalSet(dom, property, value);
|
|
711
|
-
};
|
|
712
|
-
/*
|
|
713
|
-
* NOTE: For certain properties, this returns the "used value" which is subtly different to the "computed value" (despite calling getComputedStyle).
|
|
714
|
-
* Blame CSS 2.0.
|
|
715
|
-
*
|
|
716
|
-
* https://developer.mozilla.org/en-US/docs/Web/CSS/used_value
|
|
717
|
-
*/
|
|
718
|
-
const get$1 = (element, property) => {
|
|
719
|
-
const dom = element.dom;
|
|
720
|
-
/*
|
|
721
|
-
* IE9 and above per
|
|
722
|
-
* https://developer.mozilla.org/en/docs/Web/API/window.getComputedStyle
|
|
723
|
-
*
|
|
724
|
-
* Not in numerosity, because it doesn't memoize and looking this up dynamically in performance critical code would be horrendous.
|
|
725
|
-
*
|
|
726
|
-
* JQuery has some magic here for IE popups, but we don't really need that.
|
|
727
|
-
* It also uses element.ownerDocument.defaultView to handle iframes but that hasn't been required since FF 3.6.
|
|
728
|
-
*/
|
|
729
|
-
const styles = window.getComputedStyle(dom);
|
|
730
|
-
const r = styles.getPropertyValue(property);
|
|
731
|
-
// jquery-ism: If r is an empty string, check that the element is not in a document. If it isn't, return the raw value.
|
|
732
|
-
// Turns out we do this a lot.
|
|
733
|
-
return (r === '' && !inBody(element)) ? getUnsafeProperty(dom, property) : r;
|
|
734
|
-
};
|
|
735
|
-
// removed: support for dom().style[property] where prop is camel case instead of normal property name
|
|
736
|
-
// empty string is what the browsers (IE11 and Chrome) return when the propertyValue doesn't exists.
|
|
737
|
-
const getUnsafeProperty = (dom, property) => isSupported(dom) ? dom.style.getPropertyValue(property) : '';
|
|
738
|
-
/*
|
|
739
|
-
* Gets the raw value from the style attribute. Useful for retrieving "used values" from the DOM:
|
|
740
|
-
* https://developer.mozilla.org/en-US/docs/Web/CSS/used_value
|
|
741
|
-
*
|
|
742
|
-
* Returns NONE if the property isn't set, or the value is an empty string.
|
|
743
|
-
*/
|
|
744
|
-
const getRaw = (element, property) => {
|
|
745
|
-
const dom = element.dom;
|
|
746
|
-
const raw = getUnsafeProperty(dom, property);
|
|
747
|
-
return Optional.from(raw).filter((r) => r.length > 0);
|
|
748
|
-
};
|
|
749
|
-
const remove = (element, property) => {
|
|
750
|
-
const dom = element.dom;
|
|
751
|
-
internalRemove(dom, property);
|
|
752
|
-
if (is$2(getOpt(element, 'style').map(trim), '')) {
|
|
753
|
-
// No more styles left, remove the style attribute as well
|
|
754
|
-
remove$2(element, 'style');
|
|
755
|
-
}
|
|
462
|
+
var ClosestOrAncestor = (is, ancestor, scope, a, isRoot) => {
|
|
463
|
+
if (is(scope, a)) {
|
|
464
|
+
return Optional.some(scope);
|
|
465
|
+
} else if (isFunction(isRoot) && isRoot(scope)) {
|
|
466
|
+
return Optional.none();
|
|
467
|
+
} else {
|
|
468
|
+
return ancestor(scope, a, isRoot);
|
|
469
|
+
}
|
|
756
470
|
};
|
|
757
471
|
|
|
758
|
-
const
|
|
759
|
-
|
|
760
|
-
|
|
761
|
-
|
|
762
|
-
|
|
763
|
-
|
|
764
|
-
|
|
765
|
-
|
|
766
|
-
|
|
767
|
-
|
|
768
|
-
|
|
769
|
-
|
|
770
|
-
|
|
771
|
-
};
|
|
772
|
-
return {
|
|
773
|
-
get,
|
|
774
|
-
getOption,
|
|
775
|
-
set
|
|
776
|
-
};
|
|
472
|
+
const ancestor$1 = (scope, predicate, isRoot) => {
|
|
473
|
+
let element = scope.dom;
|
|
474
|
+
const stop = isFunction(isRoot) ? isRoot : never;
|
|
475
|
+
while (element.parentNode) {
|
|
476
|
+
element = element.parentNode;
|
|
477
|
+
const el = SugarElement.fromDom(element);
|
|
478
|
+
if (predicate(el)) {
|
|
479
|
+
return Optional.some(el);
|
|
480
|
+
} else if (stop(el)) {
|
|
481
|
+
break;
|
|
482
|
+
}
|
|
483
|
+
}
|
|
484
|
+
return Optional.none();
|
|
777
485
|
};
|
|
778
486
|
|
|
779
|
-
const
|
|
780
|
-
|
|
781
|
-
|
|
782
|
-
|
|
783
|
-
|
|
784
|
-
|
|
785
|
-
|
|
786
|
-
|
|
787
|
-
|
|
788
|
-
|
|
789
|
-
|
|
790
|
-
|
|
791
|
-
return ancestor(scope, a, isRoot);
|
|
792
|
-
}
|
|
487
|
+
const remove = element => {
|
|
488
|
+
const dom = element.dom;
|
|
489
|
+
if (dom.parentNode !== null) {
|
|
490
|
+
dom.parentNode.removeChild(dom);
|
|
491
|
+
}
|
|
492
|
+
};
|
|
493
|
+
const unwrap = wrapper => {
|
|
494
|
+
const children$1 = children(wrapper);
|
|
495
|
+
if (children$1.length > 0) {
|
|
496
|
+
after(wrapper, children$1);
|
|
497
|
+
}
|
|
498
|
+
remove(wrapper);
|
|
793
499
|
};
|
|
794
500
|
|
|
795
|
-
const
|
|
796
|
-
let element = scope.dom;
|
|
797
|
-
const stop = isFunction(isRoot) ? isRoot : never;
|
|
798
|
-
while (element.parentNode) {
|
|
799
|
-
element = element.parentNode;
|
|
800
|
-
const el = SugarElement.fromDom(element);
|
|
801
|
-
if (predicate(el)) {
|
|
802
|
-
return Optional.some(el);
|
|
803
|
-
}
|
|
804
|
-
else if (stop(el)) {
|
|
805
|
-
break;
|
|
806
|
-
}
|
|
807
|
-
}
|
|
808
|
-
return Optional.none();
|
|
809
|
-
};
|
|
501
|
+
const descendants = (scope, selector) => all(selector, scope);
|
|
810
502
|
|
|
811
|
-
const ancestor = (scope, selector, isRoot) => ancestor$1(scope,
|
|
503
|
+
const ancestor = (scope, selector, isRoot) => ancestor$1(scope, e => is$2(e, selector), isRoot);
|
|
812
504
|
const descendant = (scope, selector) => one(selector, scope);
|
|
813
|
-
// Returns Some(closest ancestor element (sugared)) matching 'selector' up to isRoot, or None() otherwise
|
|
814
505
|
const closest = (scope, selector, isRoot) => {
|
|
815
|
-
|
|
816
|
-
|
|
506
|
+
const is = (element, selector) => is$2(element, selector);
|
|
507
|
+
return ClosestOrAncestor(is, ancestor, scope, selector, isRoot);
|
|
817
508
|
};
|
|
818
509
|
|
|
819
|
-
const
|
|
820
|
-
|
|
821
|
-
|
|
822
|
-
|
|
823
|
-
|
|
824
|
-
|
|
825
|
-
|
|
826
|
-
|
|
827
|
-
|
|
828
|
-
|
|
510
|
+
const NodeValue = (is, name) => {
|
|
511
|
+
const get = element => {
|
|
512
|
+
if (!is(element)) {
|
|
513
|
+
throw new Error('Can only get ' + name + ' value of a ' + name + ' node');
|
|
514
|
+
}
|
|
515
|
+
return getOption(element).getOr('');
|
|
516
|
+
};
|
|
517
|
+
const getOption = element => is(element) ? Optional.from(element.dom.nodeValue) : Optional.none();
|
|
518
|
+
const set = (element, value) => {
|
|
519
|
+
if (!is(element)) {
|
|
520
|
+
throw new Error('Can only set raw ' + name + ' value of a ' + name + ' node');
|
|
521
|
+
}
|
|
522
|
+
element.dom.nodeValue = value;
|
|
523
|
+
};
|
|
524
|
+
return {
|
|
525
|
+
get,
|
|
526
|
+
getOption,
|
|
527
|
+
set
|
|
528
|
+
};
|
|
829
529
|
};
|
|
830
530
|
|
|
831
|
-
const
|
|
531
|
+
const api = NodeValue(isText, 'text');
|
|
532
|
+
const get = element => api.get(element);
|
|
533
|
+
const set = (element, value) => api.set(element, value);
|
|
832
534
|
|
|
833
535
|
var TagBoundaries = [
|
|
834
|
-
|
|
835
|
-
|
|
836
|
-
|
|
837
|
-
|
|
838
|
-
|
|
839
|
-
|
|
840
|
-
|
|
841
|
-
|
|
842
|
-
|
|
843
|
-
|
|
844
|
-
|
|
845
|
-
|
|
846
|
-
|
|
847
|
-
|
|
848
|
-
|
|
849
|
-
|
|
850
|
-
|
|
851
|
-
|
|
852
|
-
|
|
853
|
-
|
|
854
|
-
|
|
855
|
-
|
|
856
|
-
|
|
857
|
-
|
|
858
|
-
|
|
859
|
-
|
|
860
|
-
|
|
861
|
-
|
|
862
|
-
|
|
863
|
-
|
|
864
|
-
|
|
536
|
+
'body',
|
|
537
|
+
'p',
|
|
538
|
+
'div',
|
|
539
|
+
'article',
|
|
540
|
+
'aside',
|
|
541
|
+
'figcaption',
|
|
542
|
+
'figure',
|
|
543
|
+
'footer',
|
|
544
|
+
'header',
|
|
545
|
+
'nav',
|
|
546
|
+
'section',
|
|
547
|
+
'ol',
|
|
548
|
+
'ul',
|
|
549
|
+
'li',
|
|
550
|
+
'table',
|
|
551
|
+
'thead',
|
|
552
|
+
'tbody',
|
|
553
|
+
'tfoot',
|
|
554
|
+
'caption',
|
|
555
|
+
'tr',
|
|
556
|
+
'td',
|
|
557
|
+
'th',
|
|
558
|
+
'h1',
|
|
559
|
+
'h2',
|
|
560
|
+
'h3',
|
|
561
|
+
'h4',
|
|
562
|
+
'h5',
|
|
563
|
+
'h6',
|
|
564
|
+
'blockquote',
|
|
565
|
+
'pre',
|
|
566
|
+
'address'
|
|
865
567
|
];
|
|
866
568
|
|
|
867
569
|
var DomUniverse = () => {
|
|
868
|
-
|
|
869
|
-
|
|
870
|
-
|
|
871
|
-
|
|
872
|
-
|
|
873
|
-
|
|
874
|
-
|
|
875
|
-
|
|
876
|
-
|
|
877
|
-
|
|
878
|
-
|
|
879
|
-
|
|
880
|
-
|
|
881
|
-
|
|
882
|
-
|
|
883
|
-
|
|
884
|
-
|
|
885
|
-
|
|
886
|
-
|
|
887
|
-
|
|
888
|
-
|
|
889
|
-
|
|
890
|
-
|
|
891
|
-
|
|
892
|
-
|
|
893
|
-
|
|
894
|
-
|
|
895
|
-
|
|
896
|
-
|
|
897
|
-
|
|
898
|
-
|
|
899
|
-
|
|
900
|
-
|
|
901
|
-
const
|
|
902
|
-
return
|
|
903
|
-
|
|
904
|
-
|
|
905
|
-
|
|
906
|
-
|
|
907
|
-
|
|
908
|
-
|
|
909
|
-
|
|
910
|
-
|
|
911
|
-
|
|
912
|
-
|
|
913
|
-
|
|
914
|
-
|
|
915
|
-
|
|
916
|
-
|
|
917
|
-
|
|
918
|
-
|
|
919
|
-
|
|
920
|
-
|
|
921
|
-
|
|
922
|
-
|
|
923
|
-
|
|
924
|
-
|
|
925
|
-
|
|
926
|
-
|
|
927
|
-
|
|
928
|
-
|
|
929
|
-
|
|
930
|
-
|
|
931
|
-
|
|
932
|
-
|
|
933
|
-
|
|
934
|
-
|
|
935
|
-
|
|
936
|
-
|
|
937
|
-
|
|
938
|
-
|
|
939
|
-
|
|
940
|
-
|
|
941
|
-
|
|
942
|
-
|
|
943
|
-
|
|
944
|
-
|
|
945
|
-
|
|
946
|
-
|
|
947
|
-
|
|
948
|
-
|
|
949
|
-
|
|
950
|
-
|
|
951
|
-
|
|
952
|
-
|
|
953
|
-
|
|
954
|
-
|
|
955
|
-
|
|
956
|
-
|
|
957
|
-
|
|
958
|
-
|
|
959
|
-
|
|
960
|
-
|
|
961
|
-
|
|
962
|
-
|
|
963
|
-
|
|
964
|
-
|
|
965
|
-
|
|
966
|
-
|
|
570
|
+
const clone$1 = element => {
|
|
571
|
+
return SugarElement.fromDom(element.dom.cloneNode(false));
|
|
572
|
+
};
|
|
573
|
+
const document = element => documentOrOwner(element).dom;
|
|
574
|
+
const isBoundary = element => {
|
|
575
|
+
if (!isElement(element)) {
|
|
576
|
+
return false;
|
|
577
|
+
}
|
|
578
|
+
if (name(element) === 'body') {
|
|
579
|
+
return true;
|
|
580
|
+
}
|
|
581
|
+
return contains(TagBoundaries, name(element));
|
|
582
|
+
};
|
|
583
|
+
const isEmptyTag = element => {
|
|
584
|
+
if (!isElement(element)) {
|
|
585
|
+
return false;
|
|
586
|
+
}
|
|
587
|
+
return contains([
|
|
588
|
+
'br',
|
|
589
|
+
'img',
|
|
590
|
+
'hr',
|
|
591
|
+
'input'
|
|
592
|
+
], name(element));
|
|
593
|
+
};
|
|
594
|
+
const isNonEditable = element => isElement(element) && get$2(element, 'contenteditable') === 'false';
|
|
595
|
+
const comparePosition = (element, other) => {
|
|
596
|
+
return element.dom.compareDocumentPosition(other.dom);
|
|
597
|
+
};
|
|
598
|
+
const copyAttributesTo = (source, destination) => {
|
|
599
|
+
const as = clone(source);
|
|
600
|
+
setAll(destination, as);
|
|
601
|
+
};
|
|
602
|
+
const isSpecial = element => {
|
|
603
|
+
const tag = name(element);
|
|
604
|
+
return contains([
|
|
605
|
+
'script',
|
|
606
|
+
'noscript',
|
|
607
|
+
'iframe',
|
|
608
|
+
'noframes',
|
|
609
|
+
'noembed',
|
|
610
|
+
'title',
|
|
611
|
+
'style',
|
|
612
|
+
'textarea',
|
|
613
|
+
'xmp'
|
|
614
|
+
], tag);
|
|
615
|
+
};
|
|
616
|
+
const getLanguage = element => isElement(element) ? getOpt(element, 'lang') : Optional.none();
|
|
617
|
+
return {
|
|
618
|
+
up: constant({
|
|
619
|
+
selector: ancestor,
|
|
620
|
+
closest: closest,
|
|
621
|
+
predicate: ancestor$1,
|
|
622
|
+
all: parents
|
|
623
|
+
}),
|
|
624
|
+
down: constant({
|
|
625
|
+
selector: descendants,
|
|
626
|
+
predicate: descendants$1
|
|
627
|
+
}),
|
|
628
|
+
styles: constant({
|
|
629
|
+
get: get$1,
|
|
630
|
+
getRaw: getRaw,
|
|
631
|
+
set: set$1,
|
|
632
|
+
remove: remove$1
|
|
633
|
+
}),
|
|
634
|
+
attrs: constant({
|
|
635
|
+
get: get$2,
|
|
636
|
+
set: set$2,
|
|
637
|
+
remove: remove$2,
|
|
638
|
+
copyTo: copyAttributesTo
|
|
639
|
+
}),
|
|
640
|
+
insert: constant({
|
|
641
|
+
before: before,
|
|
642
|
+
after: after$1,
|
|
643
|
+
afterAll: after,
|
|
644
|
+
append: append$1,
|
|
645
|
+
appendAll: append,
|
|
646
|
+
prepend: prepend,
|
|
647
|
+
wrap: wrap
|
|
648
|
+
}),
|
|
649
|
+
remove: constant({
|
|
650
|
+
unwrap: unwrap,
|
|
651
|
+
remove: remove
|
|
652
|
+
}),
|
|
653
|
+
create: constant({
|
|
654
|
+
nu: SugarElement.fromTag,
|
|
655
|
+
clone: clone$1,
|
|
656
|
+
text: SugarElement.fromText
|
|
657
|
+
}),
|
|
658
|
+
query: constant({
|
|
659
|
+
comparePosition,
|
|
660
|
+
prevSibling: prevSibling,
|
|
661
|
+
nextSibling: nextSibling
|
|
662
|
+
}),
|
|
663
|
+
property: constant({
|
|
664
|
+
children: children,
|
|
665
|
+
name: name,
|
|
666
|
+
parent: parent,
|
|
667
|
+
document,
|
|
668
|
+
isText: isText,
|
|
669
|
+
isComment: isComment,
|
|
670
|
+
isElement: isElement,
|
|
671
|
+
isSpecial,
|
|
672
|
+
getLanguage,
|
|
673
|
+
getText: get,
|
|
674
|
+
setText: set,
|
|
675
|
+
isBoundary,
|
|
676
|
+
isEmptyTag,
|
|
677
|
+
isNonEditable
|
|
678
|
+
}),
|
|
679
|
+
eq: eq,
|
|
680
|
+
is: is$1
|
|
681
|
+
};
|
|
967
682
|
};
|
|
968
683
|
|
|
684
|
+
const point = (element, offset) => ({
|
|
685
|
+
element,
|
|
686
|
+
offset
|
|
687
|
+
});
|
|
688
|
+
|
|
969
689
|
const scan = (universe, element, direction) => {
|
|
970
|
-
|
|
971
|
-
|
|
972
|
-
|
|
973
|
-
return
|
|
974
|
-
|
|
975
|
-
|
|
976
|
-
|
|
977
|
-
|
|
978
|
-
|
|
979
|
-
else {
|
|
980
|
-
return Optional.none();
|
|
981
|
-
}
|
|
690
|
+
if (universe.property().isText(element) && universe.property().getText(element).trim().length === 0 || universe.property().isComment(element)) {
|
|
691
|
+
return direction(element).bind(elem => {
|
|
692
|
+
return scan(universe, elem, direction).orThunk(() => {
|
|
693
|
+
return Optional.some(elem);
|
|
694
|
+
});
|
|
695
|
+
});
|
|
696
|
+
} else {
|
|
697
|
+
return Optional.none();
|
|
698
|
+
}
|
|
982
699
|
};
|
|
983
700
|
const toEnd = (universe, element) => {
|
|
984
|
-
|
|
985
|
-
|
|
986
|
-
|
|
987
|
-
|
|
988
|
-
|
|
701
|
+
if (universe.property().isText(element)) {
|
|
702
|
+
return universe.property().getText(element).length;
|
|
703
|
+
}
|
|
704
|
+
const children = universe.property().children(element);
|
|
705
|
+
return children.length;
|
|
989
706
|
};
|
|
990
707
|
const freefallRtl$2 = (universe, element) => {
|
|
991
|
-
|
|
992
|
-
|
|
993
|
-
|
|
994
|
-
|
|
995
|
-
|
|
996
|
-
|
|
708
|
+
const candidate = scan(universe, element, universe.query().prevSibling).getOr(element);
|
|
709
|
+
if (universe.property().isText(candidate)) {
|
|
710
|
+
return point(candidate, toEnd(universe, candidate));
|
|
711
|
+
}
|
|
712
|
+
const children = universe.property().children(candidate);
|
|
713
|
+
return children.length > 0 ? freefallRtl$2(universe, children[children.length - 1]) : point(candidate, toEnd(universe, candidate));
|
|
997
714
|
};
|
|
998
715
|
|
|
999
716
|
const freefallRtl$1 = freefallRtl$2;
|
|
1000
717
|
|
|
1001
718
|
const universe = DomUniverse();
|
|
1002
|
-
const freefallRtl =
|
|
1003
|
-
|
|
719
|
+
const freefallRtl = element => {
|
|
720
|
+
return freefallRtl$1(universe, element);
|
|
1004
721
|
};
|
|
1005
722
|
|
|
1006
|
-
const fireToggleAccordionEvent = (editor, element, state) => editor.dispatch('ToggledAccordion', {
|
|
1007
|
-
|
|
723
|
+
const fireToggleAccordionEvent = (editor, element, state) => editor.dispatch('ToggledAccordion', {
|
|
724
|
+
element,
|
|
725
|
+
state
|
|
726
|
+
});
|
|
727
|
+
const fireToggleAllAccordionsEvent = (editor, elements, state) => editor.dispatch('ToggledAllAccordions', {
|
|
728
|
+
elements,
|
|
729
|
+
state
|
|
730
|
+
});
|
|
1008
731
|
|
|
1009
732
|
const accordionTag = 'details';
|
|
1010
733
|
const accordionDetailsClass = 'mce-accordion';
|
|
@@ -1014,336 +737,318 @@
|
|
|
1014
737
|
|
|
1015
738
|
var global$3 = tinymce.util.Tools.resolve('tinymce.util.Tools');
|
|
1016
739
|
|
|
1017
|
-
const isSummary =
|
|
1018
|
-
const isDetails =
|
|
1019
|
-
const isOpen =
|
|
1020
|
-
const isInSummary =
|
|
1021
|
-
|
|
1022
|
-
|
|
1023
|
-
};
|
|
1024
|
-
const isAtDetailsStart =
|
|
1025
|
-
|
|
1026
|
-
|
|
1027
|
-
|
|
1028
|
-
|
|
1029
|
-
|
|
1030
|
-
const
|
|
1031
|
-
const
|
|
1032
|
-
|
|
1033
|
-
|
|
1034
|
-
|
|
1035
|
-
|
|
1036
|
-
|
|
1037
|
-
const createParagraph = (editor) => insertBogus(editor.dom.create('p'));
|
|
1038
|
-
const createSummary = (editor) => insertBogus(editor.dom.create('summary'));
|
|
740
|
+
const isSummary = node => (node === null || node === void 0 ? void 0 : node.nodeName) === 'SUMMARY';
|
|
741
|
+
const isDetails = node => (node === null || node === void 0 ? void 0 : node.nodeName) === 'DETAILS';
|
|
742
|
+
const isOpen = details => details.hasAttribute('open');
|
|
743
|
+
const isInSummary = editor => {
|
|
744
|
+
const node = editor.selection.getNode();
|
|
745
|
+
return isSummary(node) || Boolean(editor.dom.getParent(node, isSummary));
|
|
746
|
+
};
|
|
747
|
+
const isAtDetailsStart = editor => {
|
|
748
|
+
const rng = editor.selection.getRng();
|
|
749
|
+
return isDetails(rng.startContainer) && rng.collapsed && rng.startOffset === 0;
|
|
750
|
+
};
|
|
751
|
+
const isInsertAllowed = editor => !isInSummary(editor) && editor.dom.isEditable(editor.selection.getNode());
|
|
752
|
+
const getSelectedDetails = editor => Optional.from(editor.dom.getParent(editor.selection.getNode(), isDetails));
|
|
753
|
+
const isDetailsSelected = editor => getSelectedDetails(editor).isSome();
|
|
754
|
+
const insertBogus = element => {
|
|
755
|
+
element.innerHTML = '<br data-mce-bogus="1" />';
|
|
756
|
+
return element;
|
|
757
|
+
};
|
|
758
|
+
const createParagraph = editor => insertBogus(editor.dom.create('p'));
|
|
759
|
+
const createSummary = editor => insertBogus(editor.dom.create('summary'));
|
|
1039
760
|
const insertAndSelectParagraphAfter = (editor, target) => {
|
|
1040
|
-
|
|
1041
|
-
|
|
1042
|
-
|
|
761
|
+
const paragraph = createParagraph(editor);
|
|
762
|
+
target.insertAdjacentElement('afterend', paragraph);
|
|
763
|
+
editor.selection.setCursorLocation(paragraph, 0);
|
|
1043
764
|
};
|
|
1044
765
|
const normalizeContent = (editor, accordion) => {
|
|
1045
|
-
|
|
1046
|
-
|
|
1047
|
-
|
|
1048
|
-
|
|
1049
|
-
|
|
766
|
+
if (isSummary(accordion === null || accordion === void 0 ? void 0 : accordion.lastChild)) {
|
|
767
|
+
const paragraph = createParagraph(editor);
|
|
768
|
+
accordion.appendChild(paragraph);
|
|
769
|
+
editor.selection.setCursorLocation(paragraph, 0);
|
|
770
|
+
}
|
|
1050
771
|
};
|
|
1051
772
|
const normalizeSummary = (editor, accordion) => {
|
|
1052
|
-
|
|
1053
|
-
|
|
1054
|
-
|
|
1055
|
-
|
|
1056
|
-
|
|
773
|
+
if (!isSummary(accordion === null || accordion === void 0 ? void 0 : accordion.firstChild)) {
|
|
774
|
+
const summary = createSummary(editor);
|
|
775
|
+
accordion.prepend(summary);
|
|
776
|
+
editor.selection.setCursorLocation(summary, 0);
|
|
777
|
+
}
|
|
1057
778
|
};
|
|
1058
|
-
const normalizeAccordion =
|
|
1059
|
-
|
|
1060
|
-
|
|
779
|
+
const normalizeAccordion = editor => accordion => {
|
|
780
|
+
normalizeContent(editor, accordion);
|
|
781
|
+
normalizeSummary(editor, accordion);
|
|
1061
782
|
};
|
|
1062
|
-
const normalizeDetails =
|
|
1063
|
-
|
|
783
|
+
const normalizeDetails = editor => {
|
|
784
|
+
global$3.each(global$3.grep(editor.dom.select('details', editor.getBody())), normalizeAccordion(editor));
|
|
1064
785
|
};
|
|
1065
786
|
|
|
1066
|
-
const insertAccordion =
|
|
1067
|
-
|
|
1068
|
-
|
|
1069
|
-
|
|
1070
|
-
|
|
1071
|
-
|
|
1072
|
-
|
|
1073
|
-
|
|
1074
|
-
|
|
1075
|
-
|
|
1076
|
-
|
|
1077
|
-
|
|
1078
|
-
|
|
1079
|
-
|
|
1080
|
-
|
|
1081
|
-
|
|
1082
|
-
|
|
1083
|
-
|
|
1084
|
-
|
|
1085
|
-
|
|
1086
|
-
|
|
1087
|
-
|
|
1088
|
-
|
|
1089
|
-
|
|
1090
|
-
|
|
1091
|
-
|
|
1092
|
-
});
|
|
1093
|
-
});
|
|
787
|
+
const insertAccordion = editor => {
|
|
788
|
+
if (!isInsertAllowed(editor)) {
|
|
789
|
+
return;
|
|
790
|
+
}
|
|
791
|
+
const editorBody = SugarElement.fromDom(editor.getBody());
|
|
792
|
+
const uid = generate('acc');
|
|
793
|
+
const summaryText = editor.dom.encode(editor.selection.getRng().toString() || editor.translate('Accordion summary...'));
|
|
794
|
+
const bodyText = editor.dom.encode(editor.translate('Accordion body...'));
|
|
795
|
+
const accordionSummaryHtml = `<summary class="${ accordionSummaryClass }">${ summaryText }</summary>`;
|
|
796
|
+
const accordionBodyHtml = `<${ accordionBodyWrapperTag } class="${ accordionBodyWrapperClass }"><p>${ bodyText }</p></${ accordionBodyWrapperTag }>`;
|
|
797
|
+
editor.undoManager.transact(() => {
|
|
798
|
+
editor.insertContent([
|
|
799
|
+
`<details data-mce-id="${ uid }" class="${ accordionDetailsClass }" open="open">`,
|
|
800
|
+
accordionSummaryHtml,
|
|
801
|
+
accordionBodyHtml,
|
|
802
|
+
`</details>`
|
|
803
|
+
].join(''));
|
|
804
|
+
descendant(editorBody, `[data-mce-id="${ uid }"]`).each(detailsElm => {
|
|
805
|
+
remove$2(detailsElm, 'data-mce-id');
|
|
806
|
+
descendant(detailsElm, `summary`).each(summaryElm => {
|
|
807
|
+
const rng = editor.dom.createRng();
|
|
808
|
+
const des = freefallRtl(summaryElm);
|
|
809
|
+
rng.setStart(des.element.dom, des.offset);
|
|
810
|
+
rng.setEnd(des.element.dom, des.offset);
|
|
811
|
+
editor.selection.setRng(rng);
|
|
812
|
+
});
|
|
1094
813
|
});
|
|
814
|
+
});
|
|
1095
815
|
};
|
|
1096
816
|
const toggleDetailsElement = (details, state) => {
|
|
1097
|
-
|
|
1098
|
-
|
|
1099
|
-
|
|
1100
|
-
|
|
1101
|
-
|
|
1102
|
-
|
|
1103
|
-
|
|
1104
|
-
return shouldOpen;
|
|
817
|
+
const shouldOpen = state !== null && state !== void 0 ? state : !isOpen(details);
|
|
818
|
+
if (shouldOpen) {
|
|
819
|
+
details.setAttribute('open', 'open');
|
|
820
|
+
} else {
|
|
821
|
+
details.removeAttribute('open');
|
|
822
|
+
}
|
|
823
|
+
return shouldOpen;
|
|
1105
824
|
};
|
|
1106
825
|
const toggleAccordion = (editor, state) => {
|
|
1107
|
-
|
|
1108
|
-
|
|
1109
|
-
|
|
1110
|
-
};
|
|
1111
|
-
const removeAccordion =
|
|
1112
|
-
|
|
1113
|
-
|
|
1114
|
-
|
|
1115
|
-
|
|
1116
|
-
|
|
1117
|
-
|
|
1118
|
-
|
|
1119
|
-
|
|
1120
|
-
|
|
1121
|
-
|
|
1122
|
-
}
|
|
1123
|
-
details.remove();
|
|
1124
|
-
});
|
|
1125
|
-
}
|
|
826
|
+
getSelectedDetails(editor).each(details => {
|
|
827
|
+
fireToggleAccordionEvent(editor, details, toggleDetailsElement(details, state));
|
|
828
|
+
});
|
|
829
|
+
};
|
|
830
|
+
const removeAccordion = editor => {
|
|
831
|
+
getSelectedDetails(editor).each(details => {
|
|
832
|
+
const {nextSibling} = details;
|
|
833
|
+
if (nextSibling) {
|
|
834
|
+
editor.selection.select(nextSibling, true);
|
|
835
|
+
editor.selection.collapse(true);
|
|
836
|
+
} else {
|
|
837
|
+
insertAndSelectParagraphAfter(editor, details);
|
|
838
|
+
}
|
|
839
|
+
details.remove();
|
|
840
|
+
});
|
|
1126
841
|
};
|
|
1127
842
|
const toggleAllAccordions = (editor, state) => {
|
|
1128
|
-
|
|
1129
|
-
|
|
1130
|
-
|
|
1131
|
-
|
|
1132
|
-
|
|
1133
|
-
|
|
843
|
+
const accordions = Array.from(editor.getBody().querySelectorAll('details'));
|
|
844
|
+
if (accordions.length === 0) {
|
|
845
|
+
return;
|
|
846
|
+
}
|
|
847
|
+
each$1(accordions, accordion => toggleDetailsElement(accordion, state !== null && state !== void 0 ? state : !isOpen(accordion)));
|
|
848
|
+
fireToggleAllAccordionsEvent(editor, accordions, state);
|
|
1134
849
|
};
|
|
1135
850
|
|
|
1136
|
-
const register$1 =
|
|
1137
|
-
|
|
1138
|
-
|
|
1139
|
-
|
|
1140
|
-
|
|
851
|
+
const register$1 = editor => {
|
|
852
|
+
editor.addCommand('InsertAccordion', () => insertAccordion(editor));
|
|
853
|
+
editor.addCommand('ToggleAccordion', (_ui, value) => toggleAccordion(editor, value));
|
|
854
|
+
editor.addCommand('ToggleAllAccordions', (_ui, value) => toggleAllAccordions(editor, value));
|
|
855
|
+
editor.addCommand('RemoveAccordion', () => removeAccordion(editor));
|
|
1141
856
|
};
|
|
1142
857
|
|
|
1143
858
|
var global$2 = tinymce.util.Tools.resolve('tinymce.html.Node');
|
|
1144
859
|
|
|
1145
|
-
const getClassList =
|
|
860
|
+
const getClassList = node => {
|
|
861
|
+
var _a, _b;
|
|
862
|
+
return (_b = (_a = node.attr('class')) === null || _a === void 0 ? void 0 : _a.split(' ')) !== null && _b !== void 0 ? _b : [];
|
|
863
|
+
};
|
|
1146
864
|
const addClasses = (node, classes) => {
|
|
1147
|
-
|
|
1148
|
-
|
|
1149
|
-
|
|
1150
|
-
|
|
1151
|
-
|
|
865
|
+
const classListSet = new Set([
|
|
866
|
+
...getClassList(node),
|
|
867
|
+
...classes
|
|
868
|
+
]);
|
|
869
|
+
const newClassList = Array.from(classListSet);
|
|
870
|
+
if (newClassList.length > 0) {
|
|
871
|
+
node.attr('class', newClassList.join(' '));
|
|
872
|
+
}
|
|
1152
873
|
};
|
|
1153
874
|
const removeClasses = (node, classes) => {
|
|
1154
|
-
|
|
1155
|
-
|
|
1156
|
-
};
|
|
1157
|
-
const isAccordionDetailsNode =
|
|
1158
|
-
const isAccordionBodyWrapperNode =
|
|
1159
|
-
const getAccordionChildren =
|
|
1160
|
-
|
|
1161
|
-
|
|
1162
|
-
|
|
1163
|
-
|
|
1164
|
-
|
|
1165
|
-
|
|
1166
|
-
|
|
1167
|
-
|
|
1168
|
-
|
|
1169
|
-
|
|
1170
|
-
|
|
1171
|
-
|
|
1172
|
-
|
|
1173
|
-
|
|
1174
|
-
|
|
1175
|
-
|
|
1176
|
-
|
|
1177
|
-
|
|
1178
|
-
|
|
1179
|
-
|
|
1180
|
-
|
|
1181
|
-
|
|
1182
|
-
|
|
1183
|
-
|
|
1184
|
-
|
|
1185
|
-
|
|
1186
|
-
|
|
1187
|
-
|
|
1188
|
-
|
|
1189
|
-
|
|
1190
|
-
|
|
1191
|
-
|
|
1192
|
-
|
|
1193
|
-
|
|
1194
|
-
|
|
1195
|
-
|
|
1196
|
-
|
|
1197
|
-
|
|
1198
|
-
|
|
1199
|
-
|
|
1200
|
-
|
|
1201
|
-
|
|
1202
|
-
|
|
1203
|
-
|
|
1204
|
-
|
|
1205
|
-
|
|
1206
|
-
// If there is nothing in the summary, pad it with a br
|
|
1207
|
-
// so the cursor can be put inside the accordion summary
|
|
1208
|
-
if (isNullable(newSummaryNode.firstChild)) {
|
|
1209
|
-
padInputNode(newSummaryNode);
|
|
1210
|
-
}
|
|
1211
|
-
addClasses(newSummaryNode, [accordionSummaryClass]);
|
|
1212
|
-
if (!hasSummaryNode) {
|
|
1213
|
-
if (isNonNullable(accordionNode.firstChild)) {
|
|
1214
|
-
accordionNode.insert(newSummaryNode, accordionNode.firstChild, true);
|
|
1215
|
-
}
|
|
1216
|
-
else {
|
|
1217
|
-
accordionNode.append(newSummaryNode);
|
|
1218
|
-
}
|
|
1219
|
-
}
|
|
1220
|
-
const hasWrapperNode = isNonNullable(wrapperNode);
|
|
1221
|
-
const newWrapperNode = hasWrapperNode ? wrapperNode : new global$2(accordionBodyWrapperTag, 1);
|
|
1222
|
-
newWrapperNode.attr('data-mce-bogus', '1');
|
|
1223
|
-
addClasses(newWrapperNode, [accordionBodyWrapperClass]);
|
|
1224
|
-
if (otherNodes.length > 0) {
|
|
1225
|
-
for (let j = 0; j < otherNodes.length; j++) {
|
|
1226
|
-
const otherNode = otherNodes[j];
|
|
1227
|
-
newWrapperNode.append(otherNode);
|
|
1228
|
-
}
|
|
1229
|
-
}
|
|
1230
|
-
// If there is nothing in the wrapper, append a placeholder p tag
|
|
1231
|
-
// so the cursor can be put inside the accordion body
|
|
1232
|
-
if (isNullable(newWrapperNode.firstChild)) {
|
|
1233
|
-
const pNode = new global$2('p', 1);
|
|
1234
|
-
padInputNode(pNode);
|
|
1235
|
-
newWrapperNode.append(pNode);
|
|
1236
|
-
}
|
|
1237
|
-
if (!hasWrapperNode) {
|
|
1238
|
-
accordionNode.append(newWrapperNode);
|
|
1239
|
-
}
|
|
1240
|
-
}
|
|
875
|
+
const newClassList = filter(getClassList(node), clazz => !classes.has(clazz));
|
|
876
|
+
node.attr('class', newClassList.length > 0 ? newClassList.join(' ') : null);
|
|
877
|
+
};
|
|
878
|
+
const isAccordionDetailsNode = node => node.name === accordionTag && contains(getClassList(node), accordionDetailsClass);
|
|
879
|
+
const isAccordionBodyWrapperNode = node => node.name === accordionBodyWrapperTag && contains(getClassList(node), accordionBodyWrapperClass);
|
|
880
|
+
const getAccordionChildren = accordionNode => {
|
|
881
|
+
const children = accordionNode.children();
|
|
882
|
+
let summaryNode;
|
|
883
|
+
let wrapperNode;
|
|
884
|
+
const otherNodes = [];
|
|
885
|
+
for (let i = 0; i < children.length; i++) {
|
|
886
|
+
const child = children[i];
|
|
887
|
+
if (child.name === 'summary' && isNullable(summaryNode)) {
|
|
888
|
+
summaryNode = child;
|
|
889
|
+
} else if (isAccordionBodyWrapperNode(child) && isNullable(wrapperNode)) {
|
|
890
|
+
wrapperNode = child;
|
|
891
|
+
} else {
|
|
892
|
+
otherNodes.push(child);
|
|
893
|
+
}
|
|
894
|
+
}
|
|
895
|
+
return {
|
|
896
|
+
summaryNode,
|
|
897
|
+
wrapperNode,
|
|
898
|
+
otherNodes
|
|
899
|
+
};
|
|
900
|
+
};
|
|
901
|
+
const padInputNode = node => {
|
|
902
|
+
const br = new global$2('br', 1);
|
|
903
|
+
br.attr('data-mce-bogus', '1');
|
|
904
|
+
node.empty();
|
|
905
|
+
node.append(br);
|
|
906
|
+
};
|
|
907
|
+
const setup$2 = editor => {
|
|
908
|
+
editor.on('PreInit', () => {
|
|
909
|
+
const {serializer, parser} = editor;
|
|
910
|
+
parser.addNodeFilter(accordionTag, nodes => {
|
|
911
|
+
for (let i = 0; i < nodes.length; i++) {
|
|
912
|
+
const node = nodes[i];
|
|
913
|
+
if (isAccordionDetailsNode(node)) {
|
|
914
|
+
const accordionNode = node;
|
|
915
|
+
const {summaryNode, wrapperNode, otherNodes} = getAccordionChildren(accordionNode);
|
|
916
|
+
const hasSummaryNode = isNonNullable(summaryNode);
|
|
917
|
+
const newSummaryNode = hasSummaryNode ? summaryNode : new global$2('summary', 1);
|
|
918
|
+
if (isNullable(newSummaryNode.firstChild)) {
|
|
919
|
+
padInputNode(newSummaryNode);
|
|
920
|
+
}
|
|
921
|
+
addClasses(newSummaryNode, [accordionSummaryClass]);
|
|
922
|
+
if (!hasSummaryNode) {
|
|
923
|
+
if (isNonNullable(accordionNode.firstChild)) {
|
|
924
|
+
accordionNode.insert(newSummaryNode, accordionNode.firstChild, true);
|
|
925
|
+
} else {
|
|
926
|
+
accordionNode.append(newSummaryNode);
|
|
1241
927
|
}
|
|
1242
|
-
|
|
1243
|
-
|
|
1244
|
-
|
|
1245
|
-
|
|
1246
|
-
|
|
1247
|
-
|
|
1248
|
-
|
|
1249
|
-
|
|
1250
|
-
|
|
1251
|
-
if (isAccordionDetailsNode(node)) {
|
|
1252
|
-
const accordionNode = node;
|
|
1253
|
-
const { summaryNode, wrapperNode } = getAccordionChildren(accordionNode);
|
|
1254
|
-
if (isNonNullable(summaryNode)) {
|
|
1255
|
-
removeClasses(summaryNode, summaryClassRemoveSet);
|
|
1256
|
-
}
|
|
1257
|
-
if (isNonNullable(wrapperNode)) {
|
|
1258
|
-
wrapperNode.unwrap();
|
|
1259
|
-
}
|
|
1260
|
-
}
|
|
928
|
+
}
|
|
929
|
+
const hasWrapperNode = isNonNullable(wrapperNode);
|
|
930
|
+
const newWrapperNode = hasWrapperNode ? wrapperNode : new global$2(accordionBodyWrapperTag, 1);
|
|
931
|
+
newWrapperNode.attr('data-mce-bogus', '1');
|
|
932
|
+
addClasses(newWrapperNode, [accordionBodyWrapperClass]);
|
|
933
|
+
if (otherNodes.length > 0) {
|
|
934
|
+
for (let j = 0; j < otherNodes.length; j++) {
|
|
935
|
+
const otherNode = otherNodes[j];
|
|
936
|
+
newWrapperNode.append(otherNode);
|
|
1261
937
|
}
|
|
1262
|
-
|
|
938
|
+
}
|
|
939
|
+
if (isNullable(newWrapperNode.firstChild)) {
|
|
940
|
+
const pNode = new global$2('p', 1);
|
|
941
|
+
padInputNode(pNode);
|
|
942
|
+
newWrapperNode.append(pNode);
|
|
943
|
+
}
|
|
944
|
+
if (!hasWrapperNode) {
|
|
945
|
+
accordionNode.append(newWrapperNode);
|
|
946
|
+
}
|
|
947
|
+
}
|
|
948
|
+
}
|
|
949
|
+
});
|
|
950
|
+
serializer.addNodeFilter(accordionTag, nodes => {
|
|
951
|
+
const summaryClassRemoveSet = new Set([accordionSummaryClass]);
|
|
952
|
+
for (let i = 0; i < nodes.length; i++) {
|
|
953
|
+
const node = nodes[i];
|
|
954
|
+
if (isAccordionDetailsNode(node)) {
|
|
955
|
+
const accordionNode = node;
|
|
956
|
+
const {summaryNode, wrapperNode} = getAccordionChildren(accordionNode);
|
|
957
|
+
if (isNonNullable(summaryNode)) {
|
|
958
|
+
removeClasses(summaryNode, summaryClassRemoveSet);
|
|
959
|
+
}
|
|
960
|
+
if (isNonNullable(wrapperNode)) {
|
|
961
|
+
wrapperNode.unwrap();
|
|
962
|
+
}
|
|
963
|
+
}
|
|
964
|
+
}
|
|
1263
965
|
});
|
|
966
|
+
});
|
|
1264
967
|
};
|
|
1265
968
|
|
|
1266
969
|
var global$1 = tinymce.util.Tools.resolve('tinymce.util.VK');
|
|
1267
970
|
|
|
1268
|
-
const setupEnterKeyInSummary =
|
|
1269
|
-
|
|
1270
|
-
|
|
1271
|
-
|
|
1272
|
-
|
|
1273
|
-
|
|
1274
|
-
|
|
1275
|
-
});
|
|
971
|
+
const setupEnterKeyInSummary = editor => {
|
|
972
|
+
editor.on('keydown', event => {
|
|
973
|
+
if (!event.shiftKey && event.keyCode === global$1.ENTER && isInSummary(editor) || isAtDetailsStart(editor)) {
|
|
974
|
+
event.preventDefault();
|
|
975
|
+
editor.execCommand('ToggleAccordion');
|
|
976
|
+
}
|
|
977
|
+
});
|
|
1276
978
|
};
|
|
1277
|
-
const setup$1 =
|
|
1278
|
-
|
|
1279
|
-
|
|
1280
|
-
|
|
1281
|
-
|
|
1282
|
-
|
|
1283
|
-
|
|
1284
|
-
|
|
979
|
+
const setup$1 = editor => {
|
|
980
|
+
setupEnterKeyInSummary(editor);
|
|
981
|
+
editor.on('ExecCommand', e => {
|
|
982
|
+
const cmd = e.command.toLowerCase();
|
|
983
|
+
if ((cmd === 'delete' || cmd === 'forwarddelete') && isDetailsSelected(editor)) {
|
|
984
|
+
normalizeDetails(editor);
|
|
985
|
+
}
|
|
986
|
+
});
|
|
1285
987
|
};
|
|
1286
988
|
|
|
1287
989
|
var global = tinymce.util.Tools.resolve('tinymce.Env');
|
|
1288
990
|
|
|
1289
|
-
const setup =
|
|
1290
|
-
|
|
1291
|
-
|
|
1292
|
-
|
|
1293
|
-
|
|
1294
|
-
|
|
1295
|
-
|
|
1296
|
-
|
|
1297
|
-
|
|
1298
|
-
|
|
1299
|
-
|
|
1300
|
-
|
|
1301
|
-
});
|
|
1302
|
-
}
|
|
991
|
+
const setup = editor => {
|
|
992
|
+
if (global.browser.isSafari()) {
|
|
993
|
+
editor.on('click', e => {
|
|
994
|
+
if (isSummary(e.target)) {
|
|
995
|
+
const summary = e.target;
|
|
996
|
+
const rng = editor.selection.getRng();
|
|
997
|
+
if (rng.collapsed && rng.startContainer === summary.parentNode && rng.startOffset === 0) {
|
|
998
|
+
editor.selection.setCursorLocation(summary, 0);
|
|
999
|
+
}
|
|
1000
|
+
}
|
|
1001
|
+
});
|
|
1002
|
+
}
|
|
1303
1003
|
};
|
|
1304
1004
|
|
|
1305
|
-
const onSetup =
|
|
1306
|
-
|
|
1307
|
-
|
|
1308
|
-
|
|
1309
|
-
};
|
|
1310
|
-
const register =
|
|
1311
|
-
|
|
1312
|
-
|
|
1313
|
-
|
|
1314
|
-
|
|
1315
|
-
|
|
1316
|
-
|
|
1317
|
-
|
|
1318
|
-
|
|
1319
|
-
|
|
1320
|
-
|
|
1321
|
-
|
|
1322
|
-
|
|
1323
|
-
|
|
1324
|
-
|
|
1325
|
-
|
|
1326
|
-
|
|
1327
|
-
|
|
1328
|
-
|
|
1329
|
-
|
|
1005
|
+
const onSetup = editor => buttonApi => {
|
|
1006
|
+
const onNodeChange = () => buttonApi.setEnabled(isInsertAllowed(editor));
|
|
1007
|
+
editor.on('NodeChange', onNodeChange);
|
|
1008
|
+
return () => editor.off('NodeChange', onNodeChange);
|
|
1009
|
+
};
|
|
1010
|
+
const register = editor => {
|
|
1011
|
+
const onAction = () => editor.execCommand('InsertAccordion');
|
|
1012
|
+
editor.ui.registry.addButton('accordion', {
|
|
1013
|
+
icon: 'accordion',
|
|
1014
|
+
tooltip: 'Insert accordion',
|
|
1015
|
+
onSetup: onSetup(editor),
|
|
1016
|
+
onAction
|
|
1017
|
+
});
|
|
1018
|
+
editor.ui.registry.addMenuItem('accordion', {
|
|
1019
|
+
icon: 'accordion',
|
|
1020
|
+
text: 'Accordion',
|
|
1021
|
+
onSetup: onSetup(editor),
|
|
1022
|
+
onAction
|
|
1023
|
+
});
|
|
1024
|
+
editor.ui.registry.addToggleButton('accordiontoggle', {
|
|
1025
|
+
icon: 'accordion-toggle',
|
|
1026
|
+
tooltip: 'Toggle accordion',
|
|
1027
|
+
onAction: () => editor.execCommand('ToggleAccordion')
|
|
1028
|
+
});
|
|
1029
|
+
editor.ui.registry.addToggleButton('accordionremove', {
|
|
1030
|
+
icon: 'remove',
|
|
1031
|
+
tooltip: 'Delete accordion',
|
|
1032
|
+
onAction: () => editor.execCommand('RemoveAccordion')
|
|
1033
|
+
});
|
|
1034
|
+
editor.ui.registry.addContextToolbar('accordion', {
|
|
1035
|
+
predicate: accordion => editor.dom.is(accordion, 'details') && editor.getBody().contains(accordion) && editor.dom.isEditable(accordion.parentNode),
|
|
1036
|
+
items: 'accordiontoggle accordionremove',
|
|
1037
|
+
scope: 'node',
|
|
1038
|
+
position: 'node'
|
|
1039
|
+
});
|
|
1330
1040
|
};
|
|
1331
1041
|
|
|
1332
1042
|
var Plugin = () => {
|
|
1333
|
-
|
|
1334
|
-
|
|
1335
|
-
|
|
1336
|
-
|
|
1337
|
-
|
|
1338
|
-
|
|
1339
|
-
|
|
1043
|
+
global$4.add('accordion', editor => {
|
|
1044
|
+
register(editor);
|
|
1045
|
+
register$1(editor);
|
|
1046
|
+
setup$1(editor);
|
|
1047
|
+
setup$2(editor);
|
|
1048
|
+
setup(editor);
|
|
1049
|
+
});
|
|
1340
1050
|
};
|
|
1341
1051
|
|
|
1342
1052
|
Plugin();
|
|
1343
|
-
/** *****
|
|
1344
|
-
* DO NOT EXPORT ANYTHING
|
|
1345
|
-
*
|
|
1346
|
-
* IF YOU DO ROLLUP WILL LEAVE A GLOBAL ON THE PAGE
|
|
1347
|
-
*******/
|
|
1348
1053
|
|
|
1349
1054
|
})();
|