Skip to content

Commit 85d6241

Browse files
BizzoniumDimach
authored andcommitted
Feat: text (#1)
1 parent cc92d89 commit 85d6241

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
@@ -66,6 +66,7 @@ fast_poisson = { version = "0.5.2", optional = true, features = [
6666
"single_precision",
6767
] } # Higher versions have problems with x86 due to 'kiddo'.
6868
workerpool = "1.2.1"
69+
translit = { version = "0.5.0", optional = true }
6970

7071
[features]
7172
default = [
@@ -101,6 +102,7 @@ all = [
101102
"rustls_tls",
102103
"sanitize",
103104
"sql",
105+
"text",
104106
"time",
105107
"toml",
106108
"url",
@@ -160,6 +162,7 @@ pathfinder = ["num-integer", "pathfinding", "serde", "serde_json"]
160162
poissonnoise = ["fast_poisson"]
161163
redis_pubsub = ["flume", "redis", "serde", "serde_json"]
162164
redis_reliablequeue = ["flume", "redis", "serde", "serde_json"]
165+
text = ["translit"]
163166
unzip = ["zip", "jobs"]
164167
worleynoise = ["rand", "rayon"]
165168

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
@@ -44,6 +44,8 @@ pub mod redis_reliablequeue;
4444
pub mod sanitize;
4545
#[cfg(feature = "sql")]
4646
pub mod sql;
47+
#[cfg(feature = "text")]
48+
pub mod text;
4749
#[cfg(feature = "time")]
4850
pub mod time;
4951
#[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)