@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.
Files changed (175) hide show
  1. package/fesm2022/dangl-angular-material-shared-tiny-mce.mjs +29 -35
  2. package/fesm2022/dangl-angular-material-shared-tiny-mce.mjs.map +1 -1
  3. package/fesm2022/dangl-angular-material-shared.mjs +36 -51
  4. package/fesm2022/dangl-angular-material-shared.mjs.map +1 -1
  5. package/package.json +11 -10
  6. package/styles/material-theme.scss +1 -1
  7. package/styles/material-variables.scss +5 -5
  8. package/tinymce-assets/icons/default/icons.js +46 -9
  9. package/tinymce-assets/icons/default/icons.min.js +1 -1
  10. package/tinymce-assets/models/dom/model.js +8198 -7244
  11. package/tinymce-assets/models/dom/model.min.js +1 -4
  12. package/tinymce-assets/plugins/accordion/plugin.js +1174 -879
  13. package/tinymce-assets/plugins/accordion/plugin.min.js +1 -4
  14. package/tinymce-assets/plugins/advlist/plugin.js +412 -200
  15. package/tinymce-assets/plugins/advlist/plugin.min.js +1 -4
  16. package/tinymce-assets/plugins/anchor/plugin.js +189 -166
  17. package/tinymce-assets/plugins/anchor/plugin.min.js +1 -4
  18. package/tinymce-assets/plugins/autolink/plugin.js +310 -220
  19. package/tinymce-assets/plugins/autolink/plugin.min.js +1 -4
  20. package/tinymce-assets/plugins/autoresize/plugin.js +180 -149
  21. package/tinymce-assets/plugins/autoresize/plugin.min.js +1 -4
  22. package/tinymce-assets/plugins/autosave/plugin.js +208 -189
  23. package/tinymce-assets/plugins/autosave/plugin.min.js +1 -4
  24. package/tinymce-assets/plugins/charmap/plugin.js +905 -1566
  25. package/tinymce-assets/plugins/charmap/plugin.min.js +1 -4
  26. package/tinymce-assets/plugins/code/plugin.js +73 -61
  27. package/tinymce-assets/plugins/code/plugin.min.js +0 -3
  28. package/tinymce-assets/plugins/codesample/plugin.js +3593 -2402
  29. package/tinymce-assets/plugins/codesample/plugin.min.js +8 -3
  30. package/tinymce-assets/plugins/directionality/plugin.js +545 -304
  31. package/tinymce-assets/plugins/directionality/plugin.min.js +1 -4
  32. package/tinymce-assets/plugins/emoticons/js/emojiimages.min.js +0 -2
  33. package/tinymce-assets/plugins/emoticons/js/emojis.min.js +0 -1
  34. package/tinymce-assets/plugins/emoticons/plugin.js +702 -488
  35. package/tinymce-assets/plugins/emoticons/plugin.min.js +1 -4
  36. package/tinymce-assets/plugins/fullscreen/plugin.js +1409 -1049
  37. package/tinymce-assets/plugins/fullscreen/plugin.min.js +1 -4
  38. package/tinymce-assets/plugins/help/js/i18n/keynav/ar.js +4 -1
  39. package/tinymce-assets/plugins/help/js/i18n/keynav/bg_BG.js +4 -1
  40. package/tinymce-assets/plugins/help/js/i18n/keynav/ca.js +4 -1
  41. package/tinymce-assets/plugins/help/js/i18n/keynav/cs.js +4 -1
  42. package/tinymce-assets/plugins/help/js/i18n/keynav/da.js +4 -1
  43. package/tinymce-assets/plugins/help/js/i18n/keynav/de.js +4 -1
  44. package/tinymce-assets/plugins/help/js/i18n/keynav/el.js +4 -1
  45. package/tinymce-assets/plugins/help/js/i18n/keynav/en.js +4 -1
  46. package/tinymce-assets/plugins/help/js/i18n/keynav/es.js +4 -1
  47. package/tinymce-assets/plugins/help/js/i18n/keynav/eu.js +4 -1
  48. package/tinymce-assets/plugins/help/js/i18n/keynav/fa.js +4 -1
  49. package/tinymce-assets/plugins/help/js/i18n/keynav/fi.js +4 -1
  50. package/tinymce-assets/plugins/help/js/i18n/keynav/fr_FR.js +4 -1
  51. package/tinymce-assets/plugins/help/js/i18n/keynav/he_IL.js +4 -1
  52. package/tinymce-assets/plugins/help/js/i18n/keynav/hi.js +4 -1
  53. package/tinymce-assets/plugins/help/js/i18n/keynav/hr.js +4 -1
  54. package/tinymce-assets/plugins/help/js/i18n/keynav/hu_HU.js +4 -1
  55. package/tinymce-assets/plugins/help/js/i18n/keynav/id.js +4 -1
  56. package/tinymce-assets/plugins/help/js/i18n/keynav/it.js +4 -1
  57. package/tinymce-assets/plugins/help/js/i18n/keynav/ja.js +4 -1
  58. package/tinymce-assets/plugins/help/js/i18n/keynav/kk.js +4 -1
  59. package/tinymce-assets/plugins/help/js/i18n/keynav/ko_KR.js +4 -1
  60. package/tinymce-assets/plugins/help/js/i18n/keynav/ms.js +4 -1
  61. package/tinymce-assets/plugins/help/js/i18n/keynav/nb_NO.js +4 -1
  62. package/tinymce-assets/plugins/help/js/i18n/keynav/nl.js +4 -1
  63. package/tinymce-assets/plugins/help/js/i18n/keynav/pl.js +4 -1
  64. package/tinymce-assets/plugins/help/js/i18n/keynav/pt_BR.js +4 -1
  65. package/tinymce-assets/plugins/help/js/i18n/keynav/pt_PT.js +4 -1
  66. package/tinymce-assets/plugins/help/js/i18n/keynav/ro.js +4 -1
  67. package/tinymce-assets/plugins/help/js/i18n/keynav/ru.js +4 -1
  68. package/tinymce-assets/plugins/help/js/i18n/keynav/sk.js +4 -1
  69. package/tinymce-assets/plugins/help/js/i18n/keynav/sl_SI.js +5 -2
  70. package/tinymce-assets/plugins/help/js/i18n/keynav/sv_SE.js +4 -1
  71. package/tinymce-assets/plugins/help/js/i18n/keynav/th_TH.js +4 -1
  72. package/tinymce-assets/plugins/help/js/i18n/keynav/tr.js +4 -1
  73. package/tinymce-assets/plugins/help/js/i18n/keynav/uk.js +4 -1
  74. package/tinymce-assets/plugins/help/js/i18n/keynav/vi.js +4 -1
  75. package/tinymce-assets/plugins/help/js/i18n/keynav/zh_CN.js +8 -5
  76. package/tinymce-assets/plugins/help/js/i18n/keynav/zh_TW.js +4 -1
  77. package/tinymce-assets/plugins/help/plugin.js +739 -809
  78. package/tinymce-assets/plugins/help/plugin.min.js +1 -4
  79. package/tinymce-assets/plugins/image/plugin.js +1475 -1291
  80. package/tinymce-assets/plugins/image/plugin.min.js +1 -4
  81. package/tinymce-assets/plugins/importcss/plugin.js +328 -269
  82. package/tinymce-assets/plugins/importcss/plugin.min.js +1 -4
  83. package/tinymce-assets/plugins/insertdatetime/plugin.js +140 -141
  84. package/tinymce-assets/plugins/insertdatetime/plugin.min.js +1 -4
  85. package/tinymce-assets/plugins/link/plugin.js +1419 -1084
  86. package/tinymce-assets/plugins/link/plugin.min.js +1 -4
  87. package/tinymce-assets/plugins/lists/plugin.js +2177 -1805
  88. package/tinymce-assets/plugins/lists/plugin.min.js +1 -4
  89. package/tinymce-assets/plugins/media/plugin.js +1305 -1047
  90. package/tinymce-assets/plugins/media/plugin.min.js +1 -4
  91. package/tinymce-assets/plugins/nonbreaking/plugin.js +93 -88
  92. package/tinymce-assets/plugins/nonbreaking/plugin.min.js +0 -3
  93. package/tinymce-assets/plugins/pagebreak/plugin.js +91 -85
  94. package/tinymce-assets/plugins/pagebreak/plugin.min.js +0 -3
  95. package/tinymce-assets/plugins/preview/plugin.js +742 -74
  96. package/tinymce-assets/plugins/preview/plugin.min.js +1 -4
  97. package/tinymce-assets/plugins/quickbars/plugin.js +582 -375
  98. package/tinymce-assets/plugins/quickbars/plugin.min.js +1 -4
  99. package/tinymce-assets/plugins/save/plugin.js +100 -82
  100. package/tinymce-assets/plugins/save/plugin.min.js +1 -4
  101. package/tinymce-assets/plugins/searchreplace/plugin.js +1183 -906
  102. package/tinymce-assets/plugins/searchreplace/plugin.min.js +1 -4
  103. package/tinymce-assets/plugins/table/plugin.js +3651 -3094
  104. package/tinymce-assets/plugins/table/plugin.min.js +1 -4
  105. package/tinymce-assets/plugins/visualblocks/plugin.js +71 -63
  106. package/tinymce-assets/plugins/visualblocks/plugin.min.js +1 -4
  107. package/tinymce-assets/plugins/visualchars/plugin.js +685 -436
  108. package/tinymce-assets/plugins/visualchars/plugin.min.js +1 -4
  109. package/tinymce-assets/plugins/wordcount/plugin.js +382 -307
  110. package/tinymce-assets/plugins/wordcount/plugin.min.js +1 -4
  111. package/tinymce-assets/skins/content/dark/content.css +9 -0
  112. package/tinymce-assets/skins/content/dark/content.js +10 -2
  113. package/tinymce-assets/skins/content/dark/content.min.css +9 -0
  114. package/tinymce-assets/skins/content/default/content.css +9 -0
  115. package/tinymce-assets/skins/content/default/content.js +10 -2
  116. package/tinymce-assets/skins/content/default/content.min.css +9 -0
  117. package/tinymce-assets/skins/content/document/content.css +9 -0
  118. package/tinymce-assets/skins/content/document/content.js +10 -2
  119. package/tinymce-assets/skins/content/document/content.min.css +9 -0
  120. package/tinymce-assets/skins/content/tinymce-5/content.css +9 -0
  121. package/tinymce-assets/skins/content/tinymce-5/content.js +10 -2
  122. package/tinymce-assets/skins/content/tinymce-5/content.min.css +9 -0
  123. package/tinymce-assets/skins/content/tinymce-5-dark/content.css +9 -0
  124. package/tinymce-assets/skins/content/tinymce-5-dark/content.js +10 -2
  125. package/tinymce-assets/skins/content/tinymce-5-dark/content.min.css +9 -0
  126. package/tinymce-assets/skins/content/writer/content.css +9 -0
  127. package/tinymce-assets/skins/content/writer/content.js +10 -2
  128. package/tinymce-assets/skins/content/writer/content.min.css +9 -0
  129. package/tinymce-assets/skins/ui/oxide/content.css +157 -49
  130. package/tinymce-assets/skins/ui/oxide/content.inline.css +157 -49
  131. package/tinymce-assets/skins/ui/oxide/content.inline.js +10 -2
  132. package/tinymce-assets/skins/ui/oxide/content.inline.min.css +10 -1
  133. package/tinymce-assets/skins/ui/oxide/content.js +10 -2
  134. package/tinymce-assets/skins/ui/oxide/content.min.css +10 -1
  135. package/tinymce-assets/skins/ui/oxide/skin.css +1592 -214
  136. package/tinymce-assets/skins/ui/oxide/skin.js +1 -2
  137. package/tinymce-assets/skins/ui/oxide/skin.min.css +1 -1
  138. package/tinymce-assets/skins/ui/oxide/skin.shadowdom.js +1 -2
  139. package/tinymce-assets/skins/ui/oxide-dark/content.css +157 -42
  140. package/tinymce-assets/skins/ui/oxide-dark/content.inline.css +157 -49
  141. package/tinymce-assets/skins/ui/oxide-dark/content.inline.js +10 -2
  142. package/tinymce-assets/skins/ui/oxide-dark/content.inline.min.css +10 -1
  143. package/tinymce-assets/skins/ui/oxide-dark/content.js +10 -2
  144. package/tinymce-assets/skins/ui/oxide-dark/content.min.css +10 -1
  145. package/tinymce-assets/skins/ui/oxide-dark/skin.css +1595 -217
  146. package/tinymce-assets/skins/ui/oxide-dark/skin.js +1 -2
  147. package/tinymce-assets/skins/ui/oxide-dark/skin.min.css +1 -1
  148. package/tinymce-assets/skins/ui/oxide-dark/skin.shadowdom.js +1 -2
  149. package/tinymce-assets/skins/ui/tinymce-5/content.css +157 -49
  150. package/tinymce-assets/skins/ui/tinymce-5/content.inline.css +157 -49
  151. package/tinymce-assets/skins/ui/tinymce-5/content.inline.js +10 -2
  152. package/tinymce-assets/skins/ui/tinymce-5/content.inline.min.css +10 -1
  153. package/tinymce-assets/skins/ui/tinymce-5/content.js +10 -2
  154. package/tinymce-assets/skins/ui/tinymce-5/content.min.css +10 -1
  155. package/tinymce-assets/skins/ui/tinymce-5/skin.css +1606 -203
  156. package/tinymce-assets/skins/ui/tinymce-5/skin.js +1 -2
  157. package/tinymce-assets/skins/ui/tinymce-5/skin.min.css +1 -1
  158. package/tinymce-assets/skins/ui/tinymce-5/skin.shadowdom.js +1 -2
  159. package/tinymce-assets/skins/ui/tinymce-5-dark/content.css +157 -42
  160. package/tinymce-assets/skins/ui/tinymce-5-dark/content.inline.css +157 -49
  161. package/tinymce-assets/skins/ui/tinymce-5-dark/content.inline.js +10 -2
  162. package/tinymce-assets/skins/ui/tinymce-5-dark/content.inline.min.css +10 -1
  163. package/tinymce-assets/skins/ui/tinymce-5-dark/content.js +10 -2
  164. package/tinymce-assets/skins/ui/tinymce-5-dark/content.min.css +10 -1
  165. package/tinymce-assets/skins/ui/tinymce-5-dark/skin.css +1607 -204
  166. package/tinymce-assets/skins/ui/tinymce-5-dark/skin.js +1 -2
  167. package/tinymce-assets/skins/ui/tinymce-5-dark/skin.min.css +1 -1
  168. package/tinymce-assets/skins/ui/tinymce-5-dark/skin.shadowdom.js +1 -2
  169. package/tinymce-assets/themes/silver/theme.js +32786 -28738
  170. package/tinymce-assets/themes/silver/theme.min.js +1 -4
  171. package/types/dangl-angular-material-shared-tiny-mce.d.ts +12 -13
  172. package/types/dangl-angular-material-shared.d.ts +26 -26
  173. package/tinymce-assets/plugins/template/index.js +0 -7
  174. package/tinymce-assets/plugins/template/plugin.js +0 -567
  175. package/tinymce-assets/plugins/template/plugin.min.js +0 -4
