use std::fmt::Formatter;
use lazy_static::lazy_static;
use crate::utils::strings::CharType;
#[derive(Copy,PartialEq,Clone)]
pub enum CategoryCode {
Escape,
BeginGroup,
EndGroup,
MathShift,
AlignmentTab,
EOL,
Parameter,
Superscript,
Subscript,
Ignored,
Space,
Letter,
Other,
Active,
Comment,
Invalid,
EOF
}
impl Default for CategoryCode {
fn default() -> Self { CategoryCode::Other }
}
impl std::fmt::Debug for CategoryCode {
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
std::fmt::Display::fmt(self,f)
}
}
impl std::fmt::Display for CategoryCode {
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
use CategoryCode::*;
write!(f,"{}",match self {
Escape => "Escape",
BeginGroup => "BeginGroup",
EndGroup => "EndGroup",
MathShift => "MathShift",
AlignmentTab => "AlignmentTab",
EOL => "EOL",
Parameter => "Parameter",
Superscript => "Superscript",
Subscript => "Subscript",
Ignored => "Ignored",
Space => "Space",
Letter => "Letter",
Other => "Other",
Active => "Active",
Comment => "Comment",
Invalid => "Invalid",
EOF => "EOF"
})
}
}
impl Into<u8> for CategoryCode {
fn into(self) -> u8 {
use CategoryCode::*;
match self {
Escape => 0,
BeginGroup => 1,
EndGroup => 2,
MathShift => 3,
AlignmentTab => 4,
EOL => 5,
Parameter => 6,
Superscript => 7,
Subscript => 8,
Ignored => 9,
Space => 10,
Letter => 11,
Other => 12,
Active => 13,
Comment => 14,
Invalid => 15,
EOF => 16
}
}
}
impl TryFrom<u8> for CategoryCode {
type Error = ();
fn try_from(value: u8) -> Result<Self, Self::Error> {
use CategoryCode::*;
Ok(match value {
0 => Escape,
1 => BeginGroup,
2 => EndGroup,
3 => MathShift,
4 => AlignmentTab,
5 => EOL,
6 => Parameter,
7 => Superscript,
8 => Subscript,
9 => Ignored,
10 => Space,
11 => Letter,
12 => Other,
13 => Active,
14 => Comment,
15 => Invalid,
_ => return Err(())
})
}
}
pub type CategoryCodeScheme<Char> = <Char as CharType>::Allchars<CategoryCode>;
lazy_static! {
pub static ref OTHER_SCHEME_U8 : CategoryCodeScheme<u8> = {
let mut catcodes = [CategoryCode::Other;256];
catcodes[32] = CategoryCode::Space;
catcodes
};
pub static ref STARTING_SCHEME_U8 : CategoryCodeScheme<u8> = {
let mut catcodes = [CategoryCode::Other;256];
catcodes[92] = CategoryCode::Escape;
catcodes[32] = CategoryCode::Space;
catcodes[13] = CategoryCode::EOL;
catcodes[37] = CategoryCode::Comment;
for i in 65..91 { catcodes[i] = CategoryCode::Letter}
for i in 97..123 { catcodes[i] = CategoryCode::Letter}
catcodes
};
pub static ref DEFAULT_SCHEME_U8 : CategoryCodeScheme<u8> = {
let mut catcodes = [CategoryCode::Other;256];
catcodes[123] = CategoryCode::BeginGroup;
catcodes[125] = CategoryCode::EndGroup;
catcodes[36] = CategoryCode::MathShift;
catcodes[38] = CategoryCode::AlignmentTab;
catcodes[35] = CategoryCode::Parameter;
catcodes[94] = CategoryCode::Superscript;
catcodes[95] = CategoryCode::Subscript;
catcodes[126] = CategoryCode::Active;
catcodes[92] = CategoryCode::Escape;
catcodes[32] = CategoryCode::Space;
catcodes[13] = CategoryCode::EOL;
catcodes[37] = CategoryCode::Comment;
for i in 65..91 { catcodes[i] = CategoryCode::Letter}
for i in 97..123 { catcodes[i] = CategoryCode::Letter}
catcodes
};
}