summaryrefslogtreecommitdiff
path: root/node_modules/twig/docs/twig.html
diff options
context:
space:
mode:
Diffstat (limited to 'node_modules/twig/docs/twig.html')
-rw-r--r--node_modules/twig/docs/twig.html11250
1 files changed, 0 insertions, 11250 deletions
diff --git a/node_modules/twig/docs/twig.html b/node_modules/twig/docs/twig.html
deleted file mode 100644
index 687abbd..0000000
--- a/node_modules/twig/docs/twig.html
+++ /dev/null
@@ -1,11250 +0,0 @@
-<!DOCTYPE html>
-
-<html>
-<head>
- <title>twig.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 class="sections">
-
- <li id="title">
- <div class="annotation">
- <h1>twig.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-comment">/**
- * Twig.js 0.8.9
- *
- * @copyright 2011-2015 John Roepke and the Twig.js Contributors
- * @license Available under the BSD 2-Clause License
- * @link https://github.com/justjohn/twig.js
- */</span>
-
-<span class="hljs-keyword">var</span> Twig = (<span class="hljs-function"><span class="hljs-keyword">function</span> (<span class="hljs-params">Twig</span>) </span>{
-
- Twig.VERSION = <span class="hljs-string">"0.8.9"</span>;
-
- <span class="hljs-keyword">return</span> Twig;
-})(Twig || {});</pre></div></div>
-
- </li>
-
-
- <li id="section-2">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-2">&#182;</a>
- </div>
- <pre><code>Twig.js
-Available under the BSD <span class="hljs-number">2</span>-Clause License
-https:<span class="hljs-comment">//github.com/justjohn/twig.js</span>
-</code></pre>
- </div>
-
- <div class="content"><div class='highlight'><pre>
-<span class="hljs-keyword">var</span> Twig = (<span class="hljs-function"><span class="hljs-keyword">function</span> (<span class="hljs-params">Twig</span>) </span>{
-<span class="hljs-meta"> "use strict"</span>;</pre></div></div>
-
- </li>
-
-
- <li id="section-3">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-3">&#182;</a>
- </div>
- <h2 id="twig-core-js">twig.core.js</h2>
-<p>This file handles template level tokenizing, compiling and parsing.</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre>
- Twig.trace = <span class="hljs-literal">false</span>;
- Twig.debug = <span class="hljs-literal">false</span>;</pre></div></div>
-
- </li>
-
-
- <li id="section-4">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-4">&#182;</a>
- </div>
- <p>Default caching to true for the improved performance it offers</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> Twig.cache = <span class="hljs-literal">true</span>;
-
- Twig.placeholders = {
- parent: <span class="hljs-string">"{{|PARENT|}}"</span>
- };
-
- <span class="hljs-comment">/**
- * Fallback for Array.indexOf for IE8 et al
- */</span>
- Twig.indexOf = <span class="hljs-function"><span class="hljs-keyword">function</span> (<span class="hljs-params">arr, searchElement <span class="hljs-comment">/*, fromIndex */</span> </span>) </span>{
- <span class="hljs-keyword">if</span> (<span class="hljs-built_in">Array</span>.prototype.hasOwnProperty(<span class="hljs-string">"indexOf"</span>)) {
- <span class="hljs-keyword">return</span> arr.indexOf(searchElement);
- }
- <span class="hljs-keyword">if</span> (arr === <span class="hljs-keyword">void</span> <span class="hljs-number">0</span> || arr === <span class="hljs-literal">null</span>) {
- <span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> <span class="hljs-built_in">TypeError</span>();
- }
- <span class="hljs-keyword">var</span> t = <span class="hljs-built_in">Object</span>(arr);
- <span class="hljs-keyword">var</span> len = t.length &gt;&gt;&gt; <span class="hljs-number">0</span>;
- <span class="hljs-keyword">if</span> (len === <span class="hljs-number">0</span>) {
- <span class="hljs-keyword">return</span> <span class="hljs-number">-1</span>;
- }
- <span class="hljs-keyword">var</span> n = <span class="hljs-number">0</span>;
- <span class="hljs-keyword">if</span> (<span class="hljs-built_in">arguments</span>.length &gt; <span class="hljs-number">0</span>) {
- n = <span class="hljs-built_in">Number</span>(<span class="hljs-built_in">arguments</span>[<span class="hljs-number">1</span>]);
- <span class="hljs-keyword">if</span> (n !== n) { <span class="hljs-comment">// shortcut for verifying if it's NaN</span>
- n = <span class="hljs-number">0</span>;
- } <span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span> (n !== <span class="hljs-number">0</span> &amp;&amp; n !== <span class="hljs-literal">Infinity</span> &amp;&amp; n !== -<span class="hljs-literal">Infinity</span>) {
- n = (n &gt; <span class="hljs-number">0</span> || <span class="hljs-number">-1</span>) * <span class="hljs-built_in">Math</span>.floor(<span class="hljs-built_in">Math</span>.abs(n));
- }
- }
- <span class="hljs-keyword">if</span> (n &gt;= len) {</pre></div></div>
-
- </li>
-
-
- <li id="section-5">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-5">&#182;</a>
- </div>
- <p>console.log(“indexOf not found1 “, JSON.stringify(searchElement), JSON.stringify(arr));</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">return</span> <span class="hljs-number">-1</span>;
- }
- <span class="hljs-keyword">var</span> k = n &gt;= <span class="hljs-number">0</span> ? n : <span class="hljs-built_in">Math</span>.max(len - <span class="hljs-built_in">Math</span>.abs(n), <span class="hljs-number">0</span>);
- <span class="hljs-keyword">for</span> (; k &lt; len; k++) {
- <span class="hljs-keyword">if</span> (k <span class="hljs-keyword">in</span> t &amp;&amp; t[k] === searchElement) {
- <span class="hljs-keyword">return</span> k;
- }
- }
- <span class="hljs-keyword">if</span> (arr == searchElement) {
- <span class="hljs-keyword">return</span> <span class="hljs-number">0</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>console.log(“indexOf not found2 “, JSON.stringify(searchElement), JSON.stringify(arr));</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre>
- <span class="hljs-keyword">return</span> <span class="hljs-number">-1</span>;
- }
-
- Twig.forEach = <span class="hljs-function"><span class="hljs-keyword">function</span> (<span class="hljs-params">arr, callback, thisArg</span>) </span>{
- <span class="hljs-keyword">if</span> (<span class="hljs-built_in">Array</span>.prototype.forEach ) {
- <span class="hljs-keyword">return</span> arr.forEach(callback, thisArg);
- }
-
- <span class="hljs-keyword">var</span> T, k;
-
- <span class="hljs-keyword">if</span> ( arr == <span class="hljs-literal">null</span> ) {
- <span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> <span class="hljs-built_in">TypeError</span>( <span class="hljs-string">" this is null or not defined"</span> );
- }</pre></div></div>
-
- </li>
-
-
- <li id="section-7">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-7">&#182;</a>
- </div>
- <ol>
-<li>Let O be the result of calling ToObject passing the |this| value as the argument.</li>
-</ol>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">var</span> O = <span class="hljs-built_in">Object</span>(arr);</pre></div></div>
-
- </li>
-
-
- <li id="section-8">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-8">&#182;</a>
- </div>
- <ol>
-<li>Let lenValue be the result of calling the Get internal method of O with the argument “length”.</li>
-<li>Let len be ToUint32(lenValue).</li>
-</ol>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">var</span> len = O.length &gt;&gt;&gt; <span class="hljs-number">0</span>; <span class="hljs-comment">// Hack to convert O.length to a UInt32</span></pre></div></div>
-
- </li>
-
-
- <li id="section-9">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-9">&#182;</a>
- </div>
- <ol>
-<li>If IsCallable(callback) is false, throw a TypeError exception.
-See: <a href="http://es5.github.com/#x9.11">http://es5.github.com/#x9.11</a></li>
-</ol>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">if</span> ( {}.toString.call(callback) != <span class="hljs-string">"[object Function]"</span> ) {
- <span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> <span class="hljs-built_in">TypeError</span>( callback + <span class="hljs-string">" is not a function"</span> );
- }</pre></div></div>
-
- </li>
-
-
- <li id="section-10">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-10">&#182;</a>
- </div>
- <ol>
-<li>If thisArg was supplied, let T be thisArg; else let T be undefined.</li>
-</ol>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">if</span> ( thisArg ) {
- T = thisArg;
- }</pre></div></div>
-
- </li>
-
-
- <li id="section-11">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-11">&#182;</a>
- </div>
- <ol>
-<li>Let k be 0</li>
-</ol>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> k = <span class="hljs-number">0</span>;</pre></div></div>
-
- </li>
-
-
- <li id="section-12">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-12">&#182;</a>
- </div>
- <ol>
-<li>Repeat, while k &lt; len</li>
-</ol>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">while</span>( k &lt; len ) {
-
- <span class="hljs-keyword">var</span> kValue;</pre></div></div>
-
- </li>
-
-
- <li id="section-13">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-13">&#182;</a>
- </div>
- <p>a. Let Pk be ToString(k).
- This is implicit for LHS operands of the in operator
-b. Let kPresent be the result of calling the HasProperty internal method of O with argument Pk.
- This step can be combined with c
-c. If kPresent is true, then</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">if</span> ( k <span class="hljs-keyword">in</span> O ) {</pre></div></div>
-
- </li>
-
-
- <li id="section-14">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-14">&#182;</a>
- </div>
- <p>i. Let kValue be the result of calling the Get internal method of O with argument Pk.</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> kValue = O[ k ];</pre></div></div>
-
- </li>
-
-
- <li id="section-15">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-15">&#182;</a>
- </div>
- <p>ii. Call the Call internal method of callback with T as the this value and
-argument list containing kValue, k, and O.</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> callback.call( T, kValue, k, O );
- }</pre></div></div>
-
- </li>
-
-
- <li id="section-16">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-16">&#182;</a>
- </div>
- <p>d. Increase k by 1.</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> k++;
- }</pre></div></div>
-
- </li>
-
-
- <li id="section-17">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-17">&#182;</a>
- </div>
- <ol>
-<li>return undefined</li>
-</ol>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> };
-
- Twig.merge = <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">target, source, onlyChanged</span>) </span>{
- Twig.forEach(<span class="hljs-built_in">Object</span>.keys(source), <span class="hljs-function"><span class="hljs-keyword">function</span> (<span class="hljs-params">key</span>) </span>{
- <span class="hljs-keyword">if</span> (onlyChanged &amp;&amp; !(key <span class="hljs-keyword">in</span> target)) {
- <span class="hljs-keyword">return</span>;
- }
-
- target[key] = source[key]
- });
-
- <span class="hljs-keyword">return</span> target;
- };
-
- <span class="hljs-comment">/**
- * Exception thrown by twig.js.
- */</span>
- Twig.Error = <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">message</span>) </span>{
- <span class="hljs-keyword">this</span>.message = message;
- <span class="hljs-keyword">this</span>.name = <span class="hljs-string">"TwigException"</span>;
- <span class="hljs-keyword">this</span>.type = <span class="hljs-string">"TwigException"</span>;
- };
-
- <span class="hljs-comment">/**
- * Get the string representation of a Twig error.
- */</span>
- Twig.Error.prototype.toString = <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"></span>) </span>{
- <span class="hljs-keyword">var</span> output = <span class="hljs-keyword">this</span>.name + <span class="hljs-string">": "</span> + <span class="hljs-keyword">this</span>.message;
-
- <span class="hljs-keyword">return</span> output;
- };
-
- <span class="hljs-comment">/**
- * Wrapper for logging to the console.
- */</span>
- Twig.log = {
- trace: <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"></span>) </span>{<span class="hljs-keyword">if</span> (Twig.trace &amp;&amp; <span class="hljs-built_in">console</span>) {<span class="hljs-built_in">console</span>.log(<span class="hljs-built_in">Array</span>.prototype.slice.call(<span class="hljs-built_in">arguments</span>));}},
- debug: <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"></span>) </span>{<span class="hljs-keyword">if</span> (Twig.debug &amp;&amp; <span class="hljs-built_in">console</span>) {<span class="hljs-built_in">console</span>.log(<span class="hljs-built_in">Array</span>.prototype.slice.call(<span class="hljs-built_in">arguments</span>));}}
- };
-
-
- <span class="hljs-keyword">if</span> (<span class="hljs-keyword">typeof</span> <span class="hljs-built_in">console</span> !== <span class="hljs-string">"undefined"</span>) {
- <span class="hljs-keyword">if</span> (<span class="hljs-keyword">typeof</span> <span class="hljs-built_in">console</span>.error !== <span class="hljs-string">"undefined"</span>) {
- Twig.log.error = <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"></span>) </span>{
- <span class="hljs-built_in">console</span>.error.apply(<span class="hljs-built_in">console</span>, <span class="hljs-built_in">arguments</span>);
- }
- } <span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span> (<span class="hljs-keyword">typeof</span> <span class="hljs-built_in">console</span>.log !== <span class="hljs-string">"undefined"</span>) {
- Twig.log.error = <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"></span>) </span>{
- <span class="hljs-built_in">console</span>.log.apply(<span class="hljs-built_in">console</span>, <span class="hljs-built_in">arguments</span>);
- }
- }
- } <span class="hljs-keyword">else</span> {
- Twig.log.error = <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"></span>)</span>{};
- }
-
- <span class="hljs-comment">/**
- * Wrapper for child context objects in Twig.
- *
- * @param {Object} context Values to initialize the context with.
- */</span>
- Twig.ChildContext = <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">context</span>) </span>{
- <span class="hljs-keyword">var</span> ChildContext = <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">ChildContext</span>(<span class="hljs-params"></span>) </span>{};
- ChildContext.prototype = context;
- <span class="hljs-keyword">return</span> <span class="hljs-keyword">new</span> ChildContext();
- };
-
- <span class="hljs-comment">/**
- * Container for methods related to handling high level template tokens
- * (for example: {{ expression }}, {% logic %}, {# comment #}, raw data)
- */</span>
- Twig.token = {};
-
- <span class="hljs-comment">/**
- * Token types.
- */</span>
- Twig.token.type = {
- output: <span class="hljs-string">'output'</span>,
- logic: <span class="hljs-string">'logic'</span>,
- comment: <span class="hljs-string">'comment'</span>,
- raw: <span class="hljs-string">'raw'</span>,
- output_whitespace_pre: <span class="hljs-string">'output_whitespace_pre'</span>,
- output_whitespace_post: <span class="hljs-string">'output_whitespace_post'</span>,
- output_whitespace_both: <span class="hljs-string">'output_whitespace_both'</span>,
- logic_whitespace_pre: <span class="hljs-string">'logic_whitespace_pre'</span>,
- logic_whitespace_post: <span class="hljs-string">'logic_whitespace_post'</span>,
- logic_whitespace_both: <span class="hljs-string">'logic_whitespace_both'</span>
- };
-
- <span class="hljs-comment">/**
- * Token syntax definitions.
- */</span>
- Twig.token.definitions = [
- {
- type: Twig.token.type.raw,
- open: <span class="hljs-string">'{% raw %}'</span>,
- close: <span class="hljs-string">'{% endraw %}'</span>
- },
- {
- type: Twig.token.type.raw,
- open: <span class="hljs-string">'{% verbatim %}'</span>,
- close: <span class="hljs-string">'{% endverbatim %}'</span>
- },</pre></div></div>
-
- </li>
-
-
- <li id="section-18">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-18">&#182;</a>
- </div>
- <p><em>Whitespace type tokens</em></p>
-<p>These typically take the form <code>{{- expression -}}</code> or <code>{{- expression }}</code> or <code>{{ expression -}}</code>.</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> {
- type: Twig.token.type.output_whitespace_pre,
- open: <span class="hljs-string">'{{-'</span>,
- close: <span class="hljs-string">'}}'</span>
- },
- {
- type: Twig.token.type.output_whitespace_post,
- open: <span class="hljs-string">'{{'</span>,
- close: <span class="hljs-string">'-}}'</span>
- },
- {
- type: Twig.token.type.output_whitespace_both,
- open: <span class="hljs-string">'{{-'</span>,
- close: <span class="hljs-string">'-}}'</span>
- },
- {
- type: Twig.token.type.logic_whitespace_pre,
- open: <span class="hljs-string">'{%-'</span>,
- close: <span class="hljs-string">'%}'</span>
- },
- {
- type: Twig.token.type.logic_whitespace_post,
- open: <span class="hljs-string">'{%'</span>,
- close: <span class="hljs-string">'-%}'</span>
- },
- {
- type: Twig.token.type.logic_whitespace_both,
- open: <span class="hljs-string">'{%-'</span>,
- close: <span class="hljs-string">'-%}'</span>
- },</pre></div></div>
-
- </li>
-
-
- <li id="section-19">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-19">&#182;</a>
- </div>
- <p><em>Output type tokens</em></p>
-<p>These typically take the form <code>{{ expression }}</code>.</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> {
- type: Twig.token.type.output,
- open: <span class="hljs-string">'{{'</span>,
- close: <span class="hljs-string">'}}'</span>
- },</pre></div></div>
-
- </li>
-
-
- <li id="section-20">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-20">&#182;</a>
- </div>
- <p><em>Logic type tokens</em></p>
-<p>These typically take a form like <code>{% if expression %}</code> or <code>{% endif %}</code></p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> {
- type: Twig.token.type.logic,
- open: <span class="hljs-string">'{%'</span>,
- close: <span class="hljs-string">'%}'</span>
- },</pre></div></div>
-
- </li>
-
-
- <li id="section-21">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-21">&#182;</a>
- </div>
- <p><em>Comment type tokens</em></p>
-<p>These take the form <code>{# anything #}</code></p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> {
- type: Twig.token.type.comment,
- open: <span class="hljs-string">'{#'</span>,
- close: <span class="hljs-string">'#}'</span>
- }
- ];
-
-
- <span class="hljs-comment">/**
- * What characters start "strings" in token definitions. We need this to ignore token close
- * strings inside an expression.
- */</span>
- Twig.token.strings = [<span class="hljs-string">'"'</span>, <span class="hljs-string">"'"</span>];
-
- Twig.token.findStart = <span class="hljs-function"><span class="hljs-keyword">function</span> (<span class="hljs-params">template</span>) </span>{
- <span class="hljs-keyword">var</span> output = {
- position: <span class="hljs-literal">null</span>,
- close_position: <span class="hljs-literal">null</span>,
- def: <span class="hljs-literal">null</span>
- },
- i,
- token_template,
- first_key_position,
- close_key_position;
-
- <span class="hljs-keyword">for</span> (i=<span class="hljs-number">0</span>;i&lt;Twig.token.definitions.length;i++) {
- token_template = Twig.token.definitions[i];
- first_key_position = template.indexOf(token_template.open);
- close_key_position = template.indexOf(token_template.close);
-
- Twig.log.trace(<span class="hljs-string">"Twig.token.findStart: "</span>, <span class="hljs-string">"Searching for "</span>, token_template.open, <span class="hljs-string">" found at "</span>, first_key_position);</pre></div></div>
-
- </li>
-
-
- <li id="section-22">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-22">&#182;</a>
- </div>
- <p>Special handling for mismatched tokens</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">if</span> (first_key_position &gt;= <span class="hljs-number">0</span>) {</pre></div></div>
-
- </li>
-
-
- <li id="section-23">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-23">&#182;</a>
- </div>
- <p>This token matches the template</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">if</span> (token_template.open.length !== token_template.close.length) {</pre></div></div>
-
- </li>
-
-
- <li id="section-24">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-24">&#182;</a>
- </div>
- <p>This token has mismatched closing and opening tags</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">if</span> (close_key_position &lt; <span class="hljs-number">0</span>) {</pre></div></div>
-
- </li>
-
-
- <li id="section-25">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-25">&#182;</a>
- </div>
- <p>This token’s closing tag does not match the template</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">continue</span>;
- }
- }
- }</pre></div></div>
-
- </li>
-
-
- <li id="section-26">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-26">&#182;</a>
- </div>
- <p>Does this token occur before any other types?</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">if</span> (first_key_position &gt;= <span class="hljs-number">0</span> &amp;&amp; (output.position === <span class="hljs-literal">null</span> || first_key_position &lt; output.position)) {
- output.position = first_key_position;
- output.def = token_template;
- output.close_position = close_key_position;
- } <span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span> (first_key_position &gt;= <span class="hljs-number">0</span> &amp;&amp; output.position !== <span class="hljs-literal">null</span> &amp;&amp; first_key_position === output.position) {
- <span class="hljs-comment">/*This token exactly matches another token,
- greedily match to check if this token has a greater specificity*/</span>
- <span class="hljs-keyword">if</span> (token_template.open.length &gt; output.def.open.length) {</pre></div></div>
-
- </li>
-
-
- <li id="section-27">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-27">&#182;</a>
- </div>
- <p>This token’s opening tag is more specific than the previous match</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> output.position = first_key_position;
- output.def = token_template;
- output.close_position = close_key_position;
- } <span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span> (token_template.open.length === output.def.open.length) {
- <span class="hljs-keyword">if</span> (token_template.close.length &gt; output.def.close.length) {</pre></div></div>
-
- </li>
-
-
- <li id="section-28">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-28">&#182;</a>
- </div>
- <p>This token’s opening tag is as specific as the previous match,
-but the closing tag has greater specificity</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">if</span> (close_key_position &gt;= <span class="hljs-number">0</span> &amp;&amp; close_key_position &lt; output.close_position) {</pre></div></div>
-
- </li>
-
-
- <li id="section-29">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-29">&#182;</a>
- </div>
- <p>This token’s closing tag exists in the template,
-and it occurs sooner than the previous match</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> output.position = first_key_position;
- output.def = token_template;
- output.close_position = close_key_position;
- }
- } <span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span> (close_key_position &gt;= <span class="hljs-number">0</span> &amp;&amp; close_key_position &lt; output.close_position) {</pre></div></div>
-
- </li>
-
-
- <li id="section-30">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-30">&#182;</a>
- </div>
- <p>This token’s closing tag is not more specific than the previous match,
-but it occurs sooner than the previous match</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> output.position = first_key_position;
- output.def = token_template;
- output.close_position = close_key_position;
- }
- }
- }
- }
-
- <span class="hljs-keyword">delete</span> output[<span class="hljs-string">'close_position'</span>];
-
- <span class="hljs-keyword">return</span> output;
- };
-
- Twig.token.findEnd = <span class="hljs-function"><span class="hljs-keyword">function</span> (<span class="hljs-params">template, token_def, start</span>) </span>{
- <span class="hljs-keyword">var</span> end = <span class="hljs-literal">null</span>,
- found = <span class="hljs-literal">false</span>,
- offset = <span class="hljs-number">0</span>,</pre></div></div>
-
- </li>
-
-
- <li id="section-31">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-31">&#182;</a>
- </div>
- <p>String position variables</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> str_pos = <span class="hljs-literal">null</span>,
- str_found = <span class="hljs-literal">null</span>,
- pos = <span class="hljs-literal">null</span>,
- end_offset = <span class="hljs-literal">null</span>,
- this_str_pos = <span class="hljs-literal">null</span>,
- end_str_pos = <span class="hljs-literal">null</span>,</pre></div></div>
-
- </li>
-
-
- <li id="section-32">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-32">&#182;</a>
- </div>
- <p>For loop variables</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> i,
- l;
-
- <span class="hljs-keyword">while</span> (!found) {
- str_pos = <span class="hljs-literal">null</span>;
- str_found = <span class="hljs-literal">null</span>;
- pos = template.indexOf(token_def.close, offset);
-
- <span class="hljs-keyword">if</span> (pos &gt;= <span class="hljs-number">0</span>) {
- end = pos;
- found = <span class="hljs-literal">true</span>;
- } <span class="hljs-keyword">else</span> {</pre></div></div>
-
- </li>
-
-
- <li id="section-33">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-33">&#182;</a>
- </div>
- <p>throw an exception</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> Twig.Error(<span class="hljs-string">"Unable to find closing bracket '"</span> + token_def.close +
- <span class="hljs-string">"'"</span> + <span class="hljs-string">" opened near template position "</span> + start);
- }</pre></div></div>
-
- </li>
-
-
- <li id="section-34">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-34">&#182;</a>
- </div>
- <p>Ignore quotes within comments; just look for the next comment close sequence,
-regardless of what comes before it. <a href="https://github.com/justjohn/twig.js/issues/95">https://github.com/justjohn/twig.js/issues/95</a></p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">if</span> (token_def.type === Twig.token.type.comment) {
- <span class="hljs-keyword">break</span>;
- }</pre></div></div>
-
- </li>
-
-
- <li id="section-35">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-35">&#182;</a>
- </div>
- <p>Ignore quotes within raw tag
-Fixes #283</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">if</span> (token_def.type === Twig.token.type.raw) {
- <span class="hljs-keyword">break</span>;
- }
-
- l = Twig.token.strings.length;
- <span class="hljs-keyword">for</span> (i = <span class="hljs-number">0</span>; i &lt; l; i += <span class="hljs-number">1</span>) {
- this_str_pos = template.indexOf(Twig.token.strings[i], offset);
-
- <span class="hljs-keyword">if</span> (this_str_pos &gt; <span class="hljs-number">0</span> &amp;&amp; this_str_pos &lt; pos &amp;&amp;
- (str_pos === <span class="hljs-literal">null</span> || this_str_pos &lt; str_pos)) {
- str_pos = this_str_pos;
- str_found = Twig.token.strings[i];
- }
- }</pre></div></div>
-
- </li>
-
-
- <li id="section-36">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-36">&#182;</a>
- </div>
- <p>We found a string before the end of the token, now find the string’s end and set the search offset to it</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">if</span> (str_pos !== <span class="hljs-literal">null</span>) {
- end_offset = str_pos + <span class="hljs-number">1</span>;
- end = <span class="hljs-literal">null</span>;
- found = <span class="hljs-literal">false</span>;
- <span class="hljs-keyword">while</span> (<span class="hljs-literal">true</span>) {
- end_str_pos = template.indexOf(str_found, end_offset);
- <span class="hljs-keyword">if</span> (end_str_pos &lt; <span class="hljs-number">0</span>) {
- <span class="hljs-keyword">throw</span> <span class="hljs-string">"Unclosed string in template"</span>;
- }</pre></div></div>
-
- </li>
-
-
- <li id="section-37">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-37">&#182;</a>
- </div>
- <p>Ignore escaped quotes</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">if</span> (template.substr(end_str_pos - <span class="hljs-number">1</span>, <span class="hljs-number">1</span>) !== <span class="hljs-string">"\\"</span>) {
- offset = end_str_pos + <span class="hljs-number">1</span>;
- <span class="hljs-keyword">break</span>;
- } <span class="hljs-keyword">else</span> {
- end_offset = end_str_pos + <span class="hljs-number">1</span>;
- }
- }
- }
- }
- <span class="hljs-keyword">return</span> end;
- };
-
- <span class="hljs-comment">/**
- * Convert a template into high-level tokens.
- */</span>
- Twig.tokenize = <span class="hljs-function"><span class="hljs-keyword">function</span> (<span class="hljs-params">template</span>) </span>{
- <span class="hljs-keyword">var</span> tokens = [],</pre></div></div>
-
- </li>
-
-
- <li id="section-38">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-38">&#182;</a>
- </div>
- <p>An offset for reporting errors locations in the template.</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> error_offset = <span class="hljs-number">0</span>,</pre></div></div>
-
- </li>
-
-
- <li id="section-39">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-39">&#182;</a>
- </div>
- <p>The start and type of the first token found in the template.</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> found_token = <span class="hljs-literal">null</span>,</pre></div></div>
-
- </li>
-
-
- <li id="section-40">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-40">&#182;</a>
- </div>
- <p>The end position of the matched token.</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> end = <span class="hljs-literal">null</span>;
-
- <span class="hljs-keyword">while</span> (template.length &gt; <span class="hljs-number">0</span>) {</pre></div></div>
-
- </li>
-
-
- <li id="section-41">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-41">&#182;</a>
- </div>
- <p>Find the first occurance of any token type in the template</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> found_token = Twig.token.findStart(template);
-
- Twig.log.trace(<span class="hljs-string">"Twig.tokenize: "</span>, <span class="hljs-string">"Found token: "</span>, found_token);
-
- <span class="hljs-keyword">if</span> (found_token.position !== <span class="hljs-literal">null</span>) {</pre></div></div>
-
- </li>
-
-
- <li id="section-42">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-42">&#182;</a>
- </div>
- <p>Add a raw type token for anything before the start of the token</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">if</span> (found_token.position &gt; <span class="hljs-number">0</span>) {
- tokens.push({
- type: Twig.token.type.raw,
- value: template.substring(<span class="hljs-number">0</span>, found_token.position)
- });
- }
- template = template.substr(found_token.position + found_token.def.open.length);
- error_offset += found_token.position + found_token.def.open.length;</pre></div></div>
-
- </li>
-
-
- <li id="section-43">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-43">&#182;</a>
- </div>
- <p>Find the end of the token</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> end = Twig.token.findEnd(template, found_token.def, error_offset);
-
- Twig.log.trace(<span class="hljs-string">"Twig.tokenize: "</span>, <span class="hljs-string">"Token ends at "</span>, end);
-
- tokens.push({
- type: found_token.def.type,
- value: template.substring(<span class="hljs-number">0</span>, end).trim()
- });
-
- <span class="hljs-keyword">if</span> (template.substr( end + found_token.def.close.length, <span class="hljs-number">1</span> ) === <span class="hljs-string">"\n"</span>) {
- <span class="hljs-keyword">switch</span> (found_token.def.type) {
- <span class="hljs-keyword">case</span> <span class="hljs-string">"logic_whitespace_pre"</span>:
- <span class="hljs-keyword">case</span> <span class="hljs-string">"logic_whitespace_post"</span>:
- <span class="hljs-keyword">case</span> <span class="hljs-string">"logic_whitespace_both"</span>:
- <span class="hljs-keyword">case</span> <span class="hljs-string">"logic"</span>:</pre></div></div>
-
- </li>
-
-
- <li id="section-44">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-44">&#182;</a>
- </div>
- <p>Newlines directly after logic tokens are ignored</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> end += <span class="hljs-number">1</span>;
- <span class="hljs-keyword">break</span>;
- }
- }
-
- template = template.substr(end + found_token.def.close.length);</pre></div></div>
-
- </li>
-
-
- <li id="section-45">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-45">&#182;</a>
- </div>
- <p>Increment the position in the template</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> error_offset += end + found_token.def.close.length;
-
- } <span class="hljs-keyword">else</span> {</pre></div></div>
-
- </li>
-
-
- <li id="section-46">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-46">&#182;</a>
- </div>
- <p>No more tokens -&gt; add the rest of the template as a raw-type token</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> tokens.push({
- type: Twig.token.type.raw,
- value: template
- });
- template = <span class="hljs-string">''</span>;
- }
- }
-
- <span class="hljs-keyword">return</span> tokens;
- };
-
-
- Twig.compile = <span class="hljs-function"><span class="hljs-keyword">function</span> (<span class="hljs-params">tokens</span>) </span>{
- <span class="hljs-keyword">try</span> {</pre></div></div>
-
- </li>
-
-
- <li id="section-47">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-47">&#182;</a>
- </div>
- <p>Output and intermediate stacks</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">var</span> output = [],
- stack = [],</pre></div></div>
-
- </li>
-
-
- <li id="section-48">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-48">&#182;</a>
- </div>
- <p>The tokens between open and close tags</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> intermediate_output = [],
-
- token = <span class="hljs-literal">null</span>,
- logic_token = <span class="hljs-literal">null</span>,
- unclosed_token = <span class="hljs-literal">null</span>,</pre></div></div>
-
- </li>
-
-
- <li id="section-49">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-49">&#182;</a>
- </div>
- <p>Temporary previous token.</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> prev_token = <span class="hljs-literal">null</span>,</pre></div></div>
-
- </li>
-
-
- <li id="section-50">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-50">&#182;</a>
- </div>
- <p>Temporary previous output.</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> prev_output = <span class="hljs-literal">null</span>,</pre></div></div>
-
- </li>
-
-
- <li id="section-51">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-51">&#182;</a>
- </div>
- <p>Temporary previous intermediate output.</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> prev_intermediate_output = <span class="hljs-literal">null</span>,</pre></div></div>
-
- </li>
-
-
- <li id="section-52">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-52">&#182;</a>
- </div>
- <p>The previous token’s template</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> prev_template = <span class="hljs-literal">null</span>,</pre></div></div>
-
- </li>
-
-
- <li id="section-53">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-53">&#182;</a>
- </div>
- <p>Token lookahead</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> next_token = <span class="hljs-literal">null</span>,</pre></div></div>
-
- </li>
-
-
- <li id="section-54">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-54">&#182;</a>
- </div>
- <p>The output token</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> tok_output = <span class="hljs-literal">null</span>,</pre></div></div>
-
- </li>
-
-
- <li id="section-55">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-55">&#182;</a>
- </div>
- <p>Logic Token values</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> type = <span class="hljs-literal">null</span>,
- open = <span class="hljs-literal">null</span>,
- next = <span class="hljs-literal">null</span>;
-
- <span class="hljs-keyword">var</span> compile_output = <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">token</span>) </span>{
- Twig.expression.compile.apply(<span class="hljs-keyword">this</span>, [token]);
- <span class="hljs-keyword">if</span> (stack.length &gt; <span class="hljs-number">0</span>) {
- intermediate_output.push(token);
- } <span class="hljs-keyword">else</span> {
- output.push(token);
- }
- };
-
- <span class="hljs-keyword">var</span> compile_logic = <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">token</span>) </span>{</pre></div></div>
-
- </li>
-
-
- <li id="section-56">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-56">&#182;</a>
- </div>
- <p>Compile the logic token</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> logic_token = Twig.logic.compile.apply(<span class="hljs-keyword">this</span>, [token]);
-
- type = logic_token.type;
- open = Twig.logic.handler[type].open;
- next = Twig.logic.handler[type].next;
-
- Twig.log.trace(<span class="hljs-string">"Twig.compile: "</span>, <span class="hljs-string">"Compiled logic token to "</span>, logic_token,
- <span class="hljs-string">" next is: "</span>, next, <span class="hljs-string">" open is : "</span>, open);</pre></div></div>
-
- </li>
-
-
- <li id="section-57">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-57">&#182;</a>
- </div>
- <p>Not a standalone token, check logic stack to see if this is expected</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">if</span> (open !== <span class="hljs-literal">undefined</span> &amp;&amp; !open) {
- prev_token = stack.pop();
- prev_template = Twig.logic.handler[prev_token.type];
-
- <span class="hljs-keyword">if</span> (Twig.indexOf(prev_template.next, type) &lt; <span class="hljs-number">0</span>) {
- <span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> <span class="hljs-built_in">Error</span>(type + <span class="hljs-string">" not expected after a "</span> + prev_token.type);
- }
-
- prev_token.output = prev_token.output || [];
-
- prev_token.output = prev_token.output.concat(intermediate_output);
- intermediate_output = [];
-
- tok_output = {
- type: Twig.token.type.logic,
- token: prev_token
- };
- <span class="hljs-keyword">if</span> (stack.length &gt; <span class="hljs-number">0</span>) {
- intermediate_output.push(tok_output);
- } <span class="hljs-keyword">else</span> {
- output.push(tok_output);
- }
- }</pre></div></div>
-
- </li>
-
-
- <li id="section-58">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-58">&#182;</a>
- </div>
- <p>This token requires additional tokens to complete the logic structure.</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">if</span> (next !== <span class="hljs-literal">undefined</span> &amp;&amp; next.length &gt; <span class="hljs-number">0</span>) {
- Twig.log.trace(<span class="hljs-string">"Twig.compile: "</span>, <span class="hljs-string">"Pushing "</span>, logic_token, <span class="hljs-string">" to logic stack."</span>);
-
- <span class="hljs-keyword">if</span> (stack.length &gt; <span class="hljs-number">0</span>) {</pre></div></div>
-
- </li>
-
-
- <li id="section-59">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-59">&#182;</a>
- </div>
- <p>Put any currently held output into the output list of the logic operator
-currently at the head of the stack before we push a new one on.</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> prev_token = stack.pop();
- prev_token.output = prev_token.output || [];
- prev_token.output = prev_token.output.concat(intermediate_output);
- stack.push(prev_token);
- intermediate_output = [];
- }</pre></div></div>
-
- </li>
-
-
- <li id="section-60">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-60">&#182;</a>
- </div>
- <p>Push the new logic token onto the logic stack</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> stack.push(logic_token);
-
- } <span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span> (open !== <span class="hljs-literal">undefined</span> &amp;&amp; open) {
- tok_output = {
- type: Twig.token.type.logic,
- token: logic_token
- };</pre></div></div>
-
- </li>
-
-
- <li id="section-61">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-61">&#182;</a>
- </div>
- <p>Standalone token (like {% set … %}</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">if</span> (stack.length &gt; <span class="hljs-number">0</span>) {
- intermediate_output.push(tok_output);
- } <span class="hljs-keyword">else</span> {
- output.push(tok_output);
- }
- }
- };
-
- <span class="hljs-keyword">while</span> (tokens.length &gt; <span class="hljs-number">0</span>) {
- token = tokens.shift();
- prev_output = output[output.length - <span class="hljs-number">1</span>];
- prev_intermediate_output = intermediate_output[intermediate_output.length - <span class="hljs-number">1</span>];
- next_token = tokens[<span class="hljs-number">0</span>];
- Twig.log.trace(<span class="hljs-string">"Compiling token "</span>, token);
- <span class="hljs-keyword">switch</span> (token.type) {
- <span class="hljs-keyword">case</span> Twig.token.type.raw:
- <span class="hljs-keyword">if</span> (stack.length &gt; <span class="hljs-number">0</span>) {
- intermediate_output.push(token);
- } <span class="hljs-keyword">else</span> {
- output.push(token);
- }
- <span class="hljs-keyword">break</span>;
-
- <span class="hljs-keyword">case</span> Twig.token.type.logic:
- compile_logic.call(<span class="hljs-keyword">this</span>, token);
- <span class="hljs-keyword">break</span>;</pre></div></div>
-
- </li>
-
-
- <li id="section-62">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-62">&#182;</a>
- </div>
- <p>Do nothing, comments should be ignored</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">case</span> Twig.token.type.comment:
- <span class="hljs-keyword">break</span>;
-
- <span class="hljs-keyword">case</span> Twig.token.type.output:
- compile_output.call(<span class="hljs-keyword">this</span>, token);
- <span class="hljs-keyword">break</span>;</pre></div></div>
-
- </li>
-
-
- <li id="section-63">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-63">&#182;</a>
- </div>
- <p>Kill whitespace ahead and behind this token</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">case</span> Twig.token.type.logic_whitespace_pre:
- <span class="hljs-keyword">case</span> Twig.token.type.logic_whitespace_post:
- <span class="hljs-keyword">case</span> Twig.token.type.logic_whitespace_both:
- <span class="hljs-keyword">case</span> Twig.token.type.output_whitespace_pre:
- <span class="hljs-keyword">case</span> Twig.token.type.output_whitespace_post:
- <span class="hljs-keyword">case</span> Twig.token.type.output_whitespace_both:
- <span class="hljs-keyword">if</span> (token.type !== Twig.token.type.output_whitespace_post &amp;&amp; token.type !== Twig.token.type.logic_whitespace_post) {
- <span class="hljs-keyword">if</span> (prev_output) {</pre></div></div>
-
- </li>
-
-
- <li id="section-64">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-64">&#182;</a>
- </div>
- <p>If the previous output is raw, pop it off</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">if</span> (prev_output.type === Twig.token.type.raw) {
- output.pop();</pre></div></div>
-
- </li>
-
-
- <li id="section-65">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-65">&#182;</a>
- </div>
- <p>If the previous output is not just whitespace, trim it</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">if</span> (prev_output.value.match(<span class="hljs-regexp">/^\s*$/</span>) === <span class="hljs-literal">null</span>) {
- prev_output.value = prev_output.value.trim();</pre></div></div>
-
- </li>
-
-
- <li id="section-66">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-66">&#182;</a>
- </div>
- <p>Repush the previous output</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> output.push(prev_output);
- }
- }
- }
-
- <span class="hljs-keyword">if</span> (prev_intermediate_output) {</pre></div></div>
-
- </li>
-
-
- <li id="section-67">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-67">&#182;</a>
- </div>
- <p>If the previous intermediate output is raw, pop it off</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">if</span> (prev_intermediate_output.type === Twig.token.type.raw) {
- intermediate_output.pop();</pre></div></div>
-
- </li>
-
-
- <li id="section-68">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-68">&#182;</a>
- </div>
- <p>If the previous output is not just whitespace, trim it</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">if</span> (prev_intermediate_output.value.match(<span class="hljs-regexp">/^\s*$/</span>) === <span class="hljs-literal">null</span>) {
- prev_intermediate_output.value = prev_intermediate_output.value.trim();</pre></div></div>
-
- </li>
-
-
- <li id="section-69">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-69">&#182;</a>
- </div>
- <p>Repush the previous intermediate output</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> intermediate_output.push(prev_intermediate_output);
- }
- }
- }
- }</pre></div></div>
-
- </li>
-
-
- <li id="section-70">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-70">&#182;</a>
- </div>
- <p>Compile this token</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">switch</span> (token.type) {
- <span class="hljs-keyword">case</span> Twig.token.type.output_whitespace_pre:
- <span class="hljs-keyword">case</span> Twig.token.type.output_whitespace_post:
- <span class="hljs-keyword">case</span> Twig.token.type.output_whitespace_both:
- compile_output.call(<span class="hljs-keyword">this</span>, token);
- <span class="hljs-keyword">break</span>;
- <span class="hljs-keyword">case</span> Twig.token.type.logic_whitespace_pre:
- <span class="hljs-keyword">case</span> Twig.token.type.logic_whitespace_post:
- <span class="hljs-keyword">case</span> Twig.token.type.logic_whitespace_both:
- compile_logic.call(<span class="hljs-keyword">this</span>, token);
- <span class="hljs-keyword">break</span>;
- }
-
- <span class="hljs-keyword">if</span> (token.type !== Twig.token.type.output_whitespace_pre &amp;&amp; token.type !== Twig.token.type.logic_whitespace_pre) {
- <span class="hljs-keyword">if</span> (next_token) {</pre></div></div>
-
- </li>
-
-
- <li id="section-71">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-71">&#182;</a>
- </div>
- <p>If the next token is raw, shift it out</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">if</span> (next_token.type === Twig.token.type.raw) {
- tokens.shift();</pre></div></div>
-
- </li>
-
-
- <li id="section-72">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-72">&#182;</a>
- </div>
- <p>If the next token is not just whitespace, trim it</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">if</span> (next_token.value.match(<span class="hljs-regexp">/^\s*$/</span>) === <span class="hljs-literal">null</span>) {
- next_token.value = next_token.value.trim();</pre></div></div>
-
- </li>
-
-
- <li id="section-73">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-73">&#182;</a>
- </div>
- <p>Unshift the next token</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> tokens.unshift(next_token);
- }
- }
- }
- }
-
- <span class="hljs-keyword">break</span>;
- }
-
- Twig.log.trace(<span class="hljs-string">"Twig.compile: "</span>, <span class="hljs-string">" Output: "</span>, output,
- <span class="hljs-string">" Logic Stack: "</span>, stack,
- <span class="hljs-string">" Pending Output: "</span>, intermediate_output );
- }</pre></div></div>
-
- </li>
-
-
- <li id="section-74">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-74">&#182;</a>
- </div>
- <p>Verify that there are no logic tokens left in the stack.</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">if</span> (stack.length &gt; <span class="hljs-number">0</span>) {
- unclosed_token = stack.pop();
- <span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> <span class="hljs-built_in">Error</span>(<span class="hljs-string">"Unable to find an end tag for "</span> + unclosed_token.type +
- <span class="hljs-string">", expecting one of "</span> + unclosed_token.next);
- }
- <span class="hljs-keyword">return</span> output;
- } <span class="hljs-keyword">catch</span> (ex) {
- Twig.log.error(<span class="hljs-string">"Error compiling twig template "</span> + <span class="hljs-keyword">this</span>.id + <span class="hljs-string">": "</span>);
- <span class="hljs-keyword">if</span> (ex.stack) {
- Twig.log.error(ex.stack);
- } <span class="hljs-keyword">else</span> {
- Twig.log.error(ex.toString());
- }
-
- <span class="hljs-keyword">if</span> (<span class="hljs-keyword">this</span>.options.rethrow) <span class="hljs-keyword">throw</span> ex;
- }
- };
-
- <span class="hljs-comment">/**
- * Parse a compiled template.
- *
- * @param {Array} tokens The compiled tokens.
- * @param {Object} context The render context.
- *
- * @return {string} The parsed template.
- */</span>
- Twig.parse = <span class="hljs-function"><span class="hljs-keyword">function</span> (<span class="hljs-params">tokens, context</span>) </span>{
- <span class="hljs-keyword">try</span> {
- <span class="hljs-keyword">var</span> output = [],</pre></div></div>
-
- </li>
-
-
- <li id="section-75">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-75">&#182;</a>
- </div>
- <p>Track logic chains</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> chain = <span class="hljs-literal">true</span>,
- that = <span class="hljs-keyword">this</span>;
-
- Twig.forEach(tokens, <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">parseToken</span>(<span class="hljs-params">token</span>) </span>{
- Twig.log.debug(<span class="hljs-string">"Twig.parse: "</span>, <span class="hljs-string">"Parsing token: "</span>, token);
-
- <span class="hljs-keyword">switch</span> (token.type) {
- <span class="hljs-keyword">case</span> Twig.token.type.raw:
- output.push(Twig.filters.raw(token.value));
- <span class="hljs-keyword">break</span>;
-
- <span class="hljs-keyword">case</span> Twig.token.type.logic:
- <span class="hljs-keyword">var</span> logic_token = token.token,
- logic = Twig.logic.parse.apply(that, [logic_token, context, chain]);
-
- <span class="hljs-keyword">if</span> (logic.chain !== <span class="hljs-literal">undefined</span>) {
- chain = logic.chain;
- }
- <span class="hljs-keyword">if</span> (logic.context !== <span class="hljs-literal">undefined</span>) {
- context = logic.context;
- }
- <span class="hljs-keyword">if</span> (logic.output !== <span class="hljs-literal">undefined</span>) {
- output.push(logic.output);
- }
- <span class="hljs-keyword">break</span>;
-
- <span class="hljs-keyword">case</span> Twig.token.type.comment:</pre></div></div>
-
- </li>
-
-
- <li id="section-76">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-76">&#182;</a>
- </div>
- <p>Do nothing, comments should be ignored</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">break</span>;</pre></div></div>
-
- </li>
-
-
- <li id="section-77">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-77">&#182;</a>
- </div>
- <p>Fall through whitespace to output</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">case</span> Twig.token.type.output_whitespace_pre:
- <span class="hljs-keyword">case</span> Twig.token.type.output_whitespace_post:
- <span class="hljs-keyword">case</span> Twig.token.type.output_whitespace_both:
- <span class="hljs-keyword">case</span> Twig.token.type.output:
- Twig.log.debug(<span class="hljs-string">"Twig.parse: "</span>, <span class="hljs-string">"Output token: "</span>, token.stack);</pre></div></div>
-
- </li>
-
-
- <li id="section-78">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-78">&#182;</a>
- </div>
- <p>Parse the given expression in the given context</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> output.push(Twig.expression.parse.apply(that, [token.stack, context]));
- <span class="hljs-keyword">break</span>;
- }
- });
- <span class="hljs-keyword">return</span> Twig.output.apply(<span class="hljs-keyword">this</span>, [output]);
- } <span class="hljs-keyword">catch</span> (ex) {
- Twig.log.error(<span class="hljs-string">"Error parsing twig template "</span> + <span class="hljs-keyword">this</span>.id + <span class="hljs-string">": "</span>);
- <span class="hljs-keyword">if</span> (ex.stack) {
- Twig.log.error(ex.stack);
- } <span class="hljs-keyword">else</span> {
- Twig.log.error(ex.toString());
- }
-
- <span class="hljs-keyword">if</span> (<span class="hljs-keyword">this</span>.options.rethrow) <span class="hljs-keyword">throw</span> ex;
-
- <span class="hljs-keyword">if</span> (Twig.debug) {
- <span class="hljs-keyword">return</span> ex.toString();
- }
- }
- };
-
- <span class="hljs-comment">/**
- * Tokenize and compile a string template.
- *
- * @param {string} data The template.
- *
- * @return {Array} The compiled tokens.
- */</span>
- Twig.prepare = <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">data</span>) </span>{
- <span class="hljs-keyword">var</span> tokens, raw_tokens;</pre></div></div>
-
- </li>
-
-
- <li id="section-79">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-79">&#182;</a>
- </div>
- <p>Tokenize</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> Twig.log.debug(<span class="hljs-string">"Twig.prepare: "</span>, <span class="hljs-string">"Tokenizing "</span>, data);
- raw_tokens = Twig.tokenize.apply(<span class="hljs-keyword">this</span>, [data]);</pre></div></div>
-
- </li>
-
-
- <li id="section-80">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-80">&#182;</a>
- </div>
- <p>Compile</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> Twig.log.debug(<span class="hljs-string">"Twig.prepare: "</span>, <span class="hljs-string">"Compiling "</span>, raw_tokens);
- tokens = Twig.compile.apply(<span class="hljs-keyword">this</span>, [raw_tokens]);
-
- Twig.log.debug(<span class="hljs-string">"Twig.prepare: "</span>, <span class="hljs-string">"Compiled "</span>, tokens);
-
- <span class="hljs-keyword">return</span> tokens;
- };
-
- <span class="hljs-comment">/**
- * Join the output token's stack and escape it if needed
- *
- * @param {Array} Output token's stack
- *
- * @return {string|String} Autoescaped output
- */</span>
- Twig.output = <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">output</span>) </span>{
- <span class="hljs-keyword">if</span> (!<span class="hljs-keyword">this</span>.options.autoescape) {
- <span class="hljs-keyword">return</span> output.join(<span class="hljs-string">""</span>);
- }
-
- <span class="hljs-keyword">var</span> strategy = <span class="hljs-string">'html'</span>;
- <span class="hljs-keyword">if</span>(<span class="hljs-keyword">typeof</span> <span class="hljs-keyword">this</span>.options.autoescape == <span class="hljs-string">'string'</span>)
- strategy = <span class="hljs-keyword">this</span>.options.autoescape;</pre></div></div>
-
- </li>
-
-
- <li id="section-81">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-81">&#182;</a>
- </div>
- <p>[].map would be better but it’s not supported by IE8-</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">var</span> escaped_output = [];
- Twig.forEach(output, <span class="hljs-function"><span class="hljs-keyword">function</span> (<span class="hljs-params">str</span>) </span>{
- <span class="hljs-keyword">if</span> (str &amp;&amp; (str.twig_markup !== <span class="hljs-literal">true</span> &amp;&amp; str.twig_markup != strategy)) {
- str = Twig.filters.escape(str, [ strategy ]);
- }
- escaped_output.push(str);
- });
- <span class="hljs-keyword">return</span> Twig.Markup(escaped_output.join(<span class="hljs-string">""</span>));
- }</pre></div></div>
-
- </li>
-
-
- <li id="section-82">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-82">&#182;</a>
- </div>
- <p>Namespace for template storage and retrieval</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> Twig.Templates = {
- <span class="hljs-comment">/**
- * Registered template loaders - use Twig.Templates.registerLoader to add supported loaders
- * @type {Object}
- */</span>
- loaders: {},
-
- <span class="hljs-comment">/**
- * Registered template parsers - use Twig.Templates.registerParser to add supported parsers
- * @type {Object}
- */</span>
- parsers: {},
-
- <span class="hljs-comment">/**
- * Cached / loaded templates
- * @type {Object}
- */</span>
- registry: {}
- };
-
- <span class="hljs-comment">/**
- * Is this id valid for a twig template?
- *
- * @param {string} id The ID to check.
- *
- * @throws {Twig.Error} If the ID is invalid or used.
- * @return {boolean} True if the ID is valid.
- */</span>
- Twig.validateId = <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">id</span>) </span>{
- <span class="hljs-keyword">if</span> (id === <span class="hljs-string">"prototype"</span>) {
- <span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> Twig.Error(id + <span class="hljs-string">" is not a valid twig identifier"</span>);
- } <span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span> (Twig.cache &amp;&amp; Twig.Templates.registry.hasOwnProperty(id)) {
- <span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> Twig.Error(<span class="hljs-string">"There is already a template with the ID "</span> + id);
- }
- <span class="hljs-keyword">return</span> <span class="hljs-literal">true</span>;
- }
-
- <span class="hljs-comment">/**
- * Register a template loader
- *
- * @example
- * Twig.extend(function(Twig) {
- * Twig.Templates.registerLoader('custom_loader', function(location, params, callback, error_callback) {
- * // ... load the template ...
- * params.data = loadedTemplateData;
- * // create and return the template
- * var template = new Twig.Template(params);
- * if (typeof callback === 'function') {
- * callback(template);
- * }
- * return template;
- * });
- * });
- *
- * @param {String} method_name The method this loader is intended for (ajax, fs)
- * @param {Function} func The function to execute when loading the template
- * @param {Object|undefined} scope Optional scope parameter to bind func to
- *
- * @throws Twig.Error
- *
- * @return {void}
- */</span>
- Twig.Templates.registerLoader = <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">method_name, func, scope</span>) </span>{
- <span class="hljs-keyword">if</span> (<span class="hljs-keyword">typeof</span> func !== <span class="hljs-string">'function'</span>) {
- <span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> Twig.Error(<span class="hljs-string">'Unable to add loader for '</span> + method_name + <span class="hljs-string">': Invalid function reference given.'</span>);
- }
- <span class="hljs-keyword">if</span> (scope) {
- func = func.bind(scope);
- }
- <span class="hljs-keyword">this</span>.loaders[method_name] = func;
- };
-
- <span class="hljs-comment">/**
- * Remove a registered loader
- *
- * @param {String} method_name The method name for the loader you wish to remove
- *
- * @return {void}
- */</span>
- Twig.Templates.unRegisterLoader = <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">method_name</span>) </span>{
- <span class="hljs-keyword">if</span> (<span class="hljs-keyword">this</span>.isRegisteredLoader(method_name)) {
- <span class="hljs-keyword">delete</span> <span class="hljs-keyword">this</span>.loaders[method_name];
- }
- };
-
- <span class="hljs-comment">/**
- * See if a loader is registered by its method name
- *
- * @param {String} method_name The name of the loader you are looking for
- *
- * @return {boolean}
- */</span>
- Twig.Templates.isRegisteredLoader = <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">method_name</span>) </span>{
- <span class="hljs-keyword">return</span> <span class="hljs-keyword">this</span>.loaders.hasOwnProperty(method_name);
- };
-
- <span class="hljs-comment">/**
- * Register a template parser
- *
- * @example
- * Twig.extend(function(Twig) {
- * Twig.Templates.registerParser('custom_parser', function(params) {
- * // this template source can be accessed in params.data
- * var template = params.data
- *
- * // ... custom process that modifies the template
- *
- * // return the parsed template
- * return template;
- * });
- * });
- *
- * @param {String} method_name The method this parser is intended for (twig, source)
- * @param {Function} func The function to execute when parsing the template
- * @param {Object|undefined} scope Optional scope parameter to bind func to
- *
- * @throws Twig.Error
- *
- * @return {void}
- */</span>
- Twig.Templates.registerParser = <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">method_name, func, scope</span>) </span>{
- <span class="hljs-keyword">if</span> (<span class="hljs-keyword">typeof</span> func !== <span class="hljs-string">'function'</span>) {
- <span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> Twig.Error(<span class="hljs-string">'Unable to add parser for '</span> + method_name + <span class="hljs-string">': Invalid function regerence given.'</span>);
- }
-
- <span class="hljs-keyword">if</span> (scope) {
- func = func.bind(scope);
- }
-
- <span class="hljs-keyword">this</span>.parsers[method_name] = func;
- };
-
- <span class="hljs-comment">/**
- * Remove a registered parser
- *
- * @param {String} method_name The method name for the parser you wish to remove
- *
- * @return {void}
- */</span>
- Twig.Templates.unRegisterParser = <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">method_name</span>) </span>{
- <span class="hljs-keyword">if</span> (<span class="hljs-keyword">this</span>.isRegisteredParser(method_name)) {
- <span class="hljs-keyword">delete</span> <span class="hljs-keyword">this</span>.parsers[method_name];
- }
- };
-
- <span class="hljs-comment">/**
- * See if a parser is registered by its method name
- *
- * @param {String} method_name The name of the parser you are looking for
- *
- * @return {boolean}
- */</span>
- Twig.Templates.isRegisteredParser = <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">method_name</span>) </span>{
- <span class="hljs-keyword">return</span> <span class="hljs-keyword">this</span>.parsers.hasOwnProperty(method_name);
- };
-
- <span class="hljs-comment">/**
- * Save a template object to the store.
- *
- * @param {Twig.Template} template The twig.js template to store.
- */</span>
- Twig.Templates.save = <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">template</span>) </span>{
- <span class="hljs-keyword">if</span> (template.id === <span class="hljs-literal">undefined</span>) {
- <span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> Twig.Error(<span class="hljs-string">"Unable to save template with no id"</span>);
- }
- Twig.Templates.registry[template.id] = template;
- };
-
- <span class="hljs-comment">/**
- * Load a previously saved template from the store.
- *
- * @param {string} id The ID of the template to load.
- *
- * @return {Twig.Template} A twig.js template stored with the provided ID.
- */</span>
- Twig.Templates.load = <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">id</span>) </span>{
- <span class="hljs-keyword">if</span> (!Twig.Templates.registry.hasOwnProperty(id)) {
- <span class="hljs-keyword">return</span> <span class="hljs-literal">null</span>;
- }
- <span class="hljs-keyword">return</span> Twig.Templates.registry[id];
- };
-
- <span class="hljs-comment">/**
- * Load a template from a remote location using AJAX and saves in with the given ID.
- *
- * Available parameters:
- *
- * async: Should the HTTP request be performed asynchronously.
- * Defaults to true.
- * method: What method should be used to load the template
- * (fs or ajax)
- * parser: What method should be used to parse the template
- * (twig or source)
- * precompiled: Has the template already been compiled.
- *
- * @param {string} location The remote URL to load as a template.
- * @param {Object} params The template parameters.
- * @param {function} callback A callback triggered when the template finishes loading.
- * @param {function} error_callback A callback triggered if an error occurs loading the template.
- *
- *
- */</span>
- Twig.Templates.loadRemote = <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">location, params, callback, error_callback</span>) </span>{
- <span class="hljs-keyword">var</span> loader;</pre></div></div>
-
- </li>
-
-
- <li id="section-83">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-83">&#182;</a>
- </div>
- <p>Default to async</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">if</span> (params.async === <span class="hljs-literal">undefined</span>) {
- params.async = <span class="hljs-literal">true</span>;
- }</pre></div></div>
-
- </li>
-
-
- <li id="section-84">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-84">&#182;</a>
- </div>
- <p>Default to the URL so the template is cached.</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">if</span> (params.id === <span class="hljs-literal">undefined</span>) {
- params.id = location;
- }</pre></div></div>
-
- </li>
-
-
- <li id="section-85">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-85">&#182;</a>
- </div>
- <p>Check for existing template</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">if</span> (Twig.cache &amp;&amp; Twig.Templates.registry.hasOwnProperty(params.id)) {</pre></div></div>
-
- </li>
-
-
- <li id="section-86">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-86">&#182;</a>
- </div>
- <p>A template is already saved with the given id.</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">if</span> (<span class="hljs-keyword">typeof</span> callback === <span class="hljs-string">'function'</span>) {
- callback(Twig.Templates.registry[params.id]);
- }</pre></div></div>
-
- </li>
-
-
- <li id="section-87">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-87">&#182;</a>
- </div>
- <p>TODO: if async, return deferred promise</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">return</span> Twig.Templates.registry[params.id];
- }</pre></div></div>
-
- </li>
-
-
- <li id="section-88">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-88">&#182;</a>
- </div>
- <p>if the parser name hasn’t been set, default it to twig</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> params.parser = params.parser || <span class="hljs-string">'twig'</span>;</pre></div></div>
-
- </li>
-
-
- <li id="section-89">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-89">&#182;</a>
- </div>
- <p>Assume ‘fs’ if the loader is not defined</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> loader = <span class="hljs-keyword">this</span>.loaders[params.method] || <span class="hljs-keyword">this</span>.loaders.fs;
- <span class="hljs-keyword">return</span> loader.apply(<span class="hljs-keyword">this</span>, <span class="hljs-built_in">arguments</span>);
- };</pre></div></div>
-
- </li>
-
-
- <li id="section-90">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-90">&#182;</a>
- </div>
- <p>Determine object type</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">is</span>(<span class="hljs-params">type, obj</span>) </span>{
- <span class="hljs-keyword">var</span> clas = <span class="hljs-built_in">Object</span>.prototype.toString.call(obj).slice(<span class="hljs-number">8</span>, <span class="hljs-number">-1</span>);
- <span class="hljs-keyword">return</span> obj !== <span class="hljs-literal">undefined</span> &amp;&amp; obj !== <span class="hljs-literal">null</span> &amp;&amp; clas === type;
- }
-
- <span class="hljs-comment">/**
- * Create a new twig.js template.
- *
- * Parameters: {
- * data: The template, either pre-compiled tokens or a string template
- * id: The name of this template
- * blocks: Any pre-existing block from a child template
- * }
- *
- * @param {Object} params The template parameters.
- */</span>
- Twig.Template = <span class="hljs-function"><span class="hljs-keyword">function</span> (<span class="hljs-params"> params </span>) </span>{
- <span class="hljs-keyword">var</span> data = params.data,
- id = params.id,
- blocks = params.blocks,
- macros = params.macros || {},
- base = params.base,
- path = params.path,
- url = params.url,
- name = params.name,
- method = params.method,</pre></div></div>
-
- </li>
-
-
- <li id="section-91">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-91">&#182;</a>
- </div>
- <p>parser options</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> options = params.options;</pre></div></div>
-
- </li>
-
-
- <li id="section-92">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-92">&#182;</a>
- </div>
- <h1 id="what-is-stored-in-a-twig-template">What is stored in a Twig.Template</h1>
-<p>The Twig Template hold several chucks of data.</p>
-<pre><code>{
- id: The token ID (<span class="hljs-keyword">if</span> any)
- tokens: The list <span class="hljs-keyword">of</span> tokens that makes up <span class="hljs-keyword">this</span> template.
- blocks: The list <span class="hljs-keyword">of</span> block <span class="hljs-keyword">this</span> template contains.
- base: The base template (<span class="hljs-keyword">if</span> any)
- options: {
- Compiler/parser options
-
- strict_variables: <span class="hljs-literal">true</span>/<span class="hljs-literal">false</span>
- Should missing variable/keys emit an error message. If <span class="hljs-literal">false</span>, they <span class="hljs-keyword">default</span> to <span class="hljs-literal">null</span>.
- }
-}
-</code></pre>
- </div>
-
- <div class="content"><div class='highlight'><pre>
- <span class="hljs-keyword">this</span>.id = id;
- <span class="hljs-keyword">this</span>.method = method;
- <span class="hljs-keyword">this</span>.base = base;
- <span class="hljs-keyword">this</span>.path = path;
- <span class="hljs-keyword">this</span>.url = url;
- <span class="hljs-keyword">this</span>.name = name;
- <span class="hljs-keyword">this</span>.macros = macros;
- <span class="hljs-keyword">this</span>.options = options;
-
- <span class="hljs-keyword">this</span>.reset(blocks);
-
- <span class="hljs-keyword">if</span> (is(<span class="hljs-string">'String'</span>, data)) {
- <span class="hljs-keyword">this</span>.tokens = Twig.prepare.apply(<span class="hljs-keyword">this</span>, [data]);
- } <span class="hljs-keyword">else</span> {
- <span class="hljs-keyword">this</span>.tokens = data;
- }
-
- <span class="hljs-keyword">if</span> (id !== <span class="hljs-literal">undefined</span>) {
- Twig.Templates.save(<span class="hljs-keyword">this</span>);
- }
- };
-
- Twig.Template.prototype.reset = <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">blocks</span>) </span>{
- Twig.log.debug(<span class="hljs-string">"Twig.Template.reset"</span>, <span class="hljs-string">"Reseting template "</span> + <span class="hljs-keyword">this</span>.id);
- <span class="hljs-keyword">this</span>.blocks = {};
- <span class="hljs-keyword">this</span>.importedBlocks = [];
- <span class="hljs-keyword">this</span>.originalBlockTokens = {};
- <span class="hljs-keyword">this</span>.child = {
- blocks: blocks || {}
- };
- <span class="hljs-keyword">this</span>.extend = <span class="hljs-literal">null</span>;
- };
-
- Twig.Template.prototype.render = <span class="hljs-function"><span class="hljs-keyword">function</span> (<span class="hljs-params">context, params</span>) </span>{
- params = params || {};
-
- <span class="hljs-keyword">var</span> output,
- url;
-
- <span class="hljs-keyword">this</span>.context = context || {};</pre></div></div>
-
- </li>
-
-
- <li id="section-93">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-93">&#182;</a>
- </div>
- <p>Clear any previous state</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">this</span>.reset();
- <span class="hljs-keyword">if</span> (params.blocks) {
- <span class="hljs-keyword">this</span>.blocks = params.blocks;
- }
- <span class="hljs-keyword">if</span> (params.macros) {
- <span class="hljs-keyword">this</span>.macros = params.macros;
- }
-
- output = Twig.parse.apply(<span class="hljs-keyword">this</span>, [<span class="hljs-keyword">this</span>.tokens, <span class="hljs-keyword">this</span>.context]);</pre></div></div>
-
- </li>
-
-
- <li id="section-94">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-94">&#182;</a>
- </div>
- <p>Does this template extend another</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">if</span> (<span class="hljs-keyword">this</span>.extend) {
- <span class="hljs-keyword">var</span> ext_template;</pre></div></div>
-
- </li>
-
-
- <li id="section-95">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-95">&#182;</a>
- </div>
- <p>check if the template is provided inline</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">if</span> ( <span class="hljs-keyword">this</span>.options.allowInlineIncludes ) {
- ext_template = Twig.Templates.load(<span class="hljs-keyword">this</span>.extend);
- <span class="hljs-keyword">if</span> ( ext_template ) {
- ext_template.options = <span class="hljs-keyword">this</span>.options;
- }
- }</pre></div></div>
-
- </li>
-
-
- <li id="section-96">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-96">&#182;</a>
- </div>
- <p>check for the template file via include</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">if</span> (!ext_template) {
- url = Twig.path.parsePath(<span class="hljs-keyword">this</span>, <span class="hljs-keyword">this</span>.extend);
-
- ext_template = Twig.Templates.loadRemote(url, {
- method: <span class="hljs-keyword">this</span>.getLoaderMethod(),
- base: <span class="hljs-keyword">this</span>.base,
- <span class="hljs-keyword">async</span>: <span class="hljs-literal">false</span>,
- id: url,
- options: <span class="hljs-keyword">this</span>.options
- });
- }
-
- <span class="hljs-keyword">this</span>.parent = ext_template;
-
- <span class="hljs-keyword">return</span> <span class="hljs-keyword">this</span>.parent.render(<span class="hljs-keyword">this</span>.context, {
- blocks: <span class="hljs-keyword">this</span>.blocks
- });
- }
-
- <span class="hljs-keyword">if</span> (params.output == <span class="hljs-string">'blocks'</span>) {
- <span class="hljs-keyword">return</span> <span class="hljs-keyword">this</span>.blocks;
- } <span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span> (params.output == <span class="hljs-string">'macros'</span>) {
- <span class="hljs-keyword">return</span> <span class="hljs-keyword">this</span>.macros;
- } <span class="hljs-keyword">else</span> {
- <span class="hljs-keyword">return</span> output;
- }
- };
-
- Twig.Template.prototype.importFile = <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">file</span>) </span>{
- <span class="hljs-keyword">var</span> url, sub_template;
- <span class="hljs-keyword">if</span> (!<span class="hljs-keyword">this</span>.url &amp;&amp; <span class="hljs-keyword">this</span>.options.allowInlineIncludes) {
- file = <span class="hljs-keyword">this</span>.path ? <span class="hljs-keyword">this</span>.path + <span class="hljs-string">'/'</span> + file : file;
- sub_template = Twig.Templates.load(file);
-
- <span class="hljs-keyword">if</span> (!sub_template) {
- sub_template = Twig.Templates.loadRemote(url, {
- id: file,
- method: <span class="hljs-keyword">this</span>.getLoaderMethod(),
- <span class="hljs-keyword">async</span>: <span class="hljs-literal">false</span>,
- options: <span class="hljs-keyword">this</span>.options
- });
-
- <span class="hljs-keyword">if</span> (!sub_template) {
- <span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> Twig.Error(<span class="hljs-string">"Unable to find the template "</span> + file);
- }
- }
-
- sub_template.options = <span class="hljs-keyword">this</span>.options;
-
- <span class="hljs-keyword">return</span> sub_template;
- }
-
- url = Twig.path.parsePath(<span class="hljs-keyword">this</span>, file);</pre></div></div>
-
- </li>
-
-
- <li id="section-97">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-97">&#182;</a>
- </div>
- <p>Load blocks from an external file</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> sub_template = Twig.Templates.loadRemote(url, {
- method: <span class="hljs-keyword">this</span>.getLoaderMethod(),
- base: <span class="hljs-keyword">this</span>.base,
- <span class="hljs-keyword">async</span>: <span class="hljs-literal">false</span>,
- options: <span class="hljs-keyword">this</span>.options,
- id: url
- });
-
- <span class="hljs-keyword">return</span> sub_template;
- };
-
- Twig.Template.prototype.importBlocks = <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">file, override</span>) </span>{
- <span class="hljs-keyword">var</span> sub_template = <span class="hljs-keyword">this</span>.importFile(file),
- context = <span class="hljs-keyword">this</span>.context,
- that = <span class="hljs-keyword">this</span>,
- key;
-
- override = override || <span class="hljs-literal">false</span>;
-
- sub_template.render(context);</pre></div></div>
-
- </li>
-
-
- <li id="section-98">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-98">&#182;</a>
- </div>
- <p>Mixin blocks</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> Twig.forEach(<span class="hljs-built_in">Object</span>.keys(sub_template.blocks), <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">key</span>) </span>{
- <span class="hljs-keyword">if</span> (override || that.blocks[key] === <span class="hljs-literal">undefined</span>) {
- that.blocks[key] = sub_template.blocks[key];
- that.importedBlocks.push(key);
- }
- });
- };
-
- Twig.Template.prototype.importMacros = <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">file</span>) </span>{
- <span class="hljs-keyword">var</span> url = Twig.path.parsePath(<span class="hljs-keyword">this</span>, file);</pre></div></div>
-
- </li>
-
-
- <li id="section-99">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-99">&#182;</a>
- </div>
- <p>load remote template</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">var</span> remoteTemplate = Twig.Templates.loadRemote(url, {
- method: <span class="hljs-keyword">this</span>.getLoaderMethod(),
- <span class="hljs-keyword">async</span>: <span class="hljs-literal">false</span>,
- id: url
- });
-
- <span class="hljs-keyword">return</span> remoteTemplate;
- };
-
- Twig.Template.prototype.getLoaderMethod = <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"></span>) </span>{
- <span class="hljs-keyword">if</span> (<span class="hljs-keyword">this</span>.path) {
- <span class="hljs-keyword">return</span> <span class="hljs-string">'fs'</span>;
- }
- <span class="hljs-keyword">if</span> (<span class="hljs-keyword">this</span>.url) {
- <span class="hljs-keyword">return</span> <span class="hljs-string">'ajax'</span>;
- }
- <span class="hljs-keyword">return</span> <span class="hljs-keyword">this</span>.method || <span class="hljs-string">'fs'</span>;
- };
-
- Twig.Template.prototype.compile = <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">options</span>) </span>{</pre></div></div>
-
- </li>
-
-
- <li id="section-100">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-100">&#182;</a>
- </div>
- <p>compile the template into raw JS</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">return</span> Twig.compiler.compile(<span class="hljs-keyword">this</span>, options);
- };
-
- <span class="hljs-comment">/**
- * Create safe output
- *
- * @param {string} Content safe to output
- *
- * @return {String} Content wrapped into a String
- */</span>
-
- Twig.Markup = <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">content, strategy</span>) </span>{
- <span class="hljs-keyword">if</span>(<span class="hljs-keyword">typeof</span> strategy == <span class="hljs-string">'undefined'</span>) {
- strategy = <span class="hljs-literal">true</span>;
- }
-
- <span class="hljs-keyword">if</span> (<span class="hljs-keyword">typeof</span> content === <span class="hljs-string">'string'</span> &amp;&amp; content.length &gt; <span class="hljs-number">0</span>) {
- content = <span class="hljs-keyword">new</span> <span class="hljs-built_in">String</span>(content);
- content.twig_markup = strategy;
- }
- <span class="hljs-keyword">return</span> content;
- };
-
- <span class="hljs-keyword">return</span> Twig;
-
-}) (Twig || { });
-
-(<span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">Twig</span>) </span>{
-<span class="hljs-meta">
- 'use strict'</span>;
-
- Twig.Templates.registerLoader(<span class="hljs-string">'ajax'</span>, <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">location, params, callback, error_callback</span>) </span>{
- <span class="hljs-keyword">var</span> template,
- xmlhttp,
- precompiled = params.precompiled,
- parser = <span class="hljs-keyword">this</span>.parsers[params.parser] || <span class="hljs-keyword">this</span>.parser.twig;
-
- <span class="hljs-keyword">if</span> (<span class="hljs-keyword">typeof</span> XMLHttpRequest === <span class="hljs-string">"undefined"</span>) {
- <span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> Twig.Error(<span class="hljs-string">'Unsupported platform: Unable to do ajax requests '</span> +
- <span class="hljs-string">'because there is no "XMLHTTPRequest" implementation'</span>);
- }
-
- xmlhttp = <span class="hljs-keyword">new</span> XMLHttpRequest();
- xmlhttp.onreadystatechange = <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"></span>) </span>{
- <span class="hljs-keyword">var</span> data = <span class="hljs-literal">null</span>;
-
- <span class="hljs-keyword">if</span>(xmlhttp.readyState === <span class="hljs-number">4</span>) {
- <span class="hljs-keyword">if</span> (xmlhttp.status === <span class="hljs-number">200</span> || (<span class="hljs-built_in">window</span>.cordova &amp;&amp; xmlhttp.status == <span class="hljs-number">0</span>)) {
- Twig.log.debug(<span class="hljs-string">"Got template "</span>, xmlhttp.responseText);
-
- <span class="hljs-keyword">if</span> (precompiled === <span class="hljs-literal">true</span>) {
- data = <span class="hljs-built_in">JSON</span>.parse(xmlhttp.responseText);
- } <span class="hljs-keyword">else</span> {
- data = xmlhttp.responseText;
- }
-
- params.url = location;
- params.data = data;
-
- template = parser.call(<span class="hljs-keyword">this</span>, params);
-
- <span class="hljs-keyword">if</span> (<span class="hljs-keyword">typeof</span> callback === <span class="hljs-string">'function'</span>) {
- callback(template);
- }
- } <span class="hljs-keyword">else</span> {
- <span class="hljs-keyword">if</span> (<span class="hljs-keyword">typeof</span> error_callback === <span class="hljs-string">'function'</span>) {
- error_callback(xmlhttp);
- }
- }
- }
- };
- xmlhttp.open(<span class="hljs-string">"GET"</span>, location, !!params.async);
- xmlhttp.send();
-
- <span class="hljs-keyword">if</span> (params.async) {</pre></div></div>
-
- </li>
-
-
- <li id="section-101">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-101">&#182;</a>
- </div>
- <p>TODO: return deferred promise</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">return</span> <span class="hljs-literal">true</span>;
- } <span class="hljs-keyword">else</span> {
- <span class="hljs-keyword">return</span> template;
- }
- });
-
-}(Twig));(<span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">Twig</span>) </span>{
-<span class="hljs-meta"> 'use strict'</span>;
-
- <span class="hljs-keyword">var</span> fs, path;
-
- <span class="hljs-keyword">try</span> {</pre></div></div>
-
- </li>
-
-
- <li id="section-102">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-102">&#182;</a>
- </div>
- <p>require lib dependencies at runtime</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> fs = <span class="hljs-built_in">require</span>(<span class="hljs-string">'fs'</span>);
- path = <span class="hljs-built_in">require</span>(<span class="hljs-string">'path'</span>);
- } <span class="hljs-keyword">catch</span> (e) {</pre></div></div>
-
- </li>
-
-
- <li id="section-103">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-103">&#182;</a>
- </div>
- <p>NOTE: this is in a try/catch to avoid errors cross platform</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> }
-
- Twig.Templates.registerLoader(<span class="hljs-string">'fs'</span>, <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">location, params, callback, error_callback</span>) </span>{
- <span class="hljs-keyword">var</span> template,
- data = <span class="hljs-literal">null</span>,
- precompiled = params.precompiled,
- parser = <span class="hljs-keyword">this</span>.parsers[params.parser] || <span class="hljs-keyword">this</span>.parser.twig;
-
- <span class="hljs-keyword">if</span> (!fs || !path) {
- <span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> Twig.Error(<span class="hljs-string">'Unsupported platform: Unable to load from file '</span> +
- <span class="hljs-string">'because there is no "fs" or "path" implementation'</span>);
- }
-
- <span class="hljs-keyword">var</span> loadTemplateFn = <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">err, data</span>) </span>{
- <span class="hljs-keyword">if</span> (err) {
- <span class="hljs-keyword">if</span> (<span class="hljs-keyword">typeof</span> error_callback === <span class="hljs-string">'function'</span>) {
- error_callback(err);
- }
- <span class="hljs-keyword">return</span>;
- }
-
- <span class="hljs-keyword">if</span> (precompiled === <span class="hljs-literal">true</span>) {
- data = <span class="hljs-built_in">JSON</span>.parse(data);
- }
-
- params.data = data;
- params.path = params.path || location;</pre></div></div>
-
- </li>
-
-
- <li id="section-104">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-104">&#182;</a>
- </div>
- <p>template is in data</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> template = parser.call(<span class="hljs-keyword">this</span>, params);
-
- <span class="hljs-keyword">if</span> (<span class="hljs-keyword">typeof</span> callback === <span class="hljs-string">'function'</span>) {
- callback(template);
- }
- };
- params.path = params.path || location;
-
- <span class="hljs-keyword">if</span> (params.async) {
- fs.stat(params.path, <span class="hljs-function"><span class="hljs-keyword">function</span> (<span class="hljs-params">err, stats</span>) </span>{
- <span class="hljs-keyword">if</span> (err || !stats.isFile()) {
- <span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> Twig.Error(<span class="hljs-string">'Unable to find template file '</span> + location);
- }
- fs.readFile(params.path, <span class="hljs-string">'utf8'</span>, loadTemplateFn);
- });</pre></div></div>
-
- </li>
-
-
- <li id="section-105">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-105">&#182;</a>
- </div>
- <p>TODO: return deferred promise</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">return</span> <span class="hljs-literal">true</span>;
- } <span class="hljs-keyword">else</span> {
- <span class="hljs-keyword">if</span> (!fs.statSync(params.path).isFile()) {
- <span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> Twig.Error(<span class="hljs-string">'Unable to find template file '</span> + location);
- }
- data = fs.readFileSync(params.path, <span class="hljs-string">'utf8'</span>);
- loadTemplateFn(<span class="hljs-literal">undefined</span>, data);
- <span class="hljs-keyword">return</span> template
- }
- });
-
-}(Twig));(<span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">Twig</span>)</span>{
-<span class="hljs-meta"> 'use strict'</span>;
-
- Twig.Templates.registerParser(<span class="hljs-string">'source'</span>, <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">params</span>) </span>{
- <span class="hljs-keyword">return</span> params.data || <span class="hljs-string">''</span>;
- });
-})(Twig);
-(<span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">Twig</span>)</span>{
-<span class="hljs-meta"> 'use strict'</span>;
-
- Twig.Templates.registerParser(<span class="hljs-string">'twig'</span>, <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">params</span>) </span>{
- <span class="hljs-keyword">return</span> <span class="hljs-keyword">new</span> Twig.Template(params);
- });
-})(Twig);</pre></div></div>
-
- </li>
-
-
- <li id="section-106">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-106">&#182;</a>
- </div>
- <p>The following methods are from MDN and are available under a
-<a href="http://www.opensource.org/licenses/mit-license.php">MIT License</a> or are
-<a href="https://developer.mozilla.org/Project:Copyrights">Public Domain</a>.</p>
-<p>See:</p>
-<ul>
-<li><a href="https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Object/keys">Object.keys - MDN</a></li>
-</ul>
-
- </div>
-
- </li>
-
-
- <li id="section-107">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-107">&#182;</a>
- </div>
- <h2 id="twig-fills-js">twig.fills.js</h2>
-<p>This file contains fills for backwards compatability.</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre>(<span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"></span>) </span>{
-<span class="hljs-meta"> "use strict"</span>;</pre></div></div>
-
- </li>
-
-
- <li id="section-108">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-108">&#182;</a>
- </div>
- <p>Handle methods that don’t yet exist in every browser</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre>
- <span class="hljs-keyword">if</span> (!<span class="hljs-built_in">String</span>.prototype.trim) {
- <span class="hljs-built_in">String</span>.prototype.trim = <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"></span>) </span>{
- <span class="hljs-keyword">return</span> <span class="hljs-keyword">this</span>.replace(<span class="hljs-regexp">/^\s+|\s+$/g</span>,<span class="hljs-string">''</span>);
- }
- };
-
- <span class="hljs-keyword">if</span>(!<span class="hljs-built_in">Object</span>.keys) <span class="hljs-built_in">Object</span>.keys = <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">o</span>)</span>{
- <span class="hljs-keyword">if</span> (o !== <span class="hljs-built_in">Object</span>(o)) {
- <span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> <span class="hljs-built_in">TypeError</span>(<span class="hljs-string">'Object.keys called on non-object'</span>);
- }
- <span class="hljs-keyword">var</span> ret = [], p;
- <span class="hljs-keyword">for</span> (p <span class="hljs-keyword">in</span> o) <span class="hljs-keyword">if</span> (<span class="hljs-built_in">Object</span>.prototype.hasOwnProperty.call(o, p)) ret.push(p);
- <span class="hljs-keyword">return</span> ret;
- }
-
-})();</pre></div></div>
-
- </li>
-
-
- <li id="section-109">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-109">&#182;</a>
- </div>
- <h2 id="twig-lib-js">twig.lib.js</h2>
-<p>This file contains 3rd party libraries used within twig.</p>
-<p>Copies of the licenses for the code included here can be found in the
-LICENSES.md file.</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre>
-<span class="hljs-keyword">var</span> Twig = (<span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">Twig</span>) </span>{</pre></div></div>
-
- </li>
-
-
- <li id="section-110">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-110">&#182;</a>
- </div>
- <p>Namespace for libraries</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> Twig.lib = { };
-
- <span class="hljs-comment">/**
- sprintf() for JavaScript 1.0.3
- https://github.com/alexei/sprintf.js
- **/</span>
- <span class="hljs-keyword">var</span> sprintfLib = (<span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"></span>) </span>{
- <span class="hljs-keyword">var</span> re = {
- not_string: <span class="hljs-regexp">/[^s]/</span>,
- number: <span class="hljs-regexp">/[diefg]/</span>,
- json: <span class="hljs-regexp">/[j]/</span>,
- not_json: <span class="hljs-regexp">/[^j]/</span>,
- text: <span class="hljs-regexp">/^[^\x25]+/</span>,
- modulo: <span class="hljs-regexp">/^\x25{2}/</span>,
- placeholder: <span class="hljs-regexp">/^\x25(?:([1-9]\d*)\$|\(([^\)]+)\))?(\+)?(0|'[^$])?(-)?(\d+)?(?:\.(\d+))?([b-gijosuxX])/</span>,
- key: <span class="hljs-regexp">/^([a-z_][a-z_\d]*)/i</span>,
- key_access: <span class="hljs-regexp">/^\.([a-z_][a-z_\d]*)/i</span>,
- index_access: <span class="hljs-regexp">/^\[(\d+)\]/</span>,
- sign: <span class="hljs-regexp">/^[\+\-]/</span>
- }
-
- <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">sprintf</span>(<span class="hljs-params"></span>) </span>{
- <span class="hljs-keyword">var</span> key = <span class="hljs-built_in">arguments</span>[<span class="hljs-number">0</span>], cache = sprintf.cache
- <span class="hljs-keyword">if</span> (!(cache[key] &amp;&amp; cache.hasOwnProperty(key))) {
- cache[key] = sprintf.parse(key)
- }
- <span class="hljs-keyword">return</span> sprintf.format.call(<span class="hljs-literal">null</span>, cache[key], <span class="hljs-built_in">arguments</span>)
- }
-
- sprintf.format = <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">parse_tree, argv</span>) </span>{
- <span class="hljs-keyword">var</span> cursor = <span class="hljs-number">1</span>, tree_length = parse_tree.length, node_type = <span class="hljs-string">""</span>, arg, output = [], i, k, match, pad, pad_character, pad_length, is_positive = <span class="hljs-literal">true</span>, sign = <span class="hljs-string">""</span>
- <span class="hljs-keyword">for</span> (i = <span class="hljs-number">0</span>; i &lt; tree_length; i++) {
- node_type = get_type(parse_tree[i])
- <span class="hljs-keyword">if</span> (node_type === <span class="hljs-string">"string"</span>) {
- output[output.length] = parse_tree[i]
- }
- <span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span> (node_type === <span class="hljs-string">"array"</span>) {
- match = parse_tree[i] <span class="hljs-comment">// convenience purposes only</span>
- <span class="hljs-keyword">if</span> (match[<span class="hljs-number">2</span>]) { <span class="hljs-comment">// keyword argument</span>
- arg = argv[cursor]
- <span class="hljs-keyword">for</span> (k = <span class="hljs-number">0</span>; k &lt; match[<span class="hljs-number">2</span>].length; k++) {
- <span class="hljs-keyword">if</span> (!arg.hasOwnProperty(match[<span class="hljs-number">2</span>][k])) {
- <span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> <span class="hljs-built_in">Error</span>(sprintf(<span class="hljs-string">"[sprintf] property '%s' does not exist"</span>, match[<span class="hljs-number">2</span>][k]))
- }
- arg = arg[match[<span class="hljs-number">2</span>][k]]
- }
- }
- <span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span> (match[<span class="hljs-number">1</span>]) { <span class="hljs-comment">// positional argument (explicit)</span>
- arg = argv[match[<span class="hljs-number">1</span>]]
- }
- <span class="hljs-keyword">else</span> { <span class="hljs-comment">// positional argument (implicit)</span>
- arg = argv[cursor++]
- }
-
- <span class="hljs-keyword">if</span> (get_type(arg) == <span class="hljs-string">"function"</span>) {
- arg = arg()
- }
-
- <span class="hljs-keyword">if</span> (re.not_string.test(match[<span class="hljs-number">8</span>]) &amp;&amp; re.not_json.test(match[<span class="hljs-number">8</span>]) &amp;&amp; (get_type(arg) != <span class="hljs-string">"number"</span> &amp;&amp; <span class="hljs-built_in">isNaN</span>(arg))) {
- <span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> <span class="hljs-built_in">TypeError</span>(sprintf(<span class="hljs-string">"[sprintf] expecting number but found %s"</span>, get_type(arg)))
- }
-
- <span class="hljs-keyword">if</span> (re.number.test(match[<span class="hljs-number">8</span>])) {
- is_positive = arg &gt;= <span class="hljs-number">0</span>
- }
-
- <span class="hljs-keyword">switch</span> (match[<span class="hljs-number">8</span>]) {
- <span class="hljs-keyword">case</span> <span class="hljs-string">"b"</span>:
- arg = arg.toString(<span class="hljs-number">2</span>)
- <span class="hljs-keyword">break</span>
- <span class="hljs-keyword">case</span> <span class="hljs-string">"c"</span>:
- arg = <span class="hljs-built_in">String</span>.fromCharCode(arg)
- <span class="hljs-keyword">break</span>
- <span class="hljs-keyword">case</span> <span class="hljs-string">"d"</span>:
- <span class="hljs-keyword">case</span> <span class="hljs-string">"i"</span>:
- arg = <span class="hljs-built_in">parseInt</span>(arg, <span class="hljs-number">10</span>)
- <span class="hljs-keyword">break</span>
- <span class="hljs-keyword">case</span> <span class="hljs-string">"j"</span>:
- arg = <span class="hljs-built_in">JSON</span>.stringify(arg, <span class="hljs-literal">null</span>, match[<span class="hljs-number">6</span>] ? <span class="hljs-built_in">parseInt</span>(match[<span class="hljs-number">6</span>]) : <span class="hljs-number">0</span>)
- <span class="hljs-keyword">break</span>
- <span class="hljs-keyword">case</span> <span class="hljs-string">"e"</span>:
- arg = match[<span class="hljs-number">7</span>] ? arg.toExponential(match[<span class="hljs-number">7</span>]) : arg.toExponential()
- <span class="hljs-keyword">break</span>
- <span class="hljs-keyword">case</span> <span class="hljs-string">"f"</span>:
- arg = match[<span class="hljs-number">7</span>] ? <span class="hljs-built_in">parseFloat</span>(arg).toFixed(match[<span class="hljs-number">7</span>]) : <span class="hljs-built_in">parseFloat</span>(arg)
- <span class="hljs-keyword">break</span>
- <span class="hljs-keyword">case</span> <span class="hljs-string">"g"</span>:
- arg = match[<span class="hljs-number">7</span>] ? <span class="hljs-built_in">parseFloat</span>(arg).toPrecision(match[<span class="hljs-number">7</span>]) : <span class="hljs-built_in">parseFloat</span>(arg)
- <span class="hljs-keyword">break</span>
- <span class="hljs-keyword">case</span> <span class="hljs-string">"o"</span>:
- arg = arg.toString(<span class="hljs-number">8</span>)
- <span class="hljs-keyword">break</span>
- <span class="hljs-keyword">case</span> <span class="hljs-string">"s"</span>:
- arg = ((arg = <span class="hljs-built_in">String</span>(arg)) &amp;&amp; match[<span class="hljs-number">7</span>] ? arg.substring(<span class="hljs-number">0</span>, match[<span class="hljs-number">7</span>]) : arg)
- <span class="hljs-keyword">break</span>
- <span class="hljs-keyword">case</span> <span class="hljs-string">"u"</span>:
- arg = arg &gt;&gt;&gt; <span class="hljs-number">0</span>
- <span class="hljs-keyword">break</span>
- <span class="hljs-keyword">case</span> <span class="hljs-string">"x"</span>:
- arg = arg.toString(<span class="hljs-number">16</span>)
- <span class="hljs-keyword">break</span>
- <span class="hljs-keyword">case</span> <span class="hljs-string">"X"</span>:
- arg = arg.toString(<span class="hljs-number">16</span>).toUpperCase()
- <span class="hljs-keyword">break</span>
- }
- <span class="hljs-keyword">if</span> (re.json.test(match[<span class="hljs-number">8</span>])) {
- output[output.length] = arg
- }
- <span class="hljs-keyword">else</span> {
- <span class="hljs-keyword">if</span> (re.number.test(match[<span class="hljs-number">8</span>]) &amp;&amp; (!is_positive || match[<span class="hljs-number">3</span>])) {
- sign = is_positive ? <span class="hljs-string">"+"</span> : <span class="hljs-string">"-"</span>
- arg = arg.toString().replace(re.sign, <span class="hljs-string">""</span>)
- }
- <span class="hljs-keyword">else</span> {
- sign = <span class="hljs-string">""</span>
- }
- pad_character = match[<span class="hljs-number">4</span>] ? match[<span class="hljs-number">4</span>] === <span class="hljs-string">"0"</span> ? <span class="hljs-string">"0"</span> : match[<span class="hljs-number">4</span>].charAt(<span class="hljs-number">1</span>) : <span class="hljs-string">" "</span>
- pad_length = match[<span class="hljs-number">6</span>] - (sign + arg).length
- pad = match[<span class="hljs-number">6</span>] ? (pad_length &gt; <span class="hljs-number">0</span> ? str_repeat(pad_character, pad_length) : <span class="hljs-string">""</span>) : <span class="hljs-string">""</span>
- output[output.length] = match[<span class="hljs-number">5</span>] ? sign + arg + pad : (pad_character === <span class="hljs-string">"0"</span> ? sign + pad + arg : pad + sign + arg)
- }
- }
- }
- <span class="hljs-keyword">return</span> output.join(<span class="hljs-string">""</span>)
- }
-
- sprintf.cache = {}
-
- sprintf.parse = <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">fmt</span>) </span>{
- <span class="hljs-keyword">var</span> _fmt = fmt, match = [], parse_tree = [], arg_names = <span class="hljs-number">0</span>
- <span class="hljs-keyword">while</span> (_fmt) {
- <span class="hljs-keyword">if</span> ((match = re.text.exec(_fmt)) !== <span class="hljs-literal">null</span>) {
- parse_tree[parse_tree.length] = match[<span class="hljs-number">0</span>]
- }
- <span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span> ((match = re.modulo.exec(_fmt)) !== <span class="hljs-literal">null</span>) {
- parse_tree[parse_tree.length] = <span class="hljs-string">"%"</span>
- }
- <span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span> ((match = re.placeholder.exec(_fmt)) !== <span class="hljs-literal">null</span>) {
- <span class="hljs-keyword">if</span> (match[<span class="hljs-number">2</span>]) {
- arg_names |= <span class="hljs-number">1</span>
- <span class="hljs-keyword">var</span> field_list = [], replacement_field = match[<span class="hljs-number">2</span>], field_match = []
- <span class="hljs-keyword">if</span> ((field_match = re.key.exec(replacement_field)) !== <span class="hljs-literal">null</span>) {
- field_list[field_list.length] = field_match[<span class="hljs-number">1</span>]
- <span class="hljs-keyword">while</span> ((replacement_field = replacement_field.substring(field_match[<span class="hljs-number">0</span>].length)) !== <span class="hljs-string">""</span>) {
- <span class="hljs-keyword">if</span> ((field_match = re.key_access.exec(replacement_field)) !== <span class="hljs-literal">null</span>) {
- field_list[field_list.length] = field_match[<span class="hljs-number">1</span>]
- }
- <span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span> ((field_match = re.index_access.exec(replacement_field)) !== <span class="hljs-literal">null</span>) {
- field_list[field_list.length] = field_match[<span class="hljs-number">1</span>]
- }
- <span class="hljs-keyword">else</span> {
- <span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> <span class="hljs-built_in">SyntaxError</span>(<span class="hljs-string">"[sprintf] failed to parse named argument key"</span>)
- }
- }
- }
- <span class="hljs-keyword">else</span> {
- <span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> <span class="hljs-built_in">SyntaxError</span>(<span class="hljs-string">"[sprintf] failed to parse named argument key"</span>)
- }
- match[<span class="hljs-number">2</span>] = field_list
- }
- <span class="hljs-keyword">else</span> {
- arg_names |= <span class="hljs-number">2</span>
- }
- <span class="hljs-keyword">if</span> (arg_names === <span class="hljs-number">3</span>) {
- <span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> <span class="hljs-built_in">Error</span>(<span class="hljs-string">"[sprintf] mixing positional and named placeholders is not (yet) supported"</span>)
- }
- parse_tree[parse_tree.length] = match
- }
- <span class="hljs-keyword">else</span> {
- <span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> <span class="hljs-built_in">SyntaxError</span>(<span class="hljs-string">"[sprintf] unexpected placeholder"</span>)
- }
- _fmt = _fmt.substring(match[<span class="hljs-number">0</span>].length)
- }
- <span class="hljs-keyword">return</span> parse_tree
- }
-
- <span class="hljs-keyword">var</span> vsprintf = <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">fmt, argv, _argv</span>) </span>{
- _argv = (argv || []).slice(<span class="hljs-number">0</span>)
- _argv.splice(<span class="hljs-number">0</span>, <span class="hljs-number">0</span>, fmt)
- <span class="hljs-keyword">return</span> sprintf.apply(<span class="hljs-literal">null</span>, _argv)
- }
-
- <span class="hljs-comment">/**
- * helpers
- */</span>
- <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">get_type</span>(<span class="hljs-params">variable</span>) </span>{
- <span class="hljs-keyword">return</span> <span class="hljs-built_in">Object</span>.prototype.toString.call(variable).slice(<span class="hljs-number">8</span>, <span class="hljs-number">-1</span>).toLowerCase()
- }
-
- <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">str_repeat</span>(<span class="hljs-params">input, multiplier</span>) </span>{
- <span class="hljs-keyword">return</span> <span class="hljs-built_in">Array</span>(multiplier + <span class="hljs-number">1</span>).join(input)
- }
-
- <span class="hljs-comment">/**
- * export
- */</span>
- <span class="hljs-keyword">return</span> {
- sprintf: sprintf,
- vsprintf: vsprintf
- }
- })();
-
- <span class="hljs-keyword">var</span> sprintf = sprintfLib.sprintf;
- <span class="hljs-keyword">var</span> vsprintf = sprintfLib.vsprintf;</pre></div></div>
-
- </li>
-
-
- <li id="section-111">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-111">&#182;</a>
- </div>
- <p>Expose to Twig</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> Twig.lib.sprintf = sprintf;
- Twig.lib.vsprintf = vsprintf;
-
-
- <span class="hljs-comment">/**
- * jPaq - A fully customizable JavaScript/JScript library
- * http://jpaq.org/
- *
- * Copyright (c) 2011 Christopher West
- * Licensed under the MIT license.
- * http://jpaq.org/license/
- *
- * Version: 1.0.6.0000W
- * Revised: April 6, 2011
- */</span>
- ; (<span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"></span>) </span>{
- <span class="hljs-keyword">var</span> shortDays = <span class="hljs-string">"Sun,Mon,Tue,Wed,Thu,Fri,Sat"</span>.split(<span class="hljs-string">","</span>);
- <span class="hljs-keyword">var</span> fullDays = <span class="hljs-string">"Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday"</span>.split(<span class="hljs-string">","</span>);
- <span class="hljs-keyword">var</span> shortMonths = <span class="hljs-string">"Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec"</span>.split(<span class="hljs-string">","</span>);
- <span class="hljs-keyword">var</span> fullMonths = <span class="hljs-string">"January,February,March,April,May,June,July,August,September,October,November,December"</span>.split(<span class="hljs-string">","</span>);
- <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">getOrdinalFor</span>(<span class="hljs-params">intNum</span>) </span>{
- <span class="hljs-keyword">return</span> (((intNum = <span class="hljs-built_in">Math</span>.abs(intNum) % <span class="hljs-number">100</span>) % <span class="hljs-number">10</span> == <span class="hljs-number">1</span> &amp;&amp; intNum != <span class="hljs-number">11</span>) ? <span class="hljs-string">"st"</span>
- : (intNum % <span class="hljs-number">10</span> == <span class="hljs-number">2</span> &amp;&amp; intNum != <span class="hljs-number">12</span>) ? <span class="hljs-string">"nd"</span> : (intNum % <span class="hljs-number">10</span> == <span class="hljs-number">3</span>
- &amp;&amp; intNum != <span class="hljs-number">13</span>) ? <span class="hljs-string">"rd"</span> : <span class="hljs-string">"th"</span>);
- }
- <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">getISO8601Year</span>(<span class="hljs-params">aDate</span>) </span>{
- <span class="hljs-keyword">var</span> d = <span class="hljs-keyword">new</span> <span class="hljs-built_in">Date</span>(aDate.getFullYear() + <span class="hljs-number">1</span>, <span class="hljs-number">0</span>, <span class="hljs-number">4</span>);
- <span class="hljs-keyword">if</span>((d - aDate) / <span class="hljs-number">86400000</span> &lt; <span class="hljs-number">7</span> &amp;&amp; (aDate.getDay() + <span class="hljs-number">6</span>) % <span class="hljs-number">7</span> &lt; (d.getDay() + <span class="hljs-number">6</span>) % <span class="hljs-number">7</span>)
- <span class="hljs-keyword">return</span> d.getFullYear();
- <span class="hljs-keyword">if</span>(aDate.getMonth() &gt; <span class="hljs-number">0</span> || aDate.getDate() &gt;= <span class="hljs-number">4</span>)
- <span class="hljs-keyword">return</span> aDate.getFullYear();
- <span class="hljs-keyword">return</span> aDate.getFullYear() - (((aDate.getDay() + <span class="hljs-number">6</span>) % <span class="hljs-number">7</span> - aDate.getDate() &gt; <span class="hljs-number">2</span>) ? <span class="hljs-number">1</span> : <span class="hljs-number">0</span>);
- }
- <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">getISO8601Week</span>(<span class="hljs-params">aDate</span>) </span>{</pre></div></div>
-
- </li>
-
-
- <li id="section-112">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-112">&#182;</a>
- </div>
- <p>Get a day during the first week of the year.</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">var</span> d = <span class="hljs-keyword">new</span> <span class="hljs-built_in">Date</span>(getISO8601Year(aDate), <span class="hljs-number">0</span>, <span class="hljs-number">4</span>);</pre></div></div>
-
- </li>
-
-
- <li id="section-113">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-113">&#182;</a>
- </div>
- <p>Get the first monday of the year.</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> d.setDate(d.getDate() - (d.getDay() + <span class="hljs-number">6</span>) % <span class="hljs-number">7</span>);
- <span class="hljs-keyword">return</span> <span class="hljs-built_in">parseInt</span>((aDate - d) / <span class="hljs-number">604800000</span>) + <span class="hljs-number">1</span>;
- }
- Twig.lib.formatDate = <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">date, format</span>) </span>{</pre></div></div>
-
- </li>
-
-
- <li id="section-114">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-114">&#182;</a>
- </div>
- <p>/ <summary>
-/ Gets a string for this date, formatted according to the given format
-/ string.
-/ </summary>
-/ <param name="format" type="String">
-/ The format of the output date string. The format string works in a
-/ nearly identical way to the PHP date function which is highlighted here:
-/ <a href="http://php.net/manual/en/function.date.php">http://php.net/manual/en/function.date.php</a>.
-/ The only difference is the fact that “u” signifies milliseconds
-/ instead of microseconds. The following characters are recognized in
-/ the format parameter string:
-/ d - Day of the month, 2 digits with leading zeros
-/ D - A textual representation of a day, three letters
-/ j - Day of the month without leading zeros
-/ l (lowercase ‘L’) - A full textual representation of the day of the week
-/ N - ISO-8601 numeric representation of the day of the week (starting from 1)
-/ S - English ordinal suffix for the day of the month, 2 characters st,
-/ nd, rd or th. Works well with j.
-/ w - Numeric representation of the day of the week (starting from 0)
-/ z - The day of the year (starting from 0)
-/ W - ISO-8601 week number of year, weeks starting on Monday
-/ F - A full textual representation of a month, such as January or March
-/ m - Numeric representation of a month, with leading zeros
-/ M - A short textual representation of a month, three letters
-/ n - Numeric representation of a month, without leading zeros
-/ t - Number of days in the given month
-/ L - Whether it’s a leap year
-/ o - ISO-8601 year number. This has the same value as Y, except that if
-/ the ISO week number (W) belongs to the previous or next year, that
-/ year is used instead.
-/ Y - A full numeric representation of a year, 4 digits
-/ y - A two digit representation of a year
-/ a - Lowercase Ante meridiem and Post meridiem
-/ A - Uppercase Ante meridiem and Post meridiem
-/ B - Swatch Internet time
-/ g - 12-hour format of an hour without leading zeros
-/ G - 24-hour format of an hour without leading zeros
-/ h - 12-hour format of an hour with leading zeros
-/ H - 24-hour format of an hour with leading zeros
-/ i - Minutes with leading zeros
-/ s - Seconds, with leading zeros
-/ u - Milliseconds
-/ U - Seconds since the Unix Epoch (January 1 1970 00:00:00 GMT)
-/ </param>
-/ <returns type="String">
-/ Returns the string for this date, formatted according to the given
-/ format string.
-/ </returns>
-If the format was not passed, use the default toString method.</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">if</span>(<span class="hljs-keyword">typeof</span> format !== <span class="hljs-string">"string"</span> || <span class="hljs-regexp">/^\s*$/</span>.test(format))
- <span class="hljs-keyword">return</span> date + <span class="hljs-string">""</span>;
- <span class="hljs-keyword">var</span> jan1st = <span class="hljs-keyword">new</span> <span class="hljs-built_in">Date</span>(date.getFullYear(), <span class="hljs-number">0</span>, <span class="hljs-number">1</span>);
- <span class="hljs-keyword">var</span> me = date;
- <span class="hljs-keyword">return</span> format.replace(<span class="hljs-regexp">/[dDjlNSwzWFmMntLoYyaABgGhHisuU]/g</span>, <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">option</span>) </span>{
- <span class="hljs-keyword">switch</span>(option) {</pre></div></div>
-
- </li>
-
-
- <li id="section-115">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-115">&#182;</a>
- </div>
- <p>Day of the month, 2 digits with leading zeros</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">case</span> <span class="hljs-string">"d"</span>: <span class="hljs-keyword">return</span> (<span class="hljs-string">"0"</span> + me.getDate()).replace(<span class="hljs-regexp">/^.+(..)$/</span>, <span class="hljs-string">"$1"</span>);</pre></div></div>
-
- </li>
-
-
- <li id="section-116">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-116">&#182;</a>
- </div>
- <p>A textual representation of a day, three letters</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">case</span> <span class="hljs-string">"D"</span>: <span class="hljs-keyword">return</span> shortDays[me.getDay()];</pre></div></div>
-
- </li>
-
-
- <li id="section-117">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-117">&#182;</a>
- </div>
- <p>Day of the month without leading zeros</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">case</span> <span class="hljs-string">"j"</span>: <span class="hljs-keyword">return</span> me.getDate();</pre></div></div>
-
- </li>
-
-
- <li id="section-118">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-118">&#182;</a>
- </div>
- <p>A full textual representation of the day of the week</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">case</span> <span class="hljs-string">"l"</span>: <span class="hljs-keyword">return</span> fullDays[me.getDay()];</pre></div></div>
-
- </li>
-
-
- <li id="section-119">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-119">&#182;</a>
- </div>
- <p>ISO-8601 numeric representation of the day of the week</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">case</span> <span class="hljs-string">"N"</span>: <span class="hljs-keyword">return</span> (me.getDay() + <span class="hljs-number">6</span>) % <span class="hljs-number">7</span> + <span class="hljs-number">1</span>;</pre></div></div>
-
- </li>
-
-
- <li id="section-120">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-120">&#182;</a>
- </div>
- <p>English ordinal suffix for the day of the month, 2 characters</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">case</span> <span class="hljs-string">"S"</span>: <span class="hljs-keyword">return</span> getOrdinalFor(me.getDate());</pre></div></div>
-
- </li>
-
-
- <li id="section-121">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-121">&#182;</a>
- </div>
- <p>Numeric representation of the day of the week</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">case</span> <span class="hljs-string">"w"</span>: <span class="hljs-keyword">return</span> me.getDay();</pre></div></div>
-
- </li>
-
-
- <li id="section-122">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-122">&#182;</a>
- </div>
- <p>The day of the year (starting from 0)</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">case</span> <span class="hljs-string">"z"</span>: <span class="hljs-keyword">return</span> <span class="hljs-built_in">Math</span>.ceil((jan1st - me) / <span class="hljs-number">86400000</span>);</pre></div></div>
-
- </li>
-
-
- <li id="section-123">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-123">&#182;</a>
- </div>
- <p>ISO-8601 week number of year, weeks starting on Monday</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">case</span> <span class="hljs-string">"W"</span>: <span class="hljs-keyword">return</span> (<span class="hljs-string">"0"</span> + getISO8601Week(me)).replace(<span class="hljs-regexp">/^.(..)$/</span>, <span class="hljs-string">"$1"</span>);</pre></div></div>
-
- </li>
-
-
- <li id="section-124">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-124">&#182;</a>
- </div>
- <p>A full textual representation of a month, such as January or March</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">case</span> <span class="hljs-string">"F"</span>: <span class="hljs-keyword">return</span> fullMonths[me.getMonth()];</pre></div></div>
-
- </li>
-
-
- <li id="section-125">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-125">&#182;</a>
- </div>
- <p>Numeric representation of a month, with leading zeros</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">case</span> <span class="hljs-string">"m"</span>: <span class="hljs-keyword">return</span> (<span class="hljs-string">"0"</span> + (me.getMonth() + <span class="hljs-number">1</span>)).replace(<span class="hljs-regexp">/^.+(..)$/</span>, <span class="hljs-string">"$1"</span>);</pre></div></div>
-
- </li>
-
-
- <li id="section-126">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-126">&#182;</a>
- </div>
- <p>A short textual representation of a month, three letters</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">case</span> <span class="hljs-string">"M"</span>: <span class="hljs-keyword">return</span> shortMonths[me.getMonth()];</pre></div></div>
-
- </li>
-
-
- <li id="section-127">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-127">&#182;</a>
- </div>
- <p>Numeric representation of a month, without leading zeros</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">case</span> <span class="hljs-string">"n"</span>: <span class="hljs-keyword">return</span> me.getMonth() + <span class="hljs-number">1</span>;</pre></div></div>
-
- </li>
-
-
- <li id="section-128">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-128">&#182;</a>
- </div>
- <p>Number of days in the given month</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">case</span> <span class="hljs-string">"t"</span>: <span class="hljs-keyword">return</span> <span class="hljs-keyword">new</span> <span class="hljs-built_in">Date</span>(me.getFullYear(), me.getMonth() + <span class="hljs-number">1</span>, <span class="hljs-number">-1</span>).getDate();</pre></div></div>
-
- </li>
-
-
- <li id="section-129">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-129">&#182;</a>
- </div>
- <p>Whether it’s a leap year</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">case</span> <span class="hljs-string">"L"</span>: <span class="hljs-keyword">return</span> <span class="hljs-keyword">new</span> <span class="hljs-built_in">Date</span>(me.getFullYear(), <span class="hljs-number">1</span>, <span class="hljs-number">29</span>).getDate() == <span class="hljs-number">29</span> ? <span class="hljs-number">1</span> : <span class="hljs-number">0</span>;</pre></div></div>
-
- </li>
-
-
- <li id="section-130">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-130">&#182;</a>
- </div>
- <p>ISO-8601 year number. This has the same value as Y, except that if the
-ISO week number (W) belongs to the previous or next year, that year is
-used instead.</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">case</span> <span class="hljs-string">"o"</span>: <span class="hljs-keyword">return</span> getISO8601Year(me);</pre></div></div>
-
- </li>
-
-
- <li id="section-131">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-131">&#182;</a>
- </div>
- <p>A full numeric representation of a year, 4 digits</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">case</span> <span class="hljs-string">"Y"</span>: <span class="hljs-keyword">return</span> me.getFullYear();</pre></div></div>
-
- </li>
-
-
- <li id="section-132">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-132">&#182;</a>
- </div>
- <p>A two digit representation of a year</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">case</span> <span class="hljs-string">"y"</span>: <span class="hljs-keyword">return</span> (me.getFullYear() + <span class="hljs-string">""</span>).replace(<span class="hljs-regexp">/^.+(..)$/</span>, <span class="hljs-string">"$1"</span>);</pre></div></div>
-
- </li>
-
-
- <li id="section-133">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-133">&#182;</a>
- </div>
- <p>Lowercase Ante meridiem and Post meridiem</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">case</span> <span class="hljs-string">"a"</span>: <span class="hljs-keyword">return</span> me.getHours() &lt; <span class="hljs-number">12</span> ? <span class="hljs-string">"am"</span> : <span class="hljs-string">"pm"</span>;</pre></div></div>
-
- </li>
-
-
- <li id="section-134">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-134">&#182;</a>
- </div>
- <p>Uppercase Ante meridiem and Post meridiem</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">case</span> <span class="hljs-string">"A"</span>: <span class="hljs-keyword">return</span> me.getHours() &lt; <span class="hljs-number">12</span> ? <span class="hljs-string">"AM"</span> : <span class="hljs-string">"PM"</span>;</pre></div></div>
-
- </li>
-
-
- <li id="section-135">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-135">&#182;</a>
- </div>
- <p>Swatch Internet time</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">case</span> <span class="hljs-string">"B"</span>: <span class="hljs-keyword">return</span> <span class="hljs-built_in">Math</span>.floor((((me.getUTCHours() + <span class="hljs-number">1</span>) % <span class="hljs-number">24</span>) + me.getUTCMinutes() / <span class="hljs-number">60</span> + me.getUTCSeconds() / <span class="hljs-number">3600</span>) * <span class="hljs-number">1000</span> / <span class="hljs-number">24</span>);</pre></div></div>
-
- </li>
-
-
- <li id="section-136">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-136">&#182;</a>
- </div>
- <p>12-hour format of an hour without leading zeros</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">case</span> <span class="hljs-string">"g"</span>: <span class="hljs-keyword">return</span> me.getHours() % <span class="hljs-number">12</span> != <span class="hljs-number">0</span> ? me.getHours() % <span class="hljs-number">12</span> : <span class="hljs-number">12</span>;</pre></div></div>
-
- </li>
-
-
- <li id="section-137">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-137">&#182;</a>
- </div>
- <p>24-hour format of an hour without leading zeros</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">case</span> <span class="hljs-string">"G"</span>: <span class="hljs-keyword">return</span> me.getHours();</pre></div></div>
-
- </li>
-
-
- <li id="section-138">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-138">&#182;</a>
- </div>
- <p>12-hour format of an hour with leading zeros</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">case</span> <span class="hljs-string">"h"</span>: <span class="hljs-keyword">return</span> (<span class="hljs-string">"0"</span> + (me.getHours() % <span class="hljs-number">12</span> != <span class="hljs-number">0</span> ? me.getHours() % <span class="hljs-number">12</span> : <span class="hljs-number">12</span>)).replace(<span class="hljs-regexp">/^.+(..)$/</span>, <span class="hljs-string">"$1"</span>);</pre></div></div>
-
- </li>
-
-
- <li id="section-139">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-139">&#182;</a>
- </div>
- <p>24-hour format of an hour with leading zeros</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">case</span> <span class="hljs-string">"H"</span>: <span class="hljs-keyword">return</span> (<span class="hljs-string">"0"</span> + me.getHours()).replace(<span class="hljs-regexp">/^.+(..)$/</span>, <span class="hljs-string">"$1"</span>);</pre></div></div>
-
- </li>
-
-
- <li id="section-140">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-140">&#182;</a>
- </div>
- <p>Minutes with leading zeros</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">case</span> <span class="hljs-string">"i"</span>: <span class="hljs-keyword">return</span> (<span class="hljs-string">"0"</span> + me.getMinutes()).replace(<span class="hljs-regexp">/^.+(..)$/</span>, <span class="hljs-string">"$1"</span>);</pre></div></div>
-
- </li>
-
-
- <li id="section-141">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-141">&#182;</a>
- </div>
- <p>Seconds, with leading zeros</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">case</span> <span class="hljs-string">"s"</span>: <span class="hljs-keyword">return</span> (<span class="hljs-string">"0"</span> + me.getSeconds()).replace(<span class="hljs-regexp">/^.+(..)$/</span>, <span class="hljs-string">"$1"</span>);</pre></div></div>
-
- </li>
-
-
- <li id="section-142">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-142">&#182;</a>
- </div>
- <p>Milliseconds</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">case</span> <span class="hljs-string">"u"</span>: <span class="hljs-keyword">return</span> me.getMilliseconds();</pre></div></div>
-
- </li>
-
-
- <li id="section-143">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-143">&#182;</a>
- </div>
- <p>Seconds since the Unix Epoch (January 1 1970 00:00:00 GMT)</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">case</span> <span class="hljs-string">"U"</span>: <span class="hljs-keyword">return</span> me.getTime() / <span class="hljs-number">1000</span>;
- }
- });
- };
- })();
-
- Twig.lib.strip_tags = <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">input, allowed</span>) </span>{</pre></div></div>
-
- </li>
-
-
- <li id="section-144">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-144">&#182;</a>
- </div>
- <p>Strips HTML and PHP tags from a string</p>
-<p>version: 1109.2015
-discuss at: <a href="http://phpjs.org/functions/strip_tags">http://phpjs.org/functions/strip_tags</a></p>
-<ul>
-<li>original by: Kevin van Zonneveld (<a href="http://kevin.vanzonneveld.net">http://kevin.vanzonneveld.net</a>)</li>
-<li>improved by: Luke Godfrey</li>
-<li>input by: Pul</li>
-<li>bugfixed by: Kevin van Zonneveld (<a href="http://kevin.vanzonneveld.net">http://kevin.vanzonneveld.net</a>)</li>
-<li>bugfixed by: Onno Marsman</li>
-<li>input by: Alex</li>
-<li>bugfixed by: Kevin van Zonneveld (<a href="http://kevin.vanzonneveld.net">http://kevin.vanzonneveld.net</a>)</li>
-<li>input by: Marc Palau</li>
-<li>improved by: Kevin van Zonneveld (<a href="http://kevin.vanzonneveld.net">http://kevin.vanzonneveld.net</a>)</li>
-<li>input by: Brett Zamir (<a href="http://brett-zamir.me">http://brett-zamir.me</a>)</li>
-<li>bugfixed by: Kevin van Zonneveld (<a href="http://kevin.vanzonneveld.net">http://kevin.vanzonneveld.net</a>)</li>
-<li>bugfixed by: Eric Nagel</li>
-<li>input by: Bobby Drake</li>
-<li>bugfixed by: Kevin van Zonneveld (<a href="http://kevin.vanzonneveld.net">http://kevin.vanzonneveld.net</a>)</li>
-<li>bugfixed by: Tomasz Wesolowski</li>
-<li>input by: Evertjan Garretsen</li>
-<li>revised by: Rafał Kukawski (<a href="http://blog.kukawski.pl/">http://blog.kukawski.pl/</a>)</li>
-<li>example 1: strip_tags(‘<p>Kevin</p> <b>van</b> <i>Zonneveld</i>‘, ‘<i><b>‘);</li>
-<li>returns 1: ‘Kevin <b>van</b> <i>Zonneveld</i>‘</li>
-<li>example 2: strip_tags(‘<p>Kevin <img src="someimage.png" onmouseover="someFunction()">van <i>Zonneveld</i></p>‘, ‘<p>‘);</li>
-<li>returns 2: ‘<p>Kevin van Zonneveld</p>‘</li>
-<li>example 3: strip_tags(“<a href='http://kevin.vanzonneveld.net'>Kevin van Zonneveld</a>“, “<a>“);</li>
-<li>returns 3: ‘<a href='http://kevin.vanzonneveld.net'>Kevin van Zonneveld</a>‘</li>
-<li>example 4: strip_tags(‘1 &lt; 5 5 &gt; 1’);</li>
-<li>returns 4: ‘1 &lt; 5 5 &gt; 1’</li>
-<li>example 5: strip_tags(‘1 <br/> 1’);</li>
-<li>returns 5: ‘1 1’</li>
-<li>example 6: strip_tags(‘1 <br/> 1’, ‘<br>‘);</li>
-<li>returns 6: ‘1 1’</li>
-<li>example 7: strip_tags(‘1 <br/> 1’, ‘<br><br/>‘);</li>
-<li>returns 7: ‘1 <br/> 1’</li>
-</ul>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> allowed = (((allowed || <span class="hljs-string">""</span>) + <span class="hljs-string">""</span>).toLowerCase().match(<span class="hljs-regexp">/&lt;[a-z][a-z0-9]*&gt;/g</span>) || []).join(<span class="hljs-string">''</span>); <span class="hljs-comment">// making sure the allowed arg is a string containing only tags in lowercase (&lt;a&gt;&lt;b&gt;&lt;c&gt;)</span>
- <span class="hljs-keyword">var</span> tags = <span class="hljs-regexp">/&lt;\/?([a-z][a-z0-9]*)\b[^&gt;]*&gt;/gi</span>,
- commentsAndPhpTags = <span class="hljs-regexp">/&lt;!--[\s\S]*?--&gt;|&lt;\?(?:php)?[\s\S]*?\?&gt;/gi</span>;
- <span class="hljs-keyword">return</span> input.replace(commentsAndPhpTags, <span class="hljs-string">''</span>).replace(tags, <span class="hljs-function"><span class="hljs-keyword">function</span> (<span class="hljs-params">$0, $1</span>) </span>{
- <span class="hljs-keyword">return</span> allowed.indexOf(<span class="hljs-string">'&lt;'</span> + $<span class="hljs-number">1.</span>toLowerCase() + <span class="hljs-string">'&gt;'</span>) &gt; <span class="hljs-number">-1</span> ? $<span class="hljs-number">0</span> : <span class="hljs-string">''</span>;
- });
- }
-
- Twig.lib.parseISO8601Date = <span class="hljs-function"><span class="hljs-keyword">function</span> (<span class="hljs-params">s</span>)</span>{</pre></div></div>
-
- </li>
-
-
- <li id="section-145">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-145">&#182;</a>
- </div>
- <p>Taken from <a href="http://n8v.enteuxis.org/2010/12/parsing-iso-8601-dates-in-javascript/">http://n8v.enteuxis.org/2010/12/parsing-iso-8601-dates-in-javascript/</a>
-parenthese matches:
-year month day hours minutes seconds<br>dotmilliseconds
-tzstring plusminus hours minutes</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">var</span> re = <span class="hljs-regexp">/(\d{4})-(\d\d)-(\d\d)T(\d\d):(\d\d):(\d\d)(\.\d+)?(Z|([+-])(\d\d):(\d\d))/</span>;
-
- <span class="hljs-keyword">var</span> d = [];
- d = s.match(re);</pre></div></div>
-
- </li>
-
-
- <li id="section-146">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-146">&#182;</a>
- </div>
- <p>“2010-12-07T11:00:00.000-09:00” parses to:
- [“2010-12-07T11:00:00.000-09:00”, “2010”, “12”, “07”, “11”,
- “00”, “00”, “.000”, “-09:00”, “-“, “09”, “00”]
-“2010-12-07T11:00:00.000Z” parses to:
- [“2010-12-07T11:00:00.000Z”, “2010”, “12”, “07”, “11”,
- “00”, “00”, “.000”, “Z”, undefined, undefined, undefined]</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre>
- <span class="hljs-keyword">if</span> (! d) {
- <span class="hljs-keyword">throw</span> <span class="hljs-string">"Couldn't parse ISO 8601 date string '"</span> + s + <span class="hljs-string">"'"</span>;
- }</pre></div></div>
-
- </li>
-
-
- <li id="section-147">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-147">&#182;</a>
- </div>
- <p>parse strings, leading zeros into proper ints</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">var</span> a = [<span class="hljs-number">1</span>,<span class="hljs-number">2</span>,<span class="hljs-number">3</span>,<span class="hljs-number">4</span>,<span class="hljs-number">5</span>,<span class="hljs-number">6</span>,<span class="hljs-number">10</span>,<span class="hljs-number">11</span>];
- <span class="hljs-keyword">for</span> (<span class="hljs-keyword">var</span> i <span class="hljs-keyword">in</span> a) {
- d[a[i]] = <span class="hljs-built_in">parseInt</span>(d[a[i]], <span class="hljs-number">10</span>);
- }
- d[<span class="hljs-number">7</span>] = <span class="hljs-built_in">parseFloat</span>(d[<span class="hljs-number">7</span>]);</pre></div></div>
-
- </li>
-
-
- <li id="section-148">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-148">&#182;</a>
- </div>
- <p>Date.UTC(year, month[, date[, hrs[, min[, sec[, ms]]]]])
-note that month is 0-11, not 1-12
-see <a href="https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Date/UTC">https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Date/UTC</a></p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">var</span> ms = <span class="hljs-built_in">Date</span>.UTC(d[<span class="hljs-number">1</span>], d[<span class="hljs-number">2</span>] - <span class="hljs-number">1</span>, d[<span class="hljs-number">3</span>], d[<span class="hljs-number">4</span>], d[<span class="hljs-number">5</span>], d[<span class="hljs-number">6</span>]);</pre></div></div>
-
- </li>
-
-
- <li id="section-149">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-149">&#182;</a>
- </div>
- <p>if there are milliseconds, add them</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">if</span> (d[<span class="hljs-number">7</span>] &gt; <span class="hljs-number">0</span>) {
- ms += <span class="hljs-built_in">Math</span>.round(d[<span class="hljs-number">7</span>] * <span class="hljs-number">1000</span>);
- }</pre></div></div>
-
- </li>
-
-
- <li id="section-150">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-150">&#182;</a>
- </div>
- <p>if there’s a timezone, calculate it</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">if</span> (d[<span class="hljs-number">8</span>] != <span class="hljs-string">"Z"</span> &amp;&amp; d[<span class="hljs-number">10</span>]) {
- <span class="hljs-keyword">var</span> offset = d[<span class="hljs-number">10</span>] * <span class="hljs-number">60</span> * <span class="hljs-number">60</span> * <span class="hljs-number">1000</span>;
- <span class="hljs-keyword">if</span> (d[<span class="hljs-number">11</span>]) {
- offset += d[<span class="hljs-number">11</span>] * <span class="hljs-number">60</span> * <span class="hljs-number">1000</span>;
- }
- <span class="hljs-keyword">if</span> (d[<span class="hljs-number">9</span>] == <span class="hljs-string">"-"</span>) {
- ms -= offset;
- }
- <span class="hljs-keyword">else</span> {
- ms += offset;
- }
- }
-
- <span class="hljs-keyword">return</span> <span class="hljs-keyword">new</span> <span class="hljs-built_in">Date</span>(ms);
- };
-
- Twig.lib.strtotime = <span class="hljs-function"><span class="hljs-keyword">function</span> (<span class="hljs-params">text, now</span>) </span>{</pre></div></div>
-
- </li>
-
-
- <li id="section-151">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-151">&#182;</a>
- </div>
- <p> discuss at: <a href="http://phpjs.org/functions/strtotime/">http://phpjs.org/functions/strtotime/</a>
- version: 1109.2016
-original by: Caio Ariede (<a href="http://caioariede.com">http://caioariede.com</a>)
-improved by: Kevin van Zonneveld (<a href="http://kevin.vanzonneveld.net">http://kevin.vanzonneveld.net</a>)
-improved by: Caio Ariede (<a href="http://caioariede.com">http://caioariede.com</a>)
-improved by: A. Matías Quezada (<a href="http://amatiasq.com">http://amatiasq.com</a>)
-improved by: preuter
-improved by: Brett Zamir (<a href="http://brett-zamir.me">http://brett-zamir.me</a>)
-improved by: Mirko Faber
- input by: David
-bugfixed by: Wagner B. Soares
-bugfixed by: Artur Tchernychev
-bugfixed by: Stephan Bösch-Plepelits (<a href="http://github.com/plepe">http://github.com/plepe</a>)
- note: Examples all have a fixed timestamp to prevent tests to fail because of variable time(zones)
- example 1: strtotime(‘+1 day’, 1129633200);
- returns 1: 1129719600
- example 2: strtotime(‘+1 week 2 days 4 hours 2 seconds’, 1129633200);
- returns 2: 1130425202
- example 3: strtotime(‘last month’, 1129633200);
- returns 3: 1127041200
- example 4: strtotime(‘2009-05-04 08:30:00 GMT’);
- returns 4: 1241425800
- example 5: strtotime(‘2009-05-04 08:30:00+00’);
- returns 5: 1241425800
- example 6: strtotime(‘2009-05-04 08:30:00+02:00’);
- returns 6: 1241418600
- example 7: strtotime(‘2009-05-04T08:30:00Z’);
- returns 7: 1241425800</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre>
- <span class="hljs-keyword">var</span> parsed, match, today, year, date, days, ranges, len, times, regex, i, fail = <span class="hljs-literal">false</span>;
-
- <span class="hljs-keyword">if</span> (!text) {
- <span class="hljs-keyword">return</span> fail;
- }</pre></div></div>
-
- </li>
-
-
- <li id="section-152">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-152">&#182;</a>
- </div>
- <p>Unecessary spaces</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> text = text.replace(<span class="hljs-regexp">/^\s+|\s+$/g</span>, <span class="hljs-string">''</span>)
- .replace(<span class="hljs-regexp">/\s{2,}/g</span>, <span class="hljs-string">' '</span>)
- .replace(<span class="hljs-regexp">/[\t\r\n]/g</span>, <span class="hljs-string">''</span>)
- .toLowerCase();</pre></div></div>
-
- </li>
-
-
- <li id="section-153">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-153">&#182;</a>
- </div>
- <p>in contrast to php, js Date.parse function interprets:
-dates given as yyyy-mm-dd as in timezone: UTC,
-dates with “.” or “-“ as MDY instead of DMY
-dates with two-digit years differently
-etc…etc…
-…therefore we manually parse lots of common date formats</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> match = text.match(
- <span class="hljs-regexp">/^(\d{1,4})([\-\.\/\:])(\d{1,2})([\-\.\/\:])(\d{1,4})(?:\s(\d{1,2}):(\d{2})?:?(\d{2})?)?(?:\s([A-Z]+)?)?$/</span>);
-
- <span class="hljs-keyword">if</span> (match &amp;&amp; match[<span class="hljs-number">2</span>] === match[<span class="hljs-number">4</span>]) {
- <span class="hljs-keyword">if</span> (match[<span class="hljs-number">1</span>] &gt; <span class="hljs-number">1901</span>) {
- <span class="hljs-keyword">switch</span> (match[<span class="hljs-number">2</span>]) {
- <span class="hljs-keyword">case</span> <span class="hljs-string">'-'</span>:
- {</pre></div></div>
-
- </li>
-
-
- <li id="section-154">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-154">&#182;</a>
- </div>
- <p>YYYY-M-D</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">if</span> (match[<span class="hljs-number">3</span>] &gt; <span class="hljs-number">12</span> || match[<span class="hljs-number">5</span>] &gt; <span class="hljs-number">31</span>) {
- <span class="hljs-keyword">return</span> fail;
- }
-
- <span class="hljs-keyword">return</span> <span class="hljs-keyword">new</span> <span class="hljs-built_in">Date</span>(match[<span class="hljs-number">1</span>], <span class="hljs-built_in">parseInt</span>(match[<span class="hljs-number">3</span>], <span class="hljs-number">10</span>) - <span class="hljs-number">1</span>, match[<span class="hljs-number">5</span>],
- match[<span class="hljs-number">6</span>] || <span class="hljs-number">0</span>, match[<span class="hljs-number">7</span>] || <span class="hljs-number">0</span>, match[<span class="hljs-number">8</span>] || <span class="hljs-number">0</span>, match[<span class="hljs-number">9</span>] || <span class="hljs-number">0</span>) / <span class="hljs-number">1000</span>;
- }
- <span class="hljs-keyword">case</span> <span class="hljs-string">'.'</span>:
- {</pre></div></div>
-
- </li>
-
-
- <li id="section-155">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-155">&#182;</a>
- </div>
- <p>YYYY.M.D is not parsed by strtotime()</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">return</span> fail;
- }
- <span class="hljs-keyword">case</span> <span class="hljs-string">'/'</span>:
- {</pre></div></div>
-
- </li>
-
-
- <li id="section-156">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-156">&#182;</a>
- </div>
- <p>YYYY/M/D</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">if</span> (match[<span class="hljs-number">3</span>] &gt; <span class="hljs-number">12</span> || match[<span class="hljs-number">5</span>] &gt; <span class="hljs-number">31</span>) {
- <span class="hljs-keyword">return</span> fail;
- }
-
- <span class="hljs-keyword">return</span> <span class="hljs-keyword">new</span> <span class="hljs-built_in">Date</span>(match[<span class="hljs-number">1</span>], <span class="hljs-built_in">parseInt</span>(match[<span class="hljs-number">3</span>], <span class="hljs-number">10</span>) - <span class="hljs-number">1</span>, match[<span class="hljs-number">5</span>],
- match[<span class="hljs-number">6</span>] || <span class="hljs-number">0</span>, match[<span class="hljs-number">7</span>] || <span class="hljs-number">0</span>, match[<span class="hljs-number">8</span>] || <span class="hljs-number">0</span>, match[<span class="hljs-number">9</span>] || <span class="hljs-number">0</span>) / <span class="hljs-number">1000</span>;
- }
- }
- } <span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span> (match[<span class="hljs-number">5</span>] &gt; <span class="hljs-number">1901</span>) {
- <span class="hljs-keyword">switch</span> (match[<span class="hljs-number">2</span>]) {
- <span class="hljs-keyword">case</span> <span class="hljs-string">'-'</span>:
- {</pre></div></div>
-
- </li>
-
-
- <li id="section-157">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-157">&#182;</a>
- </div>
- <p>D-M-YYYY</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">if</span> (match[<span class="hljs-number">3</span>] &gt; <span class="hljs-number">12</span> || match[<span class="hljs-number">1</span>] &gt; <span class="hljs-number">31</span>) {
- <span class="hljs-keyword">return</span> fail;
- }
-
- <span class="hljs-keyword">return</span> <span class="hljs-keyword">new</span> <span class="hljs-built_in">Date</span>(match[<span class="hljs-number">5</span>], <span class="hljs-built_in">parseInt</span>(match[<span class="hljs-number">3</span>], <span class="hljs-number">10</span>) - <span class="hljs-number">1</span>, match[<span class="hljs-number">1</span>],
- match[<span class="hljs-number">6</span>] || <span class="hljs-number">0</span>, match[<span class="hljs-number">7</span>] || <span class="hljs-number">0</span>, match[<span class="hljs-number">8</span>] || <span class="hljs-number">0</span>, match[<span class="hljs-number">9</span>] || <span class="hljs-number">0</span>) / <span class="hljs-number">1000</span>;
- }
- <span class="hljs-keyword">case</span> <span class="hljs-string">'.'</span>:
- {</pre></div></div>
-
- </li>
-
-
- <li id="section-158">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-158">&#182;</a>
- </div>
- <p>D.M.YYYY</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">if</span> (match[<span class="hljs-number">3</span>] &gt; <span class="hljs-number">12</span> || match[<span class="hljs-number">1</span>] &gt; <span class="hljs-number">31</span>) {
- <span class="hljs-keyword">return</span> fail;
- }
-
- <span class="hljs-keyword">return</span> <span class="hljs-keyword">new</span> <span class="hljs-built_in">Date</span>(match[<span class="hljs-number">5</span>], <span class="hljs-built_in">parseInt</span>(match[<span class="hljs-number">3</span>], <span class="hljs-number">10</span>) - <span class="hljs-number">1</span>, match[<span class="hljs-number">1</span>],
- match[<span class="hljs-number">6</span>] || <span class="hljs-number">0</span>, match[<span class="hljs-number">7</span>] || <span class="hljs-number">0</span>, match[<span class="hljs-number">8</span>] || <span class="hljs-number">0</span>, match[<span class="hljs-number">9</span>] || <span class="hljs-number">0</span>) / <span class="hljs-number">1000</span>;
- }
- <span class="hljs-keyword">case</span> <span class="hljs-string">'/'</span>:
- {</pre></div></div>
-
- </li>
-
-
- <li id="section-159">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-159">&#182;</a>
- </div>
- <p>M/D/YYYY</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">if</span> (match[<span class="hljs-number">1</span>] &gt; <span class="hljs-number">12</span> || match[<span class="hljs-number">3</span>] &gt; <span class="hljs-number">31</span>) {
- <span class="hljs-keyword">return</span> fail;
- }
-
- <span class="hljs-keyword">return</span> <span class="hljs-keyword">new</span> <span class="hljs-built_in">Date</span>(match[<span class="hljs-number">5</span>], <span class="hljs-built_in">parseInt</span>(match[<span class="hljs-number">1</span>], <span class="hljs-number">10</span>) - <span class="hljs-number">1</span>, match[<span class="hljs-number">3</span>],
- match[<span class="hljs-number">6</span>] || <span class="hljs-number">0</span>, match[<span class="hljs-number">7</span>] || <span class="hljs-number">0</span>, match[<span class="hljs-number">8</span>] || <span class="hljs-number">0</span>, match[<span class="hljs-number">9</span>] || <span class="hljs-number">0</span>) / <span class="hljs-number">1000</span>;
- }
- }
- } <span class="hljs-keyword">else</span> {
- <span class="hljs-keyword">switch</span> (match[<span class="hljs-number">2</span>]) {
- <span class="hljs-keyword">case</span> <span class="hljs-string">'-'</span>:
- {</pre></div></div>
-
- </li>
-
-
- <li id="section-160">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-160">&#182;</a>
- </div>
- <p>YY-M-D</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">if</span> (match[<span class="hljs-number">3</span>] &gt; <span class="hljs-number">12</span> || match[<span class="hljs-number">5</span>] &gt; <span class="hljs-number">31</span> || (match[<span class="hljs-number">1</span>] &lt; <span class="hljs-number">70</span> &amp;&amp; match[<span class="hljs-number">1</span>] &gt; <span class="hljs-number">38</span>)) {
- <span class="hljs-keyword">return</span> fail;
- }
-
- year = match[<span class="hljs-number">1</span>] &gt;= <span class="hljs-number">0</span> &amp;&amp; match[<span class="hljs-number">1</span>] &lt;= <span class="hljs-number">38</span> ? +match[<span class="hljs-number">1</span>] + <span class="hljs-number">2000</span> : match[<span class="hljs-number">1</span>];
- <span class="hljs-keyword">return</span> <span class="hljs-keyword">new</span> <span class="hljs-built_in">Date</span>(year, <span class="hljs-built_in">parseInt</span>(match[<span class="hljs-number">3</span>], <span class="hljs-number">10</span>) - <span class="hljs-number">1</span>, match[<span class="hljs-number">5</span>],
- match[<span class="hljs-number">6</span>] || <span class="hljs-number">0</span>, match[<span class="hljs-number">7</span>] || <span class="hljs-number">0</span>, match[<span class="hljs-number">8</span>] || <span class="hljs-number">0</span>, match[<span class="hljs-number">9</span>] || <span class="hljs-number">0</span>) / <span class="hljs-number">1000</span>;
- }
- <span class="hljs-keyword">case</span> <span class="hljs-string">'.'</span>:
- {</pre></div></div>
-
- </li>
-
-
- <li id="section-161">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-161">&#182;</a>
- </div>
- <p>D.M.YY or H.MM.SS</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">if</span> (match[<span class="hljs-number">5</span>] &gt;= <span class="hljs-number">70</span>) {</pre></div></div>
-
- </li>
-
-
- <li id="section-162">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-162">&#182;</a>
- </div>
- <p>D.M.YY</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">if</span> (match[<span class="hljs-number">3</span>] &gt; <span class="hljs-number">12</span> || match[<span class="hljs-number">1</span>] &gt; <span class="hljs-number">31</span>) {
- <span class="hljs-keyword">return</span> fail;
- }
-
- <span class="hljs-keyword">return</span> <span class="hljs-keyword">new</span> <span class="hljs-built_in">Date</span>(match[<span class="hljs-number">5</span>], <span class="hljs-built_in">parseInt</span>(match[<span class="hljs-number">3</span>], <span class="hljs-number">10</span>) - <span class="hljs-number">1</span>, match[<span class="hljs-number">1</span>],
- match[<span class="hljs-number">6</span>] || <span class="hljs-number">0</span>, match[<span class="hljs-number">7</span>] || <span class="hljs-number">0</span>, match[<span class="hljs-number">8</span>] || <span class="hljs-number">0</span>, match[<span class="hljs-number">9</span>] || <span class="hljs-number">0</span>) / <span class="hljs-number">1000</span>;
- }
- <span class="hljs-keyword">if</span> (match[<span class="hljs-number">5</span>] &lt; <span class="hljs-number">60</span> &amp;&amp; !match[<span class="hljs-number">6</span>]) {</pre></div></div>
-
- </li>
-
-
- <li id="section-163">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-163">&#182;</a>
- </div>
- <p>H.MM.SS</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">if</span> (match[<span class="hljs-number">1</span>] &gt; <span class="hljs-number">23</span> || match[<span class="hljs-number">3</span>] &gt; <span class="hljs-number">59</span>) {
- <span class="hljs-keyword">return</span> fail;
- }
-
- today = <span class="hljs-keyword">new</span> <span class="hljs-built_in">Date</span>();
- <span class="hljs-keyword">return</span> <span class="hljs-keyword">new</span> <span class="hljs-built_in">Date</span>(today.getFullYear(), today.getMonth(), today.getDate(),
- match[<span class="hljs-number">1</span>] || <span class="hljs-number">0</span>, match[<span class="hljs-number">3</span>] || <span class="hljs-number">0</span>, match[<span class="hljs-number">5</span>] || <span class="hljs-number">0</span>, match[<span class="hljs-number">9</span>] || <span class="hljs-number">0</span>) / <span class="hljs-number">1000</span>;
- }</pre></div></div>
-
- </li>
-
-
- <li id="section-164">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-164">&#182;</a>
- </div>
- <p>invalid format, cannot be parsed</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">return</span> fail;
- }
- <span class="hljs-keyword">case</span> <span class="hljs-string">'/'</span>:
- {</pre></div></div>
-
- </li>
-
-
- <li id="section-165">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-165">&#182;</a>
- </div>
- <p>M/D/YY</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">if</span> (match[<span class="hljs-number">1</span>] &gt; <span class="hljs-number">12</span> || match[<span class="hljs-number">3</span>] &gt; <span class="hljs-number">31</span> || (match[<span class="hljs-number">5</span>] &lt; <span class="hljs-number">70</span> &amp;&amp; match[<span class="hljs-number">5</span>] &gt; <span class="hljs-number">38</span>)) {
- <span class="hljs-keyword">return</span> fail;
- }
-
- year = match[<span class="hljs-number">5</span>] &gt;= <span class="hljs-number">0</span> &amp;&amp; match[<span class="hljs-number">5</span>] &lt;= <span class="hljs-number">38</span> ? +match[<span class="hljs-number">5</span>] + <span class="hljs-number">2000</span> : match[<span class="hljs-number">5</span>];
- <span class="hljs-keyword">return</span> <span class="hljs-keyword">new</span> <span class="hljs-built_in">Date</span>(year, <span class="hljs-built_in">parseInt</span>(match[<span class="hljs-number">1</span>], <span class="hljs-number">10</span>) - <span class="hljs-number">1</span>, match[<span class="hljs-number">3</span>],
- match[<span class="hljs-number">6</span>] || <span class="hljs-number">0</span>, match[<span class="hljs-number">7</span>] || <span class="hljs-number">0</span>, match[<span class="hljs-number">8</span>] || <span class="hljs-number">0</span>, match[<span class="hljs-number">9</span>] || <span class="hljs-number">0</span>) / <span class="hljs-number">1000</span>;
- }
- <span class="hljs-keyword">case</span> <span class="hljs-string">':'</span>:
- {</pre></div></div>
-
- </li>
-
-
- <li id="section-166">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-166">&#182;</a>
- </div>
- <p>HH:MM:SS</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">if</span> (match[<span class="hljs-number">1</span>] &gt; <span class="hljs-number">23</span> || match[<span class="hljs-number">3</span>] &gt; <span class="hljs-number">59</span> || match[<span class="hljs-number">5</span>] &gt; <span class="hljs-number">59</span>) {
- <span class="hljs-keyword">return</span> fail;
- }
-
- today = <span class="hljs-keyword">new</span> <span class="hljs-built_in">Date</span>();
- <span class="hljs-keyword">return</span> <span class="hljs-keyword">new</span> <span class="hljs-built_in">Date</span>(today.getFullYear(), today.getMonth(), today.getDate(),
- match[<span class="hljs-number">1</span>] || <span class="hljs-number">0</span>, match[<span class="hljs-number">3</span>] || <span class="hljs-number">0</span>, match[<span class="hljs-number">5</span>] || <span class="hljs-number">0</span>) / <span class="hljs-number">1000</span>;
- }
- }
- }
- }</pre></div></div>
-
- </li>
-
-
- <li id="section-167">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-167">&#182;</a>
- </div>
- <p>other formats and “now” should be parsed by Date.parse()</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">if</span> (text === <span class="hljs-string">'now'</span>) {
- <span class="hljs-keyword">return</span> now === <span class="hljs-literal">null</span> || <span class="hljs-built_in">isNaN</span>(now) ? <span class="hljs-keyword">new</span> <span class="hljs-built_in">Date</span>()
- .getTime() / <span class="hljs-number">1000</span> | <span class="hljs-number">0</span> : now | <span class="hljs-number">0</span>;
- }
- <span class="hljs-keyword">if</span> (!<span class="hljs-built_in">isNaN</span>(parsed = <span class="hljs-built_in">Date</span>.parse(text))) {
- <span class="hljs-keyword">return</span> parsed / <span class="hljs-number">1000</span> | <span class="hljs-number">0</span>;
- }</pre></div></div>
-
- </li>
-
-
- <li id="section-168">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-168">&#182;</a>
- </div>
- <p>Browsers != Chrome have problems parsing ISO 8601 date strings, as they do
-not accept lower case characters, space, or shortened time zones.
-Therefore, fix these problems and try again.
-Examples:
- 2015-04-15 20:33:59+02
- 2015-04-15 20:33:59z
- 2015-04-15t20:33:59+02:00</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">if</span> (match = text.match(<span class="hljs-regexp">/^([0-9]{4}-[0-9]{2}-[0-9]{2})[ t]([0-9]{2}:[0-9]{2}:[0-9]{2}(\.[0-9]+)?)([\+-][0-9]{2}(:[0-9]{2})?|z)/</span>)) {</pre></div></div>
-
- </li>
-
-
- <li id="section-169">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-169">&#182;</a>
- </div>
- <p>fix time zone information</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">if</span> (match[<span class="hljs-number">4</span>] == <span class="hljs-string">'z'</span>) {
- match[<span class="hljs-number">4</span>] = <span class="hljs-string">'Z'</span>;
- }
- <span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span> (match[<span class="hljs-number">4</span>].match(<span class="hljs-regexp">/^([\+-][0-9]{2})$/</span>)) {
- match[<span class="hljs-number">4</span>] = match[<span class="hljs-number">4</span>] + <span class="hljs-string">':00'</span>;
- }
-
- <span class="hljs-keyword">if</span> (!<span class="hljs-built_in">isNaN</span>(parsed = <span class="hljs-built_in">Date</span>.parse(match[<span class="hljs-number">1</span>] + <span class="hljs-string">'T'</span> + match[<span class="hljs-number">2</span>] + match[<span class="hljs-number">4</span>]))) {
- <span class="hljs-keyword">return</span> parsed / <span class="hljs-number">1000</span> | <span class="hljs-number">0</span>;
- }
- }
-
- date = now ? <span class="hljs-keyword">new</span> <span class="hljs-built_in">Date</span>(now * <span class="hljs-number">1000</span>) : <span class="hljs-keyword">new</span> <span class="hljs-built_in">Date</span>();
- days = {
- <span class="hljs-string">'sun'</span>: <span class="hljs-number">0</span>,
- <span class="hljs-string">'mon'</span>: <span class="hljs-number">1</span>,
- <span class="hljs-string">'tue'</span>: <span class="hljs-number">2</span>,
- <span class="hljs-string">'wed'</span>: <span class="hljs-number">3</span>,
- <span class="hljs-string">'thu'</span>: <span class="hljs-number">4</span>,
- <span class="hljs-string">'fri'</span>: <span class="hljs-number">5</span>,
- <span class="hljs-string">'sat'</span>: <span class="hljs-number">6</span>
- };
- ranges = {
- <span class="hljs-string">'yea'</span>: <span class="hljs-string">'FullYear'</span>,
- <span class="hljs-string">'mon'</span>: <span class="hljs-string">'Month'</span>,
- <span class="hljs-string">'day'</span>: <span class="hljs-string">'Date'</span>,
- <span class="hljs-string">'hou'</span>: <span class="hljs-string">'Hours'</span>,
- <span class="hljs-string">'min'</span>: <span class="hljs-string">'Minutes'</span>,
- <span class="hljs-string">'sec'</span>: <span class="hljs-string">'Seconds'</span>
- };
-
- <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">lastNext</span>(<span class="hljs-params">type, range, modifier</span>) </span>{
- <span class="hljs-keyword">var</span> diff, day = days[range];
-
- <span class="hljs-keyword">if</span> (<span class="hljs-keyword">typeof</span> day !== <span class="hljs-string">'undefined'</span>) {
- diff = day - date.getDay();
-
- <span class="hljs-keyword">if</span> (diff === <span class="hljs-number">0</span>) {
- diff = <span class="hljs-number">7</span> * modifier;
- } <span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span> (diff &gt; <span class="hljs-number">0</span> &amp;&amp; type === <span class="hljs-string">'last'</span>) {
- diff -= <span class="hljs-number">7</span>;
- } <span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span> (diff &lt; <span class="hljs-number">0</span> &amp;&amp; type === <span class="hljs-string">'next'</span>) {
- diff += <span class="hljs-number">7</span>;
- }
-
- date.setDate(date.getDate() + diff);
- }
- }
-
- <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">process</span>(<span class="hljs-params">val</span>) </span>{
- <span class="hljs-keyword">var</span> splt = val.split(<span class="hljs-string">' '</span>), <span class="hljs-comment">// Todo: Reconcile this with regex using \s, taking into account browser issues with split and regexes</span>
- type = splt[<span class="hljs-number">0</span>],
- range = splt[<span class="hljs-number">1</span>].substring(<span class="hljs-number">0</span>, <span class="hljs-number">3</span>),
- typeIsNumber = <span class="hljs-regexp">/\d+/</span>.test(type),
- ago = splt[<span class="hljs-number">2</span>] === <span class="hljs-string">'ago'</span>,
- num = (type === <span class="hljs-string">'last'</span> ? <span class="hljs-number">-1</span> : <span class="hljs-number">1</span>) * (ago ? <span class="hljs-number">-1</span> : <span class="hljs-number">1</span>);
-
- <span class="hljs-keyword">if</span> (typeIsNumber) {
- num *= <span class="hljs-built_in">parseInt</span>(type, <span class="hljs-number">10</span>);
- }
-
- <span class="hljs-keyword">if</span> (ranges.hasOwnProperty(range) &amp;&amp; !splt[<span class="hljs-number">1</span>].match(<span class="hljs-regexp">/^mon(day|\.)?$/i</span>)) {
- <span class="hljs-keyword">return</span> date[<span class="hljs-string">'set'</span> + ranges[range]](date[<span class="hljs-string">'get'</span> + ranges[range]]() + num);
- }
-
- <span class="hljs-keyword">if</span> (range === <span class="hljs-string">'wee'</span>) {
- <span class="hljs-keyword">return</span> date.setDate(date.getDate() + (num * <span class="hljs-number">7</span>));
- }
-
- <span class="hljs-keyword">if</span> (type === <span class="hljs-string">'next'</span> || type === <span class="hljs-string">'last'</span>) {
- lastNext(type, range, num);
- } <span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span> (!typeIsNumber) {
- <span class="hljs-keyword">return</span> <span class="hljs-literal">false</span>;
- }
-
- <span class="hljs-keyword">return</span> <span class="hljs-literal">true</span>;
- }
-
- times = <span class="hljs-string">'(years?|months?|weeks?|days?|hours?|minutes?|min|seconds?|sec'</span> +
- <span class="hljs-string">'|sunday|sun\\.?|monday|mon\\.?|tuesday|tue\\.?|wednesday|wed\\.?'</span> +
- <span class="hljs-string">'|thursday|thu\\.?|friday|fri\\.?|saturday|sat\\.?)'</span>;
- regex = <span class="hljs-string">'([+-]?\\d+\\s'</span> + times + <span class="hljs-string">'|'</span> + <span class="hljs-string">'(last|next)\\s'</span> + times + <span class="hljs-string">')(\\sago)?'</span>;
-
- match = text.match(<span class="hljs-keyword">new</span> <span class="hljs-built_in">RegExp</span>(regex, <span class="hljs-string">'gi'</span>));
- <span class="hljs-keyword">if</span> (!match) {
- <span class="hljs-keyword">return</span> fail;
- }
-
- <span class="hljs-keyword">for</span> (i = <span class="hljs-number">0</span>, len = match.length; i &lt; len; i++) {
- <span class="hljs-keyword">if</span> (!process(match[i])) {
- <span class="hljs-keyword">return</span> fail;
- }
- }</pre></div></div>
-
- </li>
-
-
- <li id="section-170">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-170">&#182;</a>
- </div>
- <p>ECMAScript 5 only
-if (!match.every(process))
- return false;</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre>
- <span class="hljs-keyword">return</span> (date.getTime() / <span class="hljs-number">1000</span>);
- };
-
- Twig.lib.is = <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">type, obj</span>) </span>{
- <span class="hljs-keyword">var</span> clas = <span class="hljs-built_in">Object</span>.prototype.toString.call(obj).slice(<span class="hljs-number">8</span>, <span class="hljs-number">-1</span>);
- <span class="hljs-keyword">return</span> obj !== <span class="hljs-literal">undefined</span> &amp;&amp; obj !== <span class="hljs-literal">null</span> &amp;&amp; clas === type;
- };</pre></div></div>
-
- </li>
-
-
- <li id="section-171">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-171">&#182;</a>
- </div>
- <p>shallow-copy an object</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> Twig.lib.copy = <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">src</span>) </span>{
- <span class="hljs-keyword">var</span> target = {},
- key;
- <span class="hljs-keyword">for</span> (key <span class="hljs-keyword">in</span> src)
- target[key] = src[key];
-
- <span class="hljs-keyword">return</span> target;
- };
-
- Twig.lib.replaceAll = <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">string, search, replace</span>) </span>{
- <span class="hljs-keyword">return</span> string.split(search).join(replace);
- };</pre></div></div>
-
- </li>
-
-
- <li id="section-172">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-172">&#182;</a>
- </div>
- <p>chunk an array (arr) into arrays of (size) items, returns an array of arrays, or an empty array on invalid input</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> Twig.lib.chunkArray = <span class="hljs-function"><span class="hljs-keyword">function</span> (<span class="hljs-params">arr, size</span>) </span>{
- <span class="hljs-keyword">var</span> returnVal = [],
- x = <span class="hljs-number">0</span>,
- len = arr.length;
-
- <span class="hljs-keyword">if</span> (size &lt; <span class="hljs-number">1</span> || !Twig.lib.is(<span class="hljs-string">"Array"</span>, arr)) {
- <span class="hljs-keyword">return</span> [];
- }
-
- <span class="hljs-keyword">while</span> (x &lt; len) {
- returnVal.push(arr.slice(x, x += size));
- }
-
- <span class="hljs-keyword">return</span> returnVal;
- };
-
- Twig.lib.round = <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">round</span>(<span class="hljs-params">value, precision, mode</span>) </span>{</pre></div></div>
-
- </li>
-
-
- <li id="section-173">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-173">&#182;</a>
- </div>
- <p> discuss at: <a href="http://phpjs.org/functions/round/">http://phpjs.org/functions/round/</a>
-original by: Philip Peterson
- revised by: Onno Marsman
- revised by: T.Wild
- revised by: Rafał Kukawski (<a href="http://blog.kukawski.pl/">http://blog.kukawski.pl/</a>)
- input by: Greenseed
- input by: meo
- input by: William
- input by: Josep Sanz (<a href="http://www.ws3.es/">http://www.ws3.es/</a>)
-bugfixed by: Brett Zamir (<a href="http://brett-zamir.me">http://brett-zamir.me</a>)
- note: Great work. Ideas for improvement:
- note: - code more compliant with developer guidelines
- note: - for implementing PHP constant arguments look at
- note: the pathinfo() function, it offers the greatest
- note: flexibility &amp; compatibility possible
- example 1: round(1241757, -3);
- returns 1: 1242000
- example 2: round(3.6);
- returns 2: 4
- example 3: round(2.835, 2);
- returns 3: 2.84
- example 4: round(1.1749999999999, 2);
- returns 4: 1.17
- example 5: round(58551.799999999996, 2);
- returns 5: 58551.8</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre>
- <span class="hljs-keyword">var</span> m, f, isHalf, sgn; <span class="hljs-comment">// helper variables</span>
- precision |= <span class="hljs-number">0</span>; <span class="hljs-comment">// making sure precision is integer</span>
- m = <span class="hljs-built_in">Math</span>.pow(<span class="hljs-number">10</span>, precision);
- value *= m;
- sgn = (value &gt; <span class="hljs-number">0</span>) | -(value &lt; <span class="hljs-number">0</span>); <span class="hljs-comment">// sign of the number</span>
- isHalf = value % <span class="hljs-number">1</span> === <span class="hljs-number">0.5</span> * sgn;
- f = <span class="hljs-built_in">Math</span>.floor(value);
-
- <span class="hljs-keyword">if</span> (isHalf) {
- <span class="hljs-keyword">switch</span> (mode) {
- <span class="hljs-keyword">case</span> <span class="hljs-string">'PHP_ROUND_HALF_DOWN'</span>:
- value = f + (sgn &lt; <span class="hljs-number">0</span>); <span class="hljs-comment">// rounds .5 toward zero</span>
- <span class="hljs-keyword">break</span>;
- <span class="hljs-keyword">case</span> <span class="hljs-string">'PHP_ROUND_HALF_EVEN'</span>:
- value = f + (f % <span class="hljs-number">2</span> * sgn); <span class="hljs-comment">// rouds .5 towards the next even integer</span>
- <span class="hljs-keyword">break</span>;
- <span class="hljs-keyword">case</span> <span class="hljs-string">'PHP_ROUND_HALF_ODD'</span>:
- value = f + !(f % <span class="hljs-number">2</span>); <span class="hljs-comment">// rounds .5 towards the next odd integer</span>
- <span class="hljs-keyword">break</span>;
- <span class="hljs-keyword">default</span>:
- value = f + (sgn &gt; <span class="hljs-number">0</span>); <span class="hljs-comment">// rounds .5 away from zero</span>
- }
- }
-
- <span class="hljs-keyword">return</span> (isHalf ? value : <span class="hljs-built_in">Math</span>.round(value)) / m;
- };
-
- Twig.lib.max = <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">max</span>(<span class="hljs-params"></span>) </span>{</pre></div></div>
-
- </li>
-
-
- <li id="section-174">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-174">&#182;</a>
- </div>
- <p> discuss at: <a href="http://phpjs.org/functions/max/">http://phpjs.org/functions/max/</a>
-original by: Onno Marsman
- revised by: Onno Marsman
-improved by: Jack
- note: Long code cause we’re aiming for maximum PHP compatibility
- example 1: max(1, 3, 5, 6, 7);
- returns 1: 7
- example 2: max([2, 4, 5]);
- returns 2: 5
- example 3: max(0, ‘hello’);
- returns 3: 0
- example 4: max(‘hello’, 0);
- returns 4: ‘hello’
- example 5: max(-1, ‘hello’);
- returns 5: ‘hello’
- example 6: max([2, 4, 8], [2, 5, 7]);
- returns 6: [2, 5, 7]</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre>
- <span class="hljs-keyword">var</span> ar, retVal, i = <span class="hljs-number">0</span>,
- n = <span class="hljs-number">0</span>,
- argv = <span class="hljs-built_in">arguments</span>,
- argc = argv.length,
- _obj2Array = <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">obj</span>) </span>{
- <span class="hljs-keyword">if</span> (<span class="hljs-built_in">Object</span>.prototype.toString.call(obj) === <span class="hljs-string">'[object Array]'</span>) {
- <span class="hljs-keyword">return</span> obj;
- } <span class="hljs-keyword">else</span> {
- <span class="hljs-keyword">var</span> ar = [];
- <span class="hljs-keyword">for</span> (<span class="hljs-keyword">var</span> i <span class="hljs-keyword">in</span> obj) {
- <span class="hljs-keyword">if</span> (obj.hasOwnProperty(i)) {
- ar.push(obj[i]);
- }
- }
- <span class="hljs-keyword">return</span> ar;
- }
- }, <span class="hljs-comment">//function _obj2Array</span>
- _compare = <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">current, next</span>) </span>{
- <span class="hljs-keyword">var</span> i = <span class="hljs-number">0</span>,
- n = <span class="hljs-number">0</span>,
- tmp = <span class="hljs-number">0</span>,
- nl = <span class="hljs-number">0</span>,
- cl = <span class="hljs-number">0</span>;
-
- <span class="hljs-keyword">if</span> (current === next) {
- <span class="hljs-keyword">return</span> <span class="hljs-number">0</span>;
- } <span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span> (<span class="hljs-keyword">typeof</span> current === <span class="hljs-string">'object'</span>) {
- <span class="hljs-keyword">if</span> (<span class="hljs-keyword">typeof</span> next === <span class="hljs-string">'object'</span>) {
- current = _obj2Array(current);
- next = _obj2Array(next);
- cl = current.length;
- nl = next.length;
- <span class="hljs-keyword">if</span> (nl &gt; cl) {
- <span class="hljs-keyword">return</span> <span class="hljs-number">1</span>;
- } <span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span> (nl &lt; cl) {
- <span class="hljs-keyword">return</span> <span class="hljs-number">-1</span>;
- }
- <span class="hljs-keyword">for</span> (i = <span class="hljs-number">0</span>, n = cl; i &lt; n; ++i) {
- tmp = _compare(current[i], next[i]);
- <span class="hljs-keyword">if</span> (tmp == <span class="hljs-number">1</span>) {
- <span class="hljs-keyword">return</span> <span class="hljs-number">1</span>;
- } <span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span> (tmp == <span class="hljs-number">-1</span>) {
- <span class="hljs-keyword">return</span> <span class="hljs-number">-1</span>;
- }
- }
- <span class="hljs-keyword">return</span> <span class="hljs-number">0</span>;
- }
- <span class="hljs-keyword">return</span> <span class="hljs-number">-1</span>;
- } <span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span> (<span class="hljs-keyword">typeof</span> next === <span class="hljs-string">'object'</span>) {
- <span class="hljs-keyword">return</span> <span class="hljs-number">1</span>;
- } <span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span> (<span class="hljs-built_in">isNaN</span>(next) &amp;&amp; !<span class="hljs-built_in">isNaN</span>(current)) {
- <span class="hljs-keyword">if</span> (current == <span class="hljs-number">0</span>) {
- <span class="hljs-keyword">return</span> <span class="hljs-number">0</span>;
- }
- <span class="hljs-keyword">return</span> (current &lt; <span class="hljs-number">0</span> ? <span class="hljs-number">1</span> : <span class="hljs-number">-1</span>);
- } <span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span> (<span class="hljs-built_in">isNaN</span>(current) &amp;&amp; !<span class="hljs-built_in">isNaN</span>(next)) {
- <span class="hljs-keyword">if</span> (next == <span class="hljs-number">0</span>) {
- <span class="hljs-keyword">return</span> <span class="hljs-number">0</span>;
- }
- <span class="hljs-keyword">return</span> (next &gt; <span class="hljs-number">0</span> ? <span class="hljs-number">1</span> : <span class="hljs-number">-1</span>);
- }
-
- <span class="hljs-keyword">if</span> (next == current) {
- <span class="hljs-keyword">return</span> <span class="hljs-number">0</span>;
- }
- <span class="hljs-keyword">return</span> (next &gt; current ? <span class="hljs-number">1</span> : <span class="hljs-number">-1</span>);
- }; <span class="hljs-comment">//function _compare</span>
- <span class="hljs-keyword">if</span> (argc === <span class="hljs-number">0</span>) {
- <span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> <span class="hljs-built_in">Error</span>(<span class="hljs-string">'At least one value should be passed to max()'</span>);
- } <span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span> (argc === <span class="hljs-number">1</span>) {
- <span class="hljs-keyword">if</span> (<span class="hljs-keyword">typeof</span> argv[<span class="hljs-number">0</span>] === <span class="hljs-string">'object'</span>) {
- ar = _obj2Array(argv[<span class="hljs-number">0</span>]);
- } <span class="hljs-keyword">else</span> {
- <span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> <span class="hljs-built_in">Error</span>(<span class="hljs-string">'Wrong parameter count for max()'</span>);
- }
- <span class="hljs-keyword">if</span> (ar.length === <span class="hljs-number">0</span>) {
- <span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> <span class="hljs-built_in">Error</span>(<span class="hljs-string">'Array must contain at least one element for max()'</span>);
- }
- } <span class="hljs-keyword">else</span> {
- ar = argv;
- }
-
- retVal = ar[<span class="hljs-number">0</span>];
- <span class="hljs-keyword">for</span> (i = <span class="hljs-number">1</span>, n = ar.length; i &lt; n; ++i) {
- <span class="hljs-keyword">if</span> (_compare(retVal, ar[i]) == <span class="hljs-number">1</span>) {
- retVal = ar[i];
- }
- }
-
- <span class="hljs-keyword">return</span> retVal;
- };
-
- Twig.lib.min = <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">min</span>(<span class="hljs-params"></span>) </span>{</pre></div></div>
-
- </li>
-
-
- <li id="section-175">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-175">&#182;</a>
- </div>
- <p> discuss at: <a href="http://phpjs.org/functions/min/">http://phpjs.org/functions/min/</a>
-original by: Onno Marsman
- revised by: Onno Marsman
-improved by: Jack
- note: Long code cause we’re aiming for maximum PHP compatibility
- example 1: min(1, 3, 5, 6, 7);
- returns 1: 1
- example 2: min([2, 4, 5]);
- returns 2: 2
- example 3: min(0, ‘hello’);
- returns 3: 0
- example 4: min(‘hello’, 0);
- returns 4: ‘hello’
- example 5: min(-1, ‘hello’);
- returns 5: -1
- example 6: min([2, 4, 8], [2, 5, 7]);
- returns 6: [2, 4, 8]</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre>
- <span class="hljs-keyword">var</span> ar, retVal, i = <span class="hljs-number">0</span>,
- n = <span class="hljs-number">0</span>,
- argv = <span class="hljs-built_in">arguments</span>,
- argc = argv.length,
- _obj2Array = <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">obj</span>) </span>{
- <span class="hljs-keyword">if</span> (<span class="hljs-built_in">Object</span>.prototype.toString.call(obj) === <span class="hljs-string">'[object Array]'</span>) {
- <span class="hljs-keyword">return</span> obj;
- }
- <span class="hljs-keyword">var</span> ar = [];
- <span class="hljs-keyword">for</span> (<span class="hljs-keyword">var</span> i <span class="hljs-keyword">in</span> obj) {
- <span class="hljs-keyword">if</span> (obj.hasOwnProperty(i)) {
- ar.push(obj[i]);
- }
- }
- <span class="hljs-keyword">return</span> ar;
- }, <span class="hljs-comment">//function _obj2Array</span>
- _compare = <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">current, next</span>) </span>{
- <span class="hljs-keyword">var</span> i = <span class="hljs-number">0</span>,
- n = <span class="hljs-number">0</span>,
- tmp = <span class="hljs-number">0</span>,
- nl = <span class="hljs-number">0</span>,
- cl = <span class="hljs-number">0</span>;
-
- <span class="hljs-keyword">if</span> (current === next) {
- <span class="hljs-keyword">return</span> <span class="hljs-number">0</span>;
- } <span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span> (<span class="hljs-keyword">typeof</span> current === <span class="hljs-string">'object'</span>) {
- <span class="hljs-keyword">if</span> (<span class="hljs-keyword">typeof</span> next === <span class="hljs-string">'object'</span>) {
- current = _obj2Array(current);
- next = _obj2Array(next);
- cl = current.length;
- nl = next.length;
- <span class="hljs-keyword">if</span> (nl &gt; cl) {
- <span class="hljs-keyword">return</span> <span class="hljs-number">1</span>;
- } <span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span> (nl &lt; cl) {
- <span class="hljs-keyword">return</span> <span class="hljs-number">-1</span>;
- }
- <span class="hljs-keyword">for</span> (i = <span class="hljs-number">0</span>, n = cl; i &lt; n; ++i) {
- tmp = _compare(current[i], next[i]);
- <span class="hljs-keyword">if</span> (tmp == <span class="hljs-number">1</span>) {
- <span class="hljs-keyword">return</span> <span class="hljs-number">1</span>;
- } <span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span> (tmp == <span class="hljs-number">-1</span>) {
- <span class="hljs-keyword">return</span> <span class="hljs-number">-1</span>;
- }
- }
- <span class="hljs-keyword">return</span> <span class="hljs-number">0</span>;
- }
- <span class="hljs-keyword">return</span> <span class="hljs-number">-1</span>;
- } <span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span> (<span class="hljs-keyword">typeof</span> next === <span class="hljs-string">'object'</span>) {
- <span class="hljs-keyword">return</span> <span class="hljs-number">1</span>;
- } <span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span> (<span class="hljs-built_in">isNaN</span>(next) &amp;&amp; !<span class="hljs-built_in">isNaN</span>(current)) {
- <span class="hljs-keyword">if</span> (current == <span class="hljs-number">0</span>) {
- <span class="hljs-keyword">return</span> <span class="hljs-number">0</span>;
- }
- <span class="hljs-keyword">return</span> (current &lt; <span class="hljs-number">0</span> ? <span class="hljs-number">1</span> : <span class="hljs-number">-1</span>);
- } <span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span> (<span class="hljs-built_in">isNaN</span>(current) &amp;&amp; !<span class="hljs-built_in">isNaN</span>(next)) {
- <span class="hljs-keyword">if</span> (next == <span class="hljs-number">0</span>) {
- <span class="hljs-keyword">return</span> <span class="hljs-number">0</span>;
- }
- <span class="hljs-keyword">return</span> (next &gt; <span class="hljs-number">0</span> ? <span class="hljs-number">1</span> : <span class="hljs-number">-1</span>);
- }
-
- <span class="hljs-keyword">if</span> (next == current) {
- <span class="hljs-keyword">return</span> <span class="hljs-number">0</span>;
- }
- <span class="hljs-keyword">return</span> (next &gt; current ? <span class="hljs-number">1</span> : <span class="hljs-number">-1</span>);
- }; <span class="hljs-comment">//function _compare</span>
-
- <span class="hljs-keyword">if</span> (argc === <span class="hljs-number">0</span>) {
- <span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> <span class="hljs-built_in">Error</span>(<span class="hljs-string">'At least one value should be passed to min()'</span>);
- } <span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span> (argc === <span class="hljs-number">1</span>) {
- <span class="hljs-keyword">if</span> (<span class="hljs-keyword">typeof</span> argv[<span class="hljs-number">0</span>] === <span class="hljs-string">'object'</span>) {
- ar = _obj2Array(argv[<span class="hljs-number">0</span>]);
- } <span class="hljs-keyword">else</span> {
- <span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> <span class="hljs-built_in">Error</span>(<span class="hljs-string">'Wrong parameter count for min()'</span>);
- }
-
- <span class="hljs-keyword">if</span> (ar.length === <span class="hljs-number">0</span>) {
- <span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> <span class="hljs-built_in">Error</span>(<span class="hljs-string">'Array must contain at least one element for min()'</span>);
- }
- } <span class="hljs-keyword">else</span> {
- ar = argv;
- }
-
- retVal = ar[<span class="hljs-number">0</span>];
-
- <span class="hljs-keyword">for</span> (i = <span class="hljs-number">1</span>, n = ar.length; i &lt; n; ++i) {
- <span class="hljs-keyword">if</span> (_compare(retVal, ar[i]) == <span class="hljs-number">-1</span>) {
- retVal = ar[i];
- }
- }
-
- <span class="hljs-keyword">return</span> retVal;
- };
-
- <span class="hljs-keyword">return</span> Twig;
-
-})(Twig || { });</pre></div></div>
-
- </li>
-
-
- <li id="section-176">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-176">&#182;</a>
- </div>
- <pre><code>Twig.js
-Available under the BSD <span class="hljs-number">2</span>-Clause License
-https:<span class="hljs-comment">//github.com/justjohn/twig.js</span>
-</code></pre>
- </div>
-
- </li>
-
-
- <li id="section-177">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-177">&#182;</a>
- </div>
- <h2 id="twig-logic-js">twig.logic.js</h2>
-<p>This file handles tokenizing, compiling and parsing logic tokens. {% … %}</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre><span class="hljs-keyword">var</span> Twig = (<span class="hljs-function"><span class="hljs-keyword">function</span> (<span class="hljs-params">Twig</span>) </span>{
-<span class="hljs-meta"> "use strict"</span>;
-
- <span class="hljs-comment">/**
- * Namespace for logic handling.
- */</span>
- Twig.logic = {};
-
- <span class="hljs-comment">/**
- * Logic token types.
- */</span>
- Twig.logic.type = {
- if_: <span class="hljs-string">'Twig.logic.type.if'</span>,
- endif: <span class="hljs-string">'Twig.logic.type.endif'</span>,
- for_: <span class="hljs-string">'Twig.logic.type.for'</span>,
- endfor: <span class="hljs-string">'Twig.logic.type.endfor'</span>,
- else_: <span class="hljs-string">'Twig.logic.type.else'</span>,
- elseif: <span class="hljs-string">'Twig.logic.type.elseif'</span>,
- set: <span class="hljs-string">'Twig.logic.type.set'</span>,
- setcapture:<span class="hljs-string">'Twig.logic.type.setcapture'</span>,
- endset: <span class="hljs-string">'Twig.logic.type.endset'</span>,
- filter: <span class="hljs-string">'Twig.logic.type.filter'</span>,
- endfilter: <span class="hljs-string">'Twig.logic.type.endfilter'</span>,
- shortblock: <span class="hljs-string">'Twig.logic.type.shortblock'</span>,
- block: <span class="hljs-string">'Twig.logic.type.block'</span>,
- endblock: <span class="hljs-string">'Twig.logic.type.endblock'</span>,
- extends_: <span class="hljs-string">'Twig.logic.type.extends'</span>,
- use: <span class="hljs-string">'Twig.logic.type.use'</span>,
- include: <span class="hljs-string">'Twig.logic.type.include'</span>,
- spaceless: <span class="hljs-string">'Twig.logic.type.spaceless'</span>,
- endspaceless: <span class="hljs-string">'Twig.logic.type.endspaceless'</span>,
- macro: <span class="hljs-string">'Twig.logic.type.macro'</span>,
- endmacro: <span class="hljs-string">'Twig.logic.type.endmacro'</span>,
- import_: <span class="hljs-string">'Twig.logic.type.import'</span>,
- <span class="hljs-keyword">from</span>: <span class="hljs-string">'Twig.logic.type.from'</span>,
- embed: <span class="hljs-string">'Twig.logic.type.embed'</span>,
- endembed: <span class="hljs-string">'Twig.logic.type.endembed'</span>
- };</pre></div></div>
-
- </li>
-
-
- <li id="section-178">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-178">&#182;</a>
- </div>
- <p>Regular expressions for handling logic tokens.</p>
-<p>Properties:</p>
-<pre><code> type: The type of expression this matches
-
- regex: A regular expression that matches the format of the token
-
- next: What logic tokens (if any) pop this token off the logic stack. If empty, the
- logic token is assumed to not require an end tag and isn&#39;t push onto the stack.
-
- open: Does this tag open a logic expression or is it standalone. For example,
- {% endif %} cannot exist without an opening {% if ... %} tag, so open = false.
-</code></pre><p> Functions:</p>
-<pre><code> compile: A <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">that</span> <span class="hljs-title">handles</span> <span class="hljs-title">compiling</span> <span class="hljs-title">the</span> <span class="hljs-title">token</span> <span class="hljs-title">into</span> <span class="hljs-title">an</span> <span class="hljs-title">output</span> <span class="hljs-title">token</span> <span class="hljs-title">ready</span> <span class="hljs-title">for</span>
- <span class="hljs-title">parsing</span> <span class="hljs-title">with</span> <span class="hljs-title">the</span> <span class="hljs-title">parse</span> <span class="hljs-title">function</span>.
-
- <span class="hljs-title">parse</span>: <span class="hljs-title">A</span> <span class="hljs-title">function</span> <span class="hljs-title">that</span> <span class="hljs-title">parses</span> <span class="hljs-title">the</span> <span class="hljs-title">compiled</span> <span class="hljs-title">token</span> <span class="hljs-title">into</span> <span class="hljs-title">output</span> (<span class="hljs-params">HTML / whatever the
- template represents</span>).</span>
-</code></pre>
- </div>
-
- <div class="content"><div class='highlight'><pre> Twig.logic.definitions = [
- {
- <span class="hljs-comment">/**
- * If type logic tokens.
- *
- * Format: {% if expression %}
- */</span>
- type: Twig.logic.type.if_,
- regex: <span class="hljs-regexp">/^if\s+([\s\S]+)$/</span>,
- next: [
- Twig.logic.type.else_,
- Twig.logic.type.elseif,
- Twig.logic.type.endif
- ],
- open: <span class="hljs-literal">true</span>,
- compile: <span class="hljs-function"><span class="hljs-keyword">function</span> (<span class="hljs-params">token</span>) </span>{
- <span class="hljs-keyword">var</span> expression = token.match[<span class="hljs-number">1</span>];</pre></div></div>
-
- </li>
-
-
- <li id="section-179">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-179">&#182;</a>
- </div>
- <p>Compile the expression.</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> token.stack = Twig.expression.compile.apply(<span class="hljs-keyword">this</span>, [{
- type: Twig.expression.type.expression,
- value: expression
- }]).stack;
- <span class="hljs-keyword">delete</span> token.match;
- <span class="hljs-keyword">return</span> token;
- },
- parse: <span class="hljs-function"><span class="hljs-keyword">function</span> (<span class="hljs-params">token, context, chain</span>) </span>{
- <span class="hljs-keyword">var</span> output = <span class="hljs-string">''</span>,</pre></div></div>
-
- </li>
-
-
- <li id="section-180">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-180">&#182;</a>
- </div>
- <p>Parse the expression</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> result = Twig.expression.parse.apply(<span class="hljs-keyword">this</span>, [token.stack, context]);</pre></div></div>
-
- </li>
-
-
- <li id="section-181">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-181">&#182;</a>
- </div>
- <p>Start a new logic chain</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> chain = <span class="hljs-literal">true</span>;
-
- <span class="hljs-keyword">if</span> (result) {
- chain = <span class="hljs-literal">false</span>;</pre></div></div>
-
- </li>
-
-
- <li id="section-182">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-182">&#182;</a>
- </div>
- <p>parse if output</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> output = Twig.parse.apply(<span class="hljs-keyword">this</span>, [token.output, context]);
- }
- <span class="hljs-keyword">return</span> {
- chain: chain,
- output: output
- };
- }
- },
- {
- <span class="hljs-comment">/**
- * Else if type logic tokens.
- *
- * Format: {% elseif expression %}
- */</span>
- type: Twig.logic.type.elseif,
- regex: <span class="hljs-regexp">/^elseif\s+([^\s].*)$/</span>,
- next: [
- Twig.logic.type.else_,
- Twig.logic.type.elseif,
- Twig.logic.type.endif
- ],
- open: <span class="hljs-literal">false</span>,
- compile: <span class="hljs-function"><span class="hljs-keyword">function</span> (<span class="hljs-params">token</span>) </span>{
- <span class="hljs-keyword">var</span> expression = token.match[<span class="hljs-number">1</span>];</pre></div></div>
-
- </li>
-
-
- <li id="section-183">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-183">&#182;</a>
- </div>
- <p>Compile the expression.</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> token.stack = Twig.expression.compile.apply(<span class="hljs-keyword">this</span>, [{
- type: Twig.expression.type.expression,
- value: expression
- }]).stack;
- <span class="hljs-keyword">delete</span> token.match;
- <span class="hljs-keyword">return</span> token;
- },
- parse: <span class="hljs-function"><span class="hljs-keyword">function</span> (<span class="hljs-params">token, context, chain</span>) </span>{
- <span class="hljs-keyword">var</span> output = <span class="hljs-string">''</span>;
-
- <span class="hljs-keyword">if</span> (chain &amp;&amp; Twig.expression.parse.apply(<span class="hljs-keyword">this</span>, [token.stack, context]) === <span class="hljs-literal">true</span>) {
- chain = <span class="hljs-literal">false</span>;</pre></div></div>
-
- </li>
-
-
- <li id="section-184">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-184">&#182;</a>
- </div>
- <p>parse if output</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> output = Twig.parse.apply(<span class="hljs-keyword">this</span>, [token.output, context]);
- }
-
- <span class="hljs-keyword">return</span> {
- chain: chain,
- output: output
- };
- }
- },
- {
- <span class="hljs-comment">/**
- * Else if type logic tokens.
- *
- * Format: {% elseif expression %}
- */</span>
- type: Twig.logic.type.else_,
- regex: <span class="hljs-regexp">/^else$/</span>,
- next: [
- Twig.logic.type.endif,
- Twig.logic.type.endfor
- ],
- open: <span class="hljs-literal">false</span>,
- parse: <span class="hljs-function"><span class="hljs-keyword">function</span> (<span class="hljs-params">token, context, chain</span>) </span>{
- <span class="hljs-keyword">var</span> output = <span class="hljs-string">''</span>;
- <span class="hljs-keyword">if</span> (chain) {
- output = Twig.parse.apply(<span class="hljs-keyword">this</span>, [token.output, context]);
- }
- <span class="hljs-keyword">return</span> {
- chain: chain,
- output: output
- };
- }
- },
- {
- <span class="hljs-comment">/**
- * End if type logic tokens.
- *
- * Format: {% endif %}
- */</span>
- type: Twig.logic.type.endif,
- regex: <span class="hljs-regexp">/^endif$/</span>,
- next: [ ],
- open: <span class="hljs-literal">false</span>
- },
- {
- <span class="hljs-comment">/**
- * For type logic tokens.
- *
- * Format: {% for expression %}
- */</span>
- type: Twig.logic.type.for_,
- regex: <span class="hljs-regexp">/^for\s+([a-zA-Z0-9_,\s]+)\s+in\s+([^\s].*?)(?:\s+if\s+([^\s].*))?$/</span>,
- next: [
- Twig.logic.type.else_,
- Twig.logic.type.endfor
- ],
- open: <span class="hljs-literal">true</span>,
- compile: <span class="hljs-function"><span class="hljs-keyword">function</span> (<span class="hljs-params">token</span>) </span>{
- <span class="hljs-keyword">var</span> key_value = token.match[<span class="hljs-number">1</span>],
- expression = token.match[<span class="hljs-number">2</span>],
- conditional = token.match[<span class="hljs-number">3</span>],
- kv_split = <span class="hljs-literal">null</span>;
-
- token.key_var = <span class="hljs-literal">null</span>;
- token.value_var = <span class="hljs-literal">null</span>;
-
- <span class="hljs-keyword">if</span> (key_value.indexOf(<span class="hljs-string">","</span>) &gt;= <span class="hljs-number">0</span>) {
- kv_split = key_value.split(<span class="hljs-string">','</span>);
- <span class="hljs-keyword">if</span> (kv_split.length === <span class="hljs-number">2</span>) {
- token.key_var = kv_split[<span class="hljs-number">0</span>].trim();
- token.value_var = kv_split[<span class="hljs-number">1</span>].trim();
- } <span class="hljs-keyword">else</span> {
- <span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> Twig.Error(<span class="hljs-string">"Invalid expression in for loop: "</span> + key_value);
- }
- } <span class="hljs-keyword">else</span> {
- token.value_var = key_value;
- }</pre></div></div>
-
- </li>
-
-
- <li id="section-185">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-185">&#182;</a>
- </div>
- <p>Valid expressions for a for loop
- for item in expression
- for key,item in expression</p>
-
- </div>
-
- </li>
-
-
- <li id="section-186">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-186">&#182;</a>
- </div>
- <p>Compile the expression.</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> token.expression = Twig.expression.compile.apply(<span class="hljs-keyword">this</span>, [{
- type: Twig.expression.type.expression,
- value: expression
- }]).stack;</pre></div></div>
-
- </li>
-
-
- <li id="section-187">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-187">&#182;</a>
- </div>
- <p>Compile the conditional (if available)</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">if</span> (conditional) {
- token.conditional = Twig.expression.compile.apply(<span class="hljs-keyword">this</span>, [{
- type: Twig.expression.type.expression,
- value: conditional
- }]).stack;
- }
-
- <span class="hljs-keyword">delete</span> token.match;
- <span class="hljs-keyword">return</span> token;
- },
- parse: <span class="hljs-function"><span class="hljs-keyword">function</span> (<span class="hljs-params">token, context, continue_chain</span>) </span>{</pre></div></div>
-
- </li>
-
-
- <li id="section-188">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-188">&#182;</a>
- </div>
- <p>Parse expression</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">var</span> result = Twig.expression.parse.apply(<span class="hljs-keyword">this</span>, [token.expression, context]),
- output = [],
- len,
- index = <span class="hljs-number">0</span>,
- keyset,
- that = <span class="hljs-keyword">this</span>,
- conditional = token.conditional,
- buildLoop = <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">index, len</span>) </span>{
- <span class="hljs-keyword">var</span> isConditional = conditional !== <span class="hljs-literal">undefined</span>;
- <span class="hljs-keyword">return</span> {
- index: index+<span class="hljs-number">1</span>,
- index0: index,
- revindex: isConditional?<span class="hljs-literal">undefined</span>:len-index,
- revindex0: isConditional?<span class="hljs-literal">undefined</span>:len-index<span class="hljs-number">-1</span>,
- first: (index === <span class="hljs-number">0</span>),
- last: isConditional?<span class="hljs-literal">undefined</span>:(index === len<span class="hljs-number">-1</span>),
- length: isConditional?<span class="hljs-literal">undefined</span>:len,
- parent: context
- };
- },</pre></div></div>
-
- </li>
-
-
- <li id="section-189">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-189">&#182;</a>
- </div>
- <p>run once for each iteration of the loop</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> loop = <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">key, value</span>) </span>{
- <span class="hljs-keyword">var</span> inner_context = Twig.ChildContext(context);
-
- inner_context[token.value_var] = value;
-
- <span class="hljs-keyword">if</span> (token.key_var) {
- inner_context[token.key_var] = key;
- }</pre></div></div>
-
- </li>
-
-
- <li id="section-190">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-190">&#182;</a>
- </div>
- <p>Loop object</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> inner_context.loop = buildLoop(index, len);
-
- <span class="hljs-keyword">if</span> (conditional === <span class="hljs-literal">undefined</span> ||
- Twig.expression.parse.apply(that, [conditional, inner_context]))
- {
- output.push(Twig.parse.apply(that, [token.output, inner_context]));
- index += <span class="hljs-number">1</span>;
- }</pre></div></div>
-
- </li>
-
-
- <li id="section-191">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-191">&#182;</a>
- </div>
- <p>Delete loop-related variables from the context</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">delete</span> inner_context[<span class="hljs-string">'loop'</span>];
- <span class="hljs-keyword">delete</span> inner_context[token.value_var];
- <span class="hljs-keyword">delete</span> inner_context[token.key_var];</pre></div></div>
-
- </li>
-
-
- <li id="section-192">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-192">&#182;</a>
- </div>
- <p>Merge in values that exist in context but have changed
-in inner_context.</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> Twig.merge(context, inner_context, <span class="hljs-literal">true</span>);
- };
-
-
- <span class="hljs-keyword">if</span> (Twig.lib.is(<span class="hljs-string">'Array'</span>, result)) {
- len = result.length;
- Twig.forEach(result, <span class="hljs-function"><span class="hljs-keyword">function</span> (<span class="hljs-params">value</span>) </span>{
- <span class="hljs-keyword">var</span> key = index;
-
- loop(key, value);
- });
- } <span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span> (Twig.lib.is(<span class="hljs-string">'Object'</span>, result)) {
- <span class="hljs-keyword">if</span> (result._keys !== <span class="hljs-literal">undefined</span>) {
- keyset = result._keys;
- } <span class="hljs-keyword">else</span> {
- keyset = <span class="hljs-built_in">Object</span>.keys(result);
- }
- len = keyset.length;
- Twig.forEach(keyset, <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">key</span>) </span>{</pre></div></div>
-
- </li>
-
-
- <li id="section-193">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-193">&#182;</a>
- </div>
- <p>Ignore the _keys property, it’s internal to twig.js</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">if</span> (key === <span class="hljs-string">"_keys"</span>) <span class="hljs-keyword">return</span>;
-
- loop(key, result[key]);
- });
- }</pre></div></div>
-
- </li>
-
-
- <li id="section-194">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-194">&#182;</a>
- </div>
- <p>Only allow else statements if no output was generated</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> continue_chain = (output.length === <span class="hljs-number">0</span>);
-
- <span class="hljs-keyword">return</span> {
- chain: continue_chain,
- output: Twig.output.apply(<span class="hljs-keyword">this</span>, [output])
- };
- }
- },
- {
- <span class="hljs-comment">/**
- * End if type logic tokens.
- *
- * Format: {% endif %}
- */</span>
- type: Twig.logic.type.endfor,
- regex: <span class="hljs-regexp">/^endfor$/</span>,
- next: [ ],
- open: <span class="hljs-literal">false</span>
- },
- {
- <span class="hljs-comment">/**
- * Set type logic tokens.
- *
- * Format: {% set key = expression %}
- */</span>
- type: Twig.logic.type.set,
- regex: <span class="hljs-regexp">/^set\s+([a-zA-Z0-9_,\s]+)\s*=\s*([\s\S]+)$/</span>,
- next: [ ],
- open: <span class="hljs-literal">true</span>,
- compile: <span class="hljs-function"><span class="hljs-keyword">function</span> (<span class="hljs-params">token</span>) </span>{
- <span class="hljs-keyword">var</span> key = token.match[<span class="hljs-number">1</span>].trim(),
- expression = token.match[<span class="hljs-number">2</span>],</pre></div></div>
-
- </li>
-
-
- <li id="section-195">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-195">&#182;</a>
- </div>
- <p>Compile the expression.</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> expression_stack = Twig.expression.compile.apply(<span class="hljs-keyword">this</span>, [{
- type: Twig.expression.type.expression,
- value: expression
- }]).stack;
-
- token.key = key;
- token.expression = expression_stack;
-
- <span class="hljs-keyword">delete</span> token.match;
- <span class="hljs-keyword">return</span> token;
- },
- parse: <span class="hljs-function"><span class="hljs-keyword">function</span> (<span class="hljs-params">token, context, continue_chain</span>) </span>{
- <span class="hljs-keyword">var</span> value = Twig.expression.parse.apply(<span class="hljs-keyword">this</span>, [token.expression, context]),
- key = token.key;
-
- context[key] = value;
-
- <span class="hljs-keyword">return</span> {
- chain: continue_chain,
- context: context
- };
- }
- },
- {
- <span class="hljs-comment">/**
- * Set capture type logic tokens.
- *
- * Format: {% set key %}
- */</span>
- type: Twig.logic.type.setcapture,
- regex: <span class="hljs-regexp">/^set\s+([a-zA-Z0-9_,\s]+)$/</span>,
- next: [
- Twig.logic.type.endset
- ],
- open: <span class="hljs-literal">true</span>,
- compile: <span class="hljs-function"><span class="hljs-keyword">function</span> (<span class="hljs-params">token</span>) </span>{
- <span class="hljs-keyword">var</span> key = token.match[<span class="hljs-number">1</span>].trim();
-
- token.key = key;
-
- <span class="hljs-keyword">delete</span> token.match;
- <span class="hljs-keyword">return</span> token;
- },
- parse: <span class="hljs-function"><span class="hljs-keyword">function</span> (<span class="hljs-params">token, context, continue_chain</span>) </span>{
-
- <span class="hljs-keyword">var</span> value = Twig.parse.apply(<span class="hljs-keyword">this</span>, [token.output, context]),
- key = token.key;</pre></div></div>
-
- </li>
-
-
- <li id="section-196">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-196">&#182;</a>
- </div>
- <p>set on both the global and local context</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">this</span>.context[key] = value;
- context[key] = value;
-
- <span class="hljs-keyword">return</span> {
- chain: continue_chain,
- context: context
- };
- }
- },
- {
- <span class="hljs-comment">/**
- * End set type block logic tokens.
- *
- * Format: {% endset %}
- */</span>
- type: Twig.logic.type.endset,
- regex: <span class="hljs-regexp">/^endset$/</span>,
- next: [ ],
- open: <span class="hljs-literal">false</span>
- },
- {
- <span class="hljs-comment">/**
- * Filter logic tokens.
- *
- * Format: {% filter upper %} or {% filter lower|escape %}
- */</span>
- type: Twig.logic.type.filter,
- regex: <span class="hljs-regexp">/^filter\s+(.+)$/</span>,
- next: [
- Twig.logic.type.endfilter
- ],
- open: <span class="hljs-literal">true</span>,
- compile: <span class="hljs-function"><span class="hljs-keyword">function</span> (<span class="hljs-params">token</span>) </span>{
- <span class="hljs-keyword">var</span> expression = <span class="hljs-string">"|"</span> + token.match[<span class="hljs-number">1</span>].trim();</pre></div></div>
-
- </li>
-
-
- <li id="section-197">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-197">&#182;</a>
- </div>
- <p>Compile the expression.</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> token.stack = Twig.expression.compile.apply(<span class="hljs-keyword">this</span>, [{
- type: Twig.expression.type.expression,
- value: expression
- }]).stack;
- <span class="hljs-keyword">delete</span> token.match;
- <span class="hljs-keyword">return</span> token;
- },
- parse: <span class="hljs-function"><span class="hljs-keyword">function</span> (<span class="hljs-params">token, context, chain</span>) </span>{
- <span class="hljs-keyword">var</span> unfiltered = Twig.parse.apply(<span class="hljs-keyword">this</span>, [token.output, context]),
- stack = [{
- type: Twig.expression.type.string,
- value: unfiltered
- }].concat(token.stack);
-
- <span class="hljs-keyword">var</span> output = Twig.expression.parse.apply(<span class="hljs-keyword">this</span>, [stack, context]);
-
- <span class="hljs-keyword">return</span> {
- chain: chain,
- output: output
- };
- }
- },
- {
- <span class="hljs-comment">/**
- * End filter logic tokens.
- *
- * Format: {% endfilter %}
- */</span>
- type: Twig.logic.type.endfilter,
- regex: <span class="hljs-regexp">/^endfilter$/</span>,
- next: [ ],
- open: <span class="hljs-literal">false</span>
- },
- {
- <span class="hljs-comment">/**
- * Block logic tokens.
- *
- * Format: {% block title %}
- */</span>
- type: Twig.logic.type.block,
- regex: <span class="hljs-regexp">/^block\s+([a-zA-Z0-9_]+)$/</span>,
- next: [
- Twig.logic.type.endblock
- ],
- open: <span class="hljs-literal">true</span>,
- compile: <span class="hljs-function"><span class="hljs-keyword">function</span> (<span class="hljs-params">token</span>) </span>{
- token.block = token.match[<span class="hljs-number">1</span>].trim();
- <span class="hljs-keyword">delete</span> token.match;
- <span class="hljs-keyword">return</span> token;
- },
- parse: <span class="hljs-function"><span class="hljs-keyword">function</span> (<span class="hljs-params">token, context, chain</span>) </span>{
- <span class="hljs-keyword">var</span> block_output,
- output,
- isImported = Twig.indexOf(<span class="hljs-keyword">this</span>.importedBlocks, token.block) &gt; <span class="hljs-number">-1</span>,
- hasParent = <span class="hljs-keyword">this</span>.blocks[token.block] &amp;&amp; Twig.indexOf(<span class="hljs-keyword">this</span>.blocks[token.block], Twig.placeholders.parent) &gt; <span class="hljs-number">-1</span>;</pre></div></div>
-
- </li>
-
-
- <li id="section-198">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-198">&#182;</a>
- </div>
- <p>Don’t override previous blocks unless they’re imported with “use”
-Loops should be exempted as well.</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">if</span> (<span class="hljs-keyword">this</span>.blocks[token.block] === <span class="hljs-literal">undefined</span> || isImported || hasParent || context.loop || token.overwrite) {
- <span class="hljs-keyword">if</span> (token.expression) {</pre></div></div>
-
- </li>
-
-
- <li id="section-199">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-199">&#182;</a>
- </div>
- <p>Short blocks have output as an expression on the open tag (no body)</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> block_output = Twig.expression.parse.apply(<span class="hljs-keyword">this</span>, [{
- type: Twig.expression.type.string,
- value: Twig.expression.parse.apply(<span class="hljs-keyword">this</span>, [token.output, context])
- }, context]);
- } <span class="hljs-keyword">else</span> {
- block_output = Twig.expression.parse.apply(<span class="hljs-keyword">this</span>, [{
- type: Twig.expression.type.string,
- value: Twig.parse.apply(<span class="hljs-keyword">this</span>, [token.output, context])
- }, context]);
- }
-
- <span class="hljs-keyword">if</span> (isImported) {</pre></div></div>
-
- </li>
-
-
- <li id="section-200">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-200">&#182;</a>
- </div>
- <p>once the block is overridden, remove it from the list of imported blocks</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">this</span>.importedBlocks.splice(<span class="hljs-keyword">this</span>.importedBlocks.indexOf(token.block), <span class="hljs-number">1</span>);
- }
-
- <span class="hljs-keyword">if</span> (hasParent) {
- <span class="hljs-keyword">this</span>.blocks[token.block] = Twig.Markup(<span class="hljs-keyword">this</span>.blocks[token.block].replace(Twig.placeholders.parent, block_output));
- } <span class="hljs-keyword">else</span> {
- <span class="hljs-keyword">this</span>.blocks[token.block] = block_output;
- }
-
- <span class="hljs-keyword">this</span>.originalBlockTokens[token.block] = {
- type: token.type,
- block: token.block,
- output: token.output,
- overwrite: <span class="hljs-literal">true</span>
- };
- }</pre></div></div>
-
- </li>
-
-
- <li id="section-201">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-201">&#182;</a>
- </div>
- <p>Check if a child block has been set from a template extending this one.</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">if</span> (<span class="hljs-keyword">this</span>.child.blocks[token.block]) {
- output = <span class="hljs-keyword">this</span>.child.blocks[token.block];
- } <span class="hljs-keyword">else</span> {
- output = <span class="hljs-keyword">this</span>.blocks[token.block];
- }
-
- <span class="hljs-keyword">return</span> {
- chain: chain,
- output: output
- };
- }
- },
- {
- <span class="hljs-comment">/**
- * Block shorthand logic tokens.
- *
- * Format: {% block title expression %}
- */</span>
- type: Twig.logic.type.shortblock,
- regex: <span class="hljs-regexp">/^block\s+([a-zA-Z0-9_]+)\s+(.+)$/</span>,
- next: [ ],
- open: <span class="hljs-literal">true</span>,
- compile: <span class="hljs-function"><span class="hljs-keyword">function</span> (<span class="hljs-params">token</span>) </span>{
- token.expression = token.match[<span class="hljs-number">2</span>].trim();
-
- token.output = Twig.expression.compile({
- type: Twig.expression.type.expression,
- value: token.expression
- }).stack;
-
- token.block = token.match[<span class="hljs-number">1</span>].trim();
- <span class="hljs-keyword">delete</span> token.match;
- <span class="hljs-keyword">return</span> token;
- },
- parse: <span class="hljs-function"><span class="hljs-keyword">function</span> (<span class="hljs-params">token, context, chain</span>) </span>{
- <span class="hljs-keyword">return</span> Twig.logic.handler[Twig.logic.type.block].parse.apply(<span class="hljs-keyword">this</span>, <span class="hljs-built_in">arguments</span>);
- }
- },
- {
- <span class="hljs-comment">/**
- * End block logic tokens.
- *
- * Format: {% endblock %}
- */</span>
- type: Twig.logic.type.endblock,
- regex: <span class="hljs-regexp">/^endblock(?:\s+([a-zA-Z0-9_]+))?$/</span>,
- next: [ ],
- open: <span class="hljs-literal">false</span>
- },
- {
- <span class="hljs-comment">/**
- * Block logic tokens.
- *
- * Format: {% extends "template.twig" %}
- */</span>
- type: Twig.logic.type.extends_,
- regex: <span class="hljs-regexp">/^extends\s+(.+)$/</span>,
- next: [ ],
- open: <span class="hljs-literal">true</span>,
- compile: <span class="hljs-function"><span class="hljs-keyword">function</span> (<span class="hljs-params">token</span>) </span>{
- <span class="hljs-keyword">var</span> expression = token.match[<span class="hljs-number">1</span>].trim();
- <span class="hljs-keyword">delete</span> token.match;
-
- token.stack = Twig.expression.compile.apply(<span class="hljs-keyword">this</span>, [{
- type: Twig.expression.type.expression,
- value: expression
- }]).stack;
-
- <span class="hljs-keyword">return</span> token;
- },
- parse: <span class="hljs-function"><span class="hljs-keyword">function</span> (<span class="hljs-params">token, context, chain</span>) </span>{</pre></div></div>
-
- </li>
-
-
- <li id="section-202">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-202">&#182;</a>
- </div>
- <p>Resolve filename</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">var</span> file = Twig.expression.parse.apply(<span class="hljs-keyword">this</span>, [token.stack, context]);</pre></div></div>
-
- </li>
-
-
- <li id="section-203">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-203">&#182;</a>
- </div>
- <p>Set parent template</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">this</span>.extend = file;
-
- <span class="hljs-keyword">return</span> {
- chain: chain,
- output: <span class="hljs-string">''</span>
- };
- }
- },
- {
- <span class="hljs-comment">/**
- * Block logic tokens.
- *
- * Format: {% use "template.twig" %}
- */</span>
- type: Twig.logic.type.use,
- regex: <span class="hljs-regexp">/^use\s+(.+)$/</span>,
- next: [ ],
- open: <span class="hljs-literal">true</span>,
- compile: <span class="hljs-function"><span class="hljs-keyword">function</span> (<span class="hljs-params">token</span>) </span>{
- <span class="hljs-keyword">var</span> expression = token.match[<span class="hljs-number">1</span>].trim();
- <span class="hljs-keyword">delete</span> token.match;
-
- token.stack = Twig.expression.compile.apply(<span class="hljs-keyword">this</span>, [{
- type: Twig.expression.type.expression,
- value: expression
- }]).stack;
-
- <span class="hljs-keyword">return</span> token;
- },
- parse: <span class="hljs-function"><span class="hljs-keyword">function</span> (<span class="hljs-params">token, context, chain</span>) </span>{</pre></div></div>
-
- </li>
-
-
- <li id="section-204">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-204">&#182;</a>
- </div>
- <p>Resolve filename</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">var</span> file = Twig.expression.parse.apply(<span class="hljs-keyword">this</span>, [token.stack, context]);</pre></div></div>
-
- </li>
-
-
- <li id="section-205">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-205">&#182;</a>
- </div>
- <p>Import blocks</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">this</span>.importBlocks(file);
-
- <span class="hljs-keyword">return</span> {
- chain: chain,
- output: <span class="hljs-string">''</span>
- };
- }
- },
- {
- <span class="hljs-comment">/**
- * Block logic tokens.
- *
- * Format: {% includes "template.twig" [with {some: 'values'} only] %}
- */</span>
- type: Twig.logic.type.include,
- regex: <span class="hljs-regexp">/^include\s+(ignore missing\s+)?(.+?)\s*(?:with\s+([\S\s]+?))?\s*(only)?$/</span>,
- next: [ ],
- open: <span class="hljs-literal">true</span>,
- compile: <span class="hljs-function"><span class="hljs-keyword">function</span> (<span class="hljs-params">token</span>) </span>{
- <span class="hljs-keyword">var</span> match = token.match,
- includeMissing = match[<span class="hljs-number">1</span>] !== <span class="hljs-literal">undefined</span>,
- expression = match[<span class="hljs-number">2</span>].trim(),
- withContext = match[<span class="hljs-number">3</span>],
- only = ((match[<span class="hljs-number">4</span>] !== <span class="hljs-literal">undefined</span>) &amp;&amp; match[<span class="hljs-number">4</span>].length);
-
- <span class="hljs-keyword">delete</span> token.match;
-
- token.only = only;
- token.includeMissing = includeMissing;
-
- token.stack = Twig.expression.compile.apply(<span class="hljs-keyword">this</span>, [{
- type: Twig.expression.type.expression,
- value: expression
- }]).stack;
-
- <span class="hljs-keyword">if</span> (withContext !== <span class="hljs-literal">undefined</span>) {
- token.withStack = Twig.expression.compile.apply(<span class="hljs-keyword">this</span>, [{
- type: Twig.expression.type.expression,
- value: withContext.trim()
- }]).stack;
- }
-
- <span class="hljs-keyword">return</span> token;
- },
- parse: <span class="hljs-function"><span class="hljs-keyword">function</span> (<span class="hljs-params">token, context, chain</span>) </span>{</pre></div></div>
-
- </li>
-
-
- <li id="section-206">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-206">&#182;</a>
- </div>
- <p>Resolve filename</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">var</span> innerContext = {},
- withContext,
- i,
- template;
-
- <span class="hljs-keyword">if</span> (!token.only) {
- innerContext = Twig.ChildContext(context);
- }
-
- <span class="hljs-keyword">if</span> (token.withStack !== <span class="hljs-literal">undefined</span>) {
- withContext = Twig.expression.parse.apply(<span class="hljs-keyword">this</span>, [token.withStack, context]);
-
- <span class="hljs-keyword">for</span> (i <span class="hljs-keyword">in</span> withContext) {
- <span class="hljs-keyword">if</span> (withContext.hasOwnProperty(i))
- innerContext[i] = withContext[i];
- }
- }
-
- <span class="hljs-keyword">var</span> file = Twig.expression.parse.apply(<span class="hljs-keyword">this</span>, [token.stack, innerContext]);
-
- <span class="hljs-keyword">if</span> (file <span class="hljs-keyword">instanceof</span> Twig.Template) {
- template = file;
- } <span class="hljs-keyword">else</span> {</pre></div></div>
-
- </li>
-
-
- <li id="section-207">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-207">&#182;</a>
- </div>
- <p>Import file</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> template = <span class="hljs-keyword">this</span>.importFile(file);
- }
-
- <span class="hljs-keyword">return</span> {
- chain: chain,
- output: template.render(innerContext)
- };
- }
- },
- {
- type: Twig.logic.type.spaceless,
- regex: <span class="hljs-regexp">/^spaceless$/</span>,
- next: [
- Twig.logic.type.endspaceless
- ],
- open: <span class="hljs-literal">true</span>,</pre></div></div>
-
- </li>
-
-
- <li id="section-208">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-208">&#182;</a>
- </div>
- <p>Parse the html and return it without any spaces between tags</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> parse: <span class="hljs-function"><span class="hljs-keyword">function</span> (<span class="hljs-params">token, context, chain</span>) </span>{
- <span class="hljs-keyword">var</span> <span class="hljs-comment">// Parse the output without any filter</span>
- unfiltered = Twig.parse.apply(<span class="hljs-keyword">this</span>, [token.output, context]),</pre></div></div>
-
- </li>
-
-
- <li id="section-209">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-209">&#182;</a>
- </div>
- <p>A regular expression to find closing and opening tags with spaces between them</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> rBetweenTagSpaces = <span class="hljs-regexp">/&gt;\s+&lt;/g</span>,</pre></div></div>
-
- </li>
-
-
- <li id="section-210">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-210">&#182;</a>
- </div>
- <p>Replace all space between closing and opening html tags</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> output = unfiltered.replace(rBetweenTagSpaces,<span class="hljs-string">'&gt;&lt;'</span>).trim();
-
- <span class="hljs-keyword">return</span> {
- chain: chain,
- output: output
- };
- }
- },</pre></div></div>
-
- </li>
-
-
- <li id="section-211">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-211">&#182;</a>
- </div>
- <p>Add the {% endspaceless %} token</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> {
- type: Twig.logic.type.endspaceless,
- regex: <span class="hljs-regexp">/^endspaceless$/</span>,
- next: [ ],
- open: <span class="hljs-literal">false</span>
- },
- {
- <span class="hljs-comment">/**
- * Macro logic tokens.
- *
- * Format: {% maro input(name, value, type, size) %}
- *
- */</span>
- type: Twig.logic.type.macro,
- regex: <span class="hljs-regexp">/^macro\s+([a-zA-Z0-9_]+)\s*\(\s*((?:[a-zA-Z0-9_]+(?:,\s*)?)*)\s*\)$/</span>,
- next: [
- Twig.logic.type.endmacro
- ],
- open: <span class="hljs-literal">true</span>,
- compile: <span class="hljs-function"><span class="hljs-keyword">function</span> (<span class="hljs-params">token</span>) </span>{
- <span class="hljs-keyword">var</span> macroName = token.match[<span class="hljs-number">1</span>],
- parameters = token.match[<span class="hljs-number">2</span>].split(<span class="hljs-regexp">/[\s,]+/</span>);</pre></div></div>
-
- </li>
-
-
- <li id="section-212">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-212">&#182;</a>
- </div>
- <p>TODO: Clean up duplicate check</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">for</span> (<span class="hljs-keyword">var</span> i=<span class="hljs-number">0</span>; i&lt;parameters.length; i++) {
- <span class="hljs-keyword">for</span> (<span class="hljs-keyword">var</span> j=<span class="hljs-number">0</span>; j&lt;parameters.length; j++){
- <span class="hljs-keyword">if</span> (parameters[i] === parameters[j] &amp;&amp; i !== j) {
- <span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> Twig.Error(<span class="hljs-string">"Duplicate arguments for parameter: "</span>+ parameters[i]);
- }
- }
- }
-
- token.macroName = macroName;
- token.parameters = parameters;
-
- <span class="hljs-keyword">delete</span> token.match;
- <span class="hljs-keyword">return</span> token;
- },
- parse: <span class="hljs-function"><span class="hljs-keyword">function</span> (<span class="hljs-params">token, context, chain</span>) </span>{
- <span class="hljs-keyword">var</span> template = <span class="hljs-keyword">this</span>;
- <span class="hljs-keyword">this</span>.macros[token.macroName] = <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"></span>) </span>{</pre></div></div>
-
- </li>
-
-
- <li id="section-213">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-213">&#182;</a>
- </div>
- <p>Pass global context and other macros</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">var</span> macroContext = {
- _self: template.macros
- }</pre></div></div>
-
- </li>
-
-
- <li id="section-214">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-214">&#182;</a>
- </div>
- <p>Add parameters from context to macroContext</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">for</span> (<span class="hljs-keyword">var</span> i=<span class="hljs-number">0</span>; i&lt;token.parameters.length; i++) {
- <span class="hljs-keyword">var</span> prop = token.parameters[i];
- <span class="hljs-keyword">if</span>(<span class="hljs-keyword">typeof</span> <span class="hljs-built_in">arguments</span>[i] !== <span class="hljs-string">'undefined'</span>) {
- macroContext[prop] = <span class="hljs-built_in">arguments</span>[i];
- } <span class="hljs-keyword">else</span> {
- macroContext[prop] = <span class="hljs-literal">undefined</span>;
- }
- }</pre></div></div>
-
- </li>
-
-
- <li id="section-215">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-215">&#182;</a>
- </div>
- <p>Render</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">return</span> Twig.parse.apply(template, [token.output, macroContext])
- };
-
- <span class="hljs-keyword">return</span> {
- chain: chain,
- output: <span class="hljs-string">''</span>
- };
-
- }
- },
- {
- <span class="hljs-comment">/**
- * End macro logic tokens.
- *
- * Format: {% endmacro %}
- */</span>
- type: Twig.logic.type.endmacro,
- regex: <span class="hljs-regexp">/^endmacro$/</span>,
- next: [ ],
- open: <span class="hljs-literal">false</span>
- },
- {
- <span class="hljs-comment">/*
- * import logic tokens.
- *
- * Format: {% import "template.twig" as form %}
- */</span>
- type: Twig.logic.type.import_,
- regex: <span class="hljs-regexp">/^import\s+(.+)\s+as\s+([a-zA-Z0-9_]+)$/</span>,
- next: [ ],
- open: <span class="hljs-literal">true</span>,
- compile: <span class="hljs-function"><span class="hljs-keyword">function</span> (<span class="hljs-params">token</span>) </span>{
- <span class="hljs-keyword">var</span> expression = token.match[<span class="hljs-number">1</span>].trim(),
- contextName = token.match[<span class="hljs-number">2</span>].trim();
- <span class="hljs-keyword">delete</span> token.match;
-
- token.expression = expression;
- token.contextName = contextName;
-
- token.stack = Twig.expression.compile.apply(<span class="hljs-keyword">this</span>, [{
- type: Twig.expression.type.expression,
- value: expression
- }]).stack;
-
- <span class="hljs-keyword">return</span> token;
- },
- parse: <span class="hljs-function"><span class="hljs-keyword">function</span> (<span class="hljs-params">token, context, chain</span>) </span>{
- <span class="hljs-keyword">if</span> (token.expression !== <span class="hljs-string">"_self"</span>) {
- <span class="hljs-keyword">var</span> file = Twig.expression.parse.apply(<span class="hljs-keyword">this</span>, [token.stack, context]);
- <span class="hljs-keyword">var</span> template = <span class="hljs-keyword">this</span>.importFile(file || token.expression);
- context[token.contextName] = template.render({}, {output: <span class="hljs-string">'macros'</span>});
- }
- <span class="hljs-keyword">else</span> {
- context[token.contextName] = <span class="hljs-keyword">this</span>.macros;
- }
-
- <span class="hljs-keyword">return</span> {
- chain: chain,
- output: <span class="hljs-string">''</span>
- }
-
- }
- },
- {
- <span class="hljs-comment">/*
- * from logic tokens.
- *
- * Format: {% from "template.twig" import func as form %}
- */</span>
- type: Twig.logic.type.from,
- regex: <span class="hljs-regexp">/^from\s+(.+)\s+import\s+([a-zA-Z0-9_, ]+)$/</span>,
- next: [ ],
- open: <span class="hljs-literal">true</span>,
- compile: <span class="hljs-function"><span class="hljs-keyword">function</span> (<span class="hljs-params">token</span>) </span>{
- <span class="hljs-keyword">var</span> expression = token.match[<span class="hljs-number">1</span>].trim(),
- macroExpressions = token.match[<span class="hljs-number">2</span>].trim().split(<span class="hljs-regexp">/[ ,]+/</span>),
- macroNames = {};
-
- <span class="hljs-keyword">for</span> (<span class="hljs-keyword">var</span> i=<span class="hljs-number">0</span>; i&lt;macroExpressions.length; i++) {
- <span class="hljs-keyword">var</span> res = macroExpressions[i];</pre></div></div>
-
- </li>
-
-
- <li id="section-216">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-216">&#182;</a>
- </div>
- <p>match function as variable</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">var</span> macroMatch = res.match(<span class="hljs-regexp">/^([a-zA-Z0-9_]+)\s+(.+)\s+as\s+([a-zA-Z0-9_]+)$/</span>);
- <span class="hljs-keyword">if</span> (macroMatch) {
- macroNames[macroMatch[<span class="hljs-number">1</span>].trim()] = macroMatch[<span class="hljs-number">2</span>].trim();
- }
- <span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span> (res.match(<span class="hljs-regexp">/^([a-zA-Z0-9_]+)$/</span>)) {
- macroNames[res] = res;
- }
- <span class="hljs-keyword">else</span> {</pre></div></div>
-
- </li>
-
-
- <li id="section-217">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-217">&#182;</a>
- </div>
- <p>ignore import</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> }
-
- }
-
- <span class="hljs-keyword">delete</span> token.match;
-
- token.expression = expression;
- token.macroNames = macroNames;
-
- token.stack = Twig.expression.compile.apply(<span class="hljs-keyword">this</span>, [{
- type: Twig.expression.type.expression,
- value: expression
- }]).stack;
-
- <span class="hljs-keyword">return</span> token;
- },
- parse: <span class="hljs-function"><span class="hljs-keyword">function</span> (<span class="hljs-params">token, context, chain</span>) </span>{
- <span class="hljs-keyword">var</span> macros;
-
- <span class="hljs-keyword">if</span> (token.expression !== <span class="hljs-string">"_self"</span>) {
- <span class="hljs-keyword">var</span> file = Twig.expression.parse.apply(<span class="hljs-keyword">this</span>, [token.stack, context]);
- <span class="hljs-keyword">var</span> template = <span class="hljs-keyword">this</span>.importFile(file || token.expression);
- macros = template.render({}, {output: <span class="hljs-string">'macros'</span>});
- }
- <span class="hljs-keyword">else</span> {
- macros = <span class="hljs-keyword">this</span>.macros;
- }
-
- <span class="hljs-keyword">for</span> (<span class="hljs-keyword">var</span> macroName <span class="hljs-keyword">in</span> token.macroNames) {
- <span class="hljs-keyword">if</span> (macros.hasOwnProperty(macroName)) {
- context[token.macroNames[macroName]] = macros[macroName];
- }
- }
-
- <span class="hljs-keyword">return</span> {
- chain: chain,
- output: <span class="hljs-string">''</span>
- }
-
- }
- },
- {
- <span class="hljs-comment">/**
- * The embed tag combines the behaviour of include and extends.
- * It allows you to include another template's contents, just like include does.
- *
- * Format: {% embed "template.twig" [with {some: 'values'} only] %}
- */</span>
- type: Twig.logic.type.embed,
- regex: <span class="hljs-regexp">/^embed\s+(ignore missing\s+)?(.+?)\s*(?:with\s+(.+?))?\s*(only)?$/</span>,
- next: [
- Twig.logic.type.endembed
- ],
- open: <span class="hljs-literal">true</span>,
- compile: <span class="hljs-function"><span class="hljs-keyword">function</span> (<span class="hljs-params">token</span>) </span>{
- <span class="hljs-keyword">var</span> match = token.match,
- includeMissing = match[<span class="hljs-number">1</span>] !== <span class="hljs-literal">undefined</span>,
- expression = match[<span class="hljs-number">2</span>].trim(),
- withContext = match[<span class="hljs-number">3</span>],
- only = ((match[<span class="hljs-number">4</span>] !== <span class="hljs-literal">undefined</span>) &amp;&amp; match[<span class="hljs-number">4</span>].length);
-
- <span class="hljs-keyword">delete</span> token.match;
-
- token.only = only;
- token.includeMissing = includeMissing;
-
- token.stack = Twig.expression.compile.apply(<span class="hljs-keyword">this</span>, [{
- type: Twig.expression.type.expression,
- value: expression
- }]).stack;
-
- <span class="hljs-keyword">if</span> (withContext !== <span class="hljs-literal">undefined</span>) {
- token.withStack = Twig.expression.compile.apply(<span class="hljs-keyword">this</span>, [{
- type: Twig.expression.type.expression,
- value: withContext.trim()
- }]).stack;
- }
-
- <span class="hljs-keyword">return</span> token;
- },
- parse: <span class="hljs-function"><span class="hljs-keyword">function</span> (<span class="hljs-params">token, context, chain</span>) </span>{</pre></div></div>
-
- </li>
-
-
- <li id="section-218">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-218">&#182;</a>
- </div>
- <p>Resolve filename</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">var</span> innerContext = {},
- withContext,
- i,
- template;
-
- <span class="hljs-keyword">if</span> (!token.only) {
- <span class="hljs-keyword">for</span> (i <span class="hljs-keyword">in</span> context) {
- <span class="hljs-keyword">if</span> (context.hasOwnProperty(i))
- innerContext[i] = context[i];
- }
- }
-
- <span class="hljs-keyword">if</span> (token.withStack !== <span class="hljs-literal">undefined</span>) {
- withContext = Twig.expression.parse.apply(<span class="hljs-keyword">this</span>, [token.withStack, context]);
-
- <span class="hljs-keyword">for</span> (i <span class="hljs-keyword">in</span> withContext) {
- <span class="hljs-keyword">if</span> (withContext.hasOwnProperty(i))
- innerContext[i] = withContext[i];
- }
- }
-
- <span class="hljs-keyword">var</span> file = Twig.expression.parse.apply(<span class="hljs-keyword">this</span>, [token.stack, innerContext]);
-
- <span class="hljs-keyword">if</span> (file <span class="hljs-keyword">instanceof</span> Twig.Template) {
- template = file;
- } <span class="hljs-keyword">else</span> {</pre></div></div>
-
- </li>
-
-
- <li id="section-219">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-219">&#182;</a>
- </div>
- <p>Import file</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> template = <span class="hljs-keyword">this</span>.importFile(file);
- }</pre></div></div>
-
- </li>
-
-
- <li id="section-220">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-220">&#182;</a>
- </div>
- <p>reset previous blocks</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">this</span>.blocks = {};</pre></div></div>
-
- </li>
-
-
- <li id="section-221">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-221">&#182;</a>
- </div>
- <p>parse tokens. output will be not used</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">var</span> output = Twig.parse.apply(<span class="hljs-keyword">this</span>, [token.output, innerContext]);</pre></div></div>
-
- </li>
-
-
- <li id="section-222">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-222">&#182;</a>
- </div>
- <p>render tempalte with blocks defined in embed block</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">return</span> {
- chain: chain,
- output: template.render(innerContext, {<span class="hljs-string">'blocks'</span>:<span class="hljs-keyword">this</span>.blocks})
- };
- }
- },
- <span class="hljs-comment">/* Add the {% endembed %} token
- *
- */</span>
- {
- type: Twig.logic.type.endembed,
- regex: <span class="hljs-regexp">/^endembed$/</span>,
- next: [ ],
- open: <span class="hljs-literal">false</span>
- }
-
- ];
-
-
- <span class="hljs-comment">/**
- * Registry for logic handlers.
- */</span>
- Twig.logic.handler = {};
-
- <span class="hljs-comment">/**
- * Define a new token type, available at Twig.logic.type.{type}
- */</span>
- Twig.logic.extendType = <span class="hljs-function"><span class="hljs-keyword">function</span> (<span class="hljs-params">type, value</span>) </span>{
- value = value || (<span class="hljs-string">"Twig.logic.type"</span> + type);
- Twig.logic.type[type] = value;
- };
-
- <span class="hljs-comment">/**
- * Extend the logic parsing functionality with a new token definition.
- *
- * // Define a new tag
- * Twig.logic.extend({
- * type: Twig.logic.type.{type},
- * // The pattern to match for this token
- * regex: ...,
- * // What token types can follow this token, leave blank if any.
- * next: [ ... ]
- * // Create and return compiled version of the token
- * compile: function(token) { ... }
- * // Parse the compiled token with the context provided by the render call
- * // and whether this token chain is complete.
- * parse: function(token, context, chain) { ... }
- * });
- *
- * @param {Object} definition The new logic expression.
- */</span>
- Twig.logic.extend = <span class="hljs-function"><span class="hljs-keyword">function</span> (<span class="hljs-params">definition</span>) </span>{
-
- <span class="hljs-keyword">if</span> (!definition.type) {
- <span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> Twig.Error(<span class="hljs-string">"Unable to extend logic definition. No type provided for "</span> + definition);
- } <span class="hljs-keyword">else</span> {
- Twig.logic.extendType(definition.type);
- }
- Twig.logic.handler[definition.type] = definition;
- };</pre></div></div>
-
- </li>
-
-
- <li id="section-223">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-223">&#182;</a>
- </div>
- <p>Extend with built-in expressions</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">while</span> (Twig.logic.definitions.length &gt; <span class="hljs-number">0</span>) {
- Twig.logic.extend(Twig.logic.definitions.shift());
- }
-
- <span class="hljs-comment">/**
- * Compile a logic token into an object ready for parsing.
- *
- * @param {Object} raw_token An uncompiled logic token.
- *
- * @return {Object} A compiled logic token, ready for parsing.
- */</span>
- Twig.logic.compile = <span class="hljs-function"><span class="hljs-keyword">function</span> (<span class="hljs-params">raw_token</span>) </span>{
- <span class="hljs-keyword">var</span> expression = raw_token.value.trim(),
- token = Twig.logic.tokenize.apply(<span class="hljs-keyword">this</span>, [expression]),
- token_template = Twig.logic.handler[token.type];</pre></div></div>
-
- </li>
-
-
- <li id="section-224">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-224">&#182;</a>
- </div>
- <p>Check if the token needs compiling</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">if</span> (token_template.compile) {
- token = token_template.compile.apply(<span class="hljs-keyword">this</span>, [token]);
- Twig.log.trace(<span class="hljs-string">"Twig.logic.compile: "</span>, <span class="hljs-string">"Compiled logic token to "</span>, token);
- }
-
- <span class="hljs-keyword">return</span> token;
- };
-
- <span class="hljs-comment">/**
- * Tokenize logic expressions. This function matches token expressions against regular
- * expressions provided in token definitions provided with Twig.logic.extend.
- *
- * @param {string} expression the logic token expression to tokenize
- * (i.e. what's between {% and %})
- *
- * @return {Object} The matched token with type set to the token type and match to the regex match.
- */</span>
- Twig.logic.tokenize = <span class="hljs-function"><span class="hljs-keyword">function</span> (<span class="hljs-params">expression</span>) </span>{
- <span class="hljs-keyword">var</span> token = {},
- token_template_type = <span class="hljs-literal">null</span>,
- token_type = <span class="hljs-literal">null</span>,
- token_regex = <span class="hljs-literal">null</span>,
- regex_array = <span class="hljs-literal">null</span>,
- regex = <span class="hljs-literal">null</span>,
- match = <span class="hljs-literal">null</span>;</pre></div></div>
-
- </li>
-
-
- <li id="section-225">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-225">&#182;</a>
- </div>
- <p>Ignore whitespace around expressions.</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> expression = expression.trim();
-
- <span class="hljs-keyword">for</span> (token_template_type <span class="hljs-keyword">in</span> Twig.logic.handler) {
- <span class="hljs-keyword">if</span> (Twig.logic.handler.hasOwnProperty(token_template_type)) {</pre></div></div>
-
- </li>
-
-
- <li id="section-226">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-226">&#182;</a>
- </div>
- <p>Get the type and regex for this template type</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> token_type = Twig.logic.handler[token_template_type].type;
- token_regex = Twig.logic.handler[token_template_type].regex;</pre></div></div>
-
- </li>
-
-
- <li id="section-227">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-227">&#182;</a>
- </div>
- <p>Handle multiple regular expressions per type.</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> regex_array = [];
- <span class="hljs-keyword">if</span> (token_regex <span class="hljs-keyword">instanceof</span> <span class="hljs-built_in">Array</span>) {
- regex_array = token_regex;
- } <span class="hljs-keyword">else</span> {
- regex_array.push(token_regex);
- }</pre></div></div>
-
- </li>
-
-
- <li id="section-228">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-228">&#182;</a>
- </div>
- <p>Check regular expressions in the order they were specified in the definition.</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">while</span> (regex_array.length &gt; <span class="hljs-number">0</span>) {
- regex = regex_array.shift();
- match = regex.exec(expression.trim());
- <span class="hljs-keyword">if</span> (match !== <span class="hljs-literal">null</span>) {
- token.type = token_type;
- token.match = match;
- Twig.log.trace(<span class="hljs-string">"Twig.logic.tokenize: "</span>, <span class="hljs-string">"Matched a "</span>, token_type, <span class="hljs-string">" regular expression of "</span>, match);
- <span class="hljs-keyword">return</span> token;
- }
- }
- }
- }</pre></div></div>
-
- </li>
-
-
- <li id="section-229">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-229">&#182;</a>
- </div>
- <p>No regex matches</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> Twig.Error(<span class="hljs-string">"Unable to parse '"</span> + expression.trim() + <span class="hljs-string">"'"</span>);
- };
-
- <span class="hljs-comment">/**
- * Parse a logic token within a given context.
- *
- * What are logic chains?
- * Logic chains represent a series of tokens that are connected,
- * for example:
- * {% if ... %} {% else %} {% endif %}
- *
- * The chain parameter is used to signify if a chain is open of closed.
- * open:
- * More tokens in this chain should be parsed.
- * closed:
- * This token chain has completed parsing and any additional
- * tokens (else, elseif, etc...) should be ignored.
- *
- * @param {Object} token The compiled token.
- * @param {Object} context The render context.
- * @param {boolean} chain Is this an open logic chain. If false, that means a
- * chain is closed and no further cases should be parsed.
- */</span>
- Twig.logic.parse = <span class="hljs-function"><span class="hljs-keyword">function</span> (<span class="hljs-params">token, context, chain</span>) </span>{
- <span class="hljs-keyword">var</span> output = <span class="hljs-string">''</span>,
- token_template;
-
- context = context || { };
-
- Twig.log.debug(<span class="hljs-string">"Twig.logic.parse: "</span>, <span class="hljs-string">"Parsing logic token "</span>, token);
-
- token_template = Twig.logic.handler[token.type];
-
- <span class="hljs-keyword">if</span> (token_template.parse) {
- output = token_template.parse.apply(<span class="hljs-keyword">this</span>, [token, context, chain]);
- }
- <span class="hljs-keyword">return</span> output;
- };
-
- <span class="hljs-keyword">return</span> Twig;
-
-})(Twig || { });</pre></div></div>
-
- </li>
-
-
- <li id="section-230">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-230">&#182;</a>
- </div>
- <pre><code>Twig.js
-Available under the BSD <span class="hljs-number">2</span>-Clause License
-https:<span class="hljs-comment">//github.com/justjohn/twig.js</span>
-</code></pre>
- </div>
-
- </li>
-
-
- <li id="section-231">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-231">&#182;</a>
- </div>
- <h2 id="twig-expression-js">twig.expression.js</h2>
-<p>This file handles tokenizing, compiling and parsing expressions.</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre><span class="hljs-keyword">var</span> Twig = (<span class="hljs-function"><span class="hljs-keyword">function</span> (<span class="hljs-params">Twig</span>) </span>{
-<span class="hljs-meta"> "use strict"</span>;
-
- <span class="hljs-comment">/**
- * Namespace for expression handling.
- */</span>
- Twig.expression = { };
-
- <span class="hljs-comment">/**
- * Reserved word that can't be used as variable names.
- */</span>
- Twig.expression.reservedWords = [
- <span class="hljs-string">"true"</span>, <span class="hljs-string">"false"</span>, <span class="hljs-string">"null"</span>, <span class="hljs-string">"TRUE"</span>, <span class="hljs-string">"FALSE"</span>, <span class="hljs-string">"NULL"</span>, <span class="hljs-string">"_context"</span>
- ];
-
- <span class="hljs-comment">/**
- * The type of tokens used in expressions.
- */</span>
- Twig.expression.type = {
- comma: <span class="hljs-string">'Twig.expression.type.comma'</span>,
- operator: {
- unary: <span class="hljs-string">'Twig.expression.type.operator.unary'</span>,
- binary: <span class="hljs-string">'Twig.expression.type.operator.binary'</span>
- },
- string: <span class="hljs-string">'Twig.expression.type.string'</span>,
- bool: <span class="hljs-string">'Twig.expression.type.bool'</span>,
- array: {
- start: <span class="hljs-string">'Twig.expression.type.array.start'</span>,
- end: <span class="hljs-string">'Twig.expression.type.array.end'</span>
- },
- object: {
- start: <span class="hljs-string">'Twig.expression.type.object.start'</span>,
- end: <span class="hljs-string">'Twig.expression.type.object.end'</span>
- },
- parameter: {
- start: <span class="hljs-string">'Twig.expression.type.parameter.start'</span>,
- end: <span class="hljs-string">'Twig.expression.type.parameter.end'</span>
- },
- key: {
- period: <span class="hljs-string">'Twig.expression.type.key.period'</span>,
- brackets: <span class="hljs-string">'Twig.expression.type.key.brackets'</span>
- },
- filter: <span class="hljs-string">'Twig.expression.type.filter'</span>,
- _function: <span class="hljs-string">'Twig.expression.type._function'</span>,
- variable: <span class="hljs-string">'Twig.expression.type.variable'</span>,
- number: <span class="hljs-string">'Twig.expression.type.number'</span>,
- _null: <span class="hljs-string">'Twig.expression.type.null'</span>,
- context: <span class="hljs-string">'Twig.expression.type.context'</span>,
- test: <span class="hljs-string">'Twig.expression.type.test'</span>
- };
-
- Twig.expression.set = {</pre></div></div>
-
- </li>
-
-
- <li id="section-232">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-232">&#182;</a>
- </div>
- <p>What can follow an expression (in general)</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> operations: [
- Twig.expression.type.filter,
- Twig.expression.type.operator.unary,
- Twig.expression.type.operator.binary,
- Twig.expression.type.array.end,
- Twig.expression.type.object.end,
- Twig.expression.type.parameter.end,
- Twig.expression.type.comma,
- Twig.expression.type.test
- ],
- expressions: [
- Twig.expression.type._function,
- Twig.expression.type.bool,
- Twig.expression.type.string,
- Twig.expression.type.variable,
- Twig.expression.type.number,
- Twig.expression.type._null,
- Twig.expression.type.context,
- Twig.expression.type.parameter.start,
- Twig.expression.type.array.start,
- Twig.expression.type.object.start
- ]
- };</pre></div></div>
-
- </li>
-
-
- <li id="section-233">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-233">&#182;</a>
- </div>
- <p>Most expressions allow a ‘.’ or ‘[‘ after them, so we provide a convenience set</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> Twig.expression.set.operations_extended = Twig.expression.set.operations.concat([
- Twig.expression.type.key.period,
- Twig.expression.type.key.brackets]);</pre></div></div>
-
- </li>
-
-
- <li id="section-234">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-234">&#182;</a>
- </div>
- <p>Some commonly used compile and parse functions.</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> Twig.expression.fn = {
- compile: {
- push: <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">token, stack, output</span>) </span>{
- output.push(token);
- },
- push_both: <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">token, stack, output</span>) </span>{
- output.push(token);
- stack.push(token);
- }
- },
- parse: {
- push: <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">token, stack, context</span>) </span>{
- stack.push(token);
- },
- push_value: <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">token, stack, context</span>) </span>{
- stack.push(token.value);
- }
- }
- };</pre></div></div>
-
- </li>
-
-
- <li id="section-235">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-235">&#182;</a>
- </div>
- <p>The regular expressions and compile/parse logic used to match tokens in expressions.</p>
-<p>Properties:</p>
-<pre><code> type: The type <span class="hljs-keyword">of</span> expression <span class="hljs-keyword">this</span> matches
-
- regex: One or more regular expressions that matche the format <span class="hljs-keyword">of</span> the token.
-
- next: Valid tokens that can occur next <span class="hljs-keyword">in</span> the expression.
-</code></pre><p>Functions:</p>
-<pre><code> compile: A <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">that</span> <span class="hljs-title">compiles</span> <span class="hljs-title">the</span> <span class="hljs-title">raw</span> <span class="hljs-title">regular</span> <span class="hljs-title">expression</span> <span class="hljs-title">match</span> <span class="hljs-title">into</span> <span class="hljs-title">a</span> <span class="hljs-title">token</span>.
-
- <span class="hljs-title">parse</span>: <span class="hljs-title">A</span> <span class="hljs-title">function</span> <span class="hljs-title">that</span> <span class="hljs-title">parses</span> <span class="hljs-title">the</span> <span class="hljs-title">compiled</span> <span class="hljs-title">token</span> <span class="hljs-title">into</span> <span class="hljs-title">output</span>.</span>
-</code></pre>
- </div>
-
- <div class="content"><div class='highlight'><pre> Twig.expression.definitions = [
- {
- type: Twig.expression.type.test,
- regex: <span class="hljs-regexp">/^is\s+(not)?\s*([a-zA-Z_][a-zA-Z0-9_]*)/</span>,
- next: Twig.expression.set.operations.concat([Twig.expression.type.parameter.start]),
- compile: <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">token, stack, output</span>) </span>{
- token.filter = token.match[<span class="hljs-number">2</span>];
- token.modifier = token.match[<span class="hljs-number">1</span>];
- <span class="hljs-keyword">delete</span> token.match;
- <span class="hljs-keyword">delete</span> token.value;
- output.push(token);
- },
- parse: <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">token, stack, context</span>) </span>{
- <span class="hljs-keyword">var</span> value = stack.pop(),
- params = token.params &amp;&amp; Twig.expression.parse.apply(<span class="hljs-keyword">this</span>, [token.params, context]),
- result = Twig.test(token.filter, value, params);
-
- <span class="hljs-keyword">if</span> (token.modifier == <span class="hljs-string">'not'</span>) {
- stack.push(!result);
- } <span class="hljs-keyword">else</span> {
- stack.push(result);
- }
- }
- },
- {
- type: Twig.expression.type.comma,</pre></div></div>
-
- </li>
-
-
- <li id="section-236">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-236">&#182;</a>
- </div>
- <p>Match a comma</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> regex: <span class="hljs-regexp">/^,/</span>,
- next: Twig.expression.set.expressions.concat([Twig.expression.type.array.end, Twig.expression.type.object.end]),
- compile: <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">token, stack, output</span>) </span>{
- <span class="hljs-keyword">var</span> i = stack.length - <span class="hljs-number">1</span>,
- stack_token;
-
- <span class="hljs-keyword">delete</span> token.match;
- <span class="hljs-keyword">delete</span> token.value;</pre></div></div>
-
- </li>
-
-
- <li id="section-237">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-237">&#182;</a>
- </div>
- <p>pop tokens off the stack until the start of the object</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">for</span>(;i &gt;= <span class="hljs-number">0</span>; i--) {
- stack_token = stack.pop();
- <span class="hljs-keyword">if</span> (stack_token.type === Twig.expression.type.object.start
- || stack_token.type === Twig.expression.type.parameter.start
- || stack_token.type === Twig.expression.type.array.start) {
- stack.push(stack_token);
- <span class="hljs-keyword">break</span>;
- }
- output.push(stack_token);
- }
- output.push(token);
- }
- },
- {
- type: Twig.expression.type.operator.binary,</pre></div></div>
-
- </li>
-
-
- <li id="section-238">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-238">&#182;</a>
- </div>
- <p>Match any of +, <em>, /, -, %, ~, &lt;, &lt;=, &gt;, &gt;=, !=, ==, *</em>, ?, :, and, or, not</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> regex: <span class="hljs-regexp">/(^[\+\-~%\?\:]|^[!=]==?|^[!&lt;&gt;]=?|^\*\*?|^\/\/?|^and\s+|^or\s+|^in\s+|^not in\s+|^\.\.)/</span>,
- next: Twig.expression.set.expressions.concat([Twig.expression.type.operator.unary]),
- compile: <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">token, stack, output</span>) </span>{
- <span class="hljs-keyword">delete</span> token.match;
-
- token.value = token.value.trim();
- <span class="hljs-keyword">var</span> value = token.value,
- operator = Twig.expression.operator.lookup(value, token);
-
- Twig.log.trace(<span class="hljs-string">"Twig.expression.compile: "</span>, <span class="hljs-string">"Operator: "</span>, operator, <span class="hljs-string">" from "</span>, value);
-
- <span class="hljs-keyword">while</span> (stack.length &gt; <span class="hljs-number">0</span> &amp;&amp;
- (stack[stack.length<span class="hljs-number">-1</span>].type == Twig.expression.type.operator.unary || stack[stack.length<span class="hljs-number">-1</span>].type == Twig.expression.type.operator.binary) &amp;&amp;
- (
- (operator.associativity === Twig.expression.operator.leftToRight &amp;&amp;
- operator.precidence &gt;= stack[stack.length<span class="hljs-number">-1</span>].precidence) ||
-
- (operator.associativity === Twig.expression.operator.rightToLeft &amp;&amp;
- operator.precidence &gt; stack[stack.length<span class="hljs-number">-1</span>].precidence)
- )
- ) {
- <span class="hljs-keyword">var</span> temp = stack.pop();
- output.push(temp);
- }
-
- <span class="hljs-keyword">if</span> (value === <span class="hljs-string">":"</span>) {</pre></div></div>
-
- </li>
-
-
- <li id="section-239">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-239">&#182;</a>
- </div>
- <p>Check if this is a ternary or object key being set</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">if</span> (stack[stack.length - <span class="hljs-number">1</span>] &amp;&amp; stack[stack.length<span class="hljs-number">-1</span>].value === <span class="hljs-string">"?"</span>) {</pre></div></div>
-
- </li>
-
-
- <li id="section-240">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-240">&#182;</a>
- </div>
- <p>Continue as normal for a ternary</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> } <span class="hljs-keyword">else</span> {</pre></div></div>
-
- </li>
-
-
- <li id="section-241">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-241">&#182;</a>
- </div>
- <p>This is not a ternary so we push the token to the output where it can be handled
- when the assocated object is closed.</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">var</span> key_token = output.pop();
-
- <span class="hljs-keyword">if</span> (key_token.type === Twig.expression.type.string ||
- key_token.type === Twig.expression.type.variable) {
- token.key = key_token.value;
- } <span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span> (key_token.type === Twig.expression.type.number) {</pre></div></div>
-
- </li>
-
-
- <li id="section-242">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-242">&#182;</a>
- </div>
- <p>Convert integer keys into string keys</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> token.key = key_token.value.toString();
- } <span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span> (key_token.type === Twig.expression.type.parameter.end &amp;&amp;
- key_token.expression) {
- token.params = key_token.params;
- } <span class="hljs-keyword">else</span> {
- <span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> Twig.Error(<span class="hljs-string">"Unexpected value before ':' of "</span> + key_token.type + <span class="hljs-string">" = "</span> + key_token.value);
- }
-
- output.push(token);
- <span class="hljs-keyword">return</span>;
- }
- } <span class="hljs-keyword">else</span> {
- stack.push(operator);
- }
- },
- parse: <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">token, stack, context</span>) </span>{
- <span class="hljs-keyword">if</span> (token.key) {</pre></div></div>
-
- </li>
-
-
- <li id="section-243">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-243">&#182;</a>
- </div>
- <p>handle ternary ‘:’ operator</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> stack.push(token);
- } <span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span> (token.params) {</pre></div></div>
-
- </li>
-
-
- <li id="section-244">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-244">&#182;</a>
- </div>
- <p>handle “{(expression):value}”</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> token.key = Twig.expression.parse.apply(<span class="hljs-keyword">this</span>, [token.params, context]);
- stack.push(token);
- <span class="hljs-keyword">delete</span>(token.params);
- } <span class="hljs-keyword">else</span> {
- Twig.expression.operator.parse(token.value, stack);
- }
- }
- },
- {
- type: Twig.expression.type.operator.unary,</pre></div></div>
-
- </li>
-
-
- <li id="section-245">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-245">&#182;</a>
- </div>
- <p>Match any of not</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> regex: <span class="hljs-regexp">/(^not\s+)/</span>,
- next: Twig.expression.set.expressions,
- compile: <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">token, stack, output</span>) </span>{
- <span class="hljs-keyword">delete</span> token.match;
-
- token.value = token.value.trim();
- <span class="hljs-keyword">var</span> value = token.value,
- operator = Twig.expression.operator.lookup(value, token);
-
- Twig.log.trace(<span class="hljs-string">"Twig.expression.compile: "</span>, <span class="hljs-string">"Operator: "</span>, operator, <span class="hljs-string">" from "</span>, value);
-
- <span class="hljs-keyword">while</span> (stack.length &gt; <span class="hljs-number">0</span> &amp;&amp;
- (stack[stack.length<span class="hljs-number">-1</span>].type == Twig.expression.type.operator.unary || stack[stack.length<span class="hljs-number">-1</span>].type == Twig.expression.type.operator.binary) &amp;&amp;
- (
- (operator.associativity === Twig.expression.operator.leftToRight &amp;&amp;
- operator.precidence &gt;= stack[stack.length<span class="hljs-number">-1</span>].precidence) ||
-
- (operator.associativity === Twig.expression.operator.rightToLeft &amp;&amp;
- operator.precidence &gt; stack[stack.length<span class="hljs-number">-1</span>].precidence)
- )
- ) {
- <span class="hljs-keyword">var</span> temp = stack.pop();
- output.push(temp);
- }
-
- stack.push(operator);
- },
- parse: <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">token, stack, context</span>) </span>{
- Twig.expression.operator.parse(token.value, stack);
- }
- },
- {
- <span class="hljs-comment">/**
- * Match a string. This is anything between a pair of single or double quotes.
- */</span>
- type: Twig.expression.type.string,</pre></div></div>
-
- </li>
-
-
- <li id="section-246">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-246">&#182;</a>
- </div>
- <p>See: <a href="http://blog.stevenlevithan.com/archives/match-quoted-string">http://blog.stevenlevithan.com/archives/match-quoted-string</a></p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> regex: <span class="hljs-regexp">/^(["'])(?:(?=(\\?))\2[\s\S])*?\1/</span>,
- next: Twig.expression.set.operations,
- compile: <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">token, stack, output</span>) </span>{
- <span class="hljs-keyword">var</span> value = token.value;
- <span class="hljs-keyword">delete</span> token.match</pre></div></div>
-
- </li>
-
-
- <li id="section-247">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-247">&#182;</a>
- </div>
- <p>Remove the quotes from the string</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">if</span> (value.substring(<span class="hljs-number">0</span>, <span class="hljs-number">1</span>) === <span class="hljs-string">'"'</span>) {
- value = value.replace(<span class="hljs-string">'\\"'</span>, <span class="hljs-string">'"'</span>);
- } <span class="hljs-keyword">else</span> {
- value = value.replace(<span class="hljs-string">"\\'"</span>, <span class="hljs-string">"'"</span>);
- }
- token.value = value.substring(<span class="hljs-number">1</span>, value.length<span class="hljs-number">-1</span>).replace( <span class="hljs-regexp">/\\n/g</span>, <span class="hljs-string">"\n"</span> ).replace( <span class="hljs-regexp">/\\r/g</span>, <span class="hljs-string">"\r"</span> );
- Twig.log.trace(<span class="hljs-string">"Twig.expression.compile: "</span>, <span class="hljs-string">"String value: "</span>, token.value);
- output.push(token);
- },
- parse: Twig.expression.fn.parse.push_value
- },
- {
- <span class="hljs-comment">/**
- * Match a parameter set start.
- */</span>
- type: Twig.expression.type.parameter.start,
- regex: <span class="hljs-regexp">/^\(/</span>,
- next: Twig.expression.set.expressions.concat([Twig.expression.type.parameter.end]),
- compile: Twig.expression.fn.compile.push_both,
- parse: Twig.expression.fn.parse.push
- },
- {
- <span class="hljs-comment">/**
- * Match a parameter set end.
- */</span>
- type: Twig.expression.type.parameter.end,
- regex: <span class="hljs-regexp">/^\)/</span>,
- next: Twig.expression.set.operations_extended,
- compile: <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">token, stack, output</span>) </span>{
- <span class="hljs-keyword">var</span> stack_token,
- end_token = token;
-
- stack_token = stack.pop();
- <span class="hljs-keyword">while</span>(stack.length &gt; <span class="hljs-number">0</span> &amp;&amp; stack_token.type != Twig.expression.type.parameter.start) {
- output.push(stack_token);
- stack_token = stack.pop();
- }</pre></div></div>
-
- </li>
-
-
- <li id="section-248">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-248">&#182;</a>
- </div>
- <p>Move contents of parens into preceding filter</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">var</span> param_stack = [];
- <span class="hljs-keyword">while</span>(token.type !== Twig.expression.type.parameter.start) {</pre></div></div>
-
- </li>
-
-
- <li id="section-249">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-249">&#182;</a>
- </div>
- <p>Add token to arguments stack</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> param_stack.unshift(token);
- token = output.pop();
- }
- param_stack.unshift(token);
-
- <span class="hljs-keyword">var</span> is_expression = <span class="hljs-literal">false</span>;</pre></div></div>
-
- </li>
-
-
- <li id="section-250">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-250">&#182;</a>
- </div>
- <p>Get the token preceding the parameters</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> token = output[output.length<span class="hljs-number">-1</span>];
-
- <span class="hljs-keyword">if</span> (token === <span class="hljs-literal">undefined</span> ||
- (token.type !== Twig.expression.type._function &amp;&amp;
- token.type !== Twig.expression.type.filter &amp;&amp;
- token.type !== Twig.expression.type.test &amp;&amp;
- token.type !== Twig.expression.type.key.brackets &amp;&amp;
- token.type !== Twig.expression.type.key.period)) {
-
- end_token.expression = <span class="hljs-literal">true</span>;</pre></div></div>
-
- </li>
-
-
- <li id="section-251">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-251">&#182;</a>
- </div>
- <p>remove start and end token from stack</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> param_stack.pop();
- param_stack.shift();
-
- end_token.params = param_stack;
-
- output.push(end_token);
-
- } <span class="hljs-keyword">else</span> {
- end_token.expression = <span class="hljs-literal">false</span>;
- token.params = param_stack;
- }
- },
- parse: <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">token, stack, context</span>) </span>{
- <span class="hljs-keyword">var</span> new_array = [],
- array_ended = <span class="hljs-literal">false</span>,
- value = <span class="hljs-literal">null</span>;
-
- <span class="hljs-keyword">if</span> (token.expression) {
- value = Twig.expression.parse.apply(<span class="hljs-keyword">this</span>, [token.params, context])
- stack.push(value);
-
- } <span class="hljs-keyword">else</span> {
-
- <span class="hljs-keyword">while</span> (stack.length &gt; <span class="hljs-number">0</span>) {
- value = stack.pop();</pre></div></div>
-
- </li>
-
-
- <li id="section-252">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-252">&#182;</a>
- </div>
- <p>Push values into the array until the start of the array</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">if</span> (value &amp;&amp; value.type &amp;&amp; value.type == Twig.expression.type.parameter.start) {
- array_ended = <span class="hljs-literal">true</span>;
- <span class="hljs-keyword">break</span>;
- }
- new_array.unshift(value);
- }
-
- <span class="hljs-keyword">if</span> (!array_ended) {
- <span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> Twig.Error(<span class="hljs-string">"Expected end of parameter set."</span>);
- }
-
- stack.push(new_array);
- }
- }
- },
- {
- <span class="hljs-comment">/**
- * Match an array start.
- */</span>
- type: Twig.expression.type.array.start,
- regex: <span class="hljs-regexp">/^\[/</span>,
- next: Twig.expression.set.expressions.concat([Twig.expression.type.array.end]),
- compile: Twig.expression.fn.compile.push_both,
- parse: Twig.expression.fn.parse.push
- },
- {
- <span class="hljs-comment">/**
- * Match an array end.
- */</span>
- type: Twig.expression.type.array.end,
- regex: <span class="hljs-regexp">/^\]/</span>,
- next: Twig.expression.set.operations_extended,
- compile: <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">token, stack, output</span>) </span>{
- <span class="hljs-keyword">var</span> i = stack.length - <span class="hljs-number">1</span>,
- stack_token;</pre></div></div>
-
- </li>
-
-
- <li id="section-253">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-253">&#182;</a>
- </div>
- <p>pop tokens off the stack until the start of the object</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">for</span>(;i &gt;= <span class="hljs-number">0</span>; i--) {
- stack_token = stack.pop();
- <span class="hljs-keyword">if</span> (stack_token.type === Twig.expression.type.array.start) {
- <span class="hljs-keyword">break</span>;
- }
- output.push(stack_token);
- }
- output.push(token);
- },
- parse: <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">token, stack, context</span>) </span>{
- <span class="hljs-keyword">var</span> new_array = [],
- array_ended = <span class="hljs-literal">false</span>,
- value = <span class="hljs-literal">null</span>;
-
- <span class="hljs-keyword">while</span> (stack.length &gt; <span class="hljs-number">0</span>) {
- value = stack.pop();</pre></div></div>
-
- </li>
-
-
- <li id="section-254">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-254">&#182;</a>
- </div>
- <p>Push values into the array until the start of the array</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">if</span> (value.type &amp;&amp; value.type == Twig.expression.type.array.start) {
- array_ended = <span class="hljs-literal">true</span>;
- <span class="hljs-keyword">break</span>;
- }
- new_array.unshift(value);
- }
- <span class="hljs-keyword">if</span> (!array_ended) {
- <span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> Twig.Error(<span class="hljs-string">"Expected end of array."</span>);
- }
-
- stack.push(new_array);
- }
- },</pre></div></div>
-
- </li>
-
-
- <li id="section-255">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-255">&#182;</a>
- </div>
- <p>Token that represents the start of a hash map ‘}’</p>
-<p>Hash maps take the form:
- { “key”: ‘value’, “another_key”: item }</p>
-<p>Keys must be quoted (either single or double) and values can be any expression.</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> {
- type: Twig.expression.type.object.start,
- regex: <span class="hljs-regexp">/^\{/</span>,
- next: Twig.expression.set.expressions.concat([Twig.expression.type.object.end]),
- compile: Twig.expression.fn.compile.push_both,
- parse: Twig.expression.fn.parse.push
- },</pre></div></div>
-
- </li>
-
-
- <li id="section-256">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-256">&#182;</a>
- </div>
- <p>Token that represents the end of a Hash Map ‘}’</p>
-<p>This is where the logic for building the internal
-representation of a hash map is defined.</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> {
- type: Twig.expression.type.object.end,
- regex: <span class="hljs-regexp">/^\}/</span>,
- next: Twig.expression.set.operations_extended,
- compile: <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">token, stack, output</span>) </span>{
- <span class="hljs-keyword">var</span> i = stack.length<span class="hljs-number">-1</span>,
- stack_token;</pre></div></div>
-
- </li>
-
-
- <li id="section-257">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-257">&#182;</a>
- </div>
- <p>pop tokens off the stack until the start of the object</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">for</span>(;i &gt;= <span class="hljs-number">0</span>; i--) {
- stack_token = stack.pop();
- <span class="hljs-keyword">if</span> (stack_token &amp;&amp; stack_token.type === Twig.expression.type.object.start) {
- <span class="hljs-keyword">break</span>;
- }
- output.push(stack_token);
- }
- output.push(token);
- },
- parse: <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">end_token, stack, context</span>) </span>{
- <span class="hljs-keyword">var</span> new_object = {},
- object_ended = <span class="hljs-literal">false</span>,
- token = <span class="hljs-literal">null</span>,
- token_key = <span class="hljs-literal">null</span>,
- has_value = <span class="hljs-literal">false</span>,
- value = <span class="hljs-literal">null</span>;
-
- <span class="hljs-keyword">while</span> (stack.length &gt; <span class="hljs-number">0</span>) {
- token = stack.pop();</pre></div></div>
-
- </li>
-
-
- <li id="section-258">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-258">&#182;</a>
- </div>
- <p>Push values into the array until the start of the object</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">if</span> (token &amp;&amp; token.type &amp;&amp; token.type === Twig.expression.type.object.start) {
- object_ended = <span class="hljs-literal">true</span>;
- <span class="hljs-keyword">break</span>;
- }
- <span class="hljs-keyword">if</span> (token &amp;&amp; token.type &amp;&amp; (token.type === Twig.expression.type.operator.binary || token.type === Twig.expression.type.operator.unary) &amp;&amp; token.key) {
- <span class="hljs-keyword">if</span> (!has_value) {
- <span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> Twig.Error(<span class="hljs-string">"Missing value for key '"</span> + token.key + <span class="hljs-string">"' in object definition."</span>);
- }
- new_object[token.key] = value;</pre></div></div>
-
- </li>
-
-
- <li id="section-259">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-259">&#182;</a>
- </div>
- <p>Preserve the order that elements are added to the map
-This is necessary since JavaScript objects don’t
-guarantee the order of keys</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">if</span> (new_object._keys === <span class="hljs-literal">undefined</span>) new_object._keys = [];
- new_object._keys.unshift(token.key);</pre></div></div>
-
- </li>
-
-
- <li id="section-260">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-260">&#182;</a>
- </div>
- <p>reset value check</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> value = <span class="hljs-literal">null</span>;
- has_value = <span class="hljs-literal">false</span>;
-
- } <span class="hljs-keyword">else</span> {
- has_value = <span class="hljs-literal">true</span>;
- value = token;
- }
- }
- <span class="hljs-keyword">if</span> (!object_ended) {
- <span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> Twig.Error(<span class="hljs-string">"Unexpected end of object."</span>);
- }
-
- stack.push(new_object);
- }
- },</pre></div></div>
-
- </li>
-
-
- <li id="section-261">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-261">&#182;</a>
- </div>
- <p>Token representing a filter</p>
-<p>Filters can follow any expression and take the form:
- expression|filter(optional, args)</p>
-<p>Filter parsing is done in the Twig.filters namespace.</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> {
- type: Twig.expression.type.filter,</pre></div></div>
-
- </li>
-
-
- <li id="section-262">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-262">&#182;</a>
- </div>
- <p>match a | then a letter or <em>, then any number of letters, numbers, </em> or -</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> regex: <span class="hljs-regexp">/^\|\s?([a-zA-Z_][a-zA-Z0-9_\-]*)/</span>,
- next: Twig.expression.set.operations_extended.concat([
- Twig.expression.type.parameter.start]),
- compile: <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">token, stack, output</span>) </span>{
- token.value = token.match[<span class="hljs-number">1</span>];
- output.push(token);
- },
- parse: <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">token, stack, context</span>) </span>{
- <span class="hljs-keyword">var</span> input = stack.pop(),
- params = token.params &amp;&amp; Twig.expression.parse.apply(<span class="hljs-keyword">this</span>, [token.params, context]);
-
- stack.push(Twig.filter.apply(<span class="hljs-keyword">this</span>, [token.value, input, params]));
- }
- },
- {
- type: Twig.expression.type._function,</pre></div></div>
-
- </li>
-
-
- <li id="section-263">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-263">&#182;</a>
- </div>
- <p>match any letter or <em>, then any number of letters, numbers, </em> or - followed by (</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> regex: <span class="hljs-regexp">/^([a-zA-Z_][a-zA-Z0-9_]*)\s*\(/</span>,
- next: Twig.expression.type.parameter.start,
- transform: <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">match, tokens</span>) </span>{
- <span class="hljs-keyword">return</span> <span class="hljs-string">'('</span>;
- },
- compile: <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">token, stack, output</span>) </span>{
- <span class="hljs-keyword">var</span> fn = token.match[<span class="hljs-number">1</span>];
- token.fn = fn;</pre></div></div>
-
- </li>
-
-
- <li id="section-264">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-264">&#182;</a>
- </div>
- <p>cleanup token</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">delete</span> token.match;
- <span class="hljs-keyword">delete</span> token.value;
-
- output.push(token);
- },
- parse: <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">token, stack, context</span>) </span>{
- <span class="hljs-keyword">var</span> params = token.params &amp;&amp; Twig.expression.parse.apply(<span class="hljs-keyword">this</span>, [token.params, context]),
- fn = token.fn,
- value;
-
- <span class="hljs-keyword">if</span> (Twig.functions[fn]) {</pre></div></div>
-
- </li>
-
-
- <li id="section-265">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-265">&#182;</a>
- </div>
- <p>Get the function from the built-in functions</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> value = Twig.functions[fn].apply(<span class="hljs-keyword">this</span>, params);
-
- } <span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span> (<span class="hljs-keyword">typeof</span> context[fn] == <span class="hljs-string">'function'</span>) {</pre></div></div>
-
- </li>
-
-
- <li id="section-266">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-266">&#182;</a>
- </div>
- <p>Get the function from the user/context defined functions</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> value = context[fn].apply(context, params);
-
- } <span class="hljs-keyword">else</span> {
- <span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> Twig.Error(fn + <span class="hljs-string">' function does not exist and is not defined in the context'</span>);
- }
-
- stack.push(value);
- }
- },</pre></div></div>
-
- </li>
-
-
- <li id="section-267">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-267">&#182;</a>
- </div>
- <p>Token representing a variable.</p>
-<p>Variables can contain letters, numbers, underscores and
-dashes, but must start with a letter or underscore.</p>
-<p>Variables are retrieved from the render context and take
-the value of ‘undefined’ if the given variable doesn’t
-exist in the context.</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> {
- type: Twig.expression.type.variable,</pre></div></div>
-
- </li>
-
-
- <li id="section-268">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-268">&#182;</a>
- </div>
- <p>match any letter or <em>, then any number of letters, numbers, </em> or -</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> regex: <span class="hljs-regexp">/^[a-zA-Z_][a-zA-Z0-9_]*/</span>,
- next: Twig.expression.set.operations_extended.concat([
- Twig.expression.type.parameter.start]),
- compile: Twig.expression.fn.compile.push,
- validate: <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">match, tokens</span>) </span>{
- <span class="hljs-keyword">return</span> (Twig.indexOf(Twig.expression.reservedWords, match[<span class="hljs-number">0</span>]) &lt; <span class="hljs-number">0</span>);
- },
- parse: <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">token, stack, context</span>) </span>{</pre></div></div>
-
- </li>
-
-
- <li id="section-269">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-269">&#182;</a>
- </div>
- <p>Get the variable from the context</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">var</span> value = Twig.expression.resolve(context[token.value], context);
- stack.push(value);
- }
- },
- {
- type: Twig.expression.type.key.period,
- regex: <span class="hljs-regexp">/^\.([a-zA-Z0-9_]+)/</span>,
- next: Twig.expression.set.operations_extended.concat([
- Twig.expression.type.parameter.start]),
- compile: <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">token, stack, output</span>) </span>{
- token.key = token.match[<span class="hljs-number">1</span>];
- <span class="hljs-keyword">delete</span> token.match;
- <span class="hljs-keyword">delete</span> token.value;
-
- output.push(token);
- },
- parse: <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">token, stack, context</span>) </span>{
- <span class="hljs-keyword">var</span> params = token.params &amp;&amp; Twig.expression.parse.apply(<span class="hljs-keyword">this</span>, [token.params, context]),
- key = token.key,
- object = stack.pop(),
- value;
-
- <span class="hljs-keyword">if</span> (object === <span class="hljs-literal">null</span> || object === <span class="hljs-literal">undefined</span>) {
- <span class="hljs-keyword">if</span> (<span class="hljs-keyword">this</span>.options.strict_variables) {
- <span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> Twig.Error(<span class="hljs-string">"Can't access a key "</span> + key + <span class="hljs-string">" on an null or undefined object."</span>);
- } <span class="hljs-keyword">else</span> {
- <span class="hljs-keyword">return</span> <span class="hljs-literal">null</span>;
- }
- }
-
- <span class="hljs-keyword">var</span> capitalize = <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">value</span>) </span>{<span class="hljs-keyword">return</span> value.substr(<span class="hljs-number">0</span>, <span class="hljs-number">1</span>).toUpperCase() + value.substr(<span class="hljs-number">1</span>);};</pre></div></div>
-
- </li>
-
-
- <li id="section-270">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-270">&#182;</a>
- </div>
- <p>Get the variable from the context</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">if</span> (<span class="hljs-keyword">typeof</span> object === <span class="hljs-string">'object'</span> &amp;&amp; key <span class="hljs-keyword">in</span> object) {
- value = object[key];
- } <span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span> (object[<span class="hljs-string">"get"</span>+capitalize(key)] !== <span class="hljs-literal">undefined</span>) {
- value = object[<span class="hljs-string">"get"</span>+capitalize(key)];
- } <span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span> (object[<span class="hljs-string">"is"</span>+capitalize(key)] !== <span class="hljs-literal">undefined</span>) {
- value = object[<span class="hljs-string">"is"</span>+capitalize(key)];
- } <span class="hljs-keyword">else</span> {
- value = <span class="hljs-literal">undefined</span>;
- }
- stack.push(Twig.expression.resolve(value, object, params));
- }
- },
- {
- type: Twig.expression.type.key.brackets,
- regex: <span class="hljs-regexp">/^\[([^\]]*)\]/</span>,
- next: Twig.expression.set.operations_extended.concat([
- Twig.expression.type.parameter.start]),
- compile: <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">token, stack, output</span>) </span>{
- <span class="hljs-keyword">var</span> match = token.match[<span class="hljs-number">1</span>];
- <span class="hljs-keyword">delete</span> token.value;
- <span class="hljs-keyword">delete</span> token.match;</pre></div></div>
-
- </li>
-
-
- <li id="section-271">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-271">&#182;</a>
- </div>
- <p>The expression stack for the key</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> token.stack = Twig.expression.compile({
- value: match
- }).stack;
-
- output.push(token);
- },
- parse: <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">token, stack, context</span>) </span>{</pre></div></div>
-
- </li>
-
-
- <li id="section-272">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-272">&#182;</a>
- </div>
- <p>Evaluate key</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">var</span> params = token.params &amp;&amp; Twig.expression.parse.apply(<span class="hljs-keyword">this</span>, [token.params, context]),
- key = Twig.expression.parse.apply(<span class="hljs-keyword">this</span>, [token.stack, context]),
- object = stack.pop(),
- value;
-
- <span class="hljs-keyword">if</span> (object === <span class="hljs-literal">null</span> || object === <span class="hljs-literal">undefined</span>) {
- <span class="hljs-keyword">if</span> (<span class="hljs-keyword">this</span>.options.strict_variables) {
- <span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> Twig.Error(<span class="hljs-string">"Can't access a key "</span> + key + <span class="hljs-string">" on an null or undefined object."</span>);
- } <span class="hljs-keyword">else</span> {
- <span class="hljs-keyword">return</span> <span class="hljs-literal">null</span>;
- }
- }</pre></div></div>
-
- </li>
-
-
- <li id="section-273">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-273">&#182;</a>
- </div>
- <p>Get the variable from the context</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">if</span> (<span class="hljs-keyword">typeof</span> object === <span class="hljs-string">'object'</span> &amp;&amp; key <span class="hljs-keyword">in</span> object) {
- value = object[key];
- } <span class="hljs-keyword">else</span> {
- value = <span class="hljs-literal">null</span>;
- }
- stack.push(Twig.expression.resolve(value, object, params));
- }
- },
- {
- <span class="hljs-comment">/**
- * Match a null value.
- */</span>
- type: Twig.expression.type._null,</pre></div></div>
-
- </li>
-
-
- <li id="section-274">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-274">&#182;</a>
- </div>
- <p>match a number</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> regex: <span class="hljs-regexp">/^(null|NULL|none|NONE)/</span>,
- next: Twig.expression.set.operations,
- compile: <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">token, stack, output</span>) </span>{
- <span class="hljs-keyword">delete</span> token.match;
- token.value = <span class="hljs-literal">null</span>;
- output.push(token);
- },
- parse: Twig.expression.fn.parse.push_value
- },
- {
- <span class="hljs-comment">/**
- * Match the context
- */</span>
- type: Twig.expression.type.context,
- regex: <span class="hljs-regexp">/^_context/</span>,
- next: Twig.expression.set.operations_extended.concat([
- Twig.expression.type.parameter.start]),
- compile: Twig.expression.fn.compile.push,
- parse: <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">token, stack, context</span>) </span>{
- stack.push(context);
- }
- },
- {
- <span class="hljs-comment">/**
- * Match a number (integer or decimal)
- */</span>
- type: Twig.expression.type.number,</pre></div></div>
-
- </li>
-
-
- <li id="section-275">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-275">&#182;</a>
- </div>
- <p>match a number</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> regex: <span class="hljs-regexp">/^\-?\d+(\.\d+)?/</span>,
- next: Twig.expression.set.operations,
- compile: <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">token, stack, output</span>) </span>{
- token.value = <span class="hljs-built_in">Number</span>(token.value);
- output.push(token);
- },
- parse: Twig.expression.fn.parse.push_value
- },
- {
- <span class="hljs-comment">/**
- * Match a boolean
- */</span>
- type: Twig.expression.type.bool,
- regex: <span class="hljs-regexp">/^(true|TRUE|false|FALSE)/</span>,
- next: Twig.expression.set.operations,
- compile: <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">token, stack, output</span>) </span>{
- token.value = (token.match[<span class="hljs-number">0</span>].toLowerCase( ) === <span class="hljs-string">"true"</span>);
- <span class="hljs-keyword">delete</span> token.match;
- output.push(token);
- },
- parse: Twig.expression.fn.parse.push_value
- }
- ];
-
- <span class="hljs-comment">/**
- * Resolve a context value.
- *
- * If the value is a function, it is executed with a context parameter.
- *
- * @param {string} key The context object key.
- * @param {Object} context The render context.
- */</span>
- Twig.expression.resolve = <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">value, context, params</span>) </span>{
- <span class="hljs-keyword">if</span> (<span class="hljs-keyword">typeof</span> value == <span class="hljs-string">'function'</span>) {
- <span class="hljs-keyword">return</span> value.apply(context, params || []);
- } <span class="hljs-keyword">else</span> {
- <span class="hljs-keyword">return</span> value;
- }
- };
-
- <span class="hljs-comment">/**
- * Registry for logic handlers.
- */</span>
- Twig.expression.handler = {};
-
- <span class="hljs-comment">/**
- * Define a new expression type, available at Twig.logic.type.{type}
- *
- * @param {string} type The name of the new type.
- */</span>
- Twig.expression.extendType = <span class="hljs-function"><span class="hljs-keyword">function</span> (<span class="hljs-params">type</span>) </span>{
- Twig.expression.type[type] = <span class="hljs-string">"Twig.expression.type."</span> + type;
- };
-
- <span class="hljs-comment">/**
- * Extend the expression parsing functionality with a new definition.
- *
- * Token definitions follow this format:
- * {
- * type: One of Twig.expression.type.[type], either pre-defined or added using
- * Twig.expression.extendType
- *
- * next: Array of types from Twig.expression.type that can follow this token,
- *
- * regex: A regex or array of regex's that should match the token.
- *
- * compile: function(token, stack, output) called when this token is being compiled.
- * Should return an object with stack and output set.
- *
- * parse: function(token, stack, context) called when this token is being parsed.
- * Should return an object with stack and context set.
- * }
- *
- * @param {Object} definition A token definition.
- */</span>
- Twig.expression.extend = <span class="hljs-function"><span class="hljs-keyword">function</span> (<span class="hljs-params">definition</span>) </span>{
- <span class="hljs-keyword">if</span> (!definition.type) {
- <span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> Twig.Error(<span class="hljs-string">"Unable to extend logic definition. No type provided for "</span> + definition);
- }
- Twig.expression.handler[definition.type] = definition;
- };</pre></div></div>
-
- </li>
-
-
- <li id="section-276">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-276">&#182;</a>
- </div>
- <p>Extend with built-in expressions</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">while</span> (Twig.expression.definitions.length &gt; <span class="hljs-number">0</span>) {
- Twig.expression.extend(Twig.expression.definitions.shift());
- }
-
- <span class="hljs-comment">/**
- * Break an expression into tokens defined in Twig.expression.definitions.
- *
- * @param {string} expression The string to tokenize.
- *
- * @return {Array} An array of tokens.
- */</span>
- Twig.expression.tokenize = <span class="hljs-function"><span class="hljs-keyword">function</span> (<span class="hljs-params">expression</span>) </span>{
- <span class="hljs-keyword">var</span> tokens = [],</pre></div></div>
-
- </li>
-
-
- <li id="section-277">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-277">&#182;</a>
- </div>
- <p>Keep an offset of the location in the expression for error messages.</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> exp_offset = <span class="hljs-number">0</span>,</pre></div></div>
-
- </li>
-
-
- <li id="section-278">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-278">&#182;</a>
- </div>
- <p>The valid next tokens of the previous token</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> next = <span class="hljs-literal">null</span>,</pre></div></div>
-
- </li>
-
-
- <li id="section-279">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-279">&#182;</a>
- </div>
- <p>Match information</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> type, regex, regex_array,</pre></div></div>
-
- </li>
-
-
- <li id="section-280">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-280">&#182;</a>
- </div>
- <p>The possible next token for the match</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> token_next,</pre></div></div>
-
- </li>
-
-
- <li id="section-281">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-281">&#182;</a>
- </div>
- <p>Has a match been found from the definitions</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> match_found, invalid_matches = [], match_function;
-
- match_function = <span class="hljs-function"><span class="hljs-keyword">function</span> (<span class="hljs-params"></span>) </span>{
- <span class="hljs-keyword">var</span> match = <span class="hljs-built_in">Array</span>.prototype.slice.apply(<span class="hljs-built_in">arguments</span>),
- string = match.pop(),
- offset = match.pop();
-
- Twig.log.trace(<span class="hljs-string">"Twig.expression.tokenize"</span>,
- <span class="hljs-string">"Matched a "</span>, type, <span class="hljs-string">" regular expression of "</span>, match);
-
- <span class="hljs-keyword">if</span> (next &amp;&amp; Twig.indexOf(next, type) &lt; <span class="hljs-number">0</span>) {
- invalid_matches.push(
- type + <span class="hljs-string">" cannot follow a "</span> + tokens[tokens.length - <span class="hljs-number">1</span>].type +
- <span class="hljs-string">" at template:"</span> + exp_offset + <span class="hljs-string">" near '"</span> + match[<span class="hljs-number">0</span>].substring(<span class="hljs-number">0</span>, <span class="hljs-number">20</span>) +
- <span class="hljs-string">"...'"</span>
- );</pre></div></div>
-
- </li>
-
-
- <li id="section-282">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-282">&#182;</a>
- </div>
- <p>Not a match, don’t change the expression</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">return</span> match[<span class="hljs-number">0</span>];
- }</pre></div></div>
-
- </li>
-
-
- <li id="section-283">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-283">&#182;</a>
- </div>
- <p>Validate the token if a validation function is provided</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">if</span> (Twig.expression.handler[type].validate &amp;&amp;
- !Twig.expression.handler[type].validate(match, tokens)) {
- <span class="hljs-keyword">return</span> match[<span class="hljs-number">0</span>];
- }
-
- invalid_matches = [];
-
- tokens.push({
- type: type,
- value: match[<span class="hljs-number">0</span>],
- match: match
- });
-
- match_found = <span class="hljs-literal">true</span>;
- next = token_next;
- exp_offset += match[<span class="hljs-number">0</span>].length;</pre></div></div>
-
- </li>
-
-
- <li id="section-284">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-284">&#182;</a>
- </div>
- <p>Does the token need to return output back to the expression string
-e.g. a function match of cycle( might return the ‘(‘ back to the expression
-This allows look-ahead to differentiate between token types (e.g. functions and variable names)</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">if</span> (Twig.expression.handler[type].transform) {
- <span class="hljs-keyword">return</span> Twig.expression.handler[type].transform(match, tokens);
- }
- <span class="hljs-keyword">return</span> <span class="hljs-string">''</span>;
- };
-
- Twig.log.debug(<span class="hljs-string">"Twig.expression.tokenize"</span>, <span class="hljs-string">"Tokenizing expression "</span>, expression);
-
- <span class="hljs-keyword">while</span> (expression.length &gt; <span class="hljs-number">0</span>) {
- expression = expression.trim();
- <span class="hljs-keyword">for</span> (type <span class="hljs-keyword">in</span> Twig.expression.handler) {
- <span class="hljs-keyword">if</span> (Twig.expression.handler.hasOwnProperty(type)) {
- token_next = Twig.expression.handler[type].next;
- regex = Twig.expression.handler[type].regex;</pre></div></div>
-
- </li>
-
-
- <li id="section-285">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-285">&#182;</a>
- </div>
- <p>Twig.log.trace(“Checking type “, type, “ on “, expression);</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">if</span> (regex <span class="hljs-keyword">instanceof</span> <span class="hljs-built_in">Array</span>) {
- regex_array = regex;
- } <span class="hljs-keyword">else</span> {
- regex_array = [regex];
- }
-
- match_found = <span class="hljs-literal">false</span>;
- <span class="hljs-keyword">while</span> (regex_array.length &gt; <span class="hljs-number">0</span>) {
- regex = regex_array.pop();
- expression = expression.replace(regex, match_function);
- }</pre></div></div>
-
- </li>
-
-
- <li id="section-286">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-286">&#182;</a>
- </div>
- <p>An expression token has been matched. Break the for loop and start trying to
- match the next template (if expression isn’t empty.)</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">if</span> (match_found) {
- <span class="hljs-keyword">break</span>;
- }
- }
- }
- <span class="hljs-keyword">if</span> (!match_found) {
- <span class="hljs-keyword">if</span> (invalid_matches.length &gt; <span class="hljs-number">0</span>) {
- <span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> Twig.Error(invalid_matches.join(<span class="hljs-string">" OR "</span>));
- } <span class="hljs-keyword">else</span> {
- <span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> Twig.Error(<span class="hljs-string">"Unable to parse '"</span> + expression + <span class="hljs-string">"' at template position"</span> + exp_offset);
- }
- }
- }
-
- Twig.log.trace(<span class="hljs-string">"Twig.expression.tokenize"</span>, <span class="hljs-string">"Tokenized to "</span>, tokens);
- <span class="hljs-keyword">return</span> tokens;
- };
-
- <span class="hljs-comment">/**
- * Compile an expression token.
- *
- * @param {Object} raw_token The uncompiled token.
- *
- * @return {Object} The compiled token.
- */</span>
- Twig.expression.compile = <span class="hljs-function"><span class="hljs-keyword">function</span> (<span class="hljs-params">raw_token</span>) </span>{
- <span class="hljs-keyword">var</span> expression = raw_token.value,</pre></div></div>
-
- </li>
-
-
- <li id="section-287">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-287">&#182;</a>
- </div>
- <p>Tokenize expression</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> tokens = Twig.expression.tokenize(expression),
- token = <span class="hljs-literal">null</span>,
- output = [],
- stack = [],
- token_template = <span class="hljs-literal">null</span>;
-
- Twig.log.trace(<span class="hljs-string">"Twig.expression.compile: "</span>, <span class="hljs-string">"Compiling "</span>, expression);</pre></div></div>
-
- </li>
-
-
- <li id="section-288">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-288">&#182;</a>
- </div>
- <p>Push tokens into RPN stack using the Sunting-yard algorithm
-See <a href="http://en.wikipedia.org/wiki/Shunting_yard_algorithm">http://en.wikipedia.org/wiki/Shunting_yard_algorithm</a></p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre>
- <span class="hljs-keyword">while</span> (tokens.length &gt; <span class="hljs-number">0</span>) {
- token = tokens.shift();
- token_template = Twig.expression.handler[token.type];
-
- Twig.log.trace(<span class="hljs-string">"Twig.expression.compile: "</span>, <span class="hljs-string">"Compiling "</span>, token);</pre></div></div>
-
- </li>
-
-
- <li id="section-289">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-289">&#182;</a>
- </div>
- <p>Compile the template</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> token_template.compile &amp;&amp; token_template.compile(token, stack, output);
-
- Twig.log.trace(<span class="hljs-string">"Twig.expression.compile: "</span>, <span class="hljs-string">"Stack is"</span>, stack);
- Twig.log.trace(<span class="hljs-string">"Twig.expression.compile: "</span>, <span class="hljs-string">"Output is"</span>, output);
- }
-
- <span class="hljs-keyword">while</span>(stack.length &gt; <span class="hljs-number">0</span>) {
- output.push(stack.pop());
- }
-
- Twig.log.trace(<span class="hljs-string">"Twig.expression.compile: "</span>, <span class="hljs-string">"Final output is"</span>, output);
-
- raw_token.stack = output;
- <span class="hljs-keyword">delete</span> raw_token.value;
-
- <span class="hljs-keyword">return</span> raw_token;
- };
-
-
- <span class="hljs-comment">/**
- * Parse an RPN expression stack within a context.
- *
- * @param {Array} tokens An array of compiled expression tokens.
- * @param {Object} context The render context to parse the tokens with.
- *
- * @return {Object} The result of parsing all the tokens. The result
- * can be anything, String, Array, Object, etc... based on
- * the given expression.
- */</span>
- Twig.expression.parse = <span class="hljs-function"><span class="hljs-keyword">function</span> (<span class="hljs-params">tokens, context</span>) </span>{
- <span class="hljs-keyword">var</span> that = <span class="hljs-keyword">this</span>;</pre></div></div>
-
- </li>
-
-
- <li id="section-290">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-290">&#182;</a>
- </div>
- <p>If the token isn’t an array, make it one.</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">if</span> (!(tokens <span class="hljs-keyword">instanceof</span> <span class="hljs-built_in">Array</span>)) {
- tokens = [tokens];
- }</pre></div></div>
-
- </li>
-
-
- <li id="section-291">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-291">&#182;</a>
- </div>
- <p>The output stack</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">var</span> stack = [],
- token_template = <span class="hljs-literal">null</span>;
-
- Twig.forEach(tokens, <span class="hljs-function"><span class="hljs-keyword">function</span> (<span class="hljs-params">token</span>) </span>{
- token_template = Twig.expression.handler[token.type];
-
- token_template.parse &amp;&amp; token_template.parse.apply(that, [token, stack, context]);
- });</pre></div></div>
-
- </li>
-
-
- <li id="section-292">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-292">&#182;</a>
- </div>
- <p>Pop the final value off the stack</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">return</span> stack.pop();
- };
-
- <span class="hljs-keyword">return</span> Twig;
-
-})( Twig || { } );</pre></div></div>
-
- </li>
-
-
- <li id="section-293">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-293">&#182;</a>
- </div>
- <pre><code>Twig.js
-Available under the BSD <span class="hljs-number">2</span>-Clause License
-https:<span class="hljs-comment">//github.com/justjohn/twig.js</span>
-</code></pre>
- </div>
-
- </li>
-
-
- <li id="section-294">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-294">&#182;</a>
- </div>
- <h2 id="twig-expression-operator-js">twig.expression.operator.js</h2>
-<p>This file handles operator lookups and parsing.</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre><span class="hljs-keyword">var</span> Twig = (<span class="hljs-function"><span class="hljs-keyword">function</span> (<span class="hljs-params">Twig</span>) </span>{
-<span class="hljs-meta"> "use strict"</span>;
-
- <span class="hljs-comment">/**
- * Operator associativity constants.
- */</span>
- Twig.expression.operator = {
- leftToRight: <span class="hljs-string">'leftToRight'</span>,
- rightToLeft: <span class="hljs-string">'rightToLeft'</span>
- };
-
- <span class="hljs-keyword">var</span> containment = <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">a, b</span>) </span>{
- <span class="hljs-keyword">if</span> (b === <span class="hljs-literal">undefined</span> || b === <span class="hljs-literal">null</span>) {
- <span class="hljs-keyword">return</span> <span class="hljs-literal">null</span>;
- } <span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span> (b.indexOf !== <span class="hljs-literal">undefined</span>) {</pre></div></div>
-
- </li>
-
-
- <li id="section-295">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-295">&#182;</a>
- </div>
- <p>String</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">return</span> a === b || a !== <span class="hljs-string">''</span> &amp;&amp; b.indexOf(a) &gt; <span class="hljs-number">-1</span>;
- } <span class="hljs-keyword">else</span> {
- <span class="hljs-keyword">var</span> el;
- <span class="hljs-keyword">for</span> (el <span class="hljs-keyword">in</span> b) {
- <span class="hljs-keyword">if</span> (b.hasOwnProperty(el) &amp;&amp; b[el] === a) {
- <span class="hljs-keyword">return</span> <span class="hljs-literal">true</span>;
- }
- }
- <span class="hljs-keyword">return</span> <span class="hljs-literal">false</span>;
- }
- };
-
- <span class="hljs-comment">/**
- * Get the precidence and associativity of an operator. These follow the order that C/C++ use.
- * See http://en.wikipedia.org/wiki/Operators_in_C_and_C++ for the table of values.
- */</span>
- Twig.expression.operator.lookup = <span class="hljs-function"><span class="hljs-keyword">function</span> (<span class="hljs-params">operator, token</span>) </span>{
- <span class="hljs-keyword">switch</span> (operator) {
- <span class="hljs-keyword">case</span> <span class="hljs-string">".."</span>:
- <span class="hljs-keyword">case</span> <span class="hljs-string">'not in'</span>:
- <span class="hljs-keyword">case</span> <span class="hljs-string">'in'</span>:
- token.precidence = <span class="hljs-number">20</span>;
- token.associativity = Twig.expression.operator.leftToRight;
- <span class="hljs-keyword">break</span>;
-
- <span class="hljs-keyword">case</span> <span class="hljs-string">','</span>:
- token.precidence = <span class="hljs-number">18</span>;
- token.associativity = Twig.expression.operator.leftToRight;
- <span class="hljs-keyword">break</span>;</pre></div></div>
-
- </li>
-
-
- <li id="section-296">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-296">&#182;</a>
- </div>
- <p>Ternary</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">case</span> <span class="hljs-string">'?'</span>:
- <span class="hljs-keyword">case</span> <span class="hljs-string">':'</span>:
- token.precidence = <span class="hljs-number">16</span>;
- token.associativity = Twig.expression.operator.rightToLeft;
- <span class="hljs-keyword">break</span>;
-
- <span class="hljs-keyword">case</span> <span class="hljs-string">'or'</span>:
- token.precidence = <span class="hljs-number">14</span>;
- token.associativity = Twig.expression.operator.leftToRight;
- <span class="hljs-keyword">break</span>;
-
- <span class="hljs-keyword">case</span> <span class="hljs-string">'and'</span>:
- token.precidence = <span class="hljs-number">13</span>;
- token.associativity = Twig.expression.operator.leftToRight;
- <span class="hljs-keyword">break</span>;
-
- <span class="hljs-keyword">case</span> <span class="hljs-string">'=='</span>:
- <span class="hljs-keyword">case</span> <span class="hljs-string">'!='</span>:
- token.precidence = <span class="hljs-number">9</span>;
- token.associativity = Twig.expression.operator.leftToRight;
- <span class="hljs-keyword">break</span>;
-
- <span class="hljs-keyword">case</span> <span class="hljs-string">'&lt;'</span>:
- <span class="hljs-keyword">case</span> <span class="hljs-string">'&lt;='</span>:
- <span class="hljs-keyword">case</span> <span class="hljs-string">'&gt;'</span>:
- <span class="hljs-keyword">case</span> <span class="hljs-string">'&gt;='</span>:
- token.precidence = <span class="hljs-number">8</span>;
- token.associativity = Twig.expression.operator.leftToRight;
- <span class="hljs-keyword">break</span>;
-
-
- <span class="hljs-keyword">case</span> <span class="hljs-string">'~'</span>: <span class="hljs-comment">// String concatination</span>
- <span class="hljs-keyword">case</span> <span class="hljs-string">'+'</span>:
- <span class="hljs-keyword">case</span> <span class="hljs-string">'-'</span>:
- token.precidence = <span class="hljs-number">6</span>;
- token.associativity = Twig.expression.operator.leftToRight;
- <span class="hljs-keyword">break</span>;
-
- <span class="hljs-keyword">case</span> <span class="hljs-string">'//'</span>:
- <span class="hljs-keyword">case</span> <span class="hljs-string">'**'</span>:
- <span class="hljs-keyword">case</span> <span class="hljs-string">'*'</span>:
- <span class="hljs-keyword">case</span> <span class="hljs-string">'/'</span>:
- <span class="hljs-keyword">case</span> <span class="hljs-string">'%'</span>:
- token.precidence = <span class="hljs-number">5</span>;
- token.associativity = Twig.expression.operator.leftToRight;
- <span class="hljs-keyword">break</span>;
-
- <span class="hljs-keyword">case</span> <span class="hljs-string">'not'</span>:
- token.precidence = <span class="hljs-number">3</span>;
- token.associativity = Twig.expression.operator.rightToLeft;
- <span class="hljs-keyword">break</span>;
-
- <span class="hljs-keyword">default</span>:
- <span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> Twig.Error(operator + <span class="hljs-string">" is an unknown operator."</span>);
- }
- token.operator = operator;
- <span class="hljs-keyword">return</span> token;
- };
-
- <span class="hljs-comment">/**
- * Handle operations on the RPN stack.
- *
- * Returns the updated stack.
- */</span>
- Twig.expression.operator.parse = <span class="hljs-function"><span class="hljs-keyword">function</span> (<span class="hljs-params">operator, stack</span>) </span>{
- Twig.log.trace(<span class="hljs-string">"Twig.expression.operator.parse: "</span>, <span class="hljs-string">"Handling "</span>, operator);
- <span class="hljs-keyword">var</span> a, b, c;
- <span class="hljs-keyword">switch</span> (operator) {
- <span class="hljs-keyword">case</span> <span class="hljs-string">':'</span>:</pre></div></div>
-
- </li>
-
-
- <li id="section-297">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-297">&#182;</a>
- </div>
- <p>Ignore</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">break</span>;
-
- <span class="hljs-keyword">case</span> <span class="hljs-string">'?'</span>:
- c = stack.pop(); <span class="hljs-comment">// false expr</span>
- b = stack.pop(); <span class="hljs-comment">// true expr</span>
- a = stack.pop(); <span class="hljs-comment">// conditional</span>
- <span class="hljs-keyword">if</span> (a) {
- stack.push(b);
- } <span class="hljs-keyword">else</span> {
- stack.push(c);
- }
- <span class="hljs-keyword">break</span>;
-
- <span class="hljs-keyword">case</span> <span class="hljs-string">'+'</span>:
- b = <span class="hljs-built_in">parseFloat</span>(stack.pop());
- a = <span class="hljs-built_in">parseFloat</span>(stack.pop());
- stack.push(a + b);
- <span class="hljs-keyword">break</span>;
-
- <span class="hljs-keyword">case</span> <span class="hljs-string">'-'</span>:
- b = <span class="hljs-built_in">parseFloat</span>(stack.pop());
- a = <span class="hljs-built_in">parseFloat</span>(stack.pop());
- stack.push(a - b);
- <span class="hljs-keyword">break</span>;
-
- <span class="hljs-keyword">case</span> <span class="hljs-string">'*'</span>:
- b = <span class="hljs-built_in">parseFloat</span>(stack.pop());
- a = <span class="hljs-built_in">parseFloat</span>(stack.pop());
- stack.push(a * b);
- <span class="hljs-keyword">break</span>;
-
- <span class="hljs-keyword">case</span> <span class="hljs-string">'/'</span>:
- b = <span class="hljs-built_in">parseFloat</span>(stack.pop());
- a = <span class="hljs-built_in">parseFloat</span>(stack.pop());
- stack.push(a / b);
- <span class="hljs-keyword">break</span>;
-
- <span class="hljs-keyword">case</span> <span class="hljs-string">'//'</span>:
- b = <span class="hljs-built_in">parseFloat</span>(stack.pop());
- a = <span class="hljs-built_in">parseFloat</span>(stack.pop());
- stack.push(<span class="hljs-built_in">parseInt</span>(a / b));
- <span class="hljs-keyword">break</span>;
-
- <span class="hljs-keyword">case</span> <span class="hljs-string">'%'</span>:
- b = <span class="hljs-built_in">parseFloat</span>(stack.pop());
- a = <span class="hljs-built_in">parseFloat</span>(stack.pop());
- stack.push(a % b);
- <span class="hljs-keyword">break</span>;
-
- <span class="hljs-keyword">case</span> <span class="hljs-string">'~'</span>:
- b = stack.pop();
- a = stack.pop();
- stack.push( (a != <span class="hljs-literal">null</span> ? a.toString() : <span class="hljs-string">""</span>)
- + (b != <span class="hljs-literal">null</span> ? b.toString() : <span class="hljs-string">""</span>) );
- <span class="hljs-keyword">break</span>;
-
- <span class="hljs-keyword">case</span> <span class="hljs-string">'not'</span>:
- <span class="hljs-keyword">case</span> <span class="hljs-string">'!'</span>:
- stack.push(!stack.pop());
- <span class="hljs-keyword">break</span>;
-
- <span class="hljs-keyword">case</span> <span class="hljs-string">'&lt;'</span>:
- b = stack.pop();
- a = stack.pop();
- stack.push(a &lt; b);
- <span class="hljs-keyword">break</span>;
-
- <span class="hljs-keyword">case</span> <span class="hljs-string">'&lt;='</span>:
- b = stack.pop();
- a = stack.pop();
- stack.push(a &lt;= b);
- <span class="hljs-keyword">break</span>;
-
- <span class="hljs-keyword">case</span> <span class="hljs-string">'&gt;'</span>:
- b = stack.pop();
- a = stack.pop();
- stack.push(a &gt; b);
- <span class="hljs-keyword">break</span>;
-
- <span class="hljs-keyword">case</span> <span class="hljs-string">'&gt;='</span>:
- b = stack.pop();
- a = stack.pop();
- stack.push(a &gt;= b);
- <span class="hljs-keyword">break</span>;
-
- <span class="hljs-keyword">case</span> <span class="hljs-string">'==='</span>:
- b = stack.pop();
- a = stack.pop();
- stack.push(a === b);
- <span class="hljs-keyword">break</span>;
-
- <span class="hljs-keyword">case</span> <span class="hljs-string">'=='</span>:
- b = stack.pop();
- a = stack.pop();
- stack.push(a == b);
- <span class="hljs-keyword">break</span>;
-
- <span class="hljs-keyword">case</span> <span class="hljs-string">'!=='</span>:
- b = stack.pop();
- a = stack.pop();
- stack.push(a !== b);
- <span class="hljs-keyword">break</span>;
-
- <span class="hljs-keyword">case</span> <span class="hljs-string">'!='</span>:
- b = stack.pop();
- a = stack.pop();
- stack.push(a != b);
- <span class="hljs-keyword">break</span>;
-
- <span class="hljs-keyword">case</span> <span class="hljs-string">'or'</span>:
- b = stack.pop();
- a = stack.pop();
- stack.push(a || b);
- <span class="hljs-keyword">break</span>;
-
- <span class="hljs-keyword">case</span> <span class="hljs-string">'and'</span>:
- b = stack.pop();
- a = stack.pop();
- stack.push(a &amp;&amp; b);
- <span class="hljs-keyword">break</span>;
-
- <span class="hljs-keyword">case</span> <span class="hljs-string">'**'</span>:
- b = stack.pop();
- a = stack.pop();
- stack.push(<span class="hljs-built_in">Math</span>.pow(a, b));
- <span class="hljs-keyword">break</span>;
-
-
- <span class="hljs-keyword">case</span> <span class="hljs-string">'not in'</span>:
- b = stack.pop();
- a = stack.pop();
- stack.push( !containment(a, b) );
- <span class="hljs-keyword">break</span>;
-
- <span class="hljs-keyword">case</span> <span class="hljs-string">'in'</span>:
- b = stack.pop();
- a = stack.pop();
- stack.push( containment(a, b) );
- <span class="hljs-keyword">break</span>;
-
- <span class="hljs-keyword">case</span> <span class="hljs-string">'..'</span>:
- b = stack.pop();
- a = stack.pop();
- stack.push( Twig.functions.range(a, b) );
- <span class="hljs-keyword">break</span>;
-
- <span class="hljs-keyword">default</span>:
- <span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> Twig.Error(operator + <span class="hljs-string">" is an unknown operator."</span>);
- }
- };
-
- <span class="hljs-keyword">return</span> Twig;
-
-})( Twig || { } );</pre></div></div>
-
- </li>
-
-
- <li id="section-298">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-298">&#182;</a>
- </div>
- <pre><code>Twig.js
-Available under the BSD <span class="hljs-number">2</span>-Clause License
-https:<span class="hljs-comment">//github.com/justjohn/twig.js</span>
-</code></pre>
- </div>
-
- </li>
-
-
- <li id="section-299">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-299">&#182;</a>
- </div>
- <h2 id="twig-filters-js">twig.filters.js</h2>
-<p>This file handles parsing filters.</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre><span class="hljs-keyword">var</span> Twig = (<span class="hljs-function"><span class="hljs-keyword">function</span> (<span class="hljs-params">Twig</span>) </span>{</pre></div></div>
-
- </li>
-
-
- <li id="section-300">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-300">&#182;</a>
- </div>
- <p>Determine object type</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">is</span>(<span class="hljs-params">type, obj</span>) </span>{
- <span class="hljs-keyword">var</span> clas = <span class="hljs-built_in">Object</span>.prototype.toString.call(obj).slice(<span class="hljs-number">8</span>, <span class="hljs-number">-1</span>);
- <span class="hljs-keyword">return</span> obj !== <span class="hljs-literal">undefined</span> &amp;&amp; obj !== <span class="hljs-literal">null</span> &amp;&amp; clas === type;
- }
-
- Twig.filters = {</pre></div></div>
-
- </li>
-
-
- <li id="section-301">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-301">&#182;</a>
- </div>
- <p>String Filters</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> upper: <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">value</span>) </span>{
- <span class="hljs-keyword">if</span> ( <span class="hljs-keyword">typeof</span> value !== <span class="hljs-string">"string"</span> ) {
- <span class="hljs-keyword">return</span> value;
- }
-
- <span class="hljs-keyword">return</span> value.toUpperCase();
- },
- lower: <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">value</span>) </span>{
- <span class="hljs-keyword">if</span> ( <span class="hljs-keyword">typeof</span> value !== <span class="hljs-string">"string"</span> ) {
- <span class="hljs-keyword">return</span> value;
- }
-
- <span class="hljs-keyword">return</span> value.toLowerCase();
- },
- capitalize: <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">value</span>) </span>{
- <span class="hljs-keyword">if</span> ( <span class="hljs-keyword">typeof</span> value !== <span class="hljs-string">"string"</span> ) {
- <span class="hljs-keyword">return</span> value;
- }
-
- <span class="hljs-keyword">return</span> value.substr(<span class="hljs-number">0</span>, <span class="hljs-number">1</span>).toUpperCase() + value.toLowerCase().substr(<span class="hljs-number">1</span>);
- },
- title: <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">value</span>) </span>{
- <span class="hljs-keyword">if</span> ( <span class="hljs-keyword">typeof</span> value !== <span class="hljs-string">"string"</span> ) {
- <span class="hljs-keyword">return</span> value;
- }
-
- <span class="hljs-keyword">return</span> value.toLowerCase().replace( <span class="hljs-regexp">/(^|\s)([a-z])/g</span> , <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">m, p1, p2</span>)</span>{
- <span class="hljs-keyword">return</span> p1 + p2.toUpperCase();
- });
- },
- length: <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">value</span>) </span>{
- <span class="hljs-keyword">if</span> (Twig.lib.is(<span class="hljs-string">"Array"</span>, value) || <span class="hljs-keyword">typeof</span> value === <span class="hljs-string">"string"</span>) {
- <span class="hljs-keyword">return</span> value.length;
- } <span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span> (Twig.lib.is(<span class="hljs-string">"Object"</span>, value)) {
- <span class="hljs-keyword">if</span> (value._keys === <span class="hljs-literal">undefined</span>) {
- <span class="hljs-keyword">return</span> <span class="hljs-built_in">Object</span>.keys(value).length;
- } <span class="hljs-keyword">else</span> {
- <span class="hljs-keyword">return</span> value._keys.length;
- }
- } <span class="hljs-keyword">else</span> {
- <span class="hljs-keyword">return</span> <span class="hljs-number">0</span>;
- }
- },</pre></div></div>
-
- </li>
-
-
- <li id="section-302">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-302">&#182;</a>
- </div>
- <p>Array/Object Filters</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> reverse: <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">value</span>) </span>{
- <span class="hljs-keyword">if</span> (is(<span class="hljs-string">"Array"</span>, value)) {
- <span class="hljs-keyword">return</span> value.reverse();
- } <span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span> (is(<span class="hljs-string">"String"</span>, value)) {
- <span class="hljs-keyword">return</span> value.split(<span class="hljs-string">""</span>).reverse().join(<span class="hljs-string">""</span>);
- } <span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span> (is(<span class="hljs-string">"Object"</span>, value)) {
- <span class="hljs-keyword">var</span> keys = value._keys || <span class="hljs-built_in">Object</span>.keys(value).reverse();
- value._keys = keys;
- <span class="hljs-keyword">return</span> value;
- }
- },
- sort: <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">value</span>) </span>{
- <span class="hljs-keyword">if</span> (is(<span class="hljs-string">"Array"</span>, value)) {
- <span class="hljs-keyword">return</span> value.sort();
- } <span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span> (is(<span class="hljs-string">'Object'</span>, value)) {</pre></div></div>
-
- </li>
-
-
- <li id="section-303">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-303">&#182;</a>
- </div>
- <p>Sorting objects isn’t obvious since the order of
-returned keys isn’t guaranteed in JavaScript.
-Because of this we use a “hidden” key called _keys to
-store the keys in the order we want to return them.</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre>
- <span class="hljs-keyword">delete</span> value._keys;
- <span class="hljs-keyword">var</span> keys = <span class="hljs-built_in">Object</span>.keys(value),
- sorted_keys = keys.sort(<span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">a, b</span>) </span>{
- <span class="hljs-keyword">var</span> a1, a2;</pre></div></div>
-
- </li>
-
-
- <li id="section-304">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-304">&#182;</a>
- </div>
- <p>if a and b are comparable, we’re fine :-)</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">if</span>((value[a] &gt; value[b]) == !(value[a] &lt;= value[b])) {
- <span class="hljs-keyword">return</span> value[a] &gt; value[b] ? <span class="hljs-number">1</span> :
- value[a] &lt; value[b] ? <span class="hljs-number">-1</span> :
- <span class="hljs-number">0</span>;
- }</pre></div></div>
-
- </li>
-
-
- <li id="section-305">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-305">&#182;</a>
- </div>
- <p>if a and b can be parsed as numbers, we can compare
-their numeric value</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span>(!<span class="hljs-built_in">isNaN</span>(a1 = <span class="hljs-built_in">parseFloat</span>(value[a])) &amp;&amp;
- !<span class="hljs-built_in">isNaN</span>(b1 = <span class="hljs-built_in">parseFloat</span>(value[b]))) {
- <span class="hljs-keyword">return</span> a1 &gt; b1 ? <span class="hljs-number">1</span> :
- a1 &lt; b1 ? <span class="hljs-number">-1</span> :
- <span class="hljs-number">0</span>;
- }</pre></div></div>
-
- </li>
-
-
- <li id="section-306">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-306">&#182;</a>
- </div>
- <p>if one of the values is a string, we convert the
-other value to string as well</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span>(<span class="hljs-keyword">typeof</span> value[a] == <span class="hljs-string">'string'</span>) {
- <span class="hljs-keyword">return</span> value[a] &gt; value[b].toString() ? <span class="hljs-number">1</span> :
- value[a] &lt; value[b].toString() ? <span class="hljs-number">-1</span> :
- <span class="hljs-number">0</span>;
- }
- <span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span>(<span class="hljs-keyword">typeof</span> value[b] == <span class="hljs-string">'string'</span>) {
- <span class="hljs-keyword">return</span> value[a].toString() &gt; value[b] ? <span class="hljs-number">1</span> :
- value[a].toString() &lt; value[b] ? <span class="hljs-number">-1</span> :
- <span class="hljs-number">0</span>;
- }</pre></div></div>
-
- </li>
-
-
- <li id="section-307">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-307">&#182;</a>
- </div>
- <p>everything failed - return ‘null’ as sign, that
-the values are not comparable</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">else</span> {
- <span class="hljs-keyword">return</span> <span class="hljs-literal">null</span>;
- }
- });
- value._keys = sorted_keys;
- <span class="hljs-keyword">return</span> value;
- }
- },
- keys: <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">value</span>) </span>{
- <span class="hljs-keyword">if</span> (value === <span class="hljs-literal">undefined</span> || value === <span class="hljs-literal">null</span>){
- <span class="hljs-keyword">return</span>;
- }
-
- <span class="hljs-keyword">var</span> keyset = value._keys || <span class="hljs-built_in">Object</span>.keys(value),
- output = [];
-
- Twig.forEach(keyset, <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">key</span>) </span>{
- <span class="hljs-keyword">if</span> (key === <span class="hljs-string">"_keys"</span>) <span class="hljs-keyword">return</span>; <span class="hljs-comment">// Ignore the _keys property</span>
- <span class="hljs-keyword">if</span> (value.hasOwnProperty(key)) {
- output.push(key);
- }
- });
- <span class="hljs-keyword">return</span> output;
- },
- url_encode: <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">value</span>) </span>{
- <span class="hljs-keyword">if</span> (value === <span class="hljs-literal">undefined</span> || value === <span class="hljs-literal">null</span>){
- <span class="hljs-keyword">return</span>;
- }
-
- <span class="hljs-keyword">var</span> result = <span class="hljs-built_in">encodeURIComponent</span>(value);
- result = result.replace(<span class="hljs-string">"'"</span>, <span class="hljs-string">"%27"</span>);
- <span class="hljs-keyword">return</span> result;
- },
- join: <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">value, params</span>) </span>{
- <span class="hljs-keyword">if</span> (value === <span class="hljs-literal">undefined</span> || value === <span class="hljs-literal">null</span>){
- <span class="hljs-keyword">return</span>;
- }
-
- <span class="hljs-keyword">var</span> join_str = <span class="hljs-string">""</span>,
- output = [],
- keyset = <span class="hljs-literal">null</span>;
-
- <span class="hljs-keyword">if</span> (params &amp;&amp; params[<span class="hljs-number">0</span>]) {
- join_str = params[<span class="hljs-number">0</span>];
- }
- <span class="hljs-keyword">if</span> (is(<span class="hljs-string">"Array"</span>, value)) {
- output = value;
- } <span class="hljs-keyword">else</span> {
- keyset = value._keys || <span class="hljs-built_in">Object</span>.keys(value);
- Twig.forEach(keyset, <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">key</span>) </span>{
- <span class="hljs-keyword">if</span> (key === <span class="hljs-string">"_keys"</span>) <span class="hljs-keyword">return</span>; <span class="hljs-comment">// Ignore the _keys property</span>
- <span class="hljs-keyword">if</span> (value.hasOwnProperty(key)) {
- output.push(value[key]);
- }
- });
- }
- <span class="hljs-keyword">return</span> output.join(join_str);
- },
- <span class="hljs-string">"default"</span>: <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">value, params</span>) </span>{
- <span class="hljs-keyword">if</span> (params !== <span class="hljs-literal">undefined</span> &amp;&amp; params.length &gt; <span class="hljs-number">1</span>) {
- <span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> Twig.Error(<span class="hljs-string">"default filter expects one argument"</span>);
- }
- <span class="hljs-keyword">if</span> (value === <span class="hljs-literal">undefined</span> || value === <span class="hljs-literal">null</span> || value === <span class="hljs-string">''</span> ) {
- <span class="hljs-keyword">if</span> (params === <span class="hljs-literal">undefined</span>) {
- <span class="hljs-keyword">return</span> <span class="hljs-string">''</span>;
- }
-
- <span class="hljs-keyword">return</span> params[<span class="hljs-number">0</span>];
- } <span class="hljs-keyword">else</span> {
- <span class="hljs-keyword">return</span> value;
- }
- },
- json_encode: <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">value</span>) </span>{
- <span class="hljs-keyword">if</span>(value === <span class="hljs-literal">undefined</span> || value === <span class="hljs-literal">null</span>) {
- <span class="hljs-keyword">return</span> <span class="hljs-string">"null"</span>;
- }
- <span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span> ((<span class="hljs-keyword">typeof</span> value == <span class="hljs-string">'object'</span>) &amp;&amp; (is(<span class="hljs-string">"Array"</span>, value))) {
- output = [];
-
- Twig.forEach(value, <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">v</span>) </span>{
- output.push(Twig.filters.json_encode(v));
- });
-
- <span class="hljs-keyword">return</span> <span class="hljs-string">"["</span> + output.join(<span class="hljs-string">","</span>) + <span class="hljs-string">"]"</span>;
- }
- <span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span> (<span class="hljs-keyword">typeof</span> value == <span class="hljs-string">'object'</span>) {
- <span class="hljs-keyword">var</span> keyset = value._keys || <span class="hljs-built_in">Object</span>.keys(value),
- output = [];
-
- Twig.forEach(keyset, <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">key</span>) </span>{
- output.push(<span class="hljs-built_in">JSON</span>.stringify(key) + <span class="hljs-string">":"</span> + Twig.filters.json_encode(value[key]));
- });
-
- <span class="hljs-keyword">return</span> <span class="hljs-string">"{"</span> + output.join(<span class="hljs-string">","</span>) + <span class="hljs-string">"}"</span>;
- }
- <span class="hljs-keyword">else</span> {
- <span class="hljs-keyword">return</span> <span class="hljs-built_in">JSON</span>.stringify(value);
- }
- },
- merge: <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">value, params</span>) </span>{
- <span class="hljs-keyword">var</span> obj = [],
- arr_index = <span class="hljs-number">0</span>,
- keyset = [];</pre></div></div>
-
- </li>
-
-
- <li id="section-308">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-308">&#182;</a>
- </div>
- <p>Check to see if all the objects being merged are arrays</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">if</span> (!is(<span class="hljs-string">"Array"</span>, value)) {</pre></div></div>
-
- </li>
-
-
- <li id="section-309">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-309">&#182;</a>
- </div>
- <p>Create obj as an Object</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> obj = { };
- } <span class="hljs-keyword">else</span> {
- Twig.forEach(params, <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">param</span>) </span>{
- <span class="hljs-keyword">if</span> (!is(<span class="hljs-string">"Array"</span>, param)) {
- obj = { };
- }
- });
- }
- <span class="hljs-keyword">if</span> (!is(<span class="hljs-string">"Array"</span>, obj)) {
- obj._keys = [];
- }
-
- <span class="hljs-keyword">if</span> (is(<span class="hljs-string">"Array"</span>, value)) {
- Twig.forEach(value, <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">val</span>) </span>{
- <span class="hljs-keyword">if</span> (obj._keys) obj._keys.push(arr_index);
- obj[arr_index] = val;
- arr_index++;
- });
- } <span class="hljs-keyword">else</span> {
- keyset = value._keys || <span class="hljs-built_in">Object</span>.keys(value);
- Twig.forEach(keyset, <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">key</span>) </span>{
- obj[key] = value[key];
- obj._keys.push(key);</pre></div></div>
-
- </li>
-
-
- <li id="section-310">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-310">&#182;</a>
- </div>
- <p>Handle edge case where a number index in an object is greater than
- the array counter. In such a case, the array counter is increased
- one past the index.</p>
-<p>Example {{ [“a”, “b”]|merge({“4”:”value”}, [“c”, “d”])
-Without this, d would have an index of “4” and overwrite the value
- of “value”</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">var</span> int_key = <span class="hljs-built_in">parseInt</span>(key, <span class="hljs-number">10</span>);
- <span class="hljs-keyword">if</span> (!<span class="hljs-built_in">isNaN</span>(int_key) &amp;&amp; int_key &gt;= arr_index) {
- arr_index = int_key + <span class="hljs-number">1</span>;
- }
- });
- }</pre></div></div>
-
- </li>
-
-
- <li id="section-311">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-311">&#182;</a>
- </div>
- <p>mixin the merge arrays</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> Twig.forEach(params, <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">param</span>) </span>{
- <span class="hljs-keyword">if</span> (is(<span class="hljs-string">"Array"</span>, param)) {
- Twig.forEach(param, <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">val</span>) </span>{
- <span class="hljs-keyword">if</span> (obj._keys) obj._keys.push(arr_index);
- obj[arr_index] = val;
- arr_index++;
- });
- } <span class="hljs-keyword">else</span> {
- keyset = param._keys || <span class="hljs-built_in">Object</span>.keys(param);
- Twig.forEach(keyset, <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">key</span>) </span>{
- <span class="hljs-keyword">if</span> (!obj[key]) obj._keys.push(key);
- obj[key] = param[key];
-
- <span class="hljs-keyword">var</span> int_key = <span class="hljs-built_in">parseInt</span>(key, <span class="hljs-number">10</span>);
- <span class="hljs-keyword">if</span> (!<span class="hljs-built_in">isNaN</span>(int_key) &amp;&amp; int_key &gt;= arr_index) {
- arr_index = int_key + <span class="hljs-number">1</span>;
- }
- });
- }
- });
- <span class="hljs-keyword">if</span> (params.length === <span class="hljs-number">0</span>) {
- <span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> Twig.Error(<span class="hljs-string">"Filter merge expects at least one parameter"</span>);
- }
-
- <span class="hljs-keyword">return</span> obj;
- },
- date: <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">value, params</span>) </span>{
- <span class="hljs-keyword">var</span> date = Twig.functions.date(value);
- <span class="hljs-keyword">var</span> format = params &amp;&amp; params.length ? params[<span class="hljs-number">0</span>] : <span class="hljs-string">'F j, Y H:i'</span>;
- <span class="hljs-keyword">return</span> Twig.lib.formatDate(date, format);
- },
-
- date_modify: <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">value, params</span>) </span>{
- <span class="hljs-keyword">if</span> (value === <span class="hljs-literal">undefined</span> || value === <span class="hljs-literal">null</span>) {
- <span class="hljs-keyword">return</span>;
- }
- <span class="hljs-keyword">if</span> (params === <span class="hljs-literal">undefined</span> || params.length !== <span class="hljs-number">1</span>) {
- <span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> Twig.Error(<span class="hljs-string">"date_modify filter expects 1 argument"</span>);
- }
-
- <span class="hljs-keyword">var</span> modifyText = params[<span class="hljs-number">0</span>], time;
-
- <span class="hljs-keyword">if</span> (Twig.lib.is(<span class="hljs-string">"Date"</span>, value)) {
- time = Twig.lib.strtotime(modifyText, value.getTime() / <span class="hljs-number">1000</span>);
- }
- <span class="hljs-keyword">if</span> (Twig.lib.is(<span class="hljs-string">"String"</span>, value)) {
- time = Twig.lib.strtotime(modifyText, Twig.lib.strtotime(value));
- }
- <span class="hljs-keyword">if</span> (Twig.lib.is(<span class="hljs-string">"Number"</span>, value)) {
- time = Twig.lib.strtotime(modifyText, value);
- }
-
- <span class="hljs-keyword">return</span> <span class="hljs-keyword">new</span> <span class="hljs-built_in">Date</span>(time * <span class="hljs-number">1000</span>);
- },
-
- replace: <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">value, params</span>) </span>{
- <span class="hljs-keyword">if</span> (value === <span class="hljs-literal">undefined</span>||value === <span class="hljs-literal">null</span>){
- <span class="hljs-keyword">return</span>;
- }
-
- <span class="hljs-keyword">var</span> pairs = params[<span class="hljs-number">0</span>],
- tag;
- <span class="hljs-keyword">for</span> (tag <span class="hljs-keyword">in</span> pairs) {
- <span class="hljs-keyword">if</span> (pairs.hasOwnProperty(tag) &amp;&amp; tag !== <span class="hljs-string">"_keys"</span>) {
- value = Twig.lib.replaceAll(value, tag, pairs[tag]);
- }
- }
- <span class="hljs-keyword">return</span> value;
- },
-
- format: <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">value, params</span>) </span>{
- <span class="hljs-keyword">if</span> (value === <span class="hljs-literal">undefined</span> || value === <span class="hljs-literal">null</span>){
- <span class="hljs-keyword">return</span>;
- }
-
- <span class="hljs-keyword">return</span> Twig.lib.vsprintf(value, params);
- },
-
- striptags: <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">value</span>) </span>{
- <span class="hljs-keyword">if</span> (value === <span class="hljs-literal">undefined</span> || value === <span class="hljs-literal">null</span>){
- <span class="hljs-keyword">return</span>;
- }
-
- <span class="hljs-keyword">return</span> Twig.lib.strip_tags(value);
- },
-
- <span class="hljs-built_in">escape</span>: <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">value, params</span>) </span>{
- <span class="hljs-keyword">if</span> (value === <span class="hljs-literal">undefined</span>|| value === <span class="hljs-literal">null</span>){
- <span class="hljs-keyword">return</span>;
- }
-
- <span class="hljs-keyword">var</span> strategy = <span class="hljs-string">"html"</span>;
- <span class="hljs-keyword">if</span>(params &amp;&amp; params.length &amp;&amp; params[<span class="hljs-number">0</span>] !== <span class="hljs-literal">true</span>)
- strategy = params[<span class="hljs-number">0</span>];
-
- <span class="hljs-keyword">if</span>(strategy == <span class="hljs-string">"html"</span>) {
- <span class="hljs-keyword">var</span> raw_value = value.toString().replace(<span class="hljs-regexp">/&amp;/g</span>, <span class="hljs-string">"&amp;amp;"</span>)
- .replace(<span class="hljs-regexp">/&lt;/g</span>, <span class="hljs-string">"&amp;lt;"</span>)
- .replace(<span class="hljs-regexp">/&gt;/g</span>, <span class="hljs-string">"&amp;gt;"</span>)
- .replace(<span class="hljs-regexp">/"/g</span>, <span class="hljs-string">"&amp;quot;"</span>)
- .replace(<span class="hljs-regexp">/'/g</span>, <span class="hljs-string">"&amp;#039;"</span>);
- <span class="hljs-keyword">return</span> Twig.Markup(raw_value, <span class="hljs-string">'html'</span>);
- } <span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span>(strategy == <span class="hljs-string">"js"</span>) {
- <span class="hljs-keyword">var</span> raw_value = value.toString();
- <span class="hljs-keyword">var</span> result = <span class="hljs-string">""</span>;
-
- <span class="hljs-keyword">for</span>(<span class="hljs-keyword">var</span> i = <span class="hljs-number">0</span>; i &lt; raw_value.length; i++) {
- <span class="hljs-keyword">if</span>(raw_value[i].match(<span class="hljs-regexp">/^[a-zA-Z0-9,\._]$/</span>))
- result += raw_value[i];
- <span class="hljs-keyword">else</span> {
- <span class="hljs-keyword">var</span> char_code = raw_value.charCodeAt(i);
-
- <span class="hljs-keyword">if</span>(char_code &lt; <span class="hljs-number">0x80</span>)
- result += <span class="hljs-string">"\\x"</span> + char_code.toString(<span class="hljs-number">16</span>).toUpperCase();
- <span class="hljs-keyword">else</span>
- result += Twig.lib.sprintf(<span class="hljs-string">"\\u%04s"</span>, char_code.toString(<span class="hljs-number">16</span>).toUpperCase());
- }
- }
-
- <span class="hljs-keyword">return</span> Twig.Markup(result, <span class="hljs-string">'js'</span>);
- } <span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span>(strategy == <span class="hljs-string">"css"</span>) {
- <span class="hljs-keyword">var</span> raw_value = value.toString();
- <span class="hljs-keyword">var</span> result = <span class="hljs-string">""</span>;
-
- <span class="hljs-keyword">for</span>(<span class="hljs-keyword">var</span> i = <span class="hljs-number">0</span>; i &lt; raw_value.length; i++) {
- <span class="hljs-keyword">if</span>(raw_value[i].match(<span class="hljs-regexp">/^[a-zA-Z0-9]$/</span>))
- result += raw_value[i];
- <span class="hljs-keyword">else</span> {
- <span class="hljs-keyword">var</span> char_code = raw_value.charCodeAt(i);
- result += <span class="hljs-string">"\\"</span> + char_code.toString(<span class="hljs-number">16</span>).toUpperCase() + <span class="hljs-string">" "</span>;
- }
- }
-
- <span class="hljs-keyword">return</span> Twig.Markup(result, <span class="hljs-string">'css'</span>);
- } <span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span>(strategy == <span class="hljs-string">"url"</span>) {
- <span class="hljs-keyword">var</span> result = Twig.filters.url_encode(value);
- <span class="hljs-keyword">return</span> Twig.Markup(result, <span class="hljs-string">'url'</span>);
- } <span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span>(strategy == <span class="hljs-string">"html_attr"</span>) {
- <span class="hljs-keyword">var</span> raw_value = value.toString();
- <span class="hljs-keyword">var</span> result = <span class="hljs-string">""</span>;
-
- <span class="hljs-keyword">for</span>(<span class="hljs-keyword">var</span> i = <span class="hljs-number">0</span>; i &lt; raw_value.length; i++) {
- <span class="hljs-keyword">if</span>(raw_value[i].match(<span class="hljs-regexp">/^[a-zA-Z0-9,\.\-_]$/</span>))
- result += raw_value[i];
- <span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span>(raw_value[i].match(<span class="hljs-regexp">/^[&amp;&lt;&gt;"]$/</span>))
- result += raw_value[i].replace(<span class="hljs-regexp">/&amp;/g</span>, <span class="hljs-string">"&amp;amp;"</span>)
- .replace(<span class="hljs-regexp">/&lt;/g</span>, <span class="hljs-string">"&amp;lt;"</span>)
- .replace(<span class="hljs-regexp">/&gt;/g</span>, <span class="hljs-string">"&amp;gt;"</span>)
- .replace(<span class="hljs-regexp">/"/g</span>, <span class="hljs-string">"&amp;quot;"</span>);
- <span class="hljs-keyword">else</span> {
- <span class="hljs-keyword">var</span> char_code = raw_value.charCodeAt(i);</pre></div></div>
-
- </li>
-
-
- <li id="section-312">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-312">&#182;</a>
- </div>
- <p>The following replaces characters undefined in HTML with
-the hex entity for the Unicode replacement character.</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">if</span>(char_code &lt;= <span class="hljs-number">0x1f</span> &amp;&amp; char_code != <span class="hljs-number">0x09</span> &amp;&amp; char_code != <span class="hljs-number">0x0a</span> &amp;&amp; char_code != <span class="hljs-number">0x0d</span>)
- result += <span class="hljs-string">"&amp;#xFFFD;"</span>;
- <span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span>(char_code &lt; <span class="hljs-number">0x80</span>)
- result += Twig.lib.sprintf(<span class="hljs-string">"&amp;#x%02s;"</span>, char_code.toString(<span class="hljs-number">16</span>).toUpperCase());
- <span class="hljs-keyword">else</span>
- result += Twig.lib.sprintf(<span class="hljs-string">"&amp;#x%04s;"</span>, char_code.toString(<span class="hljs-number">16</span>).toUpperCase());
- }
- }
-
- <span class="hljs-keyword">return</span> Twig.Markup(result, <span class="hljs-string">'html_attr'</span>);
- } <span class="hljs-keyword">else</span> {
- <span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> Twig.Error(<span class="hljs-string">"escape strategy unsupported"</span>);
- }
- },
-
- <span class="hljs-comment">/* Alias of escape */</span>
- <span class="hljs-string">"e"</span>: <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">value, params</span>) </span>{
- <span class="hljs-keyword">return</span> Twig.filters.escape(value, params);
- },
-
- nl2br: <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">value</span>) </span>{
- <span class="hljs-keyword">if</span> (value === <span class="hljs-literal">undefined</span> || value === <span class="hljs-literal">null</span>){
- <span class="hljs-keyword">return</span>;
- }
- <span class="hljs-keyword">var</span> linebreak_tag = <span class="hljs-string">"BACKSLASH_n_replace"</span>,
- br = <span class="hljs-string">"&lt;br /&gt;"</span> + linebreak_tag;
-
- value = Twig.filters.escape(value)
- .replace(<span class="hljs-regexp">/\r\n/g</span>, br)
- .replace(<span class="hljs-regexp">/\r/g</span>, br)
- .replace(<span class="hljs-regexp">/\n/g</span>, br);
-
- value = Twig.lib.replaceAll(value, linebreak_tag, <span class="hljs-string">"\n"</span>);
-
- <span class="hljs-keyword">return</span> Twig.Markup(value);
- },
-
- <span class="hljs-comment">/**
- * Adapted from: http://phpjs.org/functions/number_format:481
- */</span>
- number_format: <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">value, params</span>) </span>{
- <span class="hljs-keyword">var</span> number = value,
- decimals = (params &amp;&amp; params[<span class="hljs-number">0</span>]) ? params[<span class="hljs-number">0</span>] : <span class="hljs-literal">undefined</span>,
- dec = (params &amp;&amp; params[<span class="hljs-number">1</span>] !== <span class="hljs-literal">undefined</span>) ? params[<span class="hljs-number">1</span>] : <span class="hljs-string">"."</span>,
- sep = (params &amp;&amp; params[<span class="hljs-number">2</span>] !== <span class="hljs-literal">undefined</span>) ? params[<span class="hljs-number">2</span>] : <span class="hljs-string">","</span>;
-
- number = (number + <span class="hljs-string">''</span>).replace(<span class="hljs-regexp">/[^0-9+\-Ee.]/g</span>, <span class="hljs-string">''</span>);
- <span class="hljs-keyword">var</span> n = !<span class="hljs-built_in">isFinite</span>(+number) ? <span class="hljs-number">0</span> : +number,
- prec = !<span class="hljs-built_in">isFinite</span>(+decimals) ? <span class="hljs-number">0</span> : <span class="hljs-built_in">Math</span>.abs(decimals),
- s = <span class="hljs-string">''</span>,
- toFixedFix = <span class="hljs-function"><span class="hljs-keyword">function</span> (<span class="hljs-params">n, prec</span>) </span>{
- <span class="hljs-keyword">var</span> k = <span class="hljs-built_in">Math</span>.pow(<span class="hljs-number">10</span>, prec);
- <span class="hljs-keyword">return</span> <span class="hljs-string">''</span> + <span class="hljs-built_in">Math</span>.round(n * k) / k;
- };</pre></div></div>
-
- </li>
-
-
- <li id="section-313">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-313">&#182;</a>
- </div>
- <p>Fix for IE parseFloat(0.55).toFixed(0) = 0;</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> s = (prec ? toFixedFix(n, prec) : <span class="hljs-string">''</span> + <span class="hljs-built_in">Math</span>.round(n)).split(<span class="hljs-string">'.'</span>);
- <span class="hljs-keyword">if</span> (s[<span class="hljs-number">0</span>].length &gt; <span class="hljs-number">3</span>) {
- s[<span class="hljs-number">0</span>] = s[<span class="hljs-number">0</span>].replace(<span class="hljs-regexp">/\B(?=(?:\d{3})+(?!\d))/g</span>, sep);
- }
- <span class="hljs-keyword">if</span> ((s[<span class="hljs-number">1</span>] || <span class="hljs-string">''</span>).length &lt; prec) {
- s[<span class="hljs-number">1</span>] = s[<span class="hljs-number">1</span>] || <span class="hljs-string">''</span>;
- s[<span class="hljs-number">1</span>] += <span class="hljs-keyword">new</span> <span class="hljs-built_in">Array</span>(prec - s[<span class="hljs-number">1</span>].length + <span class="hljs-number">1</span>).join(<span class="hljs-string">'0'</span>);
- }
- <span class="hljs-keyword">return</span> s.join(dec);
- },
-
- trim: <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">value, params</span>) </span>{
- <span class="hljs-keyword">if</span> (value === <span class="hljs-literal">undefined</span>|| value === <span class="hljs-literal">null</span>){
- <span class="hljs-keyword">return</span>;
- }
-
- <span class="hljs-keyword">var</span> str = Twig.filters.escape( <span class="hljs-string">''</span> + value ),
- whitespace;
- <span class="hljs-keyword">if</span> ( params &amp;&amp; params[<span class="hljs-number">0</span>] ) {
- whitespace = <span class="hljs-string">''</span> + params[<span class="hljs-number">0</span>];
- } <span class="hljs-keyword">else</span> {
- whitespace = <span class="hljs-string">' \n\r\t\f\x0b\xa0\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u200b\u2028\u2029\u3000'</span>;
- }
- <span class="hljs-keyword">for</span> (<span class="hljs-keyword">var</span> i = <span class="hljs-number">0</span>; i &lt; str.length; i++) {
- <span class="hljs-keyword">if</span> (whitespace.indexOf(str.charAt(i)) === <span class="hljs-number">-1</span>) {
- str = str.substring(i);
- <span class="hljs-keyword">break</span>;
- }
- }
- <span class="hljs-keyword">for</span> (i = str.length - <span class="hljs-number">1</span>; i &gt;= <span class="hljs-number">0</span>; i--) {
- <span class="hljs-keyword">if</span> (whitespace.indexOf(str.charAt(i)) === <span class="hljs-number">-1</span>) {
- str = str.substring(<span class="hljs-number">0</span>, i + <span class="hljs-number">1</span>);
- <span class="hljs-keyword">break</span>;
- }
- }
- <span class="hljs-keyword">return</span> whitespace.indexOf(str.charAt(<span class="hljs-number">0</span>)) === <span class="hljs-number">-1</span> ? str : <span class="hljs-string">''</span>;
- },
-
- truncate: <span class="hljs-function"><span class="hljs-keyword">function</span> (<span class="hljs-params">value, params</span>) </span>{
- <span class="hljs-keyword">var</span> length = <span class="hljs-number">30</span>,
- preserve = <span class="hljs-literal">false</span>,
- separator = <span class="hljs-string">'...'</span>;
-
- value = value + <span class="hljs-string">''</span>;
- <span class="hljs-keyword">if</span> (params) {
- <span class="hljs-keyword">if</span> (params[<span class="hljs-number">0</span>]) {
- length = params[<span class="hljs-number">0</span>];
- }
- <span class="hljs-keyword">if</span> (params[<span class="hljs-number">1</span>]) {
- preserve = params[<span class="hljs-number">1</span>];
- }
- <span class="hljs-keyword">if</span> (params[<span class="hljs-number">2</span>]) {
- separator = params[<span class="hljs-number">2</span>];
- }
- }
-
- <span class="hljs-keyword">if</span> (value.length &gt; length) {
-
- <span class="hljs-keyword">if</span> (preserve) {
- length = value.indexOf(<span class="hljs-string">' '</span>, length);
- <span class="hljs-keyword">if</span> (length === <span class="hljs-number">-1</span>) {
- <span class="hljs-keyword">return</span> value;
- }
- }
-
- value = value.substr(<span class="hljs-number">0</span>, length) + separator;
- }
-
- <span class="hljs-keyword">return</span> value;
- },
-
- slice: <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">value, params</span>) </span>{
- <span class="hljs-keyword">if</span> (value === <span class="hljs-literal">undefined</span> || value === <span class="hljs-literal">null</span>) {
- <span class="hljs-keyword">return</span>;
- }
- <span class="hljs-keyword">if</span> (params === <span class="hljs-literal">undefined</span> || params.length &lt; <span class="hljs-number">1</span>) {
- <span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> Twig.Error(<span class="hljs-string">"slice filter expects at least 1 argument"</span>);
- }</pre></div></div>
-
- </li>
-
-
- <li id="section-314">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-314">&#182;</a>
- </div>
- <p>default to start of string</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">var</span> start = params[<span class="hljs-number">0</span>] || <span class="hljs-number">0</span>;</pre></div></div>
-
- </li>
-
-
- <li id="section-315">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-315">&#182;</a>
- </div>
- <p>default to length of string</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">var</span> length = params.length &gt; <span class="hljs-number">1</span> ? params[<span class="hljs-number">1</span>] : value.length;</pre></div></div>
-
- </li>
-
-
- <li id="section-316">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-316">&#182;</a>
- </div>
- <p>handle negative start values</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">var</span> startIndex = start &gt;= <span class="hljs-number">0</span> ? start : <span class="hljs-built_in">Math</span>.max( value.length + start, <span class="hljs-number">0</span> );
-
- <span class="hljs-keyword">if</span> (Twig.lib.is(<span class="hljs-string">"Array"</span>, value)) {
- <span class="hljs-keyword">var</span> output = [];
- <span class="hljs-keyword">for</span> (<span class="hljs-keyword">var</span> i = startIndex; i &lt; startIndex + length &amp;&amp; i &lt; value.length; i++) {
- output.push(value[i]);
- }
- <span class="hljs-keyword">return</span> output;
- } <span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span> (Twig.lib.is(<span class="hljs-string">"String"</span>, value)) {
- <span class="hljs-keyword">return</span> value.substr(startIndex, length);
- } <span class="hljs-keyword">else</span> {
- <span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> Twig.Error(<span class="hljs-string">"slice filter expects value to be an array or string"</span>);
- }
- },
-
- abs: <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">value</span>) </span>{
- <span class="hljs-keyword">if</span> (value === <span class="hljs-literal">undefined</span> || value === <span class="hljs-literal">null</span>) {
- <span class="hljs-keyword">return</span>;
- }
-
- <span class="hljs-keyword">return</span> <span class="hljs-built_in">Math</span>.abs(value);
- },
-
- first: <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">value</span>) </span>{
- <span class="hljs-keyword">if</span> (is(<span class="hljs-string">"Array"</span>, value)) {
- <span class="hljs-keyword">return</span> value[<span class="hljs-number">0</span>];
- } <span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span> (is(<span class="hljs-string">"Object"</span>, value)) {
- <span class="hljs-keyword">if</span> (<span class="hljs-string">'_keys'</span> <span class="hljs-keyword">in</span> value) {
- <span class="hljs-keyword">return</span> value[value._keys[<span class="hljs-number">0</span>]];
- }
- } <span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span> ( <span class="hljs-keyword">typeof</span> value === <span class="hljs-string">"string"</span> ) {
- <span class="hljs-keyword">return</span> value.substr(<span class="hljs-number">0</span>, <span class="hljs-number">1</span>);
- }
-
- <span class="hljs-keyword">return</span>;
- },
-
- split: <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">value, params</span>) </span>{
- <span class="hljs-keyword">if</span> (value === <span class="hljs-literal">undefined</span> || value === <span class="hljs-literal">null</span>) {
- <span class="hljs-keyword">return</span>;
- }
- <span class="hljs-keyword">if</span> (params === <span class="hljs-literal">undefined</span> || params.length &lt; <span class="hljs-number">1</span> || params.length &gt; <span class="hljs-number">2</span>) {
- <span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> Twig.Error(<span class="hljs-string">"split filter expects 1 or 2 argument"</span>);
- }
- <span class="hljs-keyword">if</span> (Twig.lib.is(<span class="hljs-string">"String"</span>, value)) {
- <span class="hljs-keyword">var</span> delimiter = params[<span class="hljs-number">0</span>],
- limit = params[<span class="hljs-number">1</span>],
- split = value.split(delimiter);
-
- <span class="hljs-keyword">if</span> (limit === <span class="hljs-literal">undefined</span>) {
-
- <span class="hljs-keyword">return</span> split;
-
- } <span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span> (limit &lt; <span class="hljs-number">0</span>) {
-
- <span class="hljs-keyword">return</span> value.split(delimiter, split.length + limit);
-
- } <span class="hljs-keyword">else</span> {
-
- <span class="hljs-keyword">var</span> limitedSplit = [];
-
- <span class="hljs-keyword">if</span> (delimiter == <span class="hljs-string">''</span>) {</pre></div></div>
-
- </li>
-
-
- <li id="section-317">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-317">&#182;</a>
- </div>
- <p>empty delimiter
-“aabbcc”|split(‘’, 2)
- -&gt; [‘aa’, ‘bb’, ‘cc’]</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre>
- <span class="hljs-keyword">while</span>(split.length &gt; <span class="hljs-number">0</span>) {
- <span class="hljs-keyword">var</span> temp = <span class="hljs-string">""</span>;
- <span class="hljs-keyword">for</span> (<span class="hljs-keyword">var</span> i=<span class="hljs-number">0</span>; i&lt;limit &amp;&amp; split.length &gt; <span class="hljs-number">0</span>; i++) {
- temp += split.shift();
- }
- limitedSplit.push(temp);
- }
-
- } <span class="hljs-keyword">else</span> {</pre></div></div>
-
- </li>
-
-
- <li id="section-318">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-318">&#182;</a>
- </div>
- <p>non-empty delimiter
-“one,two,three,four,five”|split(‘,’, 3)
- -&gt; [‘one’, ‘two’, ‘three,four,five’]</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre>
- <span class="hljs-keyword">for</span> (<span class="hljs-keyword">var</span> i=<span class="hljs-number">0</span>; i&lt;limit<span class="hljs-number">-1</span> &amp;&amp; split.length &gt; <span class="hljs-number">0</span>; i++) {
- limitedSplit.push(split.shift());
- }
-
- <span class="hljs-keyword">if</span> (split.length &gt; <span class="hljs-number">0</span>) {
- limitedSplit.push(split.join(delimiter));
- }
- }
-
- <span class="hljs-keyword">return</span> limitedSplit;
- }
-
- } <span class="hljs-keyword">else</span> {
- <span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> Twig.Error(<span class="hljs-string">"split filter expects value to be a string"</span>);
- }
- },
- last: <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">value</span>) </span>{
- <span class="hljs-keyword">if</span> (Twig.lib.is(<span class="hljs-string">'Object'</span>, value)) {
- <span class="hljs-keyword">var</span> keys;
-
- <span class="hljs-keyword">if</span> (value._keys === <span class="hljs-literal">undefined</span>) {
- keys = <span class="hljs-built_in">Object</span>.keys(value);
- } <span class="hljs-keyword">else</span> {
- keys = value._keys;
- }
-
- <span class="hljs-keyword">return</span> value[keys[keys.length - <span class="hljs-number">1</span>]];
- }</pre></div></div>
-
- </li>
-
-
- <li id="section-319">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-319">&#182;</a>
- </div>
- <p>string|array</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">return</span> value[value.length - <span class="hljs-number">1</span>];
- },
- raw: <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">value</span>) </span>{
- <span class="hljs-keyword">return</span> Twig.Markup(value);
- },
- batch: <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">items, params</span>) </span>{
- <span class="hljs-keyword">var</span> size = params.shift(),
- fill = params.shift(),
- result,
- last,
- missing;
-
- <span class="hljs-keyword">if</span> (!Twig.lib.is(<span class="hljs-string">"Array"</span>, items)) {
- <span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> Twig.Error(<span class="hljs-string">"batch filter expects items to be an array"</span>);
- }
-
- <span class="hljs-keyword">if</span> (!Twig.lib.is(<span class="hljs-string">"Number"</span>, size)) {
- <span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> Twig.Error(<span class="hljs-string">"batch filter expects size to be a number"</span>);
- }
-
- size = <span class="hljs-built_in">Math</span>.ceil(size);
-
- result = Twig.lib.chunkArray(items, size);
-
- <span class="hljs-keyword">if</span> (fill &amp;&amp; items.length % size != <span class="hljs-number">0</span>) {
- last = result.pop();
- missing = size - last.length;
-
- <span class="hljs-keyword">while</span> (missing--) {
- last.push(fill);
- }
-
- result.push(last);
- }
-
- <span class="hljs-keyword">return</span> result;
- },
- round: <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">value, params</span>) </span>{
- params = params || [];
-
- <span class="hljs-keyword">var</span> precision = params.length &gt; <span class="hljs-number">0</span> ? params[<span class="hljs-number">0</span>] : <span class="hljs-number">0</span>,
- method = params.length &gt; <span class="hljs-number">1</span> ? params[<span class="hljs-number">1</span>] : <span class="hljs-string">"common"</span>;
-
- value = <span class="hljs-built_in">parseFloat</span>(value);
-
- <span class="hljs-keyword">if</span>(precision &amp;&amp; !Twig.lib.is(<span class="hljs-string">"Number"</span>, precision)) {
- <span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> Twig.Error(<span class="hljs-string">"round filter expects precision to be a number"</span>);
- }
-
- <span class="hljs-keyword">if</span> (method === <span class="hljs-string">"common"</span>) {
- <span class="hljs-keyword">return</span> Twig.lib.round(value, precision);
- }
-
- <span class="hljs-keyword">if</span>(!Twig.lib.is(<span class="hljs-string">"Function"</span>, <span class="hljs-built_in">Math</span>[method])) {
- <span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> Twig.Error(<span class="hljs-string">"round filter expects method to be 'floor', 'ceil', or 'common'"</span>);
- }
-
- <span class="hljs-keyword">return</span> <span class="hljs-built_in">Math</span>[method](value * <span class="hljs-built_in">Math</span>.pow(<span class="hljs-number">10</span>, precision)) / <span class="hljs-built_in">Math</span>.pow(<span class="hljs-number">10</span>, precision);
- }
- };
-
- Twig.filter = <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">filter, value, params</span>) </span>{
- <span class="hljs-keyword">if</span> (!Twig.filters[filter]) {
- <span class="hljs-keyword">throw</span> <span class="hljs-string">"Unable to find filter "</span> + filter;
- }
- <span class="hljs-keyword">return</span> Twig.filters[filter].apply(<span class="hljs-keyword">this</span>, [value, params]);
- };
-
- Twig.filter.extend = <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">filter, definition</span>) </span>{
- Twig.filters[filter] = definition;
- };
-
- <span class="hljs-keyword">return</span> Twig;
-
-})(Twig || { });</pre></div></div>
-
- </li>
-
-
- <li id="section-320">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-320">&#182;</a>
- </div>
- <pre><code>Twig.js
- <span class="hljs-number">2012</span> Hadrien Lanneau
-Available under the BSD <span class="hljs-number">2</span>-Clause License
-https:<span class="hljs-comment">//github.com/justjohn/twig.js</span>
-</code></pre>
- </div>
-
- </li>
-
-
- <li id="section-321">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-321">&#182;</a>
- </div>
- <h2 id="twig-functions-js">twig.functions.js</h2>
-<p>This file handles parsing filters.</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre><span class="hljs-keyword">var</span> Twig = (<span class="hljs-function"><span class="hljs-keyword">function</span> (<span class="hljs-params">Twig</span>) </span>{
- <span class="hljs-comment">/**
- * @constant
- * @type {string}
- */</span>
- <span class="hljs-keyword">var</span> TEMPLATE_NOT_FOUND_MESSAGE = <span class="hljs-string">'Template "{name}" is not defined.'</span>;</pre></div></div>
-
- </li>
-
-
- <li id="section-322">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-322">&#182;</a>
- </div>
- <p>Determine object type</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">is</span>(<span class="hljs-params">type, obj</span>) </span>{
- <span class="hljs-keyword">var</span> clas = <span class="hljs-built_in">Object</span>.prototype.toString.call(obj).slice(<span class="hljs-number">8</span>, <span class="hljs-number">-1</span>);
- <span class="hljs-keyword">return</span> obj !== <span class="hljs-literal">undefined</span> &amp;&amp; obj !== <span class="hljs-literal">null</span> &amp;&amp; clas === type;
- }
-
- Twig.functions = {</pre></div></div>
-
- </li>
-
-
- <li id="section-323">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-323">&#182;</a>
- </div>
- <p> attribute, block, constant, date, dump, parent, random,.</p>
-
- </div>
-
- </li>
-
-
- <li id="section-324">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-324">&#182;</a>
- </div>
- <p>Range function from <a href="http://phpjs.org/functions/range:499">http://phpjs.org/functions/range:499</a>
-Used under an MIT License</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> range: <span class="hljs-function"><span class="hljs-keyword">function</span> (<span class="hljs-params">low, high, step</span>) </span>{</pre></div></div>
-
- </li>
-
-
- <li id="section-325">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-325">&#182;</a>
- </div>
- <p><a href="http://kevin.vanzonneveld.net">http://kevin.vanzonneveld.net</a></p>
-<ul>
-<li>original by: Waldo Malqui Silva</li>
-<li>example 1: range ( 0, 12 );</li>
-<li>returns 1: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]</li>
-<li>example 2: range( 0, 100, 10 );</li>
-<li>returns 2: [0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100]</li>
-<li>example 3: range( ‘a’, ‘i’ );</li>
-<li>returns 3: [‘a’, ‘b’, ‘c’, ‘d’, ‘e’, ‘f’, ‘g’, ‘h’, ‘i’]</li>
-<li>example 4: range( ‘c’, ‘a’ );</li>
-<li>returns 4: [‘c’, ‘b’, ‘a’]</li>
-</ul>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">var</span> matrix = [];
- <span class="hljs-keyword">var</span> inival, endval, plus;
- <span class="hljs-keyword">var</span> walker = step || <span class="hljs-number">1</span>;
- <span class="hljs-keyword">var</span> chars = <span class="hljs-literal">false</span>;
-
- <span class="hljs-keyword">if</span> (!<span class="hljs-built_in">isNaN</span>(low) &amp;&amp; !<span class="hljs-built_in">isNaN</span>(high)) {
- inival = <span class="hljs-built_in">parseInt</span>(low, <span class="hljs-number">10</span>);
- endval = <span class="hljs-built_in">parseInt</span>(high, <span class="hljs-number">10</span>);
- } <span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span> (<span class="hljs-built_in">isNaN</span>(low) &amp;&amp; <span class="hljs-built_in">isNaN</span>(high)) {
- chars = <span class="hljs-literal">true</span>;
- inival = low.charCodeAt(<span class="hljs-number">0</span>);
- endval = high.charCodeAt(<span class="hljs-number">0</span>);
- } <span class="hljs-keyword">else</span> {
- inival = (<span class="hljs-built_in">isNaN</span>(low) ? <span class="hljs-number">0</span> : low);
- endval = (<span class="hljs-built_in">isNaN</span>(high) ? <span class="hljs-number">0</span> : high);
- }
-
- plus = ((inival &gt; endval) ? <span class="hljs-literal">false</span> : <span class="hljs-literal">true</span>);
- <span class="hljs-keyword">if</span> (plus) {
- <span class="hljs-keyword">while</span> (inival &lt;= endval) {
- matrix.push(((chars) ? <span class="hljs-built_in">String</span>.fromCharCode(inival) : inival));
- inival += walker;
- }
- } <span class="hljs-keyword">else</span> {
- <span class="hljs-keyword">while</span> (inival &gt;= endval) {
- matrix.push(((chars) ? <span class="hljs-built_in">String</span>.fromCharCode(inival) : inival));
- inival -= walker;
- }
- }
-
- <span class="hljs-keyword">return</span> matrix;
- },
- cycle: <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">arr, i</span>) </span>{
- <span class="hljs-keyword">var</span> pos = i % arr.length;
- <span class="hljs-keyword">return</span> arr[pos];
- },
- dump: <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"></span>) </span>{
- <span class="hljs-keyword">var</span> EOL = <span class="hljs-string">'\n'</span>,
- indentChar = <span class="hljs-string">' '</span>,
- indentTimes = <span class="hljs-number">0</span>,
- out = <span class="hljs-string">''</span>,
- args = <span class="hljs-built_in">Array</span>.prototype.slice.call(<span class="hljs-built_in">arguments</span>),
- indent = <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">times</span>) </span>{
- <span class="hljs-keyword">var</span> ind = <span class="hljs-string">''</span>;
- <span class="hljs-keyword">while</span> (times &gt; <span class="hljs-number">0</span>) {
- times--;
- ind += indentChar;
- }
- <span class="hljs-keyword">return</span> ind;
- },
- displayVar = <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">variable</span>) </span>{
- out += indent(indentTimes);
- <span class="hljs-keyword">if</span> (<span class="hljs-keyword">typeof</span>(variable) === <span class="hljs-string">'object'</span>) {
- dumpVar(variable);
- } <span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span> (<span class="hljs-keyword">typeof</span>(variable) === <span class="hljs-string">'function'</span>) {
- out += <span class="hljs-string">'function()'</span> + EOL;
- } <span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span> (<span class="hljs-keyword">typeof</span>(variable) === <span class="hljs-string">'string'</span>) {
- out += <span class="hljs-string">'string('</span> + variable.length + <span class="hljs-string">') "'</span> + variable + <span class="hljs-string">'"'</span> + EOL;
- } <span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span> (<span class="hljs-keyword">typeof</span>(variable) === <span class="hljs-string">'number'</span>) {
- out += <span class="hljs-string">'number('</span> + variable + <span class="hljs-string">')'</span> + EOL;
- } <span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span> (<span class="hljs-keyword">typeof</span>(variable) === <span class="hljs-string">'boolean'</span>) {
- out += <span class="hljs-string">'bool('</span> + variable + <span class="hljs-string">')'</span> + EOL;
- }
- },
- dumpVar = <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">variable</span>) </span>{
- <span class="hljs-keyword">var</span> i;
- <span class="hljs-keyword">if</span> (variable === <span class="hljs-literal">null</span>) {
- out += <span class="hljs-string">'NULL'</span> + EOL;
- } <span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span> (variable === <span class="hljs-literal">undefined</span>) {
- out += <span class="hljs-string">'undefined'</span> + EOL;
- } <span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span> (<span class="hljs-keyword">typeof</span> variable === <span class="hljs-string">'object'</span>) {
- out += indent(indentTimes) + <span class="hljs-keyword">typeof</span>(variable);
- indentTimes++;
- out += <span class="hljs-string">'('</span> + (<span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">obj</span>) </span>{
- <span class="hljs-keyword">var</span> size = <span class="hljs-number">0</span>, key;
- <span class="hljs-keyword">for</span> (key <span class="hljs-keyword">in</span> obj) {
- <span class="hljs-keyword">if</span> (obj.hasOwnProperty(key)) {
- size++;
- }
- }
- <span class="hljs-keyword">return</span> size;
- })(variable) + <span class="hljs-string">') {'</span> + EOL;
- <span class="hljs-keyword">for</span> (i <span class="hljs-keyword">in</span> variable) {
- out += indent(indentTimes) + <span class="hljs-string">'['</span> + i + <span class="hljs-string">']=&gt; '</span> + EOL;
- displayVar(variable[i]);
- }
- indentTimes--;
- out += indent(indentTimes) + <span class="hljs-string">'}'</span> + EOL;
- } <span class="hljs-keyword">else</span> {
- displayVar(variable);
- }
- };</pre></div></div>
-
- </li>
-
-
- <li id="section-326">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-326">&#182;</a>
- </div>
- <p>handle no argument case by dumping the entire render context</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">if</span> (args.length == <span class="hljs-number">0</span>) args.push(<span class="hljs-keyword">this</span>.context);
-
- Twig.forEach(args, <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">variable</span>) </span>{
- dumpVar(variable);
- });
-
- <span class="hljs-keyword">return</span> out;
- },
- date: <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">date, time</span>) </span>{
- <span class="hljs-keyword">var</span> dateObj;
- <span class="hljs-keyword">if</span> (date === <span class="hljs-literal">undefined</span>) {
- dateObj = <span class="hljs-keyword">new</span> <span class="hljs-built_in">Date</span>();
- } <span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span> (Twig.lib.is(<span class="hljs-string">"Date"</span>, date)) {
- dateObj = date;
- } <span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span> (Twig.lib.is(<span class="hljs-string">"String"</span>, date)) {
- <span class="hljs-keyword">if</span> (date.match(<span class="hljs-regexp">/^[0-9]+$/</span>)) {
- dateObj = <span class="hljs-keyword">new</span> <span class="hljs-built_in">Date</span>(date * <span class="hljs-number">1000</span>);
- }
- <span class="hljs-keyword">else</span> {
- dateObj = <span class="hljs-keyword">new</span> <span class="hljs-built_in">Date</span>(Twig.lib.strtotime(date) * <span class="hljs-number">1000</span>);
- }
- } <span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span> (Twig.lib.is(<span class="hljs-string">"Number"</span>, date)) {</pre></div></div>
-
- </li>
-
-
- <li id="section-327">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-327">&#182;</a>
- </div>
- <p>timestamp</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> dateObj = <span class="hljs-keyword">new</span> <span class="hljs-built_in">Date</span>(date * <span class="hljs-number">1000</span>);
- } <span class="hljs-keyword">else</span> {
- <span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> Twig.Error(<span class="hljs-string">"Unable to parse date "</span> + date);
- }
- <span class="hljs-keyword">return</span> dateObj;
- },
- block: <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">block</span>) </span>{
- <span class="hljs-keyword">if</span> (<span class="hljs-keyword">this</span>.originalBlockTokens[block]) {
- <span class="hljs-keyword">return</span> Twig.logic.parse.apply(<span class="hljs-keyword">this</span>, [<span class="hljs-keyword">this</span>.originalBlockTokens[block], <span class="hljs-keyword">this</span>.context]).output;
- } <span class="hljs-keyword">else</span> {
- <span class="hljs-keyword">return</span> <span class="hljs-keyword">this</span>.blocks[block];
- }
- },
- parent: <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"></span>) </span>{</pre></div></div>
-
- </li>
-
-
- <li id="section-328">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-328">&#182;</a>
- </div>
- <p>Add a placeholder</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">return</span> Twig.placeholders.parent;
- },
- attribute: <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">object, method, params</span>) </span>{
- <span class="hljs-keyword">if</span> (Twig.lib.is(<span class="hljs-string">'Object'</span>, object)) {
- <span class="hljs-keyword">if</span> (object.hasOwnProperty(method)) {
- <span class="hljs-keyword">if</span> (<span class="hljs-keyword">typeof</span> object[method] === <span class="hljs-string">"function"</span>) {
- <span class="hljs-keyword">return</span> object[method].apply(<span class="hljs-literal">undefined</span>, params);
- }
- <span class="hljs-keyword">else</span> {
- <span class="hljs-keyword">return</span> object[method];
- }
- }
- }</pre></div></div>
-
- </li>
-
-
- <li id="section-329">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-329">&#182;</a>
- </div>
- <p>Array will return element 0-index</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">return</span> object[method] || <span class="hljs-literal">undefined</span>;
- },
- max: <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">values</span>) </span>{
- <span class="hljs-keyword">if</span>(Twig.lib.is(<span class="hljs-string">"Object"</span>, values)) {
- <span class="hljs-keyword">delete</span> values[<span class="hljs-string">"_keys"</span>];
- <span class="hljs-keyword">return</span> Twig.lib.max(values);
- }
-
- <span class="hljs-keyword">return</span> Twig.lib.max.apply(<span class="hljs-literal">null</span>, <span class="hljs-built_in">arguments</span>);
- },
- min: <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">values</span>) </span>{
- <span class="hljs-keyword">if</span>(Twig.lib.is(<span class="hljs-string">"Object"</span>, values)) {
- <span class="hljs-keyword">delete</span> values[<span class="hljs-string">"_keys"</span>];
- <span class="hljs-keyword">return</span> Twig.lib.min(values);
- }
-
- <span class="hljs-keyword">return</span> Twig.lib.min.apply(<span class="hljs-literal">null</span>, <span class="hljs-built_in">arguments</span>);
- },
- template_from_string: <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">template</span>) </span>{
- <span class="hljs-keyword">if</span> (template === <span class="hljs-literal">undefined</span>) {
- template = <span class="hljs-string">''</span>;
- }
- <span class="hljs-keyword">return</span> Twig.Templates.parsers.twig({
- options: <span class="hljs-keyword">this</span>.options,
- data: template
- });
- },
- random: <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">value</span>) </span>{
- <span class="hljs-keyword">var</span> LIMIT_INT31 = <span class="hljs-number">0x80000000</span>;
-
- <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">getRandomNumber</span>(<span class="hljs-params">n</span>) </span>{
- <span class="hljs-keyword">var</span> random = <span class="hljs-built_in">Math</span>.floor(<span class="hljs-built_in">Math</span>.random() * LIMIT_INT31);
- <span class="hljs-keyword">var</span> limits = [<span class="hljs-number">0</span>, n];
- <span class="hljs-keyword">var</span> min = <span class="hljs-built_in">Math</span>.min.apply(<span class="hljs-literal">null</span>, limits),
- max = <span class="hljs-built_in">Math</span>.max.apply(<span class="hljs-literal">null</span>, limits);
- <span class="hljs-keyword">return</span> min + <span class="hljs-built_in">Math</span>.floor((max - min + <span class="hljs-number">1</span>) * random / LIMIT_INT31);
- }
-
- <span class="hljs-keyword">if</span>(Twig.lib.is(<span class="hljs-string">"Number"</span>, value)) {
- <span class="hljs-keyword">return</span> getRandomNumber(value);
- }
-
- <span class="hljs-keyword">if</span>(Twig.lib.is(<span class="hljs-string">"String"</span>, value)) {
- <span class="hljs-keyword">return</span> value.charAt(getRandomNumber(value.length<span class="hljs-number">-1</span>));
- }
-
- <span class="hljs-keyword">if</span>(Twig.lib.is(<span class="hljs-string">"Array"</span>, value)) {
- <span class="hljs-keyword">return</span> value[getRandomNumber(value.length<span class="hljs-number">-1</span>)];
- }
-
- <span class="hljs-keyword">if</span>(Twig.lib.is(<span class="hljs-string">"Object"</span>, value)) {
- <span class="hljs-keyword">var</span> keys = <span class="hljs-built_in">Object</span>.keys(value);
- <span class="hljs-keyword">return</span> value[keys[getRandomNumber(keys.length<span class="hljs-number">-1</span>)]];
- }
-
- <span class="hljs-keyword">return</span> getRandomNumber(LIMIT_INT31<span class="hljs-number">-1</span>);
- },
-
- <span class="hljs-comment">/**
- * Returns the content of a template without rendering it
- * @param {string} name
- * @param {boolean} [ignore_missing=false]
- * @returns {string}
- */</span>
- source: <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">name, ignore_missing</span>) </span>{
- <span class="hljs-keyword">var</span> templateSource;
- <span class="hljs-keyword">var</span> templateFound = <span class="hljs-literal">false</span>;
- <span class="hljs-keyword">var</span> isNodeEnvironment = <span class="hljs-keyword">typeof</span> <span class="hljs-built_in">module</span> !== <span class="hljs-string">'undefined'</span> &amp;&amp; <span class="hljs-keyword">typeof</span> <span class="hljs-built_in">module</span>.exports !== <span class="hljs-string">'undefined'</span> &amp;&amp; <span class="hljs-keyword">typeof</span> <span class="hljs-built_in">window</span> === <span class="hljs-string">'undefined'</span>;
- <span class="hljs-keyword">var</span> loader;
- <span class="hljs-keyword">var</span> path;</pre></div></div>
-
- </li>
-
-
- <li id="section-330">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-330">&#182;</a>
- </div>
- <p>if we are running in a node.js environment, set the loader to ‘fs’ and ensure the
-path is relative to the CWD of the running script
-else, set the loader to ‘ajax’ and set the path to the value of name</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">if</span> (isNodeEnvironment) {
- loader = <span class="hljs-string">'fs'</span>;
- path = __dirname + <span class="hljs-string">'/'</span> + name;
- } <span class="hljs-keyword">else</span> {
- loader = <span class="hljs-string">'ajax'</span>;
- path = name;
- }</pre></div></div>
-
- </li>
-
-
- <li id="section-331">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-331">&#182;</a>
- </div>
- <p>build the params object</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">var</span> params = {
- id: name,
- path: path,
- method: loader,
- parser: <span class="hljs-string">'source'</span>,
- <span class="hljs-keyword">async</span>: <span class="hljs-literal">false</span>,
- fetchTemplateSource: <span class="hljs-literal">true</span>
- };</pre></div></div>
-
- </li>
-
-
- <li id="section-332">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-332">&#182;</a>
- </div>
- <p>default ignore_missing to false</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">if</span> (<span class="hljs-keyword">typeof</span> ignore_missing === <span class="hljs-string">'undefined'</span>) {
- ignore_missing = <span class="hljs-literal">false</span>;
- }</pre></div></div>
-
- </li>
-
-
- <li id="section-333">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-333">&#182;</a>
- </div>
- <p>try to load the remote template</p>
-<p>on exception, log it</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">try</span> {
- templateSource = Twig.Templates.loadRemote(name, params);</pre></div></div>
-
- </li>
-
-
- <li id="section-334">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-334">&#182;</a>
- </div>
- <p>if the template is undefined or null, set the template to an empty string and do NOT flip the
-boolean indicating we found the template</p>
-<p>else, all is good! flip the boolean indicating we found the template</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">if</span> (<span class="hljs-keyword">typeof</span> templateSource === <span class="hljs-string">'undefined'</span> || templateSource === <span class="hljs-literal">null</span>) {
- templateSource = <span class="hljs-string">''</span>;
- } <span class="hljs-keyword">else</span> {
- templateFound = <span class="hljs-literal">true</span>;
- }
- } <span class="hljs-keyword">catch</span> (e) {
- Twig.log.debug(<span class="hljs-string">'Twig.functions.source: '</span>, <span class="hljs-string">'Problem loading template '</span>, e);
- }</pre></div></div>
-
- </li>
-
-
- <li id="section-335">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-335">&#182;</a>
- </div>
- <p>if the template was NOT found AND we are not ignoring missing templates, return the same message
-that is returned by the PHP implementation of the twig source() function</p>
-<p>else, return the template source</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">if</span> (!templateFound &amp;&amp; !ignore_missing) {
- <span class="hljs-keyword">return</span> TEMPLATE_NOT_FOUND_MESSAGE.replace(<span class="hljs-string">'{name}'</span>, name);
- } <span class="hljs-keyword">else</span> {
- <span class="hljs-keyword">return</span> templateSource;
- }
- }
- };
-
- Twig._function = <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">_function, value, params</span>) </span>{
- <span class="hljs-keyword">if</span> (!Twig.functions[_function]) {
- <span class="hljs-keyword">throw</span> <span class="hljs-string">"Unable to find function "</span> + _function;
- }
- <span class="hljs-keyword">return</span> Twig.functions[_function](value, params);
- };
-
- Twig._function.extend = <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">_function, definition</span>) </span>{
- Twig.functions[_function] = definition;
- };
-
- <span class="hljs-keyword">return</span> Twig;
-
-})(Twig || { });</pre></div></div>
-
- </li>
-
-
- <li id="section-336">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-336">&#182;</a>
- </div>
- <pre><code>Twig.js
-Available under the BSD <span class="hljs-number">2</span>-Clause License
-https:<span class="hljs-comment">//github.com/justjohn/twig.js</span>
-</code></pre>
- </div>
-
- </li>
-
-
- <li id="section-337">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-337">&#182;</a>
- </div>
- <h2 id="twig-path-js">twig.path.js</h2>
-<p>This file handles path parsing</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre><span class="hljs-keyword">var</span> Twig = (<span class="hljs-function"><span class="hljs-keyword">function</span> (<span class="hljs-params">Twig</span>) </span>{
-<span class="hljs-meta"> "use strict"</span>;
-
- <span class="hljs-comment">/**
- * Namespace for path handling.
- */</span>
- Twig.path = {};
-
- <span class="hljs-comment">/**
- * Generate the canonical version of a url based on the given base path and file path and in
- * the previously registered namespaces.
- *
- * @param {string} template The Twig Template
- * @param {string} file The file path, may be relative and may contain namespaces.
- *
- * @return {string} The canonical version of the path
- */</span>
- Twig.path.parsePath = <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">template, file</span>) </span>{
- <span class="hljs-keyword">var</span> namespaces = <span class="hljs-literal">null</span>,
- file = file || <span class="hljs-string">""</span>;
-
- <span class="hljs-keyword">if</span> (<span class="hljs-keyword">typeof</span> template === <span class="hljs-string">'object'</span> &amp;&amp; <span class="hljs-keyword">typeof</span> template.options === <span class="hljs-string">'object'</span>) {
- namespaces = template.options.namespaces;
- }
-
- <span class="hljs-keyword">if</span> (<span class="hljs-keyword">typeof</span> namespaces === <span class="hljs-string">'object'</span> &amp;&amp; (file.indexOf(<span class="hljs-string">'::'</span>) &gt; <span class="hljs-number">0</span>) || file.indexOf(<span class="hljs-string">'@'</span>) &gt;= <span class="hljs-number">0</span>){
- <span class="hljs-keyword">for</span> (<span class="hljs-keyword">var</span> k <span class="hljs-keyword">in</span> namespaces){
- <span class="hljs-keyword">if</span> (namespaces.hasOwnProperty(k)) {
- file = file.replace(k + <span class="hljs-string">'::'</span>, namespaces[k]);
- file = file.replace(<span class="hljs-string">'@'</span> + k, namespaces[k]);
- }
- }
-
- <span class="hljs-keyword">return</span> file;
- }
-
- <span class="hljs-keyword">return</span> Twig.path.relativePath(template, file);
- };
-
- <span class="hljs-comment">/**
- * Generate the relative canonical version of a url based on the given base path and file path.
- *
- * @param {Twig.Template} template The Twig.Template.
- * @param {string} file The file path, relative to the base path.
- *
- * @return {string} The canonical version of the path.
- */</span>
- Twig.path.relativePath = <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">template, file</span>) </span>{
- <span class="hljs-keyword">var</span> base,
- base_path,
- sep_chr = <span class="hljs-string">"/"</span>,
- new_path = [],
- file = file || <span class="hljs-string">""</span>,
- val;
-
- <span class="hljs-keyword">if</span> (template.url) {
- <span class="hljs-keyword">if</span> (<span class="hljs-keyword">typeof</span> template.base !== <span class="hljs-string">'undefined'</span>) {
- base = template.base + ((template.base.charAt(template.base.length<span class="hljs-number">-1</span>) === <span class="hljs-string">'/'</span>) ? <span class="hljs-string">''</span> : <span class="hljs-string">'/'</span>);
- } <span class="hljs-keyword">else</span> {
- base = template.url;
- }
- } <span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span> (template.path) {</pre></div></div>
-
- </li>
-
-
- <li id="section-338">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-338">&#182;</a>
- </div>
- <p>Get the system-specific path separator</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">var</span> path = <span class="hljs-built_in">require</span>(<span class="hljs-string">"path"</span>),
- sep = path.sep || sep_chr,
- relative = <span class="hljs-keyword">new</span> <span class="hljs-built_in">RegExp</span>(<span class="hljs-string">"^\\.{1,2}"</span> + sep.replace(<span class="hljs-string">"\\"</span>, <span class="hljs-string">"\\\\"</span>));
- file = file.replace(<span class="hljs-regexp">/\//g</span>, sep);
-
- <span class="hljs-keyword">if</span> (template.base !== <span class="hljs-literal">undefined</span> &amp;&amp; file.match(relative) == <span class="hljs-literal">null</span>) {
- file = file.replace(template.base, <span class="hljs-string">''</span>);
- base = template.base + sep;
- } <span class="hljs-keyword">else</span> {
- base = path.normalize(template.path);
- }
-
- base = base.replace(sep+sep, sep);
- sep_chr = sep;
- } <span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span> ((template.name || template.id) &amp;&amp; template.method &amp;&amp; template.method !== <span class="hljs-string">'fs'</span> &amp;&amp; template.method !== <span class="hljs-string">'ajax'</span>) {</pre></div></div>
-
- </li>
-
-
- <li id="section-339">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-339">&#182;</a>
- </div>
- <p>Custom registered loader</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> base = template.base || template.name || template.id;
- } <span class="hljs-keyword">else</span> {
- <span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> Twig.Error(<span class="hljs-string">"Cannot extend an inline template."</span>);
- }
-
- base_path = base.split(sep_chr);</pre></div></div>
-
- </li>
-
-
- <li id="section-340">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-340">&#182;</a>
- </div>
- <p>Remove file from url</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> base_path.pop();
- base_path = base_path.concat(file.split(sep_chr));
-
- <span class="hljs-keyword">while</span> (base_path.length &gt; <span class="hljs-number">0</span>) {
- val = base_path.shift();
- <span class="hljs-keyword">if</span> (val == <span class="hljs-string">"."</span>) {</pre></div></div>
-
- </li>
-
-
- <li id="section-341">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-341">&#182;</a>
- </div>
- <p>Ignore</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> } <span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span> (val == <span class="hljs-string">".."</span> &amp;&amp; new_path.length &gt; <span class="hljs-number">0</span> &amp;&amp; new_path[new_path.length<span class="hljs-number">-1</span>] != <span class="hljs-string">".."</span>) {
- new_path.pop();
- } <span class="hljs-keyword">else</span> {
- new_path.push(val);
- }
- }
-
- <span class="hljs-keyword">return</span> new_path.join(sep_chr);
- };
-
- <span class="hljs-keyword">return</span> Twig;
-}) (Twig || { });</pre></div></div>
-
- </li>
-
-
- <li id="section-342">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-342">&#182;</a>
- </div>
- <pre><code>Twig.js
-Available under the BSD <span class="hljs-number">2</span>-Clause License
-https:<span class="hljs-comment">//github.com/justjohn/twig.js</span>
-</code></pre>
- </div>
-
- </li>
-
-
- <li id="section-343">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-343">&#182;</a>
- </div>
- <h2 id="twig-tests-js">twig.tests.js</h2>
-<p>This file handles expression tests. (is empty, is not defined, etc…)</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre><span class="hljs-keyword">var</span> Twig = (<span class="hljs-function"><span class="hljs-keyword">function</span> (<span class="hljs-params">Twig</span>) </span>{
-<span class="hljs-meta"> "use strict"</span>;
- Twig.tests = {
- empty: <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">value</span>) </span>{
- <span class="hljs-keyword">if</span> (value === <span class="hljs-literal">null</span> || value === <span class="hljs-literal">undefined</span>) <span class="hljs-keyword">return</span> <span class="hljs-literal">true</span>;</pre></div></div>
-
- </li>
-
-
- <li id="section-344">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-344">&#182;</a>
- </div>
- <p>Handler numbers</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">if</span> (<span class="hljs-keyword">typeof</span> value === <span class="hljs-string">"number"</span>) <span class="hljs-keyword">return</span> <span class="hljs-literal">false</span>; <span class="hljs-comment">// numbers are never "empty"</span></pre></div></div>
-
- </li>
-
-
- <li id="section-345">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-345">&#182;</a>
- </div>
- <p>Handle strings and arrays</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">if</span> (value.length &amp;&amp; value.length &gt; <span class="hljs-number">0</span>) <span class="hljs-keyword">return</span> <span class="hljs-literal">false</span>;</pre></div></div>
-
- </li>
-
-
- <li id="section-346">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-346">&#182;</a>
- </div>
- <p>Handle objects</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">for</span> (<span class="hljs-keyword">var</span> key <span class="hljs-keyword">in</span> value) {
- <span class="hljs-keyword">if</span> (value.hasOwnProperty(key)) <span class="hljs-keyword">return</span> <span class="hljs-literal">false</span>;
- }
- <span class="hljs-keyword">return</span> <span class="hljs-literal">true</span>;
- },
- odd: <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">value</span>) </span>{
- <span class="hljs-keyword">return</span> value % <span class="hljs-number">2</span> === <span class="hljs-number">1</span>;
- },
- even: <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">value</span>) </span>{
- <span class="hljs-keyword">return</span> value % <span class="hljs-number">2</span> === <span class="hljs-number">0</span>;
- },
- divisibleby: <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">value, params</span>) </span>{
- <span class="hljs-keyword">return</span> value % params[<span class="hljs-number">0</span>] === <span class="hljs-number">0</span>;
- },
- defined: <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">value</span>) </span>{
- <span class="hljs-keyword">return</span> value !== <span class="hljs-literal">undefined</span>;
- },
- none: <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">value</span>) </span>{
- <span class="hljs-keyword">return</span> value === <span class="hljs-literal">null</span>;
- },
- <span class="hljs-string">'null'</span>: <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">value</span>) </span>{
- <span class="hljs-keyword">return</span> <span class="hljs-keyword">this</span>.none(value); <span class="hljs-comment">// Alias of none</span>
- },
- sameas: <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">value, params</span>) </span>{
- <span class="hljs-keyword">return</span> value === params[<span class="hljs-number">0</span>];
- },
- iterable: <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">value</span>) </span>{
- <span class="hljs-keyword">return</span> value &amp;&amp; (Twig.lib.is(<span class="hljs-string">"Array"</span>, value) || Twig.lib.is(<span class="hljs-string">"Object"</span>, value));
- }
- <span class="hljs-comment">/*
- constant ?
- */</span>
- };
-
- Twig.test = <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">test, value, params</span>) </span>{
- <span class="hljs-keyword">if</span> (!Twig.tests[test]) {
- <span class="hljs-keyword">throw</span> <span class="hljs-string">"Test "</span> + test + <span class="hljs-string">" is not defined."</span>;
- }
- <span class="hljs-keyword">return</span> Twig.tests[test](value, params);
- };
-
- Twig.test.extend = <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">test, definition</span>) </span>{
- Twig.tests[test] = definition;
- };
-
- <span class="hljs-keyword">return</span> Twig;
-})( Twig || { } );</pre></div></div>
-
- </li>
-
-
- <li id="section-347">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-347">&#182;</a>
- </div>
- <pre><code>Twig.js
-Available under the BSD <span class="hljs-number">2</span>-Clause License
-https:<span class="hljs-comment">//github.com/justjohn/twig.js</span>
-</code></pre>
- </div>
-
- </li>
-
-
- <li id="section-348">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-348">&#182;</a>
- </div>
- <h2 id="twig-exports-js">twig.exports.js</h2>
-<p>This file provides extension points and other hooks into the twig functionality.</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre>
-<span class="hljs-keyword">var</span> Twig = (<span class="hljs-function"><span class="hljs-keyword">function</span> (<span class="hljs-params">Twig</span>) </span>{
-<span class="hljs-meta"> "use strict"</span>;
- Twig.exports = {
- VERSION: Twig.VERSION
- };
-
- <span class="hljs-comment">/**
- * Create and compile a twig.js template.
- *
- * @param {Object} param Paramteres for creating a Twig template.
- *
- * @return {Twig.Template} A Twig template ready for rendering.
- */</span>
- Twig.exports.twig = <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">twig</span>(<span class="hljs-params">params</span>) </span>{
-<span class="hljs-meta"> 'use strict'</span>;
- <span class="hljs-keyword">var</span> id = params.id,
- options = {
- strict_variables: params.strict_variables || <span class="hljs-literal">false</span>,</pre></div></div>
-
- </li>
-
-
- <li id="section-349">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-349">&#182;</a>
- </div>
- <p>TODO: turn autoscape on in the next major version</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> autoescape: params.autoescape != <span class="hljs-literal">null</span> &amp;&amp; params.autoescape || <span class="hljs-literal">false</span>,
- allowInlineIncludes: params.allowInlineIncludes || <span class="hljs-literal">false</span>,
- rethrow: params.rethrow || <span class="hljs-literal">false</span>,
- namespaces: params.namespaces
- };
-
- <span class="hljs-keyword">if</span> (Twig.cache &amp;&amp; id) {
- Twig.validateId(id);
- }
-
- <span class="hljs-keyword">if</span> (params.debug !== <span class="hljs-literal">undefined</span>) {
- Twig.debug = params.debug;
- }
- <span class="hljs-keyword">if</span> (params.trace !== <span class="hljs-literal">undefined</span>) {
- Twig.trace = params.trace;
- }
-
- <span class="hljs-keyword">if</span> (params.data !== <span class="hljs-literal">undefined</span>) {
- <span class="hljs-keyword">return</span> Twig.Templates.parsers.twig({
- data: params.data,
- path: params.hasOwnProperty(<span class="hljs-string">'path'</span>) ? params.path : <span class="hljs-literal">undefined</span>,
- <span class="hljs-built_in">module</span>: params.module,
- id: id,
- options: options
- });
-
- } <span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span> (params.ref !== <span class="hljs-literal">undefined</span>) {
- <span class="hljs-keyword">if</span> (params.id !== <span class="hljs-literal">undefined</span>) {
- <span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> Twig.Error(<span class="hljs-string">"Both ref and id cannot be set on a twig.js template."</span>);
- }
- <span class="hljs-keyword">return</span> Twig.Templates.load(params.ref);
-
- } <span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span> (params.method !== <span class="hljs-literal">undefined</span>) {
- <span class="hljs-keyword">if</span> (!Twig.Templates.isRegisteredLoader(params.method)) {
- <span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> Twig.Error(<span class="hljs-string">'Loader for "'</span> + params.method + <span class="hljs-string">'" is not defined.'</span>);
- }
- <span class="hljs-keyword">return</span> Twig.Templates.loadRemote(params.name || params.href || params.path || id || <span class="hljs-literal">undefined</span>, {
- id: id,
- method: params.method,
- parser: params.parser || <span class="hljs-string">'twig'</span>,
- base: params.base,
- <span class="hljs-built_in">module</span>: params.module,
- precompiled: params.precompiled,
- <span class="hljs-keyword">async</span>: params.async,
- options: options
-
- }, params.load, params.error);
-
- } <span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span> (params.href !== <span class="hljs-literal">undefined</span>) {
- <span class="hljs-keyword">return</span> Twig.Templates.loadRemote(params.href, {
- id: id,
- method: <span class="hljs-string">'ajax'</span>,
- parser: params.parser || <span class="hljs-string">'twig'</span>,
- base: params.base,
- <span class="hljs-built_in">module</span>: params.module,
- precompiled: params.precompiled,
- <span class="hljs-keyword">async</span>: params.async,
- options: options
-
- }, params.load, params.error);
-
- } <span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span> (params.path !== <span class="hljs-literal">undefined</span>) {
- <span class="hljs-keyword">return</span> Twig.Templates.loadRemote(params.path, {
- id: id,
- method: <span class="hljs-string">'fs'</span>,
- parser: params.parser || <span class="hljs-string">'twig'</span>,
- base: params.base,
- <span class="hljs-built_in">module</span>: params.module,
- precompiled: params.precompiled,
- <span class="hljs-keyword">async</span>: params.async,
- options: options
-
- }, params.load, params.error);
- }
- };</pre></div></div>
-
- </li>
-
-
- <li id="section-350">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-350">&#182;</a>
- </div>
- <p>Extend Twig with a new filter.</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> Twig.exports.extendFilter = <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">filter, definition</span>) </span>{
- Twig.filter.extend(filter, definition);
- };</pre></div></div>
-
- </li>
-
-
- <li id="section-351">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-351">&#182;</a>
- </div>
- <p>Extend Twig with a new function.</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> Twig.exports.extendFunction = <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">fn, definition</span>) </span>{
- Twig._function.extend(fn, definition);
- };</pre></div></div>
-
- </li>
-
-
- <li id="section-352">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-352">&#182;</a>
- </div>
- <p>Extend Twig with a new test.</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> Twig.exports.extendTest = <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">test, definition</span>) </span>{
- Twig.test.extend(test, definition);
- };</pre></div></div>
-
- </li>
-
-
- <li id="section-353">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-353">&#182;</a>
- </div>
- <p>Extend Twig with a new definition.</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> Twig.exports.extendTag = <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">definition</span>) </span>{
- Twig.logic.extend(definition);
- };</pre></div></div>
-
- </li>
-
-
- <li id="section-354">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-354">&#182;</a>
- </div>
- <p>Provide an environment for extending Twig core.
-Calls fn with the internal Twig object.</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> Twig.exports.extend = <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">fn</span>) </span>{
- fn(Twig);
- };
-
-
- <span class="hljs-comment">/**
- * Provide an extension for use with express 2.
- *
- * @param {string} markup The template markup.
- * @param {array} options The express options.
- *
- * @return {string} The rendered template.
- */</span>
- Twig.exports.compile = <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">markup, options</span>) </span>{
- <span class="hljs-keyword">var</span> id = options.filename,
- path = options.filename,
- template;</pre></div></div>
-
- </li>
-
-
- <li id="section-355">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-355">&#182;</a>
- </div>
- <p>Try to load the template from the cache</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> template = <span class="hljs-keyword">new</span> Twig.Template({
- data: markup,
- path: path,
- id: id,
- options: options.settings[<span class="hljs-string">'twig options'</span>]
- }); <span class="hljs-comment">// Twig.Templates.load(id) ||</span>
-
- <span class="hljs-keyword">return</span> <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">context</span>) </span>{
- <span class="hljs-keyword">return</span> template.render(context);
- };
- };
-
- <span class="hljs-comment">/**
- * Provide an extension for use with express 3.
- *
- * @param {string} path The location of the template file on disk.
- * @param {Object|Function} The options or callback.
- * @param {Function} fn callback.
- *
- * @throws Twig.Error
- */</span>
- Twig.exports.renderFile = <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">path, options, fn</span>) </span>{</pre></div></div>
-
- </li>
-
-
- <li id="section-356">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-356">&#182;</a>
- </div>
- <p>handle callback in options</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">if</span> (<span class="hljs-keyword">typeof</span> options === <span class="hljs-string">'function'</span>) {
- fn = options;
- options = {};
- }
-
- options = options || {};
-
- <span class="hljs-keyword">var</span> settings = options.settings || {};
-
- <span class="hljs-keyword">var</span> params = {
- path: path,
- base: settings.views,
- load: <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">template</span>) </span>{</pre></div></div>
-
- </li>
-
-
- <li id="section-357">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-357">&#182;</a>
- </div>
- <p>render and return template</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> fn(<span class="hljs-literal">null</span>, template.render(options));
- }
- };</pre></div></div>
-
- </li>
-
-
- <li id="section-358">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-358">&#182;</a>
- </div>
- <p>mixin any options provided to the express app.</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">var</span> view_options = settings[<span class="hljs-string">'twig options'</span>];
-
- <span class="hljs-keyword">if</span> (view_options) {
- <span class="hljs-keyword">for</span> (<span class="hljs-keyword">var</span> option <span class="hljs-keyword">in</span> view_options) {
- <span class="hljs-keyword">if</span> (view_options.hasOwnProperty(option)) {
- params[option] = view_options[option];
- }
- }
- }
-
- Twig.exports.twig(params);
- };</pre></div></div>
-
- </li>
-
-
- <li id="section-359">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-359">&#182;</a>
- </div>
- <p>Express 3 handler</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> Twig.exports.__express = Twig.exports.renderFile;
-
- <span class="hljs-comment">/**
- * Shoud Twig.js cache templates.
- * Disable during development to see changes to templates without
- * reloading, and disable in production to improve performance.
- *
- * @param {boolean} cache
- */</span>
- Twig.exports.cache = <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">cache</span>) </span>{
- Twig.cache = cache;
- };</pre></div></div>
-
- </li>
-
-
- <li id="section-360">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-360">&#182;</a>
- </div>
- <p>We need to export the path module so we can effectively test it</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> Twig.exports.path = Twig.path;
-
- <span class="hljs-keyword">return</span> Twig;
-}) (Twig || { });</pre></div></div>
-
- </li>
-
-
- <li id="section-361">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-361">&#182;</a>
- </div>
- <pre><code>Twig.js
-Available under the BSD <span class="hljs-number">2</span>-Clause License
-https:<span class="hljs-comment">//github.com/justjohn/twig.js</span>
-</code></pre>
- </div>
-
- </li>
-
-
- <li id="section-362">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-362">&#182;</a>
- </div>
- <h2 id="twig-compiler-js">twig.compiler.js</h2>
-<p>This file handles compiling templates into JS</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre><span class="hljs-keyword">var</span> Twig = (<span class="hljs-function"><span class="hljs-keyword">function</span> (<span class="hljs-params">Twig</span>) </span>{
- <span class="hljs-comment">/**
- * Namespace for compilation.
- */</span>
- Twig.compiler = {
- <span class="hljs-built_in">module</span>: {}
- };</pre></div></div>
-
- </li>
-
-
- <li id="section-363">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-363">&#182;</a>
- </div>
- <p>Compile a Twig Template to output.</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> Twig.compiler.compile = <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">template, options</span>) </span>{</pre></div></div>
-
- </li>
-
-
- <li id="section-364">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-364">&#182;</a>
- </div>
- <p>Get tokens</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">var</span> tokens = <span class="hljs-built_in">JSON</span>.stringify(template.tokens)
- , id = template.id
- , output;
-
- <span class="hljs-keyword">if</span> (options.module) {
- <span class="hljs-keyword">if</span> (Twig.compiler.module[options.module] === <span class="hljs-literal">undefined</span>) {
- <span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> Twig.Error(<span class="hljs-string">"Unable to find module type "</span> + options.module);
- }
- output = Twig.compiler.module[options.module](id, tokens, options.twig);
- } <span class="hljs-keyword">else</span> {
- output = Twig.compiler.wrap(id, tokens);
- }
- <span class="hljs-keyword">return</span> output;
- };
-
- Twig.compiler.module = {
- amd: <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">id, tokens, pathToTwig</span>) </span>{
- <span class="hljs-keyword">return</span> <span class="hljs-string">'define(["'</span> + pathToTwig + <span class="hljs-string">'"], function (Twig) {\n\tvar twig, templates;\ntwig = Twig.twig;\ntemplates = '</span> + Twig.compiler.wrap(id, tokens) + <span class="hljs-string">'\n\treturn templates;\n});'</span>;
- }
- , node: <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">id, tokens</span>) </span>{
- <span class="hljs-keyword">return</span> <span class="hljs-string">'var twig = require("twig").twig;\n'</span>
- + <span class="hljs-string">'exports.template = '</span> + Twig.compiler.wrap(id, tokens)
- }
- , cjs2: <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">id, tokens, pathToTwig</span>) </span>{
- <span class="hljs-keyword">return</span> <span class="hljs-string">'module.declare([{ twig: "'</span> + pathToTwig + <span class="hljs-string">'" }], function (require, exports, module) {\n'</span>
- + <span class="hljs-string">'\tvar twig = require("twig").twig;\n'</span>
- + <span class="hljs-string">'\texports.template = '</span> + Twig.compiler.wrap(id, tokens)
- + <span class="hljs-string">'\n});'</span>
- }
- };
-
- Twig.compiler.wrap = <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">id, tokens</span>) </span>{
- <span class="hljs-keyword">return</span> <span class="hljs-string">'twig({id:"'</span>+id.replace(<span class="hljs-string">'"'</span>, <span class="hljs-string">'\\"'</span>)+<span class="hljs-string">'", data:'</span>+tokens+<span class="hljs-string">', precompiled: true});\n'</span>;
- };
-
- <span class="hljs-keyword">return</span> Twig;
-})(Twig || {});</pre></div></div>
-
- </li>
-
-
- <li id="section-365">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-365">&#182;</a>
- </div>
- <pre><code>Twig.js
-Available under the BSD <span class="hljs-number">2</span>-Clause License
-https:<span class="hljs-comment">//github.com/justjohn/twig.js</span>
-</code></pre>
- </div>
-
- </li>
-
-
- <li id="section-366">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-366">&#182;</a>
- </div>
- <h2 id="twig-module-js">twig.module.js</h2>
-<p>Provide a CommonJS/AMD/Node module export.</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre>
-<span class="hljs-keyword">if</span> (<span class="hljs-keyword">typeof</span> <span class="hljs-built_in">module</span> !== <span class="hljs-string">'undefined'</span> &amp;&amp; <span class="hljs-built_in">module</span>.declare) {</pre></div></div>
-
- </li>
-
-
- <li id="section-367">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-367">&#182;</a>
- </div>
- <p>Provide a CommonJS Modules/2.0 draft 8 module</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> <span class="hljs-built_in">module</span>.declare([], <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">require, exports, module</span>) </span>{</pre></div></div>
-
- </li>
-
-
- <li id="section-368">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-368">&#182;</a>
- </div>
- <p>Add exports from the Twig exports</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">for</span> (key <span class="hljs-keyword">in</span> Twig.exports) {
- <span class="hljs-keyword">if</span> (Twig.exports.hasOwnProperty(key)) {
- exports[key] = Twig.exports[key];
- }
- }
- });
-} <span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span> (<span class="hljs-keyword">typeof</span> define == <span class="hljs-string">'function'</span> &amp;&amp; define.amd) {
- define(<span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"></span>) </span>{
- <span class="hljs-keyword">return</span> Twig.exports;
- });
-} <span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span> (<span class="hljs-keyword">typeof</span> <span class="hljs-built_in">module</span> !== <span class="hljs-string">'undefined'</span> &amp;&amp; <span class="hljs-built_in">module</span>.exports) {</pre></div></div>
-
- </li>
-
-
- <li id="section-369">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-369">&#182;</a>
- </div>
- <p>Provide a CommonJS Modules/1.1 module</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> <span class="hljs-built_in">module</span>.exports = Twig.exports;
-} <span class="hljs-keyword">else</span> {</pre></div></div>
-
- </li>
-
-
- <li id="section-370">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-370">&#182;</a>
- </div>
- <p>Export for browser use</p>
-
- </div>
-
- <div class="content"><div class='highlight'><pre> <span class="hljs-built_in">window</span>.twig = Twig.exports.twig;
- <span class="hljs-built_in">window</span>.Twig = Twig.exports;
-}</pre></div></div>
-
- </li>
-
- </ul>
- </div>
-</body>
-</html>