1.0.2 • Published 6 years ago

peach-templates v1.0.2

Weekly downloads
1
License
MIT
Repository
github
Last release
6 years ago

peach-templates

peach logo

Very very simple templates.

Install

npm install peach-templates

Contents

Usage

Create a render function

import { present } from 'peach-templates';
const print = console.log.bind(console);

function render(str, obj, defaults){
    const tpl = present(str, obj, defaults);

    let results = '';

    //Each iterator item produces three values
    for(const [str, val, prop] of tpl){
        //str is the string before the variable
        //val is the value of the obj
        results += str + val;
    }

    //results really does contain
    //the whole modified string
    return results;
}

//Normal template processing
print(render('Cook the %(type) pie.', {
    type: 'peach'
}));

//Functions are run to get the return value
print(render('Cook the %(type) pie.', {
    type(){
        return 'apple'
    }
}));

//This pie type is undefined
print(render('Cook the %(type) pie.'));

//The pie type is still undefined
//A default is used instead
print(render('Cook the %(type) pie.', {}, {
    type: 'peach'
}));

//Get sub properties with a dot
print(render('Cook the %(pie.type) pie.', {
    pie: {type:'cherry'}
}));

//Cook the peach pie.
//Cook the apple pie.
//Cook the undefined pie.
//Cook the peach pie.
//Cook the cherry pie.

You're not into for of loops

import { present } from 'peach-templates';
const print = console.log.bind(console);

function render(str, obj, defaults){
    const tpl = present(str, obj, defaults);

    let results = '';

    //For some reason you don't want to use for of
    while(true){
        let next = tpl.next();
        if(next.done) break;
        let [str, val, prop] = next.value;
        results += str + val;
    }

    return results;
}

Asynchronous templates

The new for await syntax is coming soon.

Use at your own risk, or for fun!

import { asyncPresent as present} from 'peach-templates';
import Promise from 'bluebird';

const readFile = Promise.promisify(require('fs').readFile);
const print = console.log.bind(console);

function readJSON(name){
    return readFile(name, 'utf8')
    .then(contents=>{
        try{
            return JSON.parse(contents);
        }catch(e){ return Promise.reject(e); }
    });
}

async function render(str, obj, defaults){
    const tpl = present(str, obj, defaults);

    let results = '';

    for await (const [str, val, prop] of tpl){
        results += str + val;
    }

    return results;
}

//Pie types are asynchronous values
render('Cook the %(pie.type) pie.', {
    pie: readJSON('pie.json')
}).then(print);

About

Templates are useful. peach-templates are trying to boost that usefulness. Using a minimal boilerplate you can create a very flexible template renderer for a variety of usages.