Skip to main content

oak_handlebars/lexer/
token_type.rs

1use oak_core::{Source, Token, TokenType, UniversalElementRole, UniversalTokenRole};
2#[cfg(feature = "serde")]
3use serde::{Deserialize, Serialize};
4
5pub type HandlebarsToken = Token<HandlebarsTokenType>;
6
7#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash)]
8#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
9pub enum HandlebarsTokenType {
10    // --- 词法标记 (Tokens) ---
11    // 空白和换行
12    Whitespace,
13    Newline,
14
15    // 注释
16    Comment,
17
18    // Handlebars 特殊标记
19    Open,              // {{
20    Close,             // }}
21    OpenUnescaped,     // {{{
22    CloseUnescaped,    // }}}
23    OpenRawBlock,      // {{{{
24    CloseRawBlock,     // }}}}
25    OpenEndRawBlock,   // {{{{/
26    OpenBlock,         // {{#
27    OpenInverseBlock,  // {{^
28    CloseBlock,        // {{/
29    OpenPartial,       // {{>
30    OpenComment,       // {{!
31    OpenCommentBlock,  // {{!--
32    CloseCommentBlock, // --}}
33
34    // 关键字
35    Else, // else
36
37    // 标识符和字面量
38    Identifier,
39    StringLiteral,
40    NumberLiteral,
41    BooleanLiteral,
42    Dot,          // .
43    Slash,        // /
44    Hash,         // #
45    At,           // @
46    Pipe,         // |
47    Equal,        // =
48    LeftParen,    // (
49    RightParen,   // )
50    LeftBracket,  // [
51    RightBracket, // ]
52    Caret,        // ^
53
54    // 内容
55    Content, // HTML/text content outside of handlebars expressions
56
57    // --- 节点种类 (Elements) ---
58    Root,
59    Mustache,
60    Block,
61    InverseBlock,
62    Partial,
63    CommentNode, // Avoid conflict with Comment token
64    ContentNode, // Avoid conflict with Content token
65    Expression,
66    SubExpression,
67    Path,
68    Parameter,
69    ElseBlock,
70
71    // 特殊
72    Error,
73    Eof,
74}
75
76impl TokenType for HandlebarsTokenType {
77    type Role = UniversalTokenRole;
78    const END_OF_STREAM: Self = Self::Error;
79
80    fn is_ignored(&self) -> bool {
81        false
82    }
83
84    fn role(&self) -> Self::Role {
85        match self {
86            _ => UniversalTokenRole::None,
87        }
88    }
89}