#[derive(Debug, Clone, PartialEq, Eq)]
pub struct Token {
pub kind: TokenKind,
pub text: String,
}
impl Token {
pub fn new(kind: TokenKind, text: impl Into<String>) -> Self {
Token {
kind,
text: text.into(),
}
}
}
pub type SourceLine = Vec<Token>;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)]
pub enum TokenKind {
Normal,
Keyword,
DataType,
DecVal,
BaseN,
Float,
Constant,
Char,
SpecialChar,
String,
VerbatimString,
SpecialString,
Import,
Comment,
Documentation,
Annotation,
CommentVar,
Function,
Variable,
ControlFlow,
Operator,
BuiltIn,
Extension,
Preprocessor,
Attribute,
RegionMarker,
Information,
Warning,
Alert,
Error,
Other,
}
impl TokenKind {
#[must_use]
pub fn from_default_style(name: &str) -> Self {
match name {
"dsKeyword" => TokenKind::Keyword,
"dsFunction" => TokenKind::Function,
"dsVariable" => TokenKind::Variable,
"dsControlFlow" => TokenKind::ControlFlow,
"dsOperator" => TokenKind::Operator,
"dsBuiltIn" => TokenKind::BuiltIn,
"dsExtension" => TokenKind::Extension,
"dsPreprocessor" => TokenKind::Preprocessor,
"dsAttribute" => TokenKind::Attribute,
"dsChar" => TokenKind::Char,
"dsSpecialChar" => TokenKind::SpecialChar,
"dsString" => TokenKind::String,
"dsVerbatimString" => TokenKind::VerbatimString,
"dsSpecialString" => TokenKind::SpecialString,
"dsImport" => TokenKind::Import,
"dsDataType" => TokenKind::DataType,
"dsDecVal" => TokenKind::DecVal,
"dsBaseN" => TokenKind::BaseN,
"dsFloat" => TokenKind::Float,
"dsConstant" => TokenKind::Constant,
"dsComment" => TokenKind::Comment,
"dsDocumentation" => TokenKind::Documentation,
"dsAnnotation" => TokenKind::Annotation,
"dsCommentVar" => TokenKind::CommentVar,
"dsInformation" => TokenKind::Information,
"dsWarning" => TokenKind::Warning,
"dsAlert" => TokenKind::Alert,
"dsError" => TokenKind::Error,
"dsRegionMarker" => TokenKind::RegionMarker,
"dsOthers" => TokenKind::Other,
_ => TokenKind::Normal,
}
}
#[must_use]
pub fn style_key(self) -> &'static str {
match self {
TokenKind::Normal => "Normal",
TokenKind::Keyword => "Keyword",
TokenKind::DataType => "DataType",
TokenKind::DecVal => "DecVal",
TokenKind::BaseN => "BaseN",
TokenKind::Float => "Float",
TokenKind::Constant => "Constant",
TokenKind::Char => "Char",
TokenKind::SpecialChar => "SpecialChar",
TokenKind::String => "String",
TokenKind::VerbatimString => "VerbatimString",
TokenKind::SpecialString => "SpecialString",
TokenKind::Import => "Import",
TokenKind::Comment => "Comment",
TokenKind::Documentation => "Documentation",
TokenKind::Annotation => "Annotation",
TokenKind::CommentVar => "CommentVar",
TokenKind::Function => "Function",
TokenKind::Variable => "Variable",
TokenKind::ControlFlow => "ControlFlow",
TokenKind::Operator => "Operator",
TokenKind::BuiltIn => "BuiltIn",
TokenKind::Extension => "Extension",
TokenKind::Preprocessor => "Preprocessor",
TokenKind::Attribute => "Attribute",
TokenKind::RegionMarker => "RegionMarker",
TokenKind::Information => "Information",
TokenKind::Warning => "Warning",
TokenKind::Alert => "Alert",
TokenKind::Error => "Error",
TokenKind::Other => "Other",
}
}
#[must_use]
pub fn html_class(self) -> &'static str {
match self {
TokenKind::Normal => "",
TokenKind::Keyword => "kw",
TokenKind::DataType => "dt",
TokenKind::DecVal => "dv",
TokenKind::BaseN => "bn",
TokenKind::Float => "fl",
TokenKind::Char => "ch",
TokenKind::String => "st",
TokenKind::Comment => "co",
TokenKind::Other => "ot",
TokenKind::Alert => "al",
TokenKind::Function => "fu",
TokenKind::RegionMarker => "re",
TokenKind::Error => "er",
TokenKind::Constant => "cn",
TokenKind::SpecialChar => "sc",
TokenKind::VerbatimString => "vs",
TokenKind::SpecialString => "ss",
TokenKind::Import => "im",
TokenKind::Documentation => "do",
TokenKind::Annotation => "an",
TokenKind::CommentVar => "cv",
TokenKind::Variable => "va",
TokenKind::ControlFlow => "cf",
TokenKind::Operator => "op",
TokenKind::BuiltIn => "bu",
TokenKind::Extension => "ex",
TokenKind::Preprocessor => "pp",
TokenKind::Attribute => "at",
TokenKind::Information => "in",
TokenKind::Warning => "wa",
}
}
#[must_use]
pub fn latex_macro(self) -> &'static str {
match self {
TokenKind::Normal => "NormalTok",
TokenKind::Keyword => "KeywordTok",
TokenKind::DataType => "DataTypeTok",
TokenKind::DecVal => "DecValTok",
TokenKind::BaseN => "BaseNTok",
TokenKind::Float => "FloatTok",
TokenKind::Constant => "ConstantTok",
TokenKind::Char => "CharTok",
TokenKind::SpecialChar => "SpecialCharTok",
TokenKind::String => "StringTok",
TokenKind::VerbatimString => "VerbatimStringTok",
TokenKind::SpecialString => "SpecialStringTok",
TokenKind::Import => "ImportTok",
TokenKind::Comment => "CommentTok",
TokenKind::Documentation => "DocumentationTok",
TokenKind::Annotation => "AnnotationTok",
TokenKind::CommentVar => "CommentVarTok",
TokenKind::Function => "FunctionTok",
TokenKind::Variable => "VariableTok",
TokenKind::ControlFlow => "ControlFlowTok",
TokenKind::Operator => "OperatorTok",
TokenKind::BuiltIn => "BuiltInTok",
TokenKind::Extension => "ExtensionTok",
TokenKind::Preprocessor => "PreprocessorTok",
TokenKind::Attribute => "AttributeTok",
TokenKind::RegionMarker => "RegionMarkerTok",
TokenKind::Information => "InformationTok",
TokenKind::Warning => "WarningTok",
TokenKind::Alert => "AlertTok",
TokenKind::Error => "ErrorTok",
TokenKind::Other => "OtherTok",
}
}
}