lote

A minimalistic, whitespace-sensitive template language for writing HTML, XML and similar types of structured documents.

Usage no npm install needed!

<script type="module">
  import lote from 'https://cdn.skypack.dev/lote';
</script>

README

# LoTe

A minimalistic, whitespace-sensitive template engine for writing HTML, XML and similar types of structured documents. Written in typescript for Node.js and (probably) browsers.

Why another template engine?

LoTe was developed as a robust replacement for Pug (Jade) language after it's gluttony became unbearable. LoTe has plain declarative syntax and relies on typescript mixins to implement complex logic.

Syntax

Template:

html("en")
  head("LoTe")
    keywords/("LoTe, template engine, typescript, javascript, nodejs")
  body
    h1\Lote - node template engine
    -this is a comment
    p
      \A minimalistic, whitespace-sensitive template language for writing
      \ HTML, XML and similar types of structured documents.
      \ Implemented with typescript for 
      a("http://nodejs.org")\node
      \ and (probably) browsers.

Render output (pretty-printed):

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8"/>
    <meta name="keywords" content="LoTe, template engine, typescript, javascript, nodejs"/>
    <title>LoTe</title>
  </head>
  <body>
    <h1>Lote - node template engine</h1>
    <p>
      A minimalistic, whitespace-sensitive template engine for writing
      HTML, XML and similar types of structured documents.
      Implemented with typescript for
      <a href="http://nodejs.org">node</a>
      and (probably) browsers.
    </p>
  </body>
</html>

API

import * as lote from 'lote';
import {pack as emitters} from 'lote-basic-html-emitters';

const template: string = 'strings of LoTe...';
let renderer: lote.TRenderer;
try
{
    //  Product of template compilation.
    //  Might be safely and efficiently (de)serialized.
    let commands_sequence: lote.TCommandsSequence;
    //  Compile template with default options.
    //  An instance of lote.TCompilationErrorException may be thrown.
    commands_sequence = lote.Compile(template);
    //  Wrap command sequence into utility class.
    renderer = new lote.TRenderer(commands_sequence);
    //  Check that template can be rendered with given emitters.
    //  An instance of lote.TValidationErrorException may be thrown.
    renderer.Validate(emitters);
}
catch(e) 
{
    console.log(e);
    process.exit(1);
}
//  Prerender document. This optional pass will speedup final rendering
//  by invoking emitters that make no use of runtime data.
renderer.Advance(html_emitters);
//  Container with some runtime data.
let locals: any = {whatever:42};
//  Render document.
const document: string = renderer.Render(html_emitters, locals);

Node.js Support

LoTe works fine in Node.js 4.5 and newer. Distributed as lote npm module. Typings are included.

Browser Support

Technically LoTe should work in browsers but right now it only exists as Node.js module.

Dependencies

None.