blob: 6234001f5c4abbf5ca9137f0d3db943aff798cb6 [file] [log] [blame]
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<!-- NewPage -->
<html lang="en">
<head>
<!-- Generated by javadoc (1.8.0_281) on Sun Jan 15 15:58:33 CET 2023 -->
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>TemplateNameFormat (FreeMarker 2.3.32 API)</title>
<meta name="date" content="2023-01-15">
<link rel="stylesheet" type="text/css" href="../../stylesheet.css" title="Style">
<script type="text/javascript" src="../../script.js"></script>
</head>
<body>
<script type="text/javascript"><!--
try {
if (location.href.indexOf('is-external=true') == -1) {
parent.document.title="TemplateNameFormat (FreeMarker 2.3.32 API)";
}
}
catch(err) {
}
//-->
</script>
<noscript>
<div>JavaScript is disabled on your browser.</div>
</noscript>
<!-- ========= START OF TOP NAVBAR ======= -->
<div class="topNav"><a name="navbar.top">
<!-- -->
</a>
<div class="skipNav"><a href="#skip.navbar.top" title="Skip navigation links">Skip navigation links</a></div>
<a name="navbar.top.firstrow">
<!-- -->
</a>
<ul class="navList" title="Navigation">
<li><a href="../../overview-summary.html">Overview</a></li>
<li><a href="package-summary.html">Package</a></li>
<li class="navBarCell1Rev">Class</li>
<li><a href="class-use/TemplateNameFormat.html">Use</a></li>
<li><a href="package-tree.html">Tree</a></li>
<li><a href="../../deprecated-list.html">Deprecated</a></li>
<li><a href="../../index-all.html">Index</a></li>
<li><a href="../../help-doc.html">Help</a></li>
</ul>
</div>
<div class="subNav">
<ul class="navList">
<li><a href="../../freemarker/cache/TemplateLookupStrategy.html" title="class in freemarker.cache"><span class="typeNameLink">Prev&nbsp;Class</span></a></li>
<li><a href="../../freemarker/cache/TemplateSourceMatcher.html" title="class in freemarker.cache"><span class="typeNameLink">Next&nbsp;Class</span></a></li>
</ul>
<ul class="navList">
<li><a href="../../index.html?freemarker/cache/TemplateNameFormat.html" target="_top">Frames</a></li>
<li><a href="TemplateNameFormat.html" target="_top">No&nbsp;Frames</a></li>
</ul>
<ul class="navList" id="allclasses_navbar_top">
<li><a href="../../allclasses-noframe.html">All&nbsp;Classes</a></li>
</ul>
<div>
<script type="text/javascript"><!--
allClassesLink = document.getElementById("allclasses_navbar_top");
if(window==top) {
allClassesLink.style.display = "block";
}
else {
allClassesLink.style.display = "none";
}
//-->
</script>
</div>
<div>
<ul class="subNavList">
<li>Summary:&nbsp;</li>
<li>Nested&nbsp;|&nbsp;</li>
<li><a href="#field.summary">Field</a>&nbsp;|&nbsp;</li>
<li>Constr&nbsp;|&nbsp;</li>
<li><a href="#methods.inherited.from.class.java.lang.Object">Method</a></li>
</ul>
<ul class="subNavList">
<li>Detail:&nbsp;</li>
<li><a href="#field.detail">Field</a>&nbsp;|&nbsp;</li>
<li>Constr&nbsp;|&nbsp;</li>
<li>Method</li>
</ul>
</div>
<a name="skip.navbar.top">
<!-- -->
</a></div>
<!-- ========= END OF TOP NAVBAR ========= -->
<!-- ======== START OF CLASS DATA ======== -->
<div class="header">
<div class="subTitle">freemarker.cache</div>
<h2 title="Class TemplateNameFormat" class="title">Class TemplateNameFormat</h2>
</div>
<div class="contentContainer">
<ul class="inheritance">
<li>java.lang.Object</li>
<li>
<ul class="inheritance">
<li>freemarker.cache.TemplateNameFormat</li>
</ul>
</li>
</ul>
<div class="description">
<ul class="blockList">
<li class="blockList">
<hr>
<br>
<pre>public abstract class <span class="typeNameLabel">TemplateNameFormat</span>
extends java.lang.Object</pre>
<div class="block">Symbolizes a template name format, which defines the basic syntax of names through algorithms such as normalization.
The API of this class isn't exposed as it's too immature, so custom template name formats aren't possible yet.</div>
<dl>
<dt><span class="simpleTagLabel">Since:</span></dt>
<dd>2.3.22</dd>
</dl>
</li>
</ul>
</div>
<div class="summary">
<ul class="blockList">
<li class="blockList">
<!-- =========== FIELD SUMMARY =========== -->
<ul class="blockList">
<li class="blockList"><a name="field.summary">
<!-- -->
</a>
<h3>Field Summary</h3>
<table class="memberSummary" border="0" cellpadding="3" cellspacing="0" summary="Field Summary table, listing fields, and an explanation">
<caption><span>Fields</span><span class="tabEnd">&nbsp;</span></caption>
<tr>
<th class="colFirst" scope="col">Modifier and Type</th>
<th class="colLast" scope="col">Field and Description</th>
</tr>
<tr class="altColor">
<td class="colFirst"><code>static <a href="../../freemarker/cache/TemplateNameFormat.html" title="class in freemarker.cache">TemplateNameFormat</a></code></td>
<td class="colLast"><code><span class="memberNameLink"><a href="../../freemarker/cache/TemplateNameFormat.html#DEFAULT_2_3_0">DEFAULT_2_3_0</a></span></code>
<div class="block">The default template name format when <a href="../../freemarker/template/Configuration.html#Configuration-freemarker.template.Version-"><code>incompatible_improvements</code></a> is
below 2.4.0.</div>
</td>
</tr>
<tr class="rowColor">
<td class="colFirst"><code>static <a href="../../freemarker/cache/TemplateNameFormat.html" title="class in freemarker.cache">TemplateNameFormat</a></code></td>
<td class="colLast"><code><span class="memberNameLink"><a href="../../freemarker/cache/TemplateNameFormat.html#DEFAULT_2_4_0">DEFAULT_2_4_0</a></span></code>
<div class="block">The default template name format only when <a href="../../freemarker/template/Configuration.html#Configuration-freemarker.template.Version-"><code>incompatible_improvements</code></a>
is set to 2.4.0 (or higher).</div>
</td>
</tr>
</table>
</li>
</ul>
<!-- ========== METHOD SUMMARY =========== -->
<ul class="blockList">
<li class="blockList"><a name="method.summary">
<!-- -->
</a>
<h3>Method Summary</h3>
<ul class="blockList">
<li class="blockList"><a name="methods.inherited.from.class.java.lang.Object">
<!-- -->
</a>
<h3>Methods inherited from class&nbsp;java.lang.Object</h3>
<code>clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait</code></li>
</ul>
</li>
</ul>
</li>
</ul>
</div>
<div class="details">
<ul class="blockList">
<li class="blockList">
<!-- ============ FIELD DETAIL =========== -->
<ul class="blockList">
<li class="blockList"><a name="field.detail">
<!-- -->
</a>
<h3>Field Detail</h3>
<a name="DEFAULT_2_3_0">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>DEFAULT_2_3_0</h4>
<pre>public static final&nbsp;<a href="../../freemarker/cache/TemplateNameFormat.html" title="class in freemarker.cache">TemplateNameFormat</a> DEFAULT_2_3_0</pre>
<div class="block">The default template name format when <a href="../../freemarker/template/Configuration.html#Configuration-freemarker.template.Version-"><code>incompatible_improvements</code></a> is
below 2.4.0. As of FreeMarker 2.4.0, the default <code>incompatible_improvements</code> is still <code>2.3.0</code>, and it
will certainly remain so for a very long time. In new projects it's highly recommended to use
<a href="../../freemarker/cache/TemplateNameFormat.html#DEFAULT_2_4_0"><code>DEFAULT_2_4_0</code></a> instead.</div>
</li>
</ul>
<a name="DEFAULT_2_4_0">
<!-- -->
</a>
<ul class="blockListLast">
<li class="blockList">
<h4>DEFAULT_2_4_0</h4>
<pre>public static final&nbsp;<a href="../../freemarker/cache/TemplateNameFormat.html" title="class in freemarker.cache">TemplateNameFormat</a> DEFAULT_2_4_0</pre>
<div class="block">The default template name format only when <a href="../../freemarker/template/Configuration.html#Configuration-freemarker.template.Version-"><code>incompatible_improvements</code></a>
is set to 2.4.0 (or higher). This is not the out-of-the-box default format of FreeMarker 2.4.x, because the
default <code>incompatible_improvements</code> is still 2.3.0 there.
<p>
Differences to the <a href="../../freemarker/cache/TemplateNameFormat.html#DEFAULT_2_3_0"><code>DEFAULT_2_3_0</code></a> format:
<ul>
<li>The scheme and the path need not be separated with <code>"://"</code> anymore, only with <code>":"</code>. This makes
template names like <code>"classpath:foo.ftl"</code> interpreted as an absolute name with scheme <code>"classpath"</code>
and absolute path "foo.ftl". The scheme name before the <code>":"</code> can't contain <code>"/"</code>, or else it's
treated as a malformed name. The scheme part can be separated either with <code>"://"</code> or just <code>":"</code> from
the path. Hence, <code>myscheme:/x</code> is normalized to <code>myscheme:x</code>, while <code>myscheme:///x</code> is
normalized to <code>myscheme://x</code>, but <code>myscehme://x</code> or <code>myscheme:/x</code> aren't changed by
normalization. It's up the <a href="../../freemarker/cache/TemplateLoader.html" title="interface in freemarker.cache"><code>TemplateLoader</code></a> to which the normalized names are passed to decide which of
these scheme separation conventions are valid (maybe both).</li>
<li><code>":"</code> is not allowed in template names, except as the scheme separator (see previous point).
<li>Malformed paths throw <a href="../../freemarker/template/MalformedTemplateNameException.html" title="class in freemarker.template"><code>MalformedTemplateNameException</code></a> instead of acting like if the template wasn't
found.
<li><code>"\"</code> (backslash) is not allowed in template names, and causes <a href="../../freemarker/template/MalformedTemplateNameException.html" title="class in freemarker.template"><code>MalformedTemplateNameException</code></a>.
With <a href="../../freemarker/cache/TemplateNameFormat.html#DEFAULT_2_3_0"><code>DEFAULT_2_3_0</code></a> you would certainly end up with a <a href="../../freemarker/template/TemplateNotFoundException.html" title="class in freemarker.template"><code>TemplateNotFoundException</code></a> (or worse,
it would work, but steps like <code>".."</code> wouldn't be normalized by FreeMarker).
<li>Template names might end with <code>/</code>, like <code>"foo/"</code>, and the presence or lack of the terminating
<code>/</code> is seen as significant. While their actual interpretation is up to the <a href="../../freemarker/cache/TemplateLoader.html" title="interface in freemarker.cache"><code>TemplateLoader</code></a>,
operations that manipulate template names assume that the last step refers to a "directory" as opposed to a
"file" exactly if the terminating <code>/</code> is present. Except, the empty name is assumed to refer to the root
"directory" (despite that it doesn't end with <code>/</code>).
<li><code>//</code> is normalized to <code>/</code>, except of course if it's in the scheme name terminator. Like
<code>foo//bar///baaz.ftl</code> is normalized to <code>foo/bar/baaz.ftl</code>. (In general, 0 long step names aren't
possible anymore.)</li>
<li>The <code>".."</code> bugs of the legacy normalizer are fixed: <code>".."</code> steps has removed the preceding
<code>"."</code> or <code>"*"</code> or scheme steps, not treating them specially as they should be. Now these work as
expected. Examples: <code>"a/./../c"</code> has become to <code>"a/c"</code>, now it will be <code>"c"</code>; <code>"a/b/*</code>
<code>/../c"</code> has become to <code>"a/b/c"</code>, now it will be <code>"a/*</code><code>/c"</code>; <code>"scheme://.."</code> has
become to <code>"scheme:/"</code>, now it will be <code>null</code> (<a href="../../freemarker/template/TemplateNotFoundException.html" title="class in freemarker.template"><code>TemplateNotFoundException</code></a>) for backing out of
the root directory.</li>
<li>As now directory paths has to be handled as well, it recognizes terminating, leading, and lonely <code>".."</code>
and <code>"."</code> steps. For example, <code>"foo/bar/.."</code> now becomes to <code>"foo/"</code></li>
<li>Multiple consecutive <code>*</code> steps are normalized to one</li>
</ul></div>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</div>
</div>
<!-- ========= END OF CLASS DATA ========= -->
<!-- ======= START OF BOTTOM NAVBAR ====== -->
<div class="bottomNav"><a name="navbar.bottom">
<!-- -->
</a>
<div class="skipNav"><a href="#skip.navbar.bottom" title="Skip navigation links">Skip navigation links</a></div>
<a name="navbar.bottom.firstrow">
<!-- -->
</a>
<ul class="navList" title="Navigation">
<li><a href="../../overview-summary.html">Overview</a></li>
<li><a href="package-summary.html">Package</a></li>
<li class="navBarCell1Rev">Class</li>
<li><a href="class-use/TemplateNameFormat.html">Use</a></li>
<li><a href="package-tree.html">Tree</a></li>
<li><a href="../../deprecated-list.html">Deprecated</a></li>
<li><a href="../../index-all.html">Index</a></li>
<li><a href="../../help-doc.html">Help</a></li>
</ul>
</div>
<div class="subNav">
<ul class="navList">
<li><a href="../../freemarker/cache/TemplateLookupStrategy.html" title="class in freemarker.cache"><span class="typeNameLink">Prev&nbsp;Class</span></a></li>
<li><a href="../../freemarker/cache/TemplateSourceMatcher.html" title="class in freemarker.cache"><span class="typeNameLink">Next&nbsp;Class</span></a></li>
</ul>
<ul class="navList">
<li><a href="../../index.html?freemarker/cache/TemplateNameFormat.html" target="_top">Frames</a></li>
<li><a href="TemplateNameFormat.html" target="_top">No&nbsp;Frames</a></li>
</ul>
<ul class="navList" id="allclasses_navbar_bottom">
<li><a href="../../allclasses-noframe.html">All&nbsp;Classes</a></li>
</ul>
<div>
<script type="text/javascript"><!--
allClassesLink = document.getElementById("allclasses_navbar_bottom");
if(window==top) {
allClassesLink.style.display = "block";
}
else {
allClassesLink.style.display = "none";
}
//-->
</script>
</div>
<div>
<ul class="subNavList">
<li>Summary:&nbsp;</li>
<li>Nested&nbsp;|&nbsp;</li>
<li><a href="#field.summary">Field</a>&nbsp;|&nbsp;</li>
<li>Constr&nbsp;|&nbsp;</li>
<li><a href="#methods.inherited.from.class.java.lang.Object">Method</a></li>
</ul>
<ul class="subNavList">
<li>Detail:&nbsp;</li>
<li><a href="#field.detail">Field</a>&nbsp;|&nbsp;</li>
<li>Constr&nbsp;|&nbsp;</li>
<li>Method</li>
</ul>
</div>
<a name="skip.navbar.bottom">
<!-- -->
</a></div>
<!-- ======== END OF BOTTOM NAVBAR ======= -->
</body>
</html>