diff --git a/crates/djls-template-ast/src/parser.rs b/crates/djls-template-ast/src/parser.rs index 427ba93..e169077 100644 --- a/crates/djls-template-ast/src/parser.rs +++ b/crates/djls-template-ast/src/parser.rs @@ -87,7 +87,7 @@ impl Parser { pub fn parse_django_block(&mut self) -> Result { let token = self.peek_previous()?; - let bits: Vec = token + let mut bits: Vec = token .content() .split_whitespace() .map(String::from) @@ -97,12 +97,25 @@ impl Parser { let span = Span::from(token); let tag_span = Span::new(*span.start(), tag_name.len() as u32); + let assignment = if bits.len() >= 2 { + let second_to_last_index = bits.len() - 2; + if bits[second_to_last_index] == "as" { + let value = bits.last().cloned(); + bits.truncate(bits.len() - 2); + value + } else { + None + } + } else { + None + }; + let tag = Tag { name: tag_name.clone(), - bits: bits.clone(), + bits, span, tag_span, - assignment: None, + assignment, }; let specs = TagSpecs::load_builtin_specs()?; @@ -483,6 +496,16 @@ mod tests { assert!(errors.is_empty()); } + #[test] + fn test_parse_django_tag_assignment() { + let source = "{% url 'view-name' as view %}"; + let tokens = Lexer::new(source).tokenize().unwrap(); + let mut parser = Parser::new(tokens); + let (ast, errors) = parser.parse().unwrap(); + insta::assert_yaml_snapshot!(ast); + assert!(errors.is_empty()); + } + #[test] fn test_parse_nested_for_if() { let source = diff --git a/crates/djls-template-ast/src/snapshots/djls_template_ast__parser__tests__django__parse_django_tag_assignment.snap b/crates/djls-template-ast/src/snapshots/djls_template_ast__parser__tests__django__parse_django_tag_assignment.snap new file mode 100644 index 0000000..c863418 --- /dev/null +++ b/crates/djls-template-ast/src/snapshots/djls_template_ast__parser__tests__django__parse_django_tag_assignment.snap @@ -0,0 +1,21 @@ +--- +source: crates/djls-template-ast/src/parser.rs +expression: ast +--- +nodes: + - Block: + Tag: + tag: + name: url + bits: + - url + - "'view-name'" + span: + start: 3 + length: 23 + tag_span: + start: 3 + length: 3 + assignment: view +line_offsets: + - 0