Skip to content

Commit 02adc40

Browse files
committed
Feat: text (#1)
1 parent 9eb4a31 commit 02adc40

File tree

5 files changed

+222
-0
lines changed

5 files changed

+222
-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
@@ -57,6 +57,7 @@ dbpnoise = { version = "0.1.2", optional = true }
5757
pathfinding = { version = "4.2.1", optional = true }
5858
num = { version = "0.4.0", optional = true }
5959
workerpool = "1.2.0"
60+
translit = { version = "0.5.0", optional = true }
6061

6162
[features]
6263
default = [
@@ -107,6 +108,7 @@ redis_pubsub = ["flume", "redis", "serde", "serde_json"]
107108
redis_reliablequeue = ["flume", "redis", "serde", "serde_json"]
108109
unzip = ["zip", "jobs"]
109110
worleynoise = ["rand", "rayon"]
111+
text = ["translit"]
110112

111113
# internal feature-like things
112114
jobs = ["flume"]

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
@@ -48,6 +48,8 @@ pub mod unzip;
4848
pub mod url;
4949
#[cfg(feature = "worleynoise")]
5050
pub mod worleynoise;
51+
#[cfg(feature = "text")]
52+
pub mod text;
5153

5254
#[cfg(not(target_pointer_width = "32"))]
5355
compile_error!("rust-g must be compiled for a 32-bit target");

src/text.rs

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

0 commit comments

Comments
 (0)