Skip to content

Commit cacad22

Browse files
add assignment
1 parent fdf1ebb commit cacad22

File tree

2 files changed

+47
-3
lines changed

2 files changed

+47
-3
lines changed

crates/djls-template-ast/src/parser.rs

Lines changed: 26 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ impl Parser {
8787
pub fn parse_django_block(&mut self) -> Result<Node, ParserError> {
8888
let token = self.peek_previous()?;
8989

90-
let bits: Vec<String> = token
90+
let mut bits: Vec<String> = token
9191
.content()
9292
.split_whitespace()
9393
.map(String::from)
@@ -97,12 +97,25 @@ impl Parser {
9797
let span = Span::from(token);
9898
let tag_span = Span::new(*span.start(), tag_name.len() as u32);
9999

100+
let assignment = if bits.len() >= 2 {
101+
let second_to_last_index = bits.len() - 2;
102+
if bits[second_to_last_index] == "as" {
103+
let value = bits.last().cloned();
104+
bits.truncate(bits.len() - 2);
105+
value
106+
} else {
107+
None
108+
}
109+
} else {
110+
None
111+
};
112+
100113
let tag = Tag {
101114
name: tag_name.clone(),
102-
bits: bits.clone(),
115+
bits,
103116
span,
104117
tag_span,
105-
assignment: None,
118+
assignment,
106119
};
107120

108121
let specs = TagSpecs::load_builtin_specs()?;
@@ -483,6 +496,16 @@ mod tests {
483496
assert!(errors.is_empty());
484497
}
485498

499+
#[test]
500+
fn test_parse_django_tag_assignment() {
501+
let source = "{% url 'view-name' as view %}";
502+
let tokens = Lexer::new(source).tokenize().unwrap();
503+
let mut parser = Parser::new(tokens);
504+
let (ast, errors) = parser.parse().unwrap();
505+
insta::assert_yaml_snapshot!(ast);
506+
assert!(errors.is_empty());
507+
}
508+
486509
#[test]
487510
fn test_parse_nested_for_if() {
488511
let source =
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
---
2+
source: crates/djls-template-ast/src/parser.rs
3+
expression: ast
4+
---
5+
nodes:
6+
- Block:
7+
Tag:
8+
tag:
9+
name: url
10+
bits:
11+
- url
12+
- "'view-name'"
13+
span:
14+
start: 3
15+
length: 23
16+
tag_span:
17+
start: 3
18+
length: 3
19+
assignment: view
20+
line_offsets:
21+
- 0

0 commit comments

Comments
 (0)