pub use css_lexer::AtomSet;
use derive_atom_set::AtomSet as DeriveAtomSet;
#[allow(non_camel_case_types)]
#[derive(DeriveAtomSet, Debug, Default, Copy, Clone, PartialEq, Eq)]
pub enum EncodingLabel {
#[default]
Unknown,
_866,
#[atom("ansi_x3.4-1968")]
Ansi_u_x3_d_4_1968,
Arabic,
Ascii,
Asmo_708,
Big5,
Big5_hkscs,
Chinese,
Cn_big5,
Cp1250,
Cp1251,
Cp1252,
Cp1253,
Cp1254,
Cp1255,
Cp1256,
Cp1257,
Cp1258,
Cp819,
Cp866,
Csbig5,
Cseuckr,
Cseucpkdfmtjapanese,
Csgb2312,
Csibm866,
Csiso2022jp,
Csiso2022kr,
Csiso58gb231280,
Csiso88596e,
Csiso88596i,
Csiso88598e,
Csiso88598i,
Csisolatin1,
Csisolatin2,
Csisolatin3,
Csisolatin4,
Csisolatin5,
Csisolatin6,
Csisolatin9,
Csisolatinarabic,
Csisolatincyrillic,
Csisolatingreek,
Csisolatinhebrew,
Cskoi8r,
Csksc56011987,
Csmacintosh,
Csshiftjis,
Csunicode,
Cyrillic,
Dos_874,
Ecma_114,
Ecma_118,
#[atom("elot_928")]
Elot_u_928,
Euc_jp,
Euc_kr,
Gb18030,
Gb2312,
#[atom("gb_2312")]
Gb_u_2312,
#[atom("gb_2312-80")]
Gb_u_2312_80,
Gbk,
Greek,
Greek8,
Hebrew,
Hz_gb_2312,
Ibm819,
Ibm866,
Iso_10646_ucs_2,
Iso_2022_cn,
Iso_2022_cn_ext,
Iso_2022_jp,
Iso_2022_kr,
Iso_8859_1,
Iso_8859_10,
Iso_8859_11,
Iso_8859_13,
Iso_8859_14,
Iso_8859_15,
Iso_8859_16,
Iso_8859_2,
Iso_8859_3,
Iso_8859_4,
Iso_8859_5,
Iso_8859_6,
Iso_8859_6_e,
Iso_8859_6_i,
Iso_8859_7,
Iso_8859_8,
Iso_8859_8_e,
Iso_8859_8_i,
Iso_8859_9,
Iso_ir_100,
Iso_ir_101,
Iso_ir_109,
Iso_ir_110,
Iso_ir_126,
Iso_ir_127,
Iso_ir_138,
Iso_ir_144,
Iso_ir_148,
Iso_ir_149,
Iso_ir_157,
Iso_ir_58,
Iso8859_1,
Iso8859_10,
Iso8859_11,
Iso8859_13,
Iso8859_14,
Iso8859_15,
Iso8859_2,
Iso8859_3,
Iso8859_4,
Iso8859_5,
Iso8859_6,
Iso8859_7,
Iso8859_8,
Iso8859_9,
Iso88591,
Iso885910,
Iso885911,
Iso885913,
Iso885914,
Iso885915,
Iso88592,
Iso88593,
Iso88594,
Iso88595,
Iso88596,
Iso88597,
Iso88598,
Iso88599,
#[atom("iso_8859-1")]
Iso_u_8859_1,
#[atom("iso_8859-15")]
Iso_u_8859_15,
#[atom("iso_8859-1:1987")]
Iso_u_8859_1_c_1987,
#[atom("iso_8859-2")]
Iso_u_8859_2,
#[atom("iso_8859-2:1987")]
Iso_u_8859_2_c_1987,
#[atom("iso_8859-3")]
Iso_u_8859_3,
#[atom("iso_8859-3:1988")]
Iso_u_8859_3_c_1988,
#[atom("iso_8859-4")]
Iso_u_8859_4,
#[atom("iso_8859-4:1988")]
Iso_u_8859_4_c_1988,
#[atom("iso_8859-5")]
Iso_u_8859_5,
#[atom("iso_8859-5:1988")]
Iso_u_8859_5_c_1988,
#[atom("iso_8859-6")]
Iso_u_8859_6,
#[atom("iso_8859-6:1987")]
Iso_u_8859_6_c_1987,
#[atom("iso_8859-7")]
Iso_u_8859_7,
#[atom("iso_8859-7:1987")]
Iso_u_8859_7_c_1987,
#[atom("iso_8859-8")]
Iso_u_8859_8,
#[atom("iso_8859-8:1988")]
Iso_u_8859_8_c_1988,
#[atom("iso_8859-9")]
Iso_u_8859_9,
#[atom("iso_8859-9:1989")]
Iso_u_8859_9_c_1989,
Koi,
Koi8,
Koi8_r,
Koi8_ru,
Koi8_u,
#[atom("koi8_r")]
Koi8_u_r,
Korean,
#[atom("ks_c_5601-1987")]
Ks_u_c_u_5601_1987,
#[atom("ks_c_5601-1989")]
Ks_u_c_u_5601_1989,
Ksc5601,
#[atom("ksc_5601")]
Ksc_u_5601,
L1,
L2,
L3,
L4,
L5,
L6,
L9,
Latin1,
Latin2,
Latin3,
Latin4,
Latin5,
Latin6,
Logical,
Mac,
Macintosh,
Ms932,
#[atom("ms_kanji")]
Ms_u_kanji,
Replacement,
Shift_jis,
#[atom("shift_jis")]
Shift_u_jis,
Sjis,
#[atom("sun_eu_greek")]
Sun_u_eu_u_greek,
Tis_620,
Ucs_2,
Unicode,
Unicode_1_1_utf_8,
Unicode11utf8,
Unicode20utf8,
Unicodefeff,
Unicodefffe,
Us_ascii,
Utf_16,
Utf_16be,
Utf_16le,
Utf_8,
Utf8,
Visual,
Windows_1250,
Windows_1251,
Windows_1252,
Windows_1253,
Windows_1254,
Windows_1255,
Windows_1256,
Windows_1257,
Windows_1258,
Windows_31j,
Windows_874,
Windows_949,
X_cp1250,
X_cp1251,
X_cp1252,
X_cp1253,
X_cp1254,
X_cp1255,
X_cp1256,
X_cp1257,
X_cp1258,
X_euc_jp,
X_gbk,
X_mac_cyrillic,
X_mac_roman,
X_mac_ukrainian,
X_sjis,
X_unicode20utf8,
X_user_defined,
X_x_big5,
}
impl EncodingLabel {
const COMPACT: [Self; 229] = [
Self::Unknown,
Self::_866,
Self::L1,
Self::Arabic,
Self::L1,
Self::Arabic,
Self::Big5,
Self::Big5,
Self::Gbk,
Self::Big5,
Self::Cp1250,
Self::Cp1251,
Self::L1,
Self::Cp1253,
Self::L5,
Self::Cp1255,
Self::Cp1256,
Self::Cp1257,
Self::Cp1258,
Self::L1,
Self::_866,
Self::Big5,
Self::Euc_kr,
Self::Euc_jp,
Self::Gbk,
Self::_866,
Self::Csiso2022jp,
Self::Hz_gb_2312,
Self::Gbk,
Self::Arabic,
Self::Arabic,
Self::Hebrew,
Self::Logical,
Self::L1,
Self::L2,
Self::L3,
Self::L4,
Self::L5,
Self::L6,
Self::L9,
Self::Arabic,
Self::Cyrillic,
Self::Greek,
Self::Hebrew,
Self::Koi,
Self::Euc_kr,
Self::Mac,
Self::Sjis,
Self::Unknown,
Self::Cyrillic,
Self::Dos_874,
Self::Arabic,
Self::Greek,
Self::Greek,
Self::Euc_jp,
Self::Euc_kr,
Self::Gb18030,
Self::Gbk,
Self::Gbk,
Self::Gbk,
Self::Gbk,
Self::Greek,
Self::Greek,
Self::Hebrew,
Self::Hz_gb_2312,
Self::L1,
Self::_866,
Self::Unknown,
Self::Hz_gb_2312,
Self::Hz_gb_2312,
Self::Csiso2022jp,
Self::Hz_gb_2312,
Self::L1,
Self::L6,
Self::Dos_874,
Self::Iso885913,
Self::Iso885914,
Self::L9,
Self::Iso_8859_16,
Self::L2,
Self::L3,
Self::L4,
Self::Cyrillic,
Self::Arabic,
Self::Arabic,
Self::Arabic,
Self::Greek,
Self::Hebrew,
Self::Hebrew,
Self::Logical,
Self::L5,
Self::L1,
Self::L2,
Self::L3,
Self::L4,
Self::Greek,
Self::Arabic,
Self::Hebrew,
Self::Cyrillic,
Self::L5,
Self::Euc_kr,
Self::L6,
Self::Gbk,
Self::L1,
Self::L6,
Self::Dos_874,
Self::Iso885913,
Self::Iso885914,
Self::L9,
Self::L2,
Self::L3,
Self::L4,
Self::Cyrillic,
Self::Arabic,
Self::Greek,
Self::Hebrew,
Self::L5,
Self::L1,
Self::L6,
Self::Dos_874,
Self::Iso885913,
Self::Iso885914,
Self::L9,
Self::L2,
Self::L3,
Self::L4,
Self::Cyrillic,
Self::Arabic,
Self::Greek,
Self::Hebrew,
Self::L5,
Self::L1,
Self::L9,
Self::L1,
Self::L2,
Self::L2,
Self::L3,
Self::L3,
Self::L4,
Self::L4,
Self::Cyrillic,
Self::Cyrillic,
Self::Arabic,
Self::Arabic,
Self::Greek,
Self::Greek,
Self::Hebrew,
Self::Hebrew,
Self::L5,
Self::L5,
Self::Koi,
Self::Koi,
Self::Koi,
Self::Koi8_u,
Self::Koi8_u,
Self::Koi,
Self::Euc_kr,
Self::Euc_kr,
Self::Euc_kr,
Self::Euc_kr,
Self::Euc_kr,
Self::L1,
Self::L2,
Self::L3,
Self::L4,
Self::L5,
Self::L6,
Self::L9,
Self::L1,
Self::L2,
Self::L3,
Self::L4,
Self::L5,
Self::L6,
Self::Logical,
Self::Mac,
Self::Mac,
Self::Sjis,
Self::Sjis,
Self::Hz_gb_2312,
Self::Sjis,
Self::Sjis,
Self::Sjis,
Self::Greek,
Self::Dos_874,
Self::Unknown,
Self::Unknown,
Self::Unknown,
Self::Unknown,
Self::Unknown,
Self::Unknown,
Self::Unknown,
Self::L1,
Self::Unknown,
Self::Unknown,
Self::Unknown,
Self::Unknown,
Self::Unknown,
Self::Hebrew,
Self::Cp1250,
Self::Cp1251,
Self::L1,
Self::Cp1253,
Self::L5,
Self::Cp1255,
Self::Cp1256,
Self::Cp1257,
Self::Cp1258,
Self::Sjis,
Self::Dos_874,
Self::Euc_kr,
Self::Cp1250,
Self::Cp1251,
Self::L1,
Self::Cp1253,
Self::L5,
Self::Cp1255,
Self::Cp1256,
Self::Cp1257,
Self::Cp1258,
Self::Euc_jp,
Self::Gbk,
Self::X_mac_cyrillic,
Self::Mac,
Self::X_mac_cyrillic,
Self::Sjis,
Self::Unknown,
Self::X_user_defined,
Self::Big5,
];
pub fn from_label(label: &str) -> Self {
Self::from_str(label.trim_matches(|c| matches!(c, '\t' | '\n' | '\x0C' | '\r' | ' ')))
}
pub fn compact(self) -> Self {
Self::COMPACT[self as usize]
}
}
#[cfg(test)]
mod tests {
use super::{AtomSet, EncodingLabel};
const ALL_LABELS: [&str; 228] = [
"866",
"ansi_x3.4-1968",
"arabic",
"ascii",
"asmo-708",
"big5",
"big5-hkscs",
"chinese",
"cn-big5",
"cp1250",
"cp1251",
"cp1252",
"cp1253",
"cp1254",
"cp1255",
"cp1256",
"cp1257",
"cp1258",
"cp819",
"cp866",
"csbig5",
"cseuckr",
"cseucpkdfmtjapanese",
"csgb2312",
"csibm866",
"csiso2022jp",
"csiso2022kr",
"csiso58gb231280",
"csiso88596e",
"csiso88596i",
"csiso88598e",
"csiso88598i",
"csisolatin1",
"csisolatin2",
"csisolatin3",
"csisolatin4",
"csisolatin5",
"csisolatin6",
"csisolatin9",
"csisolatinarabic",
"csisolatincyrillic",
"csisolatingreek",
"csisolatinhebrew",
"cskoi8r",
"csksc56011987",
"csmacintosh",
"csshiftjis",
"csunicode",
"cyrillic",
"dos-874",
"ecma-114",
"ecma-118",
"elot_928",
"euc-jp",
"euc-kr",
"gb18030",
"gb2312",
"gb_2312",
"gb_2312-80",
"gbk",
"greek",
"greek8",
"hebrew",
"hz-gb-2312",
"ibm819",
"ibm866",
"iso-10646-ucs-2",
"iso-2022-cn",
"iso-2022-cn-ext",
"iso-2022-jp",
"iso-2022-kr",
"iso-8859-1",
"iso-8859-10",
"iso-8859-11",
"iso-8859-13",
"iso-8859-14",
"iso-8859-15",
"iso-8859-16",
"iso-8859-2",
"iso-8859-3",
"iso-8859-4",
"iso-8859-5",
"iso-8859-6",
"iso-8859-6-e",
"iso-8859-6-i",
"iso-8859-7",
"iso-8859-8",
"iso-8859-8-e",
"iso-8859-8-i",
"iso-8859-9",
"iso-ir-100",
"iso-ir-101",
"iso-ir-109",
"iso-ir-110",
"iso-ir-126",
"iso-ir-127",
"iso-ir-138",
"iso-ir-144",
"iso-ir-148",
"iso-ir-149",
"iso-ir-157",
"iso-ir-58",
"iso8859-1",
"iso8859-10",
"iso8859-11",
"iso8859-13",
"iso8859-14",
"iso8859-15",
"iso8859-2",
"iso8859-3",
"iso8859-4",
"iso8859-5",
"iso8859-6",
"iso8859-7",
"iso8859-8",
"iso8859-9",
"iso88591",
"iso885910",
"iso885911",
"iso885913",
"iso885914",
"iso885915",
"iso88592",
"iso88593",
"iso88594",
"iso88595",
"iso88596",
"iso88597",
"iso88598",
"iso88599",
"iso_8859-1",
"iso_8859-15",
"iso_8859-1:1987",
"iso_8859-2",
"iso_8859-2:1987",
"iso_8859-3",
"iso_8859-3:1988",
"iso_8859-4",
"iso_8859-4:1988",
"iso_8859-5",
"iso_8859-5:1988",
"iso_8859-6",
"iso_8859-6:1987",
"iso_8859-7",
"iso_8859-7:1987",
"iso_8859-8",
"iso_8859-8:1988",
"iso_8859-9",
"iso_8859-9:1989",
"koi",
"koi8",
"koi8-r",
"koi8-ru",
"koi8-u",
"koi8_r",
"korean",
"ks_c_5601-1987",
"ks_c_5601-1989",
"ksc5601",
"ksc_5601",
"l1",
"l2",
"l3",
"l4",
"l5",
"l6",
"l9",
"latin1",
"latin2",
"latin3",
"latin4",
"latin5",
"latin6",
"logical",
"mac",
"macintosh",
"ms932",
"ms_kanji",
"replacement",
"shift-jis",
"shift_jis",
"sjis",
"sun_eu_greek",
"tis-620",
"ucs-2",
"unicode",
"unicode-1-1-utf-8",
"unicode11utf8",
"unicode20utf8",
"unicodefeff",
"unicodefffe",
"us-ascii",
"utf-16",
"utf-16be",
"utf-16le",
"utf-8",
"utf8",
"visual",
"windows-1250",
"windows-1251",
"windows-1252",
"windows-1253",
"windows-1254",
"windows-1255",
"windows-1256",
"windows-1257",
"windows-1258",
"windows-31j",
"windows-874",
"windows-949",
"x-cp1250",
"x-cp1251",
"x-cp1252",
"x-cp1253",
"x-cp1254",
"x-cp1255",
"x-cp1256",
"x-cp1257",
"x-cp1258",
"x-euc-jp",
"x-gbk",
"x-mac-cyrillic",
"x-mac-roman",
"x-mac-ukrainian",
"x-sjis",
"x-unicode20utf8",
"x-user-defined",
"x-x-big5",
];
#[test]
fn every_label_resolves_to_its_own_variant() {
for (i, label) in ALL_LABELS.iter().enumerate() {
assert_eq!(
EncodingLabel::from_label(label).as_bits() as usize,
i + 1,
"{label} did not resolve to its own variant",
);
}
}
#[test]
fn compact_is_idempotent() {
for label in EncodingLabel::COMPACT {
assert_eq!(label.compact(), label, "{} is not its own shortest label", label.to_str());
}
}
#[test]
fn compact_never_lengthens_a_label() {
for label in ALL_LABELS.iter().map(|l| EncodingLabel::from_label(l)) {
let compact = label.compact();
if compact != EncodingLabel::Unknown {
assert!(compact.len() <= label.len(), "{} is longer than {}", compact.to_str(), label.to_str());
}
}
}
#[test]
fn shortens_windows_1252_aliases() {
assert_eq!(EncodingLabel::from_label("ISO-8859-1").compact().to_str(), "l1");
assert_eq!(EncodingLabel::from_label("us-ascii").compact().to_str(), "l1");
assert_eq!(EncodingLabel::from_label("l1").compact().to_str(), "l1");
}
#[test]
fn separators_are_significant() {
assert_eq!(EncodingLabel::from_label("iso_8859-15").compact().to_str(), "l9");
assert_eq!(EncodingLabel::from_label("iso8859-15").compact().to_str(), "l9");
assert_eq!(EncodingLabel::from_label("iso-8859-15").compact().to_str(), "l9");
assert_eq!(EncodingLabel::from_label("iso-8859_15"), EncodingLabel::Unknown);
}
#[test]
fn drops_utf8_and_utf16_labels() {
assert_eq!(EncodingLabel::from_label("UTF-8").compact(), EncodingLabel::Unknown);
assert_eq!(EncodingLabel::from_label("utf-16").compact(), EncodingLabel::Unknown);
assert_eq!(EncodingLabel::from_label("utf-16be").compact(), EncodingLabel::Unknown);
assert_eq!(EncodingLabel::from_label("unicode-1-1-utf-8").compact(), EncodingLabel::Unknown);
}
#[test]
fn drops_unknown_labels() {
assert_eq!(EncodingLabel::from_label("not-a-charset"), EncodingLabel::Unknown);
assert_eq!(EncodingLabel::from_label(""), EncodingLabel::Unknown);
assert_eq!(EncodingLabel::from_label("a-label-far-longer-than-any-real-one"), EncodingLabel::Unknown);
}
}