encode-x
Version:
Original encoder and decoder, default goes up to base 65411.
548 lines (392 loc) • 31.2 kB
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">¶</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">¶</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+/~!@#$%^&*()_`<>,.?'\";:[{]}\\|=- "</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+/~!@#$%^&*()_`<>,.?'\";:[{]}\\|=- "</span>;
<span class="hljs-keyword">if</span>(LAST_COMPUTED_ALPH.length >= 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 >= 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">¶</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 < <span class="hljs-number">67777</span> && res.length < 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">¶</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> =></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">¶</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 > <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">¶</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>) =></span> {</pre></div></div>
</li>
<li id="section-7">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-7">¶</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 < num1.length || i < 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">¶</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">¶</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 && i > 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">¶</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>) =></span> {
<span class="hljs-keyword">if</span>(num <= <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">¶</a>
</div>
<p>Bit shit to the right and keep doubling the exponent</p>
</div>
<div class="content"><div class='highlight'><pre> num & <span class="hljs-number">1</span> && (result = add(result, exponent, base)); <span class="hljs-comment">// First iteration will be 1.</span>
num = num >> <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">¶</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>) =></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 >= <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 < <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">¶</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>) =></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 < 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">¶</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">¶</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> =></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">¶</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">¶</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">¶</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">¶</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">¶</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()) > <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()) > <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">¶</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> && +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> && +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">¶</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">¶</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 && (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 && (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 && matches[<span class="hljs-number">1</span>] > 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 && matches[<span class="hljs-number">2</span>] > 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">¶</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 && (p.incAlphabet = ia);
oa && (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">¶</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>