blob: 43fe358241dbb9448a4a7a3b3470f31049968cde [file] [log] [blame]
<!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>Alternative (square bracket) syntax - 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="Alternative (square bracket) syntax">
<meta property="og:locale" content="en_US">
<meta property="og:url" content="https://freemarker.apache.org/docs/dgui_misc_alternativesyntax.html">
<link rel="canonical" href="https://freemarker.apache.org/docs/dgui_misc_alternativesyntax.html">
<link rel="icon" href="favicon.png" type="image/png">
<link rel="stylesheet" type="text/css" href="https://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?1707770044859">
<script type="text/javascript" src="https://cdn.jsdelivr.net/npm/cookie-bar/cookiebar-latest.min.js"></script>
</head>
<body itemscope itemtype="https://schema.org/Code">
<meta itemprop="url" content="https://freemarker.apache.org/docs/">
<meta itemprop="name" content="Apache FreeMarker Manual">
<!--[if lte IE 9]>
<div class="oldBrowserWarning" style="display: block">
Unsupported web browser - Use a modern browser to view this website!
</div>
<![endif]--> <div class="oldBrowserWarning">
Unsupported web browser - Use a modern browser to view this website!
</div>
<div class="header-top-bg"><div class="site-width header-top"><div id="hamburger-menu" role="button"></div> <div class="logo">
<a href="https://freemarker.apache.org" role="banner"><img itemprop="image" src="logo.png" alt="FreeMarker"></a> </div>
<ul class="tabs"><li><a href="https://freemarker.apache.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="https://freemarker.apache.org/contribute.html" title="Contribute"><span>Contribute</span></a></li><li><a class="tab icon-bug" href="https://issues.apache.org/jira/projects/FREEMARKER" title="Report a Bug"><span>Report a Bug</span></a></li><li><a class="tab icon-download" href="https://freemarker.apache.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="search-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"> <div class="breadcrumbs">
<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="dgui.html"><span itemprop="name">Template Author&#39;s Guide</span></a></li><li class="step-2" itemprop="itemListElement" itemscope itemtype="http://schema.org/ListItem"><a class="label" itemprop="item" href="dgui_misc.html"><span itemprop="name">Miscellaneous</span></a></li><li class="step-3" itemprop="itemListElement" itemscope itemtype="http://schema.org/ListItem"><a class="label" itemprop="item" href="dgui_misc_alternativesyntax.html"><span itemprop="name">Alternative (square bracket) syntax</span></a></li></ul> </div>
<div class="bookmarks" title="Bookmarks"><span class="sr-only">Bookmarks:</span><ul><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","Template Author\'s Guide","Miscellaneous","Alternative (square bracket) syntax"];</script>
<script src="toc.js?1707770044859"></script>
<script src="docgen-resources/main.min.js?1707770044859"></script>
</div>
<div class="col-right"><div class="page-content"><div class="page-title"><div class="pagers top"><a class="paging-arrow previous" href="dgui_misc_whitespace.html"><span>Previous</span></a><a class="paging-arrow next" href="pgui.html"><span>Next</span></a></div><div class="title-wrapper">
<h1 class="content-header header-section1" id="dgui_misc_alternativesyntax" itemprop="headline">Alternative (square bracket) syntax</h1>
</div></div><div class="page-menu">
<div class="page-menu-title">Page Contents</div>
<ul><li><a class="page-menu-link" href="#dgui_misc_alternativesyntax_tag" data-menu-target="dgui_misc_alternativesyntax_tag">Square bracket tag syntax</a></li><li><a class="page-menu-link" href="#dgui_misc_alternativesyntax_interpolation" data-menu-target="dgui_misc_alternativesyntax_interpolation">Square bracket interpolation syntax</a></li></ul> </div><p>Sometimes the generated content uses symbols that clashes with
the default FreeMarker syntax (typically,
<code class="inline-code">${<em class="code-color">...</em>}</code>-s that FreeMarker
should print as is, without interpretation), or you use some tool that
is confused by the default FreeMarker syntax (typically by
<code class="inline-code">&lt;</code> and <code class="inline-code">&gt;</code>). While usually
there are tricks to work those cases around (like you can use
<code class="inline-code">${&#39;$&#39;}{x}</code> to print <code class="inline-code">${x}</code> as is) ,
they are often too inconvenient. Thus, the interpolation syntax can be
configured to be like <code class="inline-code">[=x]</code> instead of
<code class="inline-code">${x}</code>. Also, independently of that, the FreeMarker
tag syntax can be configured to use <code class="inline-code">[]</code>, like in
<code class="inline-code">[#if x]<em class="code-color">...</em>[/#if]</code>.</p> <div class="callout note">
<strong class="callout-label">Note:</strong>
<p>While both the "tag syntax" and
"interpolation syntax" can be configured to use square
brackets, they are totally independent configuration settings. Thus,
the overall syntax can be like <code class="inline-code">[#if x]${y}[/#if]</code>,
or like <code class="inline-code">&lt;#if x&gt;[=y]&lt;/#if&gt;</code> as
well.</p>
</div>
<h2 class="content-header header-section2" id="dgui_misc_alternativesyntax_tag">Square bracket tag syntax</h2>
<div class="callout note">
<strong class="callout-label">Note:</strong>
<p>This section is about the <em>tag</em> syntax,
not the <a href="#dgui_misc_alternativesyntax_interpolation"><em>interpolation</em>
syntax</a>. Don&#39;t confuse the two, they are independent.</p>
</div>
<div class="callout note">
<strong class="callout-label">Note:</strong>
<p>This feature exists since FreeMarker 2.3.4.</p>
</div>
<p>FreeMarker supports an alternative tag syntax, where
<code class="inline-code">[</code> and <code class="inline-code">]</code> is used instead of
<code class="inline-code">&lt;</code> and <code class="inline-code">&gt;</code> in FreeMarker
directives and comments, for example:</p>
<ul>
<li>
Calling predefined directive: <code class="inline-code">[#list animals as
animal]<em class="code-color">...</em>[/#list]</code>
</li>
<li>
Calling user-defined directive: <code class="inline-code">[@myMacro
/]</code>
</li>
<li>
Comment: <code class="inline-code">[#-- the comment --]</code>
</li>
</ul>
<p>To use square tag syntax instead of the default one, the
programmers should configure FreeMarker so <span class="marked-for-programmers">(see
<code class="inline-code">Configuraton.setTagSyntax</code>, or the
<code class="inline-code">tag_syntax</code> setting)</span>. However, the tag
syntax can also be enforced in the template, with the <a href="ref_directive_ftl.html"><code>ftl</code> directive</a>
(see later).</p>
<p>For example, this is how the last example of the <a href="dgui_quickstart_template.html">Getting Started</a> looks with
the alternative syntax:</p>
<div class="code-block role-template">
<div class="code-block-label">Template</div><pre class="code-block-body">&lt;p&gt;We have these animals:
&lt;table border=1&gt;
&lt;tr&gt;&lt;th&gt;Name&lt;th&gt;Price
<strong>[#list animals as animal]</strong>
&lt;tr&gt;
&lt;td&gt;
<strong>[#if animal.size == &quot;large&quot;]</strong>&lt;b&gt;<strong>[/#if]</strong>
${animal.name}
<strong>[#if animal.size == &quot;large&quot;]</strong>&lt;/b&gt;<strong>[/#if]</strong>
&lt;td&gt;${animal.price} Euros
<strong>[/#list]</strong>
&lt;/table&gt;</pre> </div>
<p>The square bracket and the default (angle bracket) syntax are
mutually exclusive within a template; they can&#39;t be mixed. If the
template uses square bracket tag syntax, then things like
<code class="inline-code">&lt;#if <em class="code-color">...</em>&gt;</code> will
be just static text, not FTL tags. Similarly, if the template uses
the angle brackets tag syntax, things like <code class="inline-code">[#if
<em class="code-color">...</em>]</code> are static text, not FTL
tags.</p>
<p>If you start the file with <code class="inline-code">[#ftl
<em class="code-color">...</em>]</code> (where the
<code class="inline-code"><em class="code-color">...</em></code> stands for the
optional parameters; of course <code class="inline-code">[#ftl]</code> works too)
the file will use square bracket <em>tag</em> syntax
regardless of the configuration settings (but that does
<em>not</em> change the interpolation syntax to
<code class="inline-code">[=...]</code>). Similarly, if you start the file with
<code class="inline-code">&lt;#ftl <em class="code-color">...</em>&gt;</code> the
file will use the normal (angle bracket) tag syntax. If there is no
<code class="inline-code">ftl</code> directive in the file, then the programmer
decides what the tag <em>syntax</em> will be by
configuring FreeMarker <span class="marked-for-programmers">(programmers
see <code class="inline-code">Configuration.setTagSyntax(int)</code> in the API
javadocs)</span>. Most probably the programmers use the factory
default.</p>
<h2 class="content-header header-section2" id="dgui_misc_alternativesyntax_interpolation">Square bracket interpolation syntax</h2>
<div class="callout note">
<strong class="callout-label">Note:</strong>
<p>This section is about the <em>interpolation</em>
syntax, not the <a href="#dgui_misc_alternativesyntax_tag"><em>tag</em>
syntax</a>. Don&#39;t confuse the two, they are independent.</p>
</div>
<div class="callout note">
<strong class="callout-label">Note:</strong>
<p>This feature exists since FreeMarker 2.3.28</p>
</div>
<p>In this case instead of
<code class="inline-code">${<em class="code-color">expression</em>}</code> (and the
deprecated
<code class="inline-code">#{<em class="code-color">expression</em>}</code>) you
write <code class="inline-code">[=<em class="code-color">expression</em>]</code>.
This syntax is activated by the programmers from the configuration
<span class="marked-for-programmers">(see
<code class="inline-code">Configuration.setInterpolationSyntax</code> in the Java
API)</span>; unlike the tag syntax, it can&#39;t be specified inside
the template. It can be used both together with, and without the
<a href="#dgui_misc_alternativesyntax_tag">square bracket
<em>tag</em> syntax</a>, as they are technically
unrelated, but it&#39;s probably more aesthetic to use square bracket
tag syntax when you use square bracket interpolation syntax:</p>
<div class="code-block role-template">
<div class="code-block-label">Template</div><pre class="code-block-body">[#--
Note:
This example uses both interpolation_syntax=squareBracket and tag_syntax=squareBracket,
but you can also use interpolation_syntax=squareBracket and tag_syntax=angleBracket.
--]
&lt;p&gt;We have these animals:
&lt;table border=1&gt;
&lt;tr&gt;&lt;th&gt;Name&lt;th&gt;Price
[#list animals as animal]
&lt;tr&gt;
&lt;td&gt;
[#if animal.size == &quot;large&quot;]&lt;b&gt;[/#if]
<strong>[=animal.name]</strong>
[#if animal.size == &quot;large&quot;]&lt;/b&gt;[/#if]
&lt;td&gt;<strong>[=animal.price]</strong> Euros
[/#list]
&lt;/table&gt;</pre> </div>
<p>When square bracket interpolation syntax is used,
<code class="inline-code">${<em class="code-color">expression</em>}</code> and
<code class="inline-code">#{<em class="code-color">expression</em>}</code> in the
template will be just static text, which is printed as is. This is
mostly useful if you generate output that should contain those
(especially
<code class="inline-code">${<em class="code-color">expression</em>}</code> is
frequent), such as when generating JSP files.</p>
<p>There&#39;s also a third tag syntax, "dollar", where
only the interpolation syntax is
<code class="inline-code">${<em class="code-color">expression</em>}</code>, and the
deprecated
<code class="inline-code">#{<em class="code-color">expression</em>}</code> is just
static text. (The one where
<code class="inline-code">#{<em class="code-color">expression</em>}</code> is still
an interpolation is called the "legacy" interpolation
syntax, and is the default for backward compatibility.)</p>
<div class="bottom-pagers-wrapper"><div class="pagers bottom"><a class="paging-arrow previous" href="dgui_misc_whitespace.html"><span>Previous</span></a><a class="paging-arrow next" href="pgui.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="https://freemarker.apache.org/">What is FreeMarker?</a></li><li><a href="https://freemarker.apache.org/freemarkerdownload.html">Download</a></li><li><a href="app_versions.html">Version history</a></li><li><a href="app_faq.html">FAQ</a></li><li><a itemprop="license" href="app_license.html">License</a></li><li><a href="https://privacy.apache.org/policies/privacy-policy-public.html">Privacy policy</a></li></ul></div><div class="column"><h3 class="column-header">Often used / Reference</h3><ul><li><a href="https://try.freemarker.apache.org/">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><li><a href="api/freemarker/core/Configurable.html#setSetting-java.lang.String-java.lang.String-">Configuration settings</a></li></ul></div><div class="column"><h3 class="column-header">Community</h3><ul><li><a href="https://github.com/apache/freemarker">Github project page</a></li><li><a href="https://issues.apache.org/jira/projects/FREEMARKER">Report a bug</a></li><li><a href="https://freemarker.apache.org/report-security-vulnerabilities.html">Report security vulnerability</a></li><li><a href="https://stackoverflow.com/questions/ask?tags=freemarker">Get help on StackOverflow</a></li><li><a href="https://twitter.com/freemarker">Announcements on Twitter</a></li><li><a href="https://freemarker.apache.org/mailing-lists.html">Discuss on mailing lists</a></li></ul></div></div><div class="col-right"><ul class="social-icons"><li><a class="github" href="https://github.com/apache/freemarker">Github</a></li><li><a class="twitter" href="https://twitter.com/freemarker">Twitter</a></li><li><a class="stack-overflow" href="https://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="2024-02-12T20:34:04Z" title="Monday, February 12, 2024 at 8:34:04 PM Greenwich Mean Time">2024-02-12 20:34:04 GMT</time>, for Freemarker 2.3.32 </p>
<p class="copyright">
© <span itemprop="copyrightYear">1999</span>–2024
<a itemtype="http://schema.org/Organization" itemprop="copyrightHolder" href="https://apache.org/">The Apache Software Foundation</a>. Apache FreeMarker, FreeMarker, Apache Incubator, Apache, the Apache FreeMarker logo are trademarks of The Apache Software Foundation. All other marks mentioned may be trademarks or registered trademarks of their respective owners. </p>
</div></div></div></body>
</html>