discourse/app/assets/javascripts/discourse-common/addon/lib/raw-handlebars.js

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

135 lines
3.7 KiB
JavaScript
Raw Normal View History

import Handlebars from "handlebars";
2016-06-30 17:10:08 -04:00
// This is a mechanism for quickly rendering templates which is Ember aware
// templates are highly compatible with Ember so you don't need to worry about calling "get"
// and discourseComputed properties function, additionally it uses stringParams like Ember does
2016-06-30 17:10:08 -04:00
const RawHandlebars = Handlebars.create();
2016-07-13 15:36:34 -04:00
function buildPath(blk, args) {
2021-01-27 06:39:20 -05:00
let result = {
2016-07-13 15:36:34 -04:00
type: "PathExpression",
data: false,
depth: blk.path.depth,
loc: blk.path.loc,
};
// Server side precompile doesn't have jquery.extend
Object.keys(args).forEach(function (a) {
result[a] = args[a];
});
return result;
}
function replaceGet(ast) {
2021-01-27 06:39:20 -05:00
let visitor = new Handlebars.Visitor();
2016-07-13 15:36:34 -04:00
visitor.mutating = true;
visitor.MustacheStatement = function (mustache) {
if (!(mustache.params.length || mustache.hash)) {
mustache.params[0] = mustache.path;
mustache.path = buildPath(mustache, {
parts: ["get"],
original: "get",
strict: true,
falsy: true,
});
}
return Handlebars.Visitor.prototype.MustacheStatement.call(this, mustache);
};
// rewrite `each x as |y|` as each y in x`
// This allows us to use the same syntax in all templates
visitor.BlockStatement = function (block) {
if (block.path.original === "each" && block.params.length === 1) {
2021-01-27 06:39:20 -05:00
let paramName = block.program.blockParams[0];
2016-07-13 15:36:34 -04:00
block.params = [
buildPath(block, { original: paramName }),
{ type: "CommentStatement", value: "in" },
block.params[0],
];
delete block.program.blockParams;
}
return Handlebars.Visitor.prototype.BlockStatement.call(this, block);
};
visitor.accept(ast);
}
2016-06-30 17:10:08 -04:00
if (Handlebars.Compiler) {
RawHandlebars.Compiler = function () {};
RawHandlebars.Compiler.prototype = Object.create(
2016-06-30 17:10:08 -04:00
Handlebars.Compiler.prototype
);
RawHandlebars.Compiler.prototype.compiler = RawHandlebars.Compiler;
RawHandlebars.JavaScriptCompiler = function () {};
RawHandlebars.JavaScriptCompiler.prototype = Object.create(
2016-06-30 17:10:08 -04:00
Handlebars.JavaScriptCompiler.prototype
);
RawHandlebars.JavaScriptCompiler.prototype.compiler =
RawHandlebars.JavaScriptCompiler;
RawHandlebars.JavaScriptCompiler.prototype.namespace = "RawHandlebars";
RawHandlebars.precompile = function (value, asObject, { plugins = [] } = {}) {
2021-01-27 06:39:20 -05:00
let ast = Handlebars.parse(value);
2016-06-30 17:10:08 -04:00
replaceGet(ast);
plugins.forEach((plugin) => plugin(ast));
2016-06-30 17:10:08 -04:00
2021-01-27 06:39:20 -05:00
let options = {
2016-06-30 17:10:08 -04:00
knownHelpers: {
get: true,
},
data: true,
stringParams: true,
};
asObject = asObject === undefined ? true : asObject;
2021-01-27 06:39:20 -05:00
let environment = new RawHandlebars.Compiler().compile(ast, options);
2016-06-30 17:10:08 -04:00
return new RawHandlebars.JavaScriptCompiler().compile(
environment,
options,
undefined,
asObject
);
};
RawHandlebars.compile = function (string, { plugins = [] } = {}) {
2021-01-27 06:39:20 -05:00
let ast = Handlebars.parse(string);
2016-06-30 17:10:08 -04:00
replaceGet(ast);
plugins.forEach((plugin) => plugin(ast));
2016-06-30 17:10:08 -04:00
// this forces us to rewrite helpers
2021-01-27 06:39:20 -05:00
let options = { data: true, stringParams: true };
let environment = new RawHandlebars.Compiler().compile(ast, options);
let templateSpec = new RawHandlebars.JavaScriptCompiler().compile(
2016-06-30 17:10:08 -04:00
environment,
options,
undefined,
true
);
2021-01-27 06:39:20 -05:00
let t = RawHandlebars.template(templateSpec);
2016-07-04 14:15:51 -04:00
t.isMethod = false;
2016-06-30 17:10:08 -04:00
2016-07-04 14:15:51 -04:00
return t;
2016-06-30 17:10:08 -04:00
};
2016-07-04 14:15:51 -04:00
}
2016-06-30 17:10:08 -04:00
2016-07-04 14:15:51 -04:00
export function template() {
return RawHandlebars.template.apply(this, arguments);
2016-06-30 17:10:08 -04:00
}
2016-07-04 14:15:51 -04:00
export function precompile() {
return RawHandlebars.precompile.apply(this, arguments);
2016-06-30 17:10:08 -04:00
}
2016-07-04 14:15:51 -04:00
export function compile() {
return RawHandlebars.compile.apply(this, arguments);
2016-06-30 17:10:08 -04:00
}
export default RawHandlebars;