mirror of
https://github.com/discourse/discourse.git
synced 2025-05-23 23:11:13 +08:00
DEV: Make discourse-common
an Ember addon. (#9578)
This is to help with the migration to Ember CLI. In the current running version of Discourse everything should be the same as before, just with a few extra files that are not used. However, using Ember CLI this can be installed as an Ember addon. Co-Authored-By: Jarek Radosz <jradosz@gmail.com>
This commit is contained in:
@ -0,0 +1,131 @@
|
||||
// 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
|
||||
|
||||
const RawHandlebars = Handlebars.create();
|
||||
|
||||
function buildPath(blk, args) {
|
||||
var result = {
|
||||
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) {
|
||||
var visitor = new Handlebars.Visitor();
|
||||
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) {
|
||||
var paramName = block.program.blockParams[0];
|
||||
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);
|
||||
}
|
||||
|
||||
if (Handlebars.Compiler) {
|
||||
RawHandlebars.Compiler = function() {};
|
||||
RawHandlebars.Compiler.prototype = Object.create(
|
||||
Handlebars.Compiler.prototype
|
||||
);
|
||||
RawHandlebars.Compiler.prototype.compiler = RawHandlebars.Compiler;
|
||||
|
||||
RawHandlebars.JavaScriptCompiler = function() {};
|
||||
|
||||
RawHandlebars.JavaScriptCompiler.prototype = Object.create(
|
||||
Handlebars.JavaScriptCompiler.prototype
|
||||
);
|
||||
RawHandlebars.JavaScriptCompiler.prototype.compiler =
|
||||
RawHandlebars.JavaScriptCompiler;
|
||||
RawHandlebars.JavaScriptCompiler.prototype.namespace = "RawHandlebars";
|
||||
|
||||
RawHandlebars.precompile = function(value, asObject) {
|
||||
var ast = Handlebars.parse(value);
|
||||
replaceGet(ast);
|
||||
|
||||
var options = {
|
||||
knownHelpers: {
|
||||
get: true
|
||||
},
|
||||
data: true,
|
||||
stringParams: true
|
||||
};
|
||||
|
||||
asObject = asObject === undefined ? true : asObject;
|
||||
|
||||
var environment = new RawHandlebars.Compiler().compile(ast, options);
|
||||
return new RawHandlebars.JavaScriptCompiler().compile(
|
||||
environment,
|
||||
options,
|
||||
undefined,
|
||||
asObject
|
||||
);
|
||||
};
|
||||
|
||||
RawHandlebars.compile = function(string) {
|
||||
var ast = Handlebars.parse(string);
|
||||
replaceGet(ast);
|
||||
|
||||
// this forces us to rewrite helpers
|
||||
var options = { data: true, stringParams: true };
|
||||
var environment = new RawHandlebars.Compiler().compile(ast, options);
|
||||
var templateSpec = new RawHandlebars.JavaScriptCompiler().compile(
|
||||
environment,
|
||||
options,
|
||||
undefined,
|
||||
true
|
||||
);
|
||||
|
||||
var t = RawHandlebars.template(templateSpec);
|
||||
t.isMethod = false;
|
||||
|
||||
return t;
|
||||
};
|
||||
}
|
||||
|
||||
export function template() {
|
||||
return RawHandlebars.template.apply(this, arguments);
|
||||
}
|
||||
|
||||
export function precompile() {
|
||||
return RawHandlebars.precompile.apply(this, arguments);
|
||||
}
|
||||
|
||||
export function compile() {
|
||||
return RawHandlebars.compile.apply(this, arguments);
|
||||
}
|
||||
|
||||
export default RawHandlebars;
|
Reference in New Issue
Block a user