package org.jtwig.functions.impl.list; import org.jtwig.exceptions.CalculationException; import org.jtwig.functions.FunctionRequest; import org.jtwig.functions.SimpleJtwigFunction; import org.jtwig.util.FunctionValueUtils; import java.util.ArrayList; import java.util.Iterator; import java.util.List; public class SliceFunction extends SimpleJtwigFunction { @Override public String name() { return "slice"; } @Override public Object execute(FunctionRequest request) { request.minimumNumberOfArguments(3).maximumNumberOfArguments(3); return slice(request, FunctionValueUtils.getNumber(request, 1).intValue(), FunctionValueUtils.getNumber(request, 2).intValue()); } private Object slice(FunctionRequest request, int begin, int length) throws CalculationException { Object input = request.get(0); if (input instanceof String) { String value = (String) input; if (value.length() < begin) { return ""; } else { return value.substring(begin, Math.min(value.length(), begin + length)); } } Iterator<Object> iterator = FunctionValueUtils.getCollection(request, 0).iterator(); List<Object> list = new ArrayList<>(); int i = 0; while (iterator.hasNext()) { if (i >= begin && i < begin + length) list.add(iterator.next()); else iterator.next(); i++; } return list; } }