e-picas / grunt-nunjucks-render

A Grunt plugin to parse Nunjucks templates
Apache License 2.0
3 stars 2 forks source link

grunt-nunjucks-render

Build Status Code Climate

This is a grunt plugin to render nunjucks templates and strings. It takes data in JSON or YAML format and allows to configure nunjucks in Grunt tasks.

Getting Started

This plugin requires Grunt ~0.4.1 and Node ~0.10.0. Please first have a look at the Getting Started guide of Grunt.

You may install this plugin with this command:

npm install grunt-nunjucks-render --save-dev

Once the plugin is installed, it may be enabled inside your Gruntfile.js with this line of JavaScript:

grunt.loadNpmTasks('grunt-nunjucks-render');

The "nunjucks_render" task

Overview

In your project's Gruntfile, add a section named nunjucks_render to the data object passed into grunt.initConfig():

grunt.initConfig({
  nunjucks_render: {
    options: {
                        // task global options go here
    },
    your_target: {
      options: {
                        // target specific options go here
      },
      files: [
        {
          data:         // path to JSON or YAML file(s)
          src:          // path to template file(s)
          dest:         // path to output destination file(s)
          str:          // direct string(s) to parse (before templates by default)
          str_prepend:  // direct string(s) to parse and concat before templates
          str_append:   // direct string(s) to parse and concat after templates
        }
      ]
    }
  }
});

See the dedicated page to learn how to build your files objects. Note that some properties are added here:

Environment

A special nunjucks environment loader is designed by the plugin to use a full set of options when searching templates (original and included ones). The loader is defined in lib/loader.js.

The template_path environment variable will always contain the path of the current parsed template (the current file), even for inclusions. The template_date environment variable will always contain the date of the current parsing, even for inclusions.

The plugin embeds the date-filter natively to let you write formated dates:

{{ my_date | date() }}          // with default format
{{ my_date | date('YYY') }}     // with custom format

Options

Options can be defined globally for the nunjucks_render task or for each target. The target options will always overload global settings.

A "template" here is a raw template, defined as the src item of a target files, or a nunjucks included template.

Examples

You can have a look at the Gruntfile.js of the plugin for various usage examples.

Define a base path for all parsed files:

options: {
    baseDir: 'templates/to/read/'
},
files: {
    'file/to/output-1.html': 'file-1.j2',
    'file/to/output-2.html': 'file-2.j2',
    'file/to/output-3.html': 'file-3.j2'
}

Define a global data table for all parsed files:

options: {
    data: {
        name: "my name",
        desc: "my description"
    }
},
files: {
    'file/to/output.html': 'template/to/read.j2'
}

Define a global JSON data file for all parsed files:

options: {
    data: 'commons.json'
},
files: {
    'file/to/output-1.html': 'template/to/read-1.j2',
    'file/to/output-2.html': 'template/to/read-2.j2',
    'file/to/output-3.html': 'template/to/read-3.j2'
}

Define a global data table for all targets, over-written by a "per-target" data:

options: {
    data: {
        name: "my name",
        desc: "my description"
    }
},
my_target: {
    files: {
        data:   { desc: "my desc which will over-write global one" },
        src:    'template/to/read.j2',
        dest:   'file/to/output.html'
    }
}

Define a full set of grunt files:

files: [
  {
    expand: true,
    src: 'template/to/read-*.j2',
    data: 'common-data.json',
    dest: 'dest/directory/'
  }
]

Usage of the str argument:

files: {
    data:   { desc: "my desc which will over-write global one" },
    src:    'template/to/read.j2',
    dest:   'file/to/output.html',
    str:    "My nunjucks string with var: {{ username }}"
}
files: {
    data:   { desc: "my desc which will over-write global one" },
    src:    'template/to/read.j2',
    dest:   'file/to/output.html',
    str:    [ "My first nunjucks string with var: {{ username }}", "My second nunjucks string with var: {{ username }}" ]
}

Use the module in your tasks

As this module defines "non-tasked" functions, you can use the followings in your own tasks or modules.

NunjucksRenderFile

var NunjucksRenderFile = require('grunt-nunjucks-render/lib/render-file');
var content = NunjucksRenderFile( filepath , data[ , options ][ , nunjucks.Environment ]);

NunjucksRenderString

var NunjucksRenderString = require('grunt-nunjucks-render/lib/render-string');
var content = NunjucksRenderString( str , data[ , options ][ , nunjucks.Environment ]);

Related third-parties links

Contributing

In lieu of a formal styleguide, take care to maintain the existing coding style. Add unit tests for any new or changed functionality. Lint and test your code using Grunt.