[ Index ] |
PHP Cross Reference of Joomla 4.2.2 documentation |
[Summary view] [Print] [Text view]
1 /** 2 * Copyright (c) Tiny Technologies, Inc. All rights reserved. 3 * Licensed under the LGPL or a commercial license. 4 * For LGPL see License.txt in the project root for license information. 5 * For commercial licenses see https://www.tiny.cloud/ 6 * 7 * Version: 5.10.5 (2022-05-25) 8 */ 9 (function () { 10 'use strict'; 11 12 var global$2 = tinymce.util.Tools.resolve('tinymce.PluginManager'); 13 14 var identity = function (x) { 15 return x; 16 }; 17 18 var __assign = function () { 19 __assign = Object.assign || function __assign(t) { 20 for (var s, i = 1, n = arguments.length; i < n; i++) { 21 s = arguments[i]; 22 for (var p in s) 23 if (Object.prototype.hasOwnProperty.call(s, p)) 24 t[p] = s[p]; 25 } 26 return t; 27 }; 28 return __assign.apply(this, arguments); 29 }; 30 31 var zeroWidth = '\uFEFF'; 32 var removeZwsp$1 = function (s) { 33 return s.replace(/\uFEFF/g, ''); 34 }; 35 36 var map = function (xs, f) { 37 var len = xs.length; 38 var r = new Array(len); 39 for (var i = 0; i < len; i++) { 40 var x = xs[i]; 41 r[i] = f(x, i); 42 } 43 return r; 44 }; 45 46 var punctuationStr = '[!-#%-*,-\\/:;?@\\[-\\]_{}\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]'; 47 var regExps = { 48 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]', 49 midnumlet: '[-\'\\.\u2018\u2019\u2024\uFE52\uFF07\uFF0E]', 50 midletter: '[:\xB7\xB7\u05F4\u2027\uFE13\uFE55\uFF1A]', 51 midnum: '[\xB1+*/,;;\u0589\u060C\u060D\u066C\u07F8\u2044\uFE10\uFE14\uFE50\uFE54\uFF0C\uFF1B]', 52 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]', 53 cr: '\\r', 54 lf: '\\n', 55 newline: '[\x0B\f\x85\u2028\u2029]', 56 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]', 57 format: '[\xAD\u0600-\u0603\u06DD\u070F\u17b4\u17b5\u200E\u200F\u202A-\u202E\u2060-\u2064\u206A-\u206F\uFEFF\uFFF9-\uFFFB]', 58 katakana: '[\u3031-\u3035\u309B\u309C\u30A0-\u30fa\u30fc-\u30ff\u31f0-\u31ff\u32D0-\u32FE\u3300-\u3357\uff66-\uff9d]', 59 extendnumlet: '[=_\u203f\u2040\u2054\ufe33\ufe34\ufe4d-\ufe4f\uff3f\u2200-\u22FF<>]', 60 punctuation: punctuationStr 61 }; 62 var characterIndices = { 63 ALETTER: 0, 64 MIDNUMLET: 1, 65 MIDLETTER: 2, 66 MIDNUM: 3, 67 NUMERIC: 4, 68 CR: 5, 69 LF: 6, 70 NEWLINE: 7, 71 EXTEND: 8, 72 FORMAT: 9, 73 KATAKANA: 10, 74 EXTENDNUMLET: 11, 75 AT: 12, 76 OTHER: 13 77 }; 78 var SETS$1 = [ 79 new RegExp(regExps.aletter), 80 new RegExp(regExps.midnumlet), 81 new RegExp(regExps.midletter), 82 new RegExp(regExps.midnum), 83 new RegExp(regExps.numeric), 84 new RegExp(regExps.cr), 85 new RegExp(regExps.lf), 86 new RegExp(regExps.newline), 87 new RegExp(regExps.extend), 88 new RegExp(regExps.format), 89 new RegExp(regExps.katakana), 90 new RegExp(regExps.extendnumlet), 91 new RegExp('@') 92 ]; 93 var EMPTY_STRING$1 = ''; 94 var PUNCTUATION$1 = new RegExp('^' + regExps.punctuation + '$'); 95 var WHITESPACE$1 = /^\s+$/; 96 97 var SETS = SETS$1; 98 var OTHER = characterIndices.OTHER; 99 var getType = function (char) { 100 var type = OTHER; 101 var setsLength = SETS.length; 102 for (var j = 0; j < setsLength; ++j) { 103 var set = SETS[j]; 104 if (set && set.test(char)) { 105 type = j; 106 break; 107 } 108 } 109 return type; 110 }; 111 var memoize = function (func) { 112 var cache = {}; 113 return function (char) { 114 if (cache[char]) { 115 return cache[char]; 116 } else { 117 var result = func(char); 118 cache[char] = result; 119 return result; 120 } 121 }; 122 }; 123 var classify = function (characters) { 124 var memoized = memoize(getType); 125 return map(characters, memoized); 126 }; 127 128 var isWordBoundary = function (map, index) { 129 var type = map[index]; 130 var nextType = map[index + 1]; 131 if (index < 0 || index > map.length - 1 && index !== 0) { 132 return false; 133 } 134 if (type === characterIndices.ALETTER && nextType === characterIndices.ALETTER) { 135 return false; 136 } 137 var nextNextType = map[index + 2]; 138 if (type === characterIndices.ALETTER && (nextType === characterIndices.MIDLETTER || nextType === characterIndices.MIDNUMLET || nextType === characterIndices.AT) && nextNextType === characterIndices.ALETTER) { 139 return false; 140 } 141 var prevType = map[index - 1]; 142 if ((type === characterIndices.MIDLETTER || type === characterIndices.MIDNUMLET || nextType === characterIndices.AT) && nextType === characterIndices.ALETTER && prevType === characterIndices.ALETTER) { 143 return false; 144 } 145 if ((type === characterIndices.NUMERIC || type === characterIndices.ALETTER) && (nextType === characterIndices.NUMERIC || nextType === characterIndices.ALETTER)) { 146 return false; 147 } 148 if ((type === characterIndices.MIDNUM || type === characterIndices.MIDNUMLET) && nextType === characterIndices.NUMERIC && prevType === characterIndices.NUMERIC) { 149 return false; 150 } 151 if (type === characterIndices.NUMERIC && (nextType === characterIndices.MIDNUM || nextType === characterIndices.MIDNUMLET) && nextNextType === characterIndices.NUMERIC) { 152 return false; 153 } 154 if (type === characterIndices.EXTEND || type === characterIndices.FORMAT || prevType === characterIndices.EXTEND || prevType === characterIndices.FORMAT || nextType === characterIndices.EXTEND || nextType === characterIndices.FORMAT) { 155 return false; 156 } 157 if (type === characterIndices.CR && nextType === characterIndices.LF) { 158 return false; 159 } 160 if (type === characterIndices.NEWLINE || type === characterIndices.CR || type === characterIndices.LF) { 161 return true; 162 } 163 if (nextType === characterIndices.NEWLINE || nextType === characterIndices.CR || nextType === characterIndices.LF) { 164 return true; 165 } 166 if (type === characterIndices.KATAKANA && nextType === characterIndices.KATAKANA) { 167 return false; 168 } 169 if (nextType === characterIndices.EXTENDNUMLET && (type === characterIndices.ALETTER || type === characterIndices.NUMERIC || type === characterIndices.KATAKANA || type === characterIndices.EXTENDNUMLET)) { 170 return false; 171 } 172 if (type === characterIndices.EXTENDNUMLET && (nextType === characterIndices.ALETTER || nextType === characterIndices.NUMERIC || nextType === characterIndices.KATAKANA)) { 173 return false; 174 } 175 if (type === characterIndices.AT) { 176 return false; 177 } 178 return true; 179 }; 180 181 var EMPTY_STRING = EMPTY_STRING$1; 182 var WHITESPACE = WHITESPACE$1; 183 var PUNCTUATION = PUNCTUATION$1; 184 var isProtocol = function (str) { 185 return str === 'http' || str === 'https'; 186 }; 187 var findWordEnd = function (characters, startIndex) { 188 var i; 189 for (i = startIndex; i < characters.length; i++) { 190 if (WHITESPACE.test(characters[i])) { 191 break; 192 } 193 } 194 return i; 195 }; 196 var findUrlEnd = function (characters, startIndex) { 197 var endIndex = findWordEnd(characters, startIndex + 1); 198 var peakedWord = characters.slice(startIndex + 1, endIndex).join(EMPTY_STRING); 199 return peakedWord.substr(0, 3) === '://' ? endIndex : startIndex; 200 }; 201 var findWords = function (chars, sChars, characterMap, options) { 202 var words = []; 203 var word = []; 204 for (var i = 0; i < characterMap.length; ++i) { 205 word.push(chars[i]); 206 if (isWordBoundary(characterMap, i)) { 207 var ch = sChars[i]; 208 if ((options.includeWhitespace || !WHITESPACE.test(ch)) && (options.includePunctuation || !PUNCTUATION.test(ch))) { 209 var startOfWord = i - word.length + 1; 210 var endOfWord = i + 1; 211 var str = sChars.slice(startOfWord, endOfWord).join(EMPTY_STRING); 212 if (isProtocol(str)) { 213 var endOfUrl = findUrlEnd(sChars, i); 214 var url = chars.slice(endOfWord, endOfUrl); 215 Array.prototype.push.apply(word, url); 216 i = endOfUrl; 217 } 218 words.push(word); 219 } 220 word = []; 221 } 222 } 223 return words; 224 }; 225 var getDefaultOptions = function () { 226 return { 227 includeWhitespace: false, 228 includePunctuation: false 229 }; 230 }; 231 var getWords$1 = function (chars, extract, options) { 232 options = __assign(__assign({}, getDefaultOptions()), options); 233 var filteredChars = []; 234 var extractedChars = []; 235 for (var i = 0; i < chars.length; i++) { 236 var ch = extract(chars[i]); 237 if (ch !== zeroWidth) { 238 filteredChars.push(chars[i]); 239 extractedChars.push(ch); 240 } 241 } 242 var characterMap = classify(extractedChars); 243 return findWords(filteredChars, extractedChars, characterMap, options); 244 }; 245 246 var getWords = getWords$1; 247 248 var global$1 = tinymce.util.Tools.resolve('tinymce.dom.TreeWalker'); 249 250 var getText = function (node, schema) { 251 var blockElements = schema.getBlockElements(); 252 var shortEndedElements = schema.getShortEndedElements(); 253 var isNewline = function (node) { 254 return blockElements[node.nodeName] || shortEndedElements[node.nodeName]; 255 }; 256 var textBlocks = []; 257 var txt = ''; 258 var treeWalker = new global$1(node, node); 259 while (node = treeWalker.next()) { 260 if (node.nodeType === 3) { 261 txt += removeZwsp$1(node.data); 262 } else if (isNewline(node) && txt.length) { 263 textBlocks.push(txt); 264 txt = ''; 265 } 266 } 267 if (txt.length) { 268 textBlocks.push(txt); 269 } 270 return textBlocks; 271 }; 272 273 var removeZwsp = function (text) { 274 return text.replace(/\u200B/g, ''); 275 }; 276 var strLen = function (str) { 277 return str.replace(/[\uD800-\uDBFF][\uDC00-\uDFFF]/g, '_').length; 278 }; 279 var countWords = function (node, schema) { 280 var text = removeZwsp(getText(node, schema).join('\n')); 281 return getWords(text.split(''), identity).length; 282 }; 283 var countCharacters = function (node, schema) { 284 var text = getText(node, schema).join(''); 285 return strLen(text); 286 }; 287 var countCharactersWithoutSpaces = function (node, schema) { 288 var text = getText(node, schema).join('').replace(/\s/g, ''); 289 return strLen(text); 290 }; 291 292 var createBodyCounter = function (editor, count) { 293 return function () { 294 return count(editor.getBody(), editor.schema); 295 }; 296 }; 297 var createSelectionCounter = function (editor, count) { 298 return function () { 299 return count(editor.selection.getRng().cloneContents(), editor.schema); 300 }; 301 }; 302 var createBodyWordCounter = function (editor) { 303 return createBodyCounter(editor, countWords); 304 }; 305 var get = function (editor) { 306 return { 307 body: { 308 getWordCount: createBodyWordCounter(editor), 309 getCharacterCount: createBodyCounter(editor, countCharacters), 310 getCharacterCountWithoutSpaces: createBodyCounter(editor, countCharactersWithoutSpaces) 311 }, 312 selection: { 313 getWordCount: createSelectionCounter(editor, countWords), 314 getCharacterCount: createSelectionCounter(editor, countCharacters), 315 getCharacterCountWithoutSpaces: createSelectionCounter(editor, countCharactersWithoutSpaces) 316 }, 317 getCount: createBodyWordCounter(editor) 318 }; 319 }; 320 321 var open = function (editor, api) { 322 editor.windowManager.open({ 323 title: 'Word Count', 324 body: { 325 type: 'panel', 326 items: [{ 327 type: 'table', 328 header: [ 329 'Count', 330 'Document', 331 'Selection' 332 ], 333 cells: [ 334 [ 335 'Words', 336 String(api.body.getWordCount()), 337 String(api.selection.getWordCount()) 338 ], 339 [ 340 'Characters (no spaces)', 341 String(api.body.getCharacterCountWithoutSpaces()), 342 String(api.selection.getCharacterCountWithoutSpaces()) 343 ], 344 [ 345 'Characters', 346 String(api.body.getCharacterCount()), 347 String(api.selection.getCharacterCount()) 348 ] 349 ] 350 }] 351 }, 352 buttons: [{ 353 type: 'cancel', 354 name: 'close', 355 text: 'Close', 356 primary: true 357 }] 358 }); 359 }; 360 361 var register$1 = function (editor, api) { 362 editor.addCommand('mceWordCount', function () { 363 return open(editor, api); 364 }); 365 }; 366 367 var global = tinymce.util.Tools.resolve('tinymce.util.Delay'); 368 369 var fireWordCountUpdate = function (editor, api) { 370 editor.fire('wordCountUpdate', { 371 wordCount: { 372 words: api.body.getWordCount(), 373 characters: api.body.getCharacterCount(), 374 charactersWithoutSpaces: api.body.getCharacterCountWithoutSpaces() 375 } 376 }); 377 }; 378 379 var updateCount = function (editor, api) { 380 fireWordCountUpdate(editor, api); 381 }; 382 var setup = function (editor, api, delay) { 383 var debouncedUpdate = global.debounce(function () { 384 return updateCount(editor, api); 385 }, delay); 386 editor.on('init', function () { 387 updateCount(editor, api); 388 global.setEditorTimeout(editor, function () { 389 editor.on('SetContent BeforeAddUndo Undo Redo ViewUpdate keyup', debouncedUpdate); 390 }, 0); 391 }); 392 }; 393 394 var register = function (editor) { 395 var onAction = function () { 396 return editor.execCommand('mceWordCount'); 397 }; 398 editor.ui.registry.addButton('wordcount', { 399 tooltip: 'Word count', 400 icon: 'character-count', 401 onAction: onAction 402 }); 403 editor.ui.registry.addMenuItem('wordcount', { 404 text: 'Word count', 405 icon: 'character-count', 406 onAction: onAction 407 }); 408 }; 409 410 function Plugin (delay) { 411 if (delay === void 0) { 412 delay = 300; 413 } 414 global$2.add('wordcount', function (editor) { 415 var api = get(editor); 416 register$1(editor, api); 417 register(editor); 418 setup(editor, api, delay); 419 return api; 420 }); 421 } 422 423 Plugin(); 424 425 }());
title
Description
Body
title
Description
Body
title
Description
Body
title
Body
Generated: Wed Sep 7 05:41:13 2022 | Chilli.vc Blog - For Webmaster,Blog-Writer,System Admin and Domainer |