nwt

experiment to build a jinja like template parser

Pure Nim score 15/100 · tests present · no docs generated

Summary

Latest Version Unknown
License MIT
CI Status Passing
Downloads 0
Last Indexed 2026-07-22 05:28

Installation

nimble install nwt
choosenim install nwt
git clone https://github.com/enthus1ast/nimWebTemplates

OS Compatibility

Platform Linux macOS Windows FreeBSD OpenBSD NetBSD Android iOS WASM Embedded
nwt - - - - - - -

Source

Repository https://github.com/enthus1ast/nimWebTemplates
Homepage https://github.com/enthus1ast/nimWebTemplates
Registry Source nimble_official

README

nimWebTemplates is ABADONNED and DEPRECATED

for a better template engine use: enthus1ast/nimja

readme

nwt is a little template engine inspired by jinja2.

(warning: it lacks control statements like if while etc..)

it do not enforce any web framework so use whatever you like!

rudimentary freeze support with freeze()

have a look at the other demos!

if you feeling fancy today have a special look at the dbdriven database example and my little flatfile database flatdb for nim-lang

usage

Directory structure

To follow this example create this folder structure

./example.nim
./templates/base.html
./templates/index.html
./templates/about.html
./templates/stats.html

menu.html

{%block menu%}<a href="index.html">index</a> || <a href="about.html">about</a> || <a href="stats.html">stats</a>{%endblock%}

base.html

{%import menu.html%}
<html>
    <head>
        <title>{{title}}</title>
    </head>

    <body>
        <div>
            {{self.menu}} 

        </div>

        <h1>{{title}}</h1>

        <div>
            {%block "content"%}
                {# i will be replaced by my children #}
            {%endblock%}
        </div>

        <div>
            <hr> 
            Made with nim<br>
            {{self.footer}}
        </div>
    </body>
</html>

index.html

{%extends "base.html"%}

{%set title "Some index and more"%}

{%block content%}
    Lorem ipsum dolor sit amet, consectetur adipisicing elit. 
    Ab, sint repellendus iure similique ipsa unde eos est nam numquam, laborum, sit ipsum voluptates modi impedit doloremque. 
    Fugiat, obcaecati delectus accusantium.
{%endblock%}

{%block footer%}
    Some footer infos we only want to see on the index
{%endblock%}

about.html

{%extends "base.html"%}
{%set title "Some about me and stuff"%}

{%block content%}
        <ul>
            <li>foo</li>
            <li>baaa</li>
        </ul>
{%endblock%}

{# we not set any additional footer here, so we omit the block #}

stats.html

{%extends "base.html"%}

{%block content%}
        <ul>
            <li>{{foo}}</li>
            <li>{{baa}}</li>
        </ul>
{%endblock%}

{# we not set any additional footer here, so we omit the block #}

example.nim

import asynchttpserver, asyncdispatch
import json
import nwt

var templates = newNwt("templates/*.html") # we have all the templates in a folder called "templates"

var server = newAsyncHttpServer()
proc cb(req: Request) {.async.} =
  let res = req.url.path

  case res 
  of "/", "/index.html":
    await req.respond(Http200, templates.renderTemplate("index.html"))  
  of "/about.html":
    await req.respond(Http200, templates.renderTemplate("about.html"))
  of "/stats.html":
    var context = %* {"title": "some variables from nim", "foo": "Foo!", "baa": "Baa!"}
    await req.respond(Http200, templates.renderTemplate("stats.html", context))  
  else:
    await req.respond(Http404, "not found")

waitFor server.serve(Port(8080), cb)