@bobfrankston/rmfmail 1.0.655 → 1.0.657
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/bin/build-tinymce.js +42 -0
- package/bin/mailx.js +54 -23
- package/bin/mailx.js.map +1 -1
- package/bin/mailx.ts +45 -20
- package/client/compose/editor.js +7 -1
- package/client/compose/editor.js.map +1 -1
- package/client/compose/editor.ts +7 -1
- package/client/lib/rmf-tiny.js +21 -3
- package/client/lib/tinymce/CHANGELOG.md +3991 -0
- package/client/lib/tinymce/README.md +77 -0
- package/client/lib/tinymce/bower.json +27 -0
- package/client/lib/tinymce/composer.json +52 -0
- package/client/lib/tinymce/icons/default/icons.js +270 -0
- package/client/lib/tinymce/icons/default/icons.min.js +1 -0
- package/client/lib/tinymce/icons/default/index.js +7 -0
- package/client/lib/tinymce/license.md +9 -0
- package/client/lib/tinymce/models/dom/index.js +7 -0
- package/client/lib/tinymce/models/dom/model.js +8994 -0
- package/client/lib/tinymce/models/dom/model.min.js +1 -0
- package/client/lib/tinymce/notices.txt +21 -0
- package/client/lib/tinymce/package.json +32 -0
- package/client/lib/tinymce/plugins/accordion/index.js +7 -0
- package/client/lib/tinymce/plugins/accordion/plugin.js +1373 -0
- package/client/lib/tinymce/plugins/accordion/plugin.min.js +1 -0
- package/client/lib/tinymce/plugins/advlist/index.js +7 -0
- package/client/lib/tinymce/plugins/advlist/plugin.js +473 -0
- package/client/lib/tinymce/plugins/advlist/plugin.min.js +1 -0
- package/client/lib/tinymce/plugins/anchor/index.js +7 -0
- package/client/lib/tinymce/plugins/anchor/plugin.js +237 -0
- package/client/lib/tinymce/plugins/anchor/plugin.min.js +1 -0
- package/client/lib/tinymce/plugins/autolink/index.js +7 -0
- package/client/lib/tinymce/plugins/autolink/plugin.js +315 -0
- package/client/lib/tinymce/plugins/autolink/plugin.min.js +1 -0
- package/client/lib/tinymce/plugins/autoresize/index.js +7 -0
- package/client/lib/tinymce/plugins/autoresize/plugin.js +221 -0
- package/client/lib/tinymce/plugins/autoresize/plugin.min.js +1 -0
- package/client/lib/tinymce/plugins/autosave/index.js +7 -0
- package/client/lib/tinymce/plugins/autosave/plugin.js +249 -0
- package/client/lib/tinymce/plugins/autosave/plugin.min.js +1 -0
- package/client/lib/tinymce/plugins/charmap/index.js +7 -0
- package/client/lib/tinymce/plugins/charmap/plugin.js +997 -0
- package/client/lib/tinymce/plugins/charmap/plugin.min.js +1 -0
- package/client/lib/tinymce/plugins/code/index.js +7 -0
- package/client/lib/tinymce/plugins/code/plugin.js +98 -0
- package/client/lib/tinymce/plugins/code/plugin.min.js +1 -0
- package/client/lib/tinymce/plugins/codesample/index.js +7 -0
- package/client/lib/tinymce/plugins/codesample/plugin.js +3655 -0
- package/client/lib/tinymce/plugins/codesample/plugin.min.js +9 -0
- package/client/lib/tinymce/plugins/directionality/index.js +7 -0
- package/client/lib/tinymce/plugins/directionality/plugin.js +670 -0
- package/client/lib/tinymce/plugins/directionality/plugin.min.js +1 -0
- package/client/lib/tinymce/plugins/emoticons/index.js +7 -0
- package/client/lib/tinymce/plugins/emoticons/js/emojiimages.js +1 -0
- package/client/lib/tinymce/plugins/emoticons/js/emojiimages.min.js +1 -0
- package/client/lib/tinymce/plugins/emoticons/js/emojis.js +1 -0
- package/client/lib/tinymce/plugins/emoticons/js/emojis.min.js +1 -0
- package/client/lib/tinymce/plugins/emoticons/plugin.js +809 -0
- package/client/lib/tinymce/plugins/emoticons/plugin.min.js +1 -0
- package/client/lib/tinymce/plugins/fullscreen/index.js +7 -0
- package/client/lib/tinymce/plugins/fullscreen/plugin.js +1607 -0
- package/client/lib/tinymce/plugins/fullscreen/plugin.min.js +1 -0
- package/client/lib/tinymce/plugins/help/index.js +7 -0
- package/client/lib/tinymce/plugins/help/js/i18n/keynav/ar.js +93 -0
- package/client/lib/tinymce/plugins/help/js/i18n/keynav/bg-BG.js +93 -0
- package/client/lib/tinymce/plugins/help/js/i18n/keynav/bg_BG.js +93 -0
- package/client/lib/tinymce/plugins/help/js/i18n/keynav/ca.js +93 -0
- package/client/lib/tinymce/plugins/help/js/i18n/keynav/cs.js +93 -0
- package/client/lib/tinymce/plugins/help/js/i18n/keynav/da.js +93 -0
- package/client/lib/tinymce/plugins/help/js/i18n/keynav/de.js +93 -0
- package/client/lib/tinymce/plugins/help/js/i18n/keynav/el.js +93 -0
- package/client/lib/tinymce/plugins/help/js/i18n/keynav/en.js +93 -0
- package/client/lib/tinymce/plugins/help/js/i18n/keynav/es.js +93 -0
- package/client/lib/tinymce/plugins/help/js/i18n/keynav/eu.js +93 -0
- package/client/lib/tinymce/plugins/help/js/i18n/keynav/fa.js +93 -0
- package/client/lib/tinymce/plugins/help/js/i18n/keynav/fi.js +93 -0
- package/client/lib/tinymce/plugins/help/js/i18n/keynav/fr-FR.js +93 -0
- package/client/lib/tinymce/plugins/help/js/i18n/keynav/fr_FR.js +93 -0
- package/client/lib/tinymce/plugins/help/js/i18n/keynav/he-IL.js +93 -0
- package/client/lib/tinymce/plugins/help/js/i18n/keynav/he_IL.js +93 -0
- package/client/lib/tinymce/plugins/help/js/i18n/keynav/hi.js +93 -0
- package/client/lib/tinymce/plugins/help/js/i18n/keynav/hr.js +93 -0
- package/client/lib/tinymce/plugins/help/js/i18n/keynav/hu-HU.js +93 -0
- package/client/lib/tinymce/plugins/help/js/i18n/keynav/hu_HU.js +93 -0
- package/client/lib/tinymce/plugins/help/js/i18n/keynav/id.js +93 -0
- package/client/lib/tinymce/plugins/help/js/i18n/keynav/it.js +93 -0
- package/client/lib/tinymce/plugins/help/js/i18n/keynav/ja.js +93 -0
- package/client/lib/tinymce/plugins/help/js/i18n/keynav/kk.js +93 -0
- package/client/lib/tinymce/plugins/help/js/i18n/keynav/ko-KR.js +93 -0
- package/client/lib/tinymce/plugins/help/js/i18n/keynav/ko_KR.js +93 -0
- package/client/lib/tinymce/plugins/help/js/i18n/keynav/ms.js +93 -0
- package/client/lib/tinymce/plugins/help/js/i18n/keynav/nb-NO.js +93 -0
- package/client/lib/tinymce/plugins/help/js/i18n/keynav/nb_NO.js +93 -0
- package/client/lib/tinymce/plugins/help/js/i18n/keynav/nl.js +93 -0
- package/client/lib/tinymce/plugins/help/js/i18n/keynav/pl.js +93 -0
- package/client/lib/tinymce/plugins/help/js/i18n/keynav/pt-BR.js +93 -0
- package/client/lib/tinymce/plugins/help/js/i18n/keynav/pt-PT.js +93 -0
- package/client/lib/tinymce/plugins/help/js/i18n/keynav/pt_BR.js +93 -0
- package/client/lib/tinymce/plugins/help/js/i18n/keynav/pt_PT.js +93 -0
- package/client/lib/tinymce/plugins/help/js/i18n/keynav/ro.js +93 -0
- package/client/lib/tinymce/plugins/help/js/i18n/keynav/ru.js +93 -0
- package/client/lib/tinymce/plugins/help/js/i18n/keynav/sk.js +93 -0
- package/client/lib/tinymce/plugins/help/js/i18n/keynav/sl-SI.js +93 -0
- package/client/lib/tinymce/plugins/help/js/i18n/keynav/sl_SI.js +93 -0
- package/client/lib/tinymce/plugins/help/js/i18n/keynav/sv-SE.js +93 -0
- package/client/lib/tinymce/plugins/help/js/i18n/keynav/sv_SE.js +93 -0
- package/client/lib/tinymce/plugins/help/js/i18n/keynav/th-TH.js +93 -0
- package/client/lib/tinymce/plugins/help/js/i18n/keynav/th_TH.js +93 -0
- package/client/lib/tinymce/plugins/help/js/i18n/keynav/tr.js +93 -0
- package/client/lib/tinymce/plugins/help/js/i18n/keynav/uk.js +93 -0
- package/client/lib/tinymce/plugins/help/js/i18n/keynav/vi.js +93 -0
- package/client/lib/tinymce/plugins/help/js/i18n/keynav/zh-CN.js +87 -0
- package/client/lib/tinymce/plugins/help/js/i18n/keynav/zh-TW.js +93 -0
- package/client/lib/tinymce/plugins/help/js/i18n/keynav/zh_CN.js +87 -0
- package/client/lib/tinymce/plugins/help/js/i18n/keynav/zh_TW.js +93 -0
- package/client/lib/tinymce/plugins/help/plugin.js +827 -0
- package/client/lib/tinymce/plugins/help/plugin.min.js +1 -0
- package/client/lib/tinymce/plugins/image/index.js +7 -0
- package/client/lib/tinymce/plugins/image/plugin.js +1692 -0
- package/client/lib/tinymce/plugins/image/plugin.min.js +1 -0
- package/client/lib/tinymce/plugins/importcss/index.js +7 -0
- package/client/lib/tinymce/plugins/importcss/plugin.js +401 -0
- package/client/lib/tinymce/plugins/importcss/plugin.min.js +1 -0
- package/client/lib/tinymce/plugins/insertdatetime/index.js +7 -0
- package/client/lib/tinymce/plugins/insertdatetime/plugin.js +187 -0
- package/client/lib/tinymce/plugins/insertdatetime/plugin.min.js +1 -0
- package/client/lib/tinymce/plugins/link/index.js +7 -0
- package/client/lib/tinymce/plugins/link/plugin.js +1711 -0
- package/client/lib/tinymce/plugins/link/plugin.min.js +1 -0
- package/client/lib/tinymce/plugins/lists/index.js +7 -0
- package/client/lib/tinymce/plugins/lists/plugin.js +602 -0
- package/client/lib/tinymce/plugins/lists/plugin.min.js +1 -0
- package/client/lib/tinymce/plugins/media/index.js +7 -0
- package/client/lib/tinymce/plugins/media/plugin.js +1442 -0
- package/client/lib/tinymce/plugins/media/plugin.min.js +1 -0
- package/client/lib/tinymce/plugins/nonbreaking/index.js +7 -0
- package/client/lib/tinymce/plugins/nonbreaking/plugin.js +128 -0
- package/client/lib/tinymce/plugins/nonbreaking/plugin.min.js +1 -0
- package/client/lib/tinymce/plugins/pagebreak/index.js +7 -0
- package/client/lib/tinymce/plugins/pagebreak/plugin.js +123 -0
- package/client/lib/tinymce/plugins/pagebreak/plugin.min.js +1 -0
- package/client/lib/tinymce/plugins/preview/index.js +7 -0
- package/client/lib/tinymce/plugins/preview/plugin.js +878 -0
- package/client/lib/tinymce/plugins/preview/plugin.min.js +1 -0
- package/client/lib/tinymce/plugins/quickbars/index.js +7 -0
- package/client/lib/tinymce/plugins/quickbars/plugin.js +654 -0
- package/client/lib/tinymce/plugins/quickbars/plugin.min.js +1 -0
- package/client/lib/tinymce/plugins/save/index.js +7 -0
- package/client/lib/tinymce/plugins/save/plugin.js +136 -0
- package/client/lib/tinymce/plugins/save/plugin.min.js +1 -0
- package/client/lib/tinymce/plugins/searchreplace/index.js +7 -0
- package/client/lib/tinymce/plugins/searchreplace/plugin.js +1367 -0
- package/client/lib/tinymce/plugins/searchreplace/plugin.min.js +1 -0
- package/client/lib/tinymce/plugins/table/index.js +7 -0
- package/client/lib/tinymce/plugins/table/plugin.js +4011 -0
- package/client/lib/tinymce/plugins/table/plugin.min.js +1 -0
- package/client/lib/tinymce/plugins/visualblocks/index.js +7 -0
- package/client/lib/tinymce/plugins/visualblocks/plugin.js +106 -0
- package/client/lib/tinymce/plugins/visualblocks/plugin.min.js +1 -0
- package/client/lib/tinymce/plugins/visualchars/index.js +7 -0
- package/client/lib/tinymce/plugins/visualchars/plugin.js +808 -0
- package/client/lib/tinymce/plugins/visualchars/plugin.min.js +1 -0
- package/client/lib/tinymce/plugins/wordcount/index.js +7 -0
- package/client/lib/tinymce/plugins/wordcount/plugin.js +586 -0
- package/client/lib/tinymce/plugins/wordcount/plugin.min.js +1 -0
- package/client/lib/tinymce/skins/content/dark/content.css +75 -0
- package/client/lib/tinymce/skins/content/dark/content.js +10 -0
- package/client/lib/tinymce/skins/content/dark/content.min.css +10 -0
- package/client/lib/tinymce/skins/content/dark/content.min.ts +3 -0
- package/client/lib/tinymce/skins/content/dark/content.ts +3 -0
- package/client/lib/tinymce/skins/content/default/content.css +70 -0
- package/client/lib/tinymce/skins/content/default/content.js +10 -0
- package/client/lib/tinymce/skins/content/default/content.min.css +10 -0
- package/client/lib/tinymce/skins/content/default/content.min.ts +3 -0
- package/client/lib/tinymce/skins/content/default/content.ts +3 -0
- package/client/lib/tinymce/skins/content/document/content.css +75 -0
- package/client/lib/tinymce/skins/content/document/content.js +10 -0
- package/client/lib/tinymce/skins/content/document/content.min.css +10 -0
- package/client/lib/tinymce/skins/content/document/content.min.ts +3 -0
- package/client/lib/tinymce/skins/content/document/content.ts +3 -0
- package/client/lib/tinymce/skins/content/tinymce-5/content.css +70 -0
- package/client/lib/tinymce/skins/content/tinymce-5/content.js +10 -0
- package/client/lib/tinymce/skins/content/tinymce-5/content.min.css +10 -0
- package/client/lib/tinymce/skins/content/tinymce-5/content.min.ts +3 -0
- package/client/lib/tinymce/skins/content/tinymce-5/content.ts +3 -0
- package/client/lib/tinymce/skins/content/tinymce-5-dark/content.css +75 -0
- package/client/lib/tinymce/skins/content/tinymce-5-dark/content.js +10 -0
- package/client/lib/tinymce/skins/content/tinymce-5-dark/content.min.css +10 -0
- package/client/lib/tinymce/skins/content/tinymce-5-dark/content.min.ts +3 -0
- package/client/lib/tinymce/skins/content/tinymce-5-dark/content.ts +3 -0
- package/client/lib/tinymce/skins/content/writer/content.css +71 -0
- package/client/lib/tinymce/skins/content/writer/content.js +10 -0
- package/client/lib/tinymce/skins/content/writer/content.min.css +10 -0
- package/client/lib/tinymce/skins/content/writer/content.min.ts +3 -0
- package/client/lib/tinymce/skins/content/writer/content.ts +3 -0
- package/client/lib/tinymce/skins/ui/oxide/content.css +1322 -0
- package/client/lib/tinymce/skins/ui/oxide/content.inline.css +1316 -0
- package/client/lib/tinymce/skins/ui/oxide/content.inline.js +10 -0
- package/client/lib/tinymce/skins/ui/oxide/content.inline.min.css +10 -0
- package/client/lib/tinymce/skins/ui/oxide/content.inline.min.ts +136 -0
- package/client/lib/tinymce/skins/ui/oxide/content.inline.ts +136 -0
- package/client/lib/tinymce/skins/ui/oxide/content.js +10 -0
- package/client/lib/tinymce/skins/ui/oxide/content.min.css +10 -0
- package/client/lib/tinymce/skins/ui/oxide/content.min.ts +136 -0
- package/client/lib/tinymce/skins/ui/oxide/content.ts +136 -0
- package/client/lib/tinymce/skins/ui/oxide/skin.css +7109 -0
- package/client/lib/tinymce/skins/ui/oxide/skin.js +1 -0
- package/client/lib/tinymce/skins/ui/oxide/skin.min.css +1 -0
- package/client/lib/tinymce/skins/ui/oxide/skin.min.ts +637 -0
- package/client/lib/tinymce/skins/ui/oxide/skin.shadowdom.css +30 -0
- package/client/lib/tinymce/skins/ui/oxide/skin.shadowdom.js +1 -0
- package/client/lib/tinymce/skins/ui/oxide/skin.shadowdom.min.css +1 -0
- package/client/lib/tinymce/skins/ui/oxide/skin.shadowdom.min.ts +9 -0
- package/client/lib/tinymce/skins/ui/oxide/skin.shadowdom.ts +9 -0
- package/client/lib/tinymce/skins/ui/oxide/skin.ts +637 -0
- package/client/lib/tinymce/skins/ui/oxide-dark/content.css +1310 -0
- package/client/lib/tinymce/skins/ui/oxide-dark/content.inline.css +1316 -0
- package/client/lib/tinymce/skins/ui/oxide-dark/content.inline.js +10 -0
- package/client/lib/tinymce/skins/ui/oxide-dark/content.inline.min.css +10 -0
- package/client/lib/tinymce/skins/ui/oxide-dark/content.inline.min.ts +136 -0
- package/client/lib/tinymce/skins/ui/oxide-dark/content.inline.ts +136 -0
- package/client/lib/tinymce/skins/ui/oxide-dark/content.js +10 -0
- package/client/lib/tinymce/skins/ui/oxide-dark/content.min.css +10 -0
- package/client/lib/tinymce/skins/ui/oxide-dark/content.min.ts +136 -0
- package/client/lib/tinymce/skins/ui/oxide-dark/content.ts +136 -0
- package/client/lib/tinymce/skins/ui/oxide-dark/skin.css +7112 -0
- package/client/lib/tinymce/skins/ui/oxide-dark/skin.js +1 -0
- package/client/lib/tinymce/skins/ui/oxide-dark/skin.min.css +1 -0
- package/client/lib/tinymce/skins/ui/oxide-dark/skin.min.ts +637 -0
- package/client/lib/tinymce/skins/ui/oxide-dark/skin.shadowdom.css +30 -0
- package/client/lib/tinymce/skins/ui/oxide-dark/skin.shadowdom.js +1 -0
- package/client/lib/tinymce/skins/ui/oxide-dark/skin.shadowdom.min.css +1 -0
- package/client/lib/tinymce/skins/ui/oxide-dark/skin.shadowdom.min.ts +9 -0
- package/client/lib/tinymce/skins/ui/oxide-dark/skin.shadowdom.ts +9 -0
- package/client/lib/tinymce/skins/ui/oxide-dark/skin.ts +637 -0
- package/client/lib/tinymce/skins/ui/tinymce-5/content.css +1322 -0
- package/client/lib/tinymce/skins/ui/tinymce-5/content.inline.css +1316 -0
- package/client/lib/tinymce/skins/ui/tinymce-5/content.inline.js +10 -0
- package/client/lib/tinymce/skins/ui/tinymce-5/content.inline.min.css +10 -0
- package/client/lib/tinymce/skins/ui/tinymce-5/content.inline.min.ts +136 -0
- package/client/lib/tinymce/skins/ui/tinymce-5/content.inline.ts +136 -0
- package/client/lib/tinymce/skins/ui/tinymce-5/content.js +10 -0
- package/client/lib/tinymce/skins/ui/tinymce-5/content.min.css +10 -0
- package/client/lib/tinymce/skins/ui/tinymce-5/content.min.ts +136 -0
- package/client/lib/tinymce/skins/ui/tinymce-5/content.ts +136 -0
- package/client/lib/tinymce/skins/ui/tinymce-5/skin.css +7228 -0
- package/client/lib/tinymce/skins/ui/tinymce-5/skin.js +1 -0
- package/client/lib/tinymce/skins/ui/tinymce-5/skin.min.css +1 -0
- package/client/lib/tinymce/skins/ui/tinymce-5/skin.min.ts +638 -0
- package/client/lib/tinymce/skins/ui/tinymce-5/skin.shadowdom.css +30 -0
- package/client/lib/tinymce/skins/ui/tinymce-5/skin.shadowdom.js +1 -0
- package/client/lib/tinymce/skins/ui/tinymce-5/skin.shadowdom.min.css +1 -0
- package/client/lib/tinymce/skins/ui/tinymce-5/skin.shadowdom.min.ts +9 -0
- package/client/lib/tinymce/skins/ui/tinymce-5/skin.shadowdom.ts +9 -0
- package/client/lib/tinymce/skins/ui/tinymce-5/skin.ts +638 -0
- package/client/lib/tinymce/skins/ui/tinymce-5-dark/content.css +1310 -0
- package/client/lib/tinymce/skins/ui/tinymce-5-dark/content.inline.css +1316 -0
- package/client/lib/tinymce/skins/ui/tinymce-5-dark/content.inline.js +10 -0
- package/client/lib/tinymce/skins/ui/tinymce-5-dark/content.inline.min.css +10 -0
- package/client/lib/tinymce/skins/ui/tinymce-5-dark/content.inline.min.ts +136 -0
- package/client/lib/tinymce/skins/ui/tinymce-5-dark/content.inline.ts +136 -0
- package/client/lib/tinymce/skins/ui/tinymce-5-dark/content.js +10 -0
- package/client/lib/tinymce/skins/ui/tinymce-5-dark/content.min.css +10 -0
- package/client/lib/tinymce/skins/ui/tinymce-5-dark/content.min.ts +136 -0
- package/client/lib/tinymce/skins/ui/tinymce-5-dark/content.ts +136 -0
- package/client/lib/tinymce/skins/ui/tinymce-5-dark/skin.css +7228 -0
- package/client/lib/tinymce/skins/ui/tinymce-5-dark/skin.js +1 -0
- package/client/lib/tinymce/skins/ui/tinymce-5-dark/skin.min.css +1 -0
- package/client/lib/tinymce/skins/ui/tinymce-5-dark/skin.min.ts +638 -0
- package/client/lib/tinymce/skins/ui/tinymce-5-dark/skin.shadowdom.css +30 -0
- package/client/lib/tinymce/skins/ui/tinymce-5-dark/skin.shadowdom.js +1 -0
- package/client/lib/tinymce/skins/ui/tinymce-5-dark/skin.shadowdom.min.css +1 -0
- package/client/lib/tinymce/skins/ui/tinymce-5-dark/skin.shadowdom.min.ts +9 -0
- package/client/lib/tinymce/skins/ui/tinymce-5-dark/skin.shadowdom.ts +9 -0
- package/client/lib/tinymce/skins/ui/tinymce-5-dark/skin.ts +638 -0
- package/client/lib/tinymce/themes/silver/index.js +7 -0
- package/client/lib/tinymce/themes/silver/theme.js +34829 -0
- package/client/lib/tinymce/themes/silver/theme.min.js +1 -0
- package/client/lib/tinymce/tinymce.js +41682 -0
- package/client/lib/tinymce/tinymce.min.js +10 -0
- package/package.json +5 -2
|
@@ -0,0 +1 @@
|
|
|
1
|
+
!function(){"use strict";const t=t=>e=>(t=>{const e=typeof t;return null===t?"null":"object"===e&&Array.isArray(t)?"array":"object"===e&&(n=o=t,(r=String).prototype.isPrototypeOf(n)||o.constructor?.name===r.name)?"string":e;var n,o,r})(e)===t,e=t=>e=>typeof e===t,n=t("string"),o=t("object"),r=t=>null===t;const s=e("boolean"),a=e("function"),i=e("number");class l{tag;value;static singletonNone=new l(!1);constructor(t,e){this.tag=t,this.value=e}static some(t){return new l(!0,t)}static none(){return l.singletonNone}fold(t,e){return this.tag?e(this.value):t()}isSome(){return this.tag}isNone(){return!this.tag}map(t){return this.tag?l.some(t(this.value)):l.none()}bind(t){return this.tag?t(this.value):l.none()}exists(t){return this.tag&&t(this.value)}forall(t){return!this.tag||t(this.value)}filter(t){return!this.tag||t(this.value)?this:l.none()}getOr(t){return this.tag?this.value:t}or(t){return this.tag?this:t}getOrThunk(t){return this.tag?this.value:t()}orThunk(t){return this.tag?this:t()}getOrDie(t){if(this.tag)return this.value;throw new Error(t??"Called getOrDie on None")}static from(t){return null==t?l.none():l.some(t)}getOrNull(){return this.tag?this.value:null}getOrUndefined(){return this.value}each(t){this.tag&&t(this.value)}toArray(){return this.tag?[this.value]:[]}toString(){return this.tag?`some(${this.value})`:"none()"}}Array.prototype.slice;const c=(t,e)=>{for(let n=0,o=t.length;n<o;n++)e(t[n],n)};a(Array.from)&&Array.from;const u=Object.keys,d=(t,e)=>{const n=u(t);for(let o=0,r=n.length;o<r;o++){const r=n[o];e(t[r],r)}},h="undefined"!=typeof window?window:Function("return this;")(),m=(t,e)=>((t,e)=>{let n=null!=e?e:h;for(let e=0;e<t.length&&null!=n;++e)n=n[t[e]];return n})(t.split("."),e);var g=tinymce.util.Tools.resolve("tinymce.PluginManager");const v=t=>{if(null==t)throw new Error("Node cannot be null or undefined");return{dom:t}},f=v,p=Object.getPrototypeOf,y=t=>{const e=m("ownerDocument.defaultView",t);return o(t)&&((t=>((t,e)=>{const n=((t,e)=>m(t,e))(t,e);if(null==n)throw new Error(t+" not available on this browser");return n})("HTMLElement",t))(e).prototype.isPrototypeOf(t)||/^HTML\w*Element$/.test(p(t).constructor.name))},b=t=>t.dom.nodeValue,w=t=>e=>(t=>t.dom.nodeType)(e)===t,A=t=>k(t)&&y(t.dom),k=w(1),N=w(3),T=(t,e,o)=>{((t,e,o)=>{if(!(n(o)||s(o)||i(o)))throw console.error("Invalid call to Attribute.set. Key ",e,":: Value ",o,":: Element ",t),new Error("Attribute value was not simple");t.setAttribute(e,o+"")})(t.dom,e,o)},C=(t,e)=>{t.dom.removeAttribute(e)},E=(t,e)=>{const n=((t,e)=>{const n=t.dom.getAttribute(e);return null===n?void 0:n})(t,e);return void 0===n||""===n?[]:n.split(" ")},O=t=>void 0!==t.dom.classList,L=t=>t.dom.contentEditable,V={"\xa0":"nbsp","\xad":"shy"},j=(t,e)=>{let n="";return d(t,(t,e)=>{n+=e}),new RegExp("["+n+"]",e?"g":"")},B=j(V),S=j(V,!0),x=(t=>{let e="";return d(t,t=>{e&&(e+=","),e+="span.mce-"+t}),e})(V),M="mce-nbsp",P=t=>'<span data-mce-bogus="1" class="mce-'+V[t]+'">'+t+"</span>",_=t=>"span"===t.nodeName.toLowerCase()&&t.classList.contains("mce-nbsp-wrap"),D=t=>{const e=b(t);return N(t)&&n(e)&&B.test(e)},H=(t,e,n)=>{let o=[];const r=((t,e)=>{const n=t.length,o=new Array(n);for(let r=0;r<n;r++){const n=t[r];o[r]=e(n,r)}return o})(t.dom.childNodes,f);return c(r,t=>{var r;n&&(_((r=t).dom)||!(t=>A(t)&&"false"===L(t))(r))&&e(t)&&(o=o.concat([t])),o=o.concat(H(t,e,((t,e)=>{if(A(t)&&!_(t.dom)){const e=L(t);if("true"===e)return!0;if("false"===e)return!1}return e})(t,n)))}),o},I=(t,e)=>{const n=t.dom,o=H(f(e),D,t.dom.isEditable(e));c(o,e=>{const o=e.dom.parentNode;if(_(o))r=f(o),s=M,O(r)?r.dom.classList.add(s):((t,e)=>{((t,e,n)=>{const o=E(t,e).concat([n]);T(t,e,o.join(" "))})(t,"class",e)})(r,s);else{const o=n.encode(b(e)??"").replace(S,P),r=n.create("div",{},o);let s;for(;s=r.lastChild;)n.insertAfter(s,e.dom);t.dom.remove(e.dom)}var r,s})},$=(t,e)=>{const n=t.dom.select(x,e);c(n,e=>{var n,o;_(e)?(n=f(e),o=M,O(n)?n.dom.classList.remove(o):((t,e)=>{((t,e,n)=>{const o=((t,e)=>{const n=[];for(let o=0,r=t.length;o<r;o++){const r=t[o];e(r)&&n.push(r)}return n})(E(t,e),t=>t!==n);o.length>0?T(t,e,o.join(" ")):C(t,e)})(t,"class",e)})(n,o),(t=>{const e=O(t)?t.dom.classList:(t=>E(t,"class"))(t);0===e.length&&C(t,"class")})(n)):t.dom.remove(e,!0)})},F=t=>{const e=t.getBody(),n=t.selection.getBookmark();let o=((t,e)=>{for(;t.parentNode;){if(t.parentNode===e)return e;t=t.parentNode}})(t.selection.getNode(),e);o=void 0!==o?o:e,$(t,o),I(t,o),t.selection.moveToBookmark(n)},K=(t,e)=>{((t,e)=>{t.dispatch("VisualChars",{state:e})})(t,e.get());const n=t.getBody();!0===e.get()?I(t,n):$(t,n)},R=t=>t.options.get("visualchars_default_state");const U=(t,e)=>{const n=(t=>{let e=null;return{cancel:()=>{r(e)||(clearTimeout(e),e=null)},throttle:(...n)=>{r(e)&&(e=setTimeout(()=>{e=null,t.apply(null,n)},300))}}})(()=>{F(t)});t.on("keydown",o=>{!0===e.get()&&(13===o.keyCode?F(t):n.throttle())}),t.on("remove",n.cancel)},q=(t,e)=>n=>{n.setActive(e.get());const o=t=>n.setActive(t.state);return t.on("VisualChars",o),()=>t.off("VisualChars",o)};g.add("visualchars",t=>{(t=>{(0,t.options.register)("visualchars_default_state",{processor:"boolean",default:!1})})(t);const e=(t=>{let e=t;return{get:()=>e,set:t=>{e=t}}})(R(t));return((t,e)=>{t.addCommand("mceVisualChars",()=>{((t,e)=>{e.set(!e.get());const n=t.selection.getBookmark();K(t,e),t.selection.moveToBookmark(n)})(t,e)})})(t,e),((t,e)=>{const n=()=>t.execCommand("mceVisualChars");t.ui.registry.addToggleButton("visualchars",{tooltip:"Show invisible characters",icon:"visualchars",onAction:n,onSetup:q(t,e),context:"any"}),t.ui.registry.addToggleMenuItem("visualchars",{text:"Show invisible characters",icon:"visualchars",onAction:n,onSetup:q(t,e),context:"any"})})(t,e),U(t,e),((t,e)=>{t.on("init",()=>{K(t,e)})})(t,e),(t=>({isEnabled:()=>t.get()}))(e)})}();
|
|
@@ -0,0 +1,586 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TinyMCE version 8.5.0 (2026-04-29)
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
(function () {
|
|
6
|
+
'use strict';
|
|
7
|
+
|
|
8
|
+
var global$2 = tinymce.util.Tools.resolve('tinymce.PluginManager');
|
|
9
|
+
|
|
10
|
+
/* eslint-disable @typescript-eslint/no-wrapper-object-types */
|
|
11
|
+
const eq = (t) => (a) => t === a;
|
|
12
|
+
const isNull = eq(null);
|
|
13
|
+
|
|
14
|
+
const identity = (x) => {
|
|
15
|
+
return x;
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
const map = (xs, f) => {
|
|
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
|
+
const filter = (xs, pred) => {
|
|
30
|
+
const r = [];
|
|
31
|
+
for (let i = 0, len = xs.length; i < len; i++) {
|
|
32
|
+
const x = xs[i];
|
|
33
|
+
if (pred(x, i)) {
|
|
34
|
+
r.push(x);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
return r;
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* HashSet - Immutable Set Operations
|
|
42
|
+
*
|
|
43
|
+
* An immutable, unordered collection of unique values built on JavaScript's native Set.
|
|
44
|
+
* All operations return new Sets, leaving the original unchanged.
|
|
45
|
+
*
|
|
46
|
+
* ## When to Use HashSet
|
|
47
|
+
*
|
|
48
|
+
* Choose HashSet over other collections when:
|
|
49
|
+
* - You need to ensure elements are unique
|
|
50
|
+
* - You frequently need to check if an element exists in the collection
|
|
51
|
+
* - You need to perform set operations like union, intersection, and difference
|
|
52
|
+
* - The order of elements doesn't matter to your use case
|
|
53
|
+
* - You want immutable, side-effect-free operations
|
|
54
|
+
*
|
|
55
|
+
* Choose other collections when:
|
|
56
|
+
* - You need to maintain insertion order (use arrays)
|
|
57
|
+
* - You need key-value associations (use objects or Map)
|
|
58
|
+
* - You need to frequently access elements by index (use arrays)
|
|
59
|
+
* - You need maximum performance with many modifications (consider direct Set mutation)
|
|
60
|
+
*
|
|
61
|
+
* ## Common Use Cases
|
|
62
|
+
*
|
|
63
|
+
* - Tracking unique items (e.g., users who have completed an action)
|
|
64
|
+
* - Efficiently testing for membership in a collection
|
|
65
|
+
* - Performing set theory operations (union, intersection, difference)
|
|
66
|
+
* - Eliminating duplicates from a collection
|
|
67
|
+
* - Functional programming patterns where immutability is important
|
|
68
|
+
*
|
|
69
|
+
* ## Performance Characteristics
|
|
70
|
+
*
|
|
71
|
+
* - Lookup: O(1) average - Check if a value exists
|
|
72
|
+
* - Insertion: O(1) average - Add a value (returns new Set)
|
|
73
|
+
* - Removal: O(1) average - Remove a value (returns new Set)
|
|
74
|
+
* - Iteration: O(n) - Iterate over all values
|
|
75
|
+
* - Set operations: O(n) - Union, intersection, difference
|
|
76
|
+
*
|
|
77
|
+
* Note: Because this is an immutable implementation, each modification creates a new Set.
|
|
78
|
+
* If you need to perform many sequential modifications, consider using native Set directly
|
|
79
|
+
* and converting to/from HashSet operations as needed.
|
|
80
|
+
*
|
|
81
|
+
* @example
|
|
82
|
+
* ```typescript
|
|
83
|
+
* import * as HashSet from './HashSet';
|
|
84
|
+
*
|
|
85
|
+
* // Create a Set
|
|
86
|
+
* const tags = HashSet.make('javascript', 'typescript', 'react');
|
|
87
|
+
*
|
|
88
|
+
* // Add an element (immutable - returns new Set)
|
|
89
|
+
* const moreTags = HashSet.add(tags, 'node');
|
|
90
|
+
*
|
|
91
|
+
* // Check membership
|
|
92
|
+
* const hasReact = HashSet.contains(moreTags, 'react'); // true
|
|
93
|
+
*
|
|
94
|
+
* // Set operations
|
|
95
|
+
* const frontendTags = HashSet.make('react', 'vue', 'angular');
|
|
96
|
+
* const common = HashSet.intersection(moreTags, frontendTags); // Set { 'react' }
|
|
97
|
+
*
|
|
98
|
+
* // Get unique values from array
|
|
99
|
+
* const unique = HashSet.fromArray([1, 2, 2, 3, 3, 3]); // Set { 1, 2, 3 }
|
|
100
|
+
* ```
|
|
101
|
+
*
|
|
102
|
+
* @module HashSet
|
|
103
|
+
*/
|
|
104
|
+
/**
|
|
105
|
+
* Creates a Set from multiple values.
|
|
106
|
+
* Duplicate values will be automatically removed.
|
|
107
|
+
*
|
|
108
|
+
* @param values - The values to include in the set
|
|
109
|
+
* @returns A new Set containing all unique values
|
|
110
|
+
*/
|
|
111
|
+
const make = (...values) => new Set(values);
|
|
112
|
+
/**
|
|
113
|
+
* Checks if a value exists in the set.
|
|
114
|
+
*
|
|
115
|
+
* @param set - The set to search
|
|
116
|
+
* @param value - The value to look for
|
|
117
|
+
* @returns true if the value is in the set, false otherwise
|
|
118
|
+
*/
|
|
119
|
+
const contains = (set, value) => set.has(value);
|
|
120
|
+
|
|
121
|
+
// Run a function fn after rate ms. If another invocation occurs
|
|
122
|
+
// during the time it is waiting, ignore it completely.
|
|
123
|
+
const first = (fn, rate) => {
|
|
124
|
+
let timer = null;
|
|
125
|
+
const cancel = () => {
|
|
126
|
+
if (!isNull(timer)) {
|
|
127
|
+
clearTimeout(timer);
|
|
128
|
+
timer = null;
|
|
129
|
+
}
|
|
130
|
+
};
|
|
131
|
+
const throttle = (...args) => {
|
|
132
|
+
if (isNull(timer)) {
|
|
133
|
+
timer = setTimeout(() => {
|
|
134
|
+
timer = null;
|
|
135
|
+
fn.apply(null, args);
|
|
136
|
+
}, rate);
|
|
137
|
+
}
|
|
138
|
+
};
|
|
139
|
+
return {
|
|
140
|
+
cancel,
|
|
141
|
+
throttle
|
|
142
|
+
};
|
|
143
|
+
};
|
|
144
|
+
|
|
145
|
+
const removeZwsp$1 = (s) => s.replace(/\uFEFF/g, '');
|
|
146
|
+
|
|
147
|
+
/* eslint-disable max-len */
|
|
148
|
+
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]`;
|
|
149
|
+
const regExps = {
|
|
150
|
+
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]',
|
|
151
|
+
midnumlet: `[-'\\.\u2018\u2019\u2024\uFE52\uFF07\uFF0E]`,
|
|
152
|
+
midletter: '[:\u00B7\u00B7\u05F4\u2027\uFE13\uFE55\uFF1A]',
|
|
153
|
+
midnum: '[±+*/,;;\u0589\u060C\u060D\u066C\u07F8\u2044\uFE10\uFE14\uFE50\uFE54\uFF0C\uFF1B]',
|
|
154
|
+
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]',
|
|
155
|
+
cr: '\\r',
|
|
156
|
+
lf: '\\n',
|
|
157
|
+
newline: '[\u000B\u000C\u0085\u2028\u2029]',
|
|
158
|
+
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]',
|
|
159
|
+
format: '[\u00AD\u0600-\u0603\u06DD\u070F\u17B4\u17B5\u200E\u200F\u202A-\u202E\u2060-\u2064\u206A-\u206F\uFEFF\uFFF9-\uFFFB]',
|
|
160
|
+
katakana: '[\u3031-\u3035\u309B\u309C\u30A0-\u30FA\u30FC-\u30FF\u31F0-\u31FF\u32D0-\u32FE\u3300-\u3357\uFF66-\uFF9D]',
|
|
161
|
+
extendnumlet: '[=_\u203F\u2040\u2054\uFE33\uFE34\uFE4D-\uFE4F\uFF3F\u2200-\u22FF\u003c\u003e]',
|
|
162
|
+
punctuation: punctuationStr
|
|
163
|
+
};
|
|
164
|
+
/* eslint-enable max-len */
|
|
165
|
+
const characterIndices = {
|
|
166
|
+
ALETTER: 0,
|
|
167
|
+
MIDNUMLET: 1,
|
|
168
|
+
MIDLETTER: 2,
|
|
169
|
+
MIDNUM: 3,
|
|
170
|
+
NUMERIC: 4,
|
|
171
|
+
CR: 5,
|
|
172
|
+
LF: 6,
|
|
173
|
+
NEWLINE: 7,
|
|
174
|
+
EXTEND: 8,
|
|
175
|
+
FORMAT: 9,
|
|
176
|
+
KATAKANA: 10,
|
|
177
|
+
EXTENDNUMLET: 11,
|
|
178
|
+
AT: 12,
|
|
179
|
+
OTHER: 13
|
|
180
|
+
};
|
|
181
|
+
// RegExp objects generated from code point data. Each regex matches a single
|
|
182
|
+
// character against a set of Unicode code points. The index of each item in
|
|
183
|
+
// this array must match its corresponding code point constant value defined
|
|
184
|
+
// above.
|
|
185
|
+
const SETS$1 = [
|
|
186
|
+
new RegExp(regExps.aletter),
|
|
187
|
+
new RegExp(regExps.midnumlet),
|
|
188
|
+
new RegExp(regExps.midletter),
|
|
189
|
+
new RegExp(regExps.midnum),
|
|
190
|
+
new RegExp(regExps.numeric),
|
|
191
|
+
new RegExp(regExps.cr),
|
|
192
|
+
new RegExp(regExps.lf),
|
|
193
|
+
new RegExp(regExps.newline),
|
|
194
|
+
new RegExp(regExps.extend),
|
|
195
|
+
new RegExp(regExps.format),
|
|
196
|
+
new RegExp(regExps.katakana),
|
|
197
|
+
new RegExp(regExps.extendnumlet),
|
|
198
|
+
new RegExp('@')
|
|
199
|
+
];
|
|
200
|
+
const EMPTY_STRING$1 = '';
|
|
201
|
+
const PUNCTUATION$1 = new RegExp('^' + regExps.punctuation + '$');
|
|
202
|
+
const WHITESPACE$1 = /^\s+$/;
|
|
203
|
+
|
|
204
|
+
const SETS = SETS$1;
|
|
205
|
+
const OTHER = characterIndices.OTHER;
|
|
206
|
+
const getType = (char) => {
|
|
207
|
+
let type = OTHER;
|
|
208
|
+
const setsLength = SETS.length;
|
|
209
|
+
for (let j = 0; j < setsLength; ++j) {
|
|
210
|
+
const set = SETS[j];
|
|
211
|
+
if (set && set.test(char)) {
|
|
212
|
+
type = j;
|
|
213
|
+
break;
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
return type;
|
|
217
|
+
};
|
|
218
|
+
const memoize = (func) => {
|
|
219
|
+
const cache = {};
|
|
220
|
+
return (char) => {
|
|
221
|
+
if (cache[char]) {
|
|
222
|
+
return cache[char];
|
|
223
|
+
}
|
|
224
|
+
else {
|
|
225
|
+
const result = func(char);
|
|
226
|
+
cache[char] = result;
|
|
227
|
+
return result;
|
|
228
|
+
}
|
|
229
|
+
};
|
|
230
|
+
};
|
|
231
|
+
const classify = (characters) => {
|
|
232
|
+
const memoized = memoize(getType);
|
|
233
|
+
return map(characters, memoized);
|
|
234
|
+
};
|
|
235
|
+
|
|
236
|
+
const isWordBoundary = (map, index) => {
|
|
237
|
+
const type = map[index];
|
|
238
|
+
const nextType = map[index + 1];
|
|
239
|
+
if (index < 0 || (index > map.length - 1 && index !== 0)) {
|
|
240
|
+
return false;
|
|
241
|
+
}
|
|
242
|
+
// WB5. Don't break between most letters.
|
|
243
|
+
if (type === characterIndices.ALETTER && nextType === characterIndices.ALETTER) {
|
|
244
|
+
return false;
|
|
245
|
+
}
|
|
246
|
+
const nextNextType = map[index + 2];
|
|
247
|
+
// WB6. Don't break letters across certain punctuation.
|
|
248
|
+
if (type === characterIndices.ALETTER &&
|
|
249
|
+
(nextType === characterIndices.MIDLETTER || nextType === characterIndices.MIDNUMLET || nextType === characterIndices.AT) &&
|
|
250
|
+
nextNextType === characterIndices.ALETTER) {
|
|
251
|
+
return false;
|
|
252
|
+
}
|
|
253
|
+
const prevType = map[index - 1];
|
|
254
|
+
// WB7. Don't break letters across certain punctuation.
|
|
255
|
+
if ((type === characterIndices.MIDLETTER || type === characterIndices.MIDNUMLET || nextType === characterIndices.AT) &&
|
|
256
|
+
nextType === characterIndices.ALETTER &&
|
|
257
|
+
prevType === characterIndices.ALETTER) {
|
|
258
|
+
return false;
|
|
259
|
+
}
|
|
260
|
+
// WB8/WB9/WB10. Don't break inside sequences of digits or digits
|
|
261
|
+
// adjacent to letters.
|
|
262
|
+
if ((type === characterIndices.NUMERIC || type === characterIndices.ALETTER) &&
|
|
263
|
+
(nextType === characterIndices.NUMERIC || nextType === characterIndices.ALETTER)) {
|
|
264
|
+
return false;
|
|
265
|
+
}
|
|
266
|
+
// WB11. Don't break inside numeric sequences like "3.2" or
|
|
267
|
+
// "3,456.789".
|
|
268
|
+
if ((type === characterIndices.MIDNUM || type === characterIndices.MIDNUMLET) &&
|
|
269
|
+
nextType === characterIndices.NUMERIC &&
|
|
270
|
+
prevType === characterIndices.NUMERIC) {
|
|
271
|
+
return false;
|
|
272
|
+
}
|
|
273
|
+
// WB12. Don't break inside numeric sequences like "3.2" or
|
|
274
|
+
// "3,456.789".
|
|
275
|
+
if (type === characterIndices.NUMERIC &&
|
|
276
|
+
(nextType === characterIndices.MIDNUM || nextType === characterIndices.MIDNUMLET) &&
|
|
277
|
+
nextNextType === characterIndices.NUMERIC) {
|
|
278
|
+
return false;
|
|
279
|
+
}
|
|
280
|
+
// WB4. Ignore format and extend characters.
|
|
281
|
+
if ((type === characterIndices.EXTEND || type === characterIndices.FORMAT) &&
|
|
282
|
+
(nextType === characterIndices.ALETTER || nextType === characterIndices.NUMERIC || nextType === characterIndices.KATAKANA ||
|
|
283
|
+
nextType === characterIndices.EXTEND || nextType === characterIndices.FORMAT)
|
|
284
|
+
||
|
|
285
|
+
(nextType === characterIndices.EXTEND ||
|
|
286
|
+
// 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
|
|
287
|
+
// our word extraction logic excludes whitespace characters, if a whitespace-overlapping format character that precedes a word boundary is not split on, whichever word
|
|
288
|
+
// it is a part of will not be added to the list of extracted words, causing inaccuracies.
|
|
289
|
+
nextType === characterIndices.FORMAT && (nextNextType === characterIndices.ALETTER || nextNextType === characterIndices.NUMERIC || nextNextType === characterIndices.KATAKANA || nextNextType === characterIndices.EXTEND || nextNextType === characterIndices.FORMAT))
|
|
290
|
+
&& (type === characterIndices.ALETTER || type === characterIndices.NUMERIC || type === characterIndices.KATAKANA || type === characterIndices.EXTEND || type === characterIndices.FORMAT)) {
|
|
291
|
+
return false;
|
|
292
|
+
}
|
|
293
|
+
// WB3. Don't break inside CRLF.
|
|
294
|
+
if (type === characterIndices.CR && nextType === characterIndices.LF) {
|
|
295
|
+
return false;
|
|
296
|
+
}
|
|
297
|
+
// WB3a. Break before newlines (including CR and LF).
|
|
298
|
+
if (type === characterIndices.NEWLINE || type === characterIndices.CR || type === characterIndices.LF) {
|
|
299
|
+
return true;
|
|
300
|
+
}
|
|
301
|
+
// WB3b. Break after newlines (including CR and LF).
|
|
302
|
+
if (nextType === characterIndices.NEWLINE || nextType === characterIndices.CR || nextType === characterIndices.LF) {
|
|
303
|
+
return true;
|
|
304
|
+
}
|
|
305
|
+
// WB13. Don't break between Katakana characters.
|
|
306
|
+
if (type === characterIndices.KATAKANA && nextType === characterIndices.KATAKANA) {
|
|
307
|
+
return false;
|
|
308
|
+
}
|
|
309
|
+
// WB13a. Don't break from extenders.
|
|
310
|
+
if (nextType === characterIndices.EXTENDNUMLET &&
|
|
311
|
+
(type === characterIndices.ALETTER || type === characterIndices.NUMERIC || type === characterIndices.KATAKANA ||
|
|
312
|
+
type === characterIndices.EXTENDNUMLET)) {
|
|
313
|
+
return false;
|
|
314
|
+
}
|
|
315
|
+
// WB13b. Don't break from extenders.
|
|
316
|
+
if (type === characterIndices.EXTENDNUMLET &&
|
|
317
|
+
(nextType === characterIndices.ALETTER || nextType === characterIndices.NUMERIC ||
|
|
318
|
+
nextType === characterIndices.KATAKANA)) {
|
|
319
|
+
return false;
|
|
320
|
+
}
|
|
321
|
+
if (type === characterIndices.AT) {
|
|
322
|
+
return false;
|
|
323
|
+
}
|
|
324
|
+
// Break after any character not covered by the rules above.
|
|
325
|
+
return true;
|
|
326
|
+
};
|
|
327
|
+
|
|
328
|
+
const EMPTY_STRING = EMPTY_STRING$1;
|
|
329
|
+
const WHITESPACE = WHITESPACE$1;
|
|
330
|
+
const PUNCTUATION = PUNCTUATION$1;
|
|
331
|
+
const isProtocol = (str) => str === 'http' || str === 'https';
|
|
332
|
+
const findWordEnd = (characters, startIndex) => {
|
|
333
|
+
let i;
|
|
334
|
+
for (i = startIndex; i < characters.length; i++) {
|
|
335
|
+
if (WHITESPACE.test(characters[i])) {
|
|
336
|
+
break;
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
return i;
|
|
340
|
+
};
|
|
341
|
+
const findUrlEnd = (characters, startIndex) => {
|
|
342
|
+
const endIndex = findWordEnd(characters, startIndex + 1);
|
|
343
|
+
const peakedWord = characters.slice(startIndex + 1, endIndex).join(EMPTY_STRING);
|
|
344
|
+
return peakedWord.substr(0, 3) === '://' ? endIndex : startIndex;
|
|
345
|
+
};
|
|
346
|
+
const findWordsWithIndices = (chars, sChars, characterMap, options) => {
|
|
347
|
+
const words = [];
|
|
348
|
+
const indices = [];
|
|
349
|
+
let word = [];
|
|
350
|
+
const specialCharSet = make(...(options.specialChars ?? []));
|
|
351
|
+
// Loop through each character in the classification map and determine whether
|
|
352
|
+
// it precedes a word boundary, building an array of distinct words as we go.
|
|
353
|
+
for (let i = 0; i < characterMap.length; ++i) {
|
|
354
|
+
// Append this character to the current word.
|
|
355
|
+
word.push(chars[i]);
|
|
356
|
+
// If there's a word boundary between the current character and the next character,
|
|
357
|
+
// append the current word to the words array and start building a new word.
|
|
358
|
+
if (isWordBoundary(characterMap, i)) {
|
|
359
|
+
const ch = sChars[i];
|
|
360
|
+
if (contains(specialCharSet, ch) ||
|
|
361
|
+
(options.includeWhitespace || !WHITESPACE.test(ch)) &&
|
|
362
|
+
(options.includePunctuation || !PUNCTUATION.test(ch))) {
|
|
363
|
+
const startOfWord = i - word.length + 1;
|
|
364
|
+
const endOfWord = i + 1;
|
|
365
|
+
const str = sChars.slice(startOfWord, endOfWord).join(EMPTY_STRING);
|
|
366
|
+
if (isProtocol(str)) {
|
|
367
|
+
const endOfUrl = findUrlEnd(sChars, i);
|
|
368
|
+
const url = chars.slice(endOfWord, endOfUrl);
|
|
369
|
+
Array.prototype.push.apply(word, url);
|
|
370
|
+
i = endOfUrl;
|
|
371
|
+
}
|
|
372
|
+
// If the word is an abbreviation, include the next character if it's a period.
|
|
373
|
+
if (sChars[i + 1] === '.' && /^([a-zA-Z]\.)+$/.test(str + '.')) {
|
|
374
|
+
word.push(chars[i + 1]);
|
|
375
|
+
indices.push({
|
|
376
|
+
start: startOfWord,
|
|
377
|
+
end: endOfWord + 1
|
|
378
|
+
});
|
|
379
|
+
}
|
|
380
|
+
else {
|
|
381
|
+
indices.push({
|
|
382
|
+
start: startOfWord,
|
|
383
|
+
end: endOfWord
|
|
384
|
+
});
|
|
385
|
+
}
|
|
386
|
+
words.push(word);
|
|
387
|
+
}
|
|
388
|
+
word = [];
|
|
389
|
+
}
|
|
390
|
+
}
|
|
391
|
+
return { words, indices };
|
|
392
|
+
};
|
|
393
|
+
const getDefaultOptions = () => ({
|
|
394
|
+
includeWhitespace: false,
|
|
395
|
+
includePunctuation: false
|
|
396
|
+
});
|
|
397
|
+
const overwrittenCharacterMap = (characterMap, extractedChars, specialChars) => {
|
|
398
|
+
const specialCharSet = make(...specialChars);
|
|
399
|
+
return map(characterMap, (v, i) => contains(specialCharSet, extractedChars[i]) ? characterIndices.ALETTER : v);
|
|
400
|
+
};
|
|
401
|
+
const getWordsWithIndices = (chars, extract, options) => {
|
|
402
|
+
options = {
|
|
403
|
+
...getDefaultOptions(),
|
|
404
|
+
...options
|
|
405
|
+
};
|
|
406
|
+
const extractedChars = map(chars, extract);
|
|
407
|
+
const characterMap = classify(extractedChars);
|
|
408
|
+
const specialChars = filter(options.specialChars ?? [], (ch) => ch.length === 1);
|
|
409
|
+
if (specialChars.length > 0) {
|
|
410
|
+
return findWordsWithIndices(chars, extractedChars, overwrittenCharacterMap(characterMap, extractedChars, specialChars), {
|
|
411
|
+
...options,
|
|
412
|
+
specialChars
|
|
413
|
+
});
|
|
414
|
+
}
|
|
415
|
+
else {
|
|
416
|
+
return findWordsWithIndices(chars, extractedChars, characterMap, options);
|
|
417
|
+
}
|
|
418
|
+
};
|
|
419
|
+
const getWords$1 = (chars, extract, options) => getWordsWithIndices(chars, extract, options).words;
|
|
420
|
+
|
|
421
|
+
const getWords = getWords$1;
|
|
422
|
+
|
|
423
|
+
var global$1 = tinymce.util.Tools.resolve('tinymce.dom.TreeWalker');
|
|
424
|
+
|
|
425
|
+
const getText = (node, schema) => {
|
|
426
|
+
const blockElements = schema.getBlockElements();
|
|
427
|
+
const voidElements = schema.getVoidElements();
|
|
428
|
+
const isNewline = (node) => blockElements[node.nodeName] || voidElements[node.nodeName];
|
|
429
|
+
const textBlocks = [];
|
|
430
|
+
let txt = '';
|
|
431
|
+
const treeWalker = new global$1(node, node);
|
|
432
|
+
let tempNode;
|
|
433
|
+
while ((tempNode = treeWalker.next())) {
|
|
434
|
+
if (tempNode.nodeType === 3) {
|
|
435
|
+
txt += removeZwsp$1(tempNode.data);
|
|
436
|
+
}
|
|
437
|
+
else if (isNewline(tempNode) && txt.length) {
|
|
438
|
+
textBlocks.push(txt);
|
|
439
|
+
txt = '';
|
|
440
|
+
}
|
|
441
|
+
}
|
|
442
|
+
if (txt.length) {
|
|
443
|
+
textBlocks.push(txt);
|
|
444
|
+
}
|
|
445
|
+
return textBlocks;
|
|
446
|
+
};
|
|
447
|
+
|
|
448
|
+
const removeZwsp = (text) => text.replace(/\u200B/g, '');
|
|
449
|
+
const strLen = (str) => str.replace(/[\uD800-\uDBFF][\uDC00-\uDFFF]/g, '_').length;
|
|
450
|
+
const countWords = (node, schema) => {
|
|
451
|
+
// TODO - TINY-9708: See if TINY-7484 fix can be replaced by adding \u200B to the "format" character class as per Unicode standard
|
|
452
|
+
// TINY-7484: The grapheme word boundary logic used by Polaris states a ZWSP (\u200B) should be treated as
|
|
453
|
+
// a word boundary, however word counting normally does not consider it as anything so we strip it out.
|
|
454
|
+
const text = removeZwsp(getText(node, schema).join('\n'));
|
|
455
|
+
return getWords(text.split(''), identity).length;
|
|
456
|
+
};
|
|
457
|
+
const countCharacters = (node, schema) => {
|
|
458
|
+
const text = getText(node, schema).join('');
|
|
459
|
+
return strLen(text);
|
|
460
|
+
};
|
|
461
|
+
const countCharactersWithoutSpaces = (node, schema) => {
|
|
462
|
+
const text = getText(node, schema).join('').replace(/\s/g, '');
|
|
463
|
+
return strLen(text);
|
|
464
|
+
};
|
|
465
|
+
|
|
466
|
+
const createBodyCounter = (editor, count) => () => count(editor.getBody(), editor.schema);
|
|
467
|
+
const createSelectionCounter = (editor, count) => () => count(editor.selection.getRng().cloneContents(), editor.schema);
|
|
468
|
+
const createBodyWordCounter = (editor) => createBodyCounter(editor, countWords);
|
|
469
|
+
const get = (editor) => ({
|
|
470
|
+
body: {
|
|
471
|
+
getWordCount: createBodyWordCounter(editor),
|
|
472
|
+
getCharacterCount: createBodyCounter(editor, countCharacters),
|
|
473
|
+
getCharacterCountWithoutSpaces: createBodyCounter(editor, countCharactersWithoutSpaces)
|
|
474
|
+
},
|
|
475
|
+
selection: {
|
|
476
|
+
getWordCount: createSelectionCounter(editor, countWords),
|
|
477
|
+
getCharacterCount: createSelectionCounter(editor, countCharacters),
|
|
478
|
+
getCharacterCountWithoutSpaces: createSelectionCounter(editor, countCharactersWithoutSpaces)
|
|
479
|
+
},
|
|
480
|
+
getCount: createBodyWordCounter(editor)
|
|
481
|
+
});
|
|
482
|
+
|
|
483
|
+
const open = (editor, api) => {
|
|
484
|
+
editor.windowManager.open({
|
|
485
|
+
title: 'Word Count',
|
|
486
|
+
body: {
|
|
487
|
+
type: 'panel',
|
|
488
|
+
items: [
|
|
489
|
+
{
|
|
490
|
+
type: 'table',
|
|
491
|
+
header: ['Count', 'Document', 'Selection'],
|
|
492
|
+
cells: [
|
|
493
|
+
[
|
|
494
|
+
'Words',
|
|
495
|
+
String(api.body.getWordCount()),
|
|
496
|
+
String(api.selection.getWordCount())
|
|
497
|
+
],
|
|
498
|
+
[
|
|
499
|
+
'Characters (no spaces)',
|
|
500
|
+
String(api.body.getCharacterCountWithoutSpaces()),
|
|
501
|
+
String(api.selection.getCharacterCountWithoutSpaces())
|
|
502
|
+
],
|
|
503
|
+
[
|
|
504
|
+
'Characters',
|
|
505
|
+
String(api.body.getCharacterCount()),
|
|
506
|
+
String(api.selection.getCharacterCount())
|
|
507
|
+
]
|
|
508
|
+
]
|
|
509
|
+
}
|
|
510
|
+
]
|
|
511
|
+
},
|
|
512
|
+
buttons: [
|
|
513
|
+
{
|
|
514
|
+
type: 'cancel',
|
|
515
|
+
name: 'close',
|
|
516
|
+
text: 'Close',
|
|
517
|
+
primary: true
|
|
518
|
+
}
|
|
519
|
+
]
|
|
520
|
+
});
|
|
521
|
+
};
|
|
522
|
+
|
|
523
|
+
const register$1 = (editor, api) => {
|
|
524
|
+
editor.addCommand('mceWordCount', () => open(editor, api));
|
|
525
|
+
};
|
|
526
|
+
|
|
527
|
+
var global = tinymce.util.Tools.resolve('tinymce.util.Delay');
|
|
528
|
+
|
|
529
|
+
const fireWordCountUpdate = (editor, api) => {
|
|
530
|
+
editor.dispatch('wordCountUpdate', {
|
|
531
|
+
wordCount: {
|
|
532
|
+
words: api.body.getWordCount(),
|
|
533
|
+
characters: api.body.getCharacterCount(),
|
|
534
|
+
charactersWithoutSpaces: api.body.getCharacterCountWithoutSpaces()
|
|
535
|
+
}
|
|
536
|
+
});
|
|
537
|
+
};
|
|
538
|
+
|
|
539
|
+
const updateCount = (editor, api) => {
|
|
540
|
+
fireWordCountUpdate(editor, api);
|
|
541
|
+
};
|
|
542
|
+
const setup = (editor, api, delay) => {
|
|
543
|
+
const debouncedUpdate = first(() => updateCount(editor, api), delay);
|
|
544
|
+
editor.on('init', () => {
|
|
545
|
+
updateCount(editor, api);
|
|
546
|
+
global.setEditorTimeout(editor, () => {
|
|
547
|
+
editor.on('SetContent BeforeAddUndo Undo Redo ViewUpdate keyup', debouncedUpdate.throttle);
|
|
548
|
+
}, 0);
|
|
549
|
+
editor.on('remove', debouncedUpdate.cancel);
|
|
550
|
+
});
|
|
551
|
+
};
|
|
552
|
+
|
|
553
|
+
const register = (editor) => {
|
|
554
|
+
const onAction = () => editor.execCommand('mceWordCount');
|
|
555
|
+
editor.ui.registry.addButton('wordcount', {
|
|
556
|
+
tooltip: 'Word count',
|
|
557
|
+
icon: 'character-count',
|
|
558
|
+
onAction,
|
|
559
|
+
context: 'any'
|
|
560
|
+
});
|
|
561
|
+
editor.ui.registry.addMenuItem('wordcount', {
|
|
562
|
+
text: 'Word count',
|
|
563
|
+
icon: 'character-count',
|
|
564
|
+
onAction,
|
|
565
|
+
context: 'any'
|
|
566
|
+
});
|
|
567
|
+
};
|
|
568
|
+
|
|
569
|
+
var Plugin = (delay = 300) => {
|
|
570
|
+
global$2.add('wordcount', (editor) => {
|
|
571
|
+
const api = get(editor);
|
|
572
|
+
register$1(editor, api);
|
|
573
|
+
register(editor);
|
|
574
|
+
setup(editor, api, delay);
|
|
575
|
+
return api;
|
|
576
|
+
});
|
|
577
|
+
};
|
|
578
|
+
|
|
579
|
+
Plugin();
|
|
580
|
+
/** *****
|
|
581
|
+
* DO NOT EXPORT ANYTHING
|
|
582
|
+
*
|
|
583
|
+
* IF YOU DO ROLLUP WILL LEAVE A GLOBAL ON THE PAGE
|
|
584
|
+
*******/
|
|
585
|
+
|
|
586
|
+
})();
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
!function(){"use strict";var t=tinymce.util.Tools.resolve("tinymce.PluginManager");const e=t=>null===t;const n=t=>t,o=(t,e)=>{const n=t.length,o=new Array(n);for(let r=0;r<n;r++){const n=t[r];o[r]=e(n,r)}return o},r=(...t)=>new Set(t),c=(t,e)=>t.has(e),s=t=>t.replace(/\uFEFF/g,""),u="[-'\\.\u2018\u2019\u2024\ufe52\uff07\uff0e]",a="[:\xb7\xb7\u05f4\u2027\ufe13\ufe55\uff1a]",l="[\xb1+*/,;;\u0589\u060c\u060d\u066c\u07f8\u2044\ufe10\ufe14\ufe50\ufe54\uff0c\uff1b]",i="[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]",g="\\r",d="\\n",p="[\v\f\x85\u2028\u2029]",h="[\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]",C="[\xad\u0600-\u0603\u06dd\u070f\u17b4\u17b5\u200e\u200f\u202a-\u202e\u2060-\u2064\u206a-\u206f\ufeff\ufff9-\ufffb]",y="[\u3031-\u3035\u309b\u309c\u30a0-\u30fa\u30fc-\u30ff\u31f0-\u31ff\u32d0-\u32fe\u3300-\u3357\uff66-\uff9d]",m="[=_\u203f\u2040\u2054\ufe33\ufe34\ufe4d-\ufe4f\uff3f\u2200-\u22ff<>]",w="[~\u2116|!-*+-\\/:;?@\\[-`{}\xa1\xab\xb7\xbb\xbf;\xb7\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]",f=10,x=[new RegExp("[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]"),new RegExp(u),new RegExp(a),new RegExp(l),new RegExp(i),new RegExp(g),new RegExp(d),new RegExp(p),new RegExp(h),new RegExp(C),new RegExp(y),new RegExp(m),new RegExp("@")],W=new RegExp("^"+w+"$"),E=x,R=t=>{let e=13;const n=E.length;for(let o=0;o<n;++o){const n=E[o];if(n&&n.test(t)){e=o;break}}return e},S=(t,e)=>{const n=t[e],o=t[e+1];if(e<0||e>t.length-1&&0!==e)return!1;if(0===n&&0===o)return!1;const r=t[e+2];if(0===n&&(2===o||1===o||12===o)&&0===r)return!1;const c=t[e-1];return(2!==n&&1!==n&&12!==o||0!==o||0!==c)&&(4!==n&&0!==n||4!==o&&0!==o)&&(3!==n&&1!==n||4!==o||4!==c)&&(4!==n||3!==o&&1!==o||4!==r)&&(8!==n&&9!==n||0!==o&&4!==o&&o!==f&&8!==o&&9!==o)&&(8!==o&&(9!==o||0!==r&&4!==r&&r!==f&&8!==r&&9!==r)||0!==n&&4!==n&&n!==f&&8!==n&&9!==n)&&(5!==n||6!==o)&&(7===n||5===n||6===n||7===o||5===o||6===o||(n!==f||o!==f)&&(11!==o||0!==n&&4!==n&&n!==f&&11!==n)&&(11!==n||0!==o&&4!==o&&o!==f)&&12!==n)},b=/^\s+$/,v=W,F=t=>"http"===t||"https"===t,T=(t,e)=>{const n=((t,e)=>{let n;for(n=e;n<t.length&&!b.test(t[n]);n++);return n})(t,e+1);return"://"===t.slice(e+1,n).join("").substr(0,3)?n:e},A=(t,e,n,o)=>{const s=[],u=[];let a=[];const l=r(...o.specialChars??[]);for(let r=0;r<n.length;++r)if(a.push(t[r]),S(n,r)){const n=e[r];if(c(l,n)||(o.includeWhitespace||!b.test(n))&&(o.includePunctuation||!v.test(n))){const n=r-a.length+1,o=r+1,c=e.slice(n,o).join("");if(F(c)){const n=T(e,r),c=t.slice(o,n);Array.prototype.push.apply(a,c),r=n}"."===e[r+1]&&/^([a-zA-Z]\.)+$/.test(c+".")?(a.push(t[r+1]),u.push({start:n,end:o+1})):u.push({start:n,end:o}),s.push(a)}a=[]}return{words:s,indices:u}},B=(t,e,n)=>((t,e,n)=>{n={includeWhitespace:!1,includePunctuation:!1,...n};const s=o(t,e),u=(t=>{const e=(t=>{const e={};return n=>{if(e[n])return e[n];{const o=t(n);return e[n]=o,o}}})(R);return o(t,e)})(s),a=((t,e)=>{const n=[];for(let o=0,r=t.length;o<r;o++){const r=t[o];e(r)&&n.push(r)}return n})(n.specialChars??[],t=>1===t.length);return a.length>0?A(t,s,((t,e,n)=>{const s=r(...n);return o(t,(t,n)=>c(s,e[n])?0:t)})(u,s,a),{...n,specialChars:a}):A(t,s,u,n)})(t,e,n).words;var D=tinymce.util.Tools.resolve("tinymce.dom.TreeWalker");const j=(t,e)=>{const n=e.getBlockElements(),o=e.getVoidElements(),r=t=>n[t.nodeName]||o[t.nodeName],c=[];let u="";const a=new D(t,t);let l;for(;l=a.next();)3===l.nodeType?u+=s(l.data):r(l)&&u.length&&(c.push(u),u="");return u.length&&c.push(u),c},k=t=>t.replace(/[\uD800-\uDBFF][\uDC00-\uDFFF]/g,"_").length,U=(t,e)=>{const o=(t=>t.replace(/\u200B/g,""))(j(t,e).join("\n"));return B(o.split(""),n).length},M=(t,e)=>{const n=j(t,e).join("");return k(n)},P=(t,e)=>{const n=j(t,e).join("").replace(/\s/g,"");return k(n)},$=(t,e)=>()=>e(t.getBody(),t.schema),z=(t,e)=>()=>e(t.selection.getRng().cloneContents(),t.schema),N=t=>$(t,U);var V=tinymce.util.Tools.resolve("tinymce.util.Delay");const Z=(t,e)=>{((t,e)=>{t.dispatch("wordCountUpdate",{wordCount:{words:e.body.getWordCount(),characters:e.body.getCharacterCount(),charactersWithoutSpaces:e.body.getCharacterCountWithoutSpaces()}})})(t,e)},_=(t,n,o)=>{const r=((t,n)=>{let o=null;return{cancel:()=>{e(o)||(clearTimeout(o),o=null)},throttle:(...r)=>{e(o)&&(o=setTimeout(()=>{o=null,t.apply(null,r)},n))}}})(()=>Z(t,n),o);t.on("init",()=>{Z(t,n),V.setEditorTimeout(t,()=>{t.on("SetContent BeforeAddUndo Undo Redo ViewUpdate keyup",r.throttle)},0),t.on("remove",r.cancel)})};((e=300)=>{t.add("wordcount",t=>{const n=(t=>({body:{getWordCount:N(t),getCharacterCount:$(t,M),getCharacterCountWithoutSpaces:$(t,P)},selection:{getWordCount:z(t,U),getCharacterCount:z(t,M),getCharacterCountWithoutSpaces:z(t,P)},getCount:N(t)}))(t);return((t,e)=>{t.addCommand("mceWordCount",()=>((t,e)=>{t.windowManager.open({title:"Word Count",body:{type:"panel",items:[{type:"table",header:["Count","Document","Selection"],cells:[["Words",String(e.body.getWordCount()),String(e.selection.getWordCount())],["Characters (no spaces)",String(e.body.getCharacterCountWithoutSpaces()),String(e.selection.getCharacterCountWithoutSpaces())],["Characters",String(e.body.getCharacterCount()),String(e.selection.getCharacterCount())]]}]},buttons:[{type:"cancel",name:"close",text:"Close",primary:!0}]})})(t,e))})(t,n),(t=>{const e=()=>t.execCommand("mceWordCount");t.ui.registry.addButton("wordcount",{tooltip:"Word count",icon:"character-count",onAction:e,context:"any"}),t.ui.registry.addMenuItem("wordcount",{text:"Word count",icon:"character-count",onAction:e,context:"any"})})(t),_(t,n,e),n})})()}();
|