You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@freemarker.apache.org by dd...@apache.org on 2017/03/13 10:57:41 UTC
[05/50] incubator-freemarker-site git commit: 2.3.26-nightly docs
preview
http://git-wip-us.apache.org/repos/asf/incubator-freemarker-site/blob/52c070a9/builds/2.3.26-nightly/versions_2_3_23.html
----------------------------------------------------------------------
diff --git a/builds/2.3.26-nightly/versions_2_3_23.html b/builds/2.3.26-nightly/versions_2_3_23.html
new file mode 100644
index 0000000..53bbb7d
--- /dev/null
+++ b/builds/2.3.26-nightly/versions_2_3_23.html
@@ -0,0 +1,423 @@
+<!doctype html>
+<!-- Generated by FreeMarker/Docgen from DocBook -->
+<html lang="en" class="page-type-section">
+<head prefix="og: http://ogp.me/ns#">
+<meta charset="utf-8">
+<title>2.3.23 - Apache FreeMarker Manual</title>
+<meta http-equiv="X-UA-Compatible" content="IE=edge">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+<meta name="format-detection" content="telephone=no">
+<meta property="og:site_name" content="Apache FreeMarker Manual">
+<meta property="og:title" content="2.3.23">
+<meta property="og:locale" content="en_US">
+<meta property="og:url" content="http://freemarker.org/docs/versions_2_3_23.html">
+<link rel="canonical" href="http://freemarker.org/docs/versions_2_3_23.html">
+<link rel="icon" href="favicon.png" type="image/png">
+<link rel="stylesheet" type="text/css" href="http://fonts.googleapis.com/css?family=Roboto:500,700,400,300|Droid+Sans+Mono">
+<link rel="stylesheet" type="text/css" href="docgen-resources/docgen.min.css?1489402528979">
+<script>
+(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
+(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
+m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
+})(window,document,'script','//www.google-analytics.com/analytics.js','ga');
+ga('create', 'UA-55420501-1', 'auto');
+ga('send', 'pageview');
+</script>
+</head>
+<body itemscope itemtype="https://schema.org/Code">
+ <meta itemprop="url" content="http://freemarker.org/docs/">
+ <meta itemprop="name" content="Apache FreeMarker Manual">
+
+ <!--[if lte IE 9]>
+ <div style="background-color: #C00; color: #fff; padding: 12px 24px;">Please use a modern browser to view this website.</div>
+ <![endif]--><div class="header-top-bg"><div class="site-width header-top"><a class="logo" href="http://freemarker.org" role="banner"> <img itemprop="image" src="logo.png" alt="FreeMarker">
+</a><ul class="tabs"><li><a href="http://freemarker.org/">Home</a></li><li class="current"><a href="index.html">Manual</a></li><li><a class="external" href="api/index.html">Java API</a></li></ul><ul class="secondary-tabs"><li><a class="tab icon-heart" href="http://freemarker.org/contribute.html" title="Contribute"><span>Contribute</span></a></li><li><a class="tab icon-bug" href="https://issues.apache.org/jira/browse/FREEMARKER/" title="Report a Bug"><span>Report a Bug</span></a></li><li><a class="tab icon-download" href="http://freemarker.org/freemarkerdownload.html" title="Download"><span>Download</span></a></li></ul></div></div><div class="header-bottom-bg"><div class="site-width search-row"><a href="index.html" class="navigation-header">Manual</a><div class="navigation-header"></div><form method="get" class="search-form" action="search-results.html"><fieldset><legend class="sr-only">Search form</legend><label for="search-field" class="sr-only">Search query</label><input id="searc
h-field" name="q" type="search" class="search-input" placeholder="Search" spellcheck="false" autocorrect="off" autocomplete="off"><button type="submit" class="search-btn"><span class="sr-only">Search</span></button></fieldset></form></div><div class="site-width breadcrumb-row"><ul class="breadcrumb" itemscope itemtype="http://schema.org/BreadcrumbList"><li class="step-0" itemprop="itemListElement" itemscope itemtype="http://schema.org/ListItem"><a class="label" itemprop="item" href="index.html"><span itemprop="name">Apache FreeMarker Manual</span></a></li><li class="step-1" itemprop="itemListElement" itemscope itemtype="http://schema.org/ListItem"><a class="label" itemprop="item" href="app.html"><span itemprop="name">Appendixes</span></a></li><li class="step-2" itemprop="itemListElement" itemscope itemtype="http://schema.org/ListItem"><a class="label" itemprop="item" href="app_versions.html"><span itemprop="name">Version history</span></a></li><li class="step-3" itemprop="itemListEl
ement" itemscope itemtype="http://schema.org/ListItem"><a class="label" itemprop="item" href="versions_2_3_23.html"><span itemprop="name">2.3.23</span></a></li></ul><div class="bookmarks" title="Bookmarks"><span class="sr-only">Bookmarks:</span><ul class="bookmark-list"><li><a href="alphaidx.html">Alpha. index</a></li><li><a href="gloss.html">Glossary</a></li><li><a href="dgui_template_exp.html#exp_cheatsheet">Expressions</a></li><li><a href="ref_builtins_alphaidx.html">?builtins</a></li><li><a href="ref_directive_alphaidx.html">#directives</a></li><li><a href="ref_specvar.html">.spec_vars</a></li><li><a href="app_faq.html">FAQ</a></li></ul></div></div></div> <div class="main-content site-width">
+ <div class="content-wrapper">
+ <div id="table-of-contents-wrapper" class="col-left">
+ <script>var breadcrumb = ["Apache FreeMarker Manual","Appendixes","Version history","2.3.23"];</script>
+ <script src="toc.js?1489402528979"></script>
+ <script src="docgen-resources/main.min.js?1489402528979"></script>
+ </div>
+<div class="col-right"><div class="page-content"><div class="page-title"><div class="pagers top"><a class="paging-arrow previous" href="versions_2_3_24.html"><span>Previous</span></a><a class="paging-arrow next" href="versions_2_3_22.html"><span>Next</span></a></div><div class="title-wrapper">
+<h1 class="content-header header-section1" id="versions_2_3_23" itemprop="headline">2.3.23</h1>
+</div></div><div class="page-menu">
+<div class="page-menu-title">Page Contents</div>
+<ul><li><a class="page-menu-link" href="#autoid_164" data-menu-target="autoid_164">Changes on the FTL side</a></li><li><a class="page-menu-link" href="#autoid_165" data-menu-target="autoid_165">Changes on the Java side</a></li><li><a class="page-menu-link" href="#autoid_166" data-menu-target="autoid_166">Other changes</a></li><li><a class="page-menu-link" href="#autoid_167" data-menu-target="autoid_167">Notes</a></li></ul> </div><p>Date of release: 2015-07-05</p>
+
+
+
+
+<h2 class="content-header header-section2" id="autoid_164">Changes on the FTL side</h2>
+
+
+ <ul>
+ <li>
+ <p>Listing (<code class="inline-code">#list</code>) has received some
+ specialized convenience features that target typical tasks
+ people do again and again in templates.</p>
+
+ <ul>
+ <li>
+ <p>New <code class="inline-code">list</code> directive child
+ directives. There are <code class="inline-code">else</code> and
+ <code class="inline-code">items</code> to deal with special cases with
+ 0-length lists, and <code class="inline-code">sep</code> for inserting
+ separators between items. For more details, see the <a href="ref_directive_list.html"><code>list</code>
+ directive in the Reference</a>.</p>
+ </li>
+
+ <li>
+ <p><a href="ref_builtins_loop_var.html">New built-ins
+ that act on loop variables</a>:
+ <code class="inline-code"><em class="code-color">var</em>?index</code>
+ (deprecates
+ <code class="inline-code"><em class="code-color">var</em>_index</code>),
+ <code class="inline-code"><em class="code-color">var</em>?counter</code>
+ (1-based index),
+ <code class="inline-code"><em class="code-color">var</em>?has_next</code>
+ (deprecates
+ <code class="inline-code"><em class="code-color">var</em>_has_next</code>),
+ <code class="inline-code"><em class="code-color">var</em>?is_first</code>,
+ <code class="inline-code"><em class="code-color">var</em>?is_last</code>,
+ <code class="inline-code"><em class="code-color">var</em>?item_parity</code>
+ (returns <code class="inline-code">"odd"</code> or
+ <code class="inline-code">"even"</code>),
+ <code class="inline-code"><em class="code-color">var</em>?item_parity_cap</code>,
+ <code class="inline-code"><em class="code-color">var</em>?item_cycle</code><code class="inline-code">(<em class="code-color">...</em>)</code>,
+ etc.</p>
+ </li>
+ </ul>
+ </li>
+
+ <li>
+ <p>Added convenience assignment operators, which can be used
+ in assignment directives (<code class="inline-code">#assign</code>,
+ <code class="inline-code">#global</code> and <code class="inline-code">#local</code>
+ currently) only:</p>
+
+ <ul>
+ <li>
+ <p><code class="inline-code">++</code> and <code class="inline-code">--</code>: For
+ example, <code class="inline-code"><#assign counter++></code> is
+ equivalent to <code class="inline-code"><#assign counter = counter +
+ 1></code>.</p>
+ </li>
+
+ <li>
+ <p><code class="inline-code">+=</code>, <code class="inline-code">-=</code>,
+ <code class="inline-code">*=</code>, <code class="inline-code">/=</code> and
+ <code class="inline-code">%=</code>: For example, <code class="inline-code"><#assign
+ counter += 2></code> is equivalent to
+ <code class="inline-code"><#assign counter = counter +
+ 2></code>.</p>
+ </li>
+ </ul>
+ </li>
+
+ <li>
+ <p>Added the <code class="inline-code">then</code> built-in, which can be
+ used like a ternary operator:
+ <code class="inline-code"><em class="code-color">someBoolean</em>?then(<em class="code-color">whenTrue</em>,
+ <em class="code-color">whenFalse</em>)</code>. Just like with
+ the ternary operator of most other languages, only one of the
+ parameter expressions will be evaluated. <a href="ref_builtins_boolean.html#ref_builtin_then">More details...</a></p>
+ </li>
+
+ <li>
+ <p>Added the <code class="inline-code">switch</code> built-in, which can be
+ used like an in-line (expression) switch-case-default statement:
+ <code class="inline-code"><em class="code-color">someValue</em>?switch(<em class="code-color">case1</em>,
+ <em class="code-color">result1</em>,
+ <em class="code-color">case2</em>,
+ <em class="code-color">result2</em>, ...
+ <em class="code-color">caseN</em>,
+ <em class="code-color">resultN</em>,
+ <em class="code-color">defaultResult</em>)</code>, where
+ <code class="inline-code"><em class="code-color">defaultResult</em></code> can
+ be omitted (then it will be error if none of the cases matches).
+ <a href="ref_builtins_type_independent.html#ref_builtin_switch">More details...</a></p>
+ </li>
+
+ <li>
+ <p>Added camel case support for the identifiers that are part
+ of the template language (user defined names aren't affected).
+ For example, now
+ <code class="inline-code"><#noEscape>${x?upperCase}</#noEscape></code>
+ or <code class="inline-code"><#setting numberFormat="0.0"></code> or
+ <code class="inline-code"><#ftl stripText=true></code> are valid.
+ However, within the same template, FreeMarker will require you
+ to use the same naming convention consistently for all
+ identifiers that are part of the template language. It's also
+ possible to enforce the same naming convention on all templates
+ from Java via
+ <code class="inline-code">Configuration.setNamingConvention(int)</code>. It's
+ certain that camel case will be the recommended convention
+ starting from some future version, because the Java API-s users
+ call from templates use that too.</p>
+ </li>
+
+ <li>
+ <p>Added new <a href="ref_specvar.html">special
+ variables</a>, <code class="inline-code">.current_template_name</code> and
+ <code class="inline-code">.main_template_name</code>. These deprecate
+ <code class="inline-code">.template_name</code>, which was always broken when
+ it comes to macro calls. The new
+ <code class="inline-code">.current_template_name</code> always returns the
+ name of the template that contains the reference to the special
+ variable, and <code class="inline-code">.main_template_name</code> always
+ returns the name of the topmost template.</p>
+ </li>
+
+ <li>
+ <p>Smaller error message improvements. Like, added tip in the
+ error message for the frequent issue when
+ <code class="inline-code"><em class="code-color">someMap</em>[<em class="code-color">someNumber</em>]</code>
+ complains that
+ <code class="inline-code"><em class="code-color">someMap</em></code> is not a
+ sequence nor is coercible to string.</p>
+ </li>
+
+ <li>
+ <p>Bug fixed, activated with setting
+ <code class="inline-code">incompatible_improvements</code> to 2.3.23: There's
+ a long existing parse-time rule that says that
+ <code class="inline-code">#break</code>, in the FTL source code itself, must
+ occur nested inside a breakable directive, such as
+ <code class="inline-code">#list</code> or <code class="inline-code">#switch</code>. This
+ check could be circumvented with <code class="inline-code">#macro</code> or
+ <code class="inline-code">#function</code>, like this: <code class="inline-code"><#list 1..1
+ as x><#macro
+ callMeLater><#break></#macro></#list><@callMeLater
+ /></code>. After activating this fix, this will be caught
+ as parse time error.</p>
+ </li>
+ </ul>
+
+
+
+
+
+<h2 class="content-header header-section2" id="autoid_165">Changes on the Java side</h2>
+
+
+ <ul>
+ <li>
+ <p>Added
+ <code class="inline-code">Configuration.setNamingConvention(int)</code>. By
+ default FreeMarker will auto-detect the naming convention
+ (legacy VS camel case) used for the identifiers that are part of
+ the template language, for each template independently. This
+ setting lets you enforce a naming convention instead.</p>
+ </li>
+
+ <li>
+ <p><code class="inline-code">Configuration</code> (and in fact any
+ <code class="inline-code">Configurable</code>) setting names now can be
+ written with camel case as well. For example, if you are
+ configuring FreeMarker from properties file, you can have
+ <code class="inline-code">defaultEncoding=utf-8</code> instead of
+ <code class="inline-code">default_encoding=utf-8</code>. You can use the two
+ naming conventions (camel case, and tradition snake case) mixed,
+ and <code class="inline-code">Configuration.setNamingConvention(int)</code>
+ does not influence this behavior.</p>
+ </li>
+
+ <li>
+ <p>Added
+ <code class="inline-code">Configuration.setTemplateUpdateDelayMilliseconds(long)</code>
+ and
+ <code class="inline-code">Configuration.getTemplateUpdateDelayMilliseconds()</code>.
+ This deprecates <code class="inline-code">setTemplateUpdateDelay(int)</code>,
+ which uses seconds resolution, hence going against Java
+ conventions and often leading to misunderstandings. (Also that
+ couldn't have a getter pair.)</p>
+ </li>
+
+ <li>
+ <p>The <code class="inline-code">template_update_delay</code> setting, when
+ specified as a string (as inside
+ <code class="inline-code">java.util.Properties</code>), supports time units,
+ like in <code class="inline-code">template_update_delay=500 ms</code>.</p>
+ </li>
+
+ <li>
+ <p>Added <code class="inline-code">Environment.getCurrentTemplate()</code>
+ method, which return the currently executed template (as opposed
+ to the main template).</p>
+ </li>
+
+ <li>
+ <p>Added
+ <code class="inline-code">WebappTemplateLoader.setAttemptFileAccess(boolean)</code>,
+ which can be used to disable the legacy trick where we try to
+ load templates through direct file access, so that template
+ updating works without restarting. Disabling URL connection
+ caches
+ (<code class="inline-code">someURLBasedTemplateLoader.setURLConnectionUsesCaches(false)</code>,
+ which is also the default since
+ <code class="inline-code">incompatible_improvements</code> 2.3.21) probably
+ solves that on modern Servlet containers.</p>
+ </li>
+
+ <li>
+ <p>In the <code class="inline-code">FreemarkerServlet</code>
+ <code class="inline-code">TemplatePath</code> init-param, paths (like
+ <code class="inline-code">/templates</code>) can have a
+ <code class="inline-code">?settings(<em class="code-color">...</em>)</code>
+ postfix, with which you can set the JavaBean properties of the
+ resulting <code class="inline-code">TemplateLoader</code>. For example:
+ <code class="inline-code"><param-value>/templates?settings(attemptFileAccess=false,
+ URLConnectionUsesCaches=false)</param-value></code></p>
+ </li>
+
+ <li>
+ <p>Added
+ <code class="inline-code">FileTemplateLoader.setEmulateCaseSensitiveFileSystem(boolean)</code>.
+ This is handy when you are developing on Windows but will deploy
+ to a platform with case sensitive file system. The default is
+ <code class="inline-code">false</code>, and <code class="inline-code">true</code> is only
+ meant for development, not for production installations. The
+ default can be overridden by setting the
+ <code class="inline-code">org.freemarker.emulateCaseSensitiveFileSystem</code>
+ system property to <code class="inline-code">true</code>.</p>
+ </li>
+
+ <li>
+ <p>Bug fixed [<a href="https://sourceforge.net/p/freemarker/bugs/424">424</a>]:
+ <code class="inline-code">WebappTemplateLoader</code> didn't find templates
+ that are stored in
+ <code class="inline-code">WEB-INF/lib/*.jar/META-INF/resources</code>. Files
+ under that directory are visible as
+ <code class="inline-code">ServletContext</code> resources since Servlet 3.0,
+ yet <code class="inline-code">WebappTemplateLoader</code> has usually failed
+ to see them because of some internal tricks.</p>
+ </li>
+
+ <li>
+ <p>Bug fixed: If a template "file" was
+ successfully opened for reading, but then there was an
+ <code class="inline-code">IOException</code> during reading its content, the
+ parser (JavaCC) acted like if the template "file"
+ was ended there, and the exception was suppressed. It's actually
+ a JavaCC quirk that affects many other JavaCC-based languages
+ too, but now FreeMarker has added a workaround in the
+ <code class="inline-code">Template</code> constructor, and so now an exception
+ will be thrown as expected.</p>
+ </li>
+
+ <li>
+ <p>Bug fixed:
+ <code class="inline-code">InvalidReferenceException.FAST_INSTANCE</code> could
+ accidentally store reference to an
+ <code class="inline-code">Environment</code> instance, which hence was never
+ garbage collected.</p>
+ </li>
+
+ <li>
+ <p>Bug fixed [<a href="https://sourceforge.net/p/freemarker/bugs/426/">426</a>]:
+ When setting <code class="inline-code">incompatible_improvements</code> to
+ 2.3.22, the special variable reference
+ <code class="inline-code">.template_name</code> in templates always returns
+ the name of the main (topmost) template, due to an oversight in
+ 2.3.22. Setting <code class="inline-code">incompatible_improvements</code> to
+ 2.3.23 restores the old, backward compatible behavior. (Note
+ that the old behavior that we emulate is itself broken, as it
+ doesn't work well with macro calls; you should use
+ <code class="inline-code">.current_template_name</code> or
+ <code class="inline-code">.main_template_name</code> instead.)</p>
+ </li>
+
+ <li>
+ <p>Bug fixed [<a href="https://sourceforge.net/p/freemarker/bugs/53/">53</a>]:
+ Template parsing was abnormally slow for templates with very
+ high number AST (abstract syntax tree) nodes on the same
+ hierarchy level.</p>
+ </li>
+
+ <li>
+ <p>Bug fixed: When the template was concurrently replaced on
+ the backing store during its first loading was still ongoing,
+ the older version of the template could get into the cache with
+ the time stamp of the new version, hence it wasn't reloaded
+ after the configured update delay.</p>
+ </li>
+
+ <li>
+ <p>Bug fixed: The <code class="inline-code">log_template_exceptions</code>
+ setting (added in 2.3.22) couldn't be set through the
+ <code class="inline-code">Configurable.setSetting(String, String)</code>
+ API.</p>
+ </li>
+
+ <li>
+ <p>Bug fixed:
+ <code class="inline-code">StringUtil.FTLStringLiteralEnc</code> has escaped
+ <code class="inline-code">$</code> (hence generating an illegal escape) and
+ haven't escaped <code class="inline-code">{</code> after <code class="inline-code">$</code>
+ and <code class="inline-code">#</code>. While this function is only used for
+ generating error messages by FreeMarker, it's a public methods
+ so anyone could use it.</p>
+ </li>
+
+ <li>
+ <p>Bugs fixed: Various canonical form glitches (they only
+ affect error messages as far as FreeMarker is concerned).</p>
+ </li>
+ </ul>
+
+
+
+
+
+<h2 class="content-header header-section2" id="autoid_166">Other changes</h2>
+
+
+ <ul>
+ <li>
+ <p>Modernized Manual and site design with improved
+ functionality (always visible navigation tree, search inside the
+ Manual, etc.), thanks to Evangelia Dendramis. (Also now the Site
+ uses the same format and HTML generator as the Manual.)</p>
+ </li>
+
+ <li>
+ <p>Many smaller Manual and site content
+ updates/improvements.</p>
+ </li>
+ </ul>
+
+
+
+
+
+<h2 class="content-header header-section2" id="autoid_167">Notes</h2>
+
+
+ <p>Changes compared to 2.3.23 RC1:</p>
+
+ <ul>
+ <li>
+ <p><code class="inline-code">.current_name_name</code> and
+ <code class="inline-code">.main_template_name</code> is now missing
+ (<code class="inline-code">null</code>) instead of <code class="inline-code">""</code> if
+ the template has no name</p>
+ </li>
+
+ <li>
+ <p>Some minor error message improvements</p>
+ </li>
+
+ <li>
+ <p>Documentation refinements</p>
+ </li>
+ </ul>
+ <div class="bottom-pagers-wrapper"><div class="pagers bottom"><a class="paging-arrow previous" href="versions_2_3_24.html"><span>Previous</span></a><a class="paging-arrow next" href="versions_2_3_22.html"><span>Next</span></a></div></div></div></div> </div>
+ </div>
+<div class="site-footer"><div class="site-width"><div class="footer-top"><div class="col-left sitemap"><div class="column"><h3 class="column-header">Overview</h3><ul><li><a href="http://freemarker.org/">What is FreeMarker?</a></li><li><a href="http://freemarker.org/freemarkerdownload.html">Download</a></li><li><a href="app_versions.html">Version history</a></li><li><a href="http://freemarker.org/history.html">About us</a></li><li><a itemprop="license" href="app_license.html">License</a></li></ul></div><div class="column"><h3 class="column-header">Handy stuff</h3><ul><li><a href="http://freemarker-online.kenshoo.com/">Try template online</a></li><li><a href="dgui_template_exp.html#exp_cheatsheet">Expressions cheatsheet</a></li><li><a href="ref_directive_alphaidx.html">#directives</a></li><li><a href="ref_builtins_alphaidx.html">?built_ins</a></li><li><a href="ref_specvar.html">.special_vars</a></li></ul></div><div class="column"><h3 class="column-header">Community</h3><ul><li><a href
="https://github.com/freemarker/freemarker">FreeMarker on Github</a></li><li><a href="https://twitter.com/freemarker">Follow us on Twitter</a></li><li><a href="https://issues.apache.org/jira/browse/FREEMARKER/">Report a bug</a></li><li><a href="http://stackoverflow.com/questions/ask?tags=freemarker">Ask a question</a></li><li><a href="http://freemarker.org/mailing-lists.html">Mailing lists</a></li></ul></div></div><div class="col-right"><ul class="social-icons"><li><a class="github" href="https://github.com/freemarker/freemarker">Github</a></li><li><a class="twitter" href="https://twitter.com/freemarker">Twitter</a></li><li><a class="stack-overflow" href="http://stackoverflow.com/questions/ask?tags=freemarker">Stack Overflow</a></li></ul><a class="xxe" href="http://www.xmlmind.com/xmleditor/" rel="nofollow" title="Edited with XMLMind XML Editor"><span>Edited with XMLMind XML Editor</span></a></div></div><div class="footer-bottom"> <p class="last-generated">
+Last generated:
+<time itemprop="dateModified" datetime="2017-03-13T10:55:28Z" title="Monday, March 13, 2017 10:55:28 AM GMT">2017-03-13 10:55:28 GMT</time>, for Freemarker 2.3.26 </p>
+<p class="copyright">
+� <span itemprop="copyrightYear">1999</span>\u20132017
+<a itemtype="http://schema.org/Organization" itemprop="copyrightHolder" href="http://apache.org/">The Apache Software Foundation</a>. Apache FreeMarker, FreeMarker, Apache Incubator, Apache, the Apache FreeMarker logo are trademarks of The Apache Software Foundation. </p>
+</div></div></div></body>
+</html>
http://git-wip-us.apache.org/repos/asf/incubator-freemarker-site/blob/52c070a9/builds/2.3.26-nightly/versions_2_3_24.html
----------------------------------------------------------------------
diff --git a/builds/2.3.26-nightly/versions_2_3_24.html b/builds/2.3.26-nightly/versions_2_3_24.html
new file mode 100644
index 0000000..da73713
--- /dev/null
+++ b/builds/2.3.26-nightly/versions_2_3_24.html
@@ -0,0 +1,925 @@
+<!doctype html>
+<!-- Generated by FreeMarker/Docgen from DocBook -->
+<html lang="en" class="page-type-section">
+<head prefix="og: http://ogp.me/ns#">
+<meta charset="utf-8">
+<title>2.3.24 (incubating at Apache) - Apache FreeMarker Manual</title>
+<meta http-equiv="X-UA-Compatible" content="IE=edge">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+<meta name="format-detection" content="telephone=no">
+<meta property="og:site_name" content="Apache FreeMarker Manual">
+<meta property="og:title" content="2.3.24 (incubating at Apache)">
+<meta property="og:locale" content="en_US">
+<meta property="og:url" content="http://freemarker.org/docs/versions_2_3_24.html">
+<link rel="canonical" href="http://freemarker.org/docs/versions_2_3_24.html">
+<link rel="icon" href="favicon.png" type="image/png">
+<link rel="stylesheet" type="text/css" href="http://fonts.googleapis.com/css?family=Roboto:500,700,400,300|Droid+Sans+Mono">
+<link rel="stylesheet" type="text/css" href="docgen-resources/docgen.min.css?1489402528979">
+<script>
+(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
+(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
+m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
+})(window,document,'script','//www.google-analytics.com/analytics.js','ga');
+ga('create', 'UA-55420501-1', 'auto');
+ga('send', 'pageview');
+</script>
+</head>
+<body itemscope itemtype="https://schema.org/Code">
+ <meta itemprop="url" content="http://freemarker.org/docs/">
+ <meta itemprop="name" content="Apache FreeMarker Manual">
+
+ <!--[if lte IE 9]>
+ <div style="background-color: #C00; color: #fff; padding: 12px 24px;">Please use a modern browser to view this website.</div>
+ <![endif]--><div class="header-top-bg"><div class="site-width header-top"><a class="logo" href="http://freemarker.org" role="banner"> <img itemprop="image" src="logo.png" alt="FreeMarker">
+</a><ul class="tabs"><li><a href="http://freemarker.org/">Home</a></li><li class="current"><a href="index.html">Manual</a></li><li><a class="external" href="api/index.html">Java API</a></li></ul><ul class="secondary-tabs"><li><a class="tab icon-heart" href="http://freemarker.org/contribute.html" title="Contribute"><span>Contribute</span></a></li><li><a class="tab icon-bug" href="https://issues.apache.org/jira/browse/FREEMARKER/" title="Report a Bug"><span>Report a Bug</span></a></li><li><a class="tab icon-download" href="http://freemarker.org/freemarkerdownload.html" title="Download"><span>Download</span></a></li></ul></div></div><div class="header-bottom-bg"><div class="site-width search-row"><a href="index.html" class="navigation-header">Manual</a><div class="navigation-header"></div><form method="get" class="search-form" action="search-results.html"><fieldset><legend class="sr-only">Search form</legend><label for="search-field" class="sr-only">Search query</label><input id="searc
h-field" name="q" type="search" class="search-input" placeholder="Search" spellcheck="false" autocorrect="off" autocomplete="off"><button type="submit" class="search-btn"><span class="sr-only">Search</span></button></fieldset></form></div><div class="site-width breadcrumb-row"><ul class="breadcrumb" itemscope itemtype="http://schema.org/BreadcrumbList"><li class="step-0" itemprop="itemListElement" itemscope itemtype="http://schema.org/ListItem"><a class="label" itemprop="item" href="index.html"><span itemprop="name">Apache FreeMarker Manual</span></a></li><li class="step-1" itemprop="itemListElement" itemscope itemtype="http://schema.org/ListItem"><a class="label" itemprop="item" href="app.html"><span itemprop="name">Appendixes</span></a></li><li class="step-2" itemprop="itemListElement" itemscope itemtype="http://schema.org/ListItem"><a class="label" itemprop="item" href="app_versions.html"><span itemprop="name">Version history</span></a></li><li class="step-3" itemprop="itemListEl
ement" itemscope itemtype="http://schema.org/ListItem"><a class="label" itemprop="item" href="versions_2_3_24.html"><span itemprop="name">2.3.24 (incubating at Apache)</span></a></li></ul><div class="bookmarks" title="Bookmarks"><span class="sr-only">Bookmarks:</span><ul class="bookmark-list"><li><a href="alphaidx.html">Alpha. index</a></li><li><a href="gloss.html">Glossary</a></li><li><a href="dgui_template_exp.html#exp_cheatsheet">Expressions</a></li><li><a href="ref_builtins_alphaidx.html">?builtins</a></li><li><a href="ref_directive_alphaidx.html">#directives</a></li><li><a href="ref_specvar.html">.spec_vars</a></li><li><a href="app_faq.html">FAQ</a></li></ul></div></div></div> <div class="main-content site-width">
+ <div class="content-wrapper">
+ <div id="table-of-contents-wrapper" class="col-left">
+ <script>var breadcrumb = ["Apache FreeMarker Manual","Appendixes","Version history","2.3.24 (incubating at Apache)"];</script>
+ <script src="toc.js?1489402528979"></script>
+ <script src="docgen-resources/main.min.js?1489402528979"></script>
+ </div>
+<div class="col-right"><div class="page-content"><div class="page-title"><div class="pagers top"><a class="paging-arrow previous" href="versions_2_3_25.html"><span>Previous</span></a><a class="paging-arrow next" href="versions_2_3_23.html"><span>Next</span></a></div><div class="title-wrapper">
+<h1 class="content-header header-section1" id="versions_2_3_24" itemprop="headline">2.3.24 (incubating at Apache)</h1>
+</div></div><div class="page-menu">
+<div class="page-menu-title">Page Contents</div>
+<ul><li><a class="page-menu-link" href="#autoid_160" data-menu-target="autoid_160">Legal changes</a></li><li><a class="page-menu-link" href="#autoid_161" data-menu-target="autoid_161">Changes on the FTL side</a></li><li><a class="page-menu-link" href="#autoid_162" data-menu-target="autoid_162">Changes on the Java side</a></li><li><a class="page-menu-link" href="#autoid_163" data-menu-target="autoid_163">Changes compared to 2.3.24 Release Candidate 1</a></li></ul> </div><p>Release date: 2016-03-28</p><p><strong>This is a stable, final
+ release.</strong> The "incubating" suffix is required
+ by the Apache Software Foundation until the project becomes a fully
+ accepted (graduated) Apache project. See disclaimer below.</p>
+
+
+
+
+<h2 class="content-header header-section2" id="autoid_160">Legal changes</h2>
+
+
+ <p>The owner of FreeMarker is now the Apache Software Foundation.
+ The license is still Apache License Version 2.0, just like earlier,
+ but the owner is different. The official full product name has
+ changed to Apache FreeMarker.</p>
+
+ <p><strong>Disclaimer:</strong><em> Apache
+ FreeMarker is an effort undergoing incubation at The Apache Software
+ Foundation (ASF), sponsored by the <a href="http://incubator.apache.org">Apache Incubator</a>.
+ Incubation is required of all newly accepted projects until a
+ further review indicates that the infrastructure, communications,
+ and decision making process have stabilized in a manner consistent
+ with other successful ASF projects. While incubation status is not
+ necessarily a reflection of the completeness or stability of the
+ code, it does indicate that the project has yet to be fully endorsed
+ by the ASF.</em></p>
+
+
+
+
+
+<h2 class="content-header header-section2" id="autoid_161">Changes on the FTL side</h2>
+
+
+ <ul>
+ <li>
+ <p>The most important new feature of this release is the
+ <a href="dgui_misc_autoescaping.html">auto-escaping and output
+ formats mechanism</a>, which deprecates escaping with the
+ <a href="ref_directive_escape.html"><code>escape</code>
+ directive</a>. These are the changes related to this new
+ mechanism (see earlier link for a guide):</p>
+
+ <ul>
+ <li>
+ <p>New <code class="inline-code">ftl</code> header options,
+ <code class="inline-code">ouput_format</code> and
+ <code class="inline-code">auto_esc</code> to override the
+ <code class="inline-code">output_format</code> and
+ <code class="inline-code">auto_escaping</code> settings of the template,
+ like <code class="inline-code"><#ftl
+ output_format='HTML'</code><code class="inline-code">
+ auto_esc=false></code>.</p>
+ </li>
+
+ <li>
+ <p>New built-in: <a href="ref_builtins_string.html#ref_builtin_no_esc"><code>no_esc</code></a>.
+ Used to prevent auto-escaping, like
+ <code class="inline-code">${descriptionInHtml?no_esc}</code>. This doesn't
+ work with <code class="inline-code"><#escape
+ <em class="code-color">...</em>></code>, only with the
+ new auto-escaping mechanism.</p>
+ </li>
+
+ <li>
+ <p>New FTL type, "markup output". This is
+ somewhat similar to string, but values of this type aren't
+ auto-escaped by the new escaping mechanism, because they are
+ known to already hold markup. (For example,
+ <code class="inline-code">?esc</code> and <code class="inline-code">?no_esc</code>
+ returns a value of this type, hence their results are
+ protected from double-escaping problems.)</p>
+ </li>
+
+ <li>
+ <p>New built-in: <a href="ref_builtins_string.html#ref_builtin_esc"><code>esc</code></a>.
+ Used for escaping with the current output format when
+ auto-escaping is disabled.</p>
+ </li>
+
+ <li>
+ <p>New built-in: <code class="inline-code">markup_string</code>. This
+ returns the markup of a <a href="dgui_misc_autoescaping.html#dgui_misc_autoescaping_movalues">markup output
+ value</a> as string.</p>
+ </li>
+
+ <li>
+ <p>New built-in: <code class="inline-code">is_markup_output</code>,
+ returns <code class="inline-code">true</code> if the value is of type
+ "markup output".</p>
+ </li>
+
+ <li>
+ <p>New directive: <code class="inline-code">outputformat</code>, used
+ to change the output format for a section of a template,
+ like <code class="inline-code"><#outputformat
+ "XML"><em class="code-color">...</em></#outputformat></code></p>
+ </li>
+
+ <li>
+ <p>New directives: <code class="inline-code">noautoesc</code> and
+ <code class="inline-code">autoesc</code>, used to turn auto-escaping off
+ and on for a section of a template, like
+ <code class="inline-code"><#noautoesc><em class="code-color">...</em></#noautoesc></code>.</p>
+ </li>
+
+ <li>
+ <p>New built-in variable,
+ <code class="inline-code">.output_format</code>, returns the current
+ output format at the place of invocation.</p>
+ </li>
+
+ <li>
+ <p>New built-in variable, <code class="inline-code">.auto_esc</code>,
+ returns the boolean that tells if auto-escaping is active at
+ the place of invocation.</p>
+ </li>
+
+ <li>
+ <p>Block assignments, like <code class="inline-code"><#assign
+ <em class="code-color">captured</em>><em class="code-color">...</em></#assign></code>,
+ when the current <code class="inline-code">output_format</code> is some
+ kind of markup (like HTML), will store the captured output
+ not with string type, but with "markup output"
+ type. Thus
+ <code class="inline-code">${<em class="code-color">captured</em>}</code>
+ will not get unwanted escaping.</p>
+ </li>
+
+ <li>
+ <p>The <code class="inline-code">+</code> operator (concatenation)
+ works with the new "markup output" type as
+ well. Like <code class="inline-code">someMarkup + somePlainText</code>
+ will result in markup where <code class="inline-code">somePlainText</code>
+ is escaped automatically before it's appended to the
+ markup.</p>
+ </li>
+
+ <li>
+ <p>The <code class="inline-code">has_content</code> built-in now
+ supports "markup output" values, considering 0
+ length markup as empty.</p>
+ </li>
+ </ul>
+ </li>
+
+ <li>
+ <p>You can now define custom number and date/time/datetime
+ formatters. These are defined by the programmers (and thus can
+ implement any kind of exotic formatting rules) when configuring
+ FreeMarker, and can be referred with strings starting with
+ <code class="inline-code">"@"</code>, like in <code class="inline-code"><#setting
+ number_format='@foo'></code>, or
+ <code class="inline-code">${n?string.@foo_params}</code>,
+ <code class="inline-code"><#setting number_format='@foo params'></code>,
+ or <code class="inline-code">${n?string.@foo}</code>,
+ <code class="inline-code">${n?string.@foo_params}</code>. For backward
+ compatibility, the initial <code class="inline-code">@</code> only has this
+ special meaning if either you have any custom formats or <a href="pgui_config_incompatible_improvements.html">the
+ <code>incompatible_improvements</code> setting</a> is
+ at lest 2.3.24.</p>
+ </li>
+
+ <li>
+ <p>Everywhere where Java <code class="inline-code">DecimalFormat</code>
+ patterns are used (like in <code class="inline-code">?string('0.##')</code> or
+ <code class="inline-code"><#setting number_format="0.##"></code>), now
+ it's possible to specify options like rounding mode or the
+ symbols used, with a FreeMarker-specific <a href="ref_builtins_number.html#topic.extendedJavaDecimalFormat">extension to the
+ <code>DecimalFormat</code> pattern syntax</a>.</p>
+ </li>
+
+ <li>
+ <p>Added new special variable:
+ <code class="inline-code">.incompatible_improvements</code>, which returns the
+ <a href="pgui_config_incompatible_improvements.html"><code>incompatbile_improvements</code>
+ setting</a> of the current FreeMarker configuration, as a
+ string.</p>
+ </li>
+
+ <li>
+ <p><code class="inline-code">?date</code>, <code class="inline-code">?time</code> and
+ <code class="inline-code">?datetime</code> now can be called as 0 argument
+ method, like <code class="inline-code">?date()</code>, etc., which returns the
+ exact object that <code class="inline-code">TemplateDateFormat.parse</code>
+ returns, instead of the tricky multi-type object that just using
+ <code class="inline-code">?date</code> returns. Because custom
+ <code class="inline-code">TemplateDateFormat</code> implementations may return
+ custom <code class="inline-code">TemplateDateModel</code> implementations,
+ keeping the exact class can be important in some
+ applications.</p>
+ </li>
+
+ <li>
+ <p><code class="inline-code"><@</code> and <code class="inline-code"></@</code> is
+ now allowed in string literals that contain
+ <code class="inline-code">${<em class="code-color">exp</em>}</code>, and will
+ be part of the literal as is. Earlier it was a syntactical
+ error.</p>
+ </li>
+
+ <li>
+ <p>Bug fixed: With
+ <code class="inline-code">incompatible_improvements</code> set to 2.3.24
+ (<a href="pgui_datamodel_objectWrapper.html#topic.defaultObjectWrapperIcI">see how
+ here...</a>),
+ <code class="inline-code"><em class="code-color">m</em>?is_sequence</code>
+ doesn't return <code class="inline-code">true</code> for Java methods wrapped
+ by <code class="inline-code">BeansWrapper</code> and its subclasses (most
+ notably <code class="inline-code">DefaultObjectWrapper</code>) anymore, as
+ they only implement the
+ <code class="inline-code">[<em class="code-color">index</em>]</code> operator,
+ but not <code class="inline-code">?size</code>, which causes
+ <code class="inline-code"><#list <em class="code-color">...</em>></code>
+ to fail, among others.</p>
+ </li>
+ </ul>
+
+
+
+
+
+<h2 class="content-header header-section2" id="autoid_162">Changes on the Java side</h2>
+
+
+ <ul>
+ <li>
+ <p><em>Attention!</em> FreeMarker
+ now requires at least Java 1.5 (aka. Java 5). 2.3.24 has only
+ required Java 1.4. (Reason: Without this, new public API-s
+ couldn't use generics, which affect negatively the majority of
+ users, while old installations that are still using 1.4 are
+ unlikely to update FreeMarker anyway.)</p>
+ </li>
+
+ <li>
+ <p><em>Attention!</em> FreeMarker's
+ JSP support (if it's used) now requires at least JSP 2.0.
+ Earlier it only required JSP 1.1. (Reason: The
+ <code class="inline-code">jsp-api</code> dependency for JSP 1.x, which was
+ needed for building, can't be legally present in the Maven
+ Central Repository, nor be provided by freemarker.org.)</p>
+ </li>
+
+ <li>
+ <p>Added new configuration setting:
+ <code class="inline-code">template_configurations</code>. This allows
+ overriding the settings coming from the shared
+ <code class="inline-code">Configuration</code> object for individual
+ templates, based on template name patterns. <a href="pgui_config_templateconfigurations.html">See more
+ here...</a></p>
+ </li>
+
+ <li>
+ <p>Related to the <a href="dgui_misc_autoescaping.html">new
+ auto-escaping mechanism</a>:</p>
+
+ <ul>
+ <li>
+ <p>As FTL has now a new type, "markup
+ output", there's also a corresponding new model
+ interface, <code class="inline-code">TemplateMarkupOutputModel</code>.
+ This also means that you can prevent the auto-escaping of
+ values coming from the data-model by returning a
+ <code class="inline-code">TemplateMarkupOutputModel</code> instead of a
+ <code class="inline-code">String</code>. Like the template author can just
+ write <code class="inline-code">${messages.foo}</code>, and it will be
+ auto-escaped or not depending on if the message is known to
+ be markup or not.</p>
+ </li>
+
+ <li>
+ <p>Added new configuration setting:
+ <code class="inline-code">recognize_standard_file_extensions</code>. When
+ <code class="inline-code">true</code>, templates whose source name ends
+ with <code class="inline-code">".ftlh"</code> will get
+ <code class="inline-code">HTML</code> <code class="inline-code">output_format</code>,
+ and those whose name ends with <code class="inline-code">".ftlx"</code>
+ get <code class="inline-code">XML</code> <code class="inline-code">output_format</code>,
+ in both cases with auto-escaping on. If <a href="pgui_config_incompatible_improvements.html#pgui_config_incompatible_improvements_how_to_set">the
+ <code>incompatible_improvements</code> setting</a>
+ is set to 2.3.24 (or higher) then this setting defaults to
+ <code class="inline-code">true</code>. Otherwise it's default is
+ <code class="inline-code">false</code>, but enabling it is highly
+ recommended.</p>
+ </li>
+
+ <li>
+ <p>Added new configuration setting:
+ <code class="inline-code">output_format</code>. This specifies the <a href="dgui_misc_autoescaping.html#dgui_misc_autoescaping_outputformat">output
+ format</a> object to use (such as
+ <code class="inline-code">HTMLOutputFormat.INSTANCE</code>,
+ <code class="inline-code">XMLOutputFormat.INSTANCE</code>, etc.) that
+ governs auto-escaping. The output format can be different
+ for different templates, using the
+ <code class="inline-code">template_configurations</code> setting (<a href="pgui_config_outputformatsautoesc.html">see here
+ how...</a>).</p>
+ </li>
+
+ <li>
+ <p>Added new configuration setting:
+ <code class="inline-code">registered_custom_output_formats</code>. With
+ this you can add new <code class="inline-code">OutputFormat</code>-s that
+ templates can refer to by name (like in <code class="inline-code"><#ftl
+ output_format="foo"></code>).</p>
+ </li>
+
+ <li>
+ <p>Added new configuration setting:
+ <code class="inline-code">auto_escaping_policy</code>. This decides when
+ auto-escaping should be enabled depending on the current
+ output format.</p>
+ </li>
+ </ul>
+ </li>
+
+ <li>
+ <p>Changes related to the custom number and
+ date/time/datetime formating feature:</p>
+
+ <ul>
+ <li>
+ <p>Added new classes for implementing custom formatters:
+ <code class="inline-code">freemarker.core.TemplateNumberFormat</code>,
+ <code class="inline-code">TemplateNumberFormatFactory</code>,
+ <code class="inline-code">TemplateDateFormat</code>,
+ <code class="inline-code">TemplateDateFormatFactory</code>, also the
+ exceptions these can throw. These allow implementing any
+ kind of formatting rule that's doable in Java (i.e., they
+ aren't restricted to any <code class="inline-code">java.text</code>
+ formatters). Furthermore these formatters get the
+ <code class="inline-code">TemplateModel</code> instead of a the bare
+ <code class="inline-code">java.lang.Number</code> or
+ <code class="inline-code">java.util.Date</code>, which lets you use the
+ extra application-specific meta information that you may
+ pack into the <code class="inline-code">TemplateModel</code>-s, such as
+ physical unit, preferred precision, and so on.</p>
+ </li>
+
+ <li>
+ <p>Added <code class="inline-code">custom_number_formats</code> and
+ <code class="inline-code">custom_date_formats</code> settings
+ (<code class="inline-code">Configurable.setCustomNumberFormats(Map<String,
+ TemplateNumberFormatFactory>)</code> and
+ <code class="inline-code">Configurable.setCustomDateFormats(Map<String,
+ TemplateDateFormatFactory>)</code>) with which you can
+ register your own formats. These formats can be referred
+ from everywhere where you can use a string to define a
+ format, with a format string like <code class="inline-code">"@foo"</code>
+ or <code class="inline-code">"@foo params"</code>, where
+ <code class="inline-code">"foo"</code> is the key in the
+ <code class="inline-code">Map<String, ...></code> parameter of the
+ earlier shown methods, and the parameters (if any) are
+ interpreted by the
+ <code class="inline-code">Template<em class="code-color">Xxx</em>FormatFactory</code>
+ implementation that you provide. Like, you can issue
+ <code class="inline-code">cfg.setNumberFormat("@foo params")</code>, or
+ <code class="inline-code"><#setting number_format='@foo
+ params'></code>, or
+ <code class="inline-code">${n?string.@foo_params}</code>, similarly as you
+ can issue <code class="inline-code">cfg.setNumberFormat("0.##")</code>,
+ etc. For backward compatibility, the initial
+ <code class="inline-code">@</code> only has this special meaning if either
+ you have any custom formats or <a href="pgui_config_incompatible_improvements.html">the
+ <code>incompatible_improvements</code> setting</a>
+ is at least 2.3.24. Note that the
+ <code class="inline-code">custom_number_formats</code> and
+ <code class="inline-code">custom_date_formats</code> settings can be set
+ per-template (via the new
+ <code class="inline-code">template_configurations</code> settings) or
+ per-<code class="inline-code">Environment</code> too, thus
+ <code class="inline-code">@foo</code> can mean something different in
+ different templates.</p>
+ </li>
+
+ <li>
+ <p>Added new <code class="inline-code">Environment</code> methods
+ returning <code class="inline-code">TemplateNumberFormat</code> and
+ <code class="inline-code">TemplateDateFormat</code> objects. See the
+ <code class="inline-code">getTemplateNumberFormat(<em class="code-color">...</em>)</code>
+ and
+ <code class="inline-code">getTemplateDateFormat(<em class="code-color">...</em>)</code>
+ variations in the API.</p>
+ </li>
+
+ <li>
+ <p>Added
+ <code class="inline-code">freemarker.core.AliasTemplateNumberFormatFactory</code>
+ and <code class="inline-code">AliasTemplateDateFormatFactory</code>, which
+ can be used to create custom formats that are aliases to
+ other formats. For example, instead of writing
+ <code class="inline-code">${n?string["0.00"]}</code> again and again, you
+ can define the custom format <code class="inline-code">"price"</code> as
+ the alias to the format string <code class="inline-code">"0.00"</code> in
+ the configuration, and then use
+ <code class="inline-code">${n?string.@price}</code>. Thus, you can control
+ at a central place how prices look. Furthermore, the alias
+ can chose a different target format string depending on the
+ current locale; this is especially useful for dates, where
+ conventions can significantly differ in different
+ countries.</p>
+ </li>
+
+ <li>
+ <p>It's now possible to have HTML or other markup in
+ number and date/time/datetime formatting results, like
+ <code class="inline-code">1.23*10<sup>6</sup></code>, which
+ won't be accidentally auto-escaped, as FreeMarker knows that
+ it's already HTML. This is done by returning a
+ <code class="inline-code">TemplateMarkupOutputModel</code> instead of a
+ <code class="inline-code">String</code>; see the new auto-escaping
+ mechanism earlier. Note that no out-of-the-box format
+ utilizes this (at the moment), but you could write such
+ custom format.</p>
+ </li>
+
+ <li>
+ <p>The internal format object caching architecture has
+ been reworked, so that it can handle custom formats too.
+ This reworking also fixes some bottlenecks under highly
+ concurrent load, and some (otherwise unlikely) memory leak
+ possibilities.</p>
+ </li>
+ </ul>
+ </li>
+
+ <li>
+ <p>In the <code class="inline-code">number_format</code> configuration
+ setting, when it holds a Java <code class="inline-code">DecimalFormat</code>
+ pattern (like <code class="inline-code">"0.##"</code>), it's now possible to
+ specify options like rounding mode or the symbols used, with a
+ FreeMarker-specific <a href="ref_builtins_number.html#topic.extendedJavaDecimalFormat">extension to the
+ pattern syntax</a>.</p>
+ </li>
+
+ <li>
+ <p>New <code class="inline-code">FreemarkerServlet</code> init-params (see
+ <a href="http://freemarker.org/docs/api/freemarker/ext/servlet/FreemarkerServlet.html">the
+ <code>FreemarkerSerlvet</code> API documentation</a>
+ for details):</p>
+
+ <ul>
+ <li>
+ <p><code class="inline-code">OverrideResponseContentType</code>:
+ Specifies when should we override the
+ <code class="inline-code">contentType</code> that's already set (i.e.,
+ non-<code class="inline-code">null</code>) in the
+ <code class="inline-code">HttpServletResponse</code>. Earlier, we have
+ always set it, and that's still the default behavior. But
+ now that this init-param exists, you can change that
+ behavior, so that the <code class="inline-code">contentType</code> you
+ have specified before forwarding to
+ <code class="inline-code">FreemarkerServlet</code> matters.</p>
+ </li>
+
+ <li>
+ <p><code class="inline-code">OverrideResponseLocale</code>: Specifies
+ if we should override the <code class="inline-code">locale</code> that's
+ already set (i.e., non-<code class="inline-code">null</code>) in the
+ <code class="inline-code">HttpServletResponse</code>. Earlier, we have
+ always set it, but now this behavior can be changed so that
+ we only set it if it wasn't already set.</p>
+ </li>
+
+ <li>
+ <p><code class="inline-code">ResponseCharacterEncoding</code>:
+ Deprecates the old (and quirky) logic of specifying the
+ output charset, which is putting it into the
+ <code class="inline-code">ContentType</code> init-param after the MIME
+ type, otherwise falling back to the template file charset.
+ The possible values are <code class="inline-code">legacy</code> (the
+ default for backward compatibility),
+ <code class="inline-code">fromTemplate</code> (which is
+ <code class="inline-code">legacy</code> without quirks, and is aware of
+ the <code class="inline-code">outputEncoding</code> setting),
+ <code class="inline-code">doNotSet</code> (keeps what the caller has
+ already set in the <code class="inline-code">ServletRespone</code>) and
+ <code class="inline-code">force</code> followed by a charset name (forces
+ a specific output charset).</p>
+ </li>
+ </ul>
+ </li>
+
+ <li>
+ <p>Added
+ <code class="inline-code">freemarker.cache.ByteArrayTemplateLoader</code>,
+ which is similar to <code class="inline-code">StringTemplateLoader</code>, but
+ stores the templates as <code class="inline-code">byte[]</code>-s instead of
+ as <code class="inline-code">String</code>-s.</p>
+ </li>
+
+ <li>
+ <p>Upgraded JavaCC (used during build to generate the FTL
+ parser) from 3.2 to 6.1.2.</p>
+ </li>
+
+ <li>
+ <p>Added <code class="inline-code">Configurable.getSettingNames(boolean
+ camelCase)</code>, which returns the set of valid setting
+ names. This can be useful for auto-completion and such.</p>
+ </li>
+
+ <li>
+ <p>Fixes and improvements in the "object
+ builder" mini-language used for configuring FreeMarker
+ from <code class="inline-code">java.util.Properties</code> or other
+ string-only sources (not used in templates). This is
+ <em>not to be confused with the template language
+ syntax</em>, which has nothing to do with the
+ "object builder" syntax we are writing about here.
+ The improvements are:</p>
+
+ <ul>
+ <li>
+ <p>Bug fixed: For nested builder expressions, the
+ top-level result class restriction were applied
+ accidentally.</p>
+ </li>
+
+ <li>
+ <p>When resolving an expression like
+ <code class="inline-code">com.example.Foo()</code>, if there's a builder
+ class (<code class="inline-code">com.example.FooBuilder</code>), the
+ non-builder class (<code class="inline-code">com.example.Foo</code>) need
+ not exist anymore. After all,
+ <code class="inline-code">FooBuilder.build()</code> instantiates from any
+ class it wants to anyway.</p>
+ </li>
+
+ <li>
+ <p><code class="inline-code">TimeZone</code> objects can be created
+ like <code class="inline-code">TimeZone("UTC")</code>, despite that
+ there's no a such constructor.</p>
+ </li>
+
+ <li>
+ <p>Added support for creating lists with <code class="inline-code">[
+ <em class="code-color">item1</em>,
+ <em class="code-color">item2</em>,
+ <em class="code-color">...</em>
+ <em class="code-color">itemN</em> ]</code> syntax.</p>
+ </li>
+
+ <li>
+ <p>Added support for creating maps with <code class="inline-code">{
+ <em class="code-color">key1</em>:
+ <em class="code-color">value1</em>,
+ <em class="code-color">key2</em>:
+ <em class="code-color">value2</em>,
+ <em class="code-color">...</em>
+ <em class="code-color">keyN</em>:
+ <em class="code-color">valueN</em> }</code> syntax.</p>
+ </li>
+
+ <li>
+ <p>A number without decimal point will now be parsed to
+ <code class="inline-code">Integer</code>, <code class="inline-code">Long</code>, or
+ <code class="inline-code">BigInteger</code>, depending on the size of the
+ number. Earlier all numbers were parsed to
+ <code class="inline-code">BigDecimal</code>-s, but that had little
+ importance before lists and maps were added, as the number
+ was converted to the constructor or setter parameter type
+ anyway.</p>
+ </li>
+
+ <li>
+ <p>Number literals can have Java type suffixes
+ (<code class="inline-code">f</code>, <code class="inline-code">d</code>,
+ <code class="inline-code">l</code>), plus <code class="inline-code">bd</code> for
+ <code class="inline-code">BigDecimal</code> and <code class="inline-code">bi</code> for
+ <code class="inline-code">BigInteger</code>.</p>
+ </li>
+
+ <li>
+ <p>Public static fields can be referred, like
+ <code class="inline-code">com.example.MyClass.MY_CONSTANT</code> or
+ <code class="inline-code">Configuration.AUTO_DETECT_TAG_SYNTAX</code>.</p>
+ </li>
+ </ul>
+ </li>
+
+ <li>
+ <p>Decreased the stack usage of template execution, which can
+ have importance if you have very very deeply nested
+ templates.</p>
+ </li>
+
+ <li>
+ <p>Added
+ <code class="inline-code">MultiTemplateLoader.setSticky(boolean)</code> and
+ <code class="inline-code">MultiTemplateLoader.isSticky()</code>, with which
+ you can disable the default behavior, where once a template was
+ found in a child <code class="inline-code">TemplateLoader</code>, it will be
+ searched there first next time (typically, when the template
+ update delay is expired). With the <code class="inline-code">sticky</code>
+ property set to <code class="inline-code">false</code>, the child
+ <code class="inline-code">TemplateLoader</code>-s will be always searched in
+ the order as they were added to the
+ <code class="inline-code">MultiTemplateLoader</code>.</p>
+ </li>
+
+ <li>
+ <p>Added
+ <code class="inline-code">StringTemplateLoader.removeTemplate(String)</code>
+ method.</p>
+ </li>
+
+ <li>
+ <p>Bug fixed, only with
+ <code class="inline-code">incompatible_improvements</code> set to 2.3.24
+ (<a href="pgui_datamodel_objectWrapper.html#topic.defaultObjectWrapperIcI">see how
+ here...</a>): Expressions inside interpolations that were
+ inside <em>string literal expressions</em> (not
+ <code class="inline-code">${<em class="code-color">...</em>}</code>-s in
+ general), like in <code class="inline-code"><#assign s="Hello
+ ${name}!"></code>, always used
+ <code class="inline-code">incompatibleImprovements</code> 0 (2.3.0 in effect).
+ This means that expressions inside string literals had missed
+ the <code class="inline-code">?html</code>,
+ <code class="inline-code">?iso_<em class="code-color">...</em></code>,
+ <code class="inline-code">?is_enumerable</code>, <code class="inline-code">?c</code>, etc.
+ fixes/improvements.</p>
+ </li>
+
+ <li>
+ <p>Bug fixed [<a href="https://sourceforge.net/p/freemarker/bugs/439/">439</a>]:
+ <code class="inline-code">FileTemplateLoader</code> with
+ <code class="inline-code">emulateCaseSensitiveFileSystem</code> set to
+ <code class="inline-code">true</code> (used for development) wasn't properly
+ synchronized, leading to random
+ <code class="inline-code">NullPointerException</code>-s or other
+ misbehavior.</p>
+ </li>
+
+ <li>
+ <p>Bug fixed: It wasn't well defined when a Java
+ <code class="inline-code">Iterator</code> counts as empty. Depending on what
+ <code class="inline-code">ObjectWrapper</code> you are using, one of these
+ fixes apply:</p>
+
+ <ul>
+ <li>
+ <p><code class="inline-code">DefaultObjectWrapper</code> (fix is always
+ active): Operations on the <code class="inline-code">Iterator</code> that
+ only check if it's empty without reading an element from it,
+ such as <code class="inline-code">?has_content</code>, won't cause a later
+ iteration (or further emptiness check) to fail anymore.
+ Earlier, in certain situations, the second operation has
+ failed saying that the iterator "can be listed only
+ once".</p>
+ </li>
+
+ <li>
+ <p><code class="inline-code">BeansWrapper</code> (when it's not
+ extended by <code class="inline-code">DefaultObjectWrapper</code>), if
+ it's <code class="inline-code">incompatibleImprovements</code> property is
+ set to 2.3.24 (or higher): <code class="inline-code">Iterator</code>-s
+ were always said to be non-empty when using
+ <code class="inline-code">?has_content</code> and such (i.e., operators
+ that check emptiness without reading any elements). Now an
+ <code class="inline-code">Iterator</code> counts as empty exactly if it
+ has no elements left. (Note that this bug has never affected
+ basic functionality, like <code class="inline-code"><#list
+ ...></code>.)</p>
+ </li>
+ </ul>
+ </li>
+
+ <li>
+ <p>Bug fixed: The (rarely used) cause exception of
+ <code class="inline-code">ParseException</code>-s wasn't set</p>
+ </li>
+
+ <li>
+ <p>Bug fixed: When the
+ <code class="inline-code">incomaptible_improvements</code> setting of an
+ existing <code class="inline-code">Configuration</code> was changed, the
+ template cache sometimes wasn't recreated, hence old templates
+ could survive.</p>
+ </li>
+
+ <li>
+ <p>Bug fixed, with
+ <code class="inline-code">incompatible_improvements</code> set to 2.3.24
+ (<a href="pgui_datamodel_objectWrapper.html#topic.defaultObjectWrapperIcI">see how
+ here...</a>): The <code class="inline-code">#import</code> directive meant
+ to copy the library variable into a global variable if it's
+ executed in the main namespace, but that haven't happened when
+ the imported template was already imported earlier in another
+ namespace.</p>
+ </li>
+
+ <li>
+ <p>Fixes in the XML processing feature
+ (<code class="inline-code">freemarker.ext.dom</code>):</p>
+
+ <ul>
+ <li>
+ <p>Bug fixed: XPath queries that has only contained
+ characters that are valid in XML element names and has also
+ contained <code class="inline-code">::</code> (which is valid in names in
+ namespace-unware documents), like
+ <code class="inline-code">e['following-sibling::foo']</code>, were
+ interpreted as literal element names (giving 0 hits) rather
+ than as XPath expressions. Note that there were no such
+ problem with <code class="inline-code">e['following-sibling::*']</code>
+ for example, as it's not a valid XML element name according
+ the XML specification. This fix can actually break
+ applications that has processed namespace unaware XML that
+ use <code class="inline-code">::</code> as part of element or attribute
+ names, but such an application is highly unlikely, unlike
+ running into the fixed problem. (Unfortunately, using
+ <code class="inline-code">incompatible_improvements</code> wasn't
+ technically possible here.)</p>
+ </li>
+
+ <li>
+ <p>Bug fixed: The <code class="inline-code">@@qname</code> of elements
+ that belong to the XML namespace declared as the default via
+ <code class="inline-code"><#ftl ns_prefixes={'D':'...', ...
+ }></code> no longer starts with <code class="inline-code">D:</code>,
+ instead they just start with no name space prefix.</p>
+ </li>
+
+ <li>
+ <p>Bug fixed: In the markup returned by the
+ <code class="inline-code">@@markup</code> key, when there were multiple
+ namespaces for which there was no prefix associated with via
+ <code class="inline-code"><#ftl
+ ns_prefixes=<em class="code-color">...</em>></code>,
+ all those namespaces were assigned to the same
+ auto-generated <code class="inline-code">xmlns</code> prefix (usually
+ "a"). Now they will get "a",
+ "b", "c", etc. prefixes.</p>
+ </li>
+ </ul>
+ </li>
+
+ <li>
+ <p>JSP TLD loading now quotes the location of
+ <code class="inline-code">jar</code>-s (and other <code class="inline-code">zip</code>-s)
+ which can't be loaded due to zip format errors in the error
+ message.</p>
+ </li>
+
+ <li>
+ <p>Added an overload to
+ <code class="inline-code">Configuration.getSupportedBuiltInNames</code> and
+ <code class="inline-code">Configuration.getSupportedBuiltInDirectiveNames</code>
+ that has a <code class="inline-code">namingConvention</code> parameter. This
+ is useful for tooling as since 2.3.23 we support both camel case
+ naming convention (like
+ <code class="inline-code"><em class="code-color">s</em>?upperCase</code>) and
+ the legacy one (like
+ <code class="inline-code"><em class="code-color">s</em>?upper_case</code>).
+ Furthermore the old 0 argument overload will now utilize
+ <code class="inline-code">Configuration.getNamingConvention()</code> to only
+ return the relevant names if it's not
+ <code class="inline-code">AUTO_DETECT_NAMING_CONVENTION</code>.</p>
+ </li>
+
+ <li>
+ <p>Internal reworking to simplify the AST (the
+ <code class="inline-code">TemplateElement</code> structure). The related
+ technically public API was marked as internal for a good while.
+ For those who still use that API, the visible change is that
+ <code class="inline-code">TemplateElement</code>-s now almost never has a
+ <code class="inline-code">MixedContent</code> parent, instead, the parent is
+ directly whatever element the child element indeed belongs under
+ when you look at the source code (like the enclosing
+ <code class="inline-code">#list</code> for example, while earlier you often
+ had to go through a <code class="inline-code">MixedContent</code> first whose
+ parent was the <code class="inline-code">#list</code>). Note that when you
+ have moved downwards, i.e., towards the child elements, these
+ <code class="inline-code">MixedContent</code> parents weren't visible and were
+ silently skipped, so the tree traversal API was inconsistent.
+ Now it's consistent.</p>
+ </li>
+
+ <li>
+ <p>Due to the above change again, the return type of
+ <code class="inline-code">freemarker.core.DebugBreak.accept()</code> and
+ <code class="inline-code">freemarker.core.TextBlock.accept()</code> has
+ changed from <code class="inline-code">void</code> to
+ <code class="inline-code">TemplateElement[]</code>. This again is highly
+ unlikely to affect anyone, and these meant to be internal API-s
+ anyway, but as these two <code class="inline-code">accept</code> methods has
+ wider than package visibility for historical reasons, we mention
+ this change.</p>
+ </li>
+
+ <li>
+ <p>The non-public AST API of
+ <code class="inline-code">freemarker.core.StringLiteral</code>-s has been
+ changed. In principle it doesn't mater as it isn't a public API,
+ but some might used these regardless to introspect templates.
+ Earlier it had an "embedded template" parameter
+ inside, now it has 0 (for purely static string literals), one or
+ more "value part"-s, which are
+ <code class="inline-code">String</code>-s and
+ <code class="inline-code">Interpolation</code>-s.</p>
+ </li>
+
+ <li>
+ <p>Internal code cleanup: Mostly for consistent source code
+ formatting, also many parser construction/setup cleanup</p>
+ </li>
+
+ <li>
+ <p>Source code changes to conform to Apache source release
+ policy, such as adding copyright headers and getting rid of test
+ <code class="inline-code">jar</code>-s committed into the source code. Eclipse
+ project files were also removed, instead the
+ <code class="inline-code">README</code> describes how to set up the
+ project.</p>
+ </li>
+
+ <li>
+ <p>Build script and distribution artifact changes to conform
+ to Apache release policy, most notably it produces separate
+ source and binary releases.</p>
+ </li>
+ </ul>
+
+
+
+
+
+<h2 class="content-header header-section2" id="autoid_163">Changes compared to 2.3.24 Release Candidate 1</h2>
+
+
+ <ul>
+ <li>
+ <p>Added
+ <code class="inline-code">MultiTemplateLoader.setSticky(boolean)</code> and
+ <code class="inline-code">MultiTemplateLoader.isSticky()</code>, with which
+ you can disable the default behavior, where once a template was
+ found in a child <code class="inline-code">TemplateLoader</code>, it will be
+ searched there first next time (typically, when the template
+ update delay is expired). With the <code class="inline-code">sticky</code>
+ property set to <code class="inline-code">false</code>, the child
+ <code class="inline-code">TemplateLoader</code>-s will be always searched in
+ the order as they were added to the
+ <code class="inline-code">MultiTemplateLoader</code>.</p>
+ </li>
+
+ <li>
+ <p>Added
+ <code class="inline-code">StringTemplateLoader.removeTemplate(String)</code>
+ method.</p>
+ </li>
+
+ <li>
+ <p>Source code changes to conform to Apache release policy
+ and recommendations:</p>
+
+ <ul>
+ <li>
+ <p>No more binary test <code class="inline-code">jar</code>-s committed
+ into the source code (instead, they are generated
+ on-the-fly)</p>
+ </li>
+
+ <li>
+ <p>Eclipse project files were removed, instead, the
+ <code class="inline-code">README</code> describes how to set up the
+ project.</p>
+ </li>
+ </ul>
+ </li>
+ </ul>
+ <div class="bottom-pagers-wrapper"><div class="pagers bottom"><a class="paging-arrow previous" href="versions_2_3_25.html"><span>Previous</span></a><a class="paging-arrow next" href="versions_2_3_23.html"><span>Next</span></a></div></div></div></div> </div>
+ </div>
+<div class="site-footer"><div class="site-width"><div class="footer-top"><div class="col-left sitemap"><div class="column"><h3 class="column-header">Overview</h3><ul><li><a href="http://freemarker.org/">What is FreeMarker?</a></li><li><a href="http://freemarker.org/freemarkerdownload.html">Download</a></li><li><a href="app_versions.html">Version history</a></li><li><a href="http://freemarker.org/history.html">About us</a></li><li><a itemprop="license" href="app_license.html">License</a></li></ul></div><div class="column"><h3 class="column-header">Handy stuff</h3><ul><li><a href="http://freemarker-online.kenshoo.com/">Try template online</a></li><li><a href="dgui_template_exp.html#exp_cheatsheet">Expressions cheatsheet</a></li><li><a href="ref_directive_alphaidx.html">#directives</a></li><li><a href="ref_builtins_alphaidx.html">?built_ins</a></li><li><a href="ref_specvar.html">.special_vars</a></li></ul></div><div class="column"><h3 class="column-header">Community</h3><ul><li><a href
="https://github.com/freemarker/freemarker">FreeMarker on Github</a></li><li><a href="https://twitter.com/freemarker">Follow us on Twitter</a></li><li><a href="https://issues.apache.org/jira/browse/FREEMARKER/">Report a bug</a></li><li><a href="http://stackoverflow.com/questions/ask?tags=freemarker">Ask a question</a></li><li><a href="http://freemarker.org/mailing-lists.html">Mailing lists</a></li></ul></div></div><div class="col-right"><ul class="social-icons"><li><a class="github" href="https://github.com/freemarker/freemarker">Github</a></li><li><a class="twitter" href="https://twitter.com/freemarker">Twitter</a></li><li><a class="stack-overflow" href="http://stackoverflow.com/questions/ask?tags=freemarker">Stack Overflow</a></li></ul><a class="xxe" href="http://www.xmlmind.com/xmleditor/" rel="nofollow" title="Edited with XMLMind XML Editor"><span>Edited with XMLMind XML Editor</span></a></div></div><div class="footer-bottom"> <p class="last-generated">
+Last generated:
+<time itemprop="dateModified" datetime="2017-03-13T10:55:28Z" title="Monday, March 13, 2017 10:55:28 AM GMT">2017-03-13 10:55:28 GMT</time>, for Freemarker 2.3.26 </p>
+<p class="copyright">
+� <span itemprop="copyrightYear">1999</span>\u20132017
+<a itemtype="http://schema.org/Organization" itemprop="copyrightHolder" href="http://apache.org/">The Apache Software Foundation</a>. Apache FreeMarker, FreeMarker, Apache Incubator, Apache, the Apache FreeMarker logo are trademarks of The Apache Software Foundation. </p>
+</div></div></div></body>
+</html>