Resolve names from outer sections in a nested section
diff --git a/lib/template.dart b/lib/template.dart
index 233c088..9f86890 100644
--- a/lib/template.dart
+++ b/lib/template.dart
@@ -117,8 +117,18 @@
_write(node.value);
}
+ // Walks up the stack looking for the variable.
+ _resolveValue(String name) {
+ var map = _stack
+ .reversed
+ .firstWhere(
+ (v) => v is Map && v.containsKey(name),
+ orElse: () => null);
+ return map != null ? map[name] : null;
+ }
+
_renderVariable(node, {bool escape : true}) {
- final value = _stack.last[node.value];
+ final value = _resolveValue(node.value);
if (value == null) {
if (!_lenient)
throw new MustacheFormatException(
@@ -134,17 +144,13 @@
}
_renderSectionWithValue(node, value) {
- if (value is Map)
- _stack.add(value);
-
+ _stack.add(value);
node.children.forEach(_renderNode);
-
- if (value is Map)
- _stack.removeLast();
+ _stack.removeLast();
}
_renderSection(node) {
- final value = _stack.last[node.value];
+ final value = _resolveValue(node.value);
if (value is List) {
value.forEach((v) => _renderSectionWithValue(node, v));
} else if (value is Map) {
@@ -169,7 +175,7 @@
}
_renderInvSection(node) {
- final value = _stack.last[node.value];
+ final value = _resolveValue(node.value);
if ((value is List && value.isEmpty) || value == false) {
_renderSectionWithValue(node, value);
} else if (value == true || value is Map || value is List) {