1 var assignInWith = require(
'./assignInWith'),
2 attempt = require(
'./attempt'),
3 baseValues = require(
'./_baseValues'),
4 customDefaultsAssignIn = require(
'./_customDefaultsAssignIn'),
5 escapeStringChar = require(
'./_escapeStringChar'),
6 isError = require(
'./isError'),
7 isIterateeCall = require(
'./_isIterateeCall'),
8 keys = require(
'./keys'),
9 reInterpolate = require(
'./_reInterpolate'),
10 templateSettings = require(
'./templateSettings'),
11 toString = require(
'./toString');
14 var reEmptyStringLeading = /\b__p \+=
'';/g,
15 reEmptyStringMiddle = /\b(__p \+=)
'' \+/g,
16 reEmptyStringTrailing = /(__e\(.*?\)|\b__t\)) \+\n
'';/g;
22 var reEsTemplate = /\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g;
25 var reNoMatch = /($^)/;
28 var reUnescapedString = /[
'\n\r\u2028\u2029\\]/g;
134 function template(string, options, guard) {
135 // Based on John Resig's `tmpl` implementation
138 var settings = templateSettings.imports._.templateSettings || templateSettings;
140 if (guard && isIterateeCall(
string, options, guard)) {
143 string = toString(
string);
144 options = assignInWith({}, options, settings, customDefaultsAssignIn);
146 var imports = assignInWith({}, options.imports, settings.imports, customDefaultsAssignIn),
147 importsKeys = keys(imports),
148 importsValues = baseValues(imports, importsKeys);
153 interpolate = options.interpolate || reNoMatch,
157 var reDelimiters = RegExp(
158 (options.escape || reNoMatch).source +
'|' +
159 interpolate.source +
'|' +
160 (interpolate === reInterpolate ? reEsTemplate : reNoMatch).source +
'|' +
161 (options.evaluate || reNoMatch).source +
'|$'
165 var sourceURL =
'sourceURL' in options ?
'//# sourceURL=' + options.sourceURL +
'\n' :
'';
167 string.replace(reDelimiters,
function(match, escapeValue, interpolateValue, esTemplateValue, evaluateValue, offset) {
168 interpolateValue || (interpolateValue = esTemplateValue);
171 source +=
string.slice(index, offset).replace(reUnescapedString, escapeStringChar);
176 source +=
"' +\n__e(" + escapeValue +
") +\n'";
180 source +=
"';\n" + evaluateValue +
";\n__p += '";
182 if (interpolateValue) {
183 source +=
"' +\n((__t = (" + interpolateValue +
")) == null ? '' : __t) +\n'";
185 index = offset + match.length;
196 var variable = options.variable;
198 source =
'with (obj) {\n' + source +
'\n}\n';
201 source = (isEvaluating ? source.replace(reEmptyStringLeading,
'') : source)
202 .replace(reEmptyStringMiddle,
'$1')
203 .replace(reEmptyStringTrailing,
'$1;');
206 source =
'function(' + (variable ||
'obj') +
') {\n' +
209 :
'obj || (obj = {});\n'
211 "var __t, __p = ''" +
217 ?
', __j = Array.prototype.join;\n' +
218 "function print() { __p += __j.call(arguments, '') }\n"
224 var result = attempt(
function() {
225 return Function(importsKeys, sourceURL +
'return ' + source)
226 .apply(undefined, importsValues);
231 result.source = source;
232 if (isError(result)) {
238 module.exports =
template;