markdown-syntax 0.1.1

no_std + alloc Markdown syntax parser and serializer
Documentation
//! Unicode punctuation classification for emphasis/strong flanking.
//!
//! Rust core has no `char::is_punctuation`, so CommonMark's notion of a
//! "Unicode punctuation character" (the Unicode `P*` and `S*` general
//! categories, per <https://spec.commonmark.org/0.31.2/#unicode-punctuation-character>)
//! is provided here as a generated, sorted table of inclusive code-point
//! ranges. The set is generated from the Unicode Character Database; it is
//! stored as ranges (not a flat list) to stay compact. `no_std`, no
//! allocation, no dependency.

/// Inclusive Unicode code-point ranges in the CommonMark punctuation set,
/// sorted ascending and non-overlapping.
static PUNCTUATION_RANGES: [(char, char); 349] = [
    ('\u{0021}', '\u{002F}'),
    ('\u{003A}', '\u{0040}'),
    ('\u{005B}', '\u{0060}'),
    ('\u{007B}', '\u{007E}'),
    ('\u{00A1}', '\u{00A9}'),
    ('\u{00AB}', '\u{00AC}'),
    ('\u{00AE}', '\u{00B1}'),
    ('\u{00B4}', '\u{00B4}'),
    ('\u{00B6}', '\u{00B8}'),
    ('\u{00BB}', '\u{00BB}'),
    ('\u{00BF}', '\u{00BF}'),
    ('\u{00D7}', '\u{00D7}'),
    ('\u{00F7}', '\u{00F7}'),
    ('\u{02C2}', '\u{02C5}'),
    ('\u{02D2}', '\u{02DF}'),
    ('\u{02E5}', '\u{02EB}'),
    ('\u{02ED}', '\u{02ED}'),
    ('\u{02EF}', '\u{02FF}'),
    ('\u{0375}', '\u{0375}'),
    ('\u{037E}', '\u{037E}'),
    ('\u{0384}', '\u{0385}'),
    ('\u{0387}', '\u{0387}'),
    ('\u{03F6}', '\u{03F6}'),
    ('\u{0482}', '\u{0482}'),
    ('\u{055A}', '\u{055F}'),
    ('\u{0589}', '\u{058A}'),
    ('\u{058D}', '\u{058F}'),
    ('\u{05BE}', '\u{05BE}'),
    ('\u{05C0}', '\u{05C0}'),
    ('\u{05C3}', '\u{05C3}'),
    ('\u{05C6}', '\u{05C6}'),
    ('\u{05F3}', '\u{05F4}'),
    ('\u{0606}', '\u{060F}'),
    ('\u{061B}', '\u{061B}'),
    ('\u{061D}', '\u{061F}'),
    ('\u{066A}', '\u{066D}'),
    ('\u{06D4}', '\u{06D4}'),
    ('\u{06DE}', '\u{06DE}'),
    ('\u{06E9}', '\u{06E9}'),
    ('\u{06FD}', '\u{06FE}'),
    ('\u{0700}', '\u{070D}'),
    ('\u{07F6}', '\u{07F9}'),
    ('\u{07FE}', '\u{07FF}'),
    ('\u{0830}', '\u{083E}'),
    ('\u{085E}', '\u{085E}'),
    ('\u{0888}', '\u{0888}'),
    ('\u{0964}', '\u{0965}'),
    ('\u{0970}', '\u{0970}'),
    ('\u{09F2}', '\u{09F3}'),
    ('\u{09FA}', '\u{09FB}'),
    ('\u{09FD}', '\u{09FD}'),
    ('\u{0A76}', '\u{0A76}'),
    ('\u{0AF0}', '\u{0AF1}'),
    ('\u{0B70}', '\u{0B70}'),
    ('\u{0BF3}', '\u{0BFA}'),
    ('\u{0C77}', '\u{0C77}'),
    ('\u{0C7F}', '\u{0C7F}'),
    ('\u{0C84}', '\u{0C84}'),
    ('\u{0D4F}', '\u{0D4F}'),
    ('\u{0D79}', '\u{0D79}'),
    ('\u{0DF4}', '\u{0DF4}'),
    ('\u{0E3F}', '\u{0E3F}'),
    ('\u{0E4F}', '\u{0E4F}'),
    ('\u{0E5A}', '\u{0E5B}'),
    ('\u{0F01}', '\u{0F17}'),
    ('\u{0F1A}', '\u{0F1F}'),
    ('\u{0F34}', '\u{0F34}'),
    ('\u{0F36}', '\u{0F36}'),
    ('\u{0F38}', '\u{0F38}'),
    ('\u{0F3A}', '\u{0F3D}'),
    ('\u{0F85}', '\u{0F85}'),
    ('\u{0FBE}', '\u{0FC5}'),
    ('\u{0FC7}', '\u{0FCC}'),
    ('\u{0FCE}', '\u{0FDA}'),
    ('\u{104A}', '\u{104F}'),
    ('\u{109E}', '\u{109F}'),
    ('\u{10FB}', '\u{10FB}'),
    ('\u{1360}', '\u{1368}'),
    ('\u{1390}', '\u{1399}'),
    ('\u{1400}', '\u{1400}'),
    ('\u{166D}', '\u{166E}'),
    ('\u{169B}', '\u{169C}'),
    ('\u{16EB}', '\u{16ED}'),
    ('\u{1735}', '\u{1736}'),
    ('\u{17D4}', '\u{17D6}'),
    ('\u{17D8}', '\u{17DB}'),
    ('\u{1800}', '\u{180A}'),
    ('\u{1940}', '\u{1940}'),
    ('\u{1944}', '\u{1945}'),
    ('\u{19DE}', '\u{19FF}'),
    ('\u{1A1E}', '\u{1A1F}'),
    ('\u{1AA0}', '\u{1AA6}'),
    ('\u{1AA8}', '\u{1AAD}'),
    ('\u{1B4E}', '\u{1B4F}'),
    ('\u{1B5A}', '\u{1B6A}'),
    ('\u{1B74}', '\u{1B7F}'),
    ('\u{1BFC}', '\u{1BFF}'),
    ('\u{1C3B}', '\u{1C3F}'),
    ('\u{1C7E}', '\u{1C7F}'),
    ('\u{1CC0}', '\u{1CC7}'),
    ('\u{1CD3}', '\u{1CD3}'),
    ('\u{1FBD}', '\u{1FBD}'),
    ('\u{1FBF}', '\u{1FC1}'),
    ('\u{1FCD}', '\u{1FCF}'),
    ('\u{1FDD}', '\u{1FDF}'),
    ('\u{1FED}', '\u{1FEF}'),
    ('\u{1FFD}', '\u{1FFE}'),
    ('\u{2010}', '\u{2027}'),
    ('\u{2030}', '\u{205E}'),
    ('\u{207A}', '\u{207E}'),
    ('\u{208A}', '\u{208E}'),
    ('\u{20A0}', '\u{20C0}'),
    ('\u{2100}', '\u{2101}'),
    ('\u{2103}', '\u{2106}'),
    ('\u{2108}', '\u{2109}'),
    ('\u{2114}', '\u{2114}'),
    ('\u{2116}', '\u{2118}'),
    ('\u{211E}', '\u{2123}'),
    ('\u{2125}', '\u{2125}'),
    ('\u{2127}', '\u{2127}'),
    ('\u{2129}', '\u{2129}'),
    ('\u{212E}', '\u{212E}'),
    ('\u{213A}', '\u{213B}'),
    ('\u{2140}', '\u{2144}'),
    ('\u{214A}', '\u{214D}'),
    ('\u{214F}', '\u{214F}'),
    ('\u{218A}', '\u{218B}'),
    ('\u{2190}', '\u{2429}'),
    ('\u{2440}', '\u{244A}'),
    ('\u{249C}', '\u{24E9}'),
    ('\u{2500}', '\u{2775}'),
    ('\u{2794}', '\u{2B73}'),
    ('\u{2B76}', '\u{2B95}'),
    ('\u{2B97}', '\u{2BFF}'),
    ('\u{2CE5}', '\u{2CEA}'),
    ('\u{2CF9}', '\u{2CFC}'),
    ('\u{2CFE}', '\u{2CFF}'),
    ('\u{2D70}', '\u{2D70}'),
    ('\u{2E00}', '\u{2E2E}'),
    ('\u{2E30}', '\u{2E5D}'),
    ('\u{2E80}', '\u{2E99}'),
    ('\u{2E9B}', '\u{2EF3}'),
    ('\u{2F00}', '\u{2FD5}'),
    ('\u{2FF0}', '\u{2FFF}'),
    ('\u{3001}', '\u{3004}'),
    ('\u{3008}', '\u{3020}'),
    ('\u{3030}', '\u{3030}'),
    ('\u{3036}', '\u{3037}'),
    ('\u{303D}', '\u{303F}'),
    ('\u{309B}', '\u{309C}'),
    ('\u{30A0}', '\u{30A0}'),
    ('\u{30FB}', '\u{30FB}'),
    ('\u{3190}', '\u{3191}'),
    ('\u{3196}', '\u{319F}'),
    ('\u{31C0}', '\u{31E5}'),
    ('\u{31EF}', '\u{31EF}'),
    ('\u{3200}', '\u{321E}'),
    ('\u{322A}', '\u{3247}'),
    ('\u{3250}', '\u{3250}'),
    ('\u{3260}', '\u{327F}'),
    ('\u{328A}', '\u{32B0}'),
    ('\u{32C0}', '\u{33FF}'),
    ('\u{4DC0}', '\u{4DFF}'),
    ('\u{A490}', '\u{A4C6}'),
    ('\u{A4FE}', '\u{A4FF}'),
    ('\u{A60D}', '\u{A60F}'),
    ('\u{A673}', '\u{A673}'),
    ('\u{A67E}', '\u{A67E}'),
    ('\u{A6F2}', '\u{A6F7}'),
    ('\u{A700}', '\u{A716}'),
    ('\u{A720}', '\u{A721}'),
    ('\u{A789}', '\u{A78A}'),
    ('\u{A828}', '\u{A82B}'),
    ('\u{A836}', '\u{A839}'),
    ('\u{A874}', '\u{A877}'),
    ('\u{A8CE}', '\u{A8CF}'),
    ('\u{A8F8}', '\u{A8FA}'),
    ('\u{A8FC}', '\u{A8FC}'),
    ('\u{A92E}', '\u{A92F}'),
    ('\u{A95F}', '\u{A95F}'),
    ('\u{A9C1}', '\u{A9CD}'),
    ('\u{A9DE}', '\u{A9DF}'),
    ('\u{AA5C}', '\u{AA5F}'),
    ('\u{AA77}', '\u{AA79}'),
    ('\u{AADE}', '\u{AADF}'),
    ('\u{AAF0}', '\u{AAF1}'),
    ('\u{AB5B}', '\u{AB5B}'),
    ('\u{AB6A}', '\u{AB6B}'),
    ('\u{ABEB}', '\u{ABEB}'),
    ('\u{FB29}', '\u{FB29}'),
    ('\u{FBB2}', '\u{FBC2}'),
    ('\u{FD3E}', '\u{FD4F}'),
    ('\u{FDCF}', '\u{FDCF}'),
    ('\u{FDFC}', '\u{FDFF}'),
    ('\u{FE10}', '\u{FE19}'),
    ('\u{FE30}', '\u{FE52}'),
    ('\u{FE54}', '\u{FE66}'),
    ('\u{FE68}', '\u{FE6B}'),
    ('\u{FF01}', '\u{FF0F}'),
    ('\u{FF1A}', '\u{FF20}'),
    ('\u{FF3B}', '\u{FF40}'),
    ('\u{FF5B}', '\u{FF65}'),
    ('\u{FFE0}', '\u{FFE6}'),
    ('\u{FFE8}', '\u{FFEE}'),
    ('\u{FFFC}', '\u{FFFD}'),
    ('\u{10100}', '\u{10102}'),
    ('\u{10137}', '\u{1013F}'),
    ('\u{10179}', '\u{10189}'),
    ('\u{1018C}', '\u{1018E}'),
    ('\u{10190}', '\u{1019C}'),
    ('\u{101A0}', '\u{101A0}'),
    ('\u{101D0}', '\u{101FC}'),
    ('\u{1039F}', '\u{1039F}'),
    ('\u{103D0}', '\u{103D0}'),
    ('\u{1056F}', '\u{1056F}'),
    ('\u{10857}', '\u{10857}'),
    ('\u{10877}', '\u{10878}'),
    ('\u{1091F}', '\u{1091F}'),
    ('\u{1093F}', '\u{1093F}'),
    ('\u{10A50}', '\u{10A58}'),
    ('\u{10A7F}', '\u{10A7F}'),
    ('\u{10AC8}', '\u{10AC8}'),
    ('\u{10AF0}', '\u{10AF6}'),
    ('\u{10B39}', '\u{10B3F}'),
    ('\u{10B99}', '\u{10B9C}'),
    ('\u{10D6E}', '\u{10D6E}'),
    ('\u{10D8E}', '\u{10D8F}'),
    ('\u{10EAD}', '\u{10EAD}'),
    ('\u{10F55}', '\u{10F59}'),
    ('\u{10F86}', '\u{10F89}'),
    ('\u{11047}', '\u{1104D}'),
    ('\u{110BB}', '\u{110BC}'),
    ('\u{110BE}', '\u{110C1}'),
    ('\u{11140}', '\u{11143}'),
    ('\u{11174}', '\u{11175}'),
    ('\u{111C5}', '\u{111C8}'),
    ('\u{111CD}', '\u{111CD}'),
    ('\u{111DB}', '\u{111DB}'),
    ('\u{111DD}', '\u{111DF}'),
    ('\u{11238}', '\u{1123D}'),
    ('\u{112A9}', '\u{112A9}'),
    ('\u{113D4}', '\u{113D5}'),
    ('\u{113D7}', '\u{113D8}'),
    ('\u{1144B}', '\u{1144F}'),
    ('\u{1145A}', '\u{1145B}'),
    ('\u{1145D}', '\u{1145D}'),
    ('\u{114C6}', '\u{114C6}'),
    ('\u{115C1}', '\u{115D7}'),
    ('\u{11641}', '\u{11643}'),
    ('\u{11660}', '\u{1166C}'),
    ('\u{116B9}', '\u{116B9}'),
    ('\u{1173C}', '\u{1173F}'),
    ('\u{1183B}', '\u{1183B}'),
    ('\u{11944}', '\u{11946}'),
    ('\u{119E2}', '\u{119E2}'),
    ('\u{11A3F}', '\u{11A46}'),
    ('\u{11A9A}', '\u{11A9C}'),
    ('\u{11A9E}', '\u{11AA2}'),
    ('\u{11B00}', '\u{11B09}'),
    ('\u{11BE1}', '\u{11BE1}'),
    ('\u{11C41}', '\u{11C45}'),
    ('\u{11C70}', '\u{11C71}'),
    ('\u{11EF7}', '\u{11EF8}'),
    ('\u{11F43}', '\u{11F4F}'),
    ('\u{11FD5}', '\u{11FF1}'),
    ('\u{11FFF}', '\u{11FFF}'),
    ('\u{12470}', '\u{12474}'),
    ('\u{12FF1}', '\u{12FF2}'),
    ('\u{16A6E}', '\u{16A6F}'),
    ('\u{16AF5}', '\u{16AF5}'),
    ('\u{16B37}', '\u{16B3F}'),
    ('\u{16B44}', '\u{16B45}'),
    ('\u{16D6D}', '\u{16D6F}'),
    ('\u{16E97}', '\u{16E9A}'),
    ('\u{16FE2}', '\u{16FE2}'),
    ('\u{1BC9C}', '\u{1BC9C}'),
    ('\u{1BC9F}', '\u{1BC9F}'),
    ('\u{1CC00}', '\u{1CCEF}'),
    ('\u{1CD00}', '\u{1CEB3}'),
    ('\u{1CF50}', '\u{1CFC3}'),
    ('\u{1D000}', '\u{1D0F5}'),
    ('\u{1D100}', '\u{1D126}'),
    ('\u{1D129}', '\u{1D164}'),
    ('\u{1D16A}', '\u{1D16C}'),
    ('\u{1D183}', '\u{1D184}'),
    ('\u{1D18C}', '\u{1D1A9}'),
    ('\u{1D1AE}', '\u{1D1EA}'),
    ('\u{1D200}', '\u{1D241}'),
    ('\u{1D245}', '\u{1D245}'),
    ('\u{1D300}', '\u{1D356}'),
    ('\u{1D6C1}', '\u{1D6C1}'),
    ('\u{1D6DB}', '\u{1D6DB}'),
    ('\u{1D6FB}', '\u{1D6FB}'),
    ('\u{1D715}', '\u{1D715}'),
    ('\u{1D735}', '\u{1D735}'),
    ('\u{1D74F}', '\u{1D74F}'),
    ('\u{1D76F}', '\u{1D76F}'),
    ('\u{1D789}', '\u{1D789}'),
    ('\u{1D7A9}', '\u{1D7A9}'),
    ('\u{1D7C3}', '\u{1D7C3}'),
    ('\u{1D800}', '\u{1D9FF}'),
    ('\u{1DA37}', '\u{1DA3A}'),
    ('\u{1DA6D}', '\u{1DA74}'),
    ('\u{1DA76}', '\u{1DA83}'),
    ('\u{1DA85}', '\u{1DA8B}'),
    ('\u{1E14F}', '\u{1E14F}'),
    ('\u{1E2FF}', '\u{1E2FF}'),
    ('\u{1E5FF}', '\u{1E5FF}'),
    ('\u{1E95E}', '\u{1E95F}'),
    ('\u{1ECAC}', '\u{1ECAC}'),
    ('\u{1ECB0}', '\u{1ECB0}'),
    ('\u{1ED2E}', '\u{1ED2E}'),
    ('\u{1EEF0}', '\u{1EEF1}'),
    ('\u{1F000}', '\u{1F02B}'),
    ('\u{1F030}', '\u{1F093}'),
    ('\u{1F0A0}', '\u{1F0AE}'),
    ('\u{1F0B1}', '\u{1F0BF}'),
    ('\u{1F0C1}', '\u{1F0CF}'),
    ('\u{1F0D1}', '\u{1F0F5}'),
    ('\u{1F10D}', '\u{1F1AD}'),
    ('\u{1F1E6}', '\u{1F202}'),
    ('\u{1F210}', '\u{1F23B}'),
    ('\u{1F240}', '\u{1F248}'),
    ('\u{1F250}', '\u{1F251}'),
    ('\u{1F260}', '\u{1F265}'),
    ('\u{1F300}', '\u{1F6D7}'),
    ('\u{1F6DC}', '\u{1F6EC}'),
    ('\u{1F6F0}', '\u{1F6FC}'),
    ('\u{1F700}', '\u{1F776}'),
    ('\u{1F77B}', '\u{1F7D9}'),
    ('\u{1F7E0}', '\u{1F7EB}'),
    ('\u{1F7F0}', '\u{1F7F0}'),
    ('\u{1F800}', '\u{1F80B}'),
    ('\u{1F810}', '\u{1F847}'),
    ('\u{1F850}', '\u{1F859}'),
    ('\u{1F860}', '\u{1F887}'),
    ('\u{1F890}', '\u{1F8AD}'),
    ('\u{1F8B0}', '\u{1F8BB}'),
    ('\u{1F8C0}', '\u{1F8C1}'),
    ('\u{1F900}', '\u{1FA53}'),
    ('\u{1FA60}', '\u{1FA6D}'),
    ('\u{1FA70}', '\u{1FA7C}'),
    ('\u{1FA80}', '\u{1FA89}'),
    ('\u{1FA8F}', '\u{1FAC6}'),
    ('\u{1FACE}', '\u{1FADC}'),
    ('\u{1FADF}', '\u{1FAE9}'),
    ('\u{1FAF0}', '\u{1FAF8}'),
    ('\u{1FB00}', '\u{1FB92}'),
    ('\u{1FB94}', '\u{1FBEF}'),
];

/// Whether `value` is a CommonMark "Unicode punctuation character" beyond the
/// ASCII range. ASCII punctuation is handled separately by the caller via
/// [`char::is_ascii_punctuation`]; this covers the non-ASCII `P*`/`S*` set.
pub(crate) fn is_unicode_punctuation(value: char) -> bool {
    PUNCTUATION_RANGES
        .binary_search_by(|&(start, end)| {
            if value < start {
                core::cmp::Ordering::Greater
            } else if value > end {
                core::cmp::Ordering::Less
            } else {
                core::cmp::Ordering::Equal
            }
        })
        .is_ok()
}