package com.hongqiang.shop.common.template.method;
import freemarker.template.SimpleScalar;
import freemarker.template.TemplateMethodModel;
import java.util.List;
//import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.apache.commons.lang.StringUtils;
import org.springframework.stereotype.Component;
/**
* ftl模板调用的压缩字符串的类
* @author jackial
*
*/
@Component("abbreviateMethod")
public class AbbreviateMethod implements TemplateMethodModel {
private static final Pattern pattern = Pattern
.compile("[\\u4e00-\\u9fa5\\ufe30-\\uffa0]+$");
/**
* 重载TemplateMethodModel的exec方法,接收一个list,为ftl模板中定义方法的参数列表
*/
public Object exec(@SuppressWarnings("rawtypes") List arguments) {
if ((arguments != null) && (!arguments.isEmpty())
&& (arguments.get(0) != null)
&& (StringUtils.isNotEmpty(arguments.get(0).toString()))) {
Integer localInteger = null;
String str = null;
if (arguments.size() == 2) {
if (arguments.get(1) != null)
localInteger = Integer.valueOf(arguments.get(1).toString());
} else if (arguments.size() > 2) {
if (arguments.get(1) != null)
localInteger = Integer.valueOf(arguments.get(1).toString());
if (arguments.get(2) != null)
str = arguments.get(2).toString();
}
return new SimpleScalar(compose(arguments.get(0).toString(),
localInteger, str));
}
return null;
}
/**
* 传进需要压缩的字符串和传出的字符串长度,(可选字符串后缀),返回压缩后的字符串。
*
* @param oriString 待压缩的字符串
* @param stringLength 字符串压缩后的长度,不包含subfix字符串
* @param subfix 字符串后缀,可选
* @return 压缩后的字符串
*/
private String compose(String oriString, Integer stringLength, String subfix) {
if (stringLength != null) {
int i = 0;
int j = 0;
while (i < oriString.length()) {
//中文字符占两位,所以每个字符位置加2
j = pattern.matcher(String.valueOf(oriString.charAt(i))).find() ? j + 2 : j + 1;
if (j >= stringLength.intValue())
break;
i++;
}
if (i < oriString.length()) {
if (subfix != null)
return oriString.substring(0, i + 1) + subfix;
return oriString.substring(0, i + 1);
}
return oriString;
}
if (subfix != null)
return oriString + subfix;
return oriString;
}
}