From 75609b42df8e8296d78a9234f8106ff48aaacdea Mon Sep 17 00:00:00 2001 From: robbytx Date: Thu, 13 Mar 2014 19:38:54 -0500 Subject: [PATCH] Add ability for lambda to change the context for fragment execution --- .../com/samskivert/mustache/Template.java | 24 ++++++++++++++++--- .../com/samskivert/mustache/MustacheTest.java | 14 +++++++++++ 2 files changed, 35 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/samskivert/mustache/Template.java b/src/main/java/com/samskivert/mustache/Template.java index f09538c..a9cf53f 100644 --- a/src/main/java/com/samskivert/mustache/Template.java +++ b/src/main/java/com/samskivert/mustache/Template.java @@ -43,12 +43,22 @@ public class Template /** Executes this template fragment, writing its result to {@code out}. */ public abstract void execute (Writer out); - /** Executes this template fragment and returns is result as a string. */ + /** Executes this template fragment with the provided context, writing its result to {@code out}. */ + public abstract void execute (Object context, Writer out); + + /** Executes this template fragment and returns its result as a string. */ public String execute () { StringWriter out = new StringWriter(); execute(out); return out.toString(); } + + /** Executes this template fragment with the provided context, and returns its result as a string. */ + public String execute (Object context) { + StringWriter out = new StringWriter(); + execute(context, out); + return out.toString(); + } } /** @@ -93,9 +103,17 @@ public class Template } } - protected Fragment createFragment (final Segment[] segs, final Context ctx) { + protected Fragment createFragment (final Segment[] segs, final Context currentCtx) { return new Fragment() { - @Override public void execute (Writer out) { + @Override public void execute(Writer out) { + execute(currentCtx, out); + } + + @Override public void execute(Object context, Writer out) { + execute(currentCtx.nest(context, 0, false, false), out); + } + + private void execute(Context ctx, Writer out) { for (Segment seg : segs) { seg.execute(Template.this, ctx, out); } diff --git a/src/test/java/com/samskivert/mustache/MustacheTest.java b/src/test/java/com/samskivert/mustache/MustacheTest.java index 9f1d347..465171b 100644 --- a/src/test/java/com/samskivert/mustache/MustacheTest.java +++ b/src/test/java/com/samskivert/mustache/MustacheTest.java @@ -664,6 +664,20 @@ public class MustacheTest })); } + @Test public void testLambdaWithContext () { + test("a in l1, a in l2", "{{#l1}}{{a}}{{/l1}}, {{#l2}}{{a}}{{/l2}}", + context("l1", new Mustache.Lambda() { + public void execute(Template.Fragment frag, Writer out) throws IOException { + frag.execute(context("a", "a in l1"), out); + } + }, "l2", new Mustache.Lambda() { + public void execute(Template.Fragment frag, Writer out) throws IOException { + frag.execute(context("a", "a in l2"), out); + } + } + )); + } + @Test public void testNonStandardDefaultDelims () { test(Mustache.compiler().withDelims("<% %>"), "bar", "<%foo%>", new Object() { String foo = "bar";