Simple HTML template library for C++
C++
Switch branches/tags
Nothing to show
Latest commit 513e5e8 May 26, 2015 Tomas Andrle Tomas Andrle Fix template >>

README.md

##NLTemplate - simple HTML template library for C++##

Use tags like {{ variable }} or {% include header.html %} or {% block items %}{{ item }}{% endblock %} in your template files. Load the templates with NLTemplate, fill in the variables and setup the repeating blocks with C++ code and render the result to stdout or into a string.

###Features###

  • Variable replacement
  • Repeatable or optional blocks
  • File includes
  • No external dependencies

###Requirements###

  • C++11 (please use the C++98 branch if you need support for legacy compilers)

###Installation###

To start using NLTemplate, add NLTemplate.cpp to your project and make sure NLTemplate.h is in your header search path.

###Demo###

If you use Xcode, just open and run the demo project. On the command line, you could run the demo like this:

git clone git@github.com:catnapgames/NLTemplate.git
cd NLTemplate/NLTemplate
gcc -Wall -pedantic -o demo -lstdc++ *.cpp
./demo

###Example###

#include <iostream>
#include "NLTemplate.h"


using namespace std;
using namespace NL::Template;



int main(int, char *[] ) {
    const char *titles[ 3 ] = { "Chico", "Harpo", "Groucho" };
    const char *details[ 3 ] = { "Red", "Green", "Blue" };

    LoaderFile loader; // Let's use the default loader that loads files from disk.
    
    Template t( loader );
    
    t.load( "test.txt" );               // Load & parse the main template and its dependencies.
    t.set( "text", "Hello, world" );    // Set a top-level variable
    t.block( "items" ).repeat( 3 );     // We need to know in advance that the "items" block will repeat 3 times.
    
    // Let's fill in the data for the repeated block.
    for ( int i=0; i < 3; i++ ) {
        // Set title and text by accessing the variable directly
        t.block( "items" )[ i ].set( "title", titles[ i ] );
        t.block( "items" )[ i ].set( "text", "Lorem Ipsum" );
        
        // We can get a shortcut reference to a nested block
        Block & block = t.block( "items" )[ i ].block( "detailblock" );
        block.set( "detail", details[ i ] );
        
        // Disable this block for the first item in the list. Can be useful for opening/closing HTML tables etc.
        if ( i==0 ) {
            block.disable();
        }
    }
    
    t.render( cout ); // Render the template with the variables we've set above
    
    return 0;
}

###Example - test.txt###

{% include header.txt %}
    
<p>Items:</p>
{% block items %}<p>
  Title: {{ title }}<br/>
  Text: {{ text }}<br/>
  {% block details %}Detail: {{ detail }}{% endblock %}
</p>{% endblock %}

###Example - header.txt###

<html><body>
<h1>{{ text }}</h1>

###Note about HTML###

Despite the headline, there is nothing HTML-specific in NLTemplate. You can use XML, JSON or plain text as well for your templates.

###Personal note###

If you use NLTemplate in a project, I'd love to hear about it. Please do let me know at tom@catnapgames.com. Thanks!

See also

Goes well with NLDatabase - a lightweight SQLite wrapper for C++.