Skip to content

Commit 5bbe636

Browse files
committed
Fix runtime renderers rendering of certain sections
1 parent 02a467b commit 5bbe636

File tree

3 files changed

+23
-3
lines changed

3 files changed

+23
-3
lines changed

lib/src/mustachio/parser.dart

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -255,7 +255,6 @@ class MustachioParser {
255255
keySpanEndOffset - lastName.length, keySpanEndOffset);
256256
var section = Section([lastName], children,
257257
invert: invert, span: span, keySpan: lastNameSpan);
258-
//for (var sectionKey in parsedKey.names.reversed.skip(1)) {
259258
for (var i = parsedKey.names.length - 2; i >= 0; i--) {
260259
var sectionKey = parsedKey.names[i];
261260
// To find the start offset of the ith name, take the length of all of

lib/src/mustachio/renderer_base.dart

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -145,7 +145,7 @@ abstract class RendererBase<T> {
145145
Template _template;
146146

147147
/// The output buffer into which [context] is rendered, using a template.
148-
final buffer = StringBuffer();
148+
StringBuffer buffer = StringBuffer();
149149

150150
final Set<String> _invisibleGetters;
151151

@@ -234,7 +234,7 @@ abstract class RendererBase<T> {
234234
"Failed to resolve '$key' as a property on any types in the "
235235
'current context'));
236236
} else {
237-
return parent.section(node);
237+
return parent.withBuffer(buffer, () => parent.section(node));
238238
}
239239
}
240240

@@ -279,6 +279,16 @@ abstract class RendererBase<T> {
279279
renderBlock(partialTemplate.ast);
280280
_template = outerTemplate;
281281
}
282+
283+
/// Executes [fn] after replacing [buffer] with [newBuffer].
284+
///
285+
/// Replaces the previous buffer as [buffer].
286+
void withBuffer(StringBuffer newBuffer, void Function() fn) {
287+
var previousBuffer = buffer;
288+
buffer = newBuffer;
289+
fn();
290+
buffer = previousBuffer;
291+
}
282292
}
283293

284294
String renderSimple(Object context, List<MustachioNode> ast, Template template,

test/mustachio/runtime_renderer_render_test.dart

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -202,6 +202,17 @@ void main() {
202202
expect(renderBar(bar, barTemplate), equals('Text Foo: hello'));
203203
});
204204

205+
test('Renderer renders a value section node keyed lower in the stack',
206+
() async {
207+
var barTemplateFile = getFile('/project/bar.mustache')
208+
..writeAsStringSync('Text {{#foo}}One {{#s2}}Two{{/s2}}{{/foo}}');
209+
var barTemplate = await Template.parse(barTemplateFile);
210+
var bar = Bar()
211+
..foo = (Foo()..s1 = 'goodbye')
212+
..s2 = 'hello';
213+
expect(renderBar(bar, barTemplate), equals('Text One Two'));
214+
});
215+
205216
test('Renderer renders a null value section node as blank', () async {
206217
var fooTemplateFile = getFile('/project/foo.mustache')
207218
..writeAsStringSync('Text {{#s1}}"{{.}}" ({{length}}){{/s1}}');

0 commit comments

Comments
 (0)