mirror of
https://github.com/zulip/zulip.git
synced 2025-11-09 16:37:23 +00:00
This was "npm update handlebars" followed by copying runtime.js into the static directory and restoring the copyright header. (imported from commit 69d30cbfcb3b776cdfdcffa17a87704540eab76a)
134 lines
4.1 KiB
JavaScript
134 lines
4.1 KiB
JavaScript
module Utils from "./utils";
|
|
import Exception from "./exception";
|
|
import { COMPILER_REVISION, REVISION_CHANGES } from "./base";
|
|
|
|
export function checkRevision(compilerInfo) {
|
|
var compilerRevision = compilerInfo && compilerInfo[0] || 1,
|
|
currentRevision = COMPILER_REVISION;
|
|
|
|
if (compilerRevision !== currentRevision) {
|
|
if (compilerRevision < currentRevision) {
|
|
var runtimeVersions = REVISION_CHANGES[currentRevision],
|
|
compilerVersions = REVISION_CHANGES[compilerRevision];
|
|
throw new Exception("Template was precompiled with an older version of Handlebars than the current runtime. "+
|
|
"Please update your precompiler to a newer version ("+runtimeVersions+") or downgrade your runtime to an older version ("+compilerVersions+").");
|
|
} else {
|
|
// Use the embedded version info since the runtime doesn't know about this revision yet
|
|
throw new Exception("Template was precompiled with a newer version of Handlebars than the current runtime. "+
|
|
"Please update your runtime to a newer version ("+compilerInfo[1]+").");
|
|
}
|
|
}
|
|
}
|
|
|
|
// TODO: Remove this line and break up compilePartial
|
|
|
|
export function template(templateSpec, env) {
|
|
if (!env) {
|
|
throw new Exception("No environment passed to template");
|
|
}
|
|
|
|
// Note: Using env.VM references rather than local var references throughout this section to allow
|
|
// for external users to override these as psuedo-supported APIs.
|
|
var invokePartialWrapper = function(partial, name, context, helpers, partials, data) {
|
|
var result = env.VM.invokePartial.apply(this, arguments);
|
|
if (result != null) { return result; }
|
|
|
|
if (env.compile) {
|
|
var options = { helpers: helpers, partials: partials, data: data };
|
|
partials[name] = env.compile(partial, { data: data !== undefined }, env);
|
|
return partials[name](context, options);
|
|
} else {
|
|
throw new Exception("The partial " + name + " could not be compiled when running in runtime-only mode");
|
|
}
|
|
};
|
|
|
|
// Just add water
|
|
var container = {
|
|
escapeExpression: Utils.escapeExpression,
|
|
invokePartial: invokePartialWrapper,
|
|
programs: [],
|
|
program: function(i, fn, data) {
|
|
var programWrapper = this.programs[i];
|
|
if(data) {
|
|
programWrapper = program(i, fn, data);
|
|
} else if (!programWrapper) {
|
|
programWrapper = this.programs[i] = program(i, fn);
|
|
}
|
|
return programWrapper;
|
|
},
|
|
merge: function(param, common) {
|
|
var ret = param || common;
|
|
|
|
if (param && common && (param !== common)) {
|
|
ret = {};
|
|
Utils.extend(ret, common);
|
|
Utils.extend(ret, param);
|
|
}
|
|
return ret;
|
|
},
|
|
programWithDepth: env.VM.programWithDepth,
|
|
noop: env.VM.noop,
|
|
compilerInfo: null
|
|
};
|
|
|
|
return function(context, options) {
|
|
options = options || {};
|
|
var namespace = options.partial ? options : env,
|
|
helpers,
|
|
partials;
|
|
|
|
if (!options.partial) {
|
|
helpers = options.helpers;
|
|
partials = options.partials;
|
|
}
|
|
var result = templateSpec.call(
|
|
container,
|
|
namespace, context,
|
|
helpers,
|
|
partials,
|
|
options.data);
|
|
|
|
if (!options.partial) {
|
|
env.VM.checkRevision(container.compilerInfo);
|
|
}
|
|
|
|
return result;
|
|
};
|
|
}
|
|
|
|
export function programWithDepth(i, fn, data /*, $depth */) {
|
|
var args = Array.prototype.slice.call(arguments, 3);
|
|
|
|
var prog = function(context, options) {
|
|
options = options || {};
|
|
|
|
return fn.apply(this, [context, options.data || data].concat(args));
|
|
};
|
|
prog.program = i;
|
|
prog.depth = args.length;
|
|
return prog;
|
|
}
|
|
|
|
export function program(i, fn, data) {
|
|
var prog = function(context, options) {
|
|
options = options || {};
|
|
|
|
return fn(context, options.data || data);
|
|
};
|
|
prog.program = i;
|
|
prog.depth = 0;
|
|
return prog;
|
|
}
|
|
|
|
export function invokePartial(partial, name, context, helpers, partials, data) {
|
|
var options = { partial: true, helpers: helpers, partials: partials, data: data };
|
|
|
|
if(partial === undefined) {
|
|
throw new Exception("The partial " + name + " could not be found");
|
|
} else if(partial instanceof Function) {
|
|
return partial(context, options);
|
|
}
|
|
}
|
|
|
|
export function noop() { return ""; }
|