Access outer loop context via its label
This commit is contained in:
committed by
David Jennes
parent
91df84b1a5
commit
dd7ea1e097
@@ -96,6 +96,10 @@ class ForNode: NodeType {
|
|||||||
let count = values.count
|
let count = values.count
|
||||||
var result = ""
|
var result = ""
|
||||||
|
|
||||||
|
// collect parent loop contexts
|
||||||
|
let parentLoopContexts = (context["forloop"] as? [String: Any])?
|
||||||
|
.filter { ($1 as? [String: Any])?["label"] != nil } ?? [:]
|
||||||
|
|
||||||
for (index, item) in zip(0..., values) {
|
for (index, item) in zip(0..., values) {
|
||||||
var forContext: [String: Any] = [
|
var forContext: [String: Any] = [
|
||||||
"first": index == 0,
|
"first": index == 0,
|
||||||
@@ -106,7 +110,9 @@ class ForNode: NodeType {
|
|||||||
]
|
]
|
||||||
if let label = label {
|
if let label = label {
|
||||||
forContext["label"] = label
|
forContext["label"] = label
|
||||||
|
forContext[label] = forContext
|
||||||
}
|
}
|
||||||
|
forContext.merge(parentLoopContexts) { lhs, _ in lhs }
|
||||||
|
|
||||||
var shouldBreak = false
|
var shouldBreak = false
|
||||||
result += try context.push(dictionary: ["forloop": forContext]) {
|
result += try context.push(dictionary: ["forloop": forContext]) {
|
||||||
|
|||||||
@@ -514,6 +514,51 @@ final class ForNodeTests: XCTestCase {
|
|||||||
try expect(template.render(self.context)).toThrow()
|
try expect(template.render(self.context)).toThrow()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func testAccessLabeled() {
|
||||||
|
it("can access labeled outer loop context from inner loop") {
|
||||||
|
let template = Template(templateString: """
|
||||||
|
{% outer: for item in 1...2 %}\
|
||||||
|
{% for item in items %}\
|
||||||
|
{{ forloop.counter }}-{{ forloop.outer.counter }},\
|
||||||
|
{% endfor %}---\
|
||||||
|
{% endfor %}
|
||||||
|
""")
|
||||||
|
try expect(template.render(self.context)) == """
|
||||||
|
1-1,2-1,3-1,---1-2,2-2,3-2,---
|
||||||
|
"""
|
||||||
|
}
|
||||||
|
|
||||||
|
it("can access labeled outer loop from double inner loop") {
|
||||||
|
let template = Template(templateString: """
|
||||||
|
{% outer: for item in 1...2 %}{% for item in 1...2 %}\
|
||||||
|
{% for item in items %}\
|
||||||
|
{{ forloop.counter }}-{{ forloop.outer.counter }},\
|
||||||
|
{% endfor %}---{% endfor %}
|
||||||
|
{% endfor %}
|
||||||
|
""")
|
||||||
|
try expect(template.render(self.context)) == """
|
||||||
|
1-1,2-1,3-1,---1-1,2-1,3-1,---
|
||||||
|
1-2,2-2,3-2,---1-2,2-2,3-2,---
|
||||||
|
|
||||||
|
"""
|
||||||
|
}
|
||||||
|
|
||||||
|
it("can access two labeled outer loop contexts from inner loop") {
|
||||||
|
let template = Template(templateString: """
|
||||||
|
{% outer1: for item in 1...2 %}{% outer2: for item in 1...2 %}\
|
||||||
|
{% for item in items %}\
|
||||||
|
{{ forloop.counter }}-{{ forloop.outer2.counter }}-{{ forloop.outer1.counter }},\
|
||||||
|
{% endfor %}---{% endfor %}
|
||||||
|
{% endfor %}
|
||||||
|
""")
|
||||||
|
try expect(template.render(self.context)) == """
|
||||||
|
1-1-1,2-1-1,3-1-1,---1-2-1,2-2-1,3-2-1,---
|
||||||
|
1-1-2,2-1-2,3-1-2,---1-2-2,2-2-2,3-2-2,---
|
||||||
|
|
||||||
|
"""
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// MARK: - Helpers
|
// MARK: - Helpers
|
||||||
|
|||||||
Reference in New Issue
Block a user