bracket_terminal/consoles/text/
codepage437.rs

1use crate::FontCharType;
2
3/// Converts a unicode character to a CP437 equivalent, returning 0 if it didn't have a match
4pub fn to_cp437(c: char) -> FontCharType {
5    match c {
6        '☺' => 1,
7        '☻' => 2,
8        '♥' => 3,
9        '♦' => 4,
10        '♣' => 5,
11        '♠' => 6,
12        '•' => 7,
13        '◘' => 8,
14        '○' => 9,
15        '◙' => 10,
16        '♂' => 11,
17        '♀' => 12,
18        '♪' => 13,
19        '♫' => 14,
20        '☼' => 15,
21
22        '►' => 16,
23        '◄' => 17,
24        '↕' => 18,
25        '‼' => 19,
26        '¶' => 20,
27        '§' => 21,
28        '▬' => 22,
29        '↨' => 23,
30        '↑' => 24,
31        '↓' => 25,
32        '→' => 26,
33        '←' => 27,
34        '∟' => 28,
35        '↔' => 29,
36        '▲' => 30,
37        '▼' => 31,
38
39        ' ' => 32,
40        '!' => 33,
41        '"' => 34,
42        '#' => 35,
43        '$' => 36,
44        '%' => 37,
45        '&' => 38,
46        '\'' => 39,
47        '(' => 40,
48        ')' => 41,
49        '*' => 42,
50        '+' => 43,
51        ',' => 44,
52        '-' => 45,
53        '.' => 46,
54        '/' => 47,
55
56        '0' => 48,
57        '1' => 49,
58        '2' => 50,
59        '3' => 51,
60        '4' => 52,
61        '5' => 53,
62        '6' => 54,
63        '7' => 55,
64        '8' => 56,
65        '9' => 57,
66        ':' => 58,
67        ';' => 59,
68        '<' => 60,
69        '=' => 61,
70        '>' => 62,
71        '?' => 63,
72
73        '@' => 64,
74        'A' => 65,
75        'B' => 66,
76        'C' => 67,
77        'D' => 68,
78        'E' => 69,
79        'F' => 70,
80        'G' => 71,
81        'H' => 72,
82        'I' => 73,
83        'J' => 74,
84        'K' => 75,
85        'L' => 76,
86        'M' => 77,
87        'N' => 78,
88        'O' => 79,
89
90        'P' => 80,
91        'Q' => 81,
92        'R' => 82,
93        'S' => 83,
94        'T' => 84,
95        'U' => 85,
96        'V' => 86,
97        'W' => 87,
98        'X' => 88,
99        'Y' => 89,
100        'Z' => 90,
101        '[' => 91,
102        '\\' => 92,
103        ']' => 93,
104        '^' => 94,
105        '_' => 95,
106
107        '`' => 96,
108        'a' => 97,
109        'b' => 98,
110        'c' => 99,
111        'd' => 100,
112        'e' => 101,
113        'f' => 102,
114        'g' => 103,
115        'h' => 104,
116        'i' => 105,
117        'j' => 106,
118        'k' => 107,
119        'l' => 108,
120        'm' => 109,
121        'n' => 110,
122        'o' => 111,
123
124        'p' => 112,
125        'q' => 113,
126        'r' => 114,
127        's' => 115,
128        't' => 116,
129        'u' => 117,
130        'v' => 118,
131        'w' => 119,
132        'x' => 120,
133        'y' => 121,
134        'z' => 122,
135        '{' => 123,
136        '|' => 124,
137        '}' => 125,
138        '~' => 126,
139        '⌂' => 127,
140
141        'Ç' => 128,
142        'ü' => 129,
143        'é' => 130,
144        'â' => 131,
145        'ä' => 132,
146        'à' => 133,
147        'å' => 134,
148        'ç' => 135,
149        'ê' => 136,
150        'ë' => 137,
151        'è' => 138,
152        'ï' => 139,
153        'î' => 140,
154        'ì' => 141,
155        'Ä' => 142,
156        'Å' => 143,
157
158        'É' => 144,
159        'æ' => 145,
160        'Æ' => 146,
161        'ô' => 147,
162        'ö' => 148,
163        'ò' => 149,
164        'û' => 150,
165        'ù' => 151,
166        'ÿ' => 152,
167        'Ö' => 153,
168        'Ü' => 154,
169        '¢' => 155,
170        '£' => 156,
171        '¥' => 157,
172        '₧' => 158,
173        'ƒ' => 159,
174
175        'á' => 160,
176        'í' => 161,
177        'ó' => 162,
178        'ú' => 163,
179        'ñ' => 164,
180        'Ñ' => 165,
181        'ª' => 166,
182        'º' => 167,
183        '¿' => 168,
184        '⌐' => 169,
185        '¬' => 170,
186        '½' => 171,
187        '¼' => 172,
188        '¡' => 173,
189        '«' => 174,
190        '»' => 175,
191
192        '░' => 176,
193        '▒' => 177,
194        '▓' => 178,
195        '│' => 179,
196        '┤' => 180,
197        '╡' => 181,
198        '╢' => 182,
199        '╖' => 183,
200        '╕' => 184,
201        '╣' => 185,
202        '║' => 186,
203        '╗' => 187,
204        '╝' => 188,
205        '╜' => 189,
206        '╛' => 190,
207        '┐' => 191,
208
209        '└' => 192,
210        '┴' => 193,
211        '┬' => 194,
212        '├' => 195,
213        '─' => 196,
214        '┼' => 197,
215        '╞' => 198,
216        '╟' => 199,
217        '╚' => 200,
218        '╔' => 201,
219        '╩' => 202,
220        '╦' => 203,
221        '╠' => 204,
222        '═' => 205,
223        '╬' => 206,
224        '╧' => 207,
225
226        '╨' => 208,
227        '╤' => 209,
228        '╥' => 210,
229        '╙' => 211,
230        '╘' => 212,
231        '╒' => 213,
232        '╓' => 214,
233        '╫' => 215,
234        '╪' => 216,
235        '┘' => 217,
236        '┌' => 218,
237        '█' => 219,
238        '▄' => 220,
239        '▌' => 221,
240        '▐' => 222,
241        '▀' => 223,
242
243        'α' => 224,
244        'ß' => 225,
245        'Γ' => 226,
246        'π' => 227,
247        'Σ' => 228,
248        'σ' => 229,
249        'µ' => 230,
250        'τ' => 231,
251        'Φ' => 232,
252        'Θ' => 233,
253        'Ω' => 234,
254        'δ' => 235,
255        '∞' => 236,
256        'φ' => 237,
257        'ε' => 238,
258        '∩' => 239,
259
260        '≡' => 240,
261        '±' => 241,
262        '≥' => 242,
263        '≤' => 243,
264        '⌠' => 244,
265        '⌡' => 245,
266        '÷' => 246,
267        '≈' => 247,
268        '°' => 248,
269        '∙' => 249,
270        '·' => 250,
271        '√' => 251,
272        'ⁿ' => 252,
273        '²' => 253,
274        '■' => 254,
275
276        _ => 0,
277    }
278}
279
280pub fn to_char(c: u8) -> char {
281    match c {
282        1 => '☺',
283        2 => '☻',
284        3 => '♥',
285        4 => '♦',
286        5 => '♣',
287        6 => '♠',
288        7 => '•',
289        8 => '◘',
290        9 => '○',
291        10 => '◙',
292        11 => '♂',
293        12 => '♀',
294        13 => '♪',
295        14 => '♫',
296        15 => '☼',
297
298        16 => '►',
299        17 => '◄',
300        18 => '↕',
301        19 => '‼',
302        20 => '¶',
303        21 => '§',
304        22 => '▬',
305        23 => '↨',
306        24 => '↑',
307        25 => '↓',
308        26 => '→',
309        27 => '←',
310        28 => '∟',
311        29 => '↔',
312        30 => '▲',
313        31 => '▼',
314
315        32 => ' ',
316        33 => '!',
317        34 => '"',
318        35 => '#',
319        36 => '$',
320        37 => '%',
321        38 => '&',
322        39 => '\'',
323        40 => '(',
324        41 => ')',
325        42 => '*',
326        43 => '+',
327        44 => ',',
328        45 => '-',
329        46 => '.',
330        47 => '/',
331
332        48 => '0',
333        49 => '1',
334        50 => '2',
335        51 => '3',
336        52 => '4',
337        53 => '5',
338        54 => '6',
339        55 => '7',
340        56 => '8',
341        57 => '9',
342        58 => ':',
343        59 => ';',
344        60 => '<',
345        61 => '=',
346        62 => '>',
347        63 => '?',
348
349        64 => '@',
350        65 => 'A',
351        66 => 'B',
352        67 => 'C',
353        68 => 'D',
354        69 => 'E',
355        70 => 'F',
356        71 => 'G',
357        72 => 'H',
358        73 => 'I',
359        74 => 'J',
360        75 => 'K',
361        76 => 'L',
362        77 => 'M',
363        78 => 'N',
364        79 => 'O',
365
366        80 => 'P',
367        81 => 'Q',
368        82 => 'R',
369        83 => 'S',
370        84 => 'T',
371        85 => 'U',
372        86 => 'V',
373        87 => 'W',
374        88 => 'X',
375        89 => 'Y',
376        90 => 'Z',
377        91 => '[',
378        92 => '\\',
379        93 => ']',
380        94 => '^',
381        95 => '_',
382
383        96 => '`',
384        97 => 'a',
385        98 => 'b',
386        99 => 'c',
387        100 => 'd',
388        101 => 'e',
389        102 => 'f',
390        103 => 'g',
391        104 => 'h',
392        105 => 'i',
393        106 => 'j',
394        107 => 'k',
395        108 => 'l',
396        109 => 'm',
397        110 => 'n',
398        111 => 'o',
399
400        112 => 'p',
401        113 => 'q',
402        114 => 'r',
403        115 => 's',
404        116 => 't',
405        117 => 'u',
406        118 => 'v',
407        119 => 'w',
408        120 => 'x',
409        121 => 'y',
410        122 => 'z',
411        123 => '{',
412        124 => '|',
413        125 => '}',
414        126 => '~',
415        127 => '⌂',
416
417        128 => 'Ç',
418        129 => 'ü',
419        130 => 'é',
420        131 => 'â',
421        132 => 'ä',
422        133 => 'à',
423        134 => 'å',
424        135 => 'ç',
425        136 => 'ê',
426        137 => 'ë',
427        138 => 'è',
428        139 => 'ï',
429        140 => 'î',
430        141 => 'ì',
431        142 => 'Ä',
432        143 => 'Å',
433
434        144 => 'É',
435        145 => 'æ',
436        146 => 'Æ',
437        147 => 'ô',
438        148 => 'ö',
439        149 => 'ò',
440        150 => 'û',
441        151 => 'ù',
442        152 => 'ÿ',
443        153 => 'Ö',
444        154 => 'Ü',
445        155 => '¢',
446        156 => '£',
447        157 => '¥',
448        158 => '₧',
449        159 => 'ƒ',
450
451        160 => 'á',
452        161 => 'í',
453        162 => 'ó',
454        163 => 'ú',
455        164 => 'ñ',
456        165 => 'Ñ',
457        166 => 'ª',
458        167 => 'º',
459        168 => '¿',
460        169 => '⌐',
461        170 => '¬',
462        171 => '½',
463        172 => '¼',
464        173 => '¡',
465        174 => '«',
466        175 => '»',
467
468        176 => '░',
469        177 => '▒',
470        178 => '▓',
471        179 => '│',
472        180 => '┤',
473        181 => '╡',
474        182 => '╢',
475        183 => '╖',
476        184 => '╕',
477        185 => '╣',
478        186 => '║',
479        187 => '╗',
480        188 => '╝',
481        189 => '╜',
482        190 => '╛',
483        191 => '┐',
484
485        192 => '└',
486        193 => '┴',
487        194 => '┬',
488        195 => '├',
489        196 => '─',
490        197 => '┼',
491        198 => '╞',
492        199 => '╟',
493        200 => '╚',
494        201 => '╔',
495        202 => '╩',
496        203 => '╦',
497        204 => '╠',
498        205 => '═',
499        206 => '╬',
500        207 => '╧',
501
502        208 => '╨',
503        209 => '╤',
504        210 => '╥',
505        211 => '╙',
506        212 => '╘',
507        213 => '╒',
508        214 => '╓',
509        215 => '╫',
510        216 => '╪',
511        217 => '┘',
512        218 => '┌',
513        219 => '█',
514        220 => '▄',
515        221 => '▌',
516        222 => '▐',
517        223 => '▀',
518
519        224 => 'α',
520        225 => 'ß',
521        226 => 'Γ',
522        227 => 'π',
523        228 => 'Σ',
524        229 => 'σ',
525        230 => 'µ',
526        231 => 'τ',
527        232 => 'Φ',
528        233 => 'Θ',
529        234 => 'Ω',
530        235 => 'δ',
531        236 => '∞',
532        237 => 'φ',
533        238 => 'ε',
534        239 => '∩',
535
536        240 => '≡',
537        241 => '±',
538        242 => '≥',
539        243 => '≤',
540        244 => '⌠',
541        245 => '⌡',
542        246 => '÷',
543        247 => '≈',
544        248 => '°',
545        249 => '∙',
546        250 => '·',
547        251 => '√',
548        252 => 'ⁿ',
549        253 => '²',
550        254 => '■',
551
552        _ => ' ',
553    }
554}
555
556/// Converts a string into a vector of u8, CP437 representations of the string
557pub fn string_to_cp437<S: AsRef<str>>(input: S) -> Vec<FontCharType> {
558    input.as_ref().chars().map(to_cp437).collect()
559}
560
561#[cfg(test)]
562mod tests {
563    use super::string_to_cp437;
564    use crate::FontCharType;
565
566    #[test]
567    // Tests that we make an RGB triplet at defaults and it is black.
568    fn test_hello() {
569        let test: Vec<FontCharType> = vec![72, 101, 108, 108, 111];
570        let convert = string_to_cp437("Hello");
571        assert_eq!(test, convert);
572    }
573
574    #[test]
575    // Tests that we make an RGB triplet at defaults and it is black.
576    fn test_fancy() {
577        let test: Vec<FontCharType> = vec![171, 165, 176, 206, 234, 247];
578        let convert = string_to_cp437("½Ñ░╬Ω≈");
579        assert_eq!(test, convert);
580    }
581
582    #[test]
583    // Tests that we make an RGB triplet at defaults and it is black.
584    fn test_first_group() {
585        let test: Vec<FontCharType> = vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15];
586        let convert = string_to_cp437("☺☻♥♦♣♠•◘○◙♂♀♪♫☼");
587        assert_eq!(test, convert);
588    }
589}