Skip to content

Commit e7ed536

Browse files
committed
Feat: text (#1)
1 parent 174c277 commit e7ed536

File tree

5 files changed

+224
-0
lines changed

5 files changed

+224
-0
lines changed

Cargo.lock

+7
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

+3
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ pathfinding = { version = "4.2.1", optional = true }
5858
num = { version = "0.4.0", optional = true }
5959
dmi = { version = "0.3.0", optional = true }
6060
workerpool = "1.2.0"
61+
translit = { version = "0.5.0", optional = true }
6162

6263
[features]
6364
default = [
@@ -89,6 +90,7 @@ all = [
8990
"noise",
9091
"rustls_tls",
9192
"sql",
93+
"text",
9294
"time",
9395
"toml",
9496
"url",
@@ -131,6 +133,7 @@ hash = [
131133
pathfinder = ["num", "pathfinding", "serde", "serde_json"]
132134
redis_pubsub = ["flume", "redis", "serde", "serde_json"]
133135
redis_reliablequeue = ["flume", "redis", "serde", "serde_json"]
136+
text = ["translit"]
134137
unzip = ["zip", "jobs"]
135138
worleynoise = ["rand", "rayon"]
136139

dmsrc/text.dm

+2
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
#define rustg_cyrillic_to_latin(text) call(RUST_G, "cyrillic_to_latin")("[text]")
2+
#define rustg_latin_to_cyrillic(text) call(RUST_G, "latin_to_cyrillic")("[text]")

src/lib.rs

+2
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,8 @@ pub mod redis_pubsub;
3838
pub mod redis_reliablequeue;
3939
#[cfg(feature = "sql")]
4040
pub mod sql;
41+
#[cfg(feature = "text")]
42+
pub mod text;
4143
#[cfg(feature = "time")]
4244
pub mod time;
4345
#[cfg(feature = "toml")]

src/text.rs

+210
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,210 @@
1+
use translit::{CharsMapping, Transliterator};
2+
3+
byond_fn!(fn cyrillic_to_latin (string) {
4+
Some(cyr_to_latin(string))
5+
});
6+
7+
byond_fn!(fn latin_to_cyrillic (string) {
8+
Some(latin_to_cyr(string))
9+
});
10+
11+
fn cyr_to_latin(string: &str) -> String {
12+
Transliterator::new(table_to_latin()).convert(string, false)
13+
}
14+
15+
fn latin_to_cyr(string: &str) -> String {
16+
Transliterator::new(table_from_latin()).convert(string, true)
17+
}
18+
19+
fn table_to_latin() -> CharsMapping {
20+
[
21+
("А", "A"),
22+
("Б", "B"),
23+
("В", "V"),
24+
("Г", "G"),
25+
("Д", "D"),
26+
("Е", "E"),
27+
("Ё", "Yo"),
28+
("Ж", "Zh"),
29+
("З", "Z"),
30+
("И", "I"),
31+
("Й", "I"),
32+
("К", "K"),
33+
("Л", "L"),
34+
("М", "M"),
35+
("Н", "N"),
36+
("О", "O"),
37+
("П", "P"),
38+
("Р", "R"),
39+
("С", "S"),
40+
("Т", "T"),
41+
("У", "U"),
42+
("Ф", "F"),
43+
("Х", "Kh"),
44+
("Х", "H"),
45+
("Ц", "Ts"),
46+
("Ч", "Ch"),
47+
("Ш", "Sh"),
48+
("Щ", "Shch"),
49+
("Ъ", "Ie"),
50+
("Ы", "Y"),
51+
("Ь", "'"),
52+
("Э", "E"),
53+
("Ю", "Iu"),
54+
("Я", "Ia"),
55+
("а", "a"),
56+
("б", "b"),
57+
("в", "v"),
58+
("г", "g"),
59+
("д", "d"),
60+
("е", "e"),
61+
("ё", "yo"),
62+
("ж", "zh"),
63+
("з", "z"),
64+
("и", "i"),
65+
("й", "i"),
66+
("к", "k"),
67+
("л", "l"),
68+
("м", "m"),
69+
("н", "n"),
70+
("о", "o"),
71+
("п", "p"),
72+
("р", "r"),
73+
("с", "s"),
74+
("т", "t"),
75+
("у", "u"),
76+
("ф", "f"),
77+
("х", "kh"),
78+
("ц", "ts"),
79+
("ч", "ch"),
80+
("ш", "sh"),
81+
("щ", "shch"),
82+
("ъ", "ie"),
83+
("ы", "y"),
84+
("ь", "'"),
85+
("э", "e"),
86+
("ю", "iu"),
87+
("я", "ia"),
88+
("№", "#"),
89+
]
90+
.to_vec()
91+
}
92+
93+
fn table_from_latin() -> CharsMapping {
94+
[
95+
("А", "A"),
96+
("Б", "B"),
97+
("В", "V"),
98+
("В", "W"),
99+
("Г", "G"),
100+
("Д", "D"),
101+
("Дж", "J"),
102+
("Э", "E"),
103+
("Ё", "Yo"),
104+
("Ж", "Zh"),
105+
("З", "Z"),
106+
("З", "Th"),
107+
("Зэ", "The"),
108+
("И", "I"),
109+
("Й", "I"),
110+
("К", "C"),
111+
("К", "K"),
112+
("К", "Q"),
113+
("К", "Ck"),
114+
("Кс", "X"),
115+
("Л", "L"),
116+
("М", "M"),
117+
("Н", "N"),
118+
("О", "O"),
119+
("Оу", "Ow"),
120+
("П", "P"),
121+
("Р", "R"),
122+
("С", "S"),
123+
("Т", "T"),
124+
("У", "U"),
125+
("Ф", "F"),
126+
("Х", "Kh"),
127+
("Х", "H"),
128+
("Ц", "Ts"),
129+
("Ч", "Ch"),
130+
("Ш", "Sh"),
131+
("Щ", "Shch"),
132+
("Ъ", "Ie"),
133+
("Ы", "Y"),
134+
("Ь", "'"),
135+
("Е", "E"),
136+
("Ю", "Iu"),
137+
("Я", "Ia"),
138+
("а", "a"),
139+
("б", "b"),
140+
("в", "v"),
141+
("в", "w"),
142+
("г", "g"),
143+
("д", "d"),
144+
("дж", "j"),
145+
("е", "e"),
146+
("ё", "yo"),
147+
("ж", "zh"),
148+
("з", "z"),
149+
("з", "th"),
150+
("зэ", "the"),
151+
("и", "i"),
152+
("й", "i"),
153+
("к", "c"),
154+
("к", "k"),
155+
("к", "q"),
156+
("к", "ck"),
157+
("кс", "x"),
158+
("л", "l"),
159+
("м", "m"),
160+
("н", "n"),
161+
("о", "o"),
162+
("оу", "ow"),
163+
("п", "p"),
164+
("р", "r"),
165+
("с", "s"),
166+
("т", "t"),
167+
("у", "u"),
168+
("ф", "f"),
169+
("х", "kh"),
170+
("х", "h"),
171+
("ц", "ts"),
172+
("ч", "ch"),
173+
("ш", "sh"),
174+
("щ", "shch"),
175+
("ъ", "ie"),
176+
("ы", "y"),
177+
("ь", "'"),
178+
("э", "e"),
179+
("ю", "iu"),
180+
("я", "ia"),
181+
("№", "#"),
182+
]
183+
.to_vec()
184+
}
185+
186+
#[cfg(test)]
187+
mod tests {
188+
use super::*;
189+
190+
#[test]
191+
fn text_test() {
192+
let result = cyr_to_latin("Съешь же ещё этих мягких французских булок, да выпей чаю!");
193+
assert_eq!(
194+
result,
195+
"Sieesh' zhe eshchyo etikh miagkikh frantsuzskikh bulok, da vypei chaiu!"
196+
);
197+
198+
let result2 = cyr_to_latin("Привет мир! Hello world!");
199+
assert_eq!(result2, "Privet mir! Hello world!");
200+
201+
let result3 = latin_to_cyr("Privet mir! Hello world! Zhypyr perotin kuroden.");
202+
assert_eq!(result3, "Привет мир! Хелло ворлд! Жыпыр перотин куроден.");
203+
204+
let result4 = latin_to_cyr("Привет мир! Hello world!");
205+
assert_eq!(result4, "Привет мир! Хелло ворлд!");
206+
207+
let result5 = latin_to_cyr("The quick brown fox jumps over the lazy dog!");
208+
assert_eq!(result5, "Зэ куик броун фокс джумпс овер зэ лазы дог!");
209+
}
210+
}

0 commit comments

Comments
 (0)