pub fn normalize_latin(c: char) -> char {
if c < '\u{a0}' || c >= '\u{20A0}' {
return c;
}
if c <= '\u{29f}' {
return LATIN_1AB[c as usize - '\u{a0}' as usize];
}
if c < '\u{1e00}' {
return c;
}
if c <= '\u{1eff}' {
return LATIN_EXTENDED_ADDITIONAL[c as usize - '\u{1e00}' as usize];
}
if c < '\u{2070}' {
return c;
}
SUPERSCRIPTS_AND_SUBSCRIPTS[c as usize - '\u{2070}' as usize]
}
static LATIN_1AB: [char; 512] = [
'\u{a0}', '!', '¢', '£', '¤', '¥', '¦', '§', '¨', '©', 'a', '«', '¬', '\u{ad}', '®', '¯', '°', '±', '2', '3', '´', 'µ', '¶', '·', '¸', '1', '0', '»', '¼', '½', '¾', '?', 'A', 'A', 'A', 'A', 'A', 'A', 'Æ', 'C', 'E', 'E', 'E', 'E', 'I', 'I', 'I', 'I', 'D', 'N', 'O', 'O', 'O', 'O', 'O', '×', 'O', 'U', 'U', 'U', 'U', 'Y', 'Þ', 's', 'a', 'a', 'a', 'a', 'a', 'a', 'æ', 'c', 'e', 'e', 'e', 'e', 'i', 'i', 'i', 'i', 'd', 'n', 'o', 'o', 'o', 'o', 'o', '÷', 'o', 'u', 'u', 'u', 'u', 'y', 'þ', 'y', 'A', 'a', 'A', 'a', 'A', 'a', 'C', 'c', 'C', 'c', 'C', 'c', 'C', 'c', 'D', 'd', 'D', 'd', 'E', 'e', 'E', 'e', 'E', 'e', 'E', 'e', 'E', 'e', 'G', 'g', 'G', 'g', 'G', 'g', 'G', 'g', 'H', 'h', 'H', 'h', 'I', 'i', 'I', 'i', 'I', 'i', 'I', 'i', 'I', 'i', 'IJ', 'ij', 'J', 'j', 'K', 'k', 'ĸ', 'L', 'l', 'L', 'l', 'L', 'l', 'L', 'l', 'L', 'l', 'N', 'n', 'N', 'n', 'N', 'n', 'n', 'N', 'n', 'O', 'o', 'O', 'o', 'O', 'o', 'Œ', 'œ', 'R', 'r', 'R', 'r', 'R', 'r', 'S', 's', 'S', 's', 'S', 's', 'S', 's', 'T', 't', 'T', 't', 'T', 't', 'U', 'u', 'U', 'u', 'U', 'u', 'U', 'u', 'U', 'u', 'U', 'u', 'W', 'w', 'Y', 'y', 'Y', 'Z', 'z', 'Z', 'z', 'Z', 'z', 's', 'b', 'B', 'b', 'b', 'b', 'ƅ', 'O', 'C', 'c', 'D', 'D', 'd', 'd', 'ƍ', 'E', 'e', 'E', 'F', 'f', 'G', 'Ɣ', 'h', 'I', 'I', 'Ƙ', 'k', 'l', 'ƛ', 'M', 'N', 'n', 'O', 'O', 'o', 'Ƣ', 'ƣ', 'P', 'p', 'R', 'S', 's', 'Ʃ', 'l', 't', 'T', 't', 'T', 'U', 'u', 'Ʊ', 'V', 'Y', 'y', 'Z', 'z', 'Ʒ', 'Ƹ', 'ƹ', 'ƺ', 'ƻ', 'Ƽ', 'ƽ', 'ƾ', 'ƿ', 'ǀ', 'ǁ', 'ǂ', '!', 'DŽ', 'Dž', 'dž', 'LJ', 'Lj', 'lj', 'NJ', 'Nj', 'nj', 'A', 'a', 'I', 'i', 'O', 'o', 'U', 'u', 'U', 'u', 'U', 'u', 'U', 'u', 'U', 'u', 'e', 'A', 'a', 'A', 'a', 'Æ', 'æ', 'G', 'g', 'G', 'g', 'K', 'k', 'O', 'o', 'O', 'o', 'Ǯ', 'ǯ', 'j', 'DZ', 'Dz', 'dz', 'G', 'g', 'Ƕ', 'Ƿ', 'N', 'n', 'A', 'a', 'Æ', 'æ', 'O', 'o', 'A', 'a', 'A', 'a', 'E', 'e', 'E', 'e', 'I', 'i', 'I', 'i', 'O', 'o', 'O', 'o', 'R', 'r', 'R', 'r', 'U', 'u', 'U', 'u', 'S', 's', 'T', 't', 'Ȝ', 'ȝ', 'H', 'h', 'N', 'd', 'Ȣ', 'ȣ', 'Z', 'z', 'A', 'a', 'E', 'e', 'O', 'o', 'O', 'o', 'O', 'o', 'O', 'o', 'Y', 'y', 'l', 'n', 't', 'j', 'ȸ', 'ȹ', 'A', 'C', 'c', 'L', 'T', 's', 'z', 'Ɂ', 'ɂ', 'B', 'U', 'V', 'E', 'e', 'J', 'j', 'Q', 'q', 'R', 'r', 'Y', 'y', 'a', 'a', 'a', 'b', 'c', 'c', 'd', 'd', 'e', 'e', 'e', 'e', 'e', 'e', 'e', 'j', 'g', 'g', 'G', 'g', 'u', 'h', 'h', 'h', 'i', 'i', 'I', 'l', 'l', 'l', 'ɮ', 'm', 'm', 'm', 'n', 'n', 'N', 'o', 'ɶ', 'ɷ', 'ɸ', 'r', 'r', 'r', 'r', 'r', 'r', 'r', 'R', 'R', 's', 'ʃ', 'ʄ', 'ʅ', 'ʆ', 't', 't', 'u', 'ʊ', 'v', 'v', 'w', 'y', 'Y', 'z', 'z', 'ʒ', 'ʓ', 'ʔ', 'ʕ', 'ʖ', 'c', 'ʘ', 'B', 'e', 'G', 'H', 'j', 'k', 'L', ];
static LATIN_EXTENDED_ADDITIONAL: [char; 256] = [
'A', 'a', 'B', 'b', 'B', 'b', 'B', 'b', 'C', 'c', 'D', 'e', 'D', 'd', 'D', 'd', 'D', 'd', 'D', 'd', 'E', 'e', 'E', 'e', 'E', 'e', 'E', 'e', 'E', 'e', 'F', 'f', 'G', 'g', 'H', 'g', 'H', 'g', 'H', 'g', 'H', 'g', 'H', 'h', 'I', 'i', 'I', 'i', 'K', 'k', 'K', 'k', 'K', 'k', 'L', 'l', 'L', 'l', 'L', 'l', 'L', 'l', 'M', 'm', 'M', 'm', 'M', 'm', 'N', 'n', 'N', 'n', 'N', 'n', 'N', 'n', 'O', 'o', 'O', 'o', 'O', 'o', 'O', 'o', 'P', 'p', 'P', 'p', 'R', 'r', 'R', 'r', 'R', 'r', 'R', 'r', 'S', 's', 'S', 's', 'S', 's', 'S', 's', 'S', 's', 'T', 't', 'T', 't', 'T', 't', 'T', 't', 'U', 'u', 'U', 'u', 'U', 'u', 'U', 'u', 'U', 'u', 'V', 'v', 'V', 'v', 'W', 'w', 'W', 'w', 'W', 'w', 'W', 'w', 'W', 'j', 'X', 'x', 'X', 'x', 'Y', 'y', 'Z', 'z', 'Z', 'z', 'Z', 'z', 'h', 't', 'w', 'y', 'a', 'i', 'f', 'f', 'ẞ', 'ẟ', 'A', 'a', 'A', 'a', 'A', 'a', 'A', 'a', 'A', 'a', 'A', 'a', 'A', 'a', 'A', 'a', 'A', 'a', 'A', 'a', 'A', 'a', 'A', 'a', 'E', 'e', 'E', 'e', 'E', 'e', 'E', 'e', 'E', 'e', 'E', 'e', 'E', 'e', 'E', 'e', 'I', 'i', 'I', 'i', 'O', 'o', 'O', 'o', 'O', 'o', 'O', 'o', 'O', 'o', 'O', 'o', 'O', 'o', 'O', 'o', 'O', 'o', 'O', 'o', 'O', 'o', 'O', 'o', 'U', 'u', 'U', 'u', 'U', 'u', 'U', 'u', 'U', 'u', 'U', 'u', 'U', 'u', 'Y', 'y', 'Y', 'y', 'Y', 'y', 'Y', 'y', 'Ỻ', 'ỻ', 'Ỽ', 'ỽ', 'Ỿ', 'ỿ', ];
static SUPERSCRIPTS_AND_SUBSCRIPTS: [char; 48] = [
'0', 'i', '', '', '4', '5', '6', '7', '8', '0', '+', '-', '=', '(', ')', 'n', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '-', '=', '(', ')', '', 'a', 'e', 'o', 'x', 'e', 'h', 'k', 'l', 'm', 'n', 'p', 's', 't', '', '', '', ];
#[cfg(test)]
mod tests {
use super::*;
fn check_conversions(pairs: &[(char, char)]) {
for (original, normalized) in pairs {
assert_eq!(normalize_latin(*original), *normalized);
}
}
#[test]
fn general() {
check_conversions(&[
('ą', 'a'),
('À', 'A'),
('ć', 'c'),
('ę', 'e'),
('ł', 'l'),
('ń', 'n'),
('ó', 'o'),
('ś', 's'),
('ź', 'z'),
('ż', 'z'),
('Ą', 'A'),
('Ć', 'C'),
('Ę', 'E'),
('ł', 'l'),
('Ł', 'L'),
('Ń', 'N'),
('Ó', 'O'),
('Ś', 'S'),
('Ź', 'Z'),
('Ż', 'Z'),
('¡', '!'),
]);
}
#[test]
fn invisible_chars() {
check_conversions(&[('\u{a0}', '\u{a0}'), ('\u{ad}', '\u{ad}')]);
}
#[test]
fn boundary_cases() {
check_conversions(&[
('\u{9f}', '\u{9f}'),
('\u{a0}', '\u{a0}'),
('¡', '!'),
('ʟ', 'L'),
('\u{2a0}', '\u{2a0}'),
('\u{1dff}', '\u{1dff}'),
('Ḁ', 'A'),
('ỹ', 'y'),
('\u{1eff}', '\u{1eff}'),
('\u{1f00}', '\u{1f00}'),
('⁰', '0'),
('\u{209c}', 't'),
('\u{209f}', '\u{209f}'),
('\u{20a0}', '\u{20a0}'),
]);
}
#[test]
fn unchanged_outside_blocks() {
check_conversions(&[
('a', 'a'),
('⟁', '⟁'),
('┍', '┍'),
('ω', 'ω'),
('⁕', '⁕'),
('ה', 'ה'),
]);
}
}