UNPKG

encode-x

Version:

Original encoder and decoder, default goes up to base 65411.

548 lines (392 loc) 31.2 kB
<!DOCTYPE html> <html> <head> <title>encode-x.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>encode-x.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-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"></span>)</span>{ <span class="hljs-keyword">var</span> LAST_COMPUTED_ALPH = <span class="hljs-string">""</span>;</pre></div></div> </li> <li id="section-2"> <div class="annotation"> <div class="pilwrap "> <a class="pilcrow" href="#section-2">&#182;</a> </div> <p>Precomputed bases to help out, specifically base16 for hex, base58 for bitcoin and base64 for blobs.</p> </div> <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">const</span> BASES = { <span class="hljs-attr">BASE_2</span>: <span class="hljs-string">"01"</span>, <span class="hljs-attr">BASE_8</span>: <span class="hljs-string">"01234567"</span>, <span class="hljs-attr">BASE_11</span>: <span class="hljs-string">"0123456789a"</span>, <span class="hljs-attr">BASE_16</span>: <span class="hljs-string">"0123456789abcdef"</span>, <span class="hljs-attr">BASE_32</span>: <span class="hljs-string">"0123456789ABCDEFGHJKMNPQRSTVWXYZ"</span>, <span class="hljs-attr">BASE_36</span>: <span class="hljs-string">"0123456789abcdefghijklmnopqrstuvwxyz"</span>, <span class="hljs-attr">BASE_58</span>: <span class="hljs-string">"123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvqxyz"</span>, <span class="hljs-attr">BASE_62</span>: <span class="hljs-string">"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"</span>, <span class="hljs-attr">BASE_64</span>: <span class="hljs-string">"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"</span>, <span class="hljs-attr">BASE_66</span>: <span class="hljs-string">"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_.!~"</span>, <span class="hljs-attr">BASE_95</span>: <span class="hljs-string">"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/~!@#$%^&amp;*()_`&lt;&gt;,.?'\";:[{]}\\|=- "</span>, <span class="hljs-attr">FALL_BACK</span>: <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">max_i</span>)</span>{ <span class="hljs-keyword">let</span> res = <span class="hljs-string">"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/~!@#$%^&amp;*()_`&lt;&gt;,.?'\";:[{]}\\|=- "</span>; <span class="hljs-keyword">if</span>(LAST_COMPUTED_ALPH.length &gt;= max_i) <span class="hljs-keyword">return</span> LAST_COMPUTED_APLH.slice(<span class="hljs-number">0</span>, max_i); <span class="hljs-keyword">if</span>(res.length &gt;= max_i) <span class="hljs-keyword">return</span> res.slice(<span class="hljs-number">0</span>, max_i);</pre></div></div> </li> <li id="section-3"> <div class="annotation"> <div class="pilwrap "> <a class="pilcrow" href="#section-3">&#182;</a> </div> <p>If the precomputations didnt help pump them up by looping through unicode. Not getting any results over ~66000 so just going to hard code that for version 1.</p> </div> <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">for</span>(<span class="hljs-keyword">let</span> i = <span class="hljs-number">0</span>; i &lt; <span class="hljs-number">67777</span> &amp;&amp; res.length &lt; max_i; ++i) { <span class="hljs-keyword">let</span> char = <span class="hljs-built_in">String</span>.fromCharCode(i); <span class="hljs-keyword">if</span>(res.includes(char) <span class="hljs-comment">// Throw away included chars.</span> || <span class="hljs-regexp">/^[\p{Cc}\p{Cf}\p{Zl}\p{Zp}]*$/</span>.test(char) <span class="hljs-comment">// throw away some unicode spaces.</span> || !<span class="hljs-regexp">/^[\u0020-\u007e\u00a0-\uffff]*$/</span>.test(char) <span class="hljs-comment">// Throw away 'unprintables'</span> || <span class="hljs-regexp">/^[\u0fd9-\u0fff]*$/</span>.test(char) <span class="hljs-comment">// Throw away more unicode white spaces.</span> || <span class="hljs-regexp">/\s/</span>.test(char) <span class="hljs-comment">// Throw away whitespaces.</span> ) <span class="hljs-keyword">continue</span>; res += char } <span class="hljs-keyword">return</span> res.slice(<span class="hljs-number">0</span>, max_i) } };</pre></div></div> </li> <li id="section-4"> <div class="annotation"> <div class="pilwrap "> <a class="pilcrow" href="#section-4">&#182;</a> </div> <p>Retrieve the proper alphabet for use in conversiosn.</p> </div> <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">const</span> alphabet = <span class="hljs-function"><span class="hljs-params">a</span> =&gt;</span> { <span class="hljs-keyword">if</span>(<span class="hljs-keyword">typeof</span> a === <span class="hljs-string">'string'</span>) <span class="hljs-keyword">return</span> a; <span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span>(BASES[<span class="hljs-string">'BASE_'</span> + a]) <span class="hljs-keyword">return</span> BASES[<span class="hljs-string">'BASE_'</span> + a];</pre></div></div> </li> <li id="section-5"> <div class="annotation"> <div class="pilwrap "> <a class="pilcrow" href="#section-5">&#182;</a> </div> <p>hard coded for version 1, can be avoided via the API (custom alphabets).</p> </div> <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span>(a &gt; <span class="hljs-number">65411</span>) <span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> <span class="hljs-built_in">Error</span>(<span class="hljs-string">"You need to specify a custom alphabet via `setGlobalAlphabet` for a base over 65411."</span>); <span class="hljs-keyword">else</span> { <span class="hljs-keyword">return</span> BASES.FALL_BACK(a); } };</pre></div></div> </li> <li id="section-6"> <div class="annotation"> <div class="pilwrap "> <a class="pilcrow" href="#section-6">&#182;</a> </div> <p>Our own add function to circumvent javascripts 64bit floating cap.</p> </div> <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">const</span> add = <span class="hljs-function">(<span class="hljs-params">num1, num2, base</span>) =&gt;</span> {</pre></div></div> </li> <li id="section-7"> <div class="annotation"> <div class="pilwrap "> <a class="pilcrow" href="#section-7">&#182;</a> </div> <p>Our core buffer.</p> </div> <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">var</span> res = <span class="hljs-keyword">new</span> <span class="hljs-built_in">Uint32Array</span>(num1.length + num2.length), carry = <span class="hljs-number">0</span>, i = <span class="hljs-number">0</span>; <span class="hljs-keyword">while</span>(i &lt; num1.length || i &lt; num2.length || carry) { <span class="hljs-keyword">let</span> total = carry + (num1[i]||<span class="hljs-number">0</span>) + (num2[i]||<span class="hljs-number">0</span>);</pre></div></div> </li> <li id="section-8"> <div class="annotation"> <div class="pilwrap "> <a class="pilcrow" href="#section-8">&#182;</a> </div> <p>Modulous devision to swap bases. newNum = remainder concatinated with the remainders remainder and so on.</p> </div> <div class="content"><div class='highlight'><pre> res[i++] = total % base; carry = (total - total % base) / base</pre></div></div> </li> <li id="section-9"> <div class="annotation"> <div class="pilwrap "> <a class="pilcrow" href="#section-9">&#182;</a> </div> <p>grow buffer if we are carrying for next remainder check.</p> </div> <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">if</span>(carry &amp;&amp; i &gt; res.length) { <span class="hljs-keyword">let</span> copy = <span class="hljs-keyword">new</span> <span class="hljs-built_in">Uint32Array</span>(num1.length + num2.length + res.length) copy.set(res); res = copy; } } <span class="hljs-keyword">return</span> res.slice(<span class="hljs-number">0</span>, i); <span class="hljs-comment">// Give back only whats needed.</span> };</pre></div></div> </li> <li id="section-10"> <div class="annotation"> <div class="pilwrap "> <a class="pilcrow" href="#section-10">&#182;</a> </div> <p>Extend the addition function to introduce multiplications.</p> </div> <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">const</span> multiply = <span class="hljs-function">(<span class="hljs-params">num, exponent, base</span>) =&gt;</span> { <span class="hljs-keyword">if</span>(num &lt;= <span class="hljs-number">0</span>) <span class="hljs-keyword">return</span> num === <span class="hljs-number">0</span> ? [] : <span class="hljs-literal">null</span>; <span class="hljs-keyword">var</span> result = <span class="hljs-keyword">new</span> <span class="hljs-built_in">Uint32Array</span>(); <span class="hljs-keyword">while</span>(<span class="hljs-literal">true</span>) {</pre></div></div> </li> <li id="section-11"> <div class="annotation"> <div class="pilwrap "> <a class="pilcrow" href="#section-11">&#182;</a> </div> <p>Bit shit to the right and keep doubling the exponent</p> </div> <div class="content"><div class='highlight'><pre> num &amp; <span class="hljs-number">1</span> &amp;&amp; (result = add(result, exponent, base)); <span class="hljs-comment">// First iteration will be 1.</span> num = num &gt;&gt; <span class="hljs-number">1</span>; <span class="hljs-keyword">if</span>(num === <span class="hljs-number">0</span>) <span class="hljs-keyword">break</span>; exponent = add(exponent, exponent, base) <span class="hljs-comment">// double.</span> } <span class="hljs-keyword">return</span> result };</pre></div></div> </li> <li id="section-12"> <div class="annotation"> <div class="pilwrap "> <a class="pilcrow" href="#section-12">&#182;</a> </div> <p>Swap out to buffers to avoid memory limits.</p> </div> <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">const</span> stringToNumberArray = <span class="hljs-function">(<span class="hljs-params">str, baseAlphabet</span>) =&gt;</span> { <span class="hljs-keyword">var</span> charValues = str.split(<span class="hljs-string">''</span>); <span class="hljs-keyword">var</span> res = <span class="hljs-keyword">new</span> <span class="hljs-built_in">Uint32Array</span>(charValues.length); <span class="hljs-keyword">var</span> j = <span class="hljs-number">0</span>; <span class="hljs-keyword">for</span>(<span class="hljs-keyword">let</span> i = charValues.length - <span class="hljs-number">1</span>; i &gt;= <span class="hljs-number">0</span>; i--) { <span class="hljs-keyword">var</span> n = baseAlphabet.indexOf(charValues[i]); <span class="hljs-keyword">if</span>(n &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>(<span class="hljs-string">"Your data is not found in your alphabet."</span>); res[j++] = n; } <span class="hljs-keyword">return</span> res };</pre></div></div> </li> <li id="section-13"> <div class="annotation"> <div class="pilwrap "> <a class="pilcrow" href="#section-13">&#182;</a> </div> <p>Conversion begins here.</p> </div> <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">const</span> convertBase = <span class="hljs-function">(<span class="hljs-params">str, fromAlphabet, toAlphabet</span>) =&gt;</span> { <span class="hljs-keyword">var</span> fromBase = fromAlphabet.length, toBase = toAlphabet.length, charValues = stringToNumberArray(str.toString(), fromAlphabet); <span class="hljs-comment">// coerce numbers to string</span> <span class="hljs-keyword">if</span>(charValues === <span class="hljs-literal">null</span>) <span class="hljs-keyword">return</span> <span class="hljs-literal">null</span>; <span class="hljs-keyword">var</span> resNumbers = <span class="hljs-keyword">new</span> <span class="hljs-built_in">Uint32Array</span>(), exp = [<span class="hljs-number">1</span>]; <span class="hljs-keyword">for</span>(<span class="hljs-keyword">let</span> i = <span class="hljs-number">0</span>; i &lt; charValues.length; ++i) { resNumbers = add(resNumbers, multiply(charValues[i], exp, toBase), toBase); exp = multiply(fromBase, exp, toBase) }</pre></div></div> </li> <li id="section-14"> <div class="annotation"> <div class="pilwrap "> <a class="pilcrow" href="#section-14">&#182;</a> </div> <p>And ends here.</p> </div> <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">var</span> res = <span class="hljs-string">''</span>; <span class="hljs-keyword">if</span>(!resNumbers.length) { <span class="hljs-keyword">let</span> i = str.length; <span class="hljs-keyword">while</span>(i--)</pre></div></div> </li> <li id="section-15"> <div class="annotation"> <div class="pilwrap "> <a class="pilcrow" href="#section-15">&#182;</a> </div> <p>The stream being encoded was pure zeros.</p> </div> <div class="content"><div class='highlight'><pre> res += toAlphabet[<span class="hljs-number">0</span>] } <span class="hljs-keyword">else</span> { <span class="hljs-keyword">let</span> i = resNumbers.length; <span class="hljs-keyword">while</span>(i--) res += toAlphabet[resNumbers[i]] } <span class="hljs-keyword">return</span> res }; <span class="hljs-keyword">const</span> check = <span class="hljs-function"><span class="hljs-params">a</span> =&gt;</span> { <span class="hljs-keyword">if</span>(a.split(<span class="hljs-string">""</span>).sort().join(<span class="hljs-string">""</span>).match(<span class="hljs-regexp">/(.)\1/g</span>)) <span class="hljs-comment">// Check for duplicates.</span> <span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> <span class="hljs-built_in">Error</span>(<span class="hljs-string">"Your alphabet must contain all unique charachters."</span>); <span class="hljs-keyword">return</span> a }; <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">converter</span>(<span class="hljs-params">ia = null, oa = null</span>) </span>{ <span class="hljs-keyword">const</span> p = <span class="hljs-keyword">new</span> <span class="hljs-built_in">Proxy</span>({</pre></div></div> </li> <li id="section-16"> <div class="annotation"> <div class="pilwrap "> <a class="pilcrow" href="#section-16">&#182;</a> </div> <p>Our API.</p> </div> <div class="content"><div class='highlight'><pre> fromXXXToYYY: <span class="hljs-string">"Functions to encode and decode."</span>, <span class="hljs-attr">setGlobalAlphabet</span>: <span class="hljs-string">"Set both from and to alphabet."</span>, <span class="hljs-attr">setFromAlphabet</span>: <span class="hljs-string">"Sets the from alphabet."</span>, <span class="hljs-attr">setToAlphabet</span>: <span class="hljs-string">"Set the to alphabet."</span>, <span class="hljs-attr">resetAlphabets</span>: <span class="hljs-string">"Resets the alhabets to default."</span>, }, { get(t, cmd) { <span class="hljs-comment">// t is our target</span> <span class="hljs-keyword">try</span> { <span class="hljs-keyword">if</span>(!(cmd += <span class="hljs-string">""</span>)) <span class="hljs-keyword">return</span> } <span class="hljs-keyword">catch</span>(e) { <span class="hljs-keyword">return</span> } <span class="hljs-comment">// Hack to drop loading errors. And coerce to string.</span></pre></div></div> </li> <li id="section-17"> <div class="annotation"> <div class="pilwrap "> <a class="pilcrow" href="#section-17">&#182;</a> </div> <p>Regex parse for configuration requests.</p> </div> <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">if</span>(<span class="hljs-regexp">/^dumpAlphabets$/i</span>.test(cmd)) <span class="hljs-keyword">return</span> <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"></span>) </span>{ <span class="hljs-built_in">require</span>(<span class="hljs-string">'fs'</span>).writeFileSync(<span class="hljs-string">'encode-x_dumpAlphabets'</span>, <span class="hljs-string">'Last Computed Alphabet\n'</span>+LAST_COMPUTED_APLPH+<span class="hljs-string">'\n\nFrom Alphabet\n'</span>+t.incAlphabet+<span class="hljs-string">'\n\nTo Alphabet\n'</span>+t.outAlphabet); <span class="hljs-keyword">return</span> <span class="hljs-keyword">this</span> } <span class="hljs-keyword">if</span>(<span class="hljs-regexp">/^resetAlphabets$/i</span>.test(cmd)) <span class="hljs-keyword">return</span> <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"></span>) </span>{ t.incAlphabet = t.outAlphabet = <span class="hljs-literal">null</span>; <span class="hljs-keyword">return</span> <span class="hljs-keyword">this</span> } <span class="hljs-keyword">if</span>(<span class="hljs-regexp">/^SetGlobalAlphabet$/i</span>.test(cmd)) <span class="hljs-keyword">return</span> <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">ga</span>) </span>{ t.incAlphabet = t.outAlphabet = check(ga) <span class="hljs-keyword">return</span> <span class="hljs-keyword">this</span> } <span class="hljs-keyword">if</span>(<span class="hljs-regexp">/^SetFromAlphabet$/i</span>.test(cmd)) <span class="hljs-keyword">return</span> <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">fa</span>) </span>{ t.incAlphabet = alphabet(fa); <span class="hljs-keyword">return</span> <span class="hljs-keyword">this</span> } <span class="hljs-keyword">if</span>(<span class="hljs-regexp">/^SeTtoAlphabet$/i</span>.test(cmd)) <span class="hljs-keyword">return</span> <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">ta</span>) </span>{ t.outAlphabet = alphabet(ta); <span class="hljs-keyword">return</span> <span class="hljs-keyword">this</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>Flags</p> </div> <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">var</span> outIsData = srcIsData = <span class="hljs-literal">false</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>Old regex was /^[x20-x7e]+$/ – ascii, Even older was /^[\x00-\xff]*$/ – extended ascii (x7f is ‘del’)</p> </div> <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">var</span> cmds = <span class="hljs-string">'(?:\\d+|hex(?:idecimal)?|data|utf8|text|oct(?:al)?|bin(?:ary)?|oth(?:er)?|btc|bitcoin|(?:(?:b(?:ase)?)?(?:\\d+))?blob)'</span>; <span class="hljs-keyword">var</span> cmdRe = <span class="hljs-keyword">new</span> <span class="hljs-built_in">RegExp</span>(<span class="hljs-string">'from('</span> + cmds + <span class="hljs-string">')to('</span> + cmds + <span class="hljs-string">')'</span>, <span class="hljs-string">'i'</span>); <span class="hljs-keyword">var</span> matches = cmd.match(cmdRe); <span class="hljs-keyword">if</span>(!matches) <span class="hljs-keyword">return</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>Parse for request to encode/decode.</p> </div> <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span>(<span class="hljs-regexp">/data|utf8|oth|text/i</span>.test(matches[<span class="hljs-number">1</span>])) { matches[<span class="hljs-number">1</span>] = <span class="hljs-number">16</span>; srcIsData = <span class="hljs-literal">true</span> } <span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span>(<span class="hljs-regexp">/data|utf8|oth|text/i</span>.test(matches[<span class="hljs-number">2</span>])) { matches[<span class="hljs-number">2</span>] = <span class="hljs-number">16</span>; srcIsData = <span class="hljs-literal">true</span> } <span class="hljs-keyword">var</span> checker, possibles = [<span class="hljs-string">'hex'</span>, <span class="hljs-number">16</span>, <span class="hljs-string">'btc'</span>, <span class="hljs-number">58</span>, <span class="hljs-string">'bitcoin'</span>, <span class="hljs-number">58</span>, <span class="hljs-string">'blob'</span>, <span class="hljs-number">64</span>, <span class="hljs-string">'bin'</span>, <span class="hljs-number">2</span>, <span class="hljs-string">'oct'</span>, <span class="hljs-number">8</span>]; <span class="hljs-keyword">if</span>(checker = possibles.indexOf(matches[<span class="hljs-number">1</span>].toLowerCase()) &gt; <span class="hljs-number">0</span>) matches[<span class="hljs-number">1</span>] = possibles[checker+<span class="hljs-number">1</span>]; <span class="hljs-keyword">if</span>(checker = possibles.indexOf(matches[<span class="hljs-number">2</span>].toLowerCase()) &gt; <span class="hljs-number">0</span>) matches[<span class="hljs-number">2</span>] = possibles[checker+<span class="hljs-number">1</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>Our only ‘public’ facing function.</p> </div> <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">return</span> <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">src</span>) </span>{ <span class="hljs-keyword">if</span>(+matches[<span class="hljs-number">1</span>] === <span class="hljs-number">64</span> &amp;&amp; +matches[<span class="hljs-number">2</span>] === <span class="hljs-number">16</span>) <span class="hljs-keyword">return</span> Buffer.from(src, <span class="hljs-string">'base64'</span>).toString(<span class="hljs-string">'hex'</span>); <span class="hljs-keyword">if</span>(+matches[<span class="hljs-number">2</span>] === <span class="hljs-number">16</span> &amp;&amp; +matches[<span class="hljs-number">1</span>] === <span class="hljs-number">64</span>) <span class="hljs-keyword">return</span> Buffer.from(src, <span class="hljs-string">'hex'</span>).toString(<span class="hljs-string">'base64'</span>); <span class="hljs-keyword">var</span> a1, a2;</pre></div></div> </li> <li id="section-22"> <div class="annotation"> <div class="pilwrap "> <a class="pilcrow" href="#section-22">&#182;</a> </div> <p>Begin alphabet configuration.</p> </div> <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">if</span>(srcIsData) {</pre></div></div> </li> <li id="section-23"> <div class="annotation"> <div class="pilwrap "> <a class="pilcrow" href="#section-23">&#182;</a> </div> <p>Our source is not a number, so represent it as one.</p> </div> <div class="content"><div class='highlight'><pre> src = Buffer.from(src).toString(<span class="hljs-string">'hex'</span>); a1 = alphabet(<span class="hljs-number">16</span>); } <span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span>(outIsData) { a2 = alphabet(<span class="hljs-number">16</span>) } !a1 &amp;&amp; (a1 = t.incAlphabet ? t.incAlphabet.slice(<span class="hljs-number">0</span>, matches[<span class="hljs-number">1</span>]) : alphabet(+matches[<span class="hljs-number">1</span>])); !a2 &amp;&amp; (a2 = t.outAlphabet ? t.outAlphabet.slice(<span class="hljs-number">0</span>, matches[<span class="hljs-number">2</span>]) : alphabet(+matches[<span class="hljs-number">2</span>])); <span class="hljs-keyword">if</span>(!srcIsData &amp;&amp; matches[<span class="hljs-number">1</span>] &gt; a1.length) { <span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> <span class="hljs-built_in">Error</span>(<span class="hljs-string">"From alphabet not long enough, consider manually setting a larger one via `setFromAlphabet`."</span>) } <span class="hljs-keyword">if</span>(!outIsData &amp;&amp; matches[<span class="hljs-number">2</span>] &gt; a2.length) { <span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> <span class="hljs-built_in">Error</span>(<span class="hljs-string">"To alphabet not long enough, consider manually setting a larger one via `setToAlphabet`."</span>) }</pre></div></div> </li> <li id="section-24"> <div class="annotation"> <div class="pilwrap "> <a class="pilcrow" href="#section-24">&#182;</a> </div> <p>If our output is not to be a number, assume its text/utf8..</p> </div> <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">return</span> outIsData ? Buffer.from(convertBase(src, a1, a2), <span class="hljs-string">'hex'</span>).toString(<span class="hljs-string">'utf8'</span>) : convertBase(src, a1, a2) } } }) ia &amp;&amp; (p.incAlphabet = ia); oa &amp;&amp; (p.outAlphabet = oa); <span class="hljs-keyword">return</span> p }</pre></div></div> </li> <li id="section-25"> <div class="annotation"> <div class="pilwrap "> <a class="pilcrow" href="#section-25">&#182;</a> </div> <p>Try to ensure compatibility accross browsers and node.</p> </div> <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">try</span> { <span class="hljs-built_in">module</span>.exports = converter } <span class="hljs-keyword">catch</span>(e) { <span class="hljs-built_in">window</span>.convert = converter }; })();</pre></div></div> </li> </ul> </div> </body> </html>