layout_2020/
quotes.rs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
/* This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at https://mozilla.org/MPL/2.0/. */

// Quotes data is obtained from ICU CLDR data file /tmp/cldr-common-46.0.zip.

// TODO(xiaochengh): This file should better be moved to elsewhere and maintained automatically.
// Or even better, extend the icu create to provide the data directly.

use std::collections::HashMap;
use std::sync::OnceLock;

use icu_locid::Locale;

#[derive(Clone, Copy, Debug)]
pub struct QuotePair {
    pub opening: char,
    pub closing: char,
}

#[derive(Clone, Copy, Debug)]
struct QuotesData {
    quotes: QuotePair,
    alternative_quotes: QuotePair,
}

impl QuotesData {
    const fn from(chars: (char, char, char, char)) -> Self {
        QuotesData {
            quotes: QuotePair {
                opening: chars.0,
                closing: chars.1,
            },
            alternative_quotes: QuotePair {
                opening: chars.2,
                closing: chars.3,
            },
        }
    }
}

static DEFAULT_QUOTES: QuotesData =
    QuotesData::from(('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}'));

static QUOTES_MAP: OnceLock<HashMap<&'static str, QuotesData>> = OnceLock::new();

fn create_quotes_map() -> HashMap<&'static str, QuotesData> {
    let input = [
        ("aa", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("ab", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("af", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("ak", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("an", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("ann", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("apc", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("arn", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("as", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("asa", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("az", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("ba", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("bal", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("bem", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("bew", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("bez", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("bgc", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("bgn", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("bho", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("blt", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("bn", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("bo", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("brx", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("bss", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("byn", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("cad", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("cch", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("ccp", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("ce", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("ceb", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("cgg", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("cho", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("chr", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("cic", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("ckb", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("co", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("csw", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("cu", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("cy", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("da", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("dav", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("dje", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("doi", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("dv", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("dz", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("ebu", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("ee", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("en", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("eo", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("es", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("fil", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("fo", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("frr", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("fur", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("fy", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("ga", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("gaa", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("gd", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("gez", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("gl", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("gn", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("gu", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("guz", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("gv", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("ha", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("haw", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("hi", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("hnj", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("id", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("ig", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("ii", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("io", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("iu", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("jbo", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("jmc", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("jv", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("kaa", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("kaj", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("kam", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("kcg", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("kde", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("kea", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("ken", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("kgp", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("khq", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("ki", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("kl", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("kln", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("km", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("kn", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("ko", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("kok", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("kpe", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("ks", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("ksb", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("ksh", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("ku", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("kw", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("kxv", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("la", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("lg", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("lkt", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("lmo", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("ln", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("lo", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("lrc", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("ltg", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("lu", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("luo", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("lv", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("mai", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("mas", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("mdf", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("mer", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("mfe", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("mgh", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("mgo", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("mhn", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("mi", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("mic", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("ml", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("mn", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("mni", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("moh", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("mr", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("ms", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("mt", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("mus", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("my", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("myv", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("naq", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("nb", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("nd", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("nds", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("ne", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("nn", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("nqo", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("nr", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("nus", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("nv", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("ny", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("nyn", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("oc", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("om", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("or", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("os", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("osa", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("pa", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("pap", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("pcm", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("pis", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("prg", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("ps", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("pt", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("qu", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("quc", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("raj", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("rhg", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("rif", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("rm", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("rof", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("rwk", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("sa", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("saq", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("sat", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("sbp", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("scn", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("sd", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("se", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("seh", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("ses", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("shn", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("si", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("sid", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("skr", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("sma", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("smj", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("smn", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("sms", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("so", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("ss", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("ssy", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("su", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("sw", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("szl", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("ta", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("te", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("teo", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("tg", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("th", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("tig", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("to", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("tok", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("tpi", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("tr", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("trv", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("trw", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("ts", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("tt", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("twq", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("tyv", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("tzm", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("ug", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("vai", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("ve", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("vec", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("vi", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("vmw", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("vo", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("vun", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("wa", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("wae", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("wal", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("wbp", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("wo", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("xh", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("xnr", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("xog", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("yi", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("yo", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("yrl", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("za", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("zh", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("zu", ('\u{201c}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("agq", ('\u{201e}', '\u{201d}', '\u{201a}', '\u{2019}')),
        ("ff", ('\u{201e}', '\u{201d}', '\u{201a}', '\u{2019}')),
        ("am", ('\u{ab}', '\u{bb}', '\u{2039}', '\u{203a}')),
        ("az-Arab", ('\u{ab}', '\u{bb}', '\u{2039}', '\u{203a}')),
        ("az-Cyrl", ('\u{ab}', '\u{bb}', '\u{2039}', '\u{203a}')),
        ("fa", ('\u{ab}', '\u{bb}', '\u{2039}', '\u{203a}')),
        ("fr-CH", ('\u{ab}', '\u{bb}', '\u{2039}', '\u{203a}')),
        ("gsw", ('\u{ab}', '\u{bb}', '\u{2039}', '\u{203a}')),
        ("jgo", ('\u{ab}', '\u{bb}', '\u{2039}', '\u{203a}')),
        ("kkj", ('\u{ab}', '\u{bb}', '\u{2039}', '\u{203a}')),
        ("mzn", ('\u{ab}', '\u{bb}', '\u{2039}', '\u{203a}')),
        ("sdh", ('\u{ab}', '\u{bb}', '\u{2039}', '\u{203a}')),
        ("ar", ('\u{201d}', '\u{201c}', '\u{2019}', '\u{2018}')),
        ("lld", ('\u{201d}', '\u{201c}', '\u{2019}', '\u{2018}')),
        ("ms-Arab", ('\u{201d}', '\u{201c}', '\u{2019}', '\u{2018}')),
        ("syr", ('\u{201d}', '\u{201c}', '\u{2019}', '\u{2018}')),
        ("ur", ('\u{201d}', '\u{201c}', '\u{2019}', '\u{2018}')),
        ("ast", ('\u{ab}', '\u{bb}', '\u{201c}', '\u{201d}')),
        ("blo", ('\u{ab}', '\u{bb}', '\u{201c}', '\u{201d}')),
        ("bm", ('\u{ab}', '\u{bb}', '\u{201c}', '\u{201d}')),
        ("br", ('\u{ab}', '\u{bb}', '\u{201c}', '\u{201d}')),
        ("ca", ('\u{ab}', '\u{bb}', '\u{201c}', '\u{201d}')),
        ("dyo", ('\u{ab}', '\u{bb}', '\u{201c}', '\u{201d}')),
        ("el", ('\u{ab}', '\u{bb}', '\u{201c}', '\u{201d}')),
        ("es-US", ('\u{ab}', '\u{bb}', '\u{201c}', '\u{201d}')),
        ("eu", ('\u{ab}', '\u{bb}', '\u{201c}', '\u{201d}')),
        ("ewo", ('\u{ab}', '\u{bb}', '\u{201c}', '\u{201d}')),
        ("ie", ('\u{ab}', '\u{bb}', '\u{201c}', '\u{201d}')),
        ("it", ('\u{ab}', '\u{bb}', '\u{201c}', '\u{201d}')),
        ("kab", ('\u{ab}', '\u{bb}', '\u{201c}', '\u{201d}')),
        ("kk", ('\u{ab}', '\u{bb}', '\u{201c}', '\u{201d}')),
        ("lij", ('\u{ab}', '\u{bb}', '\u{201c}', '\u{201d}')),
        ("mg", ('\u{ab}', '\u{bb}', '\u{201c}', '\u{201d}')),
        ("mua", ('\u{ab}', '\u{bb}', '\u{201c}', '\u{201d}')),
        ("nnh", ('\u{ab}', '\u{bb}', '\u{201c}', '\u{201d}')),
        ("pt-PT", ('\u{ab}', '\u{bb}', '\u{201c}', '\u{201d}')),
        ("sc", ('\u{ab}', '\u{bb}', '\u{201c}', '\u{201d}')),
        ("sg", ('\u{ab}', '\u{bb}', '\u{201c}', '\u{201d}')),
        ("sq", ('\u{ab}', '\u{bb}', '\u{201c}', '\u{201d}')),
        ("ti", ('\u{ab}', '\u{bb}', '\u{201c}', '\u{201d}')),
        ("bas", ('\u{ab}', '\u{bb}', '\u{201e}', '\u{201c}')),
        ("be", ('\u{ab}', '\u{bb}', '\u{201e}', '\u{201c}')),
        ("cv", ('\u{ab}', '\u{bb}', '\u{201e}', '\u{201c}')),
        ("ky", ('\u{ab}', '\u{bb}', '\u{201e}', '\u{201c}')),
        ("ru", ('\u{ab}', '\u{bb}', '\u{201e}', '\u{201c}')),
        ("sah", ('\u{ab}', '\u{bb}', '\u{201e}', '\u{201c}')),
        ("uk", ('\u{ab}', '\u{bb}', '\u{201e}', '\u{201c}')),
        ("bg", ('\u{201e}', '\u{201c}', '\u{201e}', '\u{201c}')),
        ("lt", ('\u{201e}', '\u{201c}', '\u{201e}', '\u{201c}')),
        ("bs-Cyrl", ('\u{201e}', '\u{201c}', '\u{201a}', '\u{2018}')),
        ("cs", ('\u{201e}', '\u{201c}', '\u{201a}', '\u{2018}')),
        ("de", ('\u{201e}', '\u{201c}', '\u{201a}', '\u{2018}')),
        ("dsb", ('\u{201e}', '\u{201c}', '\u{201a}', '\u{2018}')),
        ("et", ('\u{201e}', '\u{201c}', '\u{201a}', '\u{2018}')),
        ("hr", ('\u{201e}', '\u{201c}', '\u{201a}', '\u{2018}')),
        ("hsb", ('\u{201e}', '\u{201c}', '\u{201a}', '\u{2018}')),
        ("is", ('\u{201e}', '\u{201c}', '\u{201a}', '\u{2018}')),
        ("lb", ('\u{201e}', '\u{201c}', '\u{201a}', '\u{2018}')),
        ("luy", ('\u{201e}', '\u{201c}', '\u{201a}', '\u{2018}')),
        ("mk", ('\u{201e}', '\u{201c}', '\u{201a}', '\u{2018}')),
        ("sk", ('\u{201e}', '\u{201c}', '\u{201a}', '\u{2018}')),
        ("sl", ('\u{201e}', '\u{201c}', '\u{201a}', '\u{2018}')),
        ("bs", ('\u{201e}', '\u{201d}', '\u{2018}', '\u{2019}')),
        ("dua", ('\u{ab}', '\u{bb}', '\u{2018}', '\u{2019}')),
        ("el-POLYTON", ('\u{ab}', '\u{bb}', '\u{2018}', '\u{2019}')),
        ("ksf", ('\u{ab}', '\u{bb}', '\u{2018}', '\u{2019}')),
        ("no", ('\u{ab}', '\u{bb}', '\u{2018}', '\u{2019}')),
        ("rw", ('\u{ab}', '\u{bb}', '\u{2018}', '\u{2019}')),
        ("fi", ('\u{201d}', '\u{201d}', '\u{2019}', '\u{2019}')),
        ("he", ('\u{201d}', '\u{201d}', '\u{2019}', '\u{2019}')),
        ("lag", ('\u{201d}', '\u{201d}', '\u{2019}', '\u{2019}')),
        ("rn", ('\u{201d}', '\u{201d}', '\u{2019}', '\u{2019}')),
        ("sn", ('\u{201d}', '\u{201d}', '\u{2019}', '\u{2019}')),
        ("sv", ('\u{201d}', '\u{201d}', '\u{2019}', '\u{2019}')),
        ("fr-CA", ('\u{ab}', '\u{bb}', '\u{201d}', '\u{201c}')),
        ("fr", ('\u{ab}', '\u{bb}', '\u{ab}', '\u{bb}')),
        ("hy", ('\u{ab}', '\u{bb}', '\u{ab}', '\u{bb}')),
        ("yav", ('\u{ab}', '\u{bb}', '\u{ab}', '\u{bb}')),
        ("hu", ('\u{201e}', '\u{201d}', '\u{bb}', '\u{ab}')),
        ("ia", ('\u{2018}', '\u{2019}', '\u{201c}', '\u{201d}')),
        ("nso", ('\u{2018}', '\u{2019}', '\u{201c}', '\u{201d}')),
        ("ti-ER", ('\u{2018}', '\u{2019}', '\u{201c}', '\u{201d}')),
        ("tn", ('\u{2018}', '\u{2019}', '\u{201c}', '\u{201d}')),
        ("ja", ('\u{300c}', '\u{300d}', '\u{300e}', '\u{300f}')),
        ("yue", ('\u{300c}', '\u{300d}', '\u{300e}', '\u{300f}')),
        ("zh-Hant", ('\u{300c}', '\u{300d}', '\u{300e}', '\u{300f}')),
        ("ka", ('\u{201e}', '\u{201c}', '\u{ab}', '\u{bb}')),
        ("nl", ('\u{2018}', '\u{2019}', '\u{2018}', '\u{2019}')),
        ("nmg", ('\u{201e}', '\u{201d}', '\u{ab}', '\u{bb}')),
        ("pl", ('\u{201e}', '\u{201d}', '\u{ab}', '\u{bb}')),
        ("ro", ('\u{201e}', '\u{201d}', '\u{ab}', '\u{bb}')),
        ("shi", ('\u{ab}', '\u{bb}', '\u{201e}', '\u{201d}')),
        ("zgh", ('\u{ab}', '\u{bb}', '\u{201e}', '\u{201d}')),
        ("sr", ('\u{201e}', '\u{201d}', '\u{2019}', '\u{2019}')),
        ("st", ('\u{201c}', '\u{2019}', '\u{201c}', '\u{201d}')),
        ("tk", ('\u{201c}', '\u{201d}', '\u{201c}', '\u{201d}')),
        ("uz", ('\u{201c}', '\u{201d}', '\u{2019}', '\u{2018}')),
    ]
    .map(|(lang, chars)| (lang, QuotesData::from(chars)));
    HashMap::from(input)
}

fn quotes_data_for_lang(lang: &str) -> QuotesData {
    // All valid language codes are at least two bytes long.
    if lang.len() < 2 {
        return DEFAULT_QUOTES;
    }

    let quotes_map = QUOTES_MAP.get_or_init(create_quotes_map);

    // Found an exact match for the requested lang.
    if let Some(quotes_data) = quotes_map.get(lang) {
        return *quotes_data;
    }

    // Try parsing lang as a Locale and canonicalizing the subtags, then see if
    // we can match it with region or script subtags, if present, or just the
    // primary language tag.
    let locale = match lang.parse::<Locale>() {
        Err(_) => return DEFAULT_QUOTES,
        Ok(locale) => locale,
    };

    let lang = locale.id.language.to_string();

    if let Some(quotes_data) = quotes_map.get(lang.as_str()) {
        return *quotes_data;
    }

    if let Some(quotes_data) = locale
        .id
        .region
        .and_then(|region| quotes_map.get(format!("{lang}-{region}").as_str()))
    {
        return *quotes_data;
    }

    if let Some(quotes_data) = locale
        .id
        .script
        .and_then(|script| quotes_map.get(format!("{lang}-{script}").as_str()))
    {
        return *quotes_data;
    }

    DEFAULT_QUOTES
}

pub fn quotes_for_lang(lang: &str, depth: usize) -> QuotePair {
    let quotes_data = quotes_data_for_lang(lang);
    match depth {
        0 => quotes_data.quotes,
        _ => quotes_data.alternative_quotes,
    }
}