Skip to main content

oak_html/lexer/
token_type.rs

1use oak_core::{Token, TokenType, UniversalTokenRole};
2#[cfg(feature = "serde")]
3use serde::{Deserialize, Serialize};
4
5pub type HtmlToken = Token<HtmlTokenType>;
6
7#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
8#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
9pub enum HtmlTokenType {
10    TagOpen,
11    TagClose,
12    TagSlashOpen,
13    TagSelfClose,
14    TagName,
15    AttributeName,
16    AttributeValue,
17    Attribute,
18    Text,
19    Comment,
20    Equal,
21    Quote,
22    Doctype,
23    CData,
24    ProcessingInstruction,
25    EntityRef,
26    CharRef,
27    Whitespace,
28    Newline,
29    Document,
30    Element,
31    Eof,
32    Error,
33}
34
35impl TokenType for HtmlTokenType {
36    type Role = UniversalTokenRole;
37    const END_OF_STREAM: Self = Self::Eof;
38
39    fn is_ignored(&self) -> bool {
40        matches!(self, Self::Whitespace | Self::Newline | Self::Comment)
41    }
42
43    fn role(&self) -> Self::Role {
44        match self {
45            Self::TagOpen | Self::TagClose | Self::TagSlashOpen | Self::TagSelfClose => UniversalTokenRole::Operator,
46            Self::TagName => UniversalTokenRole::Name,
47            Self::AttributeName => UniversalTokenRole::Name,
48            Self::AttributeValue => UniversalTokenRole::Literal,
49            Self::Text => UniversalTokenRole::None,
50            Self::Comment => UniversalTokenRole::Comment,
51            Self::Equal => UniversalTokenRole::Operator,
52            Self::Quote => UniversalTokenRole::Operator,
53            Self::Doctype => UniversalTokenRole::Keyword,
54            Self::Whitespace | Self::Newline => UniversalTokenRole::Whitespace,
55            _ => UniversalTokenRole::None,
56        }
57    }
58}