1
#![deny(missing_docs)]
2

            
3
//!  Utilities for handling the Mac OS Roman character set.
4

            
5
/// Returns `true` if the supplied `char` exists in the Mac OS Roman character encoding.
6
///
7
/// <https://en.wikipedia.org/wiki/Mac_OS_Roman>
8
pub fn is_macroman(chr: char) -> bool {
9
    char_to_macroman(chr).is_some()
10
}
11

            
12
/// Converts a `char` to its Mac OS Roman character encoding.
13
///
14
/// Returns `None` if the character is not part of the Mac OS Roman character set.
15
#[rustfmt::skip]
16
pub fn char_to_macroman(chr: char) -> Option<u8> {
17
    if (chr as u32) < 0x7F {
18
        Some(chr as u8)
19
    } else {
20
        match chr {
21
            'Ä' => Some(128), // A dieresis
22
            'Å' => Some(129), // A ring
23
            'Ç' => Some(130), // C cedilla
24
            'É' => Some(131), // E acute
25
            'Ñ' => Some(132), // N tilde
26
            'Ö' => Some(133), // O dieresis
27
            'Ü' => Some(134), // U dieresis
28
            'á' => Some(135), // a acute
29
            'à' => Some(136), // a grave
30
            'â' => Some(137), // a circumflex
31
            'ä' => Some(138), // a dieresis
32
            'ã' => Some(139), // a tilde
33
            'å' => Some(140), // a ring
34
            'ç' => Some(141), // c cedilla
35
            'é' => Some(142), // e acute
36
            'è' => Some(143), // e grave
37
            'ê' => Some(144), // e circumflex
38
            'ë' => Some(145), // e dieresis
39
            'í' => Some(146), // i acute
40
            'ì' => Some(147), // i grave
41
            'î' => Some(148), // i circumflex
42
            'ï' => Some(149), // i dieresis
43
            'ñ' => Some(150), // n tilde
44
            'ó' => Some(151), // o acute
45
            'ò' => Some(152), // o grave
46
            'ô' => Some(153), // o circumflex
47
            'ö' => Some(154), // o dieresis
48
            'õ' => Some(155), // o tilde
49
            'ú' => Some(156), // u acute
50
            'ù' => Some(157), // u grave
51
            'û' => Some(158), // u circumflex
52
            'ü' => Some(159), // u dieresis
53
            '†' => Some(160), // dagger
54
            '°' => Some(161), // degree
55
            '¢' => Some(162), // cent
56
            '£' => Some(163), // sterling
57
            '§' => Some(164), // section
58
            '•' => Some(165), // bullet
59
            '¶' => Some(166), // paragraph
60
            'ß' => Some(167), // German double s
61
            '®' => Some(168), // registered
62
            '©' => Some(169), // copyright
63
            '™' => Some(170), // trademark
64
            '´' => Some(171), // acute
65
            '¨' => Some(172), // diaeresis
66
            'Æ' => Some(174), // AE
67
            'Ø' => Some(175), // O slash
68
            '±' => Some(177), // plusminus
69
            '¥' => Some(180), // yen
70
            'µ' => Some(181), // micro
71
            'ª' => Some(187), // ordfeminine
72
            'º' => Some(188), // ordmasculine
73
            'æ' => Some(190), // ae
74
            'ø' => Some(191), // o slash
75
            '¿' => Some(192), // question down
76
            '¡' => Some(193), // exclamation down
77
            '¬' => Some(194), // not
78
            'ƒ' => Some(196), // florin
79
            '«' => Some(199), // left guille
80
            '»' => Some(200), // right guille
81
            '…' => Some(201), // ellipsis
82
            ' ' => Some(202), // non-breaking space
83
            'À' => Some(203), // A grave
84
            'Ã' => Some(204), // A tilde
85
            'Õ' => Some(205), // O tilde
86
            'Œ' => Some(206), // OE
87
            'œ' => Some(207), // oe
88
            '–' => Some(208), // endash
89
            '—' => Some(209), // emdash
90
            '“' => Some(210), // ldquo
91
            '”' => Some(211), // rdquo
92
            '‘' => Some(212), // lsquo
93
            '’' => Some(213), // rsquo
94
            '÷' => Some(214), // divide
95
            'ÿ' => Some(216), // y dieresis
96
            'Ÿ' => Some(217), // Y dieresis
97
            '⁄' => Some(218), // fraction
98
            '¤' => Some(219), // currency
99
            '‹' => Some(220), // left single guille
100
            '›' => Some(221), // right single guille
101
            'fi' => Some(222), // fi
102
            'fl' => Some(223), // fl
103
            '‡' => Some(224), // double dagger
104
            '·' => Some(225), // middle dot
105
            '‚' => Some(226), // single quote base
106
            '„' => Some(227), // double quote base
107
            '‰' => Some(228), // perthousand
108
            'Â' => Some(229), // A circumflex
109
            'Ê' => Some(230), // E circumflex
110
            'Á' => Some(231), // A acute
111
            'Ë' => Some(232), // E dieresis
112
            'È' => Some(233), // E grave
113
            'Í' => Some(234), // I acute
114
            'Î' => Some(235), // I circumflex
115
            'Ï' => Some(236), // I dieresis
116
            'Ì' => Some(237), // I grave
117
            'Ó' => Some(238), // O acute
118
            'Ô' => Some(239), // O circumflex
119
            'Ò' => Some(241), // O grave
120
            'Ú' => Some(242), // U acute
121
            'Û' => Some(243), // U circumflex
122
            'Ù' => Some(244), // U grave
123
            'ı' => Some(245), // dot-less i
124
            '^' => Some(246), // circumflex
125
            '˜' => Some(247), // tilde
126
            '¯' => Some(248), // macron
127
            '˘' => Some(249), // breve
128
            '˙' => Some(250), // dot accent
129
            '˚' => Some(251), // ring
130
            '¸' => Some(252), // cedilla
131
            '˝' => Some(253), // Hungarian umlaut (double acute accent)
132
            '˛' => Some(254), // ogonek
133
            'ˇ' => Some(255), // caron
134
            _ => None,
135
        }
136
    }
137
}
138

            
139
/// Converts a `char` to its Mac OS Roman character encoding.
140
///
141
/// Returns `None` if the character is not part of the Mac OS Roman character set.
142
#[rustfmt::skip]
143
pub fn macroman_to_char(macroman: u8) -> Option<char> {
144
        match macroman {
145
            0..=127 => Some(macroman as char),
146
            128 => Some('Ä'), // A dieresis
147
            129 => Some('Å'), // A ring
148
            130 => Some('Ç'), // C cedilla
149
            131 => Some('É'), // E acute
150
            132 => Some('Ñ'), // N tilde
151
            133 => Some('Ö'), // O dieresis
152
            134 => Some('Ü'), // U dieresis
153
            135 => Some('á'), // a acute
154
            136 => Some('à'), // a grave
155
            137 => Some('â'), // a circumflex
156
            138 => Some('ä'), // a dieresis
157
            139 => Some('ã'), // a tilde
158
            140 => Some('å'), // a ring
159
            141 => Some('ç'), // c cedilla
160
            142 => Some('é'), // e acute
161
            143 => Some('è'), // e grave
162
            144 => Some('ê'), // e circumflex
163
            145 => Some('ë'), // e dieresis
164
            146 => Some('í'), // i acute
165
            147 => Some('ì'), // i grave
166
            148 => Some('î'), // i circumflex
167
            149 => Some('ï'), // i dieresis
168
            150 => Some('ñ'), // n tilde
169
            151 => Some('ó'), // o acute
170
            152 => Some('ò'), // o grave
171
            153 => Some('ô'), // o circumflex
172
            154 => Some('ö'), // o dieresis
173
            155 => Some('õ'), // o tilde
174
            156 => Some('ú'), // u acute
175
            157 => Some('ù'), // u grave
176
            158 => Some('û'), // u circumflex
177
            159 => Some('ü'), // u dieresis
178
            160 => Some('†'), // dagger
179
            161 => Some('°'), // degree
180
            162 => Some('¢'), // cent
181
            163 => Some('£'), // sterling
182
            164 => Some('§'), // section
183
            165 => Some('•'), // bullet
184
            166 => Some('¶'), // paragraph
185
            167 => Some('ß'), // German double s
186
            168 => Some('®'), // registered
187
            169 => Some('©'), // copyright
188
            170 => Some('™'), // trademark
189
            171 => Some('´'), // acute
190
            172 => Some('¨'), // diaeresis
191
            174 => Some('Æ'), // AE
192
            175 => Some('Ø'), // O slash
193
            177 => Some('±'), // plusminus
194
            180 => Some('¥'), // yen
195
            181 => Some('µ'), // micro
196
            187 => Some('ª'), // ordfeminine
197
            188 => Some('º'), // ordmasculine
198
            190 => Some('æ'), // ae
199
            191 => Some('ø'), // o slash
200
            192 => Some('¿'), // question down
201
            193 => Some('¡'), // exclamation down
202
            194 => Some('¬'), // not
203
            196 => Some('ƒ'), // florin
204
            199 => Some('«'), // left guille
205
            200 => Some('»'), // right guille
206
            201 => Some('…'), // ellipsis
207
            202 => Some(' '), // non-breaking space
208
            203 => Some('À'), // A grave
209
            204 => Some('Ã'), // A tilde
210
            205 => Some('Õ'), // O tilde
211
            206 => Some('Œ'), // OE
212
            207 => Some('œ'), // oe
213
            208 => Some('–'), // endash
214
            209 => Some('—'), // emdash
215
            210 => Some('“'), // ldquo
216
            211 => Some('”'), // rdquo
217
            212 => Some('‘'), // lsquo
218
            213 => Some('’'), // rsquo
219
            214 => Some('÷'), // divide
220
            216 => Some('ÿ'), // y dieresis
221
            217 => Some('Ÿ'), // Y dieresis
222
            218 => Some('⁄'), // fraction
223
            219 => Some('¤'), // currency
224
            220 => Some('‹'), // left single guille
225
            221 => Some('›'), // right single guille
226
            222 => Some('fi'), // fi
227
            223 => Some('fl'), // fl
228
            224 => Some('‡'), // double dagger
229
            225 => Some('·'), // middle dot
230
            226 => Some('‚'), // single quote base
231
            227 => Some('„'), // double quote base
232
            228 => Some('‰'), // perthousand
233
            229 => Some('Â'), // A circumflex
234
            230 => Some('Ê'), // E circumflex
235
            231 => Some('Á'), // A acute
236
            232 => Some('Ë'), // E dieresis
237
            233 => Some('È'), // E grave
238
            234 => Some('Í'), // I acute
239
            235 => Some('Î'), // I circumflex
240
            236 => Some('Ï'), // I dieresis
241
            237 => Some('Ì'), // I grave
242
            238 => Some('Ó'), // O acute
243
            239 => Some('Ô'), // O circumflex
244
            241 => Some('Ò'), // O grave
245
            242 => Some('Ú'), // U acute
246
            243 => Some('Û'), // U circumflex
247
            244 => Some('Ù'), // U grave
248
            245 => Some('ı'), // dot-less i
249
            246 => Some('^'), // circumflex
250
            247 => Some('˜'), // tilde
251
            248 => Some('¯'), // macron
252
            249 => Some('˘'), // breve
253
            250 => Some('˙'), // dot accent
254
            251 => Some('˚'), // ring
255
            252 => Some('¸'), // cedilla
256
            253 => Some('˝'), // Hungarian umlaut (double acute accent)
257
            254 => Some('˛'), // ogonek
258
            255 => Some('ˇ'), // caron
259
            _ => None,
260
    }
261
}