<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet type="text/xsl" href="rss.xsl"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>HtmlFlow Blog</title>
        <link>https://htmlflow.org/blog</link>
        <description>HtmlFlow Blog</description>
        <lastBuildDate>Sat, 28 Mar 2026 00:00:00 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>en</language>
        <item>
            <title><![CDATA[Release 5.0.4 - TBody and Tr as valid HtmlPage root elements.]]></title>
            <link>https://htmlflow.org/blog/2026/03/28/Release-5.0.4</link>
            <guid>https://htmlflow.org/blog/2026/03/28/Release-5.0.4</guid>
            <pubDate>Sat, 28 Mar 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Add TBody and Tr as valid HtmlPage root elements for HTML fragments without full HTML structure.]]></description>
            <content:encoded><![CDATA[<p>This release introduces <code>TBody</code> and <code>Tr</code> as valid <code>HtmlPage</code> root elements and adds root builder extensions for <code>tbody</code> and <code>tr</code>, along with comprehensive tests.</p>
<!-- -->
<p>This feature enables the creation of HTML fragments that can be embedded in other HTML documents, such as tables, without requiring a complete HTML structure.</p>]]></content:encoded>
            <category>Release</category>
        </item>
        <item>
            <title><![CDATA[Release 5.0.3 - Upgrade to Kotlin 2 and Span as a valid HtmlPage root element.]]></title>
            <link>https://htmlflow.org/blog/2026/02/09/Release-5.0.3</link>
            <guid>https://htmlflow.org/blog/2026/02/09/Release-5.0.3</guid>
            <pubDate>Mon, 09 Feb 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Upgrade to Kotlin 2.3.10 and add Span as a valid HtmlPage root element with builder extensions.]]></description>
            <content:encoded><![CDATA[<p>This release upgrades Kotlin to version 2.3.10.</p>
<!-- -->
<p>It adds <code>Span</code> as a valid <code>HtmlPage</code> root element and includes root builder extensions for <code>div</code>, <code>tr</code>, and <code>span</code>, along with their corresponding tests.</p>]]></content:encoded>
            <category>Release</category>
        </item>
        <item>
            <title><![CDATA[Release 5.0.2 - Changed boolean attributes behavior and remove kotlin dependency on Java HtmlFlow]]></title>
            <link>https://htmlflow.org/blog/2026/01/13/Release-5.0.2</link>
            <guid>https://htmlflow.org/blog/2026/01/13/Release-5.0.2</guid>
            <pubDate>Tue, 13 Jan 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Upgrade to xsd2poet 1.0.8 with distinct modules for Java and idiomatic Kotlin API. HtmlFlow now free of Kotlin dependencies.]]></description>
            <content:encoded><![CDATA[<p>This release upgrades <code>xsd2poet</code> to 1.0.8, introducing two distinct modules: one for Java and another for the idiomatic Kotlin API.</p>
<!-- -->
<p>HtmlFlow is now free of any Kotlin dependency, and only <code>htmlflow-kotlin</code> requires the Kotlin standard library.</p>
<p>In the new <code>xsd2poet-java</code>, the <code>ElementVisitor</code> no longer includes <code>visitSuspending</code>. The <code>visitSuspending</code> method is now exclusively part of the Kotlin version.</p>
<p>This release also resolves <a href="https://github.com/xmlet/HtmlFlow/issues/136" target="_blank" rel="noopener noreferrer" class="">Issue 136</a>.</p>]]></content:encoded>
            <category>Release</category>
        </item>
        <item>
            <title><![CDATA[Release 5.0.1 - New multi-module architecture]]></title>
            <link>https://htmlflow.org/blog/2025/09/17/Release-5.0.1</link>
            <guid>https://htmlflow.org/blog/2025/09/17/Release-5.0.1</guid>
            <pubDate>Wed, 17 Sep 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[HtmlFlow reorganized into four modules with separate Java and Kotlin APIs. New mfe() builder for dynamic HTML fragments supporting SSR and CSR.]]></description>
            <content:encoded><![CDATA[<p>Starting with version 5, the Java and Kotlin APIs are provided in separate modules.</p>
<p>As a result, the core Java HtmlFlow module no longer depends on the Kotlin coroutines library or <code>jsoup</code> (which is now only required by the reverse-engineering tool Flowifier, moved to its own module).</p>
<!-- -->
<p>HtmlFlow is now organized into four distinct modules:</p>
<ul>
<li class=""><strong>htmlflow-core:</strong> The main library (the <code>htmlflow</code> artifact) containing the Java API.</li>
<li class=""><strong>flowifier:</strong> A reverse-engineering tool for translating HTML documents into equivalent HtmlFlow view definitions.</li>
<li class=""><strong>htmlflow-kotlin:</strong> The idiomatic Kotlin API (which depends on <code>htmlflow-core</code>).</li>
<li class=""><strong>htmlflow-view-loader:</strong> A reflective inspector for HtmlFlow view definitions. It loads Kotlin functions of type <code>T -&gt; String</code> that return rendered HTML.</li>
</ul>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>tip</div><div class="admonitionContent_BuS1"><p>The <code>htmlflow-view-loader</code> module is particularly useful for integrating with web servers like <code>http4k</code>, which treat render engines as <code>T -&gt; String</code> functions.</p></div></div>
<p>Additionally, an <code>mfe()</code> builder has been added to dynamically load HTML fragments, supporting both SSR and CSR approaches within HtmlFlow view definitions.</p>]]></content:encoded>
            <category>Release</category>
        </item>
        <item>
            <title><![CDATA[Release 4.8]]></title>
            <link>https://htmlflow.org/blog/2025/07/12/Release-4.8</link>
            <guid>https://htmlflow.org/blog/2025/07/12/Release-4.8</guid>
            <pubDate>Sat, 12 Jul 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[Removes Guava dependency and introduces ViewFactory.Builder. New Hot view type for http4k integration with hot-reload support.]]></description>
            <content:encoded><![CDATA[<p>This release removes the Guava dependency, previously used only for HTML text
escaping, and replaces it with the original HTML escaping source code.</p>
<!-- -->
<p>It also introduces ViewFactory.Builder, allowing configuration of <code>HtmlView</code>
parameters, such as isIndented, threadSafe and preEncoding.</p>
<p>Finally, it adds a new type of Hot view that recalculates all HTML—including
static HTML blocks— on each rendering, which is useful for http4k integration
with hot-reload support.</p>]]></content:encoded>
            <category>Release</category>
        </item>
        <item>
            <title><![CDATA[Release 4.7]]></title>
            <link>https://htmlflow.org/blog/2025/01/15/Release-4.7</link>
            <guid>https://htmlflow.org/blog/2025/01/15/Release-4.7</guid>
            <pubDate>Wed, 15 Jan 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[Unified API generators replacing ASM-based bytecode generation with source code generation using JavaPoet and KotlinPoet.]]></description>
            <content:encoded><![CDATA[<p>This release addresses two major issues in the underlying infrastructure of
HtmlFlow:</p>
<ol>
<li class="">
<p><strong>Unified API Generators</strong>: Combines two previously separate API
generators—one for Java and another for idiomatic Kotlin builders using
function literals with receivers—into a single unified infrastructure.</p>
</li>
<li class="">
<p><strong>Simplified Manual Integration</strong>: Streamlines the process of merging
manually written builders (e.g., <code>of()</code>, <code>dynamic()</code>, <code>async()</code>,
<code>suspending()</code>, etc.) with automatically generated HTML builders.</p>
</li>
</ol>
<!-- -->
<p>Initially, when we introduced an alternative Kotlin API alongside the existing
Java API, the automatic Kotlin generation mechanism was not integrated into the
existing <code>HtmlApiFaster</code> infrastructure. Instead, as an experimental approach,
we integrated it directly within the HtmlFlow module using <a href="https://square.github.io/kotlinpoet/" target="_blank" rel="noopener noreferrer" class=""><strong>KotlinPoet</strong></a> to
generate Kotlin source code. This was a departure from the previous approach,
which relied on <a href="https://asm.ow2.io/" target="_blank" rel="noopener noreferrer" class=""><strong>ASM</strong></a> (a Java bytecode manipulation library) to generate the
element classes that make up the HtmlFlow Java API.</p>
<p>Additionally, extending the autogenerated <code>Element</code> base interface to include
new dynamic features was cumbersome. The legacy process required manually
merging custom additions after running the automatic generation.</p>
<p>With the introduction of the new <code>xsd2poet</code> dependency, which replaces the
legacy <code>XsdAsmFaster</code> and <code>HtmlApiFaster</code>, we now generate source code instead
of bytecode. Furthermore, we have refactored the backbone of the
<code>org.xmlet.htmlapifaster</code> API to be maintained as source code rather than
dynamically generated classes.</p>
<p>This new approach significantly simplifies the maintenance and enhancement of
HtmlFlow’s custom features.</p>]]></content:encoded>
            <category>Release</category>
            <category>Feature</category>
        </item>
        <item>
            <title><![CDATA[Release 4.6 - Kotlin Extensions with Function Literals with Receiver]]></title>
            <link>https://htmlflow.org/blog/2024/05/21/Release-4.6</link>
            <guid>https://htmlflow.org/blog/2024/05/21/Release-4.6</guid>
            <pubDate>Tue, 21 May 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[All HTML builders available through Kotlin Extensions with function literals with receiver, enabling nested method idiom.]]></description>
            <content:encoded><![CDATA[<p>All HTML builders are now available through Kotlin Extensions with function literals with receiver, enabling both <strong>nested method</strong> and <strong>method chaining</strong> idioms.</p>
<!-- -->
<p>You can write HTML structures in a natural, hierarchical way using nested lambdas, or use method chaining for concise simple sequences:</p>
<div class="theme-tabs-container tabs-container tabList__CuJ"><ul role="tablist" aria-orientation="horizontal" class="tabs"><li role="tab" tabindex="0" aria-selected="true" class="tabs__item tabItem_LNqP tabs__item--active">Nested Method</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_LNqP">Method Chaining</li></ul><div class="margin-top--md"><div role="tabpanel" class="tabItem_Ymn6"><div class="language-kotlin codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)"><div class="codeBlockTitle_OeMC">Nested Method Example</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-kotlin codeBlock_bY9V thin-scrollbar" style="background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="display:block;color:hsl(230, 8%, 24%)"><span class="token plain">body </span><span class="token punctuation" style="color:#40813f">{</span><span class="token plain"></span><br></span><span class="token-line" style="display:block;color:hsl(230, 8%, 24%)"><span class="token plain">    div </span><span class="token punctuation" style="color:#40813f">{</span><span class="token plain"></span><br></span><span class="token-line" style="display:block;color:hsl(230, 8%, 24%)"><span class="token plain">        p </span><span class="token punctuation" style="color:#40813f">{</span><span class="token plain"> </span><br></span><span class="token-line" style="display:block;color:hsl(230, 8%, 24%)"><span class="token plain">            </span><span class="token function" style="color:#3a6ddc">text</span><span class="token punctuation" style="color:#40813f">(</span><span class="token string-literal singleline string" style="color:#40813f">"Hello"</span><span class="token punctuation" style="color:#40813f">)</span><span class="token plain"> </span><br></span><span class="token-line" style="display:block;color:hsl(230, 8%, 24%)"><span class="token plain">        </span><span class="token punctuation" style="color:#40813f">}</span><span class="token plain"></span><br></span><span class="token-line" style="display:block;color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token punctuation" style="color:#40813f">}</span><span class="token plain"></span><br></span><span class="token-line" style="display:block;color:hsl(230, 8%, 24%)"><span class="token plain"></span><span class="token punctuation" style="color:#40813f">}</span><br></span></code></pre></div></div></div><div role="tabpanel" class="tabItem_Ymn6" hidden=""><div class="language-kotlin codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)"><div class="codeBlockTitle_OeMC">Method Chaining Example</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-kotlin codeBlock_bY9V thin-scrollbar" style="background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="display:block;color:hsl(230, 8%, 24%)"><span class="token plain">body</span><span class="token punctuation" style="color:#40813f">.</span><span class="token plain">div</span><span class="token punctuation" style="color:#40813f">.</span><span class="token plain">p</span><span class="token punctuation" style="color:#40813f">.</span><span class="token function" style="color:#3a6ddc">text</span><span class="token punctuation" style="color:#40813f">(</span><span class="token string-literal singleline string" style="color:#40813f">"Hello"</span><span class="token punctuation" style="color:#40813f">)</span><span class="token punctuation" style="color:#40813f">.</span><span class="token plain">l</span><span class="token punctuation" style="color:#40813f">.</span><span class="token plain">l</span><span class="token punctuation" style="color:#40813f">.</span><span class="token plain">l</span><br></span></code></pre></div></div><div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_BuS1"><p>The <code>l</code> builder emits the end tag, allowing fluent construction of HTML elements.</p></div></div></div></div></div>
<p>Both approaches are available depending on your preference - nested lambdas for readability with complex structures, or method chaining for concise simple sequences.</p>]]></content:encoded>
            <category>Release</category>
            <category>Feature</category>
        </item>
        <item>
            <title><![CDATA[Release 4.4 - Kotlin extensions with new raw() method]]></title>
            <link>https://htmlflow.org/blog/2024/01/26/Release-4.4</link>
            <guid>https://htmlflow.org/blog/2024/01/26/Release-4.4</guid>
            <pubDate>Fri, 26 Jan 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[Kotlin Extensions with dyn lambda. New raw() to avoid HTML escaping. Factory methods view() and viewAsync() enhancements.]]></description>
            <content:encoded><![CDATA[<ul>
<li class="">
<p>Kotlin Extensions - new <code>dyn { }</code> lambda with parent Element as receiver to allow the use of implicit <code>this</code>. </p>
</li>
<li class="">
<p>New extensions on factory methods <code>view()</code> and <code>viewAsync()</code> to discard parameter <code>page</code> and allow start building on implicit this.</p>
</li>
<li class="">
<p>Upgrade to HtmlApiFaster 1.0.16 with new <code>raw()</code> to distinguish from <code>text()</code>. While the text visitor should escape HTML the raw should keep text as it is.</p>
</li>
</ul>]]></content:encoded>
            <category>Release</category>
            <category>Feature</category>
        </item>
        <item>
            <title><![CDATA[Release 4.3 - Kotlin extensions and support for suspending continuations]]></title>
            <link>https://htmlflow.org/blog/2024/01/12/Release-4.3</link>
            <guid>https://htmlflow.org/blog/2024/01/12/Release-4.3</guid>
            <pubDate>Fri, 12 Jan 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[Kotlin extensions with suspending() for suspendable continuations. Property .l to close tags. Solved Issue 105.]]></description>
            <content:encoded><![CDATA[<p>This release introduces the following new features and fixes:</p>
<ul>
<li class="">Added Kotlin extensions, such as the <code>.l</code> property, which can be used to close tags in Kotlin instead of <code>.__()</code>. </li>
<li class="">Introduced a new <code>.suspending()</code> builder to support the use of continuations in Kotlin, allowing suspending functions to use <code>await</code>.</li>
<li class="">Resolved <a href="https://github.com/xmlet/HtmlFlow/issues/105" target="_blank" rel="noopener noreferrer" class="">Issue 105</a> by integrating new attributes in <code>globalEventAttributes</code>, included with the release of <code>HtmlApiFaster</code> 1.0.15.</li>
<li class="">Added new unit tests verifying multi-threaded scenarios.</li>
<li class="">Updated the documentation to detail <code>setIndentation()</code> usage and the correct application of <code>threadSafe()</code>.</li>
</ul>]]></content:encoded>
            <category>Release</category>
            <category>Feature</category>
        </item>
        <item>
            <title><![CDATA[Release 4.2 Fixes on disabling indentation and interleaving text with attributes]]></title>
            <link>https://htmlflow.org/blog/2023/12/27/Release-4.2</link>
            <guid>https://htmlflow.org/blog/2023/12/27/Release-4.2</guid>
            <pubDate>Wed, 27 Dec 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[Solved issues when text() is interleaved with attributes and newlines in script blocks. Improved documentation and made HtmlView strongly typed.]]></description>
            <content:encoded><![CDATA[<p>This release includes the following fixes and updates:</p>
<ul>
<li class="">Resolved <a href="https://github.com/xmlet/HtmlFlow/issues/103" target="_blank" rel="noopener noreferrer" class="">Issue 103</a>. Using <code>.text()</code> interleaved with attributes is no longer supported and will now throw an exception. </li>
<li class="">Resolved <a href="https://github.com/xmlet/HtmlFlow/issues/104" target="_blank" rel="noopener noreferrer" class="">Issue 104</a>. Disabling indentation incorrectly removed newlines inside text and script blocks. This has been corrected.</li>
<li class="">Enhanced the documentation with additional examples of data binding, conditionals (if/else), and loops.</li>
<li class=""><code>HtmlView</code> is now strongly typed with the type <code>M</code> corresponding to the model.</li>
</ul>]]></content:encoded>
            <category>Release</category>
        </item>
        <item>
            <title><![CDATA[Release 4.1 Minor enhancements]]></title>
            <link>https://htmlflow.org/blog/2023/10/27/Release-4.1</link>
            <guid>https://htmlflow.org/blog/2023/10/27/Release-4.1</guid>
            <pubDate>Fri, 27 Oct 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[Do not emit HTML boolean attributes with false values. Update Script tag with new types. HtmlViewAsync support for thread unsafe views.]]></description>
            <content:encoded><![CDATA[<p>This release introduces the following enhancements:</p>
<ul>
<li class="">HTML boolean attributes are no longer emitted when assigned a <code>false</code> value. </li>
<li class="">Added new types for the <code>Script</code> tag, including <code>module</code> and <code>importmap</code>.</li>
<li class=""><code>HtmlViewAsync</code> now supports thread-unsafe views, allowing sequential execution even if asynchronous relative to the data model.</li>
</ul>]]></content:encoded>
            <category>Release</category>
        </item>
        <item>
            <title><![CDATA[Release 4.0 Support for Asynchronous Models]]></title>
            <link>https://htmlflow.org/blog/2023/01/31/Release-4.0</link>
            <guid>https://htmlflow.org/blog/2023/01/31/Release-4.0</guid>
            <pubDate>Tue, 31 Jan 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[New HtmlViewAsync with renderAsync() and writeAsync() returning CompletableFuture. New builder await() and strongly typed dynamic views.]]></description>
            <content:encoded><![CDATA[<p>This release introduces the following changes when migrating from HtmlFlow 3.x to 4.x:</p>
<ul>
<li class=""><code>DynamicHtml</code> and <code>StaticHtml</code> are replaced by <code>HtmlView</code> and <code>HtmlDoc</code>, respectively. Both inherit from the new <code>HtmlPage</code> type.</li>
<li class="">The factory methods <code>DynamicHtml.view()</code> and <code>StaticHtml.view()</code> have been moved to the <code>HtmlFlow</code> class, becoming <code>HtmlFlow.view()</code> and <code>HtmlFlow.doc()</code>. </li>
<li class="">The <code>HtmlWriter</code> interface, which previously defined standard methods (<code>write</code> and <code>render</code>) for all HTML pages, has been removed. With the dynamic nature of <code>HtmlView</code> (formerly <code>DynamicHtml</code>), <code>render(model)</code> and <code>write(model)</code> now require a model argument. These methods are not applicable to <code>HtmlDoc</code> (formerly <code>StaticHtml</code>), leading to the removal of <code>HtmlWriter</code>. The base class <code>HtmlPage</code> no longer defines write or render methods.</li>
<li class=""><code>HtmlPage</code>, <code>HtmlView</code>, and <code>HtmlDoc</code> are no longer parameterized with the model type. The model is now parameterized only when using the builder <code>&lt;M&gt; dynamic(BiConsumer&lt;E, M&gt; consumer)</code>, where <code>E</code> is the parent HTML element and <code>M</code> is the model type.</li>
<li class="">The model object is now passed directly as a parameter to the consumer of a dynamic block (e.g., calling <code>.dynamic((elem, model) -&gt; ...)</code>), eliminating the need for closures to capture the model object.</li>
</ul>
<p>For example, the dynamic blocks approach has been simplified:</p>
<div class="theme-tabs-container tabs-container tabList__CuJ"><ul role="tablist" aria-orientation="horizontal" class="tabs"><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_LNqP">HtmlFlow 3.x API</li><li role="tab" tabindex="0" aria-selected="true" class="tabs__item tabItem_LNqP tabs__item--active">HtmlFlow 4.x API</li></ul><div class="margin-top--md"><div role="tabpanel" class="tabItem_Ymn6" hidden=""><div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)"><div class="codeBlockTitle_OeMC">Previous 3.x approach</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar" style="background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="display:block;color:hsl(230, 8%, 24%)"><span class="token keyword" style="color:hsl(301, 63%, 40%)">public</span><span class="token plain"> </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">void</span><span class="token plain"> </span><span class="token function" style="color:#3a6ddc">template</span><span class="token punctuation" style="color:#40813f">(</span><span class="token class-name" style="color:#a86201">DynamicHtml</span><span class="token generics punctuation" style="color:#40813f">&lt;</span><span class="token generics class-name" style="color:#a86201">Pet</span><span class="token generics punctuation" style="color:#40813f">&gt;</span><span class="token plain"> view</span><span class="token punctuation" style="color:#40813f">,</span><span class="token plain"> </span><span class="token class-name" style="color:#a86201">Pet</span><span class="token plain"> pet</span><span class="token punctuation" style="color:#40813f">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#40813f">{</span><span class="token plain"></span><br></span><span class="token-line" style="display:block;color:hsl(230, 8%, 24%)"><span class="token plain">    view</span><span class="token punctuation" style="color:#40813f">.</span><span class="token function" style="color:#3a6ddc">div</span><span class="token punctuation" style="color:#40813f">(</span><span class="token punctuation" style="color:#40813f">)</span><span class="token punctuation" style="color:#40813f">.</span><span class="token function" style="color:#3a6ddc">h2</span><span class="token punctuation" style="color:#40813f">(</span><span class="token punctuation" style="color:#40813f">)</span><span class="token punctuation" style="color:#40813f">.</span><span class="token function" style="color:#3a6ddc">dynamic</span><span class="token punctuation" style="color:#40813f">(</span><span class="token plain">h2 </span><span class="token operator" style="color:#3a6ddc">-&gt;</span><span class="token plain"> pet</span><span class="token punctuation" style="color:#40813f">.</span><span class="token function" style="color:#3a6ddc">getName</span><span class="token punctuation" style="color:#40813f">(</span><span class="token punctuation" style="color:#40813f">)</span><span class="token punctuation" style="color:#40813f">)</span><span class="token punctuation" style="color:#40813f">.</span><span class="token punctuation" style="color:#40813f">.</span><span class="token punctuation" style="color:#40813f">.</span><span class="token punctuation" style="color:#40813f">.</span><span class="token punctuation" style="color:#40813f">.</span><span class="token plain"></span><br></span><span class="token-line" style="display:block;color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token punctuation" style="color:#40813f">.</span><span class="token punctuation" style="color:#40813f">.</span><span class="token punctuation" style="color:#40813f">.</span><br></span></code></pre></div></div></div><div role="tabpanel" class="tabItem_Ymn6"><div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)"><div class="codeBlockTitle_OeMC">New 4.x approach</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar" style="background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="display:block;color:hsl(230, 8%, 24%)"><span class="token keyword" style="color:hsl(301, 63%, 40%)">public</span><span class="token plain"> </span><span class="token keyword" style="color:hsl(301, 63%, 40%)">void</span><span class="token plain"> </span><span class="token function" style="color:#3a6ddc">template</span><span class="token punctuation" style="color:#40813f">(</span><span class="token class-name" style="color:#a86201">HtmlPage</span><span class="token plain"> view</span><span class="token punctuation" style="color:#40813f">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#40813f">{</span><span class="token plain"></span><br></span><span class="token-line" style="display:block;color:hsl(230, 8%, 24%)"><span class="token plain">    view</span><span class="token punctuation" style="color:#40813f">.</span><span class="token function" style="color:#3a6ddc">div</span><span class="token punctuation" style="color:#40813f">(</span><span class="token punctuation" style="color:#40813f">)</span><span class="token punctuation" style="color:#40813f">.</span><span class="token function" style="color:#3a6ddc">h2</span><span class="token punctuation" style="color:#40813f">(</span><span class="token punctuation" style="color:#40813f">)</span><span class="token punctuation" style="color:#40813f">.</span><span class="token generics punctuation" style="color:#40813f">&lt;</span><span class="token generics class-name" style="color:#a86201">Pet</span><span class="token generics punctuation" style="color:#40813f">&gt;</span><span class="token function" style="color:#3a6ddc">dynamic</span><span class="token punctuation" style="color:#40813f">(</span><span class="token punctuation" style="color:#40813f">(</span><span class="token plain">h2</span><span class="token punctuation" style="color:#40813f">,</span><span class="token plain"> pet</span><span class="token punctuation" style="color:#40813f">)</span><span class="token plain"> </span><span class="token operator" style="color:#3a6ddc">-&gt;</span><span class="token plain"> pet</span><span class="token punctuation" style="color:#40813f">.</span><span class="token function" style="color:#3a6ddc">getName</span><span class="token punctuation" style="color:#40813f">(</span><span class="token punctuation" style="color:#40813f">)</span><span class="token punctuation" style="color:#40813f">)</span><span class="token punctuation" style="color:#40813f">.</span><span class="token punctuation" style="color:#40813f">.</span><span class="token punctuation" style="color:#40813f">.</span><span class="token punctuation" style="color:#40813f">.</span><span class="token punctuation" style="color:#40813f">.</span><span class="token plain"></span><br></span><span class="token-line" style="display:block;color:hsl(230, 8%, 24%)"><span class="token plain">    </span><span class="token punctuation" style="color:#40813f">.</span><span class="token punctuation" style="color:#40813f">.</span><span class="token punctuation" style="color:#40813f">.</span><br></span></code></pre></div></div></div></div></div>
<ul>
<li class="">Partials are now the only place where closures can capture a model object of a different type than the enclosing template. When doing so, you must use a <code>dynamic()</code> block to prevent the partial from being stored as static HTML and ensure it renders whenever called with a model. If the partial uses the same model as its container, avoid the closure and instead use the model provided to the <code>dynamic(cons)</code> builder.</li>
<li class="">The <code>addPartial()</code> builder has been removed. A partial is now simply a consumer function of an HTML element (<code>Consumer&lt;E extends Element&gt;</code>). You can combine partials using higher-order function composition. The element serves as the parent HTML where HtmlFlow continues to emit code. Additional arguments corresponding to context models can also be passed to partial views.</li>
</ul>]]></content:encoded>
            <category>Release</category>
            <category>Feature</category>
        </item>
        <item>
            <title><![CDATA[Release 3.9 Support for Custom Elements]]></title>
            <link>https://htmlflow.org/blog/2022/01/30/Release-3.9</link>
            <guid>https://htmlflow.org/blog/2022/01/30/Release-3.9</guid>
            <pubDate>Sun, 30 Jan 2022 00:00:00 GMT</pubDate>
            <description><![CDATA[New custom element feature that allows defining HtmlFlow views. Invoking .custom('alert-info') returns an instance of the new CustomElement class that inherits from the existing Div class.]]></description>
            <content:encoded><![CDATA[<p>A new custom element feature allows defining HtmlFlow views, as shown in the listing at the end of this post. This feature applies to both static and dynamic views.</p>
<p>You can find this sample in the unit tests at <a href="https://github.com/xmlet/HtmlFlow/blob/master/src/test/java/htmlflow/test/views/HtmlCustomElements.java" target="_blank" rel="noopener noreferrer" class="">htmlflow.test.views.HtmlCustomElements</a>.</p>
<p>Invoking <code>.custom("alert-info")</code> returns an instance of the new <code>CustomElement</code> class, which inherits from the existing <code>Div</code> class. As a result, the returned instance has most HTML features available.</p>
<!-- -->
<p>Example usage:</p>
<div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:hsl(230, 1%, 98%);--prism-color:hsl(230, 8%, 24%)"><div class="codeBlockTitle_OeMC">CustomElement Example</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar" style="background-color:hsl(230, 1%, 98%);color:hsl(230, 8%, 24%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="display:block;color:hsl(230, 8%, 24%)"><span class="token class-name" style="color:#a86201">StaticHtml</span><span class="token plain"></span><br></span><span class="token-line" style="display:block;color:hsl(230, 8%, 24%)"><span class="token plain">  </span><span class="token punctuation" style="color:#40813f">.</span><span class="token function" style="color:#3a6ddc">view</span><span class="token punctuation" style="color:#40813f">(</span><span class="token punctuation" style="color:#40813f">)</span><span class="token plain"></span><br></span><span class="token-line" style="display:block;color:hsl(230, 8%, 24%)"><span class="token plain">      </span><span class="token punctuation" style="color:#40813f">.</span><span class="token function" style="color:#3a6ddc">html</span><span class="token punctuation" style="color:#40813f">(</span><span class="token punctuation" style="color:#40813f">)</span><span class="token plain"></span><br></span><span class="token-line" style="display:block;color:hsl(230, 8%, 24%)"><span class="token plain">          </span><span class="token punctuation" style="color:#40813f">.</span><span class="token function" style="color:#3a6ddc">head</span><span class="token punctuation" style="color:#40813f">(</span><span class="token punctuation" style="color:#40813f">)</span><span class="token plain"></span><br></span><span class="token-line" style="display:block;color:hsl(230, 8%, 24%)"><span class="token plain">              </span><span class="token punctuation" style="color:#40813f">.</span><span class="token function" style="color:#3a6ddc">script</span><span class="token punctuation" style="color:#40813f">(</span><span class="token punctuation" style="color:#40813f">)</span><span class="token plain"></span><br></span><span class="token-line" style="display:block;color:hsl(230, 8%, 24%)"><span class="token plain">                  </span><span class="token punctuation" style="color:#40813f">.</span><span class="token function" style="color:#3a6ddc">attrSrc</span><span class="token punctuation" style="color:#40813f">(</span><span class="token string" style="color:#40813f">"alert.js"</span><span class="token punctuation" style="color:#40813f">)</span><span class="token plain"></span><br></span><span class="token-line" style="display:block;color:hsl(230, 8%, 24%)"><span class="token plain">                  </span><span class="token punctuation" style="color:#40813f">.</span><span class="token function" style="color:#3a6ddc">attrDefer</span><span class="token punctuation" style="color:#40813f">(</span><span class="token boolean" style="color:#a86201">true</span><span class="token punctuation" style="color:#40813f">)</span><span class="token plain"></span><br></span><span class="token-line" style="display:block;color:hsl(230, 8%, 24%)"><span class="token plain">              </span><span class="token punctuation" style="color:#40813f">.</span><span class="token function" style="color:#3a6ddc">__</span><span class="token punctuation" style="color:#40813f">(</span><span class="token punctuation" style="color:#40813f">)</span><span class="token plain"></span><br></span><span class="token-line" style="display:block;color:hsl(230, 8%, 24%)"><span class="token plain">          </span><span class="token punctuation" style="color:#40813f">.</span><span class="token function" style="color:#3a6ddc">__</span><span class="token punctuation" style="color:#40813f">(</span><span class="token punctuation" style="color:#40813f">)</span><span class="token plain"></span><br></span><span class="token-line" style="display:block;color:hsl(230, 8%, 24%)"><span class="token plain">          </span><span class="token punctuation" style="color:#40813f">.</span><span class="token function" style="color:#3a6ddc">body</span><span class="token punctuation" style="color:#40813f">(</span><span class="token punctuation" style="color:#40813f">)</span><span class="token plain"></span><br></span><span class="token-line" style="display:block;color:hsl(230, 8%, 24%)"><span class="token plain">              </span><span class="token punctuation" style="color:#40813f">.</span><span class="token function" style="color:#3a6ddc">div</span><span class="token punctuation" style="color:#40813f">(</span><span class="token punctuation" style="color:#40813f">)</span><span class="token plain"></span><br></span><span class="token-line" style="display:block;color:hsl(230, 8%, 24%)"><span class="token plain">                  </span><span class="token punctuation" style="color:#40813f">.</span><span class="token function" style="color:#3a6ddc">attrClass</span><span class="token punctuation" style="color:#40813f">(</span><span class="token string" style="color:#40813f">"container"</span><span class="token punctuation" style="color:#40813f">)</span><span class="token plain"></span><br></span><span class="token-line" style="display:block;color:hsl(230, 8%, 24%)"><span class="token plain">                  </span><span class="token punctuation" style="color:#40813f">.</span><span class="token function" style="color:#3a6ddc">p</span><span class="token punctuation" style="color:#40813f">(</span><span class="token punctuation" style="color:#40813f">)</span><span class="token punctuation" style="color:#40813f">.</span><span class="token function" style="color:#3a6ddc">text</span><span class="token punctuation" style="color:#40813f">(</span><span class="token string" style="color:#40813f">"Testing custom elements!"</span><span class="token punctuation" style="color:#40813f">)</span><span class="token punctuation" style="color:#40813f">.</span><span class="token function" style="color:#3a6ddc">__</span><span class="token punctuation" style="color:#40813f">(</span><span class="token punctuation" style="color:#40813f">)</span><span class="token plain"></span><br></span><span class="token-line" style="display:block;color:hsl(230, 8%, 24%)"><span class="token plain">                  </span><span class="token punctuation" style="color:#40813f">.</span><span class="token function" style="color:#3a6ddc">custom</span><span class="token punctuation" style="color:#40813f">(</span><span class="token string" style="color:#40813f">"alert-info"</span><span class="token punctuation" style="color:#40813f">)</span><span class="token plain"></span><br></span><span class="token-line" style="display:block;color:hsl(230, 8%, 24%)"><span class="token plain">                      </span><span class="token punctuation" style="color:#40813f">.</span><span class="token function" style="color:#3a6ddc">addAttr</span><span class="token punctuation" style="color:#40813f">(</span><span class="token string" style="color:#40813f">"title"</span><span class="token punctuation" style="color:#40813f">,</span><span class="token plain"> </span><span class="token string" style="color:#40813f">"Information"</span><span class="token punctuation" style="color:#40813f">)</span><span class="token plain"></span><br></span><span class="token-line" style="display:block;color:hsl(230, 8%, 24%)"><span class="token plain">                      </span><span class="token punctuation" style="color:#40813f">.</span><span class="token function" style="color:#3a6ddc">addAttr</span><span class="token punctuation" style="color:#40813f">(</span><span class="token string" style="color:#40813f">"message"</span><span class="token punctuation" style="color:#40813f">,</span><span class="token plain"> </span><span class="token string" style="color:#40813f">"This is a message for a custom element"</span><span class="token punctuation" style="color:#40813f">)</span><span class="token plain"></span><br></span><span class="token-line" style="display:block;color:hsl(230, 8%, 24%)"><span class="token plain">                      </span><span class="token punctuation" style="color:#40813f">.</span><span class="token function" style="color:#3a6ddc">addAttr</span><span class="token punctuation" style="color:#40813f">(</span><span class="token string" style="color:#40813f">"kind"</span><span class="token punctuation" style="color:#40813f">,</span><span class="token plain"> </span><span class="token string" style="color:#40813f">"success"</span><span class="token punctuation" style="color:#40813f">)</span><span class="token plain"></span><br></span><span class="token-line" style="display:block;color:hsl(230, 8%, 24%)"><span class="token plain">                      </span><span class="token punctuation" style="color:#40813f">.</span><span class="token function" style="color:#3a6ddc">ul</span><span class="token punctuation" style="color:#40813f">(</span><span class="token punctuation" style="color:#40813f">)</span><span class="token plain"></span><br></span><span class="token-line" style="display:block;color:hsl(230, 8%, 24%)"><span class="token plain">                          </span><span class="token punctuation" style="color:#40813f">.</span><span class="token function" style="color:#3a6ddc">li</span><span class="token punctuation" style="color:#40813f">(</span><span class="token punctuation" style="color:#40813f">)</span><span class="token punctuation" style="color:#40813f">.</span><span class="token function" style="color:#3a6ddc">text</span><span class="token punctuation" style="color:#40813f">(</span><span class="token string" style="color:#40813f">"For any reason we could even include other elements."</span><span class="token punctuation" style="color:#40813f">)</span><span class="token punctuation" style="color:#40813f">.</span><span class="token function" style="color:#3a6ddc">__</span><span class="token punctuation" style="color:#40813f">(</span><span class="token punctuation" style="color:#40813f">)</span><span class="token plain"></span><br></span><span class="token-line" style="display:block;color:hsl(230, 8%, 24%)"><span class="token plain">                      </span><span class="token punctuation" style="color:#40813f">.</span><span class="token function" style="color:#3a6ddc">__</span><span class="token punctuation" style="color:#40813f">(</span><span class="token punctuation" style="color:#40813f">)</span><span class="token plain"></span><br></span><span class="token-line" style="display:block;color:hsl(230, 8%, 24%)"><span class="token plain">                  </span><span class="token punctuation" style="color:#40813f">.</span><span class="token function" style="color:#3a6ddc">__</span><span class="token punctuation" style="color:#40813f">(</span><span class="token punctuation" style="color:#40813f">)</span><span class="token plain"></span><br></span><span class="token-line" style="display:block;color:hsl(230, 8%, 24%)"><span class="token plain">              </span><span class="token punctuation" style="color:#40813f">.</span><span class="token function" style="color:#3a6ddc">__</span><span class="token punctuation" style="color:#40813f">(</span><span class="token punctuation" style="color:#40813f">)</span><span class="token plain"></span><br></span><span class="token-line" style="display:block;color:hsl(230, 8%, 24%)"><span class="token plain">          </span><span class="token punctuation" style="color:#40813f">.</span><span class="token function" style="color:#3a6ddc">__</span><span class="token punctuation" style="color:#40813f">(</span><span class="token punctuation" style="color:#40813f">)</span><span class="token plain"></span><br></span><span class="token-line" style="display:block;color:hsl(230, 8%, 24%)"><span class="token plain">      </span><span class="token punctuation" style="color:#40813f">.</span><span class="token function" style="color:#3a6ddc">__</span><span class="token punctuation" style="color:#40813f">(</span><span class="token punctuation" style="color:#40813f">)</span><span class="token punctuation" style="color:#40813f">;</span><br></span></code></pre></div></div>]]></content:encoded>
            <category>Release</category>
            <category>Feature</category>
        </item>
        <item>
            <title><![CDATA[Release 3.7]]></title>
            <link>https://htmlflow.org/blog/2021/04/07/Release-3.7</link>
            <guid>https://htmlflow.org/blog/2021/04/07/Release-3.7</guid>
            <pubDate>Wed, 07 Apr 2021 00:00:00 GMT</pubDate>
            <description><![CDATA[Implicit PrintStream usage in addPartial() when parent template is initialized with a PrintStream.]]></description>
            <content:encoded><![CDATA[<p>When a parent template is initialized with a <code>PrintStream</code>, any internal use of <code>addPartial()</code> will now implicitly use that <code>PrintStream</code>, regardless of the output approach defined during the partial view's instantiation.</p>
<!-- -->
<p>This feature introduces a couple of new internal methods, including <code>newby()</code> in <code>HtmlVisitor</code>, which creates a new instance of the same type while preserving indentation.</p>
<p>Resolves <a href="https://github.com/xmlet/HtmlFlow/pull/75" target="_blank" rel="noopener noreferrer" class="">Pull Request 75</a>.</p>]]></content:encoded>
            <category>Release</category>
        </item>
        <item>
            <title><![CDATA[Release 3.6]]></title>
            <link>https://htmlflow.org/blog/2020/11/10/Release-3.6</link>
            <guid>https://htmlflow.org/blog/2020/11/10/Release-3.6</guid>
            <pubDate>Tue, 10 Nov 2020 00:00:00 GMT</pubDate>
            <description><![CDATA[Fixed code smells related to Generics and updated JUnit to address a reported vulnerability.]]></description>
            <content:encoded><![CDATA[<p>Fixed code smells related to Generics and other use cases.</p>
<!-- -->
<p>Updated the JUnit release to address a reported vulnerability. For details, see <a href="https://github.com/xmlet/HtmlFlow/pull/68" target="_blank" rel="noopener noreferrer" class="">Pull Request 68</a>.</p>]]></content:encoded>
            <category>Release</category>
        </item>
        <item>
            <title><![CDATA[Spring-based pet clinic app with HtmlFlow views]]></title>
            <link>https://htmlflow.org/blog/2020/01/23/spring-petclinic-with-htmlflow</link>
            <guid>https://htmlflow.org/blog/2020/01/23/spring-petclinic-with-htmlflow</guid>
            <pubDate>Thu, 23 Jan 2020 00:00:00 GMT</pubDate>
            <description><![CDATA[spring-petclinic implementation of the sample Spring-based pet clinic web application integrated with HtmlFlow views, replacing Thymeleaf template engine.]]></description>
            <content:encoded><![CDATA[<p>We have provided a standard implementation of the sample Spring-based pet clinic web application integrated with HtmlFlow views at <a href="https://github.com/xmlet/spring-petclinic" target="_blank" rel="noopener noreferrer" class="">github.com/xmlet/spring-petclinic</a>.</p>
<!-- -->
<div class="theme-admonition theme-admonition-info admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>info</div><div class="admonitionContent_BuS1"><p>In this implementation, the Thymeleaf template engine has been replaced with HtmlFlow.</p></div></div>
<p>The project defines templates as first-class functions, leveraging Java language features while removing auxiliary Spring infrastructure components like <code>ModelAndView</code> and <code>ViewResolver</code>. Consequently, validations regarding these mechanics have been removed from the unit tests.</p>]]></content:encoded>
            <category>Tutorial</category>
        </item>
        <item>
            <title><![CDATA[Release 3.5]]></title>
            <link>https://htmlflow.org/blog/2020/01/13/Release-3.5</link>
            <guid>https://htmlflow.org/blog/2020/01/13/Release-3.5</guid>
            <pubDate>Mon, 13 Jan 2020 00:00:00 GMT</pubDate>
            <description><![CDATA[Downgraded to target Java runtime 1.8 for compatibility with more applications.]]></description>
            <content:encoded><![CDATA[<p>The target Java runtime has been downgraded to 1.8.</p>
<!-- -->
<p>This change improves compatibility with applications such as <a href="https://github.com/jreijn/spring-comparing-template-engines" target="_blank" rel="noopener noreferrer" class="">spring-comparing-template-engines</a> that do not support higher Java versions.</p>]]></content:encoded>
            <category>Release</category>
        </item>
        <item>
            <title><![CDATA[Release 3.4]]></title>
            <link>https://htmlflow.org/blog/2019/12/18/Release-3.4</link>
            <guid>https://htmlflow.org/blog/2019/12/18/Release-3.4</guid>
            <pubDate>Wed, 18 Dec 2019 00:00:00 GMT</pubDate>
            <description><![CDATA[First release of Flowifier, an HTML to HtmlFlow translator.]]></description>
            <content:encoded><![CDATA[<p>This version introduces the first release of Flowifier, an HTML to HtmlFlow translator developed by Julien Gouesse.</p>
<!-- -->
<p>Resolves <a href="https://github.com/xmlet/HtmlFlow/issues/43" target="_blank" rel="noopener noreferrer" class="">Issue 43</a>.</p>]]></content:encoded>
            <category>Release</category>
        </item>
        <item>
            <title><![CDATA[Release 3.3]]></title>
            <link>https://htmlflow.org/blog/2019/08/01/Release-3.3</link>
            <guid>https://htmlflow.org/blog/2019/08/01/Release-3.3</guid>
            <pubDate>Thu, 01 Aug 2019 00:00:00 GMT</pubDate>
            <description><![CDATA[Upgrade to Java 11. New HtmlPartials class with sample use cases. Support to disable indentation of HTML output.]]></description>
            <content:encoded><![CDATA[<p>This release introduces the following changes:</p>
<!-- -->
<ul>
<li class="">Upgraded to Java 11.</li>
<li class="">Upgraded to <code>HtmlApiFasterApi</code> version 1.7.</li>
<li class="">Added a <code>HtmlPartials</code> class in the unit tests project with sample use cases.</li>
<li class="">Disabled the use of chained calls to <code>dynamic()</code> to prevent unexpected cache behavior.</li>
<li class="">Added support to disable HTML output indentation via the <code>setIndented(boolean)</code> setter on <code>HtmlView</code> and the corresponding property in <code>HtmlVisitorCache</code>.</li>
<li class="">Fixed support for <code>pre</code> elements in <code>body</code> as described in issue <a href="https://github.com/xmlet/HtmlFlow/issues/46" target="_blank" rel="noopener noreferrer" class="">#46</a>, including the ability to disable pretty print HTML indentation.</li>
</ul>]]></content:encoded>
            <category>Release</category>
        </item>
        <item>
            <title><![CDATA[Release 3.2]]></title>
            <link>https://htmlflow.org/blog/2018/11/21/Release-3.2</link>
            <guid>https://htmlflow.org/blog/2018/11/21/Release-3.2</guid>
            <pubDate>Wed, 21 Nov 2018 00:00:00 GMT</pubDate>
            <description><![CDATA[View immutability.]]></description>
            <content:encoded><![CDATA[<p>Views are now made immutable.</p>
]]></content:encoded>
            <category>Release</category>
        </item>
    </channel>
</rss>