mirror of
				https://github.com/zulip/zulip.git
				synced 2025-11-03 21:43:21 +00:00 
			
		
		
		
	We have less urgency to test all templates now. The most common error is probably unbalanced tags, and our python-based template checker catches those problems pretty well. It's still possible to create bad templates, of course, but the node tests have never been super deep at finding semantic errors.
		
			
				
	
	
		
			128 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			128 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
var render = (function () {
 | 
						|
 | 
						|
var exports = {};
 | 
						|
 | 
						|
var fs = require('fs');
 | 
						|
var _ = require('node_modules/underscore/underscore.js');
 | 
						|
var Handlebars = require('handlebars');
 | 
						|
 | 
						|
function template_dir() {
 | 
						|
    return __dirname + '/../../static/templates/';
 | 
						|
}
 | 
						|
 | 
						|
exports.init = function () {
 | 
						|
    Handlebars.templates = {};
 | 
						|
};
 | 
						|
 | 
						|
exports.render_template = function (name, args) {
 | 
						|
    exports.compile_template(name);
 | 
						|
    return global.templates.render(name, args);
 | 
						|
};
 | 
						|
 | 
						|
exports.compile_template = function (name) {
 | 
						|
    var included_fns = exports.find_included_partials(name);
 | 
						|
 | 
						|
    _.each(included_fns, function (fn) {
 | 
						|
        exports.compile_template(fn);
 | 
						|
    });
 | 
						|
 | 
						|
    if (Handlebars.templates === undefined) {
 | 
						|
        Handlebars.templates = {};
 | 
						|
    }
 | 
						|
 | 
						|
    if (_.has(Handlebars.template, name)) {
 | 
						|
        // we already compile the template
 | 
						|
        return;
 | 
						|
    }
 | 
						|
 | 
						|
    var file = exports.template_finder.get(name);
 | 
						|
    var data = fs.readFileSync(file.url).toString();
 | 
						|
    Handlebars.templates[name] = Handlebars.compile(data);
 | 
						|
};
 | 
						|
 | 
						|
// list all files in a directory and it's subdirectories in a recursive sync way.
 | 
						|
exports.walk = function (dir, filelist) {
 | 
						|
    filelist = filelist || [];
 | 
						|
 | 
						|
    // grab files one level deep.
 | 
						|
    var files = fs.readdirSync(dir);
 | 
						|
 | 
						|
    // for each file, check if it's a directory. If so, continue recursion.
 | 
						|
    // if not add to the file list.
 | 
						|
    files.forEach(function (file) {
 | 
						|
        if (fs.statSync(dir + "/" + file).isDirectory()) {
 | 
						|
            filelist = exports.walk(dir + "/" + file, filelist);
 | 
						|
        } else {
 | 
						|
            filelist.push({
 | 
						|
                url: dir + "/" + file,
 | 
						|
                name: file,
 | 
						|
            });
 | 
						|
        }
 | 
						|
    });
 | 
						|
 | 
						|
    // return all recursively found files.
 | 
						|
    return filelist;
 | 
						|
};
 | 
						|
 | 
						|
exports.template_finder = (function () {
 | 
						|
    // This class lets you find template files in our file system.
 | 
						|
    // It may be slightly overkill for our flat directory system;
 | 
						|
    // it might make more sense to just do something more like
 | 
						|
    // this: get_template_dir() + name + '.handlebars'
 | 
						|
 | 
						|
    var self = {};
 | 
						|
 | 
						|
    // get all files and then map them into friendlier names.
 | 
						|
    var all_files = exports.walk(template_dir());
 | 
						|
    var files = all_files
 | 
						|
        .filter(function (file) {
 | 
						|
            return (/\.handlebars$/).test(file.name);
 | 
						|
        })
 | 
						|
        .map(function (file) {
 | 
						|
            return {
 | 
						|
                url: file.url,
 | 
						|
                name: file.name.replace(/\.handlebars$/, ""),
 | 
						|
            };
 | 
						|
        });
 | 
						|
 | 
						|
    self.get = function (name) {
 | 
						|
        var file = files.find(function (file) {
 | 
						|
            return file.name === name;
 | 
						|
        });
 | 
						|
        assert(file);
 | 
						|
 | 
						|
        return file;
 | 
						|
    };
 | 
						|
 | 
						|
    self.get_all = function () {
 | 
						|
        return files;
 | 
						|
    };
 | 
						|
 | 
						|
    return self;
 | 
						|
}());
 | 
						|
 | 
						|
exports.find_included_partials = function (name) {
 | 
						|
 | 
						|
    var file = exports.template_finder.get(name);
 | 
						|
 | 
						|
    assert(file);
 | 
						|
 | 
						|
    var template = fs.readFileSync(file.url, "utf8");
 | 
						|
 | 
						|
    var lst = [];
 | 
						|
 | 
						|
    // match partial tags.
 | 
						|
    // this uses String.prototype.replace which is kind of hacky but
 | 
						|
    // it is the only JS function IIRC that allows you to match all
 | 
						|
    // instances of a pattern AND return capture groups.
 | 
						|
    template.replace(/\{\{\s*partial\s*"(.+?)"/ig, function (match, $1) {
 | 
						|
        lst.push($1);
 | 
						|
    });
 | 
						|
 | 
						|
    return lst;
 | 
						|
};
 | 
						|
 | 
						|
return exports;
 | 
						|
}());
 | 
						|
module.exports = render;
 |