mirror of
https://github.com/sxyazi/yazi.git
synced 2026-07-25 08:41:05 +00:00
feat!: transliteration option for natural sorting (#1053)
Co-authored-by: sxyazi <sxyazi@gmail.com>
This commit is contained in:
parent
061faea1c5
commit
1ab3df6850
18 changed files with 909 additions and 59 deletions
|
|
@ -1 +1 @@
|
||||||
{"words":["Punct","KEYMAP","splitn","crossterm","YAZI","unar","peekable","ratatui","syntect","pbpaste","pbcopy","ffmpegthumbnailer","oneshot","Posix","Lsar","XADDOS","zoxide","cands","Deque","precache","imageops","IFBLK","IFCHR","IFDIR","IFIFO","IFLNK","IFMT","IFSOCK","IRGRP","IROTH","IRUSR","ISGID","ISUID","ISVTX","IWGRP","IWOTH","IWUSR","IXGRP","IXOTH","IXUSR","libc","winsize","TIOCGWINSZ","xpixel","ypixel","ioerr","appender","Catppuccin","macchiato","gitmodules","Dotfiles","bashprofile","vimrc","flac","webp","exiftool","mediainfo","ripgrep","nvim","indexmap","indexmap","unwatch","canonicalize","serde","fsevent","Ueberzug","iterm","wezterm","sixel","chafa","ueberzugpp","️ Überzug","️ Überzug","Konsole","Alacritty","Überzug","pkgs","paru","unarchiver","pdftoppm","poppler","prebuild","singlefile","jpegopt","EXIF","rustfmt","mktemp","nanos","xclip","xsel","natord","Mintty","nixos","nixpkgs","SIGTSTP","SIGCONT","SIGCONT","mlua","nonstatic","userdata","metatable","natsort","backstack","luajit","Succ","Succ","cand","fileencoding","foldmethod","lightgreen","darkgray","lightred","lightyellow","lightcyan","nushell","msvc","aarch","linemode","sxyazi","rsplit","ZELLIJ","bitflags","bitflags","USERPROFILE","Neovim","vergen","gitcl","Renderable","preloaders","prec","imagesize","Upserting","prio","Ghostty","Catmull","Lanczos","cmds","unyank","scrolloff","headsup","unsub","uzers","scopeguard","SPDLOG","globset","filetime","magick","magick","prefetcher","Prework","prefetchers","PREWORKERS","conds"],"language":"en","version":"0.2","flagWords":[]}
|
{"words":["Punct","KEYMAP","splitn","crossterm","YAZI","unar","peekable","ratatui","syntect","pbpaste","pbcopy","ffmpegthumbnailer","oneshot","Posix","Lsar","XADDOS","zoxide","cands","Deque","precache","imageops","IFBLK","IFCHR","IFDIR","IFIFO","IFLNK","IFMT","IFSOCK","IRGRP","IROTH","IRUSR","ISGID","ISUID","ISVTX","IWGRP","IWOTH","IWUSR","IXGRP","IXOTH","IXUSR","libc","winsize","TIOCGWINSZ","xpixel","ypixel","ioerr","appender","Catppuccin","macchiato","gitmodules","Dotfiles","bashprofile","vimrc","flac","webp","exiftool","mediainfo","ripgrep","nvim","indexmap","indexmap","unwatch","canonicalize","serde","fsevent","Ueberzug","iterm","wezterm","sixel","chafa","ueberzugpp","️ Überzug","️ Überzug","Konsole","Alacritty","Überzug","pkgs","paru","unarchiver","pdftoppm","poppler","prebuild","singlefile","jpegopt","EXIF","rustfmt","mktemp","nanos","xclip","xsel","natord","Mintty","nixos","nixpkgs","SIGTSTP","SIGCONT","SIGCONT","mlua","nonstatic","userdata","metatable","natsort","backstack","luajit","Succ","Succ","cand","fileencoding","foldmethod","lightgreen","darkgray","lightred","lightyellow","lightcyan","nushell","msvc","aarch","linemode","sxyazi","rsplit","ZELLIJ","bitflags","bitflags","USERPROFILE","Neovim","vergen","gitcl","Renderable","preloaders","prec","imagesize","Upserting","prio","Ghostty","Catmull","Lanczos","cmds","unyank","scrolloff","headsup","unsub","uzers","scopeguard","SPDLOG","globset","filetime","magick","magick","prefetcher","Prework","prefetchers","PREWORKERS","conds","translit"],"version":"0.2","flagWords":[],"language":"en"}
|
||||||
|
|
@ -106,18 +106,18 @@ keymap = [
|
||||||
{ on = [ "N" ], run = "find_arrow --previous", desc = "Go to previous found file" },
|
{ on = [ "N" ], run = "find_arrow --previous", desc = "Go to previous found file" },
|
||||||
|
|
||||||
# Sorting
|
# Sorting
|
||||||
{ on = [ ",", "m" ], run = "sort modified --dir-first", desc = "Sort by modified time" },
|
{ on = [ ",", "m" ], run = "sort modified --reverse=no", desc = "Sort by modified time" },
|
||||||
{ on = [ ",", "M" ], run = "sort modified --reverse --dir-first", desc = "Sort by modified time (reverse)" },
|
{ on = [ ",", "M" ], run = "sort modified --reverse", desc = "Sort by modified time (reverse)" },
|
||||||
{ on = [ ",", "c" ], run = "sort created --dir-first", desc = "Sort by created time" },
|
{ on = [ ",", "c" ], run = "sort created --reverse=no", desc = "Sort by created time" },
|
||||||
{ on = [ ",", "C" ], run = "sort created --reverse --dir-first", desc = "Sort by created time (reverse)" },
|
{ on = [ ",", "C" ], run = "sort created --reverse", desc = "Sort by created time (reverse)" },
|
||||||
{ on = [ ",", "e" ], run = "sort extension --dir-first", desc = "Sort by extension" },
|
{ on = [ ",", "e" ], run = "sort extension --reverse=no", desc = "Sort by extension" },
|
||||||
{ on = [ ",", "E" ], run = "sort extension --reverse --dir-first", desc = "Sort by extension (reverse)" },
|
{ on = [ ",", "E" ], run = "sort extension --reverse", desc = "Sort by extension (reverse)" },
|
||||||
{ on = [ ",", "a" ], run = "sort alphabetical --dir-first", desc = "Sort alphabetically" },
|
{ on = [ ",", "a" ], run = "sort alphabetical --reverse=no", desc = "Sort alphabetically" },
|
||||||
{ on = [ ",", "A" ], run = "sort alphabetical --reverse --dir-first", desc = "Sort alphabetically (reverse)" },
|
{ on = [ ",", "A" ], run = "sort alphabetical --reverse", desc = "Sort alphabetically (reverse)" },
|
||||||
{ on = [ ",", "n" ], run = "sort natural --dir-first", desc = "Sort naturally" },
|
{ on = [ ",", "n" ], run = "sort natural --reverse=no", desc = "Sort naturally" },
|
||||||
{ on = [ ",", "N" ], run = "sort natural --reverse --dir-first", desc = "Sort naturally (reverse)" },
|
{ on = [ ",", "N" ], run = "sort natural --reverse", desc = "Sort naturally (reverse)" },
|
||||||
{ on = [ ",", "s" ], run = "sort size --dir-first", desc = "Sort by size" },
|
{ on = [ ",", "s" ], run = "sort size --reverse=no", desc = "Sort by size" },
|
||||||
{ on = [ ",", "S" ], run = "sort size --reverse --dir-first", desc = "Sort by size (reverse)" },
|
{ on = [ ",", "S" ], run = "sort size --reverse", desc = "Sort by size (reverse)" },
|
||||||
|
|
||||||
# Tabs
|
# Tabs
|
||||||
{ on = [ "t" ], run = "tab_create --current", desc = "Create a new tab using the current path" },
|
{ on = [ "t" ], run = "tab_create --current", desc = "Create a new tab using the current path" },
|
||||||
|
|
|
||||||
|
|
@ -6,8 +6,9 @@
|
||||||
ratio = [ 1, 4, 3 ]
|
ratio = [ 1, 4, 3 ]
|
||||||
sort_by = "alphabetical"
|
sort_by = "alphabetical"
|
||||||
sort_sensitive = false
|
sort_sensitive = false
|
||||||
sort_reverse = false
|
sort_reverse = false
|
||||||
sort_dir_first = true
|
sort_dir_first = true
|
||||||
|
sort_translit = false
|
||||||
linemode = "none"
|
linemode = "none"
|
||||||
show_hidden = false
|
show_hidden = false
|
||||||
show_symlink = true
|
show_symlink = true
|
||||||
|
|
@ -185,9 +186,10 @@ open_origin = "hovered"
|
||||||
open_offset = [ 0, 1, 50, 7 ]
|
open_offset = [ 0, 1, 50, 7 ]
|
||||||
|
|
||||||
[which]
|
[which]
|
||||||
sort_by = "none"
|
sort_by = "none"
|
||||||
sort_sensitive = false
|
sort_sensitive = false
|
||||||
sort_reverse = false
|
sort_reverse = false
|
||||||
|
sort_translit = false
|
||||||
|
|
||||||
[log]
|
[log]
|
||||||
enabled = false
|
enabled = false
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,8 @@
|
||||||
use std::{fmt, mem};
|
use std::{fmt, str::FromStr};
|
||||||
|
|
||||||
use anyhow::{bail, Result};
|
use anyhow::Result;
|
||||||
use serde::{de::{self, Visitor}, Deserializer};
|
use serde::{de::{self, Visitor}, Deserializer};
|
||||||
use yazi_shared::event::{Cmd, Data};
|
use yazi_shared::event::Cmd;
|
||||||
|
|
||||||
pub(super) fn run_deserialize<'de, D>(deserializer: D) -> Result<Vec<Cmd>, D::Error>
|
pub(super) fn run_deserialize<'de, D>(deserializer: D) -> Result<Vec<Cmd>, D::Error>
|
||||||
where
|
where
|
||||||
|
|
@ -10,33 +10,6 @@ where
|
||||||
{
|
{
|
||||||
struct RunVisitor;
|
struct RunVisitor;
|
||||||
|
|
||||||
#[allow(clippy::explicit_counter_loop)]
|
|
||||||
fn parse(s: &str) -> Result<Cmd> {
|
|
||||||
let mut args = shell_words::split(s)?;
|
|
||||||
let mut cmd = Cmd { name: mem::take(&mut args[0]), ..Default::default() };
|
|
||||||
|
|
||||||
let mut i = 0usize;
|
|
||||||
for arg in args.into_iter().skip(1) {
|
|
||||||
let Some(arg) = arg.strip_prefix("--") else {
|
|
||||||
cmd.args.insert(i.to_string(), Data::String(arg));
|
|
||||||
i += 1;
|
|
||||||
continue;
|
|
||||||
};
|
|
||||||
|
|
||||||
let mut parts = arg.splitn(2, '=');
|
|
||||||
let Some(key) = parts.next().map(|s| s.to_owned()) else {
|
|
||||||
bail!("invalid argument: {arg}");
|
|
||||||
};
|
|
||||||
|
|
||||||
if let Some(val) = parts.next() {
|
|
||||||
cmd.args.insert(key, Data::String(val.to_owned()));
|
|
||||||
} else {
|
|
||||||
cmd.args.insert(key, Data::Boolean(true));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Ok(cmd)
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<'de> Visitor<'de> for RunVisitor {
|
impl<'de> Visitor<'de> for RunVisitor {
|
||||||
type Value = Vec<Cmd>;
|
type Value = Vec<Cmd>;
|
||||||
|
|
||||||
|
|
@ -50,7 +23,7 @@ where
|
||||||
{
|
{
|
||||||
let mut cmds = vec![];
|
let mut cmds = vec![];
|
||||||
while let Some(value) = &seq.next_element::<String>()? {
|
while let Some(value) = &seq.next_element::<String>()? {
|
||||||
cmds.push(parse(value).map_err(de::Error::custom)?);
|
cmds.push(Cmd::from_str(value).map_err(de::Error::custom)?);
|
||||||
}
|
}
|
||||||
if cmds.is_empty() {
|
if cmds.is_empty() {
|
||||||
return Err(de::Error::custom("`run` within keymap.toml cannot be empty"));
|
return Err(de::Error::custom("`run` within keymap.toml cannot be empty"));
|
||||||
|
|
@ -62,7 +35,7 @@ where
|
||||||
where
|
where
|
||||||
E: de::Error,
|
E: de::Error,
|
||||||
{
|
{
|
||||||
Ok(vec![parse(value).map_err(de::Error::custom)?])
|
Ok(vec![Cmd::from_str(value).map_err(de::Error::custom)?])
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -13,6 +13,7 @@ pub struct Manager {
|
||||||
pub sort_sensitive: bool,
|
pub sort_sensitive: bool,
|
||||||
pub sort_reverse: bool,
|
pub sort_reverse: bool,
|
||||||
pub sort_dir_first: bool,
|
pub sort_dir_first: bool,
|
||||||
|
pub sort_translit: bool,
|
||||||
|
|
||||||
// Display
|
// Display
|
||||||
#[validate(length(min = 1, max = 20, message = "must be between 1 and 20 characters"))]
|
#[validate(length(min = 1, max = 20, message = "must be between 1 and 20 characters"))]
|
||||||
|
|
|
||||||
|
|
@ -10,6 +10,7 @@ pub struct Which {
|
||||||
pub sort_by: SortBy,
|
pub sort_by: SortBy,
|
||||||
pub sort_sensitive: bool,
|
pub sort_sensitive: bool,
|
||||||
pub sort_reverse: bool,
|
pub sort_reverse: bool,
|
||||||
|
pub sort_translit: bool,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Default for Which {
|
impl Default for Which {
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
use std::{cmp::Ordering, collections::HashMap, mem};
|
use std::{cmp::Ordering, collections::HashMap, mem};
|
||||||
|
|
||||||
use yazi_config::manager::SortBy;
|
use yazi_config::manager::SortBy;
|
||||||
use yazi_shared::{fs::{File, Url}, natsort};
|
use yazi_shared::{fs::{File, Url}, natsort, Transliterator};
|
||||||
|
|
||||||
#[derive(Clone, Copy, Default, PartialEq)]
|
#[derive(Clone, Copy, Default, PartialEq)]
|
||||||
pub struct FilesSorter {
|
pub struct FilesSorter {
|
||||||
|
|
@ -9,6 +9,7 @@ pub struct FilesSorter {
|
||||||
pub sensitive: bool,
|
pub sensitive: bool,
|
||||||
pub reverse: bool,
|
pub reverse: bool,
|
||||||
pub dir_first: bool,
|
pub dir_first: bool,
|
||||||
|
pub translit: bool,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl FilesSorter {
|
impl FilesSorter {
|
||||||
|
|
@ -76,7 +77,16 @@ impl FilesSorter {
|
||||||
return promote;
|
return promote;
|
||||||
}
|
}
|
||||||
|
|
||||||
let ordering = natsort(entities[a], entities[b], !self.sensitive);
|
let ordering = if !self.translit {
|
||||||
|
natsort(entities[a], entities[b], !self.sensitive)
|
||||||
|
} else {
|
||||||
|
natsort(
|
||||||
|
entities[a].transliterate().as_bytes(),
|
||||||
|
entities[b].transliterate().as_bytes(),
|
||||||
|
!self.sensitive,
|
||||||
|
)
|
||||||
|
};
|
||||||
|
|
||||||
if self.reverse { ordering.reverse() } else { ordering }
|
if self.reverse { ordering.reverse() } else { ordering }
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -8,12 +8,15 @@ use crate::{tab::Tab, tasks::Tasks};
|
||||||
|
|
||||||
impl Tab {
|
impl Tab {
|
||||||
pub fn sort(&mut self, mut c: Cmd, tasks: &Tasks) {
|
pub fn sort(&mut self, mut c: Cmd, tasks: &Tasks) {
|
||||||
|
let conf = &mut self.conf;
|
||||||
if let Some(by) = c.take_first_str() {
|
if let Some(by) = c.take_first_str() {
|
||||||
self.conf.sort_by = SortBy::from_str(&by).unwrap_or_default();
|
conf.sort_by = SortBy::from_str(&by).unwrap_or_default();
|
||||||
}
|
}
|
||||||
self.conf.sort_sensitive = c.bool("sensitive");
|
|
||||||
self.conf.sort_reverse = c.bool("reverse");
|
conf.sort_reverse = c.maybe_bool("reverse").unwrap_or(conf.sort_reverse);
|
||||||
self.conf.sort_dir_first = c.bool("dir-first");
|
conf.sort_dir_first = c.maybe_bool("dir-first").unwrap_or(conf.sort_dir_first);
|
||||||
|
conf.sort_sensitive = c.maybe_bool("sensitive").unwrap_or(conf.sort_sensitive);
|
||||||
|
conf.sort_translit = c.maybe_bool("translit").unwrap_or(conf.sort_translit);
|
||||||
|
|
||||||
self.apply_files_attrs();
|
self.apply_files_attrs();
|
||||||
ManagerProxy::update_paged();
|
ManagerProxy::update_paged();
|
||||||
|
|
|
||||||
|
|
@ -9,6 +9,7 @@ pub struct Config {
|
||||||
pub sort_sensitive: bool,
|
pub sort_sensitive: bool,
|
||||||
pub sort_reverse: bool,
|
pub sort_reverse: bool,
|
||||||
pub sort_dir_first: bool,
|
pub sort_dir_first: bool,
|
||||||
|
pub sort_translit: bool,
|
||||||
|
|
||||||
// Display
|
// Display
|
||||||
pub linemode: String,
|
pub linemode: String,
|
||||||
|
|
@ -23,6 +24,7 @@ impl Default for Config {
|
||||||
sort_sensitive: MANAGER.sort_sensitive,
|
sort_sensitive: MANAGER.sort_sensitive,
|
||||||
sort_reverse: MANAGER.sort_reverse,
|
sort_reverse: MANAGER.sort_reverse,
|
||||||
sort_dir_first: MANAGER.sort_dir_first,
|
sort_dir_first: MANAGER.sort_dir_first,
|
||||||
|
sort_translit: MANAGER.sort_translit,
|
||||||
|
|
||||||
// Display
|
// Display
|
||||||
linemode: MANAGER.linemode.to_owned(),
|
linemode: MANAGER.linemode.to_owned(),
|
||||||
|
|
@ -45,6 +47,7 @@ impl Config {
|
||||||
sensitive: self.sort_sensitive,
|
sensitive: self.sort_sensitive,
|
||||||
reverse: self.sort_reverse,
|
reverse: self.sort_reverse,
|
||||||
dir_first: self.sort_dir_first,
|
dir_first: self.sort_dir_first,
|
||||||
|
translit: self.sort_translit,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,13 +1,14 @@
|
||||||
use std::{borrow::Cow, mem};
|
use std::{borrow::Cow, mem};
|
||||||
|
|
||||||
use yazi_config::{keymap::ControlCow, which::SortBy, WHICH};
|
use yazi_config::{keymap::ControlCow, which::SortBy, WHICH};
|
||||||
use yazi_shared::natsort;
|
use yazi_shared::{natsort, Transliterator};
|
||||||
|
|
||||||
#[derive(Clone, Copy, PartialEq)]
|
#[derive(Clone, Copy, PartialEq)]
|
||||||
pub struct WhichSorter {
|
pub struct WhichSorter {
|
||||||
pub by: SortBy,
|
pub by: SortBy,
|
||||||
pub sensitive: bool,
|
pub sensitive: bool,
|
||||||
pub reverse: bool,
|
pub reverse: bool,
|
||||||
|
pub translit: bool,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Default for WhichSorter {
|
impl Default for WhichSorter {
|
||||||
|
|
@ -16,6 +17,7 @@ impl Default for WhichSorter {
|
||||||
by: WHICH.sort_by,
|
by: WHICH.sort_by,
|
||||||
sensitive: WHICH.sort_sensitive,
|
sensitive: WHICH.sort_sensitive,
|
||||||
reverse: WHICH.sort_reverse,
|
reverse: WHICH.sort_reverse,
|
||||||
|
translit: WHICH.sort_translit,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -38,7 +40,16 @@ impl WhichSorter {
|
||||||
}
|
}
|
||||||
|
|
||||||
indices.sort_unstable_by(|&a, &b| {
|
indices.sort_unstable_by(|&a, &b| {
|
||||||
let ordering = natsort(entities[a].as_bytes(), entities[b].as_bytes(), !self.sensitive);
|
let ordering = if !self.translit {
|
||||||
|
natsort(entities[a].as_bytes(), entities[b].as_bytes(), !self.sensitive)
|
||||||
|
} else {
|
||||||
|
natsort(
|
||||||
|
entities[a].as_bytes().transliterate().as_bytes(),
|
||||||
|
entities[b].as_bytes().transliterate().as_bytes(),
|
||||||
|
!self.sensitive,
|
||||||
|
)
|
||||||
|
};
|
||||||
|
|
||||||
if self.reverse { ordering.reverse() } else { ordering }
|
if self.reverse { ordering.reverse() } else { ordering }
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -26,6 +26,7 @@ impl Config {
|
||||||
reg.add_field_method_get("sort_sensitive", |_, me| Ok(me.sort_sensitive));
|
reg.add_field_method_get("sort_sensitive", |_, me| Ok(me.sort_sensitive));
|
||||||
reg.add_field_method_get("sort_reverse", |_, me| Ok(me.sort_reverse));
|
reg.add_field_method_get("sort_reverse", |_, me| Ok(me.sort_reverse));
|
||||||
reg.add_field_method_get("sort_dir_first", |_, me| Ok(me.sort_dir_first));
|
reg.add_field_method_get("sort_dir_first", |_, me| Ok(me.sort_dir_first));
|
||||||
|
reg.add_field_method_get("sort_translit", |_, me| Ok(me.sort_translit));
|
||||||
|
|
||||||
reg.add_field_method_get("linemode", |_, me| Ok(me.linemode.to_owned()));
|
reg.add_field_method_get("linemode", |_, me| Ok(me.linemode.to_owned()));
|
||||||
reg.add_field_method_get("show_hidden", |_, me| Ok(me.show_hidden));
|
reg.add_field_method_get("show_hidden", |_, me| Ok(me.show_hidden));
|
||||||
|
|
|
||||||
|
|
@ -60,6 +60,11 @@ impl Cmd {
|
||||||
self.args.get(name).and_then(Data::as_bool).unwrap_or(false)
|
self.args.get(name).and_then(Data::as_bool).unwrap_or(false)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[inline]
|
||||||
|
pub fn maybe_bool(&self, name: &str) -> Option<bool> {
|
||||||
|
self.args.get(name).and_then(Data::as_bool)
|
||||||
|
}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn first(&self) -> Option<&Data> { self.args.get("0") }
|
pub fn first(&self) -> Option<&Data> { self.args.get("0") }
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -25,6 +25,8 @@ impl Data {
|
||||||
pub fn as_bool(&self) -> Option<bool> {
|
pub fn as_bool(&self) -> Option<bool> {
|
||||||
match self {
|
match self {
|
||||||
Self::Boolean(b) => Some(*b),
|
Self::Boolean(b) => Some(*b),
|
||||||
|
Self::String(s) if s == "no" => Some(false),
|
||||||
|
Self::String(s) if s == "yes" => Some(true),
|
||||||
_ => None,
|
_ => None,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -16,6 +16,7 @@ pub mod term;
|
||||||
pub mod theme;
|
pub mod theme;
|
||||||
mod throttle;
|
mod throttle;
|
||||||
mod time;
|
mod time;
|
||||||
|
mod translit;
|
||||||
mod xdg;
|
mod xdg;
|
||||||
|
|
||||||
pub use chars::*;
|
pub use chars::*;
|
||||||
|
|
@ -31,6 +32,7 @@ pub use os::*;
|
||||||
pub use ro_cell::*;
|
pub use ro_cell::*;
|
||||||
pub use throttle::*;
|
pub use throttle::*;
|
||||||
pub use time::*;
|
pub use time::*;
|
||||||
|
pub use translit::*;
|
||||||
pub use xdg::*;
|
pub use xdg::*;
|
||||||
|
|
||||||
pub fn init() { event::Event::init(); }
|
pub fn init() { event::Event::init(); }
|
||||||
|
|
|
||||||
|
|
@ -135,12 +135,12 @@ mod tests {
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_natsort() {
|
fn test_natsort() {
|
||||||
let dates = vec!["1999-3-3", "1999-12-25", "2000-1-2", "2000-1-10", "2000-3-23"];
|
let dates = ["1999-3-3", "1999-12-25", "2000-1-2", "2000-1-10", "2000-3-23"];
|
||||||
let fractions = vec![
|
let fractions = [
|
||||||
"1.002.01", "1.002.03", "1.002.08", "1.009.02", "1.009.10", "1.009.20", "1.010.12",
|
"1.002.01", "1.002.03", "1.002.08", "1.009.02", "1.009.10", "1.009.20", "1.010.12",
|
||||||
"1.011.02",
|
"1.011.02",
|
||||||
];
|
];
|
||||||
let words = vec![
|
let words = [
|
||||||
"1-02",
|
"1-02",
|
||||||
"1-2",
|
"1-2",
|
||||||
"1-20",
|
"1-20",
|
||||||
|
|
|
||||||
5
yazi-shared/src/translit/mod.rs
Normal file
5
yazi-shared/src/translit/mod.rs
Normal file
|
|
@ -0,0 +1,5 @@
|
||||||
|
mod table;
|
||||||
|
mod traits;
|
||||||
|
|
||||||
|
use table::*;
|
||||||
|
pub use traits::*;
|
||||||
762
yazi-shared/src/translit/table.rs
Normal file
762
yazi-shared/src/translit/table.rs
Normal file
|
|
@ -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,
|
||||||
|
}
|
||||||
|
}
|
||||||
69
yazi-shared/src/translit/traits.rs
Normal file
69
yazi-shared/src/translit/traits.rs
Normal file
|
|
@ -0,0 +1,69 @@
|
||||||
|
use core::str;
|
||||||
|
use std::borrow::Cow;
|
||||||
|
|
||||||
|
pub trait Transliterator {
|
||||||
|
fn transliterate(&self) -> Cow<str>;
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Transliterator for &[u8] {
|
||||||
|
fn transliterate(&self) -> Cow<str> {
|
||||||
|
// 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"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Add table
Reference in a new issue