Added support for "this" variable which refers to the context itself rather

than a member of the context.
This commit is contained in:
Michael Bayne
2010-10-21 21:28:06 +00:00
parent 3bad793de9
commit 134a22bcfd
2 changed files with 23 additions and 0 deletions
@@ -20,6 +20,8 @@ import java.util.concurrent.ConcurrentHashMap;
* Given a name {@code foo}, the following mechanisms are supported for resolving its value * Given a name {@code foo}, the following mechanisms are supported for resolving its value
* (and are sought in this order): * (and are sought in this order):
* <ul> * <ul>
* <li>If the variable has the special name {@code this} the context object itself will be
* returned. This is useful when iterating over lists.
* <li>If the object is a {@link Map}, {@link Map#get} will be called with the string {@code foo} * <li>If the object is a {@link Map}, {@link Map#get} will be called with the string {@code foo}
* as the key. * as the key.
* <li>A method named {@code foo} in the supplied object (with non-void return value). * <li>A method named {@code foo} in the supplied object (with non-void return value).
@@ -101,6 +103,10 @@ public class Template
protected static VariableFetcher createFetcher (Key key) protected static VariableFetcher createFetcher (Key key)
{ {
if (key.name == THIS_NAME) {
return THIS_FETCHER;
}
if (Map.class.isAssignableFrom(key.cclass)) { if (Map.class.isAssignableFrom(key.cclass)) {
return MAP_FETCHER; return MAP_FETCHER;
} }
@@ -225,4 +231,12 @@ public class Template
return ((Map<?,?>)ctx).get(name); return ((Map<?,?>)ctx).get(name);
} }
}; };
protected static final VariableFetcher THIS_FETCHER = new VariableFetcher() {
public Object get (Object ctx, String name) throws Exception {
return ctx;
}
};
protected static final String THIS_NAME = "this".intern();
} }
@@ -126,6 +126,15 @@ public class MustacheTest
context("bob}bob", "bar"))); context("bob}bob", "bar")));
} }
@Test public void testTopLevelThis () {
assertEquals("bar", Mustache.compiler().compile("{{this}}").execute("bar"));
}
@Test public void testNestedThis () {
assertEquals("barbazbif", Mustache.compiler().compile("{{#things}}{{this}}{{/things}}").
execute(context("things", Arrays.asList("bar", "baz", "bif"))));
}
protected void test (String expected, String template, Object ctx) protected void test (String expected, String template, Object ctx)
{ {
assertEquals(expected, Mustache.compiler().compile(template).execute(ctx)); assertEquals(expected, Mustache.compiler().compile(template).execute(ctx));