📄 builtin.java
字号:
}
}
}
}
static class stringBI extends BuiltIn {
TemplateModel _getAsTemplateModel(Environment env)
throws TemplateException
{
TemplateModel model = target.getAsTemplateModel(env);
if (model instanceof TemplateNumberModel) {
return new NumberFormatter(EvaluationUtil.getNumber((TemplateNumberModel)model, target, env), env);
}
if (model instanceof TemplateDateModel) {
TemplateDateModel dm = (TemplateDateModel)model;
int dateType = dm.getDateType();
return new DateFormatter(EvaluationUtil.getDate(dm, target, env), dateType, env);
}
if (model instanceof SimpleScalar) {
return model;
}
if (model instanceof TemplateBooleanModel) {
return new BooleanFormatter((TemplateBooleanModel) model, env);
}
if (model instanceof TemplateScalarModel) {
return new SimpleScalar(((TemplateScalarModel) model).getAsString());
}
throw invalidTypeException(model, target, env, "number, date, or string");
}
private static class NumberFormatter
implements
TemplateScalarModel,
TemplateHashModel,
TemplateMethodModel
{
private final Number number;
private final Environment env;
private final NumberFormat defaultFormat;
private String cachedValue;
NumberFormatter(Number number, Environment env)
{
this.number = number;
this.env = env;
defaultFormat = env.getNumberFormatObject(env.getNumberFormat());
}
public String getAsString()
{
if(cachedValue == null) {
cachedValue = defaultFormat.format(number);
}
return cachedValue;
}
public TemplateModel get(String key)
{
return new SimpleScalar(env.getNumberFormatObject(key).format(number));
}
public Object exec(List arguments)
throws TemplateModelException {
if (arguments.size() != 1) {
throw new TemplateModelException(
"number?string(...) requires exactly 1 argument.");
}
return get((String) arguments.get(0));
}
public boolean isEmpty()
{
return false;
}
}
private static class DateFormatter
implements
TemplateScalarModel,
TemplateHashModel,
TemplateMethodModel
{
private final Date date;
private final int dateType;
private final Environment env;
private final DateFormat defaultFormat;
private String cachedValue;
DateFormatter(Date date, int dateType, Environment env)
throws
TemplateModelException
{
this.date = date;
this.dateType = dateType;
this.env = env;
defaultFormat = env.getDateFormatObject(dateType);
}
public String getAsString()
throws
TemplateModelException
{
if(dateType == TemplateDateModel.UNKNOWN) {
throw new TemplateModelException("Can't convert the date to string, because it is not known which parts of the date variable are in use. Use ?date, ?time or ?datetime built-in, or ?string.<format> or ?string(format) built-in with this date.");
}
if(cachedValue == null) {
cachedValue = defaultFormat.format(date);
}
return cachedValue;
}
public TemplateModel get(String key)
throws
TemplateModelException
{
return new SimpleScalar(env.getDateFormatObject(dateType, key).format(date));
}
public Object exec(List arguments)
throws TemplateModelException {
if (arguments.size() != 1) {
throw new TemplateModelException(
"date?string(...) requires exactly 1 argument.");
}
return get((String) arguments.get(0));
}
public boolean isEmpty()
{
return false;
}
}
private static class BooleanFormatter
implements
TemplateScalarModel,
TemplateMethodModel
{
private final TemplateBooleanModel bool;
private final Environment env;
BooleanFormatter(TemplateBooleanModel bool, Environment env) {
this.bool = bool;
this.env = env;
}
public String getAsString() throws TemplateModelException {
if (bool instanceof TemplateScalarModel) {
return ((TemplateScalarModel) bool).getAsString();
} else {
return env.getBooleanFormat(bool.getAsBoolean());
}
}
public Object exec(List arguments)
throws TemplateModelException {
if (arguments.size() != 2) {
throw new TemplateModelException(
"boolean?string(...) requires exactly "
+ "2 arguments.");
}
return new SimpleScalar(
(String) arguments.get(bool.getAsBoolean() ? 0 : 1));
}
}
}
static class trimBI extends StringBuiltIn {
TemplateModel calculateResult(String s, Environment env) {
return new SimpleScalar(s.trim());
}
}
static class htmlBI extends StringBuiltIn {
TemplateModel calculateResult(String s, Environment env) {
return new SimpleScalar(StringUtil.HTMLEnc(s));
}
}
static class xmlBI extends StringBuiltIn {
TemplateModel calculateResult(String s, Environment env) {
return new SimpleScalar(StringUtil.XMLEnc(s));
}
}
static class rtfBI extends StringBuiltIn {
TemplateModel calculateResult(String s, Environment env) {
return new SimpleScalar(StringUtil.RTFEnc(s));
}
}
static class urlBI extends StringBuiltIn {
TemplateModel calculateResult(String s, Environment env) {
return new urlBIResult(s, env);
}
static class urlBIResult implements
TemplateScalarModel, TemplateMethodModel {
private final String target;
private final Environment env;
private String cachedResult;
private urlBIResult(String target, Environment env) {
this.target = target;
this.env = env;
}
public String getAsString() throws TemplateModelException {
if (cachedResult == null) {
String cs = env.getEffectiveURLEscapingCharset();
if (cs == null) {
throw new TemplateModelException(
"To do URL encoding, the framework that encloses "
+ "FreeMarker must specify the output encoding "
+ "or the URL encoding charset, so ask the "
+ "programmers to fix it. Or, as a last chance, "
+ "you can set the url_encoding_charset setting in "
+ "the template, e.g. "
+ "<#setting url_escaping_charset='ISO-8859-1'>, or "
+ "give the charset explicitly to the buit-in, e.g. "
+ "foo?url('ISO-8859-1').");
}
try {
cachedResult = StringUtil.URLEnc(target, cs);
} catch (UnsupportedEncodingException e) {
throw new TemplateModelException(
"Failed to execute URL encoding.", e);
}
}
return cachedResult;
}
public Object exec(List args) throws TemplateModelException {
if (args.size() != 1) {
throw new TemplateModelException("The \"url\" built-in "
+ "needs exactly 1 parameter, the charset.");
}
try {
return new SimpleScalar(
StringUtil.URLEnc(target, (String) args.get(0)));
} catch (UnsupportedEncodingException e) {
throw new TemplateModelException(
"Failed to execute URL encoding.", e);
}
}
}
}
static class keysBI extends BuiltIn {
TemplateModel _getAsTemplateModel(Environment env)
throws TemplateException
{
TemplateModel model = target.getAsTemplateModel(env);
if (model instanceof TemplateHashModelEx) {
TemplateCollectionModel keys = ((TemplateHashModelEx) model).keys();
assertNonNull(keys, this, env);
if (!(keys instanceof TemplateSequenceModel))
keys = new CollectionAndSequence(keys);
return keys;
}
throw invalidTypeException(model, target, env, "extended hash");
}
}
static class valuesBI extends BuiltIn {
TemplateModel _getAsTemplateModel(Environment env)
throws TemplateException
{
TemplateModel model = target.getAsTemplateModel(env);
if (model instanceof TemplateHashModelEx) {
TemplateCollectionModel values = ((TemplateHashModelEx) model).values();
assertNonNull(values, this, env);
if (!(values instanceof TemplateSequenceModel))
values = new CollectionAndSequence(values);
return values;
}
throw invalidTypeException(model, target, env, "extended hash");
}
}
static class sizeBI extends BuiltIn {
TemplateModel _getAsTemplateModel(Environment env)
throws TemplateException
{
TemplateModel model = target.getAsTemplateModel(env);
if (model instanceof TemplateSequenceModel) {
int size = ((TemplateSequenceModel) model).size();
return new SimpleNumber(size);
}
if (model instanceof TemplateHashModelEx) {
int size = ((TemplateHashModelEx) model).size();
return new SimpleNumber(size);
}
throw invalidTypeException(model, target, env, "extended-hash or sequence");
}
}
static class existsBI extends BuiltIn {
TemplateModel _getAsTemplateModel(Environment env)
throws TemplateException
{
try {
TemplateModel model = target.getAsTemplateModel(env);
return model==null ? TemplateBooleanModel.FALSE : TemplateBooleanModel.TRUE;
} catch (InvalidReferenceException ire) {
if (target instanceof ParentheticalExpression) {
return TemplateBooleanModel.FALSE;
}
throw ire;
}
}
boolean isTrue(Environment env) throws TemplateException {
return _getAsTemplateModel(env) == TemplateBooleanModel.TRUE;
}
}
static class has_contentBI extends BuiltIn {
TemplateModel _getAsTemplateModel(Environment env)
throws TemplateException
{
try {
TemplateModel model = target.getAsTemplateModel(env);
return Expression.isEmpty(model) ?
TemplateBooleanModel.FALSE : TemplateBooleanModel.TRUE;
} catch (InvalidReferenceException ire) {
if (target instanceof ParentheticalExpression) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -