<p>Which is a format that can be fed directly into <ahref="http://github.com/zaach/jison">Jison</a>.</p></td><tdclass="code"><divclass="highlight"><pre></pre></div></td></tr><trid="section-2"><tdclass="docs"><divclass="octowrap"><aclass="octothorpe"href="#section-2">#</a></div><p>Set up the Lexer for both Node.js and the browser, depending on where we are.</p></td><tdclass="code"><divclass="highlight"><pre><spanclass="k">if</span><spanclass="nx">process</span><spanclass="o">?</span>
<spanclass="nv">helpers: </span><spanclass="k">this</span><spanclass="p">.</span><spanclass="nx">helpers</span></pre></div></td></tr><trid="section-3"><tdclass="docs"><divclass="octowrap"><aclass="octothorpe"href="#section-3">#</a></div><p>Import the helpers we need.</p></td><tdclass="code"><divclass="highlight"><pre><spanclass="p">{</span><spanclass="nx">include</span><spanclass="p">,</span><spanclass="nx">count</span><spanclass="p">,</span><spanclass="nx">starts</span><spanclass="p">,</span><spanclass="nx">compact</span><spanclass="p">}</span><spanclass="o">:</span><spanclass="nx">helpers</span></pre></div></td></tr><trid="section-4"><tdclass="docs"><divclass="octowrap"><aclass="octothorpe"href="#section-4">#</a></div><h2>The Lexer Class</h2></td><tdclass="code"><divclass="highlight"><pre></pre></div></td></tr><trid="section-5"><tdclass="docs"><divclass="octowrap"><aclass="octothorpe"href="#section-5">#</a></div><p>The Lexer class reads a stream of CoffeeScript and divvys it up into tagged
pushing some extra smarts into the Lexer.</p></td><tdclass="code"><divclass="highlight"><pre><spanclass="nv">exports.Lexer: </span><spanclass="nx">class</span><spanclass="nx">Lexer</span></pre></div></td></tr><trid="section-6"><tdclass="docs"><divclass="octowrap"><aclass="octothorpe"href="#section-6">#</a></div><p><strong>tokenize</strong> is the Lexer's main method. Scan by attempting to match tokens
<spanclass="vi">@code : </span><spanclass="nx">code</span><spanclass="c1"># The remainder of the source code.</span>
<spanclass="vi">@i : </span><spanclass="mi">0</span><spanclass="c1"># Current character position we're parsing.</span>
<spanclass="vi">@line : </span><spanclass="nx">o</span><spanclass="p">.</span><spanclass="nx">line</span><spanclass="o">or</span><spanclass="mi">0</span><spanclass="c1"># The current line.</span>
<spanclass="vi">@indent : </span><spanclass="mi">0</span><spanclass="c1"># The current indentation level.</span>
<spanclass="p">(</span><spanclass="k">new</span><spanclass="nx">Rewriter</span><spanclass="p">()).</span><spanclass="nx">rewrite</span><spanclass="nx">@tokens</span></pre></div></td></tr><trid="section-7"><tdclass="docs"><divclass="octowrap"><aclass="octothorpe"href="#section-7">#</a></div><p>At every position, run through this list of attempted matches,
<code>@literalToken</code> is the fallback catch-all.</p></td><tdclass="code"><divclass="highlight"><pre><spanclass="nv">extractNextToken: </span><spanclass="o">-></span>
though <code>is</code> means <code>===</code> otherwise.</p></td><tdclass="code"><divclass="highlight"><pre><spanclass="nv">identifierToken: </span><spanclass="o">-></span>
<spanclass="kc">true</span></pre></div></td></tr><trid="section-10"><tdclass="docs"><divclass="octowrap"><aclass="octothorpe"href="#section-10">#</a></div><p>Matches numbers, including decimals, hex, and exponential notation.
Be careful not to interfere with ranges-in-progress.</p></td><tdclass="code"><divclass="highlight"><pre><spanclass="nv">numberToken: </span><spanclass="o">-></span>
<spanclass="kc">true</span></pre></div></td></tr><trid="section-11"><tdclass="docs"><divclass="octowrap"><aclass="octothorpe"href="#section-11">#</a></div><p>Matches strings, including multi-line strings. Ensures that quotation marks
are balanced within the string's contents, and within nested interpolations.</p></td><tdclass="code"><divclass="highlight"><pre><spanclass="nv">stringToken: </span><spanclass="o">-></span>
<spanclass="kc">true</span></pre></div></td></tr><trid="section-12"><tdclass="docs"><divclass="octowrap"><aclass="octothorpe"href="#section-12">#</a></div><p>Matches heredocs, adjusting indentation to the correct level, as heredocs
preserve whitespace, but ignore indentation to the left.</p></td><tdclass="code"><divclass="highlight"><pre><spanclass="nv">heredocToken: </span><spanclass="o">-></span>
<spanclass="kc">true</span></pre></div></td></tr><trid="section-13"><tdclass="docs"><divclass="octowrap"><aclass="octothorpe"href="#section-13">#</a></div><p>Matches and conumes comments.</p></td><tdclass="code"><divclass="highlight"><pre><spanclass="nv">commentToken: </span><spanclass="o">-></span>
<spanclass="kc">true</span></pre></div></td></tr><trid="section-14"><tdclass="docs"><divclass="octowrap"><aclass="octothorpe"href="#section-14">#</a></div><p>Matches JavaScript interpolated directly into the source via backticks.</p></td><tdclass="code"><divclass="highlight"><pre><spanclass="nv">jsToken: </span><spanclass="o">-></span>
JavaScript and Ruby, borrow slash balancing from <code>@balancedToken</code>, and
borrow interpolation from <code>@interpolateString</code>.</p></td><tdclass="code"><divclass="highlight"><pre><spanclass="nv">regexToken: </span><spanclass="o">-></span>
<spanclass="kc">true</span></pre></div></td></tr><trid="section-16"><tdclass="docs"><divclass="octowrap"><aclass="octothorpe"href="#section-16">#</a></div><p>Matches a token in which which the passed delimiter pairs must be correctly
<spanclass="nx">@balancedString</span><spanclass="nx">@chunk</span><spanclass="p">,</span><spanclass="nx">delimited</span></pre></div></td></tr><trid="section-17"><tdclass="docs"><divclass="octowrap"><aclass="octothorpe"href="#section-17">#</a></div><p>Matches newlines, indents, and outdents, and determines which is which.
can close multiple indents, so we need to know how far in we happen to be.</p></td><tdclass="code"><divclass="highlight"><pre><spanclass="nv">lineToken: </span><spanclass="o">-></span>
<spanclass="kc">true</span></pre></div></td></tr><trid="section-18"><tdclass="docs"><divclass="octowrap"><aclass="octothorpe"href="#section-18">#</a></div><p>Record an outdent token or multiple tokens, if we happen to be moving back
inwards past several recorded indents.</p></td><tdclass="code"><divclass="highlight"><pre><spanclass="nv">outdentToken: </span><spanclass="p">(</span><spanclass="nx">moveOut</span><spanclass="p">,</span><spanclass="nx">noNewlines</span><spanclass="p">)</span><spanclass="o">-></span>
<spanclass="kc">true</span></pre></div></td></tr><trid="section-19"><tdclass="docs"><divclass="octowrap"><aclass="octothorpe"href="#section-19">#</a></div><p>Matches and consumes non-meaningful whitespace. Tag the previous token
as being "spaced", because there are some cases where it makes a difference.</p></td><tdclass="code"><divclass="highlight"><pre><spanclass="nv">whitespaceToken: </span><spanclass="o">-></span>
<spanclass="kc">true</span></pre></div></td></tr><trid="section-20"><tdclass="docs"><divclass="octowrap"><aclass="octothorpe"href="#section-20">#</a></div><p>Generate a newline token. Consecutive newlines get merged together.</p></td><tdclass="code"><divclass="highlight"><pre><spanclass="nv">newlineToken: </span><spanclass="p">(</span><spanclass="nx">newlines</span><spanclass="p">)</span><spanclass="o">-></span>
<spanclass="kc">true</span></pre></div></td></tr><trid="section-21"><tdclass="docs"><divclass="octowrap"><aclass="octothorpe"href="#section-21">#</a></div><p>Use a <code>\</code> at a line-ending to suppress the newline.
The slash is removed here once its job is done.</p></td><tdclass="code"><divclass="highlight"><pre><spanclass="nv">suppressNewlines: </span><spanclass="o">-></span>
<spanclass="kc">true</span></pre></div></td></tr><trid="section-22"><tdclass="docs"><divclass="octowrap"><aclass="octothorpe"href="#section-22">#</a></div><p>We treat all other single characters as a token. Eg.: <code>( ) , . !</code>
parentheses that indicate a method call from regular parentheses, and so on.</p></td><tdclass="code"><divclass="highlight"><pre><spanclass="nv">literalToken: </span><spanclass="o">-></span>
<spanclass="kc">true</span></pre></div></td></tr><trid="section-23"><tdclass="docs"><divclass="octowrap"><aclass="octothorpe"href="#section-23">#</a></div><h2>Token Manipulators</h2></td><tdclass="code"><divclass="highlight"><pre></pre></div></td></tr><trid="section-24"><tdclass="docs"><divclass="octowrap"><aclass="octothorpe"href="#section-24">#</a></div><p>As we consume a new <code>IDENTIFIER</code>, look at the previous token to determine
if it's a special kind of accessor. Return <code>true</code> if any type of accessor
is the previous token.</p></td><tdclass="code"><divclass="highlight"><pre><spanclass="nv">tagAccessor: </span><spanclass="o">-></span>
<spanclass="k">if</span><spanclass="nx">accessor</span><spanclass="k">then</span><spanclass="s1">'accessor'</span><spanclass="k">else</span><spanclass="kc">false</span></pre></div></td></tr><trid="section-25"><tdclass="docs"><divclass="octowrap"><aclass="octothorpe"href="#section-25">#</a></div><p>Sanitize a heredoc by escaping internal double quotes and
erasing all external indentation on the left-hand side.</p></td><tdclass="code"><divclass="highlight"><pre><spanclass="nv">sanitizeHeredoc: </span><spanclass="p">(</span><spanclass="nx">doc</span><spanclass="p">,</span><spanclass="nx">options</span><spanclass="p">)</span><spanclass="o">-></span>
<spanclass="p">.</span><spanclass="nx">replace</span><spanclass="p">(</span><spanclass="k">new</span><spanclass="nb">RegExp</span><spanclass="p">(</span><spanclass="nx">options</span><spanclass="p">.</span><spanclass="nx">quote</span><spanclass="p">,</span><spanclass="s1">'g'</span><spanclass="p">),</span><spanclass="s2">"\\$options.quote"</span><spanclass="p">)</span></pre></div></td></tr><trid="section-26"><tdclass="docs"><divclass="octowrap"><aclass="octothorpe"href="#section-26">#</a></div><p>Tag a half assignment.</p></td><tdclass="code"><divclass="highlight"><pre><spanclass="nv">tagHalfAssignment: </span><spanclass="p">(</span><spanclass="nx">tag</span><spanclass="p">)</span><spanclass="o">-></span>
<spanclass="kc">true</span></pre></div></td></tr><trid="section-27"><tdclass="docs"><divclass="octowrap"><aclass="octothorpe"href="#section-27">#</a></div><p>A source of ambiguity in our grammar used to be parameter lists in function
parameters specially in order to make things easier for the parser.</p></td><tdclass="code"><divclass="highlight"><pre><spanclass="nv">tagParameters: </span><spanclass="o">-></span>
<spanclass="kc">true</span></pre></div></td></tr><trid="section-28"><tdclass="docs"><divclass="octowrap"><aclass="octothorpe"href="#section-28">#</a></div><p>Close up all remaining open blocks at the end of the file.</p></td><tdclass="code"><divclass="highlight"><pre><spanclass="nv">closeIndentation: </span><spanclass="o">-></span>
<spanclass="nx">@outdentToken</span><spanclass="nx">@indent</span></pre></div></td></tr><trid="section-29"><tdclass="docs"><divclass="octowrap"><aclass="octothorpe"href="#section-29">#</a></div><p>The error for when you try to use a forbidden word in JavaScript as
an identifier.</p></td><tdclass="code"><divclass="highlight"><pre><spanclass="nv">identifierError: </span><spanclass="p">(</span><spanclass="nx">word</span><spanclass="p">)</span><spanclass="o">-></span>
<spanclass="k">throw</span><spanclass="k">new</span><spanclass="nb">Error</span><spanclass="s2">"SyntaxError: Reserved word \"$word\" on line ${@line + 1}"</span></pre></div></td></tr><trid="section-30"><tdclass="docs"><divclass="octowrap"><aclass="octothorpe"href="#section-30">#</a></div><p>The error for when you try to assign to a reserved word in JavaScript,
like "function" or "default".</p></td><tdclass="code"><divclass="highlight"><pre><spanclass="nv">assignmentError: </span><spanclass="o">-></span>
<spanclass="k">throw</span><spanclass="k">new</span><spanclass="nb">Error</span><spanclass="s2">"SyntaxError: Reserved word \"${@value()}\" on line ${@line + 1} can't be assigned"</span></pre></div></td></tr><trid="section-31"><tdclass="docs"><divclass="octowrap"><aclass="octothorpe"href="#section-31">#</a></div><p>Matches a balanced group such as a single or double-quoted string. Pass in
a series of delimiters, all of which must be nested correctly within the
contents of the string. This method allows us to have strings within
interpolations within strings, ad infinitum.</p></td><tdclass="code"><divclass="highlight"><pre><spanclass="nv">balancedString: </span><spanclass="p">(</span><spanclass="nx">str</span><spanclass="p">,</span><spanclass="nx">delimited</span><spanclass="p">,</span><spanclass="nx">options</span><spanclass="p">)</span><spanclass="o">-></span>
<spanclass="k">throw</span><spanclass="k">new</span><spanclass="nb">Error</span><spanclass="s2">"SyntaxError: Unterminated ${levels.pop()[0]} starting on line ${@line + 1}"</span>
<spanclass="k">if</span><spanclass="o">not</span><spanclass="nx">i</span><spanclass="k">then</span><spanclass="kc">false</span><spanclass="k">else</span><spanclass="nx">str</span><spanclass="p">.</span><spanclass="nx">substring</span><spanclass="p">(</span><spanclass="mi">0</span><spanclass="p">,</span><spanclass="nx">i</span><spanclass="p">)</span></pre></div></td></tr><trid="section-32"><tdclass="docs"><divclass="octowrap"><aclass="octothorpe"href="#section-32">#</a></div><p>Expand variables and expressions inside double-quoted strings using
<spanclass="nx">tokens</span></pre></div></td></tr><trid="section-33"><tdclass="docs"><divclass="octowrap"><aclass="octothorpe"href="#section-33">#</a></div><h2>Helpers</h2></td><tdclass="code"><divclass="highlight"><pre></pre></div></td></tr><trid="section-34"><tdclass="docs"><divclass="octowrap"><aclass="octothorpe"href="#section-34">#</a></div><p>Add a token to the results, taking note of the line number.</p></td><tdclass="code"><divclass="highlight"><pre><spanclass="nv">token: </span><spanclass="p">(</span><spanclass="nx">tag</span><spanclass="p">,</span><spanclass="nx">value</span><spanclass="p">)</span><spanclass="o">-></span>
<spanclass="nx">@tokens</span><spanclass="p">.</span><spanclass="nx">push</span><spanclass="p">[</span><spanclass="nx">tag</span><spanclass="p">,</span><spanclass="nx">value</span><spanclass="p">,</span><spanclass="nx">@line</span><spanclass="p">]</span></pre></div></td></tr><trid="section-35"><tdclass="docs"><divclass="octowrap"><aclass="octothorpe"href="#section-35">#</a></div><p>Peek at a tag in the current token stream.</p></td><tdclass="code"><divclass="highlight"><pre><spanclass="nv">tag: </span><spanclass="p">(</span><spanclass="nx">index</span><spanclass="p">,</span><spanclass="nx">newTag</span><spanclass="p">)</span><spanclass="o">-></span>
<spanclass="nx">tok</span><spanclass="p">[</span><spanclass="mi">0</span><spanclass="p">]</span></pre></div></td></tr><trid="section-36"><tdclass="docs"><divclass="octowrap"><aclass="octothorpe"href="#section-36">#</a></div><p>Peek at a value in the current token stream.</p></td><tdclass="code"><divclass="highlight"><pre><spanclass="nv">value: </span><spanclass="p">(</span><spanclass="nx">index</span><spanclass="p">,</span><spanclass="nx">val</span><spanclass="p">)</span><spanclass="o">-></span>
<spanclass="nx">tok</span><spanclass="p">[</span><spanclass="mi">1</span><spanclass="p">]</span></pre></div></td></tr><trid="section-37"><tdclass="docs"><divclass="octowrap"><aclass="octothorpe"href="#section-37">#</a></div><p>Peek at a previous token, entire.</p></td><tdclass="code"><divclass="highlight"><pre><spanclass="nv">prev: </span><spanclass="p">(</span><spanclass="nx">index</span><spanclass="p">)</span><spanclass="o">-></span>
<spanclass="nx">@tokens</span><spanclass="p">[</span><spanclass="nx">@tokens</span><spanclass="p">.</span><spanclass="nx">length</span><spanclass="o">-</span><spanclass="p">(</span><spanclass="nx">index</span><spanclass="o">or</span><spanclass="mi">1</span><spanclass="p">)]</span></pre></div></td></tr><trid="section-38"><tdclass="docs"><divclass="octowrap"><aclass="octothorpe"href="#section-38">#</a></div><p>Attempt to match a string against the current chunk, returning the indexed
match if successful, and <code>false</code> otherwise.</p></td><tdclass="code"><divclass="highlight"><pre><spanclass="nv">match: </span><spanclass="p">(</span><spanclass="nx">regex</span><spanclass="p">,</span><spanclass="nx">index</span><spanclass="p">)</span><spanclass="o">-></span>
<spanclass="k">if</span><spanclass="nx">m</span><spanclass="k">then</span><spanclass="nx">m</span><spanclass="p">[</span><spanclass="nx">index</span><spanclass="p">]</span><spanclass="k">else</span><spanclass="kc">false</span></pre></div></td></tr><trid="section-39"><tdclass="docs"><divclass="octowrap"><aclass="octothorpe"href="#section-39">#</a></div><p>Are we in the midst of an unfinished expression?</p></td><tdclass="code"><divclass="highlight"><pre><spanclass="nv">unfinished: </span><spanclass="o">-></span>
<spanclass="nx">prev</span><spanclass="o">and</span><spanclass="p">(</span><spanclass="nx">prev</span><spanclass="p">[</span><spanclass="mi">0</span><spanclass="p">]</span><spanclass="o">isnt</span><spanclass="s1">'.'</span><spanclass="p">)</span><spanclass="o">and</span><spanclass="o">not</span><spanclass="nx">@value</span><spanclass="p">().</span><spanclass="nx">match</span><spanclass="p">(</span><spanclass="nx">CODE</span><spanclass="p">)</span></pre></div></td></tr><trid="section-40"><tdclass="docs"><divclass="octowrap"><aclass="octothorpe"href="#section-40">#</a></div><h2>Constants</h2></td><tdclass="code"><divclass="highlight"><pre></pre></div></td></tr><trid="section-41"><tdclass="docs"><divclass="octowrap"><aclass="octothorpe"href="#section-41">#</a></div><p>Keywords that CoffeeScript shares in common with JavaScript.</p></td><tdclass="code"><divclass="highlight"><pre><spanclass="nv">JS_KEYWORDS: </span><spanclass="p">[</span>
<spanclass="p">]</span></pre></div></td></tr><trid="section-42"><tdclass="docs"><divclass="octowrap"><aclass="octothorpe"href="#section-42">#</a></div><p>CoffeeScript-only keywords, which we're more relaxed about allowing. They can't
be used standalone, but you can reference them as an attached property.</p></td><tdclass="code"><divclass="highlight"><pre><spanclass="nv">COFFEE_ALIASES: </span><spanclass="p">[</span><spanclass="s2">"and"</span><spanclass="p">,</span><spanclass="s2">"or"</span><spanclass="p">,</span><spanclass="s2">"is"</span><spanclass="p">,</span><spanclass="s2">"isnt"</span><spanclass="p">,</span><spanclass="s2">"not"</span><spanclass="p">]</span>
<spanclass="p">]</span></pre></div></td></tr><trid="section-43"><tdclass="docs"><divclass="octowrap"><aclass="octothorpe"href="#section-43">#</a></div><p>The list of keywords that are reserved by JavaScript, but not used, or are
used by CoffeeScript internally. We throw an error when these are encountered,
to avoid having a JavaScript error at runtime.</p></td><tdclass="code"><divclass="highlight"><pre><spanclass="nv">RESERVED: </span><spanclass="p">[</span>
<spanclass="p">]</span></pre></div></td></tr><trid="section-44"><tdclass="docs"><divclass="octowrap"><aclass="octothorpe"href="#section-44">#</a></div><p>The superset of both JavaScript keywords and reserved words, none of which may
be used as identifiers or properties.</p></td><tdclass="code"><divclass="highlight"><pre><spanclass="nv">JS_FORBIDDEN: </span><spanclass="nx">JS_KEYWORDS</span><spanclass="p">.</span><spanclass="nx">concat</span><spanclass="nx">RESERVED</span></pre></div></td></tr><trid="section-45"><tdclass="docs"><divclass="octowrap"><aclass="octothorpe"href="#section-45">#</a></div><p>Token matching regexes.</p></td><tdclass="code"><divclass="highlight"><pre><spanclass="nv">IDENTIFIER : </span><spanclass="sr">/^([a-zA-Z\$_](\w|\$)*)/</span>
<spanclass="nv">NEXT_CHARACTER : </span><spanclass="sr">/^\s*(\S)/</span></pre></div></td></tr><trid="section-48"><tdclass="docs"><divclass="octowrap"><aclass="octothorpe"href="#section-48">#</a></div><p>Tokens which a regular expression will never immediately follow, but which
<p>Our list is shorter, due to sans-parentheses method calls.</p></td><tdclass="code"><divclass="highlight"><pre><spanclass="nv">NOT_REGEX: </span><spanclass="p">[</span>
<spanclass="p">]</span></pre></div></td></tr><trid="section-49"><tdclass="docs"><divclass="octowrap"><aclass="octothorpe"href="#section-49">#</a></div><p>Tokens which could legitimately be invoked or indexed. A opening
of a function invocation or indexing operation.</p></td><tdclass="code"><divclass="highlight"><pre><spanclass="nv">CALLABLE: </span><spanclass="p">[</span><spanclass="s1">'IDENTIFIER'</span><spanclass="p">,</span><spanclass="s1">'SUPER'</span><spanclass="p">,</span><spanclass="s1">')'</span><spanclass="p">,</span><spanclass="s1">']'</span><spanclass="p">,</span><spanclass="s1">'}'</span><spanclass="p">,</span><spanclass="s1">'STRING'</span><spanclass="p">,</span><spanclass="s1">'@'</span><spanclass="p">,</span><spanclass="s1">'THIS'</span><spanclass="p">,</span><spanclass="s1">'?'</span><spanclass="p">,</span><spanclass="s1">'::'</span><spanclass="p">]</span></pre></div></td></tr><trid="section-50"><tdclass="docs"><divclass="octowrap"><aclass="octothorpe"href="#section-50">#</a></div><p>Tokens that, when immediately preceding a <code>WHEN</code>, indicate that the <code>WHEN</code>
avoid an ambiguity in the grammar.</p></td><tdclass="code"><divclass="highlight"><pre><spanclass="nv">LINE_BREAK: </span><spanclass="p">[</span><spanclass="s1">'INDENT'</span><spanclass="p">,</span><spanclass="s1">'OUTDENT'</span><spanclass="p">,</span><spanclass="s1">'TERMINATOR'</span><spanclass="p">]</span></pre></div></td></tr><trid="section-51"><tdclass="docs"><divclass="octowrap"><aclass="octothorpe"href="#section-51">#</a></div><p>Half-assignments...</p></td><tdclass="code"><divclass="highlight"><pre><spanclass="nv">HALF_ASSIGNMENTS: </span><spanclass="p">[</span><spanclass="s1">'-'</span><spanclass="p">,</span><spanclass="s1">'+'</span><spanclass="p">,</span><spanclass="s1">'/'</span><spanclass="p">,</span><spanclass="s1">'*'</span><spanclass="p">,</span><spanclass="s1">'%'</span><spanclass="p">,</span><spanclass="s1">'||'</span><spanclass="p">,</span><spanclass="s1">'&&'</span><spanclass="p">,</span><spanclass="s1">'?'</span><spanclass="p">]</span></pre></div></td></tr><trid="section-52"><tdclass="docs"><divclass="octowrap"><aclass="octothorpe"href="#section-52">#</a></div><p>Conversions from CoffeeScript operators into JavaScript ones.</p></td><tdclass="code"><divclass="highlight"><pre><spanclass="nv">CONVERSIONS: </span><spanclass="p">{</span>