in freemarker-core/src/main/java/freemarker/core/BuiltinVariable.java [186:283]
TemplateModel _eval(Environment env) throws TemplateException {
if (parseTimeValue != null) {
return parseTimeValue;
}
if (name == NAMESPACE) {
return env.getCurrentNamespace();
}
if (name == MAIN) {
return env.getMainNamespace();
}
if (name == GLOBALS) {
return env.getGlobalVariables();
}
if (name == LOCALS) {
Macro.Context ctx = env.getCurrentMacroContext();
return ctx == null ? null : ctx.getLocals();
}
if (name == DATA_MODEL || name == DATA_MODEL_CC) {
return env.getDataModel();
}
if (name == VARS) {
return new VarsHash(env);
}
if (name == LOCALE) {
return new SimpleScalar(env.getLocale().toString());
}
if (name == LOCALE_OBJECT || name == LOCALE_OBJECT_CC) {
return env.getObjectWrapper().wrap(env.getLocale());
}
if (name == LANG) {
return new SimpleScalar(env.getLocale().getLanguage());
}
if (name == CURRENT_NODE || name == NODE || name == CURRENT_NODE_CC) {
return env.getCurrentVisitorNode();
}
if (name == TEMPLATE_NAME || name == TEMPLATE_NAME_CC) {
// The behavior of env.getTemplate() was changed with IcI 2.3.22, but there was an unintended side effect
// of changing the behavior of .template_name, which was fixed with IcI 2.3.23. IcI 2.3.22 deliberately
// remains broken.
return (env.getConfiguration().getIncompatibleImprovements().intValue() >= _VersionInts.V_2_3_23)
? new SimpleScalar(env.getTemplate230().getName())
: new SimpleScalar(env.getTemplate().getName());
}
if (name == MAIN_TEMPLATE_NAME || name == MAIN_TEMPLATE_NAME_CC) {
return SimpleScalar.newInstanceOrNull(env.getMainTemplate().getName());
}
if (name == CURRENT_TEMPLATE_NAME || name == CURRENT_TEMPLATE_NAME_CC) {
return SimpleScalar.newInstanceOrNull(env.getCurrentTemplate().getName());
}
if (name == PASS) {
return Macro.DO_NOTHING_MACRO;
}
if (name == OUTPUT_ENCODING || name == OUTPUT_ENCODING_CC) {
String s = env.getOutputEncoding();
return SimpleScalar.newInstanceOrNull(s);
}
if (name == URL_ESCAPING_CHARSET || name == URL_ESCAPING_CHARSET_CC) {
String s = env.getURLEscapingCharset();
return SimpleScalar.newInstanceOrNull(s);
}
if (name == ERROR) {
return new SimpleScalar(env.getCurrentRecoveredErrorMessage());
}
if (name == NOW) {
return new SimpleDate(new Date(), TemplateDateModel.DATETIME);
}
if (name == VERSION) {
return new SimpleScalar(Configuration.getVersionNumber());
}
if (name == INCOMPATIBLE_IMPROVEMENTS || name == INCOMPATIBLE_IMPROVEMENTS_CC) {
return new SimpleScalar(env.getConfiguration().getIncompatibleImprovements().toString());
}
if (name == GET_OPTIONAL_TEMPLATE) {
return GetOptionalTemplateMethod.INSTANCE;
}
if (name == GET_OPTIONAL_TEMPLATE_CC) {
return GetOptionalTemplateMethod.INSTANCE_CC;
}
if (name == CALLER_TEMPLATE_NAME || name == CALLER_TEMPLATE_NAME_CC) {
TemplateObject callPlace = getRequiredMacroContext(env).callPlace;
String name = callPlace != null ? callPlace.getTemplate().getName() : null;
return name != null ? new SimpleScalar(name) : TemplateScalarModel.EMPTY_STRING;
}
if (name == ARGS) {
TemplateModel args = getRequiredMacroContext(env).getArgsSpecialVariableValue();
if (args == null) {
// Should be impossible, as the parser checks this condition already.
throw new _MiscTemplateException(this, "The \"", ARGS, "\" special variable wasn't initialized.", name);
}
return args;
}
if (name == TIME_ZONE || name == TIME_ZONE_CC) {
return new SimpleScalar(env.getTimeZone().getID());
}
throw new _MiscTemplateException(this,
"Invalid special variable: ", name);
}