docspec-docx-reader 1.8.0

DOCX to DocSpec event stream reader
Documentation
//! Wingdings 3 codepoint mapping table.
//!
//! Maps Wingdings 3 font codepoints (0x21–0xF0) to standard Unicode characters.
//!
//! Source: <https://github.com/logius/nldoc/blob/main/lib/elixir/nldoc_conversion_reader_docx/lib/nldoc/conversion/reader/docx/ast/fonts/wingdings3.ex>
//! Last updated: 2026-06-10.

/// Wingdings 3 codepoint to Unicode character mapping.
///
/// Sorted by key (u8 codepoint). Use binary search for O(log n) lookup.
pub(super) const TABLE: &[(u8, char)] = &[
    (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}'), // 🠅
    (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}'), // 🢗
];

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn table_sorted() {
        for (prev, curr) in TABLE.iter().zip(TABLE.iter().skip(1)) {
            assert!(
                prev.0 < curr.0,
                "table not sorted: {:#04X} >= {:#04X}",
                prev.0,
                curr.0
            );
        }
    }

    #[test]
    fn table_no_duplicates() {
        for (prev, curr) in TABLE.iter().zip(TABLE.iter().skip(1)) {
            assert_ne!(prev.0, curr.0, "duplicate key: {:#04X}", curr.0);
        }
    }
}