Skip to content

Commit 75e83d5

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

File tree

5 files changed

+227
-0
lines changed

5 files changed

+227
-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

+2
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 = [
@@ -131,6 +132,7 @@ hash = [
131132
pathfinder = ["num", "pathfinding", "serde", "serde_json"]
132133
redis_pubsub = ["flume", "redis", "serde", "serde_json"]
133134
redis_reliablequeue = ["flume", "redis", "serde", "serde_json"]
135+
text = ["translit"]
134136
unzip = ["zip", "jobs"]
135137
worleynoise = ["rand", "rayon"]
136138

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

+214
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,214 @@
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+
.iter()
91+
.cloned()
92+
.collect()
93+
}
94+
95+
fn table_from_latin() -> CharsMapping {
96+
[
97+
("А", "A"),
98+
("Б", "B"),
99+
("В", "V"),
100+
("В", "W"),
101+
("Г", "G"),
102+
("Д", "D"),
103+
("Дж", "J"),
104+
("Э", "E"),
105+
("Ё", "Yo"),
106+
("Ж", "Zh"),
107+
("З", "Z"),
108+
("З", "Th"),
109+
("Зэ", "The"),
110+
("И", "I"),
111+
("Й", "I"),
112+
("К", "C"),
113+
("К", "K"),
114+
("К", "Q"),
115+
("К", "Ck"),
116+
("Кс", "X"),
117+
("Л", "L"),
118+
("М", "M"),
119+
("Н", "N"),
120+
("О", "O"),
121+
("Оу", "Ow"),
122+
("П", "P"),
123+
("Р", "R"),
124+
("С", "S"),
125+
("Т", "T"),
126+
("У", "U"),
127+
("Ф", "F"),
128+
("Х", "Kh"),
129+
("Х", "H"),
130+
("Ц", "Ts"),
131+
("Ч", "Ch"),
132+
("Ш", "Sh"),
133+
("Щ", "Shch"),
134+
("Ъ", "Ie"),
135+
("Ы", "Y"),
136+
("Ь", "'"),
137+
("Е", "E"),
138+
("Ю", "Iu"),
139+
("Я", "Ia"),
140+
("а", "a"),
141+
("б", "b"),
142+
("в", "v"),
143+
("в", "w"),
144+
("г", "g"),
145+
("д", "d"),
146+
("дж", "j"),
147+
("е", "e"),
148+
("ё", "yo"),
149+
("ж", "zh"),
150+
("з", "z"),
151+
("з", "th"),
152+
("зэ", "the"),
153+
("и", "i"),
154+
("й", "i"),
155+
("к", "c"),
156+
("к", "k"),
157+
("к", "q"),
158+
("к", "ck"),
159+
("кс", "x"),
160+
("л", "l"),
161+
("м", "m"),
162+
("н", "n"),
163+
("о", "o"),
164+
("оу", "ow"),
165+
("п", "p"),
166+
("р", "r"),
167+
("с", "s"),
168+
("т", "t"),
169+
("у", "u"),
170+
("ф", "f"),
171+
("х", "kh"),
172+
("х", "h"),
173+
("ц", "ts"),
174+
("ч", "ch"),
175+
("ш", "sh"),
176+
("щ", "shch"),
177+
("ъ", "ie"),
178+
("ы", "y"),
179+
("ь", "'"),
180+
("э", "e"),
181+
("ю", "iu"),
182+
("я", "ia"),
183+
("№", "#"),
184+
]
185+
.iter()
186+
.cloned()
187+
.collect()
188+
}
189+
190+
#[cfg(test)]
191+
mod tests {
192+
use super::*;
193+
194+
#[test]
195+
fn text_test() {
196+
let result = cyr_to_latin("Съешь же ещё этих мягких французских булок, да выпей чаю!");
197+
assert_eq!(
198+
result,
199+
"Sieesh' zhe eshchyo etikh miagkikh frantsuzskikh bulok, da vypei chaiu!"
200+
);
201+
202+
let result2 = cyr_to_latin("Привет мир! Hello world!");
203+
assert_eq!(result2, "Privet mir! Hello world!");
204+
205+
let result3 = latin_to_cyr("Privet mir! Hello world! Zhypyr perotin kuroden.");
206+
assert_eq!(result3, "Привет мир! Хелло ворлд! Жыпыр перотин куроден.");
207+
208+
let result4 = latin_to_cyr("Привет мир! Hello world!");
209+
assert_eq!(result4, "Привет мир! Хелло ворлд!");
210+
211+
let result5 = latin_to_cyr("The quick brown fox jumps over the lazy dog!");
212+
assert_eq!(result5, "Зэ куик броун фокс джумпс овер зэ лазы дог!");
213+
}
214+
}

0 commit comments

Comments
 (0)