@@ -645,7 +645,13 @@ impl<'s> Parser<'s> {
645
645
Language :: Jinja => {
646
646
self . skip_ws ( ) ;
647
647
let result = if matches ! ( self . chars. peek( ) , Some ( ( _, '{' ) ) ) {
648
- self . parse_jinja_tag_or_block ( None , & mut Parser :: parse_attr)
648
+ let mut chars = self . chars . clone ( ) ;
649
+ chars. next ( ) ;
650
+ if let Some ( ( _, '{' ) ) = chars. next ( ) {
651
+ self . parse_native_attr ( ) . map ( Attribute :: Native )
652
+ } else {
653
+ self . parse_jinja_tag_or_block ( None , & mut Parser :: parse_attr)
654
+ }
649
655
} else {
650
656
self . parse_native_attr ( ) . map ( Attribute :: Native )
651
657
} ;
@@ -663,13 +669,26 @@ impl<'s> Parser<'s> {
663
669
664
670
fn parse_attr_name ( & mut self ) -> PResult < & ' s str > {
665
671
if matches ! ( self . language, Language :: Jinja | Language :: Vento ) {
666
- let Some ( ( start, _) ) = self
667
- . chars
668
- . next_if ( |( _, c) | is_attr_name_char ( * c) && * c != '{' )
669
- else {
672
+ let Some ( ( start, mut end) ) = ( match self . chars . peek ( ) {
673
+ Some ( ( i, '{' ) ) => {
674
+ let start = * i;
675
+ let mut chars = self . chars . clone ( ) ;
676
+ chars. next ( ) ;
677
+ if let Some ( ( _, '{' ) ) = chars. next ( ) {
678
+ let end =
679
+ start + self . parse_mustache_interpolation ( ) ?. 0 . len ( ) + "{{}}" . len ( ) - 1 ;
680
+ Some ( ( start, end) )
681
+ } else {
682
+ None
683
+ }
684
+ }
685
+ Some ( ( _, c) ) if is_attr_name_char ( * c) => {
686
+ self . chars . next ( ) . map ( |( start, _) | ( start, start) )
687
+ }
688
+ _ => None ,
689
+ } ) else {
670
690
return Err ( self . emit_error ( SyntaxErrorKind :: ExpectAttrName ) ) ;
671
691
} ;
672
- let mut end = start;
673
692
674
693
while let Some ( ( i, c) ) = self . chars . peek ( ) {
675
694
if is_attr_name_char ( * c) && * c != '{' {
@@ -679,11 +698,17 @@ impl<'s> Parser<'s> {
679
698
let i = * i;
680
699
let mut chars = self . chars . clone ( ) ;
681
700
chars. next ( ) ;
682
- if chars. next_if ( |( _, c) | * c != '%' ) . is_some ( ) {
683
- end = i;
684
- self . chars . next ( ) ;
685
- } else {
686
- break ;
701
+ match chars. next ( ) {
702
+ Some ( ( _, '%' ) ) => {
703
+ break ;
704
+ }
705
+ Some ( ( _, '{' ) ) => {
706
+ end += self . parse_mustache_interpolation ( ) ?. 0 . len ( ) + "{{}}" . len ( ) ;
707
+ }
708
+ _ => {
709
+ end = i;
710
+ self . chars . next ( ) ;
711
+ }
687
712
}
688
713
} else {
689
714
break ;
0 commit comments