@@ -70,7 +70,7 @@ impl Lexer {
7070
7171 self . consume_n ( TagDelimiter :: LENGTH ) ;
7272
73- match self . consume_until ( delimiter. closer ( ) ) {
73+ match self . consume_until_delimiter ( delimiter. closer ( ) ) {
7474 Ok ( text) => {
7575 let len = text. len ( ) ;
7676 let span = Span :: saturating_from_parts_usize ( content_start, len) ;
@@ -166,7 +166,7 @@ impl Lexer {
166166 }
167167 }
168168
169- fn consume_until ( & mut self , delimiter : & str ) -> Result < String , String > {
169+ fn consume_until_delimiter ( & mut self , delimiter : & str ) -> Result < String , String > {
170170 let offset = self . current ;
171171
172172 if let Some ( pos) = memmem:: find ( self . remaining_source ( ) . as_bytes ( ) , delimiter. as_bytes ( ) ) {
@@ -180,23 +180,31 @@ impl Lexer {
180180
181181 fn consume_until_stop_char ( & self ) -> usize {
182182 let mut offset = 0 ;
183+ let max = self . source . len ( ) - self . current ;
183184
184- loop {
185+ while offset < max {
185186 let remaining = & self . remaining_source ( ) [ offset..] ;
186187
187- let Some ( pos) = memchr3 ( b'{' , b'\n' , b'\r' , remaining. as_bytes ( ) ) else {
188- return self . source . len ( ) - self . current ;
189- } ;
188+ match memchr3 ( b'{' , b'\n' , b'\r' , remaining. as_bytes ( ) ) {
189+ None => {
190+ offset = max;
191+ break ;
192+ }
193+ Some ( pos) => {
194+ let is_newline = matches ! ( remaining. as_bytes( ) [ pos] , b'\n' | b'\r' ) ;
195+ let is_django_delimiter = TagDelimiter :: from_input ( & remaining[ pos..] ) . is_some ( ) ;
190196
191- let is_newline = matches ! ( remaining. as_bytes( ) [ pos] , b'\n' | b'\r' ) ;
192- let is_django_delimiter = TagDelimiter :: from_input ( & remaining[ pos..] ) . is_some ( ) ;
197+ if is_newline || is_django_delimiter {
198+ offset += pos;
199+ break ;
200+ }
193201
194- if is_newline || is_django_delimiter {
195- return offset + pos ;
202+ offset += pos + 1 ;
203+ }
196204 }
197-
198- offset += pos + 1 ;
199205 }
206+
207+ offset
200208 }
201209}
202210
0 commit comments