From 70c497ef3d6c1206f4a43e150eec6bc6d96b3a01 Mon Sep 17 00:00:00 2001 From: sxyazi Date: Sun, 26 May 2024 21:51:37 +0800 Subject: [PATCH] Use `Cow` to avoid unnecessary memory reallocations --- yazi-shared/src/transliterate/mod.rs | 825 +----------------------- yazi-shared/src/transliterate/table.rs | 762 ++++++++++++++++++++++ yazi-shared/src/transliterate/traits.rs | 69 ++ 3 files changed, 835 insertions(+), 821 deletions(-) create mode 100644 yazi-shared/src/transliterate/table.rs create mode 100644 yazi-shared/src/transliterate/traits.rs diff --git a/yazi-shared/src/transliterate/mod.rs b/yazi-shared/src/transliterate/mod.rs index 41ae2fa2..a51cf385 100644 --- a/yazi-shared/src/transliterate/mod.rs +++ b/yazi-shared/src/transliterate/mod.rs @@ -1,822 +1,5 @@ -#[inline(always)] -fn transliteration(c: &char) -> String { - let c_val = *c as usize; - if c_val < 192 { - c.to_string() - } else if c_val < 688 { - // NOTE: This is safe since we hard coded the array as const and know its bounds - unsafe { TRANSLITERATE_0.get_unchecked(c_val - 192usize).to_string() } - } else if c_val > 7683 && c_val < 7930 { - // NOTE: This is safe since we hard coded the array as const and know its bounds - unsafe { TRANSLITERATE_1.get_unchecked(c_val - 7684usize).to_string() } - } else if c_val > 64256 && c_val < 64259 { - // NOTE: This is safe since we hard coded the array as const and know its bounds - unsafe { TRANSLITERATE_2.get_unchecked(c_val - 64257usize).to_string() } - } else { - c.to_string() - } -} +mod table; +mod traits; -pub trait Transliterator { - fn transliterate(&self) -> String; -} - -impl Transliterator for &[u8] { - fn transliterate(&self) -> String { - match std::str::from_utf8(*self) { - Ok(ts) => ts.chars().fold(String::new(), |acc, s| acc + &transliteration(&s)), - // If the [u8] fails to convert to a utf8 string - Err(_) => "invalid".to_string(), - } - } -} - -// this array holds char values 192-687 -const TRANSLITERATE_0: [&'static str; 496] = [ - "A", // À 192 - "A", // Á 193 - "A", //  194 - "A", // à 195 - "A", // Ä 196 - "A", // Å 197 - "AE", // Æ 198 - "C", // Ç 199 - "E", // È 200 - "E", // É 201 - "E", // Ê 202 - "E", // Ë 203 - "I", // Ì 204 - "I", // Í 205 - "I", // Î 206 - "I", // Ï 207 - "D", // Ð 208 - "N", // Ñ 209 - "O", // Ò 210 - "O", // Ó 211 - "O", // Ô 212 - "O", // Õ 213 - "O", // Ö 214 - "×", // × 215 - "O", // Ø 216 - "U", // Ù 217 - "U", // Ú 218 - "U", // Û 219 - "U", // Ü 220 - "Y", // Ý 221 - "T", // Þ 222 - "ss", // ß 223 - "a", // à 224 - "a", // á 225 - "a", // â 226 - "a", // ã 227 - "a", // ä 228 - "a", // å 229 - "ae", // æ 230 - "c", // ç 231 - "e", // è 232 - "e", // é 233 - "e", // ê 234 - "e", // ë 235 - "i", // ì 236 - "i", // í 237 - "i", // î 238 - "i", // ï 239 - "d", // ð 240 - "n", // ñ 241 - "o", // ò 242 - "o", // ó 243 - "o", // ô 244 - "o", // õ 245 - "o", // ö 246 - "÷", // ÷ 247 - "o", // ø 248 - "u", // ù 249 - "u", // ú 250 - "u", // û 251 - "u", // ü 252 - "y", // ý 253 - "t", // þ 254 - "y", // ÿ 255 - "A", // Ā 256 - "a", // ā 257 - "A", // Ă 258 - "a", // ă 259 - "A", // Ą 260 - "a", // ą 261 - "C", // Ć 262 - "c", // ć 263 - "C", // Ĉ 264 - "c", // ĉ 265 - "C", // Ċ 266 - "c", // ċ 267 - "C", // Č 268 - "c", // č 269 - "D", // Ď 270 - "d", // ď 271 - "D", // Đ 272 - "d", // đ 273 - "E", // Ē 274 - "e", // ē 275 - "E", // Ĕ 276 - "e", // ĕ 277 - "E", // Ė 278 - "e", // ė 279 - "E", // Ę 280 - "e", // ę 281 - "E", // Ě 282 - "e", // ě 283 - "G", // Ĝ 284 - "g", // ĝ 285 - "G", // Ğ 286 - "g", // ğ 287 - "G", // Ġ 288 - "g", // ġ 289 - "G", // Ģ 290 - "g", // ģ 291 - "H", // Ĥ 292 - "h", // ĥ 293 - "H", // Ħ 294 - "h", // ħ 295 - "I", // Ĩ 296 - "i", // ĩ 297 - "I", // Ī 298 - "i", // ī 299 - "I", // Ĭ 300 - "i", // ĭ 301 - "I", // Į 302 - "i", // į 303 - "I", // İ 304 - "i", // ı 305 - "IJ", // IJ 306 - "ij", // ij 307 - "J", // Ĵ 308 - "j", // ĵ 309 - "K", // Ķ 310 - "k", // ķ 311 - "k", // ĸ 312 - "L", // Ĺ 313 - "l", // ĺ 314 - "L", // Ļ 315 - "l", // ļ 316 - "L", // Ľ 317 - "l", // ľ 318 - "L", // Ŀ 319 - "l", // ŀ 320 - "L", // Ł 321 - "l", // ł 322 - "N", // Ń 323 - "n", // ń 324 - "N", // Ņ 325 - "n", // ņ 326 - "N", // Ň 327 - "n", // ň 328 - "n", // ʼn 329 - "N", // Ŋ 330 - "n", // ŋ 331 - "O", // Ō 332 - "o", // ō 333 - "O", // Ŏ 334 - "o", // ŏ 335 - "O", // Ő 336 - "o", // ő 337 - "OE", // Œ 338 - "oe", // œ 339 - "R", // Ŕ 340 - "r", // ŕ 341 - "R", // Ŗ 342 - "r", // ŗ 343 - "R", // Ř 344 - "r", // ř 345 - "S", // Ś 346 - "s", // ś 347 - "S", // Ŝ 348 - "s", // ŝ 349 - "S", // Ş 350 - "s", // ş 351 - "S", // Š 352 - "s", // š 353 - "T", // Ţ 354 - "t", // ţ 355 - "T", // Ť 356 - "t", // ť 357 - "T", // Ŧ 358 - "t", // ŧ 359 - "U", // Ũ 360 - "u", // ũ 361 - "U", // Ū 362 - "u", // ū 363 - "U", // Ŭ 364 - "u", // ŭ 365 - "U", // Ů 366 - "u", // ů 367 - "U", // Ű 368 - "u", // ű 369 - "U", // Ų 370 - "u", // ų 371 - "W", // Ŵ 372 - "w", // ŵ 373 - "Y", // Ŷ 374 - "y", // ŷ 375 - "Y", // Ÿ 376 - "Z", // Ź 377 - "z", // ź 378 - "Z", // Ż 379 - "z", // ż 380 - "Z", // Ž 381 - "z", // ž 382 - "s", // ſ 383 - "ƀ", // ƀ 384 - "B", // Ɓ 385 - "Ƃ", // Ƃ 386 - "ƃ", // ƃ 387 - "Ƅ", // Ƅ 388 - "ƅ", // ƅ 389 - "O", // Ɔ 390 - "Ƈ", // Ƈ 391 - "ƈ", // ƈ 392 - "Ɖ", // Ɖ 393 - "D", // Ɗ 394 - "Ƌ", // Ƌ 395 - "ƌ", // ƌ 396 - "ƍ", // ƍ 397 - "Ǝ", // Ǝ 398 - "E", // Ə 399 - "E", // Ɛ 400 - "F", // Ƒ 401 - "f", // ƒ 402 - "Ɠ", // Ɠ 403 - "Ɣ", // Ɣ 404 - "ƕ", // ƕ 405 - "Ɩ", // Ɩ 406 - "Ɨ", // Ɨ 407 - "K", // Ƙ 408 - "k", // ƙ 409 - "l", // ƚ 410 - "l", // ƛ 411 - "Ɯ", // Ɯ 412 - "N", // Ɲ 413 - "ƞ", // ƞ 414 - "O", // Ɵ 415 - "O", // Ơ 416 - "o", // ơ 417 - "Ƣ", // Ƣ 418 - "ƣ", // ƣ 419 - "Ƥ", // Ƥ 420 - "ƥ", // ƥ 421 - "Ʀ", // Ʀ 422 - "Ƨ", // Ƨ 423 - "ƨ", // ƨ 424 - "Ʃ", // Ʃ 425 - "ƪ", // ƪ 426 - "ƫ", // ƫ 427 - "Ƭ", // Ƭ 428 - "ƭ", // ƭ 429 - "Ʈ", // Ʈ 430 - "U", // Ư 431 - "u", // ư 432 - "Ʊ", // Ʊ 433 - "Ʋ", // Ʋ 434 - "Y", // Ƴ 435 - "y", // ƴ 436 - "Z", // Ƶ 437 - "z", // ƶ 438 - "Ʒ", // Ʒ 439 - "Ƹ", // Ƹ 440 - "ƹ", // ƹ 441 - "ƺ", // ƺ 442 - "ƻ", // ƻ 443 - "Ƽ", // Ƽ 444 - "ƽ", // ƽ 445 - "ƾ", // ƾ 446 - "ƿ", // ƿ 447 - "ǀ", // ǀ 448 - "ǁ", // ǁ 449 - "ǂ", // ǂ 450 - "ǃ", // ǃ 451 - "DZ", // DŽ 452 - "Dz", // Dž 453 - "dz", // dž 454 - "LJ", // LJ 455 - "Lj", // Lj 456 - "lj", // lj 457 - "NJ", // NJ 458 - "Nj", // Nj 459 - "nj", // nj 460 - "A", // Ǎ 461 - "a", // ǎ 462 - "I", // Ǐ 463 - "i", // ǐ 464 - "O", // Ǒ 465 - "o", // ǒ 466 - "U", // Ǔ 467 - "u", // ǔ 468 - "U", // Ǖ 469 - "u", // ǖ 470 - "U", // Ǘ 471 - "u", // ǘ 472 - "U", // Ǚ 473 - "u", // ǚ 474 - "U", // Ǜ 475 - "u", // ǜ 476 - "ǝ", // ǝ 477 - "Ǟ", // Ǟ 478 - "ǟ", // ǟ 479 - "Ǡ", // Ǡ 480 - "ǡ", // ǡ 481 - "Ǣ", // Ǣ 482 - "ǣ", // ǣ 483 - "Ǥ", // Ǥ 484 - "ǥ", // ǥ 485 - "G", // Ǧ 486 - "g", // ǧ 487 - "Ǩ", // Ǩ 488 - "ǩ", // ǩ 489 - "O", // Ǫ 490 - "o", // ǫ 491 - "Ǭ", // Ǭ 492 - "ǭ", // ǭ 493 - "Ǯ", // Ǯ 494 - "e", // ǯ 495 - "j", // ǰ 496 - "DZ", // DZ 497 - "Dz", // Dz 498 - "dz", // dz 499 - "G", // Ǵ 500 - "g", // ǵ 501 - "Ƕ", // Ƕ 502 - "Ƿ", // Ƿ 503 - "N", // Ǹ 504 - "n", // ǹ 505 - "A", // Ǻ 506 - "a", // ǻ 507 - "AE", // Ǽ 508 - "ae", // ǽ 509 - "O", // Ǿ 510 - "o", // ǿ 511 - "Ȁ", // Ȁ 512 - "ȁ", // ȁ 513 - "Ȃ", // Ȃ 514 - "ȃ", // ȃ 515 - "Ȅ", // Ȅ 516 - "ȅ", // ȅ 517 - "Ȇ", // Ȇ 518 - "ȇ", // ȇ 519 - "Ȉ", // Ȉ 520 - "ȉ", // ȉ 521 - "Ȋ", // Ȋ 522 - "ȋ", // ȋ 523 - "Ȍ", // Ȍ 524 - "ȍ", // ȍ 525 - "Ȏ", // Ȏ 526 - "ȏ", // ȏ 527 - "Ȑ", // Ȑ 528 - "ȑ", // ȑ 529 - "Ȓ", // Ȓ 530 - "ȓ", // ȓ 531 - "Ȕ", // Ȕ 532 - "ȕ", // ȕ 533 - "Ȗ", // Ȗ 534 - "ȗ", // ȗ 535 - "S", // Ș 536 - "s", // ș 537 - "T", // Ț 538 - "t", // ț 539 - "Ȝ", // Ȝ 540 - "ȝ", // ȝ 541 - "Ȟ", // Ȟ 542 - "ȟ", // ȟ 543 - "Ƞ", // Ƞ 544 - "ȡ", // ȡ 545 - "Ȣ", // Ȣ 546 - "ȣ", // ȣ 547 - "Ȥ", // Ȥ 548 - "ȥ", // ȥ 549 - "Ȧ", // Ȧ 550 - "ȧ", // ȧ 551 - "Ȩ", // Ȩ 552 - "ȩ", // ȩ 553 - "Ȫ", // Ȫ 554 - "ȫ", // ȫ 555 - "Ȭ", // Ȭ 556 - "ȭ", // ȭ 557 - "Ȯ", // Ȯ 558 - "ȯ", // ȯ 559 - "Ȱ", // Ȱ 560 - "ȱ", // ȱ 561 - "Y", // Ȳ 562 - "y", // ȳ 563 - "ȴ", // ȴ 564 - "ȵ", // ȵ 565 - "ȶ", // ȶ 566 - "j", // ȷ 567 - "ȸ", // ȸ 568 - "ȹ", // ȹ 569 - "Ⱥ", // Ⱥ 570 - "Ȼ", // Ȼ 571 - "ȼ", // ȼ 572 - "L", // Ƚ 573 - "Ⱦ", // Ⱦ 574 - "ȿ", // ȿ 575 - "ɀ", // ɀ 576 - "Ɂ", // Ɂ 577 - "ɂ", // ɂ 578 - "Ƀ", // Ƀ 579 - "Ʉ", // Ʉ 580 - "Ʌ", // Ʌ 581 - "Ɇ", // Ɇ 582 - "ɇ", // ɇ 583 - "Ɉ", // Ɉ 584 - "ɉ", // ɉ 585 - "Ɋ", // Ɋ 586 - "ɋ", // ɋ 587 - "Ɍ", // Ɍ 588 - "ɍ", // ɍ 589 - "Ɏ", // Ɏ 590 - "ɏ", // ɏ 591 - "a", // ɐ 592 - "a", // ɑ 593 - "a", // ɒ 594 - "b", // ɓ 595 - "o", // ɔ 596 - "c", // ɕ 597 - "d", // ɖ 598 - "d", // ɗ 599 - "e", // ɘ 600 - "e", // ə 601 - "e", // ɚ 602 - "o", // ɛ 603 - "e", // ɜ 604 - "e", // ɝ 605 - "e", // ɞ 606 - "j", // ɟ 607 - "g", // ɠ 608 - "g", // ɡ 609 - "ɢ", // ɢ 610 - "g", // ɣ 611 - "ɤ", // ɤ 612 - "h", // ɥ 613 - "h", // ɦ 614 - "h", // ɧ 615 - "i", // ɨ 616 - "i", // ɩ 617 - "ɪ", // ɪ 618 - "l", // ɫ 619 - "l", // ɬ 620 - "l", // ɭ 621 - "le", // ɮ 622 - "m", // ɯ 623 - "m", // ɰ 624 - "m", // ɱ 625 - "n", // ɲ 626 - "n", // ɳ 627 - "ɴ", // ɴ 628 - "o", // ɵ 629 - "OE", // ɶ 630 - "ɷ", // ɷ 631 - "p", // ɸ 632 - "r", // ɹ 633 - "r", // ɺ 634 - "r", // ɻ 635 - "r", // ɼ 636 - "r", // ɽ 637 - "r", // ɾ 638 - "r", // ɿ 639 - "ʀ", // ʀ 640 - "R", // ʁ 641 - "s", // ʂ 642 - "s", // ʃ 643 - "j", // ʄ 644 - "s", // ʅ 645 - "s", // ʆ 646 - "t", // ʇ 647 - "t", // ʈ 648 - "u", // ʉ 649 - "u", // ʊ 650 - "v", // ʋ 651 - "v", // ʌ 652 - "w", // ʍ 653 - "y", // ʎ 654 - "ʏ", // ʏ 655 - "z", // ʐ 656 - "z", // ʑ 657 - "e", // ʒ 658 - "e", // ʓ 659 - "ʔ", // ʔ 660 - "ʕ", // ʕ 661 - "ʖ", // ʖ 662 - "C", // ʗ 663 - "o", // ʘ 664 - "ʙ", // ʙ 665 - "e", // ʚ 666 - "G", // ʛ 667 - "ʜ", // ʜ 668 - "j", // ʝ 669 - "k", // ʞ 670 - "ʟ", // ʟ 671 - "q", // ʠ 672 - "ʡ", // ʡ 673 - "ʢ", // ʢ 674 - "dz", // ʣ 675 - "de", // ʤ 676 - "dz", // ʥ 677 - "ts", // ʦ 678 - "ts", // ʧ 679 - "tc", // ʨ 680 - "fn", // ʩ 681 - "ls", // ʪ 682 - "lz", // ʫ 683 - "W", // ʬ 684 - "ʭ", // ʭ 685 - "h", // ʮ 686 - "h", // ʯ 687 -]; - -// this array holds char values 7684-7929 -const TRANSLITERATE_1: [&'static str; 246] = [ - "B", // Ḅ 7684 - "b", // ḅ 7685 - "Ḇ", // Ḇ 7686 - "ḇ", // ḇ 7687 - "Ḉ", // Ḉ 7688 - "ḉ", // ḉ 7689 - "Ḋ", // Ḋ 7690 - "ḋ", // ḋ 7691 - "D", // Ḍ 7692 - "d", // ḍ 7693 - "D", // Ḏ 7694 - "d", // ḏ 7695 - "Ḑ", // Ḑ 7696 - "ḑ", // ḑ 7697 - "D", // Ḓ 7698 - "d", // ḓ 7699 - "Ḕ", // Ḕ 7700 - "ḕ", // ḕ 7701 - "Ḗ", // Ḗ 7702 - "ḗ", // ḗ 7703 - "Ḙ", // Ḙ 7704 - "ḙ", // ḙ 7705 - "Ḛ", // Ḛ 7706 - "ḛ", // ḛ 7707 - "Ḝ", // Ḝ 7708 - "ḝ", // ḝ 7709 - "Ḟ", // Ḟ 7710 - "ḟ", // ḟ 7711 - "G", // Ḡ 7712 - "g", // ḡ 7713 - "Ḣ", // Ḣ 7714 - "ḣ", // ḣ 7715 - "H", // Ḥ 7716 - "h", // ḥ 7717 - "Ḧ", // Ḧ 7718 - "ḧ", // ḧ 7719 - "Ḩ", // Ḩ 7720 - "ḩ", // ḩ 7721 - "H", // Ḫ 7722 - "h", // ḫ 7723 - "Ḭ", // Ḭ 7724 - "ḭ", // ḭ 7725 - "Ḯ", // Ḯ 7726 - "ḯ", // ḯ 7727 - "Ḱ", // Ḱ 7728 - "ḱ", // ḱ 7729 - "K", // Ḳ 7730 - "k", // ḳ 7731 - "K", // Ḵ 7732 - "k", // ḵ 7733 - "L", // Ḷ 7734 - "l", // ḷ 7735 - "L", // Ḹ 7736 - "l", // ḹ 7737 - "L", // Ḻ 7738 - "l", // ḻ 7739 - "L", // Ḽ 7740 - "l", // ḽ 7741 - "M", // Ḿ 7742 - "m", // ḿ 7743 - "M", // Ṁ 7744 - "m", // ṁ 7745 - "M", // Ṃ 7746 - "m", // ṃ 7747 - "N", // Ṅ 7748 - "n", // ṅ 7749 - "N", // Ṇ 7750 - "n", // ṇ 7751 - "N", // Ṉ 7752 - "n", // ṉ 7753 - "N", // Ṋ 7754 - "n", // ṋ 7755 - "Ṍ", // Ṍ 7756 - "ṍ", // ṍ 7757 - "Ṏ", // Ṏ 7758 - "ṏ", // ṏ 7759 - "Ṑ", // Ṑ 7760 - "ṑ", // ṑ 7761 - "Ṓ", // Ṓ 7762 - "ṓ", // ṓ 7763 - "Ṕ", // Ṕ 7764 - "ṕ", // ṕ 7765 - "Ṗ", // Ṗ 7766 - "ṗ", // ṗ 7767 - "R", // Ṙ 7768 - "r", // ṙ 7769 - "R", // Ṛ 7770 - "r", // ṛ 7771 - "R", // Ṝ 7772 - "r", // ṝ 7773 - "R", // Ṟ 7774 - "r", // ṟ 7775 - "S", // Ṡ 7776 - "s", // ṡ 7777 - "S", // Ṣ 7778 - "s", // ṣ 7779 - "Ṥ", // Ṥ 7780 - "ṥ", // ṥ 7781 - "Ṧ", // Ṧ 7782 - "ṧ", // ṧ 7783 - "Ṩ", // Ṩ 7784 - "ṩ", // ṩ 7785 - "Ṫ", // Ṫ 7786 - "ṫ", // ṫ 7787 - "T", // Ṭ 7788 - "t", // ṭ 7789 - "T", // Ṯ 7790 - "t", // ṯ 7791 - "T", // Ṱ 7792 - "t", // ṱ 7793 - "Ṳ", // Ṳ 7794 - "ṳ", // ṳ 7795 - "Ṵ", // Ṵ 7796 - "ṵ", // ṵ 7797 - "Ṷ", // Ṷ 7798 - "ṷ", // ṷ 7799 - "Ṹ", // Ṹ 7800 - "ṹ", // ṹ 7801 - "Ṻ", // Ṻ 7802 - "ṻ", // ṻ 7803 - "Ṽ", // Ṽ 7804 - "ṽ", // ṽ 7805 - "Ṿ", // Ṿ 7806 - "ṿ", // ṿ 7807 - "W", // Ẁ 7808 - "w", // ẁ 7809 - "W", // Ẃ 7810 - "w", // ẃ 7811 - "W", // Ẅ 7812 - "w", // ẅ 7813 - "Ẇ", // Ẇ 7814 - "ẇ", // ẇ 7815 - "Ẉ", // Ẉ 7816 - "ẉ", // ẉ 7817 - "Ẋ", // Ẋ 7818 - "ẋ", // ẋ 7819 - "Ẍ", // Ẍ 7820 - "ẍ", // ẍ 7821 - "Y", // Ẏ 7822 - "y", // ẏ 7823 - "Ẑ", // Ẑ 7824 - "ẑ", // ẑ 7825 - "Z", // Ẓ 7826 - "z", // ẓ 7827 - "Z", // Ẕ 7828 - "z", // ẕ 7829 - "h", // ẖ 7830 - "t", // ẗ 7831 - "ẘ", // ẘ 7832 - "ẙ", // ẙ 7833 - "ẚ", // ẚ 7834 - "ẛ", // ẛ 7835 - "ẜ", // ẜ 7836 - "ẝ", // ẝ 7837 - "SS", // ẞ 7838 - "ẟ", // ẟ 7839 - "A", // Ạ 7840 - "a", // ạ 7841 - "A", // Ả 7842 - "a", // ả 7843 - "A", // Ấ 7844 - "a", // ấ 7845 - "A", // Ầ 7846 - "a", // ầ 7847 - "A", // Ẩ 7848 - "a", // ẩ 7849 - "A", // Ẫ 7850 - "a", // ẫ 7851 - "A", // Ậ 7852 - "a", // ậ 7853 - "A", // Ắ 7854 - "a", // ắ 7855 - "A", // Ằ 7856 - "a", // ằ 7857 - "A", // Ẳ 7858 - "a", // ẳ 7859 - "A", // Ẵ 7860 - "a", // ẵ 7861 - "A", // Ặ 7862 - "a", // ặ 7863 - "E", // Ẹ 7864 - "e", // ẹ 7865 - "E", // Ẻ 7866 - "e", // ẻ 7867 - "E", // Ẽ 7868 - "e", // ẽ 7869 - "E", // Ế 7870 - "e", // ế 7871 - "E", // Ề 7872 - "e", // ề 7873 - "E", // Ể 7874 - "e", // ể 7875 - "E", // Ễ 7876 - "e", // ễ 7877 - "E", // Ệ 7878 - "e", // ệ 7879 - "I", // Ỉ 7880 - "i", // ỉ 7881 - "I", // Ị 7882 - "i", // ị 7883 - "O", // Ọ 7884 - "o", // ọ 7885 - "O", // Ỏ 7886 - "o", // ỏ 7887 - "O", // Ố 7888 - "o", // ố 7889 - "O", // Ồ 7890 - "o", // ồ 7891 - "O", // Ổ 7892 - "o", // ổ 7893 - "O", // Ỗ 7894 - "o", // ỗ 7895 - "O", // Ộ 7896 - "o", // ộ 7897 - "O", // Ớ 7898 - "o", // ớ 7899 - "O", // Ờ 7900 - "o", // ờ 7901 - "O", // Ở 7902 - "o", // ở 7903 - "O", // Ỡ 7904 - "o", // ỡ 7905 - "O", // Ợ 7906 - "o", // ợ 7907 - "U", // Ụ 7908 - "u", // ụ 7909 - "U", // Ủ 7910 - "u", // ủ 7911 - "U", // Ứ 7912 - "u", // ứ 7913 - "U", // Ừ 7914 - "u", // ừ 7915 - "U", // Ử 7916 - "u", // ử 7917 - "U", // Ữ 7918 - "u", // ữ 7919 - "U", // Ự 7920 - "u", // ự 7921 - "Y", // Ỳ 7922 - "y", // ỳ 7923 - "Y", // Ỵ 7924 - "y", // ỵ 7925 - "Y", // Ỷ 7926 - "y", // ỷ 7927 - "Y", // Ỹ 7928 - "y", // ỹ 7929 -]; - -// this array holds char values 64257-64258 -const TRANSLITERATE_2: [&'static str; 2] = [ - "fi", // fi 64257 - "fl", // fl 64258 -]; - -#[cfg(test)] -mod transliteration_tests { - use super::*; - - #[test] - fn test_transliterate() { - assert_eq!("Æcœ".as_bytes().transliterate(), "AEcoe".to_string()); - assert_eq!( - "ěřůøĉĝĥĵŝŭèùÿėįųāēīūļķņģőűëïąćęłńśźżõșțčďĺľňŕšťýžéíñóúüåäöçîşûğăâđêôơưáàãảạ" - .as_bytes() - .transliterate(), - "eruocghjsueuyeiuaeiulkngoueiacelnszzostcdllnrstyzeinouuaaocisugaadeoouaaaaa".to_string(), - ); - assert_eq!( - "áạàảãăắặằẳẵâấậầẩẫéẹèẻẽêếệềểễiíịìỉĩoóọòỏõôốộồổỗơớợờởỡúụùủũưứựừửữyýỵỳỷỹđ" - .as_bytes() - .transliterate(), - "aaaaaaaaaaaaaaaaaeeeeeeeeeeeiiiiiioooooooooooooooooouuuuuuuuuuuyyyyyyd".to_string(), - ); - assert_ne!( - "ěřůøĉĝĥĵŝŭèùÿėįųāēīūļķņģőűëïąćęłńśźżõșțčďĺľňŕšťýžéíñóúüåäöçîşûğăâđêôơưáàãảạfifl" - .as_bytes() - .transliterate(), - "ěřůøĉĝĥĵŝŭèùÿėįųāēīūļķņģőűëïąćęłńśźżõșțčďĺľňŕšťýžéíñóúüåäöçîşûğăâđêôơưáàãảạfifl".to_string() - ); - assert_eq!( - "THEQUICKBROWNFOXJUMPEDOVERTHELAZYDOGthequickbrownfoxjumpedoverthelazydog" - .as_bytes() - .transliterate(), - "THEQUICKBROWNFOXJUMPEDOVERTHELAZYDOGthequickbrownfoxjumpedoverthelazydog".to_string() - ); - } -} +use table::*; +pub use traits::*; diff --git a/yazi-shared/src/transliterate/table.rs b/yazi-shared/src/transliterate/table.rs new file mode 100644 index 00000000..1a5fa832 --- /dev/null +++ b/yazi-shared/src/transliterate/table.rs @@ -0,0 +1,762 @@ +const TABLE_0: [&str; 496] = [ + "A", // À 192 + "A", // Á 193 + "A", //  194 + "A", // à 195 + "A", // Ä 196 + "A", // Å 197 + "AE", // Æ 198 + "C", // Ç 199 + "E", // È 200 + "E", // É 201 + "E", // Ê 202 + "E", // Ë 203 + "I", // Ì 204 + "I", // Í 205 + "I", // Î 206 + "I", // Ï 207 + "D", // Ð 208 + "N", // Ñ 209 + "O", // Ò 210 + "O", // Ó 211 + "O", // Ô 212 + "O", // Õ 213 + "O", // Ö 214 + "×", // × 215 + "O", // Ø 216 + "U", // Ù 217 + "U", // Ú 218 + "U", // Û 219 + "U", // Ü 220 + "Y", // Ý 221 + "T", // Þ 222 + "ss", // ß 223 + "a", // à 224 + "a", // á 225 + "a", // â 226 + "a", // ã 227 + "a", // ä 228 + "a", // å 229 + "ae", // æ 230 + "c", // ç 231 + "e", // è 232 + "e", // é 233 + "e", // ê 234 + "e", // ë 235 + "i", // ì 236 + "i", // í 237 + "i", // î 238 + "i", // ï 239 + "d", // ð 240 + "n", // ñ 241 + "o", // ò 242 + "o", // ó 243 + "o", // ô 244 + "o", // õ 245 + "o", // ö 246 + "÷", // ÷ 247 + "o", // ø 248 + "u", // ù 249 + "u", // ú 250 + "u", // û 251 + "u", // ü 252 + "y", // ý 253 + "t", // þ 254 + "y", // ÿ 255 + "A", // Ā 256 + "a", // ā 257 + "A", // Ă 258 + "a", // ă 259 + "A", // Ą 260 + "a", // ą 261 + "C", // Ć 262 + "c", // ć 263 + "C", // Ĉ 264 + "c", // ĉ 265 + "C", // Ċ 266 + "c", // ċ 267 + "C", // Č 268 + "c", // č 269 + "D", // Ď 270 + "d", // ď 271 + "D", // Đ 272 + "d", // đ 273 + "E", // Ē 274 + "e", // ē 275 + "E", // Ĕ 276 + "e", // ĕ 277 + "E", // Ė 278 + "e", // ė 279 + "E", // Ę 280 + "e", // ę 281 + "E", // Ě 282 + "e", // ě 283 + "G", // Ĝ 284 + "g", // ĝ 285 + "G", // Ğ 286 + "g", // ğ 287 + "G", // Ġ 288 + "g", // ġ 289 + "G", // Ģ 290 + "g", // ģ 291 + "H", // Ĥ 292 + "h", // ĥ 293 + "H", // Ħ 294 + "h", // ħ 295 + "I", // Ĩ 296 + "i", // ĩ 297 + "I", // Ī 298 + "i", // ī 299 + "I", // Ĭ 300 + "i", // ĭ 301 + "I", // Į 302 + "i", // į 303 + "I", // İ 304 + "i", // ı 305 + "IJ", // IJ 306 + "ij", // ij 307 + "J", // Ĵ 308 + "j", // ĵ 309 + "K", // Ķ 310 + "k", // ķ 311 + "k", // ĸ 312 + "L", // Ĺ 313 + "l", // ĺ 314 + "L", // Ļ 315 + "l", // ļ 316 + "L", // Ľ 317 + "l", // ľ 318 + "L", // Ŀ 319 + "l", // ŀ 320 + "L", // Ł 321 + "l", // ł 322 + "N", // Ń 323 + "n", // ń 324 + "N", // Ņ 325 + "n", // ņ 326 + "N", // Ň 327 + "n", // ň 328 + "n", // ʼn 329 + "N", // Ŋ 330 + "n", // ŋ 331 + "O", // Ō 332 + "o", // ō 333 + "O", // Ŏ 334 + "o", // ŏ 335 + "O", // Ő 336 + "o", // ő 337 + "OE", // Œ 338 + "oe", // œ 339 + "R", // Ŕ 340 + "r", // ŕ 341 + "R", // Ŗ 342 + "r", // ŗ 343 + "R", // Ř 344 + "r", // ř 345 + "S", // Ś 346 + "s", // ś 347 + "S", // Ŝ 348 + "s", // ŝ 349 + "S", // Ş 350 + "s", // ş 351 + "S", // Š 352 + "s", // š 353 + "T", // Ţ 354 + "t", // ţ 355 + "T", // Ť 356 + "t", // ť 357 + "T", // Ŧ 358 + "t", // ŧ 359 + "U", // Ũ 360 + "u", // ũ 361 + "U", // Ū 362 + "u", // ū 363 + "U", // Ŭ 364 + "u", // ŭ 365 + "U", // Ů 366 + "u", // ů 367 + "U", // Ű 368 + "u", // ű 369 + "U", // Ų 370 + "u", // ų 371 + "W", // Ŵ 372 + "w", // ŵ 373 + "Y", // Ŷ 374 + "y", // ŷ 375 + "Y", // Ÿ 376 + "Z", // Ź 377 + "z", // ź 378 + "Z", // Ż 379 + "z", // ż 380 + "Z", // Ž 381 + "z", // ž 382 + "s", // ſ 383 + "ƀ", // ƀ 384 + "B", // Ɓ 385 + "Ƃ", // Ƃ 386 + "ƃ", // ƃ 387 + "Ƅ", // Ƅ 388 + "ƅ", // ƅ 389 + "O", // Ɔ 390 + "Ƈ", // Ƈ 391 + "ƈ", // ƈ 392 + "Ɖ", // Ɖ 393 + "D", // Ɗ 394 + "Ƌ", // Ƌ 395 + "ƌ", // ƌ 396 + "ƍ", // ƍ 397 + "Ǝ", // Ǝ 398 + "E", // Ə 399 + "E", // Ɛ 400 + "F", // Ƒ 401 + "f", // ƒ 402 + "Ɠ", // Ɠ 403 + "Ɣ", // Ɣ 404 + "ƕ", // ƕ 405 + "Ɩ", // Ɩ 406 + "Ɨ", // Ɨ 407 + "K", // Ƙ 408 + "k", // ƙ 409 + "l", // ƚ 410 + "l", // ƛ 411 + "Ɯ", // Ɯ 412 + "N", // Ɲ 413 + "ƞ", // ƞ 414 + "O", // Ɵ 415 + "O", // Ơ 416 + "o", // ơ 417 + "Ƣ", // Ƣ 418 + "ƣ", // ƣ 419 + "Ƥ", // Ƥ 420 + "ƥ", // ƥ 421 + "Ʀ", // Ʀ 422 + "Ƨ", // Ƨ 423 + "ƨ", // ƨ 424 + "Ʃ", // Ʃ 425 + "ƪ", // ƪ 426 + "ƫ", // ƫ 427 + "Ƭ", // Ƭ 428 + "ƭ", // ƭ 429 + "Ʈ", // Ʈ 430 + "U", // Ư 431 + "u", // ư 432 + "Ʊ", // Ʊ 433 + "Ʋ", // Ʋ 434 + "Y", // Ƴ 435 + "y", // ƴ 436 + "Z", // Ƶ 437 + "z", // ƶ 438 + "Ʒ", // Ʒ 439 + "Ƹ", // Ƹ 440 + "ƹ", // ƹ 441 + "ƺ", // ƺ 442 + "ƻ", // ƻ 443 + "Ƽ", // Ƽ 444 + "ƽ", // ƽ 445 + "ƾ", // ƾ 446 + "ƿ", // ƿ 447 + "ǀ", // ǀ 448 + "ǁ", // ǁ 449 + "ǂ", // ǂ 450 + "ǃ", // ǃ 451 + "DZ", // DŽ 452 + "Dz", // Dž 453 + "dz", // dž 454 + "LJ", // LJ 455 + "Lj", // Lj 456 + "lj", // lj 457 + "NJ", // NJ 458 + "Nj", // Nj 459 + "nj", // nj 460 + "A", // Ǎ 461 + "a", // ǎ 462 + "I", // Ǐ 463 + "i", // ǐ 464 + "O", // Ǒ 465 + "o", // ǒ 466 + "U", // Ǔ 467 + "u", // ǔ 468 + "U", // Ǖ 469 + "u", // ǖ 470 + "U", // Ǘ 471 + "u", // ǘ 472 + "U", // Ǚ 473 + "u", // ǚ 474 + "U", // Ǜ 475 + "u", // ǜ 476 + "ǝ", // ǝ 477 + "Ǟ", // Ǟ 478 + "ǟ", // ǟ 479 + "Ǡ", // Ǡ 480 + "ǡ", // ǡ 481 + "Ǣ", // Ǣ 482 + "ǣ", // ǣ 483 + "Ǥ", // Ǥ 484 + "ǥ", // ǥ 485 + "G", // Ǧ 486 + "g", // ǧ 487 + "Ǩ", // Ǩ 488 + "ǩ", // ǩ 489 + "O", // Ǫ 490 + "o", // ǫ 491 + "Ǭ", // Ǭ 492 + "ǭ", // ǭ 493 + "Ǯ", // Ǯ 494 + "e", // ǯ 495 + "j", // ǰ 496 + "DZ", // DZ 497 + "Dz", // Dz 498 + "dz", // dz 499 + "G", // Ǵ 500 + "g", // ǵ 501 + "Ƕ", // Ƕ 502 + "Ƿ", // Ƿ 503 + "N", // Ǹ 504 + "n", // ǹ 505 + "A", // Ǻ 506 + "a", // ǻ 507 + "AE", // Ǽ 508 + "ae", // ǽ 509 + "O", // Ǿ 510 + "o", // ǿ 511 + "Ȁ", // Ȁ 512 + "ȁ", // ȁ 513 + "Ȃ", // Ȃ 514 + "ȃ", // ȃ 515 + "Ȅ", // Ȅ 516 + "ȅ", // ȅ 517 + "Ȇ", // Ȇ 518 + "ȇ", // ȇ 519 + "Ȉ", // Ȉ 520 + "ȉ", // ȉ 521 + "Ȋ", // Ȋ 522 + "ȋ", // ȋ 523 + "Ȍ", // Ȍ 524 + "ȍ", // ȍ 525 + "Ȏ", // Ȏ 526 + "ȏ", // ȏ 527 + "Ȑ", // Ȑ 528 + "ȑ", // ȑ 529 + "Ȓ", // Ȓ 530 + "ȓ", // ȓ 531 + "Ȕ", // Ȕ 532 + "ȕ", // ȕ 533 + "Ȗ", // Ȗ 534 + "ȗ", // ȗ 535 + "S", // Ș 536 + "s", // ș 537 + "T", // Ț 538 + "t", // ț 539 + "Ȝ", // Ȝ 540 + "ȝ", // ȝ 541 + "Ȟ", // Ȟ 542 + "ȟ", // ȟ 543 + "Ƞ", // Ƞ 544 + "ȡ", // ȡ 545 + "Ȣ", // Ȣ 546 + "ȣ", // ȣ 547 + "Ȥ", // Ȥ 548 + "ȥ", // ȥ 549 + "Ȧ", // Ȧ 550 + "ȧ", // ȧ 551 + "Ȩ", // Ȩ 552 + "ȩ", // ȩ 553 + "Ȫ", // Ȫ 554 + "ȫ", // ȫ 555 + "Ȭ", // Ȭ 556 + "ȭ", // ȭ 557 + "Ȯ", // Ȯ 558 + "ȯ", // ȯ 559 + "Ȱ", // Ȱ 560 + "ȱ", // ȱ 561 + "Y", // Ȳ 562 + "y", // ȳ 563 + "ȴ", // ȴ 564 + "ȵ", // ȵ 565 + "ȶ", // ȶ 566 + "j", // ȷ 567 + "ȸ", // ȸ 568 + "ȹ", // ȹ 569 + "Ⱥ", // Ⱥ 570 + "Ȼ", // Ȼ 571 + "ȼ", // ȼ 572 + "L", // Ƚ 573 + "Ⱦ", // Ⱦ 574 + "ȿ", // ȿ 575 + "ɀ", // ɀ 576 + "Ɂ", // Ɂ 577 + "ɂ", // ɂ 578 + "Ƀ", // Ƀ 579 + "Ʉ", // Ʉ 580 + "Ʌ", // Ʌ 581 + "Ɇ", // Ɇ 582 + "ɇ", // ɇ 583 + "Ɉ", // Ɉ 584 + "ɉ", // ɉ 585 + "Ɋ", // Ɋ 586 + "ɋ", // ɋ 587 + "Ɍ", // Ɍ 588 + "ɍ", // ɍ 589 + "Ɏ", // Ɏ 590 + "ɏ", // ɏ 591 + "a", // ɐ 592 + "a", // ɑ 593 + "a", // ɒ 594 + "b", // ɓ 595 + "o", // ɔ 596 + "c", // ɕ 597 + "d", // ɖ 598 + "d", // ɗ 599 + "e", // ɘ 600 + "e", // ə 601 + "e", // ɚ 602 + "o", // ɛ 603 + "e", // ɜ 604 + "e", // ɝ 605 + "e", // ɞ 606 + "j", // ɟ 607 + "g", // ɠ 608 + "g", // ɡ 609 + "ɢ", // ɢ 610 + "g", // ɣ 611 + "ɤ", // ɤ 612 + "h", // ɥ 613 + "h", // ɦ 614 + "h", // ɧ 615 + "i", // ɨ 616 + "i", // ɩ 617 + "ɪ", // ɪ 618 + "l", // ɫ 619 + "l", // ɬ 620 + "l", // ɭ 621 + "le", // ɮ 622 + "m", // ɯ 623 + "m", // ɰ 624 + "m", // ɱ 625 + "n", // ɲ 626 + "n", // ɳ 627 + "ɴ", // ɴ 628 + "o", // ɵ 629 + "OE", // ɶ 630 + "ɷ", // ɷ 631 + "p", // ɸ 632 + "r", // ɹ 633 + "r", // ɺ 634 + "r", // ɻ 635 + "r", // ɼ 636 + "r", // ɽ 637 + "r", // ɾ 638 + "r", // ɿ 639 + "ʀ", // ʀ 640 + "R", // ʁ 641 + "s", // ʂ 642 + "s", // ʃ 643 + "j", // ʄ 644 + "s", // ʅ 645 + "s", // ʆ 646 + "t", // ʇ 647 + "t", // ʈ 648 + "u", // ʉ 649 + "u", // ʊ 650 + "v", // ʋ 651 + "v", // ʌ 652 + "w", // ʍ 653 + "y", // ʎ 654 + "ʏ", // ʏ 655 + "z", // ʐ 656 + "z", // ʑ 657 + "e", // ʒ 658 + "e", // ʓ 659 + "ʔ", // ʔ 660 + "ʕ", // ʕ 661 + "ʖ", // ʖ 662 + "C", // ʗ 663 + "o", // ʘ 664 + "ʙ", // ʙ 665 + "e", // ʚ 666 + "G", // ʛ 667 + "ʜ", // ʜ 668 + "j", // ʝ 669 + "k", // ʞ 670 + "ʟ", // ʟ 671 + "q", // ʠ 672 + "ʡ", // ʡ 673 + "ʢ", // ʢ 674 + "dz", // ʣ 675 + "de", // ʤ 676 + "dz", // ʥ 677 + "ts", // ʦ 678 + "ts", // ʧ 679 + "tc", // ʨ 680 + "fn", // ʩ 681 + "ls", // ʪ 682 + "lz", // ʫ 683 + "W", // ʬ 684 + "ʭ", // ʭ 685 + "h", // ʮ 686 + "h", // ʯ 687 +]; + +const TABLE_1: [&str; 246] = [ + "B", // Ḅ 7684 + "b", // ḅ 7685 + "Ḇ", // Ḇ 7686 + "ḇ", // ḇ 7687 + "Ḉ", // Ḉ 7688 + "ḉ", // ḉ 7689 + "Ḋ", // Ḋ 7690 + "ḋ", // ḋ 7691 + "D", // Ḍ 7692 + "d", // ḍ 7693 + "D", // Ḏ 7694 + "d", // ḏ 7695 + "Ḑ", // Ḑ 7696 + "ḑ", // ḑ 7697 + "D", // Ḓ 7698 + "d", // ḓ 7699 + "Ḕ", // Ḕ 7700 + "ḕ", // ḕ 7701 + "Ḗ", // Ḗ 7702 + "ḗ", // ḗ 7703 + "Ḙ", // Ḙ 7704 + "ḙ", // ḙ 7705 + "Ḛ", // Ḛ 7706 + "ḛ", // ḛ 7707 + "Ḝ", // Ḝ 7708 + "ḝ", // ḝ 7709 + "Ḟ", // Ḟ 7710 + "ḟ", // ḟ 7711 + "G", // Ḡ 7712 + "g", // ḡ 7713 + "Ḣ", // Ḣ 7714 + "ḣ", // ḣ 7715 + "H", // Ḥ 7716 + "h", // ḥ 7717 + "Ḧ", // Ḧ 7718 + "ḧ", // ḧ 7719 + "Ḩ", // Ḩ 7720 + "ḩ", // ḩ 7721 + "H", // Ḫ 7722 + "h", // ḫ 7723 + "Ḭ", // Ḭ 7724 + "ḭ", // ḭ 7725 + "Ḯ", // Ḯ 7726 + "ḯ", // ḯ 7727 + "Ḱ", // Ḱ 7728 + "ḱ", // ḱ 7729 + "K", // Ḳ 7730 + "k", // ḳ 7731 + "K", // Ḵ 7732 + "k", // ḵ 7733 + "L", // Ḷ 7734 + "l", // ḷ 7735 + "L", // Ḹ 7736 + "l", // ḹ 7737 + "L", // Ḻ 7738 + "l", // ḻ 7739 + "L", // Ḽ 7740 + "l", // ḽ 7741 + "M", // Ḿ 7742 + "m", // ḿ 7743 + "M", // Ṁ 7744 + "m", // ṁ 7745 + "M", // Ṃ 7746 + "m", // ṃ 7747 + "N", // Ṅ 7748 + "n", // ṅ 7749 + "N", // Ṇ 7750 + "n", // ṇ 7751 + "N", // Ṉ 7752 + "n", // ṉ 7753 + "N", // Ṋ 7754 + "n", // ṋ 7755 + "Ṍ", // Ṍ 7756 + "ṍ", // ṍ 7757 + "Ṏ", // Ṏ 7758 + "ṏ", // ṏ 7759 + "Ṑ", // Ṑ 7760 + "ṑ", // ṑ 7761 + "Ṓ", // Ṓ 7762 + "ṓ", // ṓ 7763 + "Ṕ", // Ṕ 7764 + "ṕ", // ṕ 7765 + "Ṗ", // Ṗ 7766 + "ṗ", // ṗ 7767 + "R", // Ṙ 7768 + "r", // ṙ 7769 + "R", // Ṛ 7770 + "r", // ṛ 7771 + "R", // Ṝ 7772 + "r", // ṝ 7773 + "R", // Ṟ 7774 + "r", // ṟ 7775 + "S", // Ṡ 7776 + "s", // ṡ 7777 + "S", // Ṣ 7778 + "s", // ṣ 7779 + "Ṥ", // Ṥ 7780 + "ṥ", // ṥ 7781 + "Ṧ", // Ṧ 7782 + "ṧ", // ṧ 7783 + "Ṩ", // Ṩ 7784 + "ṩ", // ṩ 7785 + "Ṫ", // Ṫ 7786 + "ṫ", // ṫ 7787 + "T", // Ṭ 7788 + "t", // ṭ 7789 + "T", // Ṯ 7790 + "t", // ṯ 7791 + "T", // Ṱ 7792 + "t", // ṱ 7793 + "Ṳ", // Ṳ 7794 + "ṳ", // ṳ 7795 + "Ṵ", // Ṵ 7796 + "ṵ", // ṵ 7797 + "Ṷ", // Ṷ 7798 + "ṷ", // ṷ 7799 + "Ṹ", // Ṹ 7800 + "ṹ", // ṹ 7801 + "Ṻ", // Ṻ 7802 + "ṻ", // ṻ 7803 + "Ṽ", // Ṽ 7804 + "ṽ", // ṽ 7805 + "Ṿ", // Ṿ 7806 + "ṿ", // ṿ 7807 + "W", // Ẁ 7808 + "w", // ẁ 7809 + "W", // Ẃ 7810 + "w", // ẃ 7811 + "W", // Ẅ 7812 + "w", // ẅ 7813 + "Ẇ", // Ẇ 7814 + "ẇ", // ẇ 7815 + "Ẉ", // Ẉ 7816 + "ẉ", // ẉ 7817 + "Ẋ", // Ẋ 7818 + "ẋ", // ẋ 7819 + "Ẍ", // Ẍ 7820 + "ẍ", // ẍ 7821 + "Y", // Ẏ 7822 + "y", // ẏ 7823 + "Ẑ", // Ẑ 7824 + "ẑ", // ẑ 7825 + "Z", // Ẓ 7826 + "z", // ẓ 7827 + "Z", // Ẕ 7828 + "z", // ẕ 7829 + "h", // ẖ 7830 + "t", // ẗ 7831 + "ẘ", // ẘ 7832 + "ẙ", // ẙ 7833 + "ẚ", // ẚ 7834 + "ẛ", // ẛ 7835 + "ẜ", // ẜ 7836 + "ẝ", // ẝ 7837 + "SS", // ẞ 7838 + "ẟ", // ẟ 7839 + "A", // Ạ 7840 + "a", // ạ 7841 + "A", // Ả 7842 + "a", // ả 7843 + "A", // Ấ 7844 + "a", // ấ 7845 + "A", // Ầ 7846 + "a", // ầ 7847 + "A", // Ẩ 7848 + "a", // ẩ 7849 + "A", // Ẫ 7850 + "a", // ẫ 7851 + "A", // Ậ 7852 + "a", // ậ 7853 + "A", // Ắ 7854 + "a", // ắ 7855 + "A", // Ằ 7856 + "a", // ằ 7857 + "A", // Ẳ 7858 + "a", // ẳ 7859 + "A", // Ẵ 7860 + "a", // ẵ 7861 + "A", // Ặ 7862 + "a", // ặ 7863 + "E", // Ẹ 7864 + "e", // ẹ 7865 + "E", // Ẻ 7866 + "e", // ẻ 7867 + "E", // Ẽ 7868 + "e", // ẽ 7869 + "E", // Ế 7870 + "e", // ế 7871 + "E", // Ề 7872 + "e", // ề 7873 + "E", // Ể 7874 + "e", // ể 7875 + "E", // Ễ 7876 + "e", // ễ 7877 + "E", // Ệ 7878 + "e", // ệ 7879 + "I", // Ỉ 7880 + "i", // ỉ 7881 + "I", // Ị 7882 + "i", // ị 7883 + "O", // Ọ 7884 + "o", // ọ 7885 + "O", // Ỏ 7886 + "o", // ỏ 7887 + "O", // Ố 7888 + "o", // ố 7889 + "O", // Ồ 7890 + "o", // ồ 7891 + "O", // Ổ 7892 + "o", // ổ 7893 + "O", // Ỗ 7894 + "o", // ỗ 7895 + "O", // Ộ 7896 + "o", // ộ 7897 + "O", // Ớ 7898 + "o", // ớ 7899 + "O", // Ờ 7900 + "o", // ờ 7901 + "O", // Ở 7902 + "o", // ở 7903 + "O", // Ỡ 7904 + "o", // ỡ 7905 + "O", // Ợ 7906 + "o", // ợ 7907 + "U", // Ụ 7908 + "u", // ụ 7909 + "U", // Ủ 7910 + "u", // ủ 7911 + "U", // Ứ 7912 + "u", // ứ 7913 + "U", // Ừ 7914 + "u", // ừ 7915 + "U", // Ử 7916 + "u", // ử 7917 + "U", // Ữ 7918 + "u", // ữ 7919 + "U", // Ự 7920 + "u", // ự 7921 + "Y", // Ỳ 7922 + "y", // ỳ 7923 + "Y", // Ỵ 7924 + "y", // ỵ 7925 + "Y", // Ỷ 7926 + "y", // ỷ 7927 + "Y", // Ỹ 7928 + "y", // ỹ 7929 +]; + +const TABLE_2: [&str; 2] = [ + "fi", // fi 64257 + "fl", // fl 64258 +]; + +#[inline(always)] +pub(super) fn lookup(c: char) -> Option<&'static str> { + match c as u16 { + 192..=687 => unsafe { Some(TABLE_0.get_unchecked((c as u16 - 192) as usize)) }, + 7684..=7929 => unsafe { Some(TABLE_1.get_unchecked((c as u16 - 7684) as usize)) }, + 64257..=64258 => unsafe { Some(TABLE_2.get_unchecked((c as u16 - 64257) as usize)) }, + _ => None, + } +} diff --git a/yazi-shared/src/transliterate/traits.rs b/yazi-shared/src/transliterate/traits.rs new file mode 100644 index 00000000..3f862e48 --- /dev/null +++ b/yazi-shared/src/transliterate/traits.rs @@ -0,0 +1,69 @@ +use core::str; +use std::borrow::Cow; + +pub trait Transliterator { + fn transliterate(&self) -> Cow; +} + +impl Transliterator for &[u8] { + fn transliterate(&self) -> Cow { + // Fast path to skip over ASCII chars at the beginning of the string + let ascii_len = self.iter().take_while(|&&c| c < 0x7f).count(); + if ascii_len >= self.len() { + return Cow::Borrowed(unsafe { str::from_utf8_unchecked(self) }); + } + + let (ascii, rest) = self.split_at(ascii_len); + let ascii = unsafe { str::from_utf8_unchecked(ascii) }; + + // Reserve a bit more space to avoid reallocations on longer transliterations + // but instead of `+ 16` uses `| 15` to stay in the smallest allocation bucket + // for short strings + let mut out = String::new(); + out.try_reserve_exact(self.len() | 15).unwrap_or_else(|_| panic!()); + out.push_str(ascii); + + for c in String::from_utf8_lossy(rest).chars() { + if let Some(s) = super::lookup(c) { + out.push_str(s); + } else { + out.push(c); + } + } + Cow::Owned(out) + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_transliterate() { + assert_eq!("Æcœ".as_bytes().transliterate(), "AEcoe"); + assert_eq!( + "ěřůøĉĝĥĵŝŭèùÿėįųāēīūļķņģőűëïąćęłńśźżõșțčďĺľňŕšťýžéíñóúüåäöçîşûğăâđêôơưáàãảạ" + .as_bytes() + .transliterate(), + "eruocghjsueuyeiuaeiulkngoueiacelnszzostcdllnrstyzeinouuaaocisugaadeoouaaaaa", + ); + assert_eq!( + "áạàảãăắặằẳẵâấậầẩẫéẹèẻẽêếệềểễiíịìỉĩoóọòỏõôốộồổỗơớợờởỡúụùủũưứựừửữyýỵỳỷỹđ" + .as_bytes() + .transliterate(), + "aaaaaaaaaaaaaaaaaeeeeeeeeeeeiiiiiioooooooooooooooooouuuuuuuuuuuyyyyyyd", + ); + assert_ne!( + "ěřůøĉĝĥĵŝŭèùÿėįųāēīūļķņģőűëïąćęłńśźżõșțčďĺľňŕšťýžéíñóúüåäöçîşûğăâđêôơưáàãảạfifl" + .as_bytes() + .transliterate(), + "ěřůøĉĝĥĵŝŭèùÿėįųāēīūļķņģőűëïąćęłńśźżõșțčďĺľňŕšťýžéíñóúüåäöçîşûğăâđêôơưáàãảạfifl" + ); + assert_eq!( + "THEQUICKBROWNFOXJUMPEDOVERTHELAZYDOGthequickbrownfoxjumpedoverthelazydog" + .as_bytes() + .transliterate(), + "THEQUICKBROWNFOXJUMPEDOVERTHELAZYDOGthequickbrownfoxjumpedoverthelazydog" + ); + } +}