StructureJS
0.15.2A class based utility library for building modular and scalable web platform applications. Features opt-in classes and utilities which provide a solid foundation and toolset to build your next project.
import StringUtil from './StringUtil';
/**
* A helper class to provide a convenient and consistent way to render templates.
*
* @class TemplateFactory
* @module StructureJS
* @submodule util
* @requires StringUtil
* @requires Handlebars
* @author Robert S. (www.codeBelt.com)
* @static
*/
class TemplateFactory
{
/**
* A constant value for using Underscore or Lodash templates.
*
* @property UNDERSCORE
* @type {string}
* @public
* @final
* @static
*/
public static UNDERSCORE:string = 'underscore';
/**
* A constant value for using Handlebars templates. This is the default template engine.
*
* @property HANDLEBARS
* @type {string}
* @public
* @final
* @static
*/
public static HANDLEBARS:string = 'handlebars';
/**
* Sets the template engine type for this TemplateFactory class. The default is TemplateFactory.HANDLEBARS
*
* @property templateEngine
* @type {string}
* @default TemplateFactory.HANDLEBARS
* @public
* @static
*/
public static templateEngine:string = TemplateFactory.HANDLEBARS;
/**
* The global namespace for pre-compiled templates.
*
* @property templateNamespace
* @type {string}
* @default 'JST'
* @public
* @static
*/
public static templateNamespace:string = 'JST';
constructor()
{
throw new Error('[TemplateFactory] Do not instantiate the TemplateFactory class because it is a static class.');
}
/**
* Creates a template.
*
* @method create
* @param templatePath {any}
* @param [data=any]
* @returns {string}
* @public
* @static
* @example
* TemplateFactory.create('templateName', {some: 'data'});
*/
public static create(templatePath:any, data:any = null):string
{
//Checks the first character to see if it is a '.' or '#'.
const regex = /^([.#])(.+)/;
let template:string = null;
const isFunctionTemplate = typeof templatePath === 'function';
const isClassOrIdName:boolean = regex.test(templatePath);
if (isFunctionTemplate)
{
template = templatePath(data);
}
else if (isClassOrIdName)
{
// Remove pound sign from the id name.
templatePath = templatePath.substring(1);
let htmlString:string = document.getElementById(templatePath).innerHTML;
htmlString = StringUtil.removeLeadingTrailingWhitespace(htmlString);
if (TemplateFactory.templateEngine == TemplateFactory.UNDERSCORE)
{
// Underscore Template:
const templateMethod:Function = window['_'].template(htmlString);
template = templateMethod(data);
}
else
{
// Handlebars Template
const templateMethod:Function = Handlebars.compile(htmlString);
template = templateMethod(data);
}
}
else
{
const templateObj:Object = window[TemplateFactory.templateNamespace];
if (!templateObj)
{
// Returns null because the template namespace is not found.
return null;
}
const templateFunction:Function = templateObj[templatePath];
if (templateFunction)
{
// The templatePath gets a function storage in the associative array.
// We call the function by passing in the data as the argument.
template = templateFunction(data);
}
}
return template;
}
}
export default TemplateFactory;