///| Unicode character classification helpers used by the inline parser.
///|
/// A "Unicode whitespace character" as CommonMark defines it: anything in the
/// Zs general category, plus tab, line feed, form feed and carriage return.
pub fn is_unicode_whitespace(c : Char) -> Bool {
let code = c.to_int()
if code < 0x80 {
return code == 0x20 ||
code == 0x09 ||
code == 0x0A ||
code == 0x0C ||
code == 0x0D
}
code == 0xA0 ||
code == 0x1680 ||
(code >= 0x2000 && code <= 0x200A) ||
code == 0x202F ||
code == 0x205F ||
code == 0x3000
}
///|
/// A "Unicode punctuation character" as CommonMark 0.31.2 defines it: anything
/// in a punctuation (P*) or symbol (S*) general category.
///
/// The ranges below cover the blocks that actually carry punctuation and
/// symbols; letters, digits and marks are deliberately excluded so that
/// flanking is decided correctly for ordinary text.
pub fn is_unicode_punctuation(c : Char) -> Bool {
let code = c.to_int()
if code < 0x80 {
return (code >= 0x21 && code <= 0x2F) || // !"#$%&'()*+,-./
(code >= 0x3A && code <= 0x40) || // :;<=>?@
(code >= 0x5B && code <= 0x60) || // [\]^_`
(code >= 0x7B && code <= 0x7E) // {|}~
}
if code < 0x100 {
// Latin-1 supplement, minus the letters (ª µ º) and digits (² ³ ¹).
return (code >= 0xA1 && code <= 0xA9) ||
code == 0xAB ||
code == 0xAC ||
(code >= 0xAE && code <= 0xB1) ||
code == 0xB4 ||
(code >= 0xB6 && code <= 0xB8) ||
code == 0xBB ||
code == 0xBF ||
code == 0xD7 ||
code == 0xF7
}
(code >= 0x2010 && code <= 0x2027) || // general punctuation
(code >= 0x2030 && code <= 0x205E) ||
// Only the superscript signs and brackets; the superscript digits and the
// modifier letter next to them are No and Lm, not P* or S*.
(code >= 0x207A && code <= 0x207E) ||
(code >= 0x208A && code <= 0x208E) ||
(code >= 0x20A0 && code <= 0x20C0) || // currency symbols
(code >= 0x2100 && code <= 0x2101) ||
(code >= 0x2103 && code <= 0x2106) ||
(code >= 0x2108 && code <= 0x2109) ||
code == 0x2114 ||
(code >= 0x2116 && code <= 0x2118) ||
(code >= 0x211E && code <= 0x2123) ||
code == 0x2125 ||
code == 0x2127 ||
code == 0x2129 ||
code == 0x212E ||
(code >= 0x213A && code <= 0x213B) ||
(code >= 0x2140 && code <= 0x2144) ||
code == 0x214A ||
(code >= 0x214C && code <= 0x214D) ||
code == 0x214F ||
(code >= 0x218A && code <= 0x218B) ||
(code >= 0x2190 && code <= 0x2426) || // arrows, math, technical, misc
(code >= 0x2440 && code <= 0x244A) ||
(code >= 0x249C && code <= 0x24E9) ||
(code >= 0x2500 && code <= 0x2775) ||
(code >= 0x2794 && code <= 0x2BFF) ||
(code >= 0x2E00 && code <= 0x2E7F) || // supplemental punctuation
(code >= 0x3001 && code <= 0x3004) || // CJK symbols and punctuation
(code >= 0x3008 && code <= 0x3020) ||
code == 0x3030 ||
(code >= 0xFE10 && code <= 0xFE19) ||
(code >= 0xFE30 && code <= 0xFE6B) ||
(code >= 0xFF01 && code <= 0xFF0F) || // fullwidth forms
(code >= 0xFF1A && code <= 0xFF20) ||
(code >= 0xFF3B && code <= 0xFF40) ||
(code >= 0xFF5B && code <= 0xFF65) ||
(code >= 0x1F000 && code <= 0x1FBFF) // pictographs and emoji
}