package org.molgenis.ui.freemarker;
import freemarker.template.TemplateMethodModelEx;
import freemarker.template.TemplateModel;
import freemarker.template.TemplateModelException;
import org.apache.commons.lang3.StringEscapeUtils;
import org.molgenis.data.DataConverter;
import java.util.List;
import static freemarker.template.utility.DeepUnwrap.unwrap;
/**
* FreeMarker limit method. For limiting text size, adds '...' if to long
* <p>
* usage: ${limit('text', 5)}
*/
public class LimitMethod implements TemplateMethodModelEx
{
private String limit(String s, int nrOfCharacters, String container)
{
if (s.length() > nrOfCharacters)
{
String jsEscaped = StringEscapeUtils.escapeEcmaScript(s);
return s.substring(0, nrOfCharacters - 8) + " [<a id='" + container
+ "-all' href='#'> ... </a>]<script>$('#" + container + "-all').on('click', function(){$('#"
+ container + "').html('" + jsEscaped + "')});</script>";
}
return s;
}
@Override
public Object exec(@SuppressWarnings("rawtypes") List arguments) throws TemplateModelException
{
if (arguments.size() != 3)
{
throw new TemplateModelException("Expected two arguments");
}
String s = DataConverter.toString(unwrap((TemplateModel) arguments.get(0)));
Integer nrOfCharacters = DataConverter.toInt(unwrap((TemplateModel) arguments.get(1)));
String container = DataConverter.toString(arguments.get(2));
return limit(s, nrOfCharacters, container);
}
}