Current section
Files
Jump to
Current section
Files
doc/readme.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta http-equiv="x-ua-compatible" content="ie=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="generator" content="ExDoc v0.28.5">
<meta name="project" content="erlte v0.1.0">
<title>Overview — erlte v0.1.0</title>
<link rel="stylesheet" href="dist/erlang-6d8ac4aa7a70488ac182.css" />
<script src="dist/sidebar_items-c34faccec3.js"></script>
<script src="docs_config.js"></script>
<script async src="dist/app-b5f3440501744dc8be3d.js"></script>
</head>
<body data-type="extras">
<script>
try {
var settings = JSON.parse(localStorage.getItem('ex_doc:settings') || '{}');
if (settings.theme === 'dark' ||
((settings.theme === 'system' || settings.theme == null) &&
window.matchMedia('(prefers-color-scheme: dark)').matches)
) {
document.body.classList.add('dark')
}
} catch (error) { }
</script>
<div class="main">
<section class="sidebar">
<button class="sidebar-button sidebar-toggle" aria-label="toggle sidebar">
<i class="ri-menu-line ri-lg" title="Collapse/expand sidebar"></i>
</button>
<form class="sidebar-search" action="search.html">
<button type="submit" class="search-button" aria-label="Submit Search">
<i class="ri-search-2-line" aria-hidden="true" title="Submit search"></i>
</button>
<button type="button" tabindex="-1" class="search-close-button" aria-label="Cancel Search">
<i class="ri-close-line ri-lg" aria-hidden="true" title="Cancel search"></i>
</button>
<label class="search-label">
<p class="sr-only">Search</p>
<input name="q" type="text" class="search-input" placeholder="Search..." aria-label="Input your search terms" autocomplete="off" />
</label>
</form>
<div class="autocomplete">
<div class="autocomplete-results">
</div>
</div>
<div class="sidebar-header">
<div class="sidebar-projectDetails">
<a href="https://github.com/ergenius/erlte" class="sidebar-projectName" translate="no">
erlte
</a>
<strong class="sidebar-projectVersion" translate="no">
v0.1.0
</strong>
</div>
<ul class="sidebar-listNav">
<li><a id="extras-list-link" href="#full-list">Pages</a></li>
<li><a id="modules-list-link" href="#full-list">Modules</a></li>
</ul>
</div>
<div class="gradient"></div>
<ul id="full-list" class="sidebar-fullList"></ul>
</section>
<section class="content">
<output role="status" id="toast"></output>
<div class="content-outer">
<div id="content" class="content-inner">
<h1>
<button class="settings display-settings">
<i class="ri-settings-3-line"></i>
<span class="sr-only">Settings</span>
</button>
<a href="https://github.com/ergenius/erlte/blob/v0.1.0/README.md#L1" title="View Source" class="view-source" rel="help">
<i class="ri-code-s-slash-line" aria-hidden="true"></i>
<span class="sr-only">View Source</span>
</a>
<span>erlte - ERLang TEmplate library</span>
</h1>
<p>Fast Erlang template library with bundling support for HTML, JavaScript and CSS files.</p><p><a href="https://github.com/ergenius/erlte/actions/workflows/erlang.yml"><img src="https://github.com/ergenius/erlte/actions/workflows/erlang.yml/badge.svg" alt="Erlang CI"/></a></p><h2 id="motivation" class="section-heading">
<a href="#motivation" class="hover-link"><i class="ri-link-m" aria-hidden="true"></i>
<p class="sr-only">motivation</p>
</a>
Motivation
</h2>
<p>The need for erlte arose while using good old sgte in various web applications. I was quite happy with the simplicity of sgte for many years, but concerned about the rendering speed. When I finally replaced sgte with my new shiny library, I could see around 5x times faster rendering speed!</p><h2 id="features" class="section-heading">
<a href="#features" class="hover-link"><i class="ri-link-m" aria-hidden="true"></i>
<p class="sr-only">features</p>
</a>
Features
</h2>
<ul><li>Fast rendering.</li><li>Simple. Reading this file should be enough for understanding most use case scenarios.</li><li>Supports replacing blocks of delimited code with your own values both at compilation or rendering time (variables).</li><li>Supports escaping HTML variables. I wouldn't call that 'secure', but it's better than nothing.</li><li>Supports bundling HTML files using custom HTML elements.</li><li>Supports bundling JavaScript files using native JavaScript side effect static import declarations.</li><li>Supports bundling CSS files using CSS @import rules for strings.</li><li>Supports writing and reading compiled templates.</li><li>Templates default variables delimiters are friendly with most HTML, CSS or JavaScript editors and browsers.</li><li>Can also be used with strings or binaries instead of files.</li></ul><h2 id="limitations" class="section-heading">
<a href="#limitations" class="hover-link"><i class="ri-link-m" aria-hidden="true"></i>
<p class="sr-only">limitations</p>
</a>
Limitations
</h2>
<ul><li>Only JavaScript static import declarations are supported.</li><li>CSS @import rules work fine only with file strings (no list of media queries or url are supported).</li><li>erlte "compiler" is far away from a full HTML/JS/CSS parser. It behaves well for most scenarios, but some corner cases may exist. As long as you use single line imports and you don't nest unescaped comments or imports in strings, you should be fine.</li><li>erlte does not support any conditionals or pseudocode and will probably never do. For some, this is a limitation, for me, it's a feature. The price of implementing this will be a much slower rendering speed. I also don't like polluting my HTML templates with spaghetti code. We have JavaScript for that.</li></ul><h2 id="alternatives" class="section-heading">
<a href="#alternatives" class="hover-link"><i class="ri-link-m" aria-hidden="true"></i>
<p class="sr-only">alternatives</p>
</a>
Alternatives
</h2>
<ul><li>sgte - a simple Erlang Template Engine <a href="https://github.com/filippo/sgte">https://github.com/filippo/sgte</a> </li></ul><h2 id="documentation" class="section-heading">
<a href="#documentation" class="hover-link"><i class="ri-link-m" aria-hidden="true"></i>
<p class="sr-only">documentation</p>
</a>
Documentation
</h2>
<ul><li>Github pages: <a href="https://ergenius.github.io/erlte/">https://ergenius.github.io/erlte/</a></li><li>'/doc' subdirectory (generated by ex_doc)</li></ul><h2 id="recommended-flow" class="section-heading">
<a href="#recommended-flow" class="hover-link"><i class="ri-link-m" aria-hidden="true"></i>
<p class="sr-only">recommended-flow</p>
</a>
Recommended flow
</h2>
<ul><li>Compile your template. Avoid compiling the template for each rendering!</li><li>Cache the compilation result for later usage. Helpers for saving compiled templates to files are provided.</li><li>Render the compiled template.</li></ul><h2 id="examples" class="section-heading">
<a href="#examples" class="hover-link"><i class="ri-link-m" aria-hidden="true"></i>
<p class="sr-only">examples</p>
</a>
Examples
</h2>
<h3 id="erlang-examples" class="section-heading">
<a href="#erlang-examples" class="hover-link"><i class="ri-link-m" aria-hidden="true"></i>
<p class="sr-only">erlang-examples</p>
</a>
Erlang examples
</h3>
<p>Compile and render a file template:</p><pre><code class="makeup erlang" translate="no"><span class="p" data-group-id="7617105861-1">{</span><span class="ss">ok</span><span class="p">,</span><span class="w"> </span><span class="n">Compiled</span><span class="p" data-group-id="7617105861-1">}</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nc">erlte</span><span class="p">:</span><span class="nf">compile</span><span class="p" data-group-id="7617105861-2">(</span><span class="p" data-group-id="7617105861-3">{</span><span class="ss">file</span><span class="p">,</span><span class="w"> </span><span class="s">"/path/to/template/file.html"</span><span class="p" data-group-id="7617105861-3">}</span><span class="p" data-group-id="7617105861-2">)</span><span class="p">,</span><span class="w">
</span><span class="n">Variables</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p" data-group-id="7617105861-4">[</span><span class="p" data-group-id="7617105861-5">{</span><span class="ss">language</span><span class="p">,</span><span class="w"> </span><span class="s">"Erlang"</span><span class="p" data-group-id="7617105861-5">}</span><span class="p">,</span><span class="w"> </span><span class="p" data-group-id="7617105861-6">{</span><span class="ss">designed_by</span><span class="p">,</span><span class="w"> </span><span class="s">"Joe Armstrong, Robert Virding and Mike Williams"</span><span class="p" data-group-id="7617105861-6">}</span><span class="p" data-group-id="7617105861-4">]</span><span class="p">,</span><span class="w">
</span><span class="p" data-group-id="7617105861-7">{</span><span class="ss">ok</span><span class="p">,</span><span class="w"> </span><span class="n">Rendered</span><span class="p" data-group-id="7617105861-7">}</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nc">erlte</span><span class="p">:</span><span class="nf">render</span><span class="p" data-group-id="7617105861-8">(</span><span class="n">Compiled</span><span class="p">,</span><span class="w"> </span><span class="n">Variables</span><span class="p" data-group-id="7617105861-8">)</span><span class="p">.</span></code></pre><p>Compile and render a list:</p><pre><code class="makeup erlang" translate="no"><span class="p" data-group-id="4341019936-1">{</span><span class="ss">ok</span><span class="p">,</span><span class="w"> </span><span class="n">Compiled</span><span class="p" data-group-id="4341019936-1">}</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nc">erlte</span><span class="p">:</span><span class="nf">compile</span><span class="p" data-group-id="4341019936-2">(</span><span class="s">"{{project}} was designed by {{author}}"</span><span class="p" data-group-id="4341019936-2">)</span><span class="p">,</span><span class="w">
</span><span class="n">Variables</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p" data-group-id="4341019936-3">[</span><span class="p" data-group-id="4341019936-4">{</span><span class="ss">project</span><span class="p">,</span><span class="w"> </span><span class="s">"erlte"</span><span class="p" data-group-id="4341019936-4">}</span><span class="p">,</span><span class="w"> </span><span class="p" data-group-id="4341019936-5">{</span><span class="ss">author</span><span class="p">,</span><span class="w"> </span><span class="s">"Madalin"</span><span class="p" data-group-id="4341019936-5">}</span><span class="p" data-group-id="4341019936-3">]</span><span class="p">,</span><span class="w">
</span><span class="p" data-group-id="4341019936-6">{</span><span class="ss">ok</span><span class="p">,</span><span class="w"> </span><span class="n">Rendered</span><span class="p" data-group-id="4341019936-6">}</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nc">erlte</span><span class="p">:</span><span class="nf">render</span><span class="p" data-group-id="4341019936-7">(</span><span class="n">Compiled</span><span class="p">,</span><span class="w"> </span><span class="n">Variables</span><span class="p" data-group-id="4341019936-7">)</span><span class="p">.</span></code></pre><p>Compile a binary:</p><pre><code class="makeup erlang" translate="no"><span class="p" data-group-id="8312455848-1">{</span><span class="ss">ok</span><span class="p">,</span><span class="w"> </span><span class="n">Compiled</span><span class="p" data-group-id="8312455848-1">}</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nc">erlte</span><span class="p">:</span><span class="nf">compile</span><span class="p" data-group-id="8312455848-2">(</span><span class="p"><<</span><span class="s">"{{project}} was designed by {{author}}"</span><span class="p">>></span><span class="p" data-group-id="8312455848-2">)</span><span class="p">,</span></code></pre><p>You are free to mix ANY atoms, lists, binaries or integer numbers for variable names:</p><pre><code class="makeup erlang" translate="no"><span class="p" data-group-id="3841644675-1">{</span><span class="ss">ok</span><span class="p">,</span><span class="w"> </span><span class="n">Compiled</span><span class="p" data-group-id="3841644675-1">}</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nc">erlte</span><span class="p">:</span><span class="nf">compile</span><span class="p" data-group-id="3841644675-2">(</span><span class="s">"{{molecule}} {{server is down}} {{1}}"</span><span class="p" data-group-id="3841644675-2">)</span><span class="p">,</span><span class="w">
</span><span class="n">Variables</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p" data-group-id="3841644675-3">[</span><span class="p" data-group-id="3841644675-4">{</span><span class="ss">molecule</span><span class="p">,</span><span class="w"> </span><span class="s">"atoms are OK"</span><span class="p" data-group-id="3841644675-4">}</span><span class="p">,</span><span class="w"> </span><span class="p" data-group-id="3841644675-5">{</span><span class="p"><<</span><span class="s">"server is down"</span><span class="p">>></span><span class="p">,</span><span class="w"> </span><span class="s">"binaries are OK"</span><span class="p" data-group-id="3841644675-5">}</span><span class="p">,</span><span class="w"> </span><span class="p" data-group-id="3841644675-6">{</span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="s">"integers are OK"</span><span class="p" data-group-id="3841644675-6">}</span><span class="p" data-group-id="3841644675-3">]</span><span class="p">,</span><span class="w">
</span><span class="p" data-group-id="3841644675-7">{</span><span class="ss">ok</span><span class="p">,</span><span class="w"> </span><span class="n">Rendered</span><span class="p" data-group-id="3841644675-7">}</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nc">erlte</span><span class="p">:</span><span class="nf">render</span><span class="p" data-group-id="3841644675-8">(</span><span class="n">Compiled</span><span class="p">,</span><span class="w"> </span><span class="n">Variables</span><span class="p" data-group-id="3841644675-8">)</span><span class="p">.</span></code></pre><p>You can also specify a function that returns the value to be rendered instead of the variable value.
The function must be exported from the specified module and must have arity = 4.
The function will receive the template file format, the variable name, variable value, argument as parameters and must return a binary.
Argument is atom undefined in the example below but can be any Erlang term().</p><pre><code class="makeup erlang" translate="no"><span class="c1">% Define the function somewhere in a module (remember to export the function).</span><span class="w">
</span><span class="c1">% If anything goes wrong with your function including if your function does not return a binary, an exception will be trown!</span><span class="w">
</span><span class="p">-</span><span class="na">export</span><span class="p" data-group-id="9740031327-1">(</span><span class="p" data-group-id="9740031327-2">[</span><span class="ss">your_function</span><span class="p">/</span><span class="mi">4</span><span class="p" data-group-id="9740031327-2">]</span><span class="p" data-group-id="9740031327-1">)</span><span class="p">.</span><span class="w">
</span><span class="nf">your_function</span><span class="p" data-group-id="9740031327-3">(</span><span class="n">TemplateFormat</span><span class="p">,</span><span class="w"> </span><span class="n">VariableName</span><span class="p">,</span><span class="w"> </span><span class="n">VariableValue</span><span class="p">,</span><span class="w"> </span><span class="n">Arg</span><span class="p" data-group-id="9740031327-3">)</span><span class="w"> </span><span class="p">-></span><span class="w"> </span><span class="p"><<</span><span class="s">"do_some_magic_here"</span><span class="p">>></span><span class="p">.</span><span class="w">
</span><span class="c1">% Later you can use this function to render any variable you want </span><span class="w">
</span><span class="n">Variables</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p" data-group-id="9740031327-4">[</span><span class="p" data-group-id="9740031327-5">{</span><span class="ss">variable_name</span><span class="p">,</span><span class="w"> </span><span class="p" data-group-id="9740031327-6">{</span><span class="n">VariableValue</span><span class="p">,</span><span class="w"> </span><span class="p" data-group-id="9740031327-7">{</span><span class="ss">f</span><span class="p">,</span><span class="w"> </span><span class="ss">your_module_name</span><span class="p">,</span><span class="w"> </span><span class="ss">your_function</span><span class="p">,</span><span class="w"> </span><span class="ss">undefined</span><span class="p" data-group-id="9740031327-7">}</span><span class="p" data-group-id="9740031327-6">}</span><span class="p" data-group-id="9740031327-5">}</span><span class="p" data-group-id="9740031327-4">]</span><span class="p">.</span></code></pre><p>Save the compiled template to a file ('erlte' extension is recommended):</p><pre><code class="makeup erlang" translate="no"><span class="p" data-group-id="9350410637-1">{</span><span class="ss">ok</span><span class="p">,</span><span class="w"> </span><span class="n">Compiled</span><span class="p" data-group-id="9350410637-1">}</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nc">erlte</span><span class="p">:</span><span class="nf">compile</span><span class="p" data-group-id="9350410637-2">(</span><span class="s">"{{language}} was designed by {{designed_by}}"</span><span class="p" data-group-id="9350410637-2">)</span><span class="p">,</span><span class="w">
</span><span class="ss">ok</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nc">erlte</span><span class="p">:</span><span class="nf">compiled_write_file</span><span class="p" data-group-id="9350410637-3">(</span><span class="s">"/path/to/template/compiled.erlte"</span><span class="p">,</span><span class="w"> </span><span class="n">Compiled</span><span class="p" data-group-id="9350410637-3">)</span><span class="p">.</span></code></pre><p>Read a compiled template from a file and render it:</p><pre><code class="makeup elixir" translate="no"><span class="o">></span><span class="w"> </span><span class="p" data-group-id="4110488981-1">{</span><span class="n">ok</span><span class="p">,</span><span class="w"> </span><span class="nc">Compiled</span><span class="p" data-group-id="4110488981-1">}</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">erlte</span><span class="ss">:compiled_read_file</span><span class="p" data-group-id="4110488981-2">(</span><span class="s">"/path/to/template/compiled.erlte"</span><span class="p" data-group-id="4110488981-2">)</span><span class="o">.</span><span class="w">
</span><span class="o">></span><span class="w"> </span><span class="p" data-group-id="4110488981-3">{</span><span class="n">ok</span><span class="p">,</span><span class="w"> </span><span class="nc">Rendered</span><span class="p" data-group-id="4110488981-3">}</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">erlte</span><span class="ss">:render</span><span class="p" data-group-id="4110488981-4">(</span><span class="nc">Compiled</span><span class="p" data-group-id="4110488981-4">)</span><span class="o">.</span></code></pre><h3 id="templates-examples" class="section-heading">
<a href="#templates-examples" class="hover-link"><i class="ri-link-m" aria-hidden="true"></i>
<p class="sr-only">templates-examples</p>
</a>
Templates examples
</h3>
<p>Let's have a quick look at some examples.
You can find more templates samples into <code class="inline">examples/templates</code> project directory.</p><p>HTML demonstrating erlte-import custom HTML element</p><pre><code class="html"><erlte-import>./fragments/html-begin.html</erlte-import>
<erlte-import>./fragments/head.html</erlte-import>
<body>
<!-- <erlte-import>./test/invalid/commented/import</erlte-import> -->
<!-- Test single line comment -->
<!-- Test multiline
comment -->
<h1>Hello world from {{erlte}}!</h1>
<!-- Test comment with {{variable}} -->
<erlte-import>./fragments/footer.html</erlte-import>
</body>
<erlte-import>./fragments/html-end.html</erlte-import></code></pre><p>JavaScript import</p><pre><code class="js">import "./config"; // You can import without .js file extension
import "./erlte";
import "./utils/base.js"; // You can import with file extension
import "./utils/validator";
// Let's call some functions
erlte.S.Utils.Base.erlang();
erlte.S.Utils.Validator.isString("Erlang");</code></pre><p>CSS import</p><pre><code class="css">@import "test1.css";
/* a { color: blue } */
/**/
/* */
div {
/* inside */
color: green;
/* between */
border-radius: 3px / 7px
/* end */
}</code></pre><h2 id="under-the-hood" class="section-heading">
<a href="#under-the-hood" class="hover-link"><i class="ri-link-m" aria-hidden="true"></i>
<p class="sr-only">under-the-hood</p>
</a>
Under the hood
</h2>
<h4>How is compiling implemented?</h4><ul><li>When ertle compiles the template, it produces a record containing one atom (holding original template file format) and one list (holding binaries and variables tuples).</li><li>erlte also supports variables being used at the compilation stage. Good candidates are variables that rarely change. Not having to locate or replace them for each render may dramatically improve your rendering speed.</li></ul><p>Example of template and variables at compilation time:</p><pre><code class="makeup erlang" translate="no"><span class="n">Template</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p"><<</span><span class="s">"{{constant}} {{anonfun}}! Mixing variables populated at compilation time with {{data}} at rendering time!"</span><span class="p">>></span><span class="p">,</span><span class="w">
</span><span class="n">CompilationVariables</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p" data-group-id="3224318054-1">[</span><span class="w">
</span><span class="p" data-group-id="3224318054-2">{</span><span class="ss">constant</span><span class="p">,</span><span class="w"> </span><span class="s">"Hello"</span><span class="p" data-group-id="3224318054-2">}</span><span class="p">,</span><span class="w">
</span><span class="c1">%% Using your own function for rendering the variable is also possible</span><span class="w">
</span><span class="p" data-group-id="3224318054-3">{</span><span class="ss">anonfun</span><span class="p">,</span><span class="w"> </span><span class="p" data-group-id="3224318054-4">{</span><span class="s">"world"</span><span class="p">,</span><span class="w"> </span><span class="p" data-group-id="3224318054-5">{</span><span class="ss">f</span><span class="p">,</span><span class="w"> </span><span class="ss">module_name</span><span class="p">,</span><span class="w"> </span><span class="ss">function_name</span><span class="p">,</span><span class="w"> </span><span class="ss">undefined</span><span class="p" data-group-id="3224318054-5">}</span><span class="p" data-group-id="3224318054-4">}</span><span class="p" data-group-id="3224318054-3">}</span><span class="w">
</span><span class="p" data-group-id="3224318054-1">]</span><span class="p">,</span><span class="w">
</span><span class="c1">%% You can see erlte is smart enogh to merge the proper fragments toghether at compilation phase</span><span class="w">
</span><span class="c1">%% skipping only remaining variables!</span><span class="w">
</span><span class="p" data-group-id="3224318054-6">{</span><span class="ss">ok</span><span class="p">,</span><span class="w"> </span><span class="o">#</span><span class="ss">erlte_compiled</span><span class="p" data-group-id="3224318054-7">{</span><span class="w">
</span><span class="ss">format</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="ss">txt</span><span class="p">,</span><span class="w">
</span><span class="ss">fragments</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p" data-group-id="3224318054-8">[</span><span class="w">
</span><span class="p"><<</span><span class="s">"Hello world! Mixing variables populated at compilation time with "</span><span class="p">>></span><span class="p">,</span><span class="w">
</span><span class="p" data-group-id="3224318054-9">{</span><span class="ss">v</span><span class="p">,</span><span class="w"> </span><span class="p"><<</span><span class="s">"data"</span><span class="p">>></span><span class="p" data-group-id="3224318054-9">}</span><span class="p">,</span><span class="w">
</span><span class="p"><<</span><span class="s">" at rendering time!"</span><span class="p">>></span><span class="w">
</span><span class="p" data-group-id="3224318054-8">]</span><span class="w">
</span><span class="p" data-group-id="3224318054-7">}</span><span class="p" data-group-id="3224318054-6">}</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nc">erlte</span><span class="p">:</span><span class="nf">compile</span><span class="p" data-group-id="3224318054-10">(</span><span class="p" data-group-id="3224318054-11">{</span><span class="ss">file</span><span class="p">,</span><span class="w"> </span><span class="s">"/path/to/template/file.html"</span><span class="p" data-group-id="3224318054-11">}</span><span class="p">,</span><span class="w"> </span><span class="n">CompilationVariables</span><span class="p" data-group-id="3224318054-10">)</span><span class="p">.</span></code></pre><h4>How is rendering implemented?</h4><ul><li>ertle iterates your rendering variables once and replaces the variables in the compiled template list with the specified values.</li><li>If the template contains variable names that are not specified at the rendering phase, the original variable names are kept untouched.</li><li>All variable names that are not found in the template are simply ignored.</li><li>At the end, you get an iolist of binaries. That's all folks!</li></ul><h2 id="project-roadmap" class="section-heading">
<a href="#project-roadmap" class="hover-link"><i class="ri-link-m" aria-hidden="true"></i>
<p class="sr-only">project-roadmap</p>
</a>
Project roadmap
</h2>
<ol><li>Continuously fixing bugs and tuning performance.</li><li>Writing more testing units.</li><li>Keeping it simple and fast.</li></ol><h2 id="erlang-versions-supported" class="section-heading">
<a href="#erlang-versions-supported" class="hover-link"><i class="ri-link-m" aria-hidden="true"></i>
<p class="sr-only">erlang-versions-supported</p>
</a>
Erlang versions supported
</h2>
<p>erlte officially supports OTP release 20 and later.</p><p>Development takes place using OTP 25 release and tests are done on:</p><ul><li>25.0.3</li><li>24.3.4</li><li>23.3.4</li><li>22.3.4</li><li>21.3.8</li><li>20.3.8</li></ul><p>Unofficially, you may be able to use erlte with older Erlang versions. No guarantee included.</p><h2 id="dependencies" class="section-heading">
<a href="#dependencies" class="hover-link"><i class="ri-link-m" aria-hidden="true"></i>
<p class="sr-only">dependencies</p>
</a>
Dependencies
</h2>
<p>None at this moment, but I intend to introduce erlhtml in the next version. erlhtml is Erlang library for URL encoding and escaping HTML entities mantained by the same author as erlte.</p><h2 id="authors" class="section-heading">
<a href="#authors" class="hover-link"><i class="ri-link-m" aria-hidden="true"></i>
<p class="sr-only">authors</p>
</a>
Authors
</h2>
<ul><li>Madalin Grigore-Enescu (ergenius) <a href="mailto:github@ergenius.com">github@ergenius.com</a></li></ul><h2 id="license" class="section-heading">
<a href="#license" class="hover-link"><i class="ri-link-m" aria-hidden="true"></i>
<p class="sr-only">license</p>
</a>
License
</h2>
<p>erlte is available under the MIT license (see <code class="inline">LICENSE</code>).</p>
<div class="bottom-actions">
<div class="bottom-actions-item">
<a href="api-reference.html" class="bottom-actions-button" rel="prev">
<span class="subheader">
← Previous Page
</span>
<span class="title">
API Reference
</span>
</a>
</div>
<div class="bottom-actions-item">
<a href="license.html" class="bottom-actions-button" rel="next">
<span class="subheader">
Next Page →
</span>
<span class="title">
License
</span>
</a>
</div>
</div>
<footer class="footer">
<p>
On Hex.pm:
<span class="line">
<a href="https://hex.pm/packages/erlte/0.1.0" class="line footer-hex-package">Package</a>
<a href="https://preview.hex.pm/preview/erlte/0.1.0" class="line">Preview</a>
<a href="https://preview.hex.pm/preview/erlte/0.1.0/show/README.md">(current file)</a>
</span>
<button class="line footer-button display-quick-switch">
Search
</button>
</p>
<p>
Built using
<a href="https://github.com/elixir-lang/ex_doc" title="ExDoc" target="_blank" rel="help noopener" translate="no">ExDoc</a> (v0.28.5) for the
<a href="https://erlang.org" title="Erlang" target="_blank" translate="no">Erlang programming language</a>
</p>
</footer>
</div>
</div>
</section>
</div>
</body>
</html>