@@ -1,5 +1,5 @@
1
1
  /**
2
- * TinyMCE version 6.8.3 (2024-02-08)
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
- const eq = t => a => t === a;
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
- return x;
14
+ const identity = (x) => {
15
+ return x;
15
16
  };
16
17
 
17
18
  const map = (xs, f) => {
18
- const len = xs.length;
19
- const r = new Array(len);
20
- for (let i = 0; i < len; i++) {
21
- const x = xs[i];
22
- r[i] = f(x, i);
23
- }
24
- return r;
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 punctuationStr = `[~\u2116|!-*+-\\/:;?@\\[-\`{}\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]`;
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
- aletter: '[A-Za-z\xaa\xb5\xba\xc0-\xd6\xd8-\xf6\xf8-\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]',
30
- midnumlet: `[-'\\.\u2018\u2019\u2024\uFE52\uFF07\uFF0E]`,
31
- midletter: '[:\xB7\xB7\u05F4\u2027\uFE13\uFE55\uFF1A]',
32
- midnum: '[\xB1+*/,;;\u0589\u060C\u060D\u066C\u07F8\u2044\uFE10\uFE14\uFE50\uFE54\uFF0C\uFF1B]',
33
- 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]',
34
- cr: '\\r',
35
- lf: '\\n',
36
- newline: '[\x0B\f\x85\u2028\u2029]',
37
- 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]',
38
- format: '[\xAD\u0600-\u0603\u06DD\u070F\u17b4\u17b5\u200E\u200F\u202A-\u202E\u2060-\u2064\u206A-\u206F\uFEFF\uFFF9-\uFFFB]',
39
- katakana: '[\u3031-\u3035\u309B\u309C\u30A0-\u30fa\u30fc-\u30ff\u31f0-\u31ff\u32D0-\u32FE\u3300-\u3357\uff66-\uff9d]',
40
- extendnumlet: '[=_\u203f\u2040\u2054\ufe33\ufe34\ufe4d-\ufe4f\uff3f\u2200-\u22FF<>]',
41
- punctuation: punctuationStr
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
- ALETTER: 0,
45
- MIDNUMLET: 1,
46
- MIDLETTER: 2,
47
- MIDNUM: 3,
48
- NUMERIC: 4,
49
- CR: 5,
50
- LF: 6,
51
- NEWLINE: 7,
52
- EXTEND: 8,
53
- FORMAT: 9,
54
- KATAKANA: 10,
55
- EXTENDNUMLET: 11,
56
- AT: 12,
57
- OTHER: 13
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
- new RegExp(regExps.aletter),
61
- new RegExp(regExps.midnumlet),
62
- new RegExp(regExps.midletter),
63
- new RegExp(regExps.midnum),
64
- new RegExp(regExps.numeric),
65
- new RegExp(regExps.cr),
66
- new RegExp(regExps.lf),
67
- new RegExp(regExps.newline),
68
- new RegExp(regExps.extend),
69
- new RegExp(regExps.format),
70
- new RegExp(regExps.katakana),
71
- new RegExp(regExps.extendnumlet),
72
- new RegExp('@')
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
- let type = OTHER;
82
- const setsLength = SETS.length;
83
- for (let j = 0; j < setsLength; ++j) {
84
- const set = SETS[j];
85
- if (set && set.test(char)) {
86
- type = j;
87
- break;
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
- const cache = {};
94
- return char => {
95
- if (cache[char]) {
96
- return cache[char];
97
- } else {
98
- const result = func(char);
99
- cache[char] = result;
100
- return result;
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
- const memoized = memoize(getType);
106
- return map(characters, memoized);
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
- const type = map[index];
111
- const nextType = map[index + 1];
112
- if (index < 0 || index > map.length - 1 && index !== 0) {
113
- return false;
114
- }
115
- if (type === characterIndices.ALETTER && nextType === characterIndices.ALETTER) {
116
- return false;
117
- }
118
- const nextNextType = map[index + 2];
119
- if (type === characterIndices.ALETTER && (nextType === characterIndices.MIDLETTER || nextType === characterIndices.MIDNUMLET || nextType === characterIndices.AT) && nextNextType === characterIndices.ALETTER) {
120
- return false;
121
- }
122
- const prevType = map[index - 1];
123
- if ((type === characterIndices.MIDLETTER || type === characterIndices.MIDNUMLET || nextType === characterIndices.AT) && nextType === characterIndices.ALETTER && prevType === characterIndices.ALETTER) {
124
- return false;
125
- }
126
- if ((type === characterIndices.NUMERIC || type === characterIndices.ALETTER) && (nextType === characterIndices.NUMERIC || nextType === characterIndices.ALETTER)) {
127
- return false;
128
- }
129
- if ((type === characterIndices.MIDNUM || type === characterIndices.MIDNUMLET) && nextType === characterIndices.NUMERIC && prevType === characterIndices.NUMERIC) {
130
- return false;
131
- }
132
- if (type === characterIndices.NUMERIC && (nextType === characterIndices.MIDNUM || nextType === characterIndices.MIDNUMLET) && nextNextType === characterIndices.NUMERIC) {
133
- return false;
134
- }
135
- if ((type === characterIndices.EXTEND || type === characterIndices.FORMAT) && (nextType === characterIndices.ALETTER || nextType === characterIndices.NUMERIC || nextType === characterIndices.KATAKANA || nextType === characterIndices.EXTEND || nextType === characterIndices.FORMAT) || (nextType === characterIndices.EXTEND || nextType === characterIndices.FORMAT && (nextNextType === characterIndices.ALETTER || nextNextType === characterIndices.NUMERIC || nextNextType === characterIndices.KATAKANA || nextNextType === characterIndices.EXTEND || nextNextType === characterIndices.FORMAT)) && (type === characterIndices.ALETTER || type === characterIndices.NUMERIC || type === characterIndices.KATAKANA || type === characterIndices.EXTEND || type === characterIndices.FORMAT)) {
136
- return false;
137
- }
138
- if (type === characterIndices.CR && nextType === characterIndices.LF) {
139
- return false;
140
- }
141
- if (type === characterIndices.NEWLINE || type === characterIndices.CR || type === characterIndices.LF) {
142
- return true;
143
- }
144
- if (nextType === characterIndices.NEWLINE || nextType === characterIndices.CR || nextType === characterIndices.LF) {
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
- let i;
168
- for (i = startIndex; i < characters.length; i++) {
169
- if (WHITESPACE.test(characters[i])) {
170
- break;
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
- const endIndex = findWordEnd(characters, startIndex + 1);
177
- const peakedWord = characters.slice(startIndex + 1, endIndex).join(EMPTY_STRING);
178
- return peakedWord.substr(0, 3) === '://' ? endIndex : startIndex;
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
- const words = [];
182
- const indices = [];
183
- let word = [];
184
- for (let i = 0; i < characterMap.length; ++i) {
185
- word.push(chars[i]);
186
- if (isWordBoundary(characterMap, i)) {
187
- const ch = sChars[i];
188
- if ((options.includeWhitespace || !WHITESPACE.test(ch)) && (options.includePunctuation || !PUNCTUATION.test(ch))) {
189
- const startOfWord = i - word.length + 1;
190
- const endOfWord = i + 1;
191
- const str = sChars.slice(startOfWord, endOfWord).join(EMPTY_STRING);
192
- if (isProtocol(str)) {
193
- const endOfUrl = findUrlEnd(sChars, i);
194
- const url = chars.slice(endOfWord, endOfUrl);
195
- Array.prototype.push.apply(word, url);
196
- i = endOfUrl;
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
- includeWhitespace: false,
214
- includePunctuation: false
301
+ includeWhitespace: false,
302
+ includePunctuation: false
215
303
  });
216
304
  const getWordsWithIndices = (chars, extract, options) => {
217
- options = {
218
- ...getDefaultOptions(),
219
- ...options
220
- };
221
- const extractedChars = map(chars, extract);
222
- const characterMap = classify(extractedChars);
223
- return findWordsWithIndices(chars, extractedChars, characterMap, options);
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
- const blockElements = schema.getBlockElements();
235
- const voidElements = schema.getVoidElements();
236
- const isNewline = node => blockElements[node.nodeName] || voidElements[node.nodeName];
237
- const textBlocks = [];
238
- let txt = '';
239
- const treeWalker = new global$1(node, node);
240
- let tempNode;
241
- while (tempNode = treeWalker.next()) {
242
- if (tempNode.nodeType === 3) {
243
- txt += removeZwsp$1(tempNode.data);
244
- } else if (isNewline(tempNode) && txt.length) {
245
- textBlocks.push(txt);
246
- txt = '';
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
- if (txt.length) {
250
- textBlocks.push(txt);
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
- const text = removeZwsp(getText(node, schema).join('\n'));
259
- return getWords(text.split(''), identity).length;
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
- const text = getText(node, schema).join('');
263
- return strLen(text);
352
+ const text = getText(node, schema).join('');
353
+ return strLen(text);
264
354
  };
265
355
  const countCharactersWithoutSpaces = (node, schema) => {
266
- const text = getText(node, schema).join('').replace(/\s/g, '');
267
- return strLen(text);
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
- body: {
275
- getWordCount: createBodyWordCounter(editor),
276
- getCharacterCount: createBodyCounter(editor, countCharacters),
277
- getCharacterCountWithoutSpaces: createBodyCounter(editor, countCharactersWithoutSpaces)
278
- },
279
- selection: {
280
- getWordCount: createSelectionCounter(editor, countWords),
281
- getCharacterCount: createSelectionCounter(editor, countCharacters),
282
- getCharacterCountWithoutSpaces: createSelectionCounter(editor, countCharactersWithoutSpaces)
283
- },
284
- getCount: createBodyWordCounter(editor)
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
- editor.windowManager.open({
289
- title: 'Word Count',
290
- body: {
291
- type: 'panel',
292
- items: [{
293
- type: 'table',
294
- header: [
295
- 'Count',
296
- 'Document',
297
- 'Selection'
298
- ],
299
- cells: [
300
- [
301
- 'Words',
302
- String(api.body.getWordCount()),
303
- String(api.selection.getWordCount())
304
- ],
305
- [
306
- 'Characters (no spaces)',
307
- String(api.body.getCharacterCountWithoutSpaces()),
308
- String(api.selection.getCharacterCountWithoutSpaces())
309
- ],
310
- [
311
- 'Characters',
312
- String(api.body.getCharacterCount()),
313
- String(api.selection.getCharacterCount())
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
- buttons: [{
319
- type: 'cancel',
320
- name: 'close',
321
- text: 'Close',
322
- primary: true
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
- editor.addCommand('mceWordCount', () => open(editor, api));
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
- editor.dispatch('wordCountUpdate', {
357
- wordCount: {
358
- words: api.body.getWordCount(),
359
- characters: api.body.getCharacterCount(),
360
- charactersWithoutSpaces: api.body.getCharacterCountWithoutSpaces()
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
- fireWordCountUpdate(editor, api);
434
+ fireWordCountUpdate(editor, api);
367
435
  };
368
436
  const setup = (editor, api, delay) => {
369
- const debouncedUpdate = first(() => updateCount(editor, api), delay);
370
- editor.on('init', () => {
371
- updateCount(editor, api);
372
- global.setEditorTimeout(editor, () => {
373
- editor.on('SetContent BeforeAddUndo Undo Redo ViewUpdate keyup', debouncedUpdate.throttle);
374
- }, 0);
375
- editor.on('remove', debouncedUpdate.cancel);
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
- const onAction = () => editor.execCommand('mceWordCount');
381
- editor.ui.registry.addButton('wordcount', {
382
- tooltip: 'Word count',
383
- icon: 'character-count',
384
- onAction
385
- });
386
- editor.ui.registry.addMenuItem('wordcount', {
387
- text: 'Word count',
388
- icon: 'character-count',
389
- onAction
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
- global$2.add('wordcount', editor => {
395
- const api = get(editor);
396
- register$1(editor, api);
397
- register(editor);
398
- setup(editor, api, delay);
399
- return api;
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
  })();