Files
web-apps/vendor/underscore/docs/modules/template.html
2024-03-06 21:54:19 +05:00

1125 lines
38 KiB
HTML
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!DOCTYPE html>
<html>
<head>
<title>template.js</title>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<meta name="viewport" content="width=device-width, target-densitydpi=160dpi, initial-scale=1.0; maximum-scale=1.0; user-scalable=0;">
<link rel="stylesheet" media="all" href="../docco.css" />
</head>
<body>
<div id="container">
<div id="background"></div>
<ul id="jump_to">
<li>
<a class="large" href="javascript:void(0);">Jump To &hellip;</a>
<a class="small" href="javascript:void(0);">+</a>
<div id="jump_wrapper">
<div id="jump_page_wrapper">
<div id="jump_page">
<a class="source" href="_baseCreate.html">
modules/_baseCreate.js
</a>
<a class="source" href="_baseIteratee.html">
modules/_baseIteratee.js
</a>
<a class="source" href="_cb.html">
modules/_cb.js
</a>
<a class="source" href="_chainResult.html">
modules/_chainResult.js
</a>
<a class="source" href="_collectNonEnumProps.html">
modules/_collectNonEnumProps.js
</a>
<a class="source" href="_createAssigner.html">
modules/_createAssigner.js
</a>
<a class="source" href="_createEscaper.html">
modules/_createEscaper.js
</a>
<a class="source" href="_createIndexFinder.html">
modules/_createIndexFinder.js
</a>
<a class="source" href="_createPredicateIndexFinder.html">
modules/_createPredicateIndexFinder.js
</a>
<a class="source" href="_createReduce.html">
modules/_createReduce.js
</a>
<a class="source" href="_createSizePropertyCheck.html">
modules/_createSizePropertyCheck.js
</a>
<a class="source" href="_deepGet.html">
modules/_deepGet.js
</a>
<a class="source" href="_escapeMap.html">
modules/_escapeMap.js
</a>
<a class="source" href="_executeBound.html">
modules/_executeBound.js
</a>
<a class="source" href="_flatten.html">
modules/_flatten.js
</a>
<a class="source" href="_getByteLength.html">
modules/_getByteLength.js
</a>
<a class="source" href="_getLength.html">
modules/_getLength.js
</a>
<a class="source" href="_group.html">
modules/_group.js
</a>
<a class="source" href="_has.html">
modules/_has.js
</a>
<a class="source" href="_hasObjectTag.html">
modules/_hasObjectTag.js
</a>
<a class="source" href="_isArrayLike.html">
modules/_isArrayLike.js
</a>
<a class="source" href="_isBufferLike.html">
modules/_isBufferLike.js
</a>
<a class="source" href="_keyInObj.html">
modules/_keyInObj.js
</a>
<a class="source" href="_methodFingerprint.html">
modules/_methodFingerprint.js
</a>
<a class="source" href="_optimizeCb.html">
modules/_optimizeCb.js
</a>
<a class="source" href="_setup.html">
modules/_setup.js
</a>
<a class="source" href="_shallowProperty.html">
modules/_shallowProperty.js
</a>
<a class="source" href="_stringTagBug.html">
modules/_stringTagBug.js
</a>
<a class="source" href="_tagTester.html">
modules/_tagTester.js
</a>
<a class="source" href="_toBufferView.html">
modules/_toBufferView.js
</a>
<a class="source" href="_toPath.html">
modules/_toPath.js
</a>
<a class="source" href="_unescapeMap.html">
modules/_unescapeMap.js
</a>
<a class="source" href="after.html">
modules/after.js
</a>
<a class="source" href="allKeys.html">
modules/allKeys.js
</a>
<a class="source" href="before.html">
modules/before.js
</a>
<a class="source" href="bind.html">
modules/bind.js
</a>
<a class="source" href="bindAll.html">
modules/bindAll.js
</a>
<a class="source" href="chain.html">
modules/chain.js
</a>
<a class="source" href="chunk.html">
modules/chunk.js
</a>
<a class="source" href="clone.html">
modules/clone.js
</a>
<a class="source" href="compact.html">
modules/compact.js
</a>
<a class="source" href="compose.html">
modules/compose.js
</a>
<a class="source" href="constant.html">
modules/constant.js
</a>
<a class="source" href="contains.html">
modules/contains.js
</a>
<a class="source" href="countBy.html">
modules/countBy.js
</a>
<a class="source" href="create.html">
modules/create.js
</a>
<a class="source" href="debounce.html">
modules/debounce.js
</a>
<a class="source" href="defaults.html">
modules/defaults.js
</a>
<a class="source" href="defer.html">
modules/defer.js
</a>
<a class="source" href="delay.html">
modules/delay.js
</a>
<a class="source" href="difference.html">
modules/difference.js
</a>
<a class="source" href="each.html">
modules/each.js
</a>
<a class="source" href="escape.html">
modules/escape.js
</a>
<a class="source" href="every.html">
modules/every.js
</a>
<a class="source" href="extend.html">
modules/extend.js
</a>
<a class="source" href="extendOwn.html">
modules/extendOwn.js
</a>
<a class="source" href="filter.html">
modules/filter.js
</a>
<a class="source" href="find.html">
modules/find.js
</a>
<a class="source" href="findIndex.html">
modules/findIndex.js
</a>
<a class="source" href="findKey.html">
modules/findKey.js
</a>
<a class="source" href="findLastIndex.html">
modules/findLastIndex.js
</a>
<a class="source" href="findWhere.html">
modules/findWhere.js
</a>
<a class="source" href="first.html">
modules/first.js
</a>
<a class="source" href="flatten.html">
modules/flatten.js
</a>
<a class="source" href="functions.html">
modules/functions.js
</a>
<a class="source" href="get.html">
modules/get.js
</a>
<a class="source" href="groupBy.html">
modules/groupBy.js
</a>
<a class="source" href="has.html">
modules/has.js
</a>
<a class="source" href="identity.html">
modules/identity.js
</a>
<a class="source" href="index-all.html">
modules/index-all.js
</a>
<a class="source" href="index-default.html">
modules/index-default.js
</a>
<a class="source" href="index.html">
modules/index.js
</a>
<a class="source" href="indexBy.html">
modules/indexBy.js
</a>
<a class="source" href="indexOf.html">
modules/indexOf.js
</a>
<a class="source" href="initial.html">
modules/initial.js
</a>
<a class="source" href="intersection.html">
modules/intersection.js
</a>
<a class="source" href="invert.html">
modules/invert.js
</a>
<a class="source" href="invoke.html">
modules/invoke.js
</a>
<a class="source" href="isArguments.html">
modules/isArguments.js
</a>
<a class="source" href="isArray.html">
modules/isArray.js
</a>
<a class="source" href="isArrayBuffer.html">
modules/isArrayBuffer.js
</a>
<a class="source" href="isBoolean.html">
modules/isBoolean.js
</a>
<a class="source" href="isDataView.html">
modules/isDataView.js
</a>
<a class="source" href="isDate.html">
modules/isDate.js
</a>
<a class="source" href="isElement.html">
modules/isElement.js
</a>
<a class="source" href="isEmpty.html">
modules/isEmpty.js
</a>
<a class="source" href="isEqual.html">
modules/isEqual.js
</a>
<a class="source" href="isError.html">
modules/isError.js
</a>
<a class="source" href="isFinite.html">
modules/isFinite.js
</a>
<a class="source" href="isFunction.html">
modules/isFunction.js
</a>
<a class="source" href="isMap.html">
modules/isMap.js
</a>
<a class="source" href="isMatch.html">
modules/isMatch.js
</a>
<a class="source" href="isNaN.html">
modules/isNaN.js
</a>
<a class="source" href="isNull.html">
modules/isNull.js
</a>
<a class="source" href="isNumber.html">
modules/isNumber.js
</a>
<a class="source" href="isObject.html">
modules/isObject.js
</a>
<a class="source" href="isRegExp.html">
modules/isRegExp.js
</a>
<a class="source" href="isSet.html">
modules/isSet.js
</a>
<a class="source" href="isString.html">
modules/isString.js
</a>
<a class="source" href="isSymbol.html">
modules/isSymbol.js
</a>
<a class="source" href="isTypedArray.html">
modules/isTypedArray.js
</a>
<a class="source" href="isUndefined.html">
modules/isUndefined.js
</a>
<a class="source" href="isWeakMap.html">
modules/isWeakMap.js
</a>
<a class="source" href="isWeakSet.html">
modules/isWeakSet.js
</a>
<a class="source" href="iteratee.html">
modules/iteratee.js
</a>
<a class="source" href="keys.html">
modules/keys.js
</a>
<a class="source" href="last.html">
modules/last.js
</a>
<a class="source" href="lastIndexOf.html">
modules/lastIndexOf.js
</a>
<a class="source" href="map.html">
modules/map.js
</a>
<a class="source" href="mapObject.html">
modules/mapObject.js
</a>
<a class="source" href="matcher.html">
modules/matcher.js
</a>
<a class="source" href="max.html">
modules/max.js
</a>
<a class="source" href="memoize.html">
modules/memoize.js
</a>
<a class="source" href="min.html">
modules/min.js
</a>
<a class="source" href="mixin.html">
modules/mixin.js
</a>
<a class="source" href="negate.html">
modules/negate.js
</a>
<a class="source" href="noop.html">
modules/noop.js
</a>
<a class="source" href="now.html">
modules/now.js
</a>
<a class="source" href="object.html">
modules/object.js
</a>
<a class="source" href="omit.html">
modules/omit.js
</a>
<a class="source" href="once.html">
modules/once.js
</a>
<a class="source" href="pairs.html">
modules/pairs.js
</a>
<a class="source" href="partial.html">
modules/partial.js
</a>
<a class="source" href="partition.html">
modules/partition.js
</a>
<a class="source" href="pick.html">
modules/pick.js
</a>
<a class="source" href="pluck.html">
modules/pluck.js
</a>
<a class="source" href="property.html">
modules/property.js
</a>
<a class="source" href="propertyOf.html">
modules/propertyOf.js
</a>
<a class="source" href="random.html">
modules/random.js
</a>
<a class="source" href="range.html">
modules/range.js
</a>
<a class="source" href="reduce.html">
modules/reduce.js
</a>
<a class="source" href="reduceRight.html">
modules/reduceRight.js
</a>
<a class="source" href="reject.html">
modules/reject.js
</a>
<a class="source" href="rest.html">
modules/rest.js
</a>
<a class="source" href="restArguments.html">
modules/restArguments.js
</a>
<a class="source" href="result.html">
modules/result.js
</a>
<a class="source" href="sample.html">
modules/sample.js
</a>
<a class="source" href="shuffle.html">
modules/shuffle.js
</a>
<a class="source" href="size.html">
modules/size.js
</a>
<a class="source" href="some.html">
modules/some.js
</a>
<a class="source" href="sortBy.html">
modules/sortBy.js
</a>
<a class="source" href="sortedIndex.html">
modules/sortedIndex.js
</a>
<a class="source" href="tap.html">
modules/tap.js
</a>
<a class="source" href="template.html">
modules/template.js
</a>
<a class="source" href="templateSettings.html">
modules/templateSettings.js
</a>
<a class="source" href="throttle.html">
modules/throttle.js
</a>
<a class="source" href="times.html">
modules/times.js
</a>
<a class="source" href="toArray.html">
modules/toArray.js
</a>
<a class="source" href="toPath.html">
modules/toPath.js
</a>
<a class="source" href="underscore-array-methods.html">
modules/underscore-array-methods.js
</a>
<a class="source" href="underscore.html">
modules/underscore.js
</a>
<a class="source" href="unescape.html">
modules/unescape.js
</a>
<a class="source" href="union.html">
modules/union.js
</a>
<a class="source" href="uniq.html">
modules/uniq.js
</a>
<a class="source" href="uniqueId.html">
modules/uniqueId.js
</a>
<a class="source" href="unzip.html">
modules/unzip.js
</a>
<a class="source" href="values.html">
modules/values.js
</a>
<a class="source" href="where.html">
modules/where.js
</a>
<a class="source" href="without.html">
modules/without.js
</a>
<a class="source" href="wrap.html">
modules/wrap.js
</a>
<a class="source" href="zip.html">
modules/zip.js
</a>
</div>
</div>
</li>
</ul>
<ul class="sections">
<li id="title">
<div class="annotation">
<h1>template.js</h1>
</div>
</li>
<li id="section-1">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-1">&#182;</a>
</div>
</div>
<div class="content"><div class='highlight'><pre><span class="hljs-keyword">import</span> defaults <span class="hljs-keyword">from</span> <span class="hljs-string">&#x27;./defaults.js&#x27;</span>;
<span class="hljs-keyword">import</span> _ <span class="hljs-keyword">from</span> <span class="hljs-string">&#x27;./underscore.js&#x27;</span>;
<span class="hljs-keyword">import</span> <span class="hljs-string">&#x27;./templateSettings.js&#x27;</span>;</pre></div></div>
</li>
<li id="section-2">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-2">&#182;</a>
</div>
<p>When customizing <code>_.templateSettings</code>, if you dont want to define an
interpolation, evaluation or escaping regex, we need one that is
guaranteed not to match.</p>
</div>
<div class="content"><div class='highlight'><pre><span class="hljs-keyword">var</span> noMatch = <span class="hljs-regexp">/(.)^/</span>;</pre></div></div>
</li>
<li id="section-3">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-3">&#182;</a>
</div>
<p>Certain characters need to be escaped so that they can be put into a
string literal.</p>
</div>
<div class="content"><div class='highlight'><pre><span class="hljs-keyword">var</span> escapes = {
<span class="hljs-string">&quot;&#x27;&quot;</span>: <span class="hljs-string">&quot;&#x27;&quot;</span>,
<span class="hljs-string">&#x27;\\&#x27;</span>: <span class="hljs-string">&#x27;\\&#x27;</span>,
<span class="hljs-string">&#x27;\r&#x27;</span>: <span class="hljs-string">&#x27;r&#x27;</span>,
<span class="hljs-string">&#x27;\n&#x27;</span>: <span class="hljs-string">&#x27;n&#x27;</span>,
<span class="hljs-string">&#x27;\u2028&#x27;</span>: <span class="hljs-string">&#x27;u2028&#x27;</span>,
<span class="hljs-string">&#x27;\u2029&#x27;</span>: <span class="hljs-string">&#x27;u2029&#x27;</span>
};
<span class="hljs-keyword">var</span> escapeRegExp = <span class="hljs-regexp">/\\|&#x27;|\r|\n|\u2028|\u2029/g</span>;
<span class="hljs-keyword">function</span> <span class="hljs-title function_">escapeChar</span>(<span class="hljs-params">match</span>) {
<span class="hljs-keyword">return</span> <span class="hljs-string">&#x27;\\&#x27;</span> + escapes[match];
}</pre></div></div>
</li>
<li id="section-4">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-4">&#182;</a>
</div>
<p>In order to prevent third-party code injection through
<code>_.templateSettings.variable</code>, we test it against the following regular
expression. It is intentionally a bit more liberal than just matching valid
identifiers, but still prevents possible loopholes through defaults or
destructuring assignment.</p>
</div>
<div class="content"><div class='highlight'><pre><span class="hljs-keyword">var</span> bareIdentifier = <span class="hljs-regexp">/^\s*(\w|\$)+\s*$/</span>;</pre></div></div>
</li>
<li id="section-5">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-5">&#182;</a>
</div>
<p>JavaScript micro-templating, similar to John Resigs implementation.
Underscore templating handles arbitrary delimiters, preserves whitespace,
and correctly escapes quotes within interpolated code.
NB: <code>oldSettings</code> only exists for backwards compatibility.</p>
</div>
<div class="content"><div class='highlight'><pre><span class="hljs-keyword">export</span> <span class="hljs-keyword">default</span> <span class="hljs-keyword">function</span> <span class="hljs-title function_">template</span>(<span class="hljs-params">text, settings, oldSettings</span>) {
<span class="hljs-keyword">if</span> (!settings &amp;&amp; oldSettings) settings = oldSettings;
settings = <span class="hljs-title function_">defaults</span>({}, settings, _.<span class="hljs-property">templateSettings</span>);</pre></div></div>
</li>
<li id="section-6">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-6">&#182;</a>
</div>
<p>Combine delimiters into one regular expression via alternation.</p>
</div>
<div class="content"><div class='highlight'><pre> <span class="hljs-keyword">var</span> matcher = <span class="hljs-title class_">RegExp</span>([
(settings.<span class="hljs-property">escape</span> || noMatch).<span class="hljs-property">source</span>,
(settings.<span class="hljs-property">interpolate</span> || noMatch).<span class="hljs-property">source</span>,
(settings.<span class="hljs-property">evaluate</span> || noMatch).<span class="hljs-property">source</span>
].<span class="hljs-title function_">join</span>(<span class="hljs-string">&#x27;|&#x27;</span>) + <span class="hljs-string">&#x27;|$&#x27;</span>, <span class="hljs-string">&#x27;g&#x27;</span>);</pre></div></div>
</li>
<li id="section-7">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-7">&#182;</a>
</div>
<p>Compile the template source, escaping string literals appropriately.</p>
</div>
<div class="content"><div class='highlight'><pre> <span class="hljs-keyword">var</span> index = <span class="hljs-number">0</span>;
<span class="hljs-keyword">var</span> source = <span class="hljs-string">&quot;__p+=&#x27;&quot;</span>;
text.<span class="hljs-title function_">replace</span>(matcher, <span class="hljs-keyword">function</span>(<span class="hljs-params">match, <span class="hljs-built_in">escape</span>, interpolate, evaluate, offset</span>) {
source += text.<span class="hljs-title function_">slice</span>(index, offset).<span class="hljs-title function_">replace</span>(escapeRegExp, escapeChar);
index = offset + match.<span class="hljs-property">length</span>;
<span class="hljs-keyword">if</span> (<span class="hljs-built_in">escape</span>) {
source += <span class="hljs-string">&quot;&#x27;+\n((__t=(&quot;</span> + <span class="hljs-built_in">escape</span> + <span class="hljs-string">&quot;))==null?&#x27;&#x27;:_.escape(__t))+\n&#x27;&quot;</span>;
} <span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span> (interpolate) {
source += <span class="hljs-string">&quot;&#x27;+\n((__t=(&quot;</span> + interpolate + <span class="hljs-string">&quot;))==null?&#x27;&#x27;:__t)+\n&#x27;&quot;</span>;
} <span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span> (evaluate) {
source += <span class="hljs-string">&quot;&#x27;;\n&quot;</span> + evaluate + <span class="hljs-string">&quot;\n__p+=&#x27;&quot;</span>;
}</pre></div></div>
</li>
<li id="section-8">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-8">&#182;</a>
</div>
<p>Adobe VMs need the match returned to produce the correct offset.</p>
</div>
<div class="content"><div class='highlight'><pre> <span class="hljs-keyword">return</span> match;
});
source += <span class="hljs-string">&quot;&#x27;;\n&quot;</span>;
<span class="hljs-keyword">var</span> argument = settings.<span class="hljs-property">variable</span>;
<span class="hljs-keyword">if</span> (argument) {</pre></div></div>
</li>
<li id="section-9">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-9">&#182;</a>
</div>
<p>Insure against third-party code injection. (CVE-2021-23358)</p>
</div>
<div class="content"><div class='highlight'><pre> <span class="hljs-keyword">if</span> (!bareIdentifier.<span class="hljs-title function_">test</span>(argument)) <span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> <span class="hljs-title class_">Error</span>(
<span class="hljs-string">&#x27;variable is not a bare identifier: &#x27;</span> + argument
);
} <span class="hljs-keyword">else</span> {</pre></div></div>
</li>
<li id="section-10">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-10">&#182;</a>
</div>
<p>If a variable is not specified, place data values in local scope.</p>
</div>
<div class="content"><div class='highlight'><pre> source = <span class="hljs-string">&#x27;with(obj||{}){\n&#x27;</span> + source + <span class="hljs-string">&#x27;}\n&#x27;</span>;
argument = <span class="hljs-string">&#x27;obj&#x27;</span>;
}
source = <span class="hljs-string">&quot;var __t,__p=&#x27;&#x27;,__j=Array.prototype.join,&quot;</span> +
<span class="hljs-string">&quot;print=function(){__p+=__j.call(arguments,&#x27;&#x27;);};\n&quot;</span> +
source + <span class="hljs-string">&#x27;return __p;\n&#x27;</span>;
<span class="hljs-keyword">var</span> render;
<span class="hljs-keyword">try</span> {
render = <span class="hljs-keyword">new</span> <span class="hljs-title class_">Function</span>(argument, <span class="hljs-string">&#x27;_&#x27;</span>, source);
} <span class="hljs-keyword">catch</span> (e) {
e.<span class="hljs-property">source</span> = source;
<span class="hljs-keyword">throw</span> e;
}
<span class="hljs-keyword">var</span> template = <span class="hljs-keyword">function</span>(<span class="hljs-params">data</span>) {
<span class="hljs-keyword">return</span> render.<span class="hljs-title function_">call</span>(<span class="hljs-variable language_">this</span>, data, _);
};</pre></div></div>
</li>
<li id="section-11">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-11">&#182;</a>
</div>
<p>Provide the compiled source as a convenience for precompilation.</p>
</div>
<div class="content"><div class='highlight'><pre> template.<span class="hljs-property">source</span> = <span class="hljs-string">&#x27;function(&#x27;</span> + argument + <span class="hljs-string">&#x27;){\n&#x27;</span> + source + <span class="hljs-string">&#x27;}&#x27;</span>;
<span class="hljs-keyword">return</span> template;
}</pre></div></div>
</li>
</ul>
</div>
<script src="https://code.jquery.com/jquery-3.4.1.min.js"></script>
<script>
// We run a script at page load to inject the links after the fact.
// It would be more elegant to do this at page generation time, but
// unfortunately the docco infrastructure doesn't support this very well.
// Highlighted code is passed along as an unparsed HTML string, which would
// make this very tricky. In the script below, we exploit the fact that the
// HTML has already been parsed by the browser.
(function() {
// Define a regex for stripping the .html extension from anchor hrefs.
var extPattern = /\.html$/;
// Collect all module paths that we have an HTML page for.
var moduleMap = {};
$('#jump_page a.source').each(function() {
// Fortunately, translating anchor hrefs to ES module paths is easy,
// because both systems work relative to the current file by default.
var href = $(this).attr('href');
var path = href.replace(extPattern, '').split('/');
if (path[0] !== '..') path.unshift('.');
var normPath = path.join('/');
// Support both paths with and without extension.
moduleMap[normPath] = moduleMap[normPath + '.js'] = href;
});
// Find all 'from' keywords followed by a string (ES6 import statements).
$('.hljs-keyword').filter(function() {
var text = $(this).text();
return text === 'from' || text === 'import';
}).next('.hljs-string').each(function() {
// Finally, for each of these strings, replace it by a link if we have
// a matching HTML page.
var text = $(this).text();
var quote = text[0];
var path = text.slice(1, -1);
var matchingDoc = moduleMap[path];
if (!matchingDoc) return;
$(this).html(
quote + '<a href="' + matchingDoc + '">' + path + '</a>' + quote
);
});
}());
</script>
</body>
</html>