diff --git a/src/main/java/com/mitchellbosecke/pebble/extension/core/CoreExtension.java b/src/main/java/com/mitchellbosecke/pebble/extension/core/CoreExtension.java index 4e4960121..716a5b66c 100644 --- a/src/main/java/com/mitchellbosecke/pebble/extension/core/CoreExtension.java +++ b/src/main/java/com/mitchellbosecke/pebble/extension/core/CoreExtension.java @@ -118,6 +118,7 @@ public Map<String, Filter> getFilters() { filters.put("date", new DateFilter()); filters.put("default", new DefaultFilter()); filters.put("first", new FirstFilter()); + filters.put("join", new JoinFilter()); filters.put("lower", new LowerFilter()); filters.put("numberformat", new NumberFormatFilter()); filters.put("sort", new SortFilter()); diff --git a/src/main/java/com/mitchellbosecke/pebble/extension/core/FirstFilter.java b/src/main/java/com/mitchellbosecke/pebble/extension/core/FirstFilter.java index c7e1706c4..e537b0624 100644 --- a/src/main/java/com/mitchellbosecke/pebble/extension/core/FirstFilter.java +++ b/src/main/java/com/mitchellbosecke/pebble/extension/core/FirstFilter.java @@ -8,7 +8,6 @@ ******************************************************************************/ package com.mitchellbosecke.pebble.extension.core; -import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.Map; @@ -25,9 +24,7 @@ public class FirstFilter implements Filter { @Override public List<String> getArgumentNames() { - List<String> names = new ArrayList<>(); - names.add("collection"); - return names; + return null; } @Override diff --git a/src/main/java/com/mitchellbosecke/pebble/extension/core/JoinFilter.java b/src/main/java/com/mitchellbosecke/pebble/extension/core/JoinFilter.java new file mode 100644 index 000000000..11023be47 --- /dev/null +++ b/src/main/java/com/mitchellbosecke/pebble/extension/core/JoinFilter.java @@ -0,0 +1,62 @@ +/******************************************************************************* + * This file is part of Pebble. + * + * Copyright (c) 2014 by Mitchell Bösecke + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + ******************************************************************************/ +package com.mitchellbosecke.pebble.extension.core; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.Map; + +import com.mitchellbosecke.pebble.extension.Filter; + +/** + * Concatenates all entries of a collection, optionally glued together + * with a particular character such as a comma. + * + * @author mbosecke + * + */ +public class JoinFilter implements Filter { + + @Override + public List<String> getArgumentNames() { + List<String> names = new ArrayList<>(); + names.add("glue"); + return names; + } + + @Override + public Object apply(Object input, Map<String, Object> args) { + if (input == null) { + return null; + } + + @SuppressWarnings("unchecked") + Collection<Object> inputCollection = (Collection<Object>) input; + + StringBuilder builder = new StringBuilder(); + + String glue = null; + if(args.containsKey("glue")){ + glue = (String)args.get("glue"); + } + + boolean isFirst = true; + for(Object entry : inputCollection){ + + if(!isFirst && glue != null){ + builder.append(glue); + } + builder.append(entry); + + isFirst = false; + } + return builder.toString(); + } +} diff --git a/src/test/java/com/mitchellbosecke/pebble/CoreFiltersTest.java b/src/test/java/com/mitchellbosecke/pebble/CoreFiltersTest.java index f29effbb5..27dd44307 100644 --- a/src/test/java/com/mitchellbosecke/pebble/CoreFiltersTest.java +++ b/src/test/java/com/mitchellbosecke/pebble/CoreFiltersTest.java @@ -476,6 +476,84 @@ public void testFirstWithStringInput() throws PebbleException, IOException { template.evaluate(writer, context); assertEquals("A", writer.toString()); } + + @Test + public void testJoin() throws PebbleException, IOException { + Loader loader = new StringLoader(); + PebbleEngine pebble = new PebbleEngine(loader); + + PebbleTemplate template = pebble + .getTemplate("{{ names | join(',') }}"); + + List<String> names = new ArrayList<>(); + names.add("Alex"); + names.add("Joe"); + names.add("Bob"); + + Map<String, Object> context = new HashMap<>(); + context.put("names", names); + + Writer writer = new StringWriter(); + template.evaluate(writer, context); + assertEquals("Alex,Joe,Bob", writer.toString()); + } + + + @Test + public void testJoinWithoutGlue() throws PebbleException, IOException { + Loader loader = new StringLoader(); + PebbleEngine pebble = new PebbleEngine(loader); + + PebbleTemplate template = pebble + .getTemplate("{{ names | join }}"); + + List<String> names = new ArrayList<>(); + names.add("Alex"); + names.add("Joe"); + names.add("Bob"); + + Map<String, Object> context = new HashMap<>(); + context.put("names", names); + + Writer writer = new StringWriter(); + template.evaluate(writer, context); + assertEquals("AlexJoeBob", writer.toString()); + } + + + @Test + public void testJoinWithNumbers() throws PebbleException, IOException { + Loader loader = new StringLoader(); + PebbleEngine pebble = new PebbleEngine(loader); + + PebbleTemplate template = pebble + .getTemplate("{{ numbers | join(',') }}"); + + List<Integer> numbers = new ArrayList<>(); + numbers.add(1); + numbers.add(2); + numbers.add(3); + + Map<String, Object> context = new HashMap<>(); + context.put("numbers", numbers); + + Writer writer = new StringWriter(); + template.evaluate(writer, context); + assertEquals("1,2,3", writer.toString()); + } + + @Test + public void testJoinWithNullInput() throws PebbleException, IOException { + Loader loader = new StringLoader(); + PebbleEngine pebble = new PebbleEngine(loader); + + PebbleTemplate template = pebble + .getTemplate("{{ null | join(',') }}"); + + Writer writer = new StringWriter(); + template.evaluate(writer); + assertEquals("", writer.toString()); + } public class User {