diff --git a/src/main/java/com/samskivert/mustache/BasicCollector.java b/src/main/java/com/samskivert/mustache/BasicCollector.java index 0718917..ab760ab 100644 --- a/src/main/java/com/samskivert/mustache/BasicCollector.java +++ b/src/main/java/com/samskivert/mustache/BasicCollector.java @@ -71,7 +71,10 @@ public abstract class BasicCollector implements Mustache.Collector protected static final Mustache.VariableFetcher MAP_FETCHER = new Mustache.VariableFetcher() { public Object get (Object ctx, String name) throws Exception { Map map = (Map)ctx; - return map.containsKey(name) ? map.get(name) : Template.NO_FETCHER_FOUND; + if (map.containsKey(name)) return map.get(name); + // special case to allow map entry set to be iterated over + if (name == "entrySet") return map.entrySet(); + return Template.NO_FETCHER_FOUND; } @Override public String toString () { return "MAP_FETCHER"; diff --git a/src/test/java/com/samskivert/mustache/SharedTests.java b/src/test/java/com/samskivert/mustache/SharedTests.java index ca70583..6041685 100644 --- a/src/test/java/com/samskivert/mustache/SharedTests.java +++ b/src/test/java/com/samskivert/mustache/SharedTests.java @@ -70,6 +70,14 @@ public abstract class SharedTests extends GWTTestCase "foo", Arrays.asList(context("bar", "baz"), context("bar", "bif")))); } + @Test public void testMapEntriesSection () { + Map data = new HashMap(); + data.put("k1", "v1"); + data.put("k2", "v2"); + test("k1v1k2v2", "{{#map.entrySet}}{{key}}{{value}}{{/map.entrySet}}", + context("map", data)); + } + @Test public void testArraySection () { test("bazbif", "{{#foo}}{{bar}}{{/foo}}", context("foo", new Object[] { context("bar", "baz"), context("bar", "bif") }));