diff --git a/src/formats/docx/content.rs b/src/formats/docx/content.rs index c5a7c18b..c1db505d 100644 --- a/src/formats/docx/content.rs +++ b/src/formats/docx/content.rs @@ -501,6 +501,11 @@ impl<'a, 'b, 'e> InlineWalker<'a, 'b, 'e> { self.push(Inline::Text { text, style }); } } + "sym" => { + if let Some(text) = super::symbols::glyph(child) { + self.push(Inline::Text { text, style }); + } + } "tab" | "ptab" => self.push(Inline::Text { text: " ".into(), style: Style::PLAIN }), // Markdown has no pages or columns, but every w:br still // separates the runs around it: dropping a page break diff --git a/src/formats/docx/mod.rs b/src/formats/docx/mod.rs index eee5317e..300876a9 100644 --- a/src/formats/docx/mod.rs +++ b/src/formats/docx/mod.rs @@ -6,6 +6,7 @@ mod content; mod numbering; mod styles; +mod symbols; use crate::error::ConvertError; use crate::model::{Document, Note, NoteKind}; @@ -247,6 +248,95 @@ mod tests { ); } + #[test] + fn symbol_glyphs_load_from_the_font_code_page() { + // Word's legacy round bullet is Symbol F0B7 (#193); Wingdings' + // bullet squares and arrowheads, and Symbol's operators, come from + // the same code-page tables. Both the byte form and the U+F000..F0FF + // form must load, and the font name is case-insensitive. + for (font, form, expected) in [ + ("Symbol", "F0B7", "\u{2022}"), + ("Symbol", "00B7", "\u{2022}"), + ("symbol", "f0b7", "\u{2022}"), + ("Wingdings", "F0A7", "\u{25aa}"), + ("WINGDINGS", "00A7", "\u{25aa}"), + ("Wingdings", "F0D8", "\u{27a2}"), + ("Wingdings", "F0B7", "\u{1f550}"), + ("Symbol", "F0A3", "\u{2264}"), + ("Symbol", "F0B3", "\u{2265}"), + ("Symbol", "F0BA", "\u{2261}"), + ("Symbol", "F0BB", "\u{2248}"), + ] { + let document = format!( + r#" + before after + "# + ); + let bytes = docx_parts(&[("word/document.xml", &document)]); + let doc = parse(&bytes).unwrap(); + let Some(Block::Paragraph(inlines)) = doc.blocks.first() else { panic!() }; + assert_eq!( + crate::model::inlines_to_plain_text(inlines), + format!("before {expected} after"), + ); + } + } + + #[test] + fn symbol_glyphs_accept_a_unicode_valued_w_char() { + // Converters that store the character itself in w:char keep working + // for the symbol fonts (#193's Symbol operators). A value too large + // to be a font code is the character; private-use values never load. + for (form, expected) in [("2264", "\u{2264}"), ("2248", "\u{2248}")] { + let document = format!( + r#" + p q + "# + ); + let bytes = docx_parts(&[("word/document.xml", &document)]); + let doc = parse(&bytes).unwrap(); + let Some(Block::Paragraph(inlines)) = doc.blocks.first() else { panic!() }; + assert_eq!(crate::model::inlines_to_plain_text(inlines), format!("p {expected} q")); + } + for font in ["Wingdings", "Symbol"] { + let document = format!( + r#" + beforeafter + "# + ); + let bytes = docx_parts(&[("word/document.xml", &document)]); + let doc = parse(&bytes).unwrap(); + let Some(Block::Paragraph(inlines)) = doc.blocks.first() else { panic!() }; + assert_eq!(crate::model::inlines_to_plain_text(inlines), "beforeafter"); + } + } + + #[test] + fn unknown_or_malformed_symbol_glyphs_stay_dropped() { + for attrs in [ + r#"w:font="Arial" w:char="2013""#, + r#"w:font="Wingdings" w:char="0010""#, + r#"w:font="Wingdings" w:char="not-hex""#, + r#"w:font="Wingdings" w:char="+00A7""#, + r#"w:font="Wingdings" w:char="""#, + r#"w:font="Wingdings" w:char="100A7""#, + r#"w:font="Wingdings""#, + r#"w:char="F0A7""#, + ] { + let document = format!( + r#" + beforeafter + "# + ); + let bytes = docx_parts(&[("word/document.xml", &document)]); + assert_eq!( + crate::to_markdown_bytes(&bytes, crate::Format::Docx).unwrap().trim(), + "beforeafter", + "attrs: {attrs}", + ); + } + } + #[test] fn unmarked_run_edge_whitespace_is_kept() { // Converters that never write xml:space carry inter-word spacing on diff --git a/src/formats/docx/symbols.rs b/src/formats/docx/symbols.rs new file mode 100644 index 00000000..7c777469 --- /dev/null +++ b/src/formats/docx/symbols.rs @@ -0,0 +1,1141 @@ +//! Symbol-font code pages for `w:sym`: the glyph drawn from Wingdings, +//! Wingdings 2, Wingdings 3, Webdings or Symbol, mapped to Unicode text. +//! +//! Source: the tables docx4j ships as `SymbolMapper.java` (Apache-2.0), +//! which record Alan Wood's code-page mappings for the Microsoft symbol +//! fonts (alanwood.net). Every entry was cross-checked against pandoc's +//! independent table (GPL, validation only); the two agree except where +//! docx4j notes a deliberate correction (Wingdings 0xd8 -> U+27A2). + +use crate::package::xml::{Element, ns}; + +/// The Unicode text of one `w:sym` glyph, or `None` when its font and code +/// are unknown to the tables. +pub(super) fn glyph(symbol: &Element) -> Option { + let font = symbol.attr(ns::W, "font")?; + let value = symbol.attr(ns::W, "char")?; + // Reject signs and overlong values even when integer parsing accepts them. + if value.is_empty() || value.len() > 4 || !value.bytes().all(|b| b.is_ascii_hexdigit()) { + return None; + } + let raw = u32::from_str_radix(value, 16).ok()?; + // Word stores legacy symbol-font codes both as bytes and in U+F000..F0FF. + let code = match raw { + 0xf000..=0xf0ff => raw - 0xf000, + _ => raw, + }; + let page = code_page(font)?; + if let Ok(byte) = u8::try_from(code) { + if let Ok(index) = page.binary_search_by_key(&byte, |entry| entry.0) { + return Some(page[index].1.to_string()); + } + } else if let Some(character) = char::from_u32(raw) { + // Some generators store the Unicode scalar itself in w:char when + // the font is a symbol font, so a value too large to be a code byte + // is the character (issue #193's Symbol `2264` for <=). Private-use + // and control values stay out: a font-relative code never loads. + if !character.is_control() && !(0xe000..0xf900).contains(&raw) { + return Some(character.to_string()); + } + } + log::debug!("dropping w:sym glyph: {font} has no entry for its code"); + None +} + +/// The code page of a known symbol font, or `None` for every other font: +/// a `w:sym` of Arial or Times is not this table's business. +fn code_page(font: &str) -> Option<&'static [(u8, &str)]> { + if font.eq_ignore_ascii_case("Wingdings") { + Some(WINGDINGS) + } else if font.eq_ignore_ascii_case("Wingdings 2") { + Some(WINGDINGS_2) + } else if font.eq_ignore_ascii_case("Wingdings 3") { + Some(WINGDINGS_3) + } else if font.eq_ignore_ascii_case("Webdings") { + Some(WEBDINGS) + } else if font.eq_ignore_ascii_case("Symbol") { + Some(SYMBOL) + } else { + None + } +} + +/// Wingdings: the code page Word's `w:sym` draws from (gaps are not in the font). +static WINGDINGS: &[(u8, &str)] = &[ + (0x20, "\u{20}"), + (0x21, "\u{1f589}"), + (0x22, "\u{2702}"), + (0x23, "\u{2701}"), + (0x24, "\u{1f453}"), + (0x25, "\u{1f56d}"), + (0x26, "\u{1f56e}"), + (0x27, "\u{1f56f}"), + (0x28, "\u{1f57f}"), + (0x29, "\u{2706}"), + (0x2a, "\u{1f582}"), + (0x2b, "\u{1f583}"), + (0x2c, "\u{1f4ea}"), + (0x2d, "\u{1f4eb}"), + (0x2e, "\u{1f4ec}"), + (0x2f, "\u{1f4ed}"), + (0x30, "\u{1f4c1}"), + (0x31, "\u{1f4c2}"), + (0x32, "\u{1f4c4}"), + (0x33, "\u{1f5cf}"), + (0x34, "\u{1f5d0}"), + (0x35, "\u{1f5c4}"), + (0x36, "\u{231b}"), + (0x37, "\u{1f5ae}"), + (0x38, "\u{1f5b0}"), + (0x39, "\u{1f5b2}"), + (0x3a, "\u{1f5b3}"), + (0x3b, "\u{1f5b4}"), + (0x3c, "\u{1f5ab}"), + (0x3d, "\u{1f5ac}"), + (0x3e, "\u{2707}"), + (0x3f, "\u{270d}"), + (0x40, "\u{1f58e}"), + (0x41, "\u{270c}"), + (0x42, "\u{1f44c}"), + (0x43, "\u{1f44d}"), + (0x44, "\u{1f44e}"), + (0x45, "\u{261c}"), + (0x46, "\u{261e}"), + (0x47, "\u{261d}"), + (0x48, "\u{261f}"), + (0x49, "\u{1f590}"), + (0x4a, "\u{263a}"), + (0x4b, "\u{1f610}"), + (0x4c, "\u{2639}"), + (0x4d, "\u{1f4a3}"), + (0x4e, "\u{2620}"), + (0x4f, "\u{1f3f3}"), + (0x50, "\u{1f3f1}"), + (0x51, "\u{2708}"), + (0x52, "\u{263c}"), + (0x53, "\u{1f4a7}"), + (0x54, "\u{2744}"), + (0x55, "\u{1f546}"), + (0x56, "\u{271e}"), + (0x57, "\u{1f548}"), + (0x58, "\u{2720}"), + (0x59, "\u{2721}"), + (0x5a, "\u{262a}"), + (0x5b, "\u{262f}"), + (0x5c, "\u{950}"), + (0x5d, "\u{2638}"), + (0x5e, "\u{2648}"), + (0x5f, "\u{2649}"), + (0x60, "\u{264a}"), + (0x61, "\u{264b}"), + (0x62, "\u{264c}"), + (0x63, "\u{264d}"), + (0x64, "\u{264e}"), + (0x65, "\u{264f}"), + (0x66, "\u{2650}"), + (0x67, "\u{2651}"), + (0x68, "\u{2652}"), + (0x69, "\u{2653}"), + (0x6a, "\u{1f670}"), + (0x6b, "\u{1f675}"), + (0x6c, "\u{25cf}"), + (0x6d, "\u{1f53e}"), + (0x6e, "\u{25a0}"), + (0x6f, "\u{25a1}"), + (0x70, "\u{1f790}"), + (0x71, "\u{2751}"), + (0x72, "\u{2752}"), + (0x73, "\u{2b27}"), + (0x74, "\u{29eb}"), + (0x75, "\u{25c6}"), + (0x76, "\u{2756}"), + (0x77, "\u{2b25}"), + (0x78, "\u{2327}"), + (0x79, "\u{2bb9}"), + (0x7a, "\u{2318}"), + (0x7b, "\u{1f3f5}"), + (0x7c, "\u{1f3f6}"), + (0x7d, "\u{1f676}"), + (0x7e, "\u{1f677}"), + (0x80, "\u{24ea}"), + (0x81, "\u{2460}"), + (0x82, "\u{2461}"), + (0x83, "\u{2462}"), + (0x84, "\u{2463}"), + (0x85, "\u{2464}"), + (0x86, "\u{2465}"), + (0x87, "\u{2466}"), + (0x88, "\u{2467}"), + (0x89, "\u{2468}"), + (0x8a, "\u{2469}"), + (0x8b, "\u{24ff}"), + (0x8c, "\u{2776}"), + (0x8d, "\u{2777}"), + (0x8e, "\u{2778}"), + (0x8f, "\u{2779}"), + (0x90, "\u{277a}"), + (0x91, "\u{277b}"), + (0x92, "\u{277c}"), + (0x93, "\u{277d}"), + (0x94, "\u{277e}"), + (0x95, "\u{277f}"), + (0x96, "\u{1f662}"), + (0x97, "\u{1f660}"), + (0x98, "\u{1f661}"), + (0x99, "\u{1f663}"), + (0x9a, "\u{1f65e}"), + (0x9b, "\u{1f65c}"), + (0x9c, "\u{1f65d}"), + (0x9d, "\u{1f65f}"), + (0x9e, "\u{b7}"), + (0x9f, "\u{2022}"), + (0xa0, "\u{25aa}"), + (0xa1, "\u{26aa}"), + (0xa2, "\u{1f786}"), + (0xa3, "\u{1f788}"), + (0xa4, "\u{25c9}"), + (0xa5, "\u{25ce}"), + (0xa6, "\u{1f53f}"), + (0xa7, "\u{25aa}"), + (0xa8, "\u{25fb}"), + (0xa9, "\u{1f7c2}"), + (0xaa, "\u{2726}"), + (0xab, "\u{2605}"), + (0xac, "\u{2736}"), + (0xad, "\u{2734}"), + (0xae, "\u{2739}"), + (0xaf, "\u{2735}"), + (0xb0, "\u{2bd0}"), + (0xb1, "\u{2316}"), + (0xb2, "\u{27e1}"), + (0xb3, "\u{2311}"), + (0xb4, "\u{2bd1}"), + (0xb5, "\u{272a}"), + (0xb6, "\u{2730}"), + (0xb7, "\u{1f550}"), + (0xb8, "\u{1f551}"), + (0xb9, "\u{1f552}"), + (0xba, "\u{1f553}"), + (0xbb, "\u{1f554}"), + (0xbc, "\u{1f555}"), + (0xbd, "\u{1f556}"), + (0xbe, "\u{1f557}"), + (0xbf, "\u{1f558}"), + (0xc0, "\u{1f559}"), + (0xc1, "\u{1f55a}"), + (0xc2, "\u{1f55b}"), + (0xc3, "\u{2bb0}"), + (0xc4, "\u{2bb1}"), + (0xc5, "\u{2bb2}"), + (0xc6, "\u{2bb3}"), + (0xc7, "\u{2bb4}"), + (0xc8, "\u{2bb5}"), + (0xc9, "\u{2bb6}"), + (0xca, "\u{2bb7}"), + (0xcb, "\u{1f66a}"), + (0xcc, "\u{1f66b}"), + (0xcd, "\u{1f595}"), + (0xce, "\u{1f594}"), + (0xcf, "\u{1f597}"), + (0xd0, "\u{1f596}"), + (0xd1, "\u{1f590}"), + (0xd2, "\u{1f591}"), + (0xd3, "\u{1f592}"), + (0xd4, "\u{1f593}"), + (0xd5, "\u{232b}"), + (0xd6, "\u{2326}"), + (0xd7, "\u{2b98}"), + (0xd8, "\u{27a2}"), + (0xd9, "\u{2b99}"), + (0xda, "\u{2b9b}"), + (0xdb, "\u{2b88}"), + (0xdc, "\u{2b8a}"), + (0xdd, "\u{2b89}"), + (0xde, "\u{2b8b}"), + (0xdf, "\u{1f868}"), + (0xe0, "\u{1f86a}"), + (0xe1, "\u{1f869}"), + (0xe2, "\u{1f86b}"), + (0xe3, "\u{1f86c}"), + (0xe4, "\u{1f86d}"), + (0xe5, "\u{1f86f}"), + (0xe6, "\u{1f86e}"), + (0xe7, "\u{1f878}"), + (0xe8, "\u{1f87a}"), + (0xe9, "\u{1f879}"), + (0xea, "\u{1f87b}"), + (0xeb, "\u{1f87c}"), + (0xec, "\u{1f87d}"), + (0xed, "\u{1f87f}"), + (0xee, "\u{1f87e}"), + (0xef, "\u{21e6}"), + (0xf0, "\u{21e8}"), + (0xf1, "\u{21e7}"), + (0xf2, "\u{21e9}"), + (0xf3, "\u{2b04}"), + (0xf4, "\u{21f3}"), + (0xf5, "\u{2b00}"), + (0xf6, "\u{2b01}"), + (0xf7, "\u{2b03}"), + (0xf8, "\u{2b02}"), + (0xf9, "\u{1f86c}"), + (0xfa, "\u{1f86d}"), + (0xfb, "\u{1f5f6}"), + (0xfc, "\u{2713}"), + (0xfd, "\u{1f5f7}"), + (0xfe, "\u{1f5f9}"), + (0xff, "\u{229e}"), +]; + +/// Wingdings 2: the code page Word's `w:sym` draws from (gaps are not in the font). +static WINGDINGS_2: &[(u8, &str)] = &[ + (0x20, "\u{20}"), + (0x21, "\u{1f58a}"), + (0x22, "\u{1f58b}"), + (0x23, "\u{1f58c}"), + (0x24, "\u{1f58d}"), + (0x25, "\u{2704}"), + (0x26, "\u{2700}"), + (0x27, "\u{1f57e}"), + (0x28, "\u{1f57d}"), + (0x29, "\u{1f5c5}"), + (0x2a, "\u{1f5c6}"), + (0x2b, "\u{1f5c7}"), + (0x2c, "\u{1f5c8}"), + (0x2d, "\u{1f5c9}"), + (0x2e, "\u{1f5ca}"), + (0x2f, "\u{1f5cb}"), + (0x30, "\u{1f5cc}"), + (0x31, "\u{1f5cd}"), + (0x32, "\u{1f4cb}"), + (0x33, "\u{1f5d1}"), + (0x34, "\u{1f5d4}"), + (0x35, "\u{1f5b5}"), + (0x36, "\u{1f5b6}"), + (0x37, "\u{1f5b7}"), + (0x38, "\u{1f5b8}"), + (0x39, "\u{1f5ad}"), + (0x3a, "\u{1f5af}"), + (0x3b, "\u{1f5b1}"), + (0x3c, "\u{1f592}"), + (0x3d, "\u{1f593}"), + (0x3e, "\u{1f598}"), + (0x3f, "\u{1f599}"), + (0x40, "\u{1f59a}"), + (0x41, "\u{1f59b}"), + (0x42, "\u{1f448}"), + (0x43, "\u{1f449}"), + (0x44, "\u{1f59c}"), + (0x45, "\u{1f59d}"), + (0x46, "\u{1f59e}"), + (0x47, "\u{1f59f}"), + (0x48, "\u{1f5a0}"), + (0x49, "\u{1f5a1}"), + (0x4a, "\u{1f446}"), + (0x4b, "\u{1f447}"), + (0x4c, "\u{1f5a2}"), + (0x4d, "\u{1f5a3}"), + (0x4e, "\u{1f591}"), + (0x4f, "\u{1f5f4}"), + (0x50, "\u{2713}"), + (0x51, "\u{1f5f5}"), + (0x52, "\u{2611}"), + (0x53, "\u{2612}"), + (0x54, "\u{2612}"), + (0x55, "\u{2bbe}"), + (0x56, "\u{2bbf}"), + (0x57, "\u{29b8}"), + (0x58, "\u{29b8}"), + (0x59, "\u{1f671}"), + (0x5a, "\u{1f674}"), + (0x5b, "\u{1f672}"), + (0x5c, "\u{1f673}"), + (0x5d, "\u{203d}"), + (0x5e, "\u{1f679}"), + (0x5f, "\u{1f67a}"), + (0x60, "\u{1f67b}"), + (0x61, "\u{1f666}"), + (0x62, "\u{1f664}"), + (0x63, "\u{1f665}"), + (0x64, "\u{1f667}"), + (0x65, "\u{1f65a}"), + (0x66, "\u{1f658}"), + (0x67, "\u{1f659}"), + (0x68, "\u{1f65b}"), + (0x69, "\u{24ea}"), + (0x6a, "\u{2460}"), + (0x6b, "\u{2461}"), + (0x6c, "\u{2462}"), + (0x6d, "\u{2463}"), + (0x6e, "\u{2464}"), + (0x6f, "\u{2465}"), + (0x70, "\u{2466}"), + (0x71, "\u{2467}"), + (0x72, "\u{2468}"), + (0x73, "\u{2469}"), + (0x74, "\u{24ff}"), + (0x75, "\u{2776}"), + (0x76, "\u{2777}"), + (0x77, "\u{2778}"), + (0x78, "\u{2779}"), + (0x79, "\u{277a}"), + (0x7a, "\u{277b}"), + (0x7b, "\u{277c}"), + (0x7c, "\u{277d}"), + (0x7d, "\u{277e}"), + (0x7e, "\u{277f}"), + (0x80, "\u{2609}"), + (0x81, "\u{1f315}"), + (0x82, "\u{263d}"), + (0x83, "\u{263e}"), + (0x84, "\u{2e3f}"), + (0x85, "\u{271d}"), + (0x86, "\u{1f547}"), + (0x87, "\u{1f55c}"), + (0x88, "\u{1f55d}"), + (0x89, "\u{1f55e}"), + (0x8a, "\u{1f55f}"), + (0x8b, "\u{1f560}"), + (0x8c, "\u{1f561}"), + (0x8d, "\u{1f562}"), + (0x8e, "\u{1f563}"), + (0x8f, "\u{1f564}"), + (0x90, "\u{1f565}"), + (0x91, "\u{1f566}"), + (0x92, "\u{1f567}"), + (0x93, "\u{1f668}"), + (0x94, "\u{1f669}"), + (0x95, "\u{2022}"), + (0x96, "\u{25cf}"), + (0x97, "\u{26ab}"), + (0x98, "\u{2b24}"), + (0x99, "\u{1f785}"), + (0x9a, "\u{1f786}"), + (0x9b, "\u{1f787}"), + (0x9c, "\u{1f788}"), + (0x9d, "\u{1f78a}"), + (0x9e, "\u{29bf}"), + (0x9f, "\u{25fe}"), + (0xa0, "\u{25a0}"), + (0xa1, "\u{25fc}"), + (0xa2, "\u{2b1b}"), + (0xa3, "\u{2b1c}"), + (0xa4, "\u{1f791}"), + (0xa5, "\u{1f792}"), + (0xa6, "\u{1f793}"), + (0xa7, "\u{1f794}"), + (0xa8, "\u{25a3}"), + (0xa9, "\u{1f795}"), + (0xaa, "\u{1f796}"), + (0xab, "\u{1f797}"), + (0xac, "\u{2b29}"), + (0xad, "\u{2b25}"), + (0xae, "\u{25c6}"), + (0xaf, "\u{25c7}"), + (0xb0, "\u{1f79a}"), + (0xb1, "\u{25c8}"), + (0xb2, "\u{1f79b}"), + (0xb3, "\u{1f79c}"), + (0xb4, "\u{1f79d}"), + (0xb5, "\u{2b2a}"), + (0xb6, "\u{2b27}"), + (0xb7, "\u{29eb}"), + (0xb8, "\u{25ca}"), + (0xb9, "\u{1f7a0}"), + (0xba, "\u{25d6}"), + (0xbb, "\u{25d7}"), + (0xbc, "\u{2bca}"), + (0xbd, "\u{2bcb}"), + (0xbe, "\u{25fc}"), + (0xbf, "\u{2b25}"), + (0xc0, "\u{2b1f}"), + (0xc1, "\u{2bc2}"), + (0xc2, "\u{2b23}"), + (0xc3, "\u{2b22}"), + (0xc4, "\u{2bc3}"), + (0xc5, "\u{2bc4}"), + (0xc6, "\u{1f7a1}"), + (0xc7, "\u{1f7a2}"), + (0xc8, "\u{1f7a3}"), + (0xc9, "\u{1f7a4}"), + (0xca, "\u{1f7a5}"), + (0xcb, "\u{1f7a6}"), + (0xcc, "\u{1f7a7}"), + (0xcd, "\u{1f7a8}"), + (0xce, "\u{1f7a9}"), + (0xcf, "\u{1f7aa}"), + (0xd0, "\u{1f7ab}"), + (0xd1, "\u{1f7ac}"), + (0xd2, "\u{1f7ad}"), + (0xd3, "\u{1f7ae}"), + (0xd4, "\u{1f7af}"), + (0xd5, "\u{1f7b0}"), + (0xd6, "\u{1f7b1}"), + (0xd7, "\u{1f7b2}"), + (0xd8, "\u{1f7b3}"), + (0xd9, "\u{1f7b4}"), + (0xda, "\u{1f7b5}"), + (0xdb, "\u{1f7b6}"), + (0xdc, "\u{1f7b7}"), + (0xdd, "\u{1f7b8}"), + (0xde, "\u{1f7b9}"), + (0xdf, "\u{1f7ba}"), + (0xe0, "\u{1f7bb}"), + (0xe1, "\u{1f7bc}"), + (0xe2, "\u{1f7bd}"), + (0xe3, "\u{1f7be}"), + (0xe4, "\u{1f7bf}"), + (0xe5, "\u{1f7c0}"), + (0xe6, "\u{1f7c2}"), + (0xe7, "\u{1f7c4}"), + (0xe8, "\u{2726}"), + (0xe9, "\u{1f7c9}"), + (0xea, "\u{2605}"), + (0xeb, "\u{2736}"), + (0xec, "\u{1f7cb}"), + (0xed, "\u{2737}"), + (0xee, "\u{1f7cf}"), + (0xef, "\u{1f7d2}"), + (0xf0, "\u{2739}"), + (0xf1, "\u{1f7c3}"), + (0xf2, "\u{1f7c7}"), + (0xf3, "\u{272f}"), + (0xf4, "\u{1f7cd}"), + (0xf5, "\u{1f7d4}"), + (0xf6, "\u{2bcc}"), + (0xf7, "\u{2bcd}"), + (0xf8, "\u{203b}"), + (0xf9, "\u{2042}"), +]; + +/// Wingdings 3: the code page Word's `w:sym` draws from (gaps are not in the font). +static WINGDINGS_3: &[(u8, &str)] = &[ + (0x20, "\u{20}"), + (0x21, "\u{2b60}"), + (0x22, "\u{2b62}"), + (0x23, "\u{2b61}"), + (0x24, "\u{2b63}"), + (0x25, "\u{2b66}"), + (0x26, "\u{2b67}"), + (0x27, "\u{2b69}"), + (0x28, "\u{2b68}"), + (0x29, "\u{2b70}"), + (0x2a, "\u{2b72}"), + (0x2b, "\u{2b71}"), + (0x2c, "\u{2b73}"), + (0x2d, "\u{2b76}"), + (0x2e, "\u{2b78}"), + (0x2f, "\u{2b7b}"), + (0x30, "\u{2b7d}"), + (0x31, "\u{2b64}"), + (0x32, "\u{2b65}"), + (0x33, "\u{2b6a}"), + (0x34, "\u{2b6c}"), + (0x35, "\u{2b6b}"), + (0x36, "\u{2b6d}"), + (0x37, "\u{2b4d}"), + (0x38, "\u{2ba0}"), + (0x39, "\u{2ba1}"), + (0x3a, "\u{2ba2}"), + (0x3b, "\u{2ba3}"), + (0x3c, "\u{2ba4}"), + (0x3d, "\u{2ba5}"), + (0x3e, "\u{2ba6}"), + (0x3f, "\u{2ba7}"), + (0x40, "\u{2b90}"), + (0x41, "\u{2b91}"), + (0x42, "\u{2b92}"), + (0x43, "\u{2b93}"), + (0x44, "\u{2b80}"), + (0x45, "\u{2b83}"), + (0x46, "\u{2b7e}"), + (0x47, "\u{2b7f}"), + (0x48, "\u{2b84}"), + (0x49, "\u{2b86}"), + (0x4a, "\u{2b85}"), + (0x4b, "\u{2b87}"), + (0x4c, "\u{2b8f}"), + (0x4d, "\u{2b8d}"), + (0x4e, "\u{2b8e}"), + (0x4f, "\u{2b8c}"), + (0x50, "\u{2b6e}"), + (0x51, "\u{2b6f}"), + (0x52, "\u{238b}"), + (0x53, "\u{2324}"), + (0x54, "\u{2303}"), + (0x55, "\u{2325}"), + (0x56, "\u{23b5}"), + (0x57, "\u{237d}"), + (0x58, "\u{21ea}"), + (0x59, "\u{2bb8}"), + (0x5a, "\u{1f8a0}"), + (0x5b, "\u{1f8a1}"), + (0x5c, "\u{1f8a2}"), + (0x5d, "\u{1f8a3}"), + (0x5e, "\u{1f8a4}"), + (0x5f, "\u{1f8a5}"), + (0x60, "\u{1f8a6}"), + (0x61, "\u{1f8a7}"), + (0x62, "\u{1f8a8}"), + (0x63, "\u{1f8a9}"), + (0x64, "\u{1f8aa}"), + (0x65, "\u{1f8ab}"), + (0x66, "\u{2190}"), + (0x67, "\u{2192}"), + (0x68, "\u{2191}"), + (0x69, "\u{2193}"), + (0x6a, "\u{2196}"), + (0x6b, "\u{2197}"), + (0x6c, "\u{2199}"), + (0x6d, "\u{2198}"), + (0x6e, "\u{1f858}"), + (0x6f, "\u{1f859}"), + (0x70, "\u{25b2}"), + (0x71, "\u{25bc}"), + (0x72, "\u{25b3}"), + (0x73, "\u{25bd}"), + (0x74, "\u{25c4}"), + (0x75, "\u{25ba}"), + (0x76, "\u{25c1}"), + (0x77, "\u{25b7}"), + (0x78, "\u{25e3}"), + (0x79, "\u{25e2}"), + (0x7a, "\u{25e4}"), + (0x7b, "\u{25e5}"), + (0x7c, "\u{1f780}"), + (0x7d, "\u{1f782}"), + (0x7e, "\u{1f781}"), + (0x80, "\u{1f783}"), + (0x81, "\u{25b2}"), + (0x82, "\u{25bc}"), + (0x83, "\u{25c0}"), + (0x84, "\u{25b6}"), + (0x85, "\u{2b9c}"), + (0x86, "\u{2b9e}"), + (0x87, "\u{2b9d}"), + (0x88, "\u{2b9f}"), + (0x89, "\u{1f810}"), + (0x8a, "\u{1f812}"), + (0x8b, "\u{1f811}"), + (0x8c, "\u{1f813}"), + (0x8d, "\u{1f814}"), + (0x8e, "\u{1f816}"), + (0x8f, "\u{1f815}"), + (0x90, "\u{1f817}"), + (0x91, "\u{1f818}"), + (0x92, "\u{1f81a}"), + (0x93, "\u{1f819}"), + (0x94, "\u{1f81b}"), + (0x95, "\u{1f81c}"), + (0x96, "\u{1f81e}"), + (0x97, "\u{1f81d}"), + (0x98, "\u{1f81f}"), + (0x99, "\u{1f800}"), + (0x9a, "\u{1f802}"), + (0x9b, "\u{1f801}"), + (0x9c, "\u{1f803}"), + (0x9d, "\u{1f804}"), + (0x9e, "\u{1f806}"), + (0x9f, "\u{1f805}"), + (0xa0, "\u{1f807}"), + (0xa1, "\u{1f808}"), + (0xa2, "\u{1f80a}"), + (0xa3, "\u{1f809}"), + (0xa4, "\u{1f80b}"), + (0xa5, "\u{1f820}"), + (0xa6, "\u{1f822}"), + (0xa7, "\u{1f824}"), + (0xa8, "\u{1f826}"), + (0xa9, "\u{1f828}"), + (0xaa, "\u{1f82a}"), + (0xab, "\u{1f82c}"), + (0xac, "\u{1f89c}"), + (0xad, "\u{1f89d}"), + (0xae, "\u{1f89e}"), + (0xaf, "\u{1f89f}"), + (0xb0, "\u{1f82e}"), + (0xb1, "\u{1f830}"), + (0xb2, "\u{1f832}"), + (0xb3, "\u{1f834}"), + (0xb4, "\u{1f836}"), + (0xb5, "\u{1f838}"), + (0xb6, "\u{1f83a}"), + (0xb7, "\u{1f839}"), + (0xb8, "\u{1f83b}"), + (0xb9, "\u{1f898}"), + (0xba, "\u{1f89a}"), + (0xbb, "\u{1f899}"), + (0xbc, "\u{1f89b}"), + (0xbd, "\u{1f83c}"), + (0xbe, "\u{1f83e}"), + (0xbf, "\u{1f83d}"), + (0xc0, "\u{1f83f}"), + (0xc1, "\u{1f840}"), + (0xc2, "\u{1f842}"), + (0xc3, "\u{1f841}"), + (0xc4, "\u{1f843}"), + (0xc5, "\u{1f844}"), + (0xc6, "\u{1f846}"), + (0xc7, "\u{1f845}"), + (0xc8, "\u{1f847}"), + (0xc9, "\u{2ba8}"), + (0xca, "\u{2ba9}"), + (0xcb, "\u{2baa}"), + (0xcc, "\u{2bab}"), + (0xcd, "\u{2bac}"), + (0xce, "\u{2bad}"), + (0xcf, "\u{2bae}"), + (0xd0, "\u{2baf}"), + (0xd1, "\u{1f860}"), + (0xd2, "\u{1f862}"), + (0xd3, "\u{1f861}"), + (0xd4, "\u{1f863}"), + (0xd5, "\u{1f864}"), + (0xd6, "\u{1f865}"), + (0xd7, "\u{1f867}"), + (0xd8, "\u{1f866}"), + (0xd9, "\u{1f870}"), + (0xda, "\u{1f872}"), + (0xdb, "\u{1f871}"), + (0xdc, "\u{1f873}"), + (0xdd, "\u{1f874}"), + (0xde, "\u{1f875}"), + (0xdf, "\u{1f877}"), + (0xe0, "\u{1f876}"), + (0xe1, "\u{1f880}"), + (0xe2, "\u{1f882}"), + (0xe3, "\u{1f881}"), + (0xe4, "\u{1f883}"), + (0xe5, "\u{1f884}"), + (0xe6, "\u{1f885}"), + (0xe7, "\u{1f887}"), + (0xe8, "\u{1f886}"), + (0xe9, "\u{1f890}"), + (0xea, "\u{1f892}"), + (0xeb, "\u{1f891}"), + (0xec, "\u{1f893}"), + (0xed, "\u{1f894}"), + (0xee, "\u{1f896}"), + (0xef, "\u{1f895}"), + (0xf0, "\u{1f897}"), +]; + +/// Webdings: the code page Word's `w:sym` draws from (gaps are not in the font). +static WEBDINGS: &[(u8, &str)] = &[ + (0x20, "\u{20}"), + (0x21, "\u{1f577}"), + (0x22, "\u{1f578}"), + (0x23, "\u{1f572}"), + (0x24, "\u{1f576}"), + (0x25, "\u{1f3c6}"), + (0x26, "\u{1f396}"), + (0x27, "\u{1f587}"), + (0x28, "\u{1f5e8}"), + (0x29, "\u{1f5e9}"), + (0x2a, "\u{1f5f0}"), + (0x2b, "\u{1f5f1}"), + (0x2c, "\u{1f336}"), + (0x2d, "\u{1f397}"), + (0x2e, "\u{1f67e}"), + (0x2f, "\u{1f67c}"), + (0x30, "\u{1f5d5}"), + (0x31, "\u{1f5d6}"), + (0x32, "\u{1f5d7}"), + (0x33, "\u{23f4}"), + (0x34, "\u{23f5}"), + (0x35, "\u{23f6}"), + (0x36, "\u{23f7}"), + (0x37, "\u{23ea}"), + (0x38, "\u{23e9}"), + (0x39, "\u{23ee}"), + (0x3a, "\u{23ed}"), + (0x3b, "\u{23f8}"), + (0x3c, "\u{23f9}"), + (0x3d, "\u{23fa}"), + (0x3e, "\u{1f5da}"), + (0x3f, "\u{1f5f3}"), + (0x40, "\u{1f6e0}"), + (0x41, "\u{1f3d7}"), + (0x42, "\u{1f3d8}"), + (0x43, "\u{1f3d9}"), + (0x44, "\u{1f3da}"), + (0x45, "\u{1f3dc}"), + (0x46, "\u{1f3ed}"), + (0x47, "\u{1f3db}"), + (0x48, "\u{1f3e0}"), + (0x49, "\u{1f3d6}"), + (0x4a, "\u{1f3dd}"), + (0x4b, "\u{1f6e3}"), + (0x4c, "\u{1f50d}"), + (0x4d, "\u{1f3d4}"), + (0x4e, "\u{1f441}"), + (0x4f, "\u{1f442}"), + (0x50, "\u{1f3de}"), + (0x51, "\u{1f3d5}"), + (0x52, "\u{1f6e4}"), + (0x53, "\u{1f3df}"), + (0x54, "\u{1f6f3}"), + (0x55, "\u{1f56c}"), + (0x56, "\u{1f56b}"), + (0x57, "\u{1f568}"), + (0x58, "\u{1f508}"), + (0x59, "\u{1f394}"), + (0x5a, "\u{1f395}"), + (0x5b, "\u{1f5ec}"), + (0x5c, "\u{1f67d}"), + (0x5d, "\u{1f5ed}"), + (0x5e, "\u{1f5ea}"), + (0x5f, "\u{1f5eb}"), + (0x60, "\u{2b94}"), + (0x61, "\u{2714}"), + (0x62, "\u{1f6b2}"), + (0x63, "\u{25a1}"), + (0x64, "\u{1f6e1}"), + (0x65, "\u{1f4e6}"), + (0x66, "\u{1f6f1}"), + (0x67, "\u{25a0}"), + (0x68, "\u{1f691}"), + (0x69, "\u{1f6c8}"), + (0x6a, "\u{1f6e9}"), + (0x6b, "\u{1f6f0}"), + (0x6c, "\u{1f7c8}"), + (0x6d, "\u{1f574}"), + (0x6e, "\u{26ab}"), + (0x6f, "\u{1f6e5}"), + (0x70, "\u{1f694}"), + (0x71, "\u{1f5d8}"), + (0x72, "\u{1f5d9}"), + (0x73, "\u{2753}"), + (0x74, "\u{1f6f2}"), + (0x75, "\u{1f687}"), + (0x76, "\u{1f68d}"), + (0x77, "\u{26f3}"), + (0x78, "\u{1f6c7}"), + (0x79, "\u{2296}"), + (0x7a, "\u{1f6ad}"), + (0x7b, "\u{1f5ee}"), + (0x7c, "\u{7c}"), + (0x7d, "\u{1f5ef}"), + (0x7e, "\u{1f5f2}"), + (0x80, "\u{1f6b9}"), + (0x81, "\u{1f6ba}"), + (0x82, "\u{1f6c9}"), + (0x83, "\u{1f6ca}"), + (0x84, "\u{1f6bc}"), + (0x85, "\u{1f47d}"), + (0x86, "\u{1f3cb}"), + (0x87, "\u{26f7}"), + (0x88, "\u{1f3c2}"), + (0x89, "\u{1f3cc}"), + (0x8a, "\u{1f3ca}"), + (0x8b, "\u{1f3c4}"), + (0x8c, "\u{1f3cd}"), + (0x8d, "\u{1f3ce}"), + (0x8e, "\u{1f698}"), + (0x8f, "\u{1f5e0}"), + (0x90, "\u{1f6e2}"), + (0x91, "\u{1f4b0}"), + (0x92, "\u{1f3f7}"), + (0x93, "\u{1f4b3}"), + (0x94, "\u{1f46a}"), + (0x95, "\u{1f5e1}"), + (0x96, "\u{1f5e2}"), + (0x97, "\u{1f5e3}"), + (0x98, "\u{272f}"), + (0x99, "\u{1f584}"), + (0x9a, "\u{1f585}"), + (0x9b, "\u{1f583}"), + (0x9c, "\u{1f586}"), + (0x9d, "\u{1f5b9}"), + (0x9e, "\u{1f5ba}"), + (0x9f, "\u{1f5bb}"), + (0xa0, "\u{1f575}"), + (0xa1, "\u{1f570}"), + (0xa2, "\u{1f5bd}"), + (0xa3, "\u{1f5be}"), + (0xa4, "\u{1f4cb}"), + (0xa5, "\u{1f5d2}"), + (0xa6, "\u{1f5d3}"), + (0xa7, "\u{1f4d6}"), + (0xa8, "\u{1f4da}"), + (0xa9, "\u{1f5de}"), + (0xaa, "\u{1f5df}"), + (0xab, "\u{1f5c3}"), + (0xac, "\u{1f5c2}"), + (0xad, "\u{1f5bc}"), + (0xae, "\u{1f3ad}"), + (0xaf, "\u{1f39c}"), + (0xb0, "\u{1f398}"), + (0xb1, "\u{1f399}"), + (0xb2, "\u{1f3a7}"), + (0xb3, "\u{1f4bf}"), + (0xb4, "\u{1f39e}"), + (0xb5, "\u{1f4f7}"), + (0xb6, "\u{1f39f}"), + (0xb7, "\u{1f3ac}"), + (0xb8, "\u{1f4fd}"), + (0xb9, "\u{1f4f9}"), + (0xba, "\u{1f4fe}"), + (0xbb, "\u{1f4fb}"), + (0xbc, "\u{1f39a}"), + (0xbd, "\u{1f39b}"), + (0xbe, "\u{1f4fa}"), + (0xbf, "\u{1f4bb}"), + (0xc0, "\u{1f5a5}"), + (0xc1, "\u{1f5a6}"), + (0xc2, "\u{1f5a7}"), + (0xc3, "\u{1f579}"), + (0xc4, "\u{1f3ae}"), + (0xc5, "\u{1f57b}"), + (0xc6, "\u{1f57c}"), + (0xc7, "\u{1f4df}"), + (0xc8, "\u{1f581}"), + (0xc9, "\u{1f580}"), + (0xca, "\u{1f5a8}"), + (0xcb, "\u{1f5a9}"), + (0xcc, "\u{1f5bf}"), + (0xcd, "\u{1f5aa}"), + (0xce, "\u{1f5dc}"), + (0xcf, "\u{1f512}"), + (0xd0, "\u{1f513}"), + (0xd1, "\u{1f5dd}"), + (0xd2, "\u{1f4e5}"), + (0xd3, "\u{1f4e4}"), + (0xd4, "\u{1f573}"), + (0xd5, "\u{1f323}"), + (0xd6, "\u{1f324}"), + (0xd7, "\u{1f325}"), + (0xd8, "\u{1f326}"), + (0xd9, "\u{2601}"), + (0xda, "\u{1f327}"), + (0xdb, "\u{1f328}"), + (0xdc, "\u{1f329}"), + (0xdd, "\u{1f32a}"), + (0xde, "\u{1f32c}"), + (0xdf, "\u{1f32b}"), + (0xe0, "\u{1f31c}"), + (0xe1, "\u{1f321}"), + (0xe2, "\u{1f6cb}"), + (0xe3, "\u{1f6cf}"), + (0xe4, "\u{1f37d}"), + (0xe5, "\u{1f378}"), + (0xe6, "\u{1f6ce}"), + (0xe7, "\u{1f6cd}"), + (0xe8, "\u{24c5}"), + (0xe9, "\u{267f}"), + (0xea, "\u{1f6c6}"), + (0xeb, "\u{1f588}"), + (0xec, "\u{1f393}"), + (0xed, "\u{1f5e4}"), + (0xee, "\u{1f5e5}"), + (0xef, "\u{1f5e6}"), + (0xf0, "\u{1f5e7}"), + (0xf1, "\u{1f6ea}"), + (0xf2, "\u{1f43f}"), + (0xf3, "\u{1f426}"), + (0xf4, "\u{1f41f}"), + (0xf5, "\u{1f415}"), + (0xf6, "\u{1f408}"), + (0xf7, "\u{1f66c}"), + (0xf8, "\u{1f66e}"), + (0xf9, "\u{1f66d}"), + (0xfa, "\u{1f66f}"), + (0xfb, "\u{1f5fa}"), + (0xfc, "\u{1f30d}"), + (0xfd, "\u{1f30f}"), + (0xfe, "\u{1f30e}"), + (0xff, "\u{1f54a}"), +]; + +/// Symbol: the code page Word's `w:sym` draws from (gaps are not in the font). +static SYMBOL: &[(u8, &str)] = &[ + (0x20, "\u{20}"), + (0x21, "\u{21}"), + (0x22, "\u{2200}"), + (0x23, "\u{23}"), + (0x24, "\u{2203}"), + (0x25, "\u{25}"), + (0x26, "\u{26}"), + (0x27, "\u{220d}"), + (0x28, "\u{28}"), + (0x29, "\u{29}"), + (0x2a, "\u{2217}"), + (0x2b, "\u{2b}"), + (0x2c, "\u{2c}"), + (0x2d, "\u{2212}"), + (0x2e, "\u{2e}"), + (0x2f, "\u{2f}"), + (0x30, "\u{30}"), + (0x31, "\u{31}"), + (0x32, "\u{32}"), + (0x33, "\u{33}"), + (0x34, "\u{34}"), + (0x35, "\u{35}"), + (0x36, "\u{36}"), + (0x37, "\u{37}"), + (0x38, "\u{38}"), + (0x39, "\u{39}"), + (0x3a, "\u{3a}"), + (0x3b, "\u{3b}"), + (0x3c, "\u{3c}"), + (0x3d, "\u{3d}"), + (0x3e, "\u{3e}"), + (0x3f, "\u{3f}"), + (0x40, "\u{2245}"), + (0x41, "\u{391}"), + (0x42, "\u{392}"), + (0x43, "\u{3a7}"), + (0x44, "\u{394}"), + (0x45, "\u{395}"), + (0x46, "\u{3a6}"), + (0x47, "\u{393}"), + (0x48, "\u{397}"), + (0x49, "\u{399}"), + (0x4a, "\u{3d1}"), + (0x4b, "\u{39a}"), + (0x4c, "\u{39b}"), + (0x4d, "\u{39c}"), + (0x4e, "\u{39d}"), + (0x4f, "\u{39f}"), + (0x50, "\u{3a0}"), + (0x51, "\u{398}"), + (0x52, "\u{3a1}"), + (0x53, "\u{3a3}"), + (0x54, "\u{3a4}"), + (0x55, "\u{3a5}"), + (0x56, "\u{3c2}"), + (0x57, "\u{3a9}"), + (0x58, "\u{39e}"), + (0x59, "\u{3a8}"), + (0x5a, "\u{396}"), + (0x5b, "\u{5b}"), + (0x5c, "\u{2234}"), + (0x5d, "\u{5d}"), + (0x5e, "\u{22a5}"), + (0x5f, "\u{5f}"), + (0x61, "\u{3b1}"), + (0x62, "\u{3b2}"), + (0x63, "\u{3c7}"), + (0x64, "\u{3b4}"), + (0x65, "\u{3b5}"), + (0x66, "\u{3c6}"), + (0x67, "\u{3b3}"), + (0x68, "\u{3b7}"), + (0x69, "\u{3b9}"), + (0x6a, "\u{3d5}"), + (0x6b, "\u{3ba}"), + (0x6c, "\u{3bb}"), + (0x6d, "\u{3bc}"), + (0x6e, "\u{3bd}"), + (0x6f, "\u{3bf}"), + (0x70, "\u{3c0}"), + (0x71, "\u{3b8}"), + (0x72, "\u{3c1}"), + (0x73, "\u{3c3}"), + (0x74, "\u{3c4}"), + (0x75, "\u{3c5}"), + (0x76, "\u{3d6}"), + (0x77, "\u{3c9}"), + (0x78, "\u{3be}"), + (0x79, "\u{3c8}"), + (0x7a, "\u{3b6}"), + (0x7b, "\u{7b}"), + (0x7c, "\u{7c}"), + (0x7d, "\u{7d}"), + (0x7e, "\u{223c}"), + (0xa1, "\u{3d2}"), + (0xa2, "\u{2032}"), + (0xa3, "\u{2264}"), + (0xa4, "\u{2044}"), + (0xa5, "\u{221e}"), + (0xa6, "\u{192}"), + (0xa7, "\u{2663}"), + (0xa8, "\u{2666}"), + (0xa9, "\u{2665}"), + (0xaa, "\u{2660}"), + (0xab, "\u{2194}"), + (0xac, "\u{2190}"), + (0xad, "\u{2191}"), + (0xae, "\u{2192}"), + (0xaf, "\u{2193}"), + (0xb0, "\u{b0}"), + (0xb1, "\u{b1}"), + (0xb2, "\u{2033}"), + (0xb3, "\u{2265}"), + (0xb4, "\u{d7}"), + (0xb5, "\u{221d}"), + (0xb6, "\u{2202}"), + (0xb7, "\u{2022}"), + (0xb8, "\u{f7}"), + (0xb9, "\u{2260}"), + (0xba, "\u{2261}"), + (0xbb, "\u{2248}"), + (0xbc, "\u{2026}"), + (0xbd, "\u{23d0}"), + (0xbe, "\u{23af}"), + (0xbf, "\u{21b5}"), + (0xc0, "\u{2135}"), + (0xc1, "\u{2111}"), + (0xc2, "\u{211c}"), + (0xc3, "\u{2118}"), + (0xc4, "\u{2297}"), + (0xc5, "\u{2295}"), + (0xc6, "\u{2205}"), + (0xc7, "\u{2229}"), + (0xc8, "\u{222a}"), + (0xc9, "\u{2283}"), + (0xca, "\u{2287}"), + (0xcb, "\u{2284}"), + (0xcc, "\u{2282}"), + (0xcd, "\u{2286}"), + (0xce, "\u{2208}"), + (0xcf, "\u{2209}"), + (0xd0, "\u{2220}"), + (0xd1, "\u{2207}"), + (0xd2, "\u{ae}"), + (0xd3, "\u{a9}"), + (0xd4, "\u{2122}"), + (0xd5, "\u{220f}"), + (0xd6, "\u{221a}"), + (0xd7, "\u{22c5}"), + (0xd8, "\u{ac}"), + (0xd9, "\u{2227}"), + (0xda, "\u{2228}"), + (0xdb, "\u{21d4}"), + (0xdc, "\u{21d0}"), + (0xdd, "\u{21d1}"), + (0xde, "\u{21d2}"), + (0xdf, "\u{21d3}"), + (0xe0, "\u{25ca}"), + (0xe1, "\u{2329}"), + (0xe2, "\u{ae}"), + (0xe3, "\u{a9}"), + (0xe4, "\u{2122}"), + (0xe5, "\u{2211}"), + (0xe6, "\u{239b}"), + (0xe7, "\u{239c}"), + (0xe8, "\u{239d}"), + (0xe9, "\u{23a1}"), + (0xea, "\u{23a2}"), + (0xeb, "\u{23a3}"), + (0xec, "\u{23a7}"), + (0xed, "\u{23a8}"), + (0xee, "\u{23a9}"), + (0xef, "\u{23aa}"), + (0xf0, "\u{20ac}"), + (0xf1, "\u{232a}"), + (0xf2, "\u{222b}"), + (0xf3, "\u{2320}"), + (0xf4, "\u{23ae}"), + (0xf5, "\u{2321}"), + (0xf6, "\u{239e}"), + (0xf7, "\u{239f}"), + (0xf8, "\u{23a0}"), + (0xf9, "\u{23a4}"), + (0xfa, "\u{23a5}"), + (0xfb, "\u{23a6}"), + (0xfc, "\u{23ab}"), + (0xfd, "\u{23ac}"), + (0xfe, "\u{23ad}"), +]; +