@@ -35,34 +35,90 @@ fn current_node<Handle>(open_elems: &[Handle]) -> &Handle {
35
35
}
36
36
37
37
macro_rules! tag {
38
- ( $( $tag: tt ) |+) => {
39
- $( tag!( __inner: $tag) ) |+
38
+ // Any start tag
39
+ ( <>) => {
40
+ crate :: tokenizer:: Tag {
41
+ kind: crate :: tokenizer:: StartTag ,
42
+ ..
43
+ }
44
+ } ;
45
+
46
+ // Any end tag
47
+ ( </>) => {
48
+ crate :: tokenizer:: Tag {
49
+ kind: crate :: tokenizer:: EndTag ,
50
+ ..
51
+ }
40
52
} ;
53
+
41
54
// Named end tag
42
- ( __inner: [ /$tag: tt] ) => {
43
- crate :: tokenizer:: Tag { kind: crate :: tokenizer:: EndTag , name: local_name!( $tag) , .. }
55
+ ( <$tag: tt>) => {
56
+ crate :: tokenizer:: Tag {
57
+ kind: crate :: tokenizer:: StartTag ,
58
+ name: local_name!( $tag) ,
59
+ ..
60
+ }
44
61
} ;
62
+
45
63
// Named start tag
46
- ( __inner: [ $tag: tt] ) => {
47
- crate :: tokenizer:: Tag { kind: crate :: tokenizer:: StartTag , name: local_name!( $tag) , .. }
64
+ ( </$tag: tt>) => {
65
+ crate :: tokenizer:: Tag {
66
+ kind: crate :: tokenizer:: EndTag ,
67
+ name: local_name!( $tag) ,
68
+ ..
69
+ }
70
+ } ;
71
+ }
72
+
73
+ macro_rules! tags {
74
+ // Any start tag
75
+ ( <>) => {
76
+ tag!( <>)
77
+ } ;
78
+ ( <>|$( $tail: tt) * ) => {
79
+ tag!( <>) | tags!( $( $tail) * )
80
+ } ;
81
+
82
+ // Any end tag
83
+ ( </>) => {
84
+ tag!( </>)
85
+ } ;
86
+ ( </>|$( $tail: tt) * ) => {
87
+ tag!( </>) | tags!( $( $tail) * )
88
+ } ;
89
+
90
+ // Named start tag
91
+ ( <$tag: tt>) => {
92
+ tag!( <$tag>)
93
+ } ;
94
+ ( <$tag: tt>|$( $tail: tt) * ) => {
95
+ tag!( <$tag>) | tags!( $( $tail) * )
96
+ } ;
97
+
98
+ // Named end tag
99
+ ( </$tag: tt>) => {
100
+ tag!( </$tag>)
101
+ } ;
102
+ ( </$tag: tt>|$( $tail: tt) * ) => {
103
+ tag!( </$tag>) | tags!( $( $tail) * )
48
104
} ;
49
105
}
50
106
51
107
macro_rules! is_not_tag {
52
- ( $input: ident, $( $tag : tt ) |+ ) => {
53
- !matches!( $input, $ ( tag! ( __inner : $tag ) ) |+ )
108
+ ( $input: ident, $( $tail : tt) * ) => {
109
+ !matches!( $input, tags! ( $ ( $tail ) * ) )
54
110
} ;
55
111
}
56
112
57
113
macro_rules! tag_token {
58
- ( $id: ident @ $( $tag : tt ) |+ ) => {
114
+ ( $id: ident @ $( $tail : tt) * ) => {
59
115
crate :: tree_builder:: types:: Token :: Tag (
60
- $id @ ( tag !( $( $tag ) |+ ) )
116
+ $id @ ( tags !( $( $tail ) * ) )
61
117
)
62
118
} ;
63
- ( $( $tag : tt) |+ ) => {
119
+ ( $( $tail : tt) * ) => {
64
120
crate :: tree_builder:: types:: Token :: Tag (
65
- tag !( $( $tag ) |+ )
121
+ tags !( $( $tail ) * )
66
122
)
67
123
} ;
68
124
}
@@ -142,14 +198,16 @@ where
142
198
} ,
143
199
Token :: Characters ( SplitStatus :: Whitespace , _) => ProcessResult :: Done ,
144
200
Token :: Comment ( text) => self . append_comment_to_doc ( text) ,
145
- // Token::Tag(tag @ tag!([ "html"] | [ /"body"] )) => {
146
- tag_token ! ( tag @ [ "html" ] | [ /"body" ] ) => {
201
+ Token :: Tag ( tag @ tags ! ( < "html" > | < /"body" > ) ) => {
202
+ // tag_token!(tag @ < "html"> | < /"body"> ) => {
147
203
self . create_root ( tag. attrs ) ;
148
204
self . mode . set ( InsertionMode :: BeforeHead ) ;
149
205
ProcessResult :: Done
150
206
} ,
151
- // Token::Tag(tag @ any_end_tag!()) if !matches!(tag, tag!([/"head"] | [/"body"] | [/"html"] | [/"br"])) =>
152
- any_end_tag_token ! ( tag) if is_not_tag ! ( tag, [ /"head" ] | [ /"body" ] | [ /"html" ] | [ /"br" ] ) => {
207
+ Token :: Tag ( tag @ tag ! ( </>) )
208
+ if !matches ! ( tag, tags!( </"head" > | </"body" > | </"html" > | </"br" >) ) =>
209
+ {
210
+ // any_end_tag_token!(tag) if is_not_tag!(tag, </"head"> | </"body"> | </"html"> | </"br">) => {
153
211
self . unexpected ( & tag)
154
212
} ,
155
213
token => {
0 commit comments