@dangl/angular-material-shared 2.9.0-beta0037 → 2.9.0-beta0040
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/fesm2022/dangl-angular-material-shared-tiny-mce.mjs +29 -35
- package/fesm2022/dangl-angular-material-shared-tiny-mce.mjs.map +1 -1
- package/fesm2022/dangl-angular-material-shared.mjs +36 -51
- package/fesm2022/dangl-angular-material-shared.mjs.map +1 -1
- package/package.json +11 -10
- package/styles/material-theme.scss +1 -1
- package/styles/material-variables.scss +5 -5
- package/tinymce-assets/icons/default/icons.js +46 -9
- package/tinymce-assets/icons/default/icons.min.js +1 -1
- package/tinymce-assets/models/dom/model.js +8198 -7244
- package/tinymce-assets/models/dom/model.min.js +1 -4
- package/tinymce-assets/plugins/accordion/plugin.js +1174 -879
- package/tinymce-assets/plugins/accordion/plugin.min.js +1 -4
- package/tinymce-assets/plugins/advlist/plugin.js +412 -200
- package/tinymce-assets/plugins/advlist/plugin.min.js +1 -4
- package/tinymce-assets/plugins/anchor/plugin.js +189 -166
- package/tinymce-assets/plugins/anchor/plugin.min.js +1 -4
- package/tinymce-assets/plugins/autolink/plugin.js +310 -220
- package/tinymce-assets/plugins/autolink/plugin.min.js +1 -4
- package/tinymce-assets/plugins/autoresize/plugin.js +180 -149
- package/tinymce-assets/plugins/autoresize/plugin.min.js +1 -4
- package/tinymce-assets/plugins/autosave/plugin.js +208 -189
- package/tinymce-assets/plugins/autosave/plugin.min.js +1 -4
- package/tinymce-assets/plugins/charmap/plugin.js +905 -1566
- package/tinymce-assets/plugins/charmap/plugin.min.js +1 -4
- package/tinymce-assets/plugins/code/plugin.js +73 -61
- package/tinymce-assets/plugins/code/plugin.min.js +0 -3
- package/tinymce-assets/plugins/codesample/plugin.js +3593 -2402
- package/tinymce-assets/plugins/codesample/plugin.min.js +8 -3
- package/tinymce-assets/plugins/directionality/plugin.js +545 -304
- package/tinymce-assets/plugins/directionality/plugin.min.js +1 -4
- package/tinymce-assets/plugins/emoticons/js/emojiimages.min.js +0 -2
- package/tinymce-assets/plugins/emoticons/js/emojis.min.js +0 -1
- package/tinymce-assets/plugins/emoticons/plugin.js +702 -488
- package/tinymce-assets/plugins/emoticons/plugin.min.js +1 -4
- package/tinymce-assets/plugins/fullscreen/plugin.js +1409 -1049
- package/tinymce-assets/plugins/fullscreen/plugin.min.js +1 -4
- package/tinymce-assets/plugins/help/js/i18n/keynav/ar.js +4 -1
- package/tinymce-assets/plugins/help/js/i18n/keynav/bg_BG.js +4 -1
- package/tinymce-assets/plugins/help/js/i18n/keynav/ca.js +4 -1
- package/tinymce-assets/plugins/help/js/i18n/keynav/cs.js +4 -1
- package/tinymce-assets/plugins/help/js/i18n/keynav/da.js +4 -1
- package/tinymce-assets/plugins/help/js/i18n/keynav/de.js +4 -1
- package/tinymce-assets/plugins/help/js/i18n/keynav/el.js +4 -1
- package/tinymce-assets/plugins/help/js/i18n/keynav/en.js +4 -1
- package/tinymce-assets/plugins/help/js/i18n/keynav/es.js +4 -1
- package/tinymce-assets/plugins/help/js/i18n/keynav/eu.js +4 -1
- package/tinymce-assets/plugins/help/js/i18n/keynav/fa.js +4 -1
- package/tinymce-assets/plugins/help/js/i18n/keynav/fi.js +4 -1
- package/tinymce-assets/plugins/help/js/i18n/keynav/fr_FR.js +4 -1
- package/tinymce-assets/plugins/help/js/i18n/keynav/he_IL.js +4 -1
- package/tinymce-assets/plugins/help/js/i18n/keynav/hi.js +4 -1
- package/tinymce-assets/plugins/help/js/i18n/keynav/hr.js +4 -1
- package/tinymce-assets/plugins/help/js/i18n/keynav/hu_HU.js +4 -1
- package/tinymce-assets/plugins/help/js/i18n/keynav/id.js +4 -1
- package/tinymce-assets/plugins/help/js/i18n/keynav/it.js +4 -1
- package/tinymce-assets/plugins/help/js/i18n/keynav/ja.js +4 -1
- package/tinymce-assets/plugins/help/js/i18n/keynav/kk.js +4 -1
- package/tinymce-assets/plugins/help/js/i18n/keynav/ko_KR.js +4 -1
- package/tinymce-assets/plugins/help/js/i18n/keynav/ms.js +4 -1
- package/tinymce-assets/plugins/help/js/i18n/keynav/nb_NO.js +4 -1
- package/tinymce-assets/plugins/help/js/i18n/keynav/nl.js +4 -1
- package/tinymce-assets/plugins/help/js/i18n/keynav/pl.js +4 -1
- package/tinymce-assets/plugins/help/js/i18n/keynav/pt_BR.js +4 -1
- package/tinymce-assets/plugins/help/js/i18n/keynav/pt_PT.js +4 -1
- package/tinymce-assets/plugins/help/js/i18n/keynav/ro.js +4 -1
- package/tinymce-assets/plugins/help/js/i18n/keynav/ru.js +4 -1
- package/tinymce-assets/plugins/help/js/i18n/keynav/sk.js +4 -1
- package/tinymce-assets/plugins/help/js/i18n/keynav/sl_SI.js +5 -2
- package/tinymce-assets/plugins/help/js/i18n/keynav/sv_SE.js +4 -1
- package/tinymce-assets/plugins/help/js/i18n/keynav/th_TH.js +4 -1
- package/tinymce-assets/plugins/help/js/i18n/keynav/tr.js +4 -1
- package/tinymce-assets/plugins/help/js/i18n/keynav/uk.js +4 -1
- package/tinymce-assets/plugins/help/js/i18n/keynav/vi.js +4 -1
- package/tinymce-assets/plugins/help/js/i18n/keynav/zh_CN.js +8 -5
- package/tinymce-assets/plugins/help/js/i18n/keynav/zh_TW.js +4 -1
- package/tinymce-assets/plugins/help/plugin.js +739 -809
- package/tinymce-assets/plugins/help/plugin.min.js +1 -4
- package/tinymce-assets/plugins/image/plugin.js +1475 -1291
- package/tinymce-assets/plugins/image/plugin.min.js +1 -4
- package/tinymce-assets/plugins/importcss/plugin.js +328 -269
- package/tinymce-assets/plugins/importcss/plugin.min.js +1 -4
- package/tinymce-assets/plugins/insertdatetime/plugin.js +140 -141
- package/tinymce-assets/plugins/insertdatetime/plugin.min.js +1 -4
- package/tinymce-assets/plugins/link/plugin.js +1419 -1084
- package/tinymce-assets/plugins/link/plugin.min.js +1 -4
- package/tinymce-assets/plugins/lists/plugin.js +2177 -1805
- package/tinymce-assets/plugins/lists/plugin.min.js +1 -4
- package/tinymce-assets/plugins/media/plugin.js +1305 -1047
- package/tinymce-assets/plugins/media/plugin.min.js +1 -4
- package/tinymce-assets/plugins/nonbreaking/plugin.js +93 -88
- package/tinymce-assets/plugins/nonbreaking/plugin.min.js +0 -3
- package/tinymce-assets/plugins/pagebreak/plugin.js +91 -85
- package/tinymce-assets/plugins/pagebreak/plugin.min.js +0 -3
- package/tinymce-assets/plugins/preview/plugin.js +742 -74
- package/tinymce-assets/plugins/preview/plugin.min.js +1 -4
- package/tinymce-assets/plugins/quickbars/plugin.js +582 -375
- package/tinymce-assets/plugins/quickbars/plugin.min.js +1 -4
- package/tinymce-assets/plugins/save/plugin.js +100 -82
- package/tinymce-assets/plugins/save/plugin.min.js +1 -4
- package/tinymce-assets/plugins/searchreplace/plugin.js +1183 -906
- package/tinymce-assets/plugins/searchreplace/plugin.min.js +1 -4
- package/tinymce-assets/plugins/table/plugin.js +3651 -3094
- package/tinymce-assets/plugins/table/plugin.min.js +1 -4
- package/tinymce-assets/plugins/visualblocks/plugin.js +71 -63
- package/tinymce-assets/plugins/visualblocks/plugin.min.js +1 -4
- package/tinymce-assets/plugins/visualchars/plugin.js +685 -436
- package/tinymce-assets/plugins/visualchars/plugin.min.js +1 -4
- package/tinymce-assets/plugins/wordcount/plugin.js +382 -307
- package/tinymce-assets/plugins/wordcount/plugin.min.js +1 -4
- package/tinymce-assets/skins/content/dark/content.css +9 -0
- package/tinymce-assets/skins/content/dark/content.js +10 -2
- package/tinymce-assets/skins/content/dark/content.min.css +9 -0
- package/tinymce-assets/skins/content/default/content.css +9 -0
- package/tinymce-assets/skins/content/default/content.js +10 -2
- package/tinymce-assets/skins/content/default/content.min.css +9 -0
- package/tinymce-assets/skins/content/document/content.css +9 -0
- package/tinymce-assets/skins/content/document/content.js +10 -2
- package/tinymce-assets/skins/content/document/content.min.css +9 -0
- package/tinymce-assets/skins/content/tinymce-5/content.css +9 -0
- package/tinymce-assets/skins/content/tinymce-5/content.js +10 -2
- package/tinymce-assets/skins/content/tinymce-5/content.min.css +9 -0
- package/tinymce-assets/skins/content/tinymce-5-dark/content.css +9 -0
- package/tinymce-assets/skins/content/tinymce-5-dark/content.js +10 -2
- package/tinymce-assets/skins/content/tinymce-5-dark/content.min.css +9 -0
- package/tinymce-assets/skins/content/writer/content.css +9 -0
- package/tinymce-assets/skins/content/writer/content.js +10 -2
- package/tinymce-assets/skins/content/writer/content.min.css +9 -0
- package/tinymce-assets/skins/ui/oxide/content.css +157 -49
- package/tinymce-assets/skins/ui/oxide/content.inline.css +157 -49
- package/tinymce-assets/skins/ui/oxide/content.inline.js +10 -2
- package/tinymce-assets/skins/ui/oxide/content.inline.min.css +10 -1
- package/tinymce-assets/skins/ui/oxide/content.js +10 -2
- package/tinymce-assets/skins/ui/oxide/content.min.css +10 -1
- package/tinymce-assets/skins/ui/oxide/skin.css +1592 -214
- package/tinymce-assets/skins/ui/oxide/skin.js +1 -2
- package/tinymce-assets/skins/ui/oxide/skin.min.css +1 -1
- package/tinymce-assets/skins/ui/oxide/skin.shadowdom.js +1 -2
- package/tinymce-assets/skins/ui/oxide-dark/content.css +157 -42
- package/tinymce-assets/skins/ui/oxide-dark/content.inline.css +157 -49
- package/tinymce-assets/skins/ui/oxide-dark/content.inline.js +10 -2
- package/tinymce-assets/skins/ui/oxide-dark/content.inline.min.css +10 -1
- package/tinymce-assets/skins/ui/oxide-dark/content.js +10 -2
- package/tinymce-assets/skins/ui/oxide-dark/content.min.css +10 -1
- package/tinymce-assets/skins/ui/oxide-dark/skin.css +1595 -217
- package/tinymce-assets/skins/ui/oxide-dark/skin.js +1 -2
- package/tinymce-assets/skins/ui/oxide-dark/skin.min.css +1 -1
- package/tinymce-assets/skins/ui/oxide-dark/skin.shadowdom.js +1 -2
- package/tinymce-assets/skins/ui/tinymce-5/content.css +157 -49
- package/tinymce-assets/skins/ui/tinymce-5/content.inline.css +157 -49
- package/tinymce-assets/skins/ui/tinymce-5/content.inline.js +10 -2
- package/tinymce-assets/skins/ui/tinymce-5/content.inline.min.css +10 -1
- package/tinymce-assets/skins/ui/tinymce-5/content.js +10 -2
- package/tinymce-assets/skins/ui/tinymce-5/content.min.css +10 -1
- package/tinymce-assets/skins/ui/tinymce-5/skin.css +1606 -203
- package/tinymce-assets/skins/ui/tinymce-5/skin.js +1 -2
- package/tinymce-assets/skins/ui/tinymce-5/skin.min.css +1 -1
- package/tinymce-assets/skins/ui/tinymce-5/skin.shadowdom.js +1 -2
- package/tinymce-assets/skins/ui/tinymce-5-dark/content.css +157 -42
- package/tinymce-assets/skins/ui/tinymce-5-dark/content.inline.css +157 -49
- package/tinymce-assets/skins/ui/tinymce-5-dark/content.inline.js +10 -2
- package/tinymce-assets/skins/ui/tinymce-5-dark/content.inline.min.css +10 -1
- package/tinymce-assets/skins/ui/tinymce-5-dark/content.js +10 -2
- package/tinymce-assets/skins/ui/tinymce-5-dark/content.min.css +10 -1
- package/tinymce-assets/skins/ui/tinymce-5-dark/skin.css +1607 -204
- package/tinymce-assets/skins/ui/tinymce-5-dark/skin.js +1 -2
- package/tinymce-assets/skins/ui/tinymce-5-dark/skin.min.css +1 -1
- package/tinymce-assets/skins/ui/tinymce-5-dark/skin.shadowdom.js +1 -2
- package/tinymce-assets/themes/silver/theme.js +32786 -28738
- package/tinymce-assets/themes/silver/theme.min.js +1 -4
- package/types/dangl-angular-material-shared-tiny-mce.d.ts +12 -13
- package/types/dangl-angular-material-shared.d.ts +26 -26
- package/tinymce-assets/plugins/template/index.js +0 -7
- package/tinymce-assets/plugins/template/plugin.js +0 -567
- package/tinymce-assets/plugins/template/plugin.min.js +0 -4
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* TinyMCE version
|
|
2
|
+
* TinyMCE version 7.9.3 (2026-05-19)
|
|
3
3
|
*/
|
|
4
4
|
|
|
5
5
|
(function () {
|
|
@@ -7,69 +7,104 @@
|
|
|
7
7
|
|
|
8
8
|
var global$2 = tinymce.util.Tools.resolve('tinymce.PluginManager');
|
|
9
9
|
|
|
10
|
-
|
|
10
|
+
/* eslint-disable @typescript-eslint/no-wrapper-object-types */
|
|
11
|
+
const eq = (t) => (a) => t === a;
|
|
11
12
|
const isNull = eq(null);
|
|
12
13
|
|
|
13
|
-
const identity = x => {
|
|
14
|
-
|
|
14
|
+
const identity = (x) => {
|
|
15
|
+
return x;
|
|
15
16
|
};
|
|
16
17
|
|
|
17
18
|
const map = (xs, f) => {
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
const
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
19
|
+
// pre-allocating array size when it's guaranteed to be known
|
|
20
|
+
// http://jsperf.com/push-allocated-vs-dynamic/22
|
|
21
|
+
const len = xs.length;
|
|
22
|
+
const r = new Array(len);
|
|
23
|
+
for (let i = 0; i < len; i++) {
|
|
24
|
+
const x = xs[i];
|
|
25
|
+
r[i] = f(x, i);
|
|
26
|
+
}
|
|
27
|
+
return r;
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
// Run a function fn after rate ms. If another invocation occurs
|
|
31
|
+
// during the time it is waiting, ignore it completely.
|
|
32
|
+
const first = (fn, rate) => {
|
|
33
|
+
let timer = null;
|
|
34
|
+
const cancel = () => {
|
|
35
|
+
if (!isNull(timer)) {
|
|
36
|
+
clearTimeout(timer);
|
|
37
|
+
timer = null;
|
|
38
|
+
}
|
|
39
|
+
};
|
|
40
|
+
const throttle = (...args) => {
|
|
41
|
+
if (isNull(timer)) {
|
|
42
|
+
timer = setTimeout(() => {
|
|
43
|
+
timer = null;
|
|
44
|
+
fn.apply(null, args);
|
|
45
|
+
}, rate);
|
|
46
|
+
}
|
|
47
|
+
};
|
|
48
|
+
return {
|
|
49
|
+
cancel,
|
|
50
|
+
throttle
|
|
51
|
+
};
|
|
25
52
|
};
|
|
26
53
|
|
|
27
|
-
const
|
|
54
|
+
const removeZwsp$1 = (s) => s.replace(/\uFEFF/g, '');
|
|
55
|
+
|
|
56
|
+
/* eslint-disable max-len */
|
|
57
|
+
const punctuationStr = `[~№|!-*+-\\/:;?@\\[-\`{}\u00A1\u00AB\u00B7\u00BB\u00BF;\u00B7\u055A-\u055F\u0589\u058A\u05BE\u05C0\u05C3\u05C6\u05F3\u05F4\u0609\u060A\u060C\u060D\u061B\u061E\u061F\u066A-\u066D\u06D4\u0700-\u070D\u07F7-\u07F9\u0830-\u083E\u085E\u0964\u0965\u0970\u0DF4\u0E4F\u0E5A\u0E5B\u0F04-\u0F12\u0F3A-\u0F3D\u0F85\u0FD0-\u0FD4\u0FD9\u0FDA\u104A-\u104F\u10FB\u1361-\u1368\u1400\u166D\u166E\u169B\u169C\u16EB-\u16ED\u1735\u1736\u17D4-\u17D6\u17D8-\u17DA\u1800-\u180A\u1944\u1945\u1A1E\u1A1F\u1AA0-\u1AA6\u1AA8-\u1AAD\u1B5A-\u1B60\u1BFC-\u1BFF\u1C3B-\u1C3F\u1C7E\u1C7F\u1CD3\u2010-\u2027\u2030-\u2043\u2045-\u2051\u2053-\u205E\u207D\u207E\u208D\u208E\u3008\u3009\u2768-\u2775\u27C5\u27C6\u27E6-\u27EF\u2983-\u2998\u29D8-\u29DB\u29FC\u29FD\u2CF9-\u2CFC\u2CFE\u2CFF\u2D70\u2E00-\u2E2E\u2E30\u2E31\u3001-\u3003\u3008-\u3011\u3014-\u301F\u3030\u303D\u30A0\u30FB\uA4FE\uA4FF\uA60D-\uA60F\uA673\uA67E\uA6F2-\uA6F7\uA874-\uA877\uA8CE\uA8CF\uA8F8-\uA8FA\uA92E\uA92F\uA95F\uA9C1-\uA9CD\uA9DE\uA9DF\uAA5C-\uAA5F\uAADE\uAADF\uABEB\uFD3E\uFD3F\uFE10-\uFE19\uFE30-\uFE52\uFE54-\uFE61\uFE63\uFE68\uFE6A\uFE6B\uFF01-\uFF03\uFF05-\uFF0A\uFF0C-\uFF0F\uFF1A\uFF1B\uFF1F\uFF20\uFF3B-\uFF3D\uFF3F\uFF5B\uFF5D\uFF5F-\uFF65]`;
|
|
28
58
|
const regExps = {
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
59
|
+
aletter: '[A-Za-z\u00AA\u00B5\u00BA\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037D\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u0527\u0531-\u0556\u0559\u0561-\u0587\u05D0-\u05EA\u05F0-\u05F3\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0977\u0979-\u097F\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C33\u0C35-\u0C39\u0C3D\u0C58\u0C59\u0C60\u0C61\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D60\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u10A0-\u10C5\u10D0-\u10FA\u10FC\u1100-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F4\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F0\u1700-\u170C\u170E-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1820-\u1877\u1880-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191C\u1A00-\u1A16\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF\u1BC0-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1CE9-\u1CEC\u1CEE-\u1CF1\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u24B6-\u24E9\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2D00-\u2D25\u2D30-\u2D65\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005\u303B\u303C\u3105-\u312D\u3131-\u318E\u31A0-\u31BA\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B\uA640-\uA66E\uA67F-\uA697\uA6A0-\uA6EF\uA717-\uA71F\uA722-\uA788\uA78B-\uA78E\uA790\uA791\uA7A0-\uA7A9\uA7FA-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uABC0-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF21-\uFF3A\uFF41-\uFF5A\uFFA0-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]',
|
|
60
|
+
midnumlet: `[-'\\.\u2018\u2019\u2024\uFE52\uFF07\uFF0E]`,
|
|
61
|
+
midletter: '[:\u00B7\u00B7\u05F4\u2027\uFE13\uFE55\uFF1A]',
|
|
62
|
+
midnum: '[±+*/,;;\u0589\u060C\u060D\u066C\u07F8\u2044\uFE10\uFE14\uFE50\uFE54\uFF0C\uFF1B]',
|
|
63
|
+
numeric: '[0-9\u0660-\u0669\u066B\u06F0-\u06F9\u07C0-\u07C9\u0966-\u096F\u09E6-\u09EF\u0A66-\u0A6F\u0AE6-\u0AEF\u0B66-\u0B6F\u0BE6-\u0BEF\u0C66-\u0C6F\u0CE6-\u0CEF\u0D66-\u0D6F\u0E50-\u0E59\u0ED0-\u0ED9\u0F20-\u0F29\u1040-\u1049\u1090-\u1099\u17E0-\u17E9\u1810-\u1819\u1946-\u194F\u19D0-\u19D9\u1A80-\u1A89\u1A90-\u1A99\u1B50-\u1B59\u1BB0-\u1BB9\u1C40-\u1C49\u1C50-\u1C59\uA620-\uA629\uA8D0-\uA8D9\uA900-\uA909\uA9D0-\uA9D9\uAA50-\uAA59\uABF0-\uABF9]',
|
|
64
|
+
cr: '\\r',
|
|
65
|
+
lf: '\\n',
|
|
66
|
+
newline: '[\u000B\u000C\u0085\u2028\u2029]',
|
|
67
|
+
extend: '[\u0300-\u036F\u0483-\u0489\u0591-\u05BD\u05BF\u05C1\u05C2\u05C4\u05C5\u05C7\u0610-\u061A\u064B-\u065F\u0670\u06D6-\u06DC\u06DF-\u06E4\u06E7\u06E8\u06EA-\u06ED\u0711\u0730-\u074A\u07A6-\u07B0\u07EB-\u07F3\u0816-\u0819\u081B-\u0823\u0825-\u0827\u0829-\u082D\u0859-\u085B\u0900-\u0903\u093A-\u093C\u093E-\u094F\u0951-\u0957\u0962\u0963\u0981-\u0983\u09BC\u09BE-\u09C4\u09C7\u09C8\u09CB-\u09CD\u09D7\u09E2\u09E3\u0A01-\u0A03\u0A3C\u0A3E-\u0A42\u0A47\u0A48\u0A4B-\u0A4D\u0A51\u0A70\u0A71\u0A75\u0A81-\u0A83\u0ABC\u0ABE-\u0AC5\u0AC7-\u0AC9\u0ACB-\u0ACD\u0AE2\u0AE3\u0B01-\u0B03\u0B3C\u0B3E-\u0B44\u0B47\u0B48\u0B4B-\u0B4D\u0B56\u0B57\u0B62\u0B63\u0B82\u0BBE-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCD\u0BD7\u0C01-\u0C03\u0C3E-\u0C44\u0C46-\u0C48\u0C4A-\u0C4D\u0C55\u0C56\u0C62\u0C63\u0C82\u0C83\u0CBC\u0CBE-\u0CC4\u0CC6-\u0CC8\u0CCA-\u0CCD\u0CD5\u0CD6\u0CE2\u0CE3\u0D02\u0D03\u0D3E-\u0D44\u0D46-\u0D48\u0D4A-\u0D4D\u0D57\u0D62\u0D63\u0D82\u0D83\u0DCA\u0DCF-\u0DD4\u0DD6\u0DD8-\u0DDF\u0DF2\u0DF3\u0E31\u0E34-\u0E3A\u0E47-\u0E4E\u0EB1\u0EB4-\u0EB9\u0EBB\u0EBC\u0EC8-\u0ECD\u0F18\u0F19\u0F35\u0F37\u0F39\u0F3E\u0F3F\u0F71-\u0F84\u0F86\u0F87\u0F8D-\u0F97\u0F99-\u0FBC\u0FC6\u102B-\u103E\u1056-\u1059\u105E-\u1060\u1062-\u1064\u1067-\u106D\u1071-\u1074\u1082-\u108D\u108F\u109A-\u109D\u135D-\u135F\u1712-\u1714\u1732-\u1734\u1752\u1753\u1772\u1773\u17B6-\u17D3\u17DD\u180B-\u180D\u18A9\u1920-\u192B\u1930-\u193B\u19B0-\u19C0\u19C8\u19C9\u1A17-\u1A1B\u1A55-\u1A5E\u1A60-\u1A7C\u1A7F\u1B00-\u1B04\u1B34-\u1B44\u1B6B-\u1B73\u1B80-\u1B82\u1BA1-\u1BAA\u1BE6-\u1BF3\u1C24-\u1C37\u1CD0-\u1CD2\u1CD4-\u1CE8\u1CED\u1CF2\u1DC0-\u1DE6\u1DFC-\u1DFF\u200C\u200D\u20D0-\u20F0\u2CEF-\u2CF1\u2D7F\u2DE0-\u2DFF\u302A-\u302F\u3099\u309A\uA66F-\uA672\uA67C\uA67D\uA6F0\uA6F1\uA802\uA806\uA80B\uA823-\uA827\uA880\uA881\uA8B4-\uA8C4\uA8E0-\uA8F1\uA926-\uA92D\uA947-\uA953\uA980-\uA983\uA9B3-\uA9C0\uAA29-\uAA36\uAA43\uAA4C\uAA4D\uAA7B\uAAB0\uAAB2-\uAAB4\uAAB7\uAAB8\uAABE\uAABF\uAAC1\uABE3-\uABEA\uABEC\uABED\uFB1E\uFE00-\uFE0F\uFE20-\uFE26\uFF9E\uFF9F]',
|
|
68
|
+
format: '[\u00AD\u0600-\u0603\u06DD\u070F\u17B4\u17B5\u200E\u200F\u202A-\u202E\u2060-\u2064\u206A-\u206F\uFEFF\uFFF9-\uFFFB]',
|
|
69
|
+
katakana: '[\u3031-\u3035\u309B\u309C\u30A0-\u30FA\u30FC-\u30FF\u31F0-\u31FF\u32D0-\u32FE\u3300-\u3357\uFF66-\uFF9D]',
|
|
70
|
+
extendnumlet: '[=_\u203F\u2040\u2054\uFE33\uFE34\uFE4D-\uFE4F\uFF3F\u2200-\u22FF\u003c\u003e]',
|
|
71
|
+
punctuation: punctuationStr
|
|
42
72
|
};
|
|
73
|
+
/* eslint-enable max-len */
|
|
43
74
|
const characterIndices = {
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
75
|
+
ALETTER: 0,
|
|
76
|
+
MIDNUMLET: 1,
|
|
77
|
+
MIDLETTER: 2,
|
|
78
|
+
MIDNUM: 3,
|
|
79
|
+
NUMERIC: 4,
|
|
80
|
+
CR: 5,
|
|
81
|
+
LF: 6,
|
|
82
|
+
NEWLINE: 7,
|
|
83
|
+
EXTEND: 8,
|
|
84
|
+
FORMAT: 9,
|
|
85
|
+
KATAKANA: 10,
|
|
86
|
+
EXTENDNUMLET: 11,
|
|
87
|
+
AT: 12,
|
|
88
|
+
OTHER: 13
|
|
58
89
|
};
|
|
90
|
+
// RegExp objects generated from code point data. Each regex matches a single
|
|
91
|
+
// character against a set of Unicode code points. The index of each item in
|
|
92
|
+
// this array must match its corresponding code point constant value defined
|
|
93
|
+
// above.
|
|
59
94
|
const SETS$1 = [
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
95
|
+
new RegExp(regExps.aletter),
|
|
96
|
+
new RegExp(regExps.midnumlet),
|
|
97
|
+
new RegExp(regExps.midletter),
|
|
98
|
+
new RegExp(regExps.midnum),
|
|
99
|
+
new RegExp(regExps.numeric),
|
|
100
|
+
new RegExp(regExps.cr),
|
|
101
|
+
new RegExp(regExps.lf),
|
|
102
|
+
new RegExp(regExps.newline),
|
|
103
|
+
new RegExp(regExps.extend),
|
|
104
|
+
new RegExp(regExps.format),
|
|
105
|
+
new RegExp(regExps.katakana),
|
|
106
|
+
new RegExp(regExps.extendnumlet),
|
|
107
|
+
new RegExp('@')
|
|
73
108
|
];
|
|
74
109
|
const EMPTY_STRING$1 = '';
|
|
75
110
|
const PUNCTUATION$1 = new RegExp('^' + regExps.punctuation + '$');
|
|
@@ -77,329 +112,369 @@
|
|
|
77
112
|
|
|
78
113
|
const SETS = SETS$1;
|
|
79
114
|
const OTHER = characterIndices.OTHER;
|
|
80
|
-
const getType = char => {
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
115
|
+
const getType = (char) => {
|
|
116
|
+
let type = OTHER;
|
|
117
|
+
const setsLength = SETS.length;
|
|
118
|
+
for (let j = 0; j < setsLength; ++j) {
|
|
119
|
+
const set = SETS[j];
|
|
120
|
+
if (set && set.test(char)) {
|
|
121
|
+
type = j;
|
|
122
|
+
break;
|
|
123
|
+
}
|
|
88
124
|
}
|
|
89
|
-
|
|
90
|
-
return type;
|
|
125
|
+
return type;
|
|
91
126
|
};
|
|
92
|
-
const memoize = func => {
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
127
|
+
const memoize = (func) => {
|
|
128
|
+
const cache = {};
|
|
129
|
+
return (char) => {
|
|
130
|
+
if (cache[char]) {
|
|
131
|
+
return cache[char];
|
|
132
|
+
}
|
|
133
|
+
else {
|
|
134
|
+
const result = func(char);
|
|
135
|
+
cache[char] = result;
|
|
136
|
+
return result;
|
|
137
|
+
}
|
|
138
|
+
};
|
|
103
139
|
};
|
|
104
|
-
const classify = characters => {
|
|
105
|
-
|
|
106
|
-
|
|
140
|
+
const classify = (characters) => {
|
|
141
|
+
const memoized = memoize(getType);
|
|
142
|
+
return map(characters, memoized);
|
|
107
143
|
};
|
|
108
144
|
|
|
109
145
|
const isWordBoundary = (map, index) => {
|
|
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
|
-
|
|
146
|
+
const type = map[index];
|
|
147
|
+
const nextType = map[index + 1];
|
|
148
|
+
if (index < 0 || (index > map.length - 1 && index !== 0)) {
|
|
149
|
+
return false;
|
|
150
|
+
}
|
|
151
|
+
// WB5. Don't break between most letters.
|
|
152
|
+
if (type === characterIndices.ALETTER && nextType === characterIndices.ALETTER) {
|
|
153
|
+
return false;
|
|
154
|
+
}
|
|
155
|
+
const nextNextType = map[index + 2];
|
|
156
|
+
// WB6. Don't break letters across certain punctuation.
|
|
157
|
+
if (type === characterIndices.ALETTER &&
|
|
158
|
+
(nextType === characterIndices.MIDLETTER || nextType === characterIndices.MIDNUMLET || nextType === characterIndices.AT) &&
|
|
159
|
+
nextNextType === characterIndices.ALETTER) {
|
|
160
|
+
return false;
|
|
161
|
+
}
|
|
162
|
+
const prevType = map[index - 1];
|
|
163
|
+
// WB7. Don't break letters across certain punctuation.
|
|
164
|
+
if ((type === characterIndices.MIDLETTER || type === characterIndices.MIDNUMLET || nextType === characterIndices.AT) &&
|
|
165
|
+
nextType === characterIndices.ALETTER &&
|
|
166
|
+
prevType === characterIndices.ALETTER) {
|
|
167
|
+
return false;
|
|
168
|
+
}
|
|
169
|
+
// WB8/WB9/WB10. Don't break inside sequences of digits or digits
|
|
170
|
+
// adjacent to letters.
|
|
171
|
+
if ((type === characterIndices.NUMERIC || type === characterIndices.ALETTER) &&
|
|
172
|
+
(nextType === characterIndices.NUMERIC || nextType === characterIndices.ALETTER)) {
|
|
173
|
+
return false;
|
|
174
|
+
}
|
|
175
|
+
// WB11. Don't break inside numeric sequences like "3.2" or
|
|
176
|
+
// "3,456.789".
|
|
177
|
+
if ((type === characterIndices.MIDNUM || type === characterIndices.MIDNUMLET) &&
|
|
178
|
+
nextType === characterIndices.NUMERIC &&
|
|
179
|
+
prevType === characterIndices.NUMERIC) {
|
|
180
|
+
return false;
|
|
181
|
+
}
|
|
182
|
+
// WB12. Don't break inside numeric sequences like "3.2" or
|
|
183
|
+
// "3,456.789".
|
|
184
|
+
if (type === characterIndices.NUMERIC &&
|
|
185
|
+
(nextType === characterIndices.MIDNUM || nextType === characterIndices.MIDNUMLET) &&
|
|
186
|
+
nextNextType === characterIndices.NUMERIC) {
|
|
187
|
+
return false;
|
|
188
|
+
}
|
|
189
|
+
// WB4. Ignore format and extend characters.
|
|
190
|
+
if ((type === characterIndices.EXTEND || type === characterIndices.FORMAT) &&
|
|
191
|
+
(nextType === characterIndices.ALETTER || nextType === characterIndices.NUMERIC || nextType === characterIndices.KATAKANA ||
|
|
192
|
+
nextType === characterIndices.EXTEND || nextType === characterIndices.FORMAT)
|
|
193
|
+
||
|
|
194
|
+
(nextType === characterIndices.EXTEND ||
|
|
195
|
+
// TINY-9654: Only ignore format characters if they do not precede a word boundary. Since some format characters overlap with whitespace characters (ex: \ufeff) and
|
|
196
|
+
// our word extraction logic excludes whitespace characters, if a whitespace-overlapping format character that precedes a word boundary is not split on, whichever word
|
|
197
|
+
// it is a part of will not be added to the list of extracted words, causing inaccuracies.
|
|
198
|
+
nextType === characterIndices.FORMAT && (nextNextType === characterIndices.ALETTER || nextNextType === characterIndices.NUMERIC || nextNextType === characterIndices.KATAKANA || nextNextType === characterIndices.EXTEND || nextNextType === characterIndices.FORMAT))
|
|
199
|
+
&& (type === characterIndices.ALETTER || type === characterIndices.NUMERIC || type === characterIndices.KATAKANA || type === characterIndices.EXTEND || type === characterIndices.FORMAT)) {
|
|
200
|
+
return false;
|
|
201
|
+
}
|
|
202
|
+
// WB3. Don't break inside CRLF.
|
|
203
|
+
if (type === characterIndices.CR && nextType === characterIndices.LF) {
|
|
204
|
+
return false;
|
|
205
|
+
}
|
|
206
|
+
// WB3a. Break before newlines (including CR and LF).
|
|
207
|
+
if (type === characterIndices.NEWLINE || type === characterIndices.CR || type === characterIndices.LF) {
|
|
208
|
+
return true;
|
|
209
|
+
}
|
|
210
|
+
// WB3b. Break after newlines (including CR and LF).
|
|
211
|
+
if (nextType === characterIndices.NEWLINE || nextType === characterIndices.CR || nextType === characterIndices.LF) {
|
|
212
|
+
return true;
|
|
213
|
+
}
|
|
214
|
+
// WB13. Don't break between Katakana characters.
|
|
215
|
+
if (type === characterIndices.KATAKANA && nextType === characterIndices.KATAKANA) {
|
|
216
|
+
return false;
|
|
217
|
+
}
|
|
218
|
+
// WB13a. Don't break from extenders.
|
|
219
|
+
if (nextType === characterIndices.EXTENDNUMLET &&
|
|
220
|
+
(type === characterIndices.ALETTER || type === characterIndices.NUMERIC || type === characterIndices.KATAKANA ||
|
|
221
|
+
type === characterIndices.EXTENDNUMLET)) {
|
|
222
|
+
return false;
|
|
223
|
+
}
|
|
224
|
+
// WB13b. Don't break from extenders.
|
|
225
|
+
if (type === characterIndices.EXTENDNUMLET &&
|
|
226
|
+
(nextType === characterIndices.ALETTER || nextType === characterIndices.NUMERIC ||
|
|
227
|
+
nextType === characterIndices.KATAKANA)) {
|
|
228
|
+
return false;
|
|
229
|
+
}
|
|
230
|
+
if (type === characterIndices.AT) {
|
|
231
|
+
return false;
|
|
232
|
+
}
|
|
233
|
+
// Break after any character not covered by the rules above.
|
|
145
234
|
return true;
|
|
146
|
-
}
|
|
147
|
-
if (type === characterIndices.KATAKANA && nextType === characterIndices.KATAKANA) {
|
|
148
|
-
return false;
|
|
149
|
-
}
|
|
150
|
-
if (nextType === characterIndices.EXTENDNUMLET && (type === characterIndices.ALETTER || type === characterIndices.NUMERIC || type === characterIndices.KATAKANA || type === characterIndices.EXTENDNUMLET)) {
|
|
151
|
-
return false;
|
|
152
|
-
}
|
|
153
|
-
if (type === characterIndices.EXTENDNUMLET && (nextType === characterIndices.ALETTER || nextType === characterIndices.NUMERIC || nextType === characterIndices.KATAKANA)) {
|
|
154
|
-
return false;
|
|
155
|
-
}
|
|
156
|
-
if (type === characterIndices.AT) {
|
|
157
|
-
return false;
|
|
158
|
-
}
|
|
159
|
-
return true;
|
|
160
235
|
};
|
|
161
236
|
|
|
162
237
|
const EMPTY_STRING = EMPTY_STRING$1;
|
|
163
238
|
const WHITESPACE = WHITESPACE$1;
|
|
164
239
|
const PUNCTUATION = PUNCTUATION$1;
|
|
165
|
-
const isProtocol = str => str === 'http' || str === 'https';
|
|
240
|
+
const isProtocol = (str) => str === 'http' || str === 'https';
|
|
166
241
|
const findWordEnd = (characters, startIndex) => {
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
242
|
+
let i;
|
|
243
|
+
for (i = startIndex; i < characters.length; i++) {
|
|
244
|
+
if (WHITESPACE.test(characters[i])) {
|
|
245
|
+
break;
|
|
246
|
+
}
|
|
171
247
|
}
|
|
172
|
-
|
|
173
|
-
return i;
|
|
248
|
+
return i;
|
|
174
249
|
};
|
|
175
250
|
const findUrlEnd = (characters, startIndex) => {
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
251
|
+
const endIndex = findWordEnd(characters, startIndex + 1);
|
|
252
|
+
const peakedWord = characters.slice(startIndex + 1, endIndex).join(EMPTY_STRING);
|
|
253
|
+
return peakedWord.substr(0, 3) === '://' ? endIndex : startIndex;
|
|
179
254
|
};
|
|
180
255
|
const findWordsWithIndices = (chars, sChars, characterMap, options) => {
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
word.
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
256
|
+
const words = [];
|
|
257
|
+
const indices = [];
|
|
258
|
+
let word = [];
|
|
259
|
+
// Loop through each character in the classification map and determine whether
|
|
260
|
+
// it precedes a word boundary, building an array of distinct words as we go.
|
|
261
|
+
for (let i = 0; i < characterMap.length; ++i) {
|
|
262
|
+
// Append this character to the current word.
|
|
263
|
+
word.push(chars[i]);
|
|
264
|
+
// If there's a word boundary between the current character and the next character,
|
|
265
|
+
// append the current word to the words array and start building a new word.
|
|
266
|
+
if (isWordBoundary(characterMap, i)) {
|
|
267
|
+
const ch = sChars[i];
|
|
268
|
+
if ((options.includeWhitespace || !WHITESPACE.test(ch)) &&
|
|
269
|
+
(options.includePunctuation || !PUNCTUATION.test(ch))) {
|
|
270
|
+
const startOfWord = i - word.length + 1;
|
|
271
|
+
const endOfWord = i + 1;
|
|
272
|
+
const str = sChars.slice(startOfWord, endOfWord).join(EMPTY_STRING);
|
|
273
|
+
if (isProtocol(str)) {
|
|
274
|
+
const endOfUrl = findUrlEnd(sChars, i);
|
|
275
|
+
const url = chars.slice(endOfWord, endOfUrl);
|
|
276
|
+
Array.prototype.push.apply(word, url);
|
|
277
|
+
i = endOfUrl;
|
|
278
|
+
}
|
|
279
|
+
// If the word is an abbreviation, include the next character if it's a period.
|
|
280
|
+
if (sChars[i + 1] === '.' && /^([a-zA-Z]\.)+$/.test(str + '.')) {
|
|
281
|
+
word.push(chars[i + 1]);
|
|
282
|
+
indices.push({
|
|
283
|
+
start: startOfWord,
|
|
284
|
+
end: endOfWord + 1
|
|
285
|
+
});
|
|
286
|
+
}
|
|
287
|
+
else {
|
|
288
|
+
indices.push({
|
|
289
|
+
start: startOfWord,
|
|
290
|
+
end: endOfWord
|
|
291
|
+
});
|
|
292
|
+
}
|
|
293
|
+
words.push(word);
|
|
294
|
+
}
|
|
295
|
+
word = [];
|
|
197
296
|
}
|
|
198
|
-
words.push(word);
|
|
199
|
-
indices.push({
|
|
200
|
-
start: startOfWord,
|
|
201
|
-
end: endOfWord
|
|
202
|
-
});
|
|
203
|
-
}
|
|
204
|
-
word = [];
|
|
205
297
|
}
|
|
206
|
-
|
|
207
|
-
return {
|
|
208
|
-
words,
|
|
209
|
-
indices
|
|
210
|
-
};
|
|
298
|
+
return { words, indices };
|
|
211
299
|
};
|
|
212
300
|
const getDefaultOptions = () => ({
|
|
213
|
-
|
|
214
|
-
|
|
301
|
+
includeWhitespace: false,
|
|
302
|
+
includePunctuation: false
|
|
215
303
|
});
|
|
216
304
|
const getWordsWithIndices = (chars, extract, options) => {
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
305
|
+
options = {
|
|
306
|
+
...getDefaultOptions(),
|
|
307
|
+
...options
|
|
308
|
+
};
|
|
309
|
+
const extractedChars = map(chars, extract);
|
|
310
|
+
const characterMap = classify(extractedChars);
|
|
311
|
+
return findWordsWithIndices(chars, extractedChars, characterMap, options);
|
|
224
312
|
};
|
|
225
313
|
const getWords$1 = (chars, extract, options) => getWordsWithIndices(chars, extract, options).words;
|
|
226
314
|
|
|
227
315
|
const getWords = getWords$1;
|
|
228
316
|
|
|
229
|
-
const removeZwsp$1 = s => s.replace(/\uFEFF/g, '');
|
|
230
|
-
|
|
231
317
|
var global$1 = tinymce.util.Tools.resolve('tinymce.dom.TreeWalker');
|
|
232
318
|
|
|
233
319
|
const getText = (node, schema) => {
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
320
|
+
const blockElements = schema.getBlockElements();
|
|
321
|
+
const voidElements = schema.getVoidElements();
|
|
322
|
+
const isNewline = (node) => blockElements[node.nodeName] || voidElements[node.nodeName];
|
|
323
|
+
const textBlocks = [];
|
|
324
|
+
let txt = '';
|
|
325
|
+
const treeWalker = new global$1(node, node);
|
|
326
|
+
let tempNode;
|
|
327
|
+
while ((tempNode = treeWalker.next())) {
|
|
328
|
+
if (tempNode.nodeType === 3) {
|
|
329
|
+
txt += removeZwsp$1(tempNode.data);
|
|
330
|
+
}
|
|
331
|
+
else if (isNewline(tempNode) && txt.length) {
|
|
332
|
+
textBlocks.push(txt);
|
|
333
|
+
txt = '';
|
|
334
|
+
}
|
|
247
335
|
}
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
return textBlocks;
|
|
336
|
+
if (txt.length) {
|
|
337
|
+
textBlocks.push(txt);
|
|
338
|
+
}
|
|
339
|
+
return textBlocks;
|
|
253
340
|
};
|
|
254
341
|
|
|
255
|
-
const removeZwsp = text => text.replace(/\u200B/g, '');
|
|
256
|
-
const strLen = str => str.replace(/[\uD800-\uDBFF][\uDC00-\uDFFF]/g, '_').length;
|
|
342
|
+
const removeZwsp = (text) => text.replace(/\u200B/g, '');
|
|
343
|
+
const strLen = (str) => str.replace(/[\uD800-\uDBFF][\uDC00-\uDFFF]/g, '_').length;
|
|
257
344
|
const countWords = (node, schema) => {
|
|
258
|
-
|
|
259
|
-
|
|
345
|
+
// TODO - TINY-9708: See if TINY-7484 fix can be replaced by adding \u200B to the "format" character class as per Unicode standard
|
|
346
|
+
// TINY-7484: The grapheme word boundary logic used by Polaris states a ZWSP (\u200B) should be treated as
|
|
347
|
+
// a word boundary, however word counting normally does not consider it as anything so we strip it out.
|
|
348
|
+
const text = removeZwsp(getText(node, schema).join('\n'));
|
|
349
|
+
return getWords(text.split(''), identity).length;
|
|
260
350
|
};
|
|
261
351
|
const countCharacters = (node, schema) => {
|
|
262
|
-
|
|
263
|
-
|
|
352
|
+
const text = getText(node, schema).join('');
|
|
353
|
+
return strLen(text);
|
|
264
354
|
};
|
|
265
355
|
const countCharactersWithoutSpaces = (node, schema) => {
|
|
266
|
-
|
|
267
|
-
|
|
356
|
+
const text = getText(node, schema).join('').replace(/\s/g, '');
|
|
357
|
+
return strLen(text);
|
|
268
358
|
};
|
|
269
359
|
|
|
270
360
|
const createBodyCounter = (editor, count) => () => count(editor.getBody(), editor.schema);
|
|
271
361
|
const createSelectionCounter = (editor, count) => () => count(editor.selection.getRng().cloneContents(), editor.schema);
|
|
272
|
-
const createBodyWordCounter = editor => createBodyCounter(editor, countWords);
|
|
273
|
-
const get = editor => ({
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
362
|
+
const createBodyWordCounter = (editor) => createBodyCounter(editor, countWords);
|
|
363
|
+
const get = (editor) => ({
|
|
364
|
+
body: {
|
|
365
|
+
getWordCount: createBodyWordCounter(editor),
|
|
366
|
+
getCharacterCount: createBodyCounter(editor, countCharacters),
|
|
367
|
+
getCharacterCountWithoutSpaces: createBodyCounter(editor, countCharactersWithoutSpaces)
|
|
368
|
+
},
|
|
369
|
+
selection: {
|
|
370
|
+
getWordCount: createSelectionCounter(editor, countWords),
|
|
371
|
+
getCharacterCount: createSelectionCounter(editor, countCharacters),
|
|
372
|
+
getCharacterCountWithoutSpaces: createSelectionCounter(editor, countCharactersWithoutSpaces)
|
|
373
|
+
},
|
|
374
|
+
getCount: createBodyWordCounter(editor)
|
|
285
375
|
});
|
|
286
376
|
|
|
287
377
|
const open = (editor, api) => {
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
378
|
+
editor.windowManager.open({
|
|
379
|
+
title: 'Word Count',
|
|
380
|
+
body: {
|
|
381
|
+
type: 'panel',
|
|
382
|
+
items: [
|
|
383
|
+
{
|
|
384
|
+
type: 'table',
|
|
385
|
+
header: ['Count', 'Document', 'Selection'],
|
|
386
|
+
cells: [
|
|
387
|
+
[
|
|
388
|
+
'Words',
|
|
389
|
+
String(api.body.getWordCount()),
|
|
390
|
+
String(api.selection.getWordCount())
|
|
391
|
+
],
|
|
392
|
+
[
|
|
393
|
+
'Characters (no spaces)',
|
|
394
|
+
String(api.body.getCharacterCountWithoutSpaces()),
|
|
395
|
+
String(api.selection.getCharacterCountWithoutSpaces())
|
|
396
|
+
],
|
|
397
|
+
[
|
|
398
|
+
'Characters',
|
|
399
|
+
String(api.body.getCharacterCount()),
|
|
400
|
+
String(api.selection.getCharacterCount())
|
|
401
|
+
]
|
|
402
|
+
]
|
|
403
|
+
}
|
|
314
404
|
]
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
405
|
+
},
|
|
406
|
+
buttons: [
|
|
407
|
+
{
|
|
408
|
+
type: 'cancel',
|
|
409
|
+
name: 'close',
|
|
410
|
+
text: 'Close',
|
|
411
|
+
primary: true
|
|
412
|
+
}
|
|
413
|
+
]
|
|
414
|
+
});
|
|
325
415
|
};
|
|
326
416
|
|
|
327
417
|
const register$1 = (editor, api) => {
|
|
328
|
-
|
|
329
|
-
};
|
|
330
|
-
|
|
331
|
-
const first = (fn, rate) => {
|
|
332
|
-
let timer = null;
|
|
333
|
-
const cancel = () => {
|
|
334
|
-
if (!isNull(timer)) {
|
|
335
|
-
clearTimeout(timer);
|
|
336
|
-
timer = null;
|
|
337
|
-
}
|
|
338
|
-
};
|
|
339
|
-
const throttle = (...args) => {
|
|
340
|
-
if (isNull(timer)) {
|
|
341
|
-
timer = setTimeout(() => {
|
|
342
|
-
timer = null;
|
|
343
|
-
fn.apply(null, args);
|
|
344
|
-
}, rate);
|
|
345
|
-
}
|
|
346
|
-
};
|
|
347
|
-
return {
|
|
348
|
-
cancel,
|
|
349
|
-
throttle
|
|
350
|
-
};
|
|
418
|
+
editor.addCommand('mceWordCount', () => open(editor, api));
|
|
351
419
|
};
|
|
352
420
|
|
|
353
421
|
var global = tinymce.util.Tools.resolve('tinymce.util.Delay');
|
|
354
422
|
|
|
355
423
|
const fireWordCountUpdate = (editor, api) => {
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
424
|
+
editor.dispatch('wordCountUpdate', {
|
|
425
|
+
wordCount: {
|
|
426
|
+
words: api.body.getWordCount(),
|
|
427
|
+
characters: api.body.getCharacterCount(),
|
|
428
|
+
charactersWithoutSpaces: api.body.getCharacterCountWithoutSpaces()
|
|
429
|
+
}
|
|
430
|
+
});
|
|
363
431
|
};
|
|
364
432
|
|
|
365
433
|
const updateCount = (editor, api) => {
|
|
366
|
-
|
|
434
|
+
fireWordCountUpdate(editor, api);
|
|
367
435
|
};
|
|
368
436
|
const setup = (editor, api, delay) => {
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
437
|
+
const debouncedUpdate = first(() => updateCount(editor, api), delay);
|
|
438
|
+
editor.on('init', () => {
|
|
439
|
+
updateCount(editor, api);
|
|
440
|
+
global.setEditorTimeout(editor, () => {
|
|
441
|
+
editor.on('SetContent BeforeAddUndo Undo Redo ViewUpdate keyup', debouncedUpdate.throttle);
|
|
442
|
+
}, 0);
|
|
443
|
+
editor.on('remove', debouncedUpdate.cancel);
|
|
444
|
+
});
|
|
377
445
|
};
|
|
378
446
|
|
|
379
|
-
const register = editor => {
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
447
|
+
const register = (editor) => {
|
|
448
|
+
const onAction = () => editor.execCommand('mceWordCount');
|
|
449
|
+
editor.ui.registry.addButton('wordcount', {
|
|
450
|
+
tooltip: 'Word count',
|
|
451
|
+
icon: 'character-count',
|
|
452
|
+
onAction,
|
|
453
|
+
context: 'any'
|
|
454
|
+
});
|
|
455
|
+
editor.ui.registry.addMenuItem('wordcount', {
|
|
456
|
+
text: 'Word count',
|
|
457
|
+
icon: 'character-count',
|
|
458
|
+
onAction,
|
|
459
|
+
context: 'any'
|
|
460
|
+
});
|
|
391
461
|
};
|
|
392
462
|
|
|
393
463
|
var Plugin = (delay = 300) => {
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
464
|
+
global$2.add('wordcount', (editor) => {
|
|
465
|
+
const api = get(editor);
|
|
466
|
+
register$1(editor, api);
|
|
467
|
+
register(editor);
|
|
468
|
+
setup(editor, api, delay);
|
|
469
|
+
return api;
|
|
470
|
+
});
|
|
401
471
|
};
|
|
402
472
|
|
|
403
473
|
Plugin();
|
|
474
|
+
/** *****
|
|
475
|
+
* DO NOT EXPORT ANYTHING
|
|
476
|
+
*
|
|
477
|
+
* IF YOU DO ROLLUP WILL LEAVE A GLOBAL ON THE PAGE
|
|
478
|
+
*******/
|
|
404
479
|
|
|
405
480
|
})();
|