// Generated by scripts/generate-html-entities.mjs from the WHATWG table.
// Keep this file in parity with packages/js/src/entities.ts.
pub(super) const MAX_ENTITY_NAME_LENGTH: usize = 8;
pub(super) const MAX_LEGACY_ENTITY_NAME_LENGTH: usize = 6;
const LEGACY_FLAG: u16 = 0x8000;
#[rustfmt::skip]
const ENTITY_OFFSETS: [u16; 252] = [
0x8000, 0x8009, 0x800F, 0x8019, 0x8022, 0x002C, 0x8035, 0x803E, 0x8048, 0x0050, 0x8058, 0x8060,
0x006A, 0x0071, 0x007C, 0x8085, 0x808C, 0x8096, 0x809F, 0x00A9, 0x00B4, 0x80BB, 0x80C3, 0x00C8,
0x80D1, 0x80DB, 0x80E4, 0x00EE, 0x80F6, 0x00FE, 0x8107, 0x010C, 0x0116, 0x811C, 0x0126, 0x012C,
0x8135, 0x813F, 0x8148, 0x0152, 0x015B, 0x8166, 0x8170, 0x817A, 0x0182, 0x0189, 0x018F, 0x0199,
0x81A0, 0x81A7, 0x01AE, 0x01B5, 0x01BF, 0x81C8, 0x01D1, 0x01D8, 0x81E1, 0x81EB, 0x81F4, 0x01FE,
0x8209, 0x0211, 0x8217, 0x0221, 0x0229, 0x8231, 0x823B, 0x8244, 0x824D, 0x8256, 0x0260, 0x026C,
0x8275, 0x027B, 0x0283, 0x028B, 0x8292, 0x029B, 0x82A5, 0x82AF, 0x02B7, 0x02C1, 0x82C9, 0x02D3,
0x02DC, 0x82E4, 0x82EE, 0x82F7, 0x02FF, 0x0306, 0x030E, 0x0318, 0x8321, 0x0329, 0x0333, 0x833B,
0x0345, 0x034E, 0x0359, 0x8362, 0x0369, 0x0372, 0x837C, 0x8386, 0x8390, 0x8399, 0x03A3, 0x03AD,
0x03B8, 0x03C2, 0x83C9, 0x83D0, 0x03D8, 0x03E1, 0x03EB, 0x03F3, 0x83FE, 0x8408, 0x8412, 0x041C,
0x0426, 0x042F, 0x8436, 0x043B, 0x0444, 0x044D, 0x0458, 0x8463, 0x846D, 0x8476, 0x847F, 0x0489,
0x0493, 0x049D, 0x04A5, 0x84AD, 0x04B7, 0x84C0, 0x04C8, 0x04D1, 0x04DA, 0x04E4, 0x84ED, 0x04F6,
0x04FF, 0x0509, 0x0513, 0x051A, 0x0525, 0x0530, 0x0538, 0x0543, 0x854D, 0x8552, 0x055A, 0x8564,
0x856D, 0x0577, 0x0581, 0x0587, 0x8591, 0x0599, 0x05A3, 0x05AA, 0x85B1, 0x05B8, 0x05C2, 0x85CB,
0x05D5, 0x85DB, 0x85E5, 0x05EE, 0x85F7, 0x0601, 0x060B, 0x0614, 0x061F, 0x0629, 0x8630, 0x8638,
0x8640, 0x864A, 0x0654, 0x865F, 0x8667, 0x066F, 0x0678, 0x0683, 0x068C, 0x0693, 0x0699, 0x86A0,
0x86AA, 0x06B3, 0x06BD, 0x06C6, 0x06CF, 0x86D6, 0x06DD, 0x06E6, 0x06F0, 0x86F9, 0x0702, 0x070B,
0x0715, 0x071F, 0x8728, 0x072F, 0x073A, 0x0741, 0x074C, 0x0756, 0x0760, 0x076A, 0x8773, 0x877B,
0x0782, 0x078B, 0x0795, 0x079D, 0x07A8, 0x07B0, 0x07B9, 0x07C1, 0x87C9, 0x87D1, 0x87D9, 0x07E1,
0x87EA, 0x07F3, 0x07FA, 0x0805, 0x080E, 0x881A, 0x0823, 0x882C, 0x0835, 0x083F, 0x8848, 0x0852,
0x885B, 0x8864, 0x886E, 0x0875, 0x087E, 0x8889, 0x0891, 0x089C, 0x88A2, 0x88AC, 0x88B3, 0x08BB,
];
#[rustfmt::skip]
const ENTITY_DATA: &[u8] = b"\x05AElig\x02\xC3\x86\x03AMP\x01&\x06Aacute\x02\xC3\x81\x05Acirc\x02\xC3\x82\x06Agrave\x02\xC3\x80\x05Alpha\x02\xCE\x91\x05Aring\x02\xC3\x85\x06Atilde\x02\xC3\x83\x04Auml\x02\xC3\x84\x04Beta\x02\xCE\x92\x04COPY\x02\xC2\xA9\x06Ccedil\x02\xC3\x87\x03Chi\x02\xCE\xA7\x06Dagger\x03\xE2\x80\xA1\x05Delta\x02\xCE\x94\x03ETH\x02\xC3\x90\x06Eacute\x02\xC3\x89\x05Ecirc\x02\xC3\x8A\x06Egrave\x02\xC3\x88\x07Epsilon\x02\xCE\x95\x03Eta\x02\xCE\x97\x04Euml\x02\xC3\x8B\x02GT\x01>\x05Gamma\x02\xCE\x93\x06Iacute\x02\xC3\x8D\x05Icirc\x02\xC3\x8E\x06Igrave\x02\xC3\x8C\x04Iota\x02\xCE\x99\x04Iuml\x02\xC3\x8F\x05Kappa\x02\xCE\x9A\x02LT\x01<\x06Lambda\x02\xCE\x9B\x02Mu\x02\xCE\x9C\x06Ntilde\x02\xC3\x91\x02Nu\x02\xCE\x9D\x05OElig\x02\xC5\x92\x06Oacute\x02\xC3\x93\x05Ocirc\x02\xC3\x94\x06Ograve\x02\xC3\x92\x05Omega\x02\xCE\xA9\x07Omicron\x02\xCE\x9F\x06Oslash\x02\xC3\x98\x06Otilde\x02\xC3\x95\x04Ouml\x02\xC3\x96\x03Phi\x02\xCE\xA6\x02Pi\x02\xCE\xA0\x05Prime\x03\xE2\x80\xB3\x03Psi\x02\xCE\xA8\x04QUOT\x01\"\x03REG\x02\xC2\xAE\x03Rho\x02\xCE\xA1\x06Scaron\x02\xC5\xA0\x05Sigma\x02\xCE\xA3\x05THORN\x02\xC3\x9E\x03Tau\x02\xCE\xA4\x05Theta\x02\xCE\x98\x06Uacute\x02\xC3\x9A\x05Ucirc\x02\xC3\x9B\x06Ugrave\x02\xC3\x99\x07Upsilon\x02\xCE\xA5\x04Uuml\x02\xC3\x9C\x02Xi\x02\xCE\x9E\x06Yacute\x02\xC3\x9D\x04Yuml\x02\xC5\xB8\x04Zeta\x02\xCE\x96\x06aacute\x02\xC3\xA1\x05acirc\x02\xC3\xA2\x05acute\x02\xC2\xB4\x05aelig\x02\xC3\xA6\x06agrave\x02\xC3\xA0\x07alefsym\x03\xE2\x84\xB5\x05alpha\x02\xCE\xB1\x03amp\x01&\x03and\x03\xE2\x88\xA7\x03ang\x03\xE2\x88\xA0\x04apos\x01'\x05aring\x02\xC3\xA5\x05asymp\x03\xE2\x89\x88\x06atilde\x02\xC3\xA3\x04auml\x02\xC3\xA4\x05bdquo\x03\xE2\x80\x9E\x04beta\x02\xCE\xB2\x06brvbar\x02\xC2\xA6\x04bull\x03\xE2\x80\xA2\x03cap\x03\xE2\x88\xA9\x06ccedil\x02\xC3\xA7\x05cedil\x02\xC2\xB8\x04cent\x02\xC2\xA2\x03chi\x02\xCF\x87\x04circ\x02\xCB\x86\x05clubs\x03\xE2\x99\xA3\x04cong\x03\xE2\x89\x85\x04copy\x02\xC2\xA9\x05crarr\x03\xE2\x86\xB5\x03cup\x03\xE2\x88\xAA\x06curren\x02\xC2\xA4\x04dArr\x03\xE2\x87\x93\x06dagger\x03\xE2\x80\xA0\x04darr\x03\xE2\x86\x93\x03deg\x02\xC2\xB0\x05delta\x02\xCE\xB4\x05diams\x03\xE2\x99\xA6\x06divide\x02\xC3\xB7\x06eacute\x02\xC3\xA9\x05ecirc\x02\xC3\xAA\x06egrave\x02\xC3\xA8\x05empty\x03\xE2\x88\x85\x07epsilon\x02\xCE\xB5\x05equiv\x03\xE2\x89\xA1\x03eta\x02\xCE\xB7\x03eth\x02\xC3\xB0\x04euml\x02\xC3\xAB\x04euro\x03\xE2\x82\xAC\x05exist\x03\xE2\x88\x83\x04fnof\x02\xC6\x92\x06forall\x03\xE2\x88\x80\x06frac12\x02\xC2\xBD\x06frac14\x02\xC2\xBC\x06frac34\x02\xC2\xBE\x05frasl\x03\xE2\x81\x84\x05gamma\x02\xCE\xB3\x02ge\x03\xE2\x89\xA5\x02gt\x01>\x04hArr\x03\xE2\x87\x94\x04harr\x03\xE2\x86\x94\x06hearts\x03\xE2\x99\xA5\x06hellip\x03\xE2\x80\xA6\x06iacute\x02\xC3\xAD\x05icirc\x02\xC3\xAE\x05iexcl\x02\xC2\xA1\x06igrave\x02\xC3\xAC\x05image\x03\xE2\x84\x91\x05infin\x03\xE2\x88\x9E\x03int\x03\xE2\x88\xAB\x04iota\x02\xCE\xB9\x06iquest\x02\xC2\xBF\x04isin\x03\xE2\x88\x88\x04iuml\x02\xC3\xAF\x05kappa\x02\xCE\xBA\x04lArr\x03\xE2\x87\x90\x06lambda\x02\xCE\xBB\x04lang\x03\xE2\x9F\xA8\x05laquo\x02\xC2\xAB\x04larr\x03\xE2\x86\x90\x05lceil\x03\xE2\x8C\x88\x05ldquo\x03\xE2\x80\x9C\x02le\x03\xE2\x89\xA4\x06lfloor\x03\xE2\x8C\x8A\x06lowast\x03\xE2\x88\x97\x03loz\x03\xE2\x97\x8A\x06lsaquo\x03\xE2\x80\xB9\x05lsquo\x03\xE2\x80\x98\x02lt\x01<\x04macr\x02\xC2\xAF\x05mdash\x03\xE2\x80\x94\x05micro\x02\xC2\xB5\x06middot\x02\xC2\xB7\x05minus\x03\xE2\x88\x92\x02mu\x02\xCE\xBC\x05nabla\x03\xE2\x88\x87\x04nbsp\x02\xC2\xA0\x05ndash\x03\xE2\x80\x93\x02ne\x03\xE2\x89\xA0\x02ni\x03\xE2\x88\x8B\x03not\x02\xC2\xAC\x05notin\x03\xE2\x88\x89\x04nsub\x03\xE2\x8A\x84\x06ntilde\x02\xC3\xB1\x02nu\x02\xCE\xBD\x06oacute\x02\xC3\xB3\x05ocirc\x02\xC3\xB4\x05oelig\x02\xC5\x93\x06ograve\x02\xC3\xB2\x05oline\x03\xE2\x80\xBE\x05omega\x02\xCF\x89\x07omicron\x02\xCE\xBF\x05oplus\x03\xE2\x8A\x95\x02or\x03\xE2\x88\xA8\x04ordf\x02\xC2\xAA\x04ordm\x02\xC2\xBA\x06oslash\x02\xC3\xB8\x06otilde\x02\xC3\xB5\x06otimes\x03\xE2\x8A\x97\x04ouml\x02\xC3\xB6\x04para\x02\xC2\xB6\x04part\x03\xE2\x88\x82\x06permil\x03\xE2\x80\xB0\x04perp\x03\xE2\x8A\xA5\x03phi\x02\xCF\x86\x02pi\x02\xCF\x80\x03piv\x02\xCF\x96\x06plusmn\x02\xC2\xB1\x05pound\x02\xC2\xA3\x05prime\x03\xE2\x80\xB2\x04prod\x03\xE2\x88\x8F\x04prop\x03\xE2\x88\x9D\x03psi\x02\xCF\x88\x04quot\x01\"\x04rArr\x03\xE2\x87\x92\x05radic\x03\xE2\x88\x9A\x04rang\x03\xE2\x9F\xA9\x05raquo\x02\xC2\xBB\x04rarr\x03\xE2\x86\x92\x05rceil\x03\xE2\x8C\x89\x05rdquo\x03\xE2\x80\x9D\x04real\x03\xE2\x84\x9C\x03reg\x02\xC2\xAE\x06rfloor\x03\xE2\x8C\x8B\x03rho\x02\xCF\x81\x06rsaquo\x03\xE2\x80\xBA\x05rsquo\x03\xE2\x80\x99\x05sbquo\x03\xE2\x80\x9A\x06scaron\x02\xC5\xA1\x04sdot\x03\xE2\x8B\x85\x04sect\x02\xC2\xA7\x03shy\x02\xC2\xAD\x05sigma\x02\xCF\x83\x06sigmaf\x02\xCF\x82\x03sim\x03\xE2\x88\xBC\x06spades\x03\xE2\x99\xA0\x03sub\x03\xE2\x8A\x82\x04sube\x03\xE2\x8A\x86\x03sum\x03\xE2\x88\x91\x03sup\x03\xE2\x8A\x83\x04sup1\x02\xC2\xB9\x04sup2\x02\xC2\xB2\x04sup3\x02\xC2\xB3\x04supe\x03\xE2\x8A\x87\x05szlig\x02\xC3\x9F\x03tau\x02\xCF\x84\x06there4\x03\xE2\x88\xB4\x05theta\x02\xCE\xB8\x08thetasym\x02\xCF\x91\x05thorn\x02\xC3\xBE\x05tilde\x02\xCB\x9C\x05times\x02\xC3\x97\x05trade\x03\xE2\x84\xA2\x04uArr\x03\xE2\x87\x91\x06uacute\x02\xC3\xBA\x04uarr\x03\xE2\x86\x91\x05ucirc\x02\xC3\xBB\x06ugrave\x02\xC3\xB9\x03uml\x02\xC2\xA8\x05upsih\x02\xCF\x92\x07upsilon\x02\xCF\x85\x04uuml\x02\xC3\xBC\x06weierp\x03\xE2\x84\x98\x02xi\x02\xCE\xBE\x06yacute\x02\xC3\xBD\x03yen\x02\xC2\xA5\x04yuml\x02\xC3\xBF\x04zeta\x02\xCE\xB6";
#[inline]
fn lookup_entity(name: &[u8]) -> Option<(&'static str, bool)> {
let mut low = 0;
let mut high = ENTITY_OFFSETS.len();
while low < high {
let middle = low + (high - low) / 2;
let encoded_offset = ENTITY_OFFSETS[middle];
let offset = usize::from(encoded_offset & !LEGACY_FLAG);
let entry_name_start = offset + 1;
let entry_name_end = entry_name_start + usize::from(ENTITY_DATA[offset]);
match name.cmp(&ENTITY_DATA[entry_name_start..entry_name_end]) {
std::cmp::Ordering::Less => high = middle,
std::cmp::Ordering::Greater => low = middle + 1,
std::cmp::Ordering::Equal => {
let value_start = entry_name_end + 1;
let value_end = value_start + usize::from(ENTITY_DATA[entry_name_end]);
let value = std::str::from_utf8(&ENTITY_DATA[value_start..value_end]).ok()?;
return Some((value, encoded_offset & LEGACY_FLAG != 0));
}
}
}
None
}
#[inline]
pub(super) fn lookup_named_entity(name: &[u8]) -> Option<&'static str> {
lookup_entity(name).map(|(value, _)| value)
}
#[inline]
pub(super) fn lookup_legacy_named_entity(name: &[u8]) -> Option<&'static str> {
let (value, legacy) = lookup_entity(name)?;
legacy.then_some(value)
}