Diff: STRATO-apps/wordpress_03/app/wp-content/plugins/fluent-smtp/includes/Support/Str.php

Keine Baseline-Datei – Diff nur gegen leer.
Zur Liste
1 -
1 + <?php
2 +
3 + namespace FluentMail\Includes\Support;
4 +
5 + use FluentMail\Includes\Support\MacroableTrait;
6 +
7 + class Str {
8 +
9 + use MacroableTrait;
10 +
11 + /**
12 + * The cache of snake-cased words.
13 + *
14 + * @var array
15 + */
16 + protected static $snakeCache = [];
17 +
18 + /**
19 + * The cache of camel-cased words.
20 + *
21 + * @var array
22 + */
23 + protected static $camelCache = [];
24 +
25 + /**
26 + * The cache of studly-cased words.
27 + *
28 + * @var array
29 + */
30 + protected static $studlyCache = [];
31 +
32 + /**
33 + * Transliterate a UTF-8 value to ASCII.
34 + *
35 + * @param string $value
36 + * @return string
37 + */
38 + public static function ascii($value)
39 + {
40 + foreach (static::charsArray() as $key => $val) {
41 + $value = str_replace($val, $key, $value);
42 + }
43 +
44 + return preg_replace('/[^\x20-\x7E]/u', '', $value);
45 + }
46 +
47 + /**
48 + * Convert a value to camel case.
49 + *
50 + * @param string $value
51 + * @return string
52 + */
53 + public static function camel($value)
54 + {
55 + if (isset(static::$camelCache[$value])) {
56 + return static::$camelCache[$value];
57 + }
58 +
59 + return static::$camelCache[$value] = lcfirst(static::studly($value));
60 + }
61 +
62 + /**
63 + * Determine if a given string contains a given substring.
64 + *
65 + * @param string $haystack
66 + * @param string|array $needles
67 + * @return bool
68 + */
69 + public static function contains($haystack, $needles)
70 + {
71 + foreach ((array) $needles as $needle) {
72 + if ($needle != '' && mb_strpos($haystack, $needle) !== false) {
73 + return true;
74 + }
75 + }
76 +
77 + return false;
78 + }
79 +
80 + /**
81 + * Determine if a given string ends with a given substring.
82 + *
83 + * @param string $haystack
84 + * @param string|array $needles
85 + * @return bool
86 + */
87 + public static function endsWith($haystack, $needles)
88 + {
89 + foreach ((array) $needles as $needle) {
90 + if (substr($haystack, -strlen($needle)) === (string) $needle) {
91 + return true;
92 + }
93 + }
94 +
95 + return false;
96 + }
97 +
98 + /**
99 + * Cap a string with a single instance of a given value.
100 + *
101 + * @param string $value
102 + * @param string $cap
103 + * @return string
104 + */
105 + public static function finish($value, $cap)
106 + {
107 + $quoted = preg_quote($cap, '/');
108 +
109 + return preg_replace('/(?:'.$quoted.')+$/u', '', $value).$cap;
110 + }
111 +
112 + /**
113 + * Determine if a given string matches a given pattern.
114 + *
115 + * @param string $pattern
116 + * @param string $value
117 + * @return bool
118 + */
119 + public static function is($pattern, $value)
120 + {
121 + if ($pattern == $value) {
122 + return true;
123 + }
124 +
125 + $pattern = preg_quote($pattern, '#');
126 +
127 + // Asterisks are translated into zero-or-more regular expression wildcards
128 + // to make it convenient to check if the strings starts with the given
129 + // pattern such as "library/*", making any string check convenient.
130 + $pattern = str_replace('\*', '.*', $pattern);
131 +
132 + return (bool) preg_match('#^'.$pattern.'\z#u', $value);
133 + }
134 +
135 + /**
136 + * Return the length of the given string.
137 + *
138 + * @param string $value
139 + * @return int
140 + */
141 + public static function length($value)
142 + {
143 + return mb_strlen($value);
144 + }
145 +
146 + /**
147 + * Limit the number of characters in a string.
148 + *
149 + * @param string $value
150 + * @param int $limit
151 + * @param string $end
152 + * @return string
153 + */
154 + public static function limit($value, $limit = 100, $end = '...')
155 + {
156 + if (mb_strwidth($value, 'UTF-8') <= $limit) {
157 + return $value;
158 + }
159 +
160 + return rtrim(mb_strimwidth($value, 0, $limit, '', 'UTF-8')).$end;
161 + }
162 +
163 + /**
164 + * Convert the given string to lower-case.
165 + *
166 + * @param string $value
167 + * @return string
168 + */
169 + public static function lower($value)
170 + {
171 + return mb_strtolower($value, 'UTF-8');
172 + }
173 +
174 + /**
175 + * Limit the number of words in a string.
176 + *
177 + * @param string $value
178 + * @param int $words
179 + * @param string $end
180 + * @return string
181 + */
182 + public static function words($value, $words = 100, $end = '...')
183 + {
184 + preg_match('/^\s*+(?:\S++\s*+){1,'.$words.'}/u', $value, $matches);
185 +
186 + if (! isset($matches[0]) || static::length($value) === static::length($matches[0])) {
187 + return $value;
188 + }
189 +
190 + return rtrim($matches[0]).$end;
191 + }
192 +
193 + /**
194 + * Parse a Class@method style callback into class and method.
195 + *
196 + * @param string $callback
197 + * @param string $default
198 + * @return array
199 + */
200 + public static function parseCallback($callback, $default)
201 + {
202 + return static::contains($callback, '@') ? explode('@', $callback, 2) : [$callback, $default];
203 + }
204 +
205 + /**
206 + * Get the plural form of an English word.
207 + *
208 + * @param string $value
209 + * @param int $count
210 + * @return string
211 + */
212 + public static function plural($value, $count = 2)
213 + {
214 + return Pluralizer::plural($value, $count);
215 + }
216 +
217 + /**
218 + * Generate a more truly "random" alpha-numeric string.
219 + *
220 + * @param int $length
221 + * @return string
222 + */
223 + public static function random($length = 16)
224 + {
225 + $string = '';
226 +
227 + while (($len = strlen($string)) < $length) {
228 + $size = $length - $len;
229 +
230 + $bytes = random_bytes($size);
231 +
232 + $string .= substr(str_replace(['/', '+', '='], '', base64_encode($bytes)), 0, $size);
233 + }
234 +
235 + return $string;
236 + }
237 +
238 + /**
239 + * Generate a "random" alpha-numeric string.
240 + *
241 + * Should not be considered sufficient for cryptography, etc.
242 + *
243 + * @deprecated since version 5.3. Use the "random" method directly.
244 + *
245 + * @param int $length
246 + * @return string
247 + */
248 + public static function quickRandom($length = 16)
249 + {
250 + if (PHP_MAJOR_VERSION > 5) {
251 + return static::random($length);
252 + }
253 +
254 + $pool = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
255 +
256 + return substr(str_shuffle(str_repeat($pool, $length)), 0, $length);
257 + }
258 +
259 + /**
260 + * Replace a given value in the string sequentially with an array.
261 + *
262 + * @param string $search
263 + * @param array $replace
264 + * @param string $subject
265 + * @return string
266 + */
267 + public static function replaceArray($search, array $replace, $subject)
268 + {
269 + foreach ($replace as $value) {
270 + $subject = static::replaceFirst($search, $value, $subject);
271 + }
272 +
273 + return $subject;
274 + }
275 +
276 + /**
277 + * Replace the first occurrence of a given value in the string.
278 + *
279 + * @param string $search
280 + * @param string $replace
281 + * @param string $subject
282 + * @return string
283 + */
284 + public static function replaceFirst($search, $replace, $subject)
285 + {
286 + $position = strpos($subject, $search);
287 +
288 + if ($position !== false) {
289 + return substr_replace($subject, $replace, $position, strlen($search));
290 + }
291 +
292 + return $subject;
293 + }
294 +
295 + /**
296 + * Replace the last occurrence of a given value in the string.
297 + *
298 + * @param string $search
299 + * @param string $replace
300 + * @param string $subject
301 + * @return string
302 + */
303 + public static function replaceLast($search, $replace, $subject)
304 + {
305 + $position = strrpos($subject, $search);
306 +
307 + if ($position !== false) {
308 + return substr_replace($subject, $replace, $position, strlen($search));
309 + }
310 +
311 + return $subject;
312 + }
313 +
314 + /**
315 + * Convert the given string to upper-case.
316 + *
317 + * @param string $value
318 + * @return string
319 + */
320 + public static function upper($value)
321 + {
322 + return mb_strtoupper($value, 'UTF-8');
323 + }
324 +
325 + /**
326 + * Convert the given string to title case.
327 + *
328 + * @param string $value
329 + * @return string
330 + */
331 + public static function title($value)
332 + {
333 + return mb_convert_case($value, MB_CASE_TITLE, 'UTF-8');
334 + }
335 +
336 + /**
337 + * Get the singular form of an English word.
338 + *
339 + * @param string $value
340 + * @return string
341 + */
342 + public static function singular($value)
343 + {
344 + return Pluralizer::singular($value);
345 + }
346 +
347 + /**
348 + * Generate a URL friendly "slug" from a given string.
349 + *
350 + * @param string $title
351 + * @param string $separator
352 + * @return string
353 + */
354 + public static function slug($title, $separator = '-')
355 + {
356 + $title = static::ascii($title);
357 +
358 + // Convert all dashes/underscores into separator
359 + $flip = $separator == '-' ? '_' : '-';
360 +
361 + $title = preg_replace('!['.preg_quote($flip).']+!u', $separator, $title);
362 +
363 + // Remove all characters that are not the separator, letters, numbers, or whitespace.
364 + $title = preg_replace('![^'.preg_quote($separator).'\pL\pN\s]+!u', '', mb_strtolower($title));
365 +
366 + // Replace all separator characters and whitespace by a single separator
367 + $title = preg_replace('!['.preg_quote($separator).'\s]+!u', $separator, $title);
368 +
369 + return trim($title, $separator);
370 + }
371 +
372 + /**
373 + * Convert a string to snake case.
374 + *
375 + * @param string $value
376 + * @param string $delimiter
377 + * @return string
378 + */
379 + public static function snake($value, $delimiter = '_')
380 + {
381 + $key = $value;
382 +
383 + if (isset(static::$snakeCache[$key][$delimiter])) {
384 + return static::$snakeCache[$key][$delimiter];
385 + }
386 +
387 + if (! ctype_lower($value)) {
388 + $value = preg_replace('/\s+/u', '', $value);
389 +
390 + $value = static::lower(preg_replace('/(.)(?=[A-Z])/u', '$1'.$delimiter, $value));
391 + }
392 +
393 + return static::$snakeCache[$key][$delimiter] = $value;
394 + }
395 +
396 + /**
397 + * Determine if a given string starts with a given substring.
398 + *
399 + * @param string $haystack
400 + * @param string|array $needles
401 + * @return bool
402 + */
403 + public static function startsWith($haystack, $needles)
404 + {
405 + foreach ((array) $needles as $needle) {
406 + if ($needle != '' && substr($haystack, 0, strlen($needle)) === (string) $needle) {
407 + return true;
408 + }
409 + }
410 +
411 + return false;
412 + }
413 +
414 + /**
415 + * Convert a value to studly caps case.
416 + *
417 + * @param string $value
418 + * @return string
419 + */
420 + public static function studly($value)
421 + {
422 + $key = $value;
423 +
424 + if (isset(static::$studlyCache[$key])) {
425 + return static::$studlyCache[$key];
426 + }
427 +
428 + $value = ucwords(str_replace(['-', '_'], ' ', $value));
429 +
430 + return static::$studlyCache[$key] = str_replace(' ', '', $value);
431 + }
432 +
433 + /**
434 + * Returns the portion of string specified by the start and length parameters.
435 + *
436 + * @param string $string
437 + * @param int $start
438 + * @param int|null $length
439 + * @return string
440 + */
441 + public static function substr($string, $start, $length = null)
442 + {
443 + return mb_substr($string, $start, $length, 'UTF-8');
444 + }
445 +
446 + /**
447 + * Make a string's first character uppercase.
448 + *
449 + * @param string $string
450 + * @return string
451 + */
452 + public static function ucfirst($string)
453 + {
454 + return static::upper(static::substr($string, 0, 1)).static::substr($string, 1);
455 + }
456 +
457 + /**
458 + * Returns the replacements for the ascii method.
459 + *
460 + * Note: Adapted from Stringy\Stringy.
461 + *
462 + * @see https://github.com/danielstjules/Stringy/blob/2.3.1/LICENSE.txt
463 + *
464 + * @return array
465 + */
466 + protected static function charsArray()
467 + {
468 + static $charsArray;
469 +
470 + if (isset($charsArray)) {
471 + return $charsArray;
472 + }
473 +
474 + return $charsArray = [
475 + '0' => ['°', '₀', '۰'],
476 + '1' => ['¹', '₁', '۱'],
477 + '2' => ['²', '₂', '۲'],
478 + '3' => ['³', '₃', '۳'],
479 + '4' => ['⁴', '₄', '۴', '٤'],
480 + '5' => ['⁵', '₅', '۵', '٥'],
481 + '6' => ['⁶', '₆', '۶', '٦'],
482 + '7' => ['⁷', '₇', '۷'],
483 + '8' => ['⁸', '₈', '۸'],
484 + '9' => ['⁹', '₉', '۹'],
485 + 'a' => ['à', 'á', 'ả', 'ã', 'ạ', 'ă', 'ắ', 'ằ', 'ẳ', 'ẵ', 'ặ', 'â', 'ấ', 'ầ', 'ẩ', 'ẫ', 'ậ', 'ā', 'ą', 'å', 'α', 'ά', 'ἀ', 'ἁ', 'ἂ', 'ἃ', 'ἄ', 'ἅ', 'ἆ', 'ἇ', 'ᾀ', 'ᾁ', 'ᾂ', 'ᾃ', 'ᾄ', 'ᾅ', 'ᾆ', 'ᾇ', 'ὰ', 'ά', 'ᾰ', 'ᾱ', 'ᾲ', 'ᾳ', 'ᾴ', 'ᾶ', 'ᾷ', 'а', 'أ', 'အ', 'ာ', 'ါ', 'ǻ', 'ǎ', 'ª', 'ა', 'अ', 'ا'],
486 + 'b' => ['б', 'β', 'Ъ', 'Ь', 'ب', 'ဗ', 'ბ'],
487 + 'c' => ['ç', 'ć', 'č', 'ĉ', 'ċ'],
488 + 'd' => ['ď', 'ð', 'đ', 'ƌ', 'ȡ', 'ɖ', 'ɗ', 'ᵭ', 'ᶁ', 'ᶑ', 'д', 'δ', 'د', 'ض', 'ဍ', 'ဒ', 'დ'],
489 + 'e' => ['é', 'è', 'ẻ', 'ẽ', 'ẹ', 'ê', 'ế', 'ề', 'ể', 'ễ', 'ệ', 'ë', 'ē', 'ę', 'ě', 'ĕ', 'ė', 'ε', 'έ', 'ἐ', 'ἑ', 'ἒ', 'ἓ', 'ἔ', 'ἕ', 'ὲ', 'έ', 'е', 'ё', 'э', 'є', 'ə', 'ဧ', 'ေ', 'ဲ', 'ე', 'ए', 'إ', 'ئ'],
490 + 'f' => ['ф', 'φ', 'ف', 'ƒ', 'ფ'],
491 + 'g' => ['ĝ', 'ğ', 'ġ', 'ģ', 'г', 'ґ', 'γ', 'ဂ', 'გ', 'گ'],
492 + 'h' => ['ĥ', 'ħ', 'η', 'ή', 'ح', 'ه', 'ဟ', 'ှ', 'ჰ'],
493 + 'i' => ['í', 'ì', 'ỉ', 'ĩ', 'ị', 'î', 'ï', 'ī', 'ĭ', 'į', 'ı', 'ι', 'ί', 'ϊ', 'ΐ', 'ἰ', 'ἱ', 'ἲ', 'ἳ', 'ἴ', 'ἵ', 'ἶ', 'ἷ', 'ὶ', 'ί', 'ῐ', 'ῑ', 'ῒ', 'ΐ', 'ῖ', 'ῗ', 'і', 'ї', 'и', 'ဣ', 'ိ', 'ီ', 'ည်', 'ǐ', 'ი', 'इ'],
494 + 'j' => ['ĵ', 'ј', 'Ј', 'ჯ', 'ج'],
495 + 'k' => ['ķ', 'ĸ', 'к', 'κ', 'Ķ', 'ق', 'ك', 'က', 'კ', 'ქ', 'ک'],
496 + 'l' => ['ł', 'ľ', 'ĺ', 'ļ', 'ŀ', 'л', 'λ', 'ل', 'လ', 'ლ'],
497 + 'm' => ['м', 'μ', 'م', 'မ', 'მ'],
498 + 'n' => ['ñ', 'ń', 'ň', 'ņ', 'ʼn', 'ŋ', 'ν', 'н', 'ن', 'န', 'ნ'],
499 + 'o' => ['ó', 'ò', 'ỏ', 'õ', 'ọ', 'ô', 'ố', 'ồ', 'ổ', 'ỗ', 'ộ', 'ơ', 'ớ', 'ờ', 'ở', 'ỡ', 'ợ', 'ø', 'ō', 'ő', 'ŏ', 'ο', 'ὀ', 'ὁ', 'ὂ', 'ὃ', 'ὄ', 'ὅ', 'ὸ', 'ό', 'о', 'و', 'θ', 'ို', 'ǒ', 'ǿ', 'º', 'ო', 'ओ'],
500 + 'p' => ['п', 'π', 'ပ', 'პ', 'پ'],
501 + 'q' => ['ყ'],
502 + 'r' => ['ŕ', 'ř', 'ŗ', 'р', 'ρ', 'ر', 'რ'],
503 + 's' => ['ś', 'š', 'ş', 'с', 'σ', 'ș', 'ς', 'س', 'ص', 'စ', 'ſ', 'ს'],
504 + 't' => ['ť', 'ţ', 'т', 'τ', 'ț', 'ت', 'ط', 'ဋ', 'တ', 'ŧ', 'თ', 'ტ'],
505 + 'u' => ['ú', 'ù', 'ủ', 'ũ', 'ụ', 'ư', 'ứ', 'ừ', 'ử', 'ữ', 'ự', 'û', 'ū', 'ů', 'ű', 'ŭ', 'ų', 'µ', 'у', 'ဉ', 'ု', 'ူ', 'ǔ', 'ǖ', 'ǘ', 'ǚ', 'ǜ', 'უ', 'उ'],
506 + 'v' => ['в', 'ვ', 'ϐ'],
507 + 'w' => ['ŵ', 'ω', 'ώ', 'ဝ', 'ွ'],
508 + 'x' => ['χ', 'ξ'],
509 + 'y' => ['ý', 'ỳ', 'ỷ', 'ỹ', 'ỵ', 'ÿ', 'ŷ', 'й', 'ы', 'υ', 'ϋ', 'ύ', 'ΰ', 'ي', 'ယ'],
510 + 'z' => ['ź', 'ž', 'ż', 'з', 'ζ', 'ز', 'ဇ', 'ზ'],
511 + 'aa' => ['ع', 'आ', 'آ'],
512 + 'ae' => ['ä', 'æ', 'ǽ'],
513 + 'ai' => ['ऐ'],
514 + 'at' => ['@'],
515 + 'ch' => ['ч', 'ჩ', 'ჭ', 'چ'],
516 + 'dj' => ['ђ', 'đ'],
517 + 'dz' => ['џ', 'ძ'],
518 + 'ei' => ['ऍ'],
519 + 'gh' => ['غ', 'ღ'],
520 + 'ii' => ['ई'],
521 + 'ij' => ['ij'],
522 + 'kh' => ['х', 'خ', 'ხ'],
523 + 'lj' => ['љ'],
524 + 'nj' => ['њ'],
525 + 'oe' => ['ö', 'œ', 'ؤ'],
526 + 'oi' => ['ऑ'],
527 + 'oii' => ['ऒ'],
528 + 'ps' => ['ψ'],
529 + 'sh' => ['ш', 'შ', 'ش'],
530 + 'shch' => ['щ'],
531 + 'ss' => ['ß'],
532 + 'sx' => ['ŝ'],
533 + 'th' => ['þ', 'ϑ', 'ث', 'ذ', 'ظ'],
534 + 'ts' => ['ц', 'ც', 'წ'],
535 + 'ue' => ['ü'],
536 + 'uu' => ['ऊ'],
537 + 'ya' => ['я'],
538 + 'yu' => ['ю'],
539 + 'zh' => ['ж', 'ჟ', 'ژ'],
540 + '(c)' => ['©'],
541 + 'A' => ['Á', 'À', 'Ả', 'Ã', 'Ạ', 'Ă', 'Ắ', 'Ằ', 'Ẳ', 'Ẵ', 'Ặ', 'Â', 'Ấ', 'Ầ', 'Ẩ', 'Ẫ', 'Ậ', 'Å', 'Ā', 'Ą', 'Α', 'Ά', 'Ἀ', 'Ἁ', 'Ἂ', 'Ἃ', 'Ἄ', 'Ἅ', 'Ἆ', 'Ἇ', 'ᾈ', 'ᾉ', 'ᾊ', 'ᾋ', 'ᾌ', 'ᾍ', 'ᾎ', 'ᾏ', 'Ᾰ', 'Ᾱ', 'Ὰ', 'Ά', 'ᾼ', 'А', 'Ǻ', 'Ǎ'],
542 + 'B' => ['Б', 'Β', 'ब'],
543 + 'C' => ['Ç', 'Ć', 'Č', 'Ĉ', 'Ċ'],
544 + 'D' => ['Ď', 'Ð', 'Đ', 'Ɖ', 'Ɗ', 'Ƌ', 'ᴅ', 'ᴆ', 'Д', 'Δ'],
545 + 'E' => ['É', 'È', 'Ẻ', 'Ẽ', 'Ẹ', 'Ê', 'Ế', 'Ề', 'Ể', 'Ễ', 'Ệ', 'Ë', 'Ē', 'Ę', 'Ě', 'Ĕ', 'Ė', 'Ε', 'Έ', 'Ἐ', 'Ἑ', 'Ἒ', 'Ἓ', 'Ἔ', 'Ἕ', 'Έ', 'Ὲ', 'Е', 'Ё', 'Э', 'Є', 'Ə'],
546 + 'F' => ['Ф', 'Φ'],
547 + 'G' => ['Ğ', 'Ġ', 'Ģ', 'Г', 'Ґ', 'Γ'],
548 + 'H' => ['Η', 'Ή', 'Ħ'],
549 + 'I' => ['Í', 'Ì', 'Ỉ', 'Ĩ', 'Ị', 'Î', 'Ï', 'Ī', 'Ĭ', 'Į', 'İ', 'Ι', 'Ί', 'Ϊ', 'Ἰ', 'Ἱ', 'Ἳ', 'Ἴ', 'Ἵ', 'Ἶ', 'Ἷ', 'Ῐ', 'Ῑ', 'Ὶ', 'Ί', 'И', 'І', 'Ї', 'Ǐ', 'ϒ'],
550 + 'K' => ['К', 'Κ'],
551 + 'L' => ['Ĺ', 'Ł', 'Л', 'Λ', 'Ļ', 'Ľ', 'Ŀ', 'ल'],
552 + 'M' => ['М', 'Μ'],
553 + 'N' => ['Ń', 'Ñ', 'Ň', 'Ņ', 'Ŋ', 'Н', 'Ν'],
554 + 'O' => ['Ó', 'Ò', 'Ỏ', 'Õ', 'Ọ', 'Ô', 'Ố', 'Ồ', 'Ổ', 'Ỗ', 'Ộ', 'Ơ', 'Ớ', 'Ờ', 'Ở', 'Ỡ', 'Ợ', 'Ø', 'Ō', 'Ő', 'Ŏ', 'Ο', 'Ό', 'Ὀ', 'Ὁ', 'Ὂ', 'Ὃ', 'Ὄ', 'Ὅ', 'Ὸ', 'Ό', 'О', 'Θ', 'Ө', 'Ǒ', 'Ǿ'],
555 + 'P' => ['П', 'Π'],
556 + 'R' => ['Ř', 'Ŕ', 'Р', 'Ρ', 'Ŗ'],
557 + 'S' => ['Ş', 'Ŝ', 'Ș', 'Š', 'Ś', 'С', 'Σ'],
558 + 'T' => ['Ť', 'Ţ', 'Ŧ', 'Ț', 'Т', 'Τ'],
559 + 'U' => ['Ú', 'Ù', 'Ủ', 'Ũ', 'Ụ', 'Ư', 'Ứ', 'Ừ', 'Ử', 'Ữ', 'Ự', 'Û', 'Ū', 'Ů', 'Ű', 'Ŭ', 'Ų', 'У', 'Ǔ', 'Ǖ', 'Ǘ', 'Ǚ', 'Ǜ'],
560 + 'V' => ['В'],
561 + 'W' => ['Ω', 'Ώ', 'Ŵ'],
562 + 'X' => ['Χ', 'Ξ'],
563 + 'Y' => ['Ý', 'Ỳ', 'Ỷ', 'Ỹ', 'Ỵ', 'Ÿ', 'Ῠ', 'Ῡ', 'Ὺ', 'Ύ', 'Ы', 'Й', 'Υ', 'Ϋ', 'Ŷ'],
564 + 'Z' => ['Ź', 'Ž', 'Ż', 'З', 'Ζ'],
565 + 'AE' => ['Ä', 'Æ', 'Ǽ'],
566 + 'CH' => ['Ч'],
567 + 'DJ' => ['Ђ'],
568 + 'DZ' => ['Џ'],
569 + 'GX' => ['Ĝ'],
570 + 'HX' => ['Ĥ'],
571 + 'IJ' => ['IJ'],
572 + 'JX' => ['Ĵ'],
573 + 'KH' => ['Х'],
574 + 'LJ' => ['Љ'],
575 + 'NJ' => ['Њ'],
576 + 'OE' => ['Ö', 'Œ'],
577 + 'PS' => ['Ψ'],
578 + 'SH' => ['Ш'],
579 + 'SHCH' => ['Щ'],
580 + 'SS' => ['ẞ'],
581 + 'TH' => ['Þ'],
582 + 'TS' => ['Ц'],
583 + 'UE' => ['Ü'],
584 + 'YA' => ['Я'],
585 + 'YU' => ['Ю'],
586 + 'ZH' => ['Ж'],
587 + ' ' => ["\xC2\xA0", "\xE2\x80\x80", "\xE2\x80\x81", "\xE2\x80\x82", "\xE2\x80\x83", "\xE2\x80\x84", "\xE2\x80\x85", "\xE2\x80\x86", "\xE2\x80\x87", "\xE2\x80\x88", "\xE2\x80\x89", "\xE2\x80\x8A", "\xE2\x80\xAF", "\xE2\x81\x9F", "\xE3\x80\x80"],
588 + ];
589 + }
590 + }
591 +