This is an automated email from the ASF dual-hosted git repository. ddekany pushed a commit to branch 2.3-gae in repository https://gitbox.apache.org/repos/asf/freemarker.git
commit 65c8b98a0f64bd33803f6042ff0707e2774dda3c Author: ddekany <[email protected]> AuthorDate: Sun Feb 7 18:07:26 2021 +0100 Added new special variable, time_zone (referred like .time_zone, like all special variables), to retrieve the current value of the time_zone setting as a string. --- src/main/java/freemarker/core/BuiltinVariable.java | 7 +++++++ src/manual/en_US/book.xml | 19 +++++++++++++++++++ src/test/java/freemarker/core/CamelCaseTest.java | 3 +++ .../test/templatesuite/expected/specialvars.txt | 1 + .../test/templatesuite/templates/setting.ftl | 2 ++ .../test/templatesuite/templates/specialvars.ftl | 1 + 6 files changed, 33 insertions(+) diff --git a/src/main/java/freemarker/core/BuiltinVariable.java b/src/main/java/freemarker/core/BuiltinVariable.java index b5ec4b7..ccc9d0b 100644 --- a/src/main/java/freemarker/core/BuiltinVariable.java +++ b/src/main/java/freemarker/core/BuiltinVariable.java @@ -56,6 +56,8 @@ final class BuiltinVariable extends Expression { static final String LOCALE = Configurable.LOCALE_KEY; static final String LOCALE_OBJECT_CC = Configurable.LOCALE_KEY_CAMEL_CASE + "Object"; static final String LOCALE_OBJECT = Configurable.LOCALE_KEY + "_object"; + static final String TIME_ZONE_CC = Configurable.TIME_ZONE_KEY_CAMEL_CASE; + static final String TIME_ZONE = Configurable.TIME_ZONE_KEY; static final String CURRENT_NODE_CC = "currentNode"; static final String CURRENT_NODE = "current_node"; static final String NODE = "node"; @@ -116,6 +118,8 @@ final class BuiltinVariable extends Expression { PASS, TEMPLATE_NAME_CC, TEMPLATE_NAME, + TIME_ZONE_CC, + TIME_ZONE, URL_ESCAPING_CHARSET_CC, URL_ESCAPING_CHARSET, VARS, @@ -270,6 +274,9 @@ final class BuiltinVariable extends Expression { } return args; } + if (name == TIME_ZONE || name == TIME_ZONE_CC) { + return new SimpleScalar(env.getTimeZone().getID()); + } throw new _MiscTemplateException(this, "Invalid special variable: ", name); diff --git a/src/manual/en_US/book.xml b/src/manual/en_US/book.xml index b6682b9..8ef2763 100644 --- a/src/manual/en_US/book.xml +++ b/src/manual/en_US/book.xml @@ -25469,6 +25469,18 @@ There was no specific handler for node y contains dash and further info after the numbers, like in 2.3.21-nightly_20140726T151800Z.</para> </listitem> + + <listitem> + <para><indexterm> + <primary>time zone</primary> + </indexterm><indexterm> + <primary>time_zone</primary> + </indexterm><literal>time_zone</literal> (exists since FreeMarker + 2.3.31): The current value of the <literal>time_zone</literal> + setting, as a string. This is the ID of the time zone, like + <literal>GMT+01:00</literal>, or + <literal>America/Los_Angeles</literal>.</para> + </listitem> </itemizedlist> <simplesect xml:id="ref_specvar_get_optional_template"> @@ -29419,6 +29431,13 @@ TemplateModel x = env.getVariable("x"); // get variable x</programlisting> </listitem> <listitem> + <para>Added new special variable, <literal>time_zone</literal> + (referred like <literal>.time_zone</literal>, like all special + variables), to retrieve the current value of the + <literal>time_zone</literal> setting as a string.</para> + </listitem> + + <listitem> <para>Allowed escaping <literal>#</literal> with backlash in identifier names (not in string), as it used to occur in database column names. Like if you have a column name like diff --git a/src/test/java/freemarker/core/CamelCaseTest.java b/src/test/java/freemarker/core/CamelCaseTest.java index b1e1dcd..4e5d537 100644 --- a/src/test/java/freemarker/core/CamelCaseTest.java +++ b/src/test/java/freemarker/core/CamelCaseTest.java @@ -25,6 +25,7 @@ import java.util.Arrays; import java.util.HashSet; import java.util.Locale; import java.util.Set; +import java.util.TimeZone; import org.junit.Test; @@ -43,6 +44,8 @@ public class CamelCaseTest extends TemplateTest { assertOutput("${.data_model?is_hash?c}", "true"); assertOutput("${.localeObject.toString()}", "de_DE"); assertOutput("${.locale_object.toString()}", "de_DE"); + assertOutput("${.time_zone}", getConfiguration().getTimeZone().getID()); + assertOutput("${.timeZone}", getConfiguration().getTimeZone().getID()); assertOutput("${.templateName?length}", "0"); assertOutput("${.template_name?length}", "0"); assertOutput("${.outputEncoding}", "utf-8"); diff --git a/src/test/resources/freemarker/test/templatesuite/expected/specialvars.txt b/src/test/resources/freemarker/test/templatesuite/expected/specialvars.txt index e2fa13e..2c7bac3 100644 --- a/src/test/resources/freemarker/test/templatesuite/expected/specialvars.txt +++ b/src/test/resources/freemarker/test/templatesuite/expected/specialvars.txt @@ -18,6 +18,7 @@ */ en == en en_US == en_US +GMT+01:00 == GMT+01:00 utf-8 == utf-8 specialvars.ftl == specialvars.ftl iso-8859-1 == iso-8859-1 diff --git a/src/test/resources/freemarker/test/templatesuite/templates/setting.ftl b/src/test/resources/freemarker/test/templatesuite/templates/setting.ftl index fcf9605..715bbe2 100644 --- a/src/test/resources/freemarker/test/templatesuite/templates/setting.ftl +++ b/src/test/resources/freemarker/test/templatesuite/templates/setting.ftl @@ -37,8 +37,10 @@ <@assertEquals expected='dtf' actual=.now?string /> <#setting time_zone='GMT+00'> +<@assertEquals expected='GMT+00:00' actual=.time_zone /> <#assign t1='2000'?datetime('yyyy')> <#setting time_zone='GMT+01'> +<@assertEquals expected='GMT+01:00' actual=.time_zone /> <#assign t2='2000'?datetime('yyyy')> <@assertEquals expected=1000*60*60 actual=t1?long-t2?long /> diff --git a/src/test/resources/freemarker/test/templatesuite/templates/specialvars.ftl b/src/test/resources/freemarker/test/templatesuite/templates/specialvars.ftl index 50416c9..abf53df 100644 --- a/src/test/resources/freemarker/test/templatesuite/templates/specialvars.ftl +++ b/src/test/resources/freemarker/test/templatesuite/templates/specialvars.ftl @@ -26,6 +26,7 @@ <#assign works = .globals> ${.lang} == en ${.locale} == en_US +${.time_zone} == GMT+01:00 <#assign works = .locals!> <#assign works = .main> <#assign works = .node!>
