<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title>paint demo</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" type="text/css" media="screen" href="./main.css" />
<link rel="stylesheet" type="text/css" media="screen" href="./snippets.css" />
</head>
<body>
<div class="container">
<div class="command">
<h1>
<span class="hue-rotate">$</span> paint
./file.<span id="ext">rs</span>
<nobr>--style="<span id="style-name">github</span>"</nobr>
<nobr>--gist-like</nobr>
<nobr><span id="lines"></span></nobr>
</h1>
</div>
<div class="flex-centered">
<select id="filetype" style="background-color: #fff;">
<option selected value="rs">rust</option>
<option value="js">javascript</option>
<option value="jsx">jsx</option>
<option value="html">html</option>
<option value="c">c</option>
<option value="py">python</option>
<option value="go">go</option>
</select>
<select id="style" style="background-color: #fff;">
<option value="atom_dark">atom dark</option>
<option value="ayu_dark">ayu dark</option>
<option value="ayu_light">ayu light</option>
<option value="ayu_mirage">ayu mirage</option>
<option value="cobalt2">cobalt2</option>
<option value="dracula">dracula</option>
<option selected value="github">github</option>
<option value="monokai_extended">monokai extended</option>
<option value="oceanic_next">oceanic next</option>
<option value="one_dark">one dark</option>
<option value="one_light">one light</option>
<option value="one_monokai">one monokai</option>
<option value="predawn">predawn</option>
<option value="solarized_dark">solarized dark</option>
<option value="solarized_light">solarized light</option>
<option value="wombat">wombat</option>
</select>
<input id="highlight" type="checkbox" />
<label for="highlight"><nobr>--highlight</nobr></label>
</div>
<div id="highlighted" class="no-hi" data-style="github--rs" data-filetype="rs">
<div class='style' id='P--atom_dark--c'>
<div class='P--atom_dark-bordered'>
<div class="info header">
<span class="left">musl-wasm32.encrypt.c</span>
<span class="right"><span>58 lines</span><span>1.13 KB</span></span>
</div>
<div class='P--atom_dark'>
<table>
<tr><td class='ln' data-ln='1'></td><td><span class='pt4'>#include</span><span> </span><span class='pt9'><stdint.h></span></td></tr>
<tr><td class='ln' data-ln='2'></td><td><span class='pt4'>#include</span><span> </span><span class='pt9'><stdlib.h></span></td></tr>
<tr><td class='ln' data-ln='3'></td><td> </td></tr>
<tr><td class='ln' data-ln='4'></td><td><span class='pt2 it'>struct</span><span> expanded_key {</span></td></tr>
<tr><td class='ln' data-ln='5'></td><td><span> </span><span class='pt22'>uint32_t</span><span> l[</span><span class='pt24'>16</span><span>], r[</span><span class='pt24'>16</span><span>];</span></td></tr>
<tr><td class='ln' data-ln='6'></td><td><span>};</span></td></tr>
<tr><td class='ln' data-ln='7'></td><td> </td></tr>
<tr><td class='ln' data-ln='8'></td><td class='hi'><span class='pt2 it'>void</span><span> </span><span class='pt25'>__des_setkey</span><span>(</span><span class='pt23'>const</span><span> </span><span class='pt2 it'>unsigned</span><span> </span><span class='pt2 it'>char</span><span> </span><span class='pt4'>*</span><span class='pt13 it'>key</span><span>, </span><span class='pt2 it'>struct</span><span> expanded_key </span><span class='pt4'>*</span><span class='pt13 it'>ekey</span><span>);</span></td></tr>
<tr><td class='ln' data-ln='9'></td><td class='hi'><span class='pt2 it'>void</span><span> </span><span class='pt25'>__do_des</span><span>(</span><span class='pt22'>uint32_t</span><span> </span><span class='pt13 it'>l_in</span><span>, </span><span class='pt22'>uint32_t</span><span> </span><span class='pt13 it'>r_in</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='10'></td><td class='hi'><span> </span><span class='pt22'>uint32_t</span><span> </span><span class='pt4'>*</span><span class='pt13 it'>l_out</span><span>, </span><span class='pt22'>uint32_t</span><span> </span><span class='pt4'>*</span><span class='pt13 it'>r_out</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='11'></td><td class='hi'><span> </span><span class='pt22'>uint32_t</span><span> </span><span class='pt13 it'>count</span><span>, </span><span class='pt22'>uint32_t</span><span> </span><span class='pt13 it'>saltbits</span><span>, </span><span class='pt23'>const</span><span> </span><span class='pt2 it'>struct</span><span> expanded_key </span><span class='pt4'>*</span><span class='pt13 it'>ekey</span><span>);</span></td></tr>
<tr><td class='ln' data-ln='12'></td><td> </td></tr>
<tr><td class='ln' data-ln='13'></td><td><span class='pt23'>static</span><span> </span><span class='pt2 it'>struct</span><span> expanded_key __encrypt_key;</span></td></tr>
<tr><td class='ln' data-ln='14'></td><td> </td></tr>
<tr><td class='ln' data-ln='15'></td><td><span class='pt2 it'>void</span><span> </span><span class='pt25'>setkey</span><span>(</span><span class='pt23'>const</span><span> </span><span class='pt2 it'>char</span><span> </span><span class='pt4'>*</span><span class='pt13 it'>key</span><span>)</span></td></tr>
<tr><td class='ln' data-ln='16'></td><td><span>{</span></td></tr>
<tr><td class='ln' data-ln='17'></td><td><span> </span><span class='pt2 it'>unsigned</span><span> </span><span class='pt2 it'>char</span><span> bkey[</span><span class='pt24'>8</span><span>];</span></td></tr>
<tr><td class='ln' data-ln='18'></td><td><span> </span><span class='pt2 it'>int</span><span> i, j;</span></td></tr>
<tr><td class='ln' data-ln='19'></td><td> </td></tr>
<tr><td class='ln' data-ln='20'></td><td><span> </span><span class='pt4'>for</span><span> (i </span><span class='pt4'>=</span><span> </span><span class='pt24'>0</span><span>; i </span><span class='pt4'><</span><span> </span><span class='pt24'>8</span><span>; i</span><span class='pt4'>++</span><span>) {</span></td></tr>
<tr><td class='ln' data-ln='21'></td><td><span> bkey[i] </span><span class='pt4'>=</span><span> </span><span class='pt24'>0</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='22'></td><td><span> </span><span class='pt4'>for</span><span> (j </span><span class='pt4'>=</span><span> </span><span class='pt24'>7</span><span>; j </span><span class='pt4'>>=</span><span> </span><span class='pt24'>0</span><span>; j</span><span class='pt4'>--</span><span>, key</span><span class='pt4'>++</span><span>)</span></td></tr>
<tr><td class='ln' data-ln='23'></td><td><span> bkey[i] </span><span class='pt4'>|=</span><span> (</span><span class='pt22'>uint32_t</span><span>)(</span><span class='pt4'>*</span><span>key </span><span class='pt4'>&</span><span> </span><span class='pt24'>1</span><span>) </span><span class='pt4'><<</span><span> j;</span></td></tr>
<tr><td class='ln' data-ln='24'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='25'></td><td> </td></tr>
<tr><td class='ln' data-ln='26'></td><td><span> </span><span class='pt16'>__des_setkey</span><span>(bkey, </span><span class='pt4'>&</span><span>__encrypt_key);</span></td></tr>
<tr><td class='ln' data-ln='27'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='28'></td><td> </td></tr>
<tr><td class='ln' data-ln='29'></td><td><span class='pt2 it'>void</span><span> </span><span class='pt25'>encrypt</span><span>(</span><span class='pt2 it'>char</span><span> </span><span class='pt4'>*</span><span class='pt13 it'>block</span><span>, </span><span class='pt2 it'>int</span><span> </span><span class='pt13 it'>edflag</span><span>)</span></td></tr>
<tr><td class='ln' data-ln='30'></td><td><span>{</span></td></tr>
<tr><td class='ln' data-ln='31'></td><td><span> </span><span class='pt2 it'>struct</span><span> expanded_key decrypt_key, </span><span class='pt4'>*</span><span>key;</span></td></tr>
<tr><td class='ln' data-ln='32'></td><td><span> </span><span class='pt22'>uint32_t</span><span> b[</span><span class='pt24'>2</span><span>];</span></td></tr>
<tr><td class='ln' data-ln='33'></td><td><span> </span><span class='pt2 it'>int</span><span> i, j;</span></td></tr>
<tr><td class='ln' data-ln='34'></td><td><span> </span><span class='pt2 it'>char</span><span> </span><span class='pt4'>*</span><span>p;</span></td></tr>
<tr><td class='ln' data-ln='35'></td><td> </td></tr>
<tr><td class='ln' data-ln='36'></td><td><span> p </span><span class='pt4'>=</span><span> block;</span></td></tr>
<tr><td class='ln' data-ln='37'></td><td><span> </span><span class='pt4'>for</span><span> (i </span><span class='pt4'>=</span><span> </span><span class='pt24'>0</span><span>; i </span><span class='pt4'><</span><span> </span><span class='pt24'>2</span><span>; i</span><span class='pt4'>++</span><span>) {</span></td></tr>
<tr><td class='ln' data-ln='38'></td><td><span> b[i] </span><span class='pt4'>=</span><span> </span><span class='pt24'>0</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='39'></td><td><span> </span><span class='pt4'>for</span><span> (j </span><span class='pt4'>=</span><span> </span><span class='pt24'>31</span><span>; j </span><span class='pt4'>>=</span><span> </span><span class='pt24'>0</span><span>; j</span><span class='pt4'>--</span><span>, p</span><span class='pt4'>++</span><span>)</span></td></tr>
<tr><td class='ln' data-ln='40'></td><td><span> b[i] </span><span class='pt4'>|=</span><span> (</span><span class='pt22'>uint32_t</span><span>)(</span><span class='pt4'>*</span><span>p </span><span class='pt4'>&</span><span> </span><span class='pt24'>1</span><span>) </span><span class='pt4'><<</span><span> j;</span></td></tr>
<tr><td class='ln' data-ln='41'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='42'></td><td> </td></tr>
<tr><td class='ln' data-ln='43'></td><td><span> key </span><span class='pt4'>=</span><span> </span><span class='pt4'>&</span><span>__encrypt_key;</span></td></tr>
<tr><td class='ln' data-ln='44'></td><td><span> </span><span class='pt4'>if</span><span> (edflag) {</span></td></tr>
<tr><td class='ln' data-ln='45'></td><td><span> key </span><span class='pt4'>=</span><span> </span><span class='pt4'>&</span><span>decrypt_key;</span></td></tr>
<tr><td class='ln' data-ln='46'></td><td><span> </span><span class='pt4'>for</span><span> (i </span><span class='pt4'>=</span><span> </span><span class='pt24'>0</span><span>; i </span><span class='pt4'><</span><span> </span><span class='pt24'>16</span><span>; i</span><span class='pt4'>++</span><span>) {</span></td></tr>
<tr><td class='ln' data-ln='47'></td><td><span> decrypt_key.</span><span class='pt16'>l</span><span>[i] </span><span class='pt4'>=</span><span> __encrypt_key.</span><span class='pt16'>l</span><span>[</span><span class='pt24'>15</span><span class='pt4'>-</span><span>i];</span></td></tr>
<tr><td class='ln' data-ln='48'></td><td><span> decrypt_key.</span><span class='pt16'>r</span><span>[i] </span><span class='pt4'>=</span><span> __encrypt_key.</span><span class='pt16'>r</span><span>[</span><span class='pt24'>15</span><span class='pt4'>-</span><span>i];</span></td></tr>
<tr><td class='ln' data-ln='49'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='50'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='51'></td><td> </td></tr>
<tr><td class='ln' data-ln='52'></td><td><span> </span><span class='pt16'>__do_des</span><span>(b[</span><span class='pt24'>0</span><span>], b[</span><span class='pt24'>1</span><span>], b, b </span><span class='pt4'>+</span><span> </span><span class='pt24'>1</span><span>, </span><span class='pt24'>1</span><span>, </span><span class='pt24'>0</span><span>, key);</span></td></tr>
<tr><td class='ln' data-ln='53'></td><td> </td></tr>
<tr><td class='ln' data-ln='54'></td><td><span> p </span><span class='pt4'>=</span><span> block;</span></td></tr>
<tr><td class='ln' data-ln='55'></td><td><span> </span><span class='pt4'>for</span><span> (i </span><span class='pt4'>=</span><span> </span><span class='pt24'>0</span><span>; i </span><span class='pt4'><</span><span> </span><span class='pt24'>2</span><span>; i</span><span class='pt4'>++</span><span>)</span></td></tr>
<tr><td class='ln' data-ln='56'></td><td><span> </span><span class='pt4'>for</span><span> (j </span><span class='pt4'>=</span><span> </span><span class='pt24'>31</span><span>; j </span><span class='pt4'>>=</span><span> </span><span class='pt24'>0</span><span>; j</span><span class='pt4'>--</span><span>)</span></td></tr>
<tr><td class='ln' data-ln='57'></td><td><span> </span><span class='pt4'>*</span><span>p</span><span class='pt4'>++</span><span> </span><span class='pt4'>=</span><span> b[i]</span><span class='pt4'>>></span><span>j </span><span class='pt4'>&</span><span> </span><span class='pt24'>1</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='58'></td><td><span>}</span></td></tr>
</table>
</div>
</div>
</div>
<div class='style' id='P--ayu_dark--c'>
<div class='P--ayu_dark-bordered'>
<div class="info header">
<span class="left">musl-wasm32.encrypt.c</span>
<span class="right"><span>58 lines</span><span>1.13 KB</span></span>
</div>
<div class='P--ayu_dark'>
<table>
<tr><td class='ln' data-ln='1'></td><td><span class='pt21'>#include</span><span> </span><span class='pt13'><stdint.h></span></td></tr>
<tr><td class='ln' data-ln='2'></td><td><span class='pt21'>#include</span><span> </span><span class='pt13'><stdlib.h></span></td></tr>
<tr><td class='ln' data-ln='3'></td><td> </td></tr>
<tr><td class='ln' data-ln='4'></td><td><span class='pt21'>struct</span><span> </span><span class='pt9'>expanded_key</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='5'></td><td><span> </span><span class='pt8 it'>uint32_t</span><span> l[</span><span class='pt23'>16</span><span>]</span><span class='pt25'>,</span><span> r[</span><span class='pt23'>16</span><span>]</span><span class='pt25'>;</span></td></tr>
<tr><td class='ln' data-ln='6'></td><td><span>}</span><span class='pt25'>;</span></td></tr>
<tr><td class='ln' data-ln='7'></td><td> </td></tr>
<tr><td class='ln' data-ln='8'></td><td class='hi'><span class='pt21'>void</span><span> </span><span class='pt22'>__des_setkey</span><span>(</span><span class='pt21'>const</span><span> </span><span class='pt21'>unsigned</span><span> </span><span class='pt21'>char</span><span> </span><span class='pt18'>*</span><span class='pt23'>key</span><span class='pt25'>,</span><span> </span><span class='pt21'>struct</span><span> expanded_key </span><span class='pt18'>*</span><span class='pt23'>ekey</span><span>)</span><span class='pt25'>;</span></td></tr>
<tr><td class='ln' data-ln='9'></td><td class='hi'><span class='pt21'>void</span><span> </span><span class='pt22'>__do_des</span><span>(</span><span class='pt8 it'>uint32_t</span><span> </span><span class='pt23'>l_in</span><span class='pt25'>,</span><span> </span><span class='pt8 it'>uint32_t</span><span> </span><span class='pt23'>r_in</span><span class='pt25'>,</span></td></tr>
<tr><td class='ln' data-ln='10'></td><td class='hi'><span> </span><span class='pt8 it'>uint32_t</span><span> </span><span class='pt18'>*</span><span class='pt23'>l_out</span><span class='pt25'>,</span><span> </span><span class='pt8 it'>uint32_t</span><span> </span><span class='pt18'>*</span><span class='pt23'>r_out</span><span class='pt25'>,</span></td></tr>
<tr><td class='ln' data-ln='11'></td><td class='hi'><span> </span><span class='pt8 it'>uint32_t</span><span> </span><span class='pt23'>count</span><span class='pt25'>,</span><span> </span><span class='pt8 it'>uint32_t</span><span> </span><span class='pt23'>saltbits</span><span class='pt25'>,</span><span> </span><span class='pt21'>const</span><span> </span><span class='pt21'>struct</span><span> expanded_key </span><span class='pt18'>*</span><span class='pt23'>ekey</span><span>)</span><span class='pt25'>;</span></td></tr>
<tr><td class='ln' data-ln='12'></td><td> </td></tr>
<tr><td class='ln' data-ln='13'></td><td><span class='pt21'>static</span><span> </span><span class='pt21'>struct</span><span> expanded_key __encrypt_key</span><span class='pt25'>;</span></td></tr>
<tr><td class='ln' data-ln='14'></td><td> </td></tr>
<tr><td class='ln' data-ln='15'></td><td><span class='pt21'>void</span><span> </span><span class='pt22'>setkey</span><span>(</span><span class='pt21'>const</span><span> </span><span class='pt21'>char</span><span> </span><span class='pt18'>*</span><span class='pt23'>key</span><span>)</span></td></tr>
<tr><td class='ln' data-ln='16'></td><td><span>{</span></td></tr>
<tr><td class='ln' data-ln='17'></td><td><span> </span><span class='pt21'>unsigned</span><span> </span><span class='pt21'>char</span><span> bkey[</span><span class='pt23'>8</span><span>]</span><span class='pt25'>;</span></td></tr>
<tr><td class='ln' data-ln='18'></td><td><span> </span><span class='pt21'>int</span><span> i</span><span class='pt25'>,</span><span> j</span><span class='pt25'>;</span></td></tr>
<tr><td class='ln' data-ln='19'></td><td> </td></tr>
<tr><td class='ln' data-ln='20'></td><td><span> </span><span class='pt21'>for</span><span> (i </span><span class='pt18'>=</span><span> </span><span class='pt23'>0</span><span class='pt25'>;</span><span> i </span><span class='pt18'><</span><span> </span><span class='pt23'>8</span><span class='pt25'>;</span><span> i</span><span class='pt18'>++</span><span>) {</span></td></tr>
<tr><td class='ln' data-ln='21'></td><td><span> bkey[i] </span><span class='pt18'>=</span><span> </span><span class='pt23'>0</span><span class='pt25'>;</span></td></tr>
<tr><td class='ln' data-ln='22'></td><td><span> </span><span class='pt21'>for</span><span> (j </span><span class='pt18'>=</span><span> </span><span class='pt23'>7</span><span class='pt25'>;</span><span> j </span><span class='pt18'>>=</span><span> </span><span class='pt23'>0</span><span class='pt25'>;</span><span> j</span><span class='pt18'>--</span><span class='pt25'>,</span><span> key</span><span class='pt18'>++</span><span>)</span></td></tr>
<tr><td class='ln' data-ln='23'></td><td><span> bkey[i] </span><span class='pt18'>|=</span><span> (</span><span class='pt8 it'>uint32_t</span><span>)(</span><span class='pt18'>*</span><span>key </span><span class='pt18'>&</span><span> </span><span class='pt23'>1</span><span>) </span><span class='pt18'><<</span><span> j</span><span class='pt25'>;</span></td></tr>
<tr><td class='ln' data-ln='24'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='25'></td><td> </td></tr>
<tr><td class='ln' data-ln='26'></td><td><span> </span><span class='pt22'>__des_setkey</span><span>(bkey</span><span class='pt25'>,</span><span> </span><span class='pt18'>&</span><span>__encrypt_key)</span><span class='pt25'>;</span></td></tr>
<tr><td class='ln' data-ln='27'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='28'></td><td> </td></tr>
<tr><td class='ln' data-ln='29'></td><td><span class='pt21'>void</span><span> </span><span class='pt22'>encrypt</span><span>(</span><span class='pt21'>char</span><span> </span><span class='pt18'>*</span><span class='pt23'>block</span><span class='pt25'>,</span><span> </span><span class='pt21'>int</span><span> </span><span class='pt23'>edflag</span><span>)</span></td></tr>
<tr><td class='ln' data-ln='30'></td><td><span>{</span></td></tr>
<tr><td class='ln' data-ln='31'></td><td><span> </span><span class='pt21'>struct</span><span> expanded_key decrypt_key</span><span class='pt25'>,</span><span> </span><span class='pt18'>*</span><span>key</span><span class='pt25'>;</span></td></tr>
<tr><td class='ln' data-ln='32'></td><td><span> </span><span class='pt8 it'>uint32_t</span><span> b[</span><span class='pt23'>2</span><span>]</span><span class='pt25'>;</span></td></tr>
<tr><td class='ln' data-ln='33'></td><td><span> </span><span class='pt21'>int</span><span> i</span><span class='pt25'>,</span><span> j</span><span class='pt25'>;</span></td></tr>
<tr><td class='ln' data-ln='34'></td><td><span> </span><span class='pt21'>char</span><span> </span><span class='pt18'>*</span><span>p</span><span class='pt25'>;</span></td></tr>
<tr><td class='ln' data-ln='35'></td><td> </td></tr>
<tr><td class='ln' data-ln='36'></td><td><span> p </span><span class='pt18'>=</span><span> block</span><span class='pt25'>;</span></td></tr>
<tr><td class='ln' data-ln='37'></td><td><span> </span><span class='pt21'>for</span><span> (i </span><span class='pt18'>=</span><span> </span><span class='pt23'>0</span><span class='pt25'>;</span><span> i </span><span class='pt18'><</span><span> </span><span class='pt23'>2</span><span class='pt25'>;</span><span> i</span><span class='pt18'>++</span><span>) {</span></td></tr>
<tr><td class='ln' data-ln='38'></td><td><span> b[i] </span><span class='pt18'>=</span><span> </span><span class='pt23'>0</span><span class='pt25'>;</span></td></tr>
<tr><td class='ln' data-ln='39'></td><td><span> </span><span class='pt21'>for</span><span> (j </span><span class='pt18'>=</span><span> </span><span class='pt23'>31</span><span class='pt25'>;</span><span> j </span><span class='pt18'>>=</span><span> </span><span class='pt23'>0</span><span class='pt25'>;</span><span> j</span><span class='pt18'>--</span><span class='pt25'>,</span><span> p</span><span class='pt18'>++</span><span>)</span></td></tr>
<tr><td class='ln' data-ln='40'></td><td><span> b[i] </span><span class='pt18'>|=</span><span> (</span><span class='pt8 it'>uint32_t</span><span>)(</span><span class='pt18'>*</span><span>p </span><span class='pt18'>&</span><span> </span><span class='pt23'>1</span><span>) </span><span class='pt18'><<</span><span> j</span><span class='pt25'>;</span></td></tr>
<tr><td class='ln' data-ln='41'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='42'></td><td> </td></tr>
<tr><td class='ln' data-ln='43'></td><td><span> key </span><span class='pt18'>=</span><span> </span><span class='pt18'>&</span><span>__encrypt_key</span><span class='pt25'>;</span></td></tr>
<tr><td class='ln' data-ln='44'></td><td><span> </span><span class='pt21'>if</span><span> (edflag) {</span></td></tr>
<tr><td class='ln' data-ln='45'></td><td><span> key </span><span class='pt18'>=</span><span> </span><span class='pt18'>&</span><span>decrypt_key</span><span class='pt25'>;</span></td></tr>
<tr><td class='ln' data-ln='46'></td><td><span> </span><span class='pt21'>for</span><span> (i </span><span class='pt18'>=</span><span> </span><span class='pt23'>0</span><span class='pt25'>;</span><span> i </span><span class='pt18'><</span><span> </span><span class='pt23'>16</span><span class='pt25'>;</span><span> i</span><span class='pt18'>++</span><span>) {</span></td></tr>
<tr><td class='ln' data-ln='47'></td><td><span> decrypt_key</span><span class='pt18'>.</span><span>l[i] </span><span class='pt18'>=</span><span> __encrypt_key</span><span class='pt18'>.</span><span>l[</span><span class='pt23'>15</span><span class='pt18'>-</span><span>i]</span><span class='pt25'>;</span></td></tr>
<tr><td class='ln' data-ln='48'></td><td><span> decrypt_key</span><span class='pt18'>.</span><span>r[i] </span><span class='pt18'>=</span><span> __encrypt_key</span><span class='pt18'>.</span><span>r[</span><span class='pt23'>15</span><span class='pt18'>-</span><span>i]</span><span class='pt25'>;</span></td></tr>
<tr><td class='ln' data-ln='49'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='50'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='51'></td><td> </td></tr>
<tr><td class='ln' data-ln='52'></td><td><span> </span><span class='pt22'>__do_des</span><span>(b[</span><span class='pt23'>0</span><span>]</span><span class='pt25'>,</span><span> b[</span><span class='pt23'>1</span><span>]</span><span class='pt25'>,</span><span> b</span><span class='pt25'>,</span><span> b </span><span class='pt18'>+</span><span> </span><span class='pt23'>1</span><span class='pt25'>,</span><span> </span><span class='pt23'>1</span><span class='pt25'>,</span><span> </span><span class='pt23'>0</span><span class='pt25'>,</span><span> key)</span><span class='pt25'>;</span></td></tr>
<tr><td class='ln' data-ln='53'></td><td> </td></tr>
<tr><td class='ln' data-ln='54'></td><td><span> p </span><span class='pt18'>=</span><span> block</span><span class='pt25'>;</span></td></tr>
<tr><td class='ln' data-ln='55'></td><td><span> </span><span class='pt21'>for</span><span> (i </span><span class='pt18'>=</span><span> </span><span class='pt23'>0</span><span class='pt25'>;</span><span> i </span><span class='pt18'><</span><span> </span><span class='pt23'>2</span><span class='pt25'>;</span><span> i</span><span class='pt18'>++</span><span>)</span></td></tr>
<tr><td class='ln' data-ln='56'></td><td><span> </span><span class='pt21'>for</span><span> (j </span><span class='pt18'>=</span><span> </span><span class='pt23'>31</span><span class='pt25'>;</span><span> j </span><span class='pt18'>>=</span><span> </span><span class='pt23'>0</span><span class='pt25'>;</span><span> j</span><span class='pt18'>--</span><span>)</span></td></tr>
<tr><td class='ln' data-ln='57'></td><td><span> </span><span class='pt18'>*</span><span>p</span><span class='pt18'>++</span><span> </span><span class='pt18'>=</span><span> b[i]</span><span class='pt18'>>></span><span>j </span><span class='pt18'>&</span><span> </span><span class='pt23'>1</span><span class='pt25'>;</span></td></tr>
<tr><td class='ln' data-ln='58'></td><td><span>}</span></td></tr>
</table>
</div>
</div>
</div>
<div class='style' id='P--ayu_light--c'>
<div class='P--ayu_light-bordered'>
<div class="info header">
<span class="left">musl-wasm32.encrypt.c</span>
<span class="right"><span>58 lines</span><span>1.13 KB</span></span>
</div>
<div class='P--ayu_light'>
<table>
<tr><td class='ln' data-ln='1'></td><td><span class='pt21'>#include</span><span> </span><span class='pt10'><stdint.h></span></td></tr>
<tr><td class='ln' data-ln='2'></td><td><span class='pt21'>#include</span><span> </span><span class='pt10'><stdlib.h></span></td></tr>
<tr><td class='ln' data-ln='3'></td><td> </td></tr>
<tr><td class='ln' data-ln='4'></td><td><span class='pt21'>struct</span><span> </span><span class='pt7'>expanded_key</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='5'></td><td><span> </span><span class='pt9 it'>uint32_t</span><span> l[</span><span class='pt22'>16</span><span>]</span><span class='pt26'>,</span><span> r[</span><span class='pt22'>16</span><span>]</span><span class='pt26'>;</span></td></tr>
<tr><td class='ln' data-ln='6'></td><td><span>}</span><span class='pt26'>;</span></td></tr>
<tr><td class='ln' data-ln='7'></td><td> </td></tr>
<tr><td class='ln' data-ln='8'></td><td class='hi'><span class='pt21'>void</span><span> </span><span class='pt19'>__des_setkey</span><span>(</span><span class='pt21'>const</span><span> </span><span class='pt21'>unsigned</span><span> </span><span class='pt21'>char</span><span> </span><span class='pt17'>*</span><span class='pt11'>key</span><span class='pt26'>,</span><span> </span><span class='pt21'>struct</span><span> expanded_key </span><span class='pt17'>*</span><span class='pt11'>ekey</span><span>)</span><span class='pt26'>;</span></td></tr>
<tr><td class='ln' data-ln='9'></td><td class='hi'><span class='pt21'>void</span><span> </span><span class='pt19'>__do_des</span><span>(</span><span class='pt9 it'>uint32_t</span><span> </span><span class='pt11'>l_in</span><span class='pt26'>,</span><span> </span><span class='pt9 it'>uint32_t</span><span> </span><span class='pt11'>r_in</span><span class='pt26'>,</span></td></tr>
<tr><td class='ln' data-ln='10'></td><td class='hi'><span> </span><span class='pt9 it'>uint32_t</span><span> </span><span class='pt17'>*</span><span class='pt11'>l_out</span><span class='pt26'>,</span><span> </span><span class='pt9 it'>uint32_t</span><span> </span><span class='pt17'>*</span><span class='pt11'>r_out</span><span class='pt26'>,</span></td></tr>
<tr><td class='ln' data-ln='11'></td><td class='hi'><span> </span><span class='pt9 it'>uint32_t</span><span> </span><span class='pt11'>count</span><span class='pt26'>,</span><span> </span><span class='pt9 it'>uint32_t</span><span> </span><span class='pt11'>saltbits</span><span class='pt26'>,</span><span> </span><span class='pt21'>const</span><span> </span><span class='pt21'>struct</span><span> expanded_key </span><span class='pt17'>*</span><span class='pt11'>ekey</span><span>)</span><span class='pt26'>;</span></td></tr>
<tr><td class='ln' data-ln='12'></td><td> </td></tr>
<tr><td class='ln' data-ln='13'></td><td><span class='pt21'>static</span><span> </span><span class='pt21'>struct</span><span> expanded_key __encrypt_key</span><span class='pt26'>;</span></td></tr>
<tr><td class='ln' data-ln='14'></td><td> </td></tr>
<tr><td class='ln' data-ln='15'></td><td><span class='pt21'>void</span><span> </span><span class='pt19'>setkey</span><span>(</span><span class='pt21'>const</span><span> </span><span class='pt21'>char</span><span> </span><span class='pt17'>*</span><span class='pt11'>key</span><span>)</span></td></tr>
<tr><td class='ln' data-ln='16'></td><td><span>{</span></td></tr>
<tr><td class='ln' data-ln='17'></td><td><span> </span><span class='pt21'>unsigned</span><span> </span><span class='pt21'>char</span><span> bkey[</span><span class='pt22'>8</span><span>]</span><span class='pt26'>;</span></td></tr>
<tr><td class='ln' data-ln='18'></td><td><span> </span><span class='pt21'>int</span><span> i</span><span class='pt26'>,</span><span> j</span><span class='pt26'>;</span></td></tr>
<tr><td class='ln' data-ln='19'></td><td> </td></tr>
<tr><td class='ln' data-ln='20'></td><td><span> </span><span class='pt21'>for</span><span> (i </span><span class='pt17'>=</span><span> </span><span class='pt22'>0</span><span class='pt26'>;</span><span> i </span><span class='pt17'><</span><span> </span><span class='pt22'>8</span><span class='pt26'>;</span><span> i</span><span class='pt17'>++</span><span>) {</span></td></tr>
<tr><td class='ln' data-ln='21'></td><td><span> bkey[i] </span><span class='pt17'>=</span><span> </span><span class='pt22'>0</span><span class='pt26'>;</span></td></tr>
<tr><td class='ln' data-ln='22'></td><td><span> </span><span class='pt21'>for</span><span> (j </span><span class='pt17'>=</span><span> </span><span class='pt22'>7</span><span class='pt26'>;</span><span> j </span><span class='pt17'>>=</span><span> </span><span class='pt22'>0</span><span class='pt26'>;</span><span> j</span><span class='pt17'>--</span><span class='pt26'>,</span><span> key</span><span class='pt17'>++</span><span>)</span></td></tr>
<tr><td class='ln' data-ln='23'></td><td><span> bkey[i] </span><span class='pt17'>|=</span><span> (</span><span class='pt9 it'>uint32_t</span><span>)(</span><span class='pt17'>*</span><span>key </span><span class='pt17'>&</span><span> </span><span class='pt22'>1</span><span>) </span><span class='pt17'><<</span><span> j</span><span class='pt26'>;</span></td></tr>
<tr><td class='ln' data-ln='24'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='25'></td><td> </td></tr>
<tr><td class='ln' data-ln='26'></td><td><span> </span><span class='pt19'>__des_setkey</span><span>(bkey</span><span class='pt26'>,</span><span> </span><span class='pt17'>&</span><span>__encrypt_key)</span><span class='pt26'>;</span></td></tr>
<tr><td class='ln' data-ln='27'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='28'></td><td> </td></tr>
<tr><td class='ln' data-ln='29'></td><td><span class='pt21'>void</span><span> </span><span class='pt19'>encrypt</span><span>(</span><span class='pt21'>char</span><span> </span><span class='pt17'>*</span><span class='pt11'>block</span><span class='pt26'>,</span><span> </span><span class='pt21'>int</span><span> </span><span class='pt11'>edflag</span><span>)</span></td></tr>
<tr><td class='ln' data-ln='30'></td><td><span>{</span></td></tr>
<tr><td class='ln' data-ln='31'></td><td><span> </span><span class='pt21'>struct</span><span> expanded_key decrypt_key</span><span class='pt26'>,</span><span> </span><span class='pt17'>*</span><span>key</span><span class='pt26'>;</span></td></tr>
<tr><td class='ln' data-ln='32'></td><td><span> </span><span class='pt9 it'>uint32_t</span><span> b[</span><span class='pt22'>2</span><span>]</span><span class='pt26'>;</span></td></tr>
<tr><td class='ln' data-ln='33'></td><td><span> </span><span class='pt21'>int</span><span> i</span><span class='pt26'>,</span><span> j</span><span class='pt26'>;</span></td></tr>
<tr><td class='ln' data-ln='34'></td><td><span> </span><span class='pt21'>char</span><span> </span><span class='pt17'>*</span><span>p</span><span class='pt26'>;</span></td></tr>
<tr><td class='ln' data-ln='35'></td><td> </td></tr>
<tr><td class='ln' data-ln='36'></td><td><span> p </span><span class='pt17'>=</span><span> block</span><span class='pt26'>;</span></td></tr>
<tr><td class='ln' data-ln='37'></td><td><span> </span><span class='pt21'>for</span><span> (i </span><span class='pt17'>=</span><span> </span><span class='pt22'>0</span><span class='pt26'>;</span><span> i </span><span class='pt17'><</span><span> </span><span class='pt22'>2</span><span class='pt26'>;</span><span> i</span><span class='pt17'>++</span><span>) {</span></td></tr>
<tr><td class='ln' data-ln='38'></td><td><span> b[i] </span><span class='pt17'>=</span><span> </span><span class='pt22'>0</span><span class='pt26'>;</span></td></tr>
<tr><td class='ln' data-ln='39'></td><td><span> </span><span class='pt21'>for</span><span> (j </span><span class='pt17'>=</span><span> </span><span class='pt22'>31</span><span class='pt26'>;</span><span> j </span><span class='pt17'>>=</span><span> </span><span class='pt22'>0</span><span class='pt26'>;</span><span> j</span><span class='pt17'>--</span><span class='pt26'>,</span><span> p</span><span class='pt17'>++</span><span>)</span></td></tr>
<tr><td class='ln' data-ln='40'></td><td><span> b[i] </span><span class='pt17'>|=</span><span> (</span><span class='pt9 it'>uint32_t</span><span>)(</span><span class='pt17'>*</span><span>p </span><span class='pt17'>&</span><span> </span><span class='pt22'>1</span><span>) </span><span class='pt17'><<</span><span> j</span><span class='pt26'>;</span></td></tr>
<tr><td class='ln' data-ln='41'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='42'></td><td> </td></tr>
<tr><td class='ln' data-ln='43'></td><td><span> key </span><span class='pt17'>=</span><span> </span><span class='pt17'>&</span><span>__encrypt_key</span><span class='pt26'>;</span></td></tr>
<tr><td class='ln' data-ln='44'></td><td><span> </span><span class='pt21'>if</span><span> (edflag) {</span></td></tr>
<tr><td class='ln' data-ln='45'></td><td><span> key </span><span class='pt17'>=</span><span> </span><span class='pt17'>&</span><span>decrypt_key</span><span class='pt26'>;</span></td></tr>
<tr><td class='ln' data-ln='46'></td><td><span> </span><span class='pt21'>for</span><span> (i </span><span class='pt17'>=</span><span> </span><span class='pt22'>0</span><span class='pt26'>;</span><span> i </span><span class='pt17'><</span><span> </span><span class='pt22'>16</span><span class='pt26'>;</span><span> i</span><span class='pt17'>++</span><span>) {</span></td></tr>
<tr><td class='ln' data-ln='47'></td><td><span> decrypt_key</span><span class='pt17'>.</span><span>l[i] </span><span class='pt17'>=</span><span> __encrypt_key</span><span class='pt17'>.</span><span>l[</span><span class='pt22'>15</span><span class='pt17'>-</span><span>i]</span><span class='pt26'>;</span></td></tr>
<tr><td class='ln' data-ln='48'></td><td><span> decrypt_key</span><span class='pt17'>.</span><span>r[i] </span><span class='pt17'>=</span><span> __encrypt_key</span><span class='pt17'>.</span><span>r[</span><span class='pt22'>15</span><span class='pt17'>-</span><span>i]</span><span class='pt26'>;</span></td></tr>
<tr><td class='ln' data-ln='49'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='50'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='51'></td><td> </td></tr>
<tr><td class='ln' data-ln='52'></td><td><span> </span><span class='pt19'>__do_des</span><span>(b[</span><span class='pt22'>0</span><span>]</span><span class='pt26'>,</span><span> b[</span><span class='pt22'>1</span><span>]</span><span class='pt26'>,</span><span> b</span><span class='pt26'>,</span><span> b </span><span class='pt17'>+</span><span> </span><span class='pt22'>1</span><span class='pt26'>,</span><span> </span><span class='pt22'>1</span><span class='pt26'>,</span><span> </span><span class='pt22'>0</span><span class='pt26'>,</span><span> key)</span><span class='pt26'>;</span></td></tr>
<tr><td class='ln' data-ln='53'></td><td> </td></tr>
<tr><td class='ln' data-ln='54'></td><td><span> p </span><span class='pt17'>=</span><span> block</span><span class='pt26'>;</span></td></tr>
<tr><td class='ln' data-ln='55'></td><td><span> </span><span class='pt21'>for</span><span> (i </span><span class='pt17'>=</span><span> </span><span class='pt22'>0</span><span class='pt26'>;</span><span> i </span><span class='pt17'><</span><span> </span><span class='pt22'>2</span><span class='pt26'>;</span><span> i</span><span class='pt17'>++</span><span>)</span></td></tr>
<tr><td class='ln' data-ln='56'></td><td><span> </span><span class='pt21'>for</span><span> (j </span><span class='pt17'>=</span><span> </span><span class='pt22'>31</span><span class='pt26'>;</span><span> j </span><span class='pt17'>>=</span><span> </span><span class='pt22'>0</span><span class='pt26'>;</span><span> j</span><span class='pt17'>--</span><span>)</span></td></tr>
<tr><td class='ln' data-ln='57'></td><td><span> </span><span class='pt17'>*</span><span>p</span><span class='pt17'>++</span><span> </span><span class='pt17'>=</span><span> b[i]</span><span class='pt17'>>></span><span>j </span><span class='pt17'>&</span><span> </span><span class='pt22'>1</span><span class='pt26'>;</span></td></tr>
<tr><td class='ln' data-ln='58'></td><td><span>}</span></td></tr>
</table>
</div>
</div>
</div>
<div class='style' id='P--ayu_mirage--c'>
<div class='P--ayu_mirage-bordered'>
<div class="info header">
<span class="left">musl-wasm32.encrypt.c</span>
<span class="right"><span>58 lines</span><span>1.13 KB</span></span>
</div>
<div class='P--ayu_mirage'>
<table>
<tr><td class='ln' data-ln='1'></td><td><span class='pt19'>#include</span><span> </span><span class='pt12'><stdint.h></span></td></tr>
<tr><td class='ln' data-ln='2'></td><td><span class='pt19'>#include</span><span> </span><span class='pt12'><stdlib.h></span></td></tr>
<tr><td class='ln' data-ln='3'></td><td> </td></tr>
<tr><td class='ln' data-ln='4'></td><td><span class='pt19'>struct</span><span> </span><span class='pt10'>expanded_key</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='5'></td><td><span> </span><span class='pt9 it'>uint32_t</span><span> l[</span><span class='pt14'>16</span><span>]</span><span class='pt24'>,</span><span> r[</span><span class='pt14'>16</span><span>]</span><span class='pt24'>;</span></td></tr>
<tr><td class='ln' data-ln='6'></td><td><span>}</span><span class='pt24'>;</span></td></tr>
<tr><td class='ln' data-ln='7'></td><td> </td></tr>
<tr><td class='ln' data-ln='8'></td><td class='hi'><span class='pt19'>void</span><span> </span><span class='pt22'>__des_setkey</span><span>(</span><span class='pt19'>const</span><span> </span><span class='pt19'>unsigned</span><span> </span><span class='pt19'>char</span><span> </span><span class='pt17'>*</span><span class='pt14'>key</span><span class='pt24'>,</span><span> </span><span class='pt19'>struct</span><span> expanded_key </span><span class='pt17'>*</span><span class='pt14'>ekey</span><span>)</span><span class='pt24'>;</span></td></tr>
<tr><td class='ln' data-ln='9'></td><td class='hi'><span class='pt19'>void</span><span> </span><span class='pt22'>__do_des</span><span>(</span><span class='pt9 it'>uint32_t</span><span> </span><span class='pt14'>l_in</span><span class='pt24'>,</span><span> </span><span class='pt9 it'>uint32_t</span><span> </span><span class='pt14'>r_in</span><span class='pt24'>,</span></td></tr>
<tr><td class='ln' data-ln='10'></td><td class='hi'><span> </span><span class='pt9 it'>uint32_t</span><span> </span><span class='pt17'>*</span><span class='pt14'>l_out</span><span class='pt24'>,</span><span> </span><span class='pt9 it'>uint32_t</span><span> </span><span class='pt17'>*</span><span class='pt14'>r_out</span><span class='pt24'>,</span></td></tr>
<tr><td class='ln' data-ln='11'></td><td class='hi'><span> </span><span class='pt9 it'>uint32_t</span><span> </span><span class='pt14'>count</span><span class='pt24'>,</span><span> </span><span class='pt9 it'>uint32_t</span><span> </span><span class='pt14'>saltbits</span><span class='pt24'>,</span><span> </span><span class='pt19'>const</span><span> </span><span class='pt19'>struct</span><span> expanded_key </span><span class='pt17'>*</span><span class='pt14'>ekey</span><span>)</span><span class='pt24'>;</span></td></tr>
<tr><td class='ln' data-ln='12'></td><td> </td></tr>
<tr><td class='ln' data-ln='13'></td><td><span class='pt19'>static</span><span> </span><span class='pt19'>struct</span><span> expanded_key __encrypt_key</span><span class='pt24'>;</span></td></tr>
<tr><td class='ln' data-ln='14'></td><td> </td></tr>
<tr><td class='ln' data-ln='15'></td><td><span class='pt19'>void</span><span> </span><span class='pt22'>setkey</span><span>(</span><span class='pt19'>const</span><span> </span><span class='pt19'>char</span><span> </span><span class='pt17'>*</span><span class='pt14'>key</span><span>)</span></td></tr>
<tr><td class='ln' data-ln='16'></td><td><span>{</span></td></tr>
<tr><td class='ln' data-ln='17'></td><td><span> </span><span class='pt19'>unsigned</span><span> </span><span class='pt19'>char</span><span> bkey[</span><span class='pt14'>8</span><span>]</span><span class='pt24'>;</span></td></tr>
<tr><td class='ln' data-ln='18'></td><td><span> </span><span class='pt19'>int</span><span> i</span><span class='pt24'>,</span><span> j</span><span class='pt24'>;</span></td></tr>
<tr><td class='ln' data-ln='19'></td><td> </td></tr>
<tr><td class='ln' data-ln='20'></td><td><span> </span><span class='pt19'>for</span><span> (i </span><span class='pt17'>=</span><span> </span><span class='pt14'>0</span><span class='pt24'>;</span><span> i </span><span class='pt17'><</span><span> </span><span class='pt14'>8</span><span class='pt24'>;</span><span> i</span><span class='pt17'>++</span><span>) {</span></td></tr>
<tr><td class='ln' data-ln='21'></td><td><span> bkey[i] </span><span class='pt17'>=</span><span> </span><span class='pt14'>0</span><span class='pt24'>;</span></td></tr>
<tr><td class='ln' data-ln='22'></td><td><span> </span><span class='pt19'>for</span><span> (j </span><span class='pt17'>=</span><span> </span><span class='pt14'>7</span><span class='pt24'>;</span><span> j </span><span class='pt17'>>=</span><span> </span><span class='pt14'>0</span><span class='pt24'>;</span><span> j</span><span class='pt17'>--</span><span class='pt24'>,</span><span> key</span><span class='pt17'>++</span><span>)</span></td></tr>
<tr><td class='ln' data-ln='23'></td><td><span> bkey[i] </span><span class='pt17'>|=</span><span> (</span><span class='pt9 it'>uint32_t</span><span>)(</span><span class='pt17'>*</span><span>key </span><span class='pt17'>&</span><span> </span><span class='pt14'>1</span><span>) </span><span class='pt17'><<</span><span> j</span><span class='pt24'>;</span></td></tr>
<tr><td class='ln' data-ln='24'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='25'></td><td> </td></tr>
<tr><td class='ln' data-ln='26'></td><td><span> </span><span class='pt22'>__des_setkey</span><span>(bkey</span><span class='pt24'>,</span><span> </span><span class='pt17'>&</span><span>__encrypt_key)</span><span class='pt24'>;</span></td></tr>
<tr><td class='ln' data-ln='27'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='28'></td><td> </td></tr>
<tr><td class='ln' data-ln='29'></td><td><span class='pt19'>void</span><span> </span><span class='pt22'>encrypt</span><span>(</span><span class='pt19'>char</span><span> </span><span class='pt17'>*</span><span class='pt14'>block</span><span class='pt24'>,</span><span> </span><span class='pt19'>int</span><span> </span><span class='pt14'>edflag</span><span>)</span></td></tr>
<tr><td class='ln' data-ln='30'></td><td><span>{</span></td></tr>
<tr><td class='ln' data-ln='31'></td><td><span> </span><span class='pt19'>struct</span><span> expanded_key decrypt_key</span><span class='pt24'>,</span><span> </span><span class='pt17'>*</span><span>key</span><span class='pt24'>;</span></td></tr>
<tr><td class='ln' data-ln='32'></td><td><span> </span><span class='pt9 it'>uint32_t</span><span> b[</span><span class='pt14'>2</span><span>]</span><span class='pt24'>;</span></td></tr>
<tr><td class='ln' data-ln='33'></td><td><span> </span><span class='pt19'>int</span><span> i</span><span class='pt24'>,</span><span> j</span><span class='pt24'>;</span></td></tr>
<tr><td class='ln' data-ln='34'></td><td><span> </span><span class='pt19'>char</span><span> </span><span class='pt17'>*</span><span>p</span><span class='pt24'>;</span></td></tr>
<tr><td class='ln' data-ln='35'></td><td> </td></tr>
<tr><td class='ln' data-ln='36'></td><td><span> p </span><span class='pt17'>=</span><span> block</span><span class='pt24'>;</span></td></tr>
<tr><td class='ln' data-ln='37'></td><td><span> </span><span class='pt19'>for</span><span> (i </span><span class='pt17'>=</span><span> </span><span class='pt14'>0</span><span class='pt24'>;</span><span> i </span><span class='pt17'><</span><span> </span><span class='pt14'>2</span><span class='pt24'>;</span><span> i</span><span class='pt17'>++</span><span>) {</span></td></tr>
<tr><td class='ln' data-ln='38'></td><td><span> b[i] </span><span class='pt17'>=</span><span> </span><span class='pt14'>0</span><span class='pt24'>;</span></td></tr>
<tr><td class='ln' data-ln='39'></td><td><span> </span><span class='pt19'>for</span><span> (j </span><span class='pt17'>=</span><span> </span><span class='pt14'>31</span><span class='pt24'>;</span><span> j </span><span class='pt17'>>=</span><span> </span><span class='pt14'>0</span><span class='pt24'>;</span><span> j</span><span class='pt17'>--</span><span class='pt24'>,</span><span> p</span><span class='pt17'>++</span><span>)</span></td></tr>
<tr><td class='ln' data-ln='40'></td><td><span> b[i] </span><span class='pt17'>|=</span><span> (</span><span class='pt9 it'>uint32_t</span><span>)(</span><span class='pt17'>*</span><span>p </span><span class='pt17'>&</span><span> </span><span class='pt14'>1</span><span>) </span><span class='pt17'><<</span><span> j</span><span class='pt24'>;</span></td></tr>
<tr><td class='ln' data-ln='41'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='42'></td><td> </td></tr>
<tr><td class='ln' data-ln='43'></td><td><span> key </span><span class='pt17'>=</span><span> </span><span class='pt17'>&</span><span>__encrypt_key</span><span class='pt24'>;</span></td></tr>
<tr><td class='ln' data-ln='44'></td><td><span> </span><span class='pt19'>if</span><span> (edflag) {</span></td></tr>
<tr><td class='ln' data-ln='45'></td><td><span> key </span><span class='pt17'>=</span><span> </span><span class='pt17'>&</span><span>decrypt_key</span><span class='pt24'>;</span></td></tr>
<tr><td class='ln' data-ln='46'></td><td><span> </span><span class='pt19'>for</span><span> (i </span><span class='pt17'>=</span><span> </span><span class='pt14'>0</span><span class='pt24'>;</span><span> i </span><span class='pt17'><</span><span> </span><span class='pt14'>16</span><span class='pt24'>;</span><span> i</span><span class='pt17'>++</span><span>) {</span></td></tr>
<tr><td class='ln' data-ln='47'></td><td><span> decrypt_key</span><span class='pt17'>.</span><span>l[i] </span><span class='pt17'>=</span><span> __encrypt_key</span><span class='pt17'>.</span><span>l[</span><span class='pt14'>15</span><span class='pt17'>-</span><span>i]</span><span class='pt24'>;</span></td></tr>
<tr><td class='ln' data-ln='48'></td><td><span> decrypt_key</span><span class='pt17'>.</span><span>r[i] </span><span class='pt17'>=</span><span> __encrypt_key</span><span class='pt17'>.</span><span>r[</span><span class='pt14'>15</span><span class='pt17'>-</span><span>i]</span><span class='pt24'>;</span></td></tr>
<tr><td class='ln' data-ln='49'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='50'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='51'></td><td> </td></tr>
<tr><td class='ln' data-ln='52'></td><td><span> </span><span class='pt22'>__do_des</span><span>(b[</span><span class='pt14'>0</span><span>]</span><span class='pt24'>,</span><span> b[</span><span class='pt14'>1</span><span>]</span><span class='pt24'>,</span><span> b</span><span class='pt24'>,</span><span> b </span><span class='pt17'>+</span><span> </span><span class='pt14'>1</span><span class='pt24'>,</span><span> </span><span class='pt14'>1</span><span class='pt24'>,</span><span> </span><span class='pt14'>0</span><span class='pt24'>,</span><span> key)</span><span class='pt24'>;</span></td></tr>
<tr><td class='ln' data-ln='53'></td><td> </td></tr>
<tr><td class='ln' data-ln='54'></td><td><span> p </span><span class='pt17'>=</span><span> block</span><span class='pt24'>;</span></td></tr>
<tr><td class='ln' data-ln='55'></td><td><span> </span><span class='pt19'>for</span><span> (i </span><span class='pt17'>=</span><span> </span><span class='pt14'>0</span><span class='pt24'>;</span><span> i </span><span class='pt17'><</span><span> </span><span class='pt14'>2</span><span class='pt24'>;</span><span> i</span><span class='pt17'>++</span><span>)</span></td></tr>
<tr><td class='ln' data-ln='56'></td><td><span> </span><span class='pt19'>for</span><span> (j </span><span class='pt17'>=</span><span> </span><span class='pt14'>31</span><span class='pt24'>;</span><span> j </span><span class='pt17'>>=</span><span> </span><span class='pt14'>0</span><span class='pt24'>;</span><span> j</span><span class='pt17'>--</span><span>)</span></td></tr>
<tr><td class='ln' data-ln='57'></td><td><span> </span><span class='pt17'>*</span><span>p</span><span class='pt17'>++</span><span> </span><span class='pt17'>=</span><span> b[i]</span><span class='pt17'>>></span><span>j </span><span class='pt17'>&</span><span> </span><span class='pt14'>1</span><span class='pt24'>;</span></td></tr>
<tr><td class='ln' data-ln='58'></td><td><span>}</span></td></tr>
</table>
</div>
</div>
</div>
<div class='style' id='P--cobalt2--c'>
<div class='P--cobalt2-bordered'>
<div class="info header">
<span class="left">musl-wasm32.encrypt.c</span>
<span class="right"><span>58 lines</span><span>1.13 KB</span></span>
</div>
<div class='P--cobalt2'>
<table>
<tr><td class='ln' data-ln='1'></td><td><span class='pt56'>#include</span><span> </span><span class='pt23'><stdint.h></span></td></tr>
<tr><td class='ln' data-ln='2'></td><td><span class='pt56'>#include</span><span> </span><span class='pt23'><stdlib.h></span></td></tr>
<tr><td class='ln' data-ln='3'></td><td> </td></tr>
<tr><td class='ln' data-ln='4'></td><td><span class='pt60'>struct</span><span> </span><span class='pt60'>expanded_key</span><span> </span><span class='pt43'>{</span></td></tr>
<tr><td class='ln' data-ln='5'></td><td><span> </span><span class='pt29'>uint32_t</span><span> l</span><span class='pt43'>[</span><span class='pt54'>16</span><span class='pt43'>],</span><span> r</span><span class='pt43'>[</span><span class='pt54'>16</span><span class='pt43'>];</span></td></tr>
<tr><td class='ln' data-ln='6'></td><td><span class='pt43'>};</span></td></tr>
<tr><td class='ln' data-ln='7'></td><td> </td></tr>
<tr><td class='ln' data-ln='8'></td><td class='hi'><span class='pt60'>void</span><span> </span><span class='pt60'>__des_setkey</span><span class='pt43'>(</span><span class='pt60'>const</span><span> </span><span class='pt60'>unsigned</span><span> </span><span class='pt60'>char</span><span> </span><span class='pt56'>*</span><span class='pt41 pt4'>key</span><span class='pt43'>,</span><span> </span><span class='pt60'>struct</span><span> expanded_key </span><span class='pt56'>*</span><span class='pt41 pt4'>ekey</span><span class='pt43'>);</span></td></tr>
<tr><td class='ln' data-ln='9'></td><td class='hi'><span class='pt60'>void</span><span> </span><span class='pt60'>__do_des</span><span class='pt43'>(</span><span class='pt29'>uint32_t</span><span> </span><span class='pt41 pt4'>l_in</span><span class='pt43'>,</span><span> </span><span class='pt29'>uint32_t</span><span> </span><span class='pt41 pt4'>r_in</span><span class='pt43'>,</span></td></tr>
<tr><td class='ln' data-ln='10'></td><td class='hi'><span> </span><span class='pt29'>uint32_t</span><span> </span><span class='pt56'>*</span><span class='pt41 pt4'>l_out</span><span class='pt43'>,</span><span> </span><span class='pt29'>uint32_t</span><span> </span><span class='pt56'>*</span><span class='pt41 pt4'>r_out</span><span class='pt43'>,</span></td></tr>
<tr><td class='ln' data-ln='11'></td><td class='hi'><span> </span><span class='pt29'>uint32_t</span><span> </span><span class='pt41 pt4'>count</span><span class='pt43'>,</span><span> </span><span class='pt29'>uint32_t</span><span> </span><span class='pt41 pt4'>saltbits</span><span class='pt43'>,</span><span> </span><span class='pt60'>const</span><span> </span><span class='pt60'>struct</span><span> expanded_key </span><span class='pt56'>*</span><span class='pt41 pt4'>ekey</span><span class='pt43'>);</span></td></tr>
<tr><td class='ln' data-ln='12'></td><td> </td></tr>
<tr><td class='ln' data-ln='13'></td><td><span class='pt60'>static</span><span> </span><span class='pt60'>struct</span><span> expanded_key __encrypt_key</span><span class='pt43'>;</span></td></tr>
<tr><td class='ln' data-ln='14'></td><td> </td></tr>
<tr><td class='ln' data-ln='15'></td><td><span class='pt60'>void</span><span> </span><span class='pt60'>setkey</span><span class='pt43'>(</span><span class='pt60'>const</span><span> </span><span class='pt60'>char</span><span> </span><span class='pt56'>*</span><span class='pt41 pt4'>key</span><span class='pt43'>)</span></td></tr>
<tr><td class='ln' data-ln='16'></td><td><span class='pt43'>{</span></td></tr>
<tr><td class='ln' data-ln='17'></td><td><span> </span><span class='pt60'>unsigned</span><span> </span><span class='pt60'>char</span><span> bkey</span><span class='pt43'>[</span><span class='pt54'>8</span><span class='pt43'>];</span></td></tr>
<tr><td class='ln' data-ln='18'></td><td><span> </span><span class='pt60'>int</span><span> i</span><span class='pt43'>,</span><span> j</span><span class='pt43'>;</span></td></tr>
<tr><td class='ln' data-ln='19'></td><td> </td></tr>
<tr><td class='ln' data-ln='20'></td><td><span> </span><span class='pt56'>for</span><span> </span><span class='pt43'>(</span><span>i </span><span class='pt56'>=</span><span> </span><span class='pt54'>0</span><span class='pt43'>;</span><span> i </span><span class='pt56'><</span><span> </span><span class='pt54'>8</span><span class='pt43'>;</span><span> i</span><span class='pt56'>++</span><span class='pt43'>)</span><span> </span><span class='pt43'>{</span></td></tr>
<tr><td class='ln' data-ln='21'></td><td><span> bkey</span><span class='pt43'>[</span><span>i</span><span class='pt43'>]</span><span> </span><span class='pt56'>=</span><span> </span><span class='pt54'>0</span><span class='pt43'>;</span></td></tr>
<tr><td class='ln' data-ln='22'></td><td><span> </span><span class='pt56'>for</span><span> </span><span class='pt43'>(</span><span>j </span><span class='pt56'>=</span><span> </span><span class='pt54'>7</span><span class='pt43'>;</span><span> j </span><span class='pt56'>>=</span><span> </span><span class='pt54'>0</span><span class='pt43'>;</span><span> j</span><span class='pt56'>--</span><span class='pt43'>,</span><span> key</span><span class='pt56'>++</span><span class='pt43'>)</span></td></tr>
<tr><td class='ln' data-ln='23'></td><td><span> bkey</span><span class='pt43'>[</span><span>i</span><span class='pt43'>]</span><span> </span><span class='pt56'>|=</span><span> </span><span class='pt43'>(</span><span class='pt29'>uint32_t</span><span class='pt43'>)(</span><span class='pt56'>*</span><span>key </span><span class='pt56'>&</span><span> </span><span class='pt54'>1</span><span class='pt43'>)</span><span> </span><span class='pt56'><<</span><span> j</span><span class='pt43'>;</span></td></tr>
<tr><td class='ln' data-ln='24'></td><td><span> </span><span class='pt43'>}</span></td></tr>
<tr><td class='ln' data-ln='25'></td><td> </td></tr>
<tr><td class='ln' data-ln='26'></td><td><span> </span><span class='pt62'>__des_setkey</span><span class='pt43'>(</span><span>bkey</span><span class='pt43'>,</span><span> </span><span class='pt56'>&</span><span>__encrypt_key</span><span class='pt43'>);</span></td></tr>
<tr><td class='ln' data-ln='27'></td><td><span class='pt43'>}</span></td></tr>
<tr><td class='ln' data-ln='28'></td><td> </td></tr>
<tr><td class='ln' data-ln='29'></td><td><span class='pt60'>void</span><span> </span><span class='pt60'>encrypt</span><span class='pt43'>(</span><span class='pt60'>char</span><span> </span><span class='pt56'>*</span><span class='pt41 pt4'>block</span><span class='pt43'>,</span><span> </span><span class='pt60'>int</span><span> </span><span class='pt41 pt4'>edflag</span><span class='pt43'>)</span></td></tr>
<tr><td class='ln' data-ln='30'></td><td><span class='pt43'>{</span></td></tr>
<tr><td class='ln' data-ln='31'></td><td><span> </span><span class='pt60'>struct</span><span> expanded_key decrypt_key</span><span class='pt43'>,</span><span> </span><span class='pt56'>*</span><span>key</span><span class='pt43'>;</span></td></tr>
<tr><td class='ln' data-ln='32'></td><td><span> </span><span class='pt29'>uint32_t</span><span> b</span><span class='pt43'>[</span><span class='pt54'>2</span><span class='pt43'>];</span></td></tr>
<tr><td class='ln' data-ln='33'></td><td><span> </span><span class='pt60'>int</span><span> i</span><span class='pt43'>,</span><span> j</span><span class='pt43'>;</span></td></tr>
<tr><td class='ln' data-ln='34'></td><td><span> </span><span class='pt60'>char</span><span> </span><span class='pt56'>*</span><span>p</span><span class='pt43'>;</span></td></tr>
<tr><td class='ln' data-ln='35'></td><td> </td></tr>
<tr><td class='ln' data-ln='36'></td><td><span> p </span><span class='pt56'>=</span><span> block</span><span class='pt43'>;</span></td></tr>
<tr><td class='ln' data-ln='37'></td><td><span> </span><span class='pt56'>for</span><span> </span><span class='pt43'>(</span><span>i </span><span class='pt56'>=</span><span> </span><span class='pt54'>0</span><span class='pt43'>;</span><span> i </span><span class='pt56'><</span><span> </span><span class='pt54'>2</span><span class='pt43'>;</span><span> i</span><span class='pt56'>++</span><span class='pt43'>)</span><span> </span><span class='pt43'>{</span></td></tr>
<tr><td class='ln' data-ln='38'></td><td><span> b</span><span class='pt43'>[</span><span>i</span><span class='pt43'>]</span><span> </span><span class='pt56'>=</span><span> </span><span class='pt54'>0</span><span class='pt43'>;</span></td></tr>
<tr><td class='ln' data-ln='39'></td><td><span> </span><span class='pt56'>for</span><span> </span><span class='pt43'>(</span><span>j </span><span class='pt56'>=</span><span> </span><span class='pt54'>31</span><span class='pt43'>;</span><span> j </span><span class='pt56'>>=</span><span> </span><span class='pt54'>0</span><span class='pt43'>;</span><span> j</span><span class='pt56'>--</span><span class='pt43'>,</span><span> p</span><span class='pt56'>++</span><span class='pt43'>)</span></td></tr>
<tr><td class='ln' data-ln='40'></td><td><span> b</span><span class='pt43'>[</span><span>i</span><span class='pt43'>]</span><span> </span><span class='pt56'>|=</span><span> </span><span class='pt43'>(</span><span class='pt29'>uint32_t</span><span class='pt43'>)(</span><span class='pt56'>*</span><span>p </span><span class='pt56'>&</span><span> </span><span class='pt54'>1</span><span class='pt43'>)</span><span> </span><span class='pt56'><<</span><span> j</span><span class='pt43'>;</span></td></tr>
<tr><td class='ln' data-ln='41'></td><td><span> </span><span class='pt43'>}</span></td></tr>
<tr><td class='ln' data-ln='42'></td><td> </td></tr>
<tr><td class='ln' data-ln='43'></td><td><span> key </span><span class='pt56'>=</span><span> </span><span class='pt56'>&</span><span>__encrypt_key</span><span class='pt43'>;</span></td></tr>
<tr><td class='ln' data-ln='44'></td><td><span> </span><span class='pt56'>if</span><span> </span><span class='pt43'>(</span><span>edflag</span><span class='pt43'>)</span><span> </span><span class='pt43'>{</span></td></tr>
<tr><td class='ln' data-ln='45'></td><td><span> key </span><span class='pt56'>=</span><span> </span><span class='pt56'>&</span><span>decrypt_key</span><span class='pt43'>;</span></td></tr>
<tr><td class='ln' data-ln='46'></td><td><span> </span><span class='pt56'>for</span><span> </span><span class='pt43'>(</span><span>i </span><span class='pt56'>=</span><span> </span><span class='pt54'>0</span><span class='pt43'>;</span><span> i </span><span class='pt56'><</span><span> </span><span class='pt54'>16</span><span class='pt43'>;</span><span> i</span><span class='pt56'>++</span><span class='pt43'>)</span><span> </span><span class='pt43'>{</span></td></tr>
<tr><td class='ln' data-ln='47'></td><td><span> decrypt_key</span><span class='pt43'>.</span><span class='pt41 pt4'>l</span><span class='pt43'>[</span><span>i</span><span class='pt43'>]</span><span> </span><span class='pt56'>=</span><span> __encrypt_key</span><span class='pt43'>.</span><span class='pt41 pt4'>l</span><span class='pt43'>[</span><span class='pt54'>15</span><span class='pt56'>-</span><span>i</span><span class='pt43'>];</span></td></tr>
<tr><td class='ln' data-ln='48'></td><td><span> decrypt_key</span><span class='pt43'>.</span><span class='pt41 pt4'>r</span><span class='pt43'>[</span><span>i</span><span class='pt43'>]</span><span> </span><span class='pt56'>=</span><span> __encrypt_key</span><span class='pt43'>.</span><span class='pt41 pt4'>r</span><span class='pt43'>[</span><span class='pt54'>15</span><span class='pt56'>-</span><span>i</span><span class='pt43'>];</span></td></tr>
<tr><td class='ln' data-ln='49'></td><td><span> </span><span class='pt43'>}</span></td></tr>
<tr><td class='ln' data-ln='50'></td><td><span> </span><span class='pt43'>}</span></td></tr>
<tr><td class='ln' data-ln='51'></td><td> </td></tr>
<tr><td class='ln' data-ln='52'></td><td><span> </span><span class='pt62'>__do_des</span><span class='pt43'>(</span><span>b</span><span class='pt43'>[</span><span class='pt54'>0</span><span class='pt43'>],</span><span> b</span><span class='pt43'>[</span><span class='pt54'>1</span><span class='pt43'>],</span><span> b</span><span class='pt43'>,</span><span> b </span><span class='pt56'>+</span><span> </span><span class='pt54'>1</span><span class='pt43'>,</span><span> </span><span class='pt54'>1</span><span class='pt43'>,</span><span> </span><span class='pt54'>0</span><span class='pt43'>,</span><span> key</span><span class='pt43'>);</span></td></tr>
<tr><td class='ln' data-ln='53'></td><td> </td></tr>
<tr><td class='ln' data-ln='54'></td><td><span> p </span><span class='pt56'>=</span><span> block</span><span class='pt43'>;</span></td></tr>
<tr><td class='ln' data-ln='55'></td><td><span> </span><span class='pt56'>for</span><span> </span><span class='pt43'>(</span><span>i </span><span class='pt56'>=</span><span> </span><span class='pt54'>0</span><span class='pt43'>;</span><span> i </span><span class='pt56'><</span><span> </span><span class='pt54'>2</span><span class='pt43'>;</span><span> i</span><span class='pt56'>++</span><span class='pt43'>)</span></td></tr>
<tr><td class='ln' data-ln='56'></td><td><span> </span><span class='pt56'>for</span><span> </span><span class='pt43'>(</span><span>j </span><span class='pt56'>=</span><span> </span><span class='pt54'>31</span><span class='pt43'>;</span><span> j </span><span class='pt56'>>=</span><span> </span><span class='pt54'>0</span><span class='pt43'>;</span><span> j</span><span class='pt56'>--</span><span class='pt43'>)</span></td></tr>
<tr><td class='ln' data-ln='57'></td><td><span> </span><span class='pt56'>*</span><span>p</span><span class='pt56'>++</span><span> </span><span class='pt56'>=</span><span> b</span><span class='pt43'>[</span><span>i</span><span class='pt43'>]</span><span class='pt56'>>></span><span>j </span><span class='pt56'>&</span><span> </span><span class='pt54'>1</span><span class='pt43'>;</span></td></tr>
<tr><td class='ln' data-ln='58'></td><td><span class='pt43'>}</span></td></tr>
</table>
</div>
</div>
</div>
<div class='style' id='P--dracula--c'>
<div class='P--dracula-bordered'>
<div class="info header">
<span class="left">musl-wasm32.encrypt.c</span>
<span class="right"><span>58 lines</span><span>1.13 KB</span></span>
</div>
<div class='P--dracula'>
<table>
<tr><td class='ln' data-ln='1'></td><td><span class='pt9'>#include</span><span> </span><span class='pt6'><</span><span class='pt7'>stdint.h</span><span class='pt6'>></span></td></tr>
<tr><td class='ln' data-ln='2'></td><td><span class='pt9'>#include</span><span> </span><span class='pt6'><</span><span class='pt7'>stdlib.h</span><span class='pt6'>></span></td></tr>
<tr><td class='ln' data-ln='3'></td><td> </td></tr>
<tr><td class='ln' data-ln='4'></td><td><span class='pt3 it'>struct</span><span> </span><span class='pt3 it'>expanded_key</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='5'></td><td><span> </span><span class='pt3 it'>uint32_t</span><span> l[</span><span class='pt5'>16</span><span>], r[</span><span class='pt5'>16</span><span>];</span></td></tr>
<tr><td class='ln' data-ln='6'></td><td><span>};</span></td></tr>
<tr><td class='ln' data-ln='7'></td><td> </td></tr>
<tr><td class='ln' data-ln='8'></td><td class='hi'><span class='pt3 it'>void</span><span> </span><span class='pt1'>__des_setkey</span><span>(</span><span class='pt9'>const</span><span> </span><span class='pt3 it'>unsigned</span><span> </span><span class='pt3 it'>char</span><span> </span><span class='pt9'>*</span><span class='pt10 it'>key</span><span>, </span><span class='pt3 it'>struct</span><span> expanded_key </span><span class='pt9'>*</span><span class='pt10 it'>ekey</span><span>);</span></td></tr>
<tr><td class='ln' data-ln='9'></td><td class='hi'><span class='pt3 it'>void</span><span> </span><span class='pt1'>__do_des</span><span>(</span><span class='pt3 it'>uint32_t</span><span> </span><span class='pt10 it'>l_in</span><span>, </span><span class='pt3 it'>uint32_t</span><span> </span><span class='pt10 it'>r_in</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='10'></td><td class='hi'><span> </span><span class='pt3 it'>uint32_t</span><span> </span><span class='pt9'>*</span><span class='pt10 it'>l_out</span><span>, </span><span class='pt3 it'>uint32_t</span><span> </span><span class='pt9'>*</span><span class='pt10 it'>r_out</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='11'></td><td class='hi'><span> </span><span class='pt3 it'>uint32_t</span><span> </span><span class='pt10 it'>count</span><span>, </span><span class='pt3 it'>uint32_t</span><span> </span><span class='pt10 it'>saltbits</span><span>, </span><span class='pt9'>const</span><span> </span><span class='pt3 it'>struct</span><span> expanded_key </span><span class='pt9'>*</span><span class='pt10 it'>ekey</span><span>);</span></td></tr>
<tr><td class='ln' data-ln='12'></td><td> </td></tr>
<tr><td class='ln' data-ln='13'></td><td><span class='pt9'>static</span><span> </span><span class='pt3 it'>struct</span><span> expanded_key __encrypt_key;</span></td></tr>
<tr><td class='ln' data-ln='14'></td><td> </td></tr>
<tr><td class='ln' data-ln='15'></td><td><span class='pt3 it'>void</span><span> </span><span class='pt1'>setkey</span><span>(</span><span class='pt9'>const</span><span> </span><span class='pt3 it'>char</span><span> </span><span class='pt9'>*</span><span class='pt10 it'>key</span><span>)</span></td></tr>
<tr><td class='ln' data-ln='16'></td><td><span>{</span></td></tr>
<tr><td class='ln' data-ln='17'></td><td><span> </span><span class='pt3 it'>unsigned</span><span> </span><span class='pt3 it'>char</span><span> bkey[</span><span class='pt5'>8</span><span>];</span></td></tr>
<tr><td class='ln' data-ln='18'></td><td><span> </span><span class='pt3 it'>int</span><span> i, j;</span></td></tr>
<tr><td class='ln' data-ln='19'></td><td> </td></tr>
<tr><td class='ln' data-ln='20'></td><td><span> </span><span class='pt9'>for</span><span> (i </span><span class='pt9'>=</span><span> </span><span class='pt5'>0</span><span>; i </span><span class='pt9'><</span><span> </span><span class='pt5'>8</span><span>; i</span><span class='pt9'>++</span><span>) {</span></td></tr>
<tr><td class='ln' data-ln='21'></td><td><span> bkey[i] </span><span class='pt9'>=</span><span> </span><span class='pt5'>0</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='22'></td><td><span> </span><span class='pt9'>for</span><span> (j </span><span class='pt9'>=</span><span> </span><span class='pt5'>7</span><span>; j </span><span class='pt9'>>=</span><span> </span><span class='pt5'>0</span><span>; j</span><span class='pt9'>--</span><span>, key</span><span class='pt9'>++</span><span>)</span></td></tr>
<tr><td class='ln' data-ln='23'></td><td><span> bkey[i] </span><span class='pt9'>|=</span><span> (</span><span class='pt3 it'>uint32_t</span><span>)(</span><span class='pt9'>*</span><span>key </span><span class='pt9'>&</span><span> </span><span class='pt5'>1</span><span>) </span><span class='pt9'><<</span><span> j;</span></td></tr>
<tr><td class='ln' data-ln='24'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='25'></td><td> </td></tr>
<tr><td class='ln' data-ln='26'></td><td><span> </span><span class='pt1'>__des_setkey</span><span>(bkey, </span><span class='pt9'>&</span><span>__encrypt_key);</span></td></tr>
<tr><td class='ln' data-ln='27'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='28'></td><td> </td></tr>
<tr><td class='ln' data-ln='29'></td><td><span class='pt3 it'>void</span><span> </span><span class='pt1'>encrypt</span><span>(</span><span class='pt3 it'>char</span><span> </span><span class='pt9'>*</span><span class='pt10 it'>block</span><span>, </span><span class='pt3 it'>int</span><span> </span><span class='pt10 it'>edflag</span><span>)</span></td></tr>
<tr><td class='ln' data-ln='30'></td><td><span>{</span></td></tr>
<tr><td class='ln' data-ln='31'></td><td><span> </span><span class='pt3 it'>struct</span><span> expanded_key decrypt_key, </span><span class='pt9'>*</span><span>key;</span></td></tr>
<tr><td class='ln' data-ln='32'></td><td><span> </span><span class='pt3 it'>uint32_t</span><span> b[</span><span class='pt5'>2</span><span>];</span></td></tr>
<tr><td class='ln' data-ln='33'></td><td><span> </span><span class='pt3 it'>int</span><span> i, j;</span></td></tr>
<tr><td class='ln' data-ln='34'></td><td><span> </span><span class='pt3 it'>char</span><span> </span><span class='pt9'>*</span><span>p;</span></td></tr>
<tr><td class='ln' data-ln='35'></td><td> </td></tr>
<tr><td class='ln' data-ln='36'></td><td><span> p </span><span class='pt9'>=</span><span> block;</span></td></tr>
<tr><td class='ln' data-ln='37'></td><td><span> </span><span class='pt9'>for</span><span> (i </span><span class='pt9'>=</span><span> </span><span class='pt5'>0</span><span>; i </span><span class='pt9'><</span><span> </span><span class='pt5'>2</span><span>; i</span><span class='pt9'>++</span><span>) {</span></td></tr>
<tr><td class='ln' data-ln='38'></td><td><span> b[i] </span><span class='pt9'>=</span><span> </span><span class='pt5'>0</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='39'></td><td><span> </span><span class='pt9'>for</span><span> (j </span><span class='pt9'>=</span><span> </span><span class='pt5'>31</span><span>; j </span><span class='pt9'>>=</span><span> </span><span class='pt5'>0</span><span>; j</span><span class='pt9'>--</span><span>, p</span><span class='pt9'>++</span><span>)</span></td></tr>
<tr><td class='ln' data-ln='40'></td><td><span> b[i] </span><span class='pt9'>|=</span><span> (</span><span class='pt3 it'>uint32_t</span><span>)(</span><span class='pt9'>*</span><span>p </span><span class='pt9'>&</span><span> </span><span class='pt5'>1</span><span>) </span><span class='pt9'><<</span><span> j;</span></td></tr>
<tr><td class='ln' data-ln='41'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='42'></td><td> </td></tr>
<tr><td class='ln' data-ln='43'></td><td><span> key </span><span class='pt9'>=</span><span> </span><span class='pt9'>&</span><span>__encrypt_key;</span></td></tr>
<tr><td class='ln' data-ln='44'></td><td><span> </span><span class='pt9'>if</span><span> (edflag) {</span></td></tr>
<tr><td class='ln' data-ln='45'></td><td><span> key </span><span class='pt9'>=</span><span> </span><span class='pt9'>&</span><span>decrypt_key;</span></td></tr>
<tr><td class='ln' data-ln='46'></td><td><span> </span><span class='pt9'>for</span><span> (i </span><span class='pt9'>=</span><span> </span><span class='pt5'>0</span><span>; i </span><span class='pt9'><</span><span> </span><span class='pt5'>16</span><span>; i</span><span class='pt9'>++</span><span>) {</span></td></tr>
<tr><td class='ln' data-ln='47'></td><td><span> decrypt_key.l[i] </span><span class='pt9'>=</span><span> __encrypt_key.l[</span><span class='pt5'>15</span><span class='pt9'>-</span><span>i];</span></td></tr>
<tr><td class='ln' data-ln='48'></td><td><span> decrypt_key.r[i] </span><span class='pt9'>=</span><span> __encrypt_key.r[</span><span class='pt5'>15</span><span class='pt9'>-</span><span>i];</span></td></tr>
<tr><td class='ln' data-ln='49'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='50'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='51'></td><td> </td></tr>
<tr><td class='ln' data-ln='52'></td><td><span> </span><span class='pt1'>__do_des</span><span>(b[</span><span class='pt5'>0</span><span>], b[</span><span class='pt5'>1</span><span>], b, b </span><span class='pt9'>+</span><span> </span><span class='pt5'>1</span><span>, </span><span class='pt5'>1</span><span>, </span><span class='pt5'>0</span><span>, key);</span></td></tr>
<tr><td class='ln' data-ln='53'></td><td> </td></tr>
<tr><td class='ln' data-ln='54'></td><td><span> p </span><span class='pt9'>=</span><span> block;</span></td></tr>
<tr><td class='ln' data-ln='55'></td><td><span> </span><span class='pt9'>for</span><span> (i </span><span class='pt9'>=</span><span> </span><span class='pt5'>0</span><span>; i </span><span class='pt9'><</span><span> </span><span class='pt5'>2</span><span>; i</span><span class='pt9'>++</span><span>)</span></td></tr>
<tr><td class='ln' data-ln='56'></td><td><span> </span><span class='pt9'>for</span><span> (j </span><span class='pt9'>=</span><span> </span><span class='pt5'>31</span><span>; j </span><span class='pt9'>>=</span><span> </span><span class='pt5'>0</span><span>; j</span><span class='pt9'>--</span><span>)</span></td></tr>
<tr><td class='ln' data-ln='57'></td><td><span> </span><span class='pt9'>*</span><span>p</span><span class='pt9'>++</span><span> </span><span class='pt9'>=</span><span> b[i]</span><span class='pt9'>>></span><span>j </span><span class='pt9'>&</span><span> </span><span class='pt5'>1</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='58'></td><td><span>}</span></td></tr>
</table>
</div>
</div>
</div>
<div class='style' id='P--github--c'>
<div class='P--github-bordered'>
<div class="info header">
<span class="left">musl-wasm32.encrypt.c</span>
<span class="right"><span>58 lines</span><span>1.13 KB</span></span>
</div>
<div class='P--github'>
<table>
<tr><td class='ln' data-ln='1'></td><td><span class='pt17'>#include</span><span> </span><span class='pt8'><stdint.h></span></td></tr>
<tr><td class='ln' data-ln='2'></td><td><span class='pt17'>#include</span><span> </span><span class='pt8'><stdlib.h></span></td></tr>
<tr><td class='ln' data-ln='3'></td><td> </td></tr>
<tr><td class='ln' data-ln='4'></td><td><span class='pt17'>struct</span><span> </span><span class='pt13'>expanded_key</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='5'></td><td><span> </span><span class='pt17'>uint32_t</span><span> l[</span><span class='pt7'>16</span><span>], r[</span><span class='pt7'>16</span><span>];</span></td></tr>
<tr><td class='ln' data-ln='6'></td><td><span>};</span></td></tr>
<tr><td class='ln' data-ln='7'></td><td> </td></tr>
<tr><td class='ln' data-ln='8'></td><td class='hi'><span class='pt17'>void</span><span> </span><span class='pt13'>__des_setkey</span><span>(</span><span class='pt17'>const</span><span> </span><span class='pt17'>unsigned</span><span> </span><span class='pt17'>char</span><span> </span><span class='pt17'>*</span><span class='pt13'>key</span><span>, </span><span class='pt17'>struct</span><span> expanded_key </span><span class='pt17'>*</span><span class='pt13'>ekey</span><span>);</span></td></tr>
<tr><td class='ln' data-ln='9'></td><td class='hi'><span class='pt17'>void</span><span> </span><span class='pt13'>__do_des</span><span>(</span><span class='pt17'>uint32_t</span><span> </span><span class='pt13'>l_in</span><span>, </span><span class='pt17'>uint32_t</span><span> </span><span class='pt13'>r_in</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='10'></td><td class='hi'><span> </span><span class='pt17'>uint32_t</span><span> </span><span class='pt17'>*</span><span class='pt13'>l_out</span><span>, </span><span class='pt17'>uint32_t</span><span> </span><span class='pt17'>*</span><span class='pt13'>r_out</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='11'></td><td class='hi'><span> </span><span class='pt17'>uint32_t</span><span> </span><span class='pt13'>count</span><span>, </span><span class='pt17'>uint32_t</span><span> </span><span class='pt13'>saltbits</span><span>, </span><span class='pt17'>const</span><span> </span><span class='pt17'>struct</span><span> expanded_key </span><span class='pt17'>*</span><span class='pt13'>ekey</span><span>);</span></td></tr>
<tr><td class='ln' data-ln='12'></td><td> </td></tr>
<tr><td class='ln' data-ln='13'></td><td><span class='pt17'>static</span><span> </span><span class='pt17'>struct</span><span> expanded_key __encrypt_key;</span></td></tr>
<tr><td class='ln' data-ln='14'></td><td> </td></tr>
<tr><td class='ln' data-ln='15'></td><td><span class='pt17'>void</span><span> </span><span class='pt13'>setkey</span><span>(</span><span class='pt17'>const</span><span> </span><span class='pt17'>char</span><span> </span><span class='pt17'>*</span><span class='pt13'>key</span><span>)</span></td></tr>
<tr><td class='ln' data-ln='16'></td><td><span>{</span></td></tr>
<tr><td class='ln' data-ln='17'></td><td><span> </span><span class='pt17'>unsigned</span><span> </span><span class='pt17'>char</span><span> bkey[</span><span class='pt7'>8</span><span>];</span></td></tr>
<tr><td class='ln' data-ln='18'></td><td><span> </span><span class='pt17'>int</span><span> i, j;</span></td></tr>
<tr><td class='ln' data-ln='19'></td><td> </td></tr>
<tr><td class='ln' data-ln='20'></td><td><span> </span><span class='pt17'>for</span><span> (i </span><span class='pt17'>=</span><span> </span><span class='pt7'>0</span><span>; i </span><span class='pt17'><</span><span> </span><span class='pt7'>8</span><span>; i</span><span class='pt17'>++</span><span>) {</span></td></tr>
<tr><td class='ln' data-ln='21'></td><td><span> bkey[i] </span><span class='pt17'>=</span><span> </span><span class='pt7'>0</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='22'></td><td><span> </span><span class='pt17'>for</span><span> (j </span><span class='pt17'>=</span><span> </span><span class='pt7'>7</span><span>; j </span><span class='pt17'>>=</span><span> </span><span class='pt7'>0</span><span>; j</span><span class='pt17'>--</span><span>, key</span><span class='pt17'>++</span><span>)</span></td></tr>
<tr><td class='ln' data-ln='23'></td><td><span> bkey[i] </span><span class='pt17'>|=</span><span> (</span><span class='pt17'>uint32_t</span><span>)(</span><span class='pt17'>*</span><span>key </span><span class='pt17'>&</span><span> </span><span class='pt7'>1</span><span>) </span><span class='pt17'><<</span><span> j;</span></td></tr>
<tr><td class='ln' data-ln='24'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='25'></td><td> </td></tr>
<tr><td class='ln' data-ln='26'></td><td><span> </span><span class='pt13'>__des_setkey</span><span>(bkey, </span><span class='pt17'>&</span><span>__encrypt_key);</span></td></tr>
<tr><td class='ln' data-ln='27'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='28'></td><td> </td></tr>
<tr><td class='ln' data-ln='29'></td><td><span class='pt17'>void</span><span> </span><span class='pt13'>encrypt</span><span>(</span><span class='pt17'>char</span><span> </span><span class='pt17'>*</span><span class='pt13'>block</span><span>, </span><span class='pt17'>int</span><span> </span><span class='pt13'>edflag</span><span>)</span></td></tr>
<tr><td class='ln' data-ln='30'></td><td><span>{</span></td></tr>
<tr><td class='ln' data-ln='31'></td><td><span> </span><span class='pt17'>struct</span><span> expanded_key decrypt_key, </span><span class='pt17'>*</span><span>key;</span></td></tr>
<tr><td class='ln' data-ln='32'></td><td><span> </span><span class='pt17'>uint32_t</span><span> b[</span><span class='pt7'>2</span><span>];</span></td></tr>
<tr><td class='ln' data-ln='33'></td><td><span> </span><span class='pt17'>int</span><span> i, j;</span></td></tr>
<tr><td class='ln' data-ln='34'></td><td><span> </span><span class='pt17'>char</span><span> </span><span class='pt17'>*</span><span>p;</span></td></tr>
<tr><td class='ln' data-ln='35'></td><td> </td></tr>
<tr><td class='ln' data-ln='36'></td><td><span> p </span><span class='pt17'>=</span><span> block;</span></td></tr>
<tr><td class='ln' data-ln='37'></td><td><span> </span><span class='pt17'>for</span><span> (i </span><span class='pt17'>=</span><span> </span><span class='pt7'>0</span><span>; i </span><span class='pt17'><</span><span> </span><span class='pt7'>2</span><span>; i</span><span class='pt17'>++</span><span>) {</span></td></tr>
<tr><td class='ln' data-ln='38'></td><td><span> b[i] </span><span class='pt17'>=</span><span> </span><span class='pt7'>0</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='39'></td><td><span> </span><span class='pt17'>for</span><span> (j </span><span class='pt17'>=</span><span> </span><span class='pt7'>31</span><span>; j </span><span class='pt17'>>=</span><span> </span><span class='pt7'>0</span><span>; j</span><span class='pt17'>--</span><span>, p</span><span class='pt17'>++</span><span>)</span></td></tr>
<tr><td class='ln' data-ln='40'></td><td><span> b[i] </span><span class='pt17'>|=</span><span> (</span><span class='pt17'>uint32_t</span><span>)(</span><span class='pt17'>*</span><span>p </span><span class='pt17'>&</span><span> </span><span class='pt7'>1</span><span>) </span><span class='pt17'><<</span><span> j;</span></td></tr>
<tr><td class='ln' data-ln='41'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='42'></td><td> </td></tr>
<tr><td class='ln' data-ln='43'></td><td><span> key </span><span class='pt17'>=</span><span> </span><span class='pt17'>&</span><span>__encrypt_key;</span></td></tr>
<tr><td class='ln' data-ln='44'></td><td><span> </span><span class='pt17'>if</span><span> (edflag) {</span></td></tr>
<tr><td class='ln' data-ln='45'></td><td><span> key </span><span class='pt17'>=</span><span> </span><span class='pt17'>&</span><span>decrypt_key;</span></td></tr>
<tr><td class='ln' data-ln='46'></td><td><span> </span><span class='pt17'>for</span><span> (i </span><span class='pt17'>=</span><span> </span><span class='pt7'>0</span><span>; i </span><span class='pt17'><</span><span> </span><span class='pt7'>16</span><span>; i</span><span class='pt17'>++</span><span>) {</span></td></tr>
<tr><td class='ln' data-ln='47'></td><td><span> decrypt_key.</span><span class='pt10'>l</span><span>[i] </span><span class='pt17'>=</span><span> __encrypt_key.</span><span class='pt10'>l</span><span>[</span><span class='pt7'>15</span><span class='pt17'>-</span><span>i];</span></td></tr>
<tr><td class='ln' data-ln='48'></td><td><span> decrypt_key.</span><span class='pt10'>r</span><span>[i] </span><span class='pt17'>=</span><span> __encrypt_key.</span><span class='pt10'>r</span><span>[</span><span class='pt7'>15</span><span class='pt17'>-</span><span>i];</span></td></tr>
<tr><td class='ln' data-ln='49'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='50'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='51'></td><td> </td></tr>
<tr><td class='ln' data-ln='52'></td><td><span> </span><span class='pt13'>__do_des</span><span>(b[</span><span class='pt7'>0</span><span>], b[</span><span class='pt7'>1</span><span>], b, b </span><span class='pt17'>+</span><span> </span><span class='pt7'>1</span><span>, </span><span class='pt7'>1</span><span>, </span><span class='pt7'>0</span><span>, key);</span></td></tr>
<tr><td class='ln' data-ln='53'></td><td> </td></tr>
<tr><td class='ln' data-ln='54'></td><td><span> p </span><span class='pt17'>=</span><span> block;</span></td></tr>
<tr><td class='ln' data-ln='55'></td><td><span> </span><span class='pt17'>for</span><span> (i </span><span class='pt17'>=</span><span> </span><span class='pt7'>0</span><span>; i </span><span class='pt17'><</span><span> </span><span class='pt7'>2</span><span>; i</span><span class='pt17'>++</span><span>)</span></td></tr>
<tr><td class='ln' data-ln='56'></td><td><span> </span><span class='pt17'>for</span><span> (j </span><span class='pt17'>=</span><span> </span><span class='pt7'>31</span><span>; j </span><span class='pt17'>>=</span><span> </span><span class='pt7'>0</span><span>; j</span><span class='pt17'>--</span><span>)</span></td></tr>
<tr><td class='ln' data-ln='57'></td><td><span> </span><span class='pt17'>*</span><span>p</span><span class='pt17'>++</span><span> </span><span class='pt17'>=</span><span> b[i]</span><span class='pt17'>>></span><span>j </span><span class='pt17'>&</span><span> </span><span class='pt7'>1</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='58'></td><td><span>}</span></td></tr>
</table>
</div>
</div>
</div>
<div class='style' id='P--monokai_extended--c'>
<div class='P--monokai_extended-bordered'>
<div class="info header">
<span class="left">musl-wasm32.encrypt.c</span>
<span class="right"><span>58 lines</span><span>1.13 KB</span></span>
</div>
<div class='P--monokai_extended'>
<table>
<tr><td class='ln' data-ln='1'></td><td><span class='pt32'>#include</span><span class='pt17'> </span><span class='pt27'><stdint.h></span></td></tr>
<tr><td class='ln' data-ln='2'></td><td><span class='pt32'>#include</span><span class='pt17'> </span><span class='pt27'><stdlib.h></span></td></tr>
<tr><td class='ln' data-ln='3'></td><td> </td></tr>
<tr><td class='ln' data-ln='4'></td><td><span class='pt9 it'>struct</span><span> </span><span class='pt13'>expanded_key</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='5'></td><td><span> </span><span class='pt13 it'>uint32_t</span><span> l[</span><span class='pt17'>16</span><span>], r[</span><span class='pt17'>16</span><span>];</span></td></tr>
<tr><td class='ln' data-ln='6'></td><td><span>};</span></td></tr>
<tr><td class='ln' data-ln='7'></td><td> </td></tr>
<tr><td class='ln' data-ln='8'></td><td class='hi'><span class='pt9 it'>void</span><span> </span><span class='pt13'>__des_setkey</span><span>(</span><span class='pt32'>const</span><span> </span><span class='pt9 it'>unsigned</span><span> </span><span class='pt9 it'>char</span><span> </span><span class='pt32'>*</span><span class='pt34 it'>key</span><span>, </span><span class='pt9 it'>struct</span><span> expanded_key </span><span class='pt32'>*</span><span class='pt34 it'>ekey</span><span>);</span></td></tr>
<tr><td class='ln' data-ln='9'></td><td class='hi'><span class='pt9 it'>void</span><span> </span><span class='pt13'>__do_des</span><span>(</span><span class='pt13 it'>uint32_t</span><span> </span><span class='pt34 it'>l_in</span><span>, </span><span class='pt13 it'>uint32_t</span><span> </span><span class='pt34 it'>r_in</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='10'></td><td class='hi'><span> </span><span class='pt13 it'>uint32_t</span><span> </span><span class='pt32'>*</span><span class='pt34 it'>l_out</span><span>, </span><span class='pt13 it'>uint32_t</span><span> </span><span class='pt32'>*</span><span class='pt34 it'>r_out</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='11'></td><td class='hi'><span> </span><span class='pt13 it'>uint32_t</span><span> </span><span class='pt34 it'>count</span><span>, </span><span class='pt13 it'>uint32_t</span><span> </span><span class='pt34 it'>saltbits</span><span>, </span><span class='pt32'>const</span><span> </span><span class='pt9 it'>struct</span><span> expanded_key </span><span class='pt32'>*</span><span class='pt34 it'>ekey</span><span>);</span></td></tr>
<tr><td class='ln' data-ln='12'></td><td> </td></tr>
<tr><td class='ln' data-ln='13'></td><td><span class='pt32'>static</span><span> </span><span class='pt9 it'>struct</span><span> expanded_key __encrypt_key;</span></td></tr>
<tr><td class='ln' data-ln='14'></td><td> </td></tr>
<tr><td class='ln' data-ln='15'></td><td><span class='pt9 it'>void</span><span> </span><span class='pt13'>setkey</span><span>(</span><span class='pt32'>const</span><span> </span><span class='pt9 it'>char</span><span> </span><span class='pt32'>*</span><span class='pt34 it'>key</span><span>)</span></td></tr>
<tr><td class='ln' data-ln='16'></td><td><span>{</span></td></tr>
<tr><td class='ln' data-ln='17'></td><td><span> </span><span class='pt9 it'>unsigned</span><span> </span><span class='pt9 it'>char</span><span> bkey[</span><span class='pt17'>8</span><span>];</span></td></tr>
<tr><td class='ln' data-ln='18'></td><td><span> </span><span class='pt9 it'>int</span><span> i, j;</span></td></tr>
<tr><td class='ln' data-ln='19'></td><td> </td></tr>
<tr><td class='ln' data-ln='20'></td><td><span> </span><span class='pt32'>for</span><span> (i </span><span class='pt32'>=</span><span> </span><span class='pt17'>0</span><span>; i </span><span class='pt32'><</span><span> </span><span class='pt17'>8</span><span>; i</span><span class='pt32'>++</span><span>) {</span></td></tr>
<tr><td class='ln' data-ln='21'></td><td><span> bkey[i] </span><span class='pt32'>=</span><span> </span><span class='pt17'>0</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='22'></td><td><span> </span><span class='pt32'>for</span><span> (j </span><span class='pt32'>=</span><span> </span><span class='pt17'>7</span><span>; j </span><span class='pt32'>>=</span><span> </span><span class='pt17'>0</span><span>; j</span><span class='pt32'>--</span><span>, key</span><span class='pt32'>++</span><span>)</span></td></tr>
<tr><td class='ln' data-ln='23'></td><td><span> bkey[i] </span><span class='pt32'>|=</span><span> (</span><span class='pt13 it'>uint32_t</span><span>)(</span><span class='pt32'>*</span><span>key </span><span class='pt32'>&</span><span> </span><span class='pt17'>1</span><span>) </span><span class='pt32'><<</span><span> j;</span></td></tr>
<tr><td class='ln' data-ln='24'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='25'></td><td> </td></tr>
<tr><td class='ln' data-ln='26'></td><td><span> __des_setkey(bkey, </span><span class='pt32'>&</span><span>__encrypt_key);</span></td></tr>
<tr><td class='ln' data-ln='27'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='28'></td><td> </td></tr>
<tr><td class='ln' data-ln='29'></td><td><span class='pt9 it'>void</span><span> </span><span class='pt13'>encrypt</span><span>(</span><span class='pt9 it'>char</span><span> </span><span class='pt32'>*</span><span class='pt34 it'>block</span><span>, </span><span class='pt9 it'>int</span><span> </span><span class='pt34 it'>edflag</span><span>)</span></td></tr>
<tr><td class='ln' data-ln='30'></td><td><span>{</span></td></tr>
<tr><td class='ln' data-ln='31'></td><td><span> </span><span class='pt9 it'>struct</span><span> expanded_key decrypt_key, </span><span class='pt32'>*</span><span>key;</span></td></tr>
<tr><td class='ln' data-ln='32'></td><td><span> </span><span class='pt13 it'>uint32_t</span><span> b[</span><span class='pt17'>2</span><span>];</span></td></tr>
<tr><td class='ln' data-ln='33'></td><td><span> </span><span class='pt9 it'>int</span><span> i, j;</span></td></tr>
<tr><td class='ln' data-ln='34'></td><td><span> </span><span class='pt9 it'>char</span><span> </span><span class='pt32'>*</span><span>p;</span></td></tr>
<tr><td class='ln' data-ln='35'></td><td> </td></tr>
<tr><td class='ln' data-ln='36'></td><td><span> p </span><span class='pt32'>=</span><span> block;</span></td></tr>
<tr><td class='ln' data-ln='37'></td><td><span> </span><span class='pt32'>for</span><span> (i </span><span class='pt32'>=</span><span> </span><span class='pt17'>0</span><span>; i </span><span class='pt32'><</span><span> </span><span class='pt17'>2</span><span>; i</span><span class='pt32'>++</span><span>) {</span></td></tr>
<tr><td class='ln' data-ln='38'></td><td><span> b[i] </span><span class='pt32'>=</span><span> </span><span class='pt17'>0</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='39'></td><td><span> </span><span class='pt32'>for</span><span> (j </span><span class='pt32'>=</span><span> </span><span class='pt17'>31</span><span>; j </span><span class='pt32'>>=</span><span> </span><span class='pt17'>0</span><span>; j</span><span class='pt32'>--</span><span>, p</span><span class='pt32'>++</span><span>)</span></td></tr>
<tr><td class='ln' data-ln='40'></td><td><span> b[i] </span><span class='pt32'>|=</span><span> (</span><span class='pt13 it'>uint32_t</span><span>)(</span><span class='pt32'>*</span><span>p </span><span class='pt32'>&</span><span> </span><span class='pt17'>1</span><span>) </span><span class='pt32'><<</span><span> j;</span></td></tr>
<tr><td class='ln' data-ln='41'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='42'></td><td> </td></tr>
<tr><td class='ln' data-ln='43'></td><td><span> key </span><span class='pt32'>=</span><span> </span><span class='pt32'>&</span><span>__encrypt_key;</span></td></tr>
<tr><td class='ln' data-ln='44'></td><td><span> </span><span class='pt32'>if</span><span> (edflag) {</span></td></tr>
<tr><td class='ln' data-ln='45'></td><td><span> key </span><span class='pt32'>=</span><span> </span><span class='pt32'>&</span><span>decrypt_key;</span></td></tr>
<tr><td class='ln' data-ln='46'></td><td><span> </span><span class='pt32'>for</span><span> (i </span><span class='pt32'>=</span><span> </span><span class='pt17'>0</span><span>; i </span><span class='pt32'><</span><span> </span><span class='pt17'>16</span><span>; i</span><span class='pt32'>++</span><span>) {</span></td></tr>
<tr><td class='ln' data-ln='47'></td><td><span> decrypt_key.</span><span class='pt36'>l</span><span>[i] </span><span class='pt32'>=</span><span> __encrypt_key.</span><span class='pt36'>l</span><span>[</span><span class='pt17'>15</span><span class='pt32'>-</span><span>i];</span></td></tr>
<tr><td class='ln' data-ln='48'></td><td><span> decrypt_key.</span><span class='pt36'>r</span><span>[i] </span><span class='pt32'>=</span><span> __encrypt_key.</span><span class='pt36'>r</span><span>[</span><span class='pt17'>15</span><span class='pt32'>-</span><span>i];</span></td></tr>
<tr><td class='ln' data-ln='49'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='50'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='51'></td><td> </td></tr>
<tr><td class='ln' data-ln='52'></td><td><span> __do_des(b[</span><span class='pt17'>0</span><span>], b[</span><span class='pt17'>1</span><span>], b, b </span><span class='pt32'>+</span><span> </span><span class='pt17'>1</span><span>, </span><span class='pt17'>1</span><span>, </span><span class='pt17'>0</span><span>, key);</span></td></tr>
<tr><td class='ln' data-ln='53'></td><td> </td></tr>
<tr><td class='ln' data-ln='54'></td><td><span> p </span><span class='pt32'>=</span><span> block;</span></td></tr>
<tr><td class='ln' data-ln='55'></td><td><span> </span><span class='pt32'>for</span><span> (i </span><span class='pt32'>=</span><span> </span><span class='pt17'>0</span><span>; i </span><span class='pt32'><</span><span> </span><span class='pt17'>2</span><span>; i</span><span class='pt32'>++</span><span>)</span></td></tr>
<tr><td class='ln' data-ln='56'></td><td><span> </span><span class='pt32'>for</span><span> (j </span><span class='pt32'>=</span><span> </span><span class='pt17'>31</span><span>; j </span><span class='pt32'>>=</span><span> </span><span class='pt17'>0</span><span>; j</span><span class='pt32'>--</span><span>)</span></td></tr>
<tr><td class='ln' data-ln='57'></td><td><span> </span><span class='pt32'>*</span><span>p</span><span class='pt32'>++</span><span> </span><span class='pt32'>=</span><span> b[i]</span><span class='pt32'>>></span><span>j </span><span class='pt32'>&</span><span> </span><span class='pt17'>1</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='58'></td><td><span>}</span></td></tr>
</table>
</div>
</div>
</div>
<div class='style' id='P--oceanic_next--c'>
<div class='P--oceanic_next-bordered'>
<div class="info header">
<span class="left">musl-wasm32.encrypt.c</span>
<span class="right"><span>58 lines</span><span>1.13 KB</span></span>
</div>
<div class='P--oceanic_next'>
<table>
<tr><td class='ln' data-ln='1'></td><td><span class='pt7'>#include</span><span> </span><span class='pt1'><</span><span class='pt4'>stdint.h</span><span class='pt1'>></span></td></tr>
<tr><td class='ln' data-ln='2'></td><td><span class='pt7'>#include</span><span> </span><span class='pt1'><</span><span class='pt4'>stdlib.h</span><span class='pt1'>></span></td></tr>
<tr><td class='ln' data-ln='3'></td><td> </td></tr>
<tr><td class='ln' data-ln='4'></td><td><span class='pt7'>struct</span><span> expanded_key </span><span class='pt1'>{</span></td></tr>
<tr><td class='ln' data-ln='5'></td><td><span> </span><span class='pt13'>uint32_t</span><span> l</span><span class='pt1'>[</span><span class='pt12'>16</span><span class='pt1'>],</span><span> r</span><span class='pt1'>[</span><span class='pt12'>16</span><span class='pt1'>];</span></td></tr>
<tr><td class='ln' data-ln='6'></td><td><span class='pt1'>};</span></td></tr>
<tr><td class='ln' data-ln='7'></td><td> </td></tr>
<tr><td class='ln' data-ln='8'></td><td class='hi'><span class='pt7'>void</span><span> </span><span class='pt3'>__des_setkey</span><span class='pt1'>(</span><span class='pt7'>const</span><span> </span><span class='pt7'>unsigned</span><span> </span><span class='pt7'>char</span><span> </span><span class='pt1'>*</span><span class='pt12'>key</span><span class='pt1'>,</span><span> </span><span class='pt7'>struct</span><span> expanded_key </span><span class='pt1'>*</span><span class='pt12'>ekey</span><span class='pt1'>);</span></td></tr>
<tr><td class='ln' data-ln='9'></td><td class='hi'><span class='pt7'>void</span><span> </span><span class='pt3'>__do_des</span><span class='pt1'>(</span><span class='pt13'>uint32_t</span><span> </span><span class='pt12'>l_in</span><span class='pt1'>,</span><span> </span><span class='pt13'>uint32_t</span><span> </span><span class='pt12'>r_in</span><span class='pt1'>,</span></td></tr>
<tr><td class='ln' data-ln='10'></td><td class='hi'><span> </span><span class='pt13'>uint32_t</span><span> </span><span class='pt1'>*</span><span class='pt12'>l_out</span><span class='pt1'>,</span><span> </span><span class='pt13'>uint32_t</span><span> </span><span class='pt1'>*</span><span class='pt12'>r_out</span><span class='pt1'>,</span></td></tr>
<tr><td class='ln' data-ln='11'></td><td class='hi'><span> </span><span class='pt13'>uint32_t</span><span> </span><span class='pt12'>count</span><span class='pt1'>,</span><span> </span><span class='pt13'>uint32_t</span><span> </span><span class='pt12'>saltbits</span><span class='pt1'>,</span><span> </span><span class='pt7'>const</span><span> </span><span class='pt7'>struct</span><span> expanded_key </span><span class='pt1'>*</span><span class='pt12'>ekey</span><span class='pt1'>);</span></td></tr>
<tr><td class='ln' data-ln='12'></td><td> </td></tr>
<tr><td class='ln' data-ln='13'></td><td><span class='pt7'>static</span><span> </span><span class='pt7'>struct</span><span> expanded_key __encrypt_key</span><span class='pt1'>;</span></td></tr>
<tr><td class='ln' data-ln='14'></td><td> </td></tr>
<tr><td class='ln' data-ln='15'></td><td><span class='pt7'>void</span><span> </span><span class='pt3'>setkey</span><span class='pt1'>(</span><span class='pt7'>const</span><span> </span><span class='pt7'>char</span><span> </span><span class='pt1'>*</span><span class='pt12'>key</span><span class='pt1'>)</span></td></tr>
<tr><td class='ln' data-ln='16'></td><td><span class='pt1'>{</span></td></tr>
<tr><td class='ln' data-ln='17'></td><td><span> </span><span class='pt7'>unsigned</span><span> </span><span class='pt7'>char</span><span> bkey</span><span class='pt1'>[</span><span class='pt12'>8</span><span class='pt1'>];</span></td></tr>
<tr><td class='ln' data-ln='18'></td><td><span> </span><span class='pt7'>int</span><span> i</span><span class='pt1'>,</span><span> j</span><span class='pt1'>;</span></td></tr>
<tr><td class='ln' data-ln='19'></td><td> </td></tr>
<tr><td class='ln' data-ln='20'></td><td><span> </span><span class='pt7'>for</span><span> </span><span class='pt1'>(</span><span>i </span><span class='pt1'>=</span><span> </span><span class='pt12'>0</span><span class='pt1'>;</span><span> i </span><span class='pt1'><</span><span> </span><span class='pt12'>8</span><span class='pt1'>;</span><span> i</span><span class='pt1'>++)</span><span> </span><span class='pt1'>{</span></td></tr>
<tr><td class='ln' data-ln='21'></td><td><span> bkey</span><span class='pt1'>[</span><span>i</span><span class='pt1'>]</span><span> </span><span class='pt1'>=</span><span> </span><span class='pt12'>0</span><span class='pt1'>;</span></td></tr>
<tr><td class='ln' data-ln='22'></td><td><span> </span><span class='pt7'>for</span><span> </span><span class='pt1'>(</span><span>j </span><span class='pt1'>=</span><span> </span><span class='pt12'>7</span><span class='pt1'>;</span><span> j </span><span class='pt1'>>=</span><span> </span><span class='pt12'>0</span><span class='pt1'>;</span><span> j</span><span class='pt1'>--,</span><span> key</span><span class='pt1'>++)</span></td></tr>
<tr><td class='ln' data-ln='23'></td><td><span> bkey</span><span class='pt1'>[</span><span>i</span><span class='pt1'>]</span><span> </span><span class='pt1'>|=</span><span> </span><span class='pt1'>(</span><span class='pt13'>uint32_t</span><span class='pt1'>)(*</span><span>key </span><span class='pt1'>&</span><span> </span><span class='pt12'>1</span><span class='pt1'>)</span><span> </span><span class='pt1'><<</span><span> j</span><span class='pt1'>;</span></td></tr>
<tr><td class='ln' data-ln='24'></td><td><span> </span><span class='pt1'>}</span></td></tr>
<tr><td class='ln' data-ln='25'></td><td> </td></tr>
<tr><td class='ln' data-ln='26'></td><td><span> </span><span class='pt3'>__des_setkey</span><span class='pt1'>(</span><span>bkey</span><span class='pt1'>,</span><span> </span><span class='pt1'>&</span><span>__encrypt_key</span><span class='pt1'>);</span></td></tr>
<tr><td class='ln' data-ln='27'></td><td><span class='pt1'>}</span></td></tr>
<tr><td class='ln' data-ln='28'></td><td> </td></tr>
<tr><td class='ln' data-ln='29'></td><td><span class='pt7'>void</span><span> </span><span class='pt3'>encrypt</span><span class='pt1'>(</span><span class='pt7'>char</span><span> </span><span class='pt1'>*</span><span class='pt12'>block</span><span class='pt1'>,</span><span> </span><span class='pt7'>int</span><span> </span><span class='pt12'>edflag</span><span class='pt1'>)</span></td></tr>
<tr><td class='ln' data-ln='30'></td><td><span class='pt1'>{</span></td></tr>
<tr><td class='ln' data-ln='31'></td><td><span> </span><span class='pt7'>struct</span><span> expanded_key decrypt_key</span><span class='pt1'>,</span><span> </span><span class='pt1'>*</span><span>key</span><span class='pt1'>;</span></td></tr>
<tr><td class='ln' data-ln='32'></td><td><span> </span><span class='pt13'>uint32_t</span><span> b</span><span class='pt1'>[</span><span class='pt12'>2</span><span class='pt1'>];</span></td></tr>
<tr><td class='ln' data-ln='33'></td><td><span> </span><span class='pt7'>int</span><span> i</span><span class='pt1'>,</span><span> j</span><span class='pt1'>;</span></td></tr>
<tr><td class='ln' data-ln='34'></td><td><span> </span><span class='pt7'>char</span><span> </span><span class='pt1'>*</span><span>p</span><span class='pt1'>;</span></td></tr>
<tr><td class='ln' data-ln='35'></td><td> </td></tr>
<tr><td class='ln' data-ln='36'></td><td><span> p </span><span class='pt1'>=</span><span> block</span><span class='pt1'>;</span></td></tr>
<tr><td class='ln' data-ln='37'></td><td><span> </span><span class='pt7'>for</span><span> </span><span class='pt1'>(</span><span>i </span><span class='pt1'>=</span><span> </span><span class='pt12'>0</span><span class='pt1'>;</span><span> i </span><span class='pt1'><</span><span> </span><span class='pt12'>2</span><span class='pt1'>;</span><span> i</span><span class='pt1'>++)</span><span> </span><span class='pt1'>{</span></td></tr>
<tr><td class='ln' data-ln='38'></td><td><span> b</span><span class='pt1'>[</span><span>i</span><span class='pt1'>]</span><span> </span><span class='pt1'>=</span><span> </span><span class='pt12'>0</span><span class='pt1'>;</span></td></tr>
<tr><td class='ln' data-ln='39'></td><td><span> </span><span class='pt7'>for</span><span> </span><span class='pt1'>(</span><span>j </span><span class='pt1'>=</span><span> </span><span class='pt12'>31</span><span class='pt1'>;</span><span> j </span><span class='pt1'>>=</span><span> </span><span class='pt12'>0</span><span class='pt1'>;</span><span> j</span><span class='pt1'>--,</span><span> p</span><span class='pt1'>++)</span></td></tr>
<tr><td class='ln' data-ln='40'></td><td><span> b</span><span class='pt1'>[</span><span>i</span><span class='pt1'>]</span><span> </span><span class='pt1'>|=</span><span> </span><span class='pt1'>(</span><span class='pt13'>uint32_t</span><span class='pt1'>)(*</span><span>p </span><span class='pt1'>&</span><span> </span><span class='pt12'>1</span><span class='pt1'>)</span><span> </span><span class='pt1'><<</span><span> j</span><span class='pt1'>;</span></td></tr>
<tr><td class='ln' data-ln='41'></td><td><span> </span><span class='pt1'>}</span></td></tr>
<tr><td class='ln' data-ln='42'></td><td> </td></tr>
<tr><td class='ln' data-ln='43'></td><td><span> key </span><span class='pt1'>=</span><span> </span><span class='pt1'>&</span><span>__encrypt_key</span><span class='pt1'>;</span></td></tr>
<tr><td class='ln' data-ln='44'></td><td><span> </span><span class='pt7'>if</span><span> </span><span class='pt1'>(</span><span>edflag</span><span class='pt1'>)</span><span> </span><span class='pt1'>{</span></td></tr>
<tr><td class='ln' data-ln='45'></td><td><span> key </span><span class='pt1'>=</span><span> </span><span class='pt1'>&</span><span>decrypt_key</span><span class='pt1'>;</span></td></tr>
<tr><td class='ln' data-ln='46'></td><td><span> </span><span class='pt7'>for</span><span> </span><span class='pt1'>(</span><span>i </span><span class='pt1'>=</span><span> </span><span class='pt12'>0</span><span class='pt1'>;</span><span> i </span><span class='pt1'><</span><span> </span><span class='pt12'>16</span><span class='pt1'>;</span><span> i</span><span class='pt1'>++)</span><span> </span><span class='pt1'>{</span></td></tr>
<tr><td class='ln' data-ln='47'></td><td><span> decrypt_key</span><span class='pt1'>.</span><span>l</span><span class='pt1'>[</span><span>i</span><span class='pt1'>]</span><span> </span><span class='pt1'>=</span><span> __encrypt_key</span><span class='pt1'>.</span><span>l</span><span class='pt1'>[</span><span class='pt12'>15</span><span class='pt1'>-</span><span>i</span><span class='pt1'>];</span></td></tr>
<tr><td class='ln' data-ln='48'></td><td><span> decrypt_key</span><span class='pt1'>.</span><span>r</span><span class='pt1'>[</span><span>i</span><span class='pt1'>]</span><span> </span><span class='pt1'>=</span><span> __encrypt_key</span><span class='pt1'>.</span><span>r</span><span class='pt1'>[</span><span class='pt12'>15</span><span class='pt1'>-</span><span>i</span><span class='pt1'>];</span></td></tr>
<tr><td class='ln' data-ln='49'></td><td><span> </span><span class='pt1'>}</span></td></tr>
<tr><td class='ln' data-ln='50'></td><td><span> </span><span class='pt1'>}</span></td></tr>
<tr><td class='ln' data-ln='51'></td><td> </td></tr>
<tr><td class='ln' data-ln='52'></td><td><span> </span><span class='pt3'>__do_des</span><span class='pt1'>(</span><span>b</span><span class='pt1'>[</span><span class='pt12'>0</span><span class='pt1'>],</span><span> b</span><span class='pt1'>[</span><span class='pt12'>1</span><span class='pt1'>],</span><span> b</span><span class='pt1'>,</span><span> b </span><span class='pt1'>+</span><span> </span><span class='pt12'>1</span><span class='pt1'>,</span><span> </span><span class='pt12'>1</span><span class='pt1'>,</span><span> </span><span class='pt12'>0</span><span class='pt1'>,</span><span> key</span><span class='pt1'>);</span></td></tr>
<tr><td class='ln' data-ln='53'></td><td> </td></tr>
<tr><td class='ln' data-ln='54'></td><td><span> p </span><span class='pt1'>=</span><span> block</span><span class='pt1'>;</span></td></tr>
<tr><td class='ln' data-ln='55'></td><td><span> </span><span class='pt7'>for</span><span> </span><span class='pt1'>(</span><span>i </span><span class='pt1'>=</span><span> </span><span class='pt12'>0</span><span class='pt1'>;</span><span> i </span><span class='pt1'><</span><span> </span><span class='pt12'>2</span><span class='pt1'>;</span><span> i</span><span class='pt1'>++)</span></td></tr>
<tr><td class='ln' data-ln='56'></td><td><span> </span><span class='pt7'>for</span><span> </span><span class='pt1'>(</span><span>j </span><span class='pt1'>=</span><span> </span><span class='pt12'>31</span><span class='pt1'>;</span><span> j </span><span class='pt1'>>=</span><span> </span><span class='pt12'>0</span><span class='pt1'>;</span><span> j</span><span class='pt1'>--)</span></td></tr>
<tr><td class='ln' data-ln='57'></td><td><span> </span><span class='pt1'>*</span><span>p</span><span class='pt1'>++</span><span> </span><span class='pt1'>=</span><span> b</span><span class='pt1'>[</span><span>i</span><span class='pt1'>]>></span><span>j </span><span class='pt1'>&</span><span> </span><span class='pt12'>1</span><span class='pt1'>;</span></td></tr>
<tr><td class='ln' data-ln='58'></td><td><span class='pt1'>}</span></td></tr>
</table>
</div>
</div>
</div>
<div class='style' id='P--one_dark--c'>
<div class='P--one_dark-bordered'>
<div class="info header">
<span class="left">musl-wasm32.encrypt.c</span>
<span class="right"><span>58 lines</span><span>1.13 KB</span></span>
</div>
<div class='P--one_dark'>
<table>
<tr><td class='ln' data-ln='1'></td><td><span class='pt20'>#include</span><span> </span><span class='pt12'><</span><span class='pt13'>stdint.h</span><span class='pt12'>></span></td></tr>
<tr><td class='ln' data-ln='2'></td><td><span class='pt20'>#include</span><span> </span><span class='pt12'><</span><span class='pt13'>stdlib.h</span><span class='pt12'>></span></td></tr>
<tr><td class='ln' data-ln='3'></td><td> </td></tr>
<tr><td class='ln' data-ln='4'></td><td><span class='pt20'>struct</span><span> </span><span class='pt28'>expanded_key</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='5'></td><td><span> </span><span class='pt26'>uint32_t</span><span> l[</span><span class='pt24'>16</span><span>], r[</span><span class='pt24'>16</span><span>];</span></td></tr>
<tr><td class='ln' data-ln='6'></td><td><span>};</span></td></tr>
<tr><td class='ln' data-ln='7'></td><td> </td></tr>
<tr><td class='ln' data-ln='8'></td><td class='hi'><span class='pt20'>void</span><span> </span><span class='pt9'>__des_setkey</span><span>(</span><span class='pt20'>const</span><span> </span><span class='pt20'>unsigned</span><span> </span><span class='pt20'>char</span><span> </span><span class='pt20'>*</span><span class='it'>key</span><span>, </span><span class='pt20'>struct</span><span> expanded_key </span><span class='pt20'>*</span><span class='it'>ekey</span><span>);</span></td></tr>
<tr><td class='ln' data-ln='9'></td><td class='hi'><span class='pt20'>void</span><span> </span><span class='pt9'>__do_des</span><span>(</span><span class='pt26'>uint32_t</span><span> </span><span class='it'>l_in</span><span>, </span><span class='pt26'>uint32_t</span><span> </span><span class='it'>r_in</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='10'></td><td class='hi'><span> </span><span class='pt26'>uint32_t</span><span> </span><span class='pt20'>*</span><span class='it'>l_out</span><span>, </span><span class='pt26'>uint32_t</span><span> </span><span class='pt20'>*</span><span class='it'>r_out</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='11'></td><td class='hi'><span> </span><span class='pt26'>uint32_t</span><span> </span><span class='it'>count</span><span>, </span><span class='pt26'>uint32_t</span><span> </span><span class='it'>saltbits</span><span>, </span><span class='pt20'>const</span><span> </span><span class='pt20'>struct</span><span> expanded_key </span><span class='pt20'>*</span><span class='it'>ekey</span><span>);</span></td></tr>
<tr><td class='ln' data-ln='12'></td><td> </td></tr>
<tr><td class='ln' data-ln='13'></td><td><span class='pt20'>static</span><span> </span><span class='pt20'>struct</span><span> expanded_key __encrypt_key;</span></td></tr>
<tr><td class='ln' data-ln='14'></td><td> </td></tr>
<tr><td class='ln' data-ln='15'></td><td><span class='pt20'>void</span><span> </span><span class='pt9'>setkey</span><span>(</span><span class='pt20'>const</span><span> </span><span class='pt20'>char</span><span> </span><span class='pt20'>*</span><span class='it'>key</span><span>)</span></td></tr>
<tr><td class='ln' data-ln='16'></td><td><span class='pt26'>{</span></td></tr>
<tr><td class='ln' data-ln='17'></td><td><span class='pt26'> </span><span class='pt20'>unsigned</span><span class='pt26'> </span><span class='pt20'>char</span><span class='pt26'> bkey[</span><span class='pt24'>8</span><span class='pt26'>];</span></td></tr>
<tr><td class='ln' data-ln='18'></td><td><span class='pt26'> </span><span class='pt20'>int</span><span class='pt26'> i, j;</span></td></tr>
<tr><td class='ln' data-ln='19'></td><td> </td></tr>
<tr><td class='ln' data-ln='20'></td><td><span class='pt26'> </span><span class='pt20'>for</span><span class='pt26'> (i </span><span class='pt20'>=</span><span class='pt26'> </span><span class='pt24'>0</span><span class='pt26'>; i </span><span class='pt20'><</span><span class='pt26'> </span><span class='pt24'>8</span><span class='pt26'>; i</span><span class='pt5'>++</span><span class='pt26'>) {</span></td></tr>
<tr><td class='ln' data-ln='21'></td><td><span class='pt26'> bkey[i] </span><span class='pt20'>=</span><span class='pt26'> </span><span class='pt24'>0</span><span class='pt26'>;</span></td></tr>
<tr><td class='ln' data-ln='22'></td><td><span class='pt26'> </span><span class='pt20'>for</span><span class='pt26'> (j </span><span class='pt20'>=</span><span class='pt26'> </span><span class='pt24'>7</span><span class='pt26'>; j </span><span class='pt20'>>=</span><span class='pt26'> </span><span class='pt24'>0</span><span class='pt26'>; j</span><span class='pt5'>--</span><span class='pt26'>, key</span><span class='pt5'>++</span><span class='pt26'>)</span></td></tr>
<tr><td class='ln' data-ln='23'></td><td><span class='pt26'> bkey[i] </span><span class='pt5'>|=</span><span class='pt26'> (uint32_t)(</span><span class='pt20'>*</span><span class='pt26'>key </span><span class='pt20'>&</span><span class='pt26'> </span><span class='pt24'>1</span><span class='pt26'>) </span><span class='pt5'><<</span><span class='pt26'> j;</span></td></tr>
<tr><td class='ln' data-ln='24'></td><td><span class='pt26'> }</span></td></tr>
<tr><td class='ln' data-ln='25'></td><td> </td></tr>
<tr><td class='ln' data-ln='26'></td><td><span class='pt26'> </span><span class='pt9'>__des_setkey</span><span class='pt26'>(bkey, </span><span class='pt20'>&</span><span class='pt26'>__encrypt_key);</span></td></tr>
<tr><td class='ln' data-ln='27'></td><td><span class='pt26'>}</span></td></tr>
<tr><td class='ln' data-ln='28'></td><td> </td></tr>
<tr><td class='ln' data-ln='29'></td><td><span class='pt20'>void</span><span> </span><span class='pt9'>encrypt</span><span>(</span><span class='pt20'>char</span><span> </span><span class='pt20'>*</span><span class='it'>block</span><span>, </span><span class='pt20'>int</span><span> </span><span class='it'>edflag</span><span>)</span></td></tr>
<tr><td class='ln' data-ln='30'></td><td><span class='pt26'>{</span></td></tr>
<tr><td class='ln' data-ln='31'></td><td><span class='pt26'> </span><span class='pt20'>struct</span><span class='pt26'> expanded_key decrypt_key, </span><span class='pt20'>*</span><span class='pt26'>key;</span></td></tr>
<tr><td class='ln' data-ln='32'></td><td><span class='pt26'> uint32_t b[</span><span class='pt24'>2</span><span class='pt26'>];</span></td></tr>
<tr><td class='ln' data-ln='33'></td><td><span class='pt26'> </span><span class='pt20'>int</span><span class='pt26'> i, j;</span></td></tr>
<tr><td class='ln' data-ln='34'></td><td><span class='pt26'> </span><span class='pt20'>char</span><span class='pt26'> </span><span class='pt20'>*</span><span class='pt26'>p;</span></td></tr>
<tr><td class='ln' data-ln='35'></td><td> </td></tr>
<tr><td class='ln' data-ln='36'></td><td><span class='pt26'> p </span><span class='pt20'>=</span><span class='pt26'> block;</span></td></tr>
<tr><td class='ln' data-ln='37'></td><td><span class='pt26'> </span><span class='pt20'>for</span><span class='pt26'> (i </span><span class='pt20'>=</span><span class='pt26'> </span><span class='pt24'>0</span><span class='pt26'>; i </span><span class='pt20'><</span><span class='pt26'> </span><span class='pt24'>2</span><span class='pt26'>; i</span><span class='pt5'>++</span><span class='pt26'>) {</span></td></tr>
<tr><td class='ln' data-ln='38'></td><td><span class='pt26'> b[i] </span><span class='pt20'>=</span><span class='pt26'> </span><span class='pt24'>0</span><span class='pt26'>;</span></td></tr>
<tr><td class='ln' data-ln='39'></td><td><span class='pt26'> </span><span class='pt20'>for</span><span class='pt26'> (j </span><span class='pt20'>=</span><span class='pt26'> </span><span class='pt24'>31</span><span class='pt26'>; j </span><span class='pt20'>>=</span><span class='pt26'> </span><span class='pt24'>0</span><span class='pt26'>; j</span><span class='pt5'>--</span><span class='pt26'>, p</span><span class='pt5'>++</span><span class='pt26'>)</span></td></tr>
<tr><td class='ln' data-ln='40'></td><td><span class='pt26'> b[i] </span><span class='pt5'>|=</span><span class='pt26'> (uint32_t)(</span><span class='pt20'>*</span><span class='pt26'>p </span><span class='pt20'>&</span><span class='pt26'> </span><span class='pt24'>1</span><span class='pt26'>) </span><span class='pt5'><<</span><span class='pt26'> j;</span></td></tr>
<tr><td class='ln' data-ln='41'></td><td><span class='pt26'> }</span></td></tr>
<tr><td class='ln' data-ln='42'></td><td> </td></tr>
<tr><td class='ln' data-ln='43'></td><td><span class='pt26'> key </span><span class='pt20'>=</span><span class='pt26'> </span><span class='pt20'>&</span><span class='pt26'>__encrypt_key;</span></td></tr>
<tr><td class='ln' data-ln='44'></td><td><span class='pt26'> </span><span class='pt20'>if</span><span class='pt26'> (edflag) {</span></td></tr>
<tr><td class='ln' data-ln='45'></td><td><span class='pt26'> key </span><span class='pt20'>=</span><span class='pt26'> </span><span class='pt20'>&</span><span class='pt26'>decrypt_key;</span></td></tr>
<tr><td class='ln' data-ln='46'></td><td><span class='pt26'> </span><span class='pt20'>for</span><span class='pt26'> (i </span><span class='pt20'>=</span><span class='pt26'> </span><span class='pt24'>0</span><span class='pt26'>; i </span><span class='pt20'><</span><span class='pt26'> </span><span class='pt24'>16</span><span class='pt26'>; i</span><span class='pt5'>++</span><span class='pt26'>) {</span></td></tr>
<tr><td class='ln' data-ln='47'></td><td><span class='pt26'> decrypt_key.l[i] </span><span class='pt20'>=</span><span class='pt26'> __encrypt_key.l[</span><span class='pt24'>15</span><span class='pt5'>-</span><span class='pt26'>i];</span></td></tr>
<tr><td class='ln' data-ln='48'></td><td><span class='pt26'> decrypt_key.r[i] </span><span class='pt20'>=</span><span class='pt26'> __encrypt_key.r[</span><span class='pt24'>15</span><span class='pt5'>-</span><span class='pt26'>i];</span></td></tr>
<tr><td class='ln' data-ln='49'></td><td><span class='pt26'> }</span></td></tr>
<tr><td class='ln' data-ln='50'></td><td><span class='pt26'> }</span></td></tr>
<tr><td class='ln' data-ln='51'></td><td> </td></tr>
<tr><td class='ln' data-ln='52'></td><td><span class='pt26'> </span><span class='pt9'>__do_des</span><span class='pt26'>(b[</span><span class='pt24'>0</span><span class='pt26'>], b[</span><span class='pt24'>1</span><span class='pt26'>], b, b </span><span class='pt5'>+</span><span class='pt26'> </span><span class='pt24'>1</span><span class='pt26'>, </span><span class='pt24'>1</span><span class='pt26'>, </span><span class='pt24'>0</span><span class='pt26'>, key);</span></td></tr>
<tr><td class='ln' data-ln='53'></td><td> </td></tr>
<tr><td class='ln' data-ln='54'></td><td><span class='pt26'> p </span><span class='pt20'>=</span><span class='pt26'> block;</span></td></tr>
<tr><td class='ln' data-ln='55'></td><td><span class='pt26'> </span><span class='pt20'>for</span><span class='pt26'> (i </span><span class='pt20'>=</span><span class='pt26'> </span><span class='pt24'>0</span><span class='pt26'>; i </span><span class='pt20'><</span><span class='pt26'> </span><span class='pt24'>2</span><span class='pt26'>; i</span><span class='pt5'>++</span><span class='pt26'>)</span></td></tr>
<tr><td class='ln' data-ln='56'></td><td><span class='pt26'> </span><span class='pt20'>for</span><span class='pt26'> (j </span><span class='pt20'>=</span><span class='pt26'> </span><span class='pt24'>31</span><span class='pt26'>; j </span><span class='pt20'>>=</span><span class='pt26'> </span><span class='pt24'>0</span><span class='pt26'>; j</span><span class='pt5'>--</span><span class='pt26'>)</span></td></tr>
<tr><td class='ln' data-ln='57'></td><td><span class='pt26'> </span><span class='pt20'>*</span><span class='pt26'>p</span><span class='pt5'>++</span><span class='pt26'> </span><span class='pt20'>=</span><span class='pt26'> b[i]</span><span class='pt5'>>></span><span class='pt26'>j </span><span class='pt20'>&</span><span class='pt26'> </span><span class='pt24'>1</span><span class='pt26'>;</span></td></tr>
<tr><td class='ln' data-ln='58'></td><td><span class='pt26'>}</span></td></tr>
</table>
</div>
</div>
</div>
<div class='style' id='P--one_light--c'>
<div class='P--one_light-bordered'>
<div class="info header">
<span class="left">musl-wasm32.encrypt.c</span>
<span class="right"><span>58 lines</span><span>1.13 KB</span></span>
</div>
<div class='P--one_light'>
<table>
<tr><td class='ln' data-ln='1'></td><td><span class='pt14'>#include</span><span> </span><span class='pt8'><stdint.h></span></td></tr>
<tr><td class='ln' data-ln='2'></td><td><span class='pt14'>#include</span><span> </span><span class='pt8'><stdlib.h></span></td></tr>
<tr><td class='ln' data-ln='3'></td><td> </td></tr>
<tr><td class='ln' data-ln='4'></td><td><span class='pt14'>struct</span><span> </span><span class='pt15'>expanded_key</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='5'></td><td><span> </span><span class='pt17'>uint32_t</span><span> l[</span><span class='pt12'>16</span><span>], r[</span><span class='pt12'>16</span><span>];</span></td></tr>
<tr><td class='ln' data-ln='6'></td><td><span>};</span></td></tr>
<tr><td class='ln' data-ln='7'></td><td> </td></tr>
<tr><td class='ln' data-ln='8'></td><td class='hi'><span class='pt14'>void</span><span> </span><span class='pt7'>__des_setkey</span><span>(</span><span class='pt14'>const</span><span> </span><span class='pt14'>unsigned</span><span> </span><span class='pt14'>char</span><span> </span><span class='pt14'>*</span><span>key, </span><span class='pt14'>struct</span><span> expanded_key </span><span class='pt14'>*</span><span>ekey);</span></td></tr>
<tr><td class='ln' data-ln='9'></td><td class='hi'><span class='pt14'>void</span><span> </span><span class='pt7'>__do_des</span><span>(</span><span class='pt17'>uint32_t</span><span> l_in, </span><span class='pt17'>uint32_t</span><span> r_in,</span></td></tr>
<tr><td class='ln' data-ln='10'></td><td class='hi'><span> </span><span class='pt17'>uint32_t</span><span> </span><span class='pt14'>*</span><span>l_out, </span><span class='pt17'>uint32_t</span><span> </span><span class='pt14'>*</span><span>r_out,</span></td></tr>
<tr><td class='ln' data-ln='11'></td><td class='hi'><span> </span><span class='pt17'>uint32_t</span><span> count, </span><span class='pt17'>uint32_t</span><span> saltbits, </span><span class='pt14'>const</span><span> </span><span class='pt14'>struct</span><span> expanded_key </span><span class='pt14'>*</span><span>ekey);</span></td></tr>
<tr><td class='ln' data-ln='12'></td><td> </td></tr>
<tr><td class='ln' data-ln='13'></td><td><span class='pt14'>static</span><span> </span><span class='pt14'>struct</span><span> expanded_key __encrypt_key;</span></td></tr>
<tr><td class='ln' data-ln='14'></td><td> </td></tr>
<tr><td class='ln' data-ln='15'></td><td><span class='pt14'>void</span><span> </span><span class='pt7'>setkey</span><span>(</span><span class='pt14'>const</span><span> </span><span class='pt14'>char</span><span> </span><span class='pt14'>*</span><span>key)</span></td></tr>
<tr><td class='ln' data-ln='16'></td><td><span>{</span></td></tr>
<tr><td class='ln' data-ln='17'></td><td><span> </span><span class='pt14'>unsigned</span><span> </span><span class='pt14'>char</span><span> bkey[</span><span class='pt12'>8</span><span>];</span></td></tr>
<tr><td class='ln' data-ln='18'></td><td><span> </span><span class='pt14'>int</span><span> i, j;</span></td></tr>
<tr><td class='ln' data-ln='19'></td><td> </td></tr>
<tr><td class='ln' data-ln='20'></td><td><span> </span><span class='pt14'>for</span><span> (i </span><span class='pt14'>=</span><span> </span><span class='pt12'>0</span><span>; i </span><span class='pt14'><</span><span> </span><span class='pt12'>8</span><span>; i</span><span class='pt14'>++</span><span>) {</span></td></tr>
<tr><td class='ln' data-ln='21'></td><td><span> bkey[i] </span><span class='pt14'>=</span><span> </span><span class='pt12'>0</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='22'></td><td><span> </span><span class='pt14'>for</span><span> (j </span><span class='pt14'>=</span><span> </span><span class='pt12'>7</span><span>; j </span><span class='pt14'>>=</span><span> </span><span class='pt12'>0</span><span>; j</span><span class='pt14'>--</span><span>, key</span><span class='pt14'>++</span><span>)</span></td></tr>
<tr><td class='ln' data-ln='23'></td><td><span> bkey[i] </span><span class='pt14'>|=</span><span> (</span><span class='pt17'>uint32_t</span><span>)(</span><span class='pt14'>*</span><span>key </span><span class='pt14'>&</span><span> </span><span class='pt12'>1</span><span>) </span><span class='pt14'><<</span><span> j;</span></td></tr>
<tr><td class='ln' data-ln='24'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='25'></td><td> </td></tr>
<tr><td class='ln' data-ln='26'></td><td><span> </span><span class='pt7'>__des_setkey</span><span>(bkey, </span><span class='pt14'>&</span><span>__encrypt_key);</span></td></tr>
<tr><td class='ln' data-ln='27'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='28'></td><td> </td></tr>
<tr><td class='ln' data-ln='29'></td><td><span class='pt14'>void</span><span> </span><span class='pt7'>encrypt</span><span>(</span><span class='pt14'>char</span><span> </span><span class='pt14'>*</span><span>block, </span><span class='pt14'>int</span><span> edflag)</span></td></tr>
<tr><td class='ln' data-ln='30'></td><td><span>{</span></td></tr>
<tr><td class='ln' data-ln='31'></td><td><span> </span><span class='pt14'>struct</span><span> expanded_key decrypt_key, </span><span class='pt14'>*</span><span>key;</span></td></tr>
<tr><td class='ln' data-ln='32'></td><td><span> </span><span class='pt17'>uint32_t</span><span> b[</span><span class='pt12'>2</span><span>];</span></td></tr>
<tr><td class='ln' data-ln='33'></td><td><span> </span><span class='pt14'>int</span><span> i, j;</span></td></tr>
<tr><td class='ln' data-ln='34'></td><td><span> </span><span class='pt14'>char</span><span> </span><span class='pt14'>*</span><span>p;</span></td></tr>
<tr><td class='ln' data-ln='35'></td><td> </td></tr>
<tr><td class='ln' data-ln='36'></td><td><span> p </span><span class='pt14'>=</span><span> block;</span></td></tr>
<tr><td class='ln' data-ln='37'></td><td><span> </span><span class='pt14'>for</span><span> (i </span><span class='pt14'>=</span><span> </span><span class='pt12'>0</span><span>; i </span><span class='pt14'><</span><span> </span><span class='pt12'>2</span><span>; i</span><span class='pt14'>++</span><span>) {</span></td></tr>
<tr><td class='ln' data-ln='38'></td><td><span> b[i] </span><span class='pt14'>=</span><span> </span><span class='pt12'>0</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='39'></td><td><span> </span><span class='pt14'>for</span><span> (j </span><span class='pt14'>=</span><span> </span><span class='pt12'>31</span><span>; j </span><span class='pt14'>>=</span><span> </span><span class='pt12'>0</span><span>; j</span><span class='pt14'>--</span><span>, p</span><span class='pt14'>++</span><span>)</span></td></tr>
<tr><td class='ln' data-ln='40'></td><td><span> b[i] </span><span class='pt14'>|=</span><span> (</span><span class='pt17'>uint32_t</span><span>)(</span><span class='pt14'>*</span><span>p </span><span class='pt14'>&</span><span> </span><span class='pt12'>1</span><span>) </span><span class='pt14'><<</span><span> j;</span></td></tr>
<tr><td class='ln' data-ln='41'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='42'></td><td> </td></tr>
<tr><td class='ln' data-ln='43'></td><td><span> key </span><span class='pt14'>=</span><span> </span><span class='pt14'>&</span><span>__encrypt_key;</span></td></tr>
<tr><td class='ln' data-ln='44'></td><td><span> </span><span class='pt14'>if</span><span> (edflag) {</span></td></tr>
<tr><td class='ln' data-ln='45'></td><td><span> key </span><span class='pt14'>=</span><span> </span><span class='pt14'>&</span><span>decrypt_key;</span></td></tr>
<tr><td class='ln' data-ln='46'></td><td><span> </span><span class='pt14'>for</span><span> (i </span><span class='pt14'>=</span><span> </span><span class='pt12'>0</span><span>; i </span><span class='pt14'><</span><span> </span><span class='pt12'>16</span><span>; i</span><span class='pt14'>++</span><span>) {</span></td></tr>
<tr><td class='ln' data-ln='47'></td><td><span> decrypt_key.</span><span class='pt17'>l</span><span>[i] </span><span class='pt14'>=</span><span> __encrypt_key.</span><span class='pt17'>l</span><span>[</span><span class='pt12'>15</span><span class='pt14'>-</span><span>i];</span></td></tr>
<tr><td class='ln' data-ln='48'></td><td><span> decrypt_key.</span><span class='pt17'>r</span><span>[i] </span><span class='pt14'>=</span><span> __encrypt_key.</span><span class='pt17'>r</span><span>[</span><span class='pt12'>15</span><span class='pt14'>-</span><span>i];</span></td></tr>
<tr><td class='ln' data-ln='49'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='50'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='51'></td><td> </td></tr>
<tr><td class='ln' data-ln='52'></td><td><span> </span><span class='pt7'>__do_des</span><span>(b[</span><span class='pt12'>0</span><span>], b[</span><span class='pt12'>1</span><span>], b, b </span><span class='pt14'>+</span><span> </span><span class='pt12'>1</span><span>, </span><span class='pt12'>1</span><span>, </span><span class='pt12'>0</span><span>, key);</span></td></tr>
<tr><td class='ln' data-ln='53'></td><td> </td></tr>
<tr><td class='ln' data-ln='54'></td><td><span> p </span><span class='pt14'>=</span><span> block;</span></td></tr>
<tr><td class='ln' data-ln='55'></td><td><span> </span><span class='pt14'>for</span><span> (i </span><span class='pt14'>=</span><span> </span><span class='pt12'>0</span><span>; i </span><span class='pt14'><</span><span> </span><span class='pt12'>2</span><span>; i</span><span class='pt14'>++</span><span>)</span></td></tr>
<tr><td class='ln' data-ln='56'></td><td><span> </span><span class='pt14'>for</span><span> (j </span><span class='pt14'>=</span><span> </span><span class='pt12'>31</span><span>; j </span><span class='pt14'>>=</span><span> </span><span class='pt12'>0</span><span>; j</span><span class='pt14'>--</span><span>)</span></td></tr>
<tr><td class='ln' data-ln='57'></td><td><span> </span><span class='pt14'>*</span><span>p</span><span class='pt14'>++</span><span> </span><span class='pt14'>=</span><span> b[i]</span><span class='pt14'>>></span><span>j </span><span class='pt14'>&</span><span> </span><span class='pt12'>1</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='58'></td><td><span>}</span></td></tr>
</table>
</div>
</div>
</div>
<div class='style' id='P--one_monokai--c'>
<div class='P--one_monokai-bordered'>
<div class="info header">
<span class="left">musl-wasm32.encrypt.c</span>
<span class="right"><span>58 lines</span><span>1.13 KB</span></span>
</div>
<div class='P--one_monokai'>
<table>
<tr><td class='ln' data-ln='1'></td><td><span class='pt10'>#include</span><span> </span><span class='pt11'><stdint.h></span></td></tr>
<tr><td class='ln' data-ln='2'></td><td><span class='pt10'>#include</span><span> </span><span class='pt11'><stdlib.h></span></td></tr>
<tr><td class='ln' data-ln='3'></td><td> </td></tr>
<tr><td class='ln' data-ln='4'></td><td><span class='pt3'>struct</span><span> </span><span class='pt5'>expanded_key</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='5'></td><td><span> </span><span class='pt3'>uint32_t</span><span> l[</span><span class='pt8'>16</span><span>], r[</span><span class='pt8'>16</span><span>];</span></td></tr>
<tr><td class='ln' data-ln='6'></td><td><span>};</span></td></tr>
<tr><td class='ln' data-ln='7'></td><td> </td></tr>
<tr><td class='ln' data-ln='8'></td><td class='hi'><span class='pt3'>void</span><span> </span><span class='pt7'>__des_setkey</span><span>(</span><span class='pt10'>const</span><span> </span><span class='pt3'>unsigned</span><span> </span><span class='pt3'>char</span><span> </span><span class='pt10'>*</span><span class='pt9 it'>key</span><span>, </span><span class='pt3'>struct</span><span> expanded_key </span><span class='pt10'>*</span><span class='pt9 it'>ekey</span><span>);</span></td></tr>
<tr><td class='ln' data-ln='9'></td><td class='hi'><span class='pt3'>void</span><span> </span><span class='pt7'>__do_des</span><span>(</span><span class='pt3'>uint32_t</span><span> </span><span class='pt9 it'>l_in</span><span>, </span><span class='pt3'>uint32_t</span><span> </span><span class='pt9 it'>r_in</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='10'></td><td class='hi'><span> </span><span class='pt3'>uint32_t</span><span> </span><span class='pt10'>*</span><span class='pt9 it'>l_out</span><span>, </span><span class='pt3'>uint32_t</span><span> </span><span class='pt10'>*</span><span class='pt9 it'>r_out</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='11'></td><td class='hi'><span> </span><span class='pt3'>uint32_t</span><span> </span><span class='pt9 it'>count</span><span>, </span><span class='pt3'>uint32_t</span><span> </span><span class='pt9 it'>saltbits</span><span>, </span><span class='pt10'>const</span><span> </span><span class='pt3'>struct</span><span> expanded_key </span><span class='pt10'>*</span><span class='pt9 it'>ekey</span><span>);</span></td></tr>
<tr><td class='ln' data-ln='12'></td><td> </td></tr>
<tr><td class='ln' data-ln='13'></td><td><span class='pt10'>static</span><span> </span><span class='pt3'>struct</span><span> expanded_key __encrypt_key;</span></td></tr>
<tr><td class='ln' data-ln='14'></td><td> </td></tr>
<tr><td class='ln' data-ln='15'></td><td><span class='pt3'>void</span><span> </span><span class='pt7'>setkey</span><span>(</span><span class='pt10'>const</span><span> </span><span class='pt3'>char</span><span> </span><span class='pt10'>*</span><span class='pt9 it'>key</span><span>)</span></td></tr>
<tr><td class='ln' data-ln='16'></td><td><span>{</span></td></tr>
<tr><td class='ln' data-ln='17'></td><td><span> </span><span class='pt3'>unsigned</span><span> </span><span class='pt3'>char</span><span> bkey[</span><span class='pt8'>8</span><span>];</span></td></tr>
<tr><td class='ln' data-ln='18'></td><td><span> </span><span class='pt3'>int</span><span> i, j;</span></td></tr>
<tr><td class='ln' data-ln='19'></td><td> </td></tr>
<tr><td class='ln' data-ln='20'></td><td><span> </span><span class='pt10'>for</span><span> (i </span><span class='pt10'>=</span><span> </span><span class='pt8'>0</span><span>; i </span><span class='pt10'><</span><span> </span><span class='pt8'>8</span><span>; i</span><span class='pt10'>++</span><span>) {</span></td></tr>
<tr><td class='ln' data-ln='21'></td><td><span> bkey[i] </span><span class='pt10'>=</span><span> </span><span class='pt8'>0</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='22'></td><td><span> </span><span class='pt10'>for</span><span> (j </span><span class='pt10'>=</span><span> </span><span class='pt8'>7</span><span>; j </span><span class='pt10'>>=</span><span> </span><span class='pt8'>0</span><span>; j</span><span class='pt10'>--</span><span>, key</span><span class='pt10'>++</span><span>)</span></td></tr>
<tr><td class='ln' data-ln='23'></td><td><span> bkey[i] </span><span class='pt10'>|=</span><span> (</span><span class='pt3'>uint32_t</span><span>)(</span><span class='pt10'>*</span><span>key </span><span class='pt10'>&</span><span> </span><span class='pt8'>1</span><span>) </span><span class='pt10'><<</span><span> j;</span></td></tr>
<tr><td class='ln' data-ln='24'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='25'></td><td> </td></tr>
<tr><td class='ln' data-ln='26'></td><td><span> </span><span class='pt7'>__des_setkey</span><span>(bkey, </span><span class='pt10'>&</span><span>__encrypt_key);</span></td></tr>
<tr><td class='ln' data-ln='27'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='28'></td><td> </td></tr>
<tr><td class='ln' data-ln='29'></td><td><span class='pt3'>void</span><span> </span><span class='pt7'>encrypt</span><span>(</span><span class='pt3'>char</span><span> </span><span class='pt10'>*</span><span class='pt9 it'>block</span><span>, </span><span class='pt3'>int</span><span> </span><span class='pt9 it'>edflag</span><span>)</span></td></tr>
<tr><td class='ln' data-ln='30'></td><td><span>{</span></td></tr>
<tr><td class='ln' data-ln='31'></td><td><span> </span><span class='pt3'>struct</span><span> expanded_key decrypt_key, </span><span class='pt10'>*</span><span>key;</span></td></tr>
<tr><td class='ln' data-ln='32'></td><td><span> </span><span class='pt3'>uint32_t</span><span> b[</span><span class='pt8'>2</span><span>];</span></td></tr>
<tr><td class='ln' data-ln='33'></td><td><span> </span><span class='pt3'>int</span><span> i, j;</span></td></tr>
<tr><td class='ln' data-ln='34'></td><td><span> </span><span class='pt3'>char</span><span> </span><span class='pt10'>*</span><span>p;</span></td></tr>
<tr><td class='ln' data-ln='35'></td><td> </td></tr>
<tr><td class='ln' data-ln='36'></td><td><span> p </span><span class='pt10'>=</span><span> block;</span></td></tr>
<tr><td class='ln' data-ln='37'></td><td><span> </span><span class='pt10'>for</span><span> (i </span><span class='pt10'>=</span><span> </span><span class='pt8'>0</span><span>; i </span><span class='pt10'><</span><span> </span><span class='pt8'>2</span><span>; i</span><span class='pt10'>++</span><span>) {</span></td></tr>
<tr><td class='ln' data-ln='38'></td><td><span> b[i] </span><span class='pt10'>=</span><span> </span><span class='pt8'>0</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='39'></td><td><span> </span><span class='pt10'>for</span><span> (j </span><span class='pt10'>=</span><span> </span><span class='pt8'>31</span><span>; j </span><span class='pt10'>>=</span><span> </span><span class='pt8'>0</span><span>; j</span><span class='pt10'>--</span><span>, p</span><span class='pt10'>++</span><span>)</span></td></tr>
<tr><td class='ln' data-ln='40'></td><td><span> b[i] </span><span class='pt10'>|=</span><span> (</span><span class='pt3'>uint32_t</span><span>)(</span><span class='pt10'>*</span><span>p </span><span class='pt10'>&</span><span> </span><span class='pt8'>1</span><span>) </span><span class='pt10'><<</span><span> j;</span></td></tr>
<tr><td class='ln' data-ln='41'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='42'></td><td> </td></tr>
<tr><td class='ln' data-ln='43'></td><td><span> key </span><span class='pt10'>=</span><span> </span><span class='pt10'>&</span><span>__encrypt_key;</span></td></tr>
<tr><td class='ln' data-ln='44'></td><td><span> </span><span class='pt10'>if</span><span> (edflag) {</span></td></tr>
<tr><td class='ln' data-ln='45'></td><td><span> key </span><span class='pt10'>=</span><span> </span><span class='pt10'>&</span><span>decrypt_key;</span></td></tr>
<tr><td class='ln' data-ln='46'></td><td><span> </span><span class='pt10'>for</span><span> (i </span><span class='pt10'>=</span><span> </span><span class='pt8'>0</span><span>; i </span><span class='pt10'><</span><span> </span><span class='pt8'>16</span><span>; i</span><span class='pt10'>++</span><span>) {</span></td></tr>
<tr><td class='ln' data-ln='47'></td><td><span> decrypt_key.l[i] </span><span class='pt10'>=</span><span> __encrypt_key.l[</span><span class='pt8'>15</span><span class='pt10'>-</span><span>i];</span></td></tr>
<tr><td class='ln' data-ln='48'></td><td><span> decrypt_key.r[i] </span><span class='pt10'>=</span><span> __encrypt_key.r[</span><span class='pt8'>15</span><span class='pt10'>-</span><span>i];</span></td></tr>
<tr><td class='ln' data-ln='49'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='50'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='51'></td><td> </td></tr>
<tr><td class='ln' data-ln='52'></td><td><span> </span><span class='pt7'>__do_des</span><span>(b[</span><span class='pt8'>0</span><span>], b[</span><span class='pt8'>1</span><span>], b, b </span><span class='pt10'>+</span><span> </span><span class='pt8'>1</span><span>, </span><span class='pt8'>1</span><span>, </span><span class='pt8'>0</span><span>, key);</span></td></tr>
<tr><td class='ln' data-ln='53'></td><td> </td></tr>
<tr><td class='ln' data-ln='54'></td><td><span> p </span><span class='pt10'>=</span><span> block;</span></td></tr>
<tr><td class='ln' data-ln='55'></td><td><span> </span><span class='pt10'>for</span><span> (i </span><span class='pt10'>=</span><span> </span><span class='pt8'>0</span><span>; i </span><span class='pt10'><</span><span> </span><span class='pt8'>2</span><span>; i</span><span class='pt10'>++</span><span>)</span></td></tr>
<tr><td class='ln' data-ln='56'></td><td><span> </span><span class='pt10'>for</span><span> (j </span><span class='pt10'>=</span><span> </span><span class='pt8'>31</span><span>; j </span><span class='pt10'>>=</span><span> </span><span class='pt8'>0</span><span>; j</span><span class='pt10'>--</span><span>)</span></td></tr>
<tr><td class='ln' data-ln='57'></td><td><span> </span><span class='pt10'>*</span><span>p</span><span class='pt10'>++</span><span> </span><span class='pt10'>=</span><span> b[i]</span><span class='pt10'>>></span><span>j </span><span class='pt10'>&</span><span> </span><span class='pt8'>1</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='58'></td><td><span>}</span></td></tr>
</table>
</div>
</div>
</div>
<div class='style' id='P--predawn--c'>
<div class='P--predawn-bordered'>
<div class="info header">
<span class="left">musl-wasm32.encrypt.c</span>
<span class="right"><span>58 lines</span><span>1.13 KB</span></span>
</div>
<div class='P--predawn'>
<table>
<tr><td class='ln' data-ln='1'></td><td><span class='pt18'>#include</span><span> </span><span class='pt13'><stdint.h></span></td></tr>
<tr><td class='ln' data-ln='2'></td><td><span class='pt18'>#include</span><span> </span><span class='pt13'><stdlib.h></span></td></tr>
<tr><td class='ln' data-ln='3'></td><td> </td></tr>
<tr><td class='ln' data-ln='4'></td><td><span class='pt16'>struct</span><span> </span><span class='pt11'>expanded_key</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='5'></td><td><span> </span><span class='pt11'>uint32_t</span><span> l[</span><span class='pt16'>16</span><span>], r[</span><span class='pt16'>16</span><span>];</span></td></tr>
<tr><td class='ln' data-ln='6'></td><td><span>};</span></td></tr>
<tr><td class='ln' data-ln='7'></td><td> </td></tr>
<tr><td class='ln' data-ln='8'></td><td class='hi'><span class='pt16'>void</span><span> </span><span class='pt11'>__des_setkey</span><span>(</span><span class='pt16'>const</span><span> </span><span class='pt16'>unsigned</span><span> </span><span class='pt16'>char</span><span> </span><span class='pt18'>*key</span><span>, </span><span class='pt16'>struct</span><span> expanded_key </span><span class='pt18'>*ekey</span><span>);</span></td></tr>
<tr><td class='ln' data-ln='9'></td><td class='hi'><span class='pt16'>void</span><span> </span><span class='pt11'>__do_des</span><span>(</span><span class='pt11'>uint32_t</span><span> </span><span class='pt18'>l_in</span><span>, </span><span class='pt11'>uint32_t</span><span> </span><span class='pt18'>r_in</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='10'></td><td class='hi'><span> </span><span class='pt11'>uint32_t</span><span> </span><span class='pt18'>*l_out</span><span>, </span><span class='pt11'>uint32_t</span><span> </span><span class='pt18'>*r_out</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='11'></td><td class='hi'><span> </span><span class='pt11'>uint32_t</span><span> </span><span class='pt18'>count</span><span>, </span><span class='pt11'>uint32_t</span><span> </span><span class='pt18'>saltbits</span><span>, </span><span class='pt16'>const</span><span> </span><span class='pt16'>struct</span><span> expanded_key </span><span class='pt18'>*ekey</span><span>);</span></td></tr>
<tr><td class='ln' data-ln='12'></td><td> </td></tr>
<tr><td class='ln' data-ln='13'></td><td><span class='pt16'>static</span><span> </span><span class='pt16'>struct</span><span> expanded_key __encrypt_key;</span></td></tr>
<tr><td class='ln' data-ln='14'></td><td> </td></tr>
<tr><td class='ln' data-ln='15'></td><td><span class='pt16'>void</span><span> </span><span class='pt11'>setkey</span><span>(</span><span class='pt16'>const</span><span> </span><span class='pt16'>char</span><span> </span><span class='pt18'>*key</span><span>)</span></td></tr>
<tr><td class='ln' data-ln='16'></td><td><span>{</span></td></tr>
<tr><td class='ln' data-ln='17'></td><td><span> </span><span class='pt16'>unsigned</span><span> </span><span class='pt16'>char</span><span> bkey[</span><span class='pt16'>8</span><span>];</span></td></tr>
<tr><td class='ln' data-ln='18'></td><td><span> </span><span class='pt16'>int</span><span> i, j;</span></td></tr>
<tr><td class='ln' data-ln='19'></td><td> </td></tr>
<tr><td class='ln' data-ln='20'></td><td><span> </span><span class='pt18'>for</span><span> (i </span><span class='pt18'>=</span><span> </span><span class='pt16'>0</span><span>; i </span><span class='pt18'><</span><span> </span><span class='pt16'>8</span><span>; i</span><span class='pt18'>++</span><span>) {</span></td></tr>
<tr><td class='ln' data-ln='21'></td><td><span> bkey[i] </span><span class='pt18'>=</span><span> </span><span class='pt16'>0</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='22'></td><td><span> </span><span class='pt18'>for</span><span> (j </span><span class='pt18'>=</span><span> </span><span class='pt16'>7</span><span>; j </span><span class='pt18'>>=</span><span> </span><span class='pt16'>0</span><span>; j</span><span class='pt18'>--</span><span>, key</span><span class='pt18'>++</span><span>)</span></td></tr>
<tr><td class='ln' data-ln='23'></td><td><span> bkey[i] </span><span class='pt18'>|=</span><span> (</span><span class='pt11'>uint32_t</span><span>)(</span><span class='pt18'>*</span><span>key </span><span class='pt18'>&</span><span> </span><span class='pt16'>1</span><span>) </span><span class='pt18'><<</span><span> j;</span></td></tr>
<tr><td class='ln' data-ln='24'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='25'></td><td> </td></tr>
<tr><td class='ln' data-ln='26'></td><td><span> </span><span class='pt18'>__des_setkey</span><span>(bkey, </span><span class='pt18'>&</span><span>__encrypt_key);</span></td></tr>
<tr><td class='ln' data-ln='27'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='28'></td><td> </td></tr>
<tr><td class='ln' data-ln='29'></td><td><span class='pt16'>void</span><span> </span><span class='pt11'>encrypt</span><span>(</span><span class='pt16'>char</span><span> </span><span class='pt18'>*block</span><span>, </span><span class='pt16'>int</span><span> </span><span class='pt18'>edflag</span><span>)</span></td></tr>
<tr><td class='ln' data-ln='30'></td><td><span>{</span></td></tr>
<tr><td class='ln' data-ln='31'></td><td><span> </span><span class='pt16'>struct</span><span> expanded_key decrypt_key, </span><span class='pt18'>*</span><span>key;</span></td></tr>
<tr><td class='ln' data-ln='32'></td><td><span> </span><span class='pt11'>uint32_t</span><span> b[</span><span class='pt16'>2</span><span>];</span></td></tr>
<tr><td class='ln' data-ln='33'></td><td><span> </span><span class='pt16'>int</span><span> i, j;</span></td></tr>
<tr><td class='ln' data-ln='34'></td><td><span> </span><span class='pt16'>char</span><span> </span><span class='pt18'>*</span><span>p;</span></td></tr>
<tr><td class='ln' data-ln='35'></td><td> </td></tr>
<tr><td class='ln' data-ln='36'></td><td><span> p </span><span class='pt18'>=</span><span> block;</span></td></tr>
<tr><td class='ln' data-ln='37'></td><td><span> </span><span class='pt18'>for</span><span> (i </span><span class='pt18'>=</span><span> </span><span class='pt16'>0</span><span>; i </span><span class='pt18'><</span><span> </span><span class='pt16'>2</span><span>; i</span><span class='pt18'>++</span><span>) {</span></td></tr>
<tr><td class='ln' data-ln='38'></td><td><span> b[i] </span><span class='pt18'>=</span><span> </span><span class='pt16'>0</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='39'></td><td><span> </span><span class='pt18'>for</span><span> (j </span><span class='pt18'>=</span><span> </span><span class='pt16'>31</span><span>; j </span><span class='pt18'>>=</span><span> </span><span class='pt16'>0</span><span>; j</span><span class='pt18'>--</span><span>, p</span><span class='pt18'>++</span><span>)</span></td></tr>
<tr><td class='ln' data-ln='40'></td><td><span> b[i] </span><span class='pt18'>|=</span><span> (</span><span class='pt11'>uint32_t</span><span>)(</span><span class='pt18'>*</span><span>p </span><span class='pt18'>&</span><span> </span><span class='pt16'>1</span><span>) </span><span class='pt18'><<</span><span> j;</span></td></tr>
<tr><td class='ln' data-ln='41'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='42'></td><td> </td></tr>
<tr><td class='ln' data-ln='43'></td><td><span> key </span><span class='pt18'>=</span><span> </span><span class='pt18'>&</span><span>__encrypt_key;</span></td></tr>
<tr><td class='ln' data-ln='44'></td><td><span> </span><span class='pt18'>if</span><span> (edflag) {</span></td></tr>
<tr><td class='ln' data-ln='45'></td><td><span> key </span><span class='pt18'>=</span><span> </span><span class='pt18'>&</span><span>decrypt_key;</span></td></tr>
<tr><td class='ln' data-ln='46'></td><td><span> </span><span class='pt18'>for</span><span> (i </span><span class='pt18'>=</span><span> </span><span class='pt16'>0</span><span>; i </span><span class='pt18'><</span><span> </span><span class='pt16'>16</span><span>; i</span><span class='pt18'>++</span><span>) {</span></td></tr>
<tr><td class='ln' data-ln='47'></td><td><span> decrypt_key.</span><span class='pt18'>l</span><span>[i] </span><span class='pt18'>=</span><span> __encrypt_key.</span><span class='pt18'>l</span><span>[</span><span class='pt16'>15</span><span class='pt18'>-</span><span>i];</span></td></tr>
<tr><td class='ln' data-ln='48'></td><td><span> decrypt_key.</span><span class='pt18'>r</span><span>[i] </span><span class='pt18'>=</span><span> __encrypt_key.</span><span class='pt18'>r</span><span>[</span><span class='pt16'>15</span><span class='pt18'>-</span><span>i];</span></td></tr>
<tr><td class='ln' data-ln='49'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='50'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='51'></td><td> </td></tr>
<tr><td class='ln' data-ln='52'></td><td><span> </span><span class='pt18'>__do_des</span><span>(b[</span><span class='pt16'>0</span><span>], b[</span><span class='pt16'>1</span><span>], b, b </span><span class='pt18'>+</span><span> </span><span class='pt16'>1</span><span>, </span><span class='pt16'>1</span><span>, </span><span class='pt16'>0</span><span>, key);</span></td></tr>
<tr><td class='ln' data-ln='53'></td><td> </td></tr>
<tr><td class='ln' data-ln='54'></td><td><span> p </span><span class='pt18'>=</span><span> block;</span></td></tr>
<tr><td class='ln' data-ln='55'></td><td><span> </span><span class='pt18'>for</span><span> (i </span><span class='pt18'>=</span><span> </span><span class='pt16'>0</span><span>; i </span><span class='pt18'><</span><span> </span><span class='pt16'>2</span><span>; i</span><span class='pt18'>++</span><span>)</span></td></tr>
<tr><td class='ln' data-ln='56'></td><td><span> </span><span class='pt18'>for</span><span> (j </span><span class='pt18'>=</span><span> </span><span class='pt16'>31</span><span>; j </span><span class='pt18'>>=</span><span> </span><span class='pt16'>0</span><span>; j</span><span class='pt18'>--</span><span>)</span></td></tr>
<tr><td class='ln' data-ln='57'></td><td><span> </span><span class='pt18'>*</span><span>p</span><span class='pt18'>++</span><span> </span><span class='pt18'>=</span><span> b[i]</span><span class='pt18'>>></span><span>j </span><span class='pt18'>&</span><span> </span><span class='pt16'>1</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='58'></td><td><span>}</span></td></tr>
</table>
</div>
</div>
</div>
<div class='style' id='P--solarized_dark--c'>
<div class='P--solarized_dark-bordered'>
<div class="info header">
<span class="left">musl-wasm32.encrypt.c</span>
<span class="right"><span>58 lines</span><span>1.13 KB</span></span>
</div>
<div class='P--solarized_dark'>
<table>
<tr><td class='ln' data-ln='1'></td><td><span class='pt5'>#include</span><span class='pt6'> </span><span class='pt2'><stdint.h></span></td></tr>
<tr><td class='ln' data-ln='2'></td><td><span class='pt5'>#include</span><span class='pt6'> </span><span class='pt2'><stdlib.h></span></td></tr>
<tr><td class='ln' data-ln='3'></td><td> </td></tr>
<tr><td class='ln' data-ln='4'></td><td><span class='bo'>struct</span><span> expanded_key {</span></td></tr>
<tr><td class='ln' data-ln='5'></td><td><span> </span><span class='pt5'>uint32_t</span><span> l[</span><span class='pt10'>16</span><span>], r[</span><span class='pt10'>16</span><span>];</span></td></tr>
<tr><td class='ln' data-ln='6'></td><td><span>};</span></td></tr>
<tr><td class='ln' data-ln='7'></td><td> </td></tr>
<tr><td class='ln' data-ln='8'></td><td class='hi'><span class='bo'>void</span><span> </span><span class='pt1'>__des_setkey</span><span>(</span><span class='bo'>const</span><span> </span><span class='bo'>unsigned</span><span> </span><span class='bo'>char</span><span> </span><span class='pt5'>*</span><span>key, </span><span class='bo'>struct</span><span> expanded_key </span><span class='pt5'>*</span><span>ekey);</span></td></tr>
<tr><td class='ln' data-ln='9'></td><td class='hi'><span class='bo'>void</span><span> </span><span class='pt1'>__do_des</span><span>(</span><span class='pt5'>uint32_t</span><span> l_in, </span><span class='pt5'>uint32_t</span><span> r_in,</span></td></tr>
<tr><td class='ln' data-ln='10'></td><td class='hi'><span> </span><span class='pt5'>uint32_t</span><span> </span><span class='pt5'>*</span><span>l_out, </span><span class='pt5'>uint32_t</span><span> </span><span class='pt5'>*</span><span>r_out,</span></td></tr>
<tr><td class='ln' data-ln='11'></td><td class='hi'><span> </span><span class='pt5'>uint32_t</span><span> count, </span><span class='pt5'>uint32_t</span><span> saltbits, </span><span class='bo'>const</span><span> </span><span class='bo'>struct</span><span> expanded_key </span><span class='pt5'>*</span><span>ekey);</span></td></tr>
<tr><td class='ln' data-ln='12'></td><td> </td></tr>
<tr><td class='ln' data-ln='13'></td><td><span class='bo'>static</span><span> </span><span class='bo'>struct</span><span> expanded_key __encrypt_key;</span></td></tr>
<tr><td class='ln' data-ln='14'></td><td> </td></tr>
<tr><td class='ln' data-ln='15'></td><td><span class='bo'>void</span><span> </span><span class='pt1'>setkey</span><span>(</span><span class='bo'>const</span><span> </span><span class='bo'>char</span><span> </span><span class='pt5'>*</span><span>key)</span></td></tr>
<tr><td class='ln' data-ln='16'></td><td><span>{</span></td></tr>
<tr><td class='ln' data-ln='17'></td><td><span> </span><span class='bo'>unsigned</span><span> </span><span class='bo'>char</span><span> bkey[</span><span class='pt10'>8</span><span>];</span></td></tr>
<tr><td class='ln' data-ln='18'></td><td><span> </span><span class='bo'>int</span><span> i, j;</span></td></tr>
<tr><td class='ln' data-ln='19'></td><td> </td></tr>
<tr><td class='ln' data-ln='20'></td><td><span> </span><span class='pt5'>for</span><span> (i </span><span class='pt5'>=</span><span> </span><span class='pt10'>0</span><span>; i </span><span class='pt5'><</span><span> </span><span class='pt10'>8</span><span>; i</span><span class='pt5'>++</span><span>) {</span></td></tr>
<tr><td class='ln' data-ln='21'></td><td><span> bkey[i] </span><span class='pt5'>=</span><span> </span><span class='pt10'>0</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='22'></td><td><span> </span><span class='pt5'>for</span><span> (j </span><span class='pt5'>=</span><span> </span><span class='pt10'>7</span><span>; j </span><span class='pt5'>>=</span><span> </span><span class='pt10'>0</span><span>; j</span><span class='pt5'>--</span><span>, key</span><span class='pt5'>++</span><span>)</span></td></tr>
<tr><td class='ln' data-ln='23'></td><td><span> bkey[i] </span><span class='pt5'>|=</span><span> (</span><span class='pt5'>uint32_t</span><span>)(</span><span class='pt5'>*</span><span>key </span><span class='pt5'>&</span><span> </span><span class='pt10'>1</span><span>) </span><span class='pt5'><<</span><span> j;</span></td></tr>
<tr><td class='ln' data-ln='24'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='25'></td><td> </td></tr>
<tr><td class='ln' data-ln='26'></td><td><span> __des_setkey(bkey, </span><span class='pt5'>&</span><span>__encrypt_key);</span></td></tr>
<tr><td class='ln' data-ln='27'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='28'></td><td> </td></tr>
<tr><td class='ln' data-ln='29'></td><td><span class='bo'>void</span><span> </span><span class='pt1'>encrypt</span><span>(</span><span class='bo'>char</span><span> </span><span class='pt5'>*</span><span>block, </span><span class='bo'>int</span><span> edflag)</span></td></tr>
<tr><td class='ln' data-ln='30'></td><td><span>{</span></td></tr>
<tr><td class='ln' data-ln='31'></td><td><span> </span><span class='bo'>struct</span><span> expanded_key decrypt_key, </span><span class='pt5'>*</span><span>key;</span></td></tr>
<tr><td class='ln' data-ln='32'></td><td><span> </span><span class='pt5'>uint32_t</span><span> b[</span><span class='pt10'>2</span><span>];</span></td></tr>
<tr><td class='ln' data-ln='33'></td><td><span> </span><span class='bo'>int</span><span> i, j;</span></td></tr>
<tr><td class='ln' data-ln='34'></td><td><span> </span><span class='bo'>char</span><span> </span><span class='pt5'>*</span><span>p;</span></td></tr>
<tr><td class='ln' data-ln='35'></td><td> </td></tr>
<tr><td class='ln' data-ln='36'></td><td><span> p </span><span class='pt5'>=</span><span> block;</span></td></tr>
<tr><td class='ln' data-ln='37'></td><td><span> </span><span class='pt5'>for</span><span> (i </span><span class='pt5'>=</span><span> </span><span class='pt10'>0</span><span>; i </span><span class='pt5'><</span><span> </span><span class='pt10'>2</span><span>; i</span><span class='pt5'>++</span><span>) {</span></td></tr>
<tr><td class='ln' data-ln='38'></td><td><span> b[i] </span><span class='pt5'>=</span><span> </span><span class='pt10'>0</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='39'></td><td><span> </span><span class='pt5'>for</span><span> (j </span><span class='pt5'>=</span><span> </span><span class='pt10'>31</span><span>; j </span><span class='pt5'>>=</span><span> </span><span class='pt10'>0</span><span>; j</span><span class='pt5'>--</span><span>, p</span><span class='pt5'>++</span><span>)</span></td></tr>
<tr><td class='ln' data-ln='40'></td><td><span> b[i] </span><span class='pt5'>|=</span><span> (</span><span class='pt5'>uint32_t</span><span>)(</span><span class='pt5'>*</span><span>p </span><span class='pt5'>&</span><span> </span><span class='pt10'>1</span><span>) </span><span class='pt5'><<</span><span> j;</span></td></tr>
<tr><td class='ln' data-ln='41'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='42'></td><td> </td></tr>
<tr><td class='ln' data-ln='43'></td><td><span> key </span><span class='pt5'>=</span><span> </span><span class='pt5'>&</span><span>__encrypt_key;</span></td></tr>
<tr><td class='ln' data-ln='44'></td><td><span> </span><span class='pt5'>if</span><span> (edflag) {</span></td></tr>
<tr><td class='ln' data-ln='45'></td><td><span> key </span><span class='pt5'>=</span><span> </span><span class='pt5'>&</span><span>decrypt_key;</span></td></tr>
<tr><td class='ln' data-ln='46'></td><td><span> </span><span class='pt5'>for</span><span> (i </span><span class='pt5'>=</span><span> </span><span class='pt10'>0</span><span>; i </span><span class='pt5'><</span><span> </span><span class='pt10'>16</span><span>; i</span><span class='pt5'>++</span><span>) {</span></td></tr>
<tr><td class='ln' data-ln='47'></td><td><span> decrypt_key.</span><span class='pt1'>l</span><span>[i] </span><span class='pt5'>=</span><span> __encrypt_key.</span><span class='pt1'>l</span><span>[</span><span class='pt10'>15</span><span class='pt5'>-</span><span>i];</span></td></tr>
<tr><td class='ln' data-ln='48'></td><td><span> decrypt_key.</span><span class='pt1'>r</span><span>[i] </span><span class='pt5'>=</span><span> __encrypt_key.</span><span class='pt1'>r</span><span>[</span><span class='pt10'>15</span><span class='pt5'>-</span><span>i];</span></td></tr>
<tr><td class='ln' data-ln='49'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='50'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='51'></td><td> </td></tr>
<tr><td class='ln' data-ln='52'></td><td><span> __do_des(b[</span><span class='pt10'>0</span><span>], b[</span><span class='pt10'>1</span><span>], b, b </span><span class='pt5'>+</span><span> </span><span class='pt10'>1</span><span>, </span><span class='pt10'>1</span><span>, </span><span class='pt10'>0</span><span>, key);</span></td></tr>
<tr><td class='ln' data-ln='53'></td><td> </td></tr>
<tr><td class='ln' data-ln='54'></td><td><span> p </span><span class='pt5'>=</span><span> block;</span></td></tr>
<tr><td class='ln' data-ln='55'></td><td><span> </span><span class='pt5'>for</span><span> (i </span><span class='pt5'>=</span><span> </span><span class='pt10'>0</span><span>; i </span><span class='pt5'><</span><span> </span><span class='pt10'>2</span><span>; i</span><span class='pt5'>++</span><span>)</span></td></tr>
<tr><td class='ln' data-ln='56'></td><td><span> </span><span class='pt5'>for</span><span> (j </span><span class='pt5'>=</span><span> </span><span class='pt10'>31</span><span>; j </span><span class='pt5'>>=</span><span> </span><span class='pt10'>0</span><span>; j</span><span class='pt5'>--</span><span>)</span></td></tr>
<tr><td class='ln' data-ln='57'></td><td><span> </span><span class='pt5'>*</span><span>p</span><span class='pt5'>++</span><span> </span><span class='pt5'>=</span><span> b[i]</span><span class='pt5'>>></span><span>j </span><span class='pt5'>&</span><span> </span><span class='pt10'>1</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='58'></td><td><span>}</span></td></tr>
</table>
</div>
</div>
</div>
<div class='style' id='P--solarized_light--c'>
<div class='P--solarized_light-bordered'>
<div class="info header">
<span class="left">musl-wasm32.encrypt.c</span>
<span class="right"><span>58 lines</span><span>1.13 KB</span></span>
</div>
<div class='P--solarized_light'>
<table>
<tr><td class='ln' data-ln='1'></td><td><span class='pt4'>#include</span><span class='pt6'> </span><span class='pt3'><stdint.h></span></td></tr>
<tr><td class='ln' data-ln='2'></td><td><span class='pt4'>#include</span><span class='pt6'> </span><span class='pt3'><stdlib.h></span></td></tr>
<tr><td class='ln' data-ln='3'></td><td> </td></tr>
<tr><td class='ln' data-ln='4'></td><td><span class='pt1 bo'>struct</span><span> expanded_key {</span></td></tr>
<tr><td class='ln' data-ln='5'></td><td><span> </span><span class='pt4'>uint32_t</span><span> l[</span><span class='pt10'>16</span><span>], r[</span><span class='pt10'>16</span><span>];</span></td></tr>
<tr><td class='ln' data-ln='6'></td><td><span>};</span></td></tr>
<tr><td class='ln' data-ln='7'></td><td> </td></tr>
<tr><td class='ln' data-ln='8'></td><td class='hi'><span class='pt1 bo'>void</span><span> </span><span class='pt2'>__des_setkey</span><span>(</span><span class='pt1 bo'>const</span><span> </span><span class='pt1 bo'>unsigned</span><span> </span><span class='pt1 bo'>char</span><span> </span><span class='pt4'>*</span><span>key, </span><span class='pt1 bo'>struct</span><span> expanded_key </span><span class='pt4'>*</span><span>ekey);</span></td></tr>
<tr><td class='ln' data-ln='9'></td><td class='hi'><span class='pt1 bo'>void</span><span> </span><span class='pt2'>__do_des</span><span>(</span><span class='pt4'>uint32_t</span><span> l_in, </span><span class='pt4'>uint32_t</span><span> r_in,</span></td></tr>
<tr><td class='ln' data-ln='10'></td><td class='hi'><span> </span><span class='pt4'>uint32_t</span><span> </span><span class='pt4'>*</span><span>l_out, </span><span class='pt4'>uint32_t</span><span> </span><span class='pt4'>*</span><span>r_out,</span></td></tr>
<tr><td class='ln' data-ln='11'></td><td class='hi'><span> </span><span class='pt4'>uint32_t</span><span> count, </span><span class='pt4'>uint32_t</span><span> saltbits, </span><span class='pt1 bo'>const</span><span> </span><span class='pt1 bo'>struct</span><span> expanded_key </span><span class='pt4'>*</span><span>ekey);</span></td></tr>
<tr><td class='ln' data-ln='12'></td><td> </td></tr>
<tr><td class='ln' data-ln='13'></td><td><span class='pt1 bo'>static</span><span> </span><span class='pt1 bo'>struct</span><span> expanded_key __encrypt_key;</span></td></tr>
<tr><td class='ln' data-ln='14'></td><td> </td></tr>
<tr><td class='ln' data-ln='15'></td><td><span class='pt1 bo'>void</span><span> </span><span class='pt2'>setkey</span><span>(</span><span class='pt1 bo'>const</span><span> </span><span class='pt1 bo'>char</span><span> </span><span class='pt4'>*</span><span>key)</span></td></tr>
<tr><td class='ln' data-ln='16'></td><td><span>{</span></td></tr>
<tr><td class='ln' data-ln='17'></td><td><span> </span><span class='pt1 bo'>unsigned</span><span> </span><span class='pt1 bo'>char</span><span> bkey[</span><span class='pt10'>8</span><span>];</span></td></tr>
<tr><td class='ln' data-ln='18'></td><td><span> </span><span class='pt1 bo'>int</span><span> i, j;</span></td></tr>
<tr><td class='ln' data-ln='19'></td><td> </td></tr>
<tr><td class='ln' data-ln='20'></td><td><span> </span><span class='pt4'>for</span><span> (i </span><span class='pt4'>=</span><span> </span><span class='pt10'>0</span><span>; i </span><span class='pt4'><</span><span> </span><span class='pt10'>8</span><span>; i</span><span class='pt4'>++</span><span>) {</span></td></tr>
<tr><td class='ln' data-ln='21'></td><td><span> bkey[i] </span><span class='pt4'>=</span><span> </span><span class='pt10'>0</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='22'></td><td><span> </span><span class='pt4'>for</span><span> (j </span><span class='pt4'>=</span><span> </span><span class='pt10'>7</span><span>; j </span><span class='pt4'>>=</span><span> </span><span class='pt10'>0</span><span>; j</span><span class='pt4'>--</span><span>, key</span><span class='pt4'>++</span><span>)</span></td></tr>
<tr><td class='ln' data-ln='23'></td><td><span> bkey[i] </span><span class='pt4'>|=</span><span> (</span><span class='pt4'>uint32_t</span><span>)(</span><span class='pt4'>*</span><span>key </span><span class='pt4'>&</span><span> </span><span class='pt10'>1</span><span>) </span><span class='pt4'><<</span><span> j;</span></td></tr>
<tr><td class='ln' data-ln='24'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='25'></td><td> </td></tr>
<tr><td class='ln' data-ln='26'></td><td><span> __des_setkey(bkey, </span><span class='pt4'>&</span><span>__encrypt_key);</span></td></tr>
<tr><td class='ln' data-ln='27'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='28'></td><td> </td></tr>
<tr><td class='ln' data-ln='29'></td><td><span class='pt1 bo'>void</span><span> </span><span class='pt2'>encrypt</span><span>(</span><span class='pt1 bo'>char</span><span> </span><span class='pt4'>*</span><span>block, </span><span class='pt1 bo'>int</span><span> edflag)</span></td></tr>
<tr><td class='ln' data-ln='30'></td><td><span>{</span></td></tr>
<tr><td class='ln' data-ln='31'></td><td><span> </span><span class='pt1 bo'>struct</span><span> expanded_key decrypt_key, </span><span class='pt4'>*</span><span>key;</span></td></tr>
<tr><td class='ln' data-ln='32'></td><td><span> </span><span class='pt4'>uint32_t</span><span> b[</span><span class='pt10'>2</span><span>];</span></td></tr>
<tr><td class='ln' data-ln='33'></td><td><span> </span><span class='pt1 bo'>int</span><span> i, j;</span></td></tr>
<tr><td class='ln' data-ln='34'></td><td><span> </span><span class='pt1 bo'>char</span><span> </span><span class='pt4'>*</span><span>p;</span></td></tr>
<tr><td class='ln' data-ln='35'></td><td> </td></tr>
<tr><td class='ln' data-ln='36'></td><td><span> p </span><span class='pt4'>=</span><span> block;</span></td></tr>
<tr><td class='ln' data-ln='37'></td><td><span> </span><span class='pt4'>for</span><span> (i </span><span class='pt4'>=</span><span> </span><span class='pt10'>0</span><span>; i </span><span class='pt4'><</span><span> </span><span class='pt10'>2</span><span>; i</span><span class='pt4'>++</span><span>) {</span></td></tr>
<tr><td class='ln' data-ln='38'></td><td><span> b[i] </span><span class='pt4'>=</span><span> </span><span class='pt10'>0</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='39'></td><td><span> </span><span class='pt4'>for</span><span> (j </span><span class='pt4'>=</span><span> </span><span class='pt10'>31</span><span>; j </span><span class='pt4'>>=</span><span> </span><span class='pt10'>0</span><span>; j</span><span class='pt4'>--</span><span>, p</span><span class='pt4'>++</span><span>)</span></td></tr>
<tr><td class='ln' data-ln='40'></td><td><span> b[i] </span><span class='pt4'>|=</span><span> (</span><span class='pt4'>uint32_t</span><span>)(</span><span class='pt4'>*</span><span>p </span><span class='pt4'>&</span><span> </span><span class='pt10'>1</span><span>) </span><span class='pt4'><<</span><span> j;</span></td></tr>
<tr><td class='ln' data-ln='41'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='42'></td><td> </td></tr>
<tr><td class='ln' data-ln='43'></td><td><span> key </span><span class='pt4'>=</span><span> </span><span class='pt4'>&</span><span>__encrypt_key;</span></td></tr>
<tr><td class='ln' data-ln='44'></td><td><span> </span><span class='pt4'>if</span><span> (edflag) {</span></td></tr>
<tr><td class='ln' data-ln='45'></td><td><span> key </span><span class='pt4'>=</span><span> </span><span class='pt4'>&</span><span>decrypt_key;</span></td></tr>
<tr><td class='ln' data-ln='46'></td><td><span> </span><span class='pt4'>for</span><span> (i </span><span class='pt4'>=</span><span> </span><span class='pt10'>0</span><span>; i </span><span class='pt4'><</span><span> </span><span class='pt10'>16</span><span>; i</span><span class='pt4'>++</span><span>) {</span></td></tr>
<tr><td class='ln' data-ln='47'></td><td><span> decrypt_key.</span><span class='pt2'>l</span><span>[i] </span><span class='pt4'>=</span><span> __encrypt_key.</span><span class='pt2'>l</span><span>[</span><span class='pt10'>15</span><span class='pt4'>-</span><span>i];</span></td></tr>
<tr><td class='ln' data-ln='48'></td><td><span> decrypt_key.</span><span class='pt2'>r</span><span>[i] </span><span class='pt4'>=</span><span> __encrypt_key.</span><span class='pt2'>r</span><span>[</span><span class='pt10'>15</span><span class='pt4'>-</span><span>i];</span></td></tr>
<tr><td class='ln' data-ln='49'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='50'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='51'></td><td> </td></tr>
<tr><td class='ln' data-ln='52'></td><td><span> __do_des(b[</span><span class='pt10'>0</span><span>], b[</span><span class='pt10'>1</span><span>], b, b </span><span class='pt4'>+</span><span> </span><span class='pt10'>1</span><span>, </span><span class='pt10'>1</span><span>, </span><span class='pt10'>0</span><span>, key);</span></td></tr>
<tr><td class='ln' data-ln='53'></td><td> </td></tr>
<tr><td class='ln' data-ln='54'></td><td><span> p </span><span class='pt4'>=</span><span> block;</span></td></tr>
<tr><td class='ln' data-ln='55'></td><td><span> </span><span class='pt4'>for</span><span> (i </span><span class='pt4'>=</span><span> </span><span class='pt10'>0</span><span>; i </span><span class='pt4'><</span><span> </span><span class='pt10'>2</span><span>; i</span><span class='pt4'>++</span><span>)</span></td></tr>
<tr><td class='ln' data-ln='56'></td><td><span> </span><span class='pt4'>for</span><span> (j </span><span class='pt4'>=</span><span> </span><span class='pt10'>31</span><span>; j </span><span class='pt4'>>=</span><span> </span><span class='pt10'>0</span><span>; j</span><span class='pt4'>--</span><span>)</span></td></tr>
<tr><td class='ln' data-ln='57'></td><td><span> </span><span class='pt4'>*</span><span>p</span><span class='pt4'>++</span><span> </span><span class='pt4'>=</span><span> b[i]</span><span class='pt4'>>></span><span>j </span><span class='pt4'>&</span><span> </span><span class='pt10'>1</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='58'></td><td><span>}</span></td></tr>
</table>
</div>
</div>
</div>
<div class='style' id='P--wombat--c'>
<div class='P--wombat-bordered'>
<div class="info header">
<span class="left">musl-wasm32.encrypt.c</span>
<span class="right"><span>58 lines</span><span>1.13 KB</span></span>
</div>
<div class='P--wombat'>
<table>
<tr><td class='ln' data-ln='1'></td><td><span class='pt23'>#include</span><span class='pt17'> </span><span class='pt15'><stdint.h></span></td></tr>
<tr><td class='ln' data-ln='2'></td><td><span class='pt23'>#include</span><span class='pt17'> </span><span class='pt15'><stdlib.h></span></td></tr>
<tr><td class='ln' data-ln='3'></td><td> </td></tr>
<tr><td class='ln' data-ln='4'></td><td><span class='pt13 it'>struct</span><span> </span><span class='pt19'>expanded_key</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='5'></td><td><span> </span><span class='pt13 it'>uint32_t</span><span> l[</span><span class='pt24'>16</span><span>], r[</span><span class='pt24'>16</span><span>];</span></td></tr>
<tr><td class='ln' data-ln='6'></td><td><span>};</span></td></tr>
<tr><td class='ln' data-ln='7'></td><td> </td></tr>
<tr><td class='ln' data-ln='8'></td><td class='hi'><span class='pt13 it'>void</span><span> </span><span class='pt19'>__des_setkey</span><span>(</span><span class='pt23'>const</span><span> </span><span class='pt13 it'>unsigned</span><span> </span><span class='pt13 it'>char</span><span> </span><span class='pt23'>*</span><span class='pt24 it'>key</span><span>, </span><span class='pt13 it'>struct</span><span> expanded_key </span><span class='pt23'>*</span><span class='pt24 it'>ekey</span><span>);</span></td></tr>
<tr><td class='ln' data-ln='9'></td><td class='hi'><span class='pt13 it'>void</span><span> </span><span class='pt19'>__do_des</span><span>(</span><span class='pt13 it'>uint32_t</span><span> </span><span class='pt24 it'>l_in</span><span>, </span><span class='pt13 it'>uint32_t</span><span> </span><span class='pt24 it'>r_in</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='10'></td><td class='hi'><span> </span><span class='pt13 it'>uint32_t</span><span> </span><span class='pt23'>*</span><span class='pt24 it'>l_out</span><span>, </span><span class='pt13 it'>uint32_t</span><span> </span><span class='pt23'>*</span><span class='pt24 it'>r_out</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='11'></td><td class='hi'><span> </span><span class='pt13 it'>uint32_t</span><span> </span><span class='pt24 it'>count</span><span>, </span><span class='pt13 it'>uint32_t</span><span> </span><span class='pt24 it'>saltbits</span><span>, </span><span class='pt23'>const</span><span> </span><span class='pt13 it'>struct</span><span> expanded_key </span><span class='pt23'>*</span><span class='pt24 it'>ekey</span><span>);</span></td></tr>
<tr><td class='ln' data-ln='12'></td><td> </td></tr>
<tr><td class='ln' data-ln='13'></td><td><span class='pt23'>static</span><span> </span><span class='pt13 it'>struct</span><span> expanded_key __encrypt_key;</span></td></tr>
<tr><td class='ln' data-ln='14'></td><td> </td></tr>
<tr><td class='ln' data-ln='15'></td><td><span class='pt13 it'>void</span><span> </span><span class='pt19'>setkey</span><span>(</span><span class='pt23'>const</span><span> </span><span class='pt13 it'>char</span><span> </span><span class='pt23'>*</span><span class='pt24 it'>key</span><span>)</span></td></tr>
<tr><td class='ln' data-ln='16'></td><td><span>{</span></td></tr>
<tr><td class='ln' data-ln='17'></td><td><span> </span><span class='pt13 it'>unsigned</span><span> </span><span class='pt13 it'>char</span><span> bkey[</span><span class='pt24'>8</span><span>];</span></td></tr>
<tr><td class='ln' data-ln='18'></td><td><span> </span><span class='pt13 it'>int</span><span> i, j;</span></td></tr>
<tr><td class='ln' data-ln='19'></td><td> </td></tr>
<tr><td class='ln' data-ln='20'></td><td><span> </span><span class='pt23'>for</span><span> (i </span><span class='pt23'>=</span><span> </span><span class='pt24'>0</span><span>; i </span><span class='pt23'><</span><span> </span><span class='pt24'>8</span><span>; i</span><span class='pt23'>++</span><span>) {</span></td></tr>
<tr><td class='ln' data-ln='21'></td><td><span> bkey[i] </span><span class='pt23'>=</span><span> </span><span class='pt24'>0</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='22'></td><td><span> </span><span class='pt23'>for</span><span> (j </span><span class='pt23'>=</span><span> </span><span class='pt24'>7</span><span>; j </span><span class='pt23'>>=</span><span> </span><span class='pt24'>0</span><span>; j</span><span class='pt23'>--</span><span>, key</span><span class='pt23'>++</span><span>)</span></td></tr>
<tr><td class='ln' data-ln='23'></td><td><span> bkey[i] </span><span class='pt23'>|=</span><span> (</span><span class='pt13 it'>uint32_t</span><span>)(</span><span class='pt23'>*</span><span>key </span><span class='pt23'>&</span><span> </span><span class='pt24'>1</span><span>) </span><span class='pt23'><<</span><span> j;</span></td></tr>
<tr><td class='ln' data-ln='24'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='25'></td><td> </td></tr>
<tr><td class='ln' data-ln='26'></td><td><span> </span><span class='pt19'>__des_setkey</span><span>(bkey, </span><span class='pt23'>&</span><span>__encrypt_key);</span></td></tr>
<tr><td class='ln' data-ln='27'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='28'></td><td> </td></tr>
<tr><td class='ln' data-ln='29'></td><td><span class='pt13 it'>void</span><span> </span><span class='pt19'>encrypt</span><span>(</span><span class='pt13 it'>char</span><span> </span><span class='pt23'>*</span><span class='pt24 it'>block</span><span>, </span><span class='pt13 it'>int</span><span> </span><span class='pt24 it'>edflag</span><span>)</span></td></tr>
<tr><td class='ln' data-ln='30'></td><td><span>{</span></td></tr>
<tr><td class='ln' data-ln='31'></td><td><span> </span><span class='pt13 it'>struct</span><span> expanded_key decrypt_key, </span><span class='pt23'>*</span><span>key;</span></td></tr>
<tr><td class='ln' data-ln='32'></td><td><span> </span><span class='pt13 it'>uint32_t</span><span> b[</span><span class='pt24'>2</span><span>];</span></td></tr>
<tr><td class='ln' data-ln='33'></td><td><span> </span><span class='pt13 it'>int</span><span> i, j;</span></td></tr>
<tr><td class='ln' data-ln='34'></td><td><span> </span><span class='pt13 it'>char</span><span> </span><span class='pt23'>*</span><span>p;</span></td></tr>
<tr><td class='ln' data-ln='35'></td><td> </td></tr>
<tr><td class='ln' data-ln='36'></td><td><span> p </span><span class='pt23'>=</span><span> block;</span></td></tr>
<tr><td class='ln' data-ln='37'></td><td><span> </span><span class='pt23'>for</span><span> (i </span><span class='pt23'>=</span><span> </span><span class='pt24'>0</span><span>; i </span><span class='pt23'><</span><span> </span><span class='pt24'>2</span><span>; i</span><span class='pt23'>++</span><span>) {</span></td></tr>
<tr><td class='ln' data-ln='38'></td><td><span> b[i] </span><span class='pt23'>=</span><span> </span><span class='pt24'>0</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='39'></td><td><span> </span><span class='pt23'>for</span><span> (j </span><span class='pt23'>=</span><span> </span><span class='pt24'>31</span><span>; j </span><span class='pt23'>>=</span><span> </span><span class='pt24'>0</span><span>; j</span><span class='pt23'>--</span><span>, p</span><span class='pt23'>++</span><span>)</span></td></tr>
<tr><td class='ln' data-ln='40'></td><td><span> b[i] </span><span class='pt23'>|=</span><span> (</span><span class='pt13 it'>uint32_t</span><span>)(</span><span class='pt23'>*</span><span>p </span><span class='pt23'>&</span><span> </span><span class='pt24'>1</span><span>) </span><span class='pt23'><<</span><span> j;</span></td></tr>
<tr><td class='ln' data-ln='41'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='42'></td><td> </td></tr>
<tr><td class='ln' data-ln='43'></td><td><span> key </span><span class='pt23'>=</span><span> </span><span class='pt23'>&</span><span>__encrypt_key;</span></td></tr>
<tr><td class='ln' data-ln='44'></td><td><span> </span><span class='pt23'>if</span><span> (edflag) {</span></td></tr>
<tr><td class='ln' data-ln='45'></td><td><span> key </span><span class='pt23'>=</span><span> </span><span class='pt23'>&</span><span>decrypt_key;</span></td></tr>
<tr><td class='ln' data-ln='46'></td><td><span> </span><span class='pt23'>for</span><span> (i </span><span class='pt23'>=</span><span> </span><span class='pt24'>0</span><span>; i </span><span class='pt23'><</span><span> </span><span class='pt24'>16</span><span>; i</span><span class='pt23'>++</span><span>) {</span></td></tr>
<tr><td class='ln' data-ln='47'></td><td><span> decrypt_key.l[i] </span><span class='pt23'>=</span><span> __encrypt_key.l[</span><span class='pt24'>15</span><span class='pt23'>-</span><span>i];</span></td></tr>
<tr><td class='ln' data-ln='48'></td><td><span> decrypt_key.r[i] </span><span class='pt23'>=</span><span> __encrypt_key.r[</span><span class='pt24'>15</span><span class='pt23'>-</span><span>i];</span></td></tr>
<tr><td class='ln' data-ln='49'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='50'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='51'></td><td> </td></tr>
<tr><td class='ln' data-ln='52'></td><td><span> </span><span class='pt19'>__do_des</span><span>(b[</span><span class='pt24'>0</span><span>], b[</span><span class='pt24'>1</span><span>], b, b </span><span class='pt23'>+</span><span> </span><span class='pt24'>1</span><span>, </span><span class='pt24'>1</span><span>, </span><span class='pt24'>0</span><span>, key);</span></td></tr>
<tr><td class='ln' data-ln='53'></td><td> </td></tr>
<tr><td class='ln' data-ln='54'></td><td><span> p </span><span class='pt23'>=</span><span> block;</span></td></tr>
<tr><td class='ln' data-ln='55'></td><td><span> </span><span class='pt23'>for</span><span> (i </span><span class='pt23'>=</span><span> </span><span class='pt24'>0</span><span>; i </span><span class='pt23'><</span><span> </span><span class='pt24'>2</span><span>; i</span><span class='pt23'>++</span><span>)</span></td></tr>
<tr><td class='ln' data-ln='56'></td><td><span> </span><span class='pt23'>for</span><span> (j </span><span class='pt23'>=</span><span> </span><span class='pt24'>31</span><span>; j </span><span class='pt23'>>=</span><span> </span><span class='pt24'>0</span><span>; j</span><span class='pt23'>--</span><span>)</span></td></tr>
<tr><td class='ln' data-ln='57'></td><td><span> </span><span class='pt23'>*</span><span>p</span><span class='pt23'>++</span><span> </span><span class='pt23'>=</span><span> b[i]</span><span class='pt23'>>></span><span>j </span><span class='pt23'>&</span><span> </span><span class='pt24'>1</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='58'></td><td><span>}</span></td></tr>
</table>
</div>
</div>
</div>
<div class='style' id='P--atom_dark--go'>
<div class='P--atom_dark-bordered'>
<div class="info header">
<span class="left">http.go</span>
<span class="right"><span>141 lines</span><span>4.26 KB</span></span>
</div>
<div class='P--atom_dark'>
<table>
<tr><td class='ln' data-ln='1'></td><td><span class='pt3'>// Copyright 2016 The Go Authors. All rights reserved.</span></td></tr>
<tr><td class='ln' data-ln='2'></td><td><span class='pt3'>// Use of this source code is governed by a BSD-style</span></td></tr>
<tr><td class='ln' data-ln='3'></td><td><span class='pt3'>// license that can be found in the LICENSE file.</span></td></tr>
<tr><td class='ln' data-ln='4'></td><td> </td></tr>
<tr><td class='ln' data-ln='5'></td><td><span class='pt4'>package</span><span> http</span></td></tr>
<tr><td class='ln' data-ln='6'></td><td> </td></tr>
<tr><td class='ln' data-ln='7'></td><td class='hi'><span class='pt4'>import</span><span> (</span></td></tr>
<tr><td class='ln' data-ln='8'></td><td class='hi'><span> </span><span class='pt9'>"io"</span></td></tr>
<tr><td class='ln' data-ln='9'></td><td class='hi'><span> </span><span class='pt9'>"strconv"</span></td></tr>
<tr><td class='ln' data-ln='10'></td><td class='hi'><span> </span><span class='pt9'>"strings"</span></td></tr>
<tr><td class='ln' data-ln='11'></td><td class='hi'><span> </span><span class='pt9'>"time"</span></td></tr>
<tr><td class='ln' data-ln='12'></td><td class='hi'><span> </span><span class='pt9'>"unicode/utf8"</span></td></tr>
<tr><td class='ln' data-ln='13'></td><td class='hi'> </td></tr>
<tr><td class='ln' data-ln='14'></td><td class='hi'><span> </span><span class='pt9'>"golang_org/x/net/lex/httplex"</span></td></tr>
<tr><td class='ln' data-ln='15'></td><td class='hi'><span>)</span></td></tr>
<tr><td class='ln' data-ln='16'></td><td> </td></tr>
<tr><td class='ln' data-ln='17'></td><td><span class='pt3'>// maxInt64 is the effective "infinite" value for the Server and</span></td></tr>
<tr><td class='ln' data-ln='18'></td><td><span class='pt3'>// Transport's byte-limiting readers.</span></td></tr>
<tr><td class='ln' data-ln='19'></td><td><span class='pt23'>const</span><span> maxInt64 </span><span class='pt4'>=</span><span> </span><span class='pt24'>1</span><span class='pt4'><<</span><span class='pt24'>63</span><span> </span><span class='pt4'>-</span><span> </span><span class='pt24'>1</span></td></tr>
<tr><td class='ln' data-ln='20'></td><td> </td></tr>
<tr><td class='ln' data-ln='21'></td><td><span class='pt3'>// aLongTimeAgo is a non-zero time, far in the past, used for</span></td></tr>
<tr><td class='ln' data-ln='22'></td><td><span class='pt3'>// immediate cancelation of network operations.</span></td></tr>
<tr><td class='ln' data-ln='23'></td><td><span class='pt2 it'>var</span><span> </span><span class='pt16'>aLongTimeAgo</span><span> </span><span class='pt4'>=</span><span> time.</span><span class='pt16'>Unix</span><span>(</span><span class='pt24'>1</span><span>, </span><span class='pt24'>0</span><span>)</span></td></tr>
<tr><td class='ln' data-ln='24'></td><td> </td></tr>
<tr><td class='ln' data-ln='25'></td><td><span class='pt3'>// TODO(bradfitz): move common stuff here. The other files have accumulated</span></td></tr>
<tr><td class='ln' data-ln='26'></td><td><span class='pt3'>// generic http stuff in random places.</span></td></tr>
<tr><td class='ln' data-ln='27'></td><td> </td></tr>
<tr><td class='ln' data-ln='28'></td><td><span class='pt3'>// contextKey is a value for use with context.WithValue. It's used as</span></td></tr>
<tr><td class='ln' data-ln='29'></td><td><span class='pt3'>// a pointer so it fits in an interface{} without allocation.</span></td></tr>
<tr><td class='ln' data-ln='30'></td><td><span class='pt2 it'>type</span><span> contextKey </span><span class='pt2 it'>struct</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='31'></td><td><span> </span><span class='pt16'>name</span><span> </span><span class='pt2 it'>string</span></td></tr>
<tr><td class='ln' data-ln='32'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='33'></td><td> </td></tr>
<tr><td class='ln' data-ln='34'></td><td><span class='pt2 it'>func</span><span> (</span><span class='pt13 it'>k</span><span> </span><span class='pt4'>*</span><span>contextKey) </span><span class='pt25'>String</span><span>() </span><span class='pt2 it'>string</span><span> { </span><span class='pt4'>return</span><span> </span><span class='pt9'>"net/http context value "</span><span> </span><span class='pt4'>+</span><span> k.</span><span class='pt16'>name</span><span> }</span></td></tr>
<tr><td class='ln' data-ln='35'></td><td> </td></tr>
<tr><td class='ln' data-ln='36'></td><td><span class='pt3'>// Given a string of the form "host", "host:port", or "[ipv6::address]:port",</span></td></tr>
<tr><td class='ln' data-ln='37'></td><td><span class='pt3'>// return true if the string includes a port.</span></td></tr>
<tr><td class='ln' data-ln='38'></td><td><span class='pt2 it'>func</span><span> </span><span class='pt25'>hasPort</span><span>(</span><span class='pt13 it'>s</span><span> </span><span class='pt2 it'>string</span><span>) </span><span class='pt2 it'>bool</span><span> { </span><span class='pt4'>return</span><span> strings.</span><span class='pt16'>LastIndex</span><span>(s, </span><span class='pt9'>":"</span><span>) </span><span class='pt4'>></span><span> strings.</span><span class='pt16'>LastIndex</span><span>(s, </span><span class='pt9'>"]"</span><span>) }</span></td></tr>
<tr><td class='ln' data-ln='39'></td><td> </td></tr>
<tr><td class='ln' data-ln='40'></td><td><span class='pt3'>// removeEmptyPort strips the empty port in ":port" to ""</span></td></tr>
<tr><td class='ln' data-ln='41'></td><td><span class='pt3'>// as mandated by RFC 3986 Section 6.2.3.</span></td></tr>
<tr><td class='ln' data-ln='42'></td><td><span class='pt2 it'>func</span><span> </span><span class='pt25'>removeEmptyPort</span><span>(</span><span class='pt13 it'>host</span><span> </span><span class='pt2 it'>string</span><span>) </span><span class='pt2 it'>string</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='43'></td><td><span> </span><span class='pt4'>if</span><span> </span><span class='pt16'>hasPort</span><span>(host) {</span></td></tr>
<tr><td class='ln' data-ln='44'></td><td><span> </span><span class='pt4'>return</span><span> strings.</span><span class='pt16'>TrimSuffix</span><span>(host, </span><span class='pt9'>":"</span><span>)</span></td></tr>
<tr><td class='ln' data-ln='45'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='46'></td><td><span> </span><span class='pt4'>return</span><span> host</span></td></tr>
<tr><td class='ln' data-ln='47'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='48'></td><td> </td></tr>
<tr><td class='ln' data-ln='49'></td><td><span class='pt2 it'>func</span><span> </span><span class='pt25'>isNotToken</span><span>(</span><span class='pt13 it'>r</span><span> </span><span class='pt2 it'>rune</span><span>) </span><span class='pt2 it'>bool</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='50'></td><td><span> </span><span class='pt4'>return</span><span> </span><span class='pt4'>!</span><span>httplex.</span><span class='pt16'>IsTokenRune</span><span>(r)</span></td></tr>
<tr><td class='ln' data-ln='51'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='52'></td><td> </td></tr>
<tr><td class='ln' data-ln='53'></td><td><span class='pt2 it'>func</span><span> </span><span class='pt25'>isASCII</span><span>(</span><span class='pt13 it'>s</span><span> </span><span class='pt2 it'>string</span><span>) </span><span class='pt2 it'>bool</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='54'></td><td><span> </span><span class='pt4'>for</span><span> </span><span class='pt16'>i</span><span> </span><span class='pt4'>:=</span><span> </span><span class='pt24'>0</span><span>; i </span><span class='pt4'><</span><span> </span><span class='pt2'>len</span><span>(s); i</span><span class='pt4'>++</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='55'></td><td><span> </span><span class='pt4'>if</span><span> s[i] </span><span class='pt4'>>=</span><span> utf8.</span><span class='pt16'>RuneSelf</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='56'></td><td><span> </span><span class='pt4'>return</span><span> </span><span class='pt12'>false</span></td></tr>
<tr><td class='ln' data-ln='57'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='58'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='59'></td><td><span> </span><span class='pt4'>return</span><span> </span><span class='pt12'>true</span></td></tr>
<tr><td class='ln' data-ln='60'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='61'></td><td> </td></tr>
<tr><td class='ln' data-ln='62'></td><td><span class='pt2 it'>func</span><span> </span><span class='pt25'>hexEscapeNonASCII</span><span>(</span><span class='pt13 it'>s</span><span> </span><span class='pt2 it'>string</span><span>) </span><span class='pt2 it'>string</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='63'></td><td><span> </span><span class='pt16'>newLen</span><span> </span><span class='pt4'>:=</span><span> </span><span class='pt24'>0</span></td></tr>
<tr><td class='ln' data-ln='64'></td><td><span> </span><span class='pt4'>for</span><span> </span><span class='pt16'>i</span><span> </span><span class='pt4'>:=</span><span> </span><span class='pt24'>0</span><span>; i </span><span class='pt4'><</span><span> </span><span class='pt2'>len</span><span>(s); i</span><span class='pt4'>++</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='65'></td><td><span> </span><span class='pt4'>if</span><span> s[i] </span><span class='pt4'>>=</span><span> utf8.</span><span class='pt16'>RuneSelf</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='66'></td><td><span> newLen </span><span class='pt4'>+=</span><span> </span><span class='pt24'>3</span></td></tr>
<tr><td class='ln' data-ln='67'></td><td><span> } </span><span class='pt4'>else</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='68'></td><td><span> newLen</span><span class='pt4'>++</span></td></tr>
<tr><td class='ln' data-ln='69'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='70'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='71'></td><td><span> </span><span class='pt4'>if</span><span> newLen </span><span class='pt4'>==</span><span> </span><span class='pt2'>len</span><span>(s) {</span></td></tr>
<tr><td class='ln' data-ln='72'></td><td><span> </span><span class='pt4'>return</span><span> s</span></td></tr>
<tr><td class='ln' data-ln='73'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='74'></td><td><span> </span><span class='pt16'>b</span><span> </span><span class='pt4'>:=</span><span> </span><span class='pt2'>make</span><span>([]</span><span class='pt2 it'>byte</span><span>, </span><span class='pt24'>0</span><span>, newLen)</span></td></tr>
<tr><td class='ln' data-ln='75'></td><td><span> </span><span class='pt4'>for</span><span> </span><span class='pt16'>i</span><span> </span><span class='pt4'>:=</span><span> </span><span class='pt24'>0</span><span>; i </span><span class='pt4'><</span><span> </span><span class='pt2'>len</span><span>(s); i</span><span class='pt4'>++</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='76'></td><td><span> </span><span class='pt4'>if</span><span> s[i] </span><span class='pt4'>>=</span><span> utf8.</span><span class='pt16'>RuneSelf</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='77'></td><td><span> b </span><span class='pt4'>=</span><span> </span><span class='pt2'>append</span><span>(b, </span><span class='pt9'>'%'</span><span>)</span></td></tr>
<tr><td class='ln' data-ln='78'></td><td><span> b </span><span class='pt4'>=</span><span> strconv.</span><span class='pt16'>AppendInt</span><span>(b, </span><span class='pt2 it'>int64</span><span>(s[i]), </span><span class='pt24'>16</span><span>)</span></td></tr>
<tr><td class='ln' data-ln='79'></td><td><span> } </span><span class='pt4'>else</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='80'></td><td><span> b </span><span class='pt4'>=</span><span> </span><span class='pt2'>append</span><span>(b, s[i])</span></td></tr>
<tr><td class='ln' data-ln='81'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='82'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='83'></td><td><span> </span><span class='pt4'>return</span><span> </span><span class='pt2 it'>string</span><span>(b)</span></td></tr>
<tr><td class='ln' data-ln='84'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='85'></td><td> </td></tr>
<tr><td class='ln' data-ln='86'></td><td><span class='pt3'>// NoBody is an io.ReadCloser with no bytes. Read always returns EOF</span></td></tr>
<tr><td class='ln' data-ln='87'></td><td><span class='pt3'>// and Close always returns nil. It can be used in an outgoing client</span></td></tr>
<tr><td class='ln' data-ln='88'></td><td><span class='pt3'>// request to explicitly signal that a request has zero bytes.</span></td></tr>
<tr><td class='ln' data-ln='89'></td><td><span class='pt3'>// An alternative, however, is to simply set Request.Body to nil.</span></td></tr>
<tr><td class='ln' data-ln='90'></td><td><span class='pt2 it'>var</span><span> </span><span class='pt16'>NoBody</span><span> </span><span class='pt4'>=</span><span> noBody{}</span></td></tr>
<tr><td class='ln' data-ln='91'></td><td> </td></tr>
<tr><td class='ln' data-ln='92'></td><td><span class='pt2 it'>type</span><span> noBody </span><span class='pt2 it'>struct</span><span>{}</span></td></tr>
<tr><td class='ln' data-ln='93'></td><td> </td></tr>
<tr><td class='ln' data-ln='94'></td><td><span class='pt2 it'>func</span><span> (noBody) </span><span class='pt25'>Read</span><span>([]</span><span class='pt2 it'>byte</span><span>) (</span><span class='pt2 it'>int</span><span>, </span><span class='pt2 it'>error</span><span>) { </span><span class='pt4'>return</span><span> </span><span class='pt24'>0</span><span>, io.</span><span class='pt16'>EOF</span><span> }</span></td></tr>
<tr><td class='ln' data-ln='95'></td><td><span class='pt2 it'>func</span><span> (noBody) </span><span class='pt25'>Close</span><span>() </span><span class='pt2 it'>error</span><span> { </span><span class='pt4'>return</span><span> </span><span class='pt12'>nil</span><span> }</span></td></tr>
<tr><td class='ln' data-ln='96'></td><td><span class='pt2 it'>func</span><span> (noBody) </span><span class='pt25'>WriteTo</span><span>(io.Writer) (</span><span class='pt2 it'>int64</span><span>, </span><span class='pt2 it'>error</span><span>) { </span><span class='pt4'>return</span><span> </span><span class='pt24'>0</span><span>, </span><span class='pt12'>nil</span><span> }</span></td></tr>
<tr><td class='ln' data-ln='97'></td><td> </td></tr>
<tr><td class='ln' data-ln='98'></td><td><span class='pt2 it'>var</span><span> (</span></td></tr>
<tr><td class='ln' data-ln='99'></td><td><span> </span><span class='pt3'>// verify that an io.Copy from NoBody won't require a buffer:</span></td></tr>
<tr><td class='ln' data-ln='100'></td><td><span> </span><span class='pt16'>_</span><span> io.</span><span class='pt16'>WriterTo</span><span> </span><span class='pt4'>=</span><span> NoBody</span></td></tr>
<tr><td class='ln' data-ln='101'></td><td><span> </span><span class='pt16'>_</span><span> io.</span><span class='pt16'>ReadCloser</span><span> </span><span class='pt4'>=</span><span> NoBody</span></td></tr>
<tr><td class='ln' data-ln='102'></td><td><span>)</span></td></tr>
<tr><td class='ln' data-ln='103'></td><td> </td></tr>
<tr><td class='ln' data-ln='104'></td><td><span class='pt3'>// PushOptions describes options for Pusher.Push.</span></td></tr>
<tr><td class='ln' data-ln='105'></td><td><span class='pt2 it'>type</span><span> PushOptions </span><span class='pt2 it'>struct</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='106'></td><td><span> </span><span class='pt3'>// Method specifies the HTTP method for the promised request.</span></td></tr>
<tr><td class='ln' data-ln='107'></td><td><span> </span><span class='pt3'>// If set, it must be "GET" or "HEAD". Empty means "GET".</span></td></tr>
<tr><td class='ln' data-ln='108'></td><td><span> </span><span class='pt16'>Method</span><span> </span><span class='pt2 it'>string</span></td></tr>
<tr><td class='ln' data-ln='109'></td><td> </td></tr>
<tr><td class='ln' data-ln='110'></td><td><span> </span><span class='pt3'>// Header specifies additional promised request headers. This cannot</span></td></tr>
<tr><td class='ln' data-ln='111'></td><td><span> </span><span class='pt3'>// include HTTP/2 pseudo header fields like ":path" and ":scheme",</span></td></tr>
<tr><td class='ln' data-ln='112'></td><td><span> </span><span class='pt3'>// which will be added automatically.</span></td></tr>
<tr><td class='ln' data-ln='113'></td><td><span> </span><span class='pt16'>Header</span><span> Header</span></td></tr>
<tr><td class='ln' data-ln='114'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='115'></td><td> </td></tr>
<tr><td class='ln' data-ln='116'></td><td><span class='pt3'>// Pusher is the interface implemented by ResponseWriters that support</span></td></tr>
<tr><td class='ln' data-ln='117'></td><td><span class='pt3'>// HTTP/2 server push. For more background, see</span></td></tr>
<tr><td class='ln' data-ln='118'></td><td><span class='pt3'>// https://tools.ietf.org/html/rfc7540#section-8.2.</span></td></tr>
<tr><td class='ln' data-ln='119'></td><td><span class='pt2 it'>type</span><span> Pusher </span><span class='pt2 it'>interface</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='120'></td><td><span> </span><span class='pt3'>// Push initiates an HTTP/2 server push. This constructs a synthetic</span></td></tr>
<tr><td class='ln' data-ln='121'></td><td><span> </span><span class='pt3'>// request using the given target and options, serializes that request</span></td></tr>
<tr><td class='ln' data-ln='122'></td><td><span> </span><span class='pt3'>// into a PUSH_PROMISE frame, then dispatches that request using the</span></td></tr>
<tr><td class='ln' data-ln='123'></td><td><span> </span><span class='pt3'>// server's request handler. If opts is nil, default options are used.</span></td></tr>
<tr><td class='ln' data-ln='124'></td><td><span> </span><span class='pt3'>//</span></td></tr>
<tr><td class='ln' data-ln='125'></td><td><span> </span><span class='pt3'>// The target must either be an absolute path (like "/path") or an absolute</span></td></tr>
<tr><td class='ln' data-ln='126'></td><td><span> </span><span class='pt3'>// URL that contains a valid host and the same scheme as the parent request.</span></td></tr>
<tr><td class='ln' data-ln='127'></td><td><span> </span><span class='pt3'>// If the target is a path, it will inherit the scheme and host of the</span></td></tr>
<tr><td class='ln' data-ln='128'></td><td><span> </span><span class='pt3'>// parent request.</span></td></tr>
<tr><td class='ln' data-ln='129'></td><td><span> </span><span class='pt3'>//</span></td></tr>
<tr><td class='ln' data-ln='130'></td><td><span> </span><span class='pt3'>// The HTTP/2 spec disallows recursive pushes and cross-authority pushes.</span></td></tr>
<tr><td class='ln' data-ln='131'></td><td><span> </span><span class='pt3'>// Push may or may not detect these invalid pushes; however, invalid</span></td></tr>
<tr><td class='ln' data-ln='132'></td><td><span> </span><span class='pt3'>// pushes will be detected and canceled by conforming clients.</span></td></tr>
<tr><td class='ln' data-ln='133'></td><td><span> </span><span class='pt3'>//</span></td></tr>
<tr><td class='ln' data-ln='134'></td><td><span> </span><span class='pt3'>// Handlers that wish to push URL X should call Push before sending any</span></td></tr>
<tr><td class='ln' data-ln='135'></td><td><span> </span><span class='pt3'>// data that may trigger a request for URL X. This avoids a race where the</span></td></tr>
<tr><td class='ln' data-ln='136'></td><td><span> </span><span class='pt3'>// client issues requests for X before receiving the PUSH_PROMISE for X.</span></td></tr>
<tr><td class='ln' data-ln='137'></td><td><span> </span><span class='pt3'>//</span></td></tr>
<tr><td class='ln' data-ln='138'></td><td><span> </span><span class='pt3'>// Push returns ErrNotSupported if the client has disabled push or if push</span></td></tr>
<tr><td class='ln' data-ln='139'></td><td><span> </span><span class='pt3'>// is not supported on the underlying connection.</span></td></tr>
<tr><td class='ln' data-ln='140'></td><td><span> </span><span class='pt16'>Push</span><span>(target </span><span class='pt2 it'>string</span><span>, opts </span><span class='pt4'>*</span><span>PushOptions) </span><span class='pt2 it'>error</span></td></tr>
<tr><td class='ln' data-ln='141'></td><td><span>}</span></td></tr>
</table>
</div>
</div>
</div>
<div class='style' id='P--ayu_dark--go'>
<div class='P--ayu_dark-bordered'>
<div class="info header">
<span class="left">http.go</span>
<span class="right"><span>141 lines</span><span>4.26 KB</span></span>
</div>
<div class='P--ayu_dark'>
<table>
<tr><td class='ln' data-ln='1'></td><td><span class='pt10 it'>// Copyright 2016 The Go Authors. All rights reserved.</span></td></tr>
<tr><td class='ln' data-ln='2'></td><td><span class='pt10 it'>// Use of this source code is governed by a BSD-style</span></td></tr>
<tr><td class='ln' data-ln='3'></td><td><span class='pt10 it'>// license that can be found in the LICENSE file.</span></td></tr>
<tr><td class='ln' data-ln='4'></td><td> </td></tr>
<tr><td class='ln' data-ln='5'></td><td><span class='pt21'>package</span><span> http</span></td></tr>
<tr><td class='ln' data-ln='6'></td><td> </td></tr>
<tr><td class='ln' data-ln='7'></td><td class='hi'><span class='pt21'>import</span><span> (</span></td></tr>
<tr><td class='ln' data-ln='8'></td><td class='hi'><span> </span><span class='pt13'>"io"</span></td></tr>
<tr><td class='ln' data-ln='9'></td><td class='hi'><span> </span><span class='pt13'>"strconv"</span></td></tr>
<tr><td class='ln' data-ln='10'></td><td class='hi'><span> </span><span class='pt13'>"strings"</span></td></tr>
<tr><td class='ln' data-ln='11'></td><td class='hi'><span> </span><span class='pt13'>"time"</span></td></tr>
<tr><td class='ln' data-ln='12'></td><td class='hi'><span> </span><span class='pt13'>"unicode/utf8"</span></td></tr>
<tr><td class='ln' data-ln='13'></td><td class='hi'> </td></tr>
<tr><td class='ln' data-ln='14'></td><td class='hi'><span> </span><span class='pt13'>"golang_org/x/net/lex/httplex"</span></td></tr>
<tr><td class='ln' data-ln='15'></td><td class='hi'><span>)</span></td></tr>
<tr><td class='ln' data-ln='16'></td><td> </td></tr>
<tr><td class='ln' data-ln='17'></td><td><span class='pt10 it'>// maxInt64 is the effective "infinite" value for the Server and</span></td></tr>
<tr><td class='ln' data-ln='18'></td><td><span class='pt10 it'>// Transport's byte-limiting readers.</span></td></tr>
<tr><td class='ln' data-ln='19'></td><td><span class='pt21'>const</span><span> maxInt64 </span><span class='pt18'>=</span><span> </span><span class='pt23'>1</span><span class='pt18'><<</span><span class='pt23'>63</span><span> </span><span class='pt18'>-</span><span> </span><span class='pt23'>1</span></td></tr>
<tr><td class='ln' data-ln='20'></td><td> </td></tr>
<tr><td class='ln' data-ln='21'></td><td><span class='pt10 it'>// aLongTimeAgo is a non-zero time, far in the past, used for</span></td></tr>
<tr><td class='ln' data-ln='22'></td><td><span class='pt10 it'>// immediate cancelation of network operations.</span></td></tr>
<tr><td class='ln' data-ln='23'></td><td><span class='pt21'>var</span><span> aLongTimeAgo </span><span class='pt18'>=</span><span> time</span><span class='pt18'>.</span><span class='pt22'>Unix</span><span>(</span><span class='pt23'>1</span><span class='pt25'>,</span><span> </span><span class='pt23'>0</span><span>)</span></td></tr>
<tr><td class='ln' data-ln='24'></td><td> </td></tr>
<tr><td class='ln' data-ln='25'></td><td><span class='pt10 it'>// TODO(bradfitz): move common stuff here. The other files have accumulated</span></td></tr>
<tr><td class='ln' data-ln='26'></td><td><span class='pt10 it'>// generic http stuff in random places.</span></td></tr>
<tr><td class='ln' data-ln='27'></td><td> </td></tr>
<tr><td class='ln' data-ln='28'></td><td><span class='pt10 it'>// contextKey is a value for use with context.WithValue. It's used as</span></td></tr>
<tr><td class='ln' data-ln='29'></td><td><span class='pt10 it'>// a pointer so it fits in an interface{} without allocation.</span></td></tr>
<tr><td class='ln' data-ln='30'></td><td><span class='pt21'>type</span><span> </span><span class='pt9'>contextKey</span><span> </span><span class='pt21'>struct</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='31'></td><td><span> name </span><span class='pt21'>string</span></td></tr>
<tr><td class='ln' data-ln='32'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='33'></td><td> </td></tr>
<tr><td class='ln' data-ln='34'></td><td><span class='pt21'>func</span><span> (</span><span class='pt23'>k</span><span> </span><span class='pt18'>*</span><span>contextKey) </span><span class='pt22'>String</span><span>() </span><span class='pt21'>string</span><span> { </span><span class='pt21'>return</span><span> </span><span class='pt13'>"net/http context value "</span><span> </span><span class='pt18'>+</span><span> k</span><span class='pt18'>.</span><span>name }</span></td></tr>
<tr><td class='ln' data-ln='35'></td><td> </td></tr>
<tr><td class='ln' data-ln='36'></td><td><span class='pt10 it'>// Given a string of the form "host", "host:port", or "[ipv6::address]:port",</span></td></tr>
<tr><td class='ln' data-ln='37'></td><td><span class='pt10 it'>// return true if the string includes a port.</span></td></tr>
<tr><td class='ln' data-ln='38'></td><td><span class='pt21'>func</span><span> </span><span class='pt22'>hasPort</span><span>(</span><span class='pt23'>s</span><span> </span><span class='pt21'>string</span><span>) </span><span class='pt21'>bool</span><span> { </span><span class='pt21'>return</span><span> strings</span><span class='pt18'>.</span><span class='pt22'>LastIndex</span><span>(s</span><span class='pt25'>,</span><span> </span><span class='pt13'>":"</span><span>) </span><span class='pt18'>></span><span> strings</span><span class='pt18'>.</span><span class='pt22'>LastIndex</span><span>(s</span><span class='pt25'>,</span><span> </span><span class='pt13'>"]"</span><span>) }</span></td></tr>
<tr><td class='ln' data-ln='39'></td><td> </td></tr>
<tr><td class='ln' data-ln='40'></td><td><span class='pt10 it'>// removeEmptyPort strips the empty port in ":port" to ""</span></td></tr>
<tr><td class='ln' data-ln='41'></td><td><span class='pt10 it'>// as mandated by RFC 3986 Section 6.2.3.</span></td></tr>
<tr><td class='ln' data-ln='42'></td><td><span class='pt21'>func</span><span> </span><span class='pt22'>removeEmptyPort</span><span>(</span><span class='pt23'>host</span><span> </span><span class='pt21'>string</span><span>) </span><span class='pt21'>string</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='43'></td><td><span> </span><span class='pt21'>if</span><span> </span><span class='pt22'>hasPort</span><span>(host) {</span></td></tr>
<tr><td class='ln' data-ln='44'></td><td><span> </span><span class='pt21'>return</span><span> strings</span><span class='pt18'>.</span><span class='pt22'>TrimSuffix</span><span>(host</span><span class='pt25'>,</span><span> </span><span class='pt13'>":"</span><span>)</span></td></tr>
<tr><td class='ln' data-ln='45'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='46'></td><td><span> </span><span class='pt21'>return</span><span> host</span></td></tr>
<tr><td class='ln' data-ln='47'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='48'></td><td> </td></tr>
<tr><td class='ln' data-ln='49'></td><td><span class='pt21'>func</span><span> </span><span class='pt22'>isNotToken</span><span>(</span><span class='pt23'>r</span><span> </span><span class='pt21'>rune</span><span>) </span><span class='pt21'>bool</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='50'></td><td><span> </span><span class='pt21'>return</span><span> </span><span class='pt18'>!</span><span>httplex</span><span class='pt18'>.</span><span class='pt22'>IsTokenRune</span><span>(r)</span></td></tr>
<tr><td class='ln' data-ln='51'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='52'></td><td> </td></tr>
<tr><td class='ln' data-ln='53'></td><td><span class='pt21'>func</span><span> </span><span class='pt22'>isASCII</span><span>(</span><span class='pt23'>s</span><span> </span><span class='pt21'>string</span><span>) </span><span class='pt21'>bool</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='54'></td><td><span> </span><span class='pt21'>for</span><span> i </span><span class='pt18'>:=</span><span> </span><span class='pt23'>0</span><span>; i </span><span class='pt18'><</span><span> </span><span class='pt17'>len</span><span>(s); i</span><span class='pt18'>++</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='55'></td><td><span> </span><span class='pt21'>if</span><span> s[i] </span><span class='pt18'>>=</span><span> utf8</span><span class='pt18'>.</span><span>RuneSelf {</span></td></tr>
<tr><td class='ln' data-ln='56'></td><td><span> </span><span class='pt21'>return</span><span> </span><span class='pt23'>false</span></td></tr>
<tr><td class='ln' data-ln='57'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='58'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='59'></td><td><span> </span><span class='pt21'>return</span><span> </span><span class='pt23'>true</span></td></tr>
<tr><td class='ln' data-ln='60'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='61'></td><td> </td></tr>
<tr><td class='ln' data-ln='62'></td><td><span class='pt21'>func</span><span> </span><span class='pt22'>hexEscapeNonASCII</span><span>(</span><span class='pt23'>s</span><span> </span><span class='pt21'>string</span><span>) </span><span class='pt21'>string</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='63'></td><td><span> newLen </span><span class='pt18'>:=</span><span> </span><span class='pt23'>0</span></td></tr>
<tr><td class='ln' data-ln='64'></td><td><span> </span><span class='pt21'>for</span><span> i </span><span class='pt18'>:=</span><span> </span><span class='pt23'>0</span><span>; i </span><span class='pt18'><</span><span> </span><span class='pt17'>len</span><span>(s); i</span><span class='pt18'>++</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='65'></td><td><span> </span><span class='pt21'>if</span><span> s[i] </span><span class='pt18'>>=</span><span> utf8</span><span class='pt18'>.</span><span>RuneSelf {</span></td></tr>
<tr><td class='ln' data-ln='66'></td><td><span> newLen </span><span class='pt18'>+=</span><span> </span><span class='pt23'>3</span></td></tr>
<tr><td class='ln' data-ln='67'></td><td><span> } </span><span class='pt21'>else</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='68'></td><td><span> newLen</span><span class='pt18'>++</span></td></tr>
<tr><td class='ln' data-ln='69'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='70'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='71'></td><td><span> </span><span class='pt21'>if</span><span> newLen </span><span class='pt18'>==</span><span> </span><span class='pt17'>len</span><span>(s) {</span></td></tr>
<tr><td class='ln' data-ln='72'></td><td><span> </span><span class='pt21'>return</span><span> s</span></td></tr>
<tr><td class='ln' data-ln='73'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='74'></td><td><span> b </span><span class='pt18'>:=</span><span> </span><span class='pt17'>make</span><span>([]</span><span class='pt21'>byte</span><span class='pt25'>,</span><span> </span><span class='pt23'>0</span><span class='pt25'>,</span><span> newLen)</span></td></tr>
<tr><td class='ln' data-ln='75'></td><td><span> </span><span class='pt21'>for</span><span> i </span><span class='pt18'>:=</span><span> </span><span class='pt23'>0</span><span>; i </span><span class='pt18'><</span><span> </span><span class='pt17'>len</span><span>(s); i</span><span class='pt18'>++</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='76'></td><td><span> </span><span class='pt21'>if</span><span> s[i] </span><span class='pt18'>>=</span><span> utf8</span><span class='pt18'>.</span><span>RuneSelf {</span></td></tr>
<tr><td class='ln' data-ln='77'></td><td><span> b </span><span class='pt18'>=</span><span> </span><span class='pt17'>append</span><span>(b</span><span class='pt25'>,</span><span> </span><span class='pt13'>'%'</span><span>)</span></td></tr>
<tr><td class='ln' data-ln='78'></td><td><span> b </span><span class='pt18'>=</span><span> strconv</span><span class='pt18'>.</span><span class='pt22'>AppendInt</span><span>(b</span><span class='pt25'>,</span><span> </span><span class='pt21'>int64</span><span>(s[i])</span><span class='pt25'>,</span><span> </span><span class='pt23'>16</span><span>)</span></td></tr>
<tr><td class='ln' data-ln='79'></td><td><span> } </span><span class='pt21'>else</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='80'></td><td><span> b </span><span class='pt18'>=</span><span> </span><span class='pt17'>append</span><span>(b</span><span class='pt25'>,</span><span> s[i])</span></td></tr>
<tr><td class='ln' data-ln='81'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='82'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='83'></td><td><span> </span><span class='pt21'>return</span><span> </span><span class='pt21'>string</span><span>(b)</span></td></tr>
<tr><td class='ln' data-ln='84'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='85'></td><td> </td></tr>
<tr><td class='ln' data-ln='86'></td><td><span class='pt10 it'>// NoBody is an io.ReadCloser with no bytes. Read always returns EOF</span></td></tr>
<tr><td class='ln' data-ln='87'></td><td><span class='pt10 it'>// and Close always returns nil. It can be used in an outgoing client</span></td></tr>
<tr><td class='ln' data-ln='88'></td><td><span class='pt10 it'>// request to explicitly signal that a request has zero bytes.</span></td></tr>
<tr><td class='ln' data-ln='89'></td><td><span class='pt10 it'>// An alternative, however, is to simply set Request.Body to nil.</span></td></tr>
<tr><td class='ln' data-ln='90'></td><td><span class='pt21'>var</span><span> NoBody </span><span class='pt18'>=</span><span> noBody{}</span></td></tr>
<tr><td class='ln' data-ln='91'></td><td> </td></tr>
<tr><td class='ln' data-ln='92'></td><td><span class='pt21'>type</span><span> </span><span class='pt9'>noBody</span><span> </span><span class='pt21'>struct</span><span>{}</span></td></tr>
<tr><td class='ln' data-ln='93'></td><td> </td></tr>
<tr><td class='ln' data-ln='94'></td><td><span class='pt21'>func</span><span> (noBody) </span><span class='pt22'>Read</span><span>([]</span><span class='pt21'>byte</span><span>) (</span><span class='pt21'>int</span><span class='pt25'>,</span><span> </span><span class='pt21'>error</span><span>) { </span><span class='pt21'>return</span><span> </span><span class='pt23'>0</span><span class='pt25'>,</span><span> io</span><span class='pt18'>.</span><span>EOF }</span></td></tr>
<tr><td class='ln' data-ln='95'></td><td><span class='pt21'>func</span><span> (noBody) </span><span class='pt22'>Close</span><span>() </span><span class='pt21'>error</span><span> { </span><span class='pt21'>return</span><span> </span><span class='pt23'>nil</span><span> }</span></td></tr>
<tr><td class='ln' data-ln='96'></td><td><span class='pt21'>func</span><span> (noBody) </span><span class='pt22'>WriteTo</span><span>(io.Writer) (</span><span class='pt21'>int64</span><span class='pt25'>,</span><span> </span><span class='pt21'>error</span><span>) { </span><span class='pt21'>return</span><span> </span><span class='pt23'>0</span><span class='pt25'>,</span><span> </span><span class='pt23'>nil</span><span> }</span></td></tr>
<tr><td class='ln' data-ln='97'></td><td> </td></tr>
<tr><td class='ln' data-ln='98'></td><td><span class='pt21'>var</span><span> (</span></td></tr>
<tr><td class='ln' data-ln='99'></td><td><span> </span><span class='pt10 it'>// verify that an io.Copy from NoBody won't require a buffer:</span></td></tr>
<tr><td class='ln' data-ln='100'></td><td><span> _ io</span><span class='pt18'>.</span><span>WriterTo </span><span class='pt18'>=</span><span> NoBody</span></td></tr>
<tr><td class='ln' data-ln='101'></td><td><span> _ io</span><span class='pt18'>.</span><span>ReadCloser </span><span class='pt18'>=</span><span> NoBody</span></td></tr>
<tr><td class='ln' data-ln='102'></td><td><span>)</span></td></tr>
<tr><td class='ln' data-ln='103'></td><td> </td></tr>
<tr><td class='ln' data-ln='104'></td><td><span class='pt10 it'>// PushOptions describes options for Pusher.Push.</span></td></tr>
<tr><td class='ln' data-ln='105'></td><td><span class='pt21'>type</span><span> </span><span class='pt9'>PushOptions</span><span> </span><span class='pt21'>struct</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='106'></td><td><span> </span><span class='pt10 it'>// Method specifies the HTTP method for the promised request.</span></td></tr>
<tr><td class='ln' data-ln='107'></td><td><span> </span><span class='pt10 it'>// If set, it must be "GET" or "HEAD". Empty means "GET".</span></td></tr>
<tr><td class='ln' data-ln='108'></td><td><span> Method </span><span class='pt21'>string</span></td></tr>
<tr><td class='ln' data-ln='109'></td><td> </td></tr>
<tr><td class='ln' data-ln='110'></td><td><span> </span><span class='pt10 it'>// Header specifies additional promised request headers. This cannot</span></td></tr>
<tr><td class='ln' data-ln='111'></td><td><span> </span><span class='pt10 it'>// include HTTP/2 pseudo header fields like ":path" and ":scheme",</span></td></tr>
<tr><td class='ln' data-ln='112'></td><td><span> </span><span class='pt10 it'>// which will be added automatically.</span></td></tr>
<tr><td class='ln' data-ln='113'></td><td><span> Header Header</span></td></tr>
<tr><td class='ln' data-ln='114'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='115'></td><td> </td></tr>
<tr><td class='ln' data-ln='116'></td><td><span class='pt10 it'>// Pusher is the interface implemented by ResponseWriters that support</span></td></tr>
<tr><td class='ln' data-ln='117'></td><td><span class='pt10 it'>// HTTP/2 server push. For more background, see</span></td></tr>
<tr><td class='ln' data-ln='118'></td><td><span class='pt10 it'>// https://tools.ietf.org/html/rfc7540#section-8.2.</span></td></tr>
<tr><td class='ln' data-ln='119'></td><td><span class='pt21'>type</span><span> </span><span class='pt9'>Pusher</span><span> </span><span class='pt21'>interface</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='120'></td><td><span> </span><span class='pt10 it'>// Push initiates an HTTP/2 server push. This constructs a synthetic</span></td></tr>
<tr><td class='ln' data-ln='121'></td><td><span> </span><span class='pt10 it'>// request using the given target and options, serializes that request</span></td></tr>
<tr><td class='ln' data-ln='122'></td><td><span> </span><span class='pt10 it'>// into a PUSH_PROMISE frame, then dispatches that request using the</span></td></tr>
<tr><td class='ln' data-ln='123'></td><td><span> </span><span class='pt10 it'>// server's request handler. If opts is nil, default options are used.</span></td></tr>
<tr><td class='ln' data-ln='124'></td><td><span> </span><span class='pt10 it'>//</span></td></tr>
<tr><td class='ln' data-ln='125'></td><td><span> </span><span class='pt10 it'>// The target must either be an absolute path (like "/path") or an absolute</span></td></tr>
<tr><td class='ln' data-ln='126'></td><td><span> </span><span class='pt10 it'>// URL that contains a valid host and the same scheme as the parent request.</span></td></tr>
<tr><td class='ln' data-ln='127'></td><td><span> </span><span class='pt10 it'>// If the target is a path, it will inherit the scheme and host of the</span></td></tr>
<tr><td class='ln' data-ln='128'></td><td><span> </span><span class='pt10 it'>// parent request.</span></td></tr>
<tr><td class='ln' data-ln='129'></td><td><span> </span><span class='pt10 it'>//</span></td></tr>
<tr><td class='ln' data-ln='130'></td><td><span> </span><span class='pt10 it'>// The HTTP/2 spec disallows recursive pushes and cross-authority pushes.</span></td></tr>
<tr><td class='ln' data-ln='131'></td><td><span> </span><span class='pt10 it'>// Push may or may not detect these invalid pushes; however, invalid</span></td></tr>
<tr><td class='ln' data-ln='132'></td><td><span> </span><span class='pt10 it'>// pushes will be detected and canceled by conforming clients.</span></td></tr>
<tr><td class='ln' data-ln='133'></td><td><span> </span><span class='pt10 it'>//</span></td></tr>
<tr><td class='ln' data-ln='134'></td><td><span> </span><span class='pt10 it'>// Handlers that wish to push URL X should call Push before sending any</span></td></tr>
<tr><td class='ln' data-ln='135'></td><td><span> </span><span class='pt10 it'>// data that may trigger a request for URL X. This avoids a race where the</span></td></tr>
<tr><td class='ln' data-ln='136'></td><td><span> </span><span class='pt10 it'>// client issues requests for X before receiving the PUSH_PROMISE for X.</span></td></tr>
<tr><td class='ln' data-ln='137'></td><td><span> </span><span class='pt10 it'>//</span></td></tr>
<tr><td class='ln' data-ln='138'></td><td><span> </span><span class='pt10 it'>// Push returns ErrNotSupported if the client has disabled push or if push</span></td></tr>
<tr><td class='ln' data-ln='139'></td><td><span> </span><span class='pt10 it'>// is not supported on the underlying connection.</span></td></tr>
<tr><td class='ln' data-ln='140'></td><td><span> </span><span class='pt22'>Push</span><span>(target </span><span class='pt21'>string</span><span class='pt25'>,</span><span> opts </span><span class='pt18'>*</span><span>PushOptions) </span><span class='pt21'>error</span></td></tr>
<tr><td class='ln' data-ln='141'></td><td><span>}</span></td></tr>
</table>
</div>
</div>
</div>
<div class='style' id='P--ayu_light--go'>
<div class='P--ayu_light-bordered'>
<div class="info header">
<span class="left">http.go</span>
<span class="right"><span>141 lines</span><span>4.26 KB</span></span>
</div>
<div class='P--ayu_light'>
<table>
<tr><td class='ln' data-ln='1'></td><td><span class='pt12 it'>// Copyright 2016 The Go Authors. All rights reserved.</span></td></tr>
<tr><td class='ln' data-ln='2'></td><td><span class='pt12 it'>// Use of this source code is governed by a BSD-style</span></td></tr>
<tr><td class='ln' data-ln='3'></td><td><span class='pt12 it'>// license that can be found in the LICENSE file.</span></td></tr>
<tr><td class='ln' data-ln='4'></td><td> </td></tr>
<tr><td class='ln' data-ln='5'></td><td><span class='pt21'>package</span><span> http</span></td></tr>
<tr><td class='ln' data-ln='6'></td><td> </td></tr>
<tr><td class='ln' data-ln='7'></td><td class='hi'><span class='pt21'>import</span><span> (</span></td></tr>
<tr><td class='ln' data-ln='8'></td><td class='hi'><span> </span><span class='pt10'>"io"</span></td></tr>
<tr><td class='ln' data-ln='9'></td><td class='hi'><span> </span><span class='pt10'>"strconv"</span></td></tr>
<tr><td class='ln' data-ln='10'></td><td class='hi'><span> </span><span class='pt10'>"strings"</span></td></tr>
<tr><td class='ln' data-ln='11'></td><td class='hi'><span> </span><span class='pt10'>"time"</span></td></tr>
<tr><td class='ln' data-ln='12'></td><td class='hi'><span> </span><span class='pt10'>"unicode/utf8"</span></td></tr>
<tr><td class='ln' data-ln='13'></td><td class='hi'> </td></tr>
<tr><td class='ln' data-ln='14'></td><td class='hi'><span> </span><span class='pt10'>"golang_org/x/net/lex/httplex"</span></td></tr>
<tr><td class='ln' data-ln='15'></td><td class='hi'><span>)</span></td></tr>
<tr><td class='ln' data-ln='16'></td><td> </td></tr>
<tr><td class='ln' data-ln='17'></td><td><span class='pt12 it'>// maxInt64 is the effective "infinite" value for the Server and</span></td></tr>
<tr><td class='ln' data-ln='18'></td><td><span class='pt12 it'>// Transport's byte-limiting readers.</span></td></tr>
<tr><td class='ln' data-ln='19'></td><td><span class='pt21'>const</span><span> maxInt64 </span><span class='pt17'>=</span><span> </span><span class='pt22'>1</span><span class='pt17'><<</span><span class='pt22'>63</span><span> </span><span class='pt17'>-</span><span> </span><span class='pt22'>1</span></td></tr>
<tr><td class='ln' data-ln='20'></td><td> </td></tr>
<tr><td class='ln' data-ln='21'></td><td><span class='pt12 it'>// aLongTimeAgo is a non-zero time, far in the past, used for</span></td></tr>
<tr><td class='ln' data-ln='22'></td><td><span class='pt12 it'>// immediate cancelation of network operations.</span></td></tr>
<tr><td class='ln' data-ln='23'></td><td><span class='pt21'>var</span><span> aLongTimeAgo </span><span class='pt17'>=</span><span> time</span><span class='pt17'>.</span><span class='pt19'>Unix</span><span>(</span><span class='pt22'>1</span><span class='pt26'>,</span><span> </span><span class='pt22'>0</span><span>)</span></td></tr>
<tr><td class='ln' data-ln='24'></td><td> </td></tr>
<tr><td class='ln' data-ln='25'></td><td><span class='pt12 it'>// TODO(bradfitz): move common stuff here. The other files have accumulated</span></td></tr>
<tr><td class='ln' data-ln='26'></td><td><span class='pt12 it'>// generic http stuff in random places.</span></td></tr>
<tr><td class='ln' data-ln='27'></td><td> </td></tr>
<tr><td class='ln' data-ln='28'></td><td><span class='pt12 it'>// contextKey is a value for use with context.WithValue. It's used as</span></td></tr>
<tr><td class='ln' data-ln='29'></td><td><span class='pt12 it'>// a pointer so it fits in an interface{} without allocation.</span></td></tr>
<tr><td class='ln' data-ln='30'></td><td><span class='pt21'>type</span><span> </span><span class='pt7'>contextKey</span><span> </span><span class='pt21'>struct</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='31'></td><td><span> name </span><span class='pt21'>string</span></td></tr>
<tr><td class='ln' data-ln='32'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='33'></td><td> </td></tr>
<tr><td class='ln' data-ln='34'></td><td><span class='pt21'>func</span><span> (</span><span class='pt11'>k</span><span> </span><span class='pt17'>*</span><span>contextKey) </span><span class='pt19'>String</span><span>() </span><span class='pt21'>string</span><span> { </span><span class='pt21'>return</span><span> </span><span class='pt10'>"net/http context value "</span><span> </span><span class='pt17'>+</span><span> k</span><span class='pt17'>.</span><span>name }</span></td></tr>
<tr><td class='ln' data-ln='35'></td><td> </td></tr>
<tr><td class='ln' data-ln='36'></td><td><span class='pt12 it'>// Given a string of the form "host", "host:port", or "[ipv6::address]:port",</span></td></tr>
<tr><td class='ln' data-ln='37'></td><td><span class='pt12 it'>// return true if the string includes a port.</span></td></tr>
<tr><td class='ln' data-ln='38'></td><td><span class='pt21'>func</span><span> </span><span class='pt19'>hasPort</span><span>(</span><span class='pt11'>s</span><span> </span><span class='pt21'>string</span><span>) </span><span class='pt21'>bool</span><span> { </span><span class='pt21'>return</span><span> strings</span><span class='pt17'>.</span><span class='pt19'>LastIndex</span><span>(s</span><span class='pt26'>,</span><span> </span><span class='pt10'>":"</span><span>) </span><span class='pt17'>></span><span> strings</span><span class='pt17'>.</span><span class='pt19'>LastIndex</span><span>(s</span><span class='pt26'>,</span><span> </span><span class='pt10'>"]"</span><span>) }</span></td></tr>
<tr><td class='ln' data-ln='39'></td><td> </td></tr>
<tr><td class='ln' data-ln='40'></td><td><span class='pt12 it'>// removeEmptyPort strips the empty port in ":port" to ""</span></td></tr>
<tr><td class='ln' data-ln='41'></td><td><span class='pt12 it'>// as mandated by RFC 3986 Section 6.2.3.</span></td></tr>
<tr><td class='ln' data-ln='42'></td><td><span class='pt21'>func</span><span> </span><span class='pt19'>removeEmptyPort</span><span>(</span><span class='pt11'>host</span><span> </span><span class='pt21'>string</span><span>) </span><span class='pt21'>string</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='43'></td><td><span> </span><span class='pt21'>if</span><span> </span><span class='pt19'>hasPort</span><span>(host) {</span></td></tr>
<tr><td class='ln' data-ln='44'></td><td><span> </span><span class='pt21'>return</span><span> strings</span><span class='pt17'>.</span><span class='pt19'>TrimSuffix</span><span>(host</span><span class='pt26'>,</span><span> </span><span class='pt10'>":"</span><span>)</span></td></tr>
<tr><td class='ln' data-ln='45'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='46'></td><td><span> </span><span class='pt21'>return</span><span> host</span></td></tr>
<tr><td class='ln' data-ln='47'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='48'></td><td> </td></tr>
<tr><td class='ln' data-ln='49'></td><td><span class='pt21'>func</span><span> </span><span class='pt19'>isNotToken</span><span>(</span><span class='pt11'>r</span><span> </span><span class='pt21'>rune</span><span>) </span><span class='pt21'>bool</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='50'></td><td><span> </span><span class='pt21'>return</span><span> </span><span class='pt17'>!</span><span>httplex</span><span class='pt17'>.</span><span class='pt19'>IsTokenRune</span><span>(r)</span></td></tr>
<tr><td class='ln' data-ln='51'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='52'></td><td> </td></tr>
<tr><td class='ln' data-ln='53'></td><td><span class='pt21'>func</span><span> </span><span class='pt19'>isASCII</span><span>(</span><span class='pt11'>s</span><span> </span><span class='pt21'>string</span><span>) </span><span class='pt21'>bool</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='54'></td><td><span> </span><span class='pt21'>for</span><span> i </span><span class='pt17'>:=</span><span> </span><span class='pt22'>0</span><span>; i </span><span class='pt17'><</span><span> </span><span class='pt18'>len</span><span>(s); i</span><span class='pt17'>++</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='55'></td><td><span> </span><span class='pt21'>if</span><span> s[i] </span><span class='pt17'>>=</span><span> utf8</span><span class='pt17'>.</span><span>RuneSelf {</span></td></tr>
<tr><td class='ln' data-ln='56'></td><td><span> </span><span class='pt21'>return</span><span> </span><span class='pt22'>false</span></td></tr>
<tr><td class='ln' data-ln='57'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='58'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='59'></td><td><span> </span><span class='pt21'>return</span><span> </span><span class='pt22'>true</span></td></tr>
<tr><td class='ln' data-ln='60'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='61'></td><td> </td></tr>
<tr><td class='ln' data-ln='62'></td><td><span class='pt21'>func</span><span> </span><span class='pt19'>hexEscapeNonASCII</span><span>(</span><span class='pt11'>s</span><span> </span><span class='pt21'>string</span><span>) </span><span class='pt21'>string</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='63'></td><td><span> newLen </span><span class='pt17'>:=</span><span> </span><span class='pt22'>0</span></td></tr>
<tr><td class='ln' data-ln='64'></td><td><span> </span><span class='pt21'>for</span><span> i </span><span class='pt17'>:=</span><span> </span><span class='pt22'>0</span><span>; i </span><span class='pt17'><</span><span> </span><span class='pt18'>len</span><span>(s); i</span><span class='pt17'>++</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='65'></td><td><span> </span><span class='pt21'>if</span><span> s[i] </span><span class='pt17'>>=</span><span> utf8</span><span class='pt17'>.</span><span>RuneSelf {</span></td></tr>
<tr><td class='ln' data-ln='66'></td><td><span> newLen </span><span class='pt17'>+=</span><span> </span><span class='pt22'>3</span></td></tr>
<tr><td class='ln' data-ln='67'></td><td><span> } </span><span class='pt21'>else</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='68'></td><td><span> newLen</span><span class='pt17'>++</span></td></tr>
<tr><td class='ln' data-ln='69'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='70'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='71'></td><td><span> </span><span class='pt21'>if</span><span> newLen </span><span class='pt17'>==</span><span> </span><span class='pt18'>len</span><span>(s) {</span></td></tr>
<tr><td class='ln' data-ln='72'></td><td><span> </span><span class='pt21'>return</span><span> s</span></td></tr>
<tr><td class='ln' data-ln='73'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='74'></td><td><span> b </span><span class='pt17'>:=</span><span> </span><span class='pt18'>make</span><span>([]</span><span class='pt21'>byte</span><span class='pt26'>,</span><span> </span><span class='pt22'>0</span><span class='pt26'>,</span><span> newLen)</span></td></tr>
<tr><td class='ln' data-ln='75'></td><td><span> </span><span class='pt21'>for</span><span> i </span><span class='pt17'>:=</span><span> </span><span class='pt22'>0</span><span>; i </span><span class='pt17'><</span><span> </span><span class='pt18'>len</span><span>(s); i</span><span class='pt17'>++</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='76'></td><td><span> </span><span class='pt21'>if</span><span> s[i] </span><span class='pt17'>>=</span><span> utf8</span><span class='pt17'>.</span><span>RuneSelf {</span></td></tr>
<tr><td class='ln' data-ln='77'></td><td><span> b </span><span class='pt17'>=</span><span> </span><span class='pt18'>append</span><span>(b</span><span class='pt26'>,</span><span> </span><span class='pt10'>'%'</span><span>)</span></td></tr>
<tr><td class='ln' data-ln='78'></td><td><span> b </span><span class='pt17'>=</span><span> strconv</span><span class='pt17'>.</span><span class='pt19'>AppendInt</span><span>(b</span><span class='pt26'>,</span><span> </span><span class='pt21'>int64</span><span>(s[i])</span><span class='pt26'>,</span><span> </span><span class='pt22'>16</span><span>)</span></td></tr>
<tr><td class='ln' data-ln='79'></td><td><span> } </span><span class='pt21'>else</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='80'></td><td><span> b </span><span class='pt17'>=</span><span> </span><span class='pt18'>append</span><span>(b</span><span class='pt26'>,</span><span> s[i])</span></td></tr>
<tr><td class='ln' data-ln='81'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='82'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='83'></td><td><span> </span><span class='pt21'>return</span><span> </span><span class='pt21'>string</span><span>(b)</span></td></tr>
<tr><td class='ln' data-ln='84'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='85'></td><td> </td></tr>
<tr><td class='ln' data-ln='86'></td><td><span class='pt12 it'>// NoBody is an io.ReadCloser with no bytes. Read always returns EOF</span></td></tr>
<tr><td class='ln' data-ln='87'></td><td><span class='pt12 it'>// and Close always returns nil. It can be used in an outgoing client</span></td></tr>
<tr><td class='ln' data-ln='88'></td><td><span class='pt12 it'>// request to explicitly signal that a request has zero bytes.</span></td></tr>
<tr><td class='ln' data-ln='89'></td><td><span class='pt12 it'>// An alternative, however, is to simply set Request.Body to nil.</span></td></tr>
<tr><td class='ln' data-ln='90'></td><td><span class='pt21'>var</span><span> NoBody </span><span class='pt17'>=</span><span> noBody{}</span></td></tr>
<tr><td class='ln' data-ln='91'></td><td> </td></tr>
<tr><td class='ln' data-ln='92'></td><td><span class='pt21'>type</span><span> </span><span class='pt7'>noBody</span><span> </span><span class='pt21'>struct</span><span>{}</span></td></tr>
<tr><td class='ln' data-ln='93'></td><td> </td></tr>
<tr><td class='ln' data-ln='94'></td><td><span class='pt21'>func</span><span> (noBody) </span><span class='pt19'>Read</span><span>([]</span><span class='pt21'>byte</span><span>) (</span><span class='pt21'>int</span><span class='pt26'>,</span><span> </span><span class='pt21'>error</span><span>) { </span><span class='pt21'>return</span><span> </span><span class='pt22'>0</span><span class='pt26'>,</span><span> io</span><span class='pt17'>.</span><span>EOF }</span></td></tr>
<tr><td class='ln' data-ln='95'></td><td><span class='pt21'>func</span><span> (noBody) </span><span class='pt19'>Close</span><span>() </span><span class='pt21'>error</span><span> { </span><span class='pt21'>return</span><span> </span><span class='pt22'>nil</span><span> }</span></td></tr>
<tr><td class='ln' data-ln='96'></td><td><span class='pt21'>func</span><span> (noBody) </span><span class='pt19'>WriteTo</span><span>(io.Writer) (</span><span class='pt21'>int64</span><span class='pt26'>,</span><span> </span><span class='pt21'>error</span><span>) { </span><span class='pt21'>return</span><span> </span><span class='pt22'>0</span><span class='pt26'>,</span><span> </span><span class='pt22'>nil</span><span> }</span></td></tr>
<tr><td class='ln' data-ln='97'></td><td> </td></tr>
<tr><td class='ln' data-ln='98'></td><td><span class='pt21'>var</span><span> (</span></td></tr>
<tr><td class='ln' data-ln='99'></td><td><span> </span><span class='pt12 it'>// verify that an io.Copy from NoBody won't require a buffer:</span></td></tr>
<tr><td class='ln' data-ln='100'></td><td><span> _ io</span><span class='pt17'>.</span><span>WriterTo </span><span class='pt17'>=</span><span> NoBody</span></td></tr>
<tr><td class='ln' data-ln='101'></td><td><span> _ io</span><span class='pt17'>.</span><span>ReadCloser </span><span class='pt17'>=</span><span> NoBody</span></td></tr>
<tr><td class='ln' data-ln='102'></td><td><span>)</span></td></tr>
<tr><td class='ln' data-ln='103'></td><td> </td></tr>
<tr><td class='ln' data-ln='104'></td><td><span class='pt12 it'>// PushOptions describes options for Pusher.Push.</span></td></tr>
<tr><td class='ln' data-ln='105'></td><td><span class='pt21'>type</span><span> </span><span class='pt7'>PushOptions</span><span> </span><span class='pt21'>struct</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='106'></td><td><span> </span><span class='pt12 it'>// Method specifies the HTTP method for the promised request.</span></td></tr>
<tr><td class='ln' data-ln='107'></td><td><span> </span><span class='pt12 it'>// If set, it must be "GET" or "HEAD". Empty means "GET".</span></td></tr>
<tr><td class='ln' data-ln='108'></td><td><span> Method </span><span class='pt21'>string</span></td></tr>
<tr><td class='ln' data-ln='109'></td><td> </td></tr>
<tr><td class='ln' data-ln='110'></td><td><span> </span><span class='pt12 it'>// Header specifies additional promised request headers. This cannot</span></td></tr>
<tr><td class='ln' data-ln='111'></td><td><span> </span><span class='pt12 it'>// include HTTP/2 pseudo header fields like ":path" and ":scheme",</span></td></tr>
<tr><td class='ln' data-ln='112'></td><td><span> </span><span class='pt12 it'>// which will be added automatically.</span></td></tr>
<tr><td class='ln' data-ln='113'></td><td><span> Header Header</span></td></tr>
<tr><td class='ln' data-ln='114'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='115'></td><td> </td></tr>
<tr><td class='ln' data-ln='116'></td><td><span class='pt12 it'>// Pusher is the interface implemented by ResponseWriters that support</span></td></tr>
<tr><td class='ln' data-ln='117'></td><td><span class='pt12 it'>// HTTP/2 server push. For more background, see</span></td></tr>
<tr><td class='ln' data-ln='118'></td><td><span class='pt12 it'>// https://tools.ietf.org/html/rfc7540#section-8.2.</span></td></tr>
<tr><td class='ln' data-ln='119'></td><td><span class='pt21'>type</span><span> </span><span class='pt7'>Pusher</span><span> </span><span class='pt21'>interface</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='120'></td><td><span> </span><span class='pt12 it'>// Push initiates an HTTP/2 server push. This constructs a synthetic</span></td></tr>
<tr><td class='ln' data-ln='121'></td><td><span> </span><span class='pt12 it'>// request using the given target and options, serializes that request</span></td></tr>
<tr><td class='ln' data-ln='122'></td><td><span> </span><span class='pt12 it'>// into a PUSH_PROMISE frame, then dispatches that request using the</span></td></tr>
<tr><td class='ln' data-ln='123'></td><td><span> </span><span class='pt12 it'>// server's request handler. If opts is nil, default options are used.</span></td></tr>
<tr><td class='ln' data-ln='124'></td><td><span> </span><span class='pt12 it'>//</span></td></tr>
<tr><td class='ln' data-ln='125'></td><td><span> </span><span class='pt12 it'>// The target must either be an absolute path (like "/path") or an absolute</span></td></tr>
<tr><td class='ln' data-ln='126'></td><td><span> </span><span class='pt12 it'>// URL that contains a valid host and the same scheme as the parent request.</span></td></tr>
<tr><td class='ln' data-ln='127'></td><td><span> </span><span class='pt12 it'>// If the target is a path, it will inherit the scheme and host of the</span></td></tr>
<tr><td class='ln' data-ln='128'></td><td><span> </span><span class='pt12 it'>// parent request.</span></td></tr>
<tr><td class='ln' data-ln='129'></td><td><span> </span><span class='pt12 it'>//</span></td></tr>
<tr><td class='ln' data-ln='130'></td><td><span> </span><span class='pt12 it'>// The HTTP/2 spec disallows recursive pushes and cross-authority pushes.</span></td></tr>
<tr><td class='ln' data-ln='131'></td><td><span> </span><span class='pt12 it'>// Push may or may not detect these invalid pushes; however, invalid</span></td></tr>
<tr><td class='ln' data-ln='132'></td><td><span> </span><span class='pt12 it'>// pushes will be detected and canceled by conforming clients.</span></td></tr>
<tr><td class='ln' data-ln='133'></td><td><span> </span><span class='pt12 it'>//</span></td></tr>
<tr><td class='ln' data-ln='134'></td><td><span> </span><span class='pt12 it'>// Handlers that wish to push URL X should call Push before sending any</span></td></tr>
<tr><td class='ln' data-ln='135'></td><td><span> </span><span class='pt12 it'>// data that may trigger a request for URL X. This avoids a race where the</span></td></tr>
<tr><td class='ln' data-ln='136'></td><td><span> </span><span class='pt12 it'>// client issues requests for X before receiving the PUSH_PROMISE for X.</span></td></tr>
<tr><td class='ln' data-ln='137'></td><td><span> </span><span class='pt12 it'>//</span></td></tr>
<tr><td class='ln' data-ln='138'></td><td><span> </span><span class='pt12 it'>// Push returns ErrNotSupported if the client has disabled push or if push</span></td></tr>
<tr><td class='ln' data-ln='139'></td><td><span> </span><span class='pt12 it'>// is not supported on the underlying connection.</span></td></tr>
<tr><td class='ln' data-ln='140'></td><td><span> </span><span class='pt19'>Push</span><span>(target </span><span class='pt21'>string</span><span class='pt26'>,</span><span> opts </span><span class='pt17'>*</span><span>PushOptions) </span><span class='pt21'>error</span></td></tr>
<tr><td class='ln' data-ln='141'></td><td><span>}</span></td></tr>
</table>
</div>
</div>
</div>
<div class='style' id='P--ayu_mirage--go'>
<div class='P--ayu_mirage-bordered'>
<div class="info header">
<span class="left">http.go</span>
<span class="right"><span>141 lines</span><span>4.26 KB</span></span>
</div>
<div class='P--ayu_mirage'>
<table>
<tr><td class='ln' data-ln='1'></td><td><span class='pt8 it'>// Copyright 2016 The Go Authors. All rights reserved.</span></td></tr>
<tr><td class='ln' data-ln='2'></td><td><span class='pt8 it'>// Use of this source code is governed by a BSD-style</span></td></tr>
<tr><td class='ln' data-ln='3'></td><td><span class='pt8 it'>// license that can be found in the LICENSE file.</span></td></tr>
<tr><td class='ln' data-ln='4'></td><td> </td></tr>
<tr><td class='ln' data-ln='5'></td><td><span class='pt19'>package</span><span> http</span></td></tr>
<tr><td class='ln' data-ln='6'></td><td> </td></tr>
<tr><td class='ln' data-ln='7'></td><td class='hi'><span class='pt19'>import</span><span> (</span></td></tr>
<tr><td class='ln' data-ln='8'></td><td class='hi'><span> </span><span class='pt12'>"io"</span></td></tr>
<tr><td class='ln' data-ln='9'></td><td class='hi'><span> </span><span class='pt12'>"strconv"</span></td></tr>
<tr><td class='ln' data-ln='10'></td><td class='hi'><span> </span><span class='pt12'>"strings"</span></td></tr>
<tr><td class='ln' data-ln='11'></td><td class='hi'><span> </span><span class='pt12'>"time"</span></td></tr>
<tr><td class='ln' data-ln='12'></td><td class='hi'><span> </span><span class='pt12'>"unicode/utf8"</span></td></tr>
<tr><td class='ln' data-ln='13'></td><td class='hi'> </td></tr>
<tr><td class='ln' data-ln='14'></td><td class='hi'><span> </span><span class='pt12'>"golang_org/x/net/lex/httplex"</span></td></tr>
<tr><td class='ln' data-ln='15'></td><td class='hi'><span>)</span></td></tr>
<tr><td class='ln' data-ln='16'></td><td> </td></tr>
<tr><td class='ln' data-ln='17'></td><td><span class='pt8 it'>// maxInt64 is the effective "infinite" value for the Server and</span></td></tr>
<tr><td class='ln' data-ln='18'></td><td><span class='pt8 it'>// Transport's byte-limiting readers.</span></td></tr>
<tr><td class='ln' data-ln='19'></td><td><span class='pt19'>const</span><span> maxInt64 </span><span class='pt17'>=</span><span> </span><span class='pt14'>1</span><span class='pt17'><<</span><span class='pt14'>63</span><span> </span><span class='pt17'>-</span><span> </span><span class='pt14'>1</span></td></tr>
<tr><td class='ln' data-ln='20'></td><td> </td></tr>
<tr><td class='ln' data-ln='21'></td><td><span class='pt8 it'>// aLongTimeAgo is a non-zero time, far in the past, used for</span></td></tr>
<tr><td class='ln' data-ln='22'></td><td><span class='pt8 it'>// immediate cancelation of network operations.</span></td></tr>
<tr><td class='ln' data-ln='23'></td><td><span class='pt19'>var</span><span> aLongTimeAgo </span><span class='pt17'>=</span><span> time</span><span class='pt17'>.</span><span class='pt22'>Unix</span><span>(</span><span class='pt14'>1</span><span class='pt24'>,</span><span> </span><span class='pt14'>0</span><span>)</span></td></tr>
<tr><td class='ln' data-ln='24'></td><td> </td></tr>
<tr><td class='ln' data-ln='25'></td><td><span class='pt8 it'>// TODO(bradfitz): move common stuff here. The other files have accumulated</span></td></tr>
<tr><td class='ln' data-ln='26'></td><td><span class='pt8 it'>// generic http stuff in random places.</span></td></tr>
<tr><td class='ln' data-ln='27'></td><td> </td></tr>
<tr><td class='ln' data-ln='28'></td><td><span class='pt8 it'>// contextKey is a value for use with context.WithValue. It's used as</span></td></tr>
<tr><td class='ln' data-ln='29'></td><td><span class='pt8 it'>// a pointer so it fits in an interface{} without allocation.</span></td></tr>
<tr><td class='ln' data-ln='30'></td><td><span class='pt19'>type</span><span> </span><span class='pt10'>contextKey</span><span> </span><span class='pt19'>struct</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='31'></td><td><span> name </span><span class='pt19'>string</span></td></tr>
<tr><td class='ln' data-ln='32'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='33'></td><td> </td></tr>
<tr><td class='ln' data-ln='34'></td><td><span class='pt19'>func</span><span> (</span><span class='pt14'>k</span><span> </span><span class='pt17'>*</span><span>contextKey) </span><span class='pt22'>String</span><span>() </span><span class='pt19'>string</span><span> { </span><span class='pt19'>return</span><span> </span><span class='pt12'>"net/http context value "</span><span> </span><span class='pt17'>+</span><span> k</span><span class='pt17'>.</span><span>name }</span></td></tr>
<tr><td class='ln' data-ln='35'></td><td> </td></tr>
<tr><td class='ln' data-ln='36'></td><td><span class='pt8 it'>// Given a string of the form "host", "host:port", or "[ipv6::address]:port",</span></td></tr>
<tr><td class='ln' data-ln='37'></td><td><span class='pt8 it'>// return true if the string includes a port.</span></td></tr>
<tr><td class='ln' data-ln='38'></td><td><span class='pt19'>func</span><span> </span><span class='pt22'>hasPort</span><span>(</span><span class='pt14'>s</span><span> </span><span class='pt19'>string</span><span>) </span><span class='pt19'>bool</span><span> { </span><span class='pt19'>return</span><span> strings</span><span class='pt17'>.</span><span class='pt22'>LastIndex</span><span>(s</span><span class='pt24'>,</span><span> </span><span class='pt12'>":"</span><span>) </span><span class='pt17'>></span><span> strings</span><span class='pt17'>.</span><span class='pt22'>LastIndex</span><span>(s</span><span class='pt24'>,</span><span> </span><span class='pt12'>"]"</span><span>) }</span></td></tr>
<tr><td class='ln' data-ln='39'></td><td> </td></tr>
<tr><td class='ln' data-ln='40'></td><td><span class='pt8 it'>// removeEmptyPort strips the empty port in ":port" to ""</span></td></tr>
<tr><td class='ln' data-ln='41'></td><td><span class='pt8 it'>// as mandated by RFC 3986 Section 6.2.3.</span></td></tr>
<tr><td class='ln' data-ln='42'></td><td><span class='pt19'>func</span><span> </span><span class='pt22'>removeEmptyPort</span><span>(</span><span class='pt14'>host</span><span> </span><span class='pt19'>string</span><span>) </span><span class='pt19'>string</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='43'></td><td><span> </span><span class='pt19'>if</span><span> </span><span class='pt22'>hasPort</span><span>(host) {</span></td></tr>
<tr><td class='ln' data-ln='44'></td><td><span> </span><span class='pt19'>return</span><span> strings</span><span class='pt17'>.</span><span class='pt22'>TrimSuffix</span><span>(host</span><span class='pt24'>,</span><span> </span><span class='pt12'>":"</span><span>)</span></td></tr>
<tr><td class='ln' data-ln='45'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='46'></td><td><span> </span><span class='pt19'>return</span><span> host</span></td></tr>
<tr><td class='ln' data-ln='47'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='48'></td><td> </td></tr>
<tr><td class='ln' data-ln='49'></td><td><span class='pt19'>func</span><span> </span><span class='pt22'>isNotToken</span><span>(</span><span class='pt14'>r</span><span> </span><span class='pt19'>rune</span><span>) </span><span class='pt19'>bool</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='50'></td><td><span> </span><span class='pt19'>return</span><span> </span><span class='pt17'>!</span><span>httplex</span><span class='pt17'>.</span><span class='pt22'>IsTokenRune</span><span>(r)</span></td></tr>
<tr><td class='ln' data-ln='51'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='52'></td><td> </td></tr>
<tr><td class='ln' data-ln='53'></td><td><span class='pt19'>func</span><span> </span><span class='pt22'>isASCII</span><span>(</span><span class='pt14'>s</span><span> </span><span class='pt19'>string</span><span>) </span><span class='pt19'>bool</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='54'></td><td><span> </span><span class='pt19'>for</span><span> i </span><span class='pt17'>:=</span><span> </span><span class='pt14'>0</span><span>; i </span><span class='pt17'><</span><span> </span><span class='pt16'>len</span><span>(s); i</span><span class='pt17'>++</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='55'></td><td><span> </span><span class='pt19'>if</span><span> s[i] </span><span class='pt17'>>=</span><span> utf8</span><span class='pt17'>.</span><span>RuneSelf {</span></td></tr>
<tr><td class='ln' data-ln='56'></td><td><span> </span><span class='pt19'>return</span><span> </span><span class='pt14'>false</span></td></tr>
<tr><td class='ln' data-ln='57'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='58'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='59'></td><td><span> </span><span class='pt19'>return</span><span> </span><span class='pt14'>true</span></td></tr>
<tr><td class='ln' data-ln='60'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='61'></td><td> </td></tr>
<tr><td class='ln' data-ln='62'></td><td><span class='pt19'>func</span><span> </span><span class='pt22'>hexEscapeNonASCII</span><span>(</span><span class='pt14'>s</span><span> </span><span class='pt19'>string</span><span>) </span><span class='pt19'>string</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='63'></td><td><span> newLen </span><span class='pt17'>:=</span><span> </span><span class='pt14'>0</span></td></tr>
<tr><td class='ln' data-ln='64'></td><td><span> </span><span class='pt19'>for</span><span> i </span><span class='pt17'>:=</span><span> </span><span class='pt14'>0</span><span>; i </span><span class='pt17'><</span><span> </span><span class='pt16'>len</span><span>(s); i</span><span class='pt17'>++</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='65'></td><td><span> </span><span class='pt19'>if</span><span> s[i] </span><span class='pt17'>>=</span><span> utf8</span><span class='pt17'>.</span><span>RuneSelf {</span></td></tr>
<tr><td class='ln' data-ln='66'></td><td><span> newLen </span><span class='pt17'>+=</span><span> </span><span class='pt14'>3</span></td></tr>
<tr><td class='ln' data-ln='67'></td><td><span> } </span><span class='pt19'>else</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='68'></td><td><span> newLen</span><span class='pt17'>++</span></td></tr>
<tr><td class='ln' data-ln='69'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='70'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='71'></td><td><span> </span><span class='pt19'>if</span><span> newLen </span><span class='pt17'>==</span><span> </span><span class='pt16'>len</span><span>(s) {</span></td></tr>
<tr><td class='ln' data-ln='72'></td><td><span> </span><span class='pt19'>return</span><span> s</span></td></tr>
<tr><td class='ln' data-ln='73'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='74'></td><td><span> b </span><span class='pt17'>:=</span><span> </span><span class='pt16'>make</span><span>([]</span><span class='pt19'>byte</span><span class='pt24'>,</span><span> </span><span class='pt14'>0</span><span class='pt24'>,</span><span> newLen)</span></td></tr>
<tr><td class='ln' data-ln='75'></td><td><span> </span><span class='pt19'>for</span><span> i </span><span class='pt17'>:=</span><span> </span><span class='pt14'>0</span><span>; i </span><span class='pt17'><</span><span> </span><span class='pt16'>len</span><span>(s); i</span><span class='pt17'>++</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='76'></td><td><span> </span><span class='pt19'>if</span><span> s[i] </span><span class='pt17'>>=</span><span> utf8</span><span class='pt17'>.</span><span>RuneSelf {</span></td></tr>
<tr><td class='ln' data-ln='77'></td><td><span> b </span><span class='pt17'>=</span><span> </span><span class='pt16'>append</span><span>(b</span><span class='pt24'>,</span><span> </span><span class='pt12'>'%'</span><span>)</span></td></tr>
<tr><td class='ln' data-ln='78'></td><td><span> b </span><span class='pt17'>=</span><span> strconv</span><span class='pt17'>.</span><span class='pt22'>AppendInt</span><span>(b</span><span class='pt24'>,</span><span> </span><span class='pt19'>int64</span><span>(s[i])</span><span class='pt24'>,</span><span> </span><span class='pt14'>16</span><span>)</span></td></tr>
<tr><td class='ln' data-ln='79'></td><td><span> } </span><span class='pt19'>else</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='80'></td><td><span> b </span><span class='pt17'>=</span><span> </span><span class='pt16'>append</span><span>(b</span><span class='pt24'>,</span><span> s[i])</span></td></tr>
<tr><td class='ln' data-ln='81'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='82'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='83'></td><td><span> </span><span class='pt19'>return</span><span> </span><span class='pt19'>string</span><span>(b)</span></td></tr>
<tr><td class='ln' data-ln='84'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='85'></td><td> </td></tr>
<tr><td class='ln' data-ln='86'></td><td><span class='pt8 it'>// NoBody is an io.ReadCloser with no bytes. Read always returns EOF</span></td></tr>
<tr><td class='ln' data-ln='87'></td><td><span class='pt8 it'>// and Close always returns nil. It can be used in an outgoing client</span></td></tr>
<tr><td class='ln' data-ln='88'></td><td><span class='pt8 it'>// request to explicitly signal that a request has zero bytes.</span></td></tr>
<tr><td class='ln' data-ln='89'></td><td><span class='pt8 it'>// An alternative, however, is to simply set Request.Body to nil.</span></td></tr>
<tr><td class='ln' data-ln='90'></td><td><span class='pt19'>var</span><span> NoBody </span><span class='pt17'>=</span><span> noBody{}</span></td></tr>
<tr><td class='ln' data-ln='91'></td><td> </td></tr>
<tr><td class='ln' data-ln='92'></td><td><span class='pt19'>type</span><span> </span><span class='pt10'>noBody</span><span> </span><span class='pt19'>struct</span><span>{}</span></td></tr>
<tr><td class='ln' data-ln='93'></td><td> </td></tr>
<tr><td class='ln' data-ln='94'></td><td><span class='pt19'>func</span><span> (noBody) </span><span class='pt22'>Read</span><span>([]</span><span class='pt19'>byte</span><span>) (</span><span class='pt19'>int</span><span class='pt24'>,</span><span> </span><span class='pt19'>error</span><span>) { </span><span class='pt19'>return</span><span> </span><span class='pt14'>0</span><span class='pt24'>,</span><span> io</span><span class='pt17'>.</span><span>EOF }</span></td></tr>
<tr><td class='ln' data-ln='95'></td><td><span class='pt19'>func</span><span> (noBody) </span><span class='pt22'>Close</span><span>() </span><span class='pt19'>error</span><span> { </span><span class='pt19'>return</span><span> </span><span class='pt14'>nil</span><span> }</span></td></tr>
<tr><td class='ln' data-ln='96'></td><td><span class='pt19'>func</span><span> (noBody) </span><span class='pt22'>WriteTo</span><span>(io.Writer) (</span><span class='pt19'>int64</span><span class='pt24'>,</span><span> </span><span class='pt19'>error</span><span>) { </span><span class='pt19'>return</span><span> </span><span class='pt14'>0</span><span class='pt24'>,</span><span> </span><span class='pt14'>nil</span><span> }</span></td></tr>
<tr><td class='ln' data-ln='97'></td><td> </td></tr>
<tr><td class='ln' data-ln='98'></td><td><span class='pt19'>var</span><span> (</span></td></tr>
<tr><td class='ln' data-ln='99'></td><td><span> </span><span class='pt8 it'>// verify that an io.Copy from NoBody won't require a buffer:</span></td></tr>
<tr><td class='ln' data-ln='100'></td><td><span> _ io</span><span class='pt17'>.</span><span>WriterTo </span><span class='pt17'>=</span><span> NoBody</span></td></tr>
<tr><td class='ln' data-ln='101'></td><td><span> _ io</span><span class='pt17'>.</span><span>ReadCloser </span><span class='pt17'>=</span><span> NoBody</span></td></tr>
<tr><td class='ln' data-ln='102'></td><td><span>)</span></td></tr>
<tr><td class='ln' data-ln='103'></td><td> </td></tr>
<tr><td class='ln' data-ln='104'></td><td><span class='pt8 it'>// PushOptions describes options for Pusher.Push.</span></td></tr>
<tr><td class='ln' data-ln='105'></td><td><span class='pt19'>type</span><span> </span><span class='pt10'>PushOptions</span><span> </span><span class='pt19'>struct</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='106'></td><td><span> </span><span class='pt8 it'>// Method specifies the HTTP method for the promised request.</span></td></tr>
<tr><td class='ln' data-ln='107'></td><td><span> </span><span class='pt8 it'>// If set, it must be "GET" or "HEAD". Empty means "GET".</span></td></tr>
<tr><td class='ln' data-ln='108'></td><td><span> Method </span><span class='pt19'>string</span></td></tr>
<tr><td class='ln' data-ln='109'></td><td> </td></tr>
<tr><td class='ln' data-ln='110'></td><td><span> </span><span class='pt8 it'>// Header specifies additional promised request headers. This cannot</span></td></tr>
<tr><td class='ln' data-ln='111'></td><td><span> </span><span class='pt8 it'>// include HTTP/2 pseudo header fields like ":path" and ":scheme",</span></td></tr>
<tr><td class='ln' data-ln='112'></td><td><span> </span><span class='pt8 it'>// which will be added automatically.</span></td></tr>
<tr><td class='ln' data-ln='113'></td><td><span> Header Header</span></td></tr>
<tr><td class='ln' data-ln='114'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='115'></td><td> </td></tr>
<tr><td class='ln' data-ln='116'></td><td><span class='pt8 it'>// Pusher is the interface implemented by ResponseWriters that support</span></td></tr>
<tr><td class='ln' data-ln='117'></td><td><span class='pt8 it'>// HTTP/2 server push. For more background, see</span></td></tr>
<tr><td class='ln' data-ln='118'></td><td><span class='pt8 it'>// https://tools.ietf.org/html/rfc7540#section-8.2.</span></td></tr>
<tr><td class='ln' data-ln='119'></td><td><span class='pt19'>type</span><span> </span><span class='pt10'>Pusher</span><span> </span><span class='pt19'>interface</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='120'></td><td><span> </span><span class='pt8 it'>// Push initiates an HTTP/2 server push. This constructs a synthetic</span></td></tr>
<tr><td class='ln' data-ln='121'></td><td><span> </span><span class='pt8 it'>// request using the given target and options, serializes that request</span></td></tr>
<tr><td class='ln' data-ln='122'></td><td><span> </span><span class='pt8 it'>// into a PUSH_PROMISE frame, then dispatches that request using the</span></td></tr>
<tr><td class='ln' data-ln='123'></td><td><span> </span><span class='pt8 it'>// server's request handler. If opts is nil, default options are used.</span></td></tr>
<tr><td class='ln' data-ln='124'></td><td><span> </span><span class='pt8 it'>//</span></td></tr>
<tr><td class='ln' data-ln='125'></td><td><span> </span><span class='pt8 it'>// The target must either be an absolute path (like "/path") or an absolute</span></td></tr>
<tr><td class='ln' data-ln='126'></td><td><span> </span><span class='pt8 it'>// URL that contains a valid host and the same scheme as the parent request.</span></td></tr>
<tr><td class='ln' data-ln='127'></td><td><span> </span><span class='pt8 it'>// If the target is a path, it will inherit the scheme and host of the</span></td></tr>
<tr><td class='ln' data-ln='128'></td><td><span> </span><span class='pt8 it'>// parent request.</span></td></tr>
<tr><td class='ln' data-ln='129'></td><td><span> </span><span class='pt8 it'>//</span></td></tr>
<tr><td class='ln' data-ln='130'></td><td><span> </span><span class='pt8 it'>// The HTTP/2 spec disallows recursive pushes and cross-authority pushes.</span></td></tr>
<tr><td class='ln' data-ln='131'></td><td><span> </span><span class='pt8 it'>// Push may or may not detect these invalid pushes; however, invalid</span></td></tr>
<tr><td class='ln' data-ln='132'></td><td><span> </span><span class='pt8 it'>// pushes will be detected and canceled by conforming clients.</span></td></tr>
<tr><td class='ln' data-ln='133'></td><td><span> </span><span class='pt8 it'>//</span></td></tr>
<tr><td class='ln' data-ln='134'></td><td><span> </span><span class='pt8 it'>// Handlers that wish to push URL X should call Push before sending any</span></td></tr>
<tr><td class='ln' data-ln='135'></td><td><span> </span><span class='pt8 it'>// data that may trigger a request for URL X. This avoids a race where the</span></td></tr>
<tr><td class='ln' data-ln='136'></td><td><span> </span><span class='pt8 it'>// client issues requests for X before receiving the PUSH_PROMISE for X.</span></td></tr>
<tr><td class='ln' data-ln='137'></td><td><span> </span><span class='pt8 it'>//</span></td></tr>
<tr><td class='ln' data-ln='138'></td><td><span> </span><span class='pt8 it'>// Push returns ErrNotSupported if the client has disabled push or if push</span></td></tr>
<tr><td class='ln' data-ln='139'></td><td><span> </span><span class='pt8 it'>// is not supported on the underlying connection.</span></td></tr>
<tr><td class='ln' data-ln='140'></td><td><span> </span><span class='pt22'>Push</span><span>(target </span><span class='pt19'>string</span><span class='pt24'>,</span><span> opts </span><span class='pt17'>*</span><span>PushOptions) </span><span class='pt19'>error</span></td></tr>
<tr><td class='ln' data-ln='141'></td><td><span>}</span></td></tr>
</table>
</div>
</div>
</div>
<div class='style' id='P--cobalt2--go'>
<div class='P--cobalt2-bordered'>
<div class="info header">
<span class="left">http.go</span>
<span class="right"><span>141 lines</span><span>4.26 KB</span></span>
</div>
<div class='P--cobalt2'>
<table>
<tr><td class='ln' data-ln='1'></td><td><span class='pt19 it'>// Copyright 2016 The Go Authors. All rights reserved.</span></td></tr>
<tr><td class='ln' data-ln='2'></td><td><span class='pt19 it'>// Use of this source code is governed by a BSD-style</span></td></tr>
<tr><td class='ln' data-ln='3'></td><td><span class='pt19 it'>// license that can be found in the LICENSE file.</span></td></tr>
<tr><td class='ln' data-ln='4'></td><td> </td></tr>
<tr><td class='ln' data-ln='5'></td><td><span class='pt56'>package</span><span> http</span></td></tr>
<tr><td class='ln' data-ln='6'></td><td> </td></tr>
<tr><td class='ln' data-ln='7'></td><td class='hi'><span class='pt56'>import</span><span> </span><span class='pt43'>(</span></td></tr>
<tr><td class='ln' data-ln='8'></td><td class='hi'><span> </span><span class='pt23'>"io"</span></td></tr>
<tr><td class='ln' data-ln='9'></td><td class='hi'><span> </span><span class='pt23'>"strconv"</span></td></tr>
<tr><td class='ln' data-ln='10'></td><td class='hi'><span> </span><span class='pt23'>"strings"</span></td></tr>
<tr><td class='ln' data-ln='11'></td><td class='hi'><span> </span><span class='pt23'>"time"</span></td></tr>
<tr><td class='ln' data-ln='12'></td><td class='hi'><span> </span><span class='pt23'>"unicode/utf8"</span></td></tr>
<tr><td class='ln' data-ln='13'></td><td class='hi'> </td></tr>
<tr><td class='ln' data-ln='14'></td><td class='hi'><span> </span><span class='pt23'>"golang_org/x/net/lex/httplex"</span></td></tr>
<tr><td class='ln' data-ln='15'></td><td class='hi'><span class='pt43'>)</span></td></tr>
<tr><td class='ln' data-ln='16'></td><td> </td></tr>
<tr><td class='ln' data-ln='17'></td><td><span class='pt19 it'>// maxInt64 is the effective "infinite" value for the Server and</span></td></tr>
<tr><td class='ln' data-ln='18'></td><td><span class='pt19 it'>// Transport's byte-limiting readers.</span></td></tr>
<tr><td class='ln' data-ln='19'></td><td><span class='pt60'>const</span><span> maxInt64 </span><span class='pt56'>=</span><span> </span><span class='pt54'>1</span><span class='pt56'><<</span><span class='pt54'>63</span><span> </span><span class='pt56'>-</span><span> </span><span class='pt54'>1</span></td></tr>
<tr><td class='ln' data-ln='20'></td><td> </td></tr>
<tr><td class='ln' data-ln='21'></td><td><span class='pt19 it'>// aLongTimeAgo is a non-zero time, far in the past, used for</span></td></tr>
<tr><td class='ln' data-ln='22'></td><td><span class='pt19 it'>// immediate cancelation of network operations.</span></td></tr>
<tr><td class='ln' data-ln='23'></td><td><span class='pt60'>var</span><span> </span><span class='pt41 pt4'>aLongTimeAgo</span><span> </span><span class='pt56'>=</span><span> time</span><span class='pt43'>.</span><span class='pt62'>Unix</span><span class='pt43'>(</span><span class='pt54'>1</span><span class='pt43'>,</span><span> </span><span class='pt54'>0</span><span class='pt43'>)</span></td></tr>
<tr><td class='ln' data-ln='24'></td><td> </td></tr>
<tr><td class='ln' data-ln='25'></td><td><span class='pt19 it'>// TODO(bradfitz): move common stuff here. The other files have accumulated</span></td></tr>
<tr><td class='ln' data-ln='26'></td><td><span class='pt19 it'>// generic http stuff in random places.</span></td></tr>
<tr><td class='ln' data-ln='27'></td><td> </td></tr>
<tr><td class='ln' data-ln='28'></td><td><span class='pt19 it'>// contextKey is a value for use with context.WithValue. It's used as</span></td></tr>
<tr><td class='ln' data-ln='29'></td><td><span class='pt19 it'>// a pointer so it fits in an interface{} without allocation.</span></td></tr>
<tr><td class='ln' data-ln='30'></td><td><span class='pt60'>type</span><span> </span><span class='pt60'>contextKey</span><span> </span><span class='pt60'>struct</span><span> </span><span class='pt43'>{</span></td></tr>
<tr><td class='ln' data-ln='31'></td><td><span> </span><span class='pt41 pt4'>name</span><span> </span><span class='pt60'>string</span></td></tr>
<tr><td class='ln' data-ln='32'></td><td><span class='pt43'>}</span></td></tr>
<tr><td class='ln' data-ln='33'></td><td> </td></tr>
<tr><td class='ln' data-ln='34'></td><td><span class='pt60'>func</span><span> </span><span class='pt43'>(</span><span class='pt41 pt4'>k</span><span> </span><span class='pt56'>*</span><span>contextKey</span><span class='pt43'>)</span><span> </span><span class='pt60'>String</span><span class='pt43'>()</span><span> </span><span class='pt60'>string</span><span> </span><span class='pt43'>{</span><span> </span><span class='pt56'>return</span><span> </span><span class='pt23'>"net/http context value "</span><span> </span><span class='pt56'>+</span><span> k</span><span class='pt43'>.</span><span class='pt41 pt4'>name</span><span> </span><span class='pt43'>}</span></td></tr>
<tr><td class='ln' data-ln='35'></td><td> </td></tr>
<tr><td class='ln' data-ln='36'></td><td><span class='pt19 it'>// Given a string of the form "host", "host:port", or "[ipv6::address]:port",</span></td></tr>
<tr><td class='ln' data-ln='37'></td><td><span class='pt19 it'>// return true if the string includes a port.</span></td></tr>
<tr><td class='ln' data-ln='38'></td><td><span class='pt60'>func</span><span> </span><span class='pt60'>hasPort</span><span class='pt43'>(</span><span class='pt41 pt4'>s</span><span> </span><span class='pt60'>string</span><span class='pt43'>)</span><span> </span><span class='pt60'>bool</span><span> </span><span class='pt43'>{</span><span> </span><span class='pt56'>return</span><span> strings</span><span class='pt43'>.</span><span class='pt62'>LastIndex</span><span class='pt43'>(</span><span>s</span><span class='pt43'>,</span><span> </span><span class='pt23'>":"</span><span class='pt43'>)</span><span> </span><span class='pt56'>></span><span> strings</span><span class='pt43'>.</span><span class='pt62'>LastIndex</span><span class='pt43'>(</span><span>s</span><span class='pt43'>,</span><span> </span><span class='pt23'>"]"</span><span class='pt43'>)</span><span> </span><span class='pt43'>}</span></td></tr>
<tr><td class='ln' data-ln='39'></td><td> </td></tr>
<tr><td class='ln' data-ln='40'></td><td><span class='pt19 it'>// removeEmptyPort strips the empty port in ":port" to ""</span></td></tr>
<tr><td class='ln' data-ln='41'></td><td><span class='pt19 it'>// as mandated by RFC 3986 Section 6.2.3.</span></td></tr>
<tr><td class='ln' data-ln='42'></td><td><span class='pt60'>func</span><span> </span><span class='pt60'>removeEmptyPort</span><span class='pt43'>(</span><span class='pt41 pt4'>host</span><span> </span><span class='pt60'>string</span><span class='pt43'>)</span><span> </span><span class='pt60'>string</span><span> </span><span class='pt43'>{</span></td></tr>
<tr><td class='ln' data-ln='43'></td><td><span> </span><span class='pt56'>if</span><span> </span><span class='pt62'>hasPort</span><span class='pt43'>(</span><span>host</span><span class='pt43'>)</span><span> </span><span class='pt43'>{</span></td></tr>
<tr><td class='ln' data-ln='44'></td><td><span> </span><span class='pt56'>return</span><span> strings</span><span class='pt43'>.</span><span class='pt62'>TrimSuffix</span><span class='pt43'>(</span><span>host</span><span class='pt43'>,</span><span> </span><span class='pt23'>":"</span><span class='pt43'>)</span></td></tr>
<tr><td class='ln' data-ln='45'></td><td><span> </span><span class='pt43'>}</span></td></tr>
<tr><td class='ln' data-ln='46'></td><td><span> </span><span class='pt56'>return</span><span> host</span></td></tr>
<tr><td class='ln' data-ln='47'></td><td><span class='pt43'>}</span></td></tr>
<tr><td class='ln' data-ln='48'></td><td> </td></tr>
<tr><td class='ln' data-ln='49'></td><td><span class='pt60'>func</span><span> </span><span class='pt60'>isNotToken</span><span class='pt43'>(</span><span class='pt41 pt4'>r</span><span> </span><span class='pt60'>rune</span><span class='pt43'>)</span><span> </span><span class='pt60'>bool</span><span> </span><span class='pt43'>{</span></td></tr>
<tr><td class='ln' data-ln='50'></td><td><span> </span><span class='pt56'>return</span><span> </span><span class='pt56'>!</span><span>httplex</span><span class='pt43'>.</span><span class='pt62'>IsTokenRune</span><span class='pt43'>(</span><span>r</span><span class='pt43'>)</span></td></tr>
<tr><td class='ln' data-ln='51'></td><td><span class='pt43'>}</span></td></tr>
<tr><td class='ln' data-ln='52'></td><td> </td></tr>
<tr><td class='ln' data-ln='53'></td><td><span class='pt60'>func</span><span> </span><span class='pt60'>isASCII</span><span class='pt43'>(</span><span class='pt41 pt4'>s</span><span> </span><span class='pt60'>string</span><span class='pt43'>)</span><span> </span><span class='pt60'>bool</span><span> </span><span class='pt43'>{</span></td></tr>
<tr><td class='ln' data-ln='54'></td><td><span> </span><span class='pt56'>for</span><span> </span><span class='pt41 pt4'>i</span><span> </span><span class='pt56'>:=</span><span> </span><span class='pt54'>0</span><span>; i </span><span class='pt56'><</span><span> </span><span class='pt58'>len</span><span class='pt43'>(</span><span>s</span><span class='pt43'>)</span><span>; i</span><span class='pt56'>++</span><span> </span><span class='pt43'>{</span></td></tr>
<tr><td class='ln' data-ln='55'></td><td><span> </span><span class='pt56'>if</span><span> s</span><span class='pt43'>[</span><span>i</span><span class='pt43'>]</span><span> </span><span class='pt56'>>=</span><span> utf8</span><span class='pt43'>.</span><span class='pt41 pt4'>RuneSelf</span><span> </span><span class='pt43'>{</span></td></tr>
<tr><td class='ln' data-ln='56'></td><td><span> </span><span class='pt56'>return</span><span> </span><span class='pt54'>false</span></td></tr>
<tr><td class='ln' data-ln='57'></td><td><span> </span><span class='pt43'>}</span></td></tr>
<tr><td class='ln' data-ln='58'></td><td><span> </span><span class='pt43'>}</span></td></tr>
<tr><td class='ln' data-ln='59'></td><td><span> </span><span class='pt56'>return</span><span> </span><span class='pt54'>true</span></td></tr>
<tr><td class='ln' data-ln='60'></td><td><span class='pt43'>}</span></td></tr>
<tr><td class='ln' data-ln='61'></td><td> </td></tr>
<tr><td class='ln' data-ln='62'></td><td><span class='pt60'>func</span><span> </span><span class='pt60'>hexEscapeNonASCII</span><span class='pt43'>(</span><span class='pt41 pt4'>s</span><span> </span><span class='pt60'>string</span><span class='pt43'>)</span><span> </span><span class='pt60'>string</span><span> </span><span class='pt43'>{</span></td></tr>
<tr><td class='ln' data-ln='63'></td><td><span> </span><span class='pt41 pt4'>newLen</span><span> </span><span class='pt56'>:=</span><span> </span><span class='pt54'>0</span></td></tr>
<tr><td class='ln' data-ln='64'></td><td><span> </span><span class='pt56'>for</span><span> </span><span class='pt41 pt4'>i</span><span> </span><span class='pt56'>:=</span><span> </span><span class='pt54'>0</span><span>; i </span><span class='pt56'><</span><span> </span><span class='pt58'>len</span><span class='pt43'>(</span><span>s</span><span class='pt43'>)</span><span>; i</span><span class='pt56'>++</span><span> </span><span class='pt43'>{</span></td></tr>
<tr><td class='ln' data-ln='65'></td><td><span> </span><span class='pt56'>if</span><span> s</span><span class='pt43'>[</span><span>i</span><span class='pt43'>]</span><span> </span><span class='pt56'>>=</span><span> utf8</span><span class='pt43'>.</span><span class='pt41 pt4'>RuneSelf</span><span> </span><span class='pt43'>{</span></td></tr>
<tr><td class='ln' data-ln='66'></td><td><span> newLen </span><span class='pt56'>+=</span><span> </span><span class='pt54'>3</span></td></tr>
<tr><td class='ln' data-ln='67'></td><td><span> </span><span class='pt43'>}</span><span> </span><span class='pt56'>else</span><span> </span><span class='pt43'>{</span></td></tr>
<tr><td class='ln' data-ln='68'></td><td><span> newLen</span><span class='pt56'>++</span></td></tr>
<tr><td class='ln' data-ln='69'></td><td><span> </span><span class='pt43'>}</span></td></tr>
<tr><td class='ln' data-ln='70'></td><td><span> </span><span class='pt43'>}</span></td></tr>
<tr><td class='ln' data-ln='71'></td><td><span> </span><span class='pt56'>if</span><span> newLen </span><span class='pt56'>==</span><span> </span><span class='pt58'>len</span><span class='pt43'>(</span><span>s</span><span class='pt43'>)</span><span> </span><span class='pt43'>{</span></td></tr>
<tr><td class='ln' data-ln='72'></td><td><span> </span><span class='pt56'>return</span><span> s</span></td></tr>
<tr><td class='ln' data-ln='73'></td><td><span> </span><span class='pt43'>}</span></td></tr>
<tr><td class='ln' data-ln='74'></td><td><span> </span><span class='pt41 pt4'>b</span><span> </span><span class='pt56'>:=</span><span> </span><span class='pt58'>make</span><span class='pt43'>([]</span><span class='pt60'>byte</span><span class='pt43'>,</span><span> </span><span class='pt54'>0</span><span class='pt43'>,</span><span> newLen</span><span class='pt43'>)</span></td></tr>
<tr><td class='ln' data-ln='75'></td><td><span> </span><span class='pt56'>for</span><span> </span><span class='pt41 pt4'>i</span><span> </span><span class='pt56'>:=</span><span> </span><span class='pt54'>0</span><span>; i </span><span class='pt56'><</span><span> </span><span class='pt58'>len</span><span class='pt43'>(</span><span>s</span><span class='pt43'>)</span><span>; i</span><span class='pt56'>++</span><span> </span><span class='pt43'>{</span></td></tr>
<tr><td class='ln' data-ln='76'></td><td><span> </span><span class='pt56'>if</span><span> s</span><span class='pt43'>[</span><span>i</span><span class='pt43'>]</span><span> </span><span class='pt56'>>=</span><span> utf8</span><span class='pt43'>.</span><span class='pt41 pt4'>RuneSelf</span><span> </span><span class='pt43'>{</span></td></tr>
<tr><td class='ln' data-ln='77'></td><td><span> b </span><span class='pt56'>=</span><span> </span><span class='pt58'>append</span><span class='pt43'>(</span><span>b</span><span class='pt43'>,</span><span> </span><span class='pt23'>'%'</span><span class='pt43'>)</span></td></tr>
<tr><td class='ln' data-ln='78'></td><td><span> b </span><span class='pt56'>=</span><span> strconv</span><span class='pt43'>.</span><span class='pt62'>AppendInt</span><span class='pt43'>(</span><span>b</span><span class='pt43'>,</span><span> </span><span class='pt60'>int64</span><span class='pt43'>(</span><span>s</span><span class='pt43'>[</span><span>i</span><span class='pt43'>]),</span><span> </span><span class='pt54'>16</span><span class='pt43'>)</span></td></tr>
<tr><td class='ln' data-ln='79'></td><td><span> </span><span class='pt43'>}</span><span> </span><span class='pt56'>else</span><span> </span><span class='pt43'>{</span></td></tr>
<tr><td class='ln' data-ln='80'></td><td><span> b </span><span class='pt56'>=</span><span> </span><span class='pt58'>append</span><span class='pt43'>(</span><span>b</span><span class='pt43'>,</span><span> s</span><span class='pt43'>[</span><span>i</span><span class='pt43'>])</span></td></tr>
<tr><td class='ln' data-ln='81'></td><td><span> </span><span class='pt43'>}</span></td></tr>
<tr><td class='ln' data-ln='82'></td><td><span> </span><span class='pt43'>}</span></td></tr>
<tr><td class='ln' data-ln='83'></td><td><span> </span><span class='pt56'>return</span><span> </span><span class='pt60'>string</span><span class='pt43'>(</span><span>b</span><span class='pt43'>)</span></td></tr>
<tr><td class='ln' data-ln='84'></td><td><span class='pt43'>}</span></td></tr>
<tr><td class='ln' data-ln='85'></td><td> </td></tr>
<tr><td class='ln' data-ln='86'></td><td><span class='pt19 it'>// NoBody is an io.ReadCloser with no bytes. Read always returns EOF</span></td></tr>
<tr><td class='ln' data-ln='87'></td><td><span class='pt19 it'>// and Close always returns nil. It can be used in an outgoing client</span></td></tr>
<tr><td class='ln' data-ln='88'></td><td><span class='pt19 it'>// request to explicitly signal that a request has zero bytes.</span></td></tr>
<tr><td class='ln' data-ln='89'></td><td><span class='pt19 it'>// An alternative, however, is to simply set Request.Body to nil.</span></td></tr>
<tr><td class='ln' data-ln='90'></td><td><span class='pt60'>var</span><span> </span><span class='pt41 pt4'>NoBody</span><span> </span><span class='pt56'>=</span><span> noBody{}</span></td></tr>
<tr><td class='ln' data-ln='91'></td><td> </td></tr>
<tr><td class='ln' data-ln='92'></td><td><span class='pt60'>type</span><span> </span><span class='pt60'>noBody</span><span> </span><span class='pt60'>struct</span><span class='pt43'>{}</span></td></tr>
<tr><td class='ln' data-ln='93'></td><td> </td></tr>
<tr><td class='ln' data-ln='94'></td><td><span class='pt60'>func</span><span> </span><span class='pt43'>(</span><span>noBody</span><span class='pt43'>)</span><span> </span><span class='pt60'>Read</span><span class='pt43'>([]</span><span class='pt60'>byte</span><span class='pt43'>)</span><span> </span><span class='pt43'>(</span><span class='pt60'>int</span><span class='pt43'>,</span><span> </span><span class='pt60'>error</span><span class='pt43'>)</span><span> </span><span class='pt43'>{</span><span> </span><span class='pt56'>return</span><span> </span><span class='pt54'>0</span><span class='pt43'>,</span><span> io</span><span class='pt43'>.</span><span class='pt41 pt4'>EOF</span><span> </span><span class='pt43'>}</span></td></tr>
<tr><td class='ln' data-ln='95'></td><td><span class='pt60'>func</span><span> </span><span class='pt43'>(</span><span>noBody</span><span class='pt43'>)</span><span> </span><span class='pt60'>Close</span><span class='pt43'>()</span><span> </span><span class='pt60'>error</span><span> </span><span class='pt43'>{</span><span> </span><span class='pt56'>return</span><span> </span><span class='pt54'>nil</span><span> </span><span class='pt43'>}</span></td></tr>
<tr><td class='ln' data-ln='96'></td><td><span class='pt60'>func</span><span> </span><span class='pt43'>(</span><span>noBody</span><span class='pt43'>)</span><span> </span><span class='pt60'>WriteTo</span><span class='pt43'>(</span><span>io.Writer</span><span class='pt43'>)</span><span> </span><span class='pt43'>(</span><span class='pt60'>int64</span><span class='pt43'>,</span><span> </span><span class='pt60'>error</span><span class='pt43'>)</span><span> </span><span class='pt43'>{</span><span> </span><span class='pt56'>return</span><span> </span><span class='pt54'>0</span><span class='pt43'>,</span><span> </span><span class='pt54'>nil</span><span> </span><span class='pt43'>}</span></td></tr>
<tr><td class='ln' data-ln='97'></td><td> </td></tr>
<tr><td class='ln' data-ln='98'></td><td><span class='pt60'>var</span><span> </span><span class='pt43'>(</span></td></tr>
<tr><td class='ln' data-ln='99'></td><td><span> </span><span class='pt19 it'>// verify that an io.Copy from NoBody won't require a buffer:</span></td></tr>
<tr><td class='ln' data-ln='100'></td><td><span> </span><span class='pt41 pt4'>_</span><span> io</span><span class='pt43'>.</span><span class='pt41 pt4'>WriterTo</span><span> </span><span class='pt56'>=</span><span> NoBody</span></td></tr>
<tr><td class='ln' data-ln='101'></td><td><span> </span><span class='pt41 pt4'>_</span><span> io</span><span class='pt43'>.</span><span class='pt41 pt4'>ReadCloser</span><span> </span><span class='pt56'>=</span><span> NoBody</span></td></tr>
<tr><td class='ln' data-ln='102'></td><td><span class='pt43'>)</span></td></tr>
<tr><td class='ln' data-ln='103'></td><td> </td></tr>
<tr><td class='ln' data-ln='104'></td><td><span class='pt19 it'>// PushOptions describes options for Pusher.Push.</span></td></tr>
<tr><td class='ln' data-ln='105'></td><td><span class='pt60'>type</span><span> </span><span class='pt60'>PushOptions</span><span> </span><span class='pt60'>struct</span><span> </span><span class='pt43'>{</span></td></tr>
<tr><td class='ln' data-ln='106'></td><td><span> </span><span class='pt19 it'>// Method specifies the HTTP method for the promised request.</span></td></tr>
<tr><td class='ln' data-ln='107'></td><td><span> </span><span class='pt19 it'>// If set, it must be "GET" or "HEAD". Empty means "GET".</span></td></tr>
<tr><td class='ln' data-ln='108'></td><td><span> </span><span class='pt41 pt4'>Method</span><span> </span><span class='pt60'>string</span></td></tr>
<tr><td class='ln' data-ln='109'></td><td> </td></tr>
<tr><td class='ln' data-ln='110'></td><td><span> </span><span class='pt19 it'>// Header specifies additional promised request headers. This cannot</span></td></tr>
<tr><td class='ln' data-ln='111'></td><td><span> </span><span class='pt19 it'>// include HTTP/2 pseudo header fields like ":path" and ":scheme",</span></td></tr>
<tr><td class='ln' data-ln='112'></td><td><span> </span><span class='pt19 it'>// which will be added automatically.</span></td></tr>
<tr><td class='ln' data-ln='113'></td><td><span> </span><span class='pt41 pt4'>Header</span><span> Header</span></td></tr>
<tr><td class='ln' data-ln='114'></td><td><span class='pt43'>}</span></td></tr>
<tr><td class='ln' data-ln='115'></td><td> </td></tr>
<tr><td class='ln' data-ln='116'></td><td><span class='pt19 it'>// Pusher is the interface implemented by ResponseWriters that support</span></td></tr>
<tr><td class='ln' data-ln='117'></td><td><span class='pt19 it'>// HTTP/2 server push. For more background, see</span></td></tr>
<tr><td class='ln' data-ln='118'></td><td><span class='pt19 it'>// https://tools.ietf.org/html/rfc7540#section-8.2.</span></td></tr>
<tr><td class='ln' data-ln='119'></td><td><span class='pt60'>type</span><span> </span><span class='pt60'>Pusher</span><span> </span><span class='pt60'>interface</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='120'></td><td><span> </span><span class='pt19 it'>// Push initiates an HTTP/2 server push. This constructs a synthetic</span></td></tr>
<tr><td class='ln' data-ln='121'></td><td><span> </span><span class='pt19 it'>// request using the given target and options, serializes that request</span></td></tr>
<tr><td class='ln' data-ln='122'></td><td><span> </span><span class='pt19 it'>// into a PUSH_PROMISE frame, then dispatches that request using the</span></td></tr>
<tr><td class='ln' data-ln='123'></td><td><span> </span><span class='pt19 it'>// server's request handler. If opts is nil, default options are used.</span></td></tr>
<tr><td class='ln' data-ln='124'></td><td><span> </span><span class='pt19 it'>//</span></td></tr>
<tr><td class='ln' data-ln='125'></td><td><span> </span><span class='pt19 it'>// The target must either be an absolute path (like "/path") or an absolute</span></td></tr>
<tr><td class='ln' data-ln='126'></td><td><span> </span><span class='pt19 it'>// URL that contains a valid host and the same scheme as the parent request.</span></td></tr>
<tr><td class='ln' data-ln='127'></td><td><span> </span><span class='pt19 it'>// If the target is a path, it will inherit the scheme and host of the</span></td></tr>
<tr><td class='ln' data-ln='128'></td><td><span> </span><span class='pt19 it'>// parent request.</span></td></tr>
<tr><td class='ln' data-ln='129'></td><td><span> </span><span class='pt19 it'>//</span></td></tr>
<tr><td class='ln' data-ln='130'></td><td><span> </span><span class='pt19 it'>// The HTTP/2 spec disallows recursive pushes and cross-authority pushes.</span></td></tr>
<tr><td class='ln' data-ln='131'></td><td><span> </span><span class='pt19 it'>// Push may or may not detect these invalid pushes; however, invalid</span></td></tr>
<tr><td class='ln' data-ln='132'></td><td><span> </span><span class='pt19 it'>// pushes will be detected and canceled by conforming clients.</span></td></tr>
<tr><td class='ln' data-ln='133'></td><td><span> </span><span class='pt19 it'>//</span></td></tr>
<tr><td class='ln' data-ln='134'></td><td><span> </span><span class='pt19 it'>// Handlers that wish to push URL X should call Push before sending any</span></td></tr>
<tr><td class='ln' data-ln='135'></td><td><span> </span><span class='pt19 it'>// data that may trigger a request for URL X. This avoids a race where the</span></td></tr>
<tr><td class='ln' data-ln='136'></td><td><span> </span><span class='pt19 it'>// client issues requests for X before receiving the PUSH_PROMISE for X.</span></td></tr>
<tr><td class='ln' data-ln='137'></td><td><span> </span><span class='pt19 it'>//</span></td></tr>
<tr><td class='ln' data-ln='138'></td><td><span> </span><span class='pt19 it'>// Push returns ErrNotSupported if the client has disabled push or if push</span></td></tr>
<tr><td class='ln' data-ln='139'></td><td><span> </span><span class='pt19 it'>// is not supported on the underlying connection.</span></td></tr>
<tr><td class='ln' data-ln='140'></td><td><span> </span><span class='pt62'>Push</span><span class='pt43'>(</span><span>target </span><span class='pt60'>string</span><span class='pt43'>,</span><span> opts </span><span class='pt56'>*</span><span>PushOptions</span><span class='pt43'>)</span><span> </span><span class='pt60'>error</span></td></tr>
<tr><td class='ln' data-ln='141'></td><td><span>}</span></td></tr>
</table>
</div>
</div>
</div>
<div class='style' id='P--dracula--go'>
<div class='P--dracula-bordered'>
<div class="info header">
<span class="left">http.go</span>
<span class="right"><span>141 lines</span><span>4.26 KB</span></span>
</div>
<div class='P--dracula'>
<table>
<tr><td class='ln' data-ln='1'></td><td><span class='pt2'>// Copyright 2016 The Go Authors. All rights reserved.</span></td></tr>
<tr><td class='ln' data-ln='2'></td><td><span class='pt2'>// Use of this source code is governed by a BSD-style</span></td></tr>
<tr><td class='ln' data-ln='3'></td><td><span class='pt2'>// license that can be found in the LICENSE file.</span></td></tr>
<tr><td class='ln' data-ln='4'></td><td> </td></tr>
<tr><td class='ln' data-ln='5'></td><td><span class='pt9'>package</span><span> http</span></td></tr>
<tr><td class='ln' data-ln='6'></td><td> </td></tr>
<tr><td class='ln' data-ln='7'></td><td class='hi'><span class='pt9'>import</span><span> (</span></td></tr>
<tr><td class='ln' data-ln='8'></td><td class='hi'><span> </span><span class='pt6'>"</span><span class='pt7'>io</span><span class='pt6'>"</span></td></tr>
<tr><td class='ln' data-ln='9'></td><td class='hi'><span> </span><span class='pt6'>"</span><span class='pt7'>strconv</span><span class='pt6'>"</span></td></tr>
<tr><td class='ln' data-ln='10'></td><td class='hi'><span> </span><span class='pt6'>"</span><span class='pt7'>strings</span><span class='pt6'>"</span></td></tr>
<tr><td class='ln' data-ln='11'></td><td class='hi'><span> </span><span class='pt6'>"</span><span class='pt7'>time</span><span class='pt6'>"</span></td></tr>
<tr><td class='ln' data-ln='12'></td><td class='hi'><span> </span><span class='pt6'>"</span><span class='pt7'>unicode/utf8</span><span class='pt6'>"</span></td></tr>
<tr><td class='ln' data-ln='13'></td><td class='hi'> </td></tr>
<tr><td class='ln' data-ln='14'></td><td class='hi'><span> </span><span class='pt6'>"</span><span class='pt7'>golang_org/x/net/lex/httplex</span><span class='pt6'>"</span></td></tr>
<tr><td class='ln' data-ln='15'></td><td class='hi'><span>)</span></td></tr>
<tr><td class='ln' data-ln='16'></td><td> </td></tr>
<tr><td class='ln' data-ln='17'></td><td><span class='pt2'>// maxInt64 is the effective "infinite" value for the Server and</span></td></tr>
<tr><td class='ln' data-ln='18'></td><td><span class='pt2'>// Transport's byte-limiting readers.</span></td></tr>
<tr><td class='ln' data-ln='19'></td><td><span class='pt9'>const</span><span> maxInt64 </span><span class='pt9'>=</span><span> </span><span class='pt5'>1</span><span class='pt9'><<</span><span class='pt5'>63</span><span> </span><span class='pt9'>-</span><span> </span><span class='pt5'>1</span></td></tr>
<tr><td class='ln' data-ln='20'></td><td> </td></tr>
<tr><td class='ln' data-ln='21'></td><td><span class='pt2'>// aLongTimeAgo is a non-zero time, far in the past, used for</span></td></tr>
<tr><td class='ln' data-ln='22'></td><td><span class='pt2'>// immediate cancelation of network operations.</span></td></tr>
<tr><td class='ln' data-ln='23'></td><td><span class='pt9'>var</span><span> aLongTimeAgo </span><span class='pt9'>=</span><span> time.</span><span class='pt3'>Unix</span><span>(</span><span class='pt5'>1</span><span>, </span><span class='pt5'>0</span><span>)</span></td></tr>
<tr><td class='ln' data-ln='24'></td><td> </td></tr>
<tr><td class='ln' data-ln='25'></td><td><span class='pt2'>// TODO(bradfitz): move common stuff here. The other files have accumulated</span></td></tr>
<tr><td class='ln' data-ln='26'></td><td><span class='pt2'>// generic http stuff in random places.</span></td></tr>
<tr><td class='ln' data-ln='27'></td><td> </td></tr>
<tr><td class='ln' data-ln='28'></td><td><span class='pt2'>// contextKey is a value for use with context.WithValue. It's used as</span></td></tr>
<tr><td class='ln' data-ln='29'></td><td><span class='pt2'>// a pointer so it fits in an interface{} without allocation.</span></td></tr>
<tr><td class='ln' data-ln='30'></td><td><span class='pt9'>type</span><span> </span><span class='pt3 it'>contextKey</span><span> </span><span class='pt9'>struct</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='31'></td><td><span> name </span><span class='pt9'>string</span></td></tr>
<tr><td class='ln' data-ln='32'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='33'></td><td> </td></tr>
<tr><td class='ln' data-ln='34'></td><td><span class='pt9'>func</span><span> (</span><span class='pt10 it'>k</span><span> </span><span class='pt9'>*</span><span>contextKey) </span><span class='pt1'>String</span><span>() </span><span class='pt9'>string</span><span> { </span><span class='pt9'>return</span><span> </span><span class='pt6'>"</span><span class='pt7'>net/http context value </span><span class='pt6'>"</span><span> </span><span class='pt9'>+</span><span> k.name }</span></td></tr>
<tr><td class='ln' data-ln='35'></td><td> </td></tr>
<tr><td class='ln' data-ln='36'></td><td><span class='pt2'>// Given a string of the form "host", "host:port", or "[ipv6::address]:port",</span></td></tr>
<tr><td class='ln' data-ln='37'></td><td><span class='pt2'>// return true if the string includes a port.</span></td></tr>
<tr><td class='ln' data-ln='38'></td><td><span class='pt9'>func</span><span> </span><span class='pt1'>hasPort</span><span>(</span><span class='pt10 it'>s</span><span> </span><span class='pt9'>string</span><span>) </span><span class='pt9'>bool</span><span> { </span><span class='pt9'>return</span><span> strings.</span><span class='pt3'>LastIndex</span><span>(s, </span><span class='pt6'>"</span><span class='pt7'>:</span><span class='pt6'>"</span><span>) </span><span class='pt9'>></span><span> strings.</span><span class='pt3'>LastIndex</span><span>(s, </span><span class='pt6'>"</span><span class='pt7'>]</span><span class='pt6'>"</span><span>) }</span></td></tr>
<tr><td class='ln' data-ln='39'></td><td> </td></tr>
<tr><td class='ln' data-ln='40'></td><td><span class='pt2'>// removeEmptyPort strips the empty port in ":port" to ""</span></td></tr>
<tr><td class='ln' data-ln='41'></td><td><span class='pt2'>// as mandated by RFC 3986 Section 6.2.3.</span></td></tr>
<tr><td class='ln' data-ln='42'></td><td><span class='pt9'>func</span><span> </span><span class='pt1'>removeEmptyPort</span><span>(</span><span class='pt10 it'>host</span><span> </span><span class='pt9'>string</span><span>) </span><span class='pt9'>string</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='43'></td><td><span> </span><span class='pt9'>if</span><span> </span><span class='pt3'>hasPort</span><span>(host) {</span></td></tr>
<tr><td class='ln' data-ln='44'></td><td><span> </span><span class='pt9'>return</span><span> strings.</span><span class='pt3'>TrimSuffix</span><span>(host, </span><span class='pt6'>"</span><span class='pt7'>:</span><span class='pt6'>"</span><span>)</span></td></tr>
<tr><td class='ln' data-ln='45'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='46'></td><td><span> </span><span class='pt9'>return</span><span> host</span></td></tr>
<tr><td class='ln' data-ln='47'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='48'></td><td> </td></tr>
<tr><td class='ln' data-ln='49'></td><td><span class='pt9'>func</span><span> </span><span class='pt1'>isNotToken</span><span>(</span><span class='pt10 it'>r</span><span> </span><span class='pt9'>rune</span><span>) </span><span class='pt9'>bool</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='50'></td><td><span> </span><span class='pt9'>return</span><span> </span><span class='pt9'>!</span><span>httplex.</span><span class='pt3'>IsTokenRune</span><span>(r)</span></td></tr>
<tr><td class='ln' data-ln='51'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='52'></td><td> </td></tr>
<tr><td class='ln' data-ln='53'></td><td><span class='pt9'>func</span><span> </span><span class='pt1'>isASCII</span><span>(</span><span class='pt10 it'>s</span><span> </span><span class='pt9'>string</span><span>) </span><span class='pt9'>bool</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='54'></td><td><span> </span><span class='pt9'>for</span><span> i </span><span class='pt9'>:=</span><span> </span><span class='pt5'>0</span><span>; i </span><span class='pt9'><</span><span> </span><span class='pt3 it'>len</span><span>(s); i</span><span class='pt9'>++</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='55'></td><td><span> </span><span class='pt9'>if</span><span> s[i] </span><span class='pt9'>>=</span><span> utf8.RuneSelf {</span></td></tr>
<tr><td class='ln' data-ln='56'></td><td><span> </span><span class='pt9'>return</span><span> </span><span class='pt5'>false</span></td></tr>
<tr><td class='ln' data-ln='57'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='58'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='59'></td><td><span> </span><span class='pt9'>return</span><span> </span><span class='pt5'>true</span></td></tr>
<tr><td class='ln' data-ln='60'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='61'></td><td> </td></tr>
<tr><td class='ln' data-ln='62'></td><td><span class='pt9'>func</span><span> </span><span class='pt1'>hexEscapeNonASCII</span><span>(</span><span class='pt10 it'>s</span><span> </span><span class='pt9'>string</span><span>) </span><span class='pt9'>string</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='63'></td><td><span> newLen </span><span class='pt9'>:=</span><span> </span><span class='pt5'>0</span></td></tr>
<tr><td class='ln' data-ln='64'></td><td><span> </span><span class='pt9'>for</span><span> i </span><span class='pt9'>:=</span><span> </span><span class='pt5'>0</span><span>; i </span><span class='pt9'><</span><span> </span><span class='pt3 it'>len</span><span>(s); i</span><span class='pt9'>++</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='65'></td><td><span> </span><span class='pt9'>if</span><span> s[i] </span><span class='pt9'>>=</span><span> utf8.RuneSelf {</span></td></tr>
<tr><td class='ln' data-ln='66'></td><td><span> newLen </span><span class='pt9'>+=</span><span> </span><span class='pt5'>3</span></td></tr>
<tr><td class='ln' data-ln='67'></td><td><span> } </span><span class='pt9'>else</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='68'></td><td><span> newLen</span><span class='pt9'>++</span></td></tr>
<tr><td class='ln' data-ln='69'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='70'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='71'></td><td><span> </span><span class='pt9'>if</span><span> newLen </span><span class='pt9'>==</span><span> </span><span class='pt3 it'>len</span><span>(s) {</span></td></tr>
<tr><td class='ln' data-ln='72'></td><td><span> </span><span class='pt9'>return</span><span> s</span></td></tr>
<tr><td class='ln' data-ln='73'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='74'></td><td><span> b </span><span class='pt9'>:=</span><span> </span><span class='pt3 it'>make</span><span>([]</span><span class='pt9'>byte</span><span>, </span><span class='pt5'>0</span><span>, newLen)</span></td></tr>
<tr><td class='ln' data-ln='75'></td><td><span> </span><span class='pt9'>for</span><span> i </span><span class='pt9'>:=</span><span> </span><span class='pt5'>0</span><span>; i </span><span class='pt9'><</span><span> </span><span class='pt3 it'>len</span><span>(s); i</span><span class='pt9'>++</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='76'></td><td><span> </span><span class='pt9'>if</span><span> s[i] </span><span class='pt9'>>=</span><span> utf8.RuneSelf {</span></td></tr>
<tr><td class='ln' data-ln='77'></td><td><span> b </span><span class='pt9'>=</span><span> </span><span class='pt3 it'>append</span><span>(b, </span><span class='pt6'>'</span><span class='pt7'>%</span><span class='pt6'>'</span><span>)</span></td></tr>
<tr><td class='ln' data-ln='78'></td><td><span> b </span><span class='pt9'>=</span><span> strconv.</span><span class='pt3'>AppendInt</span><span>(b, </span><span class='pt9'>int64</span><span>(s[i]), </span><span class='pt5'>16</span><span>)</span></td></tr>
<tr><td class='ln' data-ln='79'></td><td><span> } </span><span class='pt9'>else</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='80'></td><td><span> b </span><span class='pt9'>=</span><span> </span><span class='pt3 it'>append</span><span>(b, s[i])</span></td></tr>
<tr><td class='ln' data-ln='81'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='82'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='83'></td><td><span> </span><span class='pt9'>return</span><span> </span><span class='pt9'>string</span><span>(b)</span></td></tr>
<tr><td class='ln' data-ln='84'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='85'></td><td> </td></tr>
<tr><td class='ln' data-ln='86'></td><td><span class='pt2'>// NoBody is an io.ReadCloser with no bytes. Read always returns EOF</span></td></tr>
<tr><td class='ln' data-ln='87'></td><td><span class='pt2'>// and Close always returns nil. It can be used in an outgoing client</span></td></tr>
<tr><td class='ln' data-ln='88'></td><td><span class='pt2'>// request to explicitly signal that a request has zero bytes.</span></td></tr>
<tr><td class='ln' data-ln='89'></td><td><span class='pt2'>// An alternative, however, is to simply set Request.Body to nil.</span></td></tr>
<tr><td class='ln' data-ln='90'></td><td><span class='pt9'>var</span><span> NoBody </span><span class='pt9'>=</span><span> noBody{}</span></td></tr>
<tr><td class='ln' data-ln='91'></td><td> </td></tr>
<tr><td class='ln' data-ln='92'></td><td><span class='pt9'>type</span><span> </span><span class='pt3 it'>noBody</span><span> </span><span class='pt9'>struct</span><span>{}</span></td></tr>
<tr><td class='ln' data-ln='93'></td><td> </td></tr>
<tr><td class='ln' data-ln='94'></td><td><span class='pt9'>func</span><span> (noBody) </span><span class='pt1'>Read</span><span>([]</span><span class='pt9'>byte</span><span>) (</span><span class='pt9'>int</span><span>, </span><span class='pt9'>error</span><span>) { </span><span class='pt9'>return</span><span> </span><span class='pt5'>0</span><span>, io.EOF }</span></td></tr>
<tr><td class='ln' data-ln='95'></td><td><span class='pt9'>func</span><span> (noBody) </span><span class='pt1'>Close</span><span>() </span><span class='pt9'>error</span><span> { </span><span class='pt9'>return</span><span> </span><span class='pt5'>nil</span><span> }</span></td></tr>
<tr><td class='ln' data-ln='96'></td><td><span class='pt9'>func</span><span> (noBody) </span><span class='pt1'>WriteTo</span><span>(io.Writer) (</span><span class='pt9'>int64</span><span>, </span><span class='pt9'>error</span><span>) { </span><span class='pt9'>return</span><span> </span><span class='pt5'>0</span><span>, </span><span class='pt5'>nil</span><span> }</span></td></tr>
<tr><td class='ln' data-ln='97'></td><td> </td></tr>
<tr><td class='ln' data-ln='98'></td><td><span class='pt9'>var</span><span> (</span></td></tr>
<tr><td class='ln' data-ln='99'></td><td><span> </span><span class='pt2'>// verify that an io.Copy from NoBody won't require a buffer:</span></td></tr>
<tr><td class='ln' data-ln='100'></td><td><span> _ io.WriterTo </span><span class='pt9'>=</span><span> NoBody</span></td></tr>
<tr><td class='ln' data-ln='101'></td><td><span> _ io.ReadCloser </span><span class='pt9'>=</span><span> NoBody</span></td></tr>
<tr><td class='ln' data-ln='102'></td><td><span>)</span></td></tr>
<tr><td class='ln' data-ln='103'></td><td> </td></tr>
<tr><td class='ln' data-ln='104'></td><td><span class='pt2'>// PushOptions describes options for Pusher.Push.</span></td></tr>
<tr><td class='ln' data-ln='105'></td><td><span class='pt9'>type</span><span> </span><span class='pt3 it'>PushOptions</span><span> </span><span class='pt9'>struct</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='106'></td><td><span> </span><span class='pt2'>// Method specifies the HTTP method for the promised request.</span></td></tr>
<tr><td class='ln' data-ln='107'></td><td><span> </span><span class='pt2'>// If set, it must be "GET" or "HEAD". Empty means "GET".</span></td></tr>
<tr><td class='ln' data-ln='108'></td><td><span> Method </span><span class='pt9'>string</span></td></tr>
<tr><td class='ln' data-ln='109'></td><td> </td></tr>
<tr><td class='ln' data-ln='110'></td><td><span> </span><span class='pt2'>// Header specifies additional promised request headers. This cannot</span></td></tr>
<tr><td class='ln' data-ln='111'></td><td><span> </span><span class='pt2'>// include HTTP/2 pseudo header fields like ":path" and ":scheme",</span></td></tr>
<tr><td class='ln' data-ln='112'></td><td><span> </span><span class='pt2'>// which will be added automatically.</span></td></tr>
<tr><td class='ln' data-ln='113'></td><td><span> Header Header</span></td></tr>
<tr><td class='ln' data-ln='114'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='115'></td><td> </td></tr>
<tr><td class='ln' data-ln='116'></td><td><span class='pt2'>// Pusher is the interface implemented by ResponseWriters that support</span></td></tr>
<tr><td class='ln' data-ln='117'></td><td><span class='pt2'>// HTTP/2 server push. For more background, see</span></td></tr>
<tr><td class='ln' data-ln='118'></td><td><span class='pt2'>// https://tools.ietf.org/html/rfc7540#section-8.2.</span></td></tr>
<tr><td class='ln' data-ln='119'></td><td><span class='pt9'>type</span><span> </span><span class='pt3 it'>Pusher</span><span> </span><span class='pt9'>interface</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='120'></td><td><span> </span><span class='pt2'>// Push initiates an HTTP/2 server push. This constructs a synthetic</span></td></tr>
<tr><td class='ln' data-ln='121'></td><td><span> </span><span class='pt2'>// request using the given target and options, serializes that request</span></td></tr>
<tr><td class='ln' data-ln='122'></td><td><span> </span><span class='pt2'>// into a PUSH_PROMISE frame, then dispatches that request using the</span></td></tr>
<tr><td class='ln' data-ln='123'></td><td><span> </span><span class='pt2'>// server's request handler. If opts is nil, default options are used.</span></td></tr>
<tr><td class='ln' data-ln='124'></td><td><span> </span><span class='pt2'>//</span></td></tr>
<tr><td class='ln' data-ln='125'></td><td><span> </span><span class='pt2'>// The target must either be an absolute path (like "/path") or an absolute</span></td></tr>
<tr><td class='ln' data-ln='126'></td><td><span> </span><span class='pt2'>// URL that contains a valid host and the same scheme as the parent request.</span></td></tr>
<tr><td class='ln' data-ln='127'></td><td><span> </span><span class='pt2'>// If the target is a path, it will inherit the scheme and host of the</span></td></tr>
<tr><td class='ln' data-ln='128'></td><td><span> </span><span class='pt2'>// parent request.</span></td></tr>
<tr><td class='ln' data-ln='129'></td><td><span> </span><span class='pt2'>//</span></td></tr>
<tr><td class='ln' data-ln='130'></td><td><span> </span><span class='pt2'>// The HTTP/2 spec disallows recursive pushes and cross-authority pushes.</span></td></tr>
<tr><td class='ln' data-ln='131'></td><td><span> </span><span class='pt2'>// Push may or may not detect these invalid pushes; however, invalid</span></td></tr>
<tr><td class='ln' data-ln='132'></td><td><span> </span><span class='pt2'>// pushes will be detected and canceled by conforming clients.</span></td></tr>
<tr><td class='ln' data-ln='133'></td><td><span> </span><span class='pt2'>//</span></td></tr>
<tr><td class='ln' data-ln='134'></td><td><span> </span><span class='pt2'>// Handlers that wish to push URL X should call Push before sending any</span></td></tr>
<tr><td class='ln' data-ln='135'></td><td><span> </span><span class='pt2'>// data that may trigger a request for URL X. This avoids a race where the</span></td></tr>
<tr><td class='ln' data-ln='136'></td><td><span> </span><span class='pt2'>// client issues requests for X before receiving the PUSH_PROMISE for X.</span></td></tr>
<tr><td class='ln' data-ln='137'></td><td><span> </span><span class='pt2'>//</span></td></tr>
<tr><td class='ln' data-ln='138'></td><td><span> </span><span class='pt2'>// Push returns ErrNotSupported if the client has disabled push or if push</span></td></tr>
<tr><td class='ln' data-ln='139'></td><td><span> </span><span class='pt2'>// is not supported on the underlying connection.</span></td></tr>
<tr><td class='ln' data-ln='140'></td><td><span> </span><span class='pt3'>Push</span><span>(target </span><span class='pt9'>string</span><span>, opts </span><span class='pt9'>*</span><span>PushOptions) </span><span class='pt9'>error</span></td></tr>
<tr><td class='ln' data-ln='141'></td><td><span>}</span></td></tr>
</table>
</div>
</div>
</div>
<div class='style' id='P--github--go'>
<div class='P--github-bordered'>
<div class="info header">
<span class="left">http.go</span>
<span class="right"><span>141 lines</span><span>4.26 KB</span></span>
</div>
<div class='P--github'>
<table>
<tr><td class='ln' data-ln='1'></td><td><span class='pt12'>// Copyright 2016 The Go Authors. All rights reserved.</span></td></tr>
<tr><td class='ln' data-ln='2'></td><td><span class='pt12'>// Use of this source code is governed by a BSD-style</span></td></tr>
<tr><td class='ln' data-ln='3'></td><td><span class='pt12'>// license that can be found in the LICENSE file.</span></td></tr>
<tr><td class='ln' data-ln='4'></td><td> </td></tr>
<tr><td class='ln' data-ln='5'></td><td><span class='pt17'>package</span><span> http</span></td></tr>
<tr><td class='ln' data-ln='6'></td><td> </td></tr>
<tr><td class='ln' data-ln='7'></td><td class='hi'><span class='pt17'>import</span><span> (</span></td></tr>
<tr><td class='ln' data-ln='8'></td><td class='hi'><span> </span><span class='pt8'>"io"</span></td></tr>
<tr><td class='ln' data-ln='9'></td><td class='hi'><span> </span><span class='pt8'>"strconv"</span></td></tr>
<tr><td class='ln' data-ln='10'></td><td class='hi'><span> </span><span class='pt8'>"strings"</span></td></tr>
<tr><td class='ln' data-ln='11'></td><td class='hi'><span> </span><span class='pt8'>"time"</span></td></tr>
<tr><td class='ln' data-ln='12'></td><td class='hi'><span> </span><span class='pt8'>"unicode/utf8"</span></td></tr>
<tr><td class='ln' data-ln='13'></td><td class='hi'> </td></tr>
<tr><td class='ln' data-ln='14'></td><td class='hi'><span> </span><span class='pt8'>"golang_org/x/net/lex/httplex"</span></td></tr>
<tr><td class='ln' data-ln='15'></td><td class='hi'><span>)</span></td></tr>
<tr><td class='ln' data-ln='16'></td><td> </td></tr>
<tr><td class='ln' data-ln='17'></td><td><span class='pt12'>// maxInt64 is the effective "infinite" value for the Server and</span></td></tr>
<tr><td class='ln' data-ln='18'></td><td><span class='pt12'>// Transport's byte-limiting readers.</span></td></tr>
<tr><td class='ln' data-ln='19'></td><td><span class='pt17'>const</span><span> maxInt64 </span><span class='pt17'>=</span><span> </span><span class='pt7'>1</span><span class='pt17'><<</span><span class='pt7'>63</span><span> </span><span class='pt17'>-</span><span> </span><span class='pt7'>1</span></td></tr>
<tr><td class='ln' data-ln='20'></td><td> </td></tr>
<tr><td class='ln' data-ln='21'></td><td><span class='pt12'>// aLongTimeAgo is a non-zero time, far in the past, used for</span></td></tr>
<tr><td class='ln' data-ln='22'></td><td><span class='pt12'>// immediate cancelation of network operations.</span></td></tr>
<tr><td class='ln' data-ln='23'></td><td><span class='pt17'>var</span><span> </span><span class='pt10'>aLongTimeAgo</span><span> </span><span class='pt17'>=</span><span> time.</span><span class='pt13'>Unix</span><span>(</span><span class='pt7'>1</span><span>, </span><span class='pt7'>0</span><span>)</span></td></tr>
<tr><td class='ln' data-ln='24'></td><td> </td></tr>
<tr><td class='ln' data-ln='25'></td><td><span class='pt12'>// TODO(bradfitz): move common stuff here. The other files have accumulated</span></td></tr>
<tr><td class='ln' data-ln='26'></td><td><span class='pt12'>// generic http stuff in random places.</span></td></tr>
<tr><td class='ln' data-ln='27'></td><td> </td></tr>
<tr><td class='ln' data-ln='28'></td><td><span class='pt12'>// contextKey is a value for use with context.WithValue. It's used as</span></td></tr>
<tr><td class='ln' data-ln='29'></td><td><span class='pt12'>// a pointer so it fits in an interface{} without allocation.</span></td></tr>
<tr><td class='ln' data-ln='30'></td><td><span class='pt17'>type</span><span> </span><span class='pt13'>contextKey</span><span> </span><span class='pt17'>struct</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='31'></td><td><span> </span><span class='pt10'>name</span><span> </span><span class='pt17'>string</span></td></tr>
<tr><td class='ln' data-ln='32'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='33'></td><td> </td></tr>
<tr><td class='ln' data-ln='34'></td><td><span class='pt17'>func</span><span> (</span><span class='pt18'>k</span><span> </span><span class='pt17'>*</span><span>contextKey) </span><span class='pt13'>String</span><span>() </span><span class='pt17'>string</span><span> { </span><span class='pt17'>return</span><span> </span><span class='pt8'>"net/http context value "</span><span> </span><span class='pt17'>+</span><span> k.</span><span class='pt10'>name</span><span> }</span></td></tr>
<tr><td class='ln' data-ln='35'></td><td> </td></tr>
<tr><td class='ln' data-ln='36'></td><td><span class='pt12'>// Given a string of the form "host", "host:port", or "[ipv6::address]:port",</span></td></tr>
<tr><td class='ln' data-ln='37'></td><td><span class='pt12'>// return true if the string includes a port.</span></td></tr>
<tr><td class='ln' data-ln='38'></td><td><span class='pt17'>func</span><span> </span><span class='pt13'>hasPort</span><span>(</span><span class='pt13'>s</span><span> </span><span class='pt17'>string</span><span>) </span><span class='pt17'>bool</span><span> { </span><span class='pt17'>return</span><span> strings.</span><span class='pt13'>LastIndex</span><span>(s, </span><span class='pt8'>":"</span><span>) </span><span class='pt17'>></span><span> strings.</span><span class='pt13'>LastIndex</span><span>(s, </span><span class='pt8'>"]"</span><span>) }</span></td></tr>
<tr><td class='ln' data-ln='39'></td><td> </td></tr>
<tr><td class='ln' data-ln='40'></td><td><span class='pt12'>// removeEmptyPort strips the empty port in ":port" to ""</span></td></tr>
<tr><td class='ln' data-ln='41'></td><td><span class='pt12'>// as mandated by RFC 3986 Section 6.2.3.</span></td></tr>
<tr><td class='ln' data-ln='42'></td><td><span class='pt17'>func</span><span> </span><span class='pt13'>removeEmptyPort</span><span>(</span><span class='pt13'>host</span><span> </span><span class='pt17'>string</span><span>) </span><span class='pt17'>string</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='43'></td><td><span> </span><span class='pt17'>if</span><span> </span><span class='pt13'>hasPort</span><span>(host) {</span></td></tr>
<tr><td class='ln' data-ln='44'></td><td><span> </span><span class='pt17'>return</span><span> strings.</span><span class='pt13'>TrimSuffix</span><span>(host, </span><span class='pt8'>":"</span><span>)</span></td></tr>
<tr><td class='ln' data-ln='45'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='46'></td><td><span> </span><span class='pt17'>return</span><span> host</span></td></tr>
<tr><td class='ln' data-ln='47'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='48'></td><td> </td></tr>
<tr><td class='ln' data-ln='49'></td><td><span class='pt17'>func</span><span> </span><span class='pt13'>isNotToken</span><span>(</span><span class='pt13'>r</span><span> </span><span class='pt17'>rune</span><span>) </span><span class='pt17'>bool</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='50'></td><td><span> </span><span class='pt17'>return</span><span> </span><span class='pt17'>!</span><span>httplex.</span><span class='pt13'>IsTokenRune</span><span>(r)</span></td></tr>
<tr><td class='ln' data-ln='51'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='52'></td><td> </td></tr>
<tr><td class='ln' data-ln='53'></td><td><span class='pt17'>func</span><span> </span><span class='pt13'>isASCII</span><span>(</span><span class='pt13'>s</span><span> </span><span class='pt17'>string</span><span>) </span><span class='pt17'>bool</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='54'></td><td><span> </span><span class='pt17'>for</span><span> </span><span class='pt10'>i</span><span> </span><span class='pt17'>:=</span><span> </span><span class='pt7'>0</span><span>; i </span><span class='pt17'><</span><span> </span><span class='pt7'>len</span><span>(s); i</span><span class='pt17'>++</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='55'></td><td><span> </span><span class='pt17'>if</span><span> s[i] </span><span class='pt17'>>=</span><span> utf8.</span><span class='pt10'>RuneSelf</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='56'></td><td><span> </span><span class='pt17'>return</span><span> </span><span class='pt7'>false</span></td></tr>
<tr><td class='ln' data-ln='57'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='58'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='59'></td><td><span> </span><span class='pt17'>return</span><span> </span><span class='pt7'>true</span></td></tr>
<tr><td class='ln' data-ln='60'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='61'></td><td> </td></tr>
<tr><td class='ln' data-ln='62'></td><td><span class='pt17'>func</span><span> </span><span class='pt13'>hexEscapeNonASCII</span><span>(</span><span class='pt13'>s</span><span> </span><span class='pt17'>string</span><span>) </span><span class='pt17'>string</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='63'></td><td><span> </span><span class='pt10'>newLen</span><span> </span><span class='pt17'>:=</span><span> </span><span class='pt7'>0</span></td></tr>
<tr><td class='ln' data-ln='64'></td><td><span> </span><span class='pt17'>for</span><span> </span><span class='pt10'>i</span><span> </span><span class='pt17'>:=</span><span> </span><span class='pt7'>0</span><span>; i </span><span class='pt17'><</span><span> </span><span class='pt7'>len</span><span>(s); i</span><span class='pt17'>++</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='65'></td><td><span> </span><span class='pt17'>if</span><span> s[i] </span><span class='pt17'>>=</span><span> utf8.</span><span class='pt10'>RuneSelf</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='66'></td><td><span> newLen </span><span class='pt17'>+=</span><span> </span><span class='pt7'>3</span></td></tr>
<tr><td class='ln' data-ln='67'></td><td><span> } </span><span class='pt17'>else</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='68'></td><td><span> newLen</span><span class='pt17'>++</span></td></tr>
<tr><td class='ln' data-ln='69'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='70'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='71'></td><td><span> </span><span class='pt17'>if</span><span> newLen </span><span class='pt17'>==</span><span> </span><span class='pt7'>len</span><span>(s) {</span></td></tr>
<tr><td class='ln' data-ln='72'></td><td><span> </span><span class='pt17'>return</span><span> s</span></td></tr>
<tr><td class='ln' data-ln='73'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='74'></td><td><span> </span><span class='pt10'>b</span><span> </span><span class='pt17'>:=</span><span> </span><span class='pt7'>make</span><span>([]</span><span class='pt17'>byte</span><span>, </span><span class='pt7'>0</span><span>, newLen)</span></td></tr>
<tr><td class='ln' data-ln='75'></td><td><span> </span><span class='pt17'>for</span><span> </span><span class='pt10'>i</span><span> </span><span class='pt17'>:=</span><span> </span><span class='pt7'>0</span><span>; i </span><span class='pt17'><</span><span> </span><span class='pt7'>len</span><span>(s); i</span><span class='pt17'>++</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='76'></td><td><span> </span><span class='pt17'>if</span><span> s[i] </span><span class='pt17'>>=</span><span> utf8.</span><span class='pt10'>RuneSelf</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='77'></td><td><span> b </span><span class='pt17'>=</span><span> </span><span class='pt7'>append</span><span>(b, </span><span class='pt8'>'%'</span><span>)</span></td></tr>
<tr><td class='ln' data-ln='78'></td><td><span> b </span><span class='pt17'>=</span><span> strconv.</span><span class='pt13'>AppendInt</span><span>(b, </span><span class='pt17'>int64</span><span>(s[i]), </span><span class='pt7'>16</span><span>)</span></td></tr>
<tr><td class='ln' data-ln='79'></td><td><span> } </span><span class='pt17'>else</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='80'></td><td><span> b </span><span class='pt17'>=</span><span> </span><span class='pt7'>append</span><span>(b, s[i])</span></td></tr>
<tr><td class='ln' data-ln='81'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='82'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='83'></td><td><span> </span><span class='pt17'>return</span><span> </span><span class='pt17'>string</span><span>(b)</span></td></tr>
<tr><td class='ln' data-ln='84'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='85'></td><td> </td></tr>
<tr><td class='ln' data-ln='86'></td><td><span class='pt12'>// NoBody is an io.ReadCloser with no bytes. Read always returns EOF</span></td></tr>
<tr><td class='ln' data-ln='87'></td><td><span class='pt12'>// and Close always returns nil. It can be used in an outgoing client</span></td></tr>
<tr><td class='ln' data-ln='88'></td><td><span class='pt12'>// request to explicitly signal that a request has zero bytes.</span></td></tr>
<tr><td class='ln' data-ln='89'></td><td><span class='pt12'>// An alternative, however, is to simply set Request.Body to nil.</span></td></tr>
<tr><td class='ln' data-ln='90'></td><td><span class='pt17'>var</span><span> </span><span class='pt10'>NoBody</span><span> </span><span class='pt17'>=</span><span> noBody{}</span></td></tr>
<tr><td class='ln' data-ln='91'></td><td> </td></tr>
<tr><td class='ln' data-ln='92'></td><td><span class='pt17'>type</span><span> </span><span class='pt13'>noBody</span><span> </span><span class='pt17'>struct</span><span>{}</span></td></tr>
<tr><td class='ln' data-ln='93'></td><td> </td></tr>
<tr><td class='ln' data-ln='94'></td><td><span class='pt17'>func</span><span> (noBody) </span><span class='pt13'>Read</span><span>([]</span><span class='pt17'>byte</span><span>) (</span><span class='pt17'>int</span><span>, </span><span class='pt17'>error</span><span>) { </span><span class='pt17'>return</span><span> </span><span class='pt7'>0</span><span>, io.</span><span class='pt10'>EOF</span><span> }</span></td></tr>
<tr><td class='ln' data-ln='95'></td><td><span class='pt17'>func</span><span> (noBody) </span><span class='pt13'>Close</span><span>() </span><span class='pt17'>error</span><span> { </span><span class='pt17'>return</span><span> </span><span class='pt7'>nil</span><span> }</span></td></tr>
<tr><td class='ln' data-ln='96'></td><td><span class='pt17'>func</span><span> (noBody) </span><span class='pt13'>WriteTo</span><span>(io.Writer) (</span><span class='pt17'>int64</span><span>, </span><span class='pt17'>error</span><span>) { </span><span class='pt17'>return</span><span> </span><span class='pt7'>0</span><span>, </span><span class='pt7'>nil</span><span> }</span></td></tr>
<tr><td class='ln' data-ln='97'></td><td> </td></tr>
<tr><td class='ln' data-ln='98'></td><td><span class='pt17'>var</span><span> (</span></td></tr>
<tr><td class='ln' data-ln='99'></td><td><span> </span><span class='pt12'>// verify that an io.Copy from NoBody won't require a buffer:</span></td></tr>
<tr><td class='ln' data-ln='100'></td><td><span> </span><span class='pt10'>_</span><span> io.</span><span class='pt10'>WriterTo</span><span> </span><span class='pt17'>=</span><span> NoBody</span></td></tr>
<tr><td class='ln' data-ln='101'></td><td><span> </span><span class='pt10'>_</span><span> io.</span><span class='pt10'>ReadCloser</span><span> </span><span class='pt17'>=</span><span> NoBody</span></td></tr>
<tr><td class='ln' data-ln='102'></td><td><span>)</span></td></tr>
<tr><td class='ln' data-ln='103'></td><td> </td></tr>
<tr><td class='ln' data-ln='104'></td><td><span class='pt12'>// PushOptions describes options for Pusher.Push.</span></td></tr>
<tr><td class='ln' data-ln='105'></td><td><span class='pt17'>type</span><span> </span><span class='pt13'>PushOptions</span><span> </span><span class='pt17'>struct</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='106'></td><td><span> </span><span class='pt12'>// Method specifies the HTTP method for the promised request.</span></td></tr>
<tr><td class='ln' data-ln='107'></td><td><span> </span><span class='pt12'>// If set, it must be "GET" or "HEAD". Empty means "GET".</span></td></tr>
<tr><td class='ln' data-ln='108'></td><td><span> </span><span class='pt10'>Method</span><span> </span><span class='pt17'>string</span></td></tr>
<tr><td class='ln' data-ln='109'></td><td> </td></tr>
<tr><td class='ln' data-ln='110'></td><td><span> </span><span class='pt12'>// Header specifies additional promised request headers. This cannot</span></td></tr>
<tr><td class='ln' data-ln='111'></td><td><span> </span><span class='pt12'>// include HTTP/2 pseudo header fields like ":path" and ":scheme",</span></td></tr>
<tr><td class='ln' data-ln='112'></td><td><span> </span><span class='pt12'>// which will be added automatically.</span></td></tr>
<tr><td class='ln' data-ln='113'></td><td><span> </span><span class='pt10'>Header</span><span> Header</span></td></tr>
<tr><td class='ln' data-ln='114'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='115'></td><td> </td></tr>
<tr><td class='ln' data-ln='116'></td><td><span class='pt12'>// Pusher is the interface implemented by ResponseWriters that support</span></td></tr>
<tr><td class='ln' data-ln='117'></td><td><span class='pt12'>// HTTP/2 server push. For more background, see</span></td></tr>
<tr><td class='ln' data-ln='118'></td><td><span class='pt12'>// https://tools.ietf.org/html/rfc7540#section-8.2.</span></td></tr>
<tr><td class='ln' data-ln='119'></td><td><span class='pt17'>type</span><span> </span><span class='pt13'>Pusher</span><span> </span><span class='pt17'>interface</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='120'></td><td><span> </span><span class='pt12'>// Push initiates an HTTP/2 server push. This constructs a synthetic</span></td></tr>
<tr><td class='ln' data-ln='121'></td><td><span> </span><span class='pt12'>// request using the given target and options, serializes that request</span></td></tr>
<tr><td class='ln' data-ln='122'></td><td><span> </span><span class='pt12'>// into a PUSH_PROMISE frame, then dispatches that request using the</span></td></tr>
<tr><td class='ln' data-ln='123'></td><td><span> </span><span class='pt12'>// server's request handler. If opts is nil, default options are used.</span></td></tr>
<tr><td class='ln' data-ln='124'></td><td><span> </span><span class='pt12'>//</span></td></tr>
<tr><td class='ln' data-ln='125'></td><td><span> </span><span class='pt12'>// The target must either be an absolute path (like "/path") or an absolute</span></td></tr>
<tr><td class='ln' data-ln='126'></td><td><span> </span><span class='pt12'>// URL that contains a valid host and the same scheme as the parent request.</span></td></tr>
<tr><td class='ln' data-ln='127'></td><td><span> </span><span class='pt12'>// If the target is a path, it will inherit the scheme and host of the</span></td></tr>
<tr><td class='ln' data-ln='128'></td><td><span> </span><span class='pt12'>// parent request.</span></td></tr>
<tr><td class='ln' data-ln='129'></td><td><span> </span><span class='pt12'>//</span></td></tr>
<tr><td class='ln' data-ln='130'></td><td><span> </span><span class='pt12'>// The HTTP/2 spec disallows recursive pushes and cross-authority pushes.</span></td></tr>
<tr><td class='ln' data-ln='131'></td><td><span> </span><span class='pt12'>// Push may or may not detect these invalid pushes; however, invalid</span></td></tr>
<tr><td class='ln' data-ln='132'></td><td><span> </span><span class='pt12'>// pushes will be detected and canceled by conforming clients.</span></td></tr>
<tr><td class='ln' data-ln='133'></td><td><span> </span><span class='pt12'>//</span></td></tr>
<tr><td class='ln' data-ln='134'></td><td><span> </span><span class='pt12'>// Handlers that wish to push URL X should call Push before sending any</span></td></tr>
<tr><td class='ln' data-ln='135'></td><td><span> </span><span class='pt12'>// data that may trigger a request for URL X. This avoids a race where the</span></td></tr>
<tr><td class='ln' data-ln='136'></td><td><span> </span><span class='pt12'>// client issues requests for X before receiving the PUSH_PROMISE for X.</span></td></tr>
<tr><td class='ln' data-ln='137'></td><td><span> </span><span class='pt12'>//</span></td></tr>
<tr><td class='ln' data-ln='138'></td><td><span> </span><span class='pt12'>// Push returns ErrNotSupported if the client has disabled push or if push</span></td></tr>
<tr><td class='ln' data-ln='139'></td><td><span> </span><span class='pt12'>// is not supported on the underlying connection.</span></td></tr>
<tr><td class='ln' data-ln='140'></td><td><span> </span><span class='pt13'>Push</span><span>(target </span><span class='pt17'>string</span><span>, opts </span><span class='pt17'>*</span><span>PushOptions) </span><span class='pt17'>error</span></td></tr>
<tr><td class='ln' data-ln='141'></td><td><span>}</span></td></tr>
</table>
</div>
</div>
</div>
<div class='style' id='P--monokai_extended--go'>
<div class='P--monokai_extended-bordered'>
<div class="info header">
<span class="left">http.go</span>
<span class="right"><span>141 lines</span><span>4.26 KB</span></span>
</div>
<div class='P--monokai_extended'>
<table>
<tr><td class='ln' data-ln='1'></td><td><span class='pt10'>// Copyright 2016 The Go Authors. All rights reserved.</span></td></tr>
<tr><td class='ln' data-ln='2'></td><td><span class='pt10'>// Use of this source code is governed by a BSD-style</span></td></tr>
<tr><td class='ln' data-ln='3'></td><td><span class='pt10'>// license that can be found in the LICENSE file.</span></td></tr>
<tr><td class='ln' data-ln='4'></td><td> </td></tr>
<tr><td class='ln' data-ln='5'></td><td><span class='pt32'>package</span><span> http</span></td></tr>
<tr><td class='ln' data-ln='6'></td><td> </td></tr>
<tr><td class='ln' data-ln='7'></td><td class='hi'><span class='pt32'>import</span><span> </span><span class='pt36'>(</span></td></tr>
<tr><td class='ln' data-ln='8'></td><td class='hi'><span> </span><span class='pt27'>"io"</span></td></tr>
<tr><td class='ln' data-ln='9'></td><td class='hi'><span> </span><span class='pt27'>"strconv"</span></td></tr>
<tr><td class='ln' data-ln='10'></td><td class='hi'><span> </span><span class='pt27'>"strings"</span></td></tr>
<tr><td class='ln' data-ln='11'></td><td class='hi'><span> </span><span class='pt27'>"time"</span></td></tr>
<tr><td class='ln' data-ln='12'></td><td class='hi'><span> </span><span class='pt27'>"unicode/utf8"</span></td></tr>
<tr><td class='ln' data-ln='13'></td><td class='hi'> </td></tr>
<tr><td class='ln' data-ln='14'></td><td class='hi'><span> </span><span class='pt27'>"golang_org/x/net/lex/httplex"</span></td></tr>
<tr><td class='ln' data-ln='15'></td><td class='hi'><span class='pt36'>)</span></td></tr>
<tr><td class='ln' data-ln='16'></td><td> </td></tr>
<tr><td class='ln' data-ln='17'></td><td><span class='pt10'>// maxInt64 is the effective "infinite" value for the Server and</span></td></tr>
<tr><td class='ln' data-ln='18'></td><td><span class='pt10'>// Transport's byte-limiting readers.</span></td></tr>
<tr><td class='ln' data-ln='19'></td><td><span class='pt32'>const</span><span> maxInt64 </span><span class='pt32'>=</span><span> </span><span class='pt17'>1</span><span class='pt32'><<</span><span class='pt17'>63</span><span> </span><span class='pt32'>-</span><span> </span><span class='pt17'>1</span></td></tr>
<tr><td class='ln' data-ln='20'></td><td> </td></tr>
<tr><td class='ln' data-ln='21'></td><td><span class='pt10'>// aLongTimeAgo is a non-zero time, far in the past, used for</span></td></tr>
<tr><td class='ln' data-ln='22'></td><td><span class='pt10'>// immediate cancelation of network operations.</span></td></tr>
<tr><td class='ln' data-ln='23'></td><td><span class='pt9 it'>var</span><span> </span><span class='pt36'>aLongTimeAgo</span><span> </span><span class='pt32'>=</span><span> time.Unix</span><span class='pt36'>(</span><span class='pt17'>1</span><span>, </span><span class='pt17'>0</span><span class='pt36'>)</span></td></tr>
<tr><td class='ln' data-ln='24'></td><td> </td></tr>
<tr><td class='ln' data-ln='25'></td><td><span class='pt10'>// TODO(bradfitz): move common stuff here. The other files have accumulated</span></td></tr>
<tr><td class='ln' data-ln='26'></td><td><span class='pt10'>// generic http stuff in random places.</span></td></tr>
<tr><td class='ln' data-ln='27'></td><td> </td></tr>
<tr><td class='ln' data-ln='28'></td><td><span class='pt10'>// contextKey is a value for use with context.WithValue. It's used as</span></td></tr>
<tr><td class='ln' data-ln='29'></td><td><span class='pt10'>// a pointer so it fits in an interface{} without allocation.</span></td></tr>
<tr><td class='ln' data-ln='30'></td><td><span class='pt9 it'>type</span><span> </span><span class='pt13'>contextKey</span><span> </span><span class='pt9 it'>struct</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='31'></td><td><span> </span><span class='pt36'>name</span><span> </span><span class='pt9 it'>string</span></td></tr>
<tr><td class='ln' data-ln='32'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='33'></td><td> </td></tr>
<tr><td class='ln' data-ln='34'></td><td><span class='pt9 it'>func</span><span> </span><span class='pt36'>(</span><span class='pt34 it'>k</span><span> </span><span class='pt32'>*</span><span>contextKey</span><span class='pt36'>)</span><span> </span><span class='pt13'>String</span><span class='pt36'>()</span><span> </span><span class='pt9 it'>string</span><span> { </span><span class='pt32'>return</span><span> </span><span class='pt27'>"net/http context value "</span><span> </span><span class='pt32'>+</span><span> k.</span><span class='pt36'>name</span><span> }</span></td></tr>
<tr><td class='ln' data-ln='35'></td><td> </td></tr>
<tr><td class='ln' data-ln='36'></td><td><span class='pt10'>// Given a string of the form "host", "host:port", or "[ipv6::address]:port",</span></td></tr>
<tr><td class='ln' data-ln='37'></td><td><span class='pt10'>// return true if the string includes a port.</span></td></tr>
<tr><td class='ln' data-ln='38'></td><td><span class='pt9 it'>func</span><span> </span><span class='pt13'>hasPort</span><span class='pt36'>(</span><span class='pt34 it'>s</span><span> </span><span class='pt9 it'>string</span><span class='pt36'>)</span><span> </span><span class='pt9 it'>bool</span><span> { </span><span class='pt32'>return</span><span> strings.LastIndex</span><span class='pt36'>(</span><span>s, </span><span class='pt27'>":"</span><span class='pt36'>)</span><span> </span><span class='pt32'>></span><span> strings.LastIndex</span><span class='pt36'>(</span><span>s, </span><span class='pt27'>"]"</span><span class='pt36'>)</span><span> }</span></td></tr>
<tr><td class='ln' data-ln='39'></td><td> </td></tr>
<tr><td class='ln' data-ln='40'></td><td><span class='pt10'>// removeEmptyPort strips the empty port in ":port" to ""</span></td></tr>
<tr><td class='ln' data-ln='41'></td><td><span class='pt10'>// as mandated by RFC 3986 Section 6.2.3.</span></td></tr>
<tr><td class='ln' data-ln='42'></td><td><span class='pt9 it'>func</span><span> </span><span class='pt13'>removeEmptyPort</span><span class='pt36'>(</span><span class='pt34 it'>host</span><span> </span><span class='pt9 it'>string</span><span class='pt36'>)</span><span> </span><span class='pt9 it'>string</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='43'></td><td><span> </span><span class='pt32'>if</span><span> hasPort</span><span class='pt36'>(</span><span>host</span><span class='pt36'>)</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='44'></td><td><span> </span><span class='pt32'>return</span><span> strings.TrimSuffix</span><span class='pt36'>(</span><span>host, </span><span class='pt27'>":"</span><span class='pt36'>)</span></td></tr>
<tr><td class='ln' data-ln='45'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='46'></td><td><span> </span><span class='pt32'>return</span><span> host</span></td></tr>
<tr><td class='ln' data-ln='47'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='48'></td><td> </td></tr>
<tr><td class='ln' data-ln='49'></td><td><span class='pt9 it'>func</span><span> </span><span class='pt13'>isNotToken</span><span class='pt36'>(</span><span class='pt34 it'>r</span><span> </span><span class='pt9 it'>rune</span><span class='pt36'>)</span><span> </span><span class='pt9 it'>bool</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='50'></td><td><span> </span><span class='pt32'>return</span><span> </span><span class='pt32'>!</span><span>httplex.IsTokenRune</span><span class='pt36'>(</span><span>r</span><span class='pt36'>)</span></td></tr>
<tr><td class='ln' data-ln='51'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='52'></td><td> </td></tr>
<tr><td class='ln' data-ln='53'></td><td><span class='pt9 it'>func</span><span> </span><span class='pt13'>isASCII</span><span class='pt36'>(</span><span class='pt34 it'>s</span><span> </span><span class='pt9 it'>string</span><span class='pt36'>)</span><span> </span><span class='pt9 it'>bool</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='54'></td><td><span> </span><span class='pt32'>for</span><span> </span><span class='pt36'>i</span><span> </span><span class='pt32'>:=</span><span> </span><span class='pt17'>0</span><span>; i </span><span class='pt32'><</span><span> </span><span class='pt9'>len</span><span class='pt36'>(</span><span>s</span><span class='pt36'>)</span><span>; i</span><span class='pt32'>++</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='55'></td><td><span> </span><span class='pt32'>if</span><span> s[i] </span><span class='pt32'>>=</span><span> utf8.</span><span class='pt36'>RuneSelf</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='56'></td><td><span> </span><span class='pt32'>return</span><span> </span><span class='pt17'>false</span></td></tr>
<tr><td class='ln' data-ln='57'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='58'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='59'></td><td><span> </span><span class='pt32'>return</span><span> </span><span class='pt17'>true</span></td></tr>
<tr><td class='ln' data-ln='60'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='61'></td><td> </td></tr>
<tr><td class='ln' data-ln='62'></td><td><span class='pt9 it'>func</span><span> </span><span class='pt13'>hexEscapeNonASCII</span><span class='pt36'>(</span><span class='pt34 it'>s</span><span> </span><span class='pt9 it'>string</span><span class='pt36'>)</span><span> </span><span class='pt9 it'>string</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='63'></td><td><span> </span><span class='pt36'>newLen</span><span> </span><span class='pt32'>:=</span><span> </span><span class='pt17'>0</span></td></tr>
<tr><td class='ln' data-ln='64'></td><td><span> </span><span class='pt32'>for</span><span> </span><span class='pt36'>i</span><span> </span><span class='pt32'>:=</span><span> </span><span class='pt17'>0</span><span>; i </span><span class='pt32'><</span><span> </span><span class='pt9'>len</span><span class='pt36'>(</span><span>s</span><span class='pt36'>)</span><span>; i</span><span class='pt32'>++</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='65'></td><td><span> </span><span class='pt32'>if</span><span> s[i] </span><span class='pt32'>>=</span><span> utf8.</span><span class='pt36'>RuneSelf</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='66'></td><td><span> newLen </span><span class='pt32'>+=</span><span> </span><span class='pt17'>3</span></td></tr>
<tr><td class='ln' data-ln='67'></td><td><span> } </span><span class='pt32'>else</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='68'></td><td><span> newLen</span><span class='pt32'>++</span></td></tr>
<tr><td class='ln' data-ln='69'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='70'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='71'></td><td><span> </span><span class='pt32'>if</span><span> newLen </span><span class='pt32'>==</span><span> </span><span class='pt9'>len</span><span class='pt36'>(</span><span>s</span><span class='pt36'>)</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='72'></td><td><span> </span><span class='pt32'>return</span><span> s</span></td></tr>
<tr><td class='ln' data-ln='73'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='74'></td><td><span> </span><span class='pt36'>b</span><span> </span><span class='pt32'>:=</span><span> </span><span class='pt9'>make</span><span class='pt36'>(</span><span>[]</span><span class='pt9 it'>byte</span><span>, </span><span class='pt17'>0</span><span>, newLen</span><span class='pt36'>)</span></td></tr>
<tr><td class='ln' data-ln='75'></td><td><span> </span><span class='pt32'>for</span><span> </span><span class='pt36'>i</span><span> </span><span class='pt32'>:=</span><span> </span><span class='pt17'>0</span><span>; i </span><span class='pt32'><</span><span> </span><span class='pt9'>len</span><span class='pt36'>(</span><span>s</span><span class='pt36'>)</span><span>; i</span><span class='pt32'>++</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='76'></td><td><span> </span><span class='pt32'>if</span><span> s[i] </span><span class='pt32'>>=</span><span> utf8.</span><span class='pt36'>RuneSelf</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='77'></td><td><span> b </span><span class='pt32'>=</span><span> </span><span class='pt9'>append</span><span class='pt36'>(</span><span>b, </span><span class='pt27'>'%'</span><span class='pt36'>)</span></td></tr>
<tr><td class='ln' data-ln='78'></td><td><span> b </span><span class='pt32'>=</span><span> strconv.AppendInt</span><span class='pt36'>(</span><span>b, </span><span class='pt9 it'>int64</span><span class='pt36'>(</span><span>s[i]</span><span class='pt36'>)</span><span>, </span><span class='pt17'>16</span><span class='pt36'>)</span></td></tr>
<tr><td class='ln' data-ln='79'></td><td><span> } </span><span class='pt32'>else</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='80'></td><td><span> b </span><span class='pt32'>=</span><span> </span><span class='pt9'>append</span><span class='pt36'>(</span><span>b, s[i]</span><span class='pt36'>)</span></td></tr>
<tr><td class='ln' data-ln='81'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='82'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='83'></td><td><span> </span><span class='pt32'>return</span><span> </span><span class='pt9 it'>string</span><span class='pt36'>(</span><span>b</span><span class='pt36'>)</span></td></tr>
<tr><td class='ln' data-ln='84'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='85'></td><td> </td></tr>
<tr><td class='ln' data-ln='86'></td><td><span class='pt10'>// NoBody is an io.ReadCloser with no bytes. Read always returns EOF</span></td></tr>
<tr><td class='ln' data-ln='87'></td><td><span class='pt10'>// and Close always returns nil. It can be used in an outgoing client</span></td></tr>
<tr><td class='ln' data-ln='88'></td><td><span class='pt10'>// request to explicitly signal that a request has zero bytes.</span></td></tr>
<tr><td class='ln' data-ln='89'></td><td><span class='pt10'>// An alternative, however, is to simply set Request.Body to nil.</span></td></tr>
<tr><td class='ln' data-ln='90'></td><td><span class='pt9 it'>var</span><span> </span><span class='pt36'>NoBody</span><span> </span><span class='pt32'>=</span><span> noBody{}</span></td></tr>
<tr><td class='ln' data-ln='91'></td><td> </td></tr>
<tr><td class='ln' data-ln='92'></td><td><span class='pt9 it'>type</span><span> </span><span class='pt13'>noBody</span><span> </span><span class='pt9 it'>struct</span><span>{}</span></td></tr>
<tr><td class='ln' data-ln='93'></td><td> </td></tr>
<tr><td class='ln' data-ln='94'></td><td><span class='pt9 it'>func</span><span> </span><span class='pt36'>(</span><span>noBody</span><span class='pt36'>)</span><span> </span><span class='pt13'>Read</span><span class='pt36'>(</span><span>[]</span><span class='pt9 it'>byte</span><span class='pt36'>)</span><span> </span><span class='pt36'>(</span><span class='pt9 it'>int</span><span>, </span><span class='pt9 it'>error</span><span class='pt36'>)</span><span> { </span><span class='pt32'>return</span><span> </span><span class='pt17'>0</span><span>, io.</span><span class='pt36'>EOF</span><span> }</span></td></tr>
<tr><td class='ln' data-ln='95'></td><td><span class='pt9 it'>func</span><span> </span><span class='pt36'>(</span><span>noBody</span><span class='pt36'>)</span><span> </span><span class='pt13'>Close</span><span class='pt36'>()</span><span> </span><span class='pt9 it'>error</span><span> { </span><span class='pt32'>return</span><span> </span><span class='pt17'>nil</span><span> }</span></td></tr>
<tr><td class='ln' data-ln='96'></td><td><span class='pt9 it'>func</span><span> </span><span class='pt36'>(</span><span>noBody</span><span class='pt36'>)</span><span> </span><span class='pt13'>WriteTo</span><span class='pt36'>(</span><span>io.Writer</span><span class='pt36'>)</span><span> </span><span class='pt36'>(</span><span class='pt9 it'>int64</span><span>, </span><span class='pt9 it'>error</span><span class='pt36'>)</span><span> { </span><span class='pt32'>return</span><span> </span><span class='pt17'>0</span><span>, </span><span class='pt17'>nil</span><span> }</span></td></tr>
<tr><td class='ln' data-ln='97'></td><td> </td></tr>
<tr><td class='ln' data-ln='98'></td><td><span class='pt9 it'>var</span><span> </span><span class='pt36'>(</span></td></tr>
<tr><td class='ln' data-ln='99'></td><td><span> </span><span class='pt10'>// verify that an io.Copy from NoBody won't require a buffer:</span></td></tr>
<tr><td class='ln' data-ln='100'></td><td><span> </span><span class='pt36'>_</span><span> io.</span><span class='pt36'>WriterTo</span><span> </span><span class='pt32'>=</span><span> NoBody</span></td></tr>
<tr><td class='ln' data-ln='101'></td><td><span> </span><span class='pt36'>_</span><span> io.</span><span class='pt36'>ReadCloser</span><span> </span><span class='pt32'>=</span><span> NoBody</span></td></tr>
<tr><td class='ln' data-ln='102'></td><td><span class='pt36'>)</span></td></tr>
<tr><td class='ln' data-ln='103'></td><td> </td></tr>
<tr><td class='ln' data-ln='104'></td><td><span class='pt10'>// PushOptions describes options for Pusher.Push.</span></td></tr>
<tr><td class='ln' data-ln='105'></td><td><span class='pt9 it'>type</span><span> </span><span class='pt13'>PushOptions</span><span> </span><span class='pt9 it'>struct</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='106'></td><td><span> </span><span class='pt10'>// Method specifies the HTTP method for the promised request.</span></td></tr>
<tr><td class='ln' data-ln='107'></td><td><span> </span><span class='pt10'>// If set, it must be "GET" or "HEAD". Empty means "GET".</span></td></tr>
<tr><td class='ln' data-ln='108'></td><td><span> </span><span class='pt36'>Method</span><span> </span><span class='pt9 it'>string</span></td></tr>
<tr><td class='ln' data-ln='109'></td><td> </td></tr>
<tr><td class='ln' data-ln='110'></td><td><span> </span><span class='pt10'>// Header specifies additional promised request headers. This cannot</span></td></tr>
<tr><td class='ln' data-ln='111'></td><td><span> </span><span class='pt10'>// include HTTP/2 pseudo header fields like ":path" and ":scheme",</span></td></tr>
<tr><td class='ln' data-ln='112'></td><td><span> </span><span class='pt10'>// which will be added automatically.</span></td></tr>
<tr><td class='ln' data-ln='113'></td><td><span> </span><span class='pt36'>Header</span><span> Header</span></td></tr>
<tr><td class='ln' data-ln='114'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='115'></td><td> </td></tr>
<tr><td class='ln' data-ln='116'></td><td><span class='pt10'>// Pusher is the interface implemented by ResponseWriters that support</span></td></tr>
<tr><td class='ln' data-ln='117'></td><td><span class='pt10'>// HTTP/2 server push. For more background, see</span></td></tr>
<tr><td class='ln' data-ln='118'></td><td><span class='pt10'>// https://tools.ietf.org/html/rfc7540#section-8.2.</span></td></tr>
<tr><td class='ln' data-ln='119'></td><td><span class='pt9 it'>type</span><span> </span><span class='pt13'>Pusher</span><span> </span><span class='pt9 it'>interface</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='120'></td><td><span> </span><span class='pt10'>// Push initiates an HTTP/2 server push. This constructs a synthetic</span></td></tr>
<tr><td class='ln' data-ln='121'></td><td><span> </span><span class='pt10'>// request using the given target and options, serializes that request</span></td></tr>
<tr><td class='ln' data-ln='122'></td><td><span> </span><span class='pt10'>// into a PUSH_PROMISE frame, then dispatches that request using the</span></td></tr>
<tr><td class='ln' data-ln='123'></td><td><span> </span><span class='pt10'>// server's request handler. If opts is nil, default options are used.</span></td></tr>
<tr><td class='ln' data-ln='124'></td><td><span> </span><span class='pt10'>//</span></td></tr>
<tr><td class='ln' data-ln='125'></td><td><span> </span><span class='pt10'>// The target must either be an absolute path (like "/path") or an absolute</span></td></tr>
<tr><td class='ln' data-ln='126'></td><td><span> </span><span class='pt10'>// URL that contains a valid host and the same scheme as the parent request.</span></td></tr>
<tr><td class='ln' data-ln='127'></td><td><span> </span><span class='pt10'>// If the target is a path, it will inherit the scheme and host of the</span></td></tr>
<tr><td class='ln' data-ln='128'></td><td><span> </span><span class='pt10'>// parent request.</span></td></tr>
<tr><td class='ln' data-ln='129'></td><td><span> </span><span class='pt10'>//</span></td></tr>
<tr><td class='ln' data-ln='130'></td><td><span> </span><span class='pt10'>// The HTTP/2 spec disallows recursive pushes and cross-authority pushes.</span></td></tr>
<tr><td class='ln' data-ln='131'></td><td><span> </span><span class='pt10'>// Push may or may not detect these invalid pushes; however, invalid</span></td></tr>
<tr><td class='ln' data-ln='132'></td><td><span> </span><span class='pt10'>// pushes will be detected and canceled by conforming clients.</span></td></tr>
<tr><td class='ln' data-ln='133'></td><td><span> </span><span class='pt10'>//</span></td></tr>
<tr><td class='ln' data-ln='134'></td><td><span> </span><span class='pt10'>// Handlers that wish to push URL X should call Push before sending any</span></td></tr>
<tr><td class='ln' data-ln='135'></td><td><span> </span><span class='pt10'>// data that may trigger a request for URL X. This avoids a race where the</span></td></tr>
<tr><td class='ln' data-ln='136'></td><td><span> </span><span class='pt10'>// client issues requests for X before receiving the PUSH_PROMISE for X.</span></td></tr>
<tr><td class='ln' data-ln='137'></td><td><span> </span><span class='pt10'>//</span></td></tr>
<tr><td class='ln' data-ln='138'></td><td><span> </span><span class='pt10'>// Push returns ErrNotSupported if the client has disabled push or if push</span></td></tr>
<tr><td class='ln' data-ln='139'></td><td><span> </span><span class='pt10'>// is not supported on the underlying connection.</span></td></tr>
<tr><td class='ln' data-ln='140'></td><td><span> Push</span><span class='pt36'>(</span><span>target </span><span class='pt9 it'>string</span><span>, opts </span><span class='pt32'>*</span><span>PushOptions</span><span class='pt36'>)</span><span> </span><span class='pt9 it'>error</span></td></tr>
<tr><td class='ln' data-ln='141'></td><td><span>}</span></td></tr>
</table>
</div>
</div>
</div>
<div class='style' id='P--oceanic_next--go'>
<div class='P--oceanic_next-bordered'>
<div class="info header">
<span class="left">http.go</span>
<span class="right"><span>141 lines</span><span>4.26 KB</span></span>
</div>
<div class='P--oceanic_next'>
<table>
<tr><td class='ln' data-ln='1'></td><td><span class='pt2'>// Copyright 2016 The Go Authors. All rights reserved.</span></td></tr>
<tr><td class='ln' data-ln='2'></td><td><span class='pt2'>// Use of this source code is governed by a BSD-style</span></td></tr>
<tr><td class='ln' data-ln='3'></td><td><span class='pt2'>// license that can be found in the LICENSE file.</span></td></tr>
<tr><td class='ln' data-ln='4'></td><td> </td></tr>
<tr><td class='ln' data-ln='5'></td><td><span class='pt7'>package</span><span> http</span></td></tr>
<tr><td class='ln' data-ln='6'></td><td> </td></tr>
<tr><td class='ln' data-ln='7'></td><td class='hi'><span class='pt7'>import</span><span> </span><span class='pt1'>(</span></td></tr>
<tr><td class='ln' data-ln='8'></td><td class='hi'><span> </span><span class='pt1'>"</span><span class='pt4'>io</span><span class='pt1'>"</span></td></tr>
<tr><td class='ln' data-ln='9'></td><td class='hi'><span> </span><span class='pt1'>"</span><span class='pt4'>strconv</span><span class='pt1'>"</span></td></tr>
<tr><td class='ln' data-ln='10'></td><td class='hi'><span> </span><span class='pt1'>"</span><span class='pt4'>strings</span><span class='pt1'>"</span></td></tr>
<tr><td class='ln' data-ln='11'></td><td class='hi'><span> </span><span class='pt1'>"</span><span class='pt4'>time</span><span class='pt1'>"</span></td></tr>
<tr><td class='ln' data-ln='12'></td><td class='hi'><span> </span><span class='pt1'>"</span><span class='pt4'>unicode/utf8</span><span class='pt1'>"</span></td></tr>
<tr><td class='ln' data-ln='13'></td><td class='hi'> </td></tr>
<tr><td class='ln' data-ln='14'></td><td class='hi'><span> </span><span class='pt1'>"</span><span class='pt4'>golang_org/x/net/lex/httplex</span><span class='pt1'>"</span></td></tr>
<tr><td class='ln' data-ln='15'></td><td class='hi'><span class='pt1'>)</span></td></tr>
<tr><td class='ln' data-ln='16'></td><td> </td></tr>
<tr><td class='ln' data-ln='17'></td><td><span class='pt2'>// maxInt64 is the effective "infinite" value for the Server and</span></td></tr>
<tr><td class='ln' data-ln='18'></td><td><span class='pt2'>// Transport's byte-limiting readers.</span></td></tr>
<tr><td class='ln' data-ln='19'></td><td><span class='pt7'>const</span><span> maxInt64 </span><span class='pt1'>=</span><span> </span><span class='pt12'>1</span><span class='pt1'><<</span><span class='pt12'>63</span><span> </span><span class='pt1'>-</span><span> </span><span class='pt12'>1</span></td></tr>
<tr><td class='ln' data-ln='20'></td><td> </td></tr>
<tr><td class='ln' data-ln='21'></td><td><span class='pt2'>// aLongTimeAgo is a non-zero time, far in the past, used for</span></td></tr>
<tr><td class='ln' data-ln='22'></td><td><span class='pt2'>// immediate cancelation of network operations.</span></td></tr>
<tr><td class='ln' data-ln='23'></td><td><span class='pt7'>var</span><span> aLongTimeAgo </span><span class='pt1'>=</span><span> time</span><span class='pt1'>.</span><span class='pt3'>Unix</span><span class='pt1'>(</span><span class='pt12'>1</span><span class='pt1'>,</span><span> </span><span class='pt12'>0</span><span class='pt1'>)</span></td></tr>
<tr><td class='ln' data-ln='24'></td><td> </td></tr>
<tr><td class='ln' data-ln='25'></td><td><span class='pt2'>// TODO(bradfitz): move common stuff here. The other files have accumulated</span></td></tr>
<tr><td class='ln' data-ln='26'></td><td><span class='pt2'>// generic http stuff in random places.</span></td></tr>
<tr><td class='ln' data-ln='27'></td><td> </td></tr>
<tr><td class='ln' data-ln='28'></td><td><span class='pt2'>// contextKey is a value for use with context.WithValue. It's used as</span></td></tr>
<tr><td class='ln' data-ln='29'></td><td><span class='pt2'>// a pointer so it fits in an interface{} without allocation.</span></td></tr>
<tr><td class='ln' data-ln='30'></td><td><span class='pt7'>type</span><span> contextKey </span><span class='pt7'>struct</span><span> </span><span class='pt1'>{</span></td></tr>
<tr><td class='ln' data-ln='31'></td><td><span> name </span><span class='pt7'>string</span></td></tr>
<tr><td class='ln' data-ln='32'></td><td><span class='pt1'>}</span></td></tr>
<tr><td class='ln' data-ln='33'></td><td> </td></tr>
<tr><td class='ln' data-ln='34'></td><td><span class='pt7'>func</span><span> </span><span class='pt1'>(</span><span class='pt12'>k</span><span> </span><span class='pt1'>*</span><span>contextKey</span><span class='pt1'>)</span><span> </span><span class='pt3'>String</span><span class='pt1'>()</span><span> </span><span class='pt7'>string</span><span> </span><span class='pt1'>{</span><span> </span><span class='pt7'>return</span><span> </span><span class='pt1'>"</span><span class='pt4'>net/http context value </span><span class='pt1'>"</span><span> </span><span class='pt1'>+</span><span> k</span><span class='pt1'>.</span><span>name </span><span class='pt1'>}</span></td></tr>
<tr><td class='ln' data-ln='35'></td><td> </td></tr>
<tr><td class='ln' data-ln='36'></td><td><span class='pt2'>// Given a string of the form "host", "host:port", or "[ipv6::address]:port",</span></td></tr>
<tr><td class='ln' data-ln='37'></td><td><span class='pt2'>// return true if the string includes a port.</span></td></tr>
<tr><td class='ln' data-ln='38'></td><td><span class='pt7'>func</span><span> </span><span class='pt3'>hasPort</span><span class='pt1'>(</span><span class='pt12'>s</span><span> </span><span class='pt7'>string</span><span class='pt1'>)</span><span> </span><span class='pt7'>bool</span><span> </span><span class='pt1'>{</span><span> </span><span class='pt7'>return</span><span> strings</span><span class='pt1'>.</span><span class='pt3'>LastIndex</span><span class='pt1'>(</span><span>s</span><span class='pt1'>,</span><span> </span><span class='pt1'>"</span><span class='pt4'>:</span><span class='pt1'>")</span><span> </span><span class='pt1'>></span><span> strings</span><span class='pt1'>.</span><span class='pt3'>LastIndex</span><span class='pt1'>(</span><span>s</span><span class='pt1'>,</span><span> </span><span class='pt1'>"</span><span class='pt4'>]</span><span class='pt1'>")</span><span> </span><span class='pt1'>}</span></td></tr>
<tr><td class='ln' data-ln='39'></td><td> </td></tr>
<tr><td class='ln' data-ln='40'></td><td><span class='pt2'>// removeEmptyPort strips the empty port in ":port" to ""</span></td></tr>
<tr><td class='ln' data-ln='41'></td><td><span class='pt2'>// as mandated by RFC 3986 Section 6.2.3.</span></td></tr>
<tr><td class='ln' data-ln='42'></td><td><span class='pt7'>func</span><span> </span><span class='pt3'>removeEmptyPort</span><span class='pt1'>(</span><span class='pt12'>host</span><span> </span><span class='pt7'>string</span><span class='pt1'>)</span><span> </span><span class='pt7'>string</span><span> </span><span class='pt1'>{</span></td></tr>
<tr><td class='ln' data-ln='43'></td><td><span> </span><span class='pt7'>if</span><span> </span><span class='pt3'>hasPort</span><span class='pt1'>(</span><span>host</span><span class='pt1'>)</span><span> </span><span class='pt1'>{</span></td></tr>
<tr><td class='ln' data-ln='44'></td><td><span> </span><span class='pt7'>return</span><span> strings</span><span class='pt1'>.</span><span class='pt3'>TrimSuffix</span><span class='pt1'>(</span><span>host</span><span class='pt1'>,</span><span> </span><span class='pt1'>"</span><span class='pt4'>:</span><span class='pt1'>")</span></td></tr>
<tr><td class='ln' data-ln='45'></td><td><span> </span><span class='pt1'>}</span></td></tr>
<tr><td class='ln' data-ln='46'></td><td><span> </span><span class='pt7'>return</span><span> host</span></td></tr>
<tr><td class='ln' data-ln='47'></td><td><span class='pt1'>}</span></td></tr>
<tr><td class='ln' data-ln='48'></td><td> </td></tr>
<tr><td class='ln' data-ln='49'></td><td><span class='pt7'>func</span><span> </span><span class='pt3'>isNotToken</span><span class='pt1'>(</span><span class='pt12'>r</span><span> </span><span class='pt7'>rune</span><span class='pt1'>)</span><span> </span><span class='pt7'>bool</span><span> </span><span class='pt1'>{</span></td></tr>
<tr><td class='ln' data-ln='50'></td><td><span> </span><span class='pt7'>return</span><span> </span><span class='pt1'>!</span><span>httplex</span><span class='pt1'>.</span><span class='pt3'>IsTokenRune</span><span class='pt1'>(</span><span>r</span><span class='pt1'>)</span></td></tr>
<tr><td class='ln' data-ln='51'></td><td><span class='pt1'>}</span></td></tr>
<tr><td class='ln' data-ln='52'></td><td> </td></tr>
<tr><td class='ln' data-ln='53'></td><td><span class='pt7'>func</span><span> </span><span class='pt3'>isASCII</span><span class='pt1'>(</span><span class='pt12'>s</span><span> </span><span class='pt7'>string</span><span class='pt1'>)</span><span> </span><span class='pt7'>bool</span><span> </span><span class='pt1'>{</span></td></tr>
<tr><td class='ln' data-ln='54'></td><td><span> </span><span class='pt7'>for</span><span> i </span><span class='pt1'>:=</span><span> </span><span class='pt12'>0</span><span>; i </span><span class='pt1'><</span><span> </span><span class='pt3'>len</span><span class='pt1'>(</span><span>s</span><span class='pt1'>)</span><span>; i</span><span class='pt1'>++</span><span> </span><span class='pt1'>{</span></td></tr>
<tr><td class='ln' data-ln='55'></td><td><span> </span><span class='pt7'>if</span><span> s</span><span class='pt1'>[</span><span>i</span><span class='pt1'>]</span><span> </span><span class='pt1'>>=</span><span> utf8</span><span class='pt1'>.</span><span>RuneSelf </span><span class='pt1'>{</span></td></tr>
<tr><td class='ln' data-ln='56'></td><td><span> </span><span class='pt7'>return</span><span> </span><span class='pt12'>false</span></td></tr>
<tr><td class='ln' data-ln='57'></td><td><span> </span><span class='pt1'>}</span></td></tr>
<tr><td class='ln' data-ln='58'></td><td><span> </span><span class='pt1'>}</span></td></tr>
<tr><td class='ln' data-ln='59'></td><td><span> </span><span class='pt7'>return</span><span> </span><span class='pt12'>true</span></td></tr>
<tr><td class='ln' data-ln='60'></td><td><span class='pt1'>}</span></td></tr>
<tr><td class='ln' data-ln='61'></td><td> </td></tr>
<tr><td class='ln' data-ln='62'></td><td><span class='pt7'>func</span><span> </span><span class='pt3'>hexEscapeNonASCII</span><span class='pt1'>(</span><span class='pt12'>s</span><span> </span><span class='pt7'>string</span><span class='pt1'>)</span><span> </span><span class='pt7'>string</span><span> </span><span class='pt1'>{</span></td></tr>
<tr><td class='ln' data-ln='63'></td><td><span> newLen </span><span class='pt1'>:=</span><span> </span><span class='pt12'>0</span></td></tr>
<tr><td class='ln' data-ln='64'></td><td><span> </span><span class='pt7'>for</span><span> i </span><span class='pt1'>:=</span><span> </span><span class='pt12'>0</span><span>; i </span><span class='pt1'><</span><span> </span><span class='pt3'>len</span><span class='pt1'>(</span><span>s</span><span class='pt1'>)</span><span>; i</span><span class='pt1'>++</span><span> </span><span class='pt1'>{</span></td></tr>
<tr><td class='ln' data-ln='65'></td><td><span> </span><span class='pt7'>if</span><span> s</span><span class='pt1'>[</span><span>i</span><span class='pt1'>]</span><span> </span><span class='pt1'>>=</span><span> utf8</span><span class='pt1'>.</span><span>RuneSelf </span><span class='pt1'>{</span></td></tr>
<tr><td class='ln' data-ln='66'></td><td><span> newLen </span><span class='pt1'>+=</span><span> </span><span class='pt12'>3</span></td></tr>
<tr><td class='ln' data-ln='67'></td><td><span> </span><span class='pt1'>}</span><span> </span><span class='pt7'>else</span><span> </span><span class='pt1'>{</span></td></tr>
<tr><td class='ln' data-ln='68'></td><td><span> newLen</span><span class='pt1'>++</span></td></tr>
<tr><td class='ln' data-ln='69'></td><td><span> </span><span class='pt1'>}</span></td></tr>
<tr><td class='ln' data-ln='70'></td><td><span> </span><span class='pt1'>}</span></td></tr>
<tr><td class='ln' data-ln='71'></td><td><span> </span><span class='pt7'>if</span><span> newLen </span><span class='pt1'>==</span><span> </span><span class='pt3'>len</span><span class='pt1'>(</span><span>s</span><span class='pt1'>)</span><span> </span><span class='pt1'>{</span></td></tr>
<tr><td class='ln' data-ln='72'></td><td><span> </span><span class='pt7'>return</span><span> s</span></td></tr>
<tr><td class='ln' data-ln='73'></td><td><span> </span><span class='pt1'>}</span></td></tr>
<tr><td class='ln' data-ln='74'></td><td><span> b </span><span class='pt1'>:=</span><span> </span><span class='pt3'>make</span><span class='pt1'>([]</span><span class='pt7'>byte</span><span class='pt1'>,</span><span> </span><span class='pt12'>0</span><span class='pt1'>,</span><span> newLen</span><span class='pt1'>)</span></td></tr>
<tr><td class='ln' data-ln='75'></td><td><span> </span><span class='pt7'>for</span><span> i </span><span class='pt1'>:=</span><span> </span><span class='pt12'>0</span><span>; i </span><span class='pt1'><</span><span> </span><span class='pt3'>len</span><span class='pt1'>(</span><span>s</span><span class='pt1'>)</span><span>; i</span><span class='pt1'>++</span><span> </span><span class='pt1'>{</span></td></tr>
<tr><td class='ln' data-ln='76'></td><td><span> </span><span class='pt7'>if</span><span> s</span><span class='pt1'>[</span><span>i</span><span class='pt1'>]</span><span> </span><span class='pt1'>>=</span><span> utf8</span><span class='pt1'>.</span><span>RuneSelf </span><span class='pt1'>{</span></td></tr>
<tr><td class='ln' data-ln='77'></td><td><span> b </span><span class='pt1'>=</span><span> </span><span class='pt3'>append</span><span class='pt1'>(</span><span>b</span><span class='pt1'>,</span><span> </span><span class='pt1'>'</span><span class='pt4'>%</span><span class='pt1'>')</span></td></tr>
<tr><td class='ln' data-ln='78'></td><td><span> b </span><span class='pt1'>=</span><span> strconv</span><span class='pt1'>.</span><span class='pt3'>AppendInt</span><span class='pt1'>(</span><span>b</span><span class='pt1'>,</span><span> </span><span class='pt7'>int64</span><span class='pt1'>(</span><span>s</span><span class='pt1'>[</span><span>i</span><span class='pt1'>]),</span><span> </span><span class='pt12'>16</span><span class='pt1'>)</span></td></tr>
<tr><td class='ln' data-ln='79'></td><td><span> </span><span class='pt1'>}</span><span> </span><span class='pt7'>else</span><span> </span><span class='pt1'>{</span></td></tr>
<tr><td class='ln' data-ln='80'></td><td><span> b </span><span class='pt1'>=</span><span> </span><span class='pt3'>append</span><span class='pt1'>(</span><span>b</span><span class='pt1'>,</span><span> s</span><span class='pt1'>[</span><span>i</span><span class='pt1'>])</span></td></tr>
<tr><td class='ln' data-ln='81'></td><td><span> </span><span class='pt1'>}</span></td></tr>
<tr><td class='ln' data-ln='82'></td><td><span> </span><span class='pt1'>}</span></td></tr>
<tr><td class='ln' data-ln='83'></td><td><span> </span><span class='pt7'>return</span><span> </span><span class='pt7'>string</span><span class='pt1'>(</span><span>b</span><span class='pt1'>)</span></td></tr>
<tr><td class='ln' data-ln='84'></td><td><span class='pt1'>}</span></td></tr>
<tr><td class='ln' data-ln='85'></td><td> </td></tr>
<tr><td class='ln' data-ln='86'></td><td><span class='pt2'>// NoBody is an io.ReadCloser with no bytes. Read always returns EOF</span></td></tr>
<tr><td class='ln' data-ln='87'></td><td><span class='pt2'>// and Close always returns nil. It can be used in an outgoing client</span></td></tr>
<tr><td class='ln' data-ln='88'></td><td><span class='pt2'>// request to explicitly signal that a request has zero bytes.</span></td></tr>
<tr><td class='ln' data-ln='89'></td><td><span class='pt2'>// An alternative, however, is to simply set Request.Body to nil.</span></td></tr>
<tr><td class='ln' data-ln='90'></td><td><span class='pt7'>var</span><span> NoBody </span><span class='pt1'>=</span><span> noBody{}</span></td></tr>
<tr><td class='ln' data-ln='91'></td><td> </td></tr>
<tr><td class='ln' data-ln='92'></td><td><span class='pt7'>type</span><span> noBody </span><span class='pt7'>struct</span><span class='pt1'>{}</span></td></tr>
<tr><td class='ln' data-ln='93'></td><td> </td></tr>
<tr><td class='ln' data-ln='94'></td><td><span class='pt7'>func</span><span> </span><span class='pt1'>(</span><span>noBody</span><span class='pt1'>)</span><span> </span><span class='pt3'>Read</span><span class='pt1'>([]</span><span class='pt7'>byte</span><span class='pt1'>)</span><span> </span><span class='pt1'>(</span><span class='pt7'>int</span><span class='pt1'>,</span><span> </span><span class='pt7'>error</span><span class='pt1'>)</span><span> </span><span class='pt1'>{</span><span> </span><span class='pt7'>return</span><span> </span><span class='pt12'>0</span><span class='pt1'>,</span><span> io</span><span class='pt1'>.</span><span>EOF </span><span class='pt1'>}</span></td></tr>
<tr><td class='ln' data-ln='95'></td><td><span class='pt7'>func</span><span> </span><span class='pt1'>(</span><span>noBody</span><span class='pt1'>)</span><span> </span><span class='pt3'>Close</span><span class='pt1'>()</span><span> </span><span class='pt7'>error</span><span> </span><span class='pt1'>{</span><span> </span><span class='pt7'>return</span><span> </span><span class='pt12'>nil</span><span> </span><span class='pt1'>}</span></td></tr>
<tr><td class='ln' data-ln='96'></td><td><span class='pt7'>func</span><span> </span><span class='pt1'>(</span><span>noBody</span><span class='pt1'>)</span><span> </span><span class='pt3'>WriteTo</span><span class='pt1'>(</span><span>io.Writer</span><span class='pt1'>)</span><span> </span><span class='pt1'>(</span><span class='pt7'>int64</span><span class='pt1'>,</span><span> </span><span class='pt7'>error</span><span class='pt1'>)</span><span> </span><span class='pt1'>{</span><span> </span><span class='pt7'>return</span><span> </span><span class='pt12'>0</span><span class='pt1'>,</span><span> </span><span class='pt12'>nil</span><span> </span><span class='pt1'>}</span></td></tr>
<tr><td class='ln' data-ln='97'></td><td> </td></tr>
<tr><td class='ln' data-ln='98'></td><td><span class='pt7'>var</span><span> </span><span class='pt1'>(</span></td></tr>
<tr><td class='ln' data-ln='99'></td><td><span> </span><span class='pt2'>// verify that an io.Copy from NoBody won't require a buffer:</span></td></tr>
<tr><td class='ln' data-ln='100'></td><td><span> _ io</span><span class='pt1'>.</span><span>WriterTo </span><span class='pt1'>=</span><span> NoBody</span></td></tr>
<tr><td class='ln' data-ln='101'></td><td><span> _ io</span><span class='pt1'>.</span><span>ReadCloser </span><span class='pt1'>=</span><span> NoBody</span></td></tr>
<tr><td class='ln' data-ln='102'></td><td><span class='pt1'>)</span></td></tr>
<tr><td class='ln' data-ln='103'></td><td> </td></tr>
<tr><td class='ln' data-ln='104'></td><td><span class='pt2'>// PushOptions describes options for Pusher.Push.</span></td></tr>
<tr><td class='ln' data-ln='105'></td><td><span class='pt7'>type</span><span> PushOptions </span><span class='pt7'>struct</span><span> </span><span class='pt1'>{</span></td></tr>
<tr><td class='ln' data-ln='106'></td><td><span> </span><span class='pt2'>// Method specifies the HTTP method for the promised request.</span></td></tr>
<tr><td class='ln' data-ln='107'></td><td><span> </span><span class='pt2'>// If set, it must be "GET" or "HEAD". Empty means "GET".</span></td></tr>
<tr><td class='ln' data-ln='108'></td><td><span> Method </span><span class='pt7'>string</span></td></tr>
<tr><td class='ln' data-ln='109'></td><td> </td></tr>
<tr><td class='ln' data-ln='110'></td><td><span> </span><span class='pt2'>// Header specifies additional promised request headers. This cannot</span></td></tr>
<tr><td class='ln' data-ln='111'></td><td><span> </span><span class='pt2'>// include HTTP/2 pseudo header fields like ":path" and ":scheme",</span></td></tr>
<tr><td class='ln' data-ln='112'></td><td><span> </span><span class='pt2'>// which will be added automatically.</span></td></tr>
<tr><td class='ln' data-ln='113'></td><td><span> Header Header</span></td></tr>
<tr><td class='ln' data-ln='114'></td><td><span class='pt1'>}</span></td></tr>
<tr><td class='ln' data-ln='115'></td><td> </td></tr>
<tr><td class='ln' data-ln='116'></td><td><span class='pt2'>// Pusher is the interface implemented by ResponseWriters that support</span></td></tr>
<tr><td class='ln' data-ln='117'></td><td><span class='pt2'>// HTTP/2 server push. For more background, see</span></td></tr>
<tr><td class='ln' data-ln='118'></td><td><span class='pt2'>// https://tools.ietf.org/html/rfc7540#section-8.2.</span></td></tr>
<tr><td class='ln' data-ln='119'></td><td><span class='pt7'>type</span><span> Pusher </span><span class='pt7'>interface</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='120'></td><td><span> </span><span class='pt2'>// Push initiates an HTTP/2 server push. This constructs a synthetic</span></td></tr>
<tr><td class='ln' data-ln='121'></td><td><span> </span><span class='pt2'>// request using the given target and options, serializes that request</span></td></tr>
<tr><td class='ln' data-ln='122'></td><td><span> </span><span class='pt2'>// into a PUSH_PROMISE frame, then dispatches that request using the</span></td></tr>
<tr><td class='ln' data-ln='123'></td><td><span> </span><span class='pt2'>// server's request handler. If opts is nil, default options are used.</span></td></tr>
<tr><td class='ln' data-ln='124'></td><td><span> </span><span class='pt2'>//</span></td></tr>
<tr><td class='ln' data-ln='125'></td><td><span> </span><span class='pt2'>// The target must either be an absolute path (like "/path") or an absolute</span></td></tr>
<tr><td class='ln' data-ln='126'></td><td><span> </span><span class='pt2'>// URL that contains a valid host and the same scheme as the parent request.</span></td></tr>
<tr><td class='ln' data-ln='127'></td><td><span> </span><span class='pt2'>// If the target is a path, it will inherit the scheme and host of the</span></td></tr>
<tr><td class='ln' data-ln='128'></td><td><span> </span><span class='pt2'>// parent request.</span></td></tr>
<tr><td class='ln' data-ln='129'></td><td><span> </span><span class='pt2'>//</span></td></tr>
<tr><td class='ln' data-ln='130'></td><td><span> </span><span class='pt2'>// The HTTP/2 spec disallows recursive pushes and cross-authority pushes.</span></td></tr>
<tr><td class='ln' data-ln='131'></td><td><span> </span><span class='pt2'>// Push may or may not detect these invalid pushes; however, invalid</span></td></tr>
<tr><td class='ln' data-ln='132'></td><td><span> </span><span class='pt2'>// pushes will be detected and canceled by conforming clients.</span></td></tr>
<tr><td class='ln' data-ln='133'></td><td><span> </span><span class='pt2'>//</span></td></tr>
<tr><td class='ln' data-ln='134'></td><td><span> </span><span class='pt2'>// Handlers that wish to push URL X should call Push before sending any</span></td></tr>
<tr><td class='ln' data-ln='135'></td><td><span> </span><span class='pt2'>// data that may trigger a request for URL X. This avoids a race where the</span></td></tr>
<tr><td class='ln' data-ln='136'></td><td><span> </span><span class='pt2'>// client issues requests for X before receiving the PUSH_PROMISE for X.</span></td></tr>
<tr><td class='ln' data-ln='137'></td><td><span> </span><span class='pt2'>//</span></td></tr>
<tr><td class='ln' data-ln='138'></td><td><span> </span><span class='pt2'>// Push returns ErrNotSupported if the client has disabled push or if push</span></td></tr>
<tr><td class='ln' data-ln='139'></td><td><span> </span><span class='pt2'>// is not supported on the underlying connection.</span></td></tr>
<tr><td class='ln' data-ln='140'></td><td><span> </span><span class='pt3'>Push</span><span class='pt1'>(</span><span>target </span><span class='pt7'>string</span><span class='pt1'>,</span><span> opts </span><span class='pt1'>*</span><span>PushOptions</span><span class='pt1'>)</span><span> </span><span class='pt7'>error</span></td></tr>
<tr><td class='ln' data-ln='141'></td><td><span>}</span></td></tr>
</table>
</div>
</div>
</div>
<div class='style' id='P--one_dark--go'>
<div class='P--one_dark-bordered'>
<div class="info header">
<span class="left">http.go</span>
<span class="right"><span>141 lines</span><span>4.26 KB</span></span>
</div>
<div class='P--one_dark'>
<table>
<tr><td class='ln' data-ln='1'></td><td><span class='pt11 it'>//</span><span class='pt11'> Copyright 2016 The Go Authors. All rights reserved.</span></td></tr>
<tr><td class='ln' data-ln='2'></td><td><span class='pt11 it'>//</span><span class='pt11'> Use of this source code is governed by a BSD-style</span></td></tr>
<tr><td class='ln' data-ln='3'></td><td><span class='pt11 it'>//</span><span class='pt11'> license that can be found in the LICENSE file.</span></td></tr>
<tr><td class='ln' data-ln='4'></td><td> </td></tr>
<tr><td class='ln' data-ln='5'></td><td><span class='pt20'>package</span><span> http</span></td></tr>
<tr><td class='ln' data-ln='6'></td><td> </td></tr>
<tr><td class='ln' data-ln='7'></td><td class='hi'><span class='pt20'>import</span><span> (</span></td></tr>
<tr><td class='ln' data-ln='8'></td><td class='hi'><span> </span><span class='pt12'>"</span><span class='pt13'>io</span><span class='pt12'>"</span></td></tr>
<tr><td class='ln' data-ln='9'></td><td class='hi'><span> </span><span class='pt12'>"</span><span class='pt13'>strconv</span><span class='pt12'>"</span></td></tr>
<tr><td class='ln' data-ln='10'></td><td class='hi'><span> </span><span class='pt12'>"</span><span class='pt13'>strings</span><span class='pt12'>"</span></td></tr>
<tr><td class='ln' data-ln='11'></td><td class='hi'><span> </span><span class='pt12'>"</span><span class='pt13'>time</span><span class='pt12'>"</span></td></tr>
<tr><td class='ln' data-ln='12'></td><td class='hi'><span> </span><span class='pt12'>"</span><span class='pt13'>unicode/utf8</span><span class='pt12'>"</span></td></tr>
<tr><td class='ln' data-ln='13'></td><td class='hi'> </td></tr>
<tr><td class='ln' data-ln='14'></td><td class='hi'><span> </span><span class='pt12'>"</span><span class='pt13'>golang_org/x/net/lex/httplex</span><span class='pt12'>"</span></td></tr>
<tr><td class='ln' data-ln='15'></td><td class='hi'><span>)</span></td></tr>
<tr><td class='ln' data-ln='16'></td><td> </td></tr>
<tr><td class='ln' data-ln='17'></td><td><span class='pt11 it'>//</span><span class='pt11'> maxInt64 is the effective "infinite" value for the Server and</span></td></tr>
<tr><td class='ln' data-ln='18'></td><td><span class='pt11 it'>//</span><span class='pt11'> Transport's byte-limiting readers.</span></td></tr>
<tr><td class='ln' data-ln='19'></td><td><span class='pt20'>const</span><span> maxInt64 </span><span class='pt5'>=</span><span> </span><span class='pt24'>1</span><span class='pt5'><<</span><span class='pt24'>63</span><span> </span><span class='pt5'>-</span><span> </span><span class='pt24'>1</span></td></tr>
<tr><td class='ln' data-ln='20'></td><td> </td></tr>
<tr><td class='ln' data-ln='21'></td><td><span class='pt11 it'>//</span><span class='pt11'> aLongTimeAgo is a non-zero time, far in the past, used for</span></td></tr>
<tr><td class='ln' data-ln='22'></td><td><span class='pt11 it'>//</span><span class='pt11'> immediate cancelation of network operations.</span></td></tr>
<tr><td class='ln' data-ln='23'></td><td><span class='pt20'>var</span><span> </span><span class='pt26'>aLongTimeAgo</span><span> </span><span class='pt5'>=</span><span> time.</span><span class='pt9'>Unix</span><span>(</span><span class='pt24'>1</span><span>, </span><span class='pt24'>0</span><span>)</span></td></tr>
<tr><td class='ln' data-ln='24'></td><td> </td></tr>
<tr><td class='ln' data-ln='25'></td><td><span class='pt11 it'>//</span><span class='pt11'> TODO(bradfitz): move common stuff here. The other files have accumulated</span></td></tr>
<tr><td class='ln' data-ln='26'></td><td><span class='pt11 it'>//</span><span class='pt11'> generic http stuff in random places.</span></td></tr>
<tr><td class='ln' data-ln='27'></td><td> </td></tr>
<tr><td class='ln' data-ln='28'></td><td><span class='pt11 it'>//</span><span class='pt11'> contextKey is a value for use with context.WithValue. It's used as</span></td></tr>
<tr><td class='ln' data-ln='29'></td><td><span class='pt11 it'>//</span><span class='pt11'> a pointer so it fits in an interface{} without allocation.</span></td></tr>
<tr><td class='ln' data-ln='30'></td><td><span class='pt20'>type</span><span> </span><span class='pt28'>contextKey</span><span> </span><span class='pt20'>struct</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='31'></td><td><span> </span><span class='pt26'>name</span><span> </span><span class='pt20'>string</span></td></tr>
<tr><td class='ln' data-ln='32'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='33'></td><td> </td></tr>
<tr><td class='ln' data-ln='34'></td><td><span class='pt20'>func</span><span> (</span><span class='it'>k</span><span> </span><span class='pt5'>*</span><span>contextKey) </span><span class='pt9'>String</span><span>() </span><span class='pt20'>string</span><span> { </span><span class='pt20'>return</span><span> </span><span class='pt12'>"</span><span class='pt13'>net/http context value </span><span class='pt12'>"</span><span> </span><span class='pt5'>+</span><span> k.</span><span class='pt26'>name</span><span> }</span></td></tr>
<tr><td class='ln' data-ln='35'></td><td> </td></tr>
<tr><td class='ln' data-ln='36'></td><td><span class='pt11 it'>//</span><span class='pt11'> Given a string of the form "host", "host:port", or "[ipv6::address]:port",</span></td></tr>
<tr><td class='ln' data-ln='37'></td><td><span class='pt11 it'>//</span><span class='pt11'> return true if the string includes a port.</span></td></tr>
<tr><td class='ln' data-ln='38'></td><td><span class='pt20'>func</span><span> </span><span class='pt9'>hasPort</span><span>(</span><span class='it'>s</span><span> </span><span class='pt20'>string</span><span>) </span><span class='pt20'>bool</span><span> { </span><span class='pt20'>return</span><span> strings.</span><span class='pt9'>LastIndex</span><span>(s, </span><span class='pt12'>"</span><span class='pt13'>:</span><span class='pt12'>"</span><span>) </span><span class='pt5'>></span><span> strings.</span><span class='pt9'>LastIndex</span><span>(s, </span><span class='pt12'>"</span><span class='pt13'>]</span><span class='pt12'>"</span><span>) }</span></td></tr>
<tr><td class='ln' data-ln='39'></td><td> </td></tr>
<tr><td class='ln' data-ln='40'></td><td><span class='pt11 it'>//</span><span class='pt11'> removeEmptyPort strips the empty port in ":port" to ""</span></td></tr>
<tr><td class='ln' data-ln='41'></td><td><span class='pt11 it'>//</span><span class='pt11'> as mandated by RFC 3986 Section 6.2.3.</span></td></tr>
<tr><td class='ln' data-ln='42'></td><td><span class='pt20'>func</span><span> </span><span class='pt9'>removeEmptyPort</span><span>(</span><span class='it'>host</span><span> </span><span class='pt20'>string</span><span>) </span><span class='pt20'>string</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='43'></td><td><span> </span><span class='pt20'>if</span><span> </span><span class='pt9'>hasPort</span><span>(host) {</span></td></tr>
<tr><td class='ln' data-ln='44'></td><td><span> </span><span class='pt20'>return</span><span> strings.</span><span class='pt9'>TrimSuffix</span><span>(host, </span><span class='pt12'>"</span><span class='pt13'>:</span><span class='pt12'>"</span><span>)</span></td></tr>
<tr><td class='ln' data-ln='45'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='46'></td><td><span> </span><span class='pt20'>return</span><span> host</span></td></tr>
<tr><td class='ln' data-ln='47'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='48'></td><td> </td></tr>
<tr><td class='ln' data-ln='49'></td><td><span class='pt20'>func</span><span> </span><span class='pt9'>isNotToken</span><span>(</span><span class='it'>r</span><span> </span><span class='pt20'>rune</span><span>) </span><span class='pt20'>bool</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='50'></td><td><span> </span><span class='pt20'>return</span><span> </span><span class='pt5'>!</span><span>httplex.</span><span class='pt9'>IsTokenRune</span><span>(r)</span></td></tr>
<tr><td class='ln' data-ln='51'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='52'></td><td> </td></tr>
<tr><td class='ln' data-ln='53'></td><td><span class='pt20'>func</span><span> </span><span class='pt9'>isASCII</span><span>(</span><span class='it'>s</span><span> </span><span class='pt20'>string</span><span>) </span><span class='pt20'>bool</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='54'></td><td><span> </span><span class='pt20'>for</span><span> </span><span class='pt26'>i</span><span> </span><span class='pt5'>:=</span><span> </span><span class='pt24'>0</span><span>; i </span><span class='pt5'><</span><span> </span><span class='pt5'>len</span><span>(s); i</span><span class='pt5'>++</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='55'></td><td><span> </span><span class='pt20'>if</span><span> s[i] </span><span class='pt5'>>=</span><span> utf8.</span><span class='pt26'>RuneSelf</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='56'></td><td><span> </span><span class='pt20'>return</span><span> </span><span class='pt24'>false</span></td></tr>
<tr><td class='ln' data-ln='57'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='58'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='59'></td><td><span> </span><span class='pt20'>return</span><span> </span><span class='pt24'>true</span></td></tr>
<tr><td class='ln' data-ln='60'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='61'></td><td> </td></tr>
<tr><td class='ln' data-ln='62'></td><td><span class='pt20'>func</span><span> </span><span class='pt9'>hexEscapeNonASCII</span><span>(</span><span class='it'>s</span><span> </span><span class='pt20'>string</span><span>) </span><span class='pt20'>string</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='63'></td><td><span> </span><span class='pt26'>newLen</span><span> </span><span class='pt5'>:=</span><span> </span><span class='pt24'>0</span></td></tr>
<tr><td class='ln' data-ln='64'></td><td><span> </span><span class='pt20'>for</span><span> </span><span class='pt26'>i</span><span> </span><span class='pt5'>:=</span><span> </span><span class='pt24'>0</span><span>; i </span><span class='pt5'><</span><span> </span><span class='pt5'>len</span><span>(s); i</span><span class='pt5'>++</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='65'></td><td><span> </span><span class='pt20'>if</span><span> s[i] </span><span class='pt5'>>=</span><span> utf8.</span><span class='pt26'>RuneSelf</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='66'></td><td><span> newLen </span><span class='pt5'>+=</span><span> </span><span class='pt24'>3</span></td></tr>
<tr><td class='ln' data-ln='67'></td><td><span> } </span><span class='pt20'>else</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='68'></td><td><span> newLen</span><span class='pt5'>++</span></td></tr>
<tr><td class='ln' data-ln='69'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='70'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='71'></td><td><span> </span><span class='pt20'>if</span><span> newLen </span><span class='pt5'>==</span><span> </span><span class='pt5'>len</span><span>(s) {</span></td></tr>
<tr><td class='ln' data-ln='72'></td><td><span> </span><span class='pt20'>return</span><span> s</span></td></tr>
<tr><td class='ln' data-ln='73'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='74'></td><td><span> </span><span class='pt26'>b</span><span> </span><span class='pt5'>:=</span><span> </span><span class='pt5'>make</span><span>([]</span><span class='pt20'>byte</span><span>, </span><span class='pt24'>0</span><span>, newLen)</span></td></tr>
<tr><td class='ln' data-ln='75'></td><td><span> </span><span class='pt20'>for</span><span> </span><span class='pt26'>i</span><span> </span><span class='pt5'>:=</span><span> </span><span class='pt24'>0</span><span>; i </span><span class='pt5'><</span><span> </span><span class='pt5'>len</span><span>(s); i</span><span class='pt5'>++</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='76'></td><td><span> </span><span class='pt20'>if</span><span> s[i] </span><span class='pt5'>>=</span><span> utf8.</span><span class='pt26'>RuneSelf</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='77'></td><td><span> b </span><span class='pt5'>=</span><span> </span><span class='pt5'>append</span><span>(b, </span><span class='pt12'>'</span><span class='pt13'>%</span><span class='pt12'>'</span><span>)</span></td></tr>
<tr><td class='ln' data-ln='78'></td><td><span> b </span><span class='pt5'>=</span><span> strconv.</span><span class='pt9'>AppendInt</span><span>(b, </span><span class='pt20'>int64</span><span>(s[i]), </span><span class='pt24'>16</span><span>)</span></td></tr>
<tr><td class='ln' data-ln='79'></td><td><span> } </span><span class='pt20'>else</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='80'></td><td><span> b </span><span class='pt5'>=</span><span> </span><span class='pt5'>append</span><span>(b, s[i])</span></td></tr>
<tr><td class='ln' data-ln='81'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='82'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='83'></td><td><span> </span><span class='pt20'>return</span><span> </span><span class='pt20'>string</span><span>(b)</span></td></tr>
<tr><td class='ln' data-ln='84'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='85'></td><td> </td></tr>
<tr><td class='ln' data-ln='86'></td><td><span class='pt11 it'>//</span><span class='pt11'> NoBody is an io.ReadCloser with no bytes. Read always returns EOF</span></td></tr>
<tr><td class='ln' data-ln='87'></td><td><span class='pt11 it'>//</span><span class='pt11'> and Close always returns nil. It can be used in an outgoing client</span></td></tr>
<tr><td class='ln' data-ln='88'></td><td><span class='pt11 it'>//</span><span class='pt11'> request to explicitly signal that a request has zero bytes.</span></td></tr>
<tr><td class='ln' data-ln='89'></td><td><span class='pt11 it'>//</span><span class='pt11'> An alternative, however, is to simply set Request.Body to nil.</span></td></tr>
<tr><td class='ln' data-ln='90'></td><td><span class='pt20'>var</span><span> </span><span class='pt26'>NoBody</span><span> </span><span class='pt5'>=</span><span> noBody{}</span></td></tr>
<tr><td class='ln' data-ln='91'></td><td> </td></tr>
<tr><td class='ln' data-ln='92'></td><td><span class='pt20'>type</span><span> </span><span class='pt28'>noBody</span><span> </span><span class='pt20'>struct</span><span>{}</span></td></tr>
<tr><td class='ln' data-ln='93'></td><td> </td></tr>
<tr><td class='ln' data-ln='94'></td><td><span class='pt20'>func</span><span> (noBody) </span><span class='pt9'>Read</span><span>([]</span><span class='pt20'>byte</span><span>) (</span><span class='pt20'>int</span><span>, </span><span class='pt20'>error</span><span>) { </span><span class='pt20'>return</span><span> </span><span class='pt24'>0</span><span>, io.</span><span class='pt26'>EOF</span><span> }</span></td></tr>
<tr><td class='ln' data-ln='95'></td><td><span class='pt20'>func</span><span> (noBody) </span><span class='pt9'>Close</span><span>() </span><span class='pt20'>error</span><span> { </span><span class='pt20'>return</span><span> </span><span class='pt24'>nil</span><span> }</span></td></tr>
<tr><td class='ln' data-ln='96'></td><td><span class='pt20'>func</span><span> (noBody) </span><span class='pt9'>WriteTo</span><span>(io.Writer) (</span><span class='pt20'>int64</span><span>, </span><span class='pt20'>error</span><span>) { </span><span class='pt20'>return</span><span> </span><span class='pt24'>0</span><span>, </span><span class='pt24'>nil</span><span> }</span></td></tr>
<tr><td class='ln' data-ln='97'></td><td> </td></tr>
<tr><td class='ln' data-ln='98'></td><td><span class='pt20'>var</span><span> (</span></td></tr>
<tr><td class='ln' data-ln='99'></td><td><span> </span><span class='pt11 it'>//</span><span class='pt11'> verify that an io.Copy from NoBody won't require a buffer:</span></td></tr>
<tr><td class='ln' data-ln='100'></td><td><span> </span><span class='pt26'>_</span><span> io.</span><span class='pt26'>WriterTo</span><span> </span><span class='pt5'>=</span><span> NoBody</span></td></tr>
<tr><td class='ln' data-ln='101'></td><td><span> </span><span class='pt26'>_</span><span> io.</span><span class='pt26'>ReadCloser</span><span> </span><span class='pt5'>=</span><span> NoBody</span></td></tr>
<tr><td class='ln' data-ln='102'></td><td><span>)</span></td></tr>
<tr><td class='ln' data-ln='103'></td><td> </td></tr>
<tr><td class='ln' data-ln='104'></td><td><span class='pt11 it'>//</span><span class='pt11'> PushOptions describes options for Pusher.Push.</span></td></tr>
<tr><td class='ln' data-ln='105'></td><td><span class='pt20'>type</span><span> </span><span class='pt28'>PushOptions</span><span> </span><span class='pt20'>struct</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='106'></td><td><span> </span><span class='pt11 it'>//</span><span class='pt11'> Method specifies the HTTP method for the promised request.</span></td></tr>
<tr><td class='ln' data-ln='107'></td><td><span> </span><span class='pt11 it'>//</span><span class='pt11'> If set, it must be "GET" or "HEAD". Empty means "GET".</span></td></tr>
<tr><td class='ln' data-ln='108'></td><td><span> </span><span class='pt26'>Method</span><span> </span><span class='pt20'>string</span></td></tr>
<tr><td class='ln' data-ln='109'></td><td> </td></tr>
<tr><td class='ln' data-ln='110'></td><td><span> </span><span class='pt11 it'>//</span><span class='pt11'> Header specifies additional promised request headers. This cannot</span></td></tr>
<tr><td class='ln' data-ln='111'></td><td><span> </span><span class='pt11 it'>//</span><span class='pt11'> include HTTP/2 pseudo header fields like ":path" and ":scheme",</span></td></tr>
<tr><td class='ln' data-ln='112'></td><td><span> </span><span class='pt11 it'>//</span><span class='pt11'> which will be added automatically.</span></td></tr>
<tr><td class='ln' data-ln='113'></td><td><span> </span><span class='pt26'>Header</span><span> Header</span></td></tr>
<tr><td class='ln' data-ln='114'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='115'></td><td> </td></tr>
<tr><td class='ln' data-ln='116'></td><td><span class='pt11 it'>//</span><span class='pt11'> Pusher is the interface implemented by ResponseWriters that support</span></td></tr>
<tr><td class='ln' data-ln='117'></td><td><span class='pt11 it'>//</span><span class='pt11'> HTTP/2 server push. For more background, see</span></td></tr>
<tr><td class='ln' data-ln='118'></td><td><span class='pt11 it'>//</span><span class='pt11'> https://tools.ietf.org/html/rfc7540#section-8.2.</span></td></tr>
<tr><td class='ln' data-ln='119'></td><td><span class='pt20'>type</span><span> </span><span class='pt28'>Pusher</span><span> </span><span class='pt20'>interface</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='120'></td><td><span> </span><span class='pt11 it'>//</span><span class='pt11'> Push initiates an HTTP/2 server push. This constructs a synthetic</span></td></tr>
<tr><td class='ln' data-ln='121'></td><td><span> </span><span class='pt11 it'>//</span><span class='pt11'> request using the given target and options, serializes that request</span></td></tr>
<tr><td class='ln' data-ln='122'></td><td><span> </span><span class='pt11 it'>//</span><span class='pt11'> into a PUSH_PROMISE frame, then dispatches that request using the</span></td></tr>
<tr><td class='ln' data-ln='123'></td><td><span> </span><span class='pt11 it'>//</span><span class='pt11'> server's request handler. If opts is nil, default options are used.</span></td></tr>
<tr><td class='ln' data-ln='124'></td><td><span> </span><span class='pt11 it'>//</span></td></tr>
<tr><td class='ln' data-ln='125'></td><td><span> </span><span class='pt11 it'>//</span><span class='pt11'> The target must either be an absolute path (like "/path") or an absolute</span></td></tr>
<tr><td class='ln' data-ln='126'></td><td><span> </span><span class='pt11 it'>//</span><span class='pt11'> URL that contains a valid host and the same scheme as the parent request.</span></td></tr>
<tr><td class='ln' data-ln='127'></td><td><span> </span><span class='pt11 it'>//</span><span class='pt11'> If the target is a path, it will inherit the scheme and host of the</span></td></tr>
<tr><td class='ln' data-ln='128'></td><td><span> </span><span class='pt11 it'>//</span><span class='pt11'> parent request.</span></td></tr>
<tr><td class='ln' data-ln='129'></td><td><span> </span><span class='pt11 it'>//</span></td></tr>
<tr><td class='ln' data-ln='130'></td><td><span> </span><span class='pt11 it'>//</span><span class='pt11'> The HTTP/2 spec disallows recursive pushes and cross-authority pushes.</span></td></tr>
<tr><td class='ln' data-ln='131'></td><td><span> </span><span class='pt11 it'>//</span><span class='pt11'> Push may or may not detect these invalid pushes; however, invalid</span></td></tr>
<tr><td class='ln' data-ln='132'></td><td><span> </span><span class='pt11 it'>//</span><span class='pt11'> pushes will be detected and canceled by conforming clients.</span></td></tr>
<tr><td class='ln' data-ln='133'></td><td><span> </span><span class='pt11 it'>//</span></td></tr>
<tr><td class='ln' data-ln='134'></td><td><span> </span><span class='pt11 it'>//</span><span class='pt11'> Handlers that wish to push URL X should call Push before sending any</span></td></tr>
<tr><td class='ln' data-ln='135'></td><td><span> </span><span class='pt11 it'>//</span><span class='pt11'> data that may trigger a request for URL X. This avoids a race where the</span></td></tr>
<tr><td class='ln' data-ln='136'></td><td><span> </span><span class='pt11 it'>//</span><span class='pt11'> client issues requests for X before receiving the PUSH_PROMISE for X.</span></td></tr>
<tr><td class='ln' data-ln='137'></td><td><span> </span><span class='pt11 it'>//</span></td></tr>
<tr><td class='ln' data-ln='138'></td><td><span> </span><span class='pt11 it'>//</span><span class='pt11'> Push returns ErrNotSupported if the client has disabled push or if push</span></td></tr>
<tr><td class='ln' data-ln='139'></td><td><span> </span><span class='pt11 it'>//</span><span class='pt11'> is not supported on the underlying connection.</span></td></tr>
<tr><td class='ln' data-ln='140'></td><td><span> </span><span class='pt9'>Push</span><span>(target </span><span class='pt20'>string</span><span>, opts </span><span class='pt5'>*</span><span>PushOptions) </span><span class='pt20'>error</span></td></tr>
<tr><td class='ln' data-ln='141'></td><td><span>}</span></td></tr>
</table>
</div>
</div>
</div>
<div class='style' id='P--one_light--go'>
<div class='P--one_light-bordered'>
<div class="info header">
<span class="left">http.go</span>
<span class="right"><span>141 lines</span><span>4.26 KB</span></span>
</div>
<div class='P--one_light'>
<table>
<tr><td class='ln' data-ln='1'></td><td><span class='pt13'>// Copyright 2016 The Go Authors. All rights reserved.</span></td></tr>
<tr><td class='ln' data-ln='2'></td><td><span class='pt13'>// Use of this source code is governed by a BSD-style</span></td></tr>
<tr><td class='ln' data-ln='3'></td><td><span class='pt13'>// license that can be found in the LICENSE file.</span></td></tr>
<tr><td class='ln' data-ln='4'></td><td> </td></tr>
<tr><td class='ln' data-ln='5'></td><td><span class='pt14'>package</span><span> http</span></td></tr>
<tr><td class='ln' data-ln='6'></td><td> </td></tr>
<tr><td class='ln' data-ln='7'></td><td class='hi'><span class='pt14'>import</span><span> (</span></td></tr>
<tr><td class='ln' data-ln='8'></td><td class='hi'><span> </span><span class='pt8'>"io"</span></td></tr>
<tr><td class='ln' data-ln='9'></td><td class='hi'><span> </span><span class='pt8'>"strconv"</span></td></tr>
<tr><td class='ln' data-ln='10'></td><td class='hi'><span> </span><span class='pt8'>"strings"</span></td></tr>
<tr><td class='ln' data-ln='11'></td><td class='hi'><span> </span><span class='pt8'>"time"</span></td></tr>
<tr><td class='ln' data-ln='12'></td><td class='hi'><span> </span><span class='pt8'>"unicode/utf8"</span></td></tr>
<tr><td class='ln' data-ln='13'></td><td class='hi'> </td></tr>
<tr><td class='ln' data-ln='14'></td><td class='hi'><span> </span><span class='pt8'>"golang_org/x/net/lex/httplex"</span></td></tr>
<tr><td class='ln' data-ln='15'></td><td class='hi'><span>)</span></td></tr>
<tr><td class='ln' data-ln='16'></td><td> </td></tr>
<tr><td class='ln' data-ln='17'></td><td><span class='pt13'>// maxInt64 is the effective "infinite" value for the Server and</span></td></tr>
<tr><td class='ln' data-ln='18'></td><td><span class='pt13'>// Transport's byte-limiting readers.</span></td></tr>
<tr><td class='ln' data-ln='19'></td><td><span class='pt14'>const</span><span> maxInt64 = </span><span class='pt12'>1</span><span><<</span><span class='pt12'>63</span><span> - </span><span class='pt12'>1</span></td></tr>
<tr><td class='ln' data-ln='20'></td><td> </td></tr>
<tr><td class='ln' data-ln='21'></td><td><span class='pt13'>// aLongTimeAgo is a non-zero time, far in the past, used for</span></td></tr>
<tr><td class='ln' data-ln='22'></td><td><span class='pt13'>// immediate cancelation of network operations.</span></td></tr>
<tr><td class='ln' data-ln='23'></td><td><span class='pt14'>var</span><span> </span><span class='pt17'>aLongTimeAgo</span><span> = time.</span><span class='pt7'>Unix</span><span>(</span><span class='pt12'>1</span><span>, </span><span class='pt12'>0</span><span>)</span></td></tr>
<tr><td class='ln' data-ln='24'></td><td> </td></tr>
<tr><td class='ln' data-ln='25'></td><td><span class='pt13'>// TODO(bradfitz): move common stuff here. The other files have accumulated</span></td></tr>
<tr><td class='ln' data-ln='26'></td><td><span class='pt13'>// generic http stuff in random places.</span></td></tr>
<tr><td class='ln' data-ln='27'></td><td> </td></tr>
<tr><td class='ln' data-ln='28'></td><td><span class='pt13'>// contextKey is a value for use with context.WithValue. It's used as</span></td></tr>
<tr><td class='ln' data-ln='29'></td><td><span class='pt13'>// a pointer so it fits in an interface{} without allocation.</span></td></tr>
<tr><td class='ln' data-ln='30'></td><td><span class='pt14'>type</span><span> </span><span class='pt15'>contextKey</span><span> </span><span class='pt14'>struct</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='31'></td><td><span> </span><span class='pt17'>name</span><span> </span><span class='pt14'>string</span></td></tr>
<tr><td class='ln' data-ln='32'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='33'></td><td> </td></tr>
<tr><td class='ln' data-ln='34'></td><td><span class='pt14'>func</span><span> (k *contextKey) </span><span class='pt7'>String</span><span>() </span><span class='pt14'>string</span><span> { </span><span class='pt14'>return</span><span> </span><span class='pt8'>"net/http context value "</span><span> + k.</span><span class='pt17'>name</span><span> }</span></td></tr>
<tr><td class='ln' data-ln='35'></td><td> </td></tr>
<tr><td class='ln' data-ln='36'></td><td><span class='pt13'>// Given a string of the form "host", "host:port", or "[ipv6::address]:port",</span></td></tr>
<tr><td class='ln' data-ln='37'></td><td><span class='pt13'>// return true if the string includes a port.</span></td></tr>
<tr><td class='ln' data-ln='38'></td><td><span class='pt14'>func</span><span> </span><span class='pt7'>hasPort</span><span>(s </span><span class='pt14'>string</span><span>) </span><span class='pt14'>bool</span><span> { </span><span class='pt14'>return</span><span> strings.</span><span class='pt7'>LastIndex</span><span>(s, </span><span class='pt8'>":"</span><span>) > strings.</span><span class='pt7'>LastIndex</span><span>(s, </span><span class='pt8'>"]"</span><span>) }</span></td></tr>
<tr><td class='ln' data-ln='39'></td><td> </td></tr>
<tr><td class='ln' data-ln='40'></td><td><span class='pt13'>// removeEmptyPort strips the empty port in ":port" to ""</span></td></tr>
<tr><td class='ln' data-ln='41'></td><td><span class='pt13'>// as mandated by RFC 3986 Section 6.2.3.</span></td></tr>
<tr><td class='ln' data-ln='42'></td><td><span class='pt14'>func</span><span> </span><span class='pt7'>removeEmptyPort</span><span>(host </span><span class='pt14'>string</span><span>) </span><span class='pt14'>string</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='43'></td><td><span> </span><span class='pt14'>if</span><span> </span><span class='pt7'>hasPort</span><span>(host) {</span></td></tr>
<tr><td class='ln' data-ln='44'></td><td><span> </span><span class='pt14'>return</span><span> strings.</span><span class='pt7'>TrimSuffix</span><span>(host, </span><span class='pt8'>":"</span><span>)</span></td></tr>
<tr><td class='ln' data-ln='45'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='46'></td><td><span> </span><span class='pt14'>return</span><span> host</span></td></tr>
<tr><td class='ln' data-ln='47'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='48'></td><td> </td></tr>
<tr><td class='ln' data-ln='49'></td><td><span class='pt14'>func</span><span> </span><span class='pt7'>isNotToken</span><span>(r </span><span class='pt14'>rune</span><span>) </span><span class='pt14'>bool</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='50'></td><td><span> </span><span class='pt14'>return</span><span> !httplex.</span><span class='pt7'>IsTokenRune</span><span>(r)</span></td></tr>
<tr><td class='ln' data-ln='51'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='52'></td><td> </td></tr>
<tr><td class='ln' data-ln='53'></td><td><span class='pt14'>func</span><span> </span><span class='pt7'>isASCII</span><span>(s </span><span class='pt14'>string</span><span>) </span><span class='pt14'>bool</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='54'></td><td><span> </span><span class='pt14'>for</span><span> </span><span class='pt17'>i</span><span> := </span><span class='pt12'>0</span><span>; i < </span><span class='pt4'>len</span><span>(s); i++ {</span></td></tr>
<tr><td class='ln' data-ln='55'></td><td><span> </span><span class='pt14'>if</span><span> s[i] >= utf8.</span><span class='pt17'>RuneSelf</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='56'></td><td><span> </span><span class='pt14'>return</span><span> </span><span class='pt12'>false</span></td></tr>
<tr><td class='ln' data-ln='57'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='58'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='59'></td><td><span> </span><span class='pt14'>return</span><span> </span><span class='pt12'>true</span></td></tr>
<tr><td class='ln' data-ln='60'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='61'></td><td> </td></tr>
<tr><td class='ln' data-ln='62'></td><td><span class='pt14'>func</span><span> </span><span class='pt7'>hexEscapeNonASCII</span><span>(s </span><span class='pt14'>string</span><span>) </span><span class='pt14'>string</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='63'></td><td><span> </span><span class='pt17'>newLen</span><span> := </span><span class='pt12'>0</span></td></tr>
<tr><td class='ln' data-ln='64'></td><td><span> </span><span class='pt14'>for</span><span> </span><span class='pt17'>i</span><span> := </span><span class='pt12'>0</span><span>; i < </span><span class='pt4'>len</span><span>(s); i++ {</span></td></tr>
<tr><td class='ln' data-ln='65'></td><td><span> </span><span class='pt14'>if</span><span> s[i] >= utf8.</span><span class='pt17'>RuneSelf</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='66'></td><td><span> newLen += </span><span class='pt12'>3</span></td></tr>
<tr><td class='ln' data-ln='67'></td><td><span> } </span><span class='pt14'>else</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='68'></td><td><span> newLen++</span></td></tr>
<tr><td class='ln' data-ln='69'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='70'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='71'></td><td><span> </span><span class='pt14'>if</span><span> newLen == </span><span class='pt4'>len</span><span>(s) {</span></td></tr>
<tr><td class='ln' data-ln='72'></td><td><span> </span><span class='pt14'>return</span><span> s</span></td></tr>
<tr><td class='ln' data-ln='73'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='74'></td><td><span> </span><span class='pt17'>b</span><span> := </span><span class='pt4'>make</span><span>([]</span><span class='pt14'>byte</span><span>, </span><span class='pt12'>0</span><span>, newLen)</span></td></tr>
<tr><td class='ln' data-ln='75'></td><td><span> </span><span class='pt14'>for</span><span> </span><span class='pt17'>i</span><span> := </span><span class='pt12'>0</span><span>; i < </span><span class='pt4'>len</span><span>(s); i++ {</span></td></tr>
<tr><td class='ln' data-ln='76'></td><td><span> </span><span class='pt14'>if</span><span> s[i] >= utf8.</span><span class='pt17'>RuneSelf</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='77'></td><td><span> b = </span><span class='pt4'>append</span><span>(b, </span><span class='pt8'>'%'</span><span>)</span></td></tr>
<tr><td class='ln' data-ln='78'></td><td><span> b = strconv.</span><span class='pt7'>AppendInt</span><span>(b, </span><span class='pt14'>int64</span><span>(s[i]), </span><span class='pt12'>16</span><span>)</span></td></tr>
<tr><td class='ln' data-ln='79'></td><td><span> } </span><span class='pt14'>else</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='80'></td><td><span> b = </span><span class='pt4'>append</span><span>(b, s[i])</span></td></tr>
<tr><td class='ln' data-ln='81'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='82'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='83'></td><td><span> </span><span class='pt14'>return</span><span> </span><span class='pt14'>string</span><span>(b)</span></td></tr>
<tr><td class='ln' data-ln='84'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='85'></td><td> </td></tr>
<tr><td class='ln' data-ln='86'></td><td><span class='pt13'>// NoBody is an io.ReadCloser with no bytes. Read always returns EOF</span></td></tr>
<tr><td class='ln' data-ln='87'></td><td><span class='pt13'>// and Close always returns nil. It can be used in an outgoing client</span></td></tr>
<tr><td class='ln' data-ln='88'></td><td><span class='pt13'>// request to explicitly signal that a request has zero bytes.</span></td></tr>
<tr><td class='ln' data-ln='89'></td><td><span class='pt13'>// An alternative, however, is to simply set Request.Body to nil.</span></td></tr>
<tr><td class='ln' data-ln='90'></td><td><span class='pt14'>var</span><span> </span><span class='pt17'>NoBody</span><span> = noBody{}</span></td></tr>
<tr><td class='ln' data-ln='91'></td><td> </td></tr>
<tr><td class='ln' data-ln='92'></td><td><span class='pt14'>type</span><span> </span><span class='pt15'>noBody</span><span> </span><span class='pt14'>struct</span><span>{}</span></td></tr>
<tr><td class='ln' data-ln='93'></td><td> </td></tr>
<tr><td class='ln' data-ln='94'></td><td><span class='pt14'>func</span><span> (noBody) </span><span class='pt7'>Read</span><span>([]</span><span class='pt14'>byte</span><span>) (</span><span class='pt14'>int</span><span>, </span><span class='pt14'>error</span><span>) { </span><span class='pt14'>return</span><span> </span><span class='pt12'>0</span><span>, io.</span><span class='pt17'>EOF</span><span> }</span></td></tr>
<tr><td class='ln' data-ln='95'></td><td><span class='pt14'>func</span><span> (noBody) </span><span class='pt7'>Close</span><span>() </span><span class='pt14'>error</span><span> { </span><span class='pt14'>return</span><span> </span><span class='pt12'>nil</span><span> }</span></td></tr>
<tr><td class='ln' data-ln='96'></td><td><span class='pt14'>func</span><span> (noBody) </span><span class='pt7'>WriteTo</span><span>(io.Writer) (</span><span class='pt14'>int64</span><span>, </span><span class='pt14'>error</span><span>) { </span><span class='pt14'>return</span><span> </span><span class='pt12'>0</span><span>, </span><span class='pt12'>nil</span><span> }</span></td></tr>
<tr><td class='ln' data-ln='97'></td><td> </td></tr>
<tr><td class='ln' data-ln='98'></td><td><span class='pt14'>var</span><span> (</span></td></tr>
<tr><td class='ln' data-ln='99'></td><td><span> </span><span class='pt13'>// verify that an io.Copy from NoBody won't require a buffer:</span></td></tr>
<tr><td class='ln' data-ln='100'></td><td><span> </span><span class='pt17'>_</span><span> io.</span><span class='pt17'>WriterTo</span><span> = NoBody</span></td></tr>
<tr><td class='ln' data-ln='101'></td><td><span> </span><span class='pt17'>_</span><span> io.</span><span class='pt17'>ReadCloser</span><span> = NoBody</span></td></tr>
<tr><td class='ln' data-ln='102'></td><td><span>)</span></td></tr>
<tr><td class='ln' data-ln='103'></td><td> </td></tr>
<tr><td class='ln' data-ln='104'></td><td><span class='pt13'>// PushOptions describes options for Pusher.Push.</span></td></tr>
<tr><td class='ln' data-ln='105'></td><td><span class='pt14'>type</span><span> </span><span class='pt15'>PushOptions</span><span> </span><span class='pt14'>struct</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='106'></td><td><span> </span><span class='pt13'>// Method specifies the HTTP method for the promised request.</span></td></tr>
<tr><td class='ln' data-ln='107'></td><td><span> </span><span class='pt13'>// If set, it must be "GET" or "HEAD". Empty means "GET".</span></td></tr>
<tr><td class='ln' data-ln='108'></td><td><span> </span><span class='pt17'>Method</span><span> </span><span class='pt14'>string</span></td></tr>
<tr><td class='ln' data-ln='109'></td><td> </td></tr>
<tr><td class='ln' data-ln='110'></td><td><span> </span><span class='pt13'>// Header specifies additional promised request headers. This cannot</span></td></tr>
<tr><td class='ln' data-ln='111'></td><td><span> </span><span class='pt13'>// include HTTP/2 pseudo header fields like ":path" and ":scheme",</span></td></tr>
<tr><td class='ln' data-ln='112'></td><td><span> </span><span class='pt13'>// which will be added automatically.</span></td></tr>
<tr><td class='ln' data-ln='113'></td><td><span> </span><span class='pt17'>Header</span><span> Header</span></td></tr>
<tr><td class='ln' data-ln='114'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='115'></td><td> </td></tr>
<tr><td class='ln' data-ln='116'></td><td><span class='pt13'>// Pusher is the interface implemented by ResponseWriters that support</span></td></tr>
<tr><td class='ln' data-ln='117'></td><td><span class='pt13'>// HTTP/2 server push. For more background, see</span></td></tr>
<tr><td class='ln' data-ln='118'></td><td><span class='pt13'>// https://tools.ietf.org/html/rfc7540#section-8.2.</span></td></tr>
<tr><td class='ln' data-ln='119'></td><td><span class='pt14'>type</span><span> </span><span class='pt15'>Pusher</span><span> </span><span class='pt14'>interface</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='120'></td><td><span> </span><span class='pt13'>// Push initiates an HTTP/2 server push. This constructs a synthetic</span></td></tr>
<tr><td class='ln' data-ln='121'></td><td><span> </span><span class='pt13'>// request using the given target and options, serializes that request</span></td></tr>
<tr><td class='ln' data-ln='122'></td><td><span> </span><span class='pt13'>// into a PUSH_PROMISE frame, then dispatches that request using the</span></td></tr>
<tr><td class='ln' data-ln='123'></td><td><span> </span><span class='pt13'>// server's request handler. If opts is nil, default options are used.</span></td></tr>
<tr><td class='ln' data-ln='124'></td><td><span> </span><span class='pt13'>//</span></td></tr>
<tr><td class='ln' data-ln='125'></td><td><span> </span><span class='pt13'>// The target must either be an absolute path (like "/path") or an absolute</span></td></tr>
<tr><td class='ln' data-ln='126'></td><td><span> </span><span class='pt13'>// URL that contains a valid host and the same scheme as the parent request.</span></td></tr>
<tr><td class='ln' data-ln='127'></td><td><span> </span><span class='pt13'>// If the target is a path, it will inherit the scheme and host of the</span></td></tr>
<tr><td class='ln' data-ln='128'></td><td><span> </span><span class='pt13'>// parent request.</span></td></tr>
<tr><td class='ln' data-ln='129'></td><td><span> </span><span class='pt13'>//</span></td></tr>
<tr><td class='ln' data-ln='130'></td><td><span> </span><span class='pt13'>// The HTTP/2 spec disallows recursive pushes and cross-authority pushes.</span></td></tr>
<tr><td class='ln' data-ln='131'></td><td><span> </span><span class='pt13'>// Push may or may not detect these invalid pushes; however, invalid</span></td></tr>
<tr><td class='ln' data-ln='132'></td><td><span> </span><span class='pt13'>// pushes will be detected and canceled by conforming clients.</span></td></tr>
<tr><td class='ln' data-ln='133'></td><td><span> </span><span class='pt13'>//</span></td></tr>
<tr><td class='ln' data-ln='134'></td><td><span> </span><span class='pt13'>// Handlers that wish to push URL X should call Push before sending any</span></td></tr>
<tr><td class='ln' data-ln='135'></td><td><span> </span><span class='pt13'>// data that may trigger a request for URL X. This avoids a race where the</span></td></tr>
<tr><td class='ln' data-ln='136'></td><td><span> </span><span class='pt13'>// client issues requests for X before receiving the PUSH_PROMISE for X.</span></td></tr>
<tr><td class='ln' data-ln='137'></td><td><span> </span><span class='pt13'>//</span></td></tr>
<tr><td class='ln' data-ln='138'></td><td><span> </span><span class='pt13'>// Push returns ErrNotSupported if the client has disabled push or if push</span></td></tr>
<tr><td class='ln' data-ln='139'></td><td><span> </span><span class='pt13'>// is not supported on the underlying connection.</span></td></tr>
<tr><td class='ln' data-ln='140'></td><td><span> </span><span class='pt7'>Push</span><span>(target </span><span class='pt14'>string</span><span>, opts *PushOptions) </span><span class='pt14'>error</span></td></tr>
<tr><td class='ln' data-ln='141'></td><td><span>}</span></td></tr>
</table>
</div>
</div>
</div>
<div class='style' id='P--one_monokai--go'>
<div class='P--one_monokai-bordered'>
<div class="info header">
<span class="left">http.go</span>
<span class="right"><span>141 lines</span><span>4.26 KB</span></span>
</div>
<div class='P--one_monokai'>
<table>
<tr><td class='ln' data-ln='1'></td><td><span class='pt4 it'>// Copyright 2016 The Go Authors. All rights reserved.</span></td></tr>
<tr><td class='ln' data-ln='2'></td><td><span class='pt4 it'>// Use of this source code is governed by a BSD-style</span></td></tr>
<tr><td class='ln' data-ln='3'></td><td><span class='pt4 it'>// license that can be found in the LICENSE file.</span></td></tr>
<tr><td class='ln' data-ln='4'></td><td> </td></tr>
<tr><td class='ln' data-ln='5'></td><td><span class='pt10'>package</span><span> http</span></td></tr>
<tr><td class='ln' data-ln='6'></td><td> </td></tr>
<tr><td class='ln' data-ln='7'></td><td class='hi'><span class='pt10'>import</span><span> (</span></td></tr>
<tr><td class='ln' data-ln='8'></td><td class='hi'><span> </span><span class='pt11'>"io"</span></td></tr>
<tr><td class='ln' data-ln='9'></td><td class='hi'><span> </span><span class='pt11'>"strconv"</span></td></tr>
<tr><td class='ln' data-ln='10'></td><td class='hi'><span> </span><span class='pt11'>"strings"</span></td></tr>
<tr><td class='ln' data-ln='11'></td><td class='hi'><span> </span><span class='pt11'>"time"</span></td></tr>
<tr><td class='ln' data-ln='12'></td><td class='hi'><span> </span><span class='pt11'>"unicode/utf8"</span></td></tr>
<tr><td class='ln' data-ln='13'></td><td class='hi'> </td></tr>
<tr><td class='ln' data-ln='14'></td><td class='hi'><span> </span><span class='pt11'>"golang_org/x/net/lex/httplex"</span></td></tr>
<tr><td class='ln' data-ln='15'></td><td class='hi'><span>)</span></td></tr>
<tr><td class='ln' data-ln='16'></td><td> </td></tr>
<tr><td class='ln' data-ln='17'></td><td><span class='pt4 it'>// maxInt64 is the effective "infinite" value for the Server and</span></td></tr>
<tr><td class='ln' data-ln='18'></td><td><span class='pt4 it'>// Transport's byte-limiting readers.</span></td></tr>
<tr><td class='ln' data-ln='19'></td><td><span class='pt10'>const</span><span> maxInt64 </span><span class='pt10'>=</span><span> </span><span class='pt8'>1</span><span class='pt10'><<</span><span class='pt8'>63</span><span> </span><span class='pt10'>-</span><span> </span><span class='pt8'>1</span></td></tr>
<tr><td class='ln' data-ln='20'></td><td> </td></tr>
<tr><td class='ln' data-ln='21'></td><td><span class='pt4 it'>// aLongTimeAgo is a non-zero time, far in the past, used for</span></td></tr>
<tr><td class='ln' data-ln='22'></td><td><span class='pt4 it'>// immediate cancelation of network operations.</span></td></tr>
<tr><td class='ln' data-ln='23'></td><td><span class='pt3'>var</span><span> aLongTimeAgo </span><span class='pt10'>=</span><span> time.</span><span class='pt7'>Unix</span><span>(</span><span class='pt8'>1</span><span>, </span><span class='pt8'>0</span><span>)</span></td></tr>
<tr><td class='ln' data-ln='24'></td><td> </td></tr>
<tr><td class='ln' data-ln='25'></td><td><span class='pt4 it'>// TODO(bradfitz): move common stuff here. The other files have accumulated</span></td></tr>
<tr><td class='ln' data-ln='26'></td><td><span class='pt4 it'>// generic http stuff in random places.</span></td></tr>
<tr><td class='ln' data-ln='27'></td><td> </td></tr>
<tr><td class='ln' data-ln='28'></td><td><span class='pt4 it'>// contextKey is a value for use with context.WithValue. It's used as</span></td></tr>
<tr><td class='ln' data-ln='29'></td><td><span class='pt4 it'>// a pointer so it fits in an interface{} without allocation.</span></td></tr>
<tr><td class='ln' data-ln='30'></td><td><span class='pt3'>type</span><span> </span><span class='pt5'>contextKey</span><span> </span><span class='pt3'>struct</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='31'></td><td><span> name </span><span class='pt3'>string</span></td></tr>
<tr><td class='ln' data-ln='32'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='33'></td><td> </td></tr>
<tr><td class='ln' data-ln='34'></td><td><span class='pt3'>func</span><span> (</span><span class='pt9 it'>k</span><span> </span><span class='pt10'>*</span><span>contextKey) </span><span class='pt7'>String</span><span>() </span><span class='pt3'>string</span><span> { </span><span class='pt10'>return</span><span> </span><span class='pt11'>"net/http context value "</span><span> </span><span class='pt10'>+</span><span> k.name }</span></td></tr>
<tr><td class='ln' data-ln='35'></td><td> </td></tr>
<tr><td class='ln' data-ln='36'></td><td><span class='pt4 it'>// Given a string of the form "host", "host:port", or "[ipv6::address]:port",</span></td></tr>
<tr><td class='ln' data-ln='37'></td><td><span class='pt4 it'>// return true if the string includes a port.</span></td></tr>
<tr><td class='ln' data-ln='38'></td><td><span class='pt3'>func</span><span> </span><span class='pt7'>hasPort</span><span>(</span><span class='pt9 it'>s</span><span> </span><span class='pt3'>string</span><span>) </span><span class='pt3'>bool</span><span> { </span><span class='pt10'>return</span><span> strings.</span><span class='pt7'>LastIndex</span><span>(s, </span><span class='pt11'>":"</span><span>) </span><span class='pt10'>></span><span> strings.</span><span class='pt7'>LastIndex</span><span>(s, </span><span class='pt11'>"]"</span><span>) }</span></td></tr>
<tr><td class='ln' data-ln='39'></td><td> </td></tr>
<tr><td class='ln' data-ln='40'></td><td><span class='pt4 it'>// removeEmptyPort strips the empty port in ":port" to ""</span></td></tr>
<tr><td class='ln' data-ln='41'></td><td><span class='pt4 it'>// as mandated by RFC 3986 Section 6.2.3.</span></td></tr>
<tr><td class='ln' data-ln='42'></td><td><span class='pt3'>func</span><span> </span><span class='pt7'>removeEmptyPort</span><span>(</span><span class='pt9 it'>host</span><span> </span><span class='pt3'>string</span><span>) </span><span class='pt3'>string</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='43'></td><td><span> </span><span class='pt10'>if</span><span> </span><span class='pt7'>hasPort</span><span>(host) {</span></td></tr>
<tr><td class='ln' data-ln='44'></td><td><span> </span><span class='pt10'>return</span><span> strings.</span><span class='pt7'>TrimSuffix</span><span>(host, </span><span class='pt11'>":"</span><span>)</span></td></tr>
<tr><td class='ln' data-ln='45'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='46'></td><td><span> </span><span class='pt10'>return</span><span> host</span></td></tr>
<tr><td class='ln' data-ln='47'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='48'></td><td> </td></tr>
<tr><td class='ln' data-ln='49'></td><td><span class='pt3'>func</span><span> </span><span class='pt7'>isNotToken</span><span>(</span><span class='pt9 it'>r</span><span> </span><span class='pt3'>rune</span><span>) </span><span class='pt3'>bool</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='50'></td><td><span> </span><span class='pt10'>return</span><span> </span><span class='pt10'>!</span><span>httplex.</span><span class='pt7'>IsTokenRune</span><span>(r)</span></td></tr>
<tr><td class='ln' data-ln='51'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='52'></td><td> </td></tr>
<tr><td class='ln' data-ln='53'></td><td><span class='pt3'>func</span><span> </span><span class='pt7'>isASCII</span><span>(</span><span class='pt9 it'>s</span><span> </span><span class='pt3'>string</span><span>) </span><span class='pt3'>bool</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='54'></td><td><span> </span><span class='pt10'>for</span><span> i </span><span class='pt10'>:=</span><span> </span><span class='pt8'>0</span><span>; i </span><span class='pt10'><</span><span> </span><span class='pt7'>len</span><span>(s); i</span><span class='pt10'>++</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='55'></td><td><span> </span><span class='pt10'>if</span><span> s[i] </span><span class='pt10'>>=</span><span> utf8.RuneSelf {</span></td></tr>
<tr><td class='ln' data-ln='56'></td><td><span> </span><span class='pt10'>return</span><span> </span><span class='pt3'>false</span></td></tr>
<tr><td class='ln' data-ln='57'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='58'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='59'></td><td><span> </span><span class='pt10'>return</span><span> </span><span class='pt3'>true</span></td></tr>
<tr><td class='ln' data-ln='60'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='61'></td><td> </td></tr>
<tr><td class='ln' data-ln='62'></td><td><span class='pt3'>func</span><span> </span><span class='pt7'>hexEscapeNonASCII</span><span>(</span><span class='pt9 it'>s</span><span> </span><span class='pt3'>string</span><span>) </span><span class='pt3'>string</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='63'></td><td><span> newLen </span><span class='pt10'>:=</span><span> </span><span class='pt8'>0</span></td></tr>
<tr><td class='ln' data-ln='64'></td><td><span> </span><span class='pt10'>for</span><span> i </span><span class='pt10'>:=</span><span> </span><span class='pt8'>0</span><span>; i </span><span class='pt10'><</span><span> </span><span class='pt7'>len</span><span>(s); i</span><span class='pt10'>++</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='65'></td><td><span> </span><span class='pt10'>if</span><span> s[i] </span><span class='pt10'>>=</span><span> utf8.RuneSelf {</span></td></tr>
<tr><td class='ln' data-ln='66'></td><td><span> newLen </span><span class='pt10'>+=</span><span> </span><span class='pt8'>3</span></td></tr>
<tr><td class='ln' data-ln='67'></td><td><span> } </span><span class='pt10'>else</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='68'></td><td><span> newLen</span><span class='pt10'>++</span></td></tr>
<tr><td class='ln' data-ln='69'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='70'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='71'></td><td><span> </span><span class='pt10'>if</span><span> newLen </span><span class='pt10'>==</span><span> </span><span class='pt7'>len</span><span>(s) {</span></td></tr>
<tr><td class='ln' data-ln='72'></td><td><span> </span><span class='pt10'>return</span><span> s</span></td></tr>
<tr><td class='ln' data-ln='73'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='74'></td><td><span> b </span><span class='pt10'>:=</span><span> </span><span class='pt7'>make</span><span>([]</span><span class='pt3'>byte</span><span>, </span><span class='pt8'>0</span><span>, newLen)</span></td></tr>
<tr><td class='ln' data-ln='75'></td><td><span> </span><span class='pt10'>for</span><span> i </span><span class='pt10'>:=</span><span> </span><span class='pt8'>0</span><span>; i </span><span class='pt10'><</span><span> </span><span class='pt7'>len</span><span>(s); i</span><span class='pt10'>++</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='76'></td><td><span> </span><span class='pt10'>if</span><span> s[i] </span><span class='pt10'>>=</span><span> utf8.RuneSelf {</span></td></tr>
<tr><td class='ln' data-ln='77'></td><td><span> b </span><span class='pt10'>=</span><span> </span><span class='pt7'>append</span><span>(b, </span><span class='pt11'>'%'</span><span>)</span></td></tr>
<tr><td class='ln' data-ln='78'></td><td><span> b </span><span class='pt10'>=</span><span> strconv.</span><span class='pt7'>AppendInt</span><span>(b, </span><span class='pt3'>int64</span><span>(s[i]), </span><span class='pt8'>16</span><span>)</span></td></tr>
<tr><td class='ln' data-ln='79'></td><td><span> } </span><span class='pt10'>else</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='80'></td><td><span> b </span><span class='pt10'>=</span><span> </span><span class='pt7'>append</span><span>(b, s[i])</span></td></tr>
<tr><td class='ln' data-ln='81'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='82'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='83'></td><td><span> </span><span class='pt10'>return</span><span> </span><span class='pt3'>string</span><span>(b)</span></td></tr>
<tr><td class='ln' data-ln='84'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='85'></td><td> </td></tr>
<tr><td class='ln' data-ln='86'></td><td><span class='pt4 it'>// NoBody is an io.ReadCloser with no bytes. Read always returns EOF</span></td></tr>
<tr><td class='ln' data-ln='87'></td><td><span class='pt4 it'>// and Close always returns nil. It can be used in an outgoing client</span></td></tr>
<tr><td class='ln' data-ln='88'></td><td><span class='pt4 it'>// request to explicitly signal that a request has zero bytes.</span></td></tr>
<tr><td class='ln' data-ln='89'></td><td><span class='pt4 it'>// An alternative, however, is to simply set Request.Body to nil.</span></td></tr>
<tr><td class='ln' data-ln='90'></td><td><span class='pt3'>var</span><span> NoBody </span><span class='pt10'>=</span><span> noBody{}</span></td></tr>
<tr><td class='ln' data-ln='91'></td><td> </td></tr>
<tr><td class='ln' data-ln='92'></td><td><span class='pt3'>type</span><span> </span><span class='pt5'>noBody</span><span> </span><span class='pt3'>struct</span><span>{}</span></td></tr>
<tr><td class='ln' data-ln='93'></td><td> </td></tr>
<tr><td class='ln' data-ln='94'></td><td><span class='pt3'>func</span><span> (noBody) </span><span class='pt7'>Read</span><span>([]</span><span class='pt3'>byte</span><span>) (</span><span class='pt3'>int</span><span>, </span><span class='pt3'>error</span><span>) { </span><span class='pt10'>return</span><span> </span><span class='pt8'>0</span><span>, io.EOF }</span></td></tr>
<tr><td class='ln' data-ln='95'></td><td><span class='pt3'>func</span><span> (noBody) </span><span class='pt7'>Close</span><span>() </span><span class='pt3'>error</span><span> { </span><span class='pt10'>return</span><span> </span><span class='pt3'>nil</span><span> }</span></td></tr>
<tr><td class='ln' data-ln='96'></td><td><span class='pt3'>func</span><span> (noBody) </span><span class='pt7'>WriteTo</span><span>(io.Writer) (</span><span class='pt3'>int64</span><span>, </span><span class='pt3'>error</span><span>) { </span><span class='pt10'>return</span><span> </span><span class='pt8'>0</span><span>, </span><span class='pt3'>nil</span><span> }</span></td></tr>
<tr><td class='ln' data-ln='97'></td><td> </td></tr>
<tr><td class='ln' data-ln='98'></td><td><span class='pt3'>var</span><span> (</span></td></tr>
<tr><td class='ln' data-ln='99'></td><td><span> </span><span class='pt4 it'>// verify that an io.Copy from NoBody won't require a buffer:</span></td></tr>
<tr><td class='ln' data-ln='100'></td><td><span> _ io.WriterTo </span><span class='pt10'>=</span><span> NoBody</span></td></tr>
<tr><td class='ln' data-ln='101'></td><td><span> _ io.ReadCloser </span><span class='pt10'>=</span><span> NoBody</span></td></tr>
<tr><td class='ln' data-ln='102'></td><td><span>)</span></td></tr>
<tr><td class='ln' data-ln='103'></td><td> </td></tr>
<tr><td class='ln' data-ln='104'></td><td><span class='pt4 it'>// PushOptions describes options for Pusher.Push.</span></td></tr>
<tr><td class='ln' data-ln='105'></td><td><span class='pt3'>type</span><span> </span><span class='pt5'>PushOptions</span><span> </span><span class='pt3'>struct</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='106'></td><td><span> </span><span class='pt4 it'>// Method specifies the HTTP method for the promised request.</span></td></tr>
<tr><td class='ln' data-ln='107'></td><td><span> </span><span class='pt4 it'>// If set, it must be "GET" or "HEAD". Empty means "GET".</span></td></tr>
<tr><td class='ln' data-ln='108'></td><td><span> Method </span><span class='pt3'>string</span></td></tr>
<tr><td class='ln' data-ln='109'></td><td> </td></tr>
<tr><td class='ln' data-ln='110'></td><td><span> </span><span class='pt4 it'>// Header specifies additional promised request headers. This cannot</span></td></tr>
<tr><td class='ln' data-ln='111'></td><td><span> </span><span class='pt4 it'>// include HTTP/2 pseudo header fields like ":path" and ":scheme",</span></td></tr>
<tr><td class='ln' data-ln='112'></td><td><span> </span><span class='pt4 it'>// which will be added automatically.</span></td></tr>
<tr><td class='ln' data-ln='113'></td><td><span> Header Header</span></td></tr>
<tr><td class='ln' data-ln='114'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='115'></td><td> </td></tr>
<tr><td class='ln' data-ln='116'></td><td><span class='pt4 it'>// Pusher is the interface implemented by ResponseWriters that support</span></td></tr>
<tr><td class='ln' data-ln='117'></td><td><span class='pt4 it'>// HTTP/2 server push. For more background, see</span></td></tr>
<tr><td class='ln' data-ln='118'></td><td><span class='pt4 it'>// https://tools.ietf.org/html/rfc7540#section-8.2.</span></td></tr>
<tr><td class='ln' data-ln='119'></td><td><span class='pt3'>type</span><span> </span><span class='pt5'>Pusher</span><span> </span><span class='pt3'>interface</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='120'></td><td><span> </span><span class='pt4 it'>// Push initiates an HTTP/2 server push. This constructs a synthetic</span></td></tr>
<tr><td class='ln' data-ln='121'></td><td><span> </span><span class='pt4 it'>// request using the given target and options, serializes that request</span></td></tr>
<tr><td class='ln' data-ln='122'></td><td><span> </span><span class='pt4 it'>// into a PUSH_PROMISE frame, then dispatches that request using the</span></td></tr>
<tr><td class='ln' data-ln='123'></td><td><span> </span><span class='pt4 it'>// server's request handler. If opts is nil, default options are used.</span></td></tr>
<tr><td class='ln' data-ln='124'></td><td><span> </span><span class='pt4 it'>//</span></td></tr>
<tr><td class='ln' data-ln='125'></td><td><span> </span><span class='pt4 it'>// The target must either be an absolute path (like "/path") or an absolute</span></td></tr>
<tr><td class='ln' data-ln='126'></td><td><span> </span><span class='pt4 it'>// URL that contains a valid host and the same scheme as the parent request.</span></td></tr>
<tr><td class='ln' data-ln='127'></td><td><span> </span><span class='pt4 it'>// If the target is a path, it will inherit the scheme and host of the</span></td></tr>
<tr><td class='ln' data-ln='128'></td><td><span> </span><span class='pt4 it'>// parent request.</span></td></tr>
<tr><td class='ln' data-ln='129'></td><td><span> </span><span class='pt4 it'>//</span></td></tr>
<tr><td class='ln' data-ln='130'></td><td><span> </span><span class='pt4 it'>// The HTTP/2 spec disallows recursive pushes and cross-authority pushes.</span></td></tr>
<tr><td class='ln' data-ln='131'></td><td><span> </span><span class='pt4 it'>// Push may or may not detect these invalid pushes; however, invalid</span></td></tr>
<tr><td class='ln' data-ln='132'></td><td><span> </span><span class='pt4 it'>// pushes will be detected and canceled by conforming clients.</span></td></tr>
<tr><td class='ln' data-ln='133'></td><td><span> </span><span class='pt4 it'>//</span></td></tr>
<tr><td class='ln' data-ln='134'></td><td><span> </span><span class='pt4 it'>// Handlers that wish to push URL X should call Push before sending any</span></td></tr>
<tr><td class='ln' data-ln='135'></td><td><span> </span><span class='pt4 it'>// data that may trigger a request for URL X. This avoids a race where the</span></td></tr>
<tr><td class='ln' data-ln='136'></td><td><span> </span><span class='pt4 it'>// client issues requests for X before receiving the PUSH_PROMISE for X.</span></td></tr>
<tr><td class='ln' data-ln='137'></td><td><span> </span><span class='pt4 it'>//</span></td></tr>
<tr><td class='ln' data-ln='138'></td><td><span> </span><span class='pt4 it'>// Push returns ErrNotSupported if the client has disabled push or if push</span></td></tr>
<tr><td class='ln' data-ln='139'></td><td><span> </span><span class='pt4 it'>// is not supported on the underlying connection.</span></td></tr>
<tr><td class='ln' data-ln='140'></td><td><span> </span><span class='pt7'>Push</span><span>(target </span><span class='pt3'>string</span><span>, opts </span><span class='pt10'>*</span><span>PushOptions) </span><span class='pt3'>error</span></td></tr>
<tr><td class='ln' data-ln='141'></td><td><span>}</span></td></tr>
</table>
</div>
</div>
</div>
<div class='style' id='P--predawn--go'>
<div class='P--predawn-bordered'>
<div class="info header">
<span class="left">http.go</span>
<span class="right"><span>141 lines</span><span>4.26 KB</span></span>
</div>
<div class='P--predawn'>
<table>
<tr><td class='ln' data-ln='1'></td><td><span class='pt10'>// Copyright 2016 The Go Authors. All rights reserved.</span></td></tr>
<tr><td class='ln' data-ln='2'></td><td><span class='pt10'>// Use of this source code is governed by a BSD-style</span></td></tr>
<tr><td class='ln' data-ln='3'></td><td><span class='pt10'>// license that can be found in the LICENSE file.</span></td></tr>
<tr><td class='ln' data-ln='4'></td><td> </td></tr>
<tr><td class='ln' data-ln='5'></td><td><span class='pt18'>package</span><span> http</span></td></tr>
<tr><td class='ln' data-ln='6'></td><td> </td></tr>
<tr><td class='ln' data-ln='7'></td><td class='hi'><span class='pt18'>import</span><span> (</span></td></tr>
<tr><td class='ln' data-ln='8'></td><td class='hi'><span> </span><span class='pt13'>"io"</span></td></tr>
<tr><td class='ln' data-ln='9'></td><td class='hi'><span> </span><span class='pt13'>"strconv"</span></td></tr>
<tr><td class='ln' data-ln='10'></td><td class='hi'><span> </span><span class='pt13'>"strings"</span></td></tr>
<tr><td class='ln' data-ln='11'></td><td class='hi'><span> </span><span class='pt13'>"time"</span></td></tr>
<tr><td class='ln' data-ln='12'></td><td class='hi'><span> </span><span class='pt13'>"unicode/utf8"</span></td></tr>
<tr><td class='ln' data-ln='13'></td><td class='hi'> </td></tr>
<tr><td class='ln' data-ln='14'></td><td class='hi'><span> </span><span class='pt13'>"golang_org/x/net/lex/httplex"</span></td></tr>
<tr><td class='ln' data-ln='15'></td><td class='hi'><span>)</span></td></tr>
<tr><td class='ln' data-ln='16'></td><td> </td></tr>
<tr><td class='ln' data-ln='17'></td><td><span class='pt10'>// maxInt64 is the effective "infinite" value for the Server and</span></td></tr>
<tr><td class='ln' data-ln='18'></td><td><span class='pt10'>// Transport's byte-limiting readers.</span></td></tr>
<tr><td class='ln' data-ln='19'></td><td><span class='pt16'>const</span><span> maxInt64 </span><span class='pt18'>=</span><span> </span><span class='pt16'>1</span><span class='pt18'><<</span><span class='pt16'>63</span><span> </span><span class='pt18'>-</span><span> </span><span class='pt16'>1</span></td></tr>
<tr><td class='ln' data-ln='20'></td><td> </td></tr>
<tr><td class='ln' data-ln='21'></td><td><span class='pt10'>// aLongTimeAgo is a non-zero time, far in the past, used for</span></td></tr>
<tr><td class='ln' data-ln='22'></td><td><span class='pt10'>// immediate cancelation of network operations.</span></td></tr>
<tr><td class='ln' data-ln='23'></td><td><span class='pt16'>var</span><span> </span><span class='pt18'>aLongTimeAgo</span><span> </span><span class='pt18'>=</span><span> time.</span><span class='pt18'>Unix</span><span>(</span><span class='pt16'>1</span><span>, </span><span class='pt16'>0</span><span>)</span></td></tr>
<tr><td class='ln' data-ln='24'></td><td> </td></tr>
<tr><td class='ln' data-ln='25'></td><td><span class='pt10'>// TODO(bradfitz): move common stuff here. The other files have accumulated</span></td></tr>
<tr><td class='ln' data-ln='26'></td><td><span class='pt10'>// generic http stuff in random places.</span></td></tr>
<tr><td class='ln' data-ln='27'></td><td> </td></tr>
<tr><td class='ln' data-ln='28'></td><td><span class='pt10'>// contextKey is a value for use with context.WithValue. It's used as</span></td></tr>
<tr><td class='ln' data-ln='29'></td><td><span class='pt10'>// a pointer so it fits in an interface{} without allocation.</span></td></tr>
<tr><td class='ln' data-ln='30'></td><td><span class='pt16'>type</span><span> </span><span class='pt11'>contextKey</span><span> </span><span class='pt16'>struct</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='31'></td><td><span> </span><span class='pt18'>name</span><span> </span><span class='pt16'>string</span></td></tr>
<tr><td class='ln' data-ln='32'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='33'></td><td> </td></tr>
<tr><td class='ln' data-ln='34'></td><td><span class='pt16'>func</span><span> (</span><span class='pt18'>k</span><span> </span><span class='pt18'>*</span><span>contextKey) </span><span class='pt11'>String</span><span>() </span><span class='pt16'>string</span><span> { </span><span class='pt18'>return</span><span> </span><span class='pt13'>"net/http context value "</span><span> </span><span class='pt18'>+</span><span> k.</span><span class='pt18'>name</span><span> }</span></td></tr>
<tr><td class='ln' data-ln='35'></td><td> </td></tr>
<tr><td class='ln' data-ln='36'></td><td><span class='pt10'>// Given a string of the form "host", "host:port", or "[ipv6::address]:port",</span></td></tr>
<tr><td class='ln' data-ln='37'></td><td><span class='pt10'>// return true if the string includes a port.</span></td></tr>
<tr><td class='ln' data-ln='38'></td><td><span class='pt16'>func</span><span> </span><span class='pt11'>hasPort</span><span>(</span><span class='pt18'>s</span><span> </span><span class='pt16'>string</span><span>) </span><span class='pt16'>bool</span><span> { </span><span class='pt18'>return</span><span> strings.</span><span class='pt18'>LastIndex</span><span>(s, </span><span class='pt13'>":"</span><span>) </span><span class='pt18'>></span><span> strings.</span><span class='pt18'>LastIndex</span><span>(s, </span><span class='pt13'>"]"</span><span>) }</span></td></tr>
<tr><td class='ln' data-ln='39'></td><td> </td></tr>
<tr><td class='ln' data-ln='40'></td><td><span class='pt10'>// removeEmptyPort strips the empty port in ":port" to ""</span></td></tr>
<tr><td class='ln' data-ln='41'></td><td><span class='pt10'>// as mandated by RFC 3986 Section 6.2.3.</span></td></tr>
<tr><td class='ln' data-ln='42'></td><td><span class='pt16'>func</span><span> </span><span class='pt11'>removeEmptyPort</span><span>(</span><span class='pt18'>host</span><span> </span><span class='pt16'>string</span><span>) </span><span class='pt16'>string</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='43'></td><td><span> </span><span class='pt18'>if</span><span> </span><span class='pt18'>hasPort</span><span>(host) {</span></td></tr>
<tr><td class='ln' data-ln='44'></td><td><span> </span><span class='pt18'>return</span><span> strings.</span><span class='pt18'>TrimSuffix</span><span>(host, </span><span class='pt13'>":"</span><span>)</span></td></tr>
<tr><td class='ln' data-ln='45'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='46'></td><td><span> </span><span class='pt18'>return</span><span> host</span></td></tr>
<tr><td class='ln' data-ln='47'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='48'></td><td> </td></tr>
<tr><td class='ln' data-ln='49'></td><td><span class='pt16'>func</span><span> </span><span class='pt11'>isNotToken</span><span>(</span><span class='pt18'>r</span><span> </span><span class='pt16'>rune</span><span>) </span><span class='pt16'>bool</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='50'></td><td><span> </span><span class='pt18'>return</span><span> </span><span class='pt18'>!</span><span>httplex.</span><span class='pt18'>IsTokenRune</span><span>(r)</span></td></tr>
<tr><td class='ln' data-ln='51'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='52'></td><td> </td></tr>
<tr><td class='ln' data-ln='53'></td><td><span class='pt16'>func</span><span> </span><span class='pt11'>isASCII</span><span>(</span><span class='pt18'>s</span><span> </span><span class='pt16'>string</span><span>) </span><span class='pt16'>bool</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='54'></td><td><span> </span><span class='pt18'>for</span><span> </span><span class='pt18'>i</span><span> </span><span class='pt18'>:=</span><span> </span><span class='pt16'>0</span><span>; i </span><span class='pt18'><</span><span> </span><span class='pt18'>len</span><span>(s); i</span><span class='pt18'>++</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='55'></td><td><span> </span><span class='pt18'>if</span><span> s[i] </span><span class='pt18'>>=</span><span> utf8.</span><span class='pt18'>RuneSelf</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='56'></td><td><span> </span><span class='pt18'>return</span><span> </span><span class='pt16'>false</span></td></tr>
<tr><td class='ln' data-ln='57'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='58'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='59'></td><td><span> </span><span class='pt18'>return</span><span> </span><span class='pt16'>true</span></td></tr>
<tr><td class='ln' data-ln='60'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='61'></td><td> </td></tr>
<tr><td class='ln' data-ln='62'></td><td><span class='pt16'>func</span><span> </span><span class='pt11'>hexEscapeNonASCII</span><span>(</span><span class='pt18'>s</span><span> </span><span class='pt16'>string</span><span>) </span><span class='pt16'>string</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='63'></td><td><span> </span><span class='pt18'>newLen</span><span> </span><span class='pt18'>:=</span><span> </span><span class='pt16'>0</span></td></tr>
<tr><td class='ln' data-ln='64'></td><td><span> </span><span class='pt18'>for</span><span> </span><span class='pt18'>i</span><span> </span><span class='pt18'>:=</span><span> </span><span class='pt16'>0</span><span>; i </span><span class='pt18'><</span><span> </span><span class='pt18'>len</span><span>(s); i</span><span class='pt18'>++</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='65'></td><td><span> </span><span class='pt18'>if</span><span> s[i] </span><span class='pt18'>>=</span><span> utf8.</span><span class='pt18'>RuneSelf</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='66'></td><td><span> newLen </span><span class='pt18'>+=</span><span> </span><span class='pt16'>3</span></td></tr>
<tr><td class='ln' data-ln='67'></td><td><span> } </span><span class='pt18'>else</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='68'></td><td><span> newLen</span><span class='pt18'>++</span></td></tr>
<tr><td class='ln' data-ln='69'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='70'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='71'></td><td><span> </span><span class='pt18'>if</span><span> newLen </span><span class='pt18'>==</span><span> </span><span class='pt18'>len</span><span>(s) {</span></td></tr>
<tr><td class='ln' data-ln='72'></td><td><span> </span><span class='pt18'>return</span><span> s</span></td></tr>
<tr><td class='ln' data-ln='73'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='74'></td><td><span> </span><span class='pt18'>b</span><span> </span><span class='pt18'>:=</span><span> </span><span class='pt18'>make</span><span>([]</span><span class='pt16'>byte</span><span>, </span><span class='pt16'>0</span><span>, newLen)</span></td></tr>
<tr><td class='ln' data-ln='75'></td><td><span> </span><span class='pt18'>for</span><span> </span><span class='pt18'>i</span><span> </span><span class='pt18'>:=</span><span> </span><span class='pt16'>0</span><span>; i </span><span class='pt18'><</span><span> </span><span class='pt18'>len</span><span>(s); i</span><span class='pt18'>++</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='76'></td><td><span> </span><span class='pt18'>if</span><span> s[i] </span><span class='pt18'>>=</span><span> utf8.</span><span class='pt18'>RuneSelf</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='77'></td><td><span> b </span><span class='pt18'>=</span><span> </span><span class='pt18'>append</span><span>(b, </span><span class='pt13'>'%'</span><span>)</span></td></tr>
<tr><td class='ln' data-ln='78'></td><td><span> b </span><span class='pt18'>=</span><span> strconv.</span><span class='pt18'>AppendInt</span><span>(b, </span><span class='pt16'>int64</span><span>(s[i]), </span><span class='pt16'>16</span><span>)</span></td></tr>
<tr><td class='ln' data-ln='79'></td><td><span> } </span><span class='pt18'>else</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='80'></td><td><span> b </span><span class='pt18'>=</span><span> </span><span class='pt18'>append</span><span>(b, s[i])</span></td></tr>
<tr><td class='ln' data-ln='81'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='82'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='83'></td><td><span> </span><span class='pt18'>return</span><span> </span><span class='pt16'>string</span><span>(b)</span></td></tr>
<tr><td class='ln' data-ln='84'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='85'></td><td> </td></tr>
<tr><td class='ln' data-ln='86'></td><td><span class='pt10'>// NoBody is an io.ReadCloser with no bytes. Read always returns EOF</span></td></tr>
<tr><td class='ln' data-ln='87'></td><td><span class='pt10'>// and Close always returns nil. It can be used in an outgoing client</span></td></tr>
<tr><td class='ln' data-ln='88'></td><td><span class='pt10'>// request to explicitly signal that a request has zero bytes.</span></td></tr>
<tr><td class='ln' data-ln='89'></td><td><span class='pt10'>// An alternative, however, is to simply set Request.Body to nil.</span></td></tr>
<tr><td class='ln' data-ln='90'></td><td><span class='pt16'>var</span><span> </span><span class='pt18'>NoBody</span><span> </span><span class='pt18'>=</span><span> noBody{}</span></td></tr>
<tr><td class='ln' data-ln='91'></td><td> </td></tr>
<tr><td class='ln' data-ln='92'></td><td><span class='pt16'>type</span><span> </span><span class='pt11'>noBody</span><span> </span><span class='pt16'>struct</span><span>{}</span></td></tr>
<tr><td class='ln' data-ln='93'></td><td> </td></tr>
<tr><td class='ln' data-ln='94'></td><td><span class='pt16'>func</span><span> (noBody) </span><span class='pt11'>Read</span><span>([]</span><span class='pt16'>byte</span><span>) (</span><span class='pt16'>int</span><span>, </span><span class='pt16'>error</span><span>) { </span><span class='pt18'>return</span><span> </span><span class='pt16'>0</span><span>, io.</span><span class='pt18'>EOF</span><span> }</span></td></tr>
<tr><td class='ln' data-ln='95'></td><td><span class='pt16'>func</span><span> (noBody) </span><span class='pt11'>Close</span><span>() </span><span class='pt16'>error</span><span> { </span><span class='pt18'>return</span><span> </span><span class='pt16'>nil</span><span> }</span></td></tr>
<tr><td class='ln' data-ln='96'></td><td><span class='pt16'>func</span><span> (noBody) </span><span class='pt11'>WriteTo</span><span>(io.Writer) (</span><span class='pt16'>int64</span><span>, </span><span class='pt16'>error</span><span>) { </span><span class='pt18'>return</span><span> </span><span class='pt16'>0</span><span>, </span><span class='pt16'>nil</span><span> }</span></td></tr>
<tr><td class='ln' data-ln='97'></td><td> </td></tr>
<tr><td class='ln' data-ln='98'></td><td><span class='pt16'>var</span><span> (</span></td></tr>
<tr><td class='ln' data-ln='99'></td><td><span> </span><span class='pt10'>// verify that an io.Copy from NoBody won't require a buffer:</span></td></tr>
<tr><td class='ln' data-ln='100'></td><td><span> </span><span class='pt18'>_</span><span> io.</span><span class='pt18'>WriterTo</span><span> </span><span class='pt18'>=</span><span> NoBody</span></td></tr>
<tr><td class='ln' data-ln='101'></td><td><span> </span><span class='pt18'>_</span><span> io.</span><span class='pt18'>ReadCloser</span><span> </span><span class='pt18'>=</span><span> NoBody</span></td></tr>
<tr><td class='ln' data-ln='102'></td><td><span>)</span></td></tr>
<tr><td class='ln' data-ln='103'></td><td> </td></tr>
<tr><td class='ln' data-ln='104'></td><td><span class='pt10'>// PushOptions describes options for Pusher.Push.</span></td></tr>
<tr><td class='ln' data-ln='105'></td><td><span class='pt16'>type</span><span> </span><span class='pt11'>PushOptions</span><span> </span><span class='pt16'>struct</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='106'></td><td><span> </span><span class='pt10'>// Method specifies the HTTP method for the promised request.</span></td></tr>
<tr><td class='ln' data-ln='107'></td><td><span> </span><span class='pt10'>// If set, it must be "GET" or "HEAD". Empty means "GET".</span></td></tr>
<tr><td class='ln' data-ln='108'></td><td><span> </span><span class='pt18'>Method</span><span> </span><span class='pt16'>string</span></td></tr>
<tr><td class='ln' data-ln='109'></td><td> </td></tr>
<tr><td class='ln' data-ln='110'></td><td><span> </span><span class='pt10'>// Header specifies additional promised request headers. This cannot</span></td></tr>
<tr><td class='ln' data-ln='111'></td><td><span> </span><span class='pt10'>// include HTTP/2 pseudo header fields like ":path" and ":scheme",</span></td></tr>
<tr><td class='ln' data-ln='112'></td><td><span> </span><span class='pt10'>// which will be added automatically.</span></td></tr>
<tr><td class='ln' data-ln='113'></td><td><span> </span><span class='pt18'>Header</span><span> Header</span></td></tr>
<tr><td class='ln' data-ln='114'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='115'></td><td> </td></tr>
<tr><td class='ln' data-ln='116'></td><td><span class='pt10'>// Pusher is the interface implemented by ResponseWriters that support</span></td></tr>
<tr><td class='ln' data-ln='117'></td><td><span class='pt10'>// HTTP/2 server push. For more background, see</span></td></tr>
<tr><td class='ln' data-ln='118'></td><td><span class='pt10'>// https://tools.ietf.org/html/rfc7540#section-8.2.</span></td></tr>
<tr><td class='ln' data-ln='119'></td><td><span class='pt16'>type</span><span> </span><span class='pt11'>Pusher</span><span> </span><span class='pt16'>interface</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='120'></td><td><span> </span><span class='pt10'>// Push initiates an HTTP/2 server push. This constructs a synthetic</span></td></tr>
<tr><td class='ln' data-ln='121'></td><td><span> </span><span class='pt10'>// request using the given target and options, serializes that request</span></td></tr>
<tr><td class='ln' data-ln='122'></td><td><span> </span><span class='pt10'>// into a PUSH_PROMISE frame, then dispatches that request using the</span></td></tr>
<tr><td class='ln' data-ln='123'></td><td><span> </span><span class='pt10'>// server's request handler. If opts is nil, default options are used.</span></td></tr>
<tr><td class='ln' data-ln='124'></td><td><span> </span><span class='pt10'>//</span></td></tr>
<tr><td class='ln' data-ln='125'></td><td><span> </span><span class='pt10'>// The target must either be an absolute path (like "/path") or an absolute</span></td></tr>
<tr><td class='ln' data-ln='126'></td><td><span> </span><span class='pt10'>// URL that contains a valid host and the same scheme as the parent request.</span></td></tr>
<tr><td class='ln' data-ln='127'></td><td><span> </span><span class='pt10'>// If the target is a path, it will inherit the scheme and host of the</span></td></tr>
<tr><td class='ln' data-ln='128'></td><td><span> </span><span class='pt10'>// parent request.</span></td></tr>
<tr><td class='ln' data-ln='129'></td><td><span> </span><span class='pt10'>//</span></td></tr>
<tr><td class='ln' data-ln='130'></td><td><span> </span><span class='pt10'>// The HTTP/2 spec disallows recursive pushes and cross-authority pushes.</span></td></tr>
<tr><td class='ln' data-ln='131'></td><td><span> </span><span class='pt10'>// Push may or may not detect these invalid pushes; however, invalid</span></td></tr>
<tr><td class='ln' data-ln='132'></td><td><span> </span><span class='pt10'>// pushes will be detected and canceled by conforming clients.</span></td></tr>
<tr><td class='ln' data-ln='133'></td><td><span> </span><span class='pt10'>//</span></td></tr>
<tr><td class='ln' data-ln='134'></td><td><span> </span><span class='pt10'>// Handlers that wish to push URL X should call Push before sending any</span></td></tr>
<tr><td class='ln' data-ln='135'></td><td><span> </span><span class='pt10'>// data that may trigger a request for URL X. This avoids a race where the</span></td></tr>
<tr><td class='ln' data-ln='136'></td><td><span> </span><span class='pt10'>// client issues requests for X before receiving the PUSH_PROMISE for X.</span></td></tr>
<tr><td class='ln' data-ln='137'></td><td><span> </span><span class='pt10'>//</span></td></tr>
<tr><td class='ln' data-ln='138'></td><td><span> </span><span class='pt10'>// Push returns ErrNotSupported if the client has disabled push or if push</span></td></tr>
<tr><td class='ln' data-ln='139'></td><td><span> </span><span class='pt10'>// is not supported on the underlying connection.</span></td></tr>
<tr><td class='ln' data-ln='140'></td><td><span> </span><span class='pt18'>Push</span><span>(target </span><span class='pt16'>string</span><span>, opts </span><span class='pt18'>*</span><span>PushOptions) </span><span class='pt16'>error</span></td></tr>
<tr><td class='ln' data-ln='141'></td><td><span>}</span></td></tr>
</table>
</div>
</div>
</div>
<div class='style' id='P--solarized_dark--go'>
<div class='P--solarized_dark-bordered'>
<div class="info header">
<span class="left">http.go</span>
<span class="right"><span>141 lines</span><span>4.26 KB</span></span>
</div>
<div class='P--solarized_dark'>
<table>
<tr><td class='ln' data-ln='1'></td><td><span class='pt3 it'>// Copyright 2016 The Go Authors. All rights reserved.</span></td></tr>
<tr><td class='ln' data-ln='2'></td><td><span class='pt3 it'>// Use of this source code is governed by a BSD-style</span></td></tr>
<tr><td class='ln' data-ln='3'></td><td><span class='pt3 it'>// license that can be found in the LICENSE file.</span></td></tr>
<tr><td class='ln' data-ln='4'></td><td> </td></tr>
<tr><td class='ln' data-ln='5'></td><td><span class='pt5'>package</span><span> http</span></td></tr>
<tr><td class='ln' data-ln='6'></td><td> </td></tr>
<tr><td class='ln' data-ln='7'></td><td class='hi'><span class='pt5'>import</span><span> (</span></td></tr>
<tr><td class='ln' data-ln='8'></td><td class='hi'><span> </span><span class='pt2'>"io"</span></td></tr>
<tr><td class='ln' data-ln='9'></td><td class='hi'><span> </span><span class='pt2'>"strconv"</span></td></tr>
<tr><td class='ln' data-ln='10'></td><td class='hi'><span> </span><span class='pt2'>"strings"</span></td></tr>
<tr><td class='ln' data-ln='11'></td><td class='hi'><span> </span><span class='pt2'>"time"</span></td></tr>
<tr><td class='ln' data-ln='12'></td><td class='hi'><span> </span><span class='pt2'>"unicode/utf8"</span></td></tr>
<tr><td class='ln' data-ln='13'></td><td class='hi'> </td></tr>
<tr><td class='ln' data-ln='14'></td><td class='hi'><span> </span><span class='pt2'>"golang_org/x/net/lex/httplex"</span></td></tr>
<tr><td class='ln' data-ln='15'></td><td class='hi'><span>)</span></td></tr>
<tr><td class='ln' data-ln='16'></td><td> </td></tr>
<tr><td class='ln' data-ln='17'></td><td><span class='pt3 it'>// maxInt64 is the effective "infinite" value for the Server and</span></td></tr>
<tr><td class='ln' data-ln='18'></td><td><span class='pt3 it'>// Transport's byte-limiting readers.</span></td></tr>
<tr><td class='ln' data-ln='19'></td><td><span class='bo'>const</span><span> maxInt64 </span><span class='pt5'>=</span><span> </span><span class='pt10'>1</span><span class='pt5'><<</span><span class='pt10'>63</span><span> </span><span class='pt5'>-</span><span> </span><span class='pt10'>1</span></td></tr>
<tr><td class='ln' data-ln='20'></td><td> </td></tr>
<tr><td class='ln' data-ln='21'></td><td><span class='pt3 it'>// aLongTimeAgo is a non-zero time, far in the past, used for</span></td></tr>
<tr><td class='ln' data-ln='22'></td><td><span class='pt3 it'>// immediate cancelation of network operations.</span></td></tr>
<tr><td class='ln' data-ln='23'></td><td><span class='bo'>var</span><span> </span><span class='pt1'>aLongTimeAgo</span><span> </span><span class='pt5'>=</span><span> time.Unix(</span><span class='pt10'>1</span><span>, </span><span class='pt10'>0</span><span>)</span></td></tr>
<tr><td class='ln' data-ln='24'></td><td> </td></tr>
<tr><td class='ln' data-ln='25'></td><td><span class='pt3 it'>// TODO(bradfitz): move common stuff here. The other files have accumulated</span></td></tr>
<tr><td class='ln' data-ln='26'></td><td><span class='pt3 it'>// generic http stuff in random places.</span></td></tr>
<tr><td class='ln' data-ln='27'></td><td> </td></tr>
<tr><td class='ln' data-ln='28'></td><td><span class='pt3 it'>// contextKey is a value for use with context.WithValue. It's used as</span></td></tr>
<tr><td class='ln' data-ln='29'></td><td><span class='pt3 it'>// a pointer so it fits in an interface{} without allocation.</span></td></tr>
<tr><td class='ln' data-ln='30'></td><td><span class='bo'>type</span><span> contextKey </span><span class='bo'>struct</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='31'></td><td><span> </span><span class='pt1'>name</span><span> </span><span class='bo'>string</span></td></tr>
<tr><td class='ln' data-ln='32'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='33'></td><td> </td></tr>
<tr><td class='ln' data-ln='34'></td><td><span class='bo'>func</span><span> (k </span><span class='pt5'>*</span><span>contextKey) </span><span class='pt1'>String</span><span>() </span><span class='bo'>string</span><span> { </span><span class='pt5'>return</span><span> </span><span class='pt2'>"net/http context value "</span><span> </span><span class='pt5'>+</span><span> k.</span><span class='pt1'>name</span><span> }</span></td></tr>
<tr><td class='ln' data-ln='35'></td><td> </td></tr>
<tr><td class='ln' data-ln='36'></td><td><span class='pt3 it'>// Given a string of the form "host", "host:port", or "[ipv6::address]:port",</span></td></tr>
<tr><td class='ln' data-ln='37'></td><td><span class='pt3 it'>// return true if the string includes a port.</span></td></tr>
<tr><td class='ln' data-ln='38'></td><td><span class='bo'>func</span><span> </span><span class='pt1'>hasPort</span><span>(s </span><span class='bo'>string</span><span>) </span><span class='bo'>bool</span><span> { </span><span class='pt5'>return</span><span> strings.LastIndex(s, </span><span class='pt2'>":"</span><span>) </span><span class='pt5'>></span><span> strings.LastIndex(s, </span><span class='pt2'>"]"</span><span>) }</span></td></tr>
<tr><td class='ln' data-ln='39'></td><td> </td></tr>
<tr><td class='ln' data-ln='40'></td><td><span class='pt3 it'>// removeEmptyPort strips the empty port in ":port" to ""</span></td></tr>
<tr><td class='ln' data-ln='41'></td><td><span class='pt3 it'>// as mandated by RFC 3986 Section 6.2.3.</span></td></tr>
<tr><td class='ln' data-ln='42'></td><td><span class='bo'>func</span><span> </span><span class='pt1'>removeEmptyPort</span><span>(host </span><span class='bo'>string</span><span>) </span><span class='bo'>string</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='43'></td><td><span> </span><span class='pt5'>if</span><span> hasPort(host) {</span></td></tr>
<tr><td class='ln' data-ln='44'></td><td><span> </span><span class='pt5'>return</span><span> strings.TrimSuffix(host, </span><span class='pt2'>":"</span><span>)</span></td></tr>
<tr><td class='ln' data-ln='45'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='46'></td><td><span> </span><span class='pt5'>return</span><span> host</span></td></tr>
<tr><td class='ln' data-ln='47'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='48'></td><td> </td></tr>
<tr><td class='ln' data-ln='49'></td><td><span class='bo'>func</span><span> </span><span class='pt1'>isNotToken</span><span>(r </span><span class='bo'>rune</span><span>) </span><span class='bo'>bool</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='50'></td><td><span> </span><span class='pt5'>return</span><span> </span><span class='pt5'>!</span><span>httplex.IsTokenRune(r)</span></td></tr>
<tr><td class='ln' data-ln='51'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='52'></td><td> </td></tr>
<tr><td class='ln' data-ln='53'></td><td><span class='bo'>func</span><span> </span><span class='pt1'>isASCII</span><span>(s </span><span class='bo'>string</span><span>) </span><span class='bo'>bool</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='54'></td><td><span> </span><span class='pt5'>for</span><span> </span><span class='pt1'>i</span><span> </span><span class='pt5'>:=</span><span> </span><span class='pt10'>0</span><span>; i </span><span class='pt5'><</span><span> </span><span class='pt1'>len</span><span>(s); i</span><span class='pt5'>++</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='55'></td><td><span> </span><span class='pt5'>if</span><span> s[i] </span><span class='pt5'>>=</span><span> utf8.</span><span class='pt1'>RuneSelf</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='56'></td><td><span> </span><span class='pt5'>return</span><span> </span><span class='pt6'>false</span></td></tr>
<tr><td class='ln' data-ln='57'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='58'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='59'></td><td><span> </span><span class='pt5'>return</span><span> </span><span class='pt6'>true</span></td></tr>
<tr><td class='ln' data-ln='60'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='61'></td><td> </td></tr>
<tr><td class='ln' data-ln='62'></td><td><span class='bo'>func</span><span> </span><span class='pt1'>hexEscapeNonASCII</span><span>(s </span><span class='bo'>string</span><span>) </span><span class='bo'>string</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='63'></td><td><span> </span><span class='pt1'>newLen</span><span> </span><span class='pt5'>:=</span><span> </span><span class='pt10'>0</span></td></tr>
<tr><td class='ln' data-ln='64'></td><td><span> </span><span class='pt5'>for</span><span> </span><span class='pt1'>i</span><span> </span><span class='pt5'>:=</span><span> </span><span class='pt10'>0</span><span>; i </span><span class='pt5'><</span><span> </span><span class='pt1'>len</span><span>(s); i</span><span class='pt5'>++</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='65'></td><td><span> </span><span class='pt5'>if</span><span> s[i] </span><span class='pt5'>>=</span><span> utf8.</span><span class='pt1'>RuneSelf</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='66'></td><td><span> newLen </span><span class='pt5'>+=</span><span> </span><span class='pt10'>3</span></td></tr>
<tr><td class='ln' data-ln='67'></td><td><span> } </span><span class='pt5'>else</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='68'></td><td><span> newLen</span><span class='pt5'>++</span></td></tr>
<tr><td class='ln' data-ln='69'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='70'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='71'></td><td><span> </span><span class='pt5'>if</span><span> newLen </span><span class='pt5'>==</span><span> </span><span class='pt1'>len</span><span>(s) {</span></td></tr>
<tr><td class='ln' data-ln='72'></td><td><span> </span><span class='pt5'>return</span><span> s</span></td></tr>
<tr><td class='ln' data-ln='73'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='74'></td><td><span> </span><span class='pt1'>b</span><span> </span><span class='pt5'>:=</span><span> </span><span class='pt1'>make</span><span>([]</span><span class='bo'>byte</span><span>, </span><span class='pt10'>0</span><span>, newLen)</span></td></tr>
<tr><td class='ln' data-ln='75'></td><td><span> </span><span class='pt5'>for</span><span> </span><span class='pt1'>i</span><span> </span><span class='pt5'>:=</span><span> </span><span class='pt10'>0</span><span>; i </span><span class='pt5'><</span><span> </span><span class='pt1'>len</span><span>(s); i</span><span class='pt5'>++</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='76'></td><td><span> </span><span class='pt5'>if</span><span> s[i] </span><span class='pt5'>>=</span><span> utf8.</span><span class='pt1'>RuneSelf</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='77'></td><td><span> b </span><span class='pt5'>=</span><span> </span><span class='pt1'>append</span><span>(b, </span><span class='pt2'>'%'</span><span>)</span></td></tr>
<tr><td class='ln' data-ln='78'></td><td><span> b </span><span class='pt5'>=</span><span> strconv.AppendInt(b, </span><span class='bo'>int64</span><span>(s[i]), </span><span class='pt10'>16</span><span>)</span></td></tr>
<tr><td class='ln' data-ln='79'></td><td><span> } </span><span class='pt5'>else</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='80'></td><td><span> b </span><span class='pt5'>=</span><span> </span><span class='pt1'>append</span><span>(b, s[i])</span></td></tr>
<tr><td class='ln' data-ln='81'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='82'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='83'></td><td><span> </span><span class='pt5'>return</span><span> </span><span class='bo'>string</span><span>(b)</span></td></tr>
<tr><td class='ln' data-ln='84'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='85'></td><td> </td></tr>
<tr><td class='ln' data-ln='86'></td><td><span class='pt3 it'>// NoBody is an io.ReadCloser with no bytes. Read always returns EOF</span></td></tr>
<tr><td class='ln' data-ln='87'></td><td><span class='pt3 it'>// and Close always returns nil. It can be used in an outgoing client</span></td></tr>
<tr><td class='ln' data-ln='88'></td><td><span class='pt3 it'>// request to explicitly signal that a request has zero bytes.</span></td></tr>
<tr><td class='ln' data-ln='89'></td><td><span class='pt3 it'>// An alternative, however, is to simply set Request.Body to nil.</span></td></tr>
<tr><td class='ln' data-ln='90'></td><td><span class='bo'>var</span><span> </span><span class='pt1'>NoBody</span><span> </span><span class='pt5'>=</span><span> noBody{}</span></td></tr>
<tr><td class='ln' data-ln='91'></td><td> </td></tr>
<tr><td class='ln' data-ln='92'></td><td><span class='bo'>type</span><span> noBody </span><span class='bo'>struct</span><span>{}</span></td></tr>
<tr><td class='ln' data-ln='93'></td><td> </td></tr>
<tr><td class='ln' data-ln='94'></td><td><span class='bo'>func</span><span> (noBody) </span><span class='pt1'>Read</span><span>([]</span><span class='bo'>byte</span><span>) (</span><span class='bo'>int</span><span>, </span><span class='bo'>error</span><span>) { </span><span class='pt5'>return</span><span> </span><span class='pt10'>0</span><span>, io.</span><span class='pt1'>EOF</span><span> }</span></td></tr>
<tr><td class='ln' data-ln='95'></td><td><span class='bo'>func</span><span> (noBody) </span><span class='pt1'>Close</span><span>() </span><span class='bo'>error</span><span> { </span><span class='pt5'>return</span><span> </span><span class='pt6'>nil</span><span> }</span></td></tr>
<tr><td class='ln' data-ln='96'></td><td><span class='bo'>func</span><span> (noBody) </span><span class='pt1'>WriteTo</span><span>(io.Writer) (</span><span class='bo'>int64</span><span>, </span><span class='bo'>error</span><span>) { </span><span class='pt5'>return</span><span> </span><span class='pt10'>0</span><span>, </span><span class='pt6'>nil</span><span> }</span></td></tr>
<tr><td class='ln' data-ln='97'></td><td> </td></tr>
<tr><td class='ln' data-ln='98'></td><td><span class='bo'>var</span><span> (</span></td></tr>
<tr><td class='ln' data-ln='99'></td><td><span> </span><span class='pt3 it'>// verify that an io.Copy from NoBody won't require a buffer:</span></td></tr>
<tr><td class='ln' data-ln='100'></td><td><span> </span><span class='pt1'>_</span><span> io.</span><span class='pt1'>WriterTo</span><span> </span><span class='pt5'>=</span><span> NoBody</span></td></tr>
<tr><td class='ln' data-ln='101'></td><td><span> </span><span class='pt1'>_</span><span> io.</span><span class='pt1'>ReadCloser</span><span> </span><span class='pt5'>=</span><span> NoBody</span></td></tr>
<tr><td class='ln' data-ln='102'></td><td><span>)</span></td></tr>
<tr><td class='ln' data-ln='103'></td><td> </td></tr>
<tr><td class='ln' data-ln='104'></td><td><span class='pt3 it'>// PushOptions describes options for Pusher.Push.</span></td></tr>
<tr><td class='ln' data-ln='105'></td><td><span class='bo'>type</span><span> PushOptions </span><span class='bo'>struct</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='106'></td><td><span> </span><span class='pt3 it'>// Method specifies the HTTP method for the promised request.</span></td></tr>
<tr><td class='ln' data-ln='107'></td><td><span> </span><span class='pt3 it'>// If set, it must be "GET" or "HEAD". Empty means "GET".</span></td></tr>
<tr><td class='ln' data-ln='108'></td><td><span> </span><span class='pt1'>Method</span><span> </span><span class='bo'>string</span></td></tr>
<tr><td class='ln' data-ln='109'></td><td> </td></tr>
<tr><td class='ln' data-ln='110'></td><td><span> </span><span class='pt3 it'>// Header specifies additional promised request headers. This cannot</span></td></tr>
<tr><td class='ln' data-ln='111'></td><td><span> </span><span class='pt3 it'>// include HTTP/2 pseudo header fields like ":path" and ":scheme",</span></td></tr>
<tr><td class='ln' data-ln='112'></td><td><span> </span><span class='pt3 it'>// which will be added automatically.</span></td></tr>
<tr><td class='ln' data-ln='113'></td><td><span> </span><span class='pt1'>Header</span><span> Header</span></td></tr>
<tr><td class='ln' data-ln='114'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='115'></td><td> </td></tr>
<tr><td class='ln' data-ln='116'></td><td><span class='pt3 it'>// Pusher is the interface implemented by ResponseWriters that support</span></td></tr>
<tr><td class='ln' data-ln='117'></td><td><span class='pt3 it'>// HTTP/2 server push. For more background, see</span></td></tr>
<tr><td class='ln' data-ln='118'></td><td><span class='pt3 it'>// https://tools.ietf.org/html/rfc7540#section-8.2.</span></td></tr>
<tr><td class='ln' data-ln='119'></td><td><span class='bo'>type</span><span> Pusher </span><span class='bo'>interface</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='120'></td><td><span> </span><span class='pt3 it'>// Push initiates an HTTP/2 server push. This constructs a synthetic</span></td></tr>
<tr><td class='ln' data-ln='121'></td><td><span> </span><span class='pt3 it'>// request using the given target and options, serializes that request</span></td></tr>
<tr><td class='ln' data-ln='122'></td><td><span> </span><span class='pt3 it'>// into a PUSH_PROMISE frame, then dispatches that request using the</span></td></tr>
<tr><td class='ln' data-ln='123'></td><td><span> </span><span class='pt3 it'>// server's request handler. If opts is nil, default options are used.</span></td></tr>
<tr><td class='ln' data-ln='124'></td><td><span> </span><span class='pt3 it'>//</span></td></tr>
<tr><td class='ln' data-ln='125'></td><td><span> </span><span class='pt3 it'>// The target must either be an absolute path (like "/path") or an absolute</span></td></tr>
<tr><td class='ln' data-ln='126'></td><td><span> </span><span class='pt3 it'>// URL that contains a valid host and the same scheme as the parent request.</span></td></tr>
<tr><td class='ln' data-ln='127'></td><td><span> </span><span class='pt3 it'>// If the target is a path, it will inherit the scheme and host of the</span></td></tr>
<tr><td class='ln' data-ln='128'></td><td><span> </span><span class='pt3 it'>// parent request.</span></td></tr>
<tr><td class='ln' data-ln='129'></td><td><span> </span><span class='pt3 it'>//</span></td></tr>
<tr><td class='ln' data-ln='130'></td><td><span> </span><span class='pt3 it'>// The HTTP/2 spec disallows recursive pushes and cross-authority pushes.</span></td></tr>
<tr><td class='ln' data-ln='131'></td><td><span> </span><span class='pt3 it'>// Push may or may not detect these invalid pushes; however, invalid</span></td></tr>
<tr><td class='ln' data-ln='132'></td><td><span> </span><span class='pt3 it'>// pushes will be detected and canceled by conforming clients.</span></td></tr>
<tr><td class='ln' data-ln='133'></td><td><span> </span><span class='pt3 it'>//</span></td></tr>
<tr><td class='ln' data-ln='134'></td><td><span> </span><span class='pt3 it'>// Handlers that wish to push URL X should call Push before sending any</span></td></tr>
<tr><td class='ln' data-ln='135'></td><td><span> </span><span class='pt3 it'>// data that may trigger a request for URL X. This avoids a race where the</span></td></tr>
<tr><td class='ln' data-ln='136'></td><td><span> </span><span class='pt3 it'>// client issues requests for X before receiving the PUSH_PROMISE for X.</span></td></tr>
<tr><td class='ln' data-ln='137'></td><td><span> </span><span class='pt3 it'>//</span></td></tr>
<tr><td class='ln' data-ln='138'></td><td><span> </span><span class='pt3 it'>// Push returns ErrNotSupported if the client has disabled push or if push</span></td></tr>
<tr><td class='ln' data-ln='139'></td><td><span> </span><span class='pt3 it'>// is not supported on the underlying connection.</span></td></tr>
<tr><td class='ln' data-ln='140'></td><td><span> Push(target </span><span class='bo'>string</span><span>, opts </span><span class='pt5'>*</span><span>PushOptions) </span><span class='bo'>error</span></td></tr>
<tr><td class='ln' data-ln='141'></td><td><span>}</span></td></tr>
</table>
</div>
</div>
</div>
<div class='style' id='P--solarized_light--go'>
<div class='P--solarized_light-bordered'>
<div class="info header">
<span class="left">http.go</span>
<span class="right"><span>141 lines</span><span>4.26 KB</span></span>
</div>
<div class='P--solarized_light'>
<table>
<tr><td class='ln' data-ln='1'></td><td><span class='pt5'>// Copyright 2016 The Go Authors. All rights reserved.</span></td></tr>
<tr><td class='ln' data-ln='2'></td><td><span class='pt5'>// Use of this source code is governed by a BSD-style</span></td></tr>
<tr><td class='ln' data-ln='3'></td><td><span class='pt5'>// license that can be found in the LICENSE file.</span></td></tr>
<tr><td class='ln' data-ln='4'></td><td> </td></tr>
<tr><td class='ln' data-ln='5'></td><td><span class='pt4'>package</span><span> http</span></td></tr>
<tr><td class='ln' data-ln='6'></td><td> </td></tr>
<tr><td class='ln' data-ln='7'></td><td class='hi'><span class='pt4'>import</span><span> (</span></td></tr>
<tr><td class='ln' data-ln='8'></td><td class='hi'><span> </span><span class='pt3'>"io"</span></td></tr>
<tr><td class='ln' data-ln='9'></td><td class='hi'><span> </span><span class='pt3'>"strconv"</span></td></tr>
<tr><td class='ln' data-ln='10'></td><td class='hi'><span> </span><span class='pt3'>"strings"</span></td></tr>
<tr><td class='ln' data-ln='11'></td><td class='hi'><span> </span><span class='pt3'>"time"</span></td></tr>
<tr><td class='ln' data-ln='12'></td><td class='hi'><span> </span><span class='pt3'>"unicode/utf8"</span></td></tr>
<tr><td class='ln' data-ln='13'></td><td class='hi'> </td></tr>
<tr><td class='ln' data-ln='14'></td><td class='hi'><span> </span><span class='pt3'>"golang_org/x/net/lex/httplex"</span></td></tr>
<tr><td class='ln' data-ln='15'></td><td class='hi'><span>)</span></td></tr>
<tr><td class='ln' data-ln='16'></td><td> </td></tr>
<tr><td class='ln' data-ln='17'></td><td><span class='pt5'>// maxInt64 is the effective "infinite" value for the Server and</span></td></tr>
<tr><td class='ln' data-ln='18'></td><td><span class='pt5'>// Transport's byte-limiting readers.</span></td></tr>
<tr><td class='ln' data-ln='19'></td><td><span class='pt1 bo'>const</span><span> maxInt64 </span><span class='pt4'>=</span><span> </span><span class='pt10'>1</span><span class='pt4'><<</span><span class='pt10'>63</span><span> </span><span class='pt4'>-</span><span> </span><span class='pt10'>1</span></td></tr>
<tr><td class='ln' data-ln='20'></td><td> </td></tr>
<tr><td class='ln' data-ln='21'></td><td><span class='pt5'>// aLongTimeAgo is a non-zero time, far in the past, used for</span></td></tr>
<tr><td class='ln' data-ln='22'></td><td><span class='pt5'>// immediate cancelation of network operations.</span></td></tr>
<tr><td class='ln' data-ln='23'></td><td><span class='pt1 bo'>var</span><span> </span><span class='pt2'>aLongTimeAgo</span><span> </span><span class='pt4'>=</span><span> time.Unix(</span><span class='pt10'>1</span><span>, </span><span class='pt10'>0</span><span>)</span></td></tr>
<tr><td class='ln' data-ln='24'></td><td> </td></tr>
<tr><td class='ln' data-ln='25'></td><td><span class='pt5'>// TODO(bradfitz): move common stuff here. The other files have accumulated</span></td></tr>
<tr><td class='ln' data-ln='26'></td><td><span class='pt5'>// generic http stuff in random places.</span></td></tr>
<tr><td class='ln' data-ln='27'></td><td> </td></tr>
<tr><td class='ln' data-ln='28'></td><td><span class='pt5'>// contextKey is a value for use with context.WithValue. It's used as</span></td></tr>
<tr><td class='ln' data-ln='29'></td><td><span class='pt5'>// a pointer so it fits in an interface{} without allocation.</span></td></tr>
<tr><td class='ln' data-ln='30'></td><td><span class='pt1 bo'>type</span><span> contextKey </span><span class='pt1 bo'>struct</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='31'></td><td><span> </span><span class='pt2'>name</span><span> </span><span class='pt1 bo'>string</span></td></tr>
<tr><td class='ln' data-ln='32'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='33'></td><td> </td></tr>
<tr><td class='ln' data-ln='34'></td><td><span class='pt1 bo'>func</span><span> (k </span><span class='pt4'>*</span><span>contextKey) </span><span class='pt2'>String</span><span>() </span><span class='pt1 bo'>string</span><span> { </span><span class='pt4'>return</span><span> </span><span class='pt3'>"net/http context value "</span><span> </span><span class='pt4'>+</span><span> k.</span><span class='pt2'>name</span><span> }</span></td></tr>
<tr><td class='ln' data-ln='35'></td><td> </td></tr>
<tr><td class='ln' data-ln='36'></td><td><span class='pt5'>// Given a string of the form "host", "host:port", or "[ipv6::address]:port",</span></td></tr>
<tr><td class='ln' data-ln='37'></td><td><span class='pt5'>// return true if the string includes a port.</span></td></tr>
<tr><td class='ln' data-ln='38'></td><td><span class='pt1 bo'>func</span><span> </span><span class='pt2'>hasPort</span><span>(s </span><span class='pt1 bo'>string</span><span>) </span><span class='pt1 bo'>bool</span><span> { </span><span class='pt4'>return</span><span> strings.LastIndex(s, </span><span class='pt3'>":"</span><span>) </span><span class='pt4'>></span><span> strings.LastIndex(s, </span><span class='pt3'>"]"</span><span>) }</span></td></tr>
<tr><td class='ln' data-ln='39'></td><td> </td></tr>
<tr><td class='ln' data-ln='40'></td><td><span class='pt5'>// removeEmptyPort strips the empty port in ":port" to ""</span></td></tr>
<tr><td class='ln' data-ln='41'></td><td><span class='pt5'>// as mandated by RFC 3986 Section 6.2.3.</span></td></tr>
<tr><td class='ln' data-ln='42'></td><td><span class='pt1 bo'>func</span><span> </span><span class='pt2'>removeEmptyPort</span><span>(host </span><span class='pt1 bo'>string</span><span>) </span><span class='pt1 bo'>string</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='43'></td><td><span> </span><span class='pt4'>if</span><span> hasPort(host) {</span></td></tr>
<tr><td class='ln' data-ln='44'></td><td><span> </span><span class='pt4'>return</span><span> strings.TrimSuffix(host, </span><span class='pt3'>":"</span><span>)</span></td></tr>
<tr><td class='ln' data-ln='45'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='46'></td><td><span> </span><span class='pt4'>return</span><span> host</span></td></tr>
<tr><td class='ln' data-ln='47'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='48'></td><td> </td></tr>
<tr><td class='ln' data-ln='49'></td><td><span class='pt1 bo'>func</span><span> </span><span class='pt2'>isNotToken</span><span>(r </span><span class='pt1 bo'>rune</span><span>) </span><span class='pt1 bo'>bool</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='50'></td><td><span> </span><span class='pt4'>return</span><span> </span><span class='pt4'>!</span><span>httplex.IsTokenRune(r)</span></td></tr>
<tr><td class='ln' data-ln='51'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='52'></td><td> </td></tr>
<tr><td class='ln' data-ln='53'></td><td><span class='pt1 bo'>func</span><span> </span><span class='pt2'>isASCII</span><span>(s </span><span class='pt1 bo'>string</span><span>) </span><span class='pt1 bo'>bool</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='54'></td><td><span> </span><span class='pt4'>for</span><span> </span><span class='pt2'>i</span><span> </span><span class='pt4'>:=</span><span> </span><span class='pt10'>0</span><span>; i </span><span class='pt4'><</span><span> </span><span class='pt2'>len</span><span>(s); i</span><span class='pt4'>++</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='55'></td><td><span> </span><span class='pt4'>if</span><span> s[i] </span><span class='pt4'>>=</span><span> utf8.</span><span class='pt2'>RuneSelf</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='56'></td><td><span> </span><span class='pt4'>return</span><span> </span><span class='pt6'>false</span></td></tr>
<tr><td class='ln' data-ln='57'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='58'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='59'></td><td><span> </span><span class='pt4'>return</span><span> </span><span class='pt6'>true</span></td></tr>
<tr><td class='ln' data-ln='60'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='61'></td><td> </td></tr>
<tr><td class='ln' data-ln='62'></td><td><span class='pt1 bo'>func</span><span> </span><span class='pt2'>hexEscapeNonASCII</span><span>(s </span><span class='pt1 bo'>string</span><span>) </span><span class='pt1 bo'>string</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='63'></td><td><span> </span><span class='pt2'>newLen</span><span> </span><span class='pt4'>:=</span><span> </span><span class='pt10'>0</span></td></tr>
<tr><td class='ln' data-ln='64'></td><td><span> </span><span class='pt4'>for</span><span> </span><span class='pt2'>i</span><span> </span><span class='pt4'>:=</span><span> </span><span class='pt10'>0</span><span>; i </span><span class='pt4'><</span><span> </span><span class='pt2'>len</span><span>(s); i</span><span class='pt4'>++</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='65'></td><td><span> </span><span class='pt4'>if</span><span> s[i] </span><span class='pt4'>>=</span><span> utf8.</span><span class='pt2'>RuneSelf</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='66'></td><td><span> newLen </span><span class='pt4'>+=</span><span> </span><span class='pt10'>3</span></td></tr>
<tr><td class='ln' data-ln='67'></td><td><span> } </span><span class='pt4'>else</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='68'></td><td><span> newLen</span><span class='pt4'>++</span></td></tr>
<tr><td class='ln' data-ln='69'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='70'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='71'></td><td><span> </span><span class='pt4'>if</span><span> newLen </span><span class='pt4'>==</span><span> </span><span class='pt2'>len</span><span>(s) {</span></td></tr>
<tr><td class='ln' data-ln='72'></td><td><span> </span><span class='pt4'>return</span><span> s</span></td></tr>
<tr><td class='ln' data-ln='73'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='74'></td><td><span> </span><span class='pt2'>b</span><span> </span><span class='pt4'>:=</span><span> </span><span class='pt2'>make</span><span>([]</span><span class='pt1 bo'>byte</span><span>, </span><span class='pt10'>0</span><span>, newLen)</span></td></tr>
<tr><td class='ln' data-ln='75'></td><td><span> </span><span class='pt4'>for</span><span> </span><span class='pt2'>i</span><span> </span><span class='pt4'>:=</span><span> </span><span class='pt10'>0</span><span>; i </span><span class='pt4'><</span><span> </span><span class='pt2'>len</span><span>(s); i</span><span class='pt4'>++</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='76'></td><td><span> </span><span class='pt4'>if</span><span> s[i] </span><span class='pt4'>>=</span><span> utf8.</span><span class='pt2'>RuneSelf</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='77'></td><td><span> b </span><span class='pt4'>=</span><span> </span><span class='pt2'>append</span><span>(b, </span><span class='pt3'>'%'</span><span>)</span></td></tr>
<tr><td class='ln' data-ln='78'></td><td><span> b </span><span class='pt4'>=</span><span> strconv.AppendInt(b, </span><span class='pt1 bo'>int64</span><span>(s[i]), </span><span class='pt10'>16</span><span>)</span></td></tr>
<tr><td class='ln' data-ln='79'></td><td><span> } </span><span class='pt4'>else</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='80'></td><td><span> b </span><span class='pt4'>=</span><span> </span><span class='pt2'>append</span><span>(b, s[i])</span></td></tr>
<tr><td class='ln' data-ln='81'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='82'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='83'></td><td><span> </span><span class='pt4'>return</span><span> </span><span class='pt1 bo'>string</span><span>(b)</span></td></tr>
<tr><td class='ln' data-ln='84'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='85'></td><td> </td></tr>
<tr><td class='ln' data-ln='86'></td><td><span class='pt5'>// NoBody is an io.ReadCloser with no bytes. Read always returns EOF</span></td></tr>
<tr><td class='ln' data-ln='87'></td><td><span class='pt5'>// and Close always returns nil. It can be used in an outgoing client</span></td></tr>
<tr><td class='ln' data-ln='88'></td><td><span class='pt5'>// request to explicitly signal that a request has zero bytes.</span></td></tr>
<tr><td class='ln' data-ln='89'></td><td><span class='pt5'>// An alternative, however, is to simply set Request.Body to nil.</span></td></tr>
<tr><td class='ln' data-ln='90'></td><td><span class='pt1 bo'>var</span><span> </span><span class='pt2'>NoBody</span><span> </span><span class='pt4'>=</span><span> noBody{}</span></td></tr>
<tr><td class='ln' data-ln='91'></td><td> </td></tr>
<tr><td class='ln' data-ln='92'></td><td><span class='pt1 bo'>type</span><span> noBody </span><span class='pt1 bo'>struct</span><span>{}</span></td></tr>
<tr><td class='ln' data-ln='93'></td><td> </td></tr>
<tr><td class='ln' data-ln='94'></td><td><span class='pt1 bo'>func</span><span> (noBody) </span><span class='pt2'>Read</span><span>([]</span><span class='pt1 bo'>byte</span><span>) (</span><span class='pt1 bo'>int</span><span>, </span><span class='pt1 bo'>error</span><span>) { </span><span class='pt4'>return</span><span> </span><span class='pt10'>0</span><span>, io.</span><span class='pt2'>EOF</span><span> }</span></td></tr>
<tr><td class='ln' data-ln='95'></td><td><span class='pt1 bo'>func</span><span> (noBody) </span><span class='pt2'>Close</span><span>() </span><span class='pt1 bo'>error</span><span> { </span><span class='pt4'>return</span><span> </span><span class='pt6'>nil</span><span> }</span></td></tr>
<tr><td class='ln' data-ln='96'></td><td><span class='pt1 bo'>func</span><span> (noBody) </span><span class='pt2'>WriteTo</span><span>(io.Writer) (</span><span class='pt1 bo'>int64</span><span>, </span><span class='pt1 bo'>error</span><span>) { </span><span class='pt4'>return</span><span> </span><span class='pt10'>0</span><span>, </span><span class='pt6'>nil</span><span> }</span></td></tr>
<tr><td class='ln' data-ln='97'></td><td> </td></tr>
<tr><td class='ln' data-ln='98'></td><td><span class='pt1 bo'>var</span><span> (</span></td></tr>
<tr><td class='ln' data-ln='99'></td><td><span> </span><span class='pt5'>// verify that an io.Copy from NoBody won't require a buffer:</span></td></tr>
<tr><td class='ln' data-ln='100'></td><td><span> </span><span class='pt2'>_</span><span> io.</span><span class='pt2'>WriterTo</span><span> </span><span class='pt4'>=</span><span> NoBody</span></td></tr>
<tr><td class='ln' data-ln='101'></td><td><span> </span><span class='pt2'>_</span><span> io.</span><span class='pt2'>ReadCloser</span><span> </span><span class='pt4'>=</span><span> NoBody</span></td></tr>
<tr><td class='ln' data-ln='102'></td><td><span>)</span></td></tr>
<tr><td class='ln' data-ln='103'></td><td> </td></tr>
<tr><td class='ln' data-ln='104'></td><td><span class='pt5'>// PushOptions describes options for Pusher.Push.</span></td></tr>
<tr><td class='ln' data-ln='105'></td><td><span class='pt1 bo'>type</span><span> PushOptions </span><span class='pt1 bo'>struct</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='106'></td><td><span> </span><span class='pt5'>// Method specifies the HTTP method for the promised request.</span></td></tr>
<tr><td class='ln' data-ln='107'></td><td><span> </span><span class='pt5'>// If set, it must be "GET" or "HEAD". Empty means "GET".</span></td></tr>
<tr><td class='ln' data-ln='108'></td><td><span> </span><span class='pt2'>Method</span><span> </span><span class='pt1 bo'>string</span></td></tr>
<tr><td class='ln' data-ln='109'></td><td> </td></tr>
<tr><td class='ln' data-ln='110'></td><td><span> </span><span class='pt5'>// Header specifies additional promised request headers. This cannot</span></td></tr>
<tr><td class='ln' data-ln='111'></td><td><span> </span><span class='pt5'>// include HTTP/2 pseudo header fields like ":path" and ":scheme",</span></td></tr>
<tr><td class='ln' data-ln='112'></td><td><span> </span><span class='pt5'>// which will be added automatically.</span></td></tr>
<tr><td class='ln' data-ln='113'></td><td><span> </span><span class='pt2'>Header</span><span> Header</span></td></tr>
<tr><td class='ln' data-ln='114'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='115'></td><td> </td></tr>
<tr><td class='ln' data-ln='116'></td><td><span class='pt5'>// Pusher is the interface implemented by ResponseWriters that support</span></td></tr>
<tr><td class='ln' data-ln='117'></td><td><span class='pt5'>// HTTP/2 server push. For more background, see</span></td></tr>
<tr><td class='ln' data-ln='118'></td><td><span class='pt5'>// https://tools.ietf.org/html/rfc7540#section-8.2.</span></td></tr>
<tr><td class='ln' data-ln='119'></td><td><span class='pt1 bo'>type</span><span> Pusher </span><span class='pt1 bo'>interface</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='120'></td><td><span> </span><span class='pt5'>// Push initiates an HTTP/2 server push. This constructs a synthetic</span></td></tr>
<tr><td class='ln' data-ln='121'></td><td><span> </span><span class='pt5'>// request using the given target and options, serializes that request</span></td></tr>
<tr><td class='ln' data-ln='122'></td><td><span> </span><span class='pt5'>// into a PUSH_PROMISE frame, then dispatches that request using the</span></td></tr>
<tr><td class='ln' data-ln='123'></td><td><span> </span><span class='pt5'>// server's request handler. If opts is nil, default options are used.</span></td></tr>
<tr><td class='ln' data-ln='124'></td><td><span> </span><span class='pt5'>//</span></td></tr>
<tr><td class='ln' data-ln='125'></td><td><span> </span><span class='pt5'>// The target must either be an absolute path (like "/path") or an absolute</span></td></tr>
<tr><td class='ln' data-ln='126'></td><td><span> </span><span class='pt5'>// URL that contains a valid host and the same scheme as the parent request.</span></td></tr>
<tr><td class='ln' data-ln='127'></td><td><span> </span><span class='pt5'>// If the target is a path, it will inherit the scheme and host of the</span></td></tr>
<tr><td class='ln' data-ln='128'></td><td><span> </span><span class='pt5'>// parent request.</span></td></tr>
<tr><td class='ln' data-ln='129'></td><td><span> </span><span class='pt5'>//</span></td></tr>
<tr><td class='ln' data-ln='130'></td><td><span> </span><span class='pt5'>// The HTTP/2 spec disallows recursive pushes and cross-authority pushes.</span></td></tr>
<tr><td class='ln' data-ln='131'></td><td><span> </span><span class='pt5'>// Push may or may not detect these invalid pushes; however, invalid</span></td></tr>
<tr><td class='ln' data-ln='132'></td><td><span> </span><span class='pt5'>// pushes will be detected and canceled by conforming clients.</span></td></tr>
<tr><td class='ln' data-ln='133'></td><td><span> </span><span class='pt5'>//</span></td></tr>
<tr><td class='ln' data-ln='134'></td><td><span> </span><span class='pt5'>// Handlers that wish to push URL X should call Push before sending any</span></td></tr>
<tr><td class='ln' data-ln='135'></td><td><span> </span><span class='pt5'>// data that may trigger a request for URL X. This avoids a race where the</span></td></tr>
<tr><td class='ln' data-ln='136'></td><td><span> </span><span class='pt5'>// client issues requests for X before receiving the PUSH_PROMISE for X.</span></td></tr>
<tr><td class='ln' data-ln='137'></td><td><span> </span><span class='pt5'>//</span></td></tr>
<tr><td class='ln' data-ln='138'></td><td><span> </span><span class='pt5'>// Push returns ErrNotSupported if the client has disabled push or if push</span></td></tr>
<tr><td class='ln' data-ln='139'></td><td><span> </span><span class='pt5'>// is not supported on the underlying connection.</span></td></tr>
<tr><td class='ln' data-ln='140'></td><td><span> Push(target </span><span class='pt1 bo'>string</span><span>, opts </span><span class='pt4'>*</span><span>PushOptions) </span><span class='pt1 bo'>error</span></td></tr>
<tr><td class='ln' data-ln='141'></td><td><span>}</span></td></tr>
</table>
</div>
</div>
</div>
<div class='style' id='P--wombat--go'>
<div class='P--wombat-bordered'>
<div class="info header">
<span class="left">http.go</span>
<span class="right"><span>141 lines</span><span>4.26 KB</span></span>
</div>
<div class='P--wombat'>
<table>
<tr><td class='ln' data-ln='1'></td><td><span class='pt16 it'>// Copyright 2016 The Go Authors. All rights reserved.</span></td></tr>
<tr><td class='ln' data-ln='2'></td><td><span class='pt16 it'>// Use of this source code is governed by a BSD-style</span></td></tr>
<tr><td class='ln' data-ln='3'></td><td><span class='pt16 it'>// license that can be found in the LICENSE file.</span></td></tr>
<tr><td class='ln' data-ln='4'></td><td> </td></tr>
<tr><td class='ln' data-ln='5'></td><td><span class='pt23'>package</span><span> http</span></td></tr>
<tr><td class='ln' data-ln='6'></td><td> </td></tr>
<tr><td class='ln' data-ln='7'></td><td class='hi'><span class='pt23'>import</span><span> (</span></td></tr>
<tr><td class='ln' data-ln='8'></td><td class='hi'><span> </span><span class='pt15'>"io"</span></td></tr>
<tr><td class='ln' data-ln='9'></td><td class='hi'><span> </span><span class='pt15'>"strconv"</span></td></tr>
<tr><td class='ln' data-ln='10'></td><td class='hi'><span> </span><span class='pt15'>"strings"</span></td></tr>
<tr><td class='ln' data-ln='11'></td><td class='hi'><span> </span><span class='pt15'>"time"</span></td></tr>
<tr><td class='ln' data-ln='12'></td><td class='hi'><span> </span><span class='pt15'>"unicode/utf8"</span></td></tr>
<tr><td class='ln' data-ln='13'></td><td class='hi'> </td></tr>
<tr><td class='ln' data-ln='14'></td><td class='hi'><span> </span><span class='pt15'>"golang_org/x/net/lex/httplex"</span></td></tr>
<tr><td class='ln' data-ln='15'></td><td class='hi'><span>)</span></td></tr>
<tr><td class='ln' data-ln='16'></td><td> </td></tr>
<tr><td class='ln' data-ln='17'></td><td><span class='pt16 it'>// maxInt64 is the effective "infinite" value for the Server and</span></td></tr>
<tr><td class='ln' data-ln='18'></td><td><span class='pt16 it'>// Transport's byte-limiting readers.</span></td></tr>
<tr><td class='ln' data-ln='19'></td><td><span class='pt23'>const</span><span> maxInt64 </span><span class='pt23'>=</span><span> </span><span class='pt24'>1</span><span class='pt23'><<</span><span class='pt24'>63</span><span> </span><span class='pt23'>-</span><span> </span><span class='pt24'>1</span></td></tr>
<tr><td class='ln' data-ln='20'></td><td> </td></tr>
<tr><td class='ln' data-ln='21'></td><td><span class='pt16 it'>// aLongTimeAgo is a non-zero time, far in the past, used for</span></td></tr>
<tr><td class='ln' data-ln='22'></td><td><span class='pt16 it'>// immediate cancelation of network operations.</span></td></tr>
<tr><td class='ln' data-ln='23'></td><td><span class='pt13 it'>var</span><span> aLongTimeAgo </span><span class='pt23'>=</span><span> time.</span><span class='pt19'>Unix</span><span>(</span><span class='pt24'>1</span><span>, </span><span class='pt24'>0</span><span>)</span></td></tr>
<tr><td class='ln' data-ln='24'></td><td> </td></tr>
<tr><td class='ln' data-ln='25'></td><td><span class='pt16 it'>// TODO(bradfitz): move common stuff here. The other files have accumulated</span></td></tr>
<tr><td class='ln' data-ln='26'></td><td><span class='pt16 it'>// generic http stuff in random places.</span></td></tr>
<tr><td class='ln' data-ln='27'></td><td> </td></tr>
<tr><td class='ln' data-ln='28'></td><td><span class='pt16 it'>// contextKey is a value for use with context.WithValue. It's used as</span></td></tr>
<tr><td class='ln' data-ln='29'></td><td><span class='pt16 it'>// a pointer so it fits in an interface{} without allocation.</span></td></tr>
<tr><td class='ln' data-ln='30'></td><td><span class='pt13 it'>type</span><span> </span><span class='pt19'>contextKey</span><span> </span><span class='pt13 it'>struct</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='31'></td><td><span> name </span><span class='pt13 it'>string</span></td></tr>
<tr><td class='ln' data-ln='32'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='33'></td><td> </td></tr>
<tr><td class='ln' data-ln='34'></td><td><span class='pt13 it'>func</span><span> (</span><span class='pt24 it'>k</span><span> </span><span class='pt23'>*</span><span>contextKey) </span><span class='pt19'>String</span><span>() </span><span class='pt13 it'>string</span><span> { </span><span class='pt23'>return</span><span> </span><span class='pt15'>"net/http context value "</span><span> </span><span class='pt23'>+</span><span> k.name }</span></td></tr>
<tr><td class='ln' data-ln='35'></td><td> </td></tr>
<tr><td class='ln' data-ln='36'></td><td><span class='pt16 it'>// Given a string of the form "host", "host:port", or "[ipv6::address]:port",</span></td></tr>
<tr><td class='ln' data-ln='37'></td><td><span class='pt16 it'>// return true if the string includes a port.</span></td></tr>
<tr><td class='ln' data-ln='38'></td><td><span class='pt13 it'>func</span><span> </span><span class='pt19'>hasPort</span><span>(</span><span class='pt24 it'>s</span><span> </span><span class='pt13 it'>string</span><span>) </span><span class='pt13 it'>bool</span><span> { </span><span class='pt23'>return</span><span> strings.</span><span class='pt19'>LastIndex</span><span>(s, </span><span class='pt15'>":"</span><span>) </span><span class='pt23'>></span><span> strings.</span><span class='pt19'>LastIndex</span><span>(s, </span><span class='pt15'>"]"</span><span>) }</span></td></tr>
<tr><td class='ln' data-ln='39'></td><td> </td></tr>
<tr><td class='ln' data-ln='40'></td><td><span class='pt16 it'>// removeEmptyPort strips the empty port in ":port" to ""</span></td></tr>
<tr><td class='ln' data-ln='41'></td><td><span class='pt16 it'>// as mandated by RFC 3986 Section 6.2.3.</span></td></tr>
<tr><td class='ln' data-ln='42'></td><td><span class='pt13 it'>func</span><span> </span><span class='pt19'>removeEmptyPort</span><span>(</span><span class='pt24 it'>host</span><span> </span><span class='pt13 it'>string</span><span>) </span><span class='pt13 it'>string</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='43'></td><td><span> </span><span class='pt23'>if</span><span> </span><span class='pt19'>hasPort</span><span>(host) {</span></td></tr>
<tr><td class='ln' data-ln='44'></td><td><span> </span><span class='pt23'>return</span><span> strings.</span><span class='pt19'>TrimSuffix</span><span>(host, </span><span class='pt15'>":"</span><span>)</span></td></tr>
<tr><td class='ln' data-ln='45'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='46'></td><td><span> </span><span class='pt23'>return</span><span> host</span></td></tr>
<tr><td class='ln' data-ln='47'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='48'></td><td> </td></tr>
<tr><td class='ln' data-ln='49'></td><td><span class='pt13 it'>func</span><span> </span><span class='pt19'>isNotToken</span><span>(</span><span class='pt24 it'>r</span><span> </span><span class='pt13 it'>rune</span><span>) </span><span class='pt13 it'>bool</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='50'></td><td><span> </span><span class='pt23'>return</span><span> </span><span class='pt23'>!</span><span>httplex.</span><span class='pt19'>IsTokenRune</span><span>(r)</span></td></tr>
<tr><td class='ln' data-ln='51'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='52'></td><td> </td></tr>
<tr><td class='ln' data-ln='53'></td><td><span class='pt13 it'>func</span><span> </span><span class='pt19'>isASCII</span><span>(</span><span class='pt24 it'>s</span><span> </span><span class='pt13 it'>string</span><span>) </span><span class='pt13 it'>bool</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='54'></td><td><span> </span><span class='pt23'>for</span><span> i </span><span class='pt23'>:=</span><span> </span><span class='pt24'>0</span><span>; i </span><span class='pt23'><</span><span> </span><span class='pt13'>len</span><span>(s); i</span><span class='pt23'>++</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='55'></td><td><span> </span><span class='pt23'>if</span><span> s[i] </span><span class='pt23'>>=</span><span> utf8.RuneSelf {</span></td></tr>
<tr><td class='ln' data-ln='56'></td><td><span> </span><span class='pt23'>return</span><span> </span><span class='pt17'>false</span></td></tr>
<tr><td class='ln' data-ln='57'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='58'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='59'></td><td><span> </span><span class='pt23'>return</span><span> </span><span class='pt17'>true</span></td></tr>
<tr><td class='ln' data-ln='60'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='61'></td><td> </td></tr>
<tr><td class='ln' data-ln='62'></td><td><span class='pt13 it'>func</span><span> </span><span class='pt19'>hexEscapeNonASCII</span><span>(</span><span class='pt24 it'>s</span><span> </span><span class='pt13 it'>string</span><span>) </span><span class='pt13 it'>string</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='63'></td><td><span> newLen </span><span class='pt23'>:=</span><span> </span><span class='pt24'>0</span></td></tr>
<tr><td class='ln' data-ln='64'></td><td><span> </span><span class='pt23'>for</span><span> i </span><span class='pt23'>:=</span><span> </span><span class='pt24'>0</span><span>; i </span><span class='pt23'><</span><span> </span><span class='pt13'>len</span><span>(s); i</span><span class='pt23'>++</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='65'></td><td><span> </span><span class='pt23'>if</span><span> s[i] </span><span class='pt23'>>=</span><span> utf8.RuneSelf {</span></td></tr>
<tr><td class='ln' data-ln='66'></td><td><span> newLen </span><span class='pt23'>+=</span><span> </span><span class='pt24'>3</span></td></tr>
<tr><td class='ln' data-ln='67'></td><td><span> } </span><span class='pt23'>else</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='68'></td><td><span> newLen</span><span class='pt23'>++</span></td></tr>
<tr><td class='ln' data-ln='69'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='70'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='71'></td><td><span> </span><span class='pt23'>if</span><span> newLen </span><span class='pt23'>==</span><span> </span><span class='pt13'>len</span><span>(s) {</span></td></tr>
<tr><td class='ln' data-ln='72'></td><td><span> </span><span class='pt23'>return</span><span> s</span></td></tr>
<tr><td class='ln' data-ln='73'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='74'></td><td><span> b </span><span class='pt23'>:=</span><span> </span><span class='pt13'>make</span><span>([]</span><span class='pt13 it'>byte</span><span>, </span><span class='pt24'>0</span><span>, newLen)</span></td></tr>
<tr><td class='ln' data-ln='75'></td><td><span> </span><span class='pt23'>for</span><span> i </span><span class='pt23'>:=</span><span> </span><span class='pt24'>0</span><span>; i </span><span class='pt23'><</span><span> </span><span class='pt13'>len</span><span>(s); i</span><span class='pt23'>++</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='76'></td><td><span> </span><span class='pt23'>if</span><span> s[i] </span><span class='pt23'>>=</span><span> utf8.RuneSelf {</span></td></tr>
<tr><td class='ln' data-ln='77'></td><td><span> b </span><span class='pt23'>=</span><span> </span><span class='pt13'>append</span><span>(b, </span><span class='pt15'>'%'</span><span>)</span></td></tr>
<tr><td class='ln' data-ln='78'></td><td><span> b </span><span class='pt23'>=</span><span> strconv.</span><span class='pt19'>AppendInt</span><span>(b, </span><span class='pt13 it'>int64</span><span>(s[i]), </span><span class='pt24'>16</span><span>)</span></td></tr>
<tr><td class='ln' data-ln='79'></td><td><span> } </span><span class='pt23'>else</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='80'></td><td><span> b </span><span class='pt23'>=</span><span> </span><span class='pt13'>append</span><span>(b, s[i])</span></td></tr>
<tr><td class='ln' data-ln='81'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='82'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='83'></td><td><span> </span><span class='pt23'>return</span><span> </span><span class='pt13 it'>string</span><span>(b)</span></td></tr>
<tr><td class='ln' data-ln='84'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='85'></td><td> </td></tr>
<tr><td class='ln' data-ln='86'></td><td><span class='pt16 it'>// NoBody is an io.ReadCloser with no bytes. Read always returns EOF</span></td></tr>
<tr><td class='ln' data-ln='87'></td><td><span class='pt16 it'>// and Close always returns nil. It can be used in an outgoing client</span></td></tr>
<tr><td class='ln' data-ln='88'></td><td><span class='pt16 it'>// request to explicitly signal that a request has zero bytes.</span></td></tr>
<tr><td class='ln' data-ln='89'></td><td><span class='pt16 it'>// An alternative, however, is to simply set Request.Body to nil.</span></td></tr>
<tr><td class='ln' data-ln='90'></td><td><span class='pt13 it'>var</span><span> NoBody </span><span class='pt23'>=</span><span> noBody{}</span></td></tr>
<tr><td class='ln' data-ln='91'></td><td> </td></tr>
<tr><td class='ln' data-ln='92'></td><td><span class='pt13 it'>type</span><span> </span><span class='pt19'>noBody</span><span> </span><span class='pt13 it'>struct</span><span>{}</span></td></tr>
<tr><td class='ln' data-ln='93'></td><td> </td></tr>
<tr><td class='ln' data-ln='94'></td><td><span class='pt13 it'>func</span><span> (noBody) </span><span class='pt19'>Read</span><span>([]</span><span class='pt13 it'>byte</span><span>) (</span><span class='pt13 it'>int</span><span>, </span><span class='pt13 it'>error</span><span>) { </span><span class='pt23'>return</span><span> </span><span class='pt24'>0</span><span>, io.EOF }</span></td></tr>
<tr><td class='ln' data-ln='95'></td><td><span class='pt13 it'>func</span><span> (noBody) </span><span class='pt19'>Close</span><span>() </span><span class='pt13 it'>error</span><span> { </span><span class='pt23'>return</span><span> </span><span class='pt17'>nil</span><span> }</span></td></tr>
<tr><td class='ln' data-ln='96'></td><td><span class='pt13 it'>func</span><span> (noBody) </span><span class='pt19'>WriteTo</span><span>(io.Writer) (</span><span class='pt13 it'>int64</span><span>, </span><span class='pt13 it'>error</span><span>) { </span><span class='pt23'>return</span><span> </span><span class='pt24'>0</span><span>, </span><span class='pt17'>nil</span><span> }</span></td></tr>
<tr><td class='ln' data-ln='97'></td><td> </td></tr>
<tr><td class='ln' data-ln='98'></td><td><span class='pt13 it'>var</span><span> (</span></td></tr>
<tr><td class='ln' data-ln='99'></td><td><span> </span><span class='pt16 it'>// verify that an io.Copy from NoBody won't require a buffer:</span></td></tr>
<tr><td class='ln' data-ln='100'></td><td><span> _ io.WriterTo </span><span class='pt23'>=</span><span> NoBody</span></td></tr>
<tr><td class='ln' data-ln='101'></td><td><span> _ io.ReadCloser </span><span class='pt23'>=</span><span> NoBody</span></td></tr>
<tr><td class='ln' data-ln='102'></td><td><span>)</span></td></tr>
<tr><td class='ln' data-ln='103'></td><td> </td></tr>
<tr><td class='ln' data-ln='104'></td><td><span class='pt16 it'>// PushOptions describes options for Pusher.Push.</span></td></tr>
<tr><td class='ln' data-ln='105'></td><td><span class='pt13 it'>type</span><span> </span><span class='pt19'>PushOptions</span><span> </span><span class='pt13 it'>struct</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='106'></td><td><span> </span><span class='pt16 it'>// Method specifies the HTTP method for the promised request.</span></td></tr>
<tr><td class='ln' data-ln='107'></td><td><span> </span><span class='pt16 it'>// If set, it must be "GET" or "HEAD". Empty means "GET".</span></td></tr>
<tr><td class='ln' data-ln='108'></td><td><span> Method </span><span class='pt13 it'>string</span></td></tr>
<tr><td class='ln' data-ln='109'></td><td> </td></tr>
<tr><td class='ln' data-ln='110'></td><td><span> </span><span class='pt16 it'>// Header specifies additional promised request headers. This cannot</span></td></tr>
<tr><td class='ln' data-ln='111'></td><td><span> </span><span class='pt16 it'>// include HTTP/2 pseudo header fields like ":path" and ":scheme",</span></td></tr>
<tr><td class='ln' data-ln='112'></td><td><span> </span><span class='pt16 it'>// which will be added automatically.</span></td></tr>
<tr><td class='ln' data-ln='113'></td><td><span> Header Header</span></td></tr>
<tr><td class='ln' data-ln='114'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='115'></td><td> </td></tr>
<tr><td class='ln' data-ln='116'></td><td><span class='pt16 it'>// Pusher is the interface implemented by ResponseWriters that support</span></td></tr>
<tr><td class='ln' data-ln='117'></td><td><span class='pt16 it'>// HTTP/2 server push. For more background, see</span></td></tr>
<tr><td class='ln' data-ln='118'></td><td><span class='pt16 it'>// https://tools.ietf.org/html/rfc7540#section-8.2.</span></td></tr>
<tr><td class='ln' data-ln='119'></td><td><span class='pt13 it'>type</span><span> </span><span class='pt19'>Pusher</span><span> </span><span class='pt13 it'>interface</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='120'></td><td><span> </span><span class='pt16 it'>// Push initiates an HTTP/2 server push. This constructs a synthetic</span></td></tr>
<tr><td class='ln' data-ln='121'></td><td><span> </span><span class='pt16 it'>// request using the given target and options, serializes that request</span></td></tr>
<tr><td class='ln' data-ln='122'></td><td><span> </span><span class='pt16 it'>// into a PUSH_PROMISE frame, then dispatches that request using the</span></td></tr>
<tr><td class='ln' data-ln='123'></td><td><span> </span><span class='pt16 it'>// server's request handler. If opts is nil, default options are used.</span></td></tr>
<tr><td class='ln' data-ln='124'></td><td><span> </span><span class='pt16 it'>//</span></td></tr>
<tr><td class='ln' data-ln='125'></td><td><span> </span><span class='pt16 it'>// The target must either be an absolute path (like "/path") or an absolute</span></td></tr>
<tr><td class='ln' data-ln='126'></td><td><span> </span><span class='pt16 it'>// URL that contains a valid host and the same scheme as the parent request.</span></td></tr>
<tr><td class='ln' data-ln='127'></td><td><span> </span><span class='pt16 it'>// If the target is a path, it will inherit the scheme and host of the</span></td></tr>
<tr><td class='ln' data-ln='128'></td><td><span> </span><span class='pt16 it'>// parent request.</span></td></tr>
<tr><td class='ln' data-ln='129'></td><td><span> </span><span class='pt16 it'>//</span></td></tr>
<tr><td class='ln' data-ln='130'></td><td><span> </span><span class='pt16 it'>// The HTTP/2 spec disallows recursive pushes and cross-authority pushes.</span></td></tr>
<tr><td class='ln' data-ln='131'></td><td><span> </span><span class='pt16 it'>// Push may or may not detect these invalid pushes; however, invalid</span></td></tr>
<tr><td class='ln' data-ln='132'></td><td><span> </span><span class='pt16 it'>// pushes will be detected and canceled by conforming clients.</span></td></tr>
<tr><td class='ln' data-ln='133'></td><td><span> </span><span class='pt16 it'>//</span></td></tr>
<tr><td class='ln' data-ln='134'></td><td><span> </span><span class='pt16 it'>// Handlers that wish to push URL X should call Push before sending any</span></td></tr>
<tr><td class='ln' data-ln='135'></td><td><span> </span><span class='pt16 it'>// data that may trigger a request for URL X. This avoids a race where the</span></td></tr>
<tr><td class='ln' data-ln='136'></td><td><span> </span><span class='pt16 it'>// client issues requests for X before receiving the PUSH_PROMISE for X.</span></td></tr>
<tr><td class='ln' data-ln='137'></td><td><span> </span><span class='pt16 it'>//</span></td></tr>
<tr><td class='ln' data-ln='138'></td><td><span> </span><span class='pt16 it'>// Push returns ErrNotSupported if the client has disabled push or if push</span></td></tr>
<tr><td class='ln' data-ln='139'></td><td><span> </span><span class='pt16 it'>// is not supported on the underlying connection.</span></td></tr>
<tr><td class='ln' data-ln='140'></td><td><span> </span><span class='pt19'>Push</span><span>(target </span><span class='pt13 it'>string</span><span>, opts </span><span class='pt23'>*</span><span>PushOptions) </span><span class='pt13 it'>error</span></td></tr>
<tr><td class='ln' data-ln='141'></td><td><span>}</span></td></tr>
</table>
</div>
</div>
</div>
<div class='style' id='P--atom_dark--html'>
<div class='P--atom_dark-bordered'>
<div class="info header">
<span class="left">index.html</span>
<span class="right"><span>76 lines</span><span>3.60 KB</span></span>
</div>
<div class='P--atom_dark'>
<table>
<tr><td class='ln' data-ln='1'></td><td><span><!</span><span class='pt23'>DOCTYPE</span><span> html></span></td></tr>
<tr><td class='ln' data-ln='2'></td><td><span><</span><span class='pt23'>html</span><span>></span></td></tr>
<tr><td class='ln' data-ln='3'></td><td class='hi'><span><</span><span class='pt23'>head</span><span>></span></td></tr>
<tr><td class='ln' data-ln='4'></td><td class='hi'><span> <</span><span class='pt23'>meta</span><span> </span><span class='pt11'>charset</span><span>=</span><span class='pt9'>"utf-8"</span><span> /></span></td></tr>
<tr><td class='ln' data-ln='5'></td><td class='hi'><span> <</span><span class='pt23'>meta</span><span> </span><span class='pt11'>http-equiv</span><span>=</span><span class='pt9'>"X-UA-Compatible"</span><span> </span><span class='pt11'>content</span><span>=</span><span class='pt9'>"IE=edge"</span><span>></span></td></tr>
<tr><td class='ln' data-ln='6'></td><td class='hi'><span> <</span><span class='pt23'>title</span><span>>paint demo</</span><span class='pt23'>title</span><span>></span></td></tr>
<tr><td class='ln' data-ln='7'></td><td class='hi'><span> <</span><span class='pt23'>meta</span><span> </span><span class='pt11'>name</span><span>=</span><span class='pt9'>"viewport"</span><span> </span><span class='pt11'>content</span><span>=</span><span class='pt9'>"width=device-width, initial-scale=1"</span><span>></span></td></tr>
<tr><td class='ln' data-ln='8'></td><td class='hi'><span> <</span><span class='pt23'>link</span><span> </span><span class='pt11'>rel</span><span>=</span><span class='pt9'>"stylesheet"</span><span> </span><span class='pt11'>type</span><span>=</span><span class='pt9'>"text/css"</span><span> </span><span class='pt11'>media</span><span>=</span><span class='pt9'>"screen"</span><span> </span><span class='pt11'>href</span><span>=</span><span class='pt9'>"main.css"</span><span> /></span></td></tr>
<tr><td class='ln' data-ln='9'></td><td class='hi'><span> <</span><span class='pt23'>link</span><span> </span><span class='pt11'>rel</span><span>=</span><span class='pt9'>"stylesheet"</span><span> </span><span class='pt11'>type</span><span>=</span><span class='pt9'>"text/css"</span><span> </span><span class='pt11'>media</span><span>=</span><span class='pt9'>"screen"</span><span> </span><span class='pt11'>href</span><span>=</span><span class='pt9'>"snippets.css"</span><span> /></span></td></tr>
<tr><td class='ln' data-ln='10'></td><td class='hi'><span></</span><span class='pt23'>head</span><span>></span></td></tr>
<tr><td class='ln' data-ln='11'></td><td><span><</span><span class='pt23'>body</span><span>></span></td></tr>
<tr><td class='ln' data-ln='12'></td><td><span> <</span><span class='pt23'>div</span><span> </span><span class='pt11'>class</span><span>=</span><span class='pt9'>"container"</span><span>></span></td></tr>
<tr><td class='ln' data-ln='13'></td><td><span> <</span><span class='pt23'>div</span><span> </span><span class='pt11'>class</span><span>=</span><span class='pt9'>"command"</span><span>></span></td></tr>
<tr><td class='ln' data-ln='14'></td><td><span> <</span><span class='pt23'>h1</span><span>></span></td></tr>
<tr><td class='ln' data-ln='15'></td><td><span> <</span><span class='pt23'>span</span><span> </span><span class='pt11'>class</span><span>=</span><span class='pt9'>"hue-rotate"</span><span>>$</</span><span class='pt23'>span</span><span>> paint</span></td></tr>
<tr><td class='ln' data-ln='16'></td><td><span> ./file.<</span><span class='pt23'>span</span><span> </span><span class='pt11'>id</span><span>=</span><span class='pt9'>"ext"</span><span>>rs</</span><span class='pt23'>span</span><span>></span></td></tr>
<tr><td class='ln' data-ln='17'></td><td><span> <</span><span class='pt23'>nobr</span><span>>--style="<</span><span class='pt23'>span</span><span> </span><span class='pt11'>id</span><span>=</span><span class='pt9'>"style-name"</span><span>>github</</span><span class='pt23'>span</span><span>>"</</span><span class='pt23'>nobr</span><span>></span></td></tr>
<tr><td class='ln' data-ln='18'></td><td><span> <</span><span class='pt23'>nobr</span><span>>--gist-like</</span><span class='pt23'>nobr</span><span>></span></td></tr>
<tr><td class='ln' data-ln='19'></td><td><span> <</span><span class='pt23'>nobr</span><span>><</span><span class='pt23'>span</span><span> </span><span class='pt11'>id</span><span>=</span><span class='pt9'>"lines"</span><span>></</span><span class='pt23'>span</span><span>></</span><span class='pt23'>nobr</span><span>></span></td></tr>
<tr><td class='ln' data-ln='20'></td><td><span> </</span><span class='pt23'>h1</span><span>></span></td></tr>
<tr><td class='ln' data-ln='21'></td><td><span> </</span><span class='pt23'>div</span><span>></span></td></tr>
<tr><td class='ln' data-ln='22'></td><td> </td></tr>
<tr><td class='ln' data-ln='23'></td><td><span> <</span><span class='pt23'>div</span><span> </span><span class='pt11'>class</span><span>=</span><span class='pt9'>"flex-centered"</span><span>></span></td></tr>
<tr><td class='ln' data-ln='24'></td><td><span> <</span><span class='pt23'>select</span><span> </span><span class='pt11'>id</span><span>=</span><span class='pt9'>"filetype"</span><span>></span></td></tr>
<tr><td class='ln' data-ln='25'></td><td><span> <</span><span class='pt23'>option</span><span> </span><span class='pt11'>selected</span><span> </span><span class='pt11'>value</span><span>=</span><span class='pt9'>"rs"</span><span>>rust</</span><span class='pt23'>option</span><span>></span></td></tr>
<tr><td class='ln' data-ln='26'></td><td><span> <</span><span class='pt23'>option</span><span> </span><span class='pt11'>value</span><span>=</span><span class='pt9'>"js"</span><span>>javascript</</span><span class='pt23'>option</span><span>></span></td></tr>
<tr><td class='ln' data-ln='27'></td><td><span> <</span><span class='pt23'>option</span><span> </span><span class='pt11'>value</span><span>=</span><span class='pt9'>"jsx"</span><span>>jsx</</span><span class='pt23'>option</span><span>></span></td></tr>
<tr><td class='ln' data-ln='28'></td><td><span> <</span><span class='pt23'>option</span><span> </span><span class='pt11'>value</span><span>=</span><span class='pt9'>"html"</span><span>>html</</span><span class='pt23'>option</span><span>></span></td></tr>
<tr><td class='ln' data-ln='29'></td><td><span> <</span><span class='pt23'>option</span><span> </span><span class='pt11'>value</span><span>=</span><span class='pt9'>"c"</span><span>>c</</span><span class='pt23'>option</span><span>></span></td></tr>
<tr><td class='ln' data-ln='30'></td><td><span> <</span><span class='pt23'>option</span><span> </span><span class='pt11'>value</span><span>=</span><span class='pt9'>"py"</span><span>>python</</span><span class='pt23'>option</span><span>></span></td></tr>
<tr><td class='ln' data-ln='31'></td><td><span> <</span><span class='pt23'>option</span><span> </span><span class='pt11'>value</span><span>=</span><span class='pt9'>"go"</span><span>>go</</span><span class='pt23'>option</span><span>></span></td></tr>
<tr><td class='ln' data-ln='32'></td><td><span> </</span><span class='pt23'>select</span><span>></span></td></tr>
<tr><td class='ln' data-ln='33'></td><td> </td></tr>
<tr><td class='ln' data-ln='34'></td><td><span> <</span><span class='pt23'>select</span><span> </span><span class='pt11'>id</span><span>=</span><span class='pt9'>"style"</span><span>></span></td></tr>
<tr><td class='ln' data-ln='35'></td><td><span> <</span><span class='pt23'>option</span><span> </span><span class='pt11'>value</span><span>=</span><span class='pt9'>"atom_dark"</span><span>>atom dark</</span><span class='pt23'>option</span><span>></span></td></tr>
<tr><td class='ln' data-ln='36'></td><td><span> <</span><span class='pt23'>option</span><span> </span><span class='pt11'>value</span><span>=</span><span class='pt9'>"ayu_dark"</span><span>>ayu dark</</span><span class='pt23'>option</span><span>></span></td></tr>
<tr><td class='ln' data-ln='37'></td><td><span> <</span><span class='pt23'>option</span><span> </span><span class='pt11'>value</span><span>=</span><span class='pt9'>"ayu_light"</span><span>>ayu light</</span><span class='pt23'>option</span><span>></span></td></tr>
<tr><td class='ln' data-ln='38'></td><td><span> <</span><span class='pt23'>option</span><span> </span><span class='pt11'>value</span><span>=</span><span class='pt9'>"ayu_mirage"</span><span>>ayu mirage</</span><span class='pt23'>option</span><span>></span></td></tr>
<tr><td class='ln' data-ln='39'></td><td><span> <</span><span class='pt23'>option</span><span> </span><span class='pt11'>value</span><span>=</span><span class='pt9'>"cobalt2"</span><span>>cobalt2</</span><span class='pt23'>option</span><span>></span></td></tr>
<tr><td class='ln' data-ln='40'></td><td><span> <</span><span class='pt23'>option</span><span> </span><span class='pt11'>value</span><span>=</span><span class='pt9'>"dracula"</span><span>>dracula</</span><span class='pt23'>option</span><span>></span></td></tr>
<tr><td class='ln' data-ln='41'></td><td><span> <</span><span class='pt23'>option</span><span> </span><span class='pt11'>selected</span><span> </span><span class='pt11'>value</span><span>=</span><span class='pt9'>"github"</span><span>>github</</span><span class='pt23'>option</span><span>></span></td></tr>
<tr><td class='ln' data-ln='42'></td><td><span> <</span><span class='pt23'>option</span><span> </span><span class='pt11'>value</span><span>=</span><span class='pt9'>"monokai_extended"</span><span>>monokai extended</</span><span class='pt23'>option</span><span>></span></td></tr>
<tr><td class='ln' data-ln='43'></td><td><span> <</span><span class='pt23'>option</span><span> </span><span class='pt11'>value</span><span>=</span><span class='pt9'>"oceanic_next"</span><span>>oceanic next</</span><span class='pt23'>option</span><span>></span></td></tr>
<tr><td class='ln' data-ln='44'></td><td><span> <</span><span class='pt23'>option</span><span> </span><span class='pt11'>value</span><span>=</span><span class='pt9'>"one_dark"</span><span>>one dark</</span><span class='pt23'>option</span><span>></span></td></tr>
<tr><td class='ln' data-ln='45'></td><td><span> <</span><span class='pt23'>option</span><span> </span><span class='pt11'>value</span><span>=</span><span class='pt9'>"one_light"</span><span>>one light</</span><span class='pt23'>option</span><span>></span></td></tr>
<tr><td class='ln' data-ln='46'></td><td><span> <</span><span class='pt23'>option</span><span> </span><span class='pt11'>value</span><span>=</span><span class='pt9'>"one_monokai"</span><span>>one monokai</</span><span class='pt23'>option</span><span>></span></td></tr>
<tr><td class='ln' data-ln='47'></td><td><span> <</span><span class='pt23'>option</span><span> </span><span class='pt11'>value</span><span>=</span><span class='pt9'>"predawn"</span><span>>predawn</</span><span class='pt23'>option</span><span>></span></td></tr>
<tr><td class='ln' data-ln='48'></td><td><span> <</span><span class='pt23'>option</span><span> </span><span class='pt11'>value</span><span>=</span><span class='pt9'>"solarized_dark"</span><span>>solarized dark</</span><span class='pt23'>option</span><span>></span></td></tr>
<tr><td class='ln' data-ln='49'></td><td><span> <</span><span class='pt23'>option</span><span> </span><span class='pt11'>value</span><span>=</span><span class='pt9'>"solarized_light"</span><span>>solarized light</</span><span class='pt23'>option</span><span>></span></td></tr>
<tr><td class='ln' data-ln='50'></td><td><span> <</span><span class='pt23'>option</span><span> </span><span class='pt11'>value</span><span>=</span><span class='pt9'>"wombat"</span><span>>wombat</</span><span class='pt23'>option</span><span>></span></td></tr>
<tr><td class='ln' data-ln='51'></td><td><span> </</span><span class='pt23'>select</span><span>></span></td></tr>
<tr><td class='ln' data-ln='52'></td><td> </td></tr>
<tr><td class='ln' data-ln='53'></td><td><span> <</span><span class='pt23'>input</span><span> </span><span class='pt11'>id</span><span>=</span><span class='pt9'>"highlight"</span><span> </span><span class='pt11'>type</span><span>=</span><span class='pt9'>"checkbox"</span><span> /></span></td></tr>
<tr><td class='ln' data-ln='54'></td><td><span> <</span><span class='pt23'>label</span><span> </span><span class='pt11'>for</span><span>=</span><span class='pt9'>"highlight"</span><span>><</span><span class='pt23'>nobr</span><span>>--highlight</</span><span class='pt23'>nobr</span><span>></</span><span class='pt23'>label</span><span>></span></td></tr>
<tr><td class='ln' data-ln='55'></td><td><span> </</span><span class='pt23'>div</span><span>></span></td></tr>
<tr><td class='ln' data-ln='56'></td><td> </td></tr>
<tr><td class='ln' data-ln='57'></td><td> </td></tr>
<tr><td class='ln' data-ln='58'></td><td><span> <</span><span class='pt23'>div</span><span> </span><span class='pt11'>id</span><span>=</span><span class='pt9'>"highlighted"</span><span> </span><span class='pt11'>class</span><span>=</span><span class='pt9'>"no-hi"</span><span> </span><span class='pt11'>data-style</span><span>=</span><span class='pt9'>"github--rs"</span><span> </span><span class='pt11'>data-filetype</span><span>=</span><span class='pt9'>"rs"</span><span>></span></td></tr>
<tr><td class='ln' data-ln='59'></td><td><span> </</span><span class='pt23'>div</span><span>> </span><span class='pt3'><!-- highlighted --></span></td></tr>
<tr><td class='ln' data-ln='60'></td><td> </td></tr>
<tr><td class='ln' data-ln='61'></td><td><span> <</span><span class='pt23'>div</span><span> </span><span class='pt11'>class</span><span>=</span><span class='pt9'>"gh"</span><span>></span></td></tr>
<tr><td class='ln' data-ln='62'></td><td><span> <</span><span class='pt23'>a</span><span> </span><span class='pt11'>href</span><span>=</span><span class='pt9'>"https://github.com/demille/paint"</span><span>></span></td></tr>
<tr><td class='ln' data-ln='63'></td><td><span> <</span><span class='pt23'>svg</span><span> </span><span class='pt11'>role</span><span>=</span><span class='pt9'>"img"</span><span> </span><span class='pt11'>viewBox</span><span>=</span><span class='pt9'>"0 0 24 24"</span><span> </span><span class='pt11'>xmlns</span><span>=</span><span class='pt9'>"http://www.w3.org/2000/svg"</span><span>></span></td></tr>
<tr><td class='ln' data-ln='64'></td><td><span> <</span><span class='pt23'>path</span><span> </span><span class='pt11'>d</span><span>=</span><span class='pt9'>"M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12"</span><span>/></span></td></tr>
<tr><td class='ln' data-ln='65'></td><td><span> </</span><span class='pt23'>svg</span><span>></span></td></tr>
<tr><td class='ln' data-ln='66'></td><td><span> <</span><span class='pt23'>span</span><span>>/demille/paint</</span><span class='pt23'>span</span><span>></span></td></tr>
<tr><td class='ln' data-ln='67'></td><td><span> </</span><span class='pt23'>a</span><span>></span></td></tr>
<tr><td class='ln' data-ln='68'></td><td><span> </</span><span class='pt23'>div</span><span>></span></td></tr>
<tr><td class='ln' data-ln='69'></td><td> </td></tr>
<tr><td class='ln' data-ln='70'></td><td><span> </</span><span class='pt23'>div</span><span>> </span><span class='pt3'><!-- container --></span></td></tr>
<tr><td class='ln' data-ln='71'></td><td> </td></tr>
<tr><td class='ln' data-ln='72'></td><td><span> <</span><span class='pt23'>div</span><span> </span><span class='pt11'>class</span><span>=</span><span class='pt9'>"bg-overlay"</span><span>></</span><span class='pt23'>div</span><span>></span></td></tr>
<tr><td class='ln' data-ln='73'></td><td> </td></tr>
<tr><td class='ln' data-ln='74'></td><td><span> <</span><span class='pt23'>script</span><span> </span><span class='pt11'>src</span><span>=</span><span class='pt9'>"main.js"</span><span>></</span><span class='pt23'>script</span><span>></span></td></tr>
<tr><td class='ln' data-ln='75'></td><td><span></</span><span class='pt23'>body</span><span>></span></td></tr>
<tr><td class='ln' data-ln='76'></td><td><span></</span><span class='pt23'>html</span><span>></span></td></tr>
</table>
</div>
</div>
</div>
<div class='style' id='P--ayu_dark--html'>
<div class='P--ayu_dark-bordered'>
<div class="info header">
<span class="left">index.html</span>
<span class="right"><span>76 lines</span><span>3.60 KB</span></span>
</div>
<div class='P--ayu_dark'>
<table>
<tr><td class='ln' data-ln='1'></td><td><span class='pt26'><!</span><span class='pt9'>DOCTYPE</span><span class='pt8'> html</span><span class='pt26'>></span></td></tr>
<tr><td class='ln' data-ln='2'></td><td><span class='pt26'><</span><span class='pt9'>html</span><span class='pt26'>></span></td></tr>
<tr><td class='ln' data-ln='3'></td><td class='hi'><span class='pt26'><</span><span class='pt9'>head</span><span class='pt26'>></span></td></tr>
<tr><td class='ln' data-ln='4'></td><td class='hi'><span> </span><span class='pt26'><</span><span class='pt9'>meta</span><span> </span><span class='pt22'>charset</span><span class='pt25'>=</span><span class='pt13'>"utf-8"</span><span class='pt26'> /></span></td></tr>
<tr><td class='ln' data-ln='5'></td><td class='hi'><span> </span><span class='pt26'><</span><span class='pt9'>meta</span><span> </span><span class='pt22'>http-equiv</span><span class='pt25'>=</span><span class='pt13'>"X-UA-Compatible"</span><span> </span><span class='pt22'>content</span><span class='pt25'>=</span><span class='pt13'>"IE=edge"</span><span class='pt26'>></span></td></tr>
<tr><td class='ln' data-ln='6'></td><td class='hi'><span> </span><span class='pt26'><</span><span class='pt9'>title</span><span class='pt26'>></span><span>paint demo</span><span class='pt26'></</span><span class='pt9'>title</span><span class='pt26'>></span></td></tr>
<tr><td class='ln' data-ln='7'></td><td class='hi'><span> </span><span class='pt26'><</span><span class='pt9'>meta</span><span> </span><span class='pt22'>name</span><span class='pt25'>=</span><span class='pt13'>"viewport"</span><span> </span><span class='pt22'>content</span><span class='pt25'>=</span><span class='pt13'>"width=device-width, initial-scale=1"</span><span class='pt26'>></span></td></tr>
<tr><td class='ln' data-ln='8'></td><td class='hi'><span> </span><span class='pt26'><</span><span class='pt9'>link</span><span> </span><span class='pt22'>rel</span><span class='pt25'>=</span><span class='pt13'>"stylesheet"</span><span> </span><span class='pt22'>type</span><span class='pt25'>=</span><span class='pt13'>"text/css"</span><span> </span><span class='pt22'>media</span><span class='pt25'>=</span><span class='pt13'>"screen"</span><span> </span><span class='pt22'>href</span><span class='pt25'>=</span><span class='pt13'>"main.css"</span><span class='pt26'> /></span></td></tr>
<tr><td class='ln' data-ln='9'></td><td class='hi'><span> </span><span class='pt26'><</span><span class='pt9'>link</span><span> </span><span class='pt22'>rel</span><span class='pt25'>=</span><span class='pt13'>"stylesheet"</span><span> </span><span class='pt22'>type</span><span class='pt25'>=</span><span class='pt13'>"text/css"</span><span> </span><span class='pt22'>media</span><span class='pt25'>=</span><span class='pt13'>"screen"</span><span> </span><span class='pt22'>href</span><span class='pt25'>=</span><span class='pt13'>"snippets.css"</span><span class='pt26'> /></span></td></tr>
<tr><td class='ln' data-ln='10'></td><td class='hi'><span class='pt26'></</span><span class='pt9'>head</span><span class='pt26'>></span></td></tr>
<tr><td class='ln' data-ln='11'></td><td><span class='pt26'><</span><span class='pt9'>body</span><span class='pt26'>></span></td></tr>
<tr><td class='ln' data-ln='12'></td><td><span> </span><span class='pt26'><</span><span class='pt9'>div</span><span> </span><span class='pt22'>class</span><span class='pt25'>=</span><span class='pt13'>"container"</span><span class='pt26'>></span></td></tr>
<tr><td class='ln' data-ln='13'></td><td><span> </span><span class='pt26'><</span><span class='pt9'>div</span><span> </span><span class='pt22'>class</span><span class='pt25'>=</span><span class='pt13'>"command"</span><span class='pt26'>></span></td></tr>
<tr><td class='ln' data-ln='14'></td><td><span> </span><span class='pt26'><</span><span class='pt9'>h1</span><span class='pt26'>></span></td></tr>
<tr><td class='ln' data-ln='15'></td><td><span> </span><span class='pt26'><</span><span class='pt9'>span</span><span> </span><span class='pt22'>class</span><span class='pt25'>=</span><span class='pt13'>"hue-rotate"</span><span class='pt26'>></span><span>$</span><span class='pt26'></</span><span class='pt9'>span</span><span class='pt26'>></span><span> paint</span></td></tr>
<tr><td class='ln' data-ln='16'></td><td><span> ./file.</span><span class='pt26'><</span><span class='pt9'>span</span><span> </span><span class='pt22'>id</span><span class='pt25'>=</span><span class='pt13'>"ext"</span><span class='pt26'>></span><span>rs</span><span class='pt26'></</span><span class='pt9'>span</span><span class='pt26'>></span></td></tr>
<tr><td class='ln' data-ln='17'></td><td><span> </span><span class='pt26'><</span><span class='pt9'>nobr</span><span class='pt26'>></span><span>--style="</span><span class='pt26'><</span><span class='pt9'>span</span><span> </span><span class='pt22'>id</span><span class='pt25'>=</span><span class='pt13'>"style-name"</span><span class='pt26'>></span><span>github</span><span class='pt26'></</span><span class='pt9'>span</span><span class='pt26'>></span><span>"</span><span class='pt26'></</span><span class='pt9'>nobr</span><span class='pt26'>></span></td></tr>
<tr><td class='ln' data-ln='18'></td><td><span> </span><span class='pt26'><</span><span class='pt9'>nobr</span><span class='pt26'>></span><span>--gist-like</span><span class='pt26'></</span><span class='pt9'>nobr</span><span class='pt26'>></span></td></tr>
<tr><td class='ln' data-ln='19'></td><td><span> </span><span class='pt26'><</span><span class='pt9'>nobr</span><span class='pt26'>><</span><span class='pt9'>span</span><span> </span><span class='pt22'>id</span><span class='pt25'>=</span><span class='pt13'>"lines"</span><span class='pt26'>></</span><span class='pt9'>span</span><span class='pt26'>></</span><span class='pt9'>nobr</span><span class='pt26'>></span></td></tr>
<tr><td class='ln' data-ln='20'></td><td><span> </span><span class='pt26'></</span><span class='pt9'>h1</span><span class='pt26'>></span></td></tr>
<tr><td class='ln' data-ln='21'></td><td><span> </span><span class='pt26'></</span><span class='pt9'>div</span><span class='pt26'>></span></td></tr>
<tr><td class='ln' data-ln='22'></td><td> </td></tr>
<tr><td class='ln' data-ln='23'></td><td><span> </span><span class='pt26'><</span><span class='pt9'>div</span><span> </span><span class='pt22'>class</span><span class='pt25'>=</span><span class='pt13'>"flex-centered"</span><span class='pt26'>></span></td></tr>
<tr><td class='ln' data-ln='24'></td><td><span> </span><span class='pt26'><</span><span class='pt9'>select</span><span> </span><span class='pt22'>id</span><span class='pt25'>=</span><span class='pt13'>"filetype"</span><span class='pt26'>></span></td></tr>
<tr><td class='ln' data-ln='25'></td><td><span> </span><span class='pt26'><</span><span class='pt9'>option</span><span> </span><span class='pt22'>selected</span><span> </span><span class='pt22'>value</span><span class='pt25'>=</span><span class='pt13'>"rs"</span><span class='pt26'>></span><span>rust</span><span class='pt26'></</span><span class='pt9'>option</span><span class='pt26'>></span></td></tr>
<tr><td class='ln' data-ln='26'></td><td><span> </span><span class='pt26'><</span><span class='pt9'>option</span><span> </span><span class='pt22'>value</span><span class='pt25'>=</span><span class='pt13'>"js"</span><span class='pt26'>></span><span>javascript</span><span class='pt26'></</span><span class='pt9'>option</span><span class='pt26'>></span></td></tr>
<tr><td class='ln' data-ln='27'></td><td><span> </span><span class='pt26'><</span><span class='pt9'>option</span><span> </span><span class='pt22'>value</span><span class='pt25'>=</span><span class='pt13'>"jsx"</span><span class='pt26'>></span><span>jsx</span><span class='pt26'></</span><span class='pt9'>option</span><span class='pt26'>></span></td></tr>
<tr><td class='ln' data-ln='28'></td><td><span> </span><span class='pt26'><</span><span class='pt9'>option</span><span> </span><span class='pt22'>value</span><span class='pt25'>=</span><span class='pt13'>"html"</span><span class='pt26'>></span><span>html</span><span class='pt26'></</span><span class='pt9'>option</span><span class='pt26'>></span></td></tr>
<tr><td class='ln' data-ln='29'></td><td><span> </span><span class='pt26'><</span><span class='pt9'>option</span><span> </span><span class='pt22'>value</span><span class='pt25'>=</span><span class='pt13'>"c"</span><span class='pt26'>></span><span>c</span><span class='pt26'></</span><span class='pt9'>option</span><span class='pt26'>></span></td></tr>
<tr><td class='ln' data-ln='30'></td><td><span> </span><span class='pt26'><</span><span class='pt9'>option</span><span> </span><span class='pt22'>value</span><span class='pt25'>=</span><span class='pt13'>"py"</span><span class='pt26'>></span><span>python</span><span class='pt26'></</span><span class='pt9'>option</span><span class='pt26'>></span></td></tr>
<tr><td class='ln' data-ln='31'></td><td><span> </span><span class='pt26'><</span><span class='pt9'>option</span><span> </span><span class='pt22'>value</span><span class='pt25'>=</span><span class='pt13'>"go"</span><span class='pt26'>></span><span>go</span><span class='pt26'></</span><span class='pt9'>option</span><span class='pt26'>></span></td></tr>
<tr><td class='ln' data-ln='32'></td><td><span> </span><span class='pt26'></</span><span class='pt9'>select</span><span class='pt26'>></span></td></tr>
<tr><td class='ln' data-ln='33'></td><td> </td></tr>
<tr><td class='ln' data-ln='34'></td><td><span> </span><span class='pt26'><</span><span class='pt9'>select</span><span> </span><span class='pt22'>id</span><span class='pt25'>=</span><span class='pt13'>"style"</span><span class='pt26'>></span></td></tr>
<tr><td class='ln' data-ln='35'></td><td><span> </span><span class='pt26'><</span><span class='pt9'>option</span><span> </span><span class='pt22'>value</span><span class='pt25'>=</span><span class='pt13'>"atom_dark"</span><span class='pt26'>></span><span>atom dark</span><span class='pt26'></</span><span class='pt9'>option</span><span class='pt26'>></span></td></tr>
<tr><td class='ln' data-ln='36'></td><td><span> </span><span class='pt26'><</span><span class='pt9'>option</span><span> </span><span class='pt22'>value</span><span class='pt25'>=</span><span class='pt13'>"ayu_dark"</span><span class='pt26'>></span><span>ayu dark</span><span class='pt26'></</span><span class='pt9'>option</span><span class='pt26'>></span></td></tr>
<tr><td class='ln' data-ln='37'></td><td><span> </span><span class='pt26'><</span><span class='pt9'>option</span><span> </span><span class='pt22'>value</span><span class='pt25'>=</span><span class='pt13'>"ayu_light"</span><span class='pt26'>></span><span>ayu light</span><span class='pt26'></</span><span class='pt9'>option</span><span class='pt26'>></span></td></tr>
<tr><td class='ln' data-ln='38'></td><td><span> </span><span class='pt26'><</span><span class='pt9'>option</span><span> </span><span class='pt22'>value</span><span class='pt25'>=</span><span class='pt13'>"ayu_mirage"</span><span class='pt26'>></span><span>ayu mirage</span><span class='pt26'></</span><span class='pt9'>option</span><span class='pt26'>></span></td></tr>
<tr><td class='ln' data-ln='39'></td><td><span> </span><span class='pt26'><</span><span class='pt9'>option</span><span> </span><span class='pt22'>value</span><span class='pt25'>=</span><span class='pt13'>"cobalt2"</span><span class='pt26'>></span><span>cobalt2</span><span class='pt26'></</span><span class='pt9'>option</span><span class='pt26'>></span></td></tr>
<tr><td class='ln' data-ln='40'></td><td><span> </span><span class='pt26'><</span><span class='pt9'>option</span><span> </span><span class='pt22'>value</span><span class='pt25'>=</span><span class='pt13'>"dracula"</span><span class='pt26'>></span><span>dracula</span><span class='pt26'></</span><span class='pt9'>option</span><span class='pt26'>></span></td></tr>
<tr><td class='ln' data-ln='41'></td><td><span> </span><span class='pt26'><</span><span class='pt9'>option</span><span> </span><span class='pt22'>selected</span><span> </span><span class='pt22'>value</span><span class='pt25'>=</span><span class='pt13'>"github"</span><span class='pt26'>></span><span>github</span><span class='pt26'></</span><span class='pt9'>option</span><span class='pt26'>></span></td></tr>
<tr><td class='ln' data-ln='42'></td><td><span> </span><span class='pt26'><</span><span class='pt9'>option</span><span> </span><span class='pt22'>value</span><span class='pt25'>=</span><span class='pt13'>"monokai_extended"</span><span class='pt26'>></span><span>monokai extended</span><span class='pt26'></</span><span class='pt9'>option</span><span class='pt26'>></span></td></tr>
<tr><td class='ln' data-ln='43'></td><td><span> </span><span class='pt26'><</span><span class='pt9'>option</span><span> </span><span class='pt22'>value</span><span class='pt25'>=</span><span class='pt13'>"oceanic_next"</span><span class='pt26'>></span><span>oceanic next</span><span class='pt26'></</span><span class='pt9'>option</span><span class='pt26'>></span></td></tr>
<tr><td class='ln' data-ln='44'></td><td><span> </span><span class='pt26'><</span><span class='pt9'>option</span><span> </span><span class='pt22'>value</span><span class='pt25'>=</span><span class='pt13'>"one_dark"</span><span class='pt26'>></span><span>one dark</span><span class='pt26'></</span><span class='pt9'>option</span><span class='pt26'>></span></td></tr>
<tr><td class='ln' data-ln='45'></td><td><span> </span><span class='pt26'><</span><span class='pt9'>option</span><span> </span><span class='pt22'>value</span><span class='pt25'>=</span><span class='pt13'>"one_light"</span><span class='pt26'>></span><span>one light</span><span class='pt26'></</span><span class='pt9'>option</span><span class='pt26'>></span></td></tr>
<tr><td class='ln' data-ln='46'></td><td><span> </span><span class='pt26'><</span><span class='pt9'>option</span><span> </span><span class='pt22'>value</span><span class='pt25'>=</span><span class='pt13'>"one_monokai"</span><span class='pt26'>></span><span>one monokai</span><span class='pt26'></</span><span class='pt9'>option</span><span class='pt26'>></span></td></tr>
<tr><td class='ln' data-ln='47'></td><td><span> </span><span class='pt26'><</span><span class='pt9'>option</span><span> </span><span class='pt22'>value</span><span class='pt25'>=</span><span class='pt13'>"predawn"</span><span class='pt26'>></span><span>predawn</span><span class='pt26'></</span><span class='pt9'>option</span><span class='pt26'>></span></td></tr>
<tr><td class='ln' data-ln='48'></td><td><span> </span><span class='pt26'><</span><span class='pt9'>option</span><span> </span><span class='pt22'>value</span><span class='pt25'>=</span><span class='pt13'>"solarized_dark"</span><span class='pt26'>></span><span>solarized dark</span><span class='pt26'></</span><span class='pt9'>option</span><span class='pt26'>></span></td></tr>
<tr><td class='ln' data-ln='49'></td><td><span> </span><span class='pt26'><</span><span class='pt9'>option</span><span> </span><span class='pt22'>value</span><span class='pt25'>=</span><span class='pt13'>"solarized_light"</span><span class='pt26'>></span><span>solarized light</span><span class='pt26'></</span><span class='pt9'>option</span><span class='pt26'>></span></td></tr>
<tr><td class='ln' data-ln='50'></td><td><span> </span><span class='pt26'><</span><span class='pt9'>option</span><span> </span><span class='pt22'>value</span><span class='pt25'>=</span><span class='pt13'>"wombat"</span><span class='pt26'>></span><span>wombat</span><span class='pt26'></</span><span class='pt9'>option</span><span class='pt26'>></span></td></tr>
<tr><td class='ln' data-ln='51'></td><td><span> </span><span class='pt26'></</span><span class='pt9'>select</span><span class='pt26'>></span></td></tr>
<tr><td class='ln' data-ln='52'></td><td> </td></tr>
<tr><td class='ln' data-ln='53'></td><td><span> </span><span class='pt26'><</span><span class='pt9'>input</span><span> </span><span class='pt22'>id</span><span class='pt25'>=</span><span class='pt13'>"highlight"</span><span> </span><span class='pt22'>type</span><span class='pt25'>=</span><span class='pt13'>"checkbox"</span><span class='pt26'> /></span></td></tr>
<tr><td class='ln' data-ln='54'></td><td><span> </span><span class='pt26'><</span><span class='pt9'>label</span><span> </span><span class='pt22'>for</span><span class='pt25'>=</span><span class='pt13'>"highlight"</span><span class='pt26'>><</span><span class='pt9'>nobr</span><span class='pt26'>></span><span>--highlight</span><span class='pt26'></</span><span class='pt9'>nobr</span><span class='pt26'>></</span><span class='pt9'>label</span><span class='pt26'>></span></td></tr>
<tr><td class='ln' data-ln='55'></td><td><span> </span><span class='pt26'></</span><span class='pt9'>div</span><span class='pt26'>></span></td></tr>
<tr><td class='ln' data-ln='56'></td><td> </td></tr>
<tr><td class='ln' data-ln='57'></td><td> </td></tr>
<tr><td class='ln' data-ln='58'></td><td><span> </span><span class='pt26'><</span><span class='pt9'>div</span><span> </span><span class='pt22'>id</span><span class='pt25'>=</span><span class='pt13'>"highlighted"</span><span> </span><span class='pt22'>class</span><span class='pt25'>=</span><span class='pt13'>"no-hi"</span><span> </span><span class='pt22'>data-style</span><span class='pt25'>=</span><span class='pt13'>"github--rs"</span><span> </span><span class='pt22'>data-filetype</span><span class='pt25'>=</span><span class='pt13'>"rs"</span><span class='pt26'>></span></td></tr>
<tr><td class='ln' data-ln='59'></td><td><span> </span><span class='pt26'></</span><span class='pt9'>div</span><span class='pt26'>></span><span> </span><span class='pt10 it'><!-- highlighted --></span></td></tr>
<tr><td class='ln' data-ln='60'></td><td> </td></tr>
<tr><td class='ln' data-ln='61'></td><td><span> </span><span class='pt26'><</span><span class='pt9'>div</span><span> </span><span class='pt22'>class</span><span class='pt25'>=</span><span class='pt13'>"gh"</span><span class='pt26'>></span></td></tr>
<tr><td class='ln' data-ln='62'></td><td><span> </span><span class='pt26'><</span><span class='pt9'>a</span><span> </span><span class='pt22'>href</span><span class='pt25'>=</span><span class='pt13'>"https://github.com/demille/paint"</span><span class='pt26'>></span></td></tr>
<tr><td class='ln' data-ln='63'></td><td><span> </span><span class='pt26'><</span><span class='pt9'>svg</span><span> </span><span class='pt22'>role</span><span class='pt25'>=</span><span class='pt13'>"img"</span><span> </span><span class='pt22'>viewBox</span><span class='pt25'>=</span><span class='pt13'>"0 0 24 24"</span><span> </span><span class='pt22'>xmlns</span><span class='pt25'>=</span><span class='pt13'>"http://www.w3.org/2000/svg"</span><span class='pt26'>></span></td></tr>
<tr><td class='ln' data-ln='64'></td><td><span> </span><span class='pt26'><</span><span class='pt9'>path</span><span> </span><span class='pt22'>d</span><span class='pt25'>=</span><span class='pt13'>"M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12"</span><span class='pt26'>/></span></td></tr>
<tr><td class='ln' data-ln='65'></td><td><span> </span><span class='pt26'></</span><span class='pt9'>svg</span><span class='pt26'>></span></td></tr>
<tr><td class='ln' data-ln='66'></td><td><span> </span><span class='pt26'><</span><span class='pt9'>span</span><span class='pt26'>></span><span>/demille/paint</span><span class='pt26'></</span><span class='pt9'>span</span><span class='pt26'>></span></td></tr>
<tr><td class='ln' data-ln='67'></td><td><span> </span><span class='pt26'></</span><span class='pt9'>a</span><span class='pt26'>></span></td></tr>
<tr><td class='ln' data-ln='68'></td><td><span> </span><span class='pt26'></</span><span class='pt9'>div</span><span class='pt26'>></span></td></tr>
<tr><td class='ln' data-ln='69'></td><td> </td></tr>
<tr><td class='ln' data-ln='70'></td><td><span> </span><span class='pt26'></</span><span class='pt9'>div</span><span class='pt26'>></span><span> </span><span class='pt10 it'><!-- container --></span></td></tr>
<tr><td class='ln' data-ln='71'></td><td> </td></tr>
<tr><td class='ln' data-ln='72'></td><td><span> </span><span class='pt26'><</span><span class='pt9'>div</span><span> </span><span class='pt22'>class</span><span class='pt25'>=</span><span class='pt13'>"bg-overlay"</span><span class='pt26'>></</span><span class='pt9'>div</span><span class='pt26'>></span></td></tr>
<tr><td class='ln' data-ln='73'></td><td> </td></tr>
<tr><td class='ln' data-ln='74'></td><td><span> </span><span class='pt26'><</span><span class='pt9'>script</span><span> </span><span class='pt22'>src</span><span class='pt25'>=</span><span class='pt13'>"main.js"</span><span class='pt26'>></</span><span class='pt9'>script</span><span class='pt26'>></span></td></tr>
<tr><td class='ln' data-ln='75'></td><td><span class='pt26'></</span><span class='pt9'>body</span><span class='pt26'>></span></td></tr>
<tr><td class='ln' data-ln='76'></td><td><span class='pt26'></</span><span class='pt9'>html</span><span class='pt26'>></span></td></tr>
</table>
</div>
</div>
</div>
<div class='style' id='P--ayu_light--html'>
<div class='P--ayu_light-bordered'>
<div class="info header">
<span class="left">index.html</span>
<span class="right"><span>76 lines</span><span>3.60 KB</span></span>
</div>
<div class='P--ayu_light'>
<table>
<tr><td class='ln' data-ln='1'></td><td><span class='pt25'><!</span><span class='pt7'>DOCTYPE</span><span class='pt9'> html</span><span class='pt25'>></span></td></tr>
<tr><td class='ln' data-ln='2'></td><td><span class='pt25'><</span><span class='pt7'>html</span><span class='pt25'>></span></td></tr>
<tr><td class='ln' data-ln='3'></td><td class='hi'><span class='pt25'><</span><span class='pt7'>head</span><span class='pt25'>></span></td></tr>
<tr><td class='ln' data-ln='4'></td><td class='hi'><span> </span><span class='pt25'><</span><span class='pt7'>meta</span><span> </span><span class='pt19'>charset</span><span class='pt26'>=</span><span class='pt10'>"utf-8"</span><span class='pt25'> /></span></td></tr>
<tr><td class='ln' data-ln='5'></td><td class='hi'><span> </span><span class='pt25'><</span><span class='pt7'>meta</span><span> </span><span class='pt19'>http-equiv</span><span class='pt26'>=</span><span class='pt10'>"X-UA-Compatible"</span><span> </span><span class='pt19'>content</span><span class='pt26'>=</span><span class='pt10'>"IE=edge"</span><span class='pt25'>></span></td></tr>
<tr><td class='ln' data-ln='6'></td><td class='hi'><span> </span><span class='pt25'><</span><span class='pt7'>title</span><span class='pt25'>></span><span>paint demo</span><span class='pt25'></</span><span class='pt7'>title</span><span class='pt25'>></span></td></tr>
<tr><td class='ln' data-ln='7'></td><td class='hi'><span> </span><span class='pt25'><</span><span class='pt7'>meta</span><span> </span><span class='pt19'>name</span><span class='pt26'>=</span><span class='pt10'>"viewport"</span><span> </span><span class='pt19'>content</span><span class='pt26'>=</span><span class='pt10'>"width=device-width, initial-scale=1"</span><span class='pt25'>></span></td></tr>
<tr><td class='ln' data-ln='8'></td><td class='hi'><span> </span><span class='pt25'><</span><span class='pt7'>link</span><span> </span><span class='pt19'>rel</span><span class='pt26'>=</span><span class='pt10'>"stylesheet"</span><span> </span><span class='pt19'>type</span><span class='pt26'>=</span><span class='pt10'>"text/css"</span><span> </span><span class='pt19'>media</span><span class='pt26'>=</span><span class='pt10'>"screen"</span><span> </span><span class='pt19'>href</span><span class='pt26'>=</span><span class='pt10'>"main.css"</span><span class='pt25'> /></span></td></tr>
<tr><td class='ln' data-ln='9'></td><td class='hi'><span> </span><span class='pt25'><</span><span class='pt7'>link</span><span> </span><span class='pt19'>rel</span><span class='pt26'>=</span><span class='pt10'>"stylesheet"</span><span> </span><span class='pt19'>type</span><span class='pt26'>=</span><span class='pt10'>"text/css"</span><span> </span><span class='pt19'>media</span><span class='pt26'>=</span><span class='pt10'>"screen"</span><span> </span><span class='pt19'>href</span><span class='pt26'>=</span><span class='pt10'>"snippets.css"</span><span class='pt25'> /></span></td></tr>
<tr><td class='ln' data-ln='10'></td><td class='hi'><span class='pt25'></</span><span class='pt7'>head</span><span class='pt25'>></span></td></tr>
<tr><td class='ln' data-ln='11'></td><td><span class='pt25'><</span><span class='pt7'>body</span><span class='pt25'>></span></td></tr>
<tr><td class='ln' data-ln='12'></td><td><span> </span><span class='pt25'><</span><span class='pt7'>div</span><span> </span><span class='pt19'>class</span><span class='pt26'>=</span><span class='pt10'>"container"</span><span class='pt25'>></span></td></tr>
<tr><td class='ln' data-ln='13'></td><td><span> </span><span class='pt25'><</span><span class='pt7'>div</span><span> </span><span class='pt19'>class</span><span class='pt26'>=</span><span class='pt10'>"command"</span><span class='pt25'>></span></td></tr>
<tr><td class='ln' data-ln='14'></td><td><span> </span><span class='pt25'><</span><span class='pt7'>h1</span><span class='pt25'>></span></td></tr>
<tr><td class='ln' data-ln='15'></td><td><span> </span><span class='pt25'><</span><span class='pt7'>span</span><span> </span><span class='pt19'>class</span><span class='pt26'>=</span><span class='pt10'>"hue-rotate"</span><span class='pt25'>></span><span>$</span><span class='pt25'></</span><span class='pt7'>span</span><span class='pt25'>></span><span> paint</span></td></tr>
<tr><td class='ln' data-ln='16'></td><td><span> ./file.</span><span class='pt25'><</span><span class='pt7'>span</span><span> </span><span class='pt19'>id</span><span class='pt26'>=</span><span class='pt10'>"ext"</span><span class='pt25'>></span><span>rs</span><span class='pt25'></</span><span class='pt7'>span</span><span class='pt25'>></span></td></tr>
<tr><td class='ln' data-ln='17'></td><td><span> </span><span class='pt25'><</span><span class='pt7'>nobr</span><span class='pt25'>></span><span>--style="</span><span class='pt25'><</span><span class='pt7'>span</span><span> </span><span class='pt19'>id</span><span class='pt26'>=</span><span class='pt10'>"style-name"</span><span class='pt25'>></span><span>github</span><span class='pt25'></</span><span class='pt7'>span</span><span class='pt25'>></span><span>"</span><span class='pt25'></</span><span class='pt7'>nobr</span><span class='pt25'>></span></td></tr>
<tr><td class='ln' data-ln='18'></td><td><span> </span><span class='pt25'><</span><span class='pt7'>nobr</span><span class='pt25'>></span><span>--gist-like</span><span class='pt25'></</span><span class='pt7'>nobr</span><span class='pt25'>></span></td></tr>
<tr><td class='ln' data-ln='19'></td><td><span> </span><span class='pt25'><</span><span class='pt7'>nobr</span><span class='pt25'>><</span><span class='pt7'>span</span><span> </span><span class='pt19'>id</span><span class='pt26'>=</span><span class='pt10'>"lines"</span><span class='pt25'>></</span><span class='pt7'>span</span><span class='pt25'>></</span><span class='pt7'>nobr</span><span class='pt25'>></span></td></tr>
<tr><td class='ln' data-ln='20'></td><td><span> </span><span class='pt25'></</span><span class='pt7'>h1</span><span class='pt25'>></span></td></tr>
<tr><td class='ln' data-ln='21'></td><td><span> </span><span class='pt25'></</span><span class='pt7'>div</span><span class='pt25'>></span></td></tr>
<tr><td class='ln' data-ln='22'></td><td> </td></tr>
<tr><td class='ln' data-ln='23'></td><td><span> </span><span class='pt25'><</span><span class='pt7'>div</span><span> </span><span class='pt19'>class</span><span class='pt26'>=</span><span class='pt10'>"flex-centered"</span><span class='pt25'>></span></td></tr>
<tr><td class='ln' data-ln='24'></td><td><span> </span><span class='pt25'><</span><span class='pt7'>select</span><span> </span><span class='pt19'>id</span><span class='pt26'>=</span><span class='pt10'>"filetype"</span><span class='pt25'>></span></td></tr>
<tr><td class='ln' data-ln='25'></td><td><span> </span><span class='pt25'><</span><span class='pt7'>option</span><span> </span><span class='pt19'>selected</span><span> </span><span class='pt19'>value</span><span class='pt26'>=</span><span class='pt10'>"rs"</span><span class='pt25'>></span><span>rust</span><span class='pt25'></</span><span class='pt7'>option</span><span class='pt25'>></span></td></tr>
<tr><td class='ln' data-ln='26'></td><td><span> </span><span class='pt25'><</span><span class='pt7'>option</span><span> </span><span class='pt19'>value</span><span class='pt26'>=</span><span class='pt10'>"js"</span><span class='pt25'>></span><span>javascript</span><span class='pt25'></</span><span class='pt7'>option</span><span class='pt25'>></span></td></tr>
<tr><td class='ln' data-ln='27'></td><td><span> </span><span class='pt25'><</span><span class='pt7'>option</span><span> </span><span class='pt19'>value</span><span class='pt26'>=</span><span class='pt10'>"jsx"</span><span class='pt25'>></span><span>jsx</span><span class='pt25'></</span><span class='pt7'>option</span><span class='pt25'>></span></td></tr>
<tr><td class='ln' data-ln='28'></td><td><span> </span><span class='pt25'><</span><span class='pt7'>option</span><span> </span><span class='pt19'>value</span><span class='pt26'>=</span><span class='pt10'>"html"</span><span class='pt25'>></span><span>html</span><span class='pt25'></</span><span class='pt7'>option</span><span class='pt25'>></span></td></tr>
<tr><td class='ln' data-ln='29'></td><td><span> </span><span class='pt25'><</span><span class='pt7'>option</span><span> </span><span class='pt19'>value</span><span class='pt26'>=</span><span class='pt10'>"c"</span><span class='pt25'>></span><span>c</span><span class='pt25'></</span><span class='pt7'>option</span><span class='pt25'>></span></td></tr>
<tr><td class='ln' data-ln='30'></td><td><span> </span><span class='pt25'><</span><span class='pt7'>option</span><span> </span><span class='pt19'>value</span><span class='pt26'>=</span><span class='pt10'>"py"</span><span class='pt25'>></span><span>python</span><span class='pt25'></</span><span class='pt7'>option</span><span class='pt25'>></span></td></tr>
<tr><td class='ln' data-ln='31'></td><td><span> </span><span class='pt25'><</span><span class='pt7'>option</span><span> </span><span class='pt19'>value</span><span class='pt26'>=</span><span class='pt10'>"go"</span><span class='pt25'>></span><span>go</span><span class='pt25'></</span><span class='pt7'>option</span><span class='pt25'>></span></td></tr>
<tr><td class='ln' data-ln='32'></td><td><span> </span><span class='pt25'></</span><span class='pt7'>select</span><span class='pt25'>></span></td></tr>
<tr><td class='ln' data-ln='33'></td><td> </td></tr>
<tr><td class='ln' data-ln='34'></td><td><span> </span><span class='pt25'><</span><span class='pt7'>select</span><span> </span><span class='pt19'>id</span><span class='pt26'>=</span><span class='pt10'>"style"</span><span class='pt25'>></span></td></tr>
<tr><td class='ln' data-ln='35'></td><td><span> </span><span class='pt25'><</span><span class='pt7'>option</span><span> </span><span class='pt19'>value</span><span class='pt26'>=</span><span class='pt10'>"atom_dark"</span><span class='pt25'>></span><span>atom dark</span><span class='pt25'></</span><span class='pt7'>option</span><span class='pt25'>></span></td></tr>
<tr><td class='ln' data-ln='36'></td><td><span> </span><span class='pt25'><</span><span class='pt7'>option</span><span> </span><span class='pt19'>value</span><span class='pt26'>=</span><span class='pt10'>"ayu_dark"</span><span class='pt25'>></span><span>ayu dark</span><span class='pt25'></</span><span class='pt7'>option</span><span class='pt25'>></span></td></tr>
<tr><td class='ln' data-ln='37'></td><td><span> </span><span class='pt25'><</span><span class='pt7'>option</span><span> </span><span class='pt19'>value</span><span class='pt26'>=</span><span class='pt10'>"ayu_light"</span><span class='pt25'>></span><span>ayu light</span><span class='pt25'></</span><span class='pt7'>option</span><span class='pt25'>></span></td></tr>
<tr><td class='ln' data-ln='38'></td><td><span> </span><span class='pt25'><</span><span class='pt7'>option</span><span> </span><span class='pt19'>value</span><span class='pt26'>=</span><span class='pt10'>"ayu_mirage"</span><span class='pt25'>></span><span>ayu mirage</span><span class='pt25'></</span><span class='pt7'>option</span><span class='pt25'>></span></td></tr>
<tr><td class='ln' data-ln='39'></td><td><span> </span><span class='pt25'><</span><span class='pt7'>option</span><span> </span><span class='pt19'>value</span><span class='pt26'>=</span><span class='pt10'>"cobalt2"</span><span class='pt25'>></span><span>cobalt2</span><span class='pt25'></</span><span class='pt7'>option</span><span class='pt25'>></span></td></tr>
<tr><td class='ln' data-ln='40'></td><td><span> </span><span class='pt25'><</span><span class='pt7'>option</span><span> </span><span class='pt19'>value</span><span class='pt26'>=</span><span class='pt10'>"dracula"</span><span class='pt25'>></span><span>dracula</span><span class='pt25'></</span><span class='pt7'>option</span><span class='pt25'>></span></td></tr>
<tr><td class='ln' data-ln='41'></td><td><span> </span><span class='pt25'><</span><span class='pt7'>option</span><span> </span><span class='pt19'>selected</span><span> </span><span class='pt19'>value</span><span class='pt26'>=</span><span class='pt10'>"github"</span><span class='pt25'>></span><span>github</span><span class='pt25'></</span><span class='pt7'>option</span><span class='pt25'>></span></td></tr>
<tr><td class='ln' data-ln='42'></td><td><span> </span><span class='pt25'><</span><span class='pt7'>option</span><span> </span><span class='pt19'>value</span><span class='pt26'>=</span><span class='pt10'>"monokai_extended"</span><span class='pt25'>></span><span>monokai extended</span><span class='pt25'></</span><span class='pt7'>option</span><span class='pt25'>></span></td></tr>
<tr><td class='ln' data-ln='43'></td><td><span> </span><span class='pt25'><</span><span class='pt7'>option</span><span> </span><span class='pt19'>value</span><span class='pt26'>=</span><span class='pt10'>"oceanic_next"</span><span class='pt25'>></span><span>oceanic next</span><span class='pt25'></</span><span class='pt7'>option</span><span class='pt25'>></span></td></tr>
<tr><td class='ln' data-ln='44'></td><td><span> </span><span class='pt25'><</span><span class='pt7'>option</span><span> </span><span class='pt19'>value</span><span class='pt26'>=</span><span class='pt10'>"one_dark"</span><span class='pt25'>></span><span>one dark</span><span class='pt25'></</span><span class='pt7'>option</span><span class='pt25'>></span></td></tr>
<tr><td class='ln' data-ln='45'></td><td><span> </span><span class='pt25'><</span><span class='pt7'>option</span><span> </span><span class='pt19'>value</span><span class='pt26'>=</span><span class='pt10'>"one_light"</span><span class='pt25'>></span><span>one light</span><span class='pt25'></</span><span class='pt7'>option</span><span class='pt25'>></span></td></tr>
<tr><td class='ln' data-ln='46'></td><td><span> </span><span class='pt25'><</span><span class='pt7'>option</span><span> </span><span class='pt19'>value</span><span class='pt26'>=</span><span class='pt10'>"one_monokai"</span><span class='pt25'>></span><span>one monokai</span><span class='pt25'></</span><span class='pt7'>option</span><span class='pt25'>></span></td></tr>
<tr><td class='ln' data-ln='47'></td><td><span> </span><span class='pt25'><</span><span class='pt7'>option</span><span> </span><span class='pt19'>value</span><span class='pt26'>=</span><span class='pt10'>"predawn"</span><span class='pt25'>></span><span>predawn</span><span class='pt25'></</span><span class='pt7'>option</span><span class='pt25'>></span></td></tr>
<tr><td class='ln' data-ln='48'></td><td><span> </span><span class='pt25'><</span><span class='pt7'>option</span><span> </span><span class='pt19'>value</span><span class='pt26'>=</span><span class='pt10'>"solarized_dark"</span><span class='pt25'>></span><span>solarized dark</span><span class='pt25'></</span><span class='pt7'>option</span><span class='pt25'>></span></td></tr>
<tr><td class='ln' data-ln='49'></td><td><span> </span><span class='pt25'><</span><span class='pt7'>option</span><span> </span><span class='pt19'>value</span><span class='pt26'>=</span><span class='pt10'>"solarized_light"</span><span class='pt25'>></span><span>solarized light</span><span class='pt25'></</span><span class='pt7'>option</span><span class='pt25'>></span></td></tr>
<tr><td class='ln' data-ln='50'></td><td><span> </span><span class='pt25'><</span><span class='pt7'>option</span><span> </span><span class='pt19'>value</span><span class='pt26'>=</span><span class='pt10'>"wombat"</span><span class='pt25'>></span><span>wombat</span><span class='pt25'></</span><span class='pt7'>option</span><span class='pt25'>></span></td></tr>
<tr><td class='ln' data-ln='51'></td><td><span> </span><span class='pt25'></</span><span class='pt7'>select</span><span class='pt25'>></span></td></tr>
<tr><td class='ln' data-ln='52'></td><td> </td></tr>
<tr><td class='ln' data-ln='53'></td><td><span> </span><span class='pt25'><</span><span class='pt7'>input</span><span> </span><span class='pt19'>id</span><span class='pt26'>=</span><span class='pt10'>"highlight"</span><span> </span><span class='pt19'>type</span><span class='pt26'>=</span><span class='pt10'>"checkbox"</span><span class='pt25'> /></span></td></tr>
<tr><td class='ln' data-ln='54'></td><td><span> </span><span class='pt25'><</span><span class='pt7'>label</span><span> </span><span class='pt19'>for</span><span class='pt26'>=</span><span class='pt10'>"highlight"</span><span class='pt25'>><</span><span class='pt7'>nobr</span><span class='pt25'>></span><span>--highlight</span><span class='pt25'></</span><span class='pt7'>nobr</span><span class='pt25'>></</span><span class='pt7'>label</span><span class='pt25'>></span></td></tr>
<tr><td class='ln' data-ln='55'></td><td><span> </span><span class='pt25'></</span><span class='pt7'>div</span><span class='pt25'>></span></td></tr>
<tr><td class='ln' data-ln='56'></td><td> </td></tr>
<tr><td class='ln' data-ln='57'></td><td> </td></tr>
<tr><td class='ln' data-ln='58'></td><td><span> </span><span class='pt25'><</span><span class='pt7'>div</span><span> </span><span class='pt19'>id</span><span class='pt26'>=</span><span class='pt10'>"highlighted"</span><span> </span><span class='pt19'>class</span><span class='pt26'>=</span><span class='pt10'>"no-hi"</span><span> </span><span class='pt19'>data-style</span><span class='pt26'>=</span><span class='pt10'>"github--rs"</span><span> </span><span class='pt19'>data-filetype</span><span class='pt26'>=</span><span class='pt10'>"rs"</span><span class='pt25'>></span></td></tr>
<tr><td class='ln' data-ln='59'></td><td><span> </span><span class='pt25'></</span><span class='pt7'>div</span><span class='pt25'>></span><span> </span><span class='pt12 it'><!-- highlighted --></span></td></tr>
<tr><td class='ln' data-ln='60'></td><td> </td></tr>
<tr><td class='ln' data-ln='61'></td><td><span> </span><span class='pt25'><</span><span class='pt7'>div</span><span> </span><span class='pt19'>class</span><span class='pt26'>=</span><span class='pt10'>"gh"</span><span class='pt25'>></span></td></tr>
<tr><td class='ln' data-ln='62'></td><td><span> </span><span class='pt25'><</span><span class='pt7'>a</span><span> </span><span class='pt19'>href</span><span class='pt26'>=</span><span class='pt10'>"https://github.com/demille/paint"</span><span class='pt25'>></span></td></tr>
<tr><td class='ln' data-ln='63'></td><td><span> </span><span class='pt25'><</span><span class='pt7'>svg</span><span> </span><span class='pt19'>role</span><span class='pt26'>=</span><span class='pt10'>"img"</span><span> </span><span class='pt19'>viewBox</span><span class='pt26'>=</span><span class='pt10'>"0 0 24 24"</span><span> </span><span class='pt19'>xmlns</span><span class='pt26'>=</span><span class='pt10'>"http://www.w3.org/2000/svg"</span><span class='pt25'>></span></td></tr>
<tr><td class='ln' data-ln='64'></td><td><span> </span><span class='pt25'><</span><span class='pt7'>path</span><span> </span><span class='pt19'>d</span><span class='pt26'>=</span><span class='pt10'>"M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12"</span><span class='pt25'>/></span></td></tr>
<tr><td class='ln' data-ln='65'></td><td><span> </span><span class='pt25'></</span><span class='pt7'>svg</span><span class='pt25'>></span></td></tr>
<tr><td class='ln' data-ln='66'></td><td><span> </span><span class='pt25'><</span><span class='pt7'>span</span><span class='pt25'>></span><span>/demille/paint</span><span class='pt25'></</span><span class='pt7'>span</span><span class='pt25'>></span></td></tr>
<tr><td class='ln' data-ln='67'></td><td><span> </span><span class='pt25'></</span><span class='pt7'>a</span><span class='pt25'>></span></td></tr>
<tr><td class='ln' data-ln='68'></td><td><span> </span><span class='pt25'></</span><span class='pt7'>div</span><span class='pt25'>></span></td></tr>
<tr><td class='ln' data-ln='69'></td><td> </td></tr>
<tr><td class='ln' data-ln='70'></td><td><span> </span><span class='pt25'></</span><span class='pt7'>div</span><span class='pt25'>></span><span> </span><span class='pt12 it'><!-- container --></span></td></tr>
<tr><td class='ln' data-ln='71'></td><td> </td></tr>
<tr><td class='ln' data-ln='72'></td><td><span> </span><span class='pt25'><</span><span class='pt7'>div</span><span> </span><span class='pt19'>class</span><span class='pt26'>=</span><span class='pt10'>"bg-overlay"</span><span class='pt25'>></</span><span class='pt7'>div</span><span class='pt25'>></span></td></tr>
<tr><td class='ln' data-ln='73'></td><td> </td></tr>
<tr><td class='ln' data-ln='74'></td><td><span> </span><span class='pt25'><</span><span class='pt7'>script</span><span> </span><span class='pt19'>src</span><span class='pt26'>=</span><span class='pt10'>"main.js"</span><span class='pt25'>></</span><span class='pt7'>script</span><span class='pt25'>></span></td></tr>
<tr><td class='ln' data-ln='75'></td><td><span class='pt25'></</span><span class='pt7'>body</span><span class='pt25'>></span></td></tr>
<tr><td class='ln' data-ln='76'></td><td><span class='pt25'></</span><span class='pt7'>html</span><span class='pt25'>></span></td></tr>
</table>
</div>
</div>
</div>
<div class='style' id='P--ayu_mirage--html'>
<div class='P--ayu_mirage-bordered'>
<div class="info header">
<span class="left">index.html</span>
<span class="right"><span>76 lines</span><span>3.60 KB</span></span>
</div>
<div class='P--ayu_mirage'>
<table>
<tr><td class='ln' data-ln='1'></td><td><span class='pt25'><!</span><span class='pt10'>DOCTYPE</span><span class='pt9'> html</span><span class='pt25'>></span></td></tr>
<tr><td class='ln' data-ln='2'></td><td><span class='pt25'><</span><span class='pt10'>html</span><span class='pt25'>></span></td></tr>
<tr><td class='ln' data-ln='3'></td><td class='hi'><span class='pt25'><</span><span class='pt10'>head</span><span class='pt25'>></span></td></tr>
<tr><td class='ln' data-ln='4'></td><td class='hi'><span> </span><span class='pt25'><</span><span class='pt10'>meta</span><span> </span><span class='pt22'>charset</span><span class='pt24'>=</span><span class='pt12'>"utf-8"</span><span class='pt25'> /></span></td></tr>
<tr><td class='ln' data-ln='5'></td><td class='hi'><span> </span><span class='pt25'><</span><span class='pt10'>meta</span><span> </span><span class='pt22'>http-equiv</span><span class='pt24'>=</span><span class='pt12'>"X-UA-Compatible"</span><span> </span><span class='pt22'>content</span><span class='pt24'>=</span><span class='pt12'>"IE=edge"</span><span class='pt25'>></span></td></tr>
<tr><td class='ln' data-ln='6'></td><td class='hi'><span> </span><span class='pt25'><</span><span class='pt10'>title</span><span class='pt25'>></span><span>paint demo</span><span class='pt25'></</span><span class='pt10'>title</span><span class='pt25'>></span></td></tr>
<tr><td class='ln' data-ln='7'></td><td class='hi'><span> </span><span class='pt25'><</span><span class='pt10'>meta</span><span> </span><span class='pt22'>name</span><span class='pt24'>=</span><span class='pt12'>"viewport"</span><span> </span><span class='pt22'>content</span><span class='pt24'>=</span><span class='pt12'>"width=device-width, initial-scale=1"</span><span class='pt25'>></span></td></tr>
<tr><td class='ln' data-ln='8'></td><td class='hi'><span> </span><span class='pt25'><</span><span class='pt10'>link</span><span> </span><span class='pt22'>rel</span><span class='pt24'>=</span><span class='pt12'>"stylesheet"</span><span> </span><span class='pt22'>type</span><span class='pt24'>=</span><span class='pt12'>"text/css"</span><span> </span><span class='pt22'>media</span><span class='pt24'>=</span><span class='pt12'>"screen"</span><span> </span><span class='pt22'>href</span><span class='pt24'>=</span><span class='pt12'>"main.css"</span><span class='pt25'> /></span></td></tr>
<tr><td class='ln' data-ln='9'></td><td class='hi'><span> </span><span class='pt25'><</span><span class='pt10'>link</span><span> </span><span class='pt22'>rel</span><span class='pt24'>=</span><span class='pt12'>"stylesheet"</span><span> </span><span class='pt22'>type</span><span class='pt24'>=</span><span class='pt12'>"text/css"</span><span> </span><span class='pt22'>media</span><span class='pt24'>=</span><span class='pt12'>"screen"</span><span> </span><span class='pt22'>href</span><span class='pt24'>=</span><span class='pt12'>"snippets.css"</span><span class='pt25'> /></span></td></tr>
<tr><td class='ln' data-ln='10'></td><td class='hi'><span class='pt25'></</span><span class='pt10'>head</span><span class='pt25'>></span></td></tr>
<tr><td class='ln' data-ln='11'></td><td><span class='pt25'><</span><span class='pt10'>body</span><span class='pt25'>></span></td></tr>
<tr><td class='ln' data-ln='12'></td><td><span> </span><span class='pt25'><</span><span class='pt10'>div</span><span> </span><span class='pt22'>class</span><span class='pt24'>=</span><span class='pt12'>"container"</span><span class='pt25'>></span></td></tr>
<tr><td class='ln' data-ln='13'></td><td><span> </span><span class='pt25'><</span><span class='pt10'>div</span><span> </span><span class='pt22'>class</span><span class='pt24'>=</span><span class='pt12'>"command"</span><span class='pt25'>></span></td></tr>
<tr><td class='ln' data-ln='14'></td><td><span> </span><span class='pt25'><</span><span class='pt10'>h1</span><span class='pt25'>></span></td></tr>
<tr><td class='ln' data-ln='15'></td><td><span> </span><span class='pt25'><</span><span class='pt10'>span</span><span> </span><span class='pt22'>class</span><span class='pt24'>=</span><span class='pt12'>"hue-rotate"</span><span class='pt25'>></span><span>$</span><span class='pt25'></</span><span class='pt10'>span</span><span class='pt25'>></span><span> paint</span></td></tr>
<tr><td class='ln' data-ln='16'></td><td><span> ./file.</span><span class='pt25'><</span><span class='pt10'>span</span><span> </span><span class='pt22'>id</span><span class='pt24'>=</span><span class='pt12'>"ext"</span><span class='pt25'>></span><span>rs</span><span class='pt25'></</span><span class='pt10'>span</span><span class='pt25'>></span></td></tr>
<tr><td class='ln' data-ln='17'></td><td><span> </span><span class='pt25'><</span><span class='pt10'>nobr</span><span class='pt25'>></span><span>--style="</span><span class='pt25'><</span><span class='pt10'>span</span><span> </span><span class='pt22'>id</span><span class='pt24'>=</span><span class='pt12'>"style-name"</span><span class='pt25'>></span><span>github</span><span class='pt25'></</span><span class='pt10'>span</span><span class='pt25'>></span><span>"</span><span class='pt25'></</span><span class='pt10'>nobr</span><span class='pt25'>></span></td></tr>
<tr><td class='ln' data-ln='18'></td><td><span> </span><span class='pt25'><</span><span class='pt10'>nobr</span><span class='pt25'>></span><span>--gist-like</span><span class='pt25'></</span><span class='pt10'>nobr</span><span class='pt25'>></span></td></tr>
<tr><td class='ln' data-ln='19'></td><td><span> </span><span class='pt25'><</span><span class='pt10'>nobr</span><span class='pt25'>><</span><span class='pt10'>span</span><span> </span><span class='pt22'>id</span><span class='pt24'>=</span><span class='pt12'>"lines"</span><span class='pt25'>></</span><span class='pt10'>span</span><span class='pt25'>></</span><span class='pt10'>nobr</span><span class='pt25'>></span></td></tr>
<tr><td class='ln' data-ln='20'></td><td><span> </span><span class='pt25'></</span><span class='pt10'>h1</span><span class='pt25'>></span></td></tr>
<tr><td class='ln' data-ln='21'></td><td><span> </span><span class='pt25'></</span><span class='pt10'>div</span><span class='pt25'>></span></td></tr>
<tr><td class='ln' data-ln='22'></td><td> </td></tr>
<tr><td class='ln' data-ln='23'></td><td><span> </span><span class='pt25'><</span><span class='pt10'>div</span><span> </span><span class='pt22'>class</span><span class='pt24'>=</span><span class='pt12'>"flex-centered"</span><span class='pt25'>></span></td></tr>
<tr><td class='ln' data-ln='24'></td><td><span> </span><span class='pt25'><</span><span class='pt10'>select</span><span> </span><span class='pt22'>id</span><span class='pt24'>=</span><span class='pt12'>"filetype"</span><span class='pt25'>></span></td></tr>
<tr><td class='ln' data-ln='25'></td><td><span> </span><span class='pt25'><</span><span class='pt10'>option</span><span> </span><span class='pt22'>selected</span><span> </span><span class='pt22'>value</span><span class='pt24'>=</span><span class='pt12'>"rs"</span><span class='pt25'>></span><span>rust</span><span class='pt25'></</span><span class='pt10'>option</span><span class='pt25'>></span></td></tr>
<tr><td class='ln' data-ln='26'></td><td><span> </span><span class='pt25'><</span><span class='pt10'>option</span><span> </span><span class='pt22'>value</span><span class='pt24'>=</span><span class='pt12'>"js"</span><span class='pt25'>></span><span>javascript</span><span class='pt25'></</span><span class='pt10'>option</span><span class='pt25'>></span></td></tr>
<tr><td class='ln' data-ln='27'></td><td><span> </span><span class='pt25'><</span><span class='pt10'>option</span><span> </span><span class='pt22'>value</span><span class='pt24'>=</span><span class='pt12'>"jsx"</span><span class='pt25'>></span><span>jsx</span><span class='pt25'></</span><span class='pt10'>option</span><span class='pt25'>></span></td></tr>
<tr><td class='ln' data-ln='28'></td><td><span> </span><span class='pt25'><</span><span class='pt10'>option</span><span> </span><span class='pt22'>value</span><span class='pt24'>=</span><span class='pt12'>"html"</span><span class='pt25'>></span><span>html</span><span class='pt25'></</span><span class='pt10'>option</span><span class='pt25'>></span></td></tr>
<tr><td class='ln' data-ln='29'></td><td><span> </span><span class='pt25'><</span><span class='pt10'>option</span><span> </span><span class='pt22'>value</span><span class='pt24'>=</span><span class='pt12'>"c"</span><span class='pt25'>></span><span>c</span><span class='pt25'></</span><span class='pt10'>option</span><span class='pt25'>></span></td></tr>
<tr><td class='ln' data-ln='30'></td><td><span> </span><span class='pt25'><</span><span class='pt10'>option</span><span> </span><span class='pt22'>value</span><span class='pt24'>=</span><span class='pt12'>"py"</span><span class='pt25'>></span><span>python</span><span class='pt25'></</span><span class='pt10'>option</span><span class='pt25'>></span></td></tr>
<tr><td class='ln' data-ln='31'></td><td><span> </span><span class='pt25'><</span><span class='pt10'>option</span><span> </span><span class='pt22'>value</span><span class='pt24'>=</span><span class='pt12'>"go"</span><span class='pt25'>></span><span>go</span><span class='pt25'></</span><span class='pt10'>option</span><span class='pt25'>></span></td></tr>
<tr><td class='ln' data-ln='32'></td><td><span> </span><span class='pt25'></</span><span class='pt10'>select</span><span class='pt25'>></span></td></tr>
<tr><td class='ln' data-ln='33'></td><td> </td></tr>
<tr><td class='ln' data-ln='34'></td><td><span> </span><span class='pt25'><</span><span class='pt10'>select</span><span> </span><span class='pt22'>id</span><span class='pt24'>=</span><span class='pt12'>"style"</span><span class='pt25'>></span></td></tr>
<tr><td class='ln' data-ln='35'></td><td><span> </span><span class='pt25'><</span><span class='pt10'>option</span><span> </span><span class='pt22'>value</span><span class='pt24'>=</span><span class='pt12'>"atom_dark"</span><span class='pt25'>></span><span>atom dark</span><span class='pt25'></</span><span class='pt10'>option</span><span class='pt25'>></span></td></tr>
<tr><td class='ln' data-ln='36'></td><td><span> </span><span class='pt25'><</span><span class='pt10'>option</span><span> </span><span class='pt22'>value</span><span class='pt24'>=</span><span class='pt12'>"ayu_dark"</span><span class='pt25'>></span><span>ayu dark</span><span class='pt25'></</span><span class='pt10'>option</span><span class='pt25'>></span></td></tr>
<tr><td class='ln' data-ln='37'></td><td><span> </span><span class='pt25'><</span><span class='pt10'>option</span><span> </span><span class='pt22'>value</span><span class='pt24'>=</span><span class='pt12'>"ayu_light"</span><span class='pt25'>></span><span>ayu light</span><span class='pt25'></</span><span class='pt10'>option</span><span class='pt25'>></span></td></tr>
<tr><td class='ln' data-ln='38'></td><td><span> </span><span class='pt25'><</span><span class='pt10'>option</span><span> </span><span class='pt22'>value</span><span class='pt24'>=</span><span class='pt12'>"ayu_mirage"</span><span class='pt25'>></span><span>ayu mirage</span><span class='pt25'></</span><span class='pt10'>option</span><span class='pt25'>></span></td></tr>
<tr><td class='ln' data-ln='39'></td><td><span> </span><span class='pt25'><</span><span class='pt10'>option</span><span> </span><span class='pt22'>value</span><span class='pt24'>=</span><span class='pt12'>"cobalt2"</span><span class='pt25'>></span><span>cobalt2</span><span class='pt25'></</span><span class='pt10'>option</span><span class='pt25'>></span></td></tr>
<tr><td class='ln' data-ln='40'></td><td><span> </span><span class='pt25'><</span><span class='pt10'>option</span><span> </span><span class='pt22'>value</span><span class='pt24'>=</span><span class='pt12'>"dracula"</span><span class='pt25'>></span><span>dracula</span><span class='pt25'></</span><span class='pt10'>option</span><span class='pt25'>></span></td></tr>
<tr><td class='ln' data-ln='41'></td><td><span> </span><span class='pt25'><</span><span class='pt10'>option</span><span> </span><span class='pt22'>selected</span><span> </span><span class='pt22'>value</span><span class='pt24'>=</span><span class='pt12'>"github"</span><span class='pt25'>></span><span>github</span><span class='pt25'></</span><span class='pt10'>option</span><span class='pt25'>></span></td></tr>
<tr><td class='ln' data-ln='42'></td><td><span> </span><span class='pt25'><</span><span class='pt10'>option</span><span> </span><span class='pt22'>value</span><span class='pt24'>=</span><span class='pt12'>"monokai_extended"</span><span class='pt25'>></span><span>monokai extended</span><span class='pt25'></</span><span class='pt10'>option</span><span class='pt25'>></span></td></tr>
<tr><td class='ln' data-ln='43'></td><td><span> </span><span class='pt25'><</span><span class='pt10'>option</span><span> </span><span class='pt22'>value</span><span class='pt24'>=</span><span class='pt12'>"oceanic_next"</span><span class='pt25'>></span><span>oceanic next</span><span class='pt25'></</span><span class='pt10'>option</span><span class='pt25'>></span></td></tr>
<tr><td class='ln' data-ln='44'></td><td><span> </span><span class='pt25'><</span><span class='pt10'>option</span><span> </span><span class='pt22'>value</span><span class='pt24'>=</span><span class='pt12'>"one_dark"</span><span class='pt25'>></span><span>one dark</span><span class='pt25'></</span><span class='pt10'>option</span><span class='pt25'>></span></td></tr>
<tr><td class='ln' data-ln='45'></td><td><span> </span><span class='pt25'><</span><span class='pt10'>option</span><span> </span><span class='pt22'>value</span><span class='pt24'>=</span><span class='pt12'>"one_light"</span><span class='pt25'>></span><span>one light</span><span class='pt25'></</span><span class='pt10'>option</span><span class='pt25'>></span></td></tr>
<tr><td class='ln' data-ln='46'></td><td><span> </span><span class='pt25'><</span><span class='pt10'>option</span><span> </span><span class='pt22'>value</span><span class='pt24'>=</span><span class='pt12'>"one_monokai"</span><span class='pt25'>></span><span>one monokai</span><span class='pt25'></</span><span class='pt10'>option</span><span class='pt25'>></span></td></tr>
<tr><td class='ln' data-ln='47'></td><td><span> </span><span class='pt25'><</span><span class='pt10'>option</span><span> </span><span class='pt22'>value</span><span class='pt24'>=</span><span class='pt12'>"predawn"</span><span class='pt25'>></span><span>predawn</span><span class='pt25'></</span><span class='pt10'>option</span><span class='pt25'>></span></td></tr>
<tr><td class='ln' data-ln='48'></td><td><span> </span><span class='pt25'><</span><span class='pt10'>option</span><span> </span><span class='pt22'>value</span><span class='pt24'>=</span><span class='pt12'>"solarized_dark"</span><span class='pt25'>></span><span>solarized dark</span><span class='pt25'></</span><span class='pt10'>option</span><span class='pt25'>></span></td></tr>
<tr><td class='ln' data-ln='49'></td><td><span> </span><span class='pt25'><</span><span class='pt10'>option</span><span> </span><span class='pt22'>value</span><span class='pt24'>=</span><span class='pt12'>"solarized_light"</span><span class='pt25'>></span><span>solarized light</span><span class='pt25'></</span><span class='pt10'>option</span><span class='pt25'>></span></td></tr>
<tr><td class='ln' data-ln='50'></td><td><span> </span><span class='pt25'><</span><span class='pt10'>option</span><span> </span><span class='pt22'>value</span><span class='pt24'>=</span><span class='pt12'>"wombat"</span><span class='pt25'>></span><span>wombat</span><span class='pt25'></</span><span class='pt10'>option</span><span class='pt25'>></span></td></tr>
<tr><td class='ln' data-ln='51'></td><td><span> </span><span class='pt25'></</span><span class='pt10'>select</span><span class='pt25'>></span></td></tr>
<tr><td class='ln' data-ln='52'></td><td> </td></tr>
<tr><td class='ln' data-ln='53'></td><td><span> </span><span class='pt25'><</span><span class='pt10'>input</span><span> </span><span class='pt22'>id</span><span class='pt24'>=</span><span class='pt12'>"highlight"</span><span> </span><span class='pt22'>type</span><span class='pt24'>=</span><span class='pt12'>"checkbox"</span><span class='pt25'> /></span></td></tr>
<tr><td class='ln' data-ln='54'></td><td><span> </span><span class='pt25'><</span><span class='pt10'>label</span><span> </span><span class='pt22'>for</span><span class='pt24'>=</span><span class='pt12'>"highlight"</span><span class='pt25'>><</span><span class='pt10'>nobr</span><span class='pt25'>></span><span>--highlight</span><span class='pt25'></</span><span class='pt10'>nobr</span><span class='pt25'>></</span><span class='pt10'>label</span><span class='pt25'>></span></td></tr>
<tr><td class='ln' data-ln='55'></td><td><span> </span><span class='pt25'></</span><span class='pt10'>div</span><span class='pt25'>></span></td></tr>
<tr><td class='ln' data-ln='56'></td><td> </td></tr>
<tr><td class='ln' data-ln='57'></td><td> </td></tr>
<tr><td class='ln' data-ln='58'></td><td><span> </span><span class='pt25'><</span><span class='pt10'>div</span><span> </span><span class='pt22'>id</span><span class='pt24'>=</span><span class='pt12'>"highlighted"</span><span> </span><span class='pt22'>class</span><span class='pt24'>=</span><span class='pt12'>"no-hi"</span><span> </span><span class='pt22'>data-style</span><span class='pt24'>=</span><span class='pt12'>"github--rs"</span><span> </span><span class='pt22'>data-filetype</span><span class='pt24'>=</span><span class='pt12'>"rs"</span><span class='pt25'>></span></td></tr>
<tr><td class='ln' data-ln='59'></td><td><span> </span><span class='pt25'></</span><span class='pt10'>div</span><span class='pt25'>></span><span> </span><span class='pt8 it'><!-- highlighted --></span></td></tr>
<tr><td class='ln' data-ln='60'></td><td> </td></tr>
<tr><td class='ln' data-ln='61'></td><td><span> </span><span class='pt25'><</span><span class='pt10'>div</span><span> </span><span class='pt22'>class</span><span class='pt24'>=</span><span class='pt12'>"gh"</span><span class='pt25'>></span></td></tr>
<tr><td class='ln' data-ln='62'></td><td><span> </span><span class='pt25'><</span><span class='pt10'>a</span><span> </span><span class='pt22'>href</span><span class='pt24'>=</span><span class='pt12'>"https://github.com/demille/paint"</span><span class='pt25'>></span></td></tr>
<tr><td class='ln' data-ln='63'></td><td><span> </span><span class='pt25'><</span><span class='pt10'>svg</span><span> </span><span class='pt22'>role</span><span class='pt24'>=</span><span class='pt12'>"img"</span><span> </span><span class='pt22'>viewBox</span><span class='pt24'>=</span><span class='pt12'>"0 0 24 24"</span><span> </span><span class='pt22'>xmlns</span><span class='pt24'>=</span><span class='pt12'>"http://www.w3.org/2000/svg"</span><span class='pt25'>></span></td></tr>
<tr><td class='ln' data-ln='64'></td><td><span> </span><span class='pt25'><</span><span class='pt10'>path</span><span> </span><span class='pt22'>d</span><span class='pt24'>=</span><span class='pt12'>"M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12"</span><span class='pt25'>/></span></td></tr>
<tr><td class='ln' data-ln='65'></td><td><span> </span><span class='pt25'></</span><span class='pt10'>svg</span><span class='pt25'>></span></td></tr>
<tr><td class='ln' data-ln='66'></td><td><span> </span><span class='pt25'><</span><span class='pt10'>span</span><span class='pt25'>></span><span>/demille/paint</span><span class='pt25'></</span><span class='pt10'>span</span><span class='pt25'>></span></td></tr>
<tr><td class='ln' data-ln='67'></td><td><span> </span><span class='pt25'></</span><span class='pt10'>a</span><span class='pt25'>></span></td></tr>
<tr><td class='ln' data-ln='68'></td><td><span> </span><span class='pt25'></</span><span class='pt10'>div</span><span class='pt25'>></span></td></tr>
<tr><td class='ln' data-ln='69'></td><td> </td></tr>
<tr><td class='ln' data-ln='70'></td><td><span> </span><span class='pt25'></</span><span class='pt10'>div</span><span class='pt25'>></span><span> </span><span class='pt8 it'><!-- container --></span></td></tr>
<tr><td class='ln' data-ln='71'></td><td> </td></tr>
<tr><td class='ln' data-ln='72'></td><td><span> </span><span class='pt25'><</span><span class='pt10'>div</span><span> </span><span class='pt22'>class</span><span class='pt24'>=</span><span class='pt12'>"bg-overlay"</span><span class='pt25'>></</span><span class='pt10'>div</span><span class='pt25'>></span></td></tr>
<tr><td class='ln' data-ln='73'></td><td> </td></tr>
<tr><td class='ln' data-ln='74'></td><td><span> </span><span class='pt25'><</span><span class='pt10'>script</span><span> </span><span class='pt22'>src</span><span class='pt24'>=</span><span class='pt12'>"main.js"</span><span class='pt25'>></</span><span class='pt10'>script</span><span class='pt25'>></span></td></tr>
<tr><td class='ln' data-ln='75'></td><td><span class='pt25'></</span><span class='pt10'>body</span><span class='pt25'>></span></td></tr>
<tr><td class='ln' data-ln='76'></td><td><span class='pt25'></</span><span class='pt10'>html</span><span class='pt25'>></span></td></tr>
</table>
</div>
</div>
</div>
<div class='style' id='P--cobalt2--html'>
<div class='P--cobalt2-bordered'>
<div class="info header">
<span class="left">index.html</span>
<span class="right"><span>76 lines</span><span>3.60 KB</span></span>
</div>
<div class='P--cobalt2'>
<table>
<tr><td class='ln' data-ln='1'></td><td><span class='pt43'><!</span><span class='pt35'>DOCTYPE html</span><span class='pt43'>></span></td></tr>
<tr><td class='ln' data-ln='2'></td><td><span class='pt43'><</span><span class='pt35'>html</span><span class='pt43'>></span></td></tr>
<tr><td class='ln' data-ln='3'></td><td class='hi'><span class='pt43'><</span><span class='pt35'>head</span><span class='pt43'>></span></td></tr>
<tr><td class='ln' data-ln='4'></td><td class='hi'><span> </span><span class='pt43'><</span><span class='pt35'>meta </span><span class='pt60 it'>charset</span><span class='pt43'>=</span><span class='pt23'>"utf-8"</span><span class='pt43'> /></span></td></tr>
<tr><td class='ln' data-ln='5'></td><td class='hi'><span> </span><span class='pt43'><</span><span class='pt35'>meta </span><span class='pt60 it'>http-equiv</span><span class='pt43'>=</span><span class='pt23'>"X-UA-Compatible"</span><span class='pt35'> </span><span class='pt60 it'>content</span><span class='pt43'>=</span><span class='pt23'>"IE=edge"</span><span class='pt43'>></span></td></tr>
<tr><td class='ln' data-ln='6'></td><td class='hi'><span> </span><span class='pt43'><</span><span class='pt35'>title</span><span class='pt43'>></span><span>paint demo</span><span class='pt43'></</span><span class='pt35'>title</span><span class='pt43'>></span></td></tr>
<tr><td class='ln' data-ln='7'></td><td class='hi'><span> </span><span class='pt43'><</span><span class='pt35'>meta </span><span class='pt60 it'>name</span><span class='pt43'>=</span><span class='pt23'>"viewport"</span><span class='pt35'> </span><span class='pt60 it'>content</span><span class='pt43'>=</span><span class='pt23'>"width=device-width, initial-scale=1"</span><span class='pt43'>></span></td></tr>
<tr><td class='ln' data-ln='8'></td><td class='hi'><span> </span><span class='pt43'><</span><span class='pt35'>link </span><span class='pt60 it'>rel</span><span class='pt43'>=</span><span class='pt23'>"stylesheet"</span><span class='pt35'> </span><span class='pt60 it'>type</span><span class='pt43'>=</span><span class='pt23'>"text/css"</span><span class='pt35'> </span><span class='pt60 it'>media</span><span class='pt43'>=</span><span class='pt23'>"screen"</span><span class='pt35'> </span><span class='pt60 it'>href</span><span class='pt43'>=</span><span class='pt23'>"main.css"</span><span class='pt43'> /></span></td></tr>
<tr><td class='ln' data-ln='9'></td><td class='hi'><span> </span><span class='pt43'><</span><span class='pt35'>link </span><span class='pt60 it'>rel</span><span class='pt43'>=</span><span class='pt23'>"stylesheet"</span><span class='pt35'> </span><span class='pt60 it'>type</span><span class='pt43'>=</span><span class='pt23'>"text/css"</span><span class='pt35'> </span><span class='pt60 it'>media</span><span class='pt43'>=</span><span class='pt23'>"screen"</span><span class='pt35'> </span><span class='pt60 it'>href</span><span class='pt43'>=</span><span class='pt23'>"snippets.css"</span><span class='pt43'> /></span></td></tr>
<tr><td class='ln' data-ln='10'></td><td class='hi'><span class='pt43'></</span><span class='pt35'>head</span><span class='pt43'>></span></td></tr>
<tr><td class='ln' data-ln='11'></td><td><span class='pt43'><</span><span class='pt35'>body</span><span class='pt43'>></span></td></tr>
<tr><td class='ln' data-ln='12'></td><td><span> </span><span class='pt43'><</span><span class='pt35'>div </span><span class='pt60 it'>class</span><span class='pt43'>=</span><span class='pt23'>"container"</span><span class='pt43'>></span></td></tr>
<tr><td class='ln' data-ln='13'></td><td><span> </span><span class='pt43'><</span><span class='pt35'>div </span><span class='pt60 it'>class</span><span class='pt43'>=</span><span class='pt23'>"command"</span><span class='pt43'>></span></td></tr>
<tr><td class='ln' data-ln='14'></td><td><span> </span><span class='pt43'><</span><span class='pt35'>h1</span><span class='pt43'>></span></td></tr>
<tr><td class='ln' data-ln='15'></td><td><span> </span><span class='pt43'><</span><span class='pt35'>span </span><span class='pt60 it'>class</span><span class='pt43'>=</span><span class='pt23'>"hue-rotate"</span><span class='pt43'>></span><span>$</span><span class='pt43'></</span><span class='pt35'>span</span><span class='pt43'>></span><span> paint</span></td></tr>
<tr><td class='ln' data-ln='16'></td><td><span> ./file.</span><span class='pt43'><</span><span class='pt35'>span </span><span class='pt60 it'>id</span><span class='pt43'>=</span><span class='pt23'>"ext"</span><span class='pt43'>></span><span>rs</span><span class='pt43'></</span><span class='pt35'>span</span><span class='pt43'>></span></td></tr>
<tr><td class='ln' data-ln='17'></td><td><span> </span><span class='pt43'><</span><span class='pt35'>nobr</span><span class='pt43'>></span><span>--style="</span><span class='pt43'><</span><span class='pt35'>span </span><span class='pt60 it'>id</span><span class='pt43'>=</span><span class='pt23'>"style-name"</span><span class='pt43'>></span><span>github</span><span class='pt43'></</span><span class='pt35'>span</span><span class='pt43'>></span><span>"</span><span class='pt43'></</span><span class='pt35'>nobr</span><span class='pt43'>></span></td></tr>
<tr><td class='ln' data-ln='18'></td><td><span> </span><span class='pt43'><</span><span class='pt35'>nobr</span><span class='pt43'>></span><span>--gist-like</span><span class='pt43'></</span><span class='pt35'>nobr</span><span class='pt43'>></span></td></tr>
<tr><td class='ln' data-ln='19'></td><td><span> </span><span class='pt43'><</span><span class='pt35'>nobr</span><span class='pt43'>><</span><span class='pt35'>span </span><span class='pt60 it'>id</span><span class='pt43'>=</span><span class='pt23'>"lines"</span><span class='pt43'>></</span><span class='pt35'>span</span><span class='pt43'>></</span><span class='pt35'>nobr</span><span class='pt43'>></span></td></tr>
<tr><td class='ln' data-ln='20'></td><td><span> </span><span class='pt43'></</span><span class='pt35'>h1</span><span class='pt43'>></span></td></tr>
<tr><td class='ln' data-ln='21'></td><td><span> </span><span class='pt43'></</span><span class='pt35'>div</span><span class='pt43'>></span></td></tr>
<tr><td class='ln' data-ln='22'></td><td> </td></tr>
<tr><td class='ln' data-ln='23'></td><td><span> </span><span class='pt43'><</span><span class='pt35'>div </span><span class='pt60 it'>class</span><span class='pt43'>=</span><span class='pt23'>"flex-centered"</span><span class='pt43'>></span></td></tr>
<tr><td class='ln' data-ln='24'></td><td><span> </span><span class='pt43'><</span><span class='pt35'>select </span><span class='pt60 it'>id</span><span class='pt43'>=</span><span class='pt23'>"filetype"</span><span class='pt43'>></span></td></tr>
<tr><td class='ln' data-ln='25'></td><td><span> </span><span class='pt43'><</span><span class='pt35'>option </span><span class='pt60 it'>selected</span><span class='pt35'> </span><span class='pt60 it'>value</span><span class='pt43'>=</span><span class='pt23'>"rs"</span><span class='pt43'>></span><span>rust</span><span class='pt43'></</span><span class='pt35'>option</span><span class='pt43'>></span></td></tr>
<tr><td class='ln' data-ln='26'></td><td><span> </span><span class='pt43'><</span><span class='pt35'>option </span><span class='pt60 it'>value</span><span class='pt43'>=</span><span class='pt23'>"js"</span><span class='pt43'>></span><span>javascript</span><span class='pt43'></</span><span class='pt35'>option</span><span class='pt43'>></span></td></tr>
<tr><td class='ln' data-ln='27'></td><td><span> </span><span class='pt43'><</span><span class='pt35'>option </span><span class='pt60 it'>value</span><span class='pt43'>=</span><span class='pt23'>"jsx"</span><span class='pt43'>></span><span>jsx</span><span class='pt43'></</span><span class='pt35'>option</span><span class='pt43'>></span></td></tr>
<tr><td class='ln' data-ln='28'></td><td><span> </span><span class='pt43'><</span><span class='pt35'>option </span><span class='pt60 it'>value</span><span class='pt43'>=</span><span class='pt23'>"html"</span><span class='pt43'>></span><span>html</span><span class='pt43'></</span><span class='pt35'>option</span><span class='pt43'>></span></td></tr>
<tr><td class='ln' data-ln='29'></td><td><span> </span><span class='pt43'><</span><span class='pt35'>option </span><span class='pt60 it'>value</span><span class='pt43'>=</span><span class='pt23'>"c"</span><span class='pt43'>></span><span>c</span><span class='pt43'></</span><span class='pt35'>option</span><span class='pt43'>></span></td></tr>
<tr><td class='ln' data-ln='30'></td><td><span> </span><span class='pt43'><</span><span class='pt35'>option </span><span class='pt60 it'>value</span><span class='pt43'>=</span><span class='pt23'>"py"</span><span class='pt43'>></span><span>python</span><span class='pt43'></</span><span class='pt35'>option</span><span class='pt43'>></span></td></tr>
<tr><td class='ln' data-ln='31'></td><td><span> </span><span class='pt43'><</span><span class='pt35'>option </span><span class='pt60 it'>value</span><span class='pt43'>=</span><span class='pt23'>"go"</span><span class='pt43'>></span><span>go</span><span class='pt43'></</span><span class='pt35'>option</span><span class='pt43'>></span></td></tr>
<tr><td class='ln' data-ln='32'></td><td><span> </span><span class='pt43'></</span><span class='pt35'>select</span><span class='pt43'>></span></td></tr>
<tr><td class='ln' data-ln='33'></td><td> </td></tr>
<tr><td class='ln' data-ln='34'></td><td><span> </span><span class='pt43'><</span><span class='pt35'>select </span><span class='pt60 it'>id</span><span class='pt43'>=</span><span class='pt23'>"style"</span><span class='pt43'>></span></td></tr>
<tr><td class='ln' data-ln='35'></td><td><span> </span><span class='pt43'><</span><span class='pt35'>option </span><span class='pt60 it'>value</span><span class='pt43'>=</span><span class='pt23'>"atom_dark"</span><span class='pt43'>></span><span>atom dark</span><span class='pt43'></</span><span class='pt35'>option</span><span class='pt43'>></span></td></tr>
<tr><td class='ln' data-ln='36'></td><td><span> </span><span class='pt43'><</span><span class='pt35'>option </span><span class='pt60 it'>value</span><span class='pt43'>=</span><span class='pt23'>"ayu_dark"</span><span class='pt43'>></span><span>ayu dark</span><span class='pt43'></</span><span class='pt35'>option</span><span class='pt43'>></span></td></tr>
<tr><td class='ln' data-ln='37'></td><td><span> </span><span class='pt43'><</span><span class='pt35'>option </span><span class='pt60 it'>value</span><span class='pt43'>=</span><span class='pt23'>"ayu_light"</span><span class='pt43'>></span><span>ayu light</span><span class='pt43'></</span><span class='pt35'>option</span><span class='pt43'>></span></td></tr>
<tr><td class='ln' data-ln='38'></td><td><span> </span><span class='pt43'><</span><span class='pt35'>option </span><span class='pt60 it'>value</span><span class='pt43'>=</span><span class='pt23'>"ayu_mirage"</span><span class='pt43'>></span><span>ayu mirage</span><span class='pt43'></</span><span class='pt35'>option</span><span class='pt43'>></span></td></tr>
<tr><td class='ln' data-ln='39'></td><td><span> </span><span class='pt43'><</span><span class='pt35'>option </span><span class='pt60 it'>value</span><span class='pt43'>=</span><span class='pt23'>"cobalt2"</span><span class='pt43'>></span><span>cobalt2</span><span class='pt43'></</span><span class='pt35'>option</span><span class='pt43'>></span></td></tr>
<tr><td class='ln' data-ln='40'></td><td><span> </span><span class='pt43'><</span><span class='pt35'>option </span><span class='pt60 it'>value</span><span class='pt43'>=</span><span class='pt23'>"dracula"</span><span class='pt43'>></span><span>dracula</span><span class='pt43'></</span><span class='pt35'>option</span><span class='pt43'>></span></td></tr>
<tr><td class='ln' data-ln='41'></td><td><span> </span><span class='pt43'><</span><span class='pt35'>option </span><span class='pt60 it'>selected</span><span class='pt35'> </span><span class='pt60 it'>value</span><span class='pt43'>=</span><span class='pt23'>"github"</span><span class='pt43'>></span><span>github</span><span class='pt43'></</span><span class='pt35'>option</span><span class='pt43'>></span></td></tr>
<tr><td class='ln' data-ln='42'></td><td><span> </span><span class='pt43'><</span><span class='pt35'>option </span><span class='pt60 it'>value</span><span class='pt43'>=</span><span class='pt23'>"monokai_extended"</span><span class='pt43'>></span><span>monokai extended</span><span class='pt43'></</span><span class='pt35'>option</span><span class='pt43'>></span></td></tr>
<tr><td class='ln' data-ln='43'></td><td><span> </span><span class='pt43'><</span><span class='pt35'>option </span><span class='pt60 it'>value</span><span class='pt43'>=</span><span class='pt23'>"oceanic_next"</span><span class='pt43'>></span><span>oceanic next</span><span class='pt43'></</span><span class='pt35'>option</span><span class='pt43'>></span></td></tr>
<tr><td class='ln' data-ln='44'></td><td><span> </span><span class='pt43'><</span><span class='pt35'>option </span><span class='pt60 it'>value</span><span class='pt43'>=</span><span class='pt23'>"one_dark"</span><span class='pt43'>></span><span>one dark</span><span class='pt43'></</span><span class='pt35'>option</span><span class='pt43'>></span></td></tr>
<tr><td class='ln' data-ln='45'></td><td><span> </span><span class='pt43'><</span><span class='pt35'>option </span><span class='pt60 it'>value</span><span class='pt43'>=</span><span class='pt23'>"one_light"</span><span class='pt43'>></span><span>one light</span><span class='pt43'></</span><span class='pt35'>option</span><span class='pt43'>></span></td></tr>
<tr><td class='ln' data-ln='46'></td><td><span> </span><span class='pt43'><</span><span class='pt35'>option </span><span class='pt60 it'>value</span><span class='pt43'>=</span><span class='pt23'>"one_monokai"</span><span class='pt43'>></span><span>one monokai</span><span class='pt43'></</span><span class='pt35'>option</span><span class='pt43'>></span></td></tr>
<tr><td class='ln' data-ln='47'></td><td><span> </span><span class='pt43'><</span><span class='pt35'>option </span><span class='pt60 it'>value</span><span class='pt43'>=</span><span class='pt23'>"predawn"</span><span class='pt43'>></span><span>predawn</span><span class='pt43'></</span><span class='pt35'>option</span><span class='pt43'>></span></td></tr>
<tr><td class='ln' data-ln='48'></td><td><span> </span><span class='pt43'><</span><span class='pt35'>option </span><span class='pt60 it'>value</span><span class='pt43'>=</span><span class='pt23'>"solarized_dark"</span><span class='pt43'>></span><span>solarized dark</span><span class='pt43'></</span><span class='pt35'>option</span><span class='pt43'>></span></td></tr>
<tr><td class='ln' data-ln='49'></td><td><span> </span><span class='pt43'><</span><span class='pt35'>option </span><span class='pt60 it'>value</span><span class='pt43'>=</span><span class='pt23'>"solarized_light"</span><span class='pt43'>></span><span>solarized light</span><span class='pt43'></</span><span class='pt35'>option</span><span class='pt43'>></span></td></tr>
<tr><td class='ln' data-ln='50'></td><td><span> </span><span class='pt43'><</span><span class='pt35'>option </span><span class='pt60 it'>value</span><span class='pt43'>=</span><span class='pt23'>"wombat"</span><span class='pt43'>></span><span>wombat</span><span class='pt43'></</span><span class='pt35'>option</span><span class='pt43'>></span></td></tr>
<tr><td class='ln' data-ln='51'></td><td><span> </span><span class='pt43'></</span><span class='pt35'>select</span><span class='pt43'>></span></td></tr>
<tr><td class='ln' data-ln='52'></td><td> </td></tr>
<tr><td class='ln' data-ln='53'></td><td><span> </span><span class='pt43'><</span><span class='pt35'>input </span><span class='pt60 it'>id</span><span class='pt43'>=</span><span class='pt23'>"highlight"</span><span class='pt35'> </span><span class='pt60 it'>type</span><span class='pt43'>=</span><span class='pt23'>"checkbox"</span><span class='pt43'> /></span></td></tr>
<tr><td class='ln' data-ln='54'></td><td><span> </span><span class='pt43'><</span><span class='pt35'>label </span><span class='pt60 it'>for</span><span class='pt43'>=</span><span class='pt23'>"highlight"</span><span class='pt43'>><</span><span class='pt35'>nobr</span><span class='pt43'>></span><span>--highlight</span><span class='pt43'></</span><span class='pt35'>nobr</span><span class='pt43'>></</span><span class='pt35'>label</span><span class='pt43'>></span></td></tr>
<tr><td class='ln' data-ln='55'></td><td><span> </span><span class='pt43'></</span><span class='pt35'>div</span><span class='pt43'>></span></td></tr>
<tr><td class='ln' data-ln='56'></td><td> </td></tr>
<tr><td class='ln' data-ln='57'></td><td> </td></tr>
<tr><td class='ln' data-ln='58'></td><td><span> </span><span class='pt43'><</span><span class='pt35'>div </span><span class='pt60 it'>id</span><span class='pt43'>=</span><span class='pt23'>"highlighted"</span><span class='pt35'> </span><span class='pt60 it'>class</span><span class='pt43'>=</span><span class='pt23'>"no-hi"</span><span class='pt35'> </span><span class='pt60 it'>data-style</span><span class='pt43'>=</span><span class='pt23'>"github--rs"</span><span class='pt35'> </span><span class='pt60 it'>data-filetype</span><span class='pt43'>=</span><span class='pt23'>"rs"</span><span class='pt43'>></span></td></tr>
<tr><td class='ln' data-ln='59'></td><td><span> </span><span class='pt43'></</span><span class='pt35'>div</span><span class='pt43'>></span><span> </span><span class='pt19 it'><!-- highlighted --></span></td></tr>
<tr><td class='ln' data-ln='60'></td><td> </td></tr>
<tr><td class='ln' data-ln='61'></td><td><span> </span><span class='pt43'><</span><span class='pt35'>div </span><span class='pt60 it'>class</span><span class='pt43'>=</span><span class='pt23'>"gh"</span><span class='pt43'>></span></td></tr>
<tr><td class='ln' data-ln='62'></td><td><span> </span><span class='pt43'><</span><span class='pt35'>a </span><span class='pt60 it'>href</span><span class='pt43'>=</span><span class='pt23'>"https://github.com/demille/paint"</span><span class='pt43'>></span></td></tr>
<tr><td class='ln' data-ln='63'></td><td><span> </span><span class='pt43'><</span><span class='pt35'>svg </span><span class='pt60 it'>role</span><span class='pt43'>=</span><span class='pt23'>"img"</span><span class='pt35'> </span><span class='pt60 it'>viewBox</span><span class='pt43'>=</span><span class='pt23'>"0 0 24 24"</span><span class='pt35'> </span><span class='pt60 it'>xmlns</span><span class='pt43'>=</span><span class='pt23'>"http://www.w3.org/2000/svg"</span><span class='pt43'>></span></td></tr>
<tr><td class='ln' data-ln='64'></td><td><span> </span><span class='pt43'><</span><span class='pt35'>path </span><span class='pt60 it'>d</span><span class='pt43'>=</span><span class='pt23'>"M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12"</span><span class='pt43'>/></span></td></tr>
<tr><td class='ln' data-ln='65'></td><td><span> </span><span class='pt43'></</span><span class='pt35'>svg</span><span class='pt43'>></span></td></tr>
<tr><td class='ln' data-ln='66'></td><td><span> </span><span class='pt43'><</span><span class='pt35'>span</span><span class='pt43'>></span><span>/demille/paint</span><span class='pt43'></</span><span class='pt35'>span</span><span class='pt43'>></span></td></tr>
<tr><td class='ln' data-ln='67'></td><td><span> </span><span class='pt43'></</span><span class='pt35'>a</span><span class='pt43'>></span></td></tr>
<tr><td class='ln' data-ln='68'></td><td><span> </span><span class='pt43'></</span><span class='pt35'>div</span><span class='pt43'>></span></td></tr>
<tr><td class='ln' data-ln='69'></td><td> </td></tr>
<tr><td class='ln' data-ln='70'></td><td><span> </span><span class='pt43'></</span><span class='pt35'>div</span><span class='pt43'>></span><span> </span><span class='pt19 it'><!-- container --></span></td></tr>
<tr><td class='ln' data-ln='71'></td><td> </td></tr>
<tr><td class='ln' data-ln='72'></td><td><span> </span><span class='pt43'><</span><span class='pt35'>div </span><span class='pt60 it'>class</span><span class='pt43'>=</span><span class='pt23'>"bg-overlay"</span><span class='pt43'>></</span><span class='pt35'>div</span><span class='pt43'>></span></td></tr>
<tr><td class='ln' data-ln='73'></td><td> </td></tr>
<tr><td class='ln' data-ln='74'></td><td><span> </span><span class='pt43'><</span><span class='pt35'>script </span><span class='pt60 it'>src</span><span class='pt43'>=</span><span class='pt23'>"main.js"</span><span class='pt43'>></</span><span class='pt35'>script</span><span class='pt43'>></span></td></tr>
<tr><td class='ln' data-ln='75'></td><td><span class='pt43'></</span><span class='pt35'>body</span><span class='pt43'>></span></td></tr>
<tr><td class='ln' data-ln='76'></td><td><span class='pt43'></</span><span class='pt35'>html</span><span class='pt43'>></span></td></tr>
</table>
</div>
</div>
</div>
<div class='style' id='P--dracula--html'>
<div class='P--dracula-bordered'>
<div class="info header">
<span class="left">index.html</span>
<span class="right"><span>76 lines</span><span>3.60 KB</span></span>
</div>
<div class='P--dracula'>
<table>
<tr><td class='ln' data-ln='1'></td><td><span><!</span><span class='pt9'>DOCTYPE</span><span> html></span></td></tr>
<tr><td class='ln' data-ln='2'></td><td><span><</span><span class='pt9'>html</span><span>></span></td></tr>
<tr><td class='ln' data-ln='3'></td><td class='hi'><span><</span><span class='pt9'>head</span><span>></span></td></tr>
<tr><td class='ln' data-ln='4'></td><td class='hi'><span> <</span><span class='pt9'>meta</span><span> </span><span class='pt1 it'>charset</span><span class='pt9 it'>=</span><span class='pt6'>"</span><span class='pt7'>utf-8</span><span class='pt6'>"</span><span> /></span></td></tr>
<tr><td class='ln' data-ln='5'></td><td class='hi'><span> <</span><span class='pt9'>meta</span><span> </span><span class='pt1 it'>http-equiv</span><span class='pt9 it'>=</span><span class='pt6'>"</span><span class='pt7'>X-UA-Compatible</span><span class='pt6'>"</span><span> </span><span class='pt1 it'>content</span><span class='pt9 it'>=</span><span class='pt6'>"</span><span class='pt7'>IE=edge</span><span class='pt6'>"</span><span>></span></td></tr>
<tr><td class='ln' data-ln='6'></td><td class='hi'><span> <</span><span class='pt9'>title</span><span>>paint demo</</span><span class='pt9'>title</span><span>></span></td></tr>
<tr><td class='ln' data-ln='7'></td><td class='hi'><span> <</span><span class='pt9'>meta</span><span> </span><span class='pt1 it'>name</span><span class='pt9 it'>=</span><span class='pt6'>"</span><span class='pt7'>viewport</span><span class='pt6'>"</span><span> </span><span class='pt1 it'>content</span><span class='pt9 it'>=</span><span class='pt6'>"</span><span class='pt7'>width=device-width, initial-scale=1</span><span class='pt6'>"</span><span>></span></td></tr>
<tr><td class='ln' data-ln='8'></td><td class='hi'><span> <</span><span class='pt9'>link</span><span> </span><span class='pt1 it'>rel</span><span class='pt9 it'>=</span><span class='pt6'>"</span><span class='pt7'>stylesheet</span><span class='pt6'>"</span><span> </span><span class='pt1 it'>type</span><span class='pt9 it'>=</span><span class='pt6'>"</span><span class='pt7'>text/css</span><span class='pt6'>"</span><span> </span><span class='pt1 it'>media</span><span class='pt9 it'>=</span><span class='pt6'>"</span><span class='pt7'>screen</span><span class='pt6'>"</span><span> </span><span class='pt1 it'>href</span><span class='pt9 it'>=</span><span class='pt6'>"</span><span class='pt7'>main.css</span><span class='pt6'>"</span><span> /></span></td></tr>
<tr><td class='ln' data-ln='9'></td><td class='hi'><span> <</span><span class='pt9'>link</span><span> </span><span class='pt1 it'>rel</span><span class='pt9 it'>=</span><span class='pt6'>"</span><span class='pt7'>stylesheet</span><span class='pt6'>"</span><span> </span><span class='pt1 it'>type</span><span class='pt9 it'>=</span><span class='pt6'>"</span><span class='pt7'>text/css</span><span class='pt6'>"</span><span> </span><span class='pt1 it'>media</span><span class='pt9 it'>=</span><span class='pt6'>"</span><span class='pt7'>screen</span><span class='pt6'>"</span><span> </span><span class='pt1 it'>href</span><span class='pt9 it'>=</span><span class='pt6'>"</span><span class='pt7'>snippets.css</span><span class='pt6'>"</span><span> /></span></td></tr>
<tr><td class='ln' data-ln='10'></td><td class='hi'><span></</span><span class='pt9'>head</span><span>></span></td></tr>
<tr><td class='ln' data-ln='11'></td><td><span><</span><span class='pt9'>body</span><span>></span></td></tr>
<tr><td class='ln' data-ln='12'></td><td><span> <</span><span class='pt9'>div</span><span> </span><span class='pt1 it'>class</span><span class='pt9 it'>=</span><span class='pt6'>"</span><span class='pt7'>container</span><span class='pt6'>"</span><span>></span></td></tr>
<tr><td class='ln' data-ln='13'></td><td><span> <</span><span class='pt9'>div</span><span> </span><span class='pt1 it'>class</span><span class='pt9 it'>=</span><span class='pt6'>"</span><span class='pt7'>command</span><span class='pt6'>"</span><span>></span></td></tr>
<tr><td class='ln' data-ln='14'></td><td><span> <</span><span class='pt9'>h1</span><span>></span></td></tr>
<tr><td class='ln' data-ln='15'></td><td><span> <</span><span class='pt9'>span</span><span> </span><span class='pt1 it'>class</span><span class='pt9 it'>=</span><span class='pt6'>"</span><span class='pt7'>hue-rotate</span><span class='pt6'>"</span><span>>$</</span><span class='pt9'>span</span><span>> paint</span></td></tr>
<tr><td class='ln' data-ln='16'></td><td><span> ./file.<</span><span class='pt9'>span</span><span> </span><span class='pt1 it'>id</span><span class='pt9 it'>=</span><span class='pt6'>"</span><span class='pt7'>ext</span><span class='pt6'>"</span><span>>rs</</span><span class='pt9'>span</span><span>></span></td></tr>
<tr><td class='ln' data-ln='17'></td><td><span> <</span><span class='pt9'>nobr</span><span>>--style="<</span><span class='pt9'>span</span><span> </span><span class='pt1 it'>id</span><span class='pt9 it'>=</span><span class='pt6'>"</span><span class='pt7'>style-name</span><span class='pt6'>"</span><span>>github</</span><span class='pt9'>span</span><span>>"</</span><span class='pt9'>nobr</span><span>></span></td></tr>
<tr><td class='ln' data-ln='18'></td><td><span> <</span><span class='pt9'>nobr</span><span>>--gist-like</</span><span class='pt9'>nobr</span><span>></span></td></tr>
<tr><td class='ln' data-ln='19'></td><td><span> <</span><span class='pt9'>nobr</span><span>><</span><span class='pt9'>span</span><span> </span><span class='pt1 it'>id</span><span class='pt9 it'>=</span><span class='pt6'>"</span><span class='pt7'>lines</span><span class='pt6'>"</span><span>></</span><span class='pt9'>span</span><span>></</span><span class='pt9'>nobr</span><span>></span></td></tr>
<tr><td class='ln' data-ln='20'></td><td><span> </</span><span class='pt9'>h1</span><span>></span></td></tr>
<tr><td class='ln' data-ln='21'></td><td><span> </</span><span class='pt9'>div</span><span>></span></td></tr>
<tr><td class='ln' data-ln='22'></td><td> </td></tr>
<tr><td class='ln' data-ln='23'></td><td><span> <</span><span class='pt9'>div</span><span> </span><span class='pt1 it'>class</span><span class='pt9 it'>=</span><span class='pt6'>"</span><span class='pt7'>flex-centered</span><span class='pt6'>"</span><span>></span></td></tr>
<tr><td class='ln' data-ln='24'></td><td><span> <</span><span class='pt9'>select</span><span> </span><span class='pt1 it'>id</span><span class='pt9 it'>=</span><span class='pt6'>"</span><span class='pt7'>filetype</span><span class='pt6'>"</span><span>></span></td></tr>
<tr><td class='ln' data-ln='25'></td><td><span> <</span><span class='pt9'>option</span><span> </span><span class='pt1 it'>selected</span><span> </span><span class='pt1 it'>value</span><span class='pt9 it'>=</span><span class='pt6'>"</span><span class='pt7'>rs</span><span class='pt6'>"</span><span>>rust</</span><span class='pt9'>option</span><span>></span></td></tr>
<tr><td class='ln' data-ln='26'></td><td><span> <</span><span class='pt9'>option</span><span> </span><span class='pt1 it'>value</span><span class='pt9 it'>=</span><span class='pt6'>"</span><span class='pt7'>js</span><span class='pt6'>"</span><span>>javascript</</span><span class='pt9'>option</span><span>></span></td></tr>
<tr><td class='ln' data-ln='27'></td><td><span> <</span><span class='pt9'>option</span><span> </span><span class='pt1 it'>value</span><span class='pt9 it'>=</span><span class='pt6'>"</span><span class='pt7'>jsx</span><span class='pt6'>"</span><span>>jsx</</span><span class='pt9'>option</span><span>></span></td></tr>
<tr><td class='ln' data-ln='28'></td><td><span> <</span><span class='pt9'>option</span><span> </span><span class='pt1 it'>value</span><span class='pt9 it'>=</span><span class='pt6'>"</span><span class='pt7'>html</span><span class='pt6'>"</span><span>>html</</span><span class='pt9'>option</span><span>></span></td></tr>
<tr><td class='ln' data-ln='29'></td><td><span> <</span><span class='pt9'>option</span><span> </span><span class='pt1 it'>value</span><span class='pt9 it'>=</span><span class='pt6'>"</span><span class='pt7'>c</span><span class='pt6'>"</span><span>>c</</span><span class='pt9'>option</span><span>></span></td></tr>
<tr><td class='ln' data-ln='30'></td><td><span> <</span><span class='pt9'>option</span><span> </span><span class='pt1 it'>value</span><span class='pt9 it'>=</span><span class='pt6'>"</span><span class='pt7'>py</span><span class='pt6'>"</span><span>>python</</span><span class='pt9'>option</span><span>></span></td></tr>
<tr><td class='ln' data-ln='31'></td><td><span> <</span><span class='pt9'>option</span><span> </span><span class='pt1 it'>value</span><span class='pt9 it'>=</span><span class='pt6'>"</span><span class='pt7'>go</span><span class='pt6'>"</span><span>>go</</span><span class='pt9'>option</span><span>></span></td></tr>
<tr><td class='ln' data-ln='32'></td><td><span> </</span><span class='pt9'>select</span><span>></span></td></tr>
<tr><td class='ln' data-ln='33'></td><td> </td></tr>
<tr><td class='ln' data-ln='34'></td><td><span> <</span><span class='pt9'>select</span><span> </span><span class='pt1 it'>id</span><span class='pt9 it'>=</span><span class='pt6'>"</span><span class='pt7'>style</span><span class='pt6'>"</span><span>></span></td></tr>
<tr><td class='ln' data-ln='35'></td><td><span> <</span><span class='pt9'>option</span><span> </span><span class='pt1 it'>value</span><span class='pt9 it'>=</span><span class='pt6'>"</span><span class='pt7'>atom_dark</span><span class='pt6'>"</span><span>>atom dark</</span><span class='pt9'>option</span><span>></span></td></tr>
<tr><td class='ln' data-ln='36'></td><td><span> <</span><span class='pt9'>option</span><span> </span><span class='pt1 it'>value</span><span class='pt9 it'>=</span><span class='pt6'>"</span><span class='pt7'>ayu_dark</span><span class='pt6'>"</span><span>>ayu dark</</span><span class='pt9'>option</span><span>></span></td></tr>
<tr><td class='ln' data-ln='37'></td><td><span> <</span><span class='pt9'>option</span><span> </span><span class='pt1 it'>value</span><span class='pt9 it'>=</span><span class='pt6'>"</span><span class='pt7'>ayu_light</span><span class='pt6'>"</span><span>>ayu light</</span><span class='pt9'>option</span><span>></span></td></tr>
<tr><td class='ln' data-ln='38'></td><td><span> <</span><span class='pt9'>option</span><span> </span><span class='pt1 it'>value</span><span class='pt9 it'>=</span><span class='pt6'>"</span><span class='pt7'>ayu_mirage</span><span class='pt6'>"</span><span>>ayu mirage</</span><span class='pt9'>option</span><span>></span></td></tr>
<tr><td class='ln' data-ln='39'></td><td><span> <</span><span class='pt9'>option</span><span> </span><span class='pt1 it'>value</span><span class='pt9 it'>=</span><span class='pt6'>"</span><span class='pt7'>cobalt2</span><span class='pt6'>"</span><span>>cobalt2</</span><span class='pt9'>option</span><span>></span></td></tr>
<tr><td class='ln' data-ln='40'></td><td><span> <</span><span class='pt9'>option</span><span> </span><span class='pt1 it'>value</span><span class='pt9 it'>=</span><span class='pt6'>"</span><span class='pt7'>dracula</span><span class='pt6'>"</span><span>>dracula</</span><span class='pt9'>option</span><span>></span></td></tr>
<tr><td class='ln' data-ln='41'></td><td><span> <</span><span class='pt9'>option</span><span> </span><span class='pt1 it'>selected</span><span> </span><span class='pt1 it'>value</span><span class='pt9 it'>=</span><span class='pt6'>"</span><span class='pt7'>github</span><span class='pt6'>"</span><span>>github</</span><span class='pt9'>option</span><span>></span></td></tr>
<tr><td class='ln' data-ln='42'></td><td><span> <</span><span class='pt9'>option</span><span> </span><span class='pt1 it'>value</span><span class='pt9 it'>=</span><span class='pt6'>"</span><span class='pt7'>monokai_extended</span><span class='pt6'>"</span><span>>monokai extended</</span><span class='pt9'>option</span><span>></span></td></tr>
<tr><td class='ln' data-ln='43'></td><td><span> <</span><span class='pt9'>option</span><span> </span><span class='pt1 it'>value</span><span class='pt9 it'>=</span><span class='pt6'>"</span><span class='pt7'>oceanic_next</span><span class='pt6'>"</span><span>>oceanic next</</span><span class='pt9'>option</span><span>></span></td></tr>
<tr><td class='ln' data-ln='44'></td><td><span> <</span><span class='pt9'>option</span><span> </span><span class='pt1 it'>value</span><span class='pt9 it'>=</span><span class='pt6'>"</span><span class='pt7'>one_dark</span><span class='pt6'>"</span><span>>one dark</</span><span class='pt9'>option</span><span>></span></td></tr>
<tr><td class='ln' data-ln='45'></td><td><span> <</span><span class='pt9'>option</span><span> </span><span class='pt1 it'>value</span><span class='pt9 it'>=</span><span class='pt6'>"</span><span class='pt7'>one_light</span><span class='pt6'>"</span><span>>one light</</span><span class='pt9'>option</span><span>></span></td></tr>
<tr><td class='ln' data-ln='46'></td><td><span> <</span><span class='pt9'>option</span><span> </span><span class='pt1 it'>value</span><span class='pt9 it'>=</span><span class='pt6'>"</span><span class='pt7'>one_monokai</span><span class='pt6'>"</span><span>>one monokai</</span><span class='pt9'>option</span><span>></span></td></tr>
<tr><td class='ln' data-ln='47'></td><td><span> <</span><span class='pt9'>option</span><span> </span><span class='pt1 it'>value</span><span class='pt9 it'>=</span><span class='pt6'>"</span><span class='pt7'>predawn</span><span class='pt6'>"</span><span>>predawn</</span><span class='pt9'>option</span><span>></span></td></tr>
<tr><td class='ln' data-ln='48'></td><td><span> <</span><span class='pt9'>option</span><span> </span><span class='pt1 it'>value</span><span class='pt9 it'>=</span><span class='pt6'>"</span><span class='pt7'>solarized_dark</span><span class='pt6'>"</span><span>>solarized dark</</span><span class='pt9'>option</span><span>></span></td></tr>
<tr><td class='ln' data-ln='49'></td><td><span> <</span><span class='pt9'>option</span><span> </span><span class='pt1 it'>value</span><span class='pt9 it'>=</span><span class='pt6'>"</span><span class='pt7'>solarized_light</span><span class='pt6'>"</span><span>>solarized light</</span><span class='pt9'>option</span><span>></span></td></tr>
<tr><td class='ln' data-ln='50'></td><td><span> <</span><span class='pt9'>option</span><span> </span><span class='pt1 it'>value</span><span class='pt9 it'>=</span><span class='pt6'>"</span><span class='pt7'>wombat</span><span class='pt6'>"</span><span>>wombat</</span><span class='pt9'>option</span><span>></span></td></tr>
<tr><td class='ln' data-ln='51'></td><td><span> </</span><span class='pt9'>select</span><span>></span></td></tr>
<tr><td class='ln' data-ln='52'></td><td> </td></tr>
<tr><td class='ln' data-ln='53'></td><td><span> <</span><span class='pt9'>input</span><span> </span><span class='pt1 it'>id</span><span class='pt9 it'>=</span><span class='pt6'>"</span><span class='pt7'>highlight</span><span class='pt6'>"</span><span> </span><span class='pt1 it'>type</span><span class='pt9 it'>=</span><span class='pt6'>"</span><span class='pt7'>checkbox</span><span class='pt6'>"</span><span> /></span></td></tr>
<tr><td class='ln' data-ln='54'></td><td><span> <</span><span class='pt9'>label</span><span> </span><span class='pt1 it'>for</span><span class='pt9 it'>=</span><span class='pt6'>"</span><span class='pt7'>highlight</span><span class='pt6'>"</span><span>><</span><span class='pt9'>nobr</span><span>>--highlight</</span><span class='pt9'>nobr</span><span>></</span><span class='pt9'>label</span><span>></span></td></tr>
<tr><td class='ln' data-ln='55'></td><td><span> </</span><span class='pt9'>div</span><span>></span></td></tr>
<tr><td class='ln' data-ln='56'></td><td> </td></tr>
<tr><td class='ln' data-ln='57'></td><td> </td></tr>
<tr><td class='ln' data-ln='58'></td><td><span> <</span><span class='pt9'>div</span><span> </span><span class='pt1 it'>id</span><span class='pt9 it'>=</span><span class='pt6'>"</span><span class='pt7'>highlighted</span><span class='pt6'>"</span><span> </span><span class='pt1 it'>class</span><span class='pt9 it'>=</span><span class='pt6'>"</span><span class='pt7'>no-hi</span><span class='pt6'>"</span><span> </span><span class='pt1 it'>data-style</span><span class='pt9 it'>=</span><span class='pt6'>"</span><span class='pt7'>github--rs</span><span class='pt6'>"</span><span> </span><span class='pt1 it'>data-filetype</span><span class='pt9 it'>=</span><span class='pt6'>"</span><span class='pt7'>rs</span><span class='pt6'>"</span><span>></span></td></tr>
<tr><td class='ln' data-ln='59'></td><td><span> </</span><span class='pt9'>div</span><span>> </span><span class='pt2'><!-- highlighted --></span></td></tr>
<tr><td class='ln' data-ln='60'></td><td> </td></tr>
<tr><td class='ln' data-ln='61'></td><td><span> <</span><span class='pt9'>div</span><span> </span><span class='pt1 it'>class</span><span class='pt9 it'>=</span><span class='pt6'>"</span><span class='pt7'>gh</span><span class='pt6'>"</span><span>></span></td></tr>
<tr><td class='ln' data-ln='62'></td><td><span> <</span><span class='pt9'>a</span><span> </span><span class='pt1 it'>href</span><span class='pt9 it'>=</span><span class='pt6'>"</span><span class='pt7'>https://github.com/demille/paint</span><span class='pt6'>"</span><span>></span></td></tr>
<tr><td class='ln' data-ln='63'></td><td><span> <</span><span class='pt9'>svg</span><span> </span><span class='pt1 it'>role</span><span class='pt9 it'>=</span><span class='pt6'>"</span><span class='pt7'>img</span><span class='pt6'>"</span><span> </span><span class='pt1 it'>viewBox</span><span class='pt9 it'>=</span><span class='pt6'>"</span><span class='pt7'>0 0 24 24</span><span class='pt6'>"</span><span> </span><span class='pt1 it'>xmlns</span><span class='pt9 it'>=</span><span class='pt6'>"</span><span class='pt7'>http://www.w3.org/2000/svg</span><span class='pt6'>"</span><span>></span></td></tr>
<tr><td class='ln' data-ln='64'></td><td><span> <</span><span class='pt9'>path</span><span> </span><span class='pt1 it'>d</span><span class='pt9 it'>=</span><span class='pt6'>"</span><span class='pt7'>M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12</span><span class='pt6'>"</span><span>/></span></td></tr>
<tr><td class='ln' data-ln='65'></td><td><span> </</span><span class='pt9'>svg</span><span>></span></td></tr>
<tr><td class='ln' data-ln='66'></td><td><span> <</span><span class='pt9'>span</span><span>>/demille/paint</</span><span class='pt9'>span</span><span>></span></td></tr>
<tr><td class='ln' data-ln='67'></td><td><span> </</span><span class='pt9'>a</span><span>></span></td></tr>
<tr><td class='ln' data-ln='68'></td><td><span> </</span><span class='pt9'>div</span><span>></span></td></tr>
<tr><td class='ln' data-ln='69'></td><td> </td></tr>
<tr><td class='ln' data-ln='70'></td><td><span> </</span><span class='pt9'>div</span><span>> </span><span class='pt2'><!-- container --></span></td></tr>
<tr><td class='ln' data-ln='71'></td><td> </td></tr>
<tr><td class='ln' data-ln='72'></td><td><span> <</span><span class='pt9'>div</span><span> </span><span class='pt1 it'>class</span><span class='pt9 it'>=</span><span class='pt6'>"</span><span class='pt7'>bg-overlay</span><span class='pt6'>"</span><span>></</span><span class='pt9'>div</span><span>></span></td></tr>
<tr><td class='ln' data-ln='73'></td><td> </td></tr>
<tr><td class='ln' data-ln='74'></td><td><span> <</span><span class='pt9'>script</span><span> </span><span class='pt1 it'>src</span><span class='pt9 it'>=</span><span class='pt6'>"</span><span class='pt7'>main.js</span><span class='pt6'>"</span><span>></</span><span class='pt9'>script</span><span>></span></td></tr>
<tr><td class='ln' data-ln='75'></td><td><span></</span><span class='pt9'>body</span><span>></span></td></tr>
<tr><td class='ln' data-ln='76'></td><td><span></</span><span class='pt9'>html</span><span>></span></td></tr>
</table>
</div>
</div>
</div>
<div class='style' id='P--github--html'>
<div class='P--github-bordered'>
<div class="info header">
<span class="left">index.html</span>
<span class="right"><span>76 lines</span><span>3.60 KB</span></span>
</div>
<div class='P--github'>
<table>
<tr><td class='ln' data-ln='1'></td><td><span><!</span><span class='pt9'>DOCTYPE</span><span> html></span></td></tr>
<tr><td class='ln' data-ln='2'></td><td><span><</span><span class='pt9'>html</span><span>></span></td></tr>
<tr><td class='ln' data-ln='3'></td><td class='hi'><span><</span><span class='pt9'>head</span><span>></span></td></tr>
<tr><td class='ln' data-ln='4'></td><td class='hi'><span> <</span><span class='pt9'>meta</span><span> </span><span class='pt13'>charset</span><span>=</span><span class='pt8'>"utf-8"</span><span> /></span></td></tr>
<tr><td class='ln' data-ln='5'></td><td class='hi'><span> <</span><span class='pt9'>meta</span><span> </span><span class='pt13'>http-equiv</span><span>=</span><span class='pt8'>"X-UA-Compatible"</span><span> </span><span class='pt13'>content</span><span>=</span><span class='pt8'>"IE=edge"</span><span>></span></td></tr>
<tr><td class='ln' data-ln='6'></td><td class='hi'><span> <</span><span class='pt9'>title</span><span>>paint demo</</span><span class='pt9'>title</span><span>></span></td></tr>
<tr><td class='ln' data-ln='7'></td><td class='hi'><span> <</span><span class='pt9'>meta</span><span> </span><span class='pt13'>name</span><span>=</span><span class='pt8'>"viewport"</span><span> </span><span class='pt13'>content</span><span>=</span><span class='pt8'>"width=device-width, initial-scale=1"</span><span>></span></td></tr>
<tr><td class='ln' data-ln='8'></td><td class='hi'><span> <</span><span class='pt9'>link</span><span> </span><span class='pt13'>rel</span><span>=</span><span class='pt8'>"stylesheet"</span><span> </span><span class='pt13'>type</span><span>=</span><span class='pt8'>"text/css"</span><span> </span><span class='pt13'>media</span><span>=</span><span class='pt8'>"screen"</span><span> </span><span class='pt13'>href</span><span>=</span><span class='pt8'>"main.css"</span><span> /></span></td></tr>
<tr><td class='ln' data-ln='9'></td><td class='hi'><span> <</span><span class='pt9'>link</span><span> </span><span class='pt13'>rel</span><span>=</span><span class='pt8'>"stylesheet"</span><span> </span><span class='pt13'>type</span><span>=</span><span class='pt8'>"text/css"</span><span> </span><span class='pt13'>media</span><span>=</span><span class='pt8'>"screen"</span><span> </span><span class='pt13'>href</span><span>=</span><span class='pt8'>"snippets.css"</span><span> /></span></td></tr>
<tr><td class='ln' data-ln='10'></td><td class='hi'><span></</span><span class='pt9'>head</span><span>></span></td></tr>
<tr><td class='ln' data-ln='11'></td><td><span><</span><span class='pt9'>body</span><span>></span></td></tr>
<tr><td class='ln' data-ln='12'></td><td><span> <</span><span class='pt9'>div</span><span> </span><span class='pt13'>class</span><span>=</span><span class='pt8'>"container"</span><span>></span></td></tr>
<tr><td class='ln' data-ln='13'></td><td><span> <</span><span class='pt9'>div</span><span> </span><span class='pt13'>class</span><span>=</span><span class='pt8'>"command"</span><span>></span></td></tr>
<tr><td class='ln' data-ln='14'></td><td><span> <</span><span class='pt9'>h1</span><span>></span></td></tr>
<tr><td class='ln' data-ln='15'></td><td><span> <</span><span class='pt9'>span</span><span> </span><span class='pt13'>class</span><span>=</span><span class='pt8'>"hue-rotate"</span><span>>$</</span><span class='pt9'>span</span><span>> paint</span></td></tr>
<tr><td class='ln' data-ln='16'></td><td><span> ./file.<</span><span class='pt9'>span</span><span> </span><span class='pt13'>id</span><span>=</span><span class='pt8'>"ext"</span><span>>rs</</span><span class='pt9'>span</span><span>></span></td></tr>
<tr><td class='ln' data-ln='17'></td><td><span> <</span><span class='pt9'>nobr</span><span>>--style="<</span><span class='pt9'>span</span><span> </span><span class='pt13'>id</span><span>=</span><span class='pt8'>"style-name"</span><span>>github</</span><span class='pt9'>span</span><span>>"</</span><span class='pt9'>nobr</span><span>></span></td></tr>
<tr><td class='ln' data-ln='18'></td><td><span> <</span><span class='pt9'>nobr</span><span>>--gist-like</</span><span class='pt9'>nobr</span><span>></span></td></tr>
<tr><td class='ln' data-ln='19'></td><td><span> <</span><span class='pt9'>nobr</span><span>><</span><span class='pt9'>span</span><span> </span><span class='pt13'>id</span><span>=</span><span class='pt8'>"lines"</span><span>></</span><span class='pt9'>span</span><span>></</span><span class='pt9'>nobr</span><span>></span></td></tr>
<tr><td class='ln' data-ln='20'></td><td><span> </</span><span class='pt9'>h1</span><span>></span></td></tr>
<tr><td class='ln' data-ln='21'></td><td><span> </</span><span class='pt9'>div</span><span>></span></td></tr>
<tr><td class='ln' data-ln='22'></td><td> </td></tr>
<tr><td class='ln' data-ln='23'></td><td><span> <</span><span class='pt9'>div</span><span> </span><span class='pt13'>class</span><span>=</span><span class='pt8'>"flex-centered"</span><span>></span></td></tr>
<tr><td class='ln' data-ln='24'></td><td><span> <</span><span class='pt9'>select</span><span> </span><span class='pt13'>id</span><span>=</span><span class='pt8'>"filetype"</span><span>></span></td></tr>
<tr><td class='ln' data-ln='25'></td><td><span> <</span><span class='pt9'>option</span><span> </span><span class='pt13'>selected</span><span> </span><span class='pt13'>value</span><span>=</span><span class='pt8'>"rs"</span><span>>rust</</span><span class='pt9'>option</span><span>></span></td></tr>
<tr><td class='ln' data-ln='26'></td><td><span> <</span><span class='pt9'>option</span><span> </span><span class='pt13'>value</span><span>=</span><span class='pt8'>"js"</span><span>>javascript</</span><span class='pt9'>option</span><span>></span></td></tr>
<tr><td class='ln' data-ln='27'></td><td><span> <</span><span class='pt9'>option</span><span> </span><span class='pt13'>value</span><span>=</span><span class='pt8'>"jsx"</span><span>>jsx</</span><span class='pt9'>option</span><span>></span></td></tr>
<tr><td class='ln' data-ln='28'></td><td><span> <</span><span class='pt9'>option</span><span> </span><span class='pt13'>value</span><span>=</span><span class='pt8'>"html"</span><span>>html</</span><span class='pt9'>option</span><span>></span></td></tr>
<tr><td class='ln' data-ln='29'></td><td><span> <</span><span class='pt9'>option</span><span> </span><span class='pt13'>value</span><span>=</span><span class='pt8'>"c"</span><span>>c</</span><span class='pt9'>option</span><span>></span></td></tr>
<tr><td class='ln' data-ln='30'></td><td><span> <</span><span class='pt9'>option</span><span> </span><span class='pt13'>value</span><span>=</span><span class='pt8'>"py"</span><span>>python</</span><span class='pt9'>option</span><span>></span></td></tr>
<tr><td class='ln' data-ln='31'></td><td><span> <</span><span class='pt9'>option</span><span> </span><span class='pt13'>value</span><span>=</span><span class='pt8'>"go"</span><span>>go</</span><span class='pt9'>option</span><span>></span></td></tr>
<tr><td class='ln' data-ln='32'></td><td><span> </</span><span class='pt9'>select</span><span>></span></td></tr>
<tr><td class='ln' data-ln='33'></td><td> </td></tr>
<tr><td class='ln' data-ln='34'></td><td><span> <</span><span class='pt9'>select</span><span> </span><span class='pt13'>id</span><span>=</span><span class='pt8'>"style"</span><span>></span></td></tr>
<tr><td class='ln' data-ln='35'></td><td><span> <</span><span class='pt9'>option</span><span> </span><span class='pt13'>value</span><span>=</span><span class='pt8'>"atom_dark"</span><span>>atom dark</</span><span class='pt9'>option</span><span>></span></td></tr>
<tr><td class='ln' data-ln='36'></td><td><span> <</span><span class='pt9'>option</span><span> </span><span class='pt13'>value</span><span>=</span><span class='pt8'>"ayu_dark"</span><span>>ayu dark</</span><span class='pt9'>option</span><span>></span></td></tr>
<tr><td class='ln' data-ln='37'></td><td><span> <</span><span class='pt9'>option</span><span> </span><span class='pt13'>value</span><span>=</span><span class='pt8'>"ayu_light"</span><span>>ayu light</</span><span class='pt9'>option</span><span>></span></td></tr>
<tr><td class='ln' data-ln='38'></td><td><span> <</span><span class='pt9'>option</span><span> </span><span class='pt13'>value</span><span>=</span><span class='pt8'>"ayu_mirage"</span><span>>ayu mirage</</span><span class='pt9'>option</span><span>></span></td></tr>
<tr><td class='ln' data-ln='39'></td><td><span> <</span><span class='pt9'>option</span><span> </span><span class='pt13'>value</span><span>=</span><span class='pt8'>"cobalt2"</span><span>>cobalt2</</span><span class='pt9'>option</span><span>></span></td></tr>
<tr><td class='ln' data-ln='40'></td><td><span> <</span><span class='pt9'>option</span><span> </span><span class='pt13'>value</span><span>=</span><span class='pt8'>"dracula"</span><span>>dracula</</span><span class='pt9'>option</span><span>></span></td></tr>
<tr><td class='ln' data-ln='41'></td><td><span> <</span><span class='pt9'>option</span><span> </span><span class='pt13'>selected</span><span> </span><span class='pt13'>value</span><span>=</span><span class='pt8'>"github"</span><span>>github</</span><span class='pt9'>option</span><span>></span></td></tr>
<tr><td class='ln' data-ln='42'></td><td><span> <</span><span class='pt9'>option</span><span> </span><span class='pt13'>value</span><span>=</span><span class='pt8'>"monokai_extended"</span><span>>monokai extended</</span><span class='pt9'>option</span><span>></span></td></tr>
<tr><td class='ln' data-ln='43'></td><td><span> <</span><span class='pt9'>option</span><span> </span><span class='pt13'>value</span><span>=</span><span class='pt8'>"oceanic_next"</span><span>>oceanic next</</span><span class='pt9'>option</span><span>></span></td></tr>
<tr><td class='ln' data-ln='44'></td><td><span> <</span><span class='pt9'>option</span><span> </span><span class='pt13'>value</span><span>=</span><span class='pt8'>"one_dark"</span><span>>one dark</</span><span class='pt9'>option</span><span>></span></td></tr>
<tr><td class='ln' data-ln='45'></td><td><span> <</span><span class='pt9'>option</span><span> </span><span class='pt13'>value</span><span>=</span><span class='pt8'>"one_light"</span><span>>one light</</span><span class='pt9'>option</span><span>></span></td></tr>
<tr><td class='ln' data-ln='46'></td><td><span> <</span><span class='pt9'>option</span><span> </span><span class='pt13'>value</span><span>=</span><span class='pt8'>"one_monokai"</span><span>>one monokai</</span><span class='pt9'>option</span><span>></span></td></tr>
<tr><td class='ln' data-ln='47'></td><td><span> <</span><span class='pt9'>option</span><span> </span><span class='pt13'>value</span><span>=</span><span class='pt8'>"predawn"</span><span>>predawn</</span><span class='pt9'>option</span><span>></span></td></tr>
<tr><td class='ln' data-ln='48'></td><td><span> <</span><span class='pt9'>option</span><span> </span><span class='pt13'>value</span><span>=</span><span class='pt8'>"solarized_dark"</span><span>>solarized dark</</span><span class='pt9'>option</span><span>></span></td></tr>
<tr><td class='ln' data-ln='49'></td><td><span> <</span><span class='pt9'>option</span><span> </span><span class='pt13'>value</span><span>=</span><span class='pt8'>"solarized_light"</span><span>>solarized light</</span><span class='pt9'>option</span><span>></span></td></tr>
<tr><td class='ln' data-ln='50'></td><td><span> <</span><span class='pt9'>option</span><span> </span><span class='pt13'>value</span><span>=</span><span class='pt8'>"wombat"</span><span>>wombat</</span><span class='pt9'>option</span><span>></span></td></tr>
<tr><td class='ln' data-ln='51'></td><td><span> </</span><span class='pt9'>select</span><span>></span></td></tr>
<tr><td class='ln' data-ln='52'></td><td> </td></tr>
<tr><td class='ln' data-ln='53'></td><td><span> <</span><span class='pt9'>input</span><span> </span><span class='pt13'>id</span><span>=</span><span class='pt8'>"highlight"</span><span> </span><span class='pt13'>type</span><span>=</span><span class='pt8'>"checkbox"</span><span> /></span></td></tr>
<tr><td class='ln' data-ln='54'></td><td><span> <</span><span class='pt9'>label</span><span> </span><span class='pt13'>for</span><span>=</span><span class='pt8'>"highlight"</span><span>><</span><span class='pt9'>nobr</span><span>>--highlight</</span><span class='pt9'>nobr</span><span>></</span><span class='pt9'>label</span><span>></span></td></tr>
<tr><td class='ln' data-ln='55'></td><td><span> </</span><span class='pt9'>div</span><span>></span></td></tr>
<tr><td class='ln' data-ln='56'></td><td> </td></tr>
<tr><td class='ln' data-ln='57'></td><td> </td></tr>
<tr><td class='ln' data-ln='58'></td><td><span> <</span><span class='pt9'>div</span><span> </span><span class='pt13'>id</span><span>=</span><span class='pt8'>"highlighted"</span><span> </span><span class='pt13'>class</span><span>=</span><span class='pt8'>"no-hi"</span><span> </span><span class='pt13'>data-style</span><span>=</span><span class='pt8'>"github--rs"</span><span> </span><span class='pt13'>data-filetype</span><span>=</span><span class='pt8'>"rs"</span><span>></span></td></tr>
<tr><td class='ln' data-ln='59'></td><td><span> </</span><span class='pt9'>div</span><span>> </span><span class='pt12'><!-- highlighted --></span></td></tr>
<tr><td class='ln' data-ln='60'></td><td> </td></tr>
<tr><td class='ln' data-ln='61'></td><td><span> <</span><span class='pt9'>div</span><span> </span><span class='pt13'>class</span><span>=</span><span class='pt8'>"gh"</span><span>></span></td></tr>
<tr><td class='ln' data-ln='62'></td><td><span> <</span><span class='pt9'>a</span><span> </span><span class='pt13'>href</span><span>=</span><span class='pt8'>"https://github.com/demille/paint"</span><span>></span></td></tr>
<tr><td class='ln' data-ln='63'></td><td><span> <</span><span class='pt9'>svg</span><span> </span><span class='pt13'>role</span><span>=</span><span class='pt8'>"img"</span><span> </span><span class='pt13'>viewBox</span><span>=</span><span class='pt8'>"0 0 24 24"</span><span> </span><span class='pt13'>xmlns</span><span>=</span><span class='pt8'>"http://www.w3.org/2000/svg"</span><span>></span></td></tr>
<tr><td class='ln' data-ln='64'></td><td><span> <</span><span class='pt9'>path</span><span> </span><span class='pt13'>d</span><span>=</span><span class='pt8'>"M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12"</span><span>/></span></td></tr>
<tr><td class='ln' data-ln='65'></td><td><span> </</span><span class='pt9'>svg</span><span>></span></td></tr>
<tr><td class='ln' data-ln='66'></td><td><span> <</span><span class='pt9'>span</span><span>>/demille/paint</</span><span class='pt9'>span</span><span>></span></td></tr>
<tr><td class='ln' data-ln='67'></td><td><span> </</span><span class='pt9'>a</span><span>></span></td></tr>
<tr><td class='ln' data-ln='68'></td><td><span> </</span><span class='pt9'>div</span><span>></span></td></tr>
<tr><td class='ln' data-ln='69'></td><td> </td></tr>
<tr><td class='ln' data-ln='70'></td><td><span> </</span><span class='pt9'>div</span><span>> </span><span class='pt12'><!-- container --></span></td></tr>
<tr><td class='ln' data-ln='71'></td><td> </td></tr>
<tr><td class='ln' data-ln='72'></td><td><span> <</span><span class='pt9'>div</span><span> </span><span class='pt13'>class</span><span>=</span><span class='pt8'>"bg-overlay"</span><span>></</span><span class='pt9'>div</span><span>></span></td></tr>
<tr><td class='ln' data-ln='73'></td><td> </td></tr>
<tr><td class='ln' data-ln='74'></td><td><span> <</span><span class='pt9'>script</span><span> </span><span class='pt13'>src</span><span>=</span><span class='pt8'>"main.js"</span><span>></</span><span class='pt9'>script</span><span>></span></td></tr>
<tr><td class='ln' data-ln='75'></td><td><span></</span><span class='pt9'>body</span><span>></span></td></tr>
<tr><td class='ln' data-ln='76'></td><td><span></</span><span class='pt9'>html</span><span>></span></td></tr>
</table>
</div>
</div>
</div>
<div class='style' id='P--monokai_extended--html'>
<div class='P--monokai_extended-bordered'>
<div class="info header">
<span class="left">index.html</span>
<span class="right"><span>76 lines</span><span>3.60 KB</span></span>
</div>
<div class='P--monokai_extended'>
<table>
<tr><td class='ln' data-ln='1'></td><td><span class='pt36'><!</span><span class='pt32'>DOCTYPE</span><span> html</span><span class='pt36'>></span></td></tr>
<tr><td class='ln' data-ln='2'></td><td><span class='pt36'><</span><span class='pt32'>html</span><span class='pt36'>></span></td></tr>
<tr><td class='ln' data-ln='3'></td><td class='hi'><span class='pt36'><</span><span class='pt32'>head</span><span class='pt36'>></span></td></tr>
<tr><td class='ln' data-ln='4'></td><td class='hi'><span> </span><span class='pt36'><</span><span class='pt32'>meta</span><span class='pt13'> charset=</span><span class='pt36'>"</span><span class='pt27'>utf-8</span><span class='pt36'>" /></span></td></tr>
<tr><td class='ln' data-ln='5'></td><td class='hi'><span> </span><span class='pt36'><</span><span class='pt32'>meta</span><span class='pt13'> http-equiv=</span><span class='pt36'>"</span><span class='pt27'>X-UA-Compatible</span><span class='pt36'>"</span><span class='pt13'> content=</span><span class='pt36'>"</span><span class='pt27'>IE=edge</span><span class='pt36'>"></span></td></tr>
<tr><td class='ln' data-ln='6'></td><td class='hi'><span> </span><span class='pt36'><</span><span class='pt32'>title</span><span class='pt36'>></span><span>paint demo</span><span class='pt36'></</span><span class='pt32'>title</span><span class='pt36'>></span></td></tr>
<tr><td class='ln' data-ln='7'></td><td class='hi'><span> </span><span class='pt36'><</span><span class='pt32'>meta</span><span class='pt13'> name=</span><span class='pt36'>"</span><span class='pt27'>viewport</span><span class='pt36'>"</span><span class='pt13'> content=</span><span class='pt36'>"</span><span class='pt27'>width=device-width, initial-scale=1</span><span class='pt36'>"></span></td></tr>
<tr><td class='ln' data-ln='8'></td><td class='hi'><span> </span><span class='pt36'><</span><span class='pt32'>link</span><span class='pt13'> rel=</span><span class='pt36'>"</span><span class='pt27'>stylesheet</span><span class='pt36'>"</span><span class='pt13'> type=</span><span class='pt36'>"</span><span class='pt27'>text/css</span><span class='pt36'>"</span><span class='pt13'> media=</span><span class='pt36'>"</span><span class='pt27'>screen</span><span class='pt36'>"</span><span class='pt13'> href=</span><span class='pt36'>"</span><span class='pt27'>main.css</span><span class='pt36'>" /></span></td></tr>
<tr><td class='ln' data-ln='9'></td><td class='hi'><span> </span><span class='pt36'><</span><span class='pt32'>link</span><span class='pt13'> rel=</span><span class='pt36'>"</span><span class='pt27'>stylesheet</span><span class='pt36'>"</span><span class='pt13'> type=</span><span class='pt36'>"</span><span class='pt27'>text/css</span><span class='pt36'>"</span><span class='pt13'> media=</span><span class='pt36'>"</span><span class='pt27'>screen</span><span class='pt36'>"</span><span class='pt13'> href=</span><span class='pt36'>"</span><span class='pt27'>snippets.css</span><span class='pt36'>" /></span></td></tr>
<tr><td class='ln' data-ln='10'></td><td class='hi'><span class='pt36'></</span><span class='pt32'>head</span><span class='pt36'>></span></td></tr>
<tr><td class='ln' data-ln='11'></td><td><span class='pt36'><</span><span class='pt32'>body</span><span class='pt36'>></span></td></tr>
<tr><td class='ln' data-ln='12'></td><td><span> </span><span class='pt36'><</span><span class='pt32'>div</span><span class='pt13'> class=</span><span class='pt36'>"</span><span class='pt13'>container</span><span class='pt36'>"></span></td></tr>
<tr><td class='ln' data-ln='13'></td><td><span> </span><span class='pt36'><</span><span class='pt32'>div</span><span class='pt13'> class=</span><span class='pt36'>"</span><span class='pt13'>command</span><span class='pt36'>"></span></td></tr>
<tr><td class='ln' data-ln='14'></td><td><span> </span><span class='pt36'><</span><span class='pt32'>h1</span><span class='pt36'>></span></td></tr>
<tr><td class='ln' data-ln='15'></td><td><span> </span><span class='pt36'><</span><span class='pt32'>span</span><span class='pt13'> class=</span><span class='pt36'>"</span><span class='pt13'>hue-rotate</span><span class='pt36'>"></span><span>$</span><span class='pt36'></</span><span class='pt32'>span</span><span class='pt36'>></span><span> paint</span></td></tr>
<tr><td class='ln' data-ln='16'></td><td><span> ./file.</span><span class='pt36'><</span><span class='pt32'>span</span><span class='pt13'> id=</span><span class='pt36'>"</span><span class='pt13'>ext</span><span class='pt36'>"></span><span>rs</span><span class='pt36'></</span><span class='pt32'>span</span><span class='pt36'>></span></td></tr>
<tr><td class='ln' data-ln='17'></td><td><span> </span><span class='pt36'><</span><span class='pt32'>nobr</span><span class='pt36'>></span><span>--style="</span><span class='pt36'><</span><span class='pt32'>span</span><span class='pt13'> id=</span><span class='pt36'>"</span><span class='pt13'>style-name</span><span class='pt36'>"></span><span>github</span><span class='pt36'></</span><span class='pt32'>span</span><span class='pt36'>></span><span>"</span><span class='pt36'></</span><span class='pt32'>nobr</span><span class='pt36'>></span></td></tr>
<tr><td class='ln' data-ln='18'></td><td><span> </span><span class='pt36'><</span><span class='pt32'>nobr</span><span class='pt36'>></span><span>--gist-like</span><span class='pt36'></</span><span class='pt32'>nobr</span><span class='pt36'>></span></td></tr>
<tr><td class='ln' data-ln='19'></td><td><span> </span><span class='pt36'><</span><span class='pt32'>nobr</span><span class='pt36'>><</span><span class='pt32'>span</span><span class='pt13'> id=</span><span class='pt36'>"</span><span class='pt13'>lines</span><span class='pt36'>"></</span><span class='pt32'>span</span><span class='pt36'>></</span><span class='pt32'>nobr</span><span class='pt36'>></span></td></tr>
<tr><td class='ln' data-ln='20'></td><td><span> </span><span class='pt36'></</span><span class='pt32'>h1</span><span class='pt36'>></span></td></tr>
<tr><td class='ln' data-ln='21'></td><td><span> </span><span class='pt36'></</span><span class='pt32'>div</span><span class='pt36'>></span></td></tr>
<tr><td class='ln' data-ln='22'></td><td> </td></tr>
<tr><td class='ln' data-ln='23'></td><td><span> </span><span class='pt36'><</span><span class='pt32'>div</span><span class='pt13'> class=</span><span class='pt36'>"</span><span class='pt13'>flex-centered</span><span class='pt36'>"></span></td></tr>
<tr><td class='ln' data-ln='24'></td><td><span> </span><span class='pt36'><</span><span class='pt32'>select</span><span> </span><span class='pt13'>id=</span><span class='pt36'>"</span><span class='pt27'>filetype</span><span class='pt36'>"></span></td></tr>
<tr><td class='ln' data-ln='25'></td><td><span> </span><span class='pt36'><</span><span class='pt32'>option</span><span> </span><span class='pt13'>selected</span><span> </span><span class='pt13'>value=</span><span class='pt36'>"</span><span class='pt27'>rs</span><span class='pt36'>"></span><span>rust</span><span class='pt36'></</span><span class='pt32'>option</span><span class='pt36'>></span></td></tr>
<tr><td class='ln' data-ln='26'></td><td><span> </span><span class='pt36'><</span><span class='pt32'>option</span><span> </span><span class='pt13'>value=</span><span class='pt36'>"</span><span class='pt27'>js</span><span class='pt36'>"></span><span>javascript</span><span class='pt36'></</span><span class='pt32'>option</span><span class='pt36'>></span></td></tr>
<tr><td class='ln' data-ln='27'></td><td><span> </span><span class='pt36'><</span><span class='pt32'>option</span><span> </span><span class='pt13'>value=</span><span class='pt36'>"</span><span class='pt27'>jsx</span><span class='pt36'>"></span><span>jsx</span><span class='pt36'></</span><span class='pt32'>option</span><span class='pt36'>></span></td></tr>
<tr><td class='ln' data-ln='28'></td><td><span> </span><span class='pt36'><</span><span class='pt32'>option</span><span> </span><span class='pt13'>value=</span><span class='pt36'>"</span><span class='pt27'>html</span><span class='pt36'>"></span><span>html</span><span class='pt36'></</span><span class='pt32'>option</span><span class='pt36'>></span></td></tr>
<tr><td class='ln' data-ln='29'></td><td><span> </span><span class='pt36'><</span><span class='pt32'>option</span><span> </span><span class='pt13'>value=</span><span class='pt36'>"</span><span class='pt27'>c</span><span class='pt36'>"></span><span>c</span><span class='pt36'></</span><span class='pt32'>option</span><span class='pt36'>></span></td></tr>
<tr><td class='ln' data-ln='30'></td><td><span> </span><span class='pt36'><</span><span class='pt32'>option</span><span> </span><span class='pt13'>value=</span><span class='pt36'>"</span><span class='pt27'>py</span><span class='pt36'>"></span><span>python</span><span class='pt36'></</span><span class='pt32'>option</span><span class='pt36'>></span></td></tr>
<tr><td class='ln' data-ln='31'></td><td><span> </span><span class='pt36'><</span><span class='pt32'>option</span><span> </span><span class='pt13'>value=</span><span class='pt36'>"</span><span class='pt27'>go</span><span class='pt36'>"></span><span>go</span><span class='pt36'></</span><span class='pt32'>option</span><span class='pt36'>></span></td></tr>
<tr><td class='ln' data-ln='32'></td><td><span> </span><span class='pt36'></</span><span class='pt32'>select</span><span class='pt36'>></span></td></tr>
<tr><td class='ln' data-ln='33'></td><td> </td></tr>
<tr><td class='ln' data-ln='34'></td><td><span> </span><span class='pt36'><</span><span class='pt32'>select</span><span> </span><span class='pt13'>id=</span><span class='pt36'>"</span><span class='pt27'>style</span><span class='pt36'>"></span></td></tr>
<tr><td class='ln' data-ln='35'></td><td><span> </span><span class='pt36'><</span><span class='pt32'>option</span><span> </span><span class='pt13'>value=</span><span class='pt36'>"</span><span class='pt27'>atom_dark</span><span class='pt36'>"></span><span>atom dark</span><span class='pt36'></</span><span class='pt32'>option</span><span class='pt36'>></span></td></tr>
<tr><td class='ln' data-ln='36'></td><td><span> </span><span class='pt36'><</span><span class='pt32'>option</span><span> </span><span class='pt13'>value=</span><span class='pt36'>"</span><span class='pt27'>ayu_dark</span><span class='pt36'>"></span><span>ayu dark</span><span class='pt36'></</span><span class='pt32'>option</span><span class='pt36'>></span></td></tr>
<tr><td class='ln' data-ln='37'></td><td><span> </span><span class='pt36'><</span><span class='pt32'>option</span><span> </span><span class='pt13'>value=</span><span class='pt36'>"</span><span class='pt27'>ayu_light</span><span class='pt36'>"></span><span>ayu light</span><span class='pt36'></</span><span class='pt32'>option</span><span class='pt36'>></span></td></tr>
<tr><td class='ln' data-ln='38'></td><td><span> </span><span class='pt36'><</span><span class='pt32'>option</span><span> </span><span class='pt13'>value=</span><span class='pt36'>"</span><span class='pt27'>ayu_mirage</span><span class='pt36'>"></span><span>ayu mirage</span><span class='pt36'></</span><span class='pt32'>option</span><span class='pt36'>></span></td></tr>
<tr><td class='ln' data-ln='39'></td><td><span> </span><span class='pt36'><</span><span class='pt32'>option</span><span> </span><span class='pt13'>value=</span><span class='pt36'>"</span><span class='pt27'>cobalt2</span><span class='pt36'>"></span><span>cobalt2</span><span class='pt36'></</span><span class='pt32'>option</span><span class='pt36'>></span></td></tr>
<tr><td class='ln' data-ln='40'></td><td><span> </span><span class='pt36'><</span><span class='pt32'>option</span><span> </span><span class='pt13'>value=</span><span class='pt36'>"</span><span class='pt27'>dracula</span><span class='pt36'>"></span><span>dracula</span><span class='pt36'></</span><span class='pt32'>option</span><span class='pt36'>></span></td></tr>
<tr><td class='ln' data-ln='41'></td><td><span> </span><span class='pt36'><</span><span class='pt32'>option</span><span> </span><span class='pt13'>selected</span><span> </span><span class='pt13'>value=</span><span class='pt36'>"</span><span class='pt27'>github</span><span class='pt36'>"></span><span>github</span><span class='pt36'></</span><span class='pt32'>option</span><span class='pt36'>></span></td></tr>
<tr><td class='ln' data-ln='42'></td><td><span> </span><span class='pt36'><</span><span class='pt32'>option</span><span> </span><span class='pt13'>value=</span><span class='pt36'>"</span><span class='pt27'>monokai_extended</span><span class='pt36'>"></span><span>monokai extended</span><span class='pt36'></</span><span class='pt32'>option</span><span class='pt36'>></span></td></tr>
<tr><td class='ln' data-ln='43'></td><td><span> </span><span class='pt36'><</span><span class='pt32'>option</span><span> </span><span class='pt13'>value=</span><span class='pt36'>"</span><span class='pt27'>oceanic_next</span><span class='pt36'>"></span><span>oceanic next</span><span class='pt36'></</span><span class='pt32'>option</span><span class='pt36'>></span></td></tr>
<tr><td class='ln' data-ln='44'></td><td><span> </span><span class='pt36'><</span><span class='pt32'>option</span><span> </span><span class='pt13'>value=</span><span class='pt36'>"</span><span class='pt27'>one_dark</span><span class='pt36'>"></span><span>one dark</span><span class='pt36'></</span><span class='pt32'>option</span><span class='pt36'>></span></td></tr>
<tr><td class='ln' data-ln='45'></td><td><span> </span><span class='pt36'><</span><span class='pt32'>option</span><span> </span><span class='pt13'>value=</span><span class='pt36'>"</span><span class='pt27'>one_light</span><span class='pt36'>"></span><span>one light</span><span class='pt36'></</span><span class='pt32'>option</span><span class='pt36'>></span></td></tr>
<tr><td class='ln' data-ln='46'></td><td><span> </span><span class='pt36'><</span><span class='pt32'>option</span><span> </span><span class='pt13'>value=</span><span class='pt36'>"</span><span class='pt27'>one_monokai</span><span class='pt36'>"></span><span>one monokai</span><span class='pt36'></</span><span class='pt32'>option</span><span class='pt36'>></span></td></tr>
<tr><td class='ln' data-ln='47'></td><td><span> </span><span class='pt36'><</span><span class='pt32'>option</span><span> </span><span class='pt13'>value=</span><span class='pt36'>"</span><span class='pt27'>predawn</span><span class='pt36'>"></span><span>predawn</span><span class='pt36'></</span><span class='pt32'>option</span><span class='pt36'>></span></td></tr>
<tr><td class='ln' data-ln='48'></td><td><span> </span><span class='pt36'><</span><span class='pt32'>option</span><span> </span><span class='pt13'>value=</span><span class='pt36'>"</span><span class='pt27'>solarized_dark</span><span class='pt36'>"></span><span>solarized dark</span><span class='pt36'></</span><span class='pt32'>option</span><span class='pt36'>></span></td></tr>
<tr><td class='ln' data-ln='49'></td><td><span> </span><span class='pt36'><</span><span class='pt32'>option</span><span> </span><span class='pt13'>value=</span><span class='pt36'>"</span><span class='pt27'>solarized_light</span><span class='pt36'>"></span><span>solarized light</span><span class='pt36'></</span><span class='pt32'>option</span><span class='pt36'>></span></td></tr>
<tr><td class='ln' data-ln='50'></td><td><span> </span><span class='pt36'><</span><span class='pt32'>option</span><span> </span><span class='pt13'>value=</span><span class='pt36'>"</span><span class='pt27'>wombat</span><span class='pt36'>"></span><span>wombat</span><span class='pt36'></</span><span class='pt32'>option</span><span class='pt36'>></span></td></tr>
<tr><td class='ln' data-ln='51'></td><td><span> </span><span class='pt36'></</span><span class='pt32'>select</span><span class='pt36'>></span></td></tr>
<tr><td class='ln' data-ln='52'></td><td> </td></tr>
<tr><td class='ln' data-ln='53'></td><td><span> </span><span class='pt36'><</span><span class='pt32'>input</span><span> </span><span class='pt13'>id=</span><span class='pt36'>"</span><span class='pt27'>highlight</span><span class='pt36'>"</span><span> </span><span class='pt13'>type=</span><span class='pt36'>"</span><span class='pt27'>checkbox</span><span class='pt36'>" /></span></td></tr>
<tr><td class='ln' data-ln='54'></td><td><span> </span><span class='pt36'><</span><span class='pt32'>label</span><span> </span><span class='pt13'>for=</span><span class='pt36'>"</span><span class='pt27'>highlight</span><span class='pt36'>"><</span><span class='pt32'>nobr</span><span class='pt36'>></span><span>--highlight</span><span class='pt36'></</span><span class='pt32'>nobr</span><span class='pt36'>></</span><span class='pt32'>label</span><span class='pt36'>></span></td></tr>
<tr><td class='ln' data-ln='55'></td><td><span> </span><span class='pt36'></</span><span class='pt32'>div</span><span class='pt36'>></span></td></tr>
<tr><td class='ln' data-ln='56'></td><td> </td></tr>
<tr><td class='ln' data-ln='57'></td><td> </td></tr>
<tr><td class='ln' data-ln='58'></td><td><span> </span><span class='pt36'><</span><span class='pt32'>div</span><span class='pt13'> id=</span><span class='pt36'>"</span><span class='pt13'>highlighted</span><span class='pt36'>"</span><span class='pt13'> class=</span><span class='pt36'>"</span><span class='pt13'>no-hi</span><span class='pt36'>"</span><span class='pt13'> data-style=</span><span class='pt36'>"</span><span class='pt27'>github--rs</span><span class='pt36'>"</span><span class='pt13'> data-filetype=</span><span class='pt36'>"</span><span class='pt27'>rs</span><span class='pt36'>"></span></td></tr>
<tr><td class='ln' data-ln='59'></td><td><span> </span><span class='pt36'></</span><span class='pt32'>div</span><span class='pt36'>></span><span> </span><span class='pt12'><!-- highlighted --></span></td></tr>
<tr><td class='ln' data-ln='60'></td><td> </td></tr>
<tr><td class='ln' data-ln='61'></td><td><span> </span><span class='pt36'><</span><span class='pt32'>div</span><span class='pt13'> class=</span><span class='pt36'>"</span><span class='pt13'>gh</span><span class='pt36'>"></span></td></tr>
<tr><td class='ln' data-ln='62'></td><td><span> </span><span class='pt36'><</span><span class='pt32'>a</span><span> </span><span class='pt13'>href=</span><span class='pt36'>"</span><span class='pt27'>https://github.com/demille/paint</span><span class='pt36'>"></span></td></tr>
<tr><td class='ln' data-ln='63'></td><td><span> </span><span class='pt36'><</span><span class='pt32'>svg</span><span class='pt13'> role=</span><span class='pt36'>"</span><span class='pt27'>img</span><span class='pt36'>"</span><span class='pt13'> viewBox=</span><span class='pt36'>"</span><span class='pt27'>0 0 24 24</span><span class='pt36'>"</span><span class='pt13'> xmlns=</span><span class='pt36'>"</span><span class='pt27'>http://www.w3.org/2000/svg</span><span class='pt36'>"></span></td></tr>
<tr><td class='ln' data-ln='64'></td><td><span> </span><span class='pt36'><</span><span class='pt32'>path</span><span class='pt13'> d=</span><span class='pt36'>"</span><span class='pt27'>M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12</span><span class='pt36'>"/></span></td></tr>
<tr><td class='ln' data-ln='65'></td><td><span> </span><span class='pt36'></</span><span class='pt32'>svg</span><span class='pt36'>></span></td></tr>
<tr><td class='ln' data-ln='66'></td><td><span> </span><span class='pt36'><</span><span class='pt32'>span</span><span class='pt36'>></span><span>/demille/paint</span><span class='pt36'></</span><span class='pt32'>span</span><span class='pt36'>></span></td></tr>
<tr><td class='ln' data-ln='67'></td><td><span> </span><span class='pt36'></</span><span class='pt32'>a</span><span class='pt36'>></span></td></tr>
<tr><td class='ln' data-ln='68'></td><td><span> </span><span class='pt36'></</span><span class='pt32'>div</span><span class='pt36'>></span></td></tr>
<tr><td class='ln' data-ln='69'></td><td> </td></tr>
<tr><td class='ln' data-ln='70'></td><td><span> </span><span class='pt36'></</span><span class='pt32'>div</span><span class='pt36'>></span><span> </span><span class='pt12'><!-- container --></span></td></tr>
<tr><td class='ln' data-ln='71'></td><td> </td></tr>
<tr><td class='ln' data-ln='72'></td><td><span> </span><span class='pt36'><</span><span class='pt32'>div</span><span class='pt13'> class=</span><span class='pt36'>"</span><span class='pt13'>bg-overlay</span><span class='pt36'>"></</span><span class='pt32'>div</span><span class='pt36'>></span></td></tr>
<tr><td class='ln' data-ln='73'></td><td> </td></tr>
<tr><td class='ln' data-ln='74'></td><td><span> </span><span class='pt36'><</span><span class='it'>script</span><span> </span><span class='pt13'>src=</span><span class='pt36'>"</span><span class='pt27'>main.js</span><span class='pt36'>"></</span><span class='it'>script</span><span class='pt36'>></span></td></tr>
<tr><td class='ln' data-ln='75'></td><td><span class='pt36'></</span><span class='pt32'>body</span><span class='pt36'>></span></td></tr>
<tr><td class='ln' data-ln='76'></td><td><span class='pt36'></</span><span class='pt32'>html</span><span class='pt36'>></span></td></tr>
</table>
</div>
</div>
</div>
<div class='style' id='P--oceanic_next--html'>
<div class='P--oceanic_next-bordered'>
<div class="info header">
<span class="left">index.html</span>
<span class="right"><span>76 lines</span><span>3.60 KB</span></span>
</div>
<div class='P--oceanic_next'>
<table>
<tr><td class='ln' data-ln='1'></td><td><span class='pt1'><!</span><span class='pt9'>DOCTYPE html</span><span class='pt1'>></span></td></tr>
<tr><td class='ln' data-ln='2'></td><td><span class='pt1'><</span><span class='pt9'>html</span><span class='pt1'>></span></td></tr>
<tr><td class='ln' data-ln='3'></td><td class='hi'><span class='pt1'><</span><span class='pt9'>head</span><span class='pt1'>></span></td></tr>
<tr><td class='ln' data-ln='4'></td><td class='hi'><span> </span><span class='pt1'><</span><span class='pt9'>meta</span><span class='pt1'> </span><span class='pt6'>charset</span><span class='pt1'>="</span><span class='pt4'>utf-8</span><span class='pt1'>" /></span></td></tr>
<tr><td class='ln' data-ln='5'></td><td class='hi'><span> </span><span class='pt1'><</span><span class='pt9'>meta</span><span class='pt1'> </span><span class='pt6'>http-equiv</span><span class='pt1'>="</span><span class='pt4'>X-UA-Compatible</span><span class='pt1'>" </span><span class='pt6'>content</span><span class='pt1'>="</span><span class='pt4'>IE=edge</span><span class='pt1'>"></span></td></tr>
<tr><td class='ln' data-ln='6'></td><td class='hi'><span> </span><span class='pt1'><</span><span class='pt9'>title</span><span class='pt1'>></span><span>paint demo</span><span class='pt1'></</span><span class='pt9'>title</span><span class='pt1'>></span></td></tr>
<tr><td class='ln' data-ln='7'></td><td class='hi'><span> </span><span class='pt1'><</span><span class='pt9'>meta</span><span class='pt1'> </span><span class='pt6'>name</span><span class='pt1'>="</span><span class='pt4'>viewport</span><span class='pt1'>" </span><span class='pt6'>content</span><span class='pt1'>="</span><span class='pt4'>width=device-width, initial-scale=1</span><span class='pt1'>"></span></td></tr>
<tr><td class='ln' data-ln='8'></td><td class='hi'><span> </span><span class='pt1'><</span><span class='pt9'>link</span><span class='pt1'> </span><span class='pt6'>rel</span><span class='pt1'>="</span><span class='pt4'>stylesheet</span><span class='pt1'>" </span><span class='pt6'>type</span><span class='pt1'>="</span><span class='pt4'>text/css</span><span class='pt1'>" </span><span class='pt6'>media</span><span class='pt1'>="</span><span class='pt4'>screen</span><span class='pt1'>" </span><span class='pt6'>href</span><span class='pt1'>="</span><span class='pt4'>main.css</span><span class='pt1'>" /></span></td></tr>
<tr><td class='ln' data-ln='9'></td><td class='hi'><span> </span><span class='pt1'><</span><span class='pt9'>link</span><span class='pt1'> </span><span class='pt6'>rel</span><span class='pt1'>="</span><span class='pt4'>stylesheet</span><span class='pt1'>" </span><span class='pt6'>type</span><span class='pt1'>="</span><span class='pt4'>text/css</span><span class='pt1'>" </span><span class='pt6'>media</span><span class='pt1'>="</span><span class='pt4'>screen</span><span class='pt1'>" </span><span class='pt6'>href</span><span class='pt1'>="</span><span class='pt4'>snippets.css</span><span class='pt1'>" /></span></td></tr>
<tr><td class='ln' data-ln='10'></td><td class='hi'><span class='pt1'></</span><span class='pt9'>head</span><span class='pt1'>></span></td></tr>
<tr><td class='ln' data-ln='11'></td><td><span class='pt1'><</span><span class='pt9'>body</span><span class='pt1'>></span></td></tr>
<tr><td class='ln' data-ln='12'></td><td><span> </span><span class='pt1'><</span><span class='pt9'>div</span><span class='pt1'> </span><span class='pt6'>class</span><span class='pt1'>="</span><span class='pt4'>container</span><span class='pt1'>"></span></td></tr>
<tr><td class='ln' data-ln='13'></td><td><span> </span><span class='pt1'><</span><span class='pt9'>div</span><span class='pt1'> </span><span class='pt6'>class</span><span class='pt1'>="</span><span class='pt4'>command</span><span class='pt1'>"></span></td></tr>
<tr><td class='ln' data-ln='14'></td><td><span> </span><span class='pt1'><</span><span class='pt9'>h1</span><span class='pt1'>></span></td></tr>
<tr><td class='ln' data-ln='15'></td><td><span> </span><span class='pt1'><</span><span class='pt9'>span</span><span class='pt1'> </span><span class='pt6'>class</span><span class='pt1'>="</span><span class='pt4'>hue-rotate</span><span class='pt1'>"></span><span>$</span><span class='pt1'></</span><span class='pt9'>span</span><span class='pt1'>></span><span> paint</span></td></tr>
<tr><td class='ln' data-ln='16'></td><td><span> ./file.</span><span class='pt1'><</span><span class='pt9'>span</span><span class='pt1'> </span><span class='pt6'>id</span><span class='pt1'>="</span><span class='pt4'>ext</span><span class='pt1'>"></span><span>rs</span><span class='pt1'></</span><span class='pt9'>span</span><span class='pt1'>></span></td></tr>
<tr><td class='ln' data-ln='17'></td><td><span> </span><span class='pt1'><</span><span class='pt9'>nobr</span><span class='pt1'>></span><span>--style="</span><span class='pt1'><</span><span class='pt9'>span</span><span class='pt1'> </span><span class='pt6'>id</span><span class='pt1'>="</span><span class='pt4'>style-name</span><span class='pt1'>"></span><span>github</span><span class='pt1'></</span><span class='pt9'>span</span><span class='pt1'>></span><span>"</span><span class='pt1'></</span><span class='pt9'>nobr</span><span class='pt1'>></span></td></tr>
<tr><td class='ln' data-ln='18'></td><td><span> </span><span class='pt1'><</span><span class='pt9'>nobr</span><span class='pt1'>></span><span>--gist-like</span><span class='pt1'></</span><span class='pt9'>nobr</span><span class='pt1'>></span></td></tr>
<tr><td class='ln' data-ln='19'></td><td><span> </span><span class='pt1'><</span><span class='pt9'>nobr</span><span class='pt1'>><</span><span class='pt9'>span</span><span class='pt1'> </span><span class='pt6'>id</span><span class='pt1'>="</span><span class='pt4'>lines</span><span class='pt1'>"></</span><span class='pt9'>span</span><span class='pt1'>></</span><span class='pt9'>nobr</span><span class='pt1'>></span></td></tr>
<tr><td class='ln' data-ln='20'></td><td><span> </span><span class='pt1'></</span><span class='pt9'>h1</span><span class='pt1'>></span></td></tr>
<tr><td class='ln' data-ln='21'></td><td><span> </span><span class='pt1'></</span><span class='pt9'>div</span><span class='pt1'>></span></td></tr>
<tr><td class='ln' data-ln='22'></td><td> </td></tr>
<tr><td class='ln' data-ln='23'></td><td><span> </span><span class='pt1'><</span><span class='pt9'>div</span><span class='pt1'> </span><span class='pt6'>class</span><span class='pt1'>="</span><span class='pt4'>flex-centered</span><span class='pt1'>"></span></td></tr>
<tr><td class='ln' data-ln='24'></td><td><span> </span><span class='pt1'><</span><span class='pt9'>select</span><span class='pt1'> </span><span class='pt6'>id</span><span class='pt1'>="</span><span class='pt4'>filetype</span><span class='pt1'>"></span></td></tr>
<tr><td class='ln' data-ln='25'></td><td><span> </span><span class='pt1'><</span><span class='pt9'>option</span><span class='pt1'> </span><span class='pt6'>selected</span><span class='pt1'> </span><span class='pt6'>value</span><span class='pt1'>="</span><span class='pt4'>rs</span><span class='pt1'>"></span><span>rust</span><span class='pt1'></</span><span class='pt9'>option</span><span class='pt1'>></span></td></tr>
<tr><td class='ln' data-ln='26'></td><td><span> </span><span class='pt1'><</span><span class='pt9'>option</span><span class='pt1'> </span><span class='pt6'>value</span><span class='pt1'>="</span><span class='pt4'>js</span><span class='pt1'>"></span><span>javascript</span><span class='pt1'></</span><span class='pt9'>option</span><span class='pt1'>></span></td></tr>
<tr><td class='ln' data-ln='27'></td><td><span> </span><span class='pt1'><</span><span class='pt9'>option</span><span class='pt1'> </span><span class='pt6'>value</span><span class='pt1'>="</span><span class='pt4'>jsx</span><span class='pt1'>"></span><span>jsx</span><span class='pt1'></</span><span class='pt9'>option</span><span class='pt1'>></span></td></tr>
<tr><td class='ln' data-ln='28'></td><td><span> </span><span class='pt1'><</span><span class='pt9'>option</span><span class='pt1'> </span><span class='pt6'>value</span><span class='pt1'>="</span><span class='pt4'>html</span><span class='pt1'>"></span><span>html</span><span class='pt1'></</span><span class='pt9'>option</span><span class='pt1'>></span></td></tr>
<tr><td class='ln' data-ln='29'></td><td><span> </span><span class='pt1'><</span><span class='pt9'>option</span><span class='pt1'> </span><span class='pt6'>value</span><span class='pt1'>="</span><span class='pt4'>c</span><span class='pt1'>"></span><span>c</span><span class='pt1'></</span><span class='pt9'>option</span><span class='pt1'>></span></td></tr>
<tr><td class='ln' data-ln='30'></td><td><span> </span><span class='pt1'><</span><span class='pt9'>option</span><span class='pt1'> </span><span class='pt6'>value</span><span class='pt1'>="</span><span class='pt4'>py</span><span class='pt1'>"></span><span>python</span><span class='pt1'></</span><span class='pt9'>option</span><span class='pt1'>></span></td></tr>
<tr><td class='ln' data-ln='31'></td><td><span> </span><span class='pt1'><</span><span class='pt9'>option</span><span class='pt1'> </span><span class='pt6'>value</span><span class='pt1'>="</span><span class='pt4'>go</span><span class='pt1'>"></span><span>go</span><span class='pt1'></</span><span class='pt9'>option</span><span class='pt1'>></span></td></tr>
<tr><td class='ln' data-ln='32'></td><td><span> </span><span class='pt1'></</span><span class='pt9'>select</span><span class='pt1'>></span></td></tr>
<tr><td class='ln' data-ln='33'></td><td> </td></tr>
<tr><td class='ln' data-ln='34'></td><td><span> </span><span class='pt1'><</span><span class='pt9'>select</span><span class='pt1'> </span><span class='pt6'>id</span><span class='pt1'>="</span><span class='pt4'>style</span><span class='pt1'>"></span></td></tr>
<tr><td class='ln' data-ln='35'></td><td><span> </span><span class='pt1'><</span><span class='pt9'>option</span><span class='pt1'> </span><span class='pt6'>value</span><span class='pt1'>="</span><span class='pt4'>atom_dark</span><span class='pt1'>"></span><span>atom dark</span><span class='pt1'></</span><span class='pt9'>option</span><span class='pt1'>></span></td></tr>
<tr><td class='ln' data-ln='36'></td><td><span> </span><span class='pt1'><</span><span class='pt9'>option</span><span class='pt1'> </span><span class='pt6'>value</span><span class='pt1'>="</span><span class='pt4'>ayu_dark</span><span class='pt1'>"></span><span>ayu dark</span><span class='pt1'></</span><span class='pt9'>option</span><span class='pt1'>></span></td></tr>
<tr><td class='ln' data-ln='37'></td><td><span> </span><span class='pt1'><</span><span class='pt9'>option</span><span class='pt1'> </span><span class='pt6'>value</span><span class='pt1'>="</span><span class='pt4'>ayu_light</span><span class='pt1'>"></span><span>ayu light</span><span class='pt1'></</span><span class='pt9'>option</span><span class='pt1'>></span></td></tr>
<tr><td class='ln' data-ln='38'></td><td><span> </span><span class='pt1'><</span><span class='pt9'>option</span><span class='pt1'> </span><span class='pt6'>value</span><span class='pt1'>="</span><span class='pt4'>ayu_mirage</span><span class='pt1'>"></span><span>ayu mirage</span><span class='pt1'></</span><span class='pt9'>option</span><span class='pt1'>></span></td></tr>
<tr><td class='ln' data-ln='39'></td><td><span> </span><span class='pt1'><</span><span class='pt9'>option</span><span class='pt1'> </span><span class='pt6'>value</span><span class='pt1'>="</span><span class='pt4'>cobalt2</span><span class='pt1'>"></span><span>cobalt2</span><span class='pt1'></</span><span class='pt9'>option</span><span class='pt1'>></span></td></tr>
<tr><td class='ln' data-ln='40'></td><td><span> </span><span class='pt1'><</span><span class='pt9'>option</span><span class='pt1'> </span><span class='pt6'>value</span><span class='pt1'>="</span><span class='pt4'>dracula</span><span class='pt1'>"></span><span>dracula</span><span class='pt1'></</span><span class='pt9'>option</span><span class='pt1'>></span></td></tr>
<tr><td class='ln' data-ln='41'></td><td><span> </span><span class='pt1'><</span><span class='pt9'>option</span><span class='pt1'> </span><span class='pt6'>selected</span><span class='pt1'> </span><span class='pt6'>value</span><span class='pt1'>="</span><span class='pt4'>github</span><span class='pt1'>"></span><span>github</span><span class='pt1'></</span><span class='pt9'>option</span><span class='pt1'>></span></td></tr>
<tr><td class='ln' data-ln='42'></td><td><span> </span><span class='pt1'><</span><span class='pt9'>option</span><span class='pt1'> </span><span class='pt6'>value</span><span class='pt1'>="</span><span class='pt4'>monokai_extended</span><span class='pt1'>"></span><span>monokai extended</span><span class='pt1'></</span><span class='pt9'>option</span><span class='pt1'>></span></td></tr>
<tr><td class='ln' data-ln='43'></td><td><span> </span><span class='pt1'><</span><span class='pt9'>option</span><span class='pt1'> </span><span class='pt6'>value</span><span class='pt1'>="</span><span class='pt4'>oceanic_next</span><span class='pt1'>"></span><span>oceanic next</span><span class='pt1'></</span><span class='pt9'>option</span><span class='pt1'>></span></td></tr>
<tr><td class='ln' data-ln='44'></td><td><span> </span><span class='pt1'><</span><span class='pt9'>option</span><span class='pt1'> </span><span class='pt6'>value</span><span class='pt1'>="</span><span class='pt4'>one_dark</span><span class='pt1'>"></span><span>one dark</span><span class='pt1'></</span><span class='pt9'>option</span><span class='pt1'>></span></td></tr>
<tr><td class='ln' data-ln='45'></td><td><span> </span><span class='pt1'><</span><span class='pt9'>option</span><span class='pt1'> </span><span class='pt6'>value</span><span class='pt1'>="</span><span class='pt4'>one_light</span><span class='pt1'>"></span><span>one light</span><span class='pt1'></</span><span class='pt9'>option</span><span class='pt1'>></span></td></tr>
<tr><td class='ln' data-ln='46'></td><td><span> </span><span class='pt1'><</span><span class='pt9'>option</span><span class='pt1'> </span><span class='pt6'>value</span><span class='pt1'>="</span><span class='pt4'>one_monokai</span><span class='pt1'>"></span><span>one monokai</span><span class='pt1'></</span><span class='pt9'>option</span><span class='pt1'>></span></td></tr>
<tr><td class='ln' data-ln='47'></td><td><span> </span><span class='pt1'><</span><span class='pt9'>option</span><span class='pt1'> </span><span class='pt6'>value</span><span class='pt1'>="</span><span class='pt4'>predawn</span><span class='pt1'>"></span><span>predawn</span><span class='pt1'></</span><span class='pt9'>option</span><span class='pt1'>></span></td></tr>
<tr><td class='ln' data-ln='48'></td><td><span> </span><span class='pt1'><</span><span class='pt9'>option</span><span class='pt1'> </span><span class='pt6'>value</span><span class='pt1'>="</span><span class='pt4'>solarized_dark</span><span class='pt1'>"></span><span>solarized dark</span><span class='pt1'></</span><span class='pt9'>option</span><span class='pt1'>></span></td></tr>
<tr><td class='ln' data-ln='49'></td><td><span> </span><span class='pt1'><</span><span class='pt9'>option</span><span class='pt1'> </span><span class='pt6'>value</span><span class='pt1'>="</span><span class='pt4'>solarized_light</span><span class='pt1'>"></span><span>solarized light</span><span class='pt1'></</span><span class='pt9'>option</span><span class='pt1'>></span></td></tr>
<tr><td class='ln' data-ln='50'></td><td><span> </span><span class='pt1'><</span><span class='pt9'>option</span><span class='pt1'> </span><span class='pt6'>value</span><span class='pt1'>="</span><span class='pt4'>wombat</span><span class='pt1'>"></span><span>wombat</span><span class='pt1'></</span><span class='pt9'>option</span><span class='pt1'>></span></td></tr>
<tr><td class='ln' data-ln='51'></td><td><span> </span><span class='pt1'></</span><span class='pt9'>select</span><span class='pt1'>></span></td></tr>
<tr><td class='ln' data-ln='52'></td><td> </td></tr>
<tr><td class='ln' data-ln='53'></td><td><span> </span><span class='pt1'><</span><span class='pt9'>input</span><span class='pt1'> </span><span class='pt6'>id</span><span class='pt1'>="</span><span class='pt4'>highlight</span><span class='pt1'>" </span><span class='pt6'>type</span><span class='pt1'>="</span><span class='pt4'>checkbox</span><span class='pt1'>" /></span></td></tr>
<tr><td class='ln' data-ln='54'></td><td><span> </span><span class='pt1'><</span><span class='pt9'>label</span><span class='pt1'> </span><span class='pt6'>for</span><span class='pt1'>="</span><span class='pt4'>highlight</span><span class='pt1'>"><</span><span class='pt9'>nobr</span><span class='pt1'>></span><span>--highlight</span><span class='pt1'></</span><span class='pt9'>nobr</span><span class='pt1'>></</span><span class='pt9'>label</span><span class='pt1'>></span></td></tr>
<tr><td class='ln' data-ln='55'></td><td><span> </span><span class='pt1'></</span><span class='pt9'>div</span><span class='pt1'>></span></td></tr>
<tr><td class='ln' data-ln='56'></td><td> </td></tr>
<tr><td class='ln' data-ln='57'></td><td> </td></tr>
<tr><td class='ln' data-ln='58'></td><td><span> </span><span class='pt1'><</span><span class='pt9'>div</span><span class='pt1'> </span><span class='pt6'>id</span><span class='pt1'>="</span><span class='pt4'>highlighted</span><span class='pt1'>" </span><span class='pt6'>class</span><span class='pt1'>="</span><span class='pt4'>no-hi</span><span class='pt1'>" </span><span class='pt6'>data-style</span><span class='pt1'>="</span><span class='pt4'>github--rs</span><span class='pt1'>" </span><span class='pt6'>data-filetype</span><span class='pt1'>="</span><span class='pt4'>rs</span><span class='pt1'>"></span></td></tr>
<tr><td class='ln' data-ln='59'></td><td><span> </span><span class='pt1'></</span><span class='pt9'>div</span><span class='pt1'>></span><span> </span><span class='pt2'><!-- highlighted --></span></td></tr>
<tr><td class='ln' data-ln='60'></td><td> </td></tr>
<tr><td class='ln' data-ln='61'></td><td><span> </span><span class='pt1'><</span><span class='pt9'>div</span><span class='pt1'> </span><span class='pt6'>class</span><span class='pt1'>="</span><span class='pt4'>gh</span><span class='pt1'>"></span></td></tr>
<tr><td class='ln' data-ln='62'></td><td><span> </span><span class='pt1'><</span><span class='pt9'>a</span><span class='pt1'> </span><span class='pt6'>href</span><span class='pt1'>="</span><span class='pt4'>https://github.com/demille/paint</span><span class='pt1'>"></span></td></tr>
<tr><td class='ln' data-ln='63'></td><td><span> </span><span class='pt1'><</span><span class='pt9'>svg</span><span class='pt1'> </span><span class='pt6'>role</span><span class='pt1'>="</span><span class='pt4'>img</span><span class='pt1'>" </span><span class='pt6'>viewBox</span><span class='pt1'>="</span><span class='pt4'>0 0 24 24</span><span class='pt1'>" </span><span class='pt6'>xmlns</span><span class='pt1'>="</span><span class='pt4'>http://www.w3.org/2000/svg</span><span class='pt1'>"></span></td></tr>
<tr><td class='ln' data-ln='64'></td><td><span> </span><span class='pt1'><</span><span class='pt9'>path</span><span class='pt1'> </span><span class='pt6'>d</span><span class='pt1'>="</span><span class='pt4'>M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12</span><span class='pt1'>"/></span></td></tr>
<tr><td class='ln' data-ln='65'></td><td><span> </span><span class='pt1'></</span><span class='pt9'>svg</span><span class='pt1'>></span></td></tr>
<tr><td class='ln' data-ln='66'></td><td><span> </span><span class='pt1'><</span><span class='pt9'>span</span><span class='pt1'>></span><span>/demille/paint</span><span class='pt1'></</span><span class='pt9'>span</span><span class='pt1'>></span></td></tr>
<tr><td class='ln' data-ln='67'></td><td><span> </span><span class='pt1'></</span><span class='pt9'>a</span><span class='pt1'>></span></td></tr>
<tr><td class='ln' data-ln='68'></td><td><span> </span><span class='pt1'></</span><span class='pt9'>div</span><span class='pt1'>></span></td></tr>
<tr><td class='ln' data-ln='69'></td><td> </td></tr>
<tr><td class='ln' data-ln='70'></td><td><span> </span><span class='pt1'></</span><span class='pt9'>div</span><span class='pt1'>></span><span> </span><span class='pt2'><!-- container --></span></td></tr>
<tr><td class='ln' data-ln='71'></td><td> </td></tr>
<tr><td class='ln' data-ln='72'></td><td><span> </span><span class='pt1'><</span><span class='pt9'>div</span><span class='pt1'> </span><span class='pt6'>class</span><span class='pt1'>="</span><span class='pt4'>bg-overlay</span><span class='pt1'>"></</span><span class='pt9'>div</span><span class='pt1'>></span></td></tr>
<tr><td class='ln' data-ln='73'></td><td> </td></tr>
<tr><td class='ln' data-ln='74'></td><td><span> </span><span class='pt1'><</span><span class='pt9'>script</span><span class='pt1'> </span><span class='pt6'>src</span><span class='pt1'>="</span><span class='pt4'>main.js</span><span class='pt1'>"></</span><span class='pt9'>script</span><span class='pt1'>></span></td></tr>
<tr><td class='ln' data-ln='75'></td><td><span class='pt1'></</span><span class='pt9'>body</span><span class='pt1'>></span></td></tr>
<tr><td class='ln' data-ln='76'></td><td><span class='pt1'></</span><span class='pt9'>html</span><span class='pt1'>></span></td></tr>
</table>
</div>
</div>
</div>
<div class='style' id='P--one_dark--html'>
<div class='P--one_dark-bordered'>
<div class="info header">
<span class="left">index.html</span>
<span class="right"><span>76 lines</span><span>3.60 KB</span></span>
</div>
<div class='P--one_dark'>
<table>
<tr><td class='ln' data-ln='1'></td><td><span><!</span><span class='pt26'>DOCTYPE</span><span> html></span></td></tr>
<tr><td class='ln' data-ln='2'></td><td><span><</span><span class='pt26'>html</span><span>></span></td></tr>
<tr><td class='ln' data-ln='3'></td><td class='hi'><span><</span><span class='pt26'>head</span><span>></span></td></tr>
<tr><td class='ln' data-ln='4'></td><td class='hi'><span> <</span><span class='pt26'>meta</span><span> </span><span class='pt24'>charset</span><span class='pt17'>=</span><span class='pt12'>"</span><span class='pt13'>utf-8</span><span class='pt12'>"</span><span> /></span></td></tr>
<tr><td class='ln' data-ln='5'></td><td class='hi'><span> <</span><span class='pt26'>meta</span><span> </span><span class='pt24'>http-equiv</span><span class='pt17'>=</span><span class='pt12'>"</span><span class='pt13'>X-UA-Compatible</span><span class='pt12'>"</span><span> </span><span class='pt24'>content</span><span class='pt17'>=</span><span class='pt12'>"</span><span class='pt13'>IE=edge</span><span class='pt12'>"</span><span>></span></td></tr>
<tr><td class='ln' data-ln='6'></td><td class='hi'><span> <</span><span class='pt26'>title</span><span>>paint demo</</span><span class='pt26'>title</span><span>></span></td></tr>
<tr><td class='ln' data-ln='7'></td><td class='hi'><span> <</span><span class='pt26'>meta</span><span> </span><span class='pt24'>name</span><span class='pt17'>=</span><span class='pt12'>"</span><span class='pt13'>viewport</span><span class='pt12'>"</span><span> </span><span class='pt24'>content</span><span class='pt17'>=</span><span class='pt12'>"</span><span class='pt13'>width=device-width, initial-scale=1</span><span class='pt12'>"</span><span>></span></td></tr>
<tr><td class='ln' data-ln='8'></td><td class='hi'><span> <</span><span class='pt26'>link</span><span> </span><span class='pt24'>rel</span><span class='pt17'>=</span><span class='pt12'>"</span><span class='pt13'>stylesheet</span><span class='pt12'>"</span><span> </span><span class='pt24'>type</span><span class='pt17'>=</span><span class='pt12'>"</span><span class='pt13'>text/css</span><span class='pt12'>"</span><span> </span><span class='pt24'>media</span><span class='pt17'>=</span><span class='pt12'>"</span><span class='pt13'>screen</span><span class='pt12'>"</span><span> </span><span class='pt24'>href</span><span class='pt17'>=</span><span class='pt12'>"</span><span class='pt13'>main.css</span><span class='pt12'>"</span><span> /></span></td></tr>
<tr><td class='ln' data-ln='9'></td><td class='hi'><span> <</span><span class='pt26'>link</span><span> </span><span class='pt24'>rel</span><span class='pt17'>=</span><span class='pt12'>"</span><span class='pt13'>stylesheet</span><span class='pt12'>"</span><span> </span><span class='pt24'>type</span><span class='pt17'>=</span><span class='pt12'>"</span><span class='pt13'>text/css</span><span class='pt12'>"</span><span> </span><span class='pt24'>media</span><span class='pt17'>=</span><span class='pt12'>"</span><span class='pt13'>screen</span><span class='pt12'>"</span><span> </span><span class='pt24'>href</span><span class='pt17'>=</span><span class='pt12'>"</span><span class='pt13'>snippets.css</span><span class='pt12'>"</span><span> /></span></td></tr>
<tr><td class='ln' data-ln='10'></td><td class='hi'><span></</span><span class='pt26'>head</span><span>></span></td></tr>
<tr><td class='ln' data-ln='11'></td><td><span><</span><span class='pt26'>body</span><span>></span></td></tr>
<tr><td class='ln' data-ln='12'></td><td><span> <</span><span class='pt26'>div</span><span> </span><span class='pt24'>class</span><span class='pt17'>=</span><span class='pt12'>"</span><span class='pt13'>container</span><span class='pt12'>"</span><span>></span></td></tr>
<tr><td class='ln' data-ln='13'></td><td><span> <</span><span class='pt26'>div</span><span> </span><span class='pt24'>class</span><span class='pt17'>=</span><span class='pt12'>"</span><span class='pt13'>command</span><span class='pt12'>"</span><span>></span></td></tr>
<tr><td class='ln' data-ln='14'></td><td><span> <</span><span class='pt26'>h1</span><span>></span></td></tr>
<tr><td class='ln' data-ln='15'></td><td><span> <</span><span class='pt26'>span</span><span> </span><span class='pt24'>class</span><span class='pt17'>=</span><span class='pt12'>"</span><span class='pt13'>hue-rotate</span><span class='pt12'>"</span><span>>$</</span><span class='pt26'>span</span><span>> paint</span></td></tr>
<tr><td class='ln' data-ln='16'></td><td><span> ./file.<</span><span class='pt26'>span</span><span> </span><span class='pt9'>id</span><span class='pt17'>=</span><span class='pt12'>"</span><span class='pt13'>ext</span><span class='pt12'>"</span><span>>rs</</span><span class='pt26'>span</span><span>></span></td></tr>
<tr><td class='ln' data-ln='17'></td><td><span> <</span><span class='pt26'>nobr</span><span>>--style="<</span><span class='pt26'>span</span><span> </span><span class='pt9'>id</span><span class='pt17'>=</span><span class='pt12'>"</span><span class='pt13'>style-name</span><span class='pt12'>"</span><span>>github</</span><span class='pt26'>span</span><span>>"</</span><span class='pt26'>nobr</span><span>></span></td></tr>
<tr><td class='ln' data-ln='18'></td><td><span> <</span><span class='pt26'>nobr</span><span>>--gist-like</</span><span class='pt26'>nobr</span><span>></span></td></tr>
<tr><td class='ln' data-ln='19'></td><td><span> <</span><span class='pt26'>nobr</span><span>><</span><span class='pt26'>span</span><span> </span><span class='pt9'>id</span><span class='pt17'>=</span><span class='pt12'>"</span><span class='pt13'>lines</span><span class='pt12'>"</span><span>></</span><span class='pt26'>span</span><span>></</span><span class='pt26'>nobr</span><span>></span></td></tr>
<tr><td class='ln' data-ln='20'></td><td><span> </</span><span class='pt26'>h1</span><span>></span></td></tr>
<tr><td class='ln' data-ln='21'></td><td><span> </</span><span class='pt26'>div</span><span>></span></td></tr>
<tr><td class='ln' data-ln='22'></td><td> </td></tr>
<tr><td class='ln' data-ln='23'></td><td><span> <</span><span class='pt26'>div</span><span> </span><span class='pt24'>class</span><span class='pt17'>=</span><span class='pt12'>"</span><span class='pt13'>flex-centered</span><span class='pt12'>"</span><span>></span></td></tr>
<tr><td class='ln' data-ln='24'></td><td><span> <</span><span class='pt26'>select</span><span> </span><span class='pt9'>id</span><span class='pt17'>=</span><span class='pt12'>"</span><span class='pt13'>filetype</span><span class='pt12'>"</span><span>></span></td></tr>
<tr><td class='ln' data-ln='25'></td><td><span> <</span><span class='pt26'>option</span><span> </span><span class='pt24'>selected</span><span> </span><span class='pt24'>value</span><span class='pt17'>=</span><span class='pt12'>"</span><span class='pt13'>rs</span><span class='pt12'>"</span><span>>rust</</span><span class='pt26'>option</span><span>></span></td></tr>
<tr><td class='ln' data-ln='26'></td><td><span> <</span><span class='pt26'>option</span><span> </span><span class='pt24'>value</span><span class='pt17'>=</span><span class='pt12'>"</span><span class='pt13'>js</span><span class='pt12'>"</span><span>>javascript</</span><span class='pt26'>option</span><span>></span></td></tr>
<tr><td class='ln' data-ln='27'></td><td><span> <</span><span class='pt26'>option</span><span> </span><span class='pt24'>value</span><span class='pt17'>=</span><span class='pt12'>"</span><span class='pt13'>jsx</span><span class='pt12'>"</span><span>>jsx</</span><span class='pt26'>option</span><span>></span></td></tr>
<tr><td class='ln' data-ln='28'></td><td><span> <</span><span class='pt26'>option</span><span> </span><span class='pt24'>value</span><span class='pt17'>=</span><span class='pt12'>"</span><span class='pt13'>html</span><span class='pt12'>"</span><span>>html</</span><span class='pt26'>option</span><span>></span></td></tr>
<tr><td class='ln' data-ln='29'></td><td><span> <</span><span class='pt26'>option</span><span> </span><span class='pt24'>value</span><span class='pt17'>=</span><span class='pt12'>"</span><span class='pt13'>c</span><span class='pt12'>"</span><span>>c</</span><span class='pt26'>option</span><span>></span></td></tr>
<tr><td class='ln' data-ln='30'></td><td><span> <</span><span class='pt26'>option</span><span> </span><span class='pt24'>value</span><span class='pt17'>=</span><span class='pt12'>"</span><span class='pt13'>py</span><span class='pt12'>"</span><span>>python</</span><span class='pt26'>option</span><span>></span></td></tr>
<tr><td class='ln' data-ln='31'></td><td><span> <</span><span class='pt26'>option</span><span> </span><span class='pt24'>value</span><span class='pt17'>=</span><span class='pt12'>"</span><span class='pt13'>go</span><span class='pt12'>"</span><span>>go</</span><span class='pt26'>option</span><span>></span></td></tr>
<tr><td class='ln' data-ln='32'></td><td><span> </</span><span class='pt26'>select</span><span>></span></td></tr>
<tr><td class='ln' data-ln='33'></td><td> </td></tr>
<tr><td class='ln' data-ln='34'></td><td><span> <</span><span class='pt26'>select</span><span> </span><span class='pt9'>id</span><span class='pt17'>=</span><span class='pt12'>"</span><span class='pt13'>style</span><span class='pt12'>"</span><span>></span></td></tr>
<tr><td class='ln' data-ln='35'></td><td><span> <</span><span class='pt26'>option</span><span> </span><span class='pt24'>value</span><span class='pt17'>=</span><span class='pt12'>"</span><span class='pt13'>atom_dark</span><span class='pt12'>"</span><span>>atom dark</</span><span class='pt26'>option</span><span>></span></td></tr>
<tr><td class='ln' data-ln='36'></td><td><span> <</span><span class='pt26'>option</span><span> </span><span class='pt24'>value</span><span class='pt17'>=</span><span class='pt12'>"</span><span class='pt13'>ayu_dark</span><span class='pt12'>"</span><span>>ayu dark</</span><span class='pt26'>option</span><span>></span></td></tr>
<tr><td class='ln' data-ln='37'></td><td><span> <</span><span class='pt26'>option</span><span> </span><span class='pt24'>value</span><span class='pt17'>=</span><span class='pt12'>"</span><span class='pt13'>ayu_light</span><span class='pt12'>"</span><span>>ayu light</</span><span class='pt26'>option</span><span>></span></td></tr>
<tr><td class='ln' data-ln='38'></td><td><span> <</span><span class='pt26'>option</span><span> </span><span class='pt24'>value</span><span class='pt17'>=</span><span class='pt12'>"</span><span class='pt13'>ayu_mirage</span><span class='pt12'>"</span><span>>ayu mirage</</span><span class='pt26'>option</span><span>></span></td></tr>
<tr><td class='ln' data-ln='39'></td><td><span> <</span><span class='pt26'>option</span><span> </span><span class='pt24'>value</span><span class='pt17'>=</span><span class='pt12'>"</span><span class='pt13'>cobalt2</span><span class='pt12'>"</span><span>>cobalt2</</span><span class='pt26'>option</span><span>></span></td></tr>
<tr><td class='ln' data-ln='40'></td><td><span> <</span><span class='pt26'>option</span><span> </span><span class='pt24'>value</span><span class='pt17'>=</span><span class='pt12'>"</span><span class='pt13'>dracula</span><span class='pt12'>"</span><span>>dracula</</span><span class='pt26'>option</span><span>></span></td></tr>
<tr><td class='ln' data-ln='41'></td><td><span> <</span><span class='pt26'>option</span><span> </span><span class='pt24'>selected</span><span> </span><span class='pt24'>value</span><span class='pt17'>=</span><span class='pt12'>"</span><span class='pt13'>github</span><span class='pt12'>"</span><span>>github</</span><span class='pt26'>option</span><span>></span></td></tr>
<tr><td class='ln' data-ln='42'></td><td><span> <</span><span class='pt26'>option</span><span> </span><span class='pt24'>value</span><span class='pt17'>=</span><span class='pt12'>"</span><span class='pt13'>monokai_extended</span><span class='pt12'>"</span><span>>monokai extended</</span><span class='pt26'>option</span><span>></span></td></tr>
<tr><td class='ln' data-ln='43'></td><td><span> <</span><span class='pt26'>option</span><span> </span><span class='pt24'>value</span><span class='pt17'>=</span><span class='pt12'>"</span><span class='pt13'>oceanic_next</span><span class='pt12'>"</span><span>>oceanic next</</span><span class='pt26'>option</span><span>></span></td></tr>
<tr><td class='ln' data-ln='44'></td><td><span> <</span><span class='pt26'>option</span><span> </span><span class='pt24'>value</span><span class='pt17'>=</span><span class='pt12'>"</span><span class='pt13'>one_dark</span><span class='pt12'>"</span><span>>one dark</</span><span class='pt26'>option</span><span>></span></td></tr>
<tr><td class='ln' data-ln='45'></td><td><span> <</span><span class='pt26'>option</span><span> </span><span class='pt24'>value</span><span class='pt17'>=</span><span class='pt12'>"</span><span class='pt13'>one_light</span><span class='pt12'>"</span><span>>one light</</span><span class='pt26'>option</span><span>></span></td></tr>
<tr><td class='ln' data-ln='46'></td><td><span> <</span><span class='pt26'>option</span><span> </span><span class='pt24'>value</span><span class='pt17'>=</span><span class='pt12'>"</span><span class='pt13'>one_monokai</span><span class='pt12'>"</span><span>>one monokai</</span><span class='pt26'>option</span><span>></span></td></tr>
<tr><td class='ln' data-ln='47'></td><td><span> <</span><span class='pt26'>option</span><span> </span><span class='pt24'>value</span><span class='pt17'>=</span><span class='pt12'>"</span><span class='pt13'>predawn</span><span class='pt12'>"</span><span>>predawn</</span><span class='pt26'>option</span><span>></span></td></tr>
<tr><td class='ln' data-ln='48'></td><td><span> <</span><span class='pt26'>option</span><span> </span><span class='pt24'>value</span><span class='pt17'>=</span><span class='pt12'>"</span><span class='pt13'>solarized_dark</span><span class='pt12'>"</span><span>>solarized dark</</span><span class='pt26'>option</span><span>></span></td></tr>
<tr><td class='ln' data-ln='49'></td><td><span> <</span><span class='pt26'>option</span><span> </span><span class='pt24'>value</span><span class='pt17'>=</span><span class='pt12'>"</span><span class='pt13'>solarized_light</span><span class='pt12'>"</span><span>>solarized light</</span><span class='pt26'>option</span><span>></span></td></tr>
<tr><td class='ln' data-ln='50'></td><td><span> <</span><span class='pt26'>option</span><span> </span><span class='pt24'>value</span><span class='pt17'>=</span><span class='pt12'>"</span><span class='pt13'>wombat</span><span class='pt12'>"</span><span>>wombat</</span><span class='pt26'>option</span><span>></span></td></tr>
<tr><td class='ln' data-ln='51'></td><td><span> </</span><span class='pt26'>select</span><span>></span></td></tr>
<tr><td class='ln' data-ln='52'></td><td> </td></tr>
<tr><td class='ln' data-ln='53'></td><td><span> <</span><span class='pt26'>input</span><span> </span><span class='pt9'>id</span><span class='pt17'>=</span><span class='pt12'>"</span><span class='pt13'>highlight</span><span class='pt12'>"</span><span> </span><span class='pt24'>type</span><span class='pt17'>=</span><span class='pt12'>"</span><span class='pt13'>checkbox</span><span class='pt12'>"</span><span> /></span></td></tr>
<tr><td class='ln' data-ln='54'></td><td><span> <</span><span class='pt26'>label</span><span> </span><span class='pt24'>for</span><span class='pt17'>=</span><span class='pt12'>"</span><span class='pt13'>highlight</span><span class='pt12'>"</span><span>><</span><span class='pt26'>nobr</span><span>>--highlight</</span><span class='pt26'>nobr</span><span>></</span><span class='pt26'>label</span><span>></span></td></tr>
<tr><td class='ln' data-ln='55'></td><td><span> </</span><span class='pt26'>div</span><span>></span></td></tr>
<tr><td class='ln' data-ln='56'></td><td> </td></tr>
<tr><td class='ln' data-ln='57'></td><td> </td></tr>
<tr><td class='ln' data-ln='58'></td><td><span> <</span><span class='pt26'>div</span><span> </span><span class='pt9'>id</span><span class='pt17'>=</span><span class='pt12'>"</span><span class='pt13'>highlighted</span><span class='pt12'>"</span><span> </span><span class='pt24'>class</span><span class='pt17'>=</span><span class='pt12'>"</span><span class='pt13'>no-hi</span><span class='pt12'>"</span><span> </span><span class='pt24'>data-style</span><span class='pt17'>=</span><span class='pt12'>"</span><span class='pt13'>github--rs</span><span class='pt12'>"</span><span> </span><span class='pt24'>data-filetype</span><span class='pt17'>=</span><span class='pt12'>"</span><span class='pt13'>rs</span><span class='pt12'>"</span><span>></span></td></tr>
<tr><td class='ln' data-ln='59'></td><td><span> </</span><span class='pt26'>div</span><span>> </span><span class='pt11 it'><!-- highlighted --></span></td></tr>
<tr><td class='ln' data-ln='60'></td><td> </td></tr>
<tr><td class='ln' data-ln='61'></td><td><span> <</span><span class='pt26'>div</span><span> </span><span class='pt24'>class</span><span class='pt17'>=</span><span class='pt12'>"</span><span class='pt13'>gh</span><span class='pt12'>"</span><span>></span></td></tr>
<tr><td class='ln' data-ln='62'></td><td><span> <</span><span class='pt26'>a</span><span> </span><span class='pt24'>href</span><span class='pt17'>=</span><span class='pt12'>"</span><span class='pt13'>https://github.com/demille/paint</span><span class='pt12'>"</span><span>></span></td></tr>
<tr><td class='ln' data-ln='63'></td><td><span> <</span><span class='pt26'>svg</span><span> </span><span class='pt24'>role</span><span class='pt17'>=</span><span class='pt12'>"</span><span class='pt13'>img</span><span class='pt12'>"</span><span> </span><span class='pt24'>viewBox</span><span class='pt17'>=</span><span class='pt12'>"</span><span class='pt13'>0 0 24 24</span><span class='pt12'>"</span><span> </span><span class='pt24'>xmlns</span><span class='pt17'>=</span><span class='pt12'>"</span><span class='pt13'>http://www.w3.org/2000/svg</span><span class='pt12'>"</span><span>></span></td></tr>
<tr><td class='ln' data-ln='64'></td><td><span> <</span><span class='pt26'>path</span><span> </span><span class='pt24'>d</span><span class='pt17'>=</span><span class='pt12'>"</span><span class='pt13'>M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12</span><span class='pt12'>"</span><span>/></span></td></tr>
<tr><td class='ln' data-ln='65'></td><td><span> </</span><span class='pt26'>svg</span><span>></span></td></tr>
<tr><td class='ln' data-ln='66'></td><td><span> <</span><span class='pt26'>span</span><span>>/demille/paint</</span><span class='pt26'>span</span><span>></span></td></tr>
<tr><td class='ln' data-ln='67'></td><td><span> </</span><span class='pt26'>a</span><span>></span></td></tr>
<tr><td class='ln' data-ln='68'></td><td><span> </</span><span class='pt26'>div</span><span>></span></td></tr>
<tr><td class='ln' data-ln='69'></td><td> </td></tr>
<tr><td class='ln' data-ln='70'></td><td><span> </</span><span class='pt26'>div</span><span>> </span><span class='pt11 it'><!-- container --></span></td></tr>
<tr><td class='ln' data-ln='71'></td><td> </td></tr>
<tr><td class='ln' data-ln='72'></td><td><span> <</span><span class='pt26'>div</span><span> </span><span class='pt24'>class</span><span class='pt17'>=</span><span class='pt12'>"</span><span class='pt13'>bg-overlay</span><span class='pt12'>"</span><span>></</span><span class='pt26'>div</span><span>></span></td></tr>
<tr><td class='ln' data-ln='73'></td><td> </td></tr>
<tr><td class='ln' data-ln='74'></td><td><span> <</span><span class='pt26'>script</span><span> </span><span class='pt24'>src</span><span class='pt17'>=</span><span class='pt12'>"</span><span class='pt13'>main.js</span><span class='pt12'>"</span><span>></</span><span class='pt26'>script</span><span>></span></td></tr>
<tr><td class='ln' data-ln='75'></td><td><span></</span><span class='pt26'>body</span><span>></span></td></tr>
<tr><td class='ln' data-ln='76'></td><td><span></</span><span class='pt26'>html</span><span>></span></td></tr>
</table>
</div>
</div>
</div>
<div class='style' id='P--one_light--html'>
<div class='P--one_light-bordered'>
<div class="info header">
<span class="left">index.html</span>
<span class="right"><span>76 lines</span><span>3.60 KB</span></span>
</div>
<div class='P--one_light'>
<table>
<tr><td class='ln' data-ln='1'></td><td><span><!</span><span class='pt17'>DOCTYPE</span><span> html></span></td></tr>
<tr><td class='ln' data-ln='2'></td><td><span><</span><span class='pt17'>html</span><span>></span></td></tr>
<tr><td class='ln' data-ln='3'></td><td class='hi'><span><</span><span class='pt17'>head</span><span>></span></td></tr>
<tr><td class='ln' data-ln='4'></td><td class='hi'><span> <</span><span class='pt17'>meta</span><span> </span><span class='pt12'>charset</span><span>=</span><span class='pt8'>"utf-8"</span><span> /></span></td></tr>
<tr><td class='ln' data-ln='5'></td><td class='hi'><span> <</span><span class='pt17'>meta</span><span> </span><span class='pt12'>http-equiv</span><span>=</span><span class='pt8'>"X-UA-Compatible"</span><span> </span><span class='pt12'>content</span><span>=</span><span class='pt8'>"IE=edge"</span><span>></span></td></tr>
<tr><td class='ln' data-ln='6'></td><td class='hi'><span> <</span><span class='pt17'>title</span><span>>paint demo</</span><span class='pt17'>title</span><span>></span></td></tr>
<tr><td class='ln' data-ln='7'></td><td class='hi'><span> <</span><span class='pt17'>meta</span><span> </span><span class='pt12'>name</span><span>=</span><span class='pt8'>"viewport"</span><span> </span><span class='pt12'>content</span><span>=</span><span class='pt8'>"width=device-width, initial-scale=1"</span><span>></span></td></tr>
<tr><td class='ln' data-ln='8'></td><td class='hi'><span> <</span><span class='pt17'>link</span><span> </span><span class='pt12'>rel</span><span>=</span><span class='pt8'>"stylesheet"</span><span> </span><span class='pt12'>type</span><span>=</span><span class='pt8'>"text/css"</span><span> </span><span class='pt12'>media</span><span>=</span><span class='pt8'>"screen"</span><span> </span><span class='pt12'>href</span><span>=</span><span class='pt8'>"main.css"</span><span> /></span></td></tr>
<tr><td class='ln' data-ln='9'></td><td class='hi'><span> <</span><span class='pt17'>link</span><span> </span><span class='pt12'>rel</span><span>=</span><span class='pt8'>"stylesheet"</span><span> </span><span class='pt12'>type</span><span>=</span><span class='pt8'>"text/css"</span><span> </span><span class='pt12'>media</span><span>=</span><span class='pt8'>"screen"</span><span> </span><span class='pt12'>href</span><span>=</span><span class='pt8'>"snippets.css"</span><span> /></span></td></tr>
<tr><td class='ln' data-ln='10'></td><td class='hi'><span></</span><span class='pt17'>head</span><span>></span></td></tr>
<tr><td class='ln' data-ln='11'></td><td><span><</span><span class='pt17'>body</span><span>></span></td></tr>
<tr><td class='ln' data-ln='12'></td><td><span> <</span><span class='pt17'>div</span><span> </span><span class='pt12'>class</span><span>=</span><span class='pt8'>"container"</span><span>></span></td></tr>
<tr><td class='ln' data-ln='13'></td><td><span> <</span><span class='pt17'>div</span><span> </span><span class='pt12'>class</span><span>=</span><span class='pt8'>"command"</span><span>></span></td></tr>
<tr><td class='ln' data-ln='14'></td><td><span> <</span><span class='pt17'>h1</span><span>></span></td></tr>
<tr><td class='ln' data-ln='15'></td><td><span> <</span><span class='pt17'>span</span><span> </span><span class='pt12'>class</span><span>=</span><span class='pt8'>"hue-rotate"</span><span>>$</</span><span class='pt17'>span</span><span>> paint</span></td></tr>
<tr><td class='ln' data-ln='16'></td><td><span> ./file.<</span><span class='pt17'>span</span><span> </span><span class='pt7'>id</span><span>=</span><span class='pt8'>"ext"</span><span>>rs</</span><span class='pt17'>span</span><span>></span></td></tr>
<tr><td class='ln' data-ln='17'></td><td><span> <</span><span class='pt17'>nobr</span><span>>--style="<</span><span class='pt17'>span</span><span> </span><span class='pt7'>id</span><span>=</span><span class='pt8'>"style-name"</span><span>>github</</span><span class='pt17'>span</span><span>>"</</span><span class='pt17'>nobr</span><span>></span></td></tr>
<tr><td class='ln' data-ln='18'></td><td><span> <</span><span class='pt17'>nobr</span><span>>--gist-like</</span><span class='pt17'>nobr</span><span>></span></td></tr>
<tr><td class='ln' data-ln='19'></td><td><span> <</span><span class='pt17'>nobr</span><span>><</span><span class='pt17'>span</span><span> </span><span class='pt7'>id</span><span>=</span><span class='pt8'>"lines"</span><span>></</span><span class='pt17'>span</span><span>></</span><span class='pt17'>nobr</span><span>></span></td></tr>
<tr><td class='ln' data-ln='20'></td><td><span> </</span><span class='pt17'>h1</span><span>></span></td></tr>
<tr><td class='ln' data-ln='21'></td><td><span> </</span><span class='pt17'>div</span><span>></span></td></tr>
<tr><td class='ln' data-ln='22'></td><td> </td></tr>
<tr><td class='ln' data-ln='23'></td><td><span> <</span><span class='pt17'>div</span><span> </span><span class='pt12'>class</span><span>=</span><span class='pt8'>"flex-centered"</span><span>></span></td></tr>
<tr><td class='ln' data-ln='24'></td><td><span> <</span><span class='pt17'>select</span><span> </span><span class='pt7'>id</span><span>=</span><span class='pt8'>"filetype"</span><span>></span></td></tr>
<tr><td class='ln' data-ln='25'></td><td><span> <</span><span class='pt17'>option</span><span> </span><span class='pt12'>selected</span><span> </span><span class='pt12'>value</span><span>=</span><span class='pt8'>"rs"</span><span>>rust</</span><span class='pt17'>option</span><span>></span></td></tr>
<tr><td class='ln' data-ln='26'></td><td><span> <</span><span class='pt17'>option</span><span> </span><span class='pt12'>value</span><span>=</span><span class='pt8'>"js"</span><span>>javascript</</span><span class='pt17'>option</span><span>></span></td></tr>
<tr><td class='ln' data-ln='27'></td><td><span> <</span><span class='pt17'>option</span><span> </span><span class='pt12'>value</span><span>=</span><span class='pt8'>"jsx"</span><span>>jsx</</span><span class='pt17'>option</span><span>></span></td></tr>
<tr><td class='ln' data-ln='28'></td><td><span> <</span><span class='pt17'>option</span><span> </span><span class='pt12'>value</span><span>=</span><span class='pt8'>"html"</span><span>>html</</span><span class='pt17'>option</span><span>></span></td></tr>
<tr><td class='ln' data-ln='29'></td><td><span> <</span><span class='pt17'>option</span><span> </span><span class='pt12'>value</span><span>=</span><span class='pt8'>"c"</span><span>>c</</span><span class='pt17'>option</span><span>></span></td></tr>
<tr><td class='ln' data-ln='30'></td><td><span> <</span><span class='pt17'>option</span><span> </span><span class='pt12'>value</span><span>=</span><span class='pt8'>"py"</span><span>>python</</span><span class='pt17'>option</span><span>></span></td></tr>
<tr><td class='ln' data-ln='31'></td><td><span> <</span><span class='pt17'>option</span><span> </span><span class='pt12'>value</span><span>=</span><span class='pt8'>"go"</span><span>>go</</span><span class='pt17'>option</span><span>></span></td></tr>
<tr><td class='ln' data-ln='32'></td><td><span> </</span><span class='pt17'>select</span><span>></span></td></tr>
<tr><td class='ln' data-ln='33'></td><td> </td></tr>
<tr><td class='ln' data-ln='34'></td><td><span> <</span><span class='pt17'>select</span><span> </span><span class='pt7'>id</span><span>=</span><span class='pt8'>"style"</span><span>></span></td></tr>
<tr><td class='ln' data-ln='35'></td><td><span> <</span><span class='pt17'>option</span><span> </span><span class='pt12'>value</span><span>=</span><span class='pt8'>"atom_dark"</span><span>>atom dark</</span><span class='pt17'>option</span><span>></span></td></tr>
<tr><td class='ln' data-ln='36'></td><td><span> <</span><span class='pt17'>option</span><span> </span><span class='pt12'>value</span><span>=</span><span class='pt8'>"ayu_dark"</span><span>>ayu dark</</span><span class='pt17'>option</span><span>></span></td></tr>
<tr><td class='ln' data-ln='37'></td><td><span> <</span><span class='pt17'>option</span><span> </span><span class='pt12'>value</span><span>=</span><span class='pt8'>"ayu_light"</span><span>>ayu light</</span><span class='pt17'>option</span><span>></span></td></tr>
<tr><td class='ln' data-ln='38'></td><td><span> <</span><span class='pt17'>option</span><span> </span><span class='pt12'>value</span><span>=</span><span class='pt8'>"ayu_mirage"</span><span>>ayu mirage</</span><span class='pt17'>option</span><span>></span></td></tr>
<tr><td class='ln' data-ln='39'></td><td><span> <</span><span class='pt17'>option</span><span> </span><span class='pt12'>value</span><span>=</span><span class='pt8'>"cobalt2"</span><span>>cobalt2</</span><span class='pt17'>option</span><span>></span></td></tr>
<tr><td class='ln' data-ln='40'></td><td><span> <</span><span class='pt17'>option</span><span> </span><span class='pt12'>value</span><span>=</span><span class='pt8'>"dracula"</span><span>>dracula</</span><span class='pt17'>option</span><span>></span></td></tr>
<tr><td class='ln' data-ln='41'></td><td><span> <</span><span class='pt17'>option</span><span> </span><span class='pt12'>selected</span><span> </span><span class='pt12'>value</span><span>=</span><span class='pt8'>"github"</span><span>>github</</span><span class='pt17'>option</span><span>></span></td></tr>
<tr><td class='ln' data-ln='42'></td><td><span> <</span><span class='pt17'>option</span><span> </span><span class='pt12'>value</span><span>=</span><span class='pt8'>"monokai_extended"</span><span>>monokai extended</</span><span class='pt17'>option</span><span>></span></td></tr>
<tr><td class='ln' data-ln='43'></td><td><span> <</span><span class='pt17'>option</span><span> </span><span class='pt12'>value</span><span>=</span><span class='pt8'>"oceanic_next"</span><span>>oceanic next</</span><span class='pt17'>option</span><span>></span></td></tr>
<tr><td class='ln' data-ln='44'></td><td><span> <</span><span class='pt17'>option</span><span> </span><span class='pt12'>value</span><span>=</span><span class='pt8'>"one_dark"</span><span>>one dark</</span><span class='pt17'>option</span><span>></span></td></tr>
<tr><td class='ln' data-ln='45'></td><td><span> <</span><span class='pt17'>option</span><span> </span><span class='pt12'>value</span><span>=</span><span class='pt8'>"one_light"</span><span>>one light</</span><span class='pt17'>option</span><span>></span></td></tr>
<tr><td class='ln' data-ln='46'></td><td><span> <</span><span class='pt17'>option</span><span> </span><span class='pt12'>value</span><span>=</span><span class='pt8'>"one_monokai"</span><span>>one monokai</</span><span class='pt17'>option</span><span>></span></td></tr>
<tr><td class='ln' data-ln='47'></td><td><span> <</span><span class='pt17'>option</span><span> </span><span class='pt12'>value</span><span>=</span><span class='pt8'>"predawn"</span><span>>predawn</</span><span class='pt17'>option</span><span>></span></td></tr>
<tr><td class='ln' data-ln='48'></td><td><span> <</span><span class='pt17'>option</span><span> </span><span class='pt12'>value</span><span>=</span><span class='pt8'>"solarized_dark"</span><span>>solarized dark</</span><span class='pt17'>option</span><span>></span></td></tr>
<tr><td class='ln' data-ln='49'></td><td><span> <</span><span class='pt17'>option</span><span> </span><span class='pt12'>value</span><span>=</span><span class='pt8'>"solarized_light"</span><span>>solarized light</</span><span class='pt17'>option</span><span>></span></td></tr>
<tr><td class='ln' data-ln='50'></td><td><span> <</span><span class='pt17'>option</span><span> </span><span class='pt12'>value</span><span>=</span><span class='pt8'>"wombat"</span><span>>wombat</</span><span class='pt17'>option</span><span>></span></td></tr>
<tr><td class='ln' data-ln='51'></td><td><span> </</span><span class='pt17'>select</span><span>></span></td></tr>
<tr><td class='ln' data-ln='52'></td><td> </td></tr>
<tr><td class='ln' data-ln='53'></td><td><span> <</span><span class='pt17'>input</span><span> </span><span class='pt7'>id</span><span>=</span><span class='pt8'>"highlight"</span><span> </span><span class='pt12'>type</span><span>=</span><span class='pt8'>"checkbox"</span><span> /></span></td></tr>
<tr><td class='ln' data-ln='54'></td><td><span> <</span><span class='pt17'>label</span><span> </span><span class='pt12'>for</span><span>=</span><span class='pt8'>"highlight"</span><span>><</span><span class='pt17'>nobr</span><span>>--highlight</</span><span class='pt17'>nobr</span><span>></</span><span class='pt17'>label</span><span>></span></td></tr>
<tr><td class='ln' data-ln='55'></td><td><span> </</span><span class='pt17'>div</span><span>></span></td></tr>
<tr><td class='ln' data-ln='56'></td><td> </td></tr>
<tr><td class='ln' data-ln='57'></td><td> </td></tr>
<tr><td class='ln' data-ln='58'></td><td><span> <</span><span class='pt17'>div</span><span> </span><span class='pt7'>id</span><span>=</span><span class='pt8'>"highlighted"</span><span> </span><span class='pt12'>class</span><span>=</span><span class='pt8'>"no-hi"</span><span> </span><span class='pt12'>data-style</span><span>=</span><span class='pt8'>"github--rs"</span><span> </span><span class='pt12'>data-filetype</span><span>=</span><span class='pt8'>"rs"</span><span>></span></td></tr>
<tr><td class='ln' data-ln='59'></td><td><span> </</span><span class='pt17'>div</span><span>> </span><span class='pt13 it'><!-- highlighted --></span></td></tr>
<tr><td class='ln' data-ln='60'></td><td> </td></tr>
<tr><td class='ln' data-ln='61'></td><td><span> <</span><span class='pt17'>div</span><span> </span><span class='pt12'>class</span><span>=</span><span class='pt8'>"gh"</span><span>></span></td></tr>
<tr><td class='ln' data-ln='62'></td><td><span> <</span><span class='pt17'>a</span><span> </span><span class='pt12'>href</span><span>=</span><span class='pt8'>"https://github.com/demille/paint"</span><span>></span></td></tr>
<tr><td class='ln' data-ln='63'></td><td><span> <</span><span class='pt17'>svg</span><span> </span><span class='pt12'>role</span><span>=</span><span class='pt8'>"img"</span><span> </span><span class='pt12'>viewBox</span><span>=</span><span class='pt8'>"0 0 24 24"</span><span> </span><span class='pt12'>xmlns</span><span>=</span><span class='pt8'>"http://www.w3.org/2000/svg"</span><span>></span></td></tr>
<tr><td class='ln' data-ln='64'></td><td><span> <</span><span class='pt17'>path</span><span> </span><span class='pt12'>d</span><span>=</span><span class='pt8'>"M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12"</span><span>/></span></td></tr>
<tr><td class='ln' data-ln='65'></td><td><span> </</span><span class='pt17'>svg</span><span>></span></td></tr>
<tr><td class='ln' data-ln='66'></td><td><span> <</span><span class='pt17'>span</span><span>>/demille/paint</</span><span class='pt17'>span</span><span>></span></td></tr>
<tr><td class='ln' data-ln='67'></td><td><span> </</span><span class='pt17'>a</span><span>></span></td></tr>
<tr><td class='ln' data-ln='68'></td><td><span> </</span><span class='pt17'>div</span><span>></span></td></tr>
<tr><td class='ln' data-ln='69'></td><td> </td></tr>
<tr><td class='ln' data-ln='70'></td><td><span> </</span><span class='pt17'>div</span><span>> </span><span class='pt13 it'><!-- container --></span></td></tr>
<tr><td class='ln' data-ln='71'></td><td> </td></tr>
<tr><td class='ln' data-ln='72'></td><td><span> <</span><span class='pt17'>div</span><span> </span><span class='pt12'>class</span><span>=</span><span class='pt8'>"bg-overlay"</span><span>></</span><span class='pt17'>div</span><span>></span></td></tr>
<tr><td class='ln' data-ln='73'></td><td> </td></tr>
<tr><td class='ln' data-ln='74'></td><td><span> <</span><span class='pt17'>script</span><span> </span><span class='pt12'>src</span><span>=</span><span class='pt8'>"main.js"</span><span>></</span><span class='pt17'>script</span><span>></span></td></tr>
<tr><td class='ln' data-ln='75'></td><td><span></</span><span class='pt17'>body</span><span>></span></td></tr>
<tr><td class='ln' data-ln='76'></td><td><span></</span><span class='pt17'>html</span><span>></span></td></tr>
</table>
</div>
</div>
</div>
<div class='style' id='P--one_monokai--html'>
<div class='P--one_monokai-bordered'>
<div class="info header">
<span class="left">index.html</span>
<span class="right"><span>76 lines</span><span>3.60 KB</span></span>
</div>
<div class='P--one_monokai'>
<table>
<tr><td class='ln' data-ln='1'></td><td><span><!</span><span class='pt10'>DOCTYPE</span><span> html></span></td></tr>
<tr><td class='ln' data-ln='2'></td><td><span><</span><span class='pt10'>html</span><span>></span></td></tr>
<tr><td class='ln' data-ln='3'></td><td class='hi'><span><</span><span class='pt10'>head</span><span>></span></td></tr>
<tr><td class='ln' data-ln='4'></td><td class='hi'><span> <</span><span class='pt10'>meta</span><span> </span><span class='pt7'>charset</span><span>=</span><span class='pt11'>"utf-8"</span><span> /></span></td></tr>
<tr><td class='ln' data-ln='5'></td><td class='hi'><span> <</span><span class='pt10'>meta</span><span> </span><span class='pt7'>http-equiv</span><span>=</span><span class='pt11'>"X-UA-Compatible"</span><span> </span><span class='pt7'>content</span><span>=</span><span class='pt11'>"IE=edge"</span><span>></span></td></tr>
<tr><td class='ln' data-ln='6'></td><td class='hi'><span> <</span><span class='pt10'>title</span><span>>paint demo</</span><span class='pt10'>title</span><span>></span></td></tr>
<tr><td class='ln' data-ln='7'></td><td class='hi'><span> <</span><span class='pt10'>meta</span><span> </span><span class='pt7'>name</span><span>=</span><span class='pt11'>"viewport"</span><span> </span><span class='pt7'>content</span><span>=</span><span class='pt11'>"width=device-width, initial-scale=1"</span><span>></span></td></tr>
<tr><td class='ln' data-ln='8'></td><td class='hi'><span> <</span><span class='pt10'>link</span><span> </span><span class='pt7'>rel</span><span>=</span><span class='pt11'>"stylesheet"</span><span> </span><span class='pt7'>type</span><span>=</span><span class='pt11'>"text/css"</span><span> </span><span class='pt7'>media</span><span>=</span><span class='pt11'>"screen"</span><span> </span><span class='pt7'>href</span><span>=</span><span class='pt11'>"main.css"</span><span> /></span></td></tr>
<tr><td class='ln' data-ln='9'></td><td class='hi'><span> <</span><span class='pt10'>link</span><span> </span><span class='pt7'>rel</span><span>=</span><span class='pt11'>"stylesheet"</span><span> </span><span class='pt7'>type</span><span>=</span><span class='pt11'>"text/css"</span><span> </span><span class='pt7'>media</span><span>=</span><span class='pt11'>"screen"</span><span> </span><span class='pt7'>href</span><span>=</span><span class='pt11'>"snippets.css"</span><span> /></span></td></tr>
<tr><td class='ln' data-ln='10'></td><td class='hi'><span></</span><span class='pt10'>head</span><span>></span></td></tr>
<tr><td class='ln' data-ln='11'></td><td><span><</span><span class='pt10'>body</span><span>></span></td></tr>
<tr><td class='ln' data-ln='12'></td><td><span> <</span><span class='pt10'>div</span><span> </span><span class='pt7'>class</span><span>=</span><span class='pt11'>"container"</span><span>></span></td></tr>
<tr><td class='ln' data-ln='13'></td><td><span> <</span><span class='pt10'>div</span><span> </span><span class='pt7'>class</span><span>=</span><span class='pt11'>"command"</span><span>></span></td></tr>
<tr><td class='ln' data-ln='14'></td><td><span> <</span><span class='pt10'>h1</span><span>></span></td></tr>
<tr><td class='ln' data-ln='15'></td><td><span> <</span><span class='pt10'>span</span><span> </span><span class='pt7'>class</span><span>=</span><span class='pt11'>"hue-rotate"</span><span>>$</</span><span class='pt10'>span</span><span>> paint</span></td></tr>
<tr><td class='ln' data-ln='16'></td><td><span> ./file.<</span><span class='pt10'>span</span><span> </span><span class='pt7'>id</span><span>=</span><span class='pt11'>"ext"</span><span>>rs</</span><span class='pt10'>span</span><span>></span></td></tr>
<tr><td class='ln' data-ln='17'></td><td><span> <</span><span class='pt10'>nobr</span><span>>--style="<</span><span class='pt10'>span</span><span> </span><span class='pt7'>id</span><span>=</span><span class='pt11'>"style-name"</span><span>>github</</span><span class='pt10'>span</span><span>>"</</span><span class='pt10'>nobr</span><span>></span></td></tr>
<tr><td class='ln' data-ln='18'></td><td><span> <</span><span class='pt10'>nobr</span><span>>--gist-like</</span><span class='pt10'>nobr</span><span>></span></td></tr>
<tr><td class='ln' data-ln='19'></td><td><span> <</span><span class='pt10'>nobr</span><span>><</span><span class='pt10'>span</span><span> </span><span class='pt7'>id</span><span>=</span><span class='pt11'>"lines"</span><span>></</span><span class='pt10'>span</span><span>></</span><span class='pt10'>nobr</span><span>></span></td></tr>
<tr><td class='ln' data-ln='20'></td><td><span> </</span><span class='pt10'>h1</span><span>></span></td></tr>
<tr><td class='ln' data-ln='21'></td><td><span> </</span><span class='pt10'>div</span><span>></span></td></tr>
<tr><td class='ln' data-ln='22'></td><td> </td></tr>
<tr><td class='ln' data-ln='23'></td><td><span> <</span><span class='pt10'>div</span><span> </span><span class='pt7'>class</span><span>=</span><span class='pt11'>"flex-centered"</span><span>></span></td></tr>
<tr><td class='ln' data-ln='24'></td><td><span> <</span><span class='pt10'>select</span><span> </span><span class='pt7'>id</span><span>=</span><span class='pt11'>"filetype"</span><span>></span></td></tr>
<tr><td class='ln' data-ln='25'></td><td><span> <</span><span class='pt10'>option</span><span> </span><span class='pt7'>selected</span><span> </span><span class='pt7'>value</span><span>=</span><span class='pt11'>"rs"</span><span>>rust</</span><span class='pt10'>option</span><span>></span></td></tr>
<tr><td class='ln' data-ln='26'></td><td><span> <</span><span class='pt10'>option</span><span> </span><span class='pt7'>value</span><span>=</span><span class='pt11'>"js"</span><span>>javascript</</span><span class='pt10'>option</span><span>></span></td></tr>
<tr><td class='ln' data-ln='27'></td><td><span> <</span><span class='pt10'>option</span><span> </span><span class='pt7'>value</span><span>=</span><span class='pt11'>"jsx"</span><span>>jsx</</span><span class='pt10'>option</span><span>></span></td></tr>
<tr><td class='ln' data-ln='28'></td><td><span> <</span><span class='pt10'>option</span><span> </span><span class='pt7'>value</span><span>=</span><span class='pt11'>"html"</span><span>>html</</span><span class='pt10'>option</span><span>></span></td></tr>
<tr><td class='ln' data-ln='29'></td><td><span> <</span><span class='pt10'>option</span><span> </span><span class='pt7'>value</span><span>=</span><span class='pt11'>"c"</span><span>>c</</span><span class='pt10'>option</span><span>></span></td></tr>
<tr><td class='ln' data-ln='30'></td><td><span> <</span><span class='pt10'>option</span><span> </span><span class='pt7'>value</span><span>=</span><span class='pt11'>"py"</span><span>>python</</span><span class='pt10'>option</span><span>></span></td></tr>
<tr><td class='ln' data-ln='31'></td><td><span> <</span><span class='pt10'>option</span><span> </span><span class='pt7'>value</span><span>=</span><span class='pt11'>"go"</span><span>>go</</span><span class='pt10'>option</span><span>></span></td></tr>
<tr><td class='ln' data-ln='32'></td><td><span> </</span><span class='pt10'>select</span><span>></span></td></tr>
<tr><td class='ln' data-ln='33'></td><td> </td></tr>
<tr><td class='ln' data-ln='34'></td><td><span> <</span><span class='pt10'>select</span><span> </span><span class='pt7'>id</span><span>=</span><span class='pt11'>"style"</span><span>></span></td></tr>
<tr><td class='ln' data-ln='35'></td><td><span> <</span><span class='pt10'>option</span><span> </span><span class='pt7'>value</span><span>=</span><span class='pt11'>"atom_dark"</span><span>>atom dark</</span><span class='pt10'>option</span><span>></span></td></tr>
<tr><td class='ln' data-ln='36'></td><td><span> <</span><span class='pt10'>option</span><span> </span><span class='pt7'>value</span><span>=</span><span class='pt11'>"ayu_dark"</span><span>>ayu dark</</span><span class='pt10'>option</span><span>></span></td></tr>
<tr><td class='ln' data-ln='37'></td><td><span> <</span><span class='pt10'>option</span><span> </span><span class='pt7'>value</span><span>=</span><span class='pt11'>"ayu_light"</span><span>>ayu light</</span><span class='pt10'>option</span><span>></span></td></tr>
<tr><td class='ln' data-ln='38'></td><td><span> <</span><span class='pt10'>option</span><span> </span><span class='pt7'>value</span><span>=</span><span class='pt11'>"ayu_mirage"</span><span>>ayu mirage</</span><span class='pt10'>option</span><span>></span></td></tr>
<tr><td class='ln' data-ln='39'></td><td><span> <</span><span class='pt10'>option</span><span> </span><span class='pt7'>value</span><span>=</span><span class='pt11'>"cobalt2"</span><span>>cobalt2</</span><span class='pt10'>option</span><span>></span></td></tr>
<tr><td class='ln' data-ln='40'></td><td><span> <</span><span class='pt10'>option</span><span> </span><span class='pt7'>value</span><span>=</span><span class='pt11'>"dracula"</span><span>>dracula</</span><span class='pt10'>option</span><span>></span></td></tr>
<tr><td class='ln' data-ln='41'></td><td><span> <</span><span class='pt10'>option</span><span> </span><span class='pt7'>selected</span><span> </span><span class='pt7'>value</span><span>=</span><span class='pt11'>"github"</span><span>>github</</span><span class='pt10'>option</span><span>></span></td></tr>
<tr><td class='ln' data-ln='42'></td><td><span> <</span><span class='pt10'>option</span><span> </span><span class='pt7'>value</span><span>=</span><span class='pt11'>"monokai_extended"</span><span>>monokai extended</</span><span class='pt10'>option</span><span>></span></td></tr>
<tr><td class='ln' data-ln='43'></td><td><span> <</span><span class='pt10'>option</span><span> </span><span class='pt7'>value</span><span>=</span><span class='pt11'>"oceanic_next"</span><span>>oceanic next</</span><span class='pt10'>option</span><span>></span></td></tr>
<tr><td class='ln' data-ln='44'></td><td><span> <</span><span class='pt10'>option</span><span> </span><span class='pt7'>value</span><span>=</span><span class='pt11'>"one_dark"</span><span>>one dark</</span><span class='pt10'>option</span><span>></span></td></tr>
<tr><td class='ln' data-ln='45'></td><td><span> <</span><span class='pt10'>option</span><span> </span><span class='pt7'>value</span><span>=</span><span class='pt11'>"one_light"</span><span>>one light</</span><span class='pt10'>option</span><span>></span></td></tr>
<tr><td class='ln' data-ln='46'></td><td><span> <</span><span class='pt10'>option</span><span> </span><span class='pt7'>value</span><span>=</span><span class='pt11'>"one_monokai"</span><span>>one monokai</</span><span class='pt10'>option</span><span>></span></td></tr>
<tr><td class='ln' data-ln='47'></td><td><span> <</span><span class='pt10'>option</span><span> </span><span class='pt7'>value</span><span>=</span><span class='pt11'>"predawn"</span><span>>predawn</</span><span class='pt10'>option</span><span>></span></td></tr>
<tr><td class='ln' data-ln='48'></td><td><span> <</span><span class='pt10'>option</span><span> </span><span class='pt7'>value</span><span>=</span><span class='pt11'>"solarized_dark"</span><span>>solarized dark</</span><span class='pt10'>option</span><span>></span></td></tr>
<tr><td class='ln' data-ln='49'></td><td><span> <</span><span class='pt10'>option</span><span> </span><span class='pt7'>value</span><span>=</span><span class='pt11'>"solarized_light"</span><span>>solarized light</</span><span class='pt10'>option</span><span>></span></td></tr>
<tr><td class='ln' data-ln='50'></td><td><span> <</span><span class='pt10'>option</span><span> </span><span class='pt7'>value</span><span>=</span><span class='pt11'>"wombat"</span><span>>wombat</</span><span class='pt10'>option</span><span>></span></td></tr>
<tr><td class='ln' data-ln='51'></td><td><span> </</span><span class='pt10'>select</span><span>></span></td></tr>
<tr><td class='ln' data-ln='52'></td><td> </td></tr>
<tr><td class='ln' data-ln='53'></td><td><span> <</span><span class='pt10'>input</span><span> </span><span class='pt7'>id</span><span>=</span><span class='pt11'>"highlight"</span><span> </span><span class='pt7'>type</span><span>=</span><span class='pt11'>"checkbox"</span><span> /></span></td></tr>
<tr><td class='ln' data-ln='54'></td><td><span> <</span><span class='pt10'>label</span><span> </span><span class='pt7'>for</span><span>=</span><span class='pt11'>"highlight"</span><span>><</span><span class='pt10'>nobr</span><span>>--highlight</</span><span class='pt10'>nobr</span><span>></</span><span class='pt10'>label</span><span>></span></td></tr>
<tr><td class='ln' data-ln='55'></td><td><span> </</span><span class='pt10'>div</span><span>></span></td></tr>
<tr><td class='ln' data-ln='56'></td><td> </td></tr>
<tr><td class='ln' data-ln='57'></td><td> </td></tr>
<tr><td class='ln' data-ln='58'></td><td><span> <</span><span class='pt10'>div</span><span> </span><span class='pt7'>id</span><span>=</span><span class='pt11'>"highlighted"</span><span> </span><span class='pt7'>class</span><span>=</span><span class='pt11'>"no-hi"</span><span> </span><span class='pt7'>data-style</span><span>=</span><span class='pt11'>"github--rs"</span><span> </span><span class='pt7'>data-filetype</span><span>=</span><span class='pt11'>"rs"</span><span>></span></td></tr>
<tr><td class='ln' data-ln='59'></td><td><span> </</span><span class='pt10'>div</span><span>> </span><span class='pt4 it'><!-- highlighted --></span></td></tr>
<tr><td class='ln' data-ln='60'></td><td> </td></tr>
<tr><td class='ln' data-ln='61'></td><td><span> <</span><span class='pt10'>div</span><span> </span><span class='pt7'>class</span><span>=</span><span class='pt11'>"gh"</span><span>></span></td></tr>
<tr><td class='ln' data-ln='62'></td><td><span> <</span><span class='pt10'>a</span><span> </span><span class='pt7'>href</span><span>=</span><span class='pt11'>"https://github.com/demille/paint"</span><span>></span></td></tr>
<tr><td class='ln' data-ln='63'></td><td><span> <</span><span class='pt10'>svg</span><span> </span><span class='pt7'>role</span><span>=</span><span class='pt11'>"img"</span><span> </span><span class='pt7'>viewBox</span><span>=</span><span class='pt11'>"0 0 24 24"</span><span> </span><span class='pt7'>xmlns</span><span>=</span><span class='pt11'>"http://www.w3.org/2000/svg"</span><span>></span></td></tr>
<tr><td class='ln' data-ln='64'></td><td><span> <</span><span class='pt10'>path</span><span> </span><span class='pt7'>d</span><span>=</span><span class='pt11'>"M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12"</span><span>/></span></td></tr>
<tr><td class='ln' data-ln='65'></td><td><span> </</span><span class='pt10'>svg</span><span>></span></td></tr>
<tr><td class='ln' data-ln='66'></td><td><span> <</span><span class='pt10'>span</span><span>>/demille/paint</</span><span class='pt10'>span</span><span>></span></td></tr>
<tr><td class='ln' data-ln='67'></td><td><span> </</span><span class='pt10'>a</span><span>></span></td></tr>
<tr><td class='ln' data-ln='68'></td><td><span> </</span><span class='pt10'>div</span><span>></span></td></tr>
<tr><td class='ln' data-ln='69'></td><td> </td></tr>
<tr><td class='ln' data-ln='70'></td><td><span> </</span><span class='pt10'>div</span><span>> </span><span class='pt4 it'><!-- container --></span></td></tr>
<tr><td class='ln' data-ln='71'></td><td> </td></tr>
<tr><td class='ln' data-ln='72'></td><td><span> <</span><span class='pt10'>div</span><span> </span><span class='pt7'>class</span><span>=</span><span class='pt11'>"bg-overlay"</span><span>></</span><span class='pt10'>div</span><span>></span></td></tr>
<tr><td class='ln' data-ln='73'></td><td> </td></tr>
<tr><td class='ln' data-ln='74'></td><td><span> <</span><span class='pt10'>script</span><span> </span><span class='pt7'>src</span><span>=</span><span class='pt11'>"main.js"</span><span>></</span><span class='pt10'>script</span><span>></span></td></tr>
<tr><td class='ln' data-ln='75'></td><td><span></</span><span class='pt10'>body</span><span>></span></td></tr>
<tr><td class='ln' data-ln='76'></td><td><span></</span><span class='pt10'>html</span><span>></span></td></tr>
</table>
</div>
</div>
</div>
<div class='style' id='P--predawn--html'>
<div class='P--predawn-bordered'>
<div class="info header">
<span class="left">index.html</span>
<span class="right"><span>76 lines</span><span>3.60 KB</span></span>
</div>
<div class='P--predawn'>
<table>
<tr><td class='ln' data-ln='1'></td><td><span class='pt11'><!</span><span class='pt12'>DOCTYPE html</span><span class='pt11'>></span></td></tr>
<tr><td class='ln' data-ln='2'></td><td><span class='pt11'><</span><span class='pt12'>html</span><span class='pt11'>></span></td></tr>
<tr><td class='ln' data-ln='3'></td><td class='hi'><span class='pt11'><</span><span class='pt12'>head</span><span class='pt11'>></span></td></tr>
<tr><td class='ln' data-ln='4'></td><td class='hi'><span> </span><span class='pt11'><</span><span class='pt12'>meta </span><span class='pt16'>charset</span><span class='pt12'>=</span><span class='pt13'>"utf-8"</span><span class='pt11'> /></span></td></tr>
<tr><td class='ln' data-ln='5'></td><td class='hi'><span> </span><span class='pt11'><</span><span class='pt12'>meta </span><span class='pt16'>http-equiv</span><span class='pt12'>=</span><span class='pt13'>"X-UA-Compatible"</span><span class='pt12'> </span><span class='pt16'>content</span><span class='pt12'>=</span><span class='pt13'>"IE=edge"</span><span class='pt11'>></span></td></tr>
<tr><td class='ln' data-ln='6'></td><td class='hi'><span> </span><span class='pt11'><</span><span class='pt12'>title</span><span class='pt11'>></span><span>paint demo</span><span class='pt11'></</span><span class='pt12'>title</span><span class='pt11'>></span></td></tr>
<tr><td class='ln' data-ln='7'></td><td class='hi'><span> </span><span class='pt11'><</span><span class='pt12'>meta </span><span class='pt16'>name</span><span class='pt12'>=</span><span class='pt13'>"viewport"</span><span class='pt12'> </span><span class='pt16'>content</span><span class='pt12'>=</span><span class='pt13'>"width=device-width, initial-scale=1"</span><span class='pt11'>></span></td></tr>
<tr><td class='ln' data-ln='8'></td><td class='hi'><span> </span><span class='pt11'><</span><span class='pt12'>link </span><span class='pt16'>rel</span><span class='pt12'>=</span><span class='pt13'>"stylesheet"</span><span class='pt12'> </span><span class='pt16'>type</span><span class='pt12'>=</span><span class='pt13'>"text/css"</span><span class='pt12'> </span><span class='pt16'>media</span><span class='pt12'>=</span><span class='pt13'>"screen"</span><span class='pt12'> </span><span class='pt16'>href</span><span class='pt12'>=</span><span class='pt13'>"main.css"</span><span class='pt11'> /></span></td></tr>
<tr><td class='ln' data-ln='9'></td><td class='hi'><span> </span><span class='pt11'><</span><span class='pt12'>link </span><span class='pt16'>rel</span><span class='pt12'>=</span><span class='pt13'>"stylesheet"</span><span class='pt12'> </span><span class='pt16'>type</span><span class='pt12'>=</span><span class='pt13'>"text/css"</span><span class='pt12'> </span><span class='pt16'>media</span><span class='pt12'>=</span><span class='pt13'>"screen"</span><span class='pt12'> </span><span class='pt16'>href</span><span class='pt12'>=</span><span class='pt13'>"snippets.css"</span><span class='pt11'> /></span></td></tr>
<tr><td class='ln' data-ln='10'></td><td class='hi'><span class='pt11'></</span><span class='pt12'>head</span><span class='pt11'>></span></td></tr>
<tr><td class='ln' data-ln='11'></td><td><span class='pt11'><</span><span class='pt12'>body</span><span class='pt11'>></span></td></tr>
<tr><td class='ln' data-ln='12'></td><td><span> </span><span class='pt11'><</span><span class='pt12'>div class=</span><span class='pt13'>"container"</span><span class='pt11'>></span></td></tr>
<tr><td class='ln' data-ln='13'></td><td><span> </span><span class='pt11'><</span><span class='pt12'>div class=</span><span class='pt13'>"command"</span><span class='pt11'>></span></td></tr>
<tr><td class='ln' data-ln='14'></td><td><span> </span><span class='pt11'><</span><span class='pt12'>h1</span><span class='pt11'>></span></td></tr>
<tr><td class='ln' data-ln='15'></td><td><span> </span><span class='pt11'><</span><span class='pt12'>span class=</span><span class='pt13'>"hue-rotate"</span><span class='pt11'>></span><span>$</span><span class='pt11'></</span><span class='pt12'>span</span><span class='pt11'>></span><span> paint</span></td></tr>
<tr><td class='ln' data-ln='16'></td><td><span> ./file.</span><span class='pt11'><</span><span class='pt12'>span </span><span class='pt18'>id</span><span class='pt12'>=</span><span class='pt13'>"ext"</span><span class='pt11'>></span><span>rs</span><span class='pt11'></</span><span class='pt12'>span</span><span class='pt11'>></span></td></tr>
<tr><td class='ln' data-ln='17'></td><td><span> </span><span class='pt11'><</span><span class='pt12'>nobr</span><span class='pt11'>></span><span>--style="</span><span class='pt11'><</span><span class='pt12'>span </span><span class='pt18'>id</span><span class='pt12'>=</span><span class='pt13'>"style-name"</span><span class='pt11'>></span><span>github</span><span class='pt11'></</span><span class='pt12'>span</span><span class='pt11'>></span><span>"</span><span class='pt11'></</span><span class='pt12'>nobr</span><span class='pt11'>></span></td></tr>
<tr><td class='ln' data-ln='18'></td><td><span> </span><span class='pt11'><</span><span class='pt12'>nobr</span><span class='pt11'>></span><span>--gist-like</span><span class='pt11'></</span><span class='pt12'>nobr</span><span class='pt11'>></span></td></tr>
<tr><td class='ln' data-ln='19'></td><td><span> </span><span class='pt11'><</span><span class='pt12'>nobr</span><span class='pt11'>><</span><span class='pt12'>span </span><span class='pt18'>id</span><span class='pt12'>=</span><span class='pt13'>"lines"</span><span class='pt11'>></</span><span class='pt12'>span</span><span class='pt11'>></</span><span class='pt12'>nobr</span><span class='pt11'>></span></td></tr>
<tr><td class='ln' data-ln='20'></td><td><span> </span><span class='pt11'></</span><span class='pt12'>h1</span><span class='pt11'>></span></td></tr>
<tr><td class='ln' data-ln='21'></td><td><span> </span><span class='pt11'></</span><span class='pt12'>div</span><span class='pt11'>></span></td></tr>
<tr><td class='ln' data-ln='22'></td><td> </td></tr>
<tr><td class='ln' data-ln='23'></td><td><span> </span><span class='pt11'><</span><span class='pt12'>div class=</span><span class='pt13'>"flex-centered"</span><span class='pt11'>></span></td></tr>
<tr><td class='ln' data-ln='24'></td><td><span> </span><span class='pt11'><</span><span class='pt12'>select </span><span class='pt18'>id</span><span class='pt12'>=</span><span class='pt13'>"filetype"</span><span class='pt11'>></span></td></tr>
<tr><td class='ln' data-ln='25'></td><td><span> </span><span class='pt11'><</span><span class='pt12'>option </span><span class='pt16'>selected</span><span class='pt12'> </span><span class='pt16'>value</span><span class='pt12'>=</span><span class='pt13'>"rs"</span><span class='pt11'>></span><span>rust</span><span class='pt11'></</span><span class='pt12'>option</span><span class='pt11'>></span></td></tr>
<tr><td class='ln' data-ln='26'></td><td><span> </span><span class='pt11'><</span><span class='pt12'>option </span><span class='pt16'>value</span><span class='pt12'>=</span><span class='pt13'>"js"</span><span class='pt11'>></span><span>javascript</span><span class='pt11'></</span><span class='pt12'>option</span><span class='pt11'>></span></td></tr>
<tr><td class='ln' data-ln='27'></td><td><span> </span><span class='pt11'><</span><span class='pt12'>option </span><span class='pt16'>value</span><span class='pt12'>=</span><span class='pt13'>"jsx"</span><span class='pt11'>></span><span>jsx</span><span class='pt11'></</span><span class='pt12'>option</span><span class='pt11'>></span></td></tr>
<tr><td class='ln' data-ln='28'></td><td><span> </span><span class='pt11'><</span><span class='pt12'>option </span><span class='pt16'>value</span><span class='pt12'>=</span><span class='pt13'>"html"</span><span class='pt11'>></span><span>html</span><span class='pt11'></</span><span class='pt12'>option</span><span class='pt11'>></span></td></tr>
<tr><td class='ln' data-ln='29'></td><td><span> </span><span class='pt11'><</span><span class='pt12'>option </span><span class='pt16'>value</span><span class='pt12'>=</span><span class='pt13'>"c"</span><span class='pt11'>></span><span>c</span><span class='pt11'></</span><span class='pt12'>option</span><span class='pt11'>></span></td></tr>
<tr><td class='ln' data-ln='30'></td><td><span> </span><span class='pt11'><</span><span class='pt12'>option </span><span class='pt16'>value</span><span class='pt12'>=</span><span class='pt13'>"py"</span><span class='pt11'>></span><span>python</span><span class='pt11'></</span><span class='pt12'>option</span><span class='pt11'>></span></td></tr>
<tr><td class='ln' data-ln='31'></td><td><span> </span><span class='pt11'><</span><span class='pt12'>option </span><span class='pt16'>value</span><span class='pt12'>=</span><span class='pt13'>"go"</span><span class='pt11'>></span><span>go</span><span class='pt11'></</span><span class='pt12'>option</span><span class='pt11'>></span></td></tr>
<tr><td class='ln' data-ln='32'></td><td><span> </span><span class='pt11'></</span><span class='pt12'>select</span><span class='pt11'>></span></td></tr>
<tr><td class='ln' data-ln='33'></td><td> </td></tr>
<tr><td class='ln' data-ln='34'></td><td><span> </span><span class='pt11'><</span><span class='pt12'>select </span><span class='pt18'>id</span><span class='pt12'>=</span><span class='pt13'>"style"</span><span class='pt11'>></span></td></tr>
<tr><td class='ln' data-ln='35'></td><td><span> </span><span class='pt11'><</span><span class='pt12'>option </span><span class='pt16'>value</span><span class='pt12'>=</span><span class='pt13'>"atom_dark"</span><span class='pt11'>></span><span>atom dark</span><span class='pt11'></</span><span class='pt12'>option</span><span class='pt11'>></span></td></tr>
<tr><td class='ln' data-ln='36'></td><td><span> </span><span class='pt11'><</span><span class='pt12'>option </span><span class='pt16'>value</span><span class='pt12'>=</span><span class='pt13'>"ayu_dark"</span><span class='pt11'>></span><span>ayu dark</span><span class='pt11'></</span><span class='pt12'>option</span><span class='pt11'>></span></td></tr>
<tr><td class='ln' data-ln='37'></td><td><span> </span><span class='pt11'><</span><span class='pt12'>option </span><span class='pt16'>value</span><span class='pt12'>=</span><span class='pt13'>"ayu_light"</span><span class='pt11'>></span><span>ayu light</span><span class='pt11'></</span><span class='pt12'>option</span><span class='pt11'>></span></td></tr>
<tr><td class='ln' data-ln='38'></td><td><span> </span><span class='pt11'><</span><span class='pt12'>option </span><span class='pt16'>value</span><span class='pt12'>=</span><span class='pt13'>"ayu_mirage"</span><span class='pt11'>></span><span>ayu mirage</span><span class='pt11'></</span><span class='pt12'>option</span><span class='pt11'>></span></td></tr>
<tr><td class='ln' data-ln='39'></td><td><span> </span><span class='pt11'><</span><span class='pt12'>option </span><span class='pt16'>value</span><span class='pt12'>=</span><span class='pt13'>"cobalt2"</span><span class='pt11'>></span><span>cobalt2</span><span class='pt11'></</span><span class='pt12'>option</span><span class='pt11'>></span></td></tr>
<tr><td class='ln' data-ln='40'></td><td><span> </span><span class='pt11'><</span><span class='pt12'>option </span><span class='pt16'>value</span><span class='pt12'>=</span><span class='pt13'>"dracula"</span><span class='pt11'>></span><span>dracula</span><span class='pt11'></</span><span class='pt12'>option</span><span class='pt11'>></span></td></tr>
<tr><td class='ln' data-ln='41'></td><td><span> </span><span class='pt11'><</span><span class='pt12'>option </span><span class='pt16'>selected</span><span class='pt12'> </span><span class='pt16'>value</span><span class='pt12'>=</span><span class='pt13'>"github"</span><span class='pt11'>></span><span>github</span><span class='pt11'></</span><span class='pt12'>option</span><span class='pt11'>></span></td></tr>
<tr><td class='ln' data-ln='42'></td><td><span> </span><span class='pt11'><</span><span class='pt12'>option </span><span class='pt16'>value</span><span class='pt12'>=</span><span class='pt13'>"monokai_extended"</span><span class='pt11'>></span><span>monokai extended</span><span class='pt11'></</span><span class='pt12'>option</span><span class='pt11'>></span></td></tr>
<tr><td class='ln' data-ln='43'></td><td><span> </span><span class='pt11'><</span><span class='pt12'>option </span><span class='pt16'>value</span><span class='pt12'>=</span><span class='pt13'>"oceanic_next"</span><span class='pt11'>></span><span>oceanic next</span><span class='pt11'></</span><span class='pt12'>option</span><span class='pt11'>></span></td></tr>
<tr><td class='ln' data-ln='44'></td><td><span> </span><span class='pt11'><</span><span class='pt12'>option </span><span class='pt16'>value</span><span class='pt12'>=</span><span class='pt13'>"one_dark"</span><span class='pt11'>></span><span>one dark</span><span class='pt11'></</span><span class='pt12'>option</span><span class='pt11'>></span></td></tr>
<tr><td class='ln' data-ln='45'></td><td><span> </span><span class='pt11'><</span><span class='pt12'>option </span><span class='pt16'>value</span><span class='pt12'>=</span><span class='pt13'>"one_light"</span><span class='pt11'>></span><span>one light</span><span class='pt11'></</span><span class='pt12'>option</span><span class='pt11'>></span></td></tr>
<tr><td class='ln' data-ln='46'></td><td><span> </span><span class='pt11'><</span><span class='pt12'>option </span><span class='pt16'>value</span><span class='pt12'>=</span><span class='pt13'>"one_monokai"</span><span class='pt11'>></span><span>one monokai</span><span class='pt11'></</span><span class='pt12'>option</span><span class='pt11'>></span></td></tr>
<tr><td class='ln' data-ln='47'></td><td><span> </span><span class='pt11'><</span><span class='pt12'>option </span><span class='pt16'>value</span><span class='pt12'>=</span><span class='pt13'>"predawn"</span><span class='pt11'>></span><span>predawn</span><span class='pt11'></</span><span class='pt12'>option</span><span class='pt11'>></span></td></tr>
<tr><td class='ln' data-ln='48'></td><td><span> </span><span class='pt11'><</span><span class='pt12'>option </span><span class='pt16'>value</span><span class='pt12'>=</span><span class='pt13'>"solarized_dark"</span><span class='pt11'>></span><span>solarized dark</span><span class='pt11'></</span><span class='pt12'>option</span><span class='pt11'>></span></td></tr>
<tr><td class='ln' data-ln='49'></td><td><span> </span><span class='pt11'><</span><span class='pt12'>option </span><span class='pt16'>value</span><span class='pt12'>=</span><span class='pt13'>"solarized_light"</span><span class='pt11'>></span><span>solarized light</span><span class='pt11'></</span><span class='pt12'>option</span><span class='pt11'>></span></td></tr>
<tr><td class='ln' data-ln='50'></td><td><span> </span><span class='pt11'><</span><span class='pt12'>option </span><span class='pt16'>value</span><span class='pt12'>=</span><span class='pt13'>"wombat"</span><span class='pt11'>></span><span>wombat</span><span class='pt11'></</span><span class='pt12'>option</span><span class='pt11'>></span></td></tr>
<tr><td class='ln' data-ln='51'></td><td><span> </span><span class='pt11'></</span><span class='pt12'>select</span><span class='pt11'>></span></td></tr>
<tr><td class='ln' data-ln='52'></td><td> </td></tr>
<tr><td class='ln' data-ln='53'></td><td><span> </span><span class='pt11'><</span><span class='pt12'>input </span><span class='pt18'>id</span><span class='pt12'>=</span><span class='pt13'>"highlight"</span><span class='pt12'> </span><span class='pt16'>type</span><span class='pt12'>=</span><span class='pt13'>"checkbox"</span><span class='pt11'> /></span></td></tr>
<tr><td class='ln' data-ln='54'></td><td><span> </span><span class='pt11'><</span><span class='pt12'>label </span><span class='pt16'>for</span><span class='pt12'>=</span><span class='pt13'>"highlight"</span><span class='pt11'>><</span><span class='pt12'>nobr</span><span class='pt11'>></span><span>--highlight</span><span class='pt11'></</span><span class='pt12'>nobr</span><span class='pt11'>></</span><span class='pt12'>label</span><span class='pt11'>></span></td></tr>
<tr><td class='ln' data-ln='55'></td><td><span> </span><span class='pt11'></</span><span class='pt12'>div</span><span class='pt11'>></span></td></tr>
<tr><td class='ln' data-ln='56'></td><td> </td></tr>
<tr><td class='ln' data-ln='57'></td><td> </td></tr>
<tr><td class='ln' data-ln='58'></td><td><span> </span><span class='pt11'><</span><span class='pt12'>div </span><span class='pt18'>id</span><span class='pt12'>=</span><span class='pt13'>"highlighted"</span><span class='pt12'> class=</span><span class='pt13'>"no-hi"</span><span class='pt12'> </span><span class='pt16'>data-style</span><span class='pt12'>=</span><span class='pt13'>"github--rs"</span><span class='pt12'> </span><span class='pt16'>data-filetype</span><span class='pt12'>=</span><span class='pt13'>"rs"</span><span class='pt11'>></span></td></tr>
<tr><td class='ln' data-ln='59'></td><td><span> </span><span class='pt11'></</span><span class='pt12'>div</span><span class='pt11'>></span><span> </span><span class='pt10'><!-- highlighted --></span></td></tr>
<tr><td class='ln' data-ln='60'></td><td> </td></tr>
<tr><td class='ln' data-ln='61'></td><td><span> </span><span class='pt11'><</span><span class='pt12'>div class=</span><span class='pt13'>"gh"</span><span class='pt11'>></span></td></tr>
<tr><td class='ln' data-ln='62'></td><td><span> </span><span class='pt11'><</span><span class='pt12'>a </span><span class='pt16'>href</span><span class='pt12'>=</span><span class='pt13'>"https://github.com/demille/paint"</span><span class='pt11'>></span></td></tr>
<tr><td class='ln' data-ln='63'></td><td><span> </span><span class='pt11'><</span><span class='pt12'>svg </span><span class='pt16'>role</span><span class='pt12'>=</span><span class='pt13'>"img"</span><span class='pt12'> </span><span class='pt16'>viewBox</span><span class='pt12'>=</span><span class='pt13'>"0 0 24 24"</span><span class='pt12'> </span><span class='pt16'>xmlns</span><span class='pt12'>=</span><span class='pt13'>"http://www.w3.org/2000/svg"</span><span class='pt11'>></span></td></tr>
<tr><td class='ln' data-ln='64'></td><td><span> </span><span class='pt11'><</span><span class='pt12'>path </span><span class='pt16'>d</span><span class='pt12'>=</span><span class='pt13'>"M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12"</span><span class='pt11'>/></span></td></tr>
<tr><td class='ln' data-ln='65'></td><td><span> </span><span class='pt11'></</span><span class='pt12'>svg</span><span class='pt11'>></span></td></tr>
<tr><td class='ln' data-ln='66'></td><td><span> </span><span class='pt11'><</span><span class='pt12'>span</span><span class='pt11'>></span><span>/demille/paint</span><span class='pt11'></</span><span class='pt12'>span</span><span class='pt11'>></span></td></tr>
<tr><td class='ln' data-ln='67'></td><td><span> </span><span class='pt11'></</span><span class='pt12'>a</span><span class='pt11'>></span></td></tr>
<tr><td class='ln' data-ln='68'></td><td><span> </span><span class='pt11'></</span><span class='pt12'>div</span><span class='pt11'>></span></td></tr>
<tr><td class='ln' data-ln='69'></td><td> </td></tr>
<tr><td class='ln' data-ln='70'></td><td><span> </span><span class='pt11'></</span><span class='pt12'>div</span><span class='pt11'>></span><span> </span><span class='pt10'><!-- container --></span></td></tr>
<tr><td class='ln' data-ln='71'></td><td> </td></tr>
<tr><td class='ln' data-ln='72'></td><td><span> </span><span class='pt11'><</span><span class='pt12'>div class=</span><span class='pt13'>"bg-overlay"</span><span class='pt11'>></</span><span class='pt12'>div</span><span class='pt11'>></span></td></tr>
<tr><td class='ln' data-ln='73'></td><td> </td></tr>
<tr><td class='ln' data-ln='74'></td><td><span> </span><span class='pt11'><</span><span class='pt12'>script </span><span class='pt16'>src</span><span class='pt12'>=</span><span class='pt13'>"main.js"</span><span class='pt11'>></</span><span class='pt12'>script</span><span class='pt11'>></span></td></tr>
<tr><td class='ln' data-ln='75'></td><td><span class='pt11'></</span><span class='pt12'>body</span><span class='pt11'>></span></td></tr>
<tr><td class='ln' data-ln='76'></td><td><span class='pt11'></</span><span class='pt12'>html</span><span class='pt11'>></span></td></tr>
</table>
</div>
</div>
</div>
<div class='style' id='P--solarized_dark--html'>
<div class='P--solarized_dark-bordered'>
<div class="info header">
<span class="left">index.html</span>
<span class="right"><span>76 lines</span><span>3.60 KB</span></span>
</div>
<div class='P--solarized_dark'>
<table>
<tr><td class='ln' data-ln='1'></td><td><span class='pt3'><!</span><span class='pt1 bo'>DOCTYPE</span><span> html</span><span class='pt3'>></span></td></tr>
<tr><td class='ln' data-ln='2'></td><td><span class='pt3'><</span><span class='pt1 bo'>html</span><span class='pt3'>></span></td></tr>
<tr><td class='ln' data-ln='3'></td><td class='hi'><span class='pt3'><</span><span class='pt1 bo'>head</span><span class='pt3'>></span></td></tr>
<tr><td class='ln' data-ln='4'></td><td class='hi'><span> </span><span class='pt3'><</span><span class='pt1 bo'>meta</span><span> charset=</span><span class='pt2'>"utf-8"</span><span class='pt3'> /></span></td></tr>
<tr><td class='ln' data-ln='5'></td><td class='hi'><span> </span><span class='pt3'><</span><span class='pt1 bo'>meta</span><span> http-equiv=</span><span class='pt2'>"X-UA-Compatible"</span><span> content=</span><span class='pt2'>"IE=edge"</span><span class='pt3'>></span></td></tr>
<tr><td class='ln' data-ln='6'></td><td class='hi'><span> </span><span class='pt3'><</span><span class='pt1 bo'>title</span><span class='pt3'>></span><span>paint demo</span><span class='pt3'></</span><span class='pt1 bo'>title</span><span class='pt3'>></span></td></tr>
<tr><td class='ln' data-ln='7'></td><td class='hi'><span> </span><span class='pt3'><</span><span class='pt1 bo'>meta</span><span> name=</span><span class='pt2'>"viewport"</span><span> content=</span><span class='pt2'>"width=device-width, initial-scale=1"</span><span class='pt3'>></span></td></tr>
<tr><td class='ln' data-ln='8'></td><td class='hi'><span> </span><span class='pt3'><</span><span class='pt1 bo'>link</span><span> rel=</span><span class='pt2'>"stylesheet"</span><span> type=</span><span class='pt2'>"text/css"</span><span> media=</span><span class='pt2'>"screen"</span><span> href=</span><span class='pt2'>"main.css"</span><span class='pt3'> /></span></td></tr>
<tr><td class='ln' data-ln='9'></td><td class='hi'><span> </span><span class='pt3'><</span><span class='pt1 bo'>link</span><span> rel=</span><span class='pt2'>"stylesheet"</span><span> type=</span><span class='pt2'>"text/css"</span><span> media=</span><span class='pt2'>"screen"</span><span> href=</span><span class='pt2'>"snippets.css"</span><span class='pt3'> /></span></td></tr>
<tr><td class='ln' data-ln='10'></td><td class='hi'><span class='pt3'></</span><span class='pt1 bo'>head</span><span class='pt3'>></span></td></tr>
<tr><td class='ln' data-ln='11'></td><td><span class='pt3'><</span><span class='pt1 bo'>body</span><span class='pt3'>></span></td></tr>
<tr><td class='ln' data-ln='12'></td><td><span> </span><span class='pt3'><</span><span class='pt1 bo'>div</span><span> class=</span><span class='pt2'>"container"</span><span class='pt3'>></span></td></tr>
<tr><td class='ln' data-ln='13'></td><td><span> </span><span class='pt3'><</span><span class='pt1 bo'>div</span><span> class=</span><span class='pt2'>"command"</span><span class='pt3'>></span></td></tr>
<tr><td class='ln' data-ln='14'></td><td><span> </span><span class='pt3'><</span><span class='pt1 bo'>h1</span><span class='pt3'>></span></td></tr>
<tr><td class='ln' data-ln='15'></td><td><span> </span><span class='pt3'><</span><span class='pt1 bo'>span</span><span> class=</span><span class='pt2'>"hue-rotate"</span><span class='pt3'>></span><span>$</span><span class='pt3'></</span><span class='pt1 bo'>span</span><span class='pt3'>></span><span> paint</span></td></tr>
<tr><td class='ln' data-ln='16'></td><td><span> ./file.</span><span class='pt3'><</span><span class='pt1 bo'>span</span><span> id=</span><span class='pt2'>"ext"</span><span class='pt3'>></span><span>rs</span><span class='pt3'></</span><span class='pt1 bo'>span</span><span class='pt3'>></span></td></tr>
<tr><td class='ln' data-ln='17'></td><td><span> </span><span class='pt3'><</span><span class='pt1 bo'>nobr</span><span class='pt3'>></span><span>--style="</span><span class='pt3'><</span><span class='pt1 bo'>span</span><span> id=</span><span class='pt2'>"style-name"</span><span class='pt3'>></span><span>github</span><span class='pt3'></</span><span class='pt1 bo'>span</span><span class='pt3'>></span><span>"</span><span class='pt3'></</span><span class='pt1 bo'>nobr</span><span class='pt3'>></span></td></tr>
<tr><td class='ln' data-ln='18'></td><td><span> </span><span class='pt3'><</span><span class='pt1 bo'>nobr</span><span class='pt3'>></span><span>--gist-like</span><span class='pt3'></</span><span class='pt1 bo'>nobr</span><span class='pt3'>></span></td></tr>
<tr><td class='ln' data-ln='19'></td><td><span> </span><span class='pt3'><</span><span class='pt1 bo'>nobr</span><span class='pt3'>><</span><span class='pt1 bo'>span</span><span> id=</span><span class='pt2'>"lines"</span><span class='pt3'>></</span><span class='pt1 bo'>span</span><span class='pt3'>></</span><span class='pt1 bo'>nobr</span><span class='pt3'>></span></td></tr>
<tr><td class='ln' data-ln='20'></td><td><span> </span><span class='pt3'></</span><span class='pt1 bo'>h1</span><span class='pt3'>></span></td></tr>
<tr><td class='ln' data-ln='21'></td><td><span> </span><span class='pt3'></</span><span class='pt1 bo'>div</span><span class='pt3'>></span></td></tr>
<tr><td class='ln' data-ln='22'></td><td> </td></tr>
<tr><td class='ln' data-ln='23'></td><td><span> </span><span class='pt3'><</span><span class='pt1 bo'>div</span><span> class=</span><span class='pt2'>"flex-centered"</span><span class='pt3'>></span></td></tr>
<tr><td class='ln' data-ln='24'></td><td><span> </span><span class='pt3'><</span><span class='pt1 bo'>select</span><span> id=</span><span class='pt2'>"filetype"</span><span class='pt3'>></span></td></tr>
<tr><td class='ln' data-ln='25'></td><td><span> </span><span class='pt3'><</span><span class='pt1 bo'>option</span><span> selected value=</span><span class='pt2'>"rs"</span><span class='pt3'>></span><span>rust</span><span class='pt3'></</span><span class='pt1 bo'>option</span><span class='pt3'>></span></td></tr>
<tr><td class='ln' data-ln='26'></td><td><span> </span><span class='pt3'><</span><span class='pt1 bo'>option</span><span> value=</span><span class='pt2'>"js"</span><span class='pt3'>></span><span>javascript</span><span class='pt3'></</span><span class='pt1 bo'>option</span><span class='pt3'>></span></td></tr>
<tr><td class='ln' data-ln='27'></td><td><span> </span><span class='pt3'><</span><span class='pt1 bo'>option</span><span> value=</span><span class='pt2'>"jsx"</span><span class='pt3'>></span><span>jsx</span><span class='pt3'></</span><span class='pt1 bo'>option</span><span class='pt3'>></span></td></tr>
<tr><td class='ln' data-ln='28'></td><td><span> </span><span class='pt3'><</span><span class='pt1 bo'>option</span><span> value=</span><span class='pt2'>"html"</span><span class='pt3'>></span><span>html</span><span class='pt3'></</span><span class='pt1 bo'>option</span><span class='pt3'>></span></td></tr>
<tr><td class='ln' data-ln='29'></td><td><span> </span><span class='pt3'><</span><span class='pt1 bo'>option</span><span> value=</span><span class='pt2'>"c"</span><span class='pt3'>></span><span>c</span><span class='pt3'></</span><span class='pt1 bo'>option</span><span class='pt3'>></span></td></tr>
<tr><td class='ln' data-ln='30'></td><td><span> </span><span class='pt3'><</span><span class='pt1 bo'>option</span><span> value=</span><span class='pt2'>"py"</span><span class='pt3'>></span><span>python</span><span class='pt3'></</span><span class='pt1 bo'>option</span><span class='pt3'>></span></td></tr>
<tr><td class='ln' data-ln='31'></td><td><span> </span><span class='pt3'><</span><span class='pt1 bo'>option</span><span> value=</span><span class='pt2'>"go"</span><span class='pt3'>></span><span>go</span><span class='pt3'></</span><span class='pt1 bo'>option</span><span class='pt3'>></span></td></tr>
<tr><td class='ln' data-ln='32'></td><td><span> </span><span class='pt3'></</span><span class='pt1 bo'>select</span><span class='pt3'>></span></td></tr>
<tr><td class='ln' data-ln='33'></td><td> </td></tr>
<tr><td class='ln' data-ln='34'></td><td><span> </span><span class='pt3'><</span><span class='pt1 bo'>select</span><span> id=</span><span class='pt2'>"style"</span><span class='pt3'>></span></td></tr>
<tr><td class='ln' data-ln='35'></td><td><span> </span><span class='pt3'><</span><span class='pt1 bo'>option</span><span> value=</span><span class='pt2'>"atom_dark"</span><span class='pt3'>></span><span>atom dark</span><span class='pt3'></</span><span class='pt1 bo'>option</span><span class='pt3'>></span></td></tr>
<tr><td class='ln' data-ln='36'></td><td><span> </span><span class='pt3'><</span><span class='pt1 bo'>option</span><span> value=</span><span class='pt2'>"ayu_dark"</span><span class='pt3'>></span><span>ayu dark</span><span class='pt3'></</span><span class='pt1 bo'>option</span><span class='pt3'>></span></td></tr>
<tr><td class='ln' data-ln='37'></td><td><span> </span><span class='pt3'><</span><span class='pt1 bo'>option</span><span> value=</span><span class='pt2'>"ayu_light"</span><span class='pt3'>></span><span>ayu light</span><span class='pt3'></</span><span class='pt1 bo'>option</span><span class='pt3'>></span></td></tr>
<tr><td class='ln' data-ln='38'></td><td><span> </span><span class='pt3'><</span><span class='pt1 bo'>option</span><span> value=</span><span class='pt2'>"ayu_mirage"</span><span class='pt3'>></span><span>ayu mirage</span><span class='pt3'></</span><span class='pt1 bo'>option</span><span class='pt3'>></span></td></tr>
<tr><td class='ln' data-ln='39'></td><td><span> </span><span class='pt3'><</span><span class='pt1 bo'>option</span><span> value=</span><span class='pt2'>"cobalt2"</span><span class='pt3'>></span><span>cobalt2</span><span class='pt3'></</span><span class='pt1 bo'>option</span><span class='pt3'>></span></td></tr>
<tr><td class='ln' data-ln='40'></td><td><span> </span><span class='pt3'><</span><span class='pt1 bo'>option</span><span> value=</span><span class='pt2'>"dracula"</span><span class='pt3'>></span><span>dracula</span><span class='pt3'></</span><span class='pt1 bo'>option</span><span class='pt3'>></span></td></tr>
<tr><td class='ln' data-ln='41'></td><td><span> </span><span class='pt3'><</span><span class='pt1 bo'>option</span><span> selected value=</span><span class='pt2'>"github"</span><span class='pt3'>></span><span>github</span><span class='pt3'></</span><span class='pt1 bo'>option</span><span class='pt3'>></span></td></tr>
<tr><td class='ln' data-ln='42'></td><td><span> </span><span class='pt3'><</span><span class='pt1 bo'>option</span><span> value=</span><span class='pt2'>"monokai_extended"</span><span class='pt3'>></span><span>monokai extended</span><span class='pt3'></</span><span class='pt1 bo'>option</span><span class='pt3'>></span></td></tr>
<tr><td class='ln' data-ln='43'></td><td><span> </span><span class='pt3'><</span><span class='pt1 bo'>option</span><span> value=</span><span class='pt2'>"oceanic_next"</span><span class='pt3'>></span><span>oceanic next</span><span class='pt3'></</span><span class='pt1 bo'>option</span><span class='pt3'>></span></td></tr>
<tr><td class='ln' data-ln='44'></td><td><span> </span><span class='pt3'><</span><span class='pt1 bo'>option</span><span> value=</span><span class='pt2'>"one_dark"</span><span class='pt3'>></span><span>one dark</span><span class='pt3'></</span><span class='pt1 bo'>option</span><span class='pt3'>></span></td></tr>
<tr><td class='ln' data-ln='45'></td><td><span> </span><span class='pt3'><</span><span class='pt1 bo'>option</span><span> value=</span><span class='pt2'>"one_light"</span><span class='pt3'>></span><span>one light</span><span class='pt3'></</span><span class='pt1 bo'>option</span><span class='pt3'>></span></td></tr>
<tr><td class='ln' data-ln='46'></td><td><span> </span><span class='pt3'><</span><span class='pt1 bo'>option</span><span> value=</span><span class='pt2'>"one_monokai"</span><span class='pt3'>></span><span>one monokai</span><span class='pt3'></</span><span class='pt1 bo'>option</span><span class='pt3'>></span></td></tr>
<tr><td class='ln' data-ln='47'></td><td><span> </span><span class='pt3'><</span><span class='pt1 bo'>option</span><span> value=</span><span class='pt2'>"predawn"</span><span class='pt3'>></span><span>predawn</span><span class='pt3'></</span><span class='pt1 bo'>option</span><span class='pt3'>></span></td></tr>
<tr><td class='ln' data-ln='48'></td><td><span> </span><span class='pt3'><</span><span class='pt1 bo'>option</span><span> value=</span><span class='pt2'>"solarized_dark"</span><span class='pt3'>></span><span>solarized dark</span><span class='pt3'></</span><span class='pt1 bo'>option</span><span class='pt3'>></span></td></tr>
<tr><td class='ln' data-ln='49'></td><td><span> </span><span class='pt3'><</span><span class='pt1 bo'>option</span><span> value=</span><span class='pt2'>"solarized_light"</span><span class='pt3'>></span><span>solarized light</span><span class='pt3'></</span><span class='pt1 bo'>option</span><span class='pt3'>></span></td></tr>
<tr><td class='ln' data-ln='50'></td><td><span> </span><span class='pt3'><</span><span class='pt1 bo'>option</span><span> value=</span><span class='pt2'>"wombat"</span><span class='pt3'>></span><span>wombat</span><span class='pt3'></</span><span class='pt1 bo'>option</span><span class='pt3'>></span></td></tr>
<tr><td class='ln' data-ln='51'></td><td><span> </span><span class='pt3'></</span><span class='pt1 bo'>select</span><span class='pt3'>></span></td></tr>
<tr><td class='ln' data-ln='52'></td><td> </td></tr>
<tr><td class='ln' data-ln='53'></td><td><span> </span><span class='pt3'><</span><span class='pt1 bo'>input</span><span> id=</span><span class='pt2'>"highlight"</span><span> type=</span><span class='pt2'>"checkbox"</span><span class='pt3'> /></span></td></tr>
<tr><td class='ln' data-ln='54'></td><td><span> </span><span class='pt3'><</span><span class='pt1 bo'>label</span><span> for=</span><span class='pt2'>"highlight"</span><span class='pt3'>><</span><span class='pt1 bo'>nobr</span><span class='pt3'>></span><span>--highlight</span><span class='pt3'></</span><span class='pt1 bo'>nobr</span><span class='pt3'>></</span><span class='pt1 bo'>label</span><span class='pt3'>></span></td></tr>
<tr><td class='ln' data-ln='55'></td><td><span> </span><span class='pt3'></</span><span class='pt1 bo'>div</span><span class='pt3'>></span></td></tr>
<tr><td class='ln' data-ln='56'></td><td> </td></tr>
<tr><td class='ln' data-ln='57'></td><td> </td></tr>
<tr><td class='ln' data-ln='58'></td><td><span> </span><span class='pt3'><</span><span class='pt1 bo'>div</span><span> id=</span><span class='pt2'>"highlighted"</span><span> class=</span><span class='pt2'>"no-hi"</span><span> data-style=</span><span class='pt2'>"github--rs"</span><span> data-filetype=</span><span class='pt2'>"rs"</span><span class='pt3'>></span></td></tr>
<tr><td class='ln' data-ln='59'></td><td><span> </span><span class='pt3'></</span><span class='pt1 bo'>div</span><span class='pt3'>></span><span> </span><span class='pt3 it'><!-- highlighted --></span></td></tr>
<tr><td class='ln' data-ln='60'></td><td> </td></tr>
<tr><td class='ln' data-ln='61'></td><td><span> </span><span class='pt3'><</span><span class='pt1 bo'>div</span><span> class=</span><span class='pt2'>"gh"</span><span class='pt3'>></span></td></tr>
<tr><td class='ln' data-ln='62'></td><td><span> </span><span class='pt3'><</span><span class='pt1 bo'>a</span><span> href=</span><span class='pt2'>"https://github.com/demille/paint"</span><span class='pt3'>></span></td></tr>
<tr><td class='ln' data-ln='63'></td><td><span> </span><span class='pt3'><</span><span class='pt1 bo'>svg</span><span> role=</span><span class='pt2'>"img"</span><span> viewBox=</span><span class='pt2'>"0 0 24 24"</span><span> xmlns=</span><span class='pt2'>"http://www.w3.org/2000/svg"</span><span class='pt3'>></span></td></tr>
<tr><td class='ln' data-ln='64'></td><td><span> </span><span class='pt3'><</span><span class='pt1 bo'>path</span><span> d=</span><span class='pt2'>"M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12"</span><span class='pt3'>/></span></td></tr>
<tr><td class='ln' data-ln='65'></td><td><span> </span><span class='pt3'></</span><span class='pt1 bo'>svg</span><span class='pt3'>></span></td></tr>
<tr><td class='ln' data-ln='66'></td><td><span> </span><span class='pt3'><</span><span class='pt1 bo'>span</span><span class='pt3'>></span><span>/demille/paint</span><span class='pt3'></</span><span class='pt1 bo'>span</span><span class='pt3'>></span></td></tr>
<tr><td class='ln' data-ln='67'></td><td><span> </span><span class='pt3'></</span><span class='pt1 bo'>a</span><span class='pt3'>></span></td></tr>
<tr><td class='ln' data-ln='68'></td><td><span> </span><span class='pt3'></</span><span class='pt1 bo'>div</span><span class='pt3'>></span></td></tr>
<tr><td class='ln' data-ln='69'></td><td> </td></tr>
<tr><td class='ln' data-ln='70'></td><td><span> </span><span class='pt3'></</span><span class='pt1 bo'>div</span><span class='pt3'>></span><span> </span><span class='pt3 it'><!-- container --></span></td></tr>
<tr><td class='ln' data-ln='71'></td><td> </td></tr>
<tr><td class='ln' data-ln='72'></td><td><span> </span><span class='pt3'><</span><span class='pt1 bo'>div</span><span> class=</span><span class='pt2'>"bg-overlay"</span><span class='pt3'>></</span><span class='pt1 bo'>div</span><span class='pt3'>></span></td></tr>
<tr><td class='ln' data-ln='73'></td><td> </td></tr>
<tr><td class='ln' data-ln='74'></td><td><span> </span><span class='pt3'><</span><span class='pt1 bo'>script</span><span> src=</span><span class='pt2'>"main.js"</span><span class='pt3'>></</span><span class='pt1 bo'>script</span><span class='pt3'>></span></td></tr>
<tr><td class='ln' data-ln='75'></td><td><span class='pt3'></</span><span class='pt1 bo'>body</span><span class='pt3'>></span></td></tr>
<tr><td class='ln' data-ln='76'></td><td><span class='pt3'></</span><span class='pt1 bo'>html</span><span class='pt3'>></span></td></tr>
</table>
</div>
</div>
</div>
<div class='style' id='P--solarized_light--html'>
<div class='P--solarized_light-bordered'>
<div class="info header">
<span class="left">index.html</span>
<span class="right"><span>76 lines</span><span>3.60 KB</span></span>
</div>
<div class='P--solarized_light'>
<table>
<tr><td class='ln' data-ln='1'></td><td><span><!</span><span class='pt2 bo'>DOCTYPE</span><span> html></span></td></tr>
<tr><td class='ln' data-ln='2'></td><td><span class='pt5'><</span><span class='pt2 bo'>html</span><span class='pt5'>></span></td></tr>
<tr><td class='ln' data-ln='3'></td><td class='hi'><span class='pt5'><</span><span class='pt2 bo'>head</span><span class='pt5'>></span></td></tr>
<tr><td class='ln' data-ln='4'></td><td class='hi'><span> </span><span class='pt5'><</span><span class='pt2 bo'>meta</span><span> </span><span class='pt5'>charset</span><span>=</span><span class='pt3'>"utf-8"</span><span class='pt5'> /></span></td></tr>
<tr><td class='ln' data-ln='5'></td><td class='hi'><span> </span><span class='pt5'><</span><span class='pt2 bo'>meta</span><span> </span><span class='pt5'>http-equiv</span><span>=</span><span class='pt3'>"X-UA-Compatible"</span><span> </span><span class='pt5'>content</span><span>=</span><span class='pt3'>"IE=edge"</span><span class='pt5'>></span></td></tr>
<tr><td class='ln' data-ln='6'></td><td class='hi'><span> </span><span class='pt5'><</span><span class='pt2 bo'>title</span><span class='pt5'>></span><span>paint demo</span><span class='pt5'></</span><span class='pt2 bo'>title</span><span class='pt5'>></span></td></tr>
<tr><td class='ln' data-ln='7'></td><td class='hi'><span> </span><span class='pt5'><</span><span class='pt2 bo'>meta</span><span> </span><span class='pt5'>name</span><span>=</span><span class='pt3'>"viewport"</span><span> </span><span class='pt5'>content</span><span>=</span><span class='pt3'>"width=device-width, initial-scale=1"</span><span class='pt5'>></span></td></tr>
<tr><td class='ln' data-ln='8'></td><td class='hi'><span> </span><span class='pt5'><</span><span class='pt2 bo'>link</span><span> </span><span class='pt5'>rel</span><span>=</span><span class='pt3'>"stylesheet"</span><span> </span><span class='pt5'>type</span><span>=</span><span class='pt3'>"text/css"</span><span> </span><span class='pt5'>media</span><span>=</span><span class='pt3'>"screen"</span><span> </span><span class='pt5'>href</span><span>=</span><span class='pt3'>"main.css"</span><span class='pt5'> /></span></td></tr>
<tr><td class='ln' data-ln='9'></td><td class='hi'><span> </span><span class='pt5'><</span><span class='pt2 bo'>link</span><span> </span><span class='pt5'>rel</span><span>=</span><span class='pt3'>"stylesheet"</span><span> </span><span class='pt5'>type</span><span>=</span><span class='pt3'>"text/css"</span><span> </span><span class='pt5'>media</span><span>=</span><span class='pt3'>"screen"</span><span> </span><span class='pt5'>href</span><span>=</span><span class='pt3'>"snippets.css"</span><span class='pt5'> /></span></td></tr>
<tr><td class='ln' data-ln='10'></td><td class='hi'><span class='pt5'></</span><span class='pt2 bo'>head</span><span class='pt5'>></span></td></tr>
<tr><td class='ln' data-ln='11'></td><td><span class='pt5'><</span><span class='pt2 bo'>body</span><span class='pt5'>></span></td></tr>
<tr><td class='ln' data-ln='12'></td><td><span> </span><span class='pt5'><</span><span class='pt2 bo'>div</span><span> </span><span class='pt5'>class</span><span>=</span><span class='pt3'>"container"</span><span class='pt5'>></span></td></tr>
<tr><td class='ln' data-ln='13'></td><td><span> </span><span class='pt5'><</span><span class='pt2 bo'>div</span><span> </span><span class='pt5'>class</span><span>=</span><span class='pt3'>"command"</span><span class='pt5'>></span></td></tr>
<tr><td class='ln' data-ln='14'></td><td><span> </span><span class='pt5'><</span><span class='pt2 bo'>h1</span><span class='pt5'>></span></td></tr>
<tr><td class='ln' data-ln='15'></td><td><span> </span><span class='pt5'><</span><span class='pt2 bo'>span</span><span> </span><span class='pt5'>class</span><span>=</span><span class='pt3'>"hue-rotate"</span><span class='pt5'>></span><span>$</span><span class='pt5'></</span><span class='pt2 bo'>span</span><span class='pt5'>></span><span> paint</span></td></tr>
<tr><td class='ln' data-ln='16'></td><td><span> ./file.</span><span class='pt5'><</span><span class='pt2 bo'>span</span><span> </span><span class='pt5'>id</span><span>=</span><span class='pt3'>"ext"</span><span class='pt5'>></span><span>rs</span><span class='pt5'></</span><span class='pt2 bo'>span</span><span class='pt5'>></span></td></tr>
<tr><td class='ln' data-ln='17'></td><td><span> </span><span class='pt5'><</span><span class='pt2 bo'>nobr</span><span class='pt5'>></span><span>--style="</span><span class='pt5'><</span><span class='pt2 bo'>span</span><span> </span><span class='pt5'>id</span><span>=</span><span class='pt3'>"style-name"</span><span class='pt5'>></span><span>github</span><span class='pt5'></</span><span class='pt2 bo'>span</span><span class='pt5'>></span><span>"</span><span class='pt5'></</span><span class='pt2 bo'>nobr</span><span class='pt5'>></span></td></tr>
<tr><td class='ln' data-ln='18'></td><td><span> </span><span class='pt5'><</span><span class='pt2 bo'>nobr</span><span class='pt5'>></span><span>--gist-like</span><span class='pt5'></</span><span class='pt2 bo'>nobr</span><span class='pt5'>></span></td></tr>
<tr><td class='ln' data-ln='19'></td><td><span> </span><span class='pt5'><</span><span class='pt2 bo'>nobr</span><span class='pt5'>><</span><span class='pt2 bo'>span</span><span> </span><span class='pt5'>id</span><span>=</span><span class='pt3'>"lines"</span><span class='pt5'>></</span><span class='pt2 bo'>span</span><span class='pt5'>></</span><span class='pt2 bo'>nobr</span><span class='pt5'>></span></td></tr>
<tr><td class='ln' data-ln='20'></td><td><span> </span><span class='pt5'></</span><span class='pt2 bo'>h1</span><span class='pt5'>></span></td></tr>
<tr><td class='ln' data-ln='21'></td><td><span> </span><span class='pt5'></</span><span class='pt2 bo'>div</span><span class='pt5'>></span></td></tr>
<tr><td class='ln' data-ln='22'></td><td> </td></tr>
<tr><td class='ln' data-ln='23'></td><td><span> </span><span class='pt5'><</span><span class='pt2 bo'>div</span><span> </span><span class='pt5'>class</span><span>=</span><span class='pt3'>"flex-centered"</span><span class='pt5'>></span></td></tr>
<tr><td class='ln' data-ln='24'></td><td><span> </span><span class='pt5'><</span><span class='pt2 bo'>select</span><span> </span><span class='pt5'>id</span><span>=</span><span class='pt3'>"filetype"</span><span class='pt5'>></span></td></tr>
<tr><td class='ln' data-ln='25'></td><td><span> </span><span class='pt5'><</span><span class='pt2 bo'>option</span><span> </span><span class='pt5'>selected</span><span> </span><span class='pt5'>value</span><span>=</span><span class='pt3'>"rs"</span><span class='pt5'>></span><span>rust</span><span class='pt5'></</span><span class='pt2 bo'>option</span><span class='pt5'>></span></td></tr>
<tr><td class='ln' data-ln='26'></td><td><span> </span><span class='pt5'><</span><span class='pt2 bo'>option</span><span> </span><span class='pt5'>value</span><span>=</span><span class='pt3'>"js"</span><span class='pt5'>></span><span>javascript</span><span class='pt5'></</span><span class='pt2 bo'>option</span><span class='pt5'>></span></td></tr>
<tr><td class='ln' data-ln='27'></td><td><span> </span><span class='pt5'><</span><span class='pt2 bo'>option</span><span> </span><span class='pt5'>value</span><span>=</span><span class='pt3'>"jsx"</span><span class='pt5'>></span><span>jsx</span><span class='pt5'></</span><span class='pt2 bo'>option</span><span class='pt5'>></span></td></tr>
<tr><td class='ln' data-ln='28'></td><td><span> </span><span class='pt5'><</span><span class='pt2 bo'>option</span><span> </span><span class='pt5'>value</span><span>=</span><span class='pt3'>"html"</span><span class='pt5'>></span><span>html</span><span class='pt5'></</span><span class='pt2 bo'>option</span><span class='pt5'>></span></td></tr>
<tr><td class='ln' data-ln='29'></td><td><span> </span><span class='pt5'><</span><span class='pt2 bo'>option</span><span> </span><span class='pt5'>value</span><span>=</span><span class='pt3'>"c"</span><span class='pt5'>></span><span>c</span><span class='pt5'></</span><span class='pt2 bo'>option</span><span class='pt5'>></span></td></tr>
<tr><td class='ln' data-ln='30'></td><td><span> </span><span class='pt5'><</span><span class='pt2 bo'>option</span><span> </span><span class='pt5'>value</span><span>=</span><span class='pt3'>"py"</span><span class='pt5'>></span><span>python</span><span class='pt5'></</span><span class='pt2 bo'>option</span><span class='pt5'>></span></td></tr>
<tr><td class='ln' data-ln='31'></td><td><span> </span><span class='pt5'><</span><span class='pt2 bo'>option</span><span> </span><span class='pt5'>value</span><span>=</span><span class='pt3'>"go"</span><span class='pt5'>></span><span>go</span><span class='pt5'></</span><span class='pt2 bo'>option</span><span class='pt5'>></span></td></tr>
<tr><td class='ln' data-ln='32'></td><td><span> </span><span class='pt5'></</span><span class='pt2 bo'>select</span><span class='pt5'>></span></td></tr>
<tr><td class='ln' data-ln='33'></td><td> </td></tr>
<tr><td class='ln' data-ln='34'></td><td><span> </span><span class='pt5'><</span><span class='pt2 bo'>select</span><span> </span><span class='pt5'>id</span><span>=</span><span class='pt3'>"style"</span><span class='pt5'>></span></td></tr>
<tr><td class='ln' data-ln='35'></td><td><span> </span><span class='pt5'><</span><span class='pt2 bo'>option</span><span> </span><span class='pt5'>value</span><span>=</span><span class='pt3'>"atom_dark"</span><span class='pt5'>></span><span>atom dark</span><span class='pt5'></</span><span class='pt2 bo'>option</span><span class='pt5'>></span></td></tr>
<tr><td class='ln' data-ln='36'></td><td><span> </span><span class='pt5'><</span><span class='pt2 bo'>option</span><span> </span><span class='pt5'>value</span><span>=</span><span class='pt3'>"ayu_dark"</span><span class='pt5'>></span><span>ayu dark</span><span class='pt5'></</span><span class='pt2 bo'>option</span><span class='pt5'>></span></td></tr>
<tr><td class='ln' data-ln='37'></td><td><span> </span><span class='pt5'><</span><span class='pt2 bo'>option</span><span> </span><span class='pt5'>value</span><span>=</span><span class='pt3'>"ayu_light"</span><span class='pt5'>></span><span>ayu light</span><span class='pt5'></</span><span class='pt2 bo'>option</span><span class='pt5'>></span></td></tr>
<tr><td class='ln' data-ln='38'></td><td><span> </span><span class='pt5'><</span><span class='pt2 bo'>option</span><span> </span><span class='pt5'>value</span><span>=</span><span class='pt3'>"ayu_mirage"</span><span class='pt5'>></span><span>ayu mirage</span><span class='pt5'></</span><span class='pt2 bo'>option</span><span class='pt5'>></span></td></tr>
<tr><td class='ln' data-ln='39'></td><td><span> </span><span class='pt5'><</span><span class='pt2 bo'>option</span><span> </span><span class='pt5'>value</span><span>=</span><span class='pt3'>"cobalt2"</span><span class='pt5'>></span><span>cobalt2</span><span class='pt5'></</span><span class='pt2 bo'>option</span><span class='pt5'>></span></td></tr>
<tr><td class='ln' data-ln='40'></td><td><span> </span><span class='pt5'><</span><span class='pt2 bo'>option</span><span> </span><span class='pt5'>value</span><span>=</span><span class='pt3'>"dracula"</span><span class='pt5'>></span><span>dracula</span><span class='pt5'></</span><span class='pt2 bo'>option</span><span class='pt5'>></span></td></tr>
<tr><td class='ln' data-ln='41'></td><td><span> </span><span class='pt5'><</span><span class='pt2 bo'>option</span><span> </span><span class='pt5'>selected</span><span> </span><span class='pt5'>value</span><span>=</span><span class='pt3'>"github"</span><span class='pt5'>></span><span>github</span><span class='pt5'></</span><span class='pt2 bo'>option</span><span class='pt5'>></span></td></tr>
<tr><td class='ln' data-ln='42'></td><td><span> </span><span class='pt5'><</span><span class='pt2 bo'>option</span><span> </span><span class='pt5'>value</span><span>=</span><span class='pt3'>"monokai_extended"</span><span class='pt5'>></span><span>monokai extended</span><span class='pt5'></</span><span class='pt2 bo'>option</span><span class='pt5'>></span></td></tr>
<tr><td class='ln' data-ln='43'></td><td><span> </span><span class='pt5'><</span><span class='pt2 bo'>option</span><span> </span><span class='pt5'>value</span><span>=</span><span class='pt3'>"oceanic_next"</span><span class='pt5'>></span><span>oceanic next</span><span class='pt5'></</span><span class='pt2 bo'>option</span><span class='pt5'>></span></td></tr>
<tr><td class='ln' data-ln='44'></td><td><span> </span><span class='pt5'><</span><span class='pt2 bo'>option</span><span> </span><span class='pt5'>value</span><span>=</span><span class='pt3'>"one_dark"</span><span class='pt5'>></span><span>one dark</span><span class='pt5'></</span><span class='pt2 bo'>option</span><span class='pt5'>></span></td></tr>
<tr><td class='ln' data-ln='45'></td><td><span> </span><span class='pt5'><</span><span class='pt2 bo'>option</span><span> </span><span class='pt5'>value</span><span>=</span><span class='pt3'>"one_light"</span><span class='pt5'>></span><span>one light</span><span class='pt5'></</span><span class='pt2 bo'>option</span><span class='pt5'>></span></td></tr>
<tr><td class='ln' data-ln='46'></td><td><span> </span><span class='pt5'><</span><span class='pt2 bo'>option</span><span> </span><span class='pt5'>value</span><span>=</span><span class='pt3'>"one_monokai"</span><span class='pt5'>></span><span>one monokai</span><span class='pt5'></</span><span class='pt2 bo'>option</span><span class='pt5'>></span></td></tr>
<tr><td class='ln' data-ln='47'></td><td><span> </span><span class='pt5'><</span><span class='pt2 bo'>option</span><span> </span><span class='pt5'>value</span><span>=</span><span class='pt3'>"predawn"</span><span class='pt5'>></span><span>predawn</span><span class='pt5'></</span><span class='pt2 bo'>option</span><span class='pt5'>></span></td></tr>
<tr><td class='ln' data-ln='48'></td><td><span> </span><span class='pt5'><</span><span class='pt2 bo'>option</span><span> </span><span class='pt5'>value</span><span>=</span><span class='pt3'>"solarized_dark"</span><span class='pt5'>></span><span>solarized dark</span><span class='pt5'></</span><span class='pt2 bo'>option</span><span class='pt5'>></span></td></tr>
<tr><td class='ln' data-ln='49'></td><td><span> </span><span class='pt5'><</span><span class='pt2 bo'>option</span><span> </span><span class='pt5'>value</span><span>=</span><span class='pt3'>"solarized_light"</span><span class='pt5'>></span><span>solarized light</span><span class='pt5'></</span><span class='pt2 bo'>option</span><span class='pt5'>></span></td></tr>
<tr><td class='ln' data-ln='50'></td><td><span> </span><span class='pt5'><</span><span class='pt2 bo'>option</span><span> </span><span class='pt5'>value</span><span>=</span><span class='pt3'>"wombat"</span><span class='pt5'>></span><span>wombat</span><span class='pt5'></</span><span class='pt2 bo'>option</span><span class='pt5'>></span></td></tr>
<tr><td class='ln' data-ln='51'></td><td><span> </span><span class='pt5'></</span><span class='pt2 bo'>select</span><span class='pt5'>></span></td></tr>
<tr><td class='ln' data-ln='52'></td><td> </td></tr>
<tr><td class='ln' data-ln='53'></td><td><span> </span><span class='pt5'><</span><span class='pt2 bo'>input</span><span> </span><span class='pt5'>id</span><span>=</span><span class='pt3'>"highlight"</span><span> </span><span class='pt5'>type</span><span>=</span><span class='pt3'>"checkbox"</span><span class='pt5'> /></span></td></tr>
<tr><td class='ln' data-ln='54'></td><td><span> </span><span class='pt5'><</span><span class='pt2 bo'>label</span><span> </span><span class='pt5'>for</span><span>=</span><span class='pt3'>"highlight"</span><span class='pt5'>><</span><span class='pt2 bo'>nobr</span><span class='pt5'>></span><span>--highlight</span><span class='pt5'></</span><span class='pt2 bo'>nobr</span><span class='pt5'>></</span><span class='pt2 bo'>label</span><span class='pt5'>></span></td></tr>
<tr><td class='ln' data-ln='55'></td><td><span> </span><span class='pt5'></</span><span class='pt2 bo'>div</span><span class='pt5'>></span></td></tr>
<tr><td class='ln' data-ln='56'></td><td> </td></tr>
<tr><td class='ln' data-ln='57'></td><td> </td></tr>
<tr><td class='ln' data-ln='58'></td><td><span> </span><span class='pt5'><</span><span class='pt2 bo'>div</span><span> </span><span class='pt5'>id</span><span>=</span><span class='pt3'>"highlighted"</span><span> </span><span class='pt5'>class</span><span>=</span><span class='pt3'>"no-hi"</span><span> </span><span class='pt5'>data-style</span><span>=</span><span class='pt3'>"github--rs"</span><span> </span><span class='pt5'>data-filetype</span><span>=</span><span class='pt3'>"rs"</span><span class='pt5'>></span></td></tr>
<tr><td class='ln' data-ln='59'></td><td><span> </span><span class='pt5'></</span><span class='pt2 bo'>div</span><span class='pt5'>></span><span> </span><span class='pt5'><!-- highlighted --></span></td></tr>
<tr><td class='ln' data-ln='60'></td><td> </td></tr>
<tr><td class='ln' data-ln='61'></td><td><span> </span><span class='pt5'><</span><span class='pt2 bo'>div</span><span> </span><span class='pt5'>class</span><span>=</span><span class='pt3'>"gh"</span><span class='pt5'>></span></td></tr>
<tr><td class='ln' data-ln='62'></td><td><span> </span><span class='pt5'><</span><span class='pt2 bo'>a</span><span> </span><span class='pt5'>href</span><span>=</span><span class='pt3'>"https://github.com/demille/paint"</span><span class='pt5'>></span></td></tr>
<tr><td class='ln' data-ln='63'></td><td><span> </span><span class='pt5'><</span><span class='pt2 bo'>svg</span><span> </span><span class='pt5'>role</span><span>=</span><span class='pt3'>"img"</span><span> </span><span class='pt5'>viewBox</span><span>=</span><span class='pt3'>"0 0 24 24"</span><span> </span><span class='pt5'>xmlns</span><span>=</span><span class='pt3'>"http://www.w3.org/2000/svg"</span><span class='pt5'>></span></td></tr>
<tr><td class='ln' data-ln='64'></td><td><span> </span><span class='pt5'><</span><span class='pt2 bo'>path</span><span> </span><span class='pt5'>d</span><span>=</span><span class='pt3'>"M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12"</span><span class='pt5'>/></span></td></tr>
<tr><td class='ln' data-ln='65'></td><td><span> </span><span class='pt5'></</span><span class='pt2 bo'>svg</span><span class='pt5'>></span></td></tr>
<tr><td class='ln' data-ln='66'></td><td><span> </span><span class='pt5'><</span><span class='pt2 bo'>span</span><span class='pt5'>></span><span>/demille/paint</span><span class='pt5'></</span><span class='pt2 bo'>span</span><span class='pt5'>></span></td></tr>
<tr><td class='ln' data-ln='67'></td><td><span> </span><span class='pt5'></</span><span class='pt2 bo'>a</span><span class='pt5'>></span></td></tr>
<tr><td class='ln' data-ln='68'></td><td><span> </span><span class='pt5'></</span><span class='pt2 bo'>div</span><span class='pt5'>></span></td></tr>
<tr><td class='ln' data-ln='69'></td><td> </td></tr>
<tr><td class='ln' data-ln='70'></td><td><span> </span><span class='pt5'></</span><span class='pt2 bo'>div</span><span class='pt5'>></span><span> </span><span class='pt5'><!-- container --></span></td></tr>
<tr><td class='ln' data-ln='71'></td><td> </td></tr>
<tr><td class='ln' data-ln='72'></td><td><span> </span><span class='pt5'><</span><span class='pt2 bo'>div</span><span> </span><span class='pt5'>class</span><span>=</span><span class='pt3'>"bg-overlay"</span><span class='pt5'>></</span><span class='pt2 bo'>div</span><span class='pt5'>></span></td></tr>
<tr><td class='ln' data-ln='73'></td><td> </td></tr>
<tr><td class='ln' data-ln='74'></td><td><span> </span><span class='pt5'><</span><span class='pt2 bo'>script</span><span> </span><span class='pt5'>src</span><span>=</span><span class='pt3'>"main.js"</span><span class='pt5'>></</span><span class='pt2 bo'>script</span><span class='pt5'>></span></td></tr>
<tr><td class='ln' data-ln='75'></td><td><span class='pt5'></</span><span class='pt2 bo'>body</span><span class='pt5'>></span></td></tr>
<tr><td class='ln' data-ln='76'></td><td><span class='pt5'></</span><span class='pt2 bo'>html</span><span class='pt5'>></span></td></tr>
</table>
</div>
</div>
</div>
<div class='style' id='P--wombat--html'>
<div class='P--wombat-bordered'>
<div class="info header">
<span class="left">index.html</span>
<span class="right"><span>76 lines</span><span>3.60 KB</span></span>
</div>
<div class='P--wombat'>
<table>
<tr><td class='ln' data-ln='1'></td><td><span class='pt25'><!</span><span class='pt23'>DOCTYPE</span><span> html</span><span class='pt25'>></span></td></tr>
<tr><td class='ln' data-ln='2'></td><td><span class='pt25'><</span><span class='pt23'>html</span><span class='pt25'>></span></td></tr>
<tr><td class='ln' data-ln='3'></td><td class='hi'><span class='pt25'><</span><span class='pt23'>head</span><span class='pt25'>></span></td></tr>
<tr><td class='ln' data-ln='4'></td><td class='hi'><span> </span><span class='pt25'><</span><span class='pt23'>meta</span><span class='pt19'> charset=</span><span class='pt25'>"</span><span class='pt15'>utf-8</span><span class='pt25'>" /></span></td></tr>
<tr><td class='ln' data-ln='5'></td><td class='hi'><span> </span><span class='pt25'><</span><span class='pt23'>meta</span><span class='pt19'> http-equiv=</span><span class='pt25'>"</span><span class='pt15'>X-UA-Compatible</span><span class='pt25'>"</span><span class='pt19'> content=</span><span class='pt25'>"</span><span class='pt15'>IE=edge</span><span class='pt25'>"></span></td></tr>
<tr><td class='ln' data-ln='6'></td><td class='hi'><span> </span><span class='pt25'><</span><span class='pt23'>title</span><span class='pt25'>></span><span>paint demo</span><span class='pt25'></</span><span class='pt23'>title</span><span class='pt25'>></span></td></tr>
<tr><td class='ln' data-ln='7'></td><td class='hi'><span> </span><span class='pt25'><</span><span class='pt23'>meta</span><span class='pt19'> name=</span><span class='pt25'>"</span><span class='pt15'>viewport</span><span class='pt25'>"</span><span class='pt19'> content=</span><span class='pt25'>"</span><span class='pt15'>width=device-width, initial-scale=1</span><span class='pt25'>"></span></td></tr>
<tr><td class='ln' data-ln='8'></td><td class='hi'><span> </span><span class='pt25'><</span><span class='pt23'>link</span><span class='pt19'> rel=</span><span class='pt25'>"</span><span class='pt15'>stylesheet</span><span class='pt25'>"</span><span class='pt19'> type=</span><span class='pt25'>"</span><span class='pt15'>text/css</span><span class='pt25'>"</span><span class='pt19'> media=</span><span class='pt25'>"</span><span class='pt15'>screen</span><span class='pt25'>"</span><span class='pt19'> href=</span><span class='pt25'>"</span><span class='pt15'>main.css</span><span class='pt25'>" /></span></td></tr>
<tr><td class='ln' data-ln='9'></td><td class='hi'><span> </span><span class='pt25'><</span><span class='pt23'>link</span><span class='pt19'> rel=</span><span class='pt25'>"</span><span class='pt15'>stylesheet</span><span class='pt25'>"</span><span class='pt19'> type=</span><span class='pt25'>"</span><span class='pt15'>text/css</span><span class='pt25'>"</span><span class='pt19'> media=</span><span class='pt25'>"</span><span class='pt15'>screen</span><span class='pt25'>"</span><span class='pt19'> href=</span><span class='pt25'>"</span><span class='pt15'>snippets.css</span><span class='pt25'>" /></span></td></tr>
<tr><td class='ln' data-ln='10'></td><td class='hi'><span class='pt25'></</span><span class='pt23'>head</span><span class='pt25'>></span></td></tr>
<tr><td class='ln' data-ln='11'></td><td><span class='pt25'><</span><span class='pt23'>body</span><span class='pt25'>></span></td></tr>
<tr><td class='ln' data-ln='12'></td><td><span> </span><span class='pt25'><</span><span class='pt23'>div</span><span class='pt19'> class=</span><span class='pt25'>"</span><span class='pt19'>container</span><span class='pt25'>"></span></td></tr>
<tr><td class='ln' data-ln='13'></td><td><span> </span><span class='pt25'><</span><span class='pt23'>div</span><span class='pt19'> class=</span><span class='pt25'>"</span><span class='pt19'>command</span><span class='pt25'>"></span></td></tr>
<tr><td class='ln' data-ln='14'></td><td><span> </span><span class='pt25'><</span><span class='pt23'>h1</span><span class='pt25'>></span></td></tr>
<tr><td class='ln' data-ln='15'></td><td><span> </span><span class='pt25'><</span><span class='pt23'>span</span><span class='pt19'> class=</span><span class='pt25'>"</span><span class='pt19'>hue-rotate</span><span class='pt25'>"></span><span>$</span><span class='pt25'></</span><span class='pt23'>span</span><span class='pt25'>></span><span> paint</span></td></tr>
<tr><td class='ln' data-ln='16'></td><td><span> ./file.</span><span class='pt25'><</span><span class='pt23'>span</span><span class='pt19'> id=</span><span class='pt25'>"</span><span class='pt19'>ext</span><span class='pt25'>"></span><span>rs</span><span class='pt25'></</span><span class='pt23'>span</span><span class='pt25'>></span></td></tr>
<tr><td class='ln' data-ln='17'></td><td><span> </span><span class='pt25'><</span><span class='pt23'>nobr</span><span class='pt25'>></span><span>--style="</span><span class='pt25'><</span><span class='pt23'>span</span><span class='pt19'> id=</span><span class='pt25'>"</span><span class='pt19'>style-name</span><span class='pt25'>"></span><span>github</span><span class='pt25'></</span><span class='pt23'>span</span><span class='pt25'>></span><span>"</span><span class='pt25'></</span><span class='pt23'>nobr</span><span class='pt25'>></span></td></tr>
<tr><td class='ln' data-ln='18'></td><td><span> </span><span class='pt25'><</span><span class='pt23'>nobr</span><span class='pt25'>></span><span>--gist-like</span><span class='pt25'></</span><span class='pt23'>nobr</span><span class='pt25'>></span></td></tr>
<tr><td class='ln' data-ln='19'></td><td><span> </span><span class='pt25'><</span><span class='pt23'>nobr</span><span class='pt25'>><</span><span class='pt23'>span</span><span class='pt19'> id=</span><span class='pt25'>"</span><span class='pt19'>lines</span><span class='pt25'>"></</span><span class='pt23'>span</span><span class='pt25'>></</span><span class='pt23'>nobr</span><span class='pt25'>></span></td></tr>
<tr><td class='ln' data-ln='20'></td><td><span> </span><span class='pt25'></</span><span class='pt23'>h1</span><span class='pt25'>></span></td></tr>
<tr><td class='ln' data-ln='21'></td><td><span> </span><span class='pt25'></</span><span class='pt23'>div</span><span class='pt25'>></span></td></tr>
<tr><td class='ln' data-ln='22'></td><td> </td></tr>
<tr><td class='ln' data-ln='23'></td><td><span> </span><span class='pt25'><</span><span class='pt23'>div</span><span class='pt19'> class=</span><span class='pt25'>"</span><span class='pt19'>flex-centered</span><span class='pt25'>"></span></td></tr>
<tr><td class='ln' data-ln='24'></td><td><span> </span><span class='pt25'><</span><span class='pt23'>select</span><span> </span><span class='pt19'>id=</span><span class='pt25'>"</span><span class='pt15'>filetype</span><span class='pt25'>"></span></td></tr>
<tr><td class='ln' data-ln='25'></td><td><span> </span><span class='pt25'><</span><span class='pt23'>option</span><span> </span><span class='pt19'>selected</span><span> </span><span class='pt19'>value=</span><span class='pt25'>"</span><span class='pt15'>rs</span><span class='pt25'>"></span><span>rust</span><span class='pt25'></</span><span class='pt23'>option</span><span class='pt25'>></span></td></tr>
<tr><td class='ln' data-ln='26'></td><td><span> </span><span class='pt25'><</span><span class='pt23'>option</span><span> </span><span class='pt19'>value=</span><span class='pt25'>"</span><span class='pt15'>js</span><span class='pt25'>"></span><span>javascript</span><span class='pt25'></</span><span class='pt23'>option</span><span class='pt25'>></span></td></tr>
<tr><td class='ln' data-ln='27'></td><td><span> </span><span class='pt25'><</span><span class='pt23'>option</span><span> </span><span class='pt19'>value=</span><span class='pt25'>"</span><span class='pt15'>jsx</span><span class='pt25'>"></span><span>jsx</span><span class='pt25'></</span><span class='pt23'>option</span><span class='pt25'>></span></td></tr>
<tr><td class='ln' data-ln='28'></td><td><span> </span><span class='pt25'><</span><span class='pt23'>option</span><span> </span><span class='pt19'>value=</span><span class='pt25'>"</span><span class='pt15'>html</span><span class='pt25'>"></span><span>html</span><span class='pt25'></</span><span class='pt23'>option</span><span class='pt25'>></span></td></tr>
<tr><td class='ln' data-ln='29'></td><td><span> </span><span class='pt25'><</span><span class='pt23'>option</span><span> </span><span class='pt19'>value=</span><span class='pt25'>"</span><span class='pt15'>c</span><span class='pt25'>"></span><span>c</span><span class='pt25'></</span><span class='pt23'>option</span><span class='pt25'>></span></td></tr>
<tr><td class='ln' data-ln='30'></td><td><span> </span><span class='pt25'><</span><span class='pt23'>option</span><span> </span><span class='pt19'>value=</span><span class='pt25'>"</span><span class='pt15'>py</span><span class='pt25'>"></span><span>python</span><span class='pt25'></</span><span class='pt23'>option</span><span class='pt25'>></span></td></tr>
<tr><td class='ln' data-ln='31'></td><td><span> </span><span class='pt25'><</span><span class='pt23'>option</span><span> </span><span class='pt19'>value=</span><span class='pt25'>"</span><span class='pt15'>go</span><span class='pt25'>"></span><span>go</span><span class='pt25'></</span><span class='pt23'>option</span><span class='pt25'>></span></td></tr>
<tr><td class='ln' data-ln='32'></td><td><span> </span><span class='pt25'></</span><span class='pt23'>select</span><span class='pt25'>></span></td></tr>
<tr><td class='ln' data-ln='33'></td><td> </td></tr>
<tr><td class='ln' data-ln='34'></td><td><span> </span><span class='pt25'><</span><span class='pt23'>select</span><span> </span><span class='pt19'>id=</span><span class='pt25'>"</span><span class='pt15'>style</span><span class='pt25'>"></span></td></tr>
<tr><td class='ln' data-ln='35'></td><td><span> </span><span class='pt25'><</span><span class='pt23'>option</span><span> </span><span class='pt19'>value=</span><span class='pt25'>"</span><span class='pt15'>atom_dark</span><span class='pt25'>"></span><span>atom dark</span><span class='pt25'></</span><span class='pt23'>option</span><span class='pt25'>></span></td></tr>
<tr><td class='ln' data-ln='36'></td><td><span> </span><span class='pt25'><</span><span class='pt23'>option</span><span> </span><span class='pt19'>value=</span><span class='pt25'>"</span><span class='pt15'>ayu_dark</span><span class='pt25'>"></span><span>ayu dark</span><span class='pt25'></</span><span class='pt23'>option</span><span class='pt25'>></span></td></tr>
<tr><td class='ln' data-ln='37'></td><td><span> </span><span class='pt25'><</span><span class='pt23'>option</span><span> </span><span class='pt19'>value=</span><span class='pt25'>"</span><span class='pt15'>ayu_light</span><span class='pt25'>"></span><span>ayu light</span><span class='pt25'></</span><span class='pt23'>option</span><span class='pt25'>></span></td></tr>
<tr><td class='ln' data-ln='38'></td><td><span> </span><span class='pt25'><</span><span class='pt23'>option</span><span> </span><span class='pt19'>value=</span><span class='pt25'>"</span><span class='pt15'>ayu_mirage</span><span class='pt25'>"></span><span>ayu mirage</span><span class='pt25'></</span><span class='pt23'>option</span><span class='pt25'>></span></td></tr>
<tr><td class='ln' data-ln='39'></td><td><span> </span><span class='pt25'><</span><span class='pt23'>option</span><span> </span><span class='pt19'>value=</span><span class='pt25'>"</span><span class='pt15'>cobalt2</span><span class='pt25'>"></span><span>cobalt2</span><span class='pt25'></</span><span class='pt23'>option</span><span class='pt25'>></span></td></tr>
<tr><td class='ln' data-ln='40'></td><td><span> </span><span class='pt25'><</span><span class='pt23'>option</span><span> </span><span class='pt19'>value=</span><span class='pt25'>"</span><span class='pt15'>dracula</span><span class='pt25'>"></span><span>dracula</span><span class='pt25'></</span><span class='pt23'>option</span><span class='pt25'>></span></td></tr>
<tr><td class='ln' data-ln='41'></td><td><span> </span><span class='pt25'><</span><span class='pt23'>option</span><span> </span><span class='pt19'>selected</span><span> </span><span class='pt19'>value=</span><span class='pt25'>"</span><span class='pt15'>github</span><span class='pt25'>"></span><span>github</span><span class='pt25'></</span><span class='pt23'>option</span><span class='pt25'>></span></td></tr>
<tr><td class='ln' data-ln='42'></td><td><span> </span><span class='pt25'><</span><span class='pt23'>option</span><span> </span><span class='pt19'>value=</span><span class='pt25'>"</span><span class='pt15'>monokai_extended</span><span class='pt25'>"></span><span>monokai extended</span><span class='pt25'></</span><span class='pt23'>option</span><span class='pt25'>></span></td></tr>
<tr><td class='ln' data-ln='43'></td><td><span> </span><span class='pt25'><</span><span class='pt23'>option</span><span> </span><span class='pt19'>value=</span><span class='pt25'>"</span><span class='pt15'>oceanic_next</span><span class='pt25'>"></span><span>oceanic next</span><span class='pt25'></</span><span class='pt23'>option</span><span class='pt25'>></span></td></tr>
<tr><td class='ln' data-ln='44'></td><td><span> </span><span class='pt25'><</span><span class='pt23'>option</span><span> </span><span class='pt19'>value=</span><span class='pt25'>"</span><span class='pt15'>one_dark</span><span class='pt25'>"></span><span>one dark</span><span class='pt25'></</span><span class='pt23'>option</span><span class='pt25'>></span></td></tr>
<tr><td class='ln' data-ln='45'></td><td><span> </span><span class='pt25'><</span><span class='pt23'>option</span><span> </span><span class='pt19'>value=</span><span class='pt25'>"</span><span class='pt15'>one_light</span><span class='pt25'>"></span><span>one light</span><span class='pt25'></</span><span class='pt23'>option</span><span class='pt25'>></span></td></tr>
<tr><td class='ln' data-ln='46'></td><td><span> </span><span class='pt25'><</span><span class='pt23'>option</span><span> </span><span class='pt19'>value=</span><span class='pt25'>"</span><span class='pt15'>one_monokai</span><span class='pt25'>"></span><span>one monokai</span><span class='pt25'></</span><span class='pt23'>option</span><span class='pt25'>></span></td></tr>
<tr><td class='ln' data-ln='47'></td><td><span> </span><span class='pt25'><</span><span class='pt23'>option</span><span> </span><span class='pt19'>value=</span><span class='pt25'>"</span><span class='pt15'>predawn</span><span class='pt25'>"></span><span>predawn</span><span class='pt25'></</span><span class='pt23'>option</span><span class='pt25'>></span></td></tr>
<tr><td class='ln' data-ln='48'></td><td><span> </span><span class='pt25'><</span><span class='pt23'>option</span><span> </span><span class='pt19'>value=</span><span class='pt25'>"</span><span class='pt15'>solarized_dark</span><span class='pt25'>"></span><span>solarized dark</span><span class='pt25'></</span><span class='pt23'>option</span><span class='pt25'>></span></td></tr>
<tr><td class='ln' data-ln='49'></td><td><span> </span><span class='pt25'><</span><span class='pt23'>option</span><span> </span><span class='pt19'>value=</span><span class='pt25'>"</span><span class='pt15'>solarized_light</span><span class='pt25'>"></span><span>solarized light</span><span class='pt25'></</span><span class='pt23'>option</span><span class='pt25'>></span></td></tr>
<tr><td class='ln' data-ln='50'></td><td><span> </span><span class='pt25'><</span><span class='pt23'>option</span><span> </span><span class='pt19'>value=</span><span class='pt25'>"</span><span class='pt15'>wombat</span><span class='pt25'>"></span><span>wombat</span><span class='pt25'></</span><span class='pt23'>option</span><span class='pt25'>></span></td></tr>
<tr><td class='ln' data-ln='51'></td><td><span> </span><span class='pt25'></</span><span class='pt23'>select</span><span class='pt25'>></span></td></tr>
<tr><td class='ln' data-ln='52'></td><td> </td></tr>
<tr><td class='ln' data-ln='53'></td><td><span> </span><span class='pt25'><</span><span class='pt23'>input</span><span> </span><span class='pt19'>id=</span><span class='pt25'>"</span><span class='pt15'>highlight</span><span class='pt25'>"</span><span> </span><span class='pt19'>type=</span><span class='pt25'>"</span><span class='pt15'>checkbox</span><span class='pt25'>" /></span></td></tr>
<tr><td class='ln' data-ln='54'></td><td><span> </span><span class='pt25'><</span><span class='pt23'>label</span><span> </span><span class='pt19'>for=</span><span class='pt25'>"</span><span class='pt15'>highlight</span><span class='pt25'>"><</span><span class='pt23'>nobr</span><span class='pt25'>></span><span>--highlight</span><span class='pt25'></</span><span class='pt23'>nobr</span><span class='pt25'>></</span><span class='pt23'>label</span><span class='pt25'>></span></td></tr>
<tr><td class='ln' data-ln='55'></td><td><span> </span><span class='pt25'></</span><span class='pt23'>div</span><span class='pt25'>></span></td></tr>
<tr><td class='ln' data-ln='56'></td><td> </td></tr>
<tr><td class='ln' data-ln='57'></td><td> </td></tr>
<tr><td class='ln' data-ln='58'></td><td><span> </span><span class='pt25'><</span><span class='pt23'>div</span><span class='pt19'> id=</span><span class='pt25'>"</span><span class='pt19'>highlighted</span><span class='pt25'>"</span><span class='pt19'> class=</span><span class='pt25'>"</span><span class='pt19'>no-hi</span><span class='pt25'>"</span><span class='pt19'> data-style=</span><span class='pt25'>"</span><span class='pt15'>github--rs</span><span class='pt25'>"</span><span class='pt19'> data-filetype=</span><span class='pt25'>"</span><span class='pt15'>rs</span><span class='pt25'>"></span></td></tr>
<tr><td class='ln' data-ln='59'></td><td><span> </span><span class='pt25'></</span><span class='pt23'>div</span><span class='pt25'>></span><span> </span><span class='pt16 it'><!-- highlighted --></span></td></tr>
<tr><td class='ln' data-ln='60'></td><td> </td></tr>
<tr><td class='ln' data-ln='61'></td><td><span> </span><span class='pt25'><</span><span class='pt23'>div</span><span class='pt19'> class=</span><span class='pt25'>"</span><span class='pt19'>gh</span><span class='pt25'>"></span></td></tr>
<tr><td class='ln' data-ln='62'></td><td><span> </span><span class='pt25'><</span><span class='pt23'>a</span><span> </span><span class='pt19'>href=</span><span class='pt25'>"</span><span class='pt15'>https://github.com/demille/paint</span><span class='pt25'>"></span></td></tr>
<tr><td class='ln' data-ln='63'></td><td><span> </span><span class='pt25'><</span><span class='pt23'>svg</span><span class='pt19'> role=</span><span class='pt25'>"</span><span class='pt15'>img</span><span class='pt25'>"</span><span class='pt19'> viewBox=</span><span class='pt25'>"</span><span class='pt15'>0 0 24 24</span><span class='pt25'>"</span><span class='pt19'> xmlns=</span><span class='pt25'>"</span><span class='pt15'>http://www.w3.org/2000/svg</span><span class='pt25'>"></span></td></tr>
<tr><td class='ln' data-ln='64'></td><td><span> </span><span class='pt25'><</span><span class='pt23'>path</span><span class='pt19'> d=</span><span class='pt25'>"</span><span class='pt15'>M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12</span><span class='pt25'>"/></span></td></tr>
<tr><td class='ln' data-ln='65'></td><td><span> </span><span class='pt25'></</span><span class='pt23'>svg</span><span class='pt25'>></span></td></tr>
<tr><td class='ln' data-ln='66'></td><td><span> </span><span class='pt25'><</span><span class='pt23'>span</span><span class='pt25'>></span><span>/demille/paint</span><span class='pt25'></</span><span class='pt23'>span</span><span class='pt25'>></span></td></tr>
<tr><td class='ln' data-ln='67'></td><td><span> </span><span class='pt25'></</span><span class='pt23'>a</span><span class='pt25'>></span></td></tr>
<tr><td class='ln' data-ln='68'></td><td><span> </span><span class='pt25'></</span><span class='pt23'>div</span><span class='pt25'>></span></td></tr>
<tr><td class='ln' data-ln='69'></td><td> </td></tr>
<tr><td class='ln' data-ln='70'></td><td><span> </span><span class='pt25'></</span><span class='pt23'>div</span><span class='pt25'>></span><span> </span><span class='pt16 it'><!-- container --></span></td></tr>
<tr><td class='ln' data-ln='71'></td><td> </td></tr>
<tr><td class='ln' data-ln='72'></td><td><span> </span><span class='pt25'><</span><span class='pt23'>div</span><span class='pt19'> class=</span><span class='pt25'>"</span><span class='pt19'>bg-overlay</span><span class='pt25'>"></</span><span class='pt23'>div</span><span class='pt25'>></span></td></tr>
<tr><td class='ln' data-ln='73'></td><td> </td></tr>
<tr><td class='ln' data-ln='74'></td><td><span> </span><span class='pt25'><</span><span class='it'>script</span><span> </span><span class='pt19'>src=</span><span class='pt25'>"</span><span class='pt15'>main.js</span><span class='pt25'>"></</span><span class='it'>script</span><span class='pt25'>></span></td></tr>
<tr><td class='ln' data-ln='75'></td><td><span class='pt25'></</span><span class='pt23'>body</span><span class='pt25'>></span></td></tr>
<tr><td class='ln' data-ln='76'></td><td><span class='pt25'></</span><span class='pt23'>html</span><span class='pt25'>></span></td></tr>
</table>
</div>
</div>
</div>
<div class='style' id='P--atom_dark--js'>
<div class='P--atom_dark-bordered'>
<div class="info header">
<span class="left">rust_types.js</span>
<span class="right"><span>132 lines</span><span>2.75 KB</span></span>
</div>
<div class='P--atom_dark'>
<table>
<tr><td class='ln' data-ln='1'></td><td><span class='pt4'>import</span><span> </span><span class='pt16'>Struct</span><span> </span><span class='pt4'>from</span><span> </span><span class='pt9'>'./Struct'</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='2'></td><td><span class='pt4'>import</span><span> { </span><span class='pt16'>types</span><span>, </span><span class='pt16'>parseType</span><span>, </span><span class='pt16'>Pointer</span><span> } </span><span class='pt4'>from</span><span> </span><span class='pt9'>'./types'</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='3'></td><td><span class='pt4'>import</span><span> { </span><span class='pt16'>assert</span><span>, </span><span class='pt16'>vslice</span><span> } </span><span class='pt4'>from</span><span> </span><span class='pt9'>'./misc'</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='4'></td><td> </td></tr>
<tr><td class='ln' data-ln='5'></td><td> </td></tr>
<tr><td class='ln' data-ln='6'></td><td><span class='pt2 it'>const</span><span> </span><span class='pt16'>DATA</span><span> = (</span><span class='pt4'>typeof</span><span> </span><span class='pt22'>Symbol</span><span> </span><span class='pt4'>!==</span><span> </span><span class='pt9'>'undefined'</span><span>)</span></td></tr>
<tr><td class='ln' data-ln='7'></td><td><span> </span><span class='pt4'>?</span><span> </span><span class='pt22'>Symbol</span><span>.</span><span class='pt16'>for</span><span>(</span><span class='pt9'>'struct-data'</span><span>)</span></td></tr>
<tr><td class='ln' data-ln='8'></td><td><span> </span><span class='pt4'>:</span><span> </span><span class='pt9'>'__data'</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='9'></td><td> </td></tr>
<tr><td class='ln' data-ln='10'></td><td> </td></tr>
<tr><td class='ln' data-ln='11'></td><td class='hi'><span class='pt2 it'>function</span><span> </span><span class='pt25'>extend</span><span>(</span><span class='pt13 it'>StructType</span><span>) {</span></td></tr>
<tr><td class='ln' data-ln='12'></td><td class='hi'><span> </span><span class='pt2 it'>class</span><span> </span><span class='pt28 un'>RustType</span><span> </span><span class='pt2 it'>extends</span><span> </span><span class='pt16'>StructType</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='13'></td><td class='hi'><span> </span><span class='pt25'>free</span><span>() {</span></td></tr>
<tr><td class='ln' data-ln='14'></td><td class='hi'><span> </span><span class='pt16'>super</span><span>.</span><span class='pt16'>free</span><span>(</span><span class='pt12'>true</span><span>);</span></td></tr>
<tr><td class='ln' data-ln='15'></td><td class='hi'><span> }</span></td></tr>
<tr><td class='ln' data-ln='16'></td><td class='hi'><span> }</span></td></tr>
<tr><td class='ln' data-ln='17'></td><td class='hi'> </td></tr>
<tr><td class='ln' data-ln='18'></td><td class='hi'><span> </span><span class='pt22'>Object</span><span>.</span><span class='pt16'>assign</span><span>(</span><span class='pt16'>RustType</span><span>, </span><span class='pt16'>StructType</span><span>);</span></td></tr>
<tr><td class='ln' data-ln='19'></td><td class='hi'><span> </span><span class='pt4'>return</span><span> </span><span class='pt16'>RustType</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='20'></td><td class='hi'><span>}</span></td></tr>
<tr><td class='ln' data-ln='21'></td><td> </td></tr>
<tr><td class='ln' data-ln='22'></td><td> </td></tr>
<tr><td class='ln' data-ln='23'></td><td><span class='pt2 it'>function</span><span> </span><span class='pt25'>RustTuple</span><span>(</span><span class='pt4'>...</span><span class='pt13 it'>tupleTypes</span><span>) {</span></td></tr>
<tr><td class='ln' data-ln='24'></td><td><span> </span><span class='pt2 it'>const</span><span> </span><span class='pt16'>fields</span><span> = {};</span></td></tr>
<tr><td class='ln' data-ln='25'></td><td> </td></tr>
<tr><td class='ln' data-ln='26'></td><td><span> </span><span class='pt16'>tupleTypes</span><span>.</span><span class='pt16'>forEach</span><span>((</span><span class='pt13 it'>type</span><span>, </span><span class='pt13 it'>i</span><span>) </span><span class='pt2 it'>=></span><span> {</span></td></tr>
<tr><td class='ln' data-ln='27'></td><td><span> </span><span class='pt16'>fields</span><span>[</span><span class='pt16'>i</span><span>] = </span><span class='pt16'>parseType</span><span>(</span><span class='pt16'>type</span><span>);</span></td></tr>
<tr><td class='ln' data-ln='28'></td><td><span> });</span></td></tr>
<tr><td class='ln' data-ln='29'></td><td> </td></tr>
<tr><td class='ln' data-ln='30'></td><td><span> </span><span class='pt4'>return</span><span> </span><span class='pt4'>new</span><span> </span><span class='pt16'>Struct</span><span>(</span><span class='pt16'>fields</span><span>);</span></td></tr>
<tr><td class='ln' data-ln='31'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='32'></td><td> </td></tr>
<tr><td class='ln' data-ln='33'></td><td> </td></tr>
<tr><td class='ln' data-ln='34'></td><td><span class='pt2 it'>function</span><span> </span><span class='pt25'>RustVector</span><span>(</span><span class='pt13 it'>typedef</span><span>) {</span></td></tr>
<tr><td class='ln' data-ln='35'></td><td><span> </span><span class='pt2 it'>const</span><span> </span><span class='pt16'>type</span><span> = </span><span class='pt16'>parseType</span><span>(</span><span class='pt16'>typedef</span><span>);</span></td></tr>
<tr><td class='ln' data-ln='36'></td><td> </td></tr>
<tr><td class='ln' data-ln='37'></td><td><span> </span><span class='pt2 it'>const</span><span> </span><span class='pt16'>Vector</span><span> = </span><span class='pt16'>extend</span><span>(</span><span class='pt4'>new</span><span> </span><span class='pt16'>Struct</span><span>({</span></td></tr>
<tr><td class='ln' data-ln='38'></td><td><span> </span><span class='pt9'>ptr</span><span class='pt5'>:</span><span> </span><span class='pt16'>types</span><span>.</span><span class='pt16'>pointer</span><span>(</span><span class='pt16'>type</span><span>),</span></td></tr>
<tr><td class='ln' data-ln='39'></td><td><span> </span><span class='pt9'>cap</span><span class='pt5'>:</span><span> </span><span class='pt9'>'usize'</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='40'></td><td><span> </span><span class='pt9'>len</span><span class='pt5'>:</span><span> </span><span class='pt9'>'usize'</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='41'></td><td><span> </span><span class='pt3'>/* values */</span></td></tr>
<tr><td class='ln' data-ln='42'></td><td><span> }));</span></td></tr>
<tr><td class='ln' data-ln='43'></td><td> </td></tr>
<tr><td class='ln' data-ln='44'></td><td><span> </span><span class='pt22'>Object</span><span>.</span><span class='pt16'>defineProperty</span><span>(</span><span class='pt28 un'>Vector</span><span>.</span><span class='pt16'>prototype</span><span>, </span><span class='pt9'>'values'</span><span>, {</span></td></tr>
<tr><td class='ln' data-ln='45'></td><td><span> </span><span class='pt9'>enumerable</span><span class='pt5'>:</span><span> </span><span class='pt12'>true</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='46'></td><td> </td></tr>
<tr><td class='ln' data-ln='47'></td><td><span> </span><span class='pt25'>get</span><span>() {</span></td></tr>
<tr><td class='ln' data-ln='48'></td><td><span> </span><span class='pt2 it'>const</span><span> </span><span class='pt16'>arrayType</span><span> = </span><span class='pt16'>parseType</span><span>([</span><span class='pt16'>type</span><span>, </span><span class='pt16'>this</span><span>.</span><span class='pt16'>len</span><span>]);</span></td></tr>
<tr><td class='ln' data-ln='49'></td><td><span> </span><span class='pt2 it'>const</span><span> </span><span class='pt16'>memory</span><span> = </span><span class='pt16'>this</span><span>[</span><span class='pt16'>DATA</span><span>].</span><span class='pt16'>view</span><span>.</span><span class='pt16'>buffer</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='50'></td><td><span> </span><span class='pt2 it'>const</span><span> </span><span class='pt16'>view</span><span> = </span><span class='pt4'>new</span><span> </span><span class='pt22'>DataView</span><span>(</span><span class='pt16'>memory</span><span>, </span><span class='pt16'>this</span><span>.</span><span class='pt16'>ptr</span><span>.</span><span class='pt16'>ref</span><span>(), </span><span class='pt16'>arrayType</span><span>.</span><span class='pt16'>width</span><span>);</span></td></tr>
<tr><td class='ln' data-ln='51'></td><td> </td></tr>
<tr><td class='ln' data-ln='52'></td><td><span> </span><span class='pt4'>return</span><span> </span><span class='pt16'>arrayType</span><span>.</span><span class='pt16'>read</span><span>(</span><span class='pt16'>view</span><span>, </span><span class='pt16'>this</span><span>[</span><span class='pt16'>DATA</span><span>].</span><span class='pt16'>free</span><span>);</span></td></tr>
<tr><td class='ln' data-ln='53'></td><td><span> },</span></td></tr>
<tr><td class='ln' data-ln='54'></td><td> </td></tr>
<tr><td class='ln' data-ln='55'></td><td><span> </span><span class='pt25'>set</span><span>(</span><span class='pt13 it'>values</span><span>) {</span></td></tr>
<tr><td class='ln' data-ln='56'></td><td><span> </span><span class='pt2 it'>const</span><span> </span><span class='pt16'>len</span><span> = </span><span class='pt16'>values</span><span>.</span><span class='pt16'>length</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='57'></td><td> </td></tr>
<tr><td class='ln' data-ln='58'></td><td><span> </span><span class='pt16'>this</span><span>.</span><span class='pt16'>ptr</span><span> = </span><span class='pt4'>new</span><span> </span><span class='pt16'>Pointer</span><span>([</span><span class='pt16'>type</span><span>, </span><span class='pt16'>len</span><span>], </span><span class='pt16'>values</span><span>);</span></td></tr>
<tr><td class='ln' data-ln='59'></td><td><span> </span><span class='pt16'>this</span><span>.</span><span class='pt16'>len</span><span> = </span><span class='pt16'>len</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='60'></td><td><span> </span><span class='pt16'>this</span><span>.</span><span class='pt16'>cap</span><span> = </span><span class='pt16'>len</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='61'></td><td><span> },</span></td></tr>
<tr><td class='ln' data-ln='62'></td><td><span> });</span></td></tr>
<tr><td class='ln' data-ln='63'></td><td> </td></tr>
<tr><td class='ln' data-ln='64'></td><td><span> </span><span class='pt4'>return</span><span> </span><span class='pt16'>Vector</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='65'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='66'></td><td> </td></tr>
<tr><td class='ln' data-ln='67'></td><td> </td></tr>
<tr><td class='ln' data-ln='68'></td><td><span class='pt2 it'>function</span><span> </span><span class='pt25'>RustOption</span><span>(</span><span class='pt13 it'>typedef</span><span>, </span><span class='pt13 it'>isNonNullable</span><span> </span><span class='pt4'>=</span><span> </span><span class='pt12'>false</span><span>, </span><span class='pt13 it'>tagSize</span><span>) {</span></td></tr>
<tr><td class='ln' data-ln='69'></td><td><span> </span><span class='pt2 it'>const</span><span> </span><span class='pt16'>type</span><span> = </span><span class='pt16'>parseType</span><span>(</span><span class='pt16'>typedef</span><span>);</span></td></tr>
<tr><td class='ln' data-ln='70'></td><td><span> </span><span class='pt2 it'>let</span><span> </span><span class='pt16'>discriminant</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='71'></td><td> </td></tr>
<tr><td class='ln' data-ln='72'></td><td><span> </span><span class='pt4'>if</span><span> (</span><span class='pt16'>tagSize</span><span>) </span><span class='pt16'>discriminant</span><span> = </span><span class='pt16'>types</span><span>[</span><span class='pt4'>`</span><span class='pt9'>uint</span><span class='pt4'>${</span><span class='pt16'>tagSize</span><span> </span><span class='pt4'>*</span><span> </span><span class='pt24'>8</span><span class='pt4'>}`</span><span>];</span></td></tr>
<tr><td class='ln' data-ln='73'></td><td><span> </span><span class='pt4'>else</span><span> </span><span class='pt4'>if</span><span> (</span><span class='pt16'>type</span><span>.</span><span class='pt16'>alignment</span><span> </span><span class='pt4'>===</span><span> </span><span class='pt24'>1</span><span>) </span><span class='pt16'>discriminant</span><span> = </span><span class='pt9'>'uint8'</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='74'></td><td><span> </span><span class='pt4'>else</span><span> </span><span class='pt4'>if</span><span> (</span><span class='pt16'>type</span><span>.</span><span class='pt16'>alignment</span><span> </span><span class='pt4'>===</span><span> </span><span class='pt24'>2</span><span>) </span><span class='pt16'>discriminant</span><span> = </span><span class='pt9'>'uint16'</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='75'></td><td><span> </span><span class='pt4'>else</span><span> </span><span class='pt16'>discriminant</span><span> = </span><span class='pt9'>'uint32'</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='76'></td><td> </td></tr>
<tr><td class='ln' data-ln='77'></td><td><span> </span><span class='pt2 it'>const</span><span> </span><span class='pt16'>fields</span><span> = (</span><span class='pt16'>isNonNullable</span><span>)</span></td></tr>
<tr><td class='ln' data-ln='78'></td><td><span> </span><span class='pt4'>?</span><span> { </span><span class='pt9'>value</span><span class='pt5'>:</span><span> </span><span class='pt16'>type</span><span> }</span></td></tr>
<tr><td class='ln' data-ln='79'></td><td><span> </span><span class='pt4'>:</span><span> { </span><span class='pt16'>discriminant</span><span>, </span><span class='pt9'>value</span><span class='pt5'>:</span><span> </span><span class='pt16'>type</span><span> };</span></td></tr>
<tr><td class='ln' data-ln='80'></td><td> </td></tr>
<tr><td class='ln' data-ln='81'></td><td><span> </span><span class='pt2 it'>const</span><span> </span><span class='pt16'>Option</span><span> = </span><span class='pt4'>new</span><span> </span><span class='pt16'>Struct</span><span>(</span><span class='pt16'>fields</span><span>);</span></td></tr>
<tr><td class='ln' data-ln='82'></td><td> </td></tr>
<tr><td class='ln' data-ln='83'></td><td><span> </span><span class='pt22'>Object</span><span>.</span><span class='pt16'>assign</span><span>(</span><span class='pt28 un'>Option</span><span>.</span><span class='pt16'>prototype</span><span>, {</span></td></tr>
<tr><td class='ln' data-ln='84'></td><td><span> </span><span class='pt25'>isSome</span><span>() {</span></td></tr>
<tr><td class='ln' data-ln='85'></td><td><span> </span><span class='pt4'>return</span><span> (</span><span class='pt9'>'discriminant'</span><span> </span><span class='pt4'>in</span><span> </span><span class='pt16'>fields</span><span>) </span><span class='pt4'>?</span><span> !!</span><span class='pt16'>this</span><span>.</span><span class='pt16'>discriminant</span><span> </span><span class='pt4'>:</span><span> !!</span><span class='pt16'>this</span><span>.</span><span class='pt16'>value</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='86'></td><td><span> },</span></td></tr>
<tr><td class='ln' data-ln='87'></td><td> </td></tr>
<tr><td class='ln' data-ln='88'></td><td><span> </span><span class='pt25'>isNone</span><span>() {</span></td></tr>
<tr><td class='ln' data-ln='89'></td><td><span> </span><span class='pt4'>return</span><span> !</span><span class='pt16'>this</span><span>.</span><span class='pt16'>isSome</span><span>();</span></td></tr>
<tr><td class='ln' data-ln='90'></td><td><span> },</span></td></tr>
<tr><td class='ln' data-ln='91'></td><td> </td></tr>
<tr><td class='ln' data-ln='92'></td><td><span> </span><span class='pt25'>expect</span><span>(</span><span class='pt13 it'>msg</span><span>) {</span></td></tr>
<tr><td class='ln' data-ln='93'></td><td><span> </span><span class='pt4'>if</span><span> (</span><span class='pt4'>!</span><span class='pt16'>this</span><span>.</span><span class='pt16'>isSome</span><span>()) </span><span class='pt4'>throw</span><span> </span><span class='pt4'>new</span><span> </span><span class='pt22'>Error</span><span>(</span><span class='pt16'>msg</span><span>);</span></td></tr>
<tr><td class='ln' data-ln='94'></td><td><span> </span><span class='pt4'>return</span><span> </span><span class='pt16'>this</span><span>.</span><span class='pt16'>value</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='95'></td><td><span> },</span></td></tr>
<tr><td class='ln' data-ln='96'></td><td> </td></tr>
<tr><td class='ln' data-ln='97'></td><td><span> </span><span class='pt25'>unwrap</span><span>() {</span></td></tr>
<tr><td class='ln' data-ln='98'></td><td><span> </span><span class='pt4'>if</span><span> (</span><span class='pt4'>!</span><span class='pt16'>this</span><span>.</span><span class='pt16'>isSome</span><span>()) </span><span class='pt4'>throw</span><span> </span><span class='pt4'>new</span><span> </span><span class='pt22'>Error</span><span>(</span><span class='pt9'>'Error unwrapping none'</span><span>);</span></td></tr>
<tr><td class='ln' data-ln='99'></td><td><span> </span><span class='pt4'>return</span><span> </span><span class='pt16'>this</span><span>.</span><span class='pt16'>value</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='100'></td><td><span> },</span></td></tr>
<tr><td class='ln' data-ln='101'></td><td> </td></tr>
<tr><td class='ln' data-ln='102'></td><td><span> </span><span class='pt25'>unwrapOr</span><span>(</span><span class='pt13 it'>defaultValue</span><span>) {</span></td></tr>
<tr><td class='ln' data-ln='103'></td><td><span> </span><span class='pt4'>return</span><span> (</span><span class='pt16'>this</span><span>.</span><span class='pt16'>isSome</span><span>()) </span><span class='pt4'>?</span><span> </span><span class='pt16'>this</span><span>.</span><span class='pt16'>value</span><span> </span><span class='pt4'>:</span><span> </span><span class='pt16'>defaultValue</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='104'></td><td><span> },</span></td></tr>
<tr><td class='ln' data-ln='105'></td><td> </td></tr>
<tr><td class='ln' data-ln='106'></td><td><span> </span><span class='pt25'>unwrapOrElse</span><span>(</span><span class='pt13 it'>fn</span><span>) {</span></td></tr>
<tr><td class='ln' data-ln='107'></td><td><span> </span><span class='pt4'>return</span><span> (</span><span class='pt16'>this</span><span>.</span><span class='pt16'>isSome</span><span>()) </span><span class='pt4'>?</span><span> </span><span class='pt16'>this</span><span>.</span><span class='pt16'>value</span><span> </span><span class='pt4'>:</span><span> </span><span class='pt16'>fn</span><span>();</span></td></tr>
<tr><td class='ln' data-ln='108'></td><td><span> },</span></td></tr>
<tr><td class='ln' data-ln='109'></td><td><span> });</span></td></tr>
<tr><td class='ln' data-ln='110'></td><td> </td></tr>
<tr><td class='ln' data-ln='111'></td><td><span> </span><span class='pt4'>return</span><span> </span><span class='pt16'>Option</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='112'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='113'></td><td> </td></tr>
<tr><td class='ln' data-ln='114'></td><td> </td></tr>
<tr><td class='ln' data-ln='115'></td><td><span class='pt2 it'>const</span><span> </span><span class='pt16'>rust</span><span> = {</span></td></tr>
<tr><td class='ln' data-ln='116'></td><td><span> </span><span class='pt9'>tuple</span><span class='pt5'>:</span><span> </span><span class='pt16'>RustTuple</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='117'></td><td><span> </span><span class='pt25'>Tuple</span><span>: (</span><span class='pt13 it'>type</span><span>, </span><span class='pt13 it'>values</span><span>) </span><span class='pt2 it'>=></span><span> </span><span class='pt16'>new</span><span> (</span><span class='pt16'>RustTuple</span><span>(</span><span class='pt4'>...</span><span class='pt16'>type</span><span>))([</span><span class='pt4'>...</span><span class='pt16'>values</span><span>]),</span></td></tr>
<tr><td class='ln' data-ln='118'></td><td> </td></tr>
<tr><td class='ln' data-ln='119'></td><td><span> </span><span class='pt9'>vector</span><span class='pt5'>:</span><span> </span><span class='pt16'>RustVector</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='120'></td><td><span> </span><span class='pt25'>Vector</span><span>: (</span><span class='pt13 it'>type</span><span>, </span><span class='pt13 it'>values</span><span>) </span><span class='pt2 it'>=></span><span> </span><span class='pt16'>new</span><span> (</span><span class='pt16'>RustVector</span><span>(</span><span class='pt16'>type</span><span>))({ </span><span class='pt16'>values</span><span> }),</span></td></tr>
<tr><td class='ln' data-ln='121'></td><td> </td></tr>
<tr><td class='ln' data-ln='122'></td><td><span> </span><span class='pt9'>option</span><span class='pt5'>:</span><span> </span><span class='pt16'>RustOption</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='123'></td><td><span> </span><span class='pt25'>Option</span><span>: (</span><span class='pt13 it'>type</span><span>, </span><span class='pt13 it'>value</span><span>, </span><span class='pt4'>...</span><span class='pt13 it'>opts</span><span>) </span><span class='pt2 it'>=></span><span> </span><span class='pt16'>new</span><span> (</span><span class='pt16'>RustOption</span><span>(</span><span class='pt16'>type</span><span>, </span><span class='pt4'>...</span><span class='pt16'>opts</span><span>))({</span></td></tr>
<tr><td class='ln' data-ln='124'></td><td><span> </span><span class='pt16'>value</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='125'></td><td><span> </span><span class='pt9'>discriminant</span><span class='pt5'>:</span><span> (</span><span class='pt4'>typeof</span><span> </span><span class='pt16'>value</span><span> </span><span class='pt4'>===</span><span> </span><span class='pt9'>'undefined'</span><span>) </span><span class='pt4'>?</span><span> </span><span class='pt24'>0</span><span> </span><span class='pt4'>:</span><span> </span><span class='pt24'>1</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='126'></td><td><span> }),</span></td></tr>
<tr><td class='ln' data-ln='127'></td><td> </td></tr>
<tr><td class='ln' data-ln='128'></td><td><span> </span><span class='pt25'>Some</span><span>: (</span><span class='pt4'>...</span><span class='pt13 it'>args</span><span>) </span><span class='pt2 it'>=></span><span> </span><span class='pt16'>rust</span><span>.</span><span class='pt16'>Option</span><span>(</span><span class='pt4'>...</span><span class='pt16'>args</span><span>),</span></td></tr>
<tr><td class='ln' data-ln='129'></td><td><span> </span><span class='pt25'>None</span><span>: (</span><span class='pt13 it'>type</span><span>, </span><span class='pt4'>...</span><span class='pt13 it'>opts</span><span>) </span><span class='pt2 it'>=></span><span> </span><span class='pt16'>rust</span><span>.</span><span class='pt16'>Option</span><span>(</span><span class='pt16'>type</span><span>, </span><span class='pt12'>undefined</span><span>, </span><span class='pt4'>...</span><span class='pt16'>opts</span><span>),</span></td></tr>
<tr><td class='ln' data-ln='130'></td><td><span>};</span></td></tr>
<tr><td class='ln' data-ln='131'></td><td> </td></tr>
<tr><td class='ln' data-ln='132'></td><td><span class='pt4'>export</span><span> </span><span class='pt4'>default</span><span> </span><span class='pt16'>rust</span><span>;</span></td></tr>
</table>
</div>
</div>
</div>
<div class='style' id='P--ayu_dark--js'>
<div class='P--ayu_dark-bordered'>
<div class="info header">
<span class="left">rust_types.js</span>
<span class="right"><span>132 lines</span><span>2.75 KB</span></span>
</div>
<div class='P--ayu_dark'>
<table>
<tr><td class='ln' data-ln='1'></td><td><span class='pt18'>import</span><span> Struct </span><span class='pt18'>from</span><span> </span><span class='pt13'>'./Struct'</span><span class='pt25'>;</span></td></tr>
<tr><td class='ln' data-ln='2'></td><td><span class='pt18'>import</span><span> { types, parseType, Pointer } </span><span class='pt18'>from</span><span> </span><span class='pt13'>'./types'</span><span class='pt25'>;</span></td></tr>
<tr><td class='ln' data-ln='3'></td><td><span class='pt18'>import</span><span> { assert, vslice } </span><span class='pt18'>from</span><span> </span><span class='pt13'>'./misc'</span><span class='pt25'>;</span></td></tr>
<tr><td class='ln' data-ln='4'></td><td> </td></tr>
<tr><td class='ln' data-ln='5'></td><td> </td></tr>
<tr><td class='ln' data-ln='6'></td><td><span class='pt21'>const</span><span> DATA = (</span><span class='pt18'>typeof</span><span> </span><span class='pt8 it'>Symbol</span><span> </span><span class='pt18'>!==</span><span> </span><span class='pt13'>'undefined'</span><span>)</span></td></tr>
<tr><td class='ln' data-ln='7'></td><td><span> </span><span class='pt18'>?</span><span> </span><span class='pt8 it'>Symbol</span><span>.</span><span class='pt22'>for</span><span>(</span><span class='pt13'>'struct-data'</span><span>)</span></td></tr>
<tr><td class='ln' data-ln='8'></td><td><span> </span><span class='pt18'>:</span><span> </span><span class='pt13'>'__data'</span><span class='pt25'>;</span></td></tr>
<tr><td class='ln' data-ln='9'></td><td> </td></tr>
<tr><td class='ln' data-ln='10'></td><td> </td></tr>
<tr><td class='ln' data-ln='11'></td><td class='hi'><span class='pt21'>function</span><span> </span><span class='pt22'>extend</span><span>(</span><span class='pt23'>StructType</span><span>) {</span></td></tr>
<tr><td class='ln' data-ln='12'></td><td class='hi'><span> </span><span class='pt21'>class</span><span> </span><span class='pt9'>RustType</span><span> </span><span class='pt21'>extends</span><span> StructType {</span></td></tr>
<tr><td class='ln' data-ln='13'></td><td class='hi'><span> </span><span class='pt22'>free</span><span>() {</span></td></tr>
<tr><td class='ln' data-ln='14'></td><td class='hi'><span> </span><span class='pt8 it'>super</span><span>.</span><span class='pt22'>free</span><span>(</span><span class='pt23'>true</span><span>)</span><span class='pt25'>;</span></td></tr>
<tr><td class='ln' data-ln='15'></td><td class='hi'><span> }</span></td></tr>
<tr><td class='ln' data-ln='16'></td><td class='hi'><span> }</span></td></tr>
<tr><td class='ln' data-ln='17'></td><td class='hi'> </td></tr>
<tr><td class='ln' data-ln='18'></td><td class='hi'><span> </span><span class='pt8 it'>Object</span><span>.</span><span class='pt22'>assign</span><span>(RustType, StructType)</span><span class='pt25'>;</span></td></tr>
<tr><td class='ln' data-ln='19'></td><td class='hi'><span> </span><span class='pt21'>return</span><span> RustType</span><span class='pt25'>;</span></td></tr>
<tr><td class='ln' data-ln='20'></td><td class='hi'><span>}</span></td></tr>
<tr><td class='ln' data-ln='21'></td><td> </td></tr>
<tr><td class='ln' data-ln='22'></td><td> </td></tr>
<tr><td class='ln' data-ln='23'></td><td><span class='pt21'>function</span><span> </span><span class='pt22'>RustTuple</span><span>(</span><span class='pt18'>...</span><span class='pt23'>tupleTypes</span><span>) {</span></td></tr>
<tr><td class='ln' data-ln='24'></td><td><span> </span><span class='pt21'>const</span><span> fields = {}</span><span class='pt25'>;</span></td></tr>
<tr><td class='ln' data-ln='25'></td><td> </td></tr>
<tr><td class='ln' data-ln='26'></td><td><span> tupleTypes.</span><span class='pt22'>forEach</span><span>((</span><span class='pt23'>type</span><span class='pt25'>,</span><span> </span><span class='pt23'>i</span><span>) </span><span class='pt21'>=></span><span> {</span></td></tr>
<tr><td class='ln' data-ln='27'></td><td><span> fields[i] = </span><span class='pt22'>parseType</span><span>(type)</span><span class='pt25'>;</span></td></tr>
<tr><td class='ln' data-ln='28'></td><td><span> })</span><span class='pt25'>;</span></td></tr>
<tr><td class='ln' data-ln='29'></td><td> </td></tr>
<tr><td class='ln' data-ln='30'></td><td><span> </span><span class='pt21'>return</span><span> </span><span class='pt18'>new</span><span> </span><span class='pt22'>Struct</span><span>(fields)</span><span class='pt25'>;</span></td></tr>
<tr><td class='ln' data-ln='31'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='32'></td><td> </td></tr>
<tr><td class='ln' data-ln='33'></td><td> </td></tr>
<tr><td class='ln' data-ln='34'></td><td><span class='pt21'>function</span><span> </span><span class='pt22'>RustVector</span><span>(</span><span class='pt23'>typedef</span><span>) {</span></td></tr>
<tr><td class='ln' data-ln='35'></td><td><span> </span><span class='pt21'>const</span><span> type = </span><span class='pt22'>parseType</span><span>(typedef)</span><span class='pt25'>;</span></td></tr>
<tr><td class='ln' data-ln='36'></td><td> </td></tr>
<tr><td class='ln' data-ln='37'></td><td><span> </span><span class='pt21'>const</span><span> Vector = </span><span class='pt22'>extend</span><span>(</span><span class='pt18'>new</span><span> </span><span class='pt22'>Struct</span><span>({</span></td></tr>
<tr><td class='ln' data-ln='38'></td><td><span> </span><span class='pt13'>ptr</span><span class='pt25'>:</span><span> types.</span><span class='pt22'>pointer</span><span>(type),</span></td></tr>
<tr><td class='ln' data-ln='39'></td><td><span> </span><span class='pt13'>cap</span><span class='pt25'>:</span><span> </span><span class='pt13'>'usize'</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='40'></td><td><span> </span><span class='pt13'>len</span><span class='pt25'>:</span><span> </span><span class='pt13'>'usize'</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='41'></td><td><span> </span><span class='pt10 it'>/* values */</span></td></tr>
<tr><td class='ln' data-ln='42'></td><td><span> }))</span><span class='pt25'>;</span></td></tr>
<tr><td class='ln' data-ln='43'></td><td> </td></tr>
<tr><td class='ln' data-ln='44'></td><td><span> </span><span class='pt8 it'>Object</span><span>.</span><span class='pt22'>defineProperty</span><span>(</span><span class='pt9'>Vector</span><span>.</span><span class='pt8 it'>prototype</span><span>, </span><span class='pt13'>'values'</span><span>, {</span></td></tr>
<tr><td class='ln' data-ln='45'></td><td><span> </span><span class='pt13'>enumerable</span><span class='pt25'>:</span><span> </span><span class='pt23'>true</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='46'></td><td> </td></tr>
<tr><td class='ln' data-ln='47'></td><td><span> </span><span class='pt22'>get</span><span>() {</span></td></tr>
<tr><td class='ln' data-ln='48'></td><td><span> </span><span class='pt21'>const</span><span> arrayType = </span><span class='pt22'>parseType</span><span>([type, </span><span class='pt8 it'>this</span><span>.len])</span><span class='pt25'>;</span></td></tr>
<tr><td class='ln' data-ln='49'></td><td><span> </span><span class='pt21'>const</span><span> memory = </span><span class='pt8 it'>this</span><span>[DATA].view.buffer</span><span class='pt25'>;</span></td></tr>
<tr><td class='ln' data-ln='50'></td><td><span> </span><span class='pt21'>const</span><span> view = </span><span class='pt18'>new</span><span> </span><span class='pt8 it'>DataView</span><span>(memory, </span><span class='pt8 it'>this</span><span>.ptr.</span><span class='pt22'>ref</span><span>(), arrayType.width)</span><span class='pt25'>;</span></td></tr>
<tr><td class='ln' data-ln='51'></td><td> </td></tr>
<tr><td class='ln' data-ln='52'></td><td><span> </span><span class='pt21'>return</span><span> arrayType.</span><span class='pt22'>read</span><span>(view, </span><span class='pt8 it'>this</span><span>[DATA].free)</span><span class='pt25'>;</span></td></tr>
<tr><td class='ln' data-ln='53'></td><td><span> },</span></td></tr>
<tr><td class='ln' data-ln='54'></td><td> </td></tr>
<tr><td class='ln' data-ln='55'></td><td><span> </span><span class='pt22'>set</span><span>(</span><span class='pt23'>values</span><span>) {</span></td></tr>
<tr><td class='ln' data-ln='56'></td><td><span> </span><span class='pt21'>const</span><span> len = values.length</span><span class='pt25'>;</span></td></tr>
<tr><td class='ln' data-ln='57'></td><td> </td></tr>
<tr><td class='ln' data-ln='58'></td><td><span> </span><span class='pt8 it'>this</span><span>.ptr = </span><span class='pt18'>new</span><span> </span><span class='pt22'>Pointer</span><span>([type, len], values)</span><span class='pt25'>;</span></td></tr>
<tr><td class='ln' data-ln='59'></td><td><span> </span><span class='pt8 it'>this</span><span>.len = len</span><span class='pt25'>;</span></td></tr>
<tr><td class='ln' data-ln='60'></td><td><span> </span><span class='pt8 it'>this</span><span>.cap = len</span><span class='pt25'>;</span></td></tr>
<tr><td class='ln' data-ln='61'></td><td><span> },</span></td></tr>
<tr><td class='ln' data-ln='62'></td><td><span> })</span><span class='pt25'>;</span></td></tr>
<tr><td class='ln' data-ln='63'></td><td> </td></tr>
<tr><td class='ln' data-ln='64'></td><td><span> </span><span class='pt21'>return</span><span> Vector</span><span class='pt25'>;</span></td></tr>
<tr><td class='ln' data-ln='65'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='66'></td><td> </td></tr>
<tr><td class='ln' data-ln='67'></td><td> </td></tr>
<tr><td class='ln' data-ln='68'></td><td><span class='pt21'>function</span><span> </span><span class='pt22'>RustOption</span><span>(</span><span class='pt23'>typedef</span><span class='pt25'>,</span><span> </span><span class='pt23'>isNonNullable</span><span> </span><span class='pt18'>=</span><span> </span><span class='pt23'>false</span><span class='pt25'>,</span><span> </span><span class='pt23'>tagSize</span><span>) {</span></td></tr>
<tr><td class='ln' data-ln='69'></td><td><span> </span><span class='pt21'>const</span><span> type = </span><span class='pt22'>parseType</span><span>(typedef)</span><span class='pt25'>;</span></td></tr>
<tr><td class='ln' data-ln='70'></td><td><span> </span><span class='pt21'>let</span><span> discriminant</span><span class='pt25'>;</span></td></tr>
<tr><td class='ln' data-ln='71'></td><td> </td></tr>
<tr><td class='ln' data-ln='72'></td><td><span> </span><span class='pt21'>if</span><span> (tagSize) discriminant = types[</span><span class='pt21'>`</span><span class='pt13'>uint</span><span class='pt21'>${</span><span>tagSize </span><span class='pt18'>*</span><span> </span><span class='pt23'>8</span><span class='pt21'>}`</span><span>]</span><span class='pt25'>;</span></td></tr>
<tr><td class='ln' data-ln='73'></td><td><span> </span><span class='pt21'>else</span><span> </span><span class='pt21'>if</span><span> (type.alignment </span><span class='pt18'>===</span><span> </span><span class='pt23'>1</span><span>) discriminant = </span><span class='pt13'>'uint8'</span><span class='pt25'>;</span></td></tr>
<tr><td class='ln' data-ln='74'></td><td><span> </span><span class='pt21'>else</span><span> </span><span class='pt21'>if</span><span> (type.alignment </span><span class='pt18'>===</span><span> </span><span class='pt23'>2</span><span>) discriminant = </span><span class='pt13'>'uint16'</span><span class='pt25'>;</span></td></tr>
<tr><td class='ln' data-ln='75'></td><td><span> </span><span class='pt21'>else</span><span> discriminant = </span><span class='pt13'>'uint32'</span><span class='pt25'>;</span></td></tr>
<tr><td class='ln' data-ln='76'></td><td> </td></tr>
<tr><td class='ln' data-ln='77'></td><td><span> </span><span class='pt21'>const</span><span> fields = (isNonNullable)</span></td></tr>
<tr><td class='ln' data-ln='78'></td><td><span> </span><span class='pt18'>?</span><span> { </span><span class='pt13'>value</span><span class='pt25'>:</span><span> type }</span></td></tr>
<tr><td class='ln' data-ln='79'></td><td><span> </span><span class='pt18'>:</span><span> { discriminant, </span><span class='pt13'>value</span><span class='pt25'>:</span><span> type }</span><span class='pt25'>;</span></td></tr>
<tr><td class='ln' data-ln='80'></td><td> </td></tr>
<tr><td class='ln' data-ln='81'></td><td><span> </span><span class='pt21'>const</span><span> Option = </span><span class='pt18'>new</span><span> </span><span class='pt22'>Struct</span><span>(fields)</span><span class='pt25'>;</span></td></tr>
<tr><td class='ln' data-ln='82'></td><td> </td></tr>
<tr><td class='ln' data-ln='83'></td><td><span> </span><span class='pt8 it'>Object</span><span>.</span><span class='pt22'>assign</span><span>(</span><span class='pt9'>Option</span><span>.</span><span class='pt8 it'>prototype</span><span>, {</span></td></tr>
<tr><td class='ln' data-ln='84'></td><td><span> </span><span class='pt22'>isSome</span><span>() {</span></td></tr>
<tr><td class='ln' data-ln='85'></td><td><span> </span><span class='pt21'>return</span><span> (</span><span class='pt13'>'discriminant'</span><span> </span><span class='pt18'>in</span><span> fields) </span><span class='pt18'>?</span><span> !!</span><span class='pt8 it'>this</span><span>.discriminant </span><span class='pt18'>:</span><span> !!</span><span class='pt8 it'>this</span><span>.value</span><span class='pt25'>;</span></td></tr>
<tr><td class='ln' data-ln='86'></td><td><span> },</span></td></tr>
<tr><td class='ln' data-ln='87'></td><td> </td></tr>
<tr><td class='ln' data-ln='88'></td><td><span> </span><span class='pt22'>isNone</span><span>() {</span></td></tr>
<tr><td class='ln' data-ln='89'></td><td><span> </span><span class='pt21'>return</span><span> !</span><span class='pt8 it'>this</span><span>.</span><span class='pt22'>isSome</span><span>()</span><span class='pt25'>;</span></td></tr>
<tr><td class='ln' data-ln='90'></td><td><span> },</span></td></tr>
<tr><td class='ln' data-ln='91'></td><td> </td></tr>
<tr><td class='ln' data-ln='92'></td><td><span> </span><span class='pt22'>expect</span><span>(</span><span class='pt23'>msg</span><span>) {</span></td></tr>
<tr><td class='ln' data-ln='93'></td><td><span> </span><span class='pt21'>if</span><span> (</span><span class='pt18'>!</span><span class='pt8 it'>this</span><span>.</span><span class='pt22'>isSome</span><span>()) </span><span class='pt21'>throw</span><span> </span><span class='pt18'>new</span><span> </span><span class='pt8 it'>Error</span><span>(msg)</span><span class='pt25'>;</span></td></tr>
<tr><td class='ln' data-ln='94'></td><td><span> </span><span class='pt21'>return</span><span> </span><span class='pt8 it'>this</span><span>.value</span><span class='pt25'>;</span></td></tr>
<tr><td class='ln' data-ln='95'></td><td><span> },</span></td></tr>
<tr><td class='ln' data-ln='96'></td><td> </td></tr>
<tr><td class='ln' data-ln='97'></td><td><span> </span><span class='pt22'>unwrap</span><span>() {</span></td></tr>
<tr><td class='ln' data-ln='98'></td><td><span> </span><span class='pt21'>if</span><span> (</span><span class='pt18'>!</span><span class='pt8 it'>this</span><span>.</span><span class='pt22'>isSome</span><span>()) </span><span class='pt21'>throw</span><span> </span><span class='pt18'>new</span><span> </span><span class='pt8 it'>Error</span><span>(</span><span class='pt13'>'Error unwrapping none'</span><span>)</span><span class='pt25'>;</span></td></tr>
<tr><td class='ln' data-ln='99'></td><td><span> </span><span class='pt21'>return</span><span> </span><span class='pt8 it'>this</span><span>.value</span><span class='pt25'>;</span></td></tr>
<tr><td class='ln' data-ln='100'></td><td><span> },</span></td></tr>
<tr><td class='ln' data-ln='101'></td><td> </td></tr>
<tr><td class='ln' data-ln='102'></td><td><span> </span><span class='pt22'>unwrapOr</span><span>(</span><span class='pt23'>defaultValue</span><span>) {</span></td></tr>
<tr><td class='ln' data-ln='103'></td><td><span> </span><span class='pt21'>return</span><span> (</span><span class='pt8 it'>this</span><span>.</span><span class='pt22'>isSome</span><span>()) </span><span class='pt18'>?</span><span> </span><span class='pt8 it'>this</span><span>.value </span><span class='pt18'>:</span><span> defaultValue</span><span class='pt25'>;</span></td></tr>
<tr><td class='ln' data-ln='104'></td><td><span> },</span></td></tr>
<tr><td class='ln' data-ln='105'></td><td> </td></tr>
<tr><td class='ln' data-ln='106'></td><td><span> </span><span class='pt22'>unwrapOrElse</span><span>(</span><span class='pt23'>fn</span><span>) {</span></td></tr>
<tr><td class='ln' data-ln='107'></td><td><span> </span><span class='pt21'>return</span><span> (</span><span class='pt8 it'>this</span><span>.</span><span class='pt22'>isSome</span><span>()) </span><span class='pt18'>?</span><span> </span><span class='pt8 it'>this</span><span>.value </span><span class='pt18'>:</span><span> </span><span class='pt22'>fn</span><span>()</span><span class='pt25'>;</span></td></tr>
<tr><td class='ln' data-ln='108'></td><td><span> },</span></td></tr>
<tr><td class='ln' data-ln='109'></td><td><span> })</span><span class='pt25'>;</span></td></tr>
<tr><td class='ln' data-ln='110'></td><td> </td></tr>
<tr><td class='ln' data-ln='111'></td><td><span> </span><span class='pt21'>return</span><span> Option</span><span class='pt25'>;</span></td></tr>
<tr><td class='ln' data-ln='112'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='113'></td><td> </td></tr>
<tr><td class='ln' data-ln='114'></td><td> </td></tr>
<tr><td class='ln' data-ln='115'></td><td><span class='pt21'>const</span><span> rust = {</span></td></tr>
<tr><td class='ln' data-ln='116'></td><td><span> </span><span class='pt13'>tuple</span><span class='pt25'>:</span><span> RustTuple,</span></td></tr>
<tr><td class='ln' data-ln='117'></td><td><span> </span><span class='pt22'>Tuple</span><span class='pt25'>:</span><span> (</span><span class='pt23'>type</span><span class='pt25'>,</span><span> </span><span class='pt23'>values</span><span>) </span><span class='pt21'>=></span><span> </span><span class='pt22'>new</span><span> (</span><span class='pt22'>RustTuple</span><span>(</span><span class='pt18'>...</span><span>type))([</span><span class='pt18'>...</span><span>values]),</span></td></tr>
<tr><td class='ln' data-ln='118'></td><td> </td></tr>
<tr><td class='ln' data-ln='119'></td><td><span> </span><span class='pt13'>vector</span><span class='pt25'>:</span><span> RustVector,</span></td></tr>
<tr><td class='ln' data-ln='120'></td><td><span> </span><span class='pt22'>Vector</span><span class='pt25'>:</span><span> (</span><span class='pt23'>type</span><span class='pt25'>,</span><span> </span><span class='pt23'>values</span><span>) </span><span class='pt21'>=></span><span> </span><span class='pt22'>new</span><span> (</span><span class='pt22'>RustVector</span><span>(type))({ values }),</span></td></tr>
<tr><td class='ln' data-ln='121'></td><td> </td></tr>
<tr><td class='ln' data-ln='122'></td><td><span> </span><span class='pt13'>option</span><span class='pt25'>:</span><span> RustOption,</span></td></tr>
<tr><td class='ln' data-ln='123'></td><td><span> </span><span class='pt22'>Option</span><span class='pt25'>:</span><span> (</span><span class='pt23'>type</span><span class='pt25'>,</span><span> </span><span class='pt23'>value</span><span class='pt25'>,</span><span> </span><span class='pt18'>...</span><span class='pt23'>opts</span><span>) </span><span class='pt21'>=></span><span> </span><span class='pt22'>new</span><span> (</span><span class='pt22'>RustOption</span><span>(type, </span><span class='pt18'>...</span><span>opts))({</span></td></tr>
<tr><td class='ln' data-ln='124'></td><td><span> value,</span></td></tr>
<tr><td class='ln' data-ln='125'></td><td><span> </span><span class='pt13'>discriminant</span><span class='pt25'>:</span><span> (</span><span class='pt18'>typeof</span><span> value </span><span class='pt18'>===</span><span> </span><span class='pt13'>'undefined'</span><span>) </span><span class='pt18'>?</span><span> </span><span class='pt23'>0</span><span> </span><span class='pt18'>:</span><span> </span><span class='pt23'>1</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='126'></td><td><span> }),</span></td></tr>
<tr><td class='ln' data-ln='127'></td><td> </td></tr>
<tr><td class='ln' data-ln='128'></td><td><span> </span><span class='pt22'>Some</span><span class='pt25'>:</span><span> (</span><span class='pt18'>...</span><span class='pt23'>args</span><span>) </span><span class='pt21'>=></span><span> rust.</span><span class='pt22'>Option</span><span>(</span><span class='pt18'>...</span><span>args),</span></td></tr>
<tr><td class='ln' data-ln='129'></td><td><span> </span><span class='pt22'>None</span><span class='pt25'>:</span><span> (</span><span class='pt23'>type</span><span class='pt25'>,</span><span> </span><span class='pt18'>...</span><span class='pt23'>opts</span><span>) </span><span class='pt21'>=></span><span> rust.</span><span class='pt22'>Option</span><span>(type, </span><span class='pt23'>undefined</span><span>, </span><span class='pt18'>...</span><span>opts),</span></td></tr>
<tr><td class='ln' data-ln='130'></td><td><span>}</span><span class='pt25'>;</span></td></tr>
<tr><td class='ln' data-ln='131'></td><td> </td></tr>
<tr><td class='ln' data-ln='132'></td><td><span class='pt18'>export</span><span> </span><span class='pt21'>default</span><span> rust</span><span class='pt25'>;</span></td></tr>
</table>
</div>
</div>
</div>
<div class='style' id='P--ayu_light--js'>
<div class='P--ayu_light-bordered'>
<div class="info header">
<span class="left">rust_types.js</span>
<span class="right"><span>132 lines</span><span>2.75 KB</span></span>
</div>
<div class='P--ayu_light'>
<table>
<tr><td class='ln' data-ln='1'></td><td><span class='pt17'>import</span><span> Struct </span><span class='pt17'>from</span><span> </span><span class='pt10'>'./Struct'</span><span class='pt26'>;</span></td></tr>
<tr><td class='ln' data-ln='2'></td><td><span class='pt17'>import</span><span> { types, parseType, Pointer } </span><span class='pt17'>from</span><span> </span><span class='pt10'>'./types'</span><span class='pt26'>;</span></td></tr>
<tr><td class='ln' data-ln='3'></td><td><span class='pt17'>import</span><span> { assert, vslice } </span><span class='pt17'>from</span><span> </span><span class='pt10'>'./misc'</span><span class='pt26'>;</span></td></tr>
<tr><td class='ln' data-ln='4'></td><td> </td></tr>
<tr><td class='ln' data-ln='5'></td><td> </td></tr>
<tr><td class='ln' data-ln='6'></td><td><span class='pt21'>const</span><span> DATA = (</span><span class='pt17'>typeof</span><span> </span><span class='pt9 it'>Symbol</span><span> </span><span class='pt17'>!==</span><span> </span><span class='pt10'>'undefined'</span><span>)</span></td></tr>
<tr><td class='ln' data-ln='7'></td><td><span> </span><span class='pt17'>?</span><span> </span><span class='pt9 it'>Symbol</span><span>.</span><span class='pt19'>for</span><span>(</span><span class='pt10'>'struct-data'</span><span>)</span></td></tr>
<tr><td class='ln' data-ln='8'></td><td><span> </span><span class='pt17'>:</span><span> </span><span class='pt10'>'__data'</span><span class='pt26'>;</span></td></tr>
<tr><td class='ln' data-ln='9'></td><td> </td></tr>
<tr><td class='ln' data-ln='10'></td><td> </td></tr>
<tr><td class='ln' data-ln='11'></td><td class='hi'><span class='pt21'>function</span><span> </span><span class='pt19'>extend</span><span>(</span><span class='pt11'>StructType</span><span>) {</span></td></tr>
<tr><td class='ln' data-ln='12'></td><td class='hi'><span> </span><span class='pt21'>class</span><span> </span><span class='pt7'>RustType</span><span> </span><span class='pt21'>extends</span><span> StructType {</span></td></tr>
<tr><td class='ln' data-ln='13'></td><td class='hi'><span> </span><span class='pt19'>free</span><span>() {</span></td></tr>
<tr><td class='ln' data-ln='14'></td><td class='hi'><span> </span><span class='pt9 it'>super</span><span>.</span><span class='pt19'>free</span><span>(</span><span class='pt22'>true</span><span>)</span><span class='pt26'>;</span></td></tr>
<tr><td class='ln' data-ln='15'></td><td class='hi'><span> }</span></td></tr>
<tr><td class='ln' data-ln='16'></td><td class='hi'><span> }</span></td></tr>
<tr><td class='ln' data-ln='17'></td><td class='hi'> </td></tr>
<tr><td class='ln' data-ln='18'></td><td class='hi'><span> </span><span class='pt9 it'>Object</span><span>.</span><span class='pt19'>assign</span><span>(RustType, StructType)</span><span class='pt26'>;</span></td></tr>
<tr><td class='ln' data-ln='19'></td><td class='hi'><span> </span><span class='pt21'>return</span><span> RustType</span><span class='pt26'>;</span></td></tr>
<tr><td class='ln' data-ln='20'></td><td class='hi'><span>}</span></td></tr>
<tr><td class='ln' data-ln='21'></td><td> </td></tr>
<tr><td class='ln' data-ln='22'></td><td> </td></tr>
<tr><td class='ln' data-ln='23'></td><td><span class='pt21'>function</span><span> </span><span class='pt19'>RustTuple</span><span>(</span><span class='pt17'>...</span><span class='pt11'>tupleTypes</span><span>) {</span></td></tr>
<tr><td class='ln' data-ln='24'></td><td><span> </span><span class='pt21'>const</span><span> fields = {}</span><span class='pt26'>;</span></td></tr>
<tr><td class='ln' data-ln='25'></td><td> </td></tr>
<tr><td class='ln' data-ln='26'></td><td><span> tupleTypes.</span><span class='pt19'>forEach</span><span>((</span><span class='pt11'>type</span><span class='pt26'>,</span><span> </span><span class='pt11'>i</span><span>) </span><span class='pt21'>=></span><span> {</span></td></tr>
<tr><td class='ln' data-ln='27'></td><td><span> fields[i] = </span><span class='pt19'>parseType</span><span>(type)</span><span class='pt26'>;</span></td></tr>
<tr><td class='ln' data-ln='28'></td><td><span> })</span><span class='pt26'>;</span></td></tr>
<tr><td class='ln' data-ln='29'></td><td> </td></tr>
<tr><td class='ln' data-ln='30'></td><td><span> </span><span class='pt21'>return</span><span> </span><span class='pt17'>new</span><span> </span><span class='pt19'>Struct</span><span>(fields)</span><span class='pt26'>;</span></td></tr>
<tr><td class='ln' data-ln='31'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='32'></td><td> </td></tr>
<tr><td class='ln' data-ln='33'></td><td> </td></tr>
<tr><td class='ln' data-ln='34'></td><td><span class='pt21'>function</span><span> </span><span class='pt19'>RustVector</span><span>(</span><span class='pt11'>typedef</span><span>) {</span></td></tr>
<tr><td class='ln' data-ln='35'></td><td><span> </span><span class='pt21'>const</span><span> type = </span><span class='pt19'>parseType</span><span>(typedef)</span><span class='pt26'>;</span></td></tr>
<tr><td class='ln' data-ln='36'></td><td> </td></tr>
<tr><td class='ln' data-ln='37'></td><td><span> </span><span class='pt21'>const</span><span> Vector = </span><span class='pt19'>extend</span><span>(</span><span class='pt17'>new</span><span> </span><span class='pt19'>Struct</span><span>({</span></td></tr>
<tr><td class='ln' data-ln='38'></td><td><span> </span><span class='pt10'>ptr</span><span class='pt26'>:</span><span> types.</span><span class='pt19'>pointer</span><span>(type),</span></td></tr>
<tr><td class='ln' data-ln='39'></td><td><span> </span><span class='pt10'>cap</span><span class='pt26'>:</span><span> </span><span class='pt10'>'usize'</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='40'></td><td><span> </span><span class='pt10'>len</span><span class='pt26'>:</span><span> </span><span class='pt10'>'usize'</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='41'></td><td><span> </span><span class='pt12 it'>/* values */</span></td></tr>
<tr><td class='ln' data-ln='42'></td><td><span> }))</span><span class='pt26'>;</span></td></tr>
<tr><td class='ln' data-ln='43'></td><td> </td></tr>
<tr><td class='ln' data-ln='44'></td><td><span> </span><span class='pt9 it'>Object</span><span>.</span><span class='pt19'>defineProperty</span><span>(</span><span class='pt7'>Vector</span><span>.</span><span class='pt9 it'>prototype</span><span>, </span><span class='pt10'>'values'</span><span>, {</span></td></tr>
<tr><td class='ln' data-ln='45'></td><td><span> </span><span class='pt10'>enumerable</span><span class='pt26'>:</span><span> </span><span class='pt22'>true</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='46'></td><td> </td></tr>
<tr><td class='ln' data-ln='47'></td><td><span> </span><span class='pt19'>get</span><span>() {</span></td></tr>
<tr><td class='ln' data-ln='48'></td><td><span> </span><span class='pt21'>const</span><span> arrayType = </span><span class='pt19'>parseType</span><span>([type, </span><span class='pt9 it'>this</span><span>.len])</span><span class='pt26'>;</span></td></tr>
<tr><td class='ln' data-ln='49'></td><td><span> </span><span class='pt21'>const</span><span> memory = </span><span class='pt9 it'>this</span><span>[DATA].view.buffer</span><span class='pt26'>;</span></td></tr>
<tr><td class='ln' data-ln='50'></td><td><span> </span><span class='pt21'>const</span><span> view = </span><span class='pt17'>new</span><span> </span><span class='pt9 it'>DataView</span><span>(memory, </span><span class='pt9 it'>this</span><span>.ptr.</span><span class='pt19'>ref</span><span>(), arrayType.width)</span><span class='pt26'>;</span></td></tr>
<tr><td class='ln' data-ln='51'></td><td> </td></tr>
<tr><td class='ln' data-ln='52'></td><td><span> </span><span class='pt21'>return</span><span> arrayType.</span><span class='pt19'>read</span><span>(view, </span><span class='pt9 it'>this</span><span>[DATA].free)</span><span class='pt26'>;</span></td></tr>
<tr><td class='ln' data-ln='53'></td><td><span> },</span></td></tr>
<tr><td class='ln' data-ln='54'></td><td> </td></tr>
<tr><td class='ln' data-ln='55'></td><td><span> </span><span class='pt19'>set</span><span>(</span><span class='pt11'>values</span><span>) {</span></td></tr>
<tr><td class='ln' data-ln='56'></td><td><span> </span><span class='pt21'>const</span><span> len = values.length</span><span class='pt26'>;</span></td></tr>
<tr><td class='ln' data-ln='57'></td><td> </td></tr>
<tr><td class='ln' data-ln='58'></td><td><span> </span><span class='pt9 it'>this</span><span>.ptr = </span><span class='pt17'>new</span><span> </span><span class='pt19'>Pointer</span><span>([type, len], values)</span><span class='pt26'>;</span></td></tr>
<tr><td class='ln' data-ln='59'></td><td><span> </span><span class='pt9 it'>this</span><span>.len = len</span><span class='pt26'>;</span></td></tr>
<tr><td class='ln' data-ln='60'></td><td><span> </span><span class='pt9 it'>this</span><span>.cap = len</span><span class='pt26'>;</span></td></tr>
<tr><td class='ln' data-ln='61'></td><td><span> },</span></td></tr>
<tr><td class='ln' data-ln='62'></td><td><span> })</span><span class='pt26'>;</span></td></tr>
<tr><td class='ln' data-ln='63'></td><td> </td></tr>
<tr><td class='ln' data-ln='64'></td><td><span> </span><span class='pt21'>return</span><span> Vector</span><span class='pt26'>;</span></td></tr>
<tr><td class='ln' data-ln='65'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='66'></td><td> </td></tr>
<tr><td class='ln' data-ln='67'></td><td> </td></tr>
<tr><td class='ln' data-ln='68'></td><td><span class='pt21'>function</span><span> </span><span class='pt19'>RustOption</span><span>(</span><span class='pt11'>typedef</span><span class='pt26'>,</span><span> </span><span class='pt11'>isNonNullable</span><span> </span><span class='pt17'>=</span><span> </span><span class='pt22'>false</span><span class='pt26'>,</span><span> </span><span class='pt11'>tagSize</span><span>) {</span></td></tr>
<tr><td class='ln' data-ln='69'></td><td><span> </span><span class='pt21'>const</span><span> type = </span><span class='pt19'>parseType</span><span>(typedef)</span><span class='pt26'>;</span></td></tr>
<tr><td class='ln' data-ln='70'></td><td><span> </span><span class='pt21'>let</span><span> discriminant</span><span class='pt26'>;</span></td></tr>
<tr><td class='ln' data-ln='71'></td><td> </td></tr>
<tr><td class='ln' data-ln='72'></td><td><span> </span><span class='pt21'>if</span><span> (tagSize) discriminant = types[</span><span class='pt21'>`</span><span class='pt10'>uint</span><span class='pt21'>${</span><span>tagSize </span><span class='pt17'>*</span><span> </span><span class='pt22'>8</span><span class='pt21'>}`</span><span>]</span><span class='pt26'>;</span></td></tr>
<tr><td class='ln' data-ln='73'></td><td><span> </span><span class='pt21'>else</span><span> </span><span class='pt21'>if</span><span> (type.alignment </span><span class='pt17'>===</span><span> </span><span class='pt22'>1</span><span>) discriminant = </span><span class='pt10'>'uint8'</span><span class='pt26'>;</span></td></tr>
<tr><td class='ln' data-ln='74'></td><td><span> </span><span class='pt21'>else</span><span> </span><span class='pt21'>if</span><span> (type.alignment </span><span class='pt17'>===</span><span> </span><span class='pt22'>2</span><span>) discriminant = </span><span class='pt10'>'uint16'</span><span class='pt26'>;</span></td></tr>
<tr><td class='ln' data-ln='75'></td><td><span> </span><span class='pt21'>else</span><span> discriminant = </span><span class='pt10'>'uint32'</span><span class='pt26'>;</span></td></tr>
<tr><td class='ln' data-ln='76'></td><td> </td></tr>
<tr><td class='ln' data-ln='77'></td><td><span> </span><span class='pt21'>const</span><span> fields = (isNonNullable)</span></td></tr>
<tr><td class='ln' data-ln='78'></td><td><span> </span><span class='pt17'>?</span><span> { </span><span class='pt10'>value</span><span class='pt26'>:</span><span> type }</span></td></tr>
<tr><td class='ln' data-ln='79'></td><td><span> </span><span class='pt17'>:</span><span> { discriminant, </span><span class='pt10'>value</span><span class='pt26'>:</span><span> type }</span><span class='pt26'>;</span></td></tr>
<tr><td class='ln' data-ln='80'></td><td> </td></tr>
<tr><td class='ln' data-ln='81'></td><td><span> </span><span class='pt21'>const</span><span> Option = </span><span class='pt17'>new</span><span> </span><span class='pt19'>Struct</span><span>(fields)</span><span class='pt26'>;</span></td></tr>
<tr><td class='ln' data-ln='82'></td><td> </td></tr>
<tr><td class='ln' data-ln='83'></td><td><span> </span><span class='pt9 it'>Object</span><span>.</span><span class='pt19'>assign</span><span>(</span><span class='pt7'>Option</span><span>.</span><span class='pt9 it'>prototype</span><span>, {</span></td></tr>
<tr><td class='ln' data-ln='84'></td><td><span> </span><span class='pt19'>isSome</span><span>() {</span></td></tr>
<tr><td class='ln' data-ln='85'></td><td><span> </span><span class='pt21'>return</span><span> (</span><span class='pt10'>'discriminant'</span><span> </span><span class='pt17'>in</span><span> fields) </span><span class='pt17'>?</span><span> !!</span><span class='pt9 it'>this</span><span>.discriminant </span><span class='pt17'>:</span><span> !!</span><span class='pt9 it'>this</span><span>.value</span><span class='pt26'>;</span></td></tr>
<tr><td class='ln' data-ln='86'></td><td><span> },</span></td></tr>
<tr><td class='ln' data-ln='87'></td><td> </td></tr>
<tr><td class='ln' data-ln='88'></td><td><span> </span><span class='pt19'>isNone</span><span>() {</span></td></tr>
<tr><td class='ln' data-ln='89'></td><td><span> </span><span class='pt21'>return</span><span> !</span><span class='pt9 it'>this</span><span>.</span><span class='pt19'>isSome</span><span>()</span><span class='pt26'>;</span></td></tr>
<tr><td class='ln' data-ln='90'></td><td><span> },</span></td></tr>
<tr><td class='ln' data-ln='91'></td><td> </td></tr>
<tr><td class='ln' data-ln='92'></td><td><span> </span><span class='pt19'>expect</span><span>(</span><span class='pt11'>msg</span><span>) {</span></td></tr>
<tr><td class='ln' data-ln='93'></td><td><span> </span><span class='pt21'>if</span><span> (</span><span class='pt17'>!</span><span class='pt9 it'>this</span><span>.</span><span class='pt19'>isSome</span><span>()) </span><span class='pt21'>throw</span><span> </span><span class='pt17'>new</span><span> </span><span class='pt9 it'>Error</span><span>(msg)</span><span class='pt26'>;</span></td></tr>
<tr><td class='ln' data-ln='94'></td><td><span> </span><span class='pt21'>return</span><span> </span><span class='pt9 it'>this</span><span>.value</span><span class='pt26'>;</span></td></tr>
<tr><td class='ln' data-ln='95'></td><td><span> },</span></td></tr>
<tr><td class='ln' data-ln='96'></td><td> </td></tr>
<tr><td class='ln' data-ln='97'></td><td><span> </span><span class='pt19'>unwrap</span><span>() {</span></td></tr>
<tr><td class='ln' data-ln='98'></td><td><span> </span><span class='pt21'>if</span><span> (</span><span class='pt17'>!</span><span class='pt9 it'>this</span><span>.</span><span class='pt19'>isSome</span><span>()) </span><span class='pt21'>throw</span><span> </span><span class='pt17'>new</span><span> </span><span class='pt9 it'>Error</span><span>(</span><span class='pt10'>'Error unwrapping none'</span><span>)</span><span class='pt26'>;</span></td></tr>
<tr><td class='ln' data-ln='99'></td><td><span> </span><span class='pt21'>return</span><span> </span><span class='pt9 it'>this</span><span>.value</span><span class='pt26'>;</span></td></tr>
<tr><td class='ln' data-ln='100'></td><td><span> },</span></td></tr>
<tr><td class='ln' data-ln='101'></td><td> </td></tr>
<tr><td class='ln' data-ln='102'></td><td><span> </span><span class='pt19'>unwrapOr</span><span>(</span><span class='pt11'>defaultValue</span><span>) {</span></td></tr>
<tr><td class='ln' data-ln='103'></td><td><span> </span><span class='pt21'>return</span><span> (</span><span class='pt9 it'>this</span><span>.</span><span class='pt19'>isSome</span><span>()) </span><span class='pt17'>?</span><span> </span><span class='pt9 it'>this</span><span>.value </span><span class='pt17'>:</span><span> defaultValue</span><span class='pt26'>;</span></td></tr>
<tr><td class='ln' data-ln='104'></td><td><span> },</span></td></tr>
<tr><td class='ln' data-ln='105'></td><td> </td></tr>
<tr><td class='ln' data-ln='106'></td><td><span> </span><span class='pt19'>unwrapOrElse</span><span>(</span><span class='pt11'>fn</span><span>) {</span></td></tr>
<tr><td class='ln' data-ln='107'></td><td><span> </span><span class='pt21'>return</span><span> (</span><span class='pt9 it'>this</span><span>.</span><span class='pt19'>isSome</span><span>()) </span><span class='pt17'>?</span><span> </span><span class='pt9 it'>this</span><span>.value </span><span class='pt17'>:</span><span> </span><span class='pt19'>fn</span><span>()</span><span class='pt26'>;</span></td></tr>
<tr><td class='ln' data-ln='108'></td><td><span> },</span></td></tr>
<tr><td class='ln' data-ln='109'></td><td><span> })</span><span class='pt26'>;</span></td></tr>
<tr><td class='ln' data-ln='110'></td><td> </td></tr>
<tr><td class='ln' data-ln='111'></td><td><span> </span><span class='pt21'>return</span><span> Option</span><span class='pt26'>;</span></td></tr>
<tr><td class='ln' data-ln='112'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='113'></td><td> </td></tr>
<tr><td class='ln' data-ln='114'></td><td> </td></tr>
<tr><td class='ln' data-ln='115'></td><td><span class='pt21'>const</span><span> rust = {</span></td></tr>
<tr><td class='ln' data-ln='116'></td><td><span> </span><span class='pt10'>tuple</span><span class='pt26'>:</span><span> RustTuple,</span></td></tr>
<tr><td class='ln' data-ln='117'></td><td><span> </span><span class='pt19'>Tuple</span><span class='pt26'>:</span><span> (</span><span class='pt11'>type</span><span class='pt26'>,</span><span> </span><span class='pt11'>values</span><span>) </span><span class='pt21'>=></span><span> </span><span class='pt19'>new</span><span> (</span><span class='pt19'>RustTuple</span><span>(</span><span class='pt17'>...</span><span>type))([</span><span class='pt17'>...</span><span>values]),</span></td></tr>
<tr><td class='ln' data-ln='118'></td><td> </td></tr>
<tr><td class='ln' data-ln='119'></td><td><span> </span><span class='pt10'>vector</span><span class='pt26'>:</span><span> RustVector,</span></td></tr>
<tr><td class='ln' data-ln='120'></td><td><span> </span><span class='pt19'>Vector</span><span class='pt26'>:</span><span> (</span><span class='pt11'>type</span><span class='pt26'>,</span><span> </span><span class='pt11'>values</span><span>) </span><span class='pt21'>=></span><span> </span><span class='pt19'>new</span><span> (</span><span class='pt19'>RustVector</span><span>(type))({ values }),</span></td></tr>
<tr><td class='ln' data-ln='121'></td><td> </td></tr>
<tr><td class='ln' data-ln='122'></td><td><span> </span><span class='pt10'>option</span><span class='pt26'>:</span><span> RustOption,</span></td></tr>
<tr><td class='ln' data-ln='123'></td><td><span> </span><span class='pt19'>Option</span><span class='pt26'>:</span><span> (</span><span class='pt11'>type</span><span class='pt26'>,</span><span> </span><span class='pt11'>value</span><span class='pt26'>,</span><span> </span><span class='pt17'>...</span><span class='pt11'>opts</span><span>) </span><span class='pt21'>=></span><span> </span><span class='pt19'>new</span><span> (</span><span class='pt19'>RustOption</span><span>(type, </span><span class='pt17'>...</span><span>opts))({</span></td></tr>
<tr><td class='ln' data-ln='124'></td><td><span> value,</span></td></tr>
<tr><td class='ln' data-ln='125'></td><td><span> </span><span class='pt10'>discriminant</span><span class='pt26'>:</span><span> (</span><span class='pt17'>typeof</span><span> value </span><span class='pt17'>===</span><span> </span><span class='pt10'>'undefined'</span><span>) </span><span class='pt17'>?</span><span> </span><span class='pt22'>0</span><span> </span><span class='pt17'>:</span><span> </span><span class='pt22'>1</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='126'></td><td><span> }),</span></td></tr>
<tr><td class='ln' data-ln='127'></td><td> </td></tr>
<tr><td class='ln' data-ln='128'></td><td><span> </span><span class='pt19'>Some</span><span class='pt26'>:</span><span> (</span><span class='pt17'>...</span><span class='pt11'>args</span><span>) </span><span class='pt21'>=></span><span> rust.</span><span class='pt19'>Option</span><span>(</span><span class='pt17'>...</span><span>args),</span></td></tr>
<tr><td class='ln' data-ln='129'></td><td><span> </span><span class='pt19'>None</span><span class='pt26'>:</span><span> (</span><span class='pt11'>type</span><span class='pt26'>,</span><span> </span><span class='pt17'>...</span><span class='pt11'>opts</span><span>) </span><span class='pt21'>=></span><span> rust.</span><span class='pt19'>Option</span><span>(type, </span><span class='pt22'>undefined</span><span>, </span><span class='pt17'>...</span><span>opts),</span></td></tr>
<tr><td class='ln' data-ln='130'></td><td><span>}</span><span class='pt26'>;</span></td></tr>
<tr><td class='ln' data-ln='131'></td><td> </td></tr>
<tr><td class='ln' data-ln='132'></td><td><span class='pt17'>export</span><span> </span><span class='pt21'>default</span><span> rust</span><span class='pt26'>;</span></td></tr>
</table>
</div>
</div>
</div>
<div class='style' id='P--ayu_mirage--js'>
<div class='P--ayu_mirage-bordered'>
<div class="info header">
<span class="left">rust_types.js</span>
<span class="right"><span>132 lines</span><span>2.75 KB</span></span>
</div>
<div class='P--ayu_mirage'>
<table>
<tr><td class='ln' data-ln='1'></td><td><span class='pt17'>import</span><span> Struct </span><span class='pt17'>from</span><span> </span><span class='pt12'>'./Struct'</span><span class='pt24'>;</span></td></tr>
<tr><td class='ln' data-ln='2'></td><td><span class='pt17'>import</span><span> { types, parseType, Pointer } </span><span class='pt17'>from</span><span> </span><span class='pt12'>'./types'</span><span class='pt24'>;</span></td></tr>
<tr><td class='ln' data-ln='3'></td><td><span class='pt17'>import</span><span> { assert, vslice } </span><span class='pt17'>from</span><span> </span><span class='pt12'>'./misc'</span><span class='pt24'>;</span></td></tr>
<tr><td class='ln' data-ln='4'></td><td> </td></tr>
<tr><td class='ln' data-ln='5'></td><td> </td></tr>
<tr><td class='ln' data-ln='6'></td><td><span class='pt19'>const</span><span> DATA = (</span><span class='pt17'>typeof</span><span> </span><span class='pt9 it'>Symbol</span><span> </span><span class='pt17'>!==</span><span> </span><span class='pt12'>'undefined'</span><span>)</span></td></tr>
<tr><td class='ln' data-ln='7'></td><td><span> </span><span class='pt17'>?</span><span> </span><span class='pt9 it'>Symbol</span><span>.</span><span class='pt22'>for</span><span>(</span><span class='pt12'>'struct-data'</span><span>)</span></td></tr>
<tr><td class='ln' data-ln='8'></td><td><span> </span><span class='pt17'>:</span><span> </span><span class='pt12'>'__data'</span><span class='pt24'>;</span></td></tr>
<tr><td class='ln' data-ln='9'></td><td> </td></tr>
<tr><td class='ln' data-ln='10'></td><td> </td></tr>
<tr><td class='ln' data-ln='11'></td><td class='hi'><span class='pt19'>function</span><span> </span><span class='pt22'>extend</span><span>(</span><span class='pt14'>StructType</span><span>) {</span></td></tr>
<tr><td class='ln' data-ln='12'></td><td class='hi'><span> </span><span class='pt19'>class</span><span> </span><span class='pt10'>RustType</span><span> </span><span class='pt19'>extends</span><span> StructType {</span></td></tr>
<tr><td class='ln' data-ln='13'></td><td class='hi'><span> </span><span class='pt22'>free</span><span>() {</span></td></tr>
<tr><td class='ln' data-ln='14'></td><td class='hi'><span> </span><span class='pt9 it'>super</span><span>.</span><span class='pt22'>free</span><span>(</span><span class='pt14'>true</span><span>)</span><span class='pt24'>;</span></td></tr>
<tr><td class='ln' data-ln='15'></td><td class='hi'><span> }</span></td></tr>
<tr><td class='ln' data-ln='16'></td><td class='hi'><span> }</span></td></tr>
<tr><td class='ln' data-ln='17'></td><td class='hi'> </td></tr>
<tr><td class='ln' data-ln='18'></td><td class='hi'><span> </span><span class='pt9 it'>Object</span><span>.</span><span class='pt22'>assign</span><span>(RustType, StructType)</span><span class='pt24'>;</span></td></tr>
<tr><td class='ln' data-ln='19'></td><td class='hi'><span> </span><span class='pt19'>return</span><span> RustType</span><span class='pt24'>;</span></td></tr>
<tr><td class='ln' data-ln='20'></td><td class='hi'><span>}</span></td></tr>
<tr><td class='ln' data-ln='21'></td><td> </td></tr>
<tr><td class='ln' data-ln='22'></td><td> </td></tr>
<tr><td class='ln' data-ln='23'></td><td><span class='pt19'>function</span><span> </span><span class='pt22'>RustTuple</span><span>(</span><span class='pt17'>...</span><span class='pt14'>tupleTypes</span><span>) {</span></td></tr>
<tr><td class='ln' data-ln='24'></td><td><span> </span><span class='pt19'>const</span><span> fields = {}</span><span class='pt24'>;</span></td></tr>
<tr><td class='ln' data-ln='25'></td><td> </td></tr>
<tr><td class='ln' data-ln='26'></td><td><span> tupleTypes.</span><span class='pt22'>forEach</span><span>((</span><span class='pt14'>type</span><span class='pt24'>,</span><span> </span><span class='pt14'>i</span><span>) </span><span class='pt19'>=></span><span> {</span></td></tr>
<tr><td class='ln' data-ln='27'></td><td><span> fields[i] = </span><span class='pt22'>parseType</span><span>(type)</span><span class='pt24'>;</span></td></tr>
<tr><td class='ln' data-ln='28'></td><td><span> })</span><span class='pt24'>;</span></td></tr>
<tr><td class='ln' data-ln='29'></td><td> </td></tr>
<tr><td class='ln' data-ln='30'></td><td><span> </span><span class='pt19'>return</span><span> </span><span class='pt17'>new</span><span> </span><span class='pt22'>Struct</span><span>(fields)</span><span class='pt24'>;</span></td></tr>
<tr><td class='ln' data-ln='31'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='32'></td><td> </td></tr>
<tr><td class='ln' data-ln='33'></td><td> </td></tr>
<tr><td class='ln' data-ln='34'></td><td><span class='pt19'>function</span><span> </span><span class='pt22'>RustVector</span><span>(</span><span class='pt14'>typedef</span><span>) {</span></td></tr>
<tr><td class='ln' data-ln='35'></td><td><span> </span><span class='pt19'>const</span><span> type = </span><span class='pt22'>parseType</span><span>(typedef)</span><span class='pt24'>;</span></td></tr>
<tr><td class='ln' data-ln='36'></td><td> </td></tr>
<tr><td class='ln' data-ln='37'></td><td><span> </span><span class='pt19'>const</span><span> Vector = </span><span class='pt22'>extend</span><span>(</span><span class='pt17'>new</span><span> </span><span class='pt22'>Struct</span><span>({</span></td></tr>
<tr><td class='ln' data-ln='38'></td><td><span> </span><span class='pt12'>ptr</span><span class='pt24'>:</span><span> types.</span><span class='pt22'>pointer</span><span>(type),</span></td></tr>
<tr><td class='ln' data-ln='39'></td><td><span> </span><span class='pt12'>cap</span><span class='pt24'>:</span><span> </span><span class='pt12'>'usize'</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='40'></td><td><span> </span><span class='pt12'>len</span><span class='pt24'>:</span><span> </span><span class='pt12'>'usize'</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='41'></td><td><span> </span><span class='pt8 it'>/* values */</span></td></tr>
<tr><td class='ln' data-ln='42'></td><td><span> }))</span><span class='pt24'>;</span></td></tr>
<tr><td class='ln' data-ln='43'></td><td> </td></tr>
<tr><td class='ln' data-ln='44'></td><td><span> </span><span class='pt9 it'>Object</span><span>.</span><span class='pt22'>defineProperty</span><span>(</span><span class='pt10'>Vector</span><span>.</span><span class='pt9 it'>prototype</span><span>, </span><span class='pt12'>'values'</span><span>, {</span></td></tr>
<tr><td class='ln' data-ln='45'></td><td><span> </span><span class='pt12'>enumerable</span><span class='pt24'>:</span><span> </span><span class='pt14'>true</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='46'></td><td> </td></tr>
<tr><td class='ln' data-ln='47'></td><td><span> </span><span class='pt22'>get</span><span>() {</span></td></tr>
<tr><td class='ln' data-ln='48'></td><td><span> </span><span class='pt19'>const</span><span> arrayType = </span><span class='pt22'>parseType</span><span>([type, </span><span class='pt9 it'>this</span><span>.len])</span><span class='pt24'>;</span></td></tr>
<tr><td class='ln' data-ln='49'></td><td><span> </span><span class='pt19'>const</span><span> memory = </span><span class='pt9 it'>this</span><span>[DATA].view.buffer</span><span class='pt24'>;</span></td></tr>
<tr><td class='ln' data-ln='50'></td><td><span> </span><span class='pt19'>const</span><span> view = </span><span class='pt17'>new</span><span> </span><span class='pt9 it'>DataView</span><span>(memory, </span><span class='pt9 it'>this</span><span>.ptr.</span><span class='pt22'>ref</span><span>(), arrayType.width)</span><span class='pt24'>;</span></td></tr>
<tr><td class='ln' data-ln='51'></td><td> </td></tr>
<tr><td class='ln' data-ln='52'></td><td><span> </span><span class='pt19'>return</span><span> arrayType.</span><span class='pt22'>read</span><span>(view, </span><span class='pt9 it'>this</span><span>[DATA].free)</span><span class='pt24'>;</span></td></tr>
<tr><td class='ln' data-ln='53'></td><td><span> },</span></td></tr>
<tr><td class='ln' data-ln='54'></td><td> </td></tr>
<tr><td class='ln' data-ln='55'></td><td><span> </span><span class='pt22'>set</span><span>(</span><span class='pt14'>values</span><span>) {</span></td></tr>
<tr><td class='ln' data-ln='56'></td><td><span> </span><span class='pt19'>const</span><span> len = values.length</span><span class='pt24'>;</span></td></tr>
<tr><td class='ln' data-ln='57'></td><td> </td></tr>
<tr><td class='ln' data-ln='58'></td><td><span> </span><span class='pt9 it'>this</span><span>.ptr = </span><span class='pt17'>new</span><span> </span><span class='pt22'>Pointer</span><span>([type, len], values)</span><span class='pt24'>;</span></td></tr>
<tr><td class='ln' data-ln='59'></td><td><span> </span><span class='pt9 it'>this</span><span>.len = len</span><span class='pt24'>;</span></td></tr>
<tr><td class='ln' data-ln='60'></td><td><span> </span><span class='pt9 it'>this</span><span>.cap = len</span><span class='pt24'>;</span></td></tr>
<tr><td class='ln' data-ln='61'></td><td><span> },</span></td></tr>
<tr><td class='ln' data-ln='62'></td><td><span> })</span><span class='pt24'>;</span></td></tr>
<tr><td class='ln' data-ln='63'></td><td> </td></tr>
<tr><td class='ln' data-ln='64'></td><td><span> </span><span class='pt19'>return</span><span> Vector</span><span class='pt24'>;</span></td></tr>
<tr><td class='ln' data-ln='65'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='66'></td><td> </td></tr>
<tr><td class='ln' data-ln='67'></td><td> </td></tr>
<tr><td class='ln' data-ln='68'></td><td><span class='pt19'>function</span><span> </span><span class='pt22'>RustOption</span><span>(</span><span class='pt14'>typedef</span><span class='pt24'>,</span><span> </span><span class='pt14'>isNonNullable</span><span> </span><span class='pt17'>=</span><span> </span><span class='pt14'>false</span><span class='pt24'>,</span><span> </span><span class='pt14'>tagSize</span><span>) {</span></td></tr>
<tr><td class='ln' data-ln='69'></td><td><span> </span><span class='pt19'>const</span><span> type = </span><span class='pt22'>parseType</span><span>(typedef)</span><span class='pt24'>;</span></td></tr>
<tr><td class='ln' data-ln='70'></td><td><span> </span><span class='pt19'>let</span><span> discriminant</span><span class='pt24'>;</span></td></tr>
<tr><td class='ln' data-ln='71'></td><td> </td></tr>
<tr><td class='ln' data-ln='72'></td><td><span> </span><span class='pt19'>if</span><span> (tagSize) discriminant = types[</span><span class='pt19'>`</span><span class='pt12'>uint</span><span class='pt19'>${</span><span>tagSize </span><span class='pt17'>*</span><span> </span><span class='pt14'>8</span><span class='pt19'>}`</span><span>]</span><span class='pt24'>;</span></td></tr>
<tr><td class='ln' data-ln='73'></td><td><span> </span><span class='pt19'>else</span><span> </span><span class='pt19'>if</span><span> (type.alignment </span><span class='pt17'>===</span><span> </span><span class='pt14'>1</span><span>) discriminant = </span><span class='pt12'>'uint8'</span><span class='pt24'>;</span></td></tr>
<tr><td class='ln' data-ln='74'></td><td><span> </span><span class='pt19'>else</span><span> </span><span class='pt19'>if</span><span> (type.alignment </span><span class='pt17'>===</span><span> </span><span class='pt14'>2</span><span>) discriminant = </span><span class='pt12'>'uint16'</span><span class='pt24'>;</span></td></tr>
<tr><td class='ln' data-ln='75'></td><td><span> </span><span class='pt19'>else</span><span> discriminant = </span><span class='pt12'>'uint32'</span><span class='pt24'>;</span></td></tr>
<tr><td class='ln' data-ln='76'></td><td> </td></tr>
<tr><td class='ln' data-ln='77'></td><td><span> </span><span class='pt19'>const</span><span> fields = (isNonNullable)</span></td></tr>
<tr><td class='ln' data-ln='78'></td><td><span> </span><span class='pt17'>?</span><span> { </span><span class='pt12'>value</span><span class='pt24'>:</span><span> type }</span></td></tr>
<tr><td class='ln' data-ln='79'></td><td><span> </span><span class='pt17'>:</span><span> { discriminant, </span><span class='pt12'>value</span><span class='pt24'>:</span><span> type }</span><span class='pt24'>;</span></td></tr>
<tr><td class='ln' data-ln='80'></td><td> </td></tr>
<tr><td class='ln' data-ln='81'></td><td><span> </span><span class='pt19'>const</span><span> Option = </span><span class='pt17'>new</span><span> </span><span class='pt22'>Struct</span><span>(fields)</span><span class='pt24'>;</span></td></tr>
<tr><td class='ln' data-ln='82'></td><td> </td></tr>
<tr><td class='ln' data-ln='83'></td><td><span> </span><span class='pt9 it'>Object</span><span>.</span><span class='pt22'>assign</span><span>(</span><span class='pt10'>Option</span><span>.</span><span class='pt9 it'>prototype</span><span>, {</span></td></tr>
<tr><td class='ln' data-ln='84'></td><td><span> </span><span class='pt22'>isSome</span><span>() {</span></td></tr>
<tr><td class='ln' data-ln='85'></td><td><span> </span><span class='pt19'>return</span><span> (</span><span class='pt12'>'discriminant'</span><span> </span><span class='pt17'>in</span><span> fields) </span><span class='pt17'>?</span><span> !!</span><span class='pt9 it'>this</span><span>.discriminant </span><span class='pt17'>:</span><span> !!</span><span class='pt9 it'>this</span><span>.value</span><span class='pt24'>;</span></td></tr>
<tr><td class='ln' data-ln='86'></td><td><span> },</span></td></tr>
<tr><td class='ln' data-ln='87'></td><td> </td></tr>
<tr><td class='ln' data-ln='88'></td><td><span> </span><span class='pt22'>isNone</span><span>() {</span></td></tr>
<tr><td class='ln' data-ln='89'></td><td><span> </span><span class='pt19'>return</span><span> !</span><span class='pt9 it'>this</span><span>.</span><span class='pt22'>isSome</span><span>()</span><span class='pt24'>;</span></td></tr>
<tr><td class='ln' data-ln='90'></td><td><span> },</span></td></tr>
<tr><td class='ln' data-ln='91'></td><td> </td></tr>
<tr><td class='ln' data-ln='92'></td><td><span> </span><span class='pt22'>expect</span><span>(</span><span class='pt14'>msg</span><span>) {</span></td></tr>
<tr><td class='ln' data-ln='93'></td><td><span> </span><span class='pt19'>if</span><span> (</span><span class='pt17'>!</span><span class='pt9 it'>this</span><span>.</span><span class='pt22'>isSome</span><span>()) </span><span class='pt19'>throw</span><span> </span><span class='pt17'>new</span><span> </span><span class='pt9 it'>Error</span><span>(msg)</span><span class='pt24'>;</span></td></tr>
<tr><td class='ln' data-ln='94'></td><td><span> </span><span class='pt19'>return</span><span> </span><span class='pt9 it'>this</span><span>.value</span><span class='pt24'>;</span></td></tr>
<tr><td class='ln' data-ln='95'></td><td><span> },</span></td></tr>
<tr><td class='ln' data-ln='96'></td><td> </td></tr>
<tr><td class='ln' data-ln='97'></td><td><span> </span><span class='pt22'>unwrap</span><span>() {</span></td></tr>
<tr><td class='ln' data-ln='98'></td><td><span> </span><span class='pt19'>if</span><span> (</span><span class='pt17'>!</span><span class='pt9 it'>this</span><span>.</span><span class='pt22'>isSome</span><span>()) </span><span class='pt19'>throw</span><span> </span><span class='pt17'>new</span><span> </span><span class='pt9 it'>Error</span><span>(</span><span class='pt12'>'Error unwrapping none'</span><span>)</span><span class='pt24'>;</span></td></tr>
<tr><td class='ln' data-ln='99'></td><td><span> </span><span class='pt19'>return</span><span> </span><span class='pt9 it'>this</span><span>.value</span><span class='pt24'>;</span></td></tr>
<tr><td class='ln' data-ln='100'></td><td><span> },</span></td></tr>
<tr><td class='ln' data-ln='101'></td><td> </td></tr>
<tr><td class='ln' data-ln='102'></td><td><span> </span><span class='pt22'>unwrapOr</span><span>(</span><span class='pt14'>defaultValue</span><span>) {</span></td></tr>
<tr><td class='ln' data-ln='103'></td><td><span> </span><span class='pt19'>return</span><span> (</span><span class='pt9 it'>this</span><span>.</span><span class='pt22'>isSome</span><span>()) </span><span class='pt17'>?</span><span> </span><span class='pt9 it'>this</span><span>.value </span><span class='pt17'>:</span><span> defaultValue</span><span class='pt24'>;</span></td></tr>
<tr><td class='ln' data-ln='104'></td><td><span> },</span></td></tr>
<tr><td class='ln' data-ln='105'></td><td> </td></tr>
<tr><td class='ln' data-ln='106'></td><td><span> </span><span class='pt22'>unwrapOrElse</span><span>(</span><span class='pt14'>fn</span><span>) {</span></td></tr>
<tr><td class='ln' data-ln='107'></td><td><span> </span><span class='pt19'>return</span><span> (</span><span class='pt9 it'>this</span><span>.</span><span class='pt22'>isSome</span><span>()) </span><span class='pt17'>?</span><span> </span><span class='pt9 it'>this</span><span>.value </span><span class='pt17'>:</span><span> </span><span class='pt22'>fn</span><span>()</span><span class='pt24'>;</span></td></tr>
<tr><td class='ln' data-ln='108'></td><td><span> },</span></td></tr>
<tr><td class='ln' data-ln='109'></td><td><span> })</span><span class='pt24'>;</span></td></tr>
<tr><td class='ln' data-ln='110'></td><td> </td></tr>
<tr><td class='ln' data-ln='111'></td><td><span> </span><span class='pt19'>return</span><span> Option</span><span class='pt24'>;</span></td></tr>
<tr><td class='ln' data-ln='112'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='113'></td><td> </td></tr>
<tr><td class='ln' data-ln='114'></td><td> </td></tr>
<tr><td class='ln' data-ln='115'></td><td><span class='pt19'>const</span><span> rust = {</span></td></tr>
<tr><td class='ln' data-ln='116'></td><td><span> </span><span class='pt12'>tuple</span><span class='pt24'>:</span><span> RustTuple,</span></td></tr>
<tr><td class='ln' data-ln='117'></td><td><span> </span><span class='pt22'>Tuple</span><span class='pt24'>:</span><span> (</span><span class='pt14'>type</span><span class='pt24'>,</span><span> </span><span class='pt14'>values</span><span>) </span><span class='pt19'>=></span><span> </span><span class='pt22'>new</span><span> (</span><span class='pt22'>RustTuple</span><span>(</span><span class='pt17'>...</span><span>type))([</span><span class='pt17'>...</span><span>values]),</span></td></tr>
<tr><td class='ln' data-ln='118'></td><td> </td></tr>
<tr><td class='ln' data-ln='119'></td><td><span> </span><span class='pt12'>vector</span><span class='pt24'>:</span><span> RustVector,</span></td></tr>
<tr><td class='ln' data-ln='120'></td><td><span> </span><span class='pt22'>Vector</span><span class='pt24'>:</span><span> (</span><span class='pt14'>type</span><span class='pt24'>,</span><span> </span><span class='pt14'>values</span><span>) </span><span class='pt19'>=></span><span> </span><span class='pt22'>new</span><span> (</span><span class='pt22'>RustVector</span><span>(type))({ values }),</span></td></tr>
<tr><td class='ln' data-ln='121'></td><td> </td></tr>
<tr><td class='ln' data-ln='122'></td><td><span> </span><span class='pt12'>option</span><span class='pt24'>:</span><span> RustOption,</span></td></tr>
<tr><td class='ln' data-ln='123'></td><td><span> </span><span class='pt22'>Option</span><span class='pt24'>:</span><span> (</span><span class='pt14'>type</span><span class='pt24'>,</span><span> </span><span class='pt14'>value</span><span class='pt24'>,</span><span> </span><span class='pt17'>...</span><span class='pt14'>opts</span><span>) </span><span class='pt19'>=></span><span> </span><span class='pt22'>new</span><span> (</span><span class='pt22'>RustOption</span><span>(type, </span><span class='pt17'>...</span><span>opts))({</span></td></tr>
<tr><td class='ln' data-ln='124'></td><td><span> value,</span></td></tr>
<tr><td class='ln' data-ln='125'></td><td><span> </span><span class='pt12'>discriminant</span><span class='pt24'>:</span><span> (</span><span class='pt17'>typeof</span><span> value </span><span class='pt17'>===</span><span> </span><span class='pt12'>'undefined'</span><span>) </span><span class='pt17'>?</span><span> </span><span class='pt14'>0</span><span> </span><span class='pt17'>:</span><span> </span><span class='pt14'>1</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='126'></td><td><span> }),</span></td></tr>
<tr><td class='ln' data-ln='127'></td><td> </td></tr>
<tr><td class='ln' data-ln='128'></td><td><span> </span><span class='pt22'>Some</span><span class='pt24'>:</span><span> (</span><span class='pt17'>...</span><span class='pt14'>args</span><span>) </span><span class='pt19'>=></span><span> rust.</span><span class='pt22'>Option</span><span>(</span><span class='pt17'>...</span><span>args),</span></td></tr>
<tr><td class='ln' data-ln='129'></td><td><span> </span><span class='pt22'>None</span><span class='pt24'>:</span><span> (</span><span class='pt14'>type</span><span class='pt24'>,</span><span> </span><span class='pt17'>...</span><span class='pt14'>opts</span><span>) </span><span class='pt19'>=></span><span> rust.</span><span class='pt22'>Option</span><span>(type, </span><span class='pt14'>undefined</span><span>, </span><span class='pt17'>...</span><span>opts),</span></td></tr>
<tr><td class='ln' data-ln='130'></td><td><span>}</span><span class='pt24'>;</span></td></tr>
<tr><td class='ln' data-ln='131'></td><td> </td></tr>
<tr><td class='ln' data-ln='132'></td><td><span class='pt17'>export</span><span> </span><span class='pt19'>default</span><span> rust</span><span class='pt24'>;</span></td></tr>
</table>
</div>
</div>
</div>
<div class='style' id='P--cobalt2--js'>
<div class='P--cobalt2-bordered'>
<div class="info header">
<span class="left">rust_types.js</span>
<span class="right"><span>132 lines</span><span>2.75 KB</span></span>
</div>
<div class='P--cobalt2'>
<table>
<tr><td class='ln' data-ln='1'></td><td><span class='pt56'>import</span><span> </span><span class='pt41 pt4'>Struct</span><span> </span><span class='pt56'>from</span><span> </span><span class='pt23'>'./Struct'</span><span class='pt43'>;</span></td></tr>
<tr><td class='ln' data-ln='2'></td><td><span class='pt56'>import</span><span> { </span><span class='pt41 pt4'>types</span><span>, </span><span class='pt41 pt4'>parseType</span><span>, </span><span class='pt41 pt4'>Pointer</span><span> } </span><span class='pt56'>from</span><span> </span><span class='pt23'>'./types'</span><span class='pt43'>;</span></td></tr>
<tr><td class='ln' data-ln='3'></td><td><span class='pt56'>import</span><span> { </span><span class='pt41 pt4'>assert</span><span>, </span><span class='pt41 pt4'>vslice</span><span> } </span><span class='pt56'>from</span><span> </span><span class='pt23'>'./misc'</span><span class='pt43'>;</span></td></tr>
<tr><td class='ln' data-ln='4'></td><td> </td></tr>
<tr><td class='ln' data-ln='5'></td><td> </td></tr>
<tr><td class='ln' data-ln='6'></td><td><span class='pt60'>const</span><span> </span><span class='pt41 pt4'>DATA</span><span> = (</span><span class='pt56'>typeof</span><span> </span><span class='pt29'>Symbol</span><span> </span><span class='pt56'>!==</span><span> </span><span class='pt23'>'undefined'</span><span>)</span></td></tr>
<tr><td class='ln' data-ln='7'></td><td><span> </span><span class='pt56'>?</span><span> </span><span class='pt29'>Symbol</span><span>.</span><span class='pt62'>for</span><span>(</span><span class='pt23'>'struct-data'</span><span>)</span></td></tr>
<tr><td class='ln' data-ln='8'></td><td><span> </span><span class='pt56'>:</span><span> </span><span class='pt23'>'__data'</span><span class='pt43'>;</span></td></tr>
<tr><td class='ln' data-ln='9'></td><td> </td></tr>
<tr><td class='ln' data-ln='10'></td><td> </td></tr>
<tr><td class='ln' data-ln='11'></td><td class='hi'><span class='pt57 pt7'>function</span><span> </span><span class='pt60'>extend</span><span class='pt43'>(</span><span class='pt41 pt4'>StructType</span><span class='pt43'>)</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='12'></td><td class='hi'><span> </span><span class='pt56'>class</span><span> </span><span class='pt52'>RustType</span><span> </span><span class='pt60 it'>extends</span><span> </span><span class='pt41 pt4'>StructType</span><span> </span><span class='pt43'>{</span></td></tr>
<tr><td class='ln' data-ln='13'></td><td class='hi'><span> </span><span class='pt60'>free</span><span class='pt43'>()</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='14'></td><td class='hi'><span> </span><span class='pt55'>super</span><span>.</span><span class='pt62'>free</span><span>(</span><span class='pt54'>true</span><span>)</span><span class='pt43'>;</span></td></tr>
<tr><td class='ln' data-ln='15'></td><td class='hi'><span> }</span></td></tr>
<tr><td class='ln' data-ln='16'></td><td class='hi'><span> </span><span class='pt43'>}</span></td></tr>
<tr><td class='ln' data-ln='17'></td><td class='hi'> </td></tr>
<tr><td class='ln' data-ln='18'></td><td class='hi'><span> </span><span class='pt29'>Object</span><span>.</span><span class='pt62'>assign</span><span>(</span><span class='pt41 pt4'>RustType</span><span>, </span><span class='pt41 pt4'>StructType</span><span>)</span><span class='pt43'>;</span></td></tr>
<tr><td class='ln' data-ln='19'></td><td class='hi'><span> </span><span class='pt56'>return</span><span> </span><span class='pt41 pt4'>RustType</span><span class='pt43'>;</span></td></tr>
<tr><td class='ln' data-ln='20'></td><td class='hi'><span>}</span></td></tr>
<tr><td class='ln' data-ln='21'></td><td> </td></tr>
<tr><td class='ln' data-ln='22'></td><td> </td></tr>
<tr><td class='ln' data-ln='23'></td><td><span class='pt57 pt7'>function</span><span> </span><span class='pt60'>RustTuple</span><span class='pt43'>(</span><span class='pt56'>...</span><span class='pt41 pt4'>tupleTypes</span><span class='pt43'>)</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='24'></td><td><span> </span><span class='pt60'>const</span><span> </span><span class='pt41 pt4'>fields</span><span> = {}</span><span class='pt43'>;</span></td></tr>
<tr><td class='ln' data-ln='25'></td><td> </td></tr>
<tr><td class='ln' data-ln='26'></td><td><span> </span><span class='pt41 pt4'>tupleTypes</span><span>.</span><span class='pt62'>forEach</span><span>(</span><span class='pt43'>(</span><span class='pt41 pt4'>type</span><span class='pt43'>,</span><span> </span><span class='pt41 pt4'>i</span><span class='pt43'>)</span><span> </span><span class='pt60'>=></span><span> {</span></td></tr>
<tr><td class='ln' data-ln='27'></td><td><span> </span><span class='pt41 pt4'>fields</span><span>[</span><span class='pt41 pt4'>i</span><span>] = </span><span class='pt62'>parseType</span><span>(</span><span class='pt41 pt4'>type</span><span>)</span><span class='pt43'>;</span></td></tr>
<tr><td class='ln' data-ln='28'></td><td><span> })</span><span class='pt43'>;</span></td></tr>
<tr><td class='ln' data-ln='29'></td><td> </td></tr>
<tr><td class='ln' data-ln='30'></td><td><span> </span><span class='pt56'>return</span><span> </span><span class='pt56'>new</span><span> </span><span class='pt62'>Struct</span><span>(</span><span class='pt41 pt4'>fields</span><span>)</span><span class='pt43'>;</span></td></tr>
<tr><td class='ln' data-ln='31'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='32'></td><td> </td></tr>
<tr><td class='ln' data-ln='33'></td><td> </td></tr>
<tr><td class='ln' data-ln='34'></td><td><span class='pt57 pt7'>function</span><span> </span><span class='pt60'>RustVector</span><span class='pt43'>(</span><span class='pt41 pt4'>typedef</span><span class='pt43'>)</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='35'></td><td><span> </span><span class='pt60'>const</span><span> </span><span class='pt41 pt4'>type</span><span> = </span><span class='pt62'>parseType</span><span>(</span><span class='pt41 pt4'>typedef</span><span>)</span><span class='pt43'>;</span></td></tr>
<tr><td class='ln' data-ln='36'></td><td> </td></tr>
<tr><td class='ln' data-ln='37'></td><td><span> </span><span class='pt60'>const</span><span> </span><span class='pt41 pt4'>Vector</span><span> = </span><span class='pt62'>extend</span><span>(</span><span class='pt56'>new</span><span> </span><span class='pt62'>Struct</span><span>({</span></td></tr>
<tr><td class='ln' data-ln='38'></td><td><span> </span><span class='pt21'>ptr</span><span class='pt43'>:</span><span> </span><span class='pt41 pt4'>types</span><span>.</span><span class='pt62'>pointer</span><span>(</span><span class='pt41 pt4'>type</span><span>),</span></td></tr>
<tr><td class='ln' data-ln='39'></td><td><span> </span><span class='pt21'>cap</span><span class='pt43'>:</span><span> </span><span class='pt23'>'usize'</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='40'></td><td><span> </span><span class='pt21'>len</span><span class='pt43'>:</span><span> </span><span class='pt23'>'usize'</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='41'></td><td><span> </span><span class='pt19 it'>/* values */</span></td></tr>
<tr><td class='ln' data-ln='42'></td><td><span> }))</span><span class='pt43'>;</span></td></tr>
<tr><td class='ln' data-ln='43'></td><td> </td></tr>
<tr><td class='ln' data-ln='44'></td><td><span> </span><span class='pt29'>Object</span><span>.</span><span class='pt62'>defineProperty</span><span>(</span><span class='pt52'>Vector</span><span>.</span><span class='pt55'>prototype</span><span>, </span><span class='pt23'>'values'</span><span>, {</span></td></tr>
<tr><td class='ln' data-ln='45'></td><td><span> </span><span class='pt21'>enumerable</span><span class='pt43'>:</span><span> </span><span class='pt54'>true</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='46'></td><td> </td></tr>
<tr><td class='ln' data-ln='47'></td><td><span> </span><span class='pt60'>get</span><span class='pt43'>()</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='48'></td><td><span> </span><span class='pt60'>const</span><span> </span><span class='pt41 pt4'>arrayType</span><span> = </span><span class='pt62'>parseType</span><span>([</span><span class='pt41 pt4'>type</span><span>, </span><span class='pt55'>this</span><span>.</span><span class='pt41 pt4'>len</span><span>])</span><span class='pt43'>;</span></td></tr>
<tr><td class='ln' data-ln='49'></td><td><span> </span><span class='pt60'>const</span><span> </span><span class='pt41 pt4'>memory</span><span> = </span><span class='pt55'>this</span><span>[</span><span class='pt41 pt4'>DATA</span><span>].</span><span class='pt41 pt4'>view</span><span>.</span><span class='pt41 pt4'>buffer</span><span class='pt43'>;</span></td></tr>
<tr><td class='ln' data-ln='50'></td><td><span> </span><span class='pt60'>const</span><span> </span><span class='pt41 pt4'>view</span><span> = </span><span class='pt56'>new</span><span> </span><span class='pt29'>DataView</span><span>(</span><span class='pt41 pt4'>memory</span><span>, </span><span class='pt55'>this</span><span>.</span><span class='pt41 pt4'>ptr</span><span>.</span><span class='pt62'>ref</span><span>(), </span><span class='pt41 pt4'>arrayType</span><span>.</span><span class='pt41 pt4'>width</span><span>)</span><span class='pt43'>;</span></td></tr>
<tr><td class='ln' data-ln='51'></td><td> </td></tr>
<tr><td class='ln' data-ln='52'></td><td><span> </span><span class='pt56'>return</span><span> </span><span class='pt41 pt4'>arrayType</span><span>.</span><span class='pt62'>read</span><span>(</span><span class='pt41 pt4'>view</span><span>, </span><span class='pt55'>this</span><span>[</span><span class='pt41 pt4'>DATA</span><span>].</span><span class='pt41 pt4'>free</span><span>)</span><span class='pt43'>;</span></td></tr>
<tr><td class='ln' data-ln='53'></td><td><span> },</span></td></tr>
<tr><td class='ln' data-ln='54'></td><td> </td></tr>
<tr><td class='ln' data-ln='55'></td><td><span> </span><span class='pt60'>set</span><span class='pt43'>(</span><span class='pt41 pt4'>values</span><span class='pt43'>)</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='56'></td><td><span> </span><span class='pt60'>const</span><span> </span><span class='pt41 pt4'>len</span><span> = </span><span class='pt41 pt4'>values</span><span>.</span><span class='pt41 pt4'>length</span><span class='pt43'>;</span></td></tr>
<tr><td class='ln' data-ln='57'></td><td> </td></tr>
<tr><td class='ln' data-ln='58'></td><td><span> </span><span class='pt55'>this</span><span>.</span><span class='pt41 pt4'>ptr</span><span> = </span><span class='pt56'>new</span><span> </span><span class='pt62'>Pointer</span><span>([</span><span class='pt41 pt4'>type</span><span>, </span><span class='pt41 pt4'>len</span><span>], </span><span class='pt41 pt4'>values</span><span>)</span><span class='pt43'>;</span></td></tr>
<tr><td class='ln' data-ln='59'></td><td><span> </span><span class='pt55'>this</span><span>.</span><span class='pt41 pt4'>len</span><span> = </span><span class='pt41 pt4'>len</span><span class='pt43'>;</span></td></tr>
<tr><td class='ln' data-ln='60'></td><td><span> </span><span class='pt55'>this</span><span>.</span><span class='pt41 pt4'>cap</span><span> = </span><span class='pt41 pt4'>len</span><span class='pt43'>;</span></td></tr>
<tr><td class='ln' data-ln='61'></td><td><span> },</span></td></tr>
<tr><td class='ln' data-ln='62'></td><td><span> })</span><span class='pt43'>;</span></td></tr>
<tr><td class='ln' data-ln='63'></td><td> </td></tr>
<tr><td class='ln' data-ln='64'></td><td><span> </span><span class='pt56'>return</span><span> </span><span class='pt41 pt4'>Vector</span><span class='pt43'>;</span></td></tr>
<tr><td class='ln' data-ln='65'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='66'></td><td> </td></tr>
<tr><td class='ln' data-ln='67'></td><td> </td></tr>
<tr><td class='ln' data-ln='68'></td><td><span class='pt57 pt7'>function</span><span> </span><span class='pt60'>RustOption</span><span class='pt43'>(</span><span class='pt41 pt4'>typedef</span><span class='pt43'>,</span><span> </span><span class='pt41 pt4'>isNonNullable</span><span> </span><span class='pt56'>=</span><span> </span><span class='pt54'>false</span><span class='pt43'>,</span><span> </span><span class='pt41 pt4'>tagSize</span><span class='pt43'>)</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='69'></td><td><span> </span><span class='pt60'>const</span><span> </span><span class='pt41 pt4'>type</span><span> = </span><span class='pt62'>parseType</span><span>(</span><span class='pt41 pt4'>typedef</span><span>)</span><span class='pt43'>;</span></td></tr>
<tr><td class='ln' data-ln='70'></td><td><span> </span><span class='pt60'>let</span><span> </span><span class='pt41 pt4'>discriminant</span><span class='pt43'>;</span></td></tr>
<tr><td class='ln' data-ln='71'></td><td> </td></tr>
<tr><td class='ln' data-ln='72'></td><td><span> </span><span class='pt56'>if</span><span> (</span><span class='pt41 pt4'>tagSize</span><span>) </span><span class='pt41 pt4'>discriminant</span><span> = </span><span class='pt41 pt4'>types</span><span>[</span><span class='pt56'>`</span><span class='pt23'>uint</span><span class='pt56'>${</span><span class='pt41 pt4'>tagSize</span><span> </span><span class='pt56'>*</span><span> </span><span class='pt54'>8</span><span class='pt56'>}`</span><span>]</span><span class='pt43'>;</span></td></tr>
<tr><td class='ln' data-ln='73'></td><td><span> </span><span class='pt56'>else</span><span> </span><span class='pt56'>if</span><span> (</span><span class='pt41 pt4'>type</span><span>.</span><span class='pt41 pt4'>alignment</span><span> </span><span class='pt56'>===</span><span> </span><span class='pt54'>1</span><span>) </span><span class='pt41 pt4'>discriminant</span><span> = </span><span class='pt23'>'uint8'</span><span class='pt43'>;</span></td></tr>
<tr><td class='ln' data-ln='74'></td><td><span> </span><span class='pt56'>else</span><span> </span><span class='pt56'>if</span><span> (</span><span class='pt41 pt4'>type</span><span>.</span><span class='pt41 pt4'>alignment</span><span> </span><span class='pt56'>===</span><span> </span><span class='pt54'>2</span><span>) </span><span class='pt41 pt4'>discriminant</span><span> = </span><span class='pt23'>'uint16'</span><span class='pt43'>;</span></td></tr>
<tr><td class='ln' data-ln='75'></td><td><span> </span><span class='pt56'>else</span><span> </span><span class='pt41 pt4'>discriminant</span><span> = </span><span class='pt23'>'uint32'</span><span class='pt43'>;</span></td></tr>
<tr><td class='ln' data-ln='76'></td><td> </td></tr>
<tr><td class='ln' data-ln='77'></td><td><span> </span><span class='pt60'>const</span><span> </span><span class='pt41 pt4'>fields</span><span> = (</span><span class='pt41 pt4'>isNonNullable</span><span>)</span></td></tr>
<tr><td class='ln' data-ln='78'></td><td><span> </span><span class='pt56'>?</span><span> { </span><span class='pt21'>value</span><span class='pt43'>:</span><span> </span><span class='pt41 pt4'>type</span><span> }</span></td></tr>
<tr><td class='ln' data-ln='79'></td><td><span> </span><span class='pt56'>:</span><span> { </span><span class='pt41 pt4'>discriminant</span><span>, </span><span class='pt21'>value</span><span class='pt43'>:</span><span> </span><span class='pt41 pt4'>type</span><span> }</span><span class='pt43'>;</span></td></tr>
<tr><td class='ln' data-ln='80'></td><td> </td></tr>
<tr><td class='ln' data-ln='81'></td><td><span> </span><span class='pt60'>const</span><span> </span><span class='pt41 pt4'>Option</span><span> = </span><span class='pt56'>new</span><span> </span><span class='pt62'>Struct</span><span>(</span><span class='pt41 pt4'>fields</span><span>)</span><span class='pt43'>;</span></td></tr>
<tr><td class='ln' data-ln='82'></td><td> </td></tr>
<tr><td class='ln' data-ln='83'></td><td><span> </span><span class='pt29'>Object</span><span>.</span><span class='pt62'>assign</span><span>(</span><span class='pt52'>Option</span><span>.</span><span class='pt55'>prototype</span><span>, {</span></td></tr>
<tr><td class='ln' data-ln='84'></td><td><span> </span><span class='pt60'>isSome</span><span class='pt43'>()</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='85'></td><td><span> </span><span class='pt56'>return</span><span> (</span><span class='pt23'>'discriminant'</span><span> </span><span class='pt56'>in</span><span> </span><span class='pt41 pt4'>fields</span><span>) </span><span class='pt56'>?</span><span> !!</span><span class='pt55'>this</span><span>.</span><span class='pt41 pt4'>discriminant</span><span> </span><span class='pt56'>:</span><span> !!</span><span class='pt55'>this</span><span>.</span><span class='pt41 pt4'>value</span><span class='pt43'>;</span></td></tr>
<tr><td class='ln' data-ln='86'></td><td><span> },</span></td></tr>
<tr><td class='ln' data-ln='87'></td><td> </td></tr>
<tr><td class='ln' data-ln='88'></td><td><span> </span><span class='pt60'>isNone</span><span class='pt43'>()</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='89'></td><td><span> </span><span class='pt56'>return</span><span> !</span><span class='pt55'>this</span><span>.</span><span class='pt62'>isSome</span><span>()</span><span class='pt43'>;</span></td></tr>
<tr><td class='ln' data-ln='90'></td><td><span> },</span></td></tr>
<tr><td class='ln' data-ln='91'></td><td> </td></tr>
<tr><td class='ln' data-ln='92'></td><td><span> </span><span class='pt60'>expect</span><span class='pt43'>(</span><span class='pt41 pt4'>msg</span><span class='pt43'>)</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='93'></td><td><span> </span><span class='pt56'>if</span><span> (</span><span class='pt56'>!</span><span class='pt55'>this</span><span>.</span><span class='pt62'>isSome</span><span>()) </span><span class='pt56'>throw</span><span> </span><span class='pt56'>new</span><span> </span><span class='pt29'>Error</span><span>(</span><span class='pt41 pt4'>msg</span><span>)</span><span class='pt43'>;</span></td></tr>
<tr><td class='ln' data-ln='94'></td><td><span> </span><span class='pt56'>return</span><span> </span><span class='pt55'>this</span><span>.</span><span class='pt41 pt4'>value</span><span class='pt43'>;</span></td></tr>
<tr><td class='ln' data-ln='95'></td><td><span> },</span></td></tr>
<tr><td class='ln' data-ln='96'></td><td> </td></tr>
<tr><td class='ln' data-ln='97'></td><td><span> </span><span class='pt60'>unwrap</span><span class='pt43'>()</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='98'></td><td><span> </span><span class='pt56'>if</span><span> (</span><span class='pt56'>!</span><span class='pt55'>this</span><span>.</span><span class='pt62'>isSome</span><span>()) </span><span class='pt56'>throw</span><span> </span><span class='pt56'>new</span><span> </span><span class='pt29'>Error</span><span>(</span><span class='pt23'>'Error unwrapping none'</span><span>)</span><span class='pt43'>;</span></td></tr>
<tr><td class='ln' data-ln='99'></td><td><span> </span><span class='pt56'>return</span><span> </span><span class='pt55'>this</span><span>.</span><span class='pt41 pt4'>value</span><span class='pt43'>;</span></td></tr>
<tr><td class='ln' data-ln='100'></td><td><span> },</span></td></tr>
<tr><td class='ln' data-ln='101'></td><td> </td></tr>
<tr><td class='ln' data-ln='102'></td><td><span> </span><span class='pt60'>unwrapOr</span><span class='pt43'>(</span><span class='pt41 pt4'>defaultValue</span><span class='pt43'>)</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='103'></td><td><span> </span><span class='pt56'>return</span><span> (</span><span class='pt55'>this</span><span>.</span><span class='pt62'>isSome</span><span>()) </span><span class='pt56'>?</span><span> </span><span class='pt55'>this</span><span>.</span><span class='pt41 pt4'>value</span><span> </span><span class='pt56'>:</span><span> </span><span class='pt41 pt4'>defaultValue</span><span class='pt43'>;</span></td></tr>
<tr><td class='ln' data-ln='104'></td><td><span> },</span></td></tr>
<tr><td class='ln' data-ln='105'></td><td> </td></tr>
<tr><td class='ln' data-ln='106'></td><td><span> </span><span class='pt60'>unwrapOrElse</span><span class='pt43'>(</span><span class='pt41 pt4'>fn</span><span class='pt43'>)</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='107'></td><td><span> </span><span class='pt56'>return</span><span> (</span><span class='pt55'>this</span><span>.</span><span class='pt62'>isSome</span><span>()) </span><span class='pt56'>?</span><span> </span><span class='pt55'>this</span><span>.</span><span class='pt41 pt4'>value</span><span> </span><span class='pt56'>:</span><span> </span><span class='pt62'>fn</span><span>()</span><span class='pt43'>;</span></td></tr>
<tr><td class='ln' data-ln='108'></td><td><span> },</span></td></tr>
<tr><td class='ln' data-ln='109'></td><td><span> })</span><span class='pt43'>;</span></td></tr>
<tr><td class='ln' data-ln='110'></td><td> </td></tr>
<tr><td class='ln' data-ln='111'></td><td><span> </span><span class='pt56'>return</span><span> </span><span class='pt41 pt4'>Option</span><span class='pt43'>;</span></td></tr>
<tr><td class='ln' data-ln='112'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='113'></td><td> </td></tr>
<tr><td class='ln' data-ln='114'></td><td> </td></tr>
<tr><td class='ln' data-ln='115'></td><td><span class='pt60'>const</span><span> </span><span class='pt41 pt4'>rust</span><span> = {</span></td></tr>
<tr><td class='ln' data-ln='116'></td><td><span> </span><span class='pt21'>tuple</span><span class='pt43'>:</span><span> </span><span class='pt41 pt4'>RustTuple</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='117'></td><td><span> </span><span class='pt60'>Tuple</span><span class='pt43'>:</span><span> </span><span class='pt43'>(</span><span class='pt41 pt4'>type</span><span class='pt43'>,</span><span> </span><span class='pt41 pt4'>values</span><span class='pt43'>)</span><span> </span><span class='pt60'>=></span><span> </span><span class='pt62'>new</span><span> (</span><span class='pt62'>RustTuple</span><span>(</span><span class='pt56'>...</span><span class='pt41 pt4'>type</span><span>))([</span><span class='pt56'>...</span><span class='pt41 pt4'>values</span><span>]),</span></td></tr>
<tr><td class='ln' data-ln='118'></td><td> </td></tr>
<tr><td class='ln' data-ln='119'></td><td><span> </span><span class='pt21'>vector</span><span class='pt43'>:</span><span> </span><span class='pt41 pt4'>RustVector</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='120'></td><td><span> </span><span class='pt60'>Vector</span><span class='pt43'>:</span><span> </span><span class='pt43'>(</span><span class='pt41 pt4'>type</span><span class='pt43'>,</span><span> </span><span class='pt41 pt4'>values</span><span class='pt43'>)</span><span> </span><span class='pt60'>=></span><span> </span><span class='pt62'>new</span><span> (</span><span class='pt62'>RustVector</span><span>(</span><span class='pt41 pt4'>type</span><span>))({ </span><span class='pt41 pt4'>values</span><span> }),</span></td></tr>
<tr><td class='ln' data-ln='121'></td><td> </td></tr>
<tr><td class='ln' data-ln='122'></td><td><span> </span><span class='pt21'>option</span><span class='pt43'>:</span><span> </span><span class='pt41 pt4'>RustOption</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='123'></td><td><span> </span><span class='pt60'>Option</span><span class='pt43'>:</span><span> </span><span class='pt43'>(</span><span class='pt41 pt4'>type</span><span class='pt43'>,</span><span> </span><span class='pt41 pt4'>value</span><span class='pt43'>,</span><span> </span><span class='pt56'>...</span><span class='pt41 pt4'>opts</span><span class='pt43'>)</span><span> </span><span class='pt60'>=></span><span> </span><span class='pt62'>new</span><span> (</span><span class='pt62'>RustOption</span><span>(</span><span class='pt41 pt4'>type</span><span>, </span><span class='pt56'>...</span><span class='pt41 pt4'>opts</span><span>))({</span></td></tr>
<tr><td class='ln' data-ln='124'></td><td><span> </span><span class='pt41 pt4'>value</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='125'></td><td><span> </span><span class='pt21'>discriminant</span><span class='pt43'>:</span><span> (</span><span class='pt56'>typeof</span><span> </span><span class='pt41 pt4'>value</span><span> </span><span class='pt56'>===</span><span> </span><span class='pt23'>'undefined'</span><span>) </span><span class='pt56'>?</span><span> </span><span class='pt54'>0</span><span> </span><span class='pt56'>:</span><span> </span><span class='pt54'>1</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='126'></td><td><span> }),</span></td></tr>
<tr><td class='ln' data-ln='127'></td><td> </td></tr>
<tr><td class='ln' data-ln='128'></td><td><span> </span><span class='pt60'>Some</span><span class='pt43'>:</span><span> </span><span class='pt43'>(</span><span class='pt56'>...</span><span class='pt41 pt4'>args</span><span class='pt43'>)</span><span> </span><span class='pt60'>=></span><span> </span><span class='pt41 pt4'>rust</span><span>.</span><span class='pt62'>Option</span><span>(</span><span class='pt56'>...</span><span class='pt41 pt4'>args</span><span>),</span></td></tr>
<tr><td class='ln' data-ln='129'></td><td><span> </span><span class='pt60'>None</span><span class='pt43'>:</span><span> </span><span class='pt43'>(</span><span class='pt41 pt4'>type</span><span class='pt43'>,</span><span> </span><span class='pt56'>...</span><span class='pt41 pt4'>opts</span><span class='pt43'>)</span><span> </span><span class='pt60'>=></span><span> </span><span class='pt41 pt4'>rust</span><span>.</span><span class='pt62'>Option</span><span>(</span><span class='pt41 pt4'>type</span><span>, </span><span class='pt54'>undefined</span><span>, </span><span class='pt56'>...</span><span class='pt41 pt4'>opts</span><span>),</span></td></tr>
<tr><td class='ln' data-ln='130'></td><td><span>}</span><span class='pt43'>;</span></td></tr>
<tr><td class='ln' data-ln='131'></td><td> </td></tr>
<tr><td class='ln' data-ln='132'></td><td><span class='pt56'>export</span><span> </span><span class='pt56'>default</span><span> </span><span class='pt41 pt4'>rust</span><span class='pt43'>;</span></td></tr>
</table>
</div>
</div>
</div>
<div class='style' id='P--dracula--js'>
<div class='P--dracula-bordered'>
<div class="info header">
<span class="left">rust_types.js</span>
<span class="right"><span>132 lines</span><span>2.75 KB</span></span>
</div>
<div class='P--dracula'>
<table>
<tr><td class='ln' data-ln='1'></td><td><span class='pt9'>import</span><span> Struct </span><span class='pt9'>from</span><span> </span><span class='pt7'>'./Struct'</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='2'></td><td><span class='pt9'>import</span><span> { types, parseType, Pointer } </span><span class='pt9'>from</span><span> </span><span class='pt7'>'./types'</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='3'></td><td><span class='pt9'>import</span><span> { assert, vslice } </span><span class='pt9'>from</span><span> </span><span class='pt7'>'./misc'</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='4'></td><td> </td></tr>
<tr><td class='ln' data-ln='5'></td><td> </td></tr>
<tr><td class='ln' data-ln='6'></td><td><span class='pt9'>const</span><span> </span><span class='pt5'>DATA</span><span> = (</span><span class='pt9'>typeof</span><span> </span><span class='pt3 it'>Symbol</span><span> </span><span class='pt9'>!==</span><span> </span><span class='pt7'>'undefined'</span><span>)</span></td></tr>
<tr><td class='ln' data-ln='7'></td><td><span> </span><span class='pt9'>?</span><span> </span><span class='pt3 it'>Symbol</span><span>.</span><span class='pt1'>for</span><span>(</span><span class='pt7'>'struct-data'</span><span>)</span></td></tr>
<tr><td class='ln' data-ln='8'></td><td><span> </span><span class='pt9'>:</span><span> </span><span class='pt7'>'__data'</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='9'></td><td> </td></tr>
<tr><td class='ln' data-ln='10'></td><td> </td></tr>
<tr><td class='ln' data-ln='11'></td><td class='hi'><span class='pt9'>function</span><span> </span><span class='pt1'>extend</span><span>(</span><span class='pt10 it'>StructType</span><span>) {</span></td></tr>
<tr><td class='ln' data-ln='12'></td><td class='hi'><span> </span><span class='pt9'>class</span><span> </span><span class='pt3'>RustType</span><span> </span><span class='pt9'>extends</span><span> StructType {</span></td></tr>
<tr><td class='ln' data-ln='13'></td><td class='hi'><span> </span><span class='pt1'>free</span><span>() {</span></td></tr>
<tr><td class='ln' data-ln='14'></td><td class='hi'><span> </span><span class='pt5 it'>super</span><span>.</span><span class='pt1'>free</span><span>(</span><span class='pt5'>true</span><span>);</span></td></tr>
<tr><td class='ln' data-ln='15'></td><td class='hi'><span> }</span></td></tr>
<tr><td class='ln' data-ln='16'></td><td class='hi'><span> }</span></td></tr>
<tr><td class='ln' data-ln='17'></td><td class='hi'> </td></tr>
<tr><td class='ln' data-ln='18'></td><td class='hi'><span> </span><span class='pt3 it'>Object</span><span>.</span><span class='pt1'>assign</span><span>(RustType, StructType);</span></td></tr>
<tr><td class='ln' data-ln='19'></td><td class='hi'><span> </span><span class='pt9'>return</span><span> RustType;</span></td></tr>
<tr><td class='ln' data-ln='20'></td><td class='hi'><span>}</span></td></tr>
<tr><td class='ln' data-ln='21'></td><td> </td></tr>
<tr><td class='ln' data-ln='22'></td><td> </td></tr>
<tr><td class='ln' data-ln='23'></td><td><span class='pt9'>function</span><span> </span><span class='pt1'>RustTuple</span><span>(</span><span class='pt9'>...</span><span class='pt10 it'>tupleTypes</span><span>) {</span></td></tr>
<tr><td class='ln' data-ln='24'></td><td><span> </span><span class='pt9'>const</span><span> fields = {};</span></td></tr>
<tr><td class='ln' data-ln='25'></td><td> </td></tr>
<tr><td class='ln' data-ln='26'></td><td><span> tupleTypes.</span><span class='pt1'>forEach</span><span>((</span><span class='pt10 it'>type</span><span>, </span><span class='pt10 it'>i</span><span>) </span><span class='pt9'>=></span><span> {</span></td></tr>
<tr><td class='ln' data-ln='27'></td><td><span> fields[i] = </span><span class='pt1'>parseType</span><span>(type);</span></td></tr>
<tr><td class='ln' data-ln='28'></td><td><span> });</span></td></tr>
<tr><td class='ln' data-ln='29'></td><td> </td></tr>
<tr><td class='ln' data-ln='30'></td><td><span> </span><span class='pt9'>return</span><span> </span><span class='bo'>new</span><span> </span><span class='pt1'>Struct</span><span>(fields);</span></td></tr>
<tr><td class='ln' data-ln='31'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='32'></td><td> </td></tr>
<tr><td class='ln' data-ln='33'></td><td> </td></tr>
<tr><td class='ln' data-ln='34'></td><td><span class='pt9'>function</span><span> </span><span class='pt1'>RustVector</span><span>(</span><span class='pt10 it'>typedef</span><span>) {</span></td></tr>
<tr><td class='ln' data-ln='35'></td><td><span> </span><span class='pt9'>const</span><span> type = </span><span class='pt1'>parseType</span><span>(typedef);</span></td></tr>
<tr><td class='ln' data-ln='36'></td><td> </td></tr>
<tr><td class='ln' data-ln='37'></td><td><span> </span><span class='pt9'>const</span><span> Vector = </span><span class='pt1'>extend</span><span>(</span><span class='bo'>new</span><span> </span><span class='pt1'>Struct</span><span>({</span></td></tr>
<tr><td class='ln' data-ln='38'></td><td><span> </span><span class='pt7'>ptr</span><span class='pt9 it'>:</span><span> types.</span><span class='pt1'>pointer</span><span>(type),</span></td></tr>
<tr><td class='ln' data-ln='39'></td><td><span> </span><span class='pt7'>cap</span><span class='pt9 it'>:</span><span> </span><span class='pt7'>'usize'</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='40'></td><td><span> </span><span class='pt7'>len</span><span class='pt9 it'>:</span><span> </span><span class='pt7'>'usize'</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='41'></td><td><span> </span><span class='pt2'>/* values */</span></td></tr>
<tr><td class='ln' data-ln='42'></td><td><span> }));</span></td></tr>
<tr><td class='ln' data-ln='43'></td><td> </td></tr>
<tr><td class='ln' data-ln='44'></td><td><span> </span><span class='pt3 it'>Object</span><span>.</span><span class='pt1'>defineProperty</span><span>(</span><span class='pt3'>Vector</span><span>.</span><span class='pt5 it'>prototype</span><span>, </span><span class='pt7'>'values'</span><span>, {</span></td></tr>
<tr><td class='ln' data-ln='45'></td><td><span> </span><span class='pt7'>enumerable</span><span class='pt9 it'>:</span><span> </span><span class='pt5'>true</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='46'></td><td> </td></tr>
<tr><td class='ln' data-ln='47'></td><td><span> </span><span class='pt1'>get</span><span>() {</span></td></tr>
<tr><td class='ln' data-ln='48'></td><td><span> </span><span class='pt9'>const</span><span> arrayType = </span><span class='pt1'>parseType</span><span>([type, </span><span class='pt5 it'>this</span><span>.len]);</span></td></tr>
<tr><td class='ln' data-ln='49'></td><td><span> </span><span class='pt9'>const</span><span> memory = </span><span class='pt5 it'>this</span><span>[</span><span class='pt5'>DATA</span><span>].view.buffer;</span></td></tr>
<tr><td class='ln' data-ln='50'></td><td><span> </span><span class='pt9'>const</span><span> view = </span><span class='bo'>new</span><span> </span><span class='pt3 it'>DataView</span><span>(memory, </span><span class='pt5 it'>this</span><span>.ptr.</span><span class='pt1'>ref</span><span>(), arrayType.width);</span></td></tr>
<tr><td class='ln' data-ln='51'></td><td> </td></tr>
<tr><td class='ln' data-ln='52'></td><td><span> </span><span class='pt9'>return</span><span> arrayType.</span><span class='pt1'>read</span><span>(view, </span><span class='pt5 it'>this</span><span>[</span><span class='pt5'>DATA</span><span>].free);</span></td></tr>
<tr><td class='ln' data-ln='53'></td><td><span> },</span></td></tr>
<tr><td class='ln' data-ln='54'></td><td> </td></tr>
<tr><td class='ln' data-ln='55'></td><td><span> </span><span class='pt1'>set</span><span>(</span><span class='pt10 it'>values</span><span>) {</span></td></tr>
<tr><td class='ln' data-ln='56'></td><td><span> </span><span class='pt9'>const</span><span> len = values.length;</span></td></tr>
<tr><td class='ln' data-ln='57'></td><td> </td></tr>
<tr><td class='ln' data-ln='58'></td><td><span> </span><span class='pt5 it'>this</span><span>.ptr = </span><span class='bo'>new</span><span> </span><span class='pt1'>Pointer</span><span>([type, len], values);</span></td></tr>
<tr><td class='ln' data-ln='59'></td><td><span> </span><span class='pt5 it'>this</span><span>.len = len;</span></td></tr>
<tr><td class='ln' data-ln='60'></td><td><span> </span><span class='pt5 it'>this</span><span>.cap = len;</span></td></tr>
<tr><td class='ln' data-ln='61'></td><td><span> },</span></td></tr>
<tr><td class='ln' data-ln='62'></td><td><span> });</span></td></tr>
<tr><td class='ln' data-ln='63'></td><td> </td></tr>
<tr><td class='ln' data-ln='64'></td><td><span> </span><span class='pt9'>return</span><span> Vector;</span></td></tr>
<tr><td class='ln' data-ln='65'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='66'></td><td> </td></tr>
<tr><td class='ln' data-ln='67'></td><td> </td></tr>
<tr><td class='ln' data-ln='68'></td><td><span class='pt9'>function</span><span> </span><span class='pt1'>RustOption</span><span>(</span><span class='pt10 it'>typedef</span><span>, </span><span class='pt10 it'>isNonNullable</span><span> </span><span class='pt9'>=</span><span> </span><span class='pt5'>false</span><span>, </span><span class='pt10 it'>tagSize</span><span>) {</span></td></tr>
<tr><td class='ln' data-ln='69'></td><td><span> </span><span class='pt9'>const</span><span> type = </span><span class='pt1'>parseType</span><span>(typedef);</span></td></tr>
<tr><td class='ln' data-ln='70'></td><td><span> </span><span class='pt9'>let</span><span> discriminant;</span></td></tr>
<tr><td class='ln' data-ln='71'></td><td> </td></tr>
<tr><td class='ln' data-ln='72'></td><td><span> </span><span class='pt9'>if</span><span> (tagSize) discriminant = types[</span><span class='pt9'>`</span><span class='pt7'>uint</span><span class='pt9'>${</span><span>tagSize </span><span class='pt9'>*</span><span> </span><span class='pt5'>8</span><span class='pt9'>}`</span><span>];</span></td></tr>
<tr><td class='ln' data-ln='73'></td><td><span> </span><span class='pt9'>else</span><span> </span><span class='pt9'>if</span><span> (type.alignment </span><span class='pt9'>===</span><span> </span><span class='pt5'>1</span><span>) discriminant = </span><span class='pt7'>'uint8'</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='74'></td><td><span> </span><span class='pt9'>else</span><span> </span><span class='pt9'>if</span><span> (type.alignment </span><span class='pt9'>===</span><span> </span><span class='pt5'>2</span><span>) discriminant = </span><span class='pt7'>'uint16'</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='75'></td><td><span> </span><span class='pt9'>else</span><span> discriminant = </span><span class='pt7'>'uint32'</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='76'></td><td> </td></tr>
<tr><td class='ln' data-ln='77'></td><td><span> </span><span class='pt9'>const</span><span> fields = (isNonNullable)</span></td></tr>
<tr><td class='ln' data-ln='78'></td><td><span> </span><span class='pt9'>?</span><span> { </span><span class='pt7'>value</span><span class='pt9 it'>:</span><span> type }</span></td></tr>
<tr><td class='ln' data-ln='79'></td><td><span> </span><span class='pt9'>:</span><span> { discriminant, </span><span class='pt7'>value</span><span class='pt9 it'>:</span><span> type };</span></td></tr>
<tr><td class='ln' data-ln='80'></td><td> </td></tr>
<tr><td class='ln' data-ln='81'></td><td><span> </span><span class='pt9'>const</span><span> Option = </span><span class='bo'>new</span><span> </span><span class='pt1'>Struct</span><span>(fields);</span></td></tr>
<tr><td class='ln' data-ln='82'></td><td> </td></tr>
<tr><td class='ln' data-ln='83'></td><td><span> </span><span class='pt3 it'>Object</span><span>.</span><span class='pt1'>assign</span><span>(</span><span class='pt3'>Option</span><span>.</span><span class='pt5 it'>prototype</span><span>, {</span></td></tr>
<tr><td class='ln' data-ln='84'></td><td><span> </span><span class='pt1'>isSome</span><span>() {</span></td></tr>
<tr><td class='ln' data-ln='85'></td><td><span> </span><span class='pt9'>return</span><span> (</span><span class='pt7'>'discriminant'</span><span> </span><span class='pt9'>in</span><span> fields) </span><span class='pt9'>?</span><span> !!</span><span class='pt5 it'>this</span><span>.discriminant </span><span class='pt9'>:</span><span> !!</span><span class='pt5 it'>this</span><span>.value;</span></td></tr>
<tr><td class='ln' data-ln='86'></td><td><span> },</span></td></tr>
<tr><td class='ln' data-ln='87'></td><td> </td></tr>
<tr><td class='ln' data-ln='88'></td><td><span> </span><span class='pt1'>isNone</span><span>() {</span></td></tr>
<tr><td class='ln' data-ln='89'></td><td><span> </span><span class='pt9'>return</span><span> !</span><span class='pt5 it'>this</span><span>.</span><span class='pt1'>isSome</span><span>();</span></td></tr>
<tr><td class='ln' data-ln='90'></td><td><span> },</span></td></tr>
<tr><td class='ln' data-ln='91'></td><td> </td></tr>
<tr><td class='ln' data-ln='92'></td><td><span> </span><span class='pt1'>expect</span><span>(</span><span class='pt10 it'>msg</span><span>) {</span></td></tr>
<tr><td class='ln' data-ln='93'></td><td><span> </span><span class='pt9'>if</span><span> (</span><span class='pt9'>!</span><span class='pt5 it'>this</span><span>.</span><span class='pt1'>isSome</span><span>()) </span><span class='pt9'>throw</span><span> </span><span class='bo'>new</span><span> </span><span class='pt3 it'>Error</span><span>(msg);</span></td></tr>
<tr><td class='ln' data-ln='94'></td><td><span> </span><span class='pt9'>return</span><span> </span><span class='pt5 it'>this</span><span>.value;</span></td></tr>
<tr><td class='ln' data-ln='95'></td><td><span> },</span></td></tr>
<tr><td class='ln' data-ln='96'></td><td> </td></tr>
<tr><td class='ln' data-ln='97'></td><td><span> </span><span class='pt1'>unwrap</span><span>() {</span></td></tr>
<tr><td class='ln' data-ln='98'></td><td><span> </span><span class='pt9'>if</span><span> (</span><span class='pt9'>!</span><span class='pt5 it'>this</span><span>.</span><span class='pt1'>isSome</span><span>()) </span><span class='pt9'>throw</span><span> </span><span class='bo'>new</span><span> </span><span class='pt3 it'>Error</span><span>(</span><span class='pt7'>'Error unwrapping none'</span><span>);</span></td></tr>
<tr><td class='ln' data-ln='99'></td><td><span> </span><span class='pt9'>return</span><span> </span><span class='pt5 it'>this</span><span>.value;</span></td></tr>
<tr><td class='ln' data-ln='100'></td><td><span> },</span></td></tr>
<tr><td class='ln' data-ln='101'></td><td> </td></tr>
<tr><td class='ln' data-ln='102'></td><td><span> </span><span class='pt1'>unwrapOr</span><span>(</span><span class='pt10 it'>defaultValue</span><span>) {</span></td></tr>
<tr><td class='ln' data-ln='103'></td><td><span> </span><span class='pt9'>return</span><span> (</span><span class='pt5 it'>this</span><span>.</span><span class='pt1'>isSome</span><span>()) </span><span class='pt9'>?</span><span> </span><span class='pt5 it'>this</span><span>.value </span><span class='pt9'>:</span><span> defaultValue;</span></td></tr>
<tr><td class='ln' data-ln='104'></td><td><span> },</span></td></tr>
<tr><td class='ln' data-ln='105'></td><td> </td></tr>
<tr><td class='ln' data-ln='106'></td><td><span> </span><span class='pt1'>unwrapOrElse</span><span>(</span><span class='pt10 it'>fn</span><span>) {</span></td></tr>
<tr><td class='ln' data-ln='107'></td><td><span> </span><span class='pt9'>return</span><span> (</span><span class='pt5 it'>this</span><span>.</span><span class='pt1'>isSome</span><span>()) </span><span class='pt9'>?</span><span> </span><span class='pt5 it'>this</span><span>.value </span><span class='pt9'>:</span><span> </span><span class='pt1'>fn</span><span>();</span></td></tr>
<tr><td class='ln' data-ln='108'></td><td><span> },</span></td></tr>
<tr><td class='ln' data-ln='109'></td><td><span> });</span></td></tr>
<tr><td class='ln' data-ln='110'></td><td> </td></tr>
<tr><td class='ln' data-ln='111'></td><td><span> </span><span class='pt9'>return</span><span> Option;</span></td></tr>
<tr><td class='ln' data-ln='112'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='113'></td><td> </td></tr>
<tr><td class='ln' data-ln='114'></td><td> </td></tr>
<tr><td class='ln' data-ln='115'></td><td><span class='pt9'>const</span><span> rust = {</span></td></tr>
<tr><td class='ln' data-ln='116'></td><td><span> </span><span class='pt7'>tuple</span><span class='pt9 it'>:</span><span> RustTuple,</span></td></tr>
<tr><td class='ln' data-ln='117'></td><td><span> </span><span class='pt1'>Tuple</span><span class='pt9 it'>:</span><span> (</span><span class='pt10 it'>type</span><span>, </span><span class='pt10 it'>values</span><span>) </span><span class='pt9'>=></span><span> </span><span class='pt1'>new</span><span> (</span><span class='pt1'>RustTuple</span><span>(</span><span class='pt9'>...</span><span>type))([</span><span class='pt9'>...</span><span>values]),</span></td></tr>
<tr><td class='ln' data-ln='118'></td><td> </td></tr>
<tr><td class='ln' data-ln='119'></td><td><span> </span><span class='pt7'>vector</span><span class='pt9 it'>:</span><span> RustVector,</span></td></tr>
<tr><td class='ln' data-ln='120'></td><td><span> </span><span class='pt1'>Vector</span><span class='pt9 it'>:</span><span> (</span><span class='pt10 it'>type</span><span>, </span><span class='pt10 it'>values</span><span>) </span><span class='pt9'>=></span><span> </span><span class='pt1'>new</span><span> (</span><span class='pt1'>RustVector</span><span>(type))({ values }),</span></td></tr>
<tr><td class='ln' data-ln='121'></td><td> </td></tr>
<tr><td class='ln' data-ln='122'></td><td><span> </span><span class='pt7'>option</span><span class='pt9 it'>:</span><span> RustOption,</span></td></tr>
<tr><td class='ln' data-ln='123'></td><td><span> </span><span class='pt1'>Option</span><span class='pt9 it'>:</span><span> (</span><span class='pt10 it'>type</span><span>, </span><span class='pt10 it'>value</span><span>, </span><span class='pt9'>...</span><span class='pt10 it'>opts</span><span>) </span><span class='pt9'>=></span><span> </span><span class='pt1'>new</span><span> (</span><span class='pt1'>RustOption</span><span>(type, </span><span class='pt9'>...</span><span>opts))({</span></td></tr>
<tr><td class='ln' data-ln='124'></td><td><span> value,</span></td></tr>
<tr><td class='ln' data-ln='125'></td><td><span> </span><span class='pt7'>discriminant</span><span class='pt9 it'>:</span><span> (</span><span class='pt9'>typeof</span><span> value </span><span class='pt9'>===</span><span> </span><span class='pt7'>'undefined'</span><span>) </span><span class='pt9'>?</span><span> </span><span class='pt5'>0</span><span> </span><span class='pt9'>:</span><span> </span><span class='pt5'>1</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='126'></td><td><span> }),</span></td></tr>
<tr><td class='ln' data-ln='127'></td><td> </td></tr>
<tr><td class='ln' data-ln='128'></td><td><span> </span><span class='pt1'>Some</span><span class='pt9 it'>:</span><span> (</span><span class='pt9'>...</span><span class='pt10 it'>args</span><span>) </span><span class='pt9'>=></span><span> rust.</span><span class='pt1'>Option</span><span>(</span><span class='pt9'>...</span><span>args),</span></td></tr>
<tr><td class='ln' data-ln='129'></td><td><span> </span><span class='pt1'>None</span><span class='pt9 it'>:</span><span> (</span><span class='pt10 it'>type</span><span>, </span><span class='pt9'>...</span><span class='pt10 it'>opts</span><span>) </span><span class='pt9'>=></span><span> rust.</span><span class='pt1'>Option</span><span>(type, </span><span class='pt5'>undefined</span><span>, </span><span class='pt9'>...</span><span>opts),</span></td></tr>
<tr><td class='ln' data-ln='130'></td><td><span>};</span></td></tr>
<tr><td class='ln' data-ln='131'></td><td> </td></tr>
<tr><td class='ln' data-ln='132'></td><td><span class='pt9'>export</span><span> </span><span class='pt9'>default</span><span> rust;</span></td></tr>
</table>
</div>
</div>
</div>
<div class='style' id='P--github--js'>
<div class='P--github-bordered'>
<div class="info header">
<span class="left">rust_types.js</span>
<span class="right"><span>132 lines</span><span>2.75 KB</span></span>
</div>
<div class='P--github'>
<table>
<tr><td class='ln' data-ln='1'></td><td><span class='pt17'>import</span><span> </span><span class='pt10'>Struct</span><span> </span><span class='pt17'>from</span><span> </span><span class='pt8'>'./Struct'</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='2'></td><td><span class='pt17'>import</span><span> { </span><span class='pt10'>types</span><span>, </span><span class='pt10'>parseType</span><span>, </span><span class='pt10'>Pointer</span><span> } </span><span class='pt17'>from</span><span> </span><span class='pt8'>'./types'</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='3'></td><td><span class='pt17'>import</span><span> { </span><span class='pt10'>assert</span><span>, </span><span class='pt10'>vslice</span><span> } </span><span class='pt17'>from</span><span> </span><span class='pt8'>'./misc'</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='4'></td><td> </td></tr>
<tr><td class='ln' data-ln='5'></td><td> </td></tr>
<tr><td class='ln' data-ln='6'></td><td><span class='pt17'>const</span><span> </span><span class='pt7'>DATA</span><span> = (</span><span class='pt17'>typeof</span><span> </span><span class='pt7'>Symbol</span><span> </span><span class='pt17'>!==</span><span> </span><span class='pt8'>'undefined'</span><span>)</span></td></tr>
<tr><td class='ln' data-ln='7'></td><td><span> </span><span class='pt17'>?</span><span> </span><span class='pt7'>Symbol</span><span class='pt10'>.</span><span class='pt13'>for</span><span>(</span><span class='pt8'>'struct-data'</span><span>)</span></td></tr>
<tr><td class='ln' data-ln='8'></td><td><span> </span><span class='pt17'>:</span><span> </span><span class='pt8'>'__data'</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='9'></td><td> </td></tr>
<tr><td class='ln' data-ln='10'></td><td> </td></tr>
<tr><td class='ln' data-ln='11'></td><td class='hi'><span class='pt17'>function</span><span> </span><span class='pt13'>extend</span><span>(</span><span class='pt10'>StructType</span><span>) {</span></td></tr>
<tr><td class='ln' data-ln='12'></td><td class='hi'><span> </span><span class='pt17'>class</span><span> </span><span class='pt13'>RustType</span><span> </span><span class='pt17'>extends</span><span> </span><span class='pt10'>StructType</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='13'></td><td class='hi'><span> </span><span class='pt13'>free</span><span>() {</span></td></tr>
<tr><td class='ln' data-ln='14'></td><td class='hi'><span> </span><span class='pt7'>super</span><span class='pt10'>.</span><span class='pt13'>free</span><span>(</span><span class='pt7'>true</span><span>);</span></td></tr>
<tr><td class='ln' data-ln='15'></td><td class='hi'><span> }</span></td></tr>
<tr><td class='ln' data-ln='16'></td><td class='hi'><span> }</span></td></tr>
<tr><td class='ln' data-ln='17'></td><td class='hi'> </td></tr>
<tr><td class='ln' data-ln='18'></td><td class='hi'><span> </span><span class='pt7'>Object</span><span class='pt10'>.</span><span class='pt13'>assign</span><span>(</span><span class='pt10'>RustType</span><span>, </span><span class='pt10'>StructType</span><span>);</span></td></tr>
<tr><td class='ln' data-ln='19'></td><td class='hi'><span> </span><span class='pt17'>return</span><span> </span><span class='pt10'>RustType</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='20'></td><td class='hi'><span>}</span></td></tr>
<tr><td class='ln' data-ln='21'></td><td> </td></tr>
<tr><td class='ln' data-ln='22'></td><td> </td></tr>
<tr><td class='ln' data-ln='23'></td><td><span class='pt17'>function</span><span> </span><span class='pt13'>RustTuple</span><span>(</span><span class='pt17'>...</span><span class='pt10'>tupleTypes</span><span>) {</span></td></tr>
<tr><td class='ln' data-ln='24'></td><td><span> </span><span class='pt17'>const</span><span> </span><span class='pt10'>fields</span><span> = {};</span></td></tr>
<tr><td class='ln' data-ln='25'></td><td> </td></tr>
<tr><td class='ln' data-ln='26'></td><td><span> </span><span class='pt10'>tupleTypes.</span><span class='pt13'>forEach</span><span>((</span><span class='pt10'>type</span><span>, </span><span class='pt10'>i</span><span>) </span><span class='pt17'>=></span><span> {</span></td></tr>
<tr><td class='ln' data-ln='27'></td><td><span> </span><span class='pt10'>fields</span><span>[</span><span class='pt10'>i</span><span>] = </span><span class='pt13'>parseType</span><span>(</span><span class='pt10'>type</span><span>);</span></td></tr>
<tr><td class='ln' data-ln='28'></td><td><span> });</span></td></tr>
<tr><td class='ln' data-ln='29'></td><td> </td></tr>
<tr><td class='ln' data-ln='30'></td><td><span> </span><span class='pt17'>return</span><span> </span><span class='pt17'>new</span><span> </span><span class='pt13'>Struct</span><span>(</span><span class='pt10'>fields</span><span>);</span></td></tr>
<tr><td class='ln' data-ln='31'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='32'></td><td> </td></tr>
<tr><td class='ln' data-ln='33'></td><td> </td></tr>
<tr><td class='ln' data-ln='34'></td><td><span class='pt17'>function</span><span> </span><span class='pt13'>RustVector</span><span>(</span><span class='pt10'>typedef</span><span>) {</span></td></tr>
<tr><td class='ln' data-ln='35'></td><td><span> </span><span class='pt17'>const</span><span> </span><span class='pt10'>type</span><span> = </span><span class='pt13'>parseType</span><span>(</span><span class='pt10'>typedef</span><span>);</span></td></tr>
<tr><td class='ln' data-ln='36'></td><td> </td></tr>
<tr><td class='ln' data-ln='37'></td><td><span> </span><span class='pt17'>const</span><span> </span><span class='pt10'>Vector</span><span> = </span><span class='pt13'>extend</span><span>(</span><span class='pt17'>new</span><span> </span><span class='pt13'>Struct</span><span>({</span></td></tr>
<tr><td class='ln' data-ln='38'></td><td><span> </span><span class='pt8'>ptr</span><span class='pt17'>:</span><span> </span><span class='pt10'>types.</span><span class='pt13'>pointer</span><span>(</span><span class='pt10'>type</span><span>),</span></td></tr>
<tr><td class='ln' data-ln='39'></td><td><span> </span><span class='pt8'>cap</span><span class='pt17'>:</span><span> </span><span class='pt8'>'usize'</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='40'></td><td><span> </span><span class='pt8'>len</span><span class='pt17'>:</span><span> </span><span class='pt8'>'usize'</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='41'></td><td><span> </span><span class='pt12'>/* values */</span></td></tr>
<tr><td class='ln' data-ln='42'></td><td><span> }));</span></td></tr>
<tr><td class='ln' data-ln='43'></td><td> </td></tr>
<tr><td class='ln' data-ln='44'></td><td><span> </span><span class='pt7'>Object</span><span class='pt10'>.</span><span class='pt13'>defineProperty</span><span>(</span><span class='pt13'>Vector</span><span class='pt10'>.</span><span class='pt7'>prototype</span><span>, </span><span class='pt8'>'values'</span><span>, {</span></td></tr>
<tr><td class='ln' data-ln='45'></td><td><span> </span><span class='pt8'>enumerable</span><span class='pt17'>:</span><span> </span><span class='pt7'>true</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='46'></td><td> </td></tr>
<tr><td class='ln' data-ln='47'></td><td><span> </span><span class='pt13'>get</span><span>() {</span></td></tr>
<tr><td class='ln' data-ln='48'></td><td><span> </span><span class='pt17'>const</span><span> </span><span class='pt10'>arrayType</span><span> = </span><span class='pt13'>parseType</span><span>([</span><span class='pt10'>type</span><span>, </span><span class='pt7'>this</span><span class='pt10'>.len</span><span>]);</span></td></tr>
<tr><td class='ln' data-ln='49'></td><td><span> </span><span class='pt17'>const</span><span> </span><span class='pt10'>memory</span><span> = </span><span class='pt7'>this</span><span>[</span><span class='pt7'>DATA</span><span>]</span><span class='pt10'>.view.buffer</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='50'></td><td><span> </span><span class='pt17'>const</span><span> </span><span class='pt10'>view</span><span> = </span><span class='pt17'>new</span><span> </span><span class='pt7'>DataView</span><span>(</span><span class='pt10'>memory</span><span>, </span><span class='pt7'>this</span><span class='pt10'>.ptr.</span><span class='pt13'>ref</span><span>(), </span><span class='pt10'>arrayType.width</span><span>);</span></td></tr>
<tr><td class='ln' data-ln='51'></td><td> </td></tr>
<tr><td class='ln' data-ln='52'></td><td><span> </span><span class='pt17'>return</span><span> </span><span class='pt10'>arrayType.</span><span class='pt13'>read</span><span>(</span><span class='pt10'>view</span><span>, </span><span class='pt7'>this</span><span>[</span><span class='pt7'>DATA</span><span>]</span><span class='pt10'>.free</span><span>);</span></td></tr>
<tr><td class='ln' data-ln='53'></td><td><span> },</span></td></tr>
<tr><td class='ln' data-ln='54'></td><td> </td></tr>
<tr><td class='ln' data-ln='55'></td><td><span> </span><span class='pt13'>set</span><span>(</span><span class='pt10'>values</span><span>) {</span></td></tr>
<tr><td class='ln' data-ln='56'></td><td><span> </span><span class='pt17'>const</span><span> </span><span class='pt10'>len</span><span> = </span><span class='pt10'>values.length</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='57'></td><td> </td></tr>
<tr><td class='ln' data-ln='58'></td><td><span> </span><span class='pt7'>this</span><span class='pt10'>.ptr</span><span> = </span><span class='pt17'>new</span><span> </span><span class='pt13'>Pointer</span><span>([</span><span class='pt10'>type</span><span>, </span><span class='pt10'>len</span><span>], </span><span class='pt10'>values</span><span>);</span></td></tr>
<tr><td class='ln' data-ln='59'></td><td><span> </span><span class='pt7'>this</span><span class='pt10'>.len</span><span> = </span><span class='pt10'>len</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='60'></td><td><span> </span><span class='pt7'>this</span><span class='pt10'>.cap</span><span> = </span><span class='pt10'>len</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='61'></td><td><span> },</span></td></tr>
<tr><td class='ln' data-ln='62'></td><td><span> });</span></td></tr>
<tr><td class='ln' data-ln='63'></td><td> </td></tr>
<tr><td class='ln' data-ln='64'></td><td><span> </span><span class='pt17'>return</span><span> </span><span class='pt10'>Vector</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='65'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='66'></td><td> </td></tr>
<tr><td class='ln' data-ln='67'></td><td> </td></tr>
<tr><td class='ln' data-ln='68'></td><td><span class='pt17'>function</span><span> </span><span class='pt13'>RustOption</span><span>(</span><span class='pt10'>typedef</span><span>, </span><span class='pt10'>isNonNullable</span><span> </span><span class='pt17'>=</span><span> </span><span class='pt7'>false</span><span>, </span><span class='pt10'>tagSize</span><span>) {</span></td></tr>
<tr><td class='ln' data-ln='69'></td><td><span> </span><span class='pt17'>const</span><span> </span><span class='pt10'>type</span><span> = </span><span class='pt13'>parseType</span><span>(</span><span class='pt10'>typedef</span><span>);</span></td></tr>
<tr><td class='ln' data-ln='70'></td><td><span> </span><span class='pt17'>let</span><span> </span><span class='pt10'>discriminant</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='71'></td><td> </td></tr>
<tr><td class='ln' data-ln='72'></td><td><span> </span><span class='pt17'>if</span><span> (</span><span class='pt10'>tagSize</span><span>) </span><span class='pt10'>discriminant</span><span> = </span><span class='pt10'>types</span><span>[</span><span class='pt17'>`</span><span class='pt8'>uint</span><span class='pt17'>${</span><span class='pt10'>tagSize</span><span> </span><span class='pt17'>*</span><span> </span><span class='pt7'>8</span><span class='pt17'>}`</span><span>];</span></td></tr>
<tr><td class='ln' data-ln='73'></td><td><span> </span><span class='pt17'>else</span><span> </span><span class='pt17'>if</span><span> (</span><span class='pt10'>type.alignment</span><span> </span><span class='pt17'>===</span><span> </span><span class='pt7'>1</span><span>) </span><span class='pt10'>discriminant</span><span> = </span><span class='pt8'>'uint8'</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='74'></td><td><span> </span><span class='pt17'>else</span><span> </span><span class='pt17'>if</span><span> (</span><span class='pt10'>type.alignment</span><span> </span><span class='pt17'>===</span><span> </span><span class='pt7'>2</span><span>) </span><span class='pt10'>discriminant</span><span> = </span><span class='pt8'>'uint16'</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='75'></td><td><span> </span><span class='pt17'>else</span><span> </span><span class='pt10'>discriminant</span><span> = </span><span class='pt8'>'uint32'</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='76'></td><td> </td></tr>
<tr><td class='ln' data-ln='77'></td><td><span> </span><span class='pt17'>const</span><span> </span><span class='pt10'>fields</span><span> = (</span><span class='pt10'>isNonNullable</span><span>)</span></td></tr>
<tr><td class='ln' data-ln='78'></td><td><span> </span><span class='pt17'>?</span><span> { </span><span class='pt8'>value</span><span class='pt17'>:</span><span> </span><span class='pt10'>type</span><span> }</span></td></tr>
<tr><td class='ln' data-ln='79'></td><td><span> </span><span class='pt17'>:</span><span> { </span><span class='pt10'>discriminant</span><span>, </span><span class='pt8'>value</span><span class='pt17'>:</span><span> </span><span class='pt10'>type</span><span> };</span></td></tr>
<tr><td class='ln' data-ln='80'></td><td> </td></tr>
<tr><td class='ln' data-ln='81'></td><td><span> </span><span class='pt17'>const</span><span> </span><span class='pt10'>Option</span><span> = </span><span class='pt17'>new</span><span> </span><span class='pt13'>Struct</span><span>(</span><span class='pt10'>fields</span><span>);</span></td></tr>
<tr><td class='ln' data-ln='82'></td><td> </td></tr>
<tr><td class='ln' data-ln='83'></td><td><span> </span><span class='pt7'>Object</span><span class='pt10'>.</span><span class='pt13'>assign</span><span>(</span><span class='pt13'>Option</span><span class='pt10'>.</span><span class='pt7'>prototype</span><span>, {</span></td></tr>
<tr><td class='ln' data-ln='84'></td><td><span> </span><span class='pt13'>isSome</span><span>() {</span></td></tr>
<tr><td class='ln' data-ln='85'></td><td><span> </span><span class='pt17'>return</span><span> (</span><span class='pt8'>'discriminant'</span><span> </span><span class='pt17'>in</span><span> </span><span class='pt10'>fields</span><span>) </span><span class='pt17'>?</span><span> !!</span><span class='pt7'>this</span><span class='pt10'>.discriminant</span><span> </span><span class='pt17'>:</span><span> !!</span><span class='pt7'>this</span><span class='pt10'>.value</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='86'></td><td><span> },</span></td></tr>
<tr><td class='ln' data-ln='87'></td><td> </td></tr>
<tr><td class='ln' data-ln='88'></td><td><span> </span><span class='pt13'>isNone</span><span>() {</span></td></tr>
<tr><td class='ln' data-ln='89'></td><td><span> </span><span class='pt17'>return</span><span> !</span><span class='pt7'>this</span><span class='pt10'>.</span><span class='pt13'>isSome</span><span>();</span></td></tr>
<tr><td class='ln' data-ln='90'></td><td><span> },</span></td></tr>
<tr><td class='ln' data-ln='91'></td><td> </td></tr>
<tr><td class='ln' data-ln='92'></td><td><span> </span><span class='pt13'>expect</span><span>(</span><span class='pt10'>msg</span><span>) {</span></td></tr>
<tr><td class='ln' data-ln='93'></td><td><span> </span><span class='pt17'>if</span><span> (</span><span class='pt17'>!</span><span class='pt7'>this</span><span class='pt10'>.</span><span class='pt13'>isSome</span><span>()) </span><span class='pt17'>throw</span><span> </span><span class='pt17'>new</span><span> </span><span class='pt7'>Error</span><span>(</span><span class='pt10'>msg</span><span>);</span></td></tr>
<tr><td class='ln' data-ln='94'></td><td><span> </span><span class='pt17'>return</span><span> </span><span class='pt7'>this</span><span class='pt10'>.value</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='95'></td><td><span> },</span></td></tr>
<tr><td class='ln' data-ln='96'></td><td> </td></tr>
<tr><td class='ln' data-ln='97'></td><td><span> </span><span class='pt13'>unwrap</span><span>() {</span></td></tr>
<tr><td class='ln' data-ln='98'></td><td><span> </span><span class='pt17'>if</span><span> (</span><span class='pt17'>!</span><span class='pt7'>this</span><span class='pt10'>.</span><span class='pt13'>isSome</span><span>()) </span><span class='pt17'>throw</span><span> </span><span class='pt17'>new</span><span> </span><span class='pt7'>Error</span><span>(</span><span class='pt8'>'Error unwrapping none'</span><span>);</span></td></tr>
<tr><td class='ln' data-ln='99'></td><td><span> </span><span class='pt17'>return</span><span> </span><span class='pt7'>this</span><span class='pt10'>.value</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='100'></td><td><span> },</span></td></tr>
<tr><td class='ln' data-ln='101'></td><td> </td></tr>
<tr><td class='ln' data-ln='102'></td><td><span> </span><span class='pt13'>unwrapOr</span><span>(</span><span class='pt10'>defaultValue</span><span>) {</span></td></tr>
<tr><td class='ln' data-ln='103'></td><td><span> </span><span class='pt17'>return</span><span> (</span><span class='pt7'>this</span><span class='pt10'>.</span><span class='pt13'>isSome</span><span>()) </span><span class='pt17'>?</span><span> </span><span class='pt7'>this</span><span class='pt10'>.value</span><span> </span><span class='pt17'>:</span><span> </span><span class='pt10'>defaultValue</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='104'></td><td><span> },</span></td></tr>
<tr><td class='ln' data-ln='105'></td><td> </td></tr>
<tr><td class='ln' data-ln='106'></td><td><span> </span><span class='pt13'>unwrapOrElse</span><span>(</span><span class='pt10'>fn</span><span>) {</span></td></tr>
<tr><td class='ln' data-ln='107'></td><td><span> </span><span class='pt17'>return</span><span> (</span><span class='pt7'>this</span><span class='pt10'>.</span><span class='pt13'>isSome</span><span>()) </span><span class='pt17'>?</span><span> </span><span class='pt7'>this</span><span class='pt10'>.value</span><span> </span><span class='pt17'>:</span><span> </span><span class='pt13'>fn</span><span>();</span></td></tr>
<tr><td class='ln' data-ln='108'></td><td><span> },</span></td></tr>
<tr><td class='ln' data-ln='109'></td><td><span> });</span></td></tr>
<tr><td class='ln' data-ln='110'></td><td> </td></tr>
<tr><td class='ln' data-ln='111'></td><td><span> </span><span class='pt17'>return</span><span> </span><span class='pt10'>Option</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='112'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='113'></td><td> </td></tr>
<tr><td class='ln' data-ln='114'></td><td> </td></tr>
<tr><td class='ln' data-ln='115'></td><td><span class='pt17'>const</span><span> </span><span class='pt10'>rust</span><span> = {</span></td></tr>
<tr><td class='ln' data-ln='116'></td><td><span> </span><span class='pt8'>tuple</span><span class='pt17'>:</span><span> </span><span class='pt10'>RustTuple</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='117'></td><td><span> </span><span class='pt13'>Tuple</span><span class='pt17'>:</span><span> (</span><span class='pt10'>type</span><span>, </span><span class='pt10'>values</span><span>) </span><span class='pt17'>=></span><span> </span><span class='pt13'>new</span><span> (</span><span class='pt13'>RustTuple</span><span>(</span><span class='pt17'>...</span><span class='pt10'>type</span><span>))([</span><span class='pt17'>...</span><span class='pt10'>values</span><span>]),</span></td></tr>
<tr><td class='ln' data-ln='118'></td><td> </td></tr>
<tr><td class='ln' data-ln='119'></td><td><span> </span><span class='pt8'>vector</span><span class='pt17'>:</span><span> </span><span class='pt10'>RustVector</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='120'></td><td><span> </span><span class='pt13'>Vector</span><span class='pt17'>:</span><span> (</span><span class='pt10'>type</span><span>, </span><span class='pt10'>values</span><span>) </span><span class='pt17'>=></span><span> </span><span class='pt13'>new</span><span> (</span><span class='pt13'>RustVector</span><span>(</span><span class='pt10'>type</span><span>))({ </span><span class='pt10'>values</span><span> }),</span></td></tr>
<tr><td class='ln' data-ln='121'></td><td> </td></tr>
<tr><td class='ln' data-ln='122'></td><td><span> </span><span class='pt8'>option</span><span class='pt17'>:</span><span> </span><span class='pt10'>RustOption</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='123'></td><td><span> </span><span class='pt13'>Option</span><span class='pt17'>:</span><span> (</span><span class='pt10'>type</span><span>, </span><span class='pt10'>value</span><span>, </span><span class='pt17'>...</span><span class='pt10'>opts</span><span>) </span><span class='pt17'>=></span><span> </span><span class='pt13'>new</span><span> (</span><span class='pt13'>RustOption</span><span>(</span><span class='pt10'>type</span><span>, </span><span class='pt17'>...</span><span class='pt10'>opts</span><span>))({</span></td></tr>
<tr><td class='ln' data-ln='124'></td><td><span> </span><span class='pt10'>value</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='125'></td><td><span> </span><span class='pt8'>discriminant</span><span class='pt17'>:</span><span> (</span><span class='pt17'>typeof</span><span> </span><span class='pt10'>value</span><span> </span><span class='pt17'>===</span><span> </span><span class='pt8'>'undefined'</span><span>) </span><span class='pt17'>?</span><span> </span><span class='pt7'>0</span><span> </span><span class='pt17'>:</span><span> </span><span class='pt7'>1</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='126'></td><td><span> }),</span></td></tr>
<tr><td class='ln' data-ln='127'></td><td> </td></tr>
<tr><td class='ln' data-ln='128'></td><td><span> </span><span class='pt13'>Some</span><span class='pt17'>:</span><span> (</span><span class='pt17'>...</span><span class='pt10'>args</span><span>) </span><span class='pt17'>=></span><span> </span><span class='pt10'>rust.</span><span class='pt13'>Option</span><span>(</span><span class='pt17'>...</span><span class='pt10'>args</span><span>),</span></td></tr>
<tr><td class='ln' data-ln='129'></td><td><span> </span><span class='pt13'>None</span><span class='pt17'>:</span><span> (</span><span class='pt10'>type</span><span>, </span><span class='pt17'>...</span><span class='pt10'>opts</span><span>) </span><span class='pt17'>=></span><span> </span><span class='pt10'>rust.</span><span class='pt13'>Option</span><span>(</span><span class='pt10'>type</span><span>, </span><span class='pt7'>undefined</span><span>, </span><span class='pt17'>...</span><span class='pt10'>opts</span><span>),</span></td></tr>
<tr><td class='ln' data-ln='130'></td><td><span>};</span></td></tr>
<tr><td class='ln' data-ln='131'></td><td> </td></tr>
<tr><td class='ln' data-ln='132'></td><td><span class='pt17'>export</span><span> </span><span class='pt17'>default</span><span> </span><span class='pt10'>rust</span><span>;</span></td></tr>
</table>
</div>
</div>
</div>
<div class='style' id='P--monokai_extended--js'>
<div class='P--monokai_extended-bordered'>
<div class="info header">
<span class="left">rust_types.js</span>
<span class="right"><span>132 lines</span><span>2.75 KB</span></span>
</div>
<div class='P--monokai_extended'>
<table>
<tr><td class='ln' data-ln='1'></td><td><span class='pt32'>import</span><span> </span><span class='pt36'>Struct</span><span> </span><span class='pt32'>from</span><span> </span><span class='pt27'>'./Struct'</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='2'></td><td><span class='pt32'>import</span><span> { </span><span class='pt36'>types</span><span>, </span><span class='pt36'>parseType</span><span>, </span><span class='pt36'>Pointer</span><span> } </span><span class='pt32'>from</span><span> </span><span class='pt27'>'./types'</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='3'></td><td><span class='pt32'>import</span><span> { </span><span class='pt36'>assert</span><span>, </span><span class='pt36'>vslice</span><span> } </span><span class='pt32'>from</span><span> </span><span class='pt27'>'./misc'</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='4'></td><td> </td></tr>
<tr><td class='ln' data-ln='5'></td><td> </td></tr>
<tr><td class='ln' data-ln='6'></td><td><span class='pt9 it'>const</span><span> </span><span class='pt36'>DATA</span><span> = </span><span class='pt36'>(</span><span class='pt32'>typeof</span><span> </span><span class='pt13 it'>Symbol</span><span> </span><span class='pt32'>!==</span><span> </span><span class='pt27'>'undefined'</span><span class='pt36'>)</span></td></tr>
<tr><td class='ln' data-ln='7'></td><td><span> </span><span class='pt32'>?</span><span> </span><span class='pt13 it'>Symbol</span><span class='pt36'>.</span><span>for</span><span class='pt36'>(</span><span class='pt27'>'struct-data'</span><span class='pt36'>)</span></td></tr>
<tr><td class='ln' data-ln='8'></td><td><span> </span><span class='pt32'>:</span><span> </span><span class='pt27'>'__data'</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='9'></td><td> </td></tr>
<tr><td class='ln' data-ln='10'></td><td> </td></tr>
<tr><td class='ln' data-ln='11'></td><td class='hi'><span class='pt9 it'>function</span><span class='pt13'> extend</span><span class='pt36'>(</span><span class='pt34 it'>StructType</span><span class='pt36'>)</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='12'></td><td class='hi'><span> </span><span class='pt9 it'>class</span><span> </span><span class='pt9 un'>RustType</span><span> </span><span class='pt9 it'>extends</span><span> </span><span class='pt36'>StructType</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='13'></td><td class='hi'><span> </span><span class='pt13'>free</span><span class='pt36'>()</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='14'></td><td class='hi'><span> </span><span class='pt9 it'>super</span><span class='pt36'>.</span><span>free</span><span class='pt36'>(</span><span class='pt17'>true</span><span class='pt36'>)</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='15'></td><td class='hi'><span> }</span></td></tr>
<tr><td class='ln' data-ln='16'></td><td class='hi'><span> }</span></td></tr>
<tr><td class='ln' data-ln='17'></td><td class='hi'> </td></tr>
<tr><td class='ln' data-ln='18'></td><td class='hi'><span> </span><span class='pt13 it'>Object</span><span class='pt36'>.</span><span>assign</span><span class='pt36'>(RustType</span><span>, </span><span class='pt36'>StructType)</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='19'></td><td class='hi'><span> </span><span class='pt32'>return</span><span> </span><span class='pt36'>RustType</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='20'></td><td class='hi'><span>}</span></td></tr>
<tr><td class='ln' data-ln='21'></td><td> </td></tr>
<tr><td class='ln' data-ln='22'></td><td> </td></tr>
<tr><td class='ln' data-ln='23'></td><td><span class='pt9 it'>function</span><span class='pt13'> RustTuple</span><span class='pt36'>(</span><span class='pt32'>...</span><span class='pt34 it'>tupleTypes</span><span class='pt36'>)</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='24'></td><td><span> </span><span class='pt9 it'>const</span><span> </span><span class='pt36'>fields</span><span> = {};</span></td></tr>
<tr><td class='ln' data-ln='25'></td><td> </td></tr>
<tr><td class='ln' data-ln='26'></td><td><span> </span><span class='pt36'>tupleTypes.</span><span>forEach</span><span class='pt36'>((</span><span class='pt34 it'>type</span><span>, </span><span class='pt34 it'>i</span><span class='pt36'>)</span><span> </span><span class='pt9 it'>=></span><span> {</span></td></tr>
<tr><td class='ln' data-ln='27'></td><td><span> </span><span class='pt36'>fields</span><span>[</span><span class='pt36'>i</span><span>] = parseType</span><span class='pt36'>(type)</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='28'></td><td><span> }</span><span class='pt36'>)</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='29'></td><td> </td></tr>
<tr><td class='ln' data-ln='30'></td><td><span> </span><span class='pt32'>return</span><span> </span><span class='pt32'>new</span><span> Struct</span><span class='pt36'>(fields)</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='31'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='32'></td><td> </td></tr>
<tr><td class='ln' data-ln='33'></td><td> </td></tr>
<tr><td class='ln' data-ln='34'></td><td><span class='pt9 it'>function</span><span class='pt13'> RustVector</span><span class='pt36'>(</span><span class='pt34 it'>typedef</span><span class='pt36'>)</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='35'></td><td><span> </span><span class='pt9 it'>const</span><span> </span><span class='pt36'>type</span><span> = parseType</span><span class='pt36'>(typedef)</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='36'></td><td> </td></tr>
<tr><td class='ln' data-ln='37'></td><td><span> </span><span class='pt9 it'>const</span><span> </span><span class='pt36'>Vector</span><span> = extend</span><span class='pt36'>(</span><span class='pt32'>new</span><span> Struct</span><span class='pt36'>(</span><span>{</span></td></tr>
<tr><td class='ln' data-ln='38'></td><td><span> </span><span class='pt36'>ptr:</span><span> </span><span class='pt36'>types.</span><span>pointer</span><span class='pt36'>(type)</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='39'></td><td><span> </span><span class='pt36'>cap:</span><span> </span><span class='pt27'>'usize'</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='40'></td><td><span> </span><span class='pt36'>len:</span><span> </span><span class='pt27'>'usize'</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='41'></td><td><span> </span><span class='pt10'>/* values */</span></td></tr>
<tr><td class='ln' data-ln='42'></td><td><span> }</span><span class='pt36'>))</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='43'></td><td> </td></tr>
<tr><td class='ln' data-ln='44'></td><td><span> </span><span class='pt13 it'>Object</span><span class='pt36'>.</span><span>defineProperty</span><span class='pt36'>(</span><span class='pt9 un'>Vector</span><span class='pt36'>.</span><span class='pt9 it'>prototype</span><span>, </span><span class='pt27'>'values'</span><span>, {</span></td></tr>
<tr><td class='ln' data-ln='45'></td><td><span> </span><span class='pt36'>enumerable:</span><span> </span><span class='pt17'>true</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='46'></td><td> </td></tr>
<tr><td class='ln' data-ln='47'></td><td><span> </span><span class='pt13'>get</span><span class='pt36'>()</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='48'></td><td><span> </span><span class='pt9 it'>const</span><span> </span><span class='pt36'>arrayType</span><span> = parseType</span><span class='pt36'>(</span><span>[</span><span class='pt36'>type</span><span>, </span><span class='pt9 it'>this</span><span class='pt36'>.len</span><span>]</span><span class='pt36'>)</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='49'></td><td><span> </span><span class='pt9 it'>const</span><span> </span><span class='pt36'>memory</span><span> = </span><span class='pt9 it'>this</span><span>[</span><span class='pt36'>DATA</span><span>]</span><span class='pt36'>.view.buffer</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='50'></td><td><span> </span><span class='pt9 it'>const</span><span> </span><span class='pt36'>view</span><span> = </span><span class='pt32'>new</span><span> </span><span class='pt13 it'>DataView</span><span class='pt36'>(memory</span><span>, </span><span class='pt9 it'>this</span><span class='pt36'>.ptr.</span><span>ref(), </span><span class='pt36'>arrayType.width)</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='51'></td><td> </td></tr>
<tr><td class='ln' data-ln='52'></td><td><span> </span><span class='pt32'>return</span><span> </span><span class='pt36'>arrayType.</span><span>read</span><span class='pt36'>(view</span><span>, </span><span class='pt9 it'>this</span><span>[</span><span class='pt36'>DATA</span><span>]</span><span class='pt36'>.free)</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='53'></td><td><span> },</span></td></tr>
<tr><td class='ln' data-ln='54'></td><td> </td></tr>
<tr><td class='ln' data-ln='55'></td><td><span> </span><span class='pt13'>set</span><span class='pt36'>(</span><span class='pt34 it'>values</span><span class='pt36'>)</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='56'></td><td><span> </span><span class='pt9 it'>const</span><span> </span><span class='pt36'>len</span><span> = </span><span class='pt36'>values.length</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='57'></td><td> </td></tr>
<tr><td class='ln' data-ln='58'></td><td><span> </span><span class='pt9 it'>this</span><span class='pt36'>.ptr</span><span> = </span><span class='pt32'>new</span><span> Pointer</span><span class='pt36'>(</span><span>[</span><span class='pt36'>type</span><span>, </span><span class='pt36'>len</span><span>], </span><span class='pt36'>values)</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='59'></td><td><span> </span><span class='pt9 it'>this</span><span class='pt36'>.len</span><span> = </span><span class='pt36'>len</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='60'></td><td><span> </span><span class='pt9 it'>this</span><span class='pt36'>.cap</span><span> = </span><span class='pt36'>len</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='61'></td><td><span> },</span></td></tr>
<tr><td class='ln' data-ln='62'></td><td><span> }</span><span class='pt36'>)</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='63'></td><td> </td></tr>
<tr><td class='ln' data-ln='64'></td><td><span> </span><span class='pt32'>return</span><span> </span><span class='pt36'>Vector</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='65'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='66'></td><td> </td></tr>
<tr><td class='ln' data-ln='67'></td><td> </td></tr>
<tr><td class='ln' data-ln='68'></td><td><span class='pt9 it'>function</span><span class='pt13'> RustOption</span><span class='pt36'>(</span><span class='pt34 it'>typedef</span><span class='pt36'>,</span><span class='pt13'> </span><span class='pt34 it'>isNonNullable</span><span class='pt13'> </span><span class='pt32'>=</span><span class='pt13'> </span><span class='pt17'>false</span><span class='pt36'>,</span><span class='pt13'> </span><span class='pt34 it'>tagSize</span><span class='pt36'>)</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='69'></td><td><span> </span><span class='pt9 it'>const</span><span> </span><span class='pt36'>type</span><span> = parseType</span><span class='pt36'>(typedef)</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='70'></td><td><span> </span><span class='pt9 it'>let</span><span> </span><span class='pt36'>discriminant</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='71'></td><td> </td></tr>
<tr><td class='ln' data-ln='72'></td><td><span> </span><span class='pt32'>if</span><span> </span><span class='pt36'>(tagSize)</span><span> </span><span class='pt36'>discriminant</span><span> = </span><span class='pt36'>types</span><span>[</span><span class='pt32'>`</span><span class='pt27'>uint</span><span class='pt32'>${</span><span class='pt36'>tagSize</span><span> </span><span class='pt32'>*</span><span> </span><span class='pt14'>8</span><span class='pt32'>}`</span><span>];</span></td></tr>
<tr><td class='ln' data-ln='73'></td><td><span> </span><span class='pt32'>else</span><span> </span><span class='pt32'>if</span><span> </span><span class='pt36'>(type.alignment</span><span> </span><span class='pt32'>===</span><span> </span><span class='pt14'>1</span><span class='pt36'>)</span><span> </span><span class='pt36'>discriminant</span><span> = </span><span class='pt27'>'uint8'</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='74'></td><td><span> </span><span class='pt32'>else</span><span> </span><span class='pt32'>if</span><span> </span><span class='pt36'>(type.alignment</span><span> </span><span class='pt32'>===</span><span> </span><span class='pt14'>2</span><span class='pt36'>)</span><span> </span><span class='pt36'>discriminant</span><span> = </span><span class='pt27'>'uint16'</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='75'></td><td><span> </span><span class='pt32'>else</span><span> </span><span class='pt36'>discriminant</span><span> = </span><span class='pt27'>'uint32'</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='76'></td><td> </td></tr>
<tr><td class='ln' data-ln='77'></td><td><span> </span><span class='pt9 it'>const</span><span> </span><span class='pt36'>fields</span><span> = </span><span class='pt36'>(isNonNullable)</span></td></tr>
<tr><td class='ln' data-ln='78'></td><td><span> </span><span class='pt32'>?</span><span> { </span><span class='pt36'>value:</span><span> </span><span class='pt36'>type</span><span> }</span></td></tr>
<tr><td class='ln' data-ln='79'></td><td><span> </span><span class='pt32'>:</span><span> { </span><span class='pt36'>discriminant</span><span>, </span><span class='pt36'>value:</span><span> </span><span class='pt36'>type</span><span> };</span></td></tr>
<tr><td class='ln' data-ln='80'></td><td> </td></tr>
<tr><td class='ln' data-ln='81'></td><td><span> </span><span class='pt9 it'>const</span><span> </span><span class='pt36'>Option</span><span> = </span><span class='pt32'>new</span><span> Struct</span><span class='pt36'>(fields)</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='82'></td><td> </td></tr>
<tr><td class='ln' data-ln='83'></td><td><span> </span><span class='pt13 it'>Object</span><span class='pt36'>.</span><span>assign</span><span class='pt36'>(</span><span class='pt9 un'>Option</span><span class='pt36'>.</span><span class='pt9 it'>prototype</span><span>, {</span></td></tr>
<tr><td class='ln' data-ln='84'></td><td><span> </span><span class='pt13'>isSome</span><span class='pt36'>()</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='85'></td><td><span> </span><span class='pt32'>return</span><span> </span><span class='pt36'>(</span><span class='pt27'>'discriminant'</span><span> </span><span class='pt32'>in</span><span> </span><span class='pt36'>fields)</span><span> </span><span class='pt32'>?</span><span> !!</span><span class='pt9 it'>this</span><span class='pt36'>.discriminant</span><span> </span><span class='pt32'>:</span><span> !!</span><span class='pt9 it'>this</span><span class='pt36'>.value</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='86'></td><td><span> },</span></td></tr>
<tr><td class='ln' data-ln='87'></td><td> </td></tr>
<tr><td class='ln' data-ln='88'></td><td><span> </span><span class='pt13'>isNone</span><span class='pt36'>()</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='89'></td><td><span> </span><span class='pt32'>return</span><span> !</span><span class='pt9 it'>this</span><span class='pt36'>.</span><span>isSome();</span></td></tr>
<tr><td class='ln' data-ln='90'></td><td><span> },</span></td></tr>
<tr><td class='ln' data-ln='91'></td><td> </td></tr>
<tr><td class='ln' data-ln='92'></td><td><span> </span><span class='pt13'>expect</span><span class='pt36'>(</span><span class='pt34 it'>msg</span><span class='pt36'>)</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='93'></td><td><span> </span><span class='pt32'>if</span><span> </span><span class='pt36'>(</span><span class='pt32'>!</span><span class='pt9 it'>this</span><span class='pt36'>.</span><span>isSome()</span><span class='pt36'>)</span><span> </span><span class='pt32'>throw</span><span> </span><span class='pt32'>new</span><span> </span><span class='pt13 it'>Error</span><span class='pt36'>(msg)</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='94'></td><td><span> </span><span class='pt32'>return</span><span> </span><span class='pt9 it'>this</span><span class='pt36'>.value</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='95'></td><td><span> },</span></td></tr>
<tr><td class='ln' data-ln='96'></td><td> </td></tr>
<tr><td class='ln' data-ln='97'></td><td><span> </span><span class='pt13'>unwrap</span><span class='pt36'>()</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='98'></td><td><span> </span><span class='pt32'>if</span><span> </span><span class='pt36'>(</span><span class='pt32'>!</span><span class='pt9 it'>this</span><span class='pt36'>.</span><span>isSome()</span><span class='pt36'>)</span><span> </span><span class='pt32'>throw</span><span> </span><span class='pt32'>new</span><span> </span><span class='pt13 it'>Error</span><span class='pt36'>(</span><span class='pt27'>'Error unwrapping none'</span><span class='pt36'>)</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='99'></td><td><span> </span><span class='pt32'>return</span><span> </span><span class='pt9 it'>this</span><span class='pt36'>.value</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='100'></td><td><span> },</span></td></tr>
<tr><td class='ln' data-ln='101'></td><td> </td></tr>
<tr><td class='ln' data-ln='102'></td><td><span> </span><span class='pt13'>unwrapOr</span><span class='pt36'>(</span><span class='pt34 it'>defaultValue</span><span class='pt36'>)</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='103'></td><td><span> </span><span class='pt32'>return</span><span> </span><span class='pt36'>(</span><span class='pt9 it'>this</span><span class='pt36'>.</span><span>isSome()</span><span class='pt36'>)</span><span> </span><span class='pt32'>?</span><span> </span><span class='pt9 it'>this</span><span class='pt36'>.value</span><span> </span><span class='pt32'>:</span><span> </span><span class='pt36'>defaultValue</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='104'></td><td><span> },</span></td></tr>
<tr><td class='ln' data-ln='105'></td><td> </td></tr>
<tr><td class='ln' data-ln='106'></td><td><span> </span><span class='pt13'>unwrapOrElse</span><span class='pt36'>(</span><span class='pt34 it'>fn</span><span class='pt36'>)</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='107'></td><td><span> </span><span class='pt32'>return</span><span> </span><span class='pt36'>(</span><span class='pt9 it'>this</span><span class='pt36'>.</span><span>isSome()</span><span class='pt36'>)</span><span> </span><span class='pt32'>?</span><span> </span><span class='pt9 it'>this</span><span class='pt36'>.value</span><span> </span><span class='pt32'>:</span><span> fn();</span></td></tr>
<tr><td class='ln' data-ln='108'></td><td><span> },</span></td></tr>
<tr><td class='ln' data-ln='109'></td><td><span> }</span><span class='pt36'>)</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='110'></td><td> </td></tr>
<tr><td class='ln' data-ln='111'></td><td><span> </span><span class='pt32'>return</span><span> </span><span class='pt36'>Option</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='112'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='113'></td><td> </td></tr>
<tr><td class='ln' data-ln='114'></td><td> </td></tr>
<tr><td class='ln' data-ln='115'></td><td><span class='pt9 it'>const</span><span> </span><span class='pt36'>rust</span><span> = {</span></td></tr>
<tr><td class='ln' data-ln='116'></td><td><span> </span><span class='pt36'>tuple:</span><span> </span><span class='pt36'>RustTuple</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='117'></td><td><span> </span><span class='pt13'>Tuple</span><span>: </span><span class='pt36'>(</span><span class='pt34 it'>type</span><span>, </span><span class='pt34 it'>values</span><span class='pt36'>)</span><span> </span><span class='pt9 it'>=></span><span> new </span><span class='pt36'>(</span><span>RustTuple</span><span class='pt36'>(</span><span class='pt32'>...</span><span class='pt36'>type))(</span><span>[</span><span class='pt32'>...</span><span class='pt36'>values</span><span>]</span><span class='pt36'>)</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='118'></td><td> </td></tr>
<tr><td class='ln' data-ln='119'></td><td><span> </span><span class='pt36'>vector:</span><span> </span><span class='pt36'>RustVector</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='120'></td><td><span> </span><span class='pt13'>Vector</span><span>: </span><span class='pt36'>(</span><span class='pt34 it'>type</span><span>, </span><span class='pt34 it'>values</span><span class='pt36'>)</span><span> </span><span class='pt9 it'>=></span><span> new </span><span class='pt36'>(</span><span>RustVector</span><span class='pt36'>(type))(</span><span>{ </span><span class='pt36'>values</span><span> }</span><span class='pt36'>)</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='121'></td><td> </td></tr>
<tr><td class='ln' data-ln='122'></td><td><span> </span><span class='pt36'>option:</span><span> </span><span class='pt36'>RustOption</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='123'></td><td><span> </span><span class='pt13'>Option</span><span>: </span><span class='pt36'>(</span><span class='pt34 it'>type</span><span>, </span><span class='pt34 it'>value</span><span>, </span><span class='pt32'>...</span><span class='pt34 it'>opts</span><span class='pt36'>)</span><span> </span><span class='pt9 it'>=></span><span> new </span><span class='pt36'>(</span><span>RustOption</span><span class='pt36'>(type</span><span>, </span><span class='pt32'>...</span><span class='pt36'>opts))(</span><span>{</span></td></tr>
<tr><td class='ln' data-ln='124'></td><td><span> </span><span class='pt36'>value</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='125'></td><td><span> </span><span class='pt36'>discriminant:</span><span> </span><span class='pt36'>(</span><span class='pt32'>typeof</span><span> </span><span class='pt36'>value</span><span> </span><span class='pt32'>===</span><span> </span><span class='pt27'>'undefined'</span><span class='pt36'>)</span><span> </span><span class='pt32'>?</span><span> </span><span class='pt14'>0</span><span> </span><span class='pt32'>:</span><span> </span><span class='pt14'>1</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='126'></td><td><span> }</span><span class='pt36'>)</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='127'></td><td> </td></tr>
<tr><td class='ln' data-ln='128'></td><td><span> </span><span class='pt13'>Some</span><span>: </span><span class='pt36'>(</span><span class='pt32'>...</span><span class='pt34 it'>args</span><span class='pt36'>)</span><span> </span><span class='pt9 it'>=></span><span> </span><span class='pt36'>rust.</span><span>Option</span><span class='pt36'>(</span><span class='pt32'>...</span><span class='pt36'>args)</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='129'></td><td><span> </span><span class='pt13'>None</span><span>: </span><span class='pt36'>(</span><span class='pt34 it'>type</span><span>, </span><span class='pt32'>...</span><span class='pt34 it'>opts</span><span class='pt36'>)</span><span> </span><span class='pt9 it'>=></span><span> </span><span class='pt36'>rust.</span><span>Option</span><span class='pt36'>(type</span><span>, </span><span class='pt17'>undefined</span><span>, </span><span class='pt32'>...</span><span class='pt36'>opts)</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='130'></td><td><span>};</span></td></tr>
<tr><td class='ln' data-ln='131'></td><td> </td></tr>
<tr><td class='ln' data-ln='132'></td><td><span class='pt32'>export</span><span> </span><span class='pt32'>default</span><span> </span><span class='pt36'>rust</span><span>;</span></td></tr>
</table>
</div>
</div>
</div>
<div class='style' id='P--oceanic_next--js'>
<div class='P--oceanic_next-bordered'>
<div class="info header">
<span class="left">rust_types.js</span>
<span class="right"><span>132 lines</span><span>2.75 KB</span></span>
</div>
<div class='P--oceanic_next'>
<table>
<tr><td class='ln' data-ln='1'></td><td><span class='pt1'>import</span><span> Struct </span><span class='pt1'>from</span><span> </span><span class='pt1'>'</span><span class='pt4'>./Struct</span><span class='pt1'>';</span></td></tr>
<tr><td class='ln' data-ln='2'></td><td><span class='pt1'>import</span><span> { types, parseType, Pointer } </span><span class='pt1'>from</span><span> </span><span class='pt1'>'</span><span class='pt4'>./types</span><span class='pt1'>';</span></td></tr>
<tr><td class='ln' data-ln='3'></td><td><span class='pt1'>import</span><span> { assert, vslice } </span><span class='pt1'>from</span><span> </span><span class='pt1'>'</span><span class='pt4'>./misc</span><span class='pt1'>';</span></td></tr>
<tr><td class='ln' data-ln='4'></td><td> </td></tr>
<tr><td class='ln' data-ln='5'></td><td> </td></tr>
<tr><td class='ln' data-ln='6'></td><td><span class='pt7'>const</span><span> DATA = (</span><span class='pt1'>typeof</span><span> </span><span class='pt13'>Symbol</span><span> </span><span class='pt1'>!==</span><span> </span><span class='pt1'>'</span><span class='pt4'>undefined</span><span class='pt1'>'</span><span>)</span></td></tr>
<tr><td class='ln' data-ln='7'></td><td><span> </span><span class='pt1'>?</span><span> </span><span class='pt13'>Symbol</span><span>.</span><span class='pt3'>for</span><span>(</span><span class='pt1'>'</span><span class='pt4'>struct-data</span><span class='pt1'>'</span><span>)</span></td></tr>
<tr><td class='ln' data-ln='8'></td><td><span> </span><span class='pt1'>:</span><span> </span><span class='pt1'>'</span><span class='pt4'>__data</span><span class='pt1'>';</span></td></tr>
<tr><td class='ln' data-ln='9'></td><td> </td></tr>
<tr><td class='ln' data-ln='10'></td><td> </td></tr>
<tr><td class='ln' data-ln='11'></td><td class='hi'><span class='pt7'>function</span><span> </span><span class='pt3'>extend</span><span class='pt1'>(</span><span class='pt12'>StructType</span><span class='pt1'>)</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='12'></td><td class='hi'><span> </span><span class='pt7'>class</span><span> </span><span class='pt13'>RustType</span><span> </span><span class='pt7'>extends</span><span> StructType </span><span class='pt1'>{</span></td></tr>
<tr><td class='ln' data-ln='13'></td><td class='hi'><span> </span><span class='pt8'>free</span><span class='pt1'>()</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='14'></td><td class='hi'><span> </span><span class='pt10 it'>super</span><span>.</span><span class='pt3'>free</span><span>(</span><span class='pt12'>true</span><span>)</span><span class='pt1'>;</span></td></tr>
<tr><td class='ln' data-ln='15'></td><td class='hi'><span> }</span></td></tr>
<tr><td class='ln' data-ln='16'></td><td class='hi'><span> </span><span class='pt1'>}</span></td></tr>
<tr><td class='ln' data-ln='17'></td><td class='hi'> </td></tr>
<tr><td class='ln' data-ln='18'></td><td class='hi'><span> </span><span class='pt13'>Object</span><span>.</span><span class='pt3'>assign</span><span>(RustType, StructType)</span><span class='pt1'>;</span></td></tr>
<tr><td class='ln' data-ln='19'></td><td class='hi'><span> </span><span class='pt7'>return</span><span> RustType</span><span class='pt1'>;</span></td></tr>
<tr><td class='ln' data-ln='20'></td><td class='hi'><span>}</span></td></tr>
<tr><td class='ln' data-ln='21'></td><td> </td></tr>
<tr><td class='ln' data-ln='22'></td><td> </td></tr>
<tr><td class='ln' data-ln='23'></td><td><span class='pt7'>function</span><span> </span><span class='pt3'>RustTuple</span><span class='pt1'>(...</span><span class='pt12'>tupleTypes</span><span class='pt1'>)</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='24'></td><td><span> </span><span class='pt7'>const</span><span> fields = {}</span><span class='pt1'>;</span></td></tr>
<tr><td class='ln' data-ln='25'></td><td> </td></tr>
<tr><td class='ln' data-ln='26'></td><td><span> tupleTypes.</span><span class='pt3'>forEach</span><span>(</span><span class='pt1'>(</span><span class='pt12'>type</span><span class='pt1'>,</span><span> </span><span class='pt12'>i</span><span class='pt1'>)</span><span> </span><span class='pt7'>=></span><span> {</span></td></tr>
<tr><td class='ln' data-ln='27'></td><td><span> fields[i] = </span><span class='pt3'>parseType</span><span>(type)</span><span class='pt1'>;</span></td></tr>
<tr><td class='ln' data-ln='28'></td><td><span> })</span><span class='pt1'>;</span></td></tr>
<tr><td class='ln' data-ln='29'></td><td> </td></tr>
<tr><td class='ln' data-ln='30'></td><td><span> </span><span class='pt7'>return</span><span> </span><span class='pt1'>new</span><span> </span><span class='pt8'>Struct</span><span>(fields)</span><span class='pt1'>;</span></td></tr>
<tr><td class='ln' data-ln='31'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='32'></td><td> </td></tr>
<tr><td class='ln' data-ln='33'></td><td> </td></tr>
<tr><td class='ln' data-ln='34'></td><td><span class='pt7'>function</span><span> </span><span class='pt3'>RustVector</span><span class='pt1'>(</span><span class='pt12'>typedef</span><span class='pt1'>)</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='35'></td><td><span> </span><span class='pt7'>const</span><span> type = </span><span class='pt3'>parseType</span><span>(typedef)</span><span class='pt1'>;</span></td></tr>
<tr><td class='ln' data-ln='36'></td><td> </td></tr>
<tr><td class='ln' data-ln='37'></td><td><span> </span><span class='pt7'>const</span><span> Vector = </span><span class='pt3'>extend</span><span>(</span><span class='pt1'>new</span><span> </span><span class='pt8'>Struct</span><span>({</span></td></tr>
<tr><td class='ln' data-ln='38'></td><td><span> </span><span class='pt4'>ptr</span><span class='pt1'>:</span><span> types.</span><span class='pt3'>pointer</span><span>(type),</span></td></tr>
<tr><td class='ln' data-ln='39'></td><td><span> </span><span class='pt4'>cap</span><span class='pt1'>:</span><span> </span><span class='pt1'>'</span><span class='pt4'>usize</span><span class='pt1'>'</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='40'></td><td><span> </span><span class='pt4'>len</span><span class='pt1'>:</span><span> </span><span class='pt1'>'</span><span class='pt4'>usize</span><span class='pt1'>'</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='41'></td><td><span> </span><span class='pt2'>/* values */</span></td></tr>
<tr><td class='ln' data-ln='42'></td><td><span> }))</span><span class='pt1'>;</span></td></tr>
<tr><td class='ln' data-ln='43'></td><td> </td></tr>
<tr><td class='ln' data-ln='44'></td><td><span> </span><span class='pt13'>Object</span><span>.</span><span class='pt3'>defineProperty</span><span>(</span><span class='pt13'>Vector</span><span>.</span><span class='pt10 it'>prototype</span><span>, </span><span class='pt1'>'</span><span class='pt4'>values</span><span class='pt1'>'</span><span>, {</span></td></tr>
<tr><td class='ln' data-ln='45'></td><td><span> </span><span class='pt4'>enumerable</span><span class='pt1'>:</span><span> </span><span class='pt12'>true</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='46'></td><td> </td></tr>
<tr><td class='ln' data-ln='47'></td><td><span> </span><span class='pt3'>get</span><span class='pt1'>()</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='48'></td><td><span> </span><span class='pt7'>const</span><span> arrayType = </span><span class='pt3'>parseType</span><span>([type, </span><span class='pt10 it'>this</span><span>.len])</span><span class='pt1'>;</span></td></tr>
<tr><td class='ln' data-ln='49'></td><td><span> </span><span class='pt7'>const</span><span> memory = </span><span class='pt10 it'>this</span><span>[DATA].view.buffer</span><span class='pt1'>;</span></td></tr>
<tr><td class='ln' data-ln='50'></td><td><span> </span><span class='pt7'>const</span><span> view = </span><span class='pt1'>new</span><span> </span><span class='pt13'>DataView</span><span>(memory, </span><span class='pt10 it'>this</span><span>.ptr.</span><span class='pt3'>ref</span><span>(), arrayType.width)</span><span class='pt1'>;</span></td></tr>
<tr><td class='ln' data-ln='51'></td><td> </td></tr>
<tr><td class='ln' data-ln='52'></td><td><span> </span><span class='pt7'>return</span><span> arrayType.</span><span class='pt3'>read</span><span>(view, </span><span class='pt10 it'>this</span><span>[DATA].free)</span><span class='pt1'>;</span></td></tr>
<tr><td class='ln' data-ln='53'></td><td><span> },</span></td></tr>
<tr><td class='ln' data-ln='54'></td><td> </td></tr>
<tr><td class='ln' data-ln='55'></td><td><span> </span><span class='pt3'>set</span><span class='pt1'>(</span><span class='pt12'>values</span><span class='pt1'>)</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='56'></td><td><span> </span><span class='pt7'>const</span><span> len = values.length</span><span class='pt1'>;</span></td></tr>
<tr><td class='ln' data-ln='57'></td><td> </td></tr>
<tr><td class='ln' data-ln='58'></td><td><span> </span><span class='pt10 it'>this</span><span>.ptr = </span><span class='pt1'>new</span><span> </span><span class='pt8'>Pointer</span><span>([type, len], values)</span><span class='pt1'>;</span></td></tr>
<tr><td class='ln' data-ln='59'></td><td><span> </span><span class='pt10 it'>this</span><span>.len = len</span><span class='pt1'>;</span></td></tr>
<tr><td class='ln' data-ln='60'></td><td><span> </span><span class='pt10 it'>this</span><span>.cap = len</span><span class='pt1'>;</span></td></tr>
<tr><td class='ln' data-ln='61'></td><td><span> },</span></td></tr>
<tr><td class='ln' data-ln='62'></td><td><span> })</span><span class='pt1'>;</span></td></tr>
<tr><td class='ln' data-ln='63'></td><td> </td></tr>
<tr><td class='ln' data-ln='64'></td><td><span> </span><span class='pt7'>return</span><span> Vector</span><span class='pt1'>;</span></td></tr>
<tr><td class='ln' data-ln='65'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='66'></td><td> </td></tr>
<tr><td class='ln' data-ln='67'></td><td> </td></tr>
<tr><td class='ln' data-ln='68'></td><td><span class='pt7'>function</span><span> </span><span class='pt3'>RustOption</span><span class='pt1'>(</span><span class='pt12'>typedef</span><span class='pt1'>,</span><span> </span><span class='pt12'>isNonNullable</span><span> </span><span class='pt1'>=</span><span> </span><span class='pt12'>false</span><span class='pt1'>,</span><span> </span><span class='pt12'>tagSize</span><span class='pt1'>)</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='69'></td><td><span> </span><span class='pt7'>const</span><span> type = </span><span class='pt3'>parseType</span><span>(typedef)</span><span class='pt1'>;</span></td></tr>
<tr><td class='ln' data-ln='70'></td><td><span> </span><span class='pt7'>let</span><span> discriminant</span><span class='pt1'>;</span></td></tr>
<tr><td class='ln' data-ln='71'></td><td> </td></tr>
<tr><td class='ln' data-ln='72'></td><td><span> </span><span class='pt7'>if</span><span> (tagSize) discriminant = types[</span><span class='pt1'>`</span><span class='pt4'>uint</span><span class='pt1'>${</span><span>tagSize </span><span class='pt1'>*</span><span> </span><span class='pt12'>8</span><span class='pt1'>}`</span><span>]</span><span class='pt1'>;</span></td></tr>
<tr><td class='ln' data-ln='73'></td><td><span> </span><span class='pt7'>else</span><span> </span><span class='pt7'>if</span><span> (type.alignment </span><span class='pt1'>===</span><span> </span><span class='pt12'>1</span><span>) discriminant = </span><span class='pt1'>'</span><span class='pt4'>uint8</span><span class='pt1'>';</span></td></tr>
<tr><td class='ln' data-ln='74'></td><td><span> </span><span class='pt7'>else</span><span> </span><span class='pt7'>if</span><span> (type.alignment </span><span class='pt1'>===</span><span> </span><span class='pt12'>2</span><span>) discriminant = </span><span class='pt1'>'</span><span class='pt4'>uint16</span><span class='pt1'>';</span></td></tr>
<tr><td class='ln' data-ln='75'></td><td><span> </span><span class='pt7'>else</span><span> discriminant = </span><span class='pt1'>'</span><span class='pt4'>uint32</span><span class='pt1'>';</span></td></tr>
<tr><td class='ln' data-ln='76'></td><td> </td></tr>
<tr><td class='ln' data-ln='77'></td><td><span> </span><span class='pt7'>const</span><span> fields = (isNonNullable)</span></td></tr>
<tr><td class='ln' data-ln='78'></td><td><span> </span><span class='pt1'>?</span><span> { </span><span class='pt4'>value</span><span class='pt1'>:</span><span> type }</span></td></tr>
<tr><td class='ln' data-ln='79'></td><td><span> </span><span class='pt1'>:</span><span> { discriminant, </span><span class='pt4'>value</span><span class='pt1'>:</span><span> type }</span><span class='pt1'>;</span></td></tr>
<tr><td class='ln' data-ln='80'></td><td> </td></tr>
<tr><td class='ln' data-ln='81'></td><td><span> </span><span class='pt7'>const</span><span> Option = </span><span class='pt1'>new</span><span> </span><span class='pt8'>Struct</span><span>(fields)</span><span class='pt1'>;</span></td></tr>
<tr><td class='ln' data-ln='82'></td><td> </td></tr>
<tr><td class='ln' data-ln='83'></td><td><span> </span><span class='pt13'>Object</span><span>.</span><span class='pt3'>assign</span><span>(</span><span class='pt13'>Option</span><span>.</span><span class='pt10 it'>prototype</span><span>, {</span></td></tr>
<tr><td class='ln' data-ln='84'></td><td><span> </span><span class='pt3'>isSome</span><span class='pt1'>()</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='85'></td><td><span> </span><span class='pt7'>return</span><span> (</span><span class='pt1'>'</span><span class='pt4'>discriminant</span><span class='pt1'>'</span><span> </span><span class='pt1'>in</span><span> fields) </span><span class='pt1'>?</span><span> !!</span><span class='pt10 it'>this</span><span>.discriminant </span><span class='pt1'>:</span><span> !!</span><span class='pt10 it'>this</span><span>.value</span><span class='pt1'>;</span></td></tr>
<tr><td class='ln' data-ln='86'></td><td><span> },</span></td></tr>
<tr><td class='ln' data-ln='87'></td><td> </td></tr>
<tr><td class='ln' data-ln='88'></td><td><span> </span><span class='pt3'>isNone</span><span class='pt1'>()</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='89'></td><td><span> </span><span class='pt7'>return</span><span> !</span><span class='pt10 it'>this</span><span>.</span><span class='pt3'>isSome</span><span>()</span><span class='pt1'>;</span></td></tr>
<tr><td class='ln' data-ln='90'></td><td><span> },</span></td></tr>
<tr><td class='ln' data-ln='91'></td><td> </td></tr>
<tr><td class='ln' data-ln='92'></td><td><span> </span><span class='pt3'>expect</span><span class='pt1'>(</span><span class='pt12'>msg</span><span class='pt1'>)</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='93'></td><td><span> </span><span class='pt7'>if</span><span> (</span><span class='pt1'>!</span><span class='pt10 it'>this</span><span>.</span><span class='pt3'>isSome</span><span>()) </span><span class='pt7'>throw</span><span> </span><span class='pt1'>new</span><span> </span><span class='pt13'>Error</span><span>(msg)</span><span class='pt1'>;</span></td></tr>
<tr><td class='ln' data-ln='94'></td><td><span> </span><span class='pt7'>return</span><span> </span><span class='pt10 it'>this</span><span>.value</span><span class='pt1'>;</span></td></tr>
<tr><td class='ln' data-ln='95'></td><td><span> },</span></td></tr>
<tr><td class='ln' data-ln='96'></td><td> </td></tr>
<tr><td class='ln' data-ln='97'></td><td><span> </span><span class='pt3'>unwrap</span><span class='pt1'>()</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='98'></td><td><span> </span><span class='pt7'>if</span><span> (</span><span class='pt1'>!</span><span class='pt10 it'>this</span><span>.</span><span class='pt3'>isSome</span><span>()) </span><span class='pt7'>throw</span><span> </span><span class='pt1'>new</span><span> </span><span class='pt13'>Error</span><span>(</span><span class='pt1'>'</span><span class='pt4'>Error unwrapping none</span><span class='pt1'>'</span><span>)</span><span class='pt1'>;</span></td></tr>
<tr><td class='ln' data-ln='99'></td><td><span> </span><span class='pt7'>return</span><span> </span><span class='pt10 it'>this</span><span>.value</span><span class='pt1'>;</span></td></tr>
<tr><td class='ln' data-ln='100'></td><td><span> },</span></td></tr>
<tr><td class='ln' data-ln='101'></td><td> </td></tr>
<tr><td class='ln' data-ln='102'></td><td><span> </span><span class='pt3'>unwrapOr</span><span class='pt1'>(</span><span class='pt12'>defaultValue</span><span class='pt1'>)</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='103'></td><td><span> </span><span class='pt7'>return</span><span> (</span><span class='pt10 it'>this</span><span>.</span><span class='pt3'>isSome</span><span>()) </span><span class='pt1'>?</span><span> </span><span class='pt10 it'>this</span><span>.value </span><span class='pt1'>:</span><span> defaultValue</span><span class='pt1'>;</span></td></tr>
<tr><td class='ln' data-ln='104'></td><td><span> },</span></td></tr>
<tr><td class='ln' data-ln='105'></td><td> </td></tr>
<tr><td class='ln' data-ln='106'></td><td><span> </span><span class='pt3'>unwrapOrElse</span><span class='pt1'>(</span><span class='pt12'>fn</span><span class='pt1'>)</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='107'></td><td><span> </span><span class='pt7'>return</span><span> (</span><span class='pt10 it'>this</span><span>.</span><span class='pt3'>isSome</span><span>()) </span><span class='pt1'>?</span><span> </span><span class='pt10 it'>this</span><span>.value </span><span class='pt1'>:</span><span> </span><span class='pt3'>fn</span><span>()</span><span class='pt1'>;</span></td></tr>
<tr><td class='ln' data-ln='108'></td><td><span> },</span></td></tr>
<tr><td class='ln' data-ln='109'></td><td><span> })</span><span class='pt1'>;</span></td></tr>
<tr><td class='ln' data-ln='110'></td><td> </td></tr>
<tr><td class='ln' data-ln='111'></td><td><span> </span><span class='pt7'>return</span><span> Option</span><span class='pt1'>;</span></td></tr>
<tr><td class='ln' data-ln='112'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='113'></td><td> </td></tr>
<tr><td class='ln' data-ln='114'></td><td> </td></tr>
<tr><td class='ln' data-ln='115'></td><td><span class='pt7'>const</span><span> rust = {</span></td></tr>
<tr><td class='ln' data-ln='116'></td><td><span> </span><span class='pt4'>tuple</span><span class='pt1'>:</span><span> RustTuple,</span></td></tr>
<tr><td class='ln' data-ln='117'></td><td><span> </span><span class='pt3'>Tuple</span><span class='pt1'>:</span><span> </span><span class='pt1'>(</span><span class='pt12'>type</span><span class='pt1'>,</span><span> </span><span class='pt12'>values</span><span class='pt1'>)</span><span> </span><span class='pt7'>=></span><span> </span><span class='pt3'>new</span><span> (</span><span class='pt3'>RustTuple</span><span>(</span><span class='pt1'>...</span><span>type))([</span><span class='pt1'>...</span><span>values]),</span></td></tr>
<tr><td class='ln' data-ln='118'></td><td> </td></tr>
<tr><td class='ln' data-ln='119'></td><td><span> </span><span class='pt4'>vector</span><span class='pt1'>:</span><span> RustVector,</span></td></tr>
<tr><td class='ln' data-ln='120'></td><td><span> </span><span class='pt3'>Vector</span><span class='pt1'>:</span><span> </span><span class='pt1'>(</span><span class='pt12'>type</span><span class='pt1'>,</span><span> </span><span class='pt12'>values</span><span class='pt1'>)</span><span> </span><span class='pt7'>=></span><span> </span><span class='pt3'>new</span><span> (</span><span class='pt3'>RustVector</span><span>(type))({ values }),</span></td></tr>
<tr><td class='ln' data-ln='121'></td><td> </td></tr>
<tr><td class='ln' data-ln='122'></td><td><span> </span><span class='pt4'>option</span><span class='pt1'>:</span><span> RustOption,</span></td></tr>
<tr><td class='ln' data-ln='123'></td><td><span> </span><span class='pt3'>Option</span><span class='pt1'>:</span><span> </span><span class='pt1'>(</span><span class='pt12'>type</span><span class='pt1'>,</span><span> </span><span class='pt12'>value</span><span class='pt1'>,</span><span> </span><span class='pt1'>...</span><span class='pt12'>opts</span><span class='pt1'>)</span><span> </span><span class='pt7'>=></span><span> </span><span class='pt3'>new</span><span> (</span><span class='pt3'>RustOption</span><span>(type, </span><span class='pt1'>...</span><span>opts))({</span></td></tr>
<tr><td class='ln' data-ln='124'></td><td><span> value,</span></td></tr>
<tr><td class='ln' data-ln='125'></td><td><span> </span><span class='pt4'>discriminant</span><span class='pt1'>:</span><span> (</span><span class='pt1'>typeof</span><span> value </span><span class='pt1'>===</span><span> </span><span class='pt1'>'</span><span class='pt4'>undefined</span><span class='pt1'>'</span><span>) </span><span class='pt1'>?</span><span> </span><span class='pt12'>0</span><span> </span><span class='pt1'>:</span><span> </span><span class='pt12'>1</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='126'></td><td><span> }),</span></td></tr>
<tr><td class='ln' data-ln='127'></td><td> </td></tr>
<tr><td class='ln' data-ln='128'></td><td><span> </span><span class='pt3'>Some</span><span class='pt1'>:</span><span> </span><span class='pt1'>(...</span><span class='pt12'>args</span><span class='pt1'>)</span><span> </span><span class='pt7'>=></span><span> rust.</span><span class='pt3'>Option</span><span>(</span><span class='pt1'>...</span><span>args),</span></td></tr>
<tr><td class='ln' data-ln='129'></td><td><span> </span><span class='pt3'>None</span><span class='pt1'>:</span><span> </span><span class='pt1'>(</span><span class='pt12'>type</span><span class='pt1'>,</span><span> </span><span class='pt1'>...</span><span class='pt12'>opts</span><span class='pt1'>)</span><span> </span><span class='pt7'>=></span><span> rust.</span><span class='pt3'>Option</span><span>(type, </span><span class='pt12'>undefined</span><span>, </span><span class='pt1'>...</span><span>opts),</span></td></tr>
<tr><td class='ln' data-ln='130'></td><td><span>}</span><span class='pt1'>;</span></td></tr>
<tr><td class='ln' data-ln='131'></td><td> </td></tr>
<tr><td class='ln' data-ln='132'></td><td><span class='pt1'>export</span><span> </span><span class='pt7'>default</span><span> rust</span><span class='pt1'>;</span></td></tr>
</table>
</div>
</div>
</div>
<div class='style' id='P--one_dark--js'>
<div class='P--one_dark-bordered'>
<div class="info header">
<span class="left">rust_types.js</span>
<span class="right"><span>132 lines</span><span>2.75 KB</span></span>
</div>
<div class='P--one_dark'>
<table>
<tr><td class='ln' data-ln='1'></td><td><span class='pt5'>import</span><span> </span><span class='pt26'>Struct</span><span> </span><span class='pt5'>from</span><span> </span><span class='pt13'>'./Struct'</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='2'></td><td><span class='pt5'>import</span><span> { </span><span class='pt26'>types</span><span>, </span><span class='pt26'>parseType</span><span>, </span><span class='pt26'>Pointer</span><span> } </span><span class='pt5'>from</span><span> </span><span class='pt13'>'./types'</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='3'></td><td><span class='pt5'>import</span><span> { </span><span class='pt26'>assert</span><span>, </span><span class='pt26'>vslice</span><span> } </span><span class='pt5'>from</span><span> </span><span class='pt13'>'./misc'</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='4'></td><td> </td></tr>
<tr><td class='ln' data-ln='5'></td><td> </td></tr>
<tr><td class='ln' data-ln='6'></td><td><span class='pt20'>const</span><span> </span><span class='pt24'>DATA</span><span> = (</span><span class='pt5'>typeof</span><span> </span><span class='pt28'>Symbol</span><span> </span><span class='pt5'>!==</span><span> </span><span class='pt13'>'undefined'</span><span>)</span></td></tr>
<tr><td class='ln' data-ln='7'></td><td><span> </span><span class='pt20'>?</span><span> </span><span class='pt28'>Symbol</span><span class='pt17'>.</span><span class='pt9'>for</span><span>(</span><span class='pt13'>'struct-data'</span><span>)</span></td></tr>
<tr><td class='ln' data-ln='8'></td><td><span> </span><span class='pt20'>:</span><span> </span><span class='pt13'>'__data'</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='9'></td><td> </td></tr>
<tr><td class='ln' data-ln='10'></td><td> </td></tr>
<tr><td class='ln' data-ln='11'></td><td class='hi'><span class='pt20'>function</span><span> </span><span class='pt9'>extend</span><span>(</span><span class='pt26 it'>StructType</span><span>) {</span></td></tr>
<tr><td class='ln' data-ln='12'></td><td class='hi'><span> </span><span class='pt20'>class</span><span> </span><span class='pt28'>RustType</span><span> </span><span class='pt20'>extends</span><span> </span><span class='pt26'>StructType</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='13'></td><td class='hi'><span> </span><span class='pt9'>free</span><span>() {</span></td></tr>
<tr><td class='ln' data-ln='14'></td><td class='hi'><span> </span><span class='it'>super</span><span class='pt17'>.</span><span class='pt9'>free</span><span>(</span><span class='pt24'>true</span><span>);</span></td></tr>
<tr><td class='ln' data-ln='15'></td><td class='hi'><span> }</span></td></tr>
<tr><td class='ln' data-ln='16'></td><td class='hi'><span> }</span></td></tr>
<tr><td class='ln' data-ln='17'></td><td class='hi'> </td></tr>
<tr><td class='ln' data-ln='18'></td><td class='hi'><span> </span><span class='pt28'>Object</span><span class='pt17'>.</span><span class='pt9'>assign</span><span>(</span><span class='pt26'>RustType</span><span>, </span><span class='pt26'>StructType</span><span>);</span></td></tr>
<tr><td class='ln' data-ln='19'></td><td class='hi'><span> </span><span class='pt20'>return</span><span> </span><span class='pt26'>RustType</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='20'></td><td class='hi'><span>}</span></td></tr>
<tr><td class='ln' data-ln='21'></td><td> </td></tr>
<tr><td class='ln' data-ln='22'></td><td> </td></tr>
<tr><td class='ln' data-ln='23'></td><td><span class='pt20'>function</span><span> </span><span class='pt9'>RustTuple</span><span>(</span><span class='pt5'>...</span><span class='pt26 it'>tupleTypes</span><span>) {</span></td></tr>
<tr><td class='ln' data-ln='24'></td><td><span> </span><span class='pt20'>const</span><span> </span><span class='pt26'>fields</span><span> = {};</span></td></tr>
<tr><td class='ln' data-ln='25'></td><td> </td></tr>
<tr><td class='ln' data-ln='26'></td><td><span> </span><span class='pt26'>tupleTypes</span><span class='pt17'>.</span><span class='pt9'>forEach</span><span>((</span><span class='pt26 it'>type</span><span>, </span><span class='pt26 it'>i</span><span>) </span><span class='pt20'>=></span><span> {</span></td></tr>
<tr><td class='ln' data-ln='27'></td><td><span> </span><span class='pt26'>fields</span><span>[</span><span class='pt26'>i</span><span>] = </span><span class='pt9'>parseType</span><span>(</span><span class='pt26'>type</span><span>);</span></td></tr>
<tr><td class='ln' data-ln='28'></td><td><span> });</span></td></tr>
<tr><td class='ln' data-ln='29'></td><td> </td></tr>
<tr><td class='ln' data-ln='30'></td><td><span> </span><span class='pt20'>return</span><span> </span><span class='pt20'>new</span><span> </span><span class='pt28'>Struct</span><span>(</span><span class='pt26'>fields</span><span>);</span></td></tr>
<tr><td class='ln' data-ln='31'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='32'></td><td> </td></tr>
<tr><td class='ln' data-ln='33'></td><td> </td></tr>
<tr><td class='ln' data-ln='34'></td><td><span class='pt20'>function</span><span> </span><span class='pt9'>RustVector</span><span>(</span><span class='pt26 it'>typedef</span><span>) {</span></td></tr>
<tr><td class='ln' data-ln='35'></td><td><span> </span><span class='pt20'>const</span><span> </span><span class='pt26'>type</span><span> = </span><span class='pt9'>parseType</span><span>(</span><span class='pt26'>typedef</span><span>);</span></td></tr>
<tr><td class='ln' data-ln='36'></td><td> </td></tr>
<tr><td class='ln' data-ln='37'></td><td><span> </span><span class='pt20'>const</span><span> </span><span class='pt26'>Vector</span><span> = </span><span class='pt9'>extend</span><span>(</span><span class='pt20'>new</span><span> </span><span class='pt28'>Struct</span><span>({</span></td></tr>
<tr><td class='ln' data-ln='38'></td><td><span> </span><span class='pt13'>ptr</span><span class='pt17'>:</span><span> </span><span class='pt26'>types</span><span class='pt17'>.</span><span class='pt9'>pointer</span><span>(</span><span class='pt26'>type</span><span>),</span></td></tr>
<tr><td class='ln' data-ln='39'></td><td><span> </span><span class='pt13'>cap</span><span class='pt17'>:</span><span> </span><span class='pt13'>'usize'</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='40'></td><td><span> </span><span class='pt13'>len</span><span class='pt17'>:</span><span> </span><span class='pt13'>'usize'</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='41'></td><td><span> </span><span class='pt11 it'>/* values */</span></td></tr>
<tr><td class='ln' data-ln='42'></td><td><span> }));</span></td></tr>
<tr><td class='ln' data-ln='43'></td><td> </td></tr>
<tr><td class='ln' data-ln='44'></td><td><span> </span><span class='pt28'>Object</span><span class='pt17'>.</span><span class='pt9'>defineProperty</span><span>(</span><span class='pt28'>Vector</span><span class='pt17'>.</span><span class='pt26'>prototype</span><span>, </span><span class='pt13'>'values'</span><span>, {</span></td></tr>
<tr><td class='ln' data-ln='45'></td><td><span> </span><span class='pt13'>enumerable</span><span class='pt17'>:</span><span> </span><span class='pt24'>true</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='46'></td><td> </td></tr>
<tr><td class='ln' data-ln='47'></td><td><span> </span><span class='pt9'>get</span><span>() {</span></td></tr>
<tr><td class='ln' data-ln='48'></td><td><span> </span><span class='pt20'>const</span><span> </span><span class='pt26'>arrayType</span><span> = </span><span class='pt9'>parseType</span><span>([</span><span class='pt26'>type</span><span>, </span><span class='pt28 it'>this</span><span class='pt17'>.</span><span class='pt26'>len</span><span>]);</span></td></tr>
<tr><td class='ln' data-ln='49'></td><td><span> </span><span class='pt20'>const</span><span> </span><span class='pt26'>memory</span><span> = </span><span class='pt28 it'>this</span><span>[</span><span class='pt24'>DATA</span><span>]</span><span class='pt17'>.</span><span class='pt26'>view</span><span class='pt17'>.</span><span class='pt26'>buffer</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='50'></td><td><span> </span><span class='pt20'>const</span><span> </span><span class='pt26'>view</span><span> = </span><span class='pt20'>new</span><span> </span><span class='pt28'>DataView</span><span>(</span><span class='pt26'>memory</span><span>, </span><span class='pt28 it'>this</span><span class='pt17'>.</span><span class='pt26'>ptr</span><span class='pt17'>.</span><span class='pt9'>ref</span><span>(), </span><span class='pt26'>arrayType</span><span class='pt17'>.</span><span class='pt26'>width</span><span>);</span></td></tr>
<tr><td class='ln' data-ln='51'></td><td> </td></tr>
<tr><td class='ln' data-ln='52'></td><td><span> </span><span class='pt20'>return</span><span> </span><span class='pt26'>arrayType</span><span class='pt17'>.</span><span class='pt9'>read</span><span>(</span><span class='pt26'>view</span><span>, </span><span class='pt28 it'>this</span><span>[</span><span class='pt24'>DATA</span><span>]</span><span class='pt17'>.</span><span class='pt26'>free</span><span>);</span></td></tr>
<tr><td class='ln' data-ln='53'></td><td><span> },</span></td></tr>
<tr><td class='ln' data-ln='54'></td><td> </td></tr>
<tr><td class='ln' data-ln='55'></td><td><span> </span><span class='pt9'>set</span><span>(</span><span class='pt26 it'>values</span><span>) {</span></td></tr>
<tr><td class='ln' data-ln='56'></td><td><span> </span><span class='pt20'>const</span><span> </span><span class='pt26'>len</span><span> = </span><span class='pt26'>values</span><span class='pt17'>.</span><span class='pt26'>length</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='57'></td><td> </td></tr>
<tr><td class='ln' data-ln='58'></td><td><span> </span><span class='pt28 it'>this</span><span class='pt17'>.</span><span class='pt26'>ptr</span><span> = </span><span class='pt20'>new</span><span> </span><span class='pt28'>Pointer</span><span>([</span><span class='pt26'>type</span><span>, </span><span class='pt26'>len</span><span>], </span><span class='pt26'>values</span><span>);</span></td></tr>
<tr><td class='ln' data-ln='59'></td><td><span> </span><span class='pt28 it'>this</span><span class='pt17'>.</span><span class='pt26'>len</span><span> = </span><span class='pt26'>len</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='60'></td><td><span> </span><span class='pt28 it'>this</span><span class='pt17'>.</span><span class='pt26'>cap</span><span> = </span><span class='pt26'>len</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='61'></td><td><span> },</span></td></tr>
<tr><td class='ln' data-ln='62'></td><td><span> });</span></td></tr>
<tr><td class='ln' data-ln='63'></td><td> </td></tr>
<tr><td class='ln' data-ln='64'></td><td><span> </span><span class='pt20'>return</span><span> </span><span class='pt26'>Vector</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='65'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='66'></td><td> </td></tr>
<tr><td class='ln' data-ln='67'></td><td> </td></tr>
<tr><td class='ln' data-ln='68'></td><td><span class='pt20'>function</span><span> </span><span class='pt9'>RustOption</span><span>(</span><span class='pt26 it'>typedef</span><span>, </span><span class='pt26 it'>isNonNullable</span><span> </span><span class='pt5'>=</span><span> </span><span class='pt24'>false</span><span>, </span><span class='pt26 it'>tagSize</span><span>) {</span></td></tr>
<tr><td class='ln' data-ln='69'></td><td><span> </span><span class='pt20'>const</span><span> </span><span class='pt26'>type</span><span> = </span><span class='pt9'>parseType</span><span>(</span><span class='pt26'>typedef</span><span>);</span></td></tr>
<tr><td class='ln' data-ln='70'></td><td><span> </span><span class='pt20'>let</span><span> </span><span class='pt26'>discriminant</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='71'></td><td> </td></tr>
<tr><td class='ln' data-ln='72'></td><td><span> </span><span class='pt20'>if</span><span> (</span><span class='pt26'>tagSize</span><span>) </span><span class='pt26'>discriminant</span><span> = </span><span class='pt26'>types</span><span>[</span><span class='pt20'>`</span><span class='pt13'>uint</span><span class='pt20'>${</span><span class='pt26'>tagSize</span><span> </span><span class='pt5'>*</span><span> </span><span class='pt24'>8</span><span class='pt20'>}`</span><span>];</span></td></tr>
<tr><td class='ln' data-ln='73'></td><td><span> </span><span class='pt20'>else</span><span> </span><span class='pt20'>if</span><span> (</span><span class='pt26'>type</span><span class='pt17'>.</span><span class='pt26'>alignment</span><span> </span><span class='pt5'>===</span><span> </span><span class='pt24'>1</span><span>) </span><span class='pt26'>discriminant</span><span> = </span><span class='pt13'>'uint8'</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='74'></td><td><span> </span><span class='pt20'>else</span><span> </span><span class='pt20'>if</span><span> (</span><span class='pt26'>type</span><span class='pt17'>.</span><span class='pt26'>alignment</span><span> </span><span class='pt5'>===</span><span> </span><span class='pt24'>2</span><span>) </span><span class='pt26'>discriminant</span><span> = </span><span class='pt13'>'uint16'</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='75'></td><td><span> </span><span class='pt20'>else</span><span> </span><span class='pt26'>discriminant</span><span> = </span><span class='pt13'>'uint32'</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='76'></td><td> </td></tr>
<tr><td class='ln' data-ln='77'></td><td><span> </span><span class='pt20'>const</span><span> </span><span class='pt26'>fields</span><span> = (</span><span class='pt26'>isNonNullable</span><span>)</span></td></tr>
<tr><td class='ln' data-ln='78'></td><td><span> </span><span class='pt20'>?</span><span> { </span><span class='pt13'>value</span><span class='pt17'>:</span><span> </span><span class='pt26'>type</span><span> }</span></td></tr>
<tr><td class='ln' data-ln='79'></td><td><span> </span><span class='pt20'>:</span><span> { </span><span class='pt26'>discriminant</span><span>, </span><span class='pt13'>value</span><span class='pt17'>:</span><span> </span><span class='pt26'>type</span><span> };</span></td></tr>
<tr><td class='ln' data-ln='80'></td><td> </td></tr>
<tr><td class='ln' data-ln='81'></td><td><span> </span><span class='pt20'>const</span><span> </span><span class='pt26'>Option</span><span> = </span><span class='pt20'>new</span><span> </span><span class='pt28'>Struct</span><span>(</span><span class='pt26'>fields</span><span>);</span></td></tr>
<tr><td class='ln' data-ln='82'></td><td> </td></tr>
<tr><td class='ln' data-ln='83'></td><td><span> </span><span class='pt28'>Object</span><span class='pt17'>.</span><span class='pt9'>assign</span><span>(</span><span class='pt28'>Option</span><span class='pt17'>.</span><span class='pt26'>prototype</span><span>, {</span></td></tr>
<tr><td class='ln' data-ln='84'></td><td><span> </span><span class='pt9'>isSome</span><span>() {</span></td></tr>
<tr><td class='ln' data-ln='85'></td><td><span> </span><span class='pt20'>return</span><span> (</span><span class='pt13'>'discriminant'</span><span> </span><span class='pt5'>in</span><span> </span><span class='pt26'>fields</span><span>) </span><span class='pt20'>?</span><span> !!</span><span class='pt28 it'>this</span><span class='pt17'>.</span><span class='pt26'>discriminant</span><span> </span><span class='pt20'>:</span><span> !!</span><span class='pt28 it'>this</span><span class='pt17'>.</span><span class='pt26'>value</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='86'></td><td><span> },</span></td></tr>
<tr><td class='ln' data-ln='87'></td><td> </td></tr>
<tr><td class='ln' data-ln='88'></td><td><span> </span><span class='pt9'>isNone</span><span>() {</span></td></tr>
<tr><td class='ln' data-ln='89'></td><td><span> </span><span class='pt20'>return</span><span> !</span><span class='pt28 it'>this</span><span class='pt17'>.</span><span class='pt9'>isSome</span><span>();</span></td></tr>
<tr><td class='ln' data-ln='90'></td><td><span> },</span></td></tr>
<tr><td class='ln' data-ln='91'></td><td> </td></tr>
<tr><td class='ln' data-ln='92'></td><td><span> </span><span class='pt9'>expect</span><span>(</span><span class='pt26 it'>msg</span><span>) {</span></td></tr>
<tr><td class='ln' data-ln='93'></td><td><span> </span><span class='pt20'>if</span><span> (</span><span class='pt5'>!</span><span class='pt28 it'>this</span><span class='pt17'>.</span><span class='pt9'>isSome</span><span>()) </span><span class='pt20'>throw</span><span> </span><span class='pt20'>new</span><span> </span><span class='pt28'>Error</span><span>(</span><span class='pt26'>msg</span><span>);</span></td></tr>
<tr><td class='ln' data-ln='94'></td><td><span> </span><span class='pt20'>return</span><span> </span><span class='pt28 it'>this</span><span class='pt17'>.</span><span class='pt26'>value</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='95'></td><td><span> },</span></td></tr>
<tr><td class='ln' data-ln='96'></td><td> </td></tr>
<tr><td class='ln' data-ln='97'></td><td><span> </span><span class='pt9'>unwrap</span><span>() {</span></td></tr>
<tr><td class='ln' data-ln='98'></td><td><span> </span><span class='pt20'>if</span><span> (</span><span class='pt5'>!</span><span class='pt28 it'>this</span><span class='pt17'>.</span><span class='pt9'>isSome</span><span>()) </span><span class='pt20'>throw</span><span> </span><span class='pt20'>new</span><span> </span><span class='pt28'>Error</span><span>(</span><span class='pt13'>'Error unwrapping none'</span><span>);</span></td></tr>
<tr><td class='ln' data-ln='99'></td><td><span> </span><span class='pt20'>return</span><span> </span><span class='pt28 it'>this</span><span class='pt17'>.</span><span class='pt26'>value</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='100'></td><td><span> },</span></td></tr>
<tr><td class='ln' data-ln='101'></td><td> </td></tr>
<tr><td class='ln' data-ln='102'></td><td><span> </span><span class='pt9'>unwrapOr</span><span>(</span><span class='pt26 it'>defaultValue</span><span>) {</span></td></tr>
<tr><td class='ln' data-ln='103'></td><td><span> </span><span class='pt20'>return</span><span> (</span><span class='pt28 it'>this</span><span class='pt17'>.</span><span class='pt9'>isSome</span><span>()) </span><span class='pt20'>?</span><span> </span><span class='pt28 it'>this</span><span class='pt17'>.</span><span class='pt26'>value</span><span> </span><span class='pt20'>:</span><span> </span><span class='pt26'>defaultValue</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='104'></td><td><span> },</span></td></tr>
<tr><td class='ln' data-ln='105'></td><td> </td></tr>
<tr><td class='ln' data-ln='106'></td><td><span> </span><span class='pt9'>unwrapOrElse</span><span>(</span><span class='pt26 it'>fn</span><span>) {</span></td></tr>
<tr><td class='ln' data-ln='107'></td><td><span> </span><span class='pt20'>return</span><span> (</span><span class='pt28 it'>this</span><span class='pt17'>.</span><span class='pt9'>isSome</span><span>()) </span><span class='pt20'>?</span><span> </span><span class='pt28 it'>this</span><span class='pt17'>.</span><span class='pt26'>value</span><span> </span><span class='pt20'>:</span><span> </span><span class='pt9'>fn</span><span>();</span></td></tr>
<tr><td class='ln' data-ln='108'></td><td><span> },</span></td></tr>
<tr><td class='ln' data-ln='109'></td><td><span> });</span></td></tr>
<tr><td class='ln' data-ln='110'></td><td> </td></tr>
<tr><td class='ln' data-ln='111'></td><td><span> </span><span class='pt20'>return</span><span> </span><span class='pt26'>Option</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='112'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='113'></td><td> </td></tr>
<tr><td class='ln' data-ln='114'></td><td> </td></tr>
<tr><td class='ln' data-ln='115'></td><td><span class='pt20'>const</span><span> </span><span class='pt26'>rust</span><span> = {</span></td></tr>
<tr><td class='ln' data-ln='116'></td><td><span> </span><span class='pt13'>tuple</span><span class='pt17'>:</span><span> </span><span class='pt26'>RustTuple</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='117'></td><td><span> </span><span class='pt9'>Tuple</span><span class='pt17'>:</span><span> (</span><span class='pt26 it'>type</span><span>, </span><span class='pt26 it'>values</span><span>) </span><span class='pt20'>=></span><span> </span><span class='pt9'>new</span><span> (</span><span class='pt9'>RustTuple</span><span>(</span><span class='pt5'>...</span><span class='pt26'>type</span><span>))([</span><span class='pt5'>...</span><span class='pt26'>values</span><span>]),</span></td></tr>
<tr><td class='ln' data-ln='118'></td><td> </td></tr>
<tr><td class='ln' data-ln='119'></td><td><span> </span><span class='pt13'>vector</span><span class='pt17'>:</span><span> </span><span class='pt26'>RustVector</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='120'></td><td><span> </span><span class='pt9'>Vector</span><span class='pt17'>:</span><span> (</span><span class='pt26 it'>type</span><span>, </span><span class='pt26 it'>values</span><span>) </span><span class='pt20'>=></span><span> </span><span class='pt9'>new</span><span> (</span><span class='pt9'>RustVector</span><span>(</span><span class='pt26'>type</span><span>))({ </span><span class='pt26'>values</span><span> }),</span></td></tr>
<tr><td class='ln' data-ln='121'></td><td> </td></tr>
<tr><td class='ln' data-ln='122'></td><td><span> </span><span class='pt13'>option</span><span class='pt17'>:</span><span> </span><span class='pt26'>RustOption</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='123'></td><td><span> </span><span class='pt9'>Option</span><span class='pt17'>:</span><span> (</span><span class='pt26 it'>type</span><span>, </span><span class='pt26 it'>value</span><span>, </span><span class='pt5'>...</span><span class='pt26 it'>opts</span><span>) </span><span class='pt20'>=></span><span> </span><span class='pt9'>new</span><span> (</span><span class='pt9'>RustOption</span><span>(</span><span class='pt26'>type</span><span>, </span><span class='pt5'>...</span><span class='pt26'>opts</span><span>))({</span></td></tr>
<tr><td class='ln' data-ln='124'></td><td><span> </span><span class='pt26'>value</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='125'></td><td><span> </span><span class='pt13'>discriminant</span><span class='pt17'>:</span><span> (</span><span class='pt5'>typeof</span><span> </span><span class='pt26'>value</span><span> </span><span class='pt5'>===</span><span> </span><span class='pt13'>'undefined'</span><span>) </span><span class='pt20'>?</span><span> </span><span class='pt24'>0</span><span> </span><span class='pt20'>:</span><span> </span><span class='pt24'>1</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='126'></td><td><span> }),</span></td></tr>
<tr><td class='ln' data-ln='127'></td><td> </td></tr>
<tr><td class='ln' data-ln='128'></td><td><span> </span><span class='pt9'>Some</span><span class='pt17'>:</span><span> (</span><span class='pt5'>...</span><span class='pt26 it'>args</span><span>) </span><span class='pt20'>=></span><span> </span><span class='pt26'>rust</span><span class='pt17'>.</span><span class='pt9'>Option</span><span>(</span><span class='pt5'>...</span><span class='pt26'>args</span><span>),</span></td></tr>
<tr><td class='ln' data-ln='129'></td><td><span> </span><span class='pt9'>None</span><span class='pt17'>:</span><span> (</span><span class='pt26 it'>type</span><span>, </span><span class='pt5'>...</span><span class='pt26 it'>opts</span><span>) </span><span class='pt20'>=></span><span> </span><span class='pt26'>rust</span><span class='pt17'>.</span><span class='pt9'>Option</span><span>(</span><span class='pt26'>type</span><span>, </span><span class='pt24'>undefined</span><span>, </span><span class='pt5'>...</span><span class='pt26'>opts</span><span>),</span></td></tr>
<tr><td class='ln' data-ln='130'></td><td><span>};</span></td></tr>
<tr><td class='ln' data-ln='131'></td><td> </td></tr>
<tr><td class='ln' data-ln='132'></td><td><span class='pt5'>export</span><span> </span><span class='pt20'>default</span><span> </span><span class='pt26'>rust</span><span>;</span></td></tr>
</table>
</div>
</div>
</div>
<div class='style' id='P--one_light--js'>
<div class='P--one_light-bordered'>
<div class="info header">
<span class="left">rust_types.js</span>
<span class="right"><span>132 lines</span><span>2.75 KB</span></span>
</div>
<div class='P--one_light'>
<table>
<tr><td class='ln' data-ln='1'></td><td><span class='pt4'>import</span><span> Struct </span><span class='pt4'>from</span><span> </span><span class='pt8'>'./Struct'</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='2'></td><td><span class='pt4'>import</span><span> { types, parseType, Pointer } </span><span class='pt4'>from</span><span> </span><span class='pt8'>'./types'</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='3'></td><td><span class='pt4'>import</span><span> { assert, vslice } </span><span class='pt4'>from</span><span> </span><span class='pt8'>'./misc'</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='4'></td><td> </td></tr>
<tr><td class='ln' data-ln='5'></td><td> </td></tr>
<tr><td class='ln' data-ln='6'></td><td><span class='pt14'>const</span><span> </span><span class='pt12'>DATA</span><span> = (</span><span class='pt4'>typeof</span><span> </span><span class='pt15'>Symbol</span><span> </span><span class='pt4'>!==</span><span> </span><span class='pt8'>'undefined'</span><span>)</span></td></tr>
<tr><td class='ln' data-ln='7'></td><td><span> </span><span class='pt4'>?</span><span> </span><span class='pt15'>Symbol</span><span>.</span><span class='pt7'>for</span><span>(</span><span class='pt8'>'struct-data'</span><span>)</span></td></tr>
<tr><td class='ln' data-ln='8'></td><td><span> </span><span class='pt4'>:</span><span> </span><span class='pt8'>'__data'</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='9'></td><td> </td></tr>
<tr><td class='ln' data-ln='10'></td><td> </td></tr>
<tr><td class='ln' data-ln='11'></td><td class='hi'><span class='pt14'>function</span><span> </span><span class='pt7'>extend</span><span>(</span><span class='pt17 it'>StructType</span><span>) {</span></td></tr>
<tr><td class='ln' data-ln='12'></td><td class='hi'><span> </span><span class='pt14'>class</span><span> </span><span class='pt15'>RustType</span><span> </span><span class='pt14'>extends</span><span> StructType {</span></td></tr>
<tr><td class='ln' data-ln='13'></td><td class='hi'><span> </span><span class='pt7'>free</span><span>() {</span></td></tr>
<tr><td class='ln' data-ln='14'></td><td class='hi'><span> </span><span class='pt17'>super</span><span>.</span><span class='pt7'>free</span><span>(</span><span class='pt12'>true</span><span>);</span></td></tr>
<tr><td class='ln' data-ln='15'></td><td class='hi'><span> }</span></td></tr>
<tr><td class='ln' data-ln='16'></td><td class='hi'><span> }</span></td></tr>
<tr><td class='ln' data-ln='17'></td><td class='hi'> </td></tr>
<tr><td class='ln' data-ln='18'></td><td class='hi'><span> </span><span class='pt15'>Object</span><span>.</span><span class='pt7'>assign</span><span>(RustType, StructType);</span></td></tr>
<tr><td class='ln' data-ln='19'></td><td class='hi'><span> </span><span class='pt14'>return</span><span> RustType;</span></td></tr>
<tr><td class='ln' data-ln='20'></td><td class='hi'><span>}</span></td></tr>
<tr><td class='ln' data-ln='21'></td><td> </td></tr>
<tr><td class='ln' data-ln='22'></td><td> </td></tr>
<tr><td class='ln' data-ln='23'></td><td><span class='pt14'>function</span><span> </span><span class='pt7'>RustTuple</span><span>(</span><span class='pt4'>...</span><span class='pt17 it'>tupleTypes</span><span>) {</span></td></tr>
<tr><td class='ln' data-ln='24'></td><td><span> </span><span class='pt14'>const</span><span> fields = {};</span></td></tr>
<tr><td class='ln' data-ln='25'></td><td> </td></tr>
<tr><td class='ln' data-ln='26'></td><td><span> </span><span class='pt17'>tupleTypes</span><span>.</span><span class='pt7'>forEach</span><span>((</span><span class='pt17 it'>type</span><span>, </span><span class='pt17 it'>i</span><span>) </span><span class='pt14'>=></span><span> {</span></td></tr>
<tr><td class='ln' data-ln='27'></td><td><span> </span><span class='pt17'>fields</span><span>[i] = </span><span class='pt7'>parseType</span><span>(type);</span></td></tr>
<tr><td class='ln' data-ln='28'></td><td><span> });</span></td></tr>
<tr><td class='ln' data-ln='29'></td><td> </td></tr>
<tr><td class='ln' data-ln='30'></td><td><span> </span><span class='pt14'>return</span><span> </span><span class='pt14'>new</span><span> </span><span class='pt15'>Struct</span><span>(fields);</span></td></tr>
<tr><td class='ln' data-ln='31'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='32'></td><td> </td></tr>
<tr><td class='ln' data-ln='33'></td><td> </td></tr>
<tr><td class='ln' data-ln='34'></td><td><span class='pt14'>function</span><span> </span><span class='pt7'>RustVector</span><span>(</span><span class='pt17 it'>typedef</span><span>) {</span></td></tr>
<tr><td class='ln' data-ln='35'></td><td><span> </span><span class='pt14'>const</span><span> type = </span><span class='pt7'>parseType</span><span>(typedef);</span></td></tr>
<tr><td class='ln' data-ln='36'></td><td> </td></tr>
<tr><td class='ln' data-ln='37'></td><td><span> </span><span class='pt14'>const</span><span> Vector = </span><span class='pt7'>extend</span><span>(</span><span class='pt14'>new</span><span> </span><span class='pt15'>Struct</span><span>({</span></td></tr>
<tr><td class='ln' data-ln='38'></td><td><span> ptr</span><span class='pt4'>:</span><span> </span><span class='pt17'>types</span><span>.</span><span class='pt7'>pointer</span><span>(type),</span></td></tr>
<tr><td class='ln' data-ln='39'></td><td><span> cap</span><span class='pt4'>:</span><span> </span><span class='pt8'>'usize'</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='40'></td><td><span> len</span><span class='pt4'>:</span><span> </span><span class='pt8'>'usize'</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='41'></td><td><span> </span><span class='pt13 it'>/* values */</span></td></tr>
<tr><td class='ln' data-ln='42'></td><td><span> }));</span></td></tr>
<tr><td class='ln' data-ln='43'></td><td> </td></tr>
<tr><td class='ln' data-ln='44'></td><td><span> </span><span class='pt15'>Object</span><span>.</span><span class='pt7'>defineProperty</span><span>(</span><span class='pt15'>Vector</span><span>.</span><span class='pt17'>prototype</span><span>, </span><span class='pt8'>'values'</span><span>, {</span></td></tr>
<tr><td class='ln' data-ln='45'></td><td><span> enumerable</span><span class='pt4'>:</span><span> </span><span class='pt12'>true</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='46'></td><td> </td></tr>
<tr><td class='ln' data-ln='47'></td><td><span> </span><span class='pt7'>get</span><span>() {</span></td></tr>
<tr><td class='ln' data-ln='48'></td><td><span> </span><span class='pt14'>const</span><span> arrayType = </span><span class='pt7'>parseType</span><span>([type, </span><span class='pt17'>this</span><span>.</span><span class='pt17'>len</span><span>]);</span></td></tr>
<tr><td class='ln' data-ln='49'></td><td><span> </span><span class='pt14'>const</span><span> memory = </span><span class='pt17'>this</span><span>[</span><span class='pt12'>DATA</span><span>].</span><span class='pt17'>view</span><span>.</span><span class='pt17'>buffer</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='50'></td><td><span> </span><span class='pt14'>const</span><span> view = </span><span class='pt14'>new</span><span> </span><span class='pt15'>DataView</span><span>(memory, </span><span class='pt17'>this</span><span>.</span><span class='pt17'>ptr</span><span>.</span><span class='pt7'>ref</span><span>(), </span><span class='pt17'>arrayType</span><span>.</span><span class='pt17'>width</span><span>);</span></td></tr>
<tr><td class='ln' data-ln='51'></td><td> </td></tr>
<tr><td class='ln' data-ln='52'></td><td><span> </span><span class='pt14'>return</span><span> </span><span class='pt17'>arrayType</span><span>.</span><span class='pt7'>read</span><span>(view, </span><span class='pt17'>this</span><span>[</span><span class='pt12'>DATA</span><span>].</span><span class='pt17'>free</span><span>);</span></td></tr>
<tr><td class='ln' data-ln='53'></td><td><span> },</span></td></tr>
<tr><td class='ln' data-ln='54'></td><td> </td></tr>
<tr><td class='ln' data-ln='55'></td><td><span> </span><span class='pt7'>set</span><span>(</span><span class='pt17 it'>values</span><span>) {</span></td></tr>
<tr><td class='ln' data-ln='56'></td><td><span> </span><span class='pt14'>const</span><span> len = </span><span class='pt17'>values</span><span>.</span><span class='pt17'>length</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='57'></td><td> </td></tr>
<tr><td class='ln' data-ln='58'></td><td><span> </span><span class='pt17'>this</span><span>.</span><span class='pt17'>ptr</span><span> = </span><span class='pt14'>new</span><span> </span><span class='pt15'>Pointer</span><span>([type, len], values);</span></td></tr>
<tr><td class='ln' data-ln='59'></td><td><span> </span><span class='pt17'>this</span><span>.</span><span class='pt17'>len</span><span> = len;</span></td></tr>
<tr><td class='ln' data-ln='60'></td><td><span> </span><span class='pt17'>this</span><span>.</span><span class='pt17'>cap</span><span> = len;</span></td></tr>
<tr><td class='ln' data-ln='61'></td><td><span> },</span></td></tr>
<tr><td class='ln' data-ln='62'></td><td><span> });</span></td></tr>
<tr><td class='ln' data-ln='63'></td><td> </td></tr>
<tr><td class='ln' data-ln='64'></td><td><span> </span><span class='pt14'>return</span><span> Vector;</span></td></tr>
<tr><td class='ln' data-ln='65'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='66'></td><td> </td></tr>
<tr><td class='ln' data-ln='67'></td><td> </td></tr>
<tr><td class='ln' data-ln='68'></td><td><span class='pt14'>function</span><span> </span><span class='pt7'>RustOption</span><span>(</span><span class='pt17 it'>typedef</span><span>, </span><span class='pt17 it'>isNonNullable</span><span> </span><span class='pt4'>=</span><span> </span><span class='pt12'>false</span><span>, </span><span class='pt17 it'>tagSize</span><span>) {</span></td></tr>
<tr><td class='ln' data-ln='69'></td><td><span> </span><span class='pt14'>const</span><span> type = </span><span class='pt7'>parseType</span><span>(typedef);</span></td></tr>
<tr><td class='ln' data-ln='70'></td><td><span> </span><span class='pt14'>let</span><span> discriminant;</span></td></tr>
<tr><td class='ln' data-ln='71'></td><td> </td></tr>
<tr><td class='ln' data-ln='72'></td><td><span> </span><span class='pt14'>if</span><span> (tagSize) discriminant = </span><span class='pt17'>types</span><span>[</span><span class='pt14'>`</span><span class='pt8'>uint</span><span class='pt14'>${</span><span>tagSize </span><span class='pt4'>*</span><span> </span><span class='pt12'>8</span><span class='pt14'>}`</span><span>];</span></td></tr>
<tr><td class='ln' data-ln='73'></td><td><span> </span><span class='pt14'>else</span><span> </span><span class='pt14'>if</span><span> (</span><span class='pt17'>type</span><span>.</span><span class='pt17'>alignment</span><span> </span><span class='pt4'>===</span><span> </span><span class='pt12'>1</span><span>) discriminant = </span><span class='pt8'>'uint8'</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='74'></td><td><span> </span><span class='pt14'>else</span><span> </span><span class='pt14'>if</span><span> (</span><span class='pt17'>type</span><span>.</span><span class='pt17'>alignment</span><span> </span><span class='pt4'>===</span><span> </span><span class='pt12'>2</span><span>) discriminant = </span><span class='pt8'>'uint16'</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='75'></td><td><span> </span><span class='pt14'>else</span><span> discriminant = </span><span class='pt8'>'uint32'</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='76'></td><td> </td></tr>
<tr><td class='ln' data-ln='77'></td><td><span> </span><span class='pt14'>const</span><span> fields = (isNonNullable)</span></td></tr>
<tr><td class='ln' data-ln='78'></td><td><span> </span><span class='pt4'>?</span><span> { value</span><span class='pt4'>:</span><span> type }</span></td></tr>
<tr><td class='ln' data-ln='79'></td><td><span> </span><span class='pt4'>:</span><span> { discriminant, value</span><span class='pt4'>:</span><span> type };</span></td></tr>
<tr><td class='ln' data-ln='80'></td><td> </td></tr>
<tr><td class='ln' data-ln='81'></td><td><span> </span><span class='pt14'>const</span><span> Option = </span><span class='pt14'>new</span><span> </span><span class='pt15'>Struct</span><span>(fields);</span></td></tr>
<tr><td class='ln' data-ln='82'></td><td> </td></tr>
<tr><td class='ln' data-ln='83'></td><td><span> </span><span class='pt15'>Object</span><span>.</span><span class='pt7'>assign</span><span>(</span><span class='pt15'>Option</span><span>.</span><span class='pt17'>prototype</span><span>, {</span></td></tr>
<tr><td class='ln' data-ln='84'></td><td><span> </span><span class='pt7'>isSome</span><span>() {</span></td></tr>
<tr><td class='ln' data-ln='85'></td><td><span> </span><span class='pt14'>return</span><span> (</span><span class='pt8'>'discriminant'</span><span> </span><span class='pt4'>in</span><span> fields) </span><span class='pt4'>?</span><span> !!</span><span class='pt17'>this</span><span>.</span><span class='pt17'>discriminant</span><span> </span><span class='pt4'>:</span><span> !!</span><span class='pt17'>this</span><span>.</span><span class='pt17'>value</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='86'></td><td><span> },</span></td></tr>
<tr><td class='ln' data-ln='87'></td><td> </td></tr>
<tr><td class='ln' data-ln='88'></td><td><span> </span><span class='pt7'>isNone</span><span>() {</span></td></tr>
<tr><td class='ln' data-ln='89'></td><td><span> </span><span class='pt14'>return</span><span> !</span><span class='pt17'>this</span><span>.</span><span class='pt7'>isSome</span><span>();</span></td></tr>
<tr><td class='ln' data-ln='90'></td><td><span> },</span></td></tr>
<tr><td class='ln' data-ln='91'></td><td> </td></tr>
<tr><td class='ln' data-ln='92'></td><td><span> </span><span class='pt7'>expect</span><span>(</span><span class='pt17 it'>msg</span><span>) {</span></td></tr>
<tr><td class='ln' data-ln='93'></td><td><span> </span><span class='pt14'>if</span><span> (</span><span class='pt4'>!</span><span class='pt17'>this</span><span>.</span><span class='pt7'>isSome</span><span>()) </span><span class='pt14'>throw</span><span> </span><span class='pt14'>new</span><span> </span><span class='pt15'>Error</span><span>(msg);</span></td></tr>
<tr><td class='ln' data-ln='94'></td><td><span> </span><span class='pt14'>return</span><span> </span><span class='pt17'>this</span><span>.</span><span class='pt17'>value</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='95'></td><td><span> },</span></td></tr>
<tr><td class='ln' data-ln='96'></td><td> </td></tr>
<tr><td class='ln' data-ln='97'></td><td><span> </span><span class='pt7'>unwrap</span><span>() {</span></td></tr>
<tr><td class='ln' data-ln='98'></td><td><span> </span><span class='pt14'>if</span><span> (</span><span class='pt4'>!</span><span class='pt17'>this</span><span>.</span><span class='pt7'>isSome</span><span>()) </span><span class='pt14'>throw</span><span> </span><span class='pt14'>new</span><span> </span><span class='pt15'>Error</span><span>(</span><span class='pt8'>'Error unwrapping none'</span><span>);</span></td></tr>
<tr><td class='ln' data-ln='99'></td><td><span> </span><span class='pt14'>return</span><span> </span><span class='pt17'>this</span><span>.</span><span class='pt17'>value</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='100'></td><td><span> },</span></td></tr>
<tr><td class='ln' data-ln='101'></td><td> </td></tr>
<tr><td class='ln' data-ln='102'></td><td><span> </span><span class='pt7'>unwrapOr</span><span>(</span><span class='pt17 it'>defaultValue</span><span>) {</span></td></tr>
<tr><td class='ln' data-ln='103'></td><td><span> </span><span class='pt14'>return</span><span> (</span><span class='pt17'>this</span><span>.</span><span class='pt7'>isSome</span><span>()) </span><span class='pt4'>?</span><span> </span><span class='pt17'>this</span><span>.</span><span class='pt17'>value</span><span> </span><span class='pt4'>:</span><span> defaultValue;</span></td></tr>
<tr><td class='ln' data-ln='104'></td><td><span> },</span></td></tr>
<tr><td class='ln' data-ln='105'></td><td> </td></tr>
<tr><td class='ln' data-ln='106'></td><td><span> </span><span class='pt7'>unwrapOrElse</span><span>(</span><span class='pt17 it'>fn</span><span>) {</span></td></tr>
<tr><td class='ln' data-ln='107'></td><td><span> </span><span class='pt14'>return</span><span> (</span><span class='pt17'>this</span><span>.</span><span class='pt7'>isSome</span><span>()) </span><span class='pt4'>?</span><span> </span><span class='pt17'>this</span><span>.</span><span class='pt17'>value</span><span> </span><span class='pt4'>:</span><span> </span><span class='pt7'>fn</span><span>();</span></td></tr>
<tr><td class='ln' data-ln='108'></td><td><span> },</span></td></tr>
<tr><td class='ln' data-ln='109'></td><td><span> });</span></td></tr>
<tr><td class='ln' data-ln='110'></td><td> </td></tr>
<tr><td class='ln' data-ln='111'></td><td><span> </span><span class='pt14'>return</span><span> Option;</span></td></tr>
<tr><td class='ln' data-ln='112'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='113'></td><td> </td></tr>
<tr><td class='ln' data-ln='114'></td><td> </td></tr>
<tr><td class='ln' data-ln='115'></td><td><span class='pt14'>const</span><span> rust = {</span></td></tr>
<tr><td class='ln' data-ln='116'></td><td><span> tuple</span><span class='pt4'>:</span><span> RustTuple,</span></td></tr>
<tr><td class='ln' data-ln='117'></td><td><span> </span><span class='pt7'>Tuple</span><span class='pt4'>:</span><span> (</span><span class='pt17 it'>type</span><span>, </span><span class='pt17 it'>values</span><span>) </span><span class='pt14'>=></span><span> </span><span class='pt7'>new</span><span> (</span><span class='pt7'>RustTuple</span><span>(</span><span class='pt4'>...</span><span class='pt17'>type</span><span>))([</span><span class='pt4'>...</span><span class='pt17'>values</span><span>]),</span></td></tr>
<tr><td class='ln' data-ln='118'></td><td> </td></tr>
<tr><td class='ln' data-ln='119'></td><td><span> vector</span><span class='pt4'>:</span><span> RustVector,</span></td></tr>
<tr><td class='ln' data-ln='120'></td><td><span> </span><span class='pt7'>Vector</span><span class='pt4'>:</span><span> (</span><span class='pt17 it'>type</span><span>, </span><span class='pt17 it'>values</span><span>) </span><span class='pt14'>=></span><span> </span><span class='pt7'>new</span><span> (</span><span class='pt7'>RustVector</span><span>(type))({ values }),</span></td></tr>
<tr><td class='ln' data-ln='121'></td><td> </td></tr>
<tr><td class='ln' data-ln='122'></td><td><span> option</span><span class='pt4'>:</span><span> RustOption,</span></td></tr>
<tr><td class='ln' data-ln='123'></td><td><span> </span><span class='pt7'>Option</span><span class='pt4'>:</span><span> (</span><span class='pt17 it'>type</span><span>, </span><span class='pt17 it'>value</span><span>, </span><span class='pt4'>...</span><span class='pt17 it'>opts</span><span>) </span><span class='pt14'>=></span><span> </span><span class='pt7'>new</span><span> (</span><span class='pt7'>RustOption</span><span>(type, </span><span class='pt4'>...</span><span class='pt17'>opts</span><span>))({</span></td></tr>
<tr><td class='ln' data-ln='124'></td><td><span> value,</span></td></tr>
<tr><td class='ln' data-ln='125'></td><td><span> discriminant</span><span class='pt4'>:</span><span> (</span><span class='pt4'>typeof</span><span> value </span><span class='pt4'>===</span><span> </span><span class='pt8'>'undefined'</span><span>) </span><span class='pt4'>?</span><span> </span><span class='pt12'>0</span><span> </span><span class='pt4'>:</span><span> </span><span class='pt12'>1</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='126'></td><td><span> }),</span></td></tr>
<tr><td class='ln' data-ln='127'></td><td> </td></tr>
<tr><td class='ln' data-ln='128'></td><td><span> </span><span class='pt7'>Some</span><span class='pt4'>:</span><span> (</span><span class='pt4'>...</span><span class='pt17 it'>args</span><span>) </span><span class='pt14'>=></span><span> </span><span class='pt17'>rust</span><span>.</span><span class='pt7'>Option</span><span>(</span><span class='pt4'>...</span><span class='pt17'>args</span><span>),</span></td></tr>
<tr><td class='ln' data-ln='129'></td><td><span> </span><span class='pt7'>None</span><span class='pt4'>:</span><span> (</span><span class='pt17 it'>type</span><span>, </span><span class='pt4'>...</span><span class='pt17 it'>opts</span><span>) </span><span class='pt14'>=></span><span> </span><span class='pt17'>rust</span><span>.</span><span class='pt7'>Option</span><span>(type, </span><span class='pt12'>undefined</span><span>, </span><span class='pt4'>...</span><span class='pt17'>opts</span><span>),</span></td></tr>
<tr><td class='ln' data-ln='130'></td><td><span>};</span></td></tr>
<tr><td class='ln' data-ln='131'></td><td> </td></tr>
<tr><td class='ln' data-ln='132'></td><td><span class='pt4'>export</span><span> </span><span class='pt14'>default</span><span> rust;</span></td></tr>
</table>
</div>
</div>
</div>
<div class='style' id='P--one_monokai--js'>
<div class='P--one_monokai-bordered'>
<div class="info header">
<span class="left">rust_types.js</span>
<span class="right"><span>132 lines</span><span>2.75 KB</span></span>
</div>
<div class='P--one_monokai'>
<table>
<tr><td class='ln' data-ln='1'></td><td><span class='pt10'>import</span><span> Struct </span><span class='pt10'>from</span><span> </span><span class='pt11'>'./Struct'</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='2'></td><td><span class='pt10'>import</span><span> { types, parseType, Pointer } </span><span class='pt10'>from</span><span> </span><span class='pt11'>'./types'</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='3'></td><td><span class='pt10'>import</span><span> { assert, vslice } </span><span class='pt10'>from</span><span> </span><span class='pt11'>'./misc'</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='4'></td><td> </td></tr>
<tr><td class='ln' data-ln='5'></td><td> </td></tr>
<tr><td class='ln' data-ln='6'></td><td><span class='pt3'>const</span><span> DATA = (</span><span class='pt10'>typeof</span><span> </span><span class='pt5'>Symbol</span><span> </span><span class='pt10'>!==</span><span> </span><span class='pt11'>'undefined'</span><span>)</span></td></tr>
<tr><td class='ln' data-ln='7'></td><td><span> </span><span class='pt10'>?</span><span> </span><span class='pt5'>Symbol</span><span>.</span><span class='pt7'>for</span><span>(</span><span class='pt11'>'struct-data'</span><span>)</span></td></tr>
<tr><td class='ln' data-ln='8'></td><td><span> </span><span class='pt10'>:</span><span> </span><span class='pt11'>'__data'</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='9'></td><td> </td></tr>
<tr><td class='ln' data-ln='10'></td><td> </td></tr>
<tr><td class='ln' data-ln='11'></td><td class='hi'><span class='pt3'>function</span><span> </span><span class='pt7'>extend</span><span>(</span><span class='pt9 it'>StructType</span><span>) {</span></td></tr>
<tr><td class='ln' data-ln='12'></td><td class='hi'><span> </span><span class='pt3'>class</span><span> </span><span class='pt5'>RustType</span><span> </span><span class='pt3'>extends</span><span> StructType {</span></td></tr>
<tr><td class='ln' data-ln='13'></td><td class='hi'><span> </span><span class='pt7'>free</span><span>() {</span></td></tr>
<tr><td class='ln' data-ln='14'></td><td class='hi'><span> </span><span class='pt10'>super</span><span>.</span><span class='pt7'>free</span><span>(</span><span class='pt3'>true</span><span>);</span></td></tr>
<tr><td class='ln' data-ln='15'></td><td class='hi'><span> }</span></td></tr>
<tr><td class='ln' data-ln='16'></td><td class='hi'><span> }</span></td></tr>
<tr><td class='ln' data-ln='17'></td><td class='hi'> </td></tr>
<tr><td class='ln' data-ln='18'></td><td class='hi'><span> </span><span class='pt5'>Object</span><span>.</span><span class='pt7'>assign</span><span>(RustType, StructType);</span></td></tr>
<tr><td class='ln' data-ln='19'></td><td class='hi'><span> </span><span class='pt10'>return</span><span> RustType;</span></td></tr>
<tr><td class='ln' data-ln='20'></td><td class='hi'><span>}</span></td></tr>
<tr><td class='ln' data-ln='21'></td><td> </td></tr>
<tr><td class='ln' data-ln='22'></td><td> </td></tr>
<tr><td class='ln' data-ln='23'></td><td><span class='pt3'>function</span><span> </span><span class='pt7'>RustTuple</span><span>(</span><span class='pt10'>...</span><span class='pt9 it'>tupleTypes</span><span>) {</span></td></tr>
<tr><td class='ln' data-ln='24'></td><td><span> </span><span class='pt3'>const</span><span> fields = {};</span></td></tr>
<tr><td class='ln' data-ln='25'></td><td> </td></tr>
<tr><td class='ln' data-ln='26'></td><td><span> </span><span class='pt5'>tupleTypes</span><span>.</span><span class='pt7'>forEach</span><span>((</span><span class='pt9 it'>type</span><span>, </span><span class='pt9 it'>i</span><span>) </span><span class='pt3'>=></span><span> {</span></td></tr>
<tr><td class='ln' data-ln='27'></td><td><span> </span><span class='pt5'>fields</span><span>[i] = </span><span class='pt7'>parseType</span><span>(type);</span></td></tr>
<tr><td class='ln' data-ln='28'></td><td><span> });</span></td></tr>
<tr><td class='ln' data-ln='29'></td><td> </td></tr>
<tr><td class='ln' data-ln='30'></td><td><span> </span><span class='pt10'>return</span><span> </span><span class='pt10'>new</span><span> </span><span class='pt7'>Struct</span><span>(fields);</span></td></tr>
<tr><td class='ln' data-ln='31'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='32'></td><td> </td></tr>
<tr><td class='ln' data-ln='33'></td><td> </td></tr>
<tr><td class='ln' data-ln='34'></td><td><span class='pt3'>function</span><span> </span><span class='pt7'>RustVector</span><span>(</span><span class='pt9 it'>typedef</span><span>) {</span></td></tr>
<tr><td class='ln' data-ln='35'></td><td><span> </span><span class='pt3'>const</span><span> type = </span><span class='pt7'>parseType</span><span>(typedef);</span></td></tr>
<tr><td class='ln' data-ln='36'></td><td> </td></tr>
<tr><td class='ln' data-ln='37'></td><td><span> </span><span class='pt3'>const</span><span> Vector = </span><span class='pt7'>extend</span><span>(</span><span class='pt10'>new</span><span> </span><span class='pt7'>Struct</span><span>({</span></td></tr>
<tr><td class='ln' data-ln='38'></td><td><span> </span><span class='pt11'>ptr</span><span class='pt3'>:</span><span> </span><span class='pt5'>types</span><span>.</span><span class='pt7'>pointer</span><span>(type),</span></td></tr>
<tr><td class='ln' data-ln='39'></td><td><span> </span><span class='pt11'>cap</span><span class='pt3'>:</span><span> </span><span class='pt11'>'usize'</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='40'></td><td><span> </span><span class='pt11'>len</span><span class='pt3'>:</span><span> </span><span class='pt11'>'usize'</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='41'></td><td><span> </span><span class='pt4 it'>/* values */</span></td></tr>
<tr><td class='ln' data-ln='42'></td><td><span> }));</span></td></tr>
<tr><td class='ln' data-ln='43'></td><td> </td></tr>
<tr><td class='ln' data-ln='44'></td><td><span> </span><span class='pt5'>Object</span><span>.</span><span class='pt7'>defineProperty</span><span>(</span><span class='pt5'>Vector</span><span>.</span><span class='pt10'>prototype</span><span>, </span><span class='pt11'>'values'</span><span>, {</span></td></tr>
<tr><td class='ln' data-ln='45'></td><td><span> </span><span class='pt11'>enumerable</span><span class='pt3'>:</span><span> </span><span class='pt3'>true</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='46'></td><td> </td></tr>
<tr><td class='ln' data-ln='47'></td><td><span> </span><span class='pt7'>get</span><span>() {</span></td></tr>
<tr><td class='ln' data-ln='48'></td><td><span> </span><span class='pt3'>const</span><span> arrayType = </span><span class='pt7'>parseType</span><span>([type, </span><span class='pt10'>this</span><span>.</span><span class='pt5'>len</span><span>]);</span></td></tr>
<tr><td class='ln' data-ln='49'></td><td><span> </span><span class='pt3'>const</span><span> memory = </span><span class='pt10'>this</span><span>[DATA].</span><span class='pt5'>view</span><span>.</span><span class='pt5'>buffer</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='50'></td><td><span> </span><span class='pt3'>const</span><span> view = </span><span class='pt10'>new</span><span> </span><span class='pt5'>DataView</span><span>(memory, </span><span class='pt10'>this</span><span>.</span><span class='pt5'>ptr</span><span>.</span><span class='pt7'>ref</span><span>(), </span><span class='pt5'>arrayType</span><span>.</span><span class='pt5'>width</span><span>);</span></td></tr>
<tr><td class='ln' data-ln='51'></td><td> </td></tr>
<tr><td class='ln' data-ln='52'></td><td><span> </span><span class='pt10'>return</span><span> </span><span class='pt5'>arrayType</span><span>.</span><span class='pt7'>read</span><span>(view, </span><span class='pt10'>this</span><span>[DATA].</span><span class='pt5'>free</span><span>);</span></td></tr>
<tr><td class='ln' data-ln='53'></td><td><span> },</span></td></tr>
<tr><td class='ln' data-ln='54'></td><td> </td></tr>
<tr><td class='ln' data-ln='55'></td><td><span> </span><span class='pt7'>set</span><span>(</span><span class='pt9 it'>values</span><span>) {</span></td></tr>
<tr><td class='ln' data-ln='56'></td><td><span> </span><span class='pt3'>const</span><span> len = </span><span class='pt5'>values</span><span>.</span><span class='pt5'>length</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='57'></td><td> </td></tr>
<tr><td class='ln' data-ln='58'></td><td><span> </span><span class='pt10'>this</span><span>.</span><span class='pt5'>ptr</span><span> = </span><span class='pt10'>new</span><span> </span><span class='pt7'>Pointer</span><span>([type, len], values);</span></td></tr>
<tr><td class='ln' data-ln='59'></td><td><span> </span><span class='pt10'>this</span><span>.</span><span class='pt5'>len</span><span> = len;</span></td></tr>
<tr><td class='ln' data-ln='60'></td><td><span> </span><span class='pt10'>this</span><span>.</span><span class='pt5'>cap</span><span> = len;</span></td></tr>
<tr><td class='ln' data-ln='61'></td><td><span> },</span></td></tr>
<tr><td class='ln' data-ln='62'></td><td><span> });</span></td></tr>
<tr><td class='ln' data-ln='63'></td><td> </td></tr>
<tr><td class='ln' data-ln='64'></td><td><span> </span><span class='pt10'>return</span><span> Vector;</span></td></tr>
<tr><td class='ln' data-ln='65'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='66'></td><td> </td></tr>
<tr><td class='ln' data-ln='67'></td><td> </td></tr>
<tr><td class='ln' data-ln='68'></td><td><span class='pt3'>function</span><span> </span><span class='pt7'>RustOption</span><span>(</span><span class='pt9 it'>typedef</span><span>, </span><span class='pt9 it'>isNonNullable</span><span> </span><span class='pt10'>=</span><span> </span><span class='pt3'>false</span><span>, </span><span class='pt9 it'>tagSize</span><span>) {</span></td></tr>
<tr><td class='ln' data-ln='69'></td><td><span> </span><span class='pt3'>const</span><span> type = </span><span class='pt7'>parseType</span><span>(typedef);</span></td></tr>
<tr><td class='ln' data-ln='70'></td><td><span> </span><span class='pt3'>let</span><span> discriminant;</span></td></tr>
<tr><td class='ln' data-ln='71'></td><td> </td></tr>
<tr><td class='ln' data-ln='72'></td><td><span> </span><span class='pt10'>if</span><span> (tagSize) discriminant = </span><span class='pt5'>types</span><span>[</span><span class='pt10'>`</span><span class='pt11'>uint</span><span class='pt8'>${</span><span>tagSize </span><span class='pt10'>*</span><span> </span><span class='pt8'>8}</span><span class='pt10'>`</span><span>];</span></td></tr>
<tr><td class='ln' data-ln='73'></td><td><span> </span><span class='pt10'>else</span><span> </span><span class='pt10'>if</span><span> (</span><span class='pt5'>type</span><span>.</span><span class='pt5'>alignment</span><span> </span><span class='pt10'>===</span><span> </span><span class='pt8'>1</span><span>) discriminant = </span><span class='pt11'>'uint8'</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='74'></td><td><span> </span><span class='pt10'>else</span><span> </span><span class='pt10'>if</span><span> (</span><span class='pt5'>type</span><span>.</span><span class='pt5'>alignment</span><span> </span><span class='pt10'>===</span><span> </span><span class='pt8'>2</span><span>) discriminant = </span><span class='pt11'>'uint16'</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='75'></td><td><span> </span><span class='pt10'>else</span><span> discriminant = </span><span class='pt11'>'uint32'</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='76'></td><td> </td></tr>
<tr><td class='ln' data-ln='77'></td><td><span> </span><span class='pt3'>const</span><span> fields = (isNonNullable)</span></td></tr>
<tr><td class='ln' data-ln='78'></td><td><span> </span><span class='pt10'>?</span><span> { </span><span class='pt11'>value</span><span class='pt3'>:</span><span> type }</span></td></tr>
<tr><td class='ln' data-ln='79'></td><td><span> </span><span class='pt10'>:</span><span> { discriminant, </span><span class='pt11'>value</span><span class='pt3'>:</span><span> type };</span></td></tr>
<tr><td class='ln' data-ln='80'></td><td> </td></tr>
<tr><td class='ln' data-ln='81'></td><td><span> </span><span class='pt3'>const</span><span> Option = </span><span class='pt10'>new</span><span> </span><span class='pt7'>Struct</span><span>(fields);</span></td></tr>
<tr><td class='ln' data-ln='82'></td><td> </td></tr>
<tr><td class='ln' data-ln='83'></td><td><span> </span><span class='pt5'>Object</span><span>.</span><span class='pt7'>assign</span><span>(</span><span class='pt5'>Option</span><span>.</span><span class='pt10'>prototype</span><span>, {</span></td></tr>
<tr><td class='ln' data-ln='84'></td><td><span> </span><span class='pt7'>isSome</span><span>() {</span></td></tr>
<tr><td class='ln' data-ln='85'></td><td><span> </span><span class='pt10'>return</span><span> (</span><span class='pt11'>'discriminant'</span><span> </span><span class='pt10'>in</span><span> fields) </span><span class='pt10'>?</span><span> !!</span><span class='pt10'>this</span><span>.</span><span class='pt5'>discriminant</span><span> </span><span class='pt10'>:</span><span> !!</span><span class='pt10'>this</span><span>.</span><span class='pt5'>value</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='86'></td><td><span> },</span></td></tr>
<tr><td class='ln' data-ln='87'></td><td> </td></tr>
<tr><td class='ln' data-ln='88'></td><td><span> </span><span class='pt7'>isNone</span><span>() {</span></td></tr>
<tr><td class='ln' data-ln='89'></td><td><span> </span><span class='pt10'>return</span><span> !</span><span class='pt10'>this</span><span>.</span><span class='pt7'>isSome</span><span>();</span></td></tr>
<tr><td class='ln' data-ln='90'></td><td><span> },</span></td></tr>
<tr><td class='ln' data-ln='91'></td><td> </td></tr>
<tr><td class='ln' data-ln='92'></td><td><span> </span><span class='pt7'>expect</span><span>(</span><span class='pt9 it'>msg</span><span>) {</span></td></tr>
<tr><td class='ln' data-ln='93'></td><td><span> </span><span class='pt10'>if</span><span> (</span><span class='pt10'>!this</span><span>.</span><span class='pt7'>isSome</span><span>()) </span><span class='pt10'>throw</span><span> </span><span class='pt10'>new</span><span> </span><span class='pt5'>Error</span><span>(msg);</span></td></tr>
<tr><td class='ln' data-ln='94'></td><td><span> </span><span class='pt10'>return</span><span> </span><span class='pt10'>this</span><span>.</span><span class='pt5'>value</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='95'></td><td><span> },</span></td></tr>
<tr><td class='ln' data-ln='96'></td><td> </td></tr>
<tr><td class='ln' data-ln='97'></td><td><span> </span><span class='pt7'>unwrap</span><span>() {</span></td></tr>
<tr><td class='ln' data-ln='98'></td><td><span> </span><span class='pt10'>if</span><span> (</span><span class='pt10'>!this</span><span>.</span><span class='pt7'>isSome</span><span>()) </span><span class='pt10'>throw</span><span> </span><span class='pt10'>new</span><span> </span><span class='pt5'>Error</span><span>(</span><span class='pt11'>'Error unwrapping none'</span><span>);</span></td></tr>
<tr><td class='ln' data-ln='99'></td><td><span> </span><span class='pt10'>return</span><span> </span><span class='pt10'>this</span><span>.</span><span class='pt5'>value</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='100'></td><td><span> },</span></td></tr>
<tr><td class='ln' data-ln='101'></td><td> </td></tr>
<tr><td class='ln' data-ln='102'></td><td><span> </span><span class='pt7'>unwrapOr</span><span>(</span><span class='pt9 it'>defaultValue</span><span>) {</span></td></tr>
<tr><td class='ln' data-ln='103'></td><td><span> </span><span class='pt10'>return</span><span> (</span><span class='pt10'>this</span><span>.</span><span class='pt7'>isSome</span><span>()) </span><span class='pt10'>?</span><span> </span><span class='pt10'>this</span><span>.</span><span class='pt5'>value</span><span> </span><span class='pt10'>:</span><span> defaultValue;</span></td></tr>
<tr><td class='ln' data-ln='104'></td><td><span> },</span></td></tr>
<tr><td class='ln' data-ln='105'></td><td> </td></tr>
<tr><td class='ln' data-ln='106'></td><td><span> </span><span class='pt7'>unwrapOrElse</span><span>(</span><span class='pt9 it'>fn</span><span>) {</span></td></tr>
<tr><td class='ln' data-ln='107'></td><td><span> </span><span class='pt10'>return</span><span> (</span><span class='pt10'>this</span><span>.</span><span class='pt7'>isSome</span><span>()) </span><span class='pt10'>?</span><span> </span><span class='pt10'>this</span><span>.</span><span class='pt5'>value</span><span> </span><span class='pt10'>:</span><span> </span><span class='pt7'>fn</span><span>();</span></td></tr>
<tr><td class='ln' data-ln='108'></td><td><span> },</span></td></tr>
<tr><td class='ln' data-ln='109'></td><td><span> });</span></td></tr>
<tr><td class='ln' data-ln='110'></td><td> </td></tr>
<tr><td class='ln' data-ln='111'></td><td><span> </span><span class='pt10'>return</span><span> Option;</span></td></tr>
<tr><td class='ln' data-ln='112'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='113'></td><td> </td></tr>
<tr><td class='ln' data-ln='114'></td><td> </td></tr>
<tr><td class='ln' data-ln='115'></td><td><span class='pt3'>const</span><span> rust = {</span></td></tr>
<tr><td class='ln' data-ln='116'></td><td><span> </span><span class='pt11'>tuple</span><span class='pt3'>:</span><span> RustTuple,</span></td></tr>
<tr><td class='ln' data-ln='117'></td><td><span> </span><span class='pt7'>Tuple</span><span>: (</span><span class='pt9 it'>type</span><span>, </span><span class='pt9 it'>values</span><span>) </span><span class='pt3'>=></span><span> </span><span class='pt7'>new</span><span> (</span><span class='pt7'>RustTuple</span><span>(</span><span class='pt10'>...</span><span class='pt5'>type</span><span>))([</span><span class='pt10'>...</span><span class='pt5'>values</span><span>]),</span></td></tr>
<tr><td class='ln' data-ln='118'></td><td> </td></tr>
<tr><td class='ln' data-ln='119'></td><td><span> </span><span class='pt11'>vector</span><span class='pt3'>:</span><span> RustVector,</span></td></tr>
<tr><td class='ln' data-ln='120'></td><td><span> </span><span class='pt7'>Vector</span><span>: (</span><span class='pt9 it'>type</span><span>, </span><span class='pt9 it'>values</span><span>) </span><span class='pt3'>=></span><span> </span><span class='pt7'>new</span><span> (</span><span class='pt7'>RustVector</span><span>(type))({ values }),</span></td></tr>
<tr><td class='ln' data-ln='121'></td><td> </td></tr>
<tr><td class='ln' data-ln='122'></td><td><span> </span><span class='pt11'>option</span><span class='pt3'>:</span><span> RustOption,</span></td></tr>
<tr><td class='ln' data-ln='123'></td><td><span> </span><span class='pt7'>Option</span><span>: (</span><span class='pt9 it'>type</span><span>, </span><span class='pt9 it'>value</span><span>, </span><span class='pt10'>...</span><span class='pt9 it'>opts</span><span>) </span><span class='pt3'>=></span><span> </span><span class='pt7'>new</span><span> (</span><span class='pt7'>RustOption</span><span>(type, </span><span class='pt10'>...</span><span class='pt5'>opts</span><span>))({</span></td></tr>
<tr><td class='ln' data-ln='124'></td><td><span> value,</span></td></tr>
<tr><td class='ln' data-ln='125'></td><td><span> </span><span class='pt11'>discriminant</span><span class='pt3'>:</span><span> (</span><span class='pt10'>typeof</span><span> value </span><span class='pt10'>===</span><span> </span><span class='pt11'>'undefined'</span><span>) </span><span class='pt10'>?</span><span> </span><span class='pt8'>0</span><span> </span><span class='pt10'>:</span><span> </span><span class='pt8'>1</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='126'></td><td><span> }),</span></td></tr>
<tr><td class='ln' data-ln='127'></td><td> </td></tr>
<tr><td class='ln' data-ln='128'></td><td><span> </span><span class='pt7'>Some</span><span>: (</span><span class='pt10'>...</span><span class='pt9 it'>args</span><span>) </span><span class='pt3'>=></span><span> </span><span class='pt5'>rust</span><span>.</span><span class='pt7'>Option</span><span>(</span><span class='pt10'>...</span><span class='pt5'>args</span><span>),</span></td></tr>
<tr><td class='ln' data-ln='129'></td><td><span> </span><span class='pt7'>None</span><span>: (</span><span class='pt9 it'>type</span><span>, </span><span class='pt10'>...</span><span class='pt9 it'>opts</span><span>) </span><span class='pt3'>=></span><span> </span><span class='pt5'>rust</span><span>.</span><span class='pt7'>Option</span><span>(type, </span><span class='pt3'>undefined</span><span>, </span><span class='pt10'>...</span><span class='pt5'>opts</span><span>),</span></td></tr>
<tr><td class='ln' data-ln='130'></td><td><span>};</span></td></tr>
<tr><td class='ln' data-ln='131'></td><td> </td></tr>
<tr><td class='ln' data-ln='132'></td><td><span class='pt10'>export</span><span> </span><span class='pt10'>default</span><span> rust;</span></td></tr>
</table>
</div>
</div>
</div>
<div class='style' id='P--predawn--js'>
<div class='P--predawn-bordered'>
<div class="info header">
<span class="left">rust_types.js</span>
<span class="right"><span>132 lines</span><span>2.75 KB</span></span>
</div>
<div class='P--predawn'>
<table>
<tr><td class='ln' data-ln='1'></td><td><span class='pt18'>import</span><span> Struct </span><span class='pt18'>from</span><span> </span><span class='pt13'>'./Struct'</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='2'></td><td><span class='pt18'>import</span><span> { types, parseType, Pointer } </span><span class='pt18'>from</span><span> </span><span class='pt13'>'./types'</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='3'></td><td><span class='pt18'>import</span><span> { assert, vslice } </span><span class='pt18'>from</span><span> </span><span class='pt13'>'./misc'</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='4'></td><td> </td></tr>
<tr><td class='ln' data-ln='5'></td><td> </td></tr>
<tr><td class='ln' data-ln='6'></td><td><span class='pt16'>const</span><span> </span><span class='pt18'>DATA</span><span> = (</span><span class='pt18'>typeof</span><span> </span><span class='pt11'>Symbol</span><span> </span><span class='pt18'>!==</span><span> </span><span class='pt13'>'undefined'</span><span>)</span></td></tr>
<tr><td class='ln' data-ln='7'></td><td><span> </span><span class='pt18'>?</span><span> </span><span class='pt11'>Symbol</span><span>.</span><span class='pt18'>for</span><span>(</span><span class='pt13'>'struct-data'</span><span>)</span></td></tr>
<tr><td class='ln' data-ln='8'></td><td><span> </span><span class='pt18'>:</span><span> </span><span class='pt13'>'__data'</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='9'></td><td> </td></tr>
<tr><td class='ln' data-ln='10'></td><td> </td></tr>
<tr><td class='ln' data-ln='11'></td><td class='hi'><span class='pt16'>function</span><span> extend(StructType) {</span></td></tr>
<tr><td class='ln' data-ln='12'></td><td class='hi'><span> </span><span class='pt16'>class</span><span> </span><span class='pt11'>RustType</span><span> </span><span class='pt16'>extends</span><span> StructType {</span></td></tr>
<tr><td class='ln' data-ln='13'></td><td class='hi'><span> free() {</span></td></tr>
<tr><td class='ln' data-ln='14'></td><td class='hi'><span> </span><span class='pt18'>super</span><span>.</span><span class='pt18'>free</span><span>(</span><span class='pt12'>true</span><span>);</span></td></tr>
<tr><td class='ln' data-ln='15'></td><td class='hi'><span> }</span></td></tr>
<tr><td class='ln' data-ln='16'></td><td class='hi'><span> }</span></td></tr>
<tr><td class='ln' data-ln='17'></td><td class='hi'> </td></tr>
<tr><td class='ln' data-ln='18'></td><td class='hi'><span> </span><span class='pt11'>Object</span><span>.</span><span class='pt18'>assign</span><span>(RustType, StructType);</span></td></tr>
<tr><td class='ln' data-ln='19'></td><td class='hi'><span> </span><span class='pt16'>return</span><span> RustType;</span></td></tr>
<tr><td class='ln' data-ln='20'></td><td class='hi'><span>}</span></td></tr>
<tr><td class='ln' data-ln='21'></td><td> </td></tr>
<tr><td class='ln' data-ln='22'></td><td> </td></tr>
<tr><td class='ln' data-ln='23'></td><td><span class='pt16'>function</span><span> RustTuple(</span><span class='pt18'>...</span><span>tupleTypes) {</span></td></tr>
<tr><td class='ln' data-ln='24'></td><td><span> </span><span class='pt16'>const</span><span> fields = {};</span></td></tr>
<tr><td class='ln' data-ln='25'></td><td> </td></tr>
<tr><td class='ln' data-ln='26'></td><td><span> tupleTypes.</span><span class='pt18'>forEach</span><span>((type, i) </span><span class='pt16'>=></span><span> {</span></td></tr>
<tr><td class='ln' data-ln='27'></td><td><span> fields[i] = </span><span class='pt11'>parseType</span><span>(type);</span></td></tr>
<tr><td class='ln' data-ln='28'></td><td><span> });</span></td></tr>
<tr><td class='ln' data-ln='29'></td><td> </td></tr>
<tr><td class='ln' data-ln='30'></td><td><span> </span><span class='pt16'>return</span><span> </span><span class='pt12'>new</span><span> </span><span class='pt18'>Struct</span><span>(fields);</span></td></tr>
<tr><td class='ln' data-ln='31'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='32'></td><td> </td></tr>
<tr><td class='ln' data-ln='33'></td><td> </td></tr>
<tr><td class='ln' data-ln='34'></td><td><span class='pt16'>function</span><span> RustVector(typedef) {</span></td></tr>
<tr><td class='ln' data-ln='35'></td><td><span> </span><span class='pt16'>const</span><span> type = </span><span class='pt18'>parseType</span><span>(typedef);</span></td></tr>
<tr><td class='ln' data-ln='36'></td><td> </td></tr>
<tr><td class='ln' data-ln='37'></td><td><span> </span><span class='pt16'>const</span><span> Vector = </span><span class='pt18'>extend</span><span>(</span><span class='pt12'>new</span><span> </span><span class='pt18'>Struct</span><span>({</span></td></tr>
<tr><td class='ln' data-ln='38'></td><td><span> ptr: types.</span><span class='pt18'>pointer</span><span>(type),</span></td></tr>
<tr><td class='ln' data-ln='39'></td><td><span> cap: </span><span class='pt13'>'usize'</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='40'></td><td><span> len: </span><span class='pt13'>'usize'</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='41'></td><td><span> </span><span class='pt10'>/* values */</span></td></tr>
<tr><td class='ln' data-ln='42'></td><td><span> }));</span></td></tr>
<tr><td class='ln' data-ln='43'></td><td> </td></tr>
<tr><td class='ln' data-ln='44'></td><td><span> </span><span class='pt11'>Object</span><span>.</span><span class='pt18'>defineProperty</span><span>(</span><span class='pt11'>Vector</span><span>.</span><span class='pt18'>prototype</span><span>, </span><span class='pt13'>'values'</span><span>, {</span></td></tr>
<tr><td class='ln' data-ln='45'></td><td><span> enumerable: </span><span class='pt12'>true</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='46'></td><td> </td></tr>
<tr><td class='ln' data-ln='47'></td><td><span> get() {</span></td></tr>
<tr><td class='ln' data-ln='48'></td><td><span> </span><span class='pt16'>const</span><span> arrayType = </span><span class='pt11'>parseType</span><span>([type, </span><span class='pt16'>this</span><span>.len]);</span></td></tr>
<tr><td class='ln' data-ln='49'></td><td><span> </span><span class='pt16'>const</span><span> memory = </span><span class='pt16'>this</span><span>[</span><span class='pt18'>DATA</span><span>].view.buffer;</span></td></tr>
<tr><td class='ln' data-ln='50'></td><td><span> </span><span class='pt16'>const</span><span> view = </span><span class='pt12'>new</span><span> </span><span class='pt11'>DataView</span><span>(memory, </span><span class='pt16'>this</span><span>.ptr.</span><span class='pt18'>ref</span><span>(), arrayType.width);</span></td></tr>
<tr><td class='ln' data-ln='51'></td><td> </td></tr>
<tr><td class='ln' data-ln='52'></td><td><span> </span><span class='pt16'>return</span><span> arrayType.</span><span class='pt18'>read</span><span>(view, </span><span class='pt16'>this</span><span>[</span><span class='pt18'>DATA</span><span>].free);</span></td></tr>
<tr><td class='ln' data-ln='53'></td><td><span> },</span></td></tr>
<tr><td class='ln' data-ln='54'></td><td> </td></tr>
<tr><td class='ln' data-ln='55'></td><td><span> set(values) {</span></td></tr>
<tr><td class='ln' data-ln='56'></td><td><span> </span><span class='pt16'>const</span><span> len = values.length;</span></td></tr>
<tr><td class='ln' data-ln='57'></td><td> </td></tr>
<tr><td class='ln' data-ln='58'></td><td><span> </span><span class='pt16'>this</span><span>.ptr = </span><span class='pt12'>new</span><span> </span><span class='pt18'>Pointer</span><span>([type, len], values);</span></td></tr>
<tr><td class='ln' data-ln='59'></td><td><span> </span><span class='pt16'>this</span><span>.len = len;</span></td></tr>
<tr><td class='ln' data-ln='60'></td><td><span> </span><span class='pt16'>this</span><span>.cap = len;</span></td></tr>
<tr><td class='ln' data-ln='61'></td><td><span> },</span></td></tr>
<tr><td class='ln' data-ln='62'></td><td><span> });</span></td></tr>
<tr><td class='ln' data-ln='63'></td><td> </td></tr>
<tr><td class='ln' data-ln='64'></td><td><span> </span><span class='pt16'>return</span><span> Vector;</span></td></tr>
<tr><td class='ln' data-ln='65'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='66'></td><td> </td></tr>
<tr><td class='ln' data-ln='67'></td><td> </td></tr>
<tr><td class='ln' data-ln='68'></td><td><span class='pt16'>function</span><span> RustOption(typedef, isNonNullable = </span><span class='pt12'>false</span><span>, tagSize) {</span></td></tr>
<tr><td class='ln' data-ln='69'></td><td><span> </span><span class='pt16'>const</span><span> type = </span><span class='pt18'>parseType</span><span>(typedef);</span></td></tr>
<tr><td class='ln' data-ln='70'></td><td><span> </span><span class='pt16'>let</span><span> discriminant;</span></td></tr>
<tr><td class='ln' data-ln='71'></td><td> </td></tr>
<tr><td class='ln' data-ln='72'></td><td><span> </span><span class='pt16'>if</span><span> (tagSize) discriminant = types[</span><span class='pt18'>`</span><span class='pt13'>uint</span><span class='pt18'>${</span><span>tagSize </span><span class='pt18'>*</span><span> </span><span class='pt16'>8</span><span class='pt18'>}`</span><span>];</span></td></tr>
<tr><td class='ln' data-ln='73'></td><td><span> </span><span class='pt16'>else</span><span> </span><span class='pt16'>if</span><span> (type.alignment </span><span class='pt18'>===</span><span> </span><span class='pt16'>1</span><span>) discriminant = </span><span class='pt13'>'uint8'</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='74'></td><td><span> </span><span class='pt16'>else</span><span> </span><span class='pt16'>if</span><span> (type.alignment </span><span class='pt18'>===</span><span> </span><span class='pt16'>2</span><span>) discriminant = </span><span class='pt13'>'uint16'</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='75'></td><td><span> </span><span class='pt16'>else</span><span> discriminant = </span><span class='pt13'>'uint32'</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='76'></td><td> </td></tr>
<tr><td class='ln' data-ln='77'></td><td><span> </span><span class='pt16'>const</span><span> fields = (isNonNullable)</span></td></tr>
<tr><td class='ln' data-ln='78'></td><td><span> </span><span class='pt18'>?</span><span> { value: type }</span></td></tr>
<tr><td class='ln' data-ln='79'></td><td><span> </span><span class='pt18'>:</span><span> { discriminant, value: type };</span></td></tr>
<tr><td class='ln' data-ln='80'></td><td> </td></tr>
<tr><td class='ln' data-ln='81'></td><td><span> </span><span class='pt16'>const</span><span> Option = </span><span class='pt12'>new</span><span> </span><span class='pt18'>Struct</span><span>(fields);</span></td></tr>
<tr><td class='ln' data-ln='82'></td><td> </td></tr>
<tr><td class='ln' data-ln='83'></td><td><span> </span><span class='pt11'>Object</span><span>.</span><span class='pt18'>assign</span><span>(</span><span class='pt11'>Option</span><span>.</span><span class='pt18'>prototype</span><span>, {</span></td></tr>
<tr><td class='ln' data-ln='84'></td><td><span> isSome() {</span></td></tr>
<tr><td class='ln' data-ln='85'></td><td><span> </span><span class='pt16'>return</span><span> (</span><span class='pt13'>'discriminant'</span><span> </span><span class='pt18'>in</span><span> fields) </span><span class='pt18'>?</span><span> !!</span><span class='pt16'>this</span><span>.discriminant </span><span class='pt18'>:</span><span> !!</span><span class='pt16'>this</span><span>.value;</span></td></tr>
<tr><td class='ln' data-ln='86'></td><td><span> },</span></td></tr>
<tr><td class='ln' data-ln='87'></td><td> </td></tr>
<tr><td class='ln' data-ln='88'></td><td><span> isNone() {</span></td></tr>
<tr><td class='ln' data-ln='89'></td><td><span> </span><span class='pt16'>return</span><span> !</span><span class='pt16'>this</span><span>.</span><span class='pt18'>isSome</span><span>();</span></td></tr>
<tr><td class='ln' data-ln='90'></td><td><span> },</span></td></tr>
<tr><td class='ln' data-ln='91'></td><td> </td></tr>
<tr><td class='ln' data-ln='92'></td><td><span> expect(msg) {</span></td></tr>
<tr><td class='ln' data-ln='93'></td><td><span> </span><span class='pt16'>if</span><span> (</span><span class='pt18'>!</span><span class='pt16'>this</span><span>.</span><span class='pt18'>isSome</span><span>()) </span><span class='pt18'>throw</span><span> </span><span class='pt12'>new</span><span> </span><span class='pt11'>Error</span><span>(msg);</span></td></tr>
<tr><td class='ln' data-ln='94'></td><td><span> </span><span class='pt16'>return</span><span> </span><span class='pt16'>this</span><span>.value;</span></td></tr>
<tr><td class='ln' data-ln='95'></td><td><span> },</span></td></tr>
<tr><td class='ln' data-ln='96'></td><td> </td></tr>
<tr><td class='ln' data-ln='97'></td><td><span> unwrap() {</span></td></tr>
<tr><td class='ln' data-ln='98'></td><td><span> </span><span class='pt16'>if</span><span> (</span><span class='pt18'>!</span><span class='pt16'>this</span><span>.</span><span class='pt18'>isSome</span><span>()) </span><span class='pt18'>throw</span><span> </span><span class='pt12'>new</span><span> </span><span class='pt11'>Error</span><span>(</span><span class='pt13'>'Error unwrapping none'</span><span>);</span></td></tr>
<tr><td class='ln' data-ln='99'></td><td><span> </span><span class='pt16'>return</span><span> </span><span class='pt16'>this</span><span>.value;</span></td></tr>
<tr><td class='ln' data-ln='100'></td><td><span> },</span></td></tr>
<tr><td class='ln' data-ln='101'></td><td> </td></tr>
<tr><td class='ln' data-ln='102'></td><td><span> unwrapOr(defaultValue) {</span></td></tr>
<tr><td class='ln' data-ln='103'></td><td><span> </span><span class='pt16'>return</span><span> (</span><span class='pt16'>this</span><span>.</span><span class='pt18'>isSome</span><span>()) </span><span class='pt18'>?</span><span> </span><span class='pt16'>this</span><span>.value </span><span class='pt18'>:</span><span> defaultValue;</span></td></tr>
<tr><td class='ln' data-ln='104'></td><td><span> },</span></td></tr>
<tr><td class='ln' data-ln='105'></td><td> </td></tr>
<tr><td class='ln' data-ln='106'></td><td><span> unwrapOrElse(fn) {</span></td></tr>
<tr><td class='ln' data-ln='107'></td><td><span> </span><span class='pt16'>return</span><span> (</span><span class='pt16'>this</span><span>.</span><span class='pt18'>isSome</span><span>()) </span><span class='pt18'>?</span><span> </span><span class='pt16'>this</span><span>.value </span><span class='pt18'>:</span><span> </span><span class='pt18'>fn</span><span>();</span></td></tr>
<tr><td class='ln' data-ln='108'></td><td><span> },</span></td></tr>
<tr><td class='ln' data-ln='109'></td><td><span> });</span></td></tr>
<tr><td class='ln' data-ln='110'></td><td> </td></tr>
<tr><td class='ln' data-ln='111'></td><td><span> </span><span class='pt16'>return</span><span> Option;</span></td></tr>
<tr><td class='ln' data-ln='112'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='113'></td><td> </td></tr>
<tr><td class='ln' data-ln='114'></td><td> </td></tr>
<tr><td class='ln' data-ln='115'></td><td><span class='pt16'>const</span><span> rust = {</span></td></tr>
<tr><td class='ln' data-ln='116'></td><td><span> tuple: RustTuple,</span></td></tr>
<tr><td class='ln' data-ln='117'></td><td><span> Tuple: (type, values) </span><span class='pt16'>=></span><span> </span><span class='pt18'>new</span><span> (</span><span class='pt11'>RustTuple</span><span>(</span><span class='pt18'>...</span><span>type))([</span><span class='pt18'>...</span><span>values]),</span></td></tr>
<tr><td class='ln' data-ln='118'></td><td> </td></tr>
<tr><td class='ln' data-ln='119'></td><td><span> vector: RustVector,</span></td></tr>
<tr><td class='ln' data-ln='120'></td><td><span> Vector: (type, values) </span><span class='pt16'>=></span><span> </span><span class='pt18'>new</span><span> (</span><span class='pt11'>RustVector</span><span>(type))({ values }),</span></td></tr>
<tr><td class='ln' data-ln='121'></td><td> </td></tr>
<tr><td class='ln' data-ln='122'></td><td><span> option: RustOption,</span></td></tr>
<tr><td class='ln' data-ln='123'></td><td><span> Option: (type, value, </span><span class='pt18'>...</span><span>opts) </span><span class='pt16'>=></span><span> </span><span class='pt18'>new</span><span> (</span><span class='pt11'>RustOption</span><span>(type, </span><span class='pt18'>...</span><span>opts))({</span></td></tr>
<tr><td class='ln' data-ln='124'></td><td><span> value,</span></td></tr>
<tr><td class='ln' data-ln='125'></td><td><span> discriminant: (</span><span class='pt18'>typeof</span><span> value </span><span class='pt18'>===</span><span> </span><span class='pt13'>'undefined'</span><span>) </span><span class='pt18'>?</span><span> </span><span class='pt16'>0</span><span> </span><span class='pt18'>:</span><span> </span><span class='pt16'>1</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='126'></td><td><span> }),</span></td></tr>
<tr><td class='ln' data-ln='127'></td><td> </td></tr>
<tr><td class='ln' data-ln='128'></td><td><span> Some: (</span><span class='pt18'>...</span><span>args) </span><span class='pt16'>=></span><span> rust.</span><span class='pt18'>Option</span><span>(</span><span class='pt18'>...</span><span>args),</span></td></tr>
<tr><td class='ln' data-ln='129'></td><td><span> None: (type, </span><span class='pt18'>...</span><span>opts) </span><span class='pt16'>=></span><span> rust.</span><span class='pt18'>Option</span><span>(type, </span><span class='pt16'>undefined</span><span>, </span><span class='pt18'>...</span><span>opts),</span></td></tr>
<tr><td class='ln' data-ln='130'></td><td><span>};</span></td></tr>
<tr><td class='ln' data-ln='131'></td><td> </td></tr>
<tr><td class='ln' data-ln='132'></td><td><span class='pt18'>export</span><span> </span><span class='pt18'>default</span><span> rust;</span></td></tr>
</table>
</div>
</div>
</div>
<div class='style' id='P--solarized_dark--js'>
<div class='P--solarized_dark-bordered'>
<div class="info header">
<span class="left">rust_types.js</span>
<span class="right"><span>132 lines</span><span>2.75 KB</span></span>
</div>
<div class='P--solarized_dark'>
<table>
<tr><td class='ln' data-ln='1'></td><td><span class='pt5'>import</span><span> </span><span class='pt1'>Struct</span><span> </span><span class='pt5'>from</span><span> </span><span class='pt2'>'./Struct'</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='2'></td><td><span class='pt5'>import</span><span> { </span><span class='pt1'>types</span><span>, </span><span class='pt1'>parseType</span><span>, </span><span class='pt1'>Pointer</span><span> } </span><span class='pt5'>from</span><span> </span><span class='pt2'>'./types'</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='3'></td><td><span class='pt5'>import</span><span> { </span><span class='pt1'>assert</span><span>, </span><span class='pt1'>vslice</span><span> } </span><span class='pt5'>from</span><span> </span><span class='pt2'>'./misc'</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='4'></td><td> </td></tr>
<tr><td class='ln' data-ln='5'></td><td> </td></tr>
<tr><td class='ln' data-ln='6'></td><td><span class='bo'>const</span><span> </span><span class='pt1'>DATA</span><span> = (</span><span class='pt5'>typeof</span><span> </span><span class='pt5'>Symbol</span><span> </span><span class='pt5'>!==</span><span> </span><span class='pt2'>'undefined'</span><span>)</span></td></tr>
<tr><td class='ln' data-ln='7'></td><td><span> </span><span class='pt5'>?</span><span> </span><span class='pt5'>Symbol.</span><span>for(</span><span class='pt2'>'struct-data'</span><span>)</span></td></tr>
<tr><td class='ln' data-ln='8'></td><td><span> </span><span class='pt5'>:</span><span> </span><span class='pt2'>'__data'</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='9'></td><td> </td></tr>
<tr><td class='ln' data-ln='10'></td><td> </td></tr>
<tr><td class='ln' data-ln='11'></td><td class='hi'><span class='bo'>function</span><span> </span><span class='pt1'>extend</span><span>(StructType) {</span></td></tr>
<tr><td class='ln' data-ln='12'></td><td class='hi'><span> </span><span class='bo'>class</span><span> </span><span class='pt6'>RustType</span><span> </span><span class='bo'>extends</span><span> </span><span class='pt1'>StructType</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='13'></td><td class='hi'><span> </span><span class='pt1'>free</span><span>() {</span></td></tr>
<tr><td class='ln' data-ln='14'></td><td class='hi'><span> </span><span class='pt1'>super</span><span class='pt5'>.</span><span>free(</span><span class='pt6'>true</span><span>);</span></td></tr>
<tr><td class='ln' data-ln='15'></td><td class='hi'><span> }</span></td></tr>
<tr><td class='ln' data-ln='16'></td><td class='hi'><span> }</span></td></tr>
<tr><td class='ln' data-ln='17'></td><td class='hi'> </td></tr>
<tr><td class='ln' data-ln='18'></td><td class='hi'><span> </span><span class='pt5'>Object.</span><span>assign(</span><span class='pt1'>RustType</span><span>, </span><span class='pt1'>StructType</span><span>);</span></td></tr>
<tr><td class='ln' data-ln='19'></td><td class='hi'><span> </span><span class='pt5'>return</span><span> </span><span class='pt1'>RustType</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='20'></td><td class='hi'><span>}</span></td></tr>
<tr><td class='ln' data-ln='21'></td><td> </td></tr>
<tr><td class='ln' data-ln='22'></td><td> </td></tr>
<tr><td class='ln' data-ln='23'></td><td><span class='bo'>function</span><span> </span><span class='pt1'>RustTuple</span><span>(</span><span class='pt5'>...</span><span>tupleTypes) {</span></td></tr>
<tr><td class='ln' data-ln='24'></td><td><span> </span><span class='bo'>const</span><span> </span><span class='pt1'>fields</span><span> = {};</span></td></tr>
<tr><td class='ln' data-ln='25'></td><td> </td></tr>
<tr><td class='ln' data-ln='26'></td><td><span> </span><span class='pt1'>tupleTypes</span><span class='pt5'>.</span><span>forEach((type, i) </span><span class='bo'>=></span><span> {</span></td></tr>
<tr><td class='ln' data-ln='27'></td><td><span> </span><span class='pt1'>fields</span><span>[</span><span class='pt1'>i</span><span>] = parseType(</span><span class='pt1'>type</span><span>);</span></td></tr>
<tr><td class='ln' data-ln='28'></td><td><span> });</span></td></tr>
<tr><td class='ln' data-ln='29'></td><td> </td></tr>
<tr><td class='ln' data-ln='30'></td><td><span> </span><span class='pt5'>return</span><span> </span><span class='pt5'>new</span><span> Struct(</span><span class='pt1'>fields</span><span>);</span></td></tr>
<tr><td class='ln' data-ln='31'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='32'></td><td> </td></tr>
<tr><td class='ln' data-ln='33'></td><td> </td></tr>
<tr><td class='ln' data-ln='34'></td><td><span class='bo'>function</span><span> </span><span class='pt1'>RustVector</span><span>(typedef) {</span></td></tr>
<tr><td class='ln' data-ln='35'></td><td><span> </span><span class='bo'>const</span><span> </span><span class='pt1'>type</span><span> = parseType(</span><span class='pt1'>typedef</span><span>);</span></td></tr>
<tr><td class='ln' data-ln='36'></td><td> </td></tr>
<tr><td class='ln' data-ln='37'></td><td><span> </span><span class='bo'>const</span><span> </span><span class='pt1'>Vector</span><span> = extend(</span><span class='pt5'>new</span><span> Struct({</span></td></tr>
<tr><td class='ln' data-ln='38'></td><td><span> </span><span class='pt2'>ptr</span><span class='pt7'>:</span><span> </span><span class='pt1'>types</span><span class='pt5'>.</span><span>pointer(</span><span class='pt1'>type</span><span>),</span></td></tr>
<tr><td class='ln' data-ln='39'></td><td><span> </span><span class='pt2'>cap</span><span class='pt7'>:</span><span> </span><span class='pt2'>'usize'</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='40'></td><td><span> </span><span class='pt2'>len</span><span class='pt7'>:</span><span> </span><span class='pt2'>'usize'</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='41'></td><td><span> </span><span class='pt3 it'>/* values */</span></td></tr>
<tr><td class='ln' data-ln='42'></td><td><span> }));</span></td></tr>
<tr><td class='ln' data-ln='43'></td><td> </td></tr>
<tr><td class='ln' data-ln='44'></td><td><span> </span><span class='pt5'>Object.</span><span>defineProperty(</span><span class='pt6'>Vector</span><span class='pt5'>.</span><span class='pt1'>prototype</span><span>, </span><span class='pt2'>'values'</span><span>, {</span></td></tr>
<tr><td class='ln' data-ln='45'></td><td><span> </span><span class='pt2'>enumerable</span><span class='pt7'>:</span><span> </span><span class='pt6'>true</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='46'></td><td> </td></tr>
<tr><td class='ln' data-ln='47'></td><td><span> </span><span class='pt1'>get</span><span>() {</span></td></tr>
<tr><td class='ln' data-ln='48'></td><td><span> </span><span class='bo'>const</span><span> </span><span class='pt1'>arrayType</span><span> = parseType([</span><span class='pt1'>type</span><span>, </span><span class='pt1'>this</span><span class='pt5'>.</span><span class='pt1'>len</span><span>]);</span></td></tr>
<tr><td class='ln' data-ln='49'></td><td><span> </span><span class='bo'>const</span><span> </span><span class='pt1'>memory</span><span> = </span><span class='pt1'>this</span><span>[</span><span class='pt1'>DATA</span><span>]</span><span class='pt5'>.</span><span class='pt1'>view</span><span class='pt5'>.</span><span class='pt1'>buffer</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='50'></td><td><span> </span><span class='bo'>const</span><span> </span><span class='pt1'>view</span><span> = </span><span class='pt5'>new</span><span> </span><span class='pt5'>DataView</span><span>(</span><span class='pt1'>memory</span><span>, </span><span class='pt1'>this</span><span class='pt5'>.</span><span class='pt1'>ptr</span><span class='pt5'>.</span><span>ref(), </span><span class='pt1'>arrayType</span><span class='pt5'>.</span><span class='pt1'>width</span><span>);</span></td></tr>
<tr><td class='ln' data-ln='51'></td><td> </td></tr>
<tr><td class='ln' data-ln='52'></td><td><span> </span><span class='pt5'>return</span><span> </span><span class='pt1'>arrayType</span><span class='pt5'>.</span><span>read(</span><span class='pt1'>view</span><span>, </span><span class='pt1'>this</span><span>[</span><span class='pt1'>DATA</span><span>]</span><span class='pt5'>.</span><span class='pt1'>free</span><span>);</span></td></tr>
<tr><td class='ln' data-ln='53'></td><td><span> },</span></td></tr>
<tr><td class='ln' data-ln='54'></td><td> </td></tr>
<tr><td class='ln' data-ln='55'></td><td><span> </span><span class='pt1'>set</span><span>(values) {</span></td></tr>
<tr><td class='ln' data-ln='56'></td><td><span> </span><span class='bo'>const</span><span> </span><span class='pt1'>len</span><span> = </span><span class='pt1'>values</span><span class='pt5'>.</span><span class='pt1'>length</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='57'></td><td> </td></tr>
<tr><td class='ln' data-ln='58'></td><td><span> </span><span class='pt1'>this</span><span class='pt5'>.</span><span class='pt1'>ptr</span><span> = </span><span class='pt5'>new</span><span> Pointer([</span><span class='pt1'>type</span><span>, </span><span class='pt1'>len</span><span>], </span><span class='pt1'>values</span><span>);</span></td></tr>
<tr><td class='ln' data-ln='59'></td><td><span> </span><span class='pt1'>this</span><span class='pt5'>.</span><span class='pt1'>len</span><span> = </span><span class='pt1'>len</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='60'></td><td><span> </span><span class='pt1'>this</span><span class='pt5'>.</span><span class='pt1'>cap</span><span> = </span><span class='pt1'>len</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='61'></td><td><span> },</span></td></tr>
<tr><td class='ln' data-ln='62'></td><td><span> });</span></td></tr>
<tr><td class='ln' data-ln='63'></td><td> </td></tr>
<tr><td class='ln' data-ln='64'></td><td><span> </span><span class='pt5'>return</span><span> </span><span class='pt1'>Vector</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='65'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='66'></td><td> </td></tr>
<tr><td class='ln' data-ln='67'></td><td> </td></tr>
<tr><td class='ln' data-ln='68'></td><td><span class='bo'>function</span><span> </span><span class='pt1'>RustOption</span><span>(typedef, isNonNullable </span><span class='pt5'>=</span><span> </span><span class='pt6'>false</span><span>, tagSize) {</span></td></tr>
<tr><td class='ln' data-ln='69'></td><td><span> </span><span class='bo'>const</span><span> </span><span class='pt1'>type</span><span> = parseType(</span><span class='pt1'>typedef</span><span>);</span></td></tr>
<tr><td class='ln' data-ln='70'></td><td><span> </span><span class='bo'>let</span><span> </span><span class='pt1'>discriminant</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='71'></td><td> </td></tr>
<tr><td class='ln' data-ln='72'></td><td><span> </span><span class='pt5'>if</span><span> (</span><span class='pt1'>tagSize</span><span>) </span><span class='pt1'>discriminant</span><span> = </span><span class='pt1'>types</span><span>[</span><span class='pt5'>`</span><span class='pt2'>uint</span><span class='pt5'>${</span><span class='pt1'>tagSize</span><span> </span><span class='pt5'>*</span><span> </span><span class='pt10'>8</span><span class='pt5'>}`</span><span>];</span></td></tr>
<tr><td class='ln' data-ln='73'></td><td><span> </span><span class='pt5'>else</span><span> </span><span class='pt5'>if</span><span> (</span><span class='pt1'>type</span><span class='pt5'>.</span><span class='pt1'>alignment</span><span> </span><span class='pt5'>===</span><span> </span><span class='pt10'>1</span><span>) </span><span class='pt1'>discriminant</span><span> = </span><span class='pt2'>'uint8'</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='74'></td><td><span> </span><span class='pt5'>else</span><span> </span><span class='pt5'>if</span><span> (</span><span class='pt1'>type</span><span class='pt5'>.</span><span class='pt1'>alignment</span><span> </span><span class='pt5'>===</span><span> </span><span class='pt10'>2</span><span>) </span><span class='pt1'>discriminant</span><span> = </span><span class='pt2'>'uint16'</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='75'></td><td><span> </span><span class='pt5'>else</span><span> </span><span class='pt1'>discriminant</span><span> = </span><span class='pt2'>'uint32'</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='76'></td><td> </td></tr>
<tr><td class='ln' data-ln='77'></td><td><span> </span><span class='bo'>const</span><span> </span><span class='pt1'>fields</span><span> = (</span><span class='pt1'>isNonNullable</span><span>)</span></td></tr>
<tr><td class='ln' data-ln='78'></td><td><span> </span><span class='pt5'>?</span><span> { </span><span class='pt2'>value</span><span class='pt7'>:</span><span> </span><span class='pt1'>type</span><span> }</span></td></tr>
<tr><td class='ln' data-ln='79'></td><td><span> </span><span class='pt5'>:</span><span> { </span><span class='pt1'>discriminant</span><span>, </span><span class='pt2'>value</span><span class='pt7'>:</span><span> </span><span class='pt1'>type</span><span> };</span></td></tr>
<tr><td class='ln' data-ln='80'></td><td> </td></tr>
<tr><td class='ln' data-ln='81'></td><td><span> </span><span class='bo'>const</span><span> </span><span class='pt1'>Option</span><span> = </span><span class='pt5'>new</span><span> Struct(</span><span class='pt1'>fields</span><span>);</span></td></tr>
<tr><td class='ln' data-ln='82'></td><td> </td></tr>
<tr><td class='ln' data-ln='83'></td><td><span> </span><span class='pt5'>Object.</span><span>assign(</span><span class='pt6'>Option</span><span class='pt5'>.</span><span class='pt1'>prototype</span><span>, {</span></td></tr>
<tr><td class='ln' data-ln='84'></td><td><span> </span><span class='pt1'>isSome</span><span>() {</span></td></tr>
<tr><td class='ln' data-ln='85'></td><td><span> </span><span class='pt5'>return</span><span> (</span><span class='pt2'>'discriminant'</span><span> </span><span class='pt5'>in</span><span> </span><span class='pt1'>fields</span><span>) </span><span class='pt5'>?</span><span> !!</span><span class='pt1'>this</span><span class='pt5'>.</span><span class='pt1'>discriminant</span><span> </span><span class='pt5'>:</span><span> !!</span><span class='pt1'>this</span><span class='pt5'>.</span><span class='pt1'>value</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='86'></td><td><span> },</span></td></tr>
<tr><td class='ln' data-ln='87'></td><td> </td></tr>
<tr><td class='ln' data-ln='88'></td><td><span> </span><span class='pt1'>isNone</span><span>() {</span></td></tr>
<tr><td class='ln' data-ln='89'></td><td><span> </span><span class='pt5'>return</span><span> !</span><span class='pt1'>this</span><span class='pt5'>.</span><span>isSome();</span></td></tr>
<tr><td class='ln' data-ln='90'></td><td><span> },</span></td></tr>
<tr><td class='ln' data-ln='91'></td><td> </td></tr>
<tr><td class='ln' data-ln='92'></td><td><span> </span><span class='pt1'>expect</span><span>(msg) {</span></td></tr>
<tr><td class='ln' data-ln='93'></td><td><span> </span><span class='pt5'>if</span><span> (</span><span class='pt5'>!</span><span class='pt1'>this</span><span class='pt5'>.</span><span>isSome()) </span><span class='pt5'>throw</span><span> </span><span class='pt5'>new</span><span> </span><span class='pt5'>Error</span><span>(</span><span class='pt1'>msg</span><span>);</span></td></tr>
<tr><td class='ln' data-ln='94'></td><td><span> </span><span class='pt5'>return</span><span> </span><span class='pt1'>this</span><span class='pt5'>.</span><span class='pt1'>value</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='95'></td><td><span> },</span></td></tr>
<tr><td class='ln' data-ln='96'></td><td> </td></tr>
<tr><td class='ln' data-ln='97'></td><td><span> </span><span class='pt1'>unwrap</span><span>() {</span></td></tr>
<tr><td class='ln' data-ln='98'></td><td><span> </span><span class='pt5'>if</span><span> (</span><span class='pt5'>!</span><span class='pt1'>this</span><span class='pt5'>.</span><span>isSome()) </span><span class='pt5'>throw</span><span> </span><span class='pt5'>new</span><span> </span><span class='pt5'>Error</span><span>(</span><span class='pt2'>'Error unwrapping none'</span><span>);</span></td></tr>
<tr><td class='ln' data-ln='99'></td><td><span> </span><span class='pt5'>return</span><span> </span><span class='pt1'>this</span><span class='pt5'>.</span><span class='pt1'>value</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='100'></td><td><span> },</span></td></tr>
<tr><td class='ln' data-ln='101'></td><td> </td></tr>
<tr><td class='ln' data-ln='102'></td><td><span> </span><span class='pt1'>unwrapOr</span><span>(defaultValue) {</span></td></tr>
<tr><td class='ln' data-ln='103'></td><td><span> </span><span class='pt5'>return</span><span> (</span><span class='pt1'>this</span><span class='pt5'>.</span><span>isSome()) </span><span class='pt5'>?</span><span> </span><span class='pt1'>this</span><span class='pt5'>.</span><span class='pt1'>value</span><span> </span><span class='pt5'>:</span><span> </span><span class='pt1'>defaultValue</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='104'></td><td><span> },</span></td></tr>
<tr><td class='ln' data-ln='105'></td><td> </td></tr>
<tr><td class='ln' data-ln='106'></td><td><span> </span><span class='pt1'>unwrapOrElse</span><span>(fn) {</span></td></tr>
<tr><td class='ln' data-ln='107'></td><td><span> </span><span class='pt5'>return</span><span> (</span><span class='pt1'>this</span><span class='pt5'>.</span><span>isSome()) </span><span class='pt5'>?</span><span> </span><span class='pt1'>this</span><span class='pt5'>.</span><span class='pt1'>value</span><span> </span><span class='pt5'>:</span><span> fn();</span></td></tr>
<tr><td class='ln' data-ln='108'></td><td><span> },</span></td></tr>
<tr><td class='ln' data-ln='109'></td><td><span> });</span></td></tr>
<tr><td class='ln' data-ln='110'></td><td> </td></tr>
<tr><td class='ln' data-ln='111'></td><td><span> </span><span class='pt5'>return</span><span> </span><span class='pt1'>Option</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='112'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='113'></td><td> </td></tr>
<tr><td class='ln' data-ln='114'></td><td> </td></tr>
<tr><td class='ln' data-ln='115'></td><td><span class='bo'>const</span><span> </span><span class='pt1'>rust</span><span> = {</span></td></tr>
<tr><td class='ln' data-ln='116'></td><td><span> </span><span class='pt2'>tuple</span><span class='pt7'>:</span><span> </span><span class='pt1'>RustTuple</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='117'></td><td><span> </span><span class='pt1'>Tuple</span><span>: (type, values) </span><span class='bo'>=></span><span> new (RustTuple(</span><span class='pt5'>...</span><span class='pt1'>type</span><span>))([</span><span class='pt5'>...</span><span class='pt1'>values</span><span>]),</span></td></tr>
<tr><td class='ln' data-ln='118'></td><td> </td></tr>
<tr><td class='ln' data-ln='119'></td><td><span> </span><span class='pt2'>vector</span><span class='pt7'>:</span><span> </span><span class='pt1'>RustVector</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='120'></td><td><span> </span><span class='pt1'>Vector</span><span>: (type, values) </span><span class='bo'>=></span><span> new (RustVector(</span><span class='pt1'>type</span><span>))({ </span><span class='pt1'>values</span><span> }),</span></td></tr>
<tr><td class='ln' data-ln='121'></td><td> </td></tr>
<tr><td class='ln' data-ln='122'></td><td><span> </span><span class='pt2'>option</span><span class='pt7'>:</span><span> </span><span class='pt1'>RustOption</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='123'></td><td><span> </span><span class='pt1'>Option</span><span>: (type, value, </span><span class='pt5'>...</span><span>opts) </span><span class='bo'>=></span><span> new (RustOption(</span><span class='pt1'>type</span><span>, </span><span class='pt5'>...</span><span class='pt1'>opts</span><span>))({</span></td></tr>
<tr><td class='ln' data-ln='124'></td><td><span> </span><span class='pt1'>value</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='125'></td><td><span> </span><span class='pt2'>discriminant</span><span class='pt7'>:</span><span> (</span><span class='pt5'>typeof</span><span> </span><span class='pt1'>value</span><span> </span><span class='pt5'>===</span><span> </span><span class='pt2'>'undefined'</span><span>) </span><span class='pt5'>?</span><span> </span><span class='pt10'>0</span><span> </span><span class='pt5'>:</span><span> </span><span class='pt10'>1</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='126'></td><td><span> }),</span></td></tr>
<tr><td class='ln' data-ln='127'></td><td> </td></tr>
<tr><td class='ln' data-ln='128'></td><td><span> </span><span class='pt1'>Some</span><span>: (</span><span class='pt5'>...</span><span>args) </span><span class='bo'>=></span><span> </span><span class='pt1'>rust</span><span class='pt5'>.</span><span>Option(</span><span class='pt5'>...</span><span class='pt1'>args</span><span>),</span></td></tr>
<tr><td class='ln' data-ln='129'></td><td><span> </span><span class='pt1'>None</span><span>: (type, </span><span class='pt5'>...</span><span>opts) </span><span class='bo'>=></span><span> </span><span class='pt1'>rust</span><span class='pt5'>.</span><span>Option(</span><span class='pt1'>type</span><span>, </span><span class='pt6'>undefined</span><span>, </span><span class='pt5'>...</span><span class='pt1'>opts</span><span>),</span></td></tr>
<tr><td class='ln' data-ln='130'></td><td><span>};</span></td></tr>
<tr><td class='ln' data-ln='131'></td><td> </td></tr>
<tr><td class='ln' data-ln='132'></td><td><span class='pt5'>export</span><span> </span><span class='pt5'>default</span><span> </span><span class='pt1'>rust</span><span>;</span></td></tr>
</table>
</div>
</div>
</div>
<div class='style' id='P--solarized_light--js'>
<div class='P--solarized_light-bordered'>
<div class="info header">
<span class="left">rust_types.js</span>
<span class="right"><span>132 lines</span><span>2.75 KB</span></span>
</div>
<div class='P--solarized_light'>
<table>
<tr><td class='ln' data-ln='1'></td><td><span class='pt4'>import</span><span> </span><span class='pt2'>Struct</span><span> </span><span class='pt4'>from</span><span> </span><span class='pt3'>'./Struct'</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='2'></td><td><span class='pt4'>import</span><span> { </span><span class='pt2'>types</span><span>, </span><span class='pt2'>parseType</span><span>, </span><span class='pt2'>Pointer</span><span> } </span><span class='pt4'>from</span><span> </span><span class='pt3'>'./types'</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='3'></td><td><span class='pt4'>import</span><span> { </span><span class='pt2'>assert</span><span>, </span><span class='pt2'>vslice</span><span> } </span><span class='pt4'>from</span><span> </span><span class='pt3'>'./misc'</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='4'></td><td> </td></tr>
<tr><td class='ln' data-ln='5'></td><td> </td></tr>
<tr><td class='ln' data-ln='6'></td><td><span class='pt1 bo'>const</span><span> </span><span class='pt2'>DATA</span><span> = (</span><span class='pt4'>typeof</span><span> </span><span class='pt4'>Symbol</span><span> </span><span class='pt4'>!==</span><span> </span><span class='pt3'>'undefined'</span><span>)</span></td></tr>
<tr><td class='ln' data-ln='7'></td><td><span> </span><span class='pt4'>?</span><span> </span><span class='pt4'>Symbol.</span><span>for(</span><span class='pt3'>'struct-data'</span><span>)</span></td></tr>
<tr><td class='ln' data-ln='8'></td><td><span> </span><span class='pt4'>:</span><span> </span><span class='pt3'>'__data'</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='9'></td><td> </td></tr>
<tr><td class='ln' data-ln='10'></td><td> </td></tr>
<tr><td class='ln' data-ln='11'></td><td class='hi'><span class='pt1 bo'>function</span><span> </span><span class='pt2'>extend</span><span>(StructType) {</span></td></tr>
<tr><td class='ln' data-ln='12'></td><td class='hi'><span> </span><span class='pt1 bo'>class</span><span> </span><span class='pt6'>RustType</span><span> </span><span class='pt1 bo'>extends</span><span> </span><span class='pt2'>StructType</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='13'></td><td class='hi'><span> </span><span class='pt2'>free</span><span>() {</span></td></tr>
<tr><td class='ln' data-ln='14'></td><td class='hi'><span> </span><span class='pt2'>super</span><span class='pt4'>.</span><span>free(</span><span class='pt6'>true</span><span>);</span></td></tr>
<tr><td class='ln' data-ln='15'></td><td class='hi'><span> }</span></td></tr>
<tr><td class='ln' data-ln='16'></td><td class='hi'><span> }</span></td></tr>
<tr><td class='ln' data-ln='17'></td><td class='hi'> </td></tr>
<tr><td class='ln' data-ln='18'></td><td class='hi'><span> </span><span class='pt4'>Object.</span><span>assign(</span><span class='pt2'>RustType</span><span>, </span><span class='pt2'>StructType</span><span>);</span></td></tr>
<tr><td class='ln' data-ln='19'></td><td class='hi'><span> </span><span class='pt4'>return</span><span> </span><span class='pt2'>RustType</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='20'></td><td class='hi'><span>}</span></td></tr>
<tr><td class='ln' data-ln='21'></td><td> </td></tr>
<tr><td class='ln' data-ln='22'></td><td> </td></tr>
<tr><td class='ln' data-ln='23'></td><td><span class='pt1 bo'>function</span><span> </span><span class='pt2'>RustTuple</span><span>(</span><span class='pt4'>...</span><span>tupleTypes) {</span></td></tr>
<tr><td class='ln' data-ln='24'></td><td><span> </span><span class='pt1 bo'>const</span><span> </span><span class='pt2'>fields</span><span> = {};</span></td></tr>
<tr><td class='ln' data-ln='25'></td><td> </td></tr>
<tr><td class='ln' data-ln='26'></td><td><span> </span><span class='pt2'>tupleTypes</span><span class='pt4'>.</span><span>forEach((type, i) </span><span class='pt1 bo'>=></span><span> {</span></td></tr>
<tr><td class='ln' data-ln='27'></td><td><span> </span><span class='pt2'>fields</span><span>[</span><span class='pt2'>i</span><span>] = parseType(</span><span class='pt2'>type</span><span>);</span></td></tr>
<tr><td class='ln' data-ln='28'></td><td><span> });</span></td></tr>
<tr><td class='ln' data-ln='29'></td><td> </td></tr>
<tr><td class='ln' data-ln='30'></td><td><span> </span><span class='pt4'>return</span><span> </span><span class='pt4'>new</span><span> Struct(</span><span class='pt2'>fields</span><span>);</span></td></tr>
<tr><td class='ln' data-ln='31'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='32'></td><td> </td></tr>
<tr><td class='ln' data-ln='33'></td><td> </td></tr>
<tr><td class='ln' data-ln='34'></td><td><span class='pt1 bo'>function</span><span> </span><span class='pt2'>RustVector</span><span>(typedef) {</span></td></tr>
<tr><td class='ln' data-ln='35'></td><td><span> </span><span class='pt1 bo'>const</span><span> </span><span class='pt2'>type</span><span> = parseType(</span><span class='pt2'>typedef</span><span>);</span></td></tr>
<tr><td class='ln' data-ln='36'></td><td> </td></tr>
<tr><td class='ln' data-ln='37'></td><td><span> </span><span class='pt1 bo'>const</span><span> </span><span class='pt2'>Vector</span><span> = extend(</span><span class='pt4'>new</span><span> Struct({</span></td></tr>
<tr><td class='ln' data-ln='38'></td><td><span> </span><span class='pt3'>ptr</span><span class='pt7'>:</span><span> </span><span class='pt2'>types</span><span class='pt4'>.</span><span>pointer(</span><span class='pt2'>type</span><span>),</span></td></tr>
<tr><td class='ln' data-ln='39'></td><td><span> </span><span class='pt3'>cap</span><span class='pt7'>:</span><span> </span><span class='pt3'>'usize'</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='40'></td><td><span> </span><span class='pt3'>len</span><span class='pt7'>:</span><span> </span><span class='pt3'>'usize'</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='41'></td><td><span> </span><span class='pt5'>/* values */</span></td></tr>
<tr><td class='ln' data-ln='42'></td><td><span> }));</span></td></tr>
<tr><td class='ln' data-ln='43'></td><td> </td></tr>
<tr><td class='ln' data-ln='44'></td><td><span> </span><span class='pt4'>Object.</span><span>defineProperty(</span><span class='pt6'>Vector</span><span class='pt4'>.</span><span class='pt2'>prototype</span><span>, </span><span class='pt3'>'values'</span><span>, {</span></td></tr>
<tr><td class='ln' data-ln='45'></td><td><span> </span><span class='pt3'>enumerable</span><span class='pt7'>:</span><span> </span><span class='pt6'>true</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='46'></td><td> </td></tr>
<tr><td class='ln' data-ln='47'></td><td><span> </span><span class='pt2'>get</span><span>() {</span></td></tr>
<tr><td class='ln' data-ln='48'></td><td><span> </span><span class='pt1 bo'>const</span><span> </span><span class='pt2'>arrayType</span><span> = parseType([</span><span class='pt2'>type</span><span>, </span><span class='pt2'>this</span><span class='pt4'>.</span><span class='pt2'>len</span><span>]);</span></td></tr>
<tr><td class='ln' data-ln='49'></td><td><span> </span><span class='pt1 bo'>const</span><span> </span><span class='pt2'>memory</span><span> = </span><span class='pt2'>this</span><span>[</span><span class='pt2'>DATA</span><span>]</span><span class='pt4'>.</span><span class='pt2'>view</span><span class='pt4'>.</span><span class='pt2'>buffer</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='50'></td><td><span> </span><span class='pt1 bo'>const</span><span> </span><span class='pt2'>view</span><span> = </span><span class='pt4'>new</span><span> </span><span class='pt4'>DataView</span><span>(</span><span class='pt2'>memory</span><span>, </span><span class='pt2'>this</span><span class='pt4'>.</span><span class='pt2'>ptr</span><span class='pt4'>.</span><span>ref(), </span><span class='pt2'>arrayType</span><span class='pt4'>.</span><span class='pt2'>width</span><span>);</span></td></tr>
<tr><td class='ln' data-ln='51'></td><td> </td></tr>
<tr><td class='ln' data-ln='52'></td><td><span> </span><span class='pt4'>return</span><span> </span><span class='pt2'>arrayType</span><span class='pt4'>.</span><span>read(</span><span class='pt2'>view</span><span>, </span><span class='pt2'>this</span><span>[</span><span class='pt2'>DATA</span><span>]</span><span class='pt4'>.</span><span class='pt2'>free</span><span>);</span></td></tr>
<tr><td class='ln' data-ln='53'></td><td><span> },</span></td></tr>
<tr><td class='ln' data-ln='54'></td><td> </td></tr>
<tr><td class='ln' data-ln='55'></td><td><span> </span><span class='pt2'>set</span><span>(values) {</span></td></tr>
<tr><td class='ln' data-ln='56'></td><td><span> </span><span class='pt1 bo'>const</span><span> </span><span class='pt2'>len</span><span> = </span><span class='pt2'>values</span><span class='pt4'>.</span><span class='pt2'>length</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='57'></td><td> </td></tr>
<tr><td class='ln' data-ln='58'></td><td><span> </span><span class='pt2'>this</span><span class='pt4'>.</span><span class='pt2'>ptr</span><span> = </span><span class='pt4'>new</span><span> Pointer([</span><span class='pt2'>type</span><span>, </span><span class='pt2'>len</span><span>], </span><span class='pt2'>values</span><span>);</span></td></tr>
<tr><td class='ln' data-ln='59'></td><td><span> </span><span class='pt2'>this</span><span class='pt4'>.</span><span class='pt2'>len</span><span> = </span><span class='pt2'>len</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='60'></td><td><span> </span><span class='pt2'>this</span><span class='pt4'>.</span><span class='pt2'>cap</span><span> = </span><span class='pt2'>len</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='61'></td><td><span> },</span></td></tr>
<tr><td class='ln' data-ln='62'></td><td><span> });</span></td></tr>
<tr><td class='ln' data-ln='63'></td><td> </td></tr>
<tr><td class='ln' data-ln='64'></td><td><span> </span><span class='pt4'>return</span><span> </span><span class='pt2'>Vector</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='65'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='66'></td><td> </td></tr>
<tr><td class='ln' data-ln='67'></td><td> </td></tr>
<tr><td class='ln' data-ln='68'></td><td><span class='pt1 bo'>function</span><span> </span><span class='pt2'>RustOption</span><span>(typedef, isNonNullable </span><span class='pt4'>=</span><span> </span><span class='pt6'>false</span><span>, tagSize) {</span></td></tr>
<tr><td class='ln' data-ln='69'></td><td><span> </span><span class='pt1 bo'>const</span><span> </span><span class='pt2'>type</span><span> = parseType(</span><span class='pt2'>typedef</span><span>);</span></td></tr>
<tr><td class='ln' data-ln='70'></td><td><span> </span><span class='pt1 bo'>let</span><span> </span><span class='pt2'>discriminant</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='71'></td><td> </td></tr>
<tr><td class='ln' data-ln='72'></td><td><span> </span><span class='pt4'>if</span><span> (</span><span class='pt2'>tagSize</span><span>) </span><span class='pt2'>discriminant</span><span> = </span><span class='pt2'>types</span><span>[</span><span class='pt4'>`</span><span class='pt3'>uint</span><span class='pt4'>${</span><span class='pt2'>tagSize</span><span> </span><span class='pt4'>*</span><span> </span><span class='pt10'>8</span><span class='pt4'>}`</span><span>];</span></td></tr>
<tr><td class='ln' data-ln='73'></td><td><span> </span><span class='pt4'>else</span><span> </span><span class='pt4'>if</span><span> (</span><span class='pt2'>type</span><span class='pt4'>.</span><span class='pt2'>alignment</span><span> </span><span class='pt4'>===</span><span> </span><span class='pt10'>1</span><span>) </span><span class='pt2'>discriminant</span><span> = </span><span class='pt3'>'uint8'</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='74'></td><td><span> </span><span class='pt4'>else</span><span> </span><span class='pt4'>if</span><span> (</span><span class='pt2'>type</span><span class='pt4'>.</span><span class='pt2'>alignment</span><span> </span><span class='pt4'>===</span><span> </span><span class='pt10'>2</span><span>) </span><span class='pt2'>discriminant</span><span> = </span><span class='pt3'>'uint16'</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='75'></td><td><span> </span><span class='pt4'>else</span><span> </span><span class='pt2'>discriminant</span><span> = </span><span class='pt3'>'uint32'</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='76'></td><td> </td></tr>
<tr><td class='ln' data-ln='77'></td><td><span> </span><span class='pt1 bo'>const</span><span> </span><span class='pt2'>fields</span><span> = (</span><span class='pt2'>isNonNullable</span><span>)</span></td></tr>
<tr><td class='ln' data-ln='78'></td><td><span> </span><span class='pt4'>?</span><span> { </span><span class='pt3'>value</span><span class='pt7'>:</span><span> </span><span class='pt2'>type</span><span> }</span></td></tr>
<tr><td class='ln' data-ln='79'></td><td><span> </span><span class='pt4'>:</span><span> { </span><span class='pt2'>discriminant</span><span>, </span><span class='pt3'>value</span><span class='pt7'>:</span><span> </span><span class='pt2'>type</span><span> };</span></td></tr>
<tr><td class='ln' data-ln='80'></td><td> </td></tr>
<tr><td class='ln' data-ln='81'></td><td><span> </span><span class='pt1 bo'>const</span><span> </span><span class='pt2'>Option</span><span> = </span><span class='pt4'>new</span><span> Struct(</span><span class='pt2'>fields</span><span>);</span></td></tr>
<tr><td class='ln' data-ln='82'></td><td> </td></tr>
<tr><td class='ln' data-ln='83'></td><td><span> </span><span class='pt4'>Object.</span><span>assign(</span><span class='pt6'>Option</span><span class='pt4'>.</span><span class='pt2'>prototype</span><span>, {</span></td></tr>
<tr><td class='ln' data-ln='84'></td><td><span> </span><span class='pt2'>isSome</span><span>() {</span></td></tr>
<tr><td class='ln' data-ln='85'></td><td><span> </span><span class='pt4'>return</span><span> (</span><span class='pt3'>'discriminant'</span><span> </span><span class='pt4'>in</span><span> </span><span class='pt2'>fields</span><span>) </span><span class='pt4'>?</span><span> !!</span><span class='pt2'>this</span><span class='pt4'>.</span><span class='pt2'>discriminant</span><span> </span><span class='pt4'>:</span><span> !!</span><span class='pt2'>this</span><span class='pt4'>.</span><span class='pt2'>value</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='86'></td><td><span> },</span></td></tr>
<tr><td class='ln' data-ln='87'></td><td> </td></tr>
<tr><td class='ln' data-ln='88'></td><td><span> </span><span class='pt2'>isNone</span><span>() {</span></td></tr>
<tr><td class='ln' data-ln='89'></td><td><span> </span><span class='pt4'>return</span><span> !</span><span class='pt2'>this</span><span class='pt4'>.</span><span>isSome();</span></td></tr>
<tr><td class='ln' data-ln='90'></td><td><span> },</span></td></tr>
<tr><td class='ln' data-ln='91'></td><td> </td></tr>
<tr><td class='ln' data-ln='92'></td><td><span> </span><span class='pt2'>expect</span><span>(msg) {</span></td></tr>
<tr><td class='ln' data-ln='93'></td><td><span> </span><span class='pt4'>if</span><span> (</span><span class='pt4'>!</span><span class='pt2'>this</span><span class='pt4'>.</span><span>isSome()) </span><span class='pt4'>throw</span><span> </span><span class='pt4'>new</span><span> </span><span class='pt4'>Error</span><span>(</span><span class='pt2'>msg</span><span>);</span></td></tr>
<tr><td class='ln' data-ln='94'></td><td><span> </span><span class='pt4'>return</span><span> </span><span class='pt2'>this</span><span class='pt4'>.</span><span class='pt2'>value</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='95'></td><td><span> },</span></td></tr>
<tr><td class='ln' data-ln='96'></td><td> </td></tr>
<tr><td class='ln' data-ln='97'></td><td><span> </span><span class='pt2'>unwrap</span><span>() {</span></td></tr>
<tr><td class='ln' data-ln='98'></td><td><span> </span><span class='pt4'>if</span><span> (</span><span class='pt4'>!</span><span class='pt2'>this</span><span class='pt4'>.</span><span>isSome()) </span><span class='pt4'>throw</span><span> </span><span class='pt4'>new</span><span> </span><span class='pt4'>Error</span><span>(</span><span class='pt3'>'Error unwrapping none'</span><span>);</span></td></tr>
<tr><td class='ln' data-ln='99'></td><td><span> </span><span class='pt4'>return</span><span> </span><span class='pt2'>this</span><span class='pt4'>.</span><span class='pt2'>value</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='100'></td><td><span> },</span></td></tr>
<tr><td class='ln' data-ln='101'></td><td> </td></tr>
<tr><td class='ln' data-ln='102'></td><td><span> </span><span class='pt2'>unwrapOr</span><span>(defaultValue) {</span></td></tr>
<tr><td class='ln' data-ln='103'></td><td><span> </span><span class='pt4'>return</span><span> (</span><span class='pt2'>this</span><span class='pt4'>.</span><span>isSome()) </span><span class='pt4'>?</span><span> </span><span class='pt2'>this</span><span class='pt4'>.</span><span class='pt2'>value</span><span> </span><span class='pt4'>:</span><span> </span><span class='pt2'>defaultValue</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='104'></td><td><span> },</span></td></tr>
<tr><td class='ln' data-ln='105'></td><td> </td></tr>
<tr><td class='ln' data-ln='106'></td><td><span> </span><span class='pt2'>unwrapOrElse</span><span>(fn) {</span></td></tr>
<tr><td class='ln' data-ln='107'></td><td><span> </span><span class='pt4'>return</span><span> (</span><span class='pt2'>this</span><span class='pt4'>.</span><span>isSome()) </span><span class='pt4'>?</span><span> </span><span class='pt2'>this</span><span class='pt4'>.</span><span class='pt2'>value</span><span> </span><span class='pt4'>:</span><span> fn();</span></td></tr>
<tr><td class='ln' data-ln='108'></td><td><span> },</span></td></tr>
<tr><td class='ln' data-ln='109'></td><td><span> });</span></td></tr>
<tr><td class='ln' data-ln='110'></td><td> </td></tr>
<tr><td class='ln' data-ln='111'></td><td><span> </span><span class='pt4'>return</span><span> </span><span class='pt2'>Option</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='112'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='113'></td><td> </td></tr>
<tr><td class='ln' data-ln='114'></td><td> </td></tr>
<tr><td class='ln' data-ln='115'></td><td><span class='pt1 bo'>const</span><span> </span><span class='pt2'>rust</span><span> = {</span></td></tr>
<tr><td class='ln' data-ln='116'></td><td><span> </span><span class='pt3'>tuple</span><span class='pt7'>:</span><span> </span><span class='pt2'>RustTuple</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='117'></td><td><span> </span><span class='pt2'>Tuple</span><span>: (type, values) </span><span class='pt1 bo'>=></span><span> new (RustTuple(</span><span class='pt4'>...</span><span class='pt2'>type</span><span>))([</span><span class='pt4'>...</span><span class='pt2'>values</span><span>]),</span></td></tr>
<tr><td class='ln' data-ln='118'></td><td> </td></tr>
<tr><td class='ln' data-ln='119'></td><td><span> </span><span class='pt3'>vector</span><span class='pt7'>:</span><span> </span><span class='pt2'>RustVector</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='120'></td><td><span> </span><span class='pt2'>Vector</span><span>: (type, values) </span><span class='pt1 bo'>=></span><span> new (RustVector(</span><span class='pt2'>type</span><span>))({ </span><span class='pt2'>values</span><span> }),</span></td></tr>
<tr><td class='ln' data-ln='121'></td><td> </td></tr>
<tr><td class='ln' data-ln='122'></td><td><span> </span><span class='pt3'>option</span><span class='pt7'>:</span><span> </span><span class='pt2'>RustOption</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='123'></td><td><span> </span><span class='pt2'>Option</span><span>: (type, value, </span><span class='pt4'>...</span><span>opts) </span><span class='pt1 bo'>=></span><span> new (RustOption(</span><span class='pt2'>type</span><span>, </span><span class='pt4'>...</span><span class='pt2'>opts</span><span>))({</span></td></tr>
<tr><td class='ln' data-ln='124'></td><td><span> </span><span class='pt2'>value</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='125'></td><td><span> </span><span class='pt3'>discriminant</span><span class='pt7'>:</span><span> (</span><span class='pt4'>typeof</span><span> </span><span class='pt2'>value</span><span> </span><span class='pt4'>===</span><span> </span><span class='pt3'>'undefined'</span><span>) </span><span class='pt4'>?</span><span> </span><span class='pt10'>0</span><span> </span><span class='pt4'>:</span><span> </span><span class='pt10'>1</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='126'></td><td><span> }),</span></td></tr>
<tr><td class='ln' data-ln='127'></td><td> </td></tr>
<tr><td class='ln' data-ln='128'></td><td><span> </span><span class='pt2'>Some</span><span>: (</span><span class='pt4'>...</span><span>args) </span><span class='pt1 bo'>=></span><span> </span><span class='pt2'>rust</span><span class='pt4'>.</span><span>Option(</span><span class='pt4'>...</span><span class='pt2'>args</span><span>),</span></td></tr>
<tr><td class='ln' data-ln='129'></td><td><span> </span><span class='pt2'>None</span><span>: (type, </span><span class='pt4'>...</span><span>opts) </span><span class='pt1 bo'>=></span><span> </span><span class='pt2'>rust</span><span class='pt4'>.</span><span>Option(</span><span class='pt2'>type</span><span>, </span><span class='pt6'>undefined</span><span>, </span><span class='pt4'>...</span><span class='pt2'>opts</span><span>),</span></td></tr>
<tr><td class='ln' data-ln='130'></td><td><span>};</span></td></tr>
<tr><td class='ln' data-ln='131'></td><td> </td></tr>
<tr><td class='ln' data-ln='132'></td><td><span class='pt4'>export</span><span> </span><span class='pt4'>default</span><span> </span><span class='pt2'>rust</span><span>;</span></td></tr>
</table>
</div>
</div>
</div>
<div class='style' id='P--wombat--js'>
<div class='P--wombat-bordered'>
<div class="info header">
<span class="left">rust_types.js</span>
<span class="right"><span>132 lines</span><span>2.75 KB</span></span>
</div>
<div class='P--wombat'>
<table>
<tr><td class='ln' data-ln='1'></td><td><span class='pt23'>import</span><span> Struct </span><span class='pt23'>from</span><span> </span><span class='pt15'>'./Struct'</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='2'></td><td><span class='pt23'>import</span><span> { types, parseType, Pointer } </span><span class='pt23'>from</span><span> </span><span class='pt15'>'./types'</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='3'></td><td><span class='pt23'>import</span><span> { assert, vslice } </span><span class='pt23'>from</span><span> </span><span class='pt15'>'./misc'</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='4'></td><td> </td></tr>
<tr><td class='ln' data-ln='5'></td><td> </td></tr>
<tr><td class='ln' data-ln='6'></td><td><span class='pt13 it'>const</span><span> DATA = </span><span class='pt25'>(</span><span class='pt23'>typeof</span><span> </span><span class='pt13 it'>Symbol</span><span> </span><span class='pt23'>!==</span><span> </span><span class='pt15'>'undefined'</span><span class='pt25'>)</span></td></tr>
<tr><td class='ln' data-ln='7'></td><td><span> </span><span class='pt23'>?</span><span> </span><span class='pt13 it'>Symbol</span><span>.</span><span class='pt19'>for</span><span class='pt25'>(</span><span class='pt15'>'struct-data'</span><span class='pt25'>)</span></td></tr>
<tr><td class='ln' data-ln='8'></td><td><span> </span><span class='pt23'>:</span><span> </span><span class='pt15'>'__data'</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='9'></td><td> </td></tr>
<tr><td class='ln' data-ln='10'></td><td> </td></tr>
<tr><td class='ln' data-ln='11'></td><td class='hi'><span class='pt13 it'>function</span><span class='pt19'> extend</span><span class='pt25'>(</span><span class='pt24 it'>StructType</span><span class='pt25'>)</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='12'></td><td class='hi'><span> </span><span class='pt13 it'>class</span><span> </span><span class='pt19'>RustType</span><span> </span><span class='pt13 it'>extends</span><span> StructType {</span></td></tr>
<tr><td class='ln' data-ln='13'></td><td class='hi'><span> </span><span class='pt19'>free</span><span class='pt25'>()</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='14'></td><td class='hi'><span> </span><span class='pt24'>super</span><span>.</span><span class='pt19'>free</span><span class='pt25'>(</span><span class='pt17'>true</span><span class='pt25'>)</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='15'></td><td class='hi'><span> }</span></td></tr>
<tr><td class='ln' data-ln='16'></td><td class='hi'><span> }</span></td></tr>
<tr><td class='ln' data-ln='17'></td><td class='hi'> </td></tr>
<tr><td class='ln' data-ln='18'></td><td class='hi'><span> </span><span class='pt13 it'>Object</span><span>.</span><span class='pt19'>assign</span><span class='pt25'>(</span><span>RustType, StructType</span><span class='pt25'>)</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='19'></td><td class='hi'><span> </span><span class='pt23'>return</span><span> RustType;</span></td></tr>
<tr><td class='ln' data-ln='20'></td><td class='hi'><span>}</span></td></tr>
<tr><td class='ln' data-ln='21'></td><td> </td></tr>
<tr><td class='ln' data-ln='22'></td><td> </td></tr>
<tr><td class='ln' data-ln='23'></td><td><span class='pt13 it'>function</span><span class='pt19'> RustTuple</span><span class='pt25'>(</span><span class='pt23'>...</span><span class='pt24 it'>tupleTypes</span><span class='pt25'>)</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='24'></td><td><span> </span><span class='pt13 it'>const</span><span> fields = {};</span></td></tr>
<tr><td class='ln' data-ln='25'></td><td> </td></tr>
<tr><td class='ln' data-ln='26'></td><td><span> tupleTypes.</span><span class='pt19'>forEach</span><span class='pt25'>((</span><span class='pt24 it'>type</span><span>, </span><span class='pt24 it'>i</span><span class='pt25'>)</span><span> </span><span class='pt13 it'>=></span><span> {</span></td></tr>
<tr><td class='ln' data-ln='27'></td><td><span> fields[i] = </span><span class='pt19'>parseType</span><span class='pt25'>(</span><span>type</span><span class='pt25'>)</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='28'></td><td><span> }</span><span class='pt25'>)</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='29'></td><td> </td></tr>
<tr><td class='ln' data-ln='30'></td><td><span> </span><span class='pt23'>return</span><span> </span><span class='pt23'>new</span><span> </span><span class='pt19'>Struct</span><span class='pt25'>(</span><span>fields</span><span class='pt25'>)</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='31'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='32'></td><td> </td></tr>
<tr><td class='ln' data-ln='33'></td><td> </td></tr>
<tr><td class='ln' data-ln='34'></td><td><span class='pt13 it'>function</span><span class='pt19'> RustVector</span><span class='pt25'>(</span><span class='pt24 it'>typedef</span><span class='pt25'>)</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='35'></td><td><span> </span><span class='pt13 it'>const</span><span> type = </span><span class='pt19'>parseType</span><span class='pt25'>(</span><span>typedef</span><span class='pt25'>)</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='36'></td><td> </td></tr>
<tr><td class='ln' data-ln='37'></td><td><span> </span><span class='pt13 it'>const</span><span> Vector = </span><span class='pt19'>extend</span><span class='pt25'>(</span><span class='pt23'>new</span><span> </span><span class='pt19'>Struct</span><span class='pt25'>(</span><span>{</span></td></tr>
<tr><td class='ln' data-ln='38'></td><td><span> </span><span class='pt15'>ptr</span><span class='pt17'>:</span><span> types.</span><span class='pt19'>pointer</span><span class='pt25'>(</span><span>type</span><span class='pt25'>)</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='39'></td><td><span> </span><span class='pt15'>cap</span><span class='pt17'>:</span><span> </span><span class='pt15'>'usize'</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='40'></td><td><span> </span><span class='pt15'>len</span><span class='pt17'>:</span><span> </span><span class='pt15'>'usize'</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='41'></td><td><span> </span><span class='pt16 it'>/* values */</span></td></tr>
<tr><td class='ln' data-ln='42'></td><td><span> }</span><span class='pt25'>))</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='43'></td><td> </td></tr>
<tr><td class='ln' data-ln='44'></td><td><span> </span><span class='pt13 it'>Object</span><span>.</span><span class='pt19'>defineProperty</span><span class='pt25'>(</span><span class='pt19'>Vector</span><span>.</span><span class='pt24'>prototype</span><span>, </span><span class='pt15'>'values'</span><span>, {</span></td></tr>
<tr><td class='ln' data-ln='45'></td><td><span> </span><span class='pt15'>enumerable</span><span class='pt17'>:</span><span> </span><span class='pt17'>true</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='46'></td><td> </td></tr>
<tr><td class='ln' data-ln='47'></td><td><span> </span><span class='pt19'>get</span><span class='pt25'>()</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='48'></td><td><span> </span><span class='pt13 it'>const</span><span> arrayType = </span><span class='pt19'>parseType</span><span class='pt25'>(</span><span>[type, </span><span class='pt24'>this</span><span>.len]</span><span class='pt25'>)</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='49'></td><td><span> </span><span class='pt13 it'>const</span><span> memory = </span><span class='pt24'>this</span><span>[DATA].view.buffer;</span></td></tr>
<tr><td class='ln' data-ln='50'></td><td><span> </span><span class='pt13 it'>const</span><span> view = </span><span class='pt23'>new</span><span> </span><span class='pt13 it'>DataView</span><span class='pt25'>(</span><span>memory, </span><span class='pt24'>this</span><span>.ptr.</span><span class='pt19'>ref</span><span>(), arrayType.width</span><span class='pt25'>)</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='51'></td><td> </td></tr>
<tr><td class='ln' data-ln='52'></td><td><span> </span><span class='pt23'>return</span><span> arrayType.</span><span class='pt19'>read</span><span class='pt25'>(</span><span>view, </span><span class='pt24'>this</span><span>[DATA].free</span><span class='pt25'>)</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='53'></td><td><span> },</span></td></tr>
<tr><td class='ln' data-ln='54'></td><td> </td></tr>
<tr><td class='ln' data-ln='55'></td><td><span> </span><span class='pt19'>set</span><span class='pt25'>(</span><span class='pt24 it'>values</span><span class='pt25'>)</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='56'></td><td><span> </span><span class='pt13 it'>const</span><span> len = values.length;</span></td></tr>
<tr><td class='ln' data-ln='57'></td><td> </td></tr>
<tr><td class='ln' data-ln='58'></td><td><span> </span><span class='pt24'>this</span><span>.ptr = </span><span class='pt23'>new</span><span> </span><span class='pt19'>Pointer</span><span class='pt25'>(</span><span>[type, len], values</span><span class='pt25'>)</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='59'></td><td><span> </span><span class='pt24'>this</span><span>.len = len;</span></td></tr>
<tr><td class='ln' data-ln='60'></td><td><span> </span><span class='pt24'>this</span><span>.cap = len;</span></td></tr>
<tr><td class='ln' data-ln='61'></td><td><span> },</span></td></tr>
<tr><td class='ln' data-ln='62'></td><td><span> }</span><span class='pt25'>)</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='63'></td><td> </td></tr>
<tr><td class='ln' data-ln='64'></td><td><span> </span><span class='pt23'>return</span><span> Vector;</span></td></tr>
<tr><td class='ln' data-ln='65'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='66'></td><td> </td></tr>
<tr><td class='ln' data-ln='67'></td><td> </td></tr>
<tr><td class='ln' data-ln='68'></td><td><span class='pt13 it'>function</span><span class='pt19'> RustOption</span><span class='pt25'>(</span><span class='pt24 it'>typedef</span><span class='pt19'>, </span><span class='pt24 it'>isNonNullable</span><span class='pt19'> </span><span class='pt23'>=</span><span class='pt19'> </span><span class='pt17'>false</span><span class='pt19'>, </span><span class='pt24 it'>tagSize</span><span class='pt25'>)</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='69'></td><td><span> </span><span class='pt13 it'>const</span><span> type = </span><span class='pt19'>parseType</span><span class='pt25'>(</span><span>typedef</span><span class='pt25'>)</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='70'></td><td><span> </span><span class='pt13 it'>let</span><span> discriminant;</span></td></tr>
<tr><td class='ln' data-ln='71'></td><td> </td></tr>
<tr><td class='ln' data-ln='72'></td><td><span> </span><span class='pt23'>if</span><span> </span><span class='pt25'>(</span><span>tagSize</span><span class='pt25'>)</span><span> discriminant = types[</span><span class='pt23'>`</span><span class='pt15'>uint</span><span class='pt23'>${</span><span>tagSize </span><span class='pt23'>*</span><span> </span><span class='pt24'>8</span><span class='pt23'>}`</span><span>];</span></td></tr>
<tr><td class='ln' data-ln='73'></td><td><span> </span><span class='pt23'>else</span><span> </span><span class='pt23'>if</span><span> </span><span class='pt25'>(</span><span>type.alignment </span><span class='pt23'>===</span><span> </span><span class='pt24'>1</span><span class='pt25'>)</span><span> discriminant = </span><span class='pt15'>'uint8'</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='74'></td><td><span> </span><span class='pt23'>else</span><span> </span><span class='pt23'>if</span><span> </span><span class='pt25'>(</span><span>type.alignment </span><span class='pt23'>===</span><span> </span><span class='pt24'>2</span><span class='pt25'>)</span><span> discriminant = </span><span class='pt15'>'uint16'</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='75'></td><td><span> </span><span class='pt23'>else</span><span> discriminant = </span><span class='pt15'>'uint32'</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='76'></td><td> </td></tr>
<tr><td class='ln' data-ln='77'></td><td><span> </span><span class='pt13 it'>const</span><span> fields = </span><span class='pt25'>(</span><span>isNonNullable</span><span class='pt25'>)</span></td></tr>
<tr><td class='ln' data-ln='78'></td><td><span> </span><span class='pt23'>?</span><span> { </span><span class='pt15'>value</span><span class='pt17'>:</span><span> type }</span></td></tr>
<tr><td class='ln' data-ln='79'></td><td><span> </span><span class='pt23'>:</span><span> { discriminant, </span><span class='pt15'>value</span><span class='pt17'>:</span><span> type };</span></td></tr>
<tr><td class='ln' data-ln='80'></td><td> </td></tr>
<tr><td class='ln' data-ln='81'></td><td><span> </span><span class='pt13 it'>const</span><span> Option = </span><span class='pt23'>new</span><span> </span><span class='pt19'>Struct</span><span class='pt25'>(</span><span>fields</span><span class='pt25'>)</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='82'></td><td> </td></tr>
<tr><td class='ln' data-ln='83'></td><td><span> </span><span class='pt13 it'>Object</span><span>.</span><span class='pt19'>assign</span><span class='pt25'>(</span><span class='pt19'>Option</span><span>.</span><span class='pt24'>prototype</span><span>, {</span></td></tr>
<tr><td class='ln' data-ln='84'></td><td><span> </span><span class='pt19'>isSome</span><span class='pt25'>()</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='85'></td><td><span> </span><span class='pt23'>return</span><span> </span><span class='pt25'>(</span><span class='pt15'>'discriminant'</span><span> </span><span class='pt23'>in</span><span> fields</span><span class='pt25'>)</span><span> </span><span class='pt23'>?</span><span> !!</span><span class='pt24'>this</span><span>.discriminant </span><span class='pt23'>:</span><span> !!</span><span class='pt24'>this</span><span>.value;</span></td></tr>
<tr><td class='ln' data-ln='86'></td><td><span> },</span></td></tr>
<tr><td class='ln' data-ln='87'></td><td> </td></tr>
<tr><td class='ln' data-ln='88'></td><td><span> </span><span class='pt19'>isNone</span><span class='pt25'>()</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='89'></td><td><span> </span><span class='pt23'>return</span><span> !</span><span class='pt24'>this</span><span>.</span><span class='pt19'>isSome</span><span>();</span></td></tr>
<tr><td class='ln' data-ln='90'></td><td><span> },</span></td></tr>
<tr><td class='ln' data-ln='91'></td><td> </td></tr>
<tr><td class='ln' data-ln='92'></td><td><span> </span><span class='pt19'>expect</span><span class='pt25'>(</span><span class='pt24 it'>msg</span><span class='pt25'>)</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='93'></td><td><span> </span><span class='pt23'>if</span><span> </span><span class='pt25'>(</span><span class='pt23'>!</span><span class='pt24'>this</span><span>.</span><span class='pt19'>isSome</span><span>()</span><span class='pt25'>)</span><span> </span><span class='pt23'>throw</span><span> </span><span class='pt23'>new</span><span> </span><span class='pt13 it'>Error</span><span class='pt25'>(</span><span>msg</span><span class='pt25'>)</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='94'></td><td><span> </span><span class='pt23'>return</span><span> </span><span class='pt24'>this</span><span>.value;</span></td></tr>
<tr><td class='ln' data-ln='95'></td><td><span> },</span></td></tr>
<tr><td class='ln' data-ln='96'></td><td> </td></tr>
<tr><td class='ln' data-ln='97'></td><td><span> </span><span class='pt19'>unwrap</span><span class='pt25'>()</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='98'></td><td><span> </span><span class='pt23'>if</span><span> </span><span class='pt25'>(</span><span class='pt23'>!</span><span class='pt24'>this</span><span>.</span><span class='pt19'>isSome</span><span>()</span><span class='pt25'>)</span><span> </span><span class='pt23'>throw</span><span> </span><span class='pt23'>new</span><span> </span><span class='pt13 it'>Error</span><span class='pt25'>(</span><span class='pt15'>'Error unwrapping none'</span><span class='pt25'>)</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='99'></td><td><span> </span><span class='pt23'>return</span><span> </span><span class='pt24'>this</span><span>.value;</span></td></tr>
<tr><td class='ln' data-ln='100'></td><td><span> },</span></td></tr>
<tr><td class='ln' data-ln='101'></td><td> </td></tr>
<tr><td class='ln' data-ln='102'></td><td><span> </span><span class='pt19'>unwrapOr</span><span class='pt25'>(</span><span class='pt24 it'>defaultValue</span><span class='pt25'>)</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='103'></td><td><span> </span><span class='pt23'>return</span><span> </span><span class='pt25'>(</span><span class='pt24'>this</span><span>.</span><span class='pt19'>isSome</span><span>()</span><span class='pt25'>)</span><span> </span><span class='pt23'>?</span><span> </span><span class='pt24'>this</span><span>.value </span><span class='pt23'>:</span><span> defaultValue;</span></td></tr>
<tr><td class='ln' data-ln='104'></td><td><span> },</span></td></tr>
<tr><td class='ln' data-ln='105'></td><td> </td></tr>
<tr><td class='ln' data-ln='106'></td><td><span> </span><span class='pt19'>unwrapOrElse</span><span class='pt25'>(</span><span class='pt24 it'>fn</span><span class='pt25'>)</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='107'></td><td><span> </span><span class='pt23'>return</span><span> </span><span class='pt25'>(</span><span class='pt24'>this</span><span>.</span><span class='pt19'>isSome</span><span>()</span><span class='pt25'>)</span><span> </span><span class='pt23'>?</span><span> </span><span class='pt24'>this</span><span>.value </span><span class='pt23'>:</span><span> </span><span class='pt19'>fn</span><span>();</span></td></tr>
<tr><td class='ln' data-ln='108'></td><td><span> },</span></td></tr>
<tr><td class='ln' data-ln='109'></td><td><span> }</span><span class='pt25'>)</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='110'></td><td> </td></tr>
<tr><td class='ln' data-ln='111'></td><td><span> </span><span class='pt23'>return</span><span> Option;</span></td></tr>
<tr><td class='ln' data-ln='112'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='113'></td><td> </td></tr>
<tr><td class='ln' data-ln='114'></td><td> </td></tr>
<tr><td class='ln' data-ln='115'></td><td><span class='pt13 it'>const</span><span> rust = {</span></td></tr>
<tr><td class='ln' data-ln='116'></td><td><span> </span><span class='pt15'>tuple</span><span class='pt17'>:</span><span> RustTuple,</span></td></tr>
<tr><td class='ln' data-ln='117'></td><td><span> </span><span class='pt19'>Tuple</span><span>: </span><span class='pt25'>(</span><span class='pt24 it'>type</span><span>, </span><span class='pt24 it'>values</span><span class='pt25'>)</span><span> </span><span class='pt13 it'>=></span><span> </span><span class='pt19'>new</span><span> </span><span class='pt25'>(</span><span class='pt19'>RustTuple</span><span class='pt25'>(</span><span class='pt23'>...</span><span>type</span><span class='pt25'>))(</span><span>[</span><span class='pt23'>...</span><span>values]</span><span class='pt25'>)</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='118'></td><td> </td></tr>
<tr><td class='ln' data-ln='119'></td><td><span> </span><span class='pt15'>vector</span><span class='pt17'>:</span><span> RustVector,</span></td></tr>
<tr><td class='ln' data-ln='120'></td><td><span> </span><span class='pt19'>Vector</span><span>: </span><span class='pt25'>(</span><span class='pt24 it'>type</span><span>, </span><span class='pt24 it'>values</span><span class='pt25'>)</span><span> </span><span class='pt13 it'>=></span><span> </span><span class='pt19'>new</span><span> </span><span class='pt25'>(</span><span class='pt19'>RustVector</span><span class='pt25'>(</span><span>type</span><span class='pt25'>))(</span><span>{ values }</span><span class='pt25'>)</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='121'></td><td> </td></tr>
<tr><td class='ln' data-ln='122'></td><td><span> </span><span class='pt15'>option</span><span class='pt17'>:</span><span> RustOption,</span></td></tr>
<tr><td class='ln' data-ln='123'></td><td><span> </span><span class='pt19'>Option</span><span>: </span><span class='pt25'>(</span><span class='pt24 it'>type</span><span>, </span><span class='pt24 it'>value</span><span>, </span><span class='pt23'>...</span><span class='pt24 it'>opts</span><span class='pt25'>)</span><span> </span><span class='pt13 it'>=></span><span> </span><span class='pt19'>new</span><span> </span><span class='pt25'>(</span><span class='pt19'>RustOption</span><span class='pt25'>(</span><span>type, </span><span class='pt23'>...</span><span>opts</span><span class='pt25'>))(</span><span>{</span></td></tr>
<tr><td class='ln' data-ln='124'></td><td><span> value,</span></td></tr>
<tr><td class='ln' data-ln='125'></td><td><span> </span><span class='pt15'>discriminant</span><span class='pt17'>:</span><span> </span><span class='pt25'>(</span><span class='pt23'>typeof</span><span> value </span><span class='pt23'>===</span><span> </span><span class='pt15'>'undefined'</span><span class='pt25'>)</span><span> </span><span class='pt23'>?</span><span> </span><span class='pt24'>0</span><span> </span><span class='pt23'>:</span><span> </span><span class='pt24'>1</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='126'></td><td><span> }</span><span class='pt25'>)</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='127'></td><td> </td></tr>
<tr><td class='ln' data-ln='128'></td><td><span> </span><span class='pt19'>Some</span><span>: </span><span class='pt25'>(</span><span class='pt23'>...</span><span class='pt24 it'>args</span><span class='pt25'>)</span><span> </span><span class='pt13 it'>=></span><span> rust.</span><span class='pt19'>Option</span><span class='pt25'>(</span><span class='pt23'>...</span><span>args</span><span class='pt25'>)</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='129'></td><td><span> </span><span class='pt19'>None</span><span>: </span><span class='pt25'>(</span><span class='pt24 it'>type</span><span>, </span><span class='pt23'>...</span><span class='pt24 it'>opts</span><span class='pt25'>)</span><span> </span><span class='pt13 it'>=></span><span> rust.</span><span class='pt19'>Option</span><span class='pt25'>(</span><span>type, </span><span class='pt17'>undefined</span><span>, </span><span class='pt23'>...</span><span>opts</span><span class='pt25'>)</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='130'></td><td><span>};</span></td></tr>
<tr><td class='ln' data-ln='131'></td><td> </td></tr>
<tr><td class='ln' data-ln='132'></td><td><span class='pt23'>export</span><span> </span><span class='pt23'>default</span><span> rust;</span></td></tr>
</table>
</div>
</div>
</div>
<div class='style' id='P--atom_dark--jsx'>
<div class='P--atom_dark-bordered'>
<div class="info header">
<span class="left">app.jsx</span>
<span class="right"><span>36 lines</span><span>701.00 B</span></span>
</div>
<div class='P--atom_dark'>
<table>
<tr><td class='ln' data-ln='1'></td><td class='hi'><span class='pt4'>import</span><span> </span><span class='pt16'>React</span><span> </span><span class='pt4'>from</span><span> </span><span class='pt9'>'react'</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='2'></td><td><span class='pt4'>import</span><span> </span><span class='pt16'>Display</span><span> </span><span class='pt4'>from</span><span> </span><span class='pt9'>'./Display'</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='3'></td><td><span class='pt4'>import</span><span> </span><span class='pt16'>ButtonPanel</span><span> </span><span class='pt4'>from</span><span> </span><span class='pt9'>'./ButtonPanel'</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='4'></td><td><span class='pt4'>import</span><span> </span><span class='pt16'>calculate</span><span> </span><span class='pt4'>from</span><span> </span><span class='pt9'>'../logic/calculate'</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='5'></td><td><span class='pt4'>import</span><span> </span><span class='pt9'>'./App.css'</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='6'></td><td> </td></tr>
<tr><td class='ln' data-ln='7'></td><td><span class='pt2 it'>class</span><span> </span><span class='pt28 un'>App</span><span> </span><span class='pt2 it'>extends</span><span> </span><span class='pt16'>React</span><span>.</span><span class='pt16'>Component</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='8'></td><td><span> </span><span class='pt25'>constructor</span><span>(</span><span class='pt13 it'>props</span><span>) {</span></td></tr>
<tr><td class='ln' data-ln='9'></td><td><span> </span><span class='pt16'>super</span><span>(</span><span class='pt16'>props</span><span>);</span></td></tr>
<tr><td class='ln' data-ln='10'></td><td> </td></tr>
<tr><td class='ln' data-ln='11'></td><td><span> </span><span class='pt16'>this</span><span>.</span><span class='pt16'>state</span><span> = {</span></td></tr>
<tr><td class='ln' data-ln='12'></td><td><span> </span><span class='pt9'>total</span><span class='pt5'>:</span><span> </span><span class='pt12'>null</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='13'></td><td><span> </span><span class='pt9'>next</span><span class='pt5'>:</span><span> </span><span class='pt12'>null</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='14'></td><td><span> </span><span class='pt9'>operation</span><span class='pt5'>:</span><span> </span><span class='pt12'>null</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='15'></td><td><span> };</span></td></tr>
<tr><td class='ln' data-ln='16'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='17'></td><td> </td></tr>
<tr><td class='ln' data-ln='18'></td><td><span> </span><span class='pt16'>handleClick</span><span> = (</span><span class='pt13 it'>buttonName</span><span>) </span><span class='pt2 it'>=></span><span> {</span></td></tr>
<tr><td class='ln' data-ln='19'></td><td><span> </span><span class='pt16'>this</span><span>.</span><span class='pt16'>setState</span><span>(</span><span class='pt16'>calculate</span><span>(</span><span class='pt16'>this</span><span>.</span><span class='pt16'>state</span><span>, </span><span class='pt16'>buttonName</span><span>));</span></td></tr>
<tr><td class='ln' data-ln='20'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='21'></td><td> </td></tr>
<tr><td class='ln' data-ln='22'></td><td class='hi'><span> </span><span class='pt25'>render</span><span>() {</span></td></tr>
<tr><td class='ln' data-ln='23'></td><td class='hi'><span> </span><span class='pt4'>return</span><span> (</span></td></tr>
<tr><td class='ln' data-ln='24'></td><td class='hi'><span> <</span><span class='pt23'>div</span><span> </span><span class='pt11'>className</span><span class='pt4'>=</span><span class='pt9'>"component-app"</span><span>></span></td></tr>
<tr><td class='ln' data-ln='25'></td><td class='hi'><span> <</span><span class='pt23'>Display</span></td></tr>
<tr><td class='ln' data-ln='26'></td><td class='hi'><span> </span><span class='pt11'>value</span><span class='pt4'>=</span><span>{</span><span class='pt16'>this</span><span>.</span><span class='pt16'>state</span><span>.</span><span class='pt16'>next</span><span> </span><span class='pt4'>||</span><span> </span><span class='pt16'>this</span><span>.</span><span class='pt16'>state</span><span>.</span><span class='pt16'>total</span><span> </span><span class='pt4'>||</span><span> </span><span class='pt9'>'0'</span><span>}</span></td></tr>
<tr><td class='ln' data-ln='27'></td><td class='hi'><span> /></span></td></tr>
<tr><td class='ln' data-ln='28'></td><td class='hi'><span> <</span><span class='pt23'>ButtonPanel</span></td></tr>
<tr><td class='ln' data-ln='29'></td><td class='hi'><span> </span><span class='pt11'>clickHandler</span><span class='pt4'>=</span><span>{</span><span class='pt16'>this</span><span>.</span><span class='pt16'>handleClick</span><span>}</span></td></tr>
<tr><td class='ln' data-ln='30'></td><td class='hi'><span> /></span></td></tr>
<tr><td class='ln' data-ln='31'></td><td class='hi'><span> </</span><span class='pt23'>div</span><span>></span></td></tr>
<tr><td class='ln' data-ln='32'></td><td class='hi'><span> );</span></td></tr>
<tr><td class='ln' data-ln='33'></td><td class='hi'><span> }</span></td></tr>
<tr><td class='ln' data-ln='34'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='35'></td><td> </td></tr>
<tr><td class='ln' data-ln='36'></td><td><span class='pt4'>export</span><span> </span><span class='pt4'>default</span><span> </span><span class='pt16'>App</span><span>;</span></td></tr>
</table>
</div>
</div>
</div>
<div class='style' id='P--ayu_dark--jsx'>
<div class='P--ayu_dark-bordered'>
<div class="info header">
<span class="left">app.jsx</span>
<span class="right"><span>36 lines</span><span>701.00 B</span></span>
</div>
<div class='P--ayu_dark'>
<table>
<tr><td class='ln' data-ln='1'></td><td class='hi'><span class='pt18'>import</span><span> React </span><span class='pt18'>from</span><span> </span><span class='pt13'>'react'</span><span class='pt25'>;</span></td></tr>
<tr><td class='ln' data-ln='2'></td><td><span class='pt18'>import</span><span> Display </span><span class='pt18'>from</span><span> </span><span class='pt13'>'./Display'</span><span class='pt25'>;</span></td></tr>
<tr><td class='ln' data-ln='3'></td><td><span class='pt18'>import</span><span> ButtonPanel </span><span class='pt18'>from</span><span> </span><span class='pt13'>'./ButtonPanel'</span><span class='pt25'>;</span></td></tr>
<tr><td class='ln' data-ln='4'></td><td><span class='pt18'>import</span><span> calculate </span><span class='pt18'>from</span><span> </span><span class='pt13'>'../logic/calculate'</span><span class='pt25'>;</span></td></tr>
<tr><td class='ln' data-ln='5'></td><td><span class='pt18'>import</span><span> </span><span class='pt13'>'./App.css'</span><span class='pt25'>;</span></td></tr>
<tr><td class='ln' data-ln='6'></td><td> </td></tr>
<tr><td class='ln' data-ln='7'></td><td><span class='pt21'>class</span><span> </span><span class='pt9'>App</span><span> </span><span class='pt21'>extends</span><span> React.</span><span class='pt12'>Component</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='8'></td><td><span> </span><span class='pt22'>constructor</span><span>(</span><span class='pt23'>props</span><span>) {</span></td></tr>
<tr><td class='ln' data-ln='9'></td><td><span> </span><span class='pt8 it'>super</span><span>(props)</span><span class='pt25'>;</span></td></tr>
<tr><td class='ln' data-ln='10'></td><td> </td></tr>
<tr><td class='ln' data-ln='11'></td><td><span> </span><span class='pt8 it'>this</span><span>.state = {</span></td></tr>
<tr><td class='ln' data-ln='12'></td><td><span> </span><span class='pt13'>total</span><span class='pt25'>:</span><span> </span><span class='pt23'>null</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='13'></td><td><span> </span><span class='pt13'>next</span><span class='pt25'>:</span><span> </span><span class='pt23'>null</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='14'></td><td><span> </span><span class='pt13'>operation</span><span class='pt25'>:</span><span> </span><span class='pt23'>null</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='15'></td><td><span> }</span><span class='pt25'>;</span></td></tr>
<tr><td class='ln' data-ln='16'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='17'></td><td> </td></tr>
<tr><td class='ln' data-ln='18'></td><td><span> handleClick = (</span><span class='pt23'>buttonName</span><span>) </span><span class='pt21'>=></span><span> {</span></td></tr>
<tr><td class='ln' data-ln='19'></td><td><span> </span><span class='pt8 it'>this</span><span>.</span><span class='pt22'>setState</span><span>(</span><span class='pt22'>calculate</span><span>(</span><span class='pt8 it'>this</span><span>.state, buttonName))</span><span class='pt25'>;</span></td></tr>
<tr><td class='ln' data-ln='20'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='21'></td><td> </td></tr>
<tr><td class='ln' data-ln='22'></td><td class='hi'><span> </span><span class='pt22'>render</span><span>() {</span></td></tr>
<tr><td class='ln' data-ln='23'></td><td class='hi'><span> </span><span class='pt21'>return</span><span> (</span></td></tr>
<tr><td class='ln' data-ln='24'></td><td class='hi'><span> </span><span class='pt26'><</span><span class='pt9'>div</span><span> </span><span class='pt22'>className</span><span class='pt18'>=</span><span class='pt13'>"component-app"</span><span class='pt26'>></span></td></tr>
<tr><td class='ln' data-ln='25'></td><td class='hi'><span> </span><span class='pt26'><</span><span class='pt9'>Display</span></td></tr>
<tr><td class='ln' data-ln='26'></td><td class='hi'><span> </span><span class='pt22'>value</span><span class='pt18'>=</span><span>{</span><span class='pt8 it'>this</span><span>.state.next </span><span class='pt18'>||</span><span> </span><span class='pt8 it'>this</span><span>.state.total </span><span class='pt18'>||</span><span> </span><span class='pt13'>'0'</span><span>}</span></td></tr>
<tr><td class='ln' data-ln='27'></td><td class='hi'><span> </span><span class='pt26'>/></span></td></tr>
<tr><td class='ln' data-ln='28'></td><td class='hi'><span> </span><span class='pt26'><</span><span class='pt9'>ButtonPanel</span></td></tr>
<tr><td class='ln' data-ln='29'></td><td class='hi'><span> </span><span class='pt22'>clickHandler</span><span class='pt18'>=</span><span>{</span><span class='pt8 it'>this</span><span>.handleClick}</span></td></tr>
<tr><td class='ln' data-ln='30'></td><td class='hi'><span> </span><span class='pt26'>/></span></td></tr>
<tr><td class='ln' data-ln='31'></td><td class='hi'><span> </span><span class='pt26'></</span><span class='pt9'>div</span><span class='pt26'>></span></td></tr>
<tr><td class='ln' data-ln='32'></td><td class='hi'><span> )</span><span class='pt25'>;</span></td></tr>
<tr><td class='ln' data-ln='33'></td><td class='hi'><span> }</span></td></tr>
<tr><td class='ln' data-ln='34'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='35'></td><td> </td></tr>
<tr><td class='ln' data-ln='36'></td><td><span class='pt18'>export</span><span> </span><span class='pt21'>default</span><span> App</span><span class='pt25'>;</span></td></tr>
</table>
</div>
</div>
</div>
<div class='style' id='P--ayu_light--jsx'>
<div class='P--ayu_light-bordered'>
<div class="info header">
<span class="left">app.jsx</span>
<span class="right"><span>36 lines</span><span>701.00 B</span></span>
</div>
<div class='P--ayu_light'>
<table>
<tr><td class='ln' data-ln='1'></td><td class='hi'><span class='pt17'>import</span><span> React </span><span class='pt17'>from</span><span> </span><span class='pt10'>'react'</span><span class='pt26'>;</span></td></tr>
<tr><td class='ln' data-ln='2'></td><td><span class='pt17'>import</span><span> Display </span><span class='pt17'>from</span><span> </span><span class='pt10'>'./Display'</span><span class='pt26'>;</span></td></tr>
<tr><td class='ln' data-ln='3'></td><td><span class='pt17'>import</span><span> ButtonPanel </span><span class='pt17'>from</span><span> </span><span class='pt10'>'./ButtonPanel'</span><span class='pt26'>;</span></td></tr>
<tr><td class='ln' data-ln='4'></td><td><span class='pt17'>import</span><span> calculate </span><span class='pt17'>from</span><span> </span><span class='pt10'>'../logic/calculate'</span><span class='pt26'>;</span></td></tr>
<tr><td class='ln' data-ln='5'></td><td><span class='pt17'>import</span><span> </span><span class='pt10'>'./App.css'</span><span class='pt26'>;</span></td></tr>
<tr><td class='ln' data-ln='6'></td><td> </td></tr>
<tr><td class='ln' data-ln='7'></td><td><span class='pt21'>class</span><span> </span><span class='pt7'>App</span><span> </span><span class='pt21'>extends</span><span> React.</span><span class='pt10'>Component</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='8'></td><td><span> </span><span class='pt19'>constructor</span><span>(</span><span class='pt11'>props</span><span>) {</span></td></tr>
<tr><td class='ln' data-ln='9'></td><td><span> </span><span class='pt9 it'>super</span><span>(props)</span><span class='pt26'>;</span></td></tr>
<tr><td class='ln' data-ln='10'></td><td> </td></tr>
<tr><td class='ln' data-ln='11'></td><td><span> </span><span class='pt9 it'>this</span><span>.state = {</span></td></tr>
<tr><td class='ln' data-ln='12'></td><td><span> </span><span class='pt10'>total</span><span class='pt26'>:</span><span> </span><span class='pt22'>null</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='13'></td><td><span> </span><span class='pt10'>next</span><span class='pt26'>:</span><span> </span><span class='pt22'>null</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='14'></td><td><span> </span><span class='pt10'>operation</span><span class='pt26'>:</span><span> </span><span class='pt22'>null</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='15'></td><td><span> }</span><span class='pt26'>;</span></td></tr>
<tr><td class='ln' data-ln='16'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='17'></td><td> </td></tr>
<tr><td class='ln' data-ln='18'></td><td><span> handleClick = (</span><span class='pt11'>buttonName</span><span>) </span><span class='pt21'>=></span><span> {</span></td></tr>
<tr><td class='ln' data-ln='19'></td><td><span> </span><span class='pt9 it'>this</span><span>.</span><span class='pt19'>setState</span><span>(</span><span class='pt19'>calculate</span><span>(</span><span class='pt9 it'>this</span><span>.state, buttonName))</span><span class='pt26'>;</span></td></tr>
<tr><td class='ln' data-ln='20'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='21'></td><td> </td></tr>
<tr><td class='ln' data-ln='22'></td><td class='hi'><span> </span><span class='pt19'>render</span><span>() {</span></td></tr>
<tr><td class='ln' data-ln='23'></td><td class='hi'><span> </span><span class='pt21'>return</span><span> (</span></td></tr>
<tr><td class='ln' data-ln='24'></td><td class='hi'><span> </span><span class='pt25'><</span><span class='pt7'>div</span><span> </span><span class='pt19'>className</span><span class='pt17'>=</span><span class='pt10'>"component-app"</span><span class='pt25'>></span></td></tr>
<tr><td class='ln' data-ln='25'></td><td class='hi'><span> </span><span class='pt25'><</span><span class='pt7'>Display</span></td></tr>
<tr><td class='ln' data-ln='26'></td><td class='hi'><span> </span><span class='pt19'>value</span><span class='pt17'>=</span><span>{</span><span class='pt9 it'>this</span><span>.state.next </span><span class='pt17'>||</span><span> </span><span class='pt9 it'>this</span><span>.state.total </span><span class='pt17'>||</span><span> </span><span class='pt10'>'0'</span><span>}</span></td></tr>
<tr><td class='ln' data-ln='27'></td><td class='hi'><span> </span><span class='pt25'>/></span></td></tr>
<tr><td class='ln' data-ln='28'></td><td class='hi'><span> </span><span class='pt25'><</span><span class='pt7'>ButtonPanel</span></td></tr>
<tr><td class='ln' data-ln='29'></td><td class='hi'><span> </span><span class='pt19'>clickHandler</span><span class='pt17'>=</span><span>{</span><span class='pt9 it'>this</span><span>.handleClick}</span></td></tr>
<tr><td class='ln' data-ln='30'></td><td class='hi'><span> </span><span class='pt25'>/></span></td></tr>
<tr><td class='ln' data-ln='31'></td><td class='hi'><span> </span><span class='pt25'></</span><span class='pt7'>div</span><span class='pt25'>></span></td></tr>
<tr><td class='ln' data-ln='32'></td><td class='hi'><span> )</span><span class='pt26'>;</span></td></tr>
<tr><td class='ln' data-ln='33'></td><td class='hi'><span> }</span></td></tr>
<tr><td class='ln' data-ln='34'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='35'></td><td> </td></tr>
<tr><td class='ln' data-ln='36'></td><td><span class='pt17'>export</span><span> </span><span class='pt21'>default</span><span> App</span><span class='pt26'>;</span></td></tr>
</table>
</div>
</div>
</div>
<div class='style' id='P--ayu_mirage--jsx'>
<div class='P--ayu_mirage-bordered'>
<div class="info header">
<span class="left">app.jsx</span>
<span class="right"><span>36 lines</span><span>701.00 B</span></span>
</div>
<div class='P--ayu_mirage'>
<table>
<tr><td class='ln' data-ln='1'></td><td class='hi'><span class='pt17'>import</span><span> React </span><span class='pt17'>from</span><span> </span><span class='pt12'>'react'</span><span class='pt24'>;</span></td></tr>
<tr><td class='ln' data-ln='2'></td><td><span class='pt17'>import</span><span> Display </span><span class='pt17'>from</span><span> </span><span class='pt12'>'./Display'</span><span class='pt24'>;</span></td></tr>
<tr><td class='ln' data-ln='3'></td><td><span class='pt17'>import</span><span> ButtonPanel </span><span class='pt17'>from</span><span> </span><span class='pt12'>'./ButtonPanel'</span><span class='pt24'>;</span></td></tr>
<tr><td class='ln' data-ln='4'></td><td><span class='pt17'>import</span><span> calculate </span><span class='pt17'>from</span><span> </span><span class='pt12'>'../logic/calculate'</span><span class='pt24'>;</span></td></tr>
<tr><td class='ln' data-ln='5'></td><td><span class='pt17'>import</span><span> </span><span class='pt12'>'./App.css'</span><span class='pt24'>;</span></td></tr>
<tr><td class='ln' data-ln='6'></td><td> </td></tr>
<tr><td class='ln' data-ln='7'></td><td><span class='pt19'>class</span><span> </span><span class='pt10'>App</span><span> </span><span class='pt19'>extends</span><span> React.</span><span class='pt12'>Component</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='8'></td><td><span> </span><span class='pt22'>constructor</span><span>(</span><span class='pt14'>props</span><span>) {</span></td></tr>
<tr><td class='ln' data-ln='9'></td><td><span> </span><span class='pt9 it'>super</span><span>(props)</span><span class='pt24'>;</span></td></tr>
<tr><td class='ln' data-ln='10'></td><td> </td></tr>
<tr><td class='ln' data-ln='11'></td><td><span> </span><span class='pt9 it'>this</span><span>.state = {</span></td></tr>
<tr><td class='ln' data-ln='12'></td><td><span> </span><span class='pt12'>total</span><span class='pt24'>:</span><span> </span><span class='pt14'>null</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='13'></td><td><span> </span><span class='pt12'>next</span><span class='pt24'>:</span><span> </span><span class='pt14'>null</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='14'></td><td><span> </span><span class='pt12'>operation</span><span class='pt24'>:</span><span> </span><span class='pt14'>null</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='15'></td><td><span> }</span><span class='pt24'>;</span></td></tr>
<tr><td class='ln' data-ln='16'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='17'></td><td> </td></tr>
<tr><td class='ln' data-ln='18'></td><td><span> handleClick = (</span><span class='pt14'>buttonName</span><span>) </span><span class='pt19'>=></span><span> {</span></td></tr>
<tr><td class='ln' data-ln='19'></td><td><span> </span><span class='pt9 it'>this</span><span>.</span><span class='pt22'>setState</span><span>(</span><span class='pt22'>calculate</span><span>(</span><span class='pt9 it'>this</span><span>.state, buttonName))</span><span class='pt24'>;</span></td></tr>
<tr><td class='ln' data-ln='20'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='21'></td><td> </td></tr>
<tr><td class='ln' data-ln='22'></td><td class='hi'><span> </span><span class='pt22'>render</span><span>() {</span></td></tr>
<tr><td class='ln' data-ln='23'></td><td class='hi'><span> </span><span class='pt19'>return</span><span> (</span></td></tr>
<tr><td class='ln' data-ln='24'></td><td class='hi'><span> </span><span class='pt25'><</span><span class='pt10'>div</span><span> </span><span class='pt22'>className</span><span class='pt17'>=</span><span class='pt12'>"component-app"</span><span class='pt25'>></span></td></tr>
<tr><td class='ln' data-ln='25'></td><td class='hi'><span> </span><span class='pt25'><</span><span class='pt10'>Display</span></td></tr>
<tr><td class='ln' data-ln='26'></td><td class='hi'><span> </span><span class='pt22'>value</span><span class='pt17'>=</span><span>{</span><span class='pt9 it'>this</span><span>.state.next </span><span class='pt17'>||</span><span> </span><span class='pt9 it'>this</span><span>.state.total </span><span class='pt17'>||</span><span> </span><span class='pt12'>'0'</span><span>}</span></td></tr>
<tr><td class='ln' data-ln='27'></td><td class='hi'><span> </span><span class='pt25'>/></span></td></tr>
<tr><td class='ln' data-ln='28'></td><td class='hi'><span> </span><span class='pt25'><</span><span class='pt10'>ButtonPanel</span></td></tr>
<tr><td class='ln' data-ln='29'></td><td class='hi'><span> </span><span class='pt22'>clickHandler</span><span class='pt17'>=</span><span>{</span><span class='pt9 it'>this</span><span>.handleClick}</span></td></tr>
<tr><td class='ln' data-ln='30'></td><td class='hi'><span> </span><span class='pt25'>/></span></td></tr>
<tr><td class='ln' data-ln='31'></td><td class='hi'><span> </span><span class='pt25'></</span><span class='pt10'>div</span><span class='pt25'>></span></td></tr>
<tr><td class='ln' data-ln='32'></td><td class='hi'><span> )</span><span class='pt24'>;</span></td></tr>
<tr><td class='ln' data-ln='33'></td><td class='hi'><span> }</span></td></tr>
<tr><td class='ln' data-ln='34'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='35'></td><td> </td></tr>
<tr><td class='ln' data-ln='36'></td><td><span class='pt17'>export</span><span> </span><span class='pt19'>default</span><span> App</span><span class='pt24'>;</span></td></tr>
</table>
</div>
</div>
</div>
<div class='style' id='P--cobalt2--jsx'>
<div class='P--cobalt2-bordered'>
<div class="info header">
<span class="left">app.jsx</span>
<span class="right"><span>36 lines</span><span>701.00 B</span></span>
</div>
<div class='P--cobalt2'>
<table>
<tr><td class='ln' data-ln='1'></td><td class='hi'><span class='pt56'>import</span><span> </span><span class='pt41 pt4'>React</span><span> </span><span class='pt56'>from</span><span> </span><span class='pt23'>'react'</span><span class='pt43'>;</span></td></tr>
<tr><td class='ln' data-ln='2'></td><td><span class='pt56'>import</span><span> </span><span class='pt41 pt4'>Display</span><span> </span><span class='pt56'>from</span><span> </span><span class='pt23'>'./Display'</span><span class='pt43'>;</span></td></tr>
<tr><td class='ln' data-ln='3'></td><td><span class='pt56'>import</span><span> </span><span class='pt41 pt4'>ButtonPanel</span><span> </span><span class='pt56'>from</span><span> </span><span class='pt23'>'./ButtonPanel'</span><span class='pt43'>;</span></td></tr>
<tr><td class='ln' data-ln='4'></td><td><span class='pt56'>import</span><span> </span><span class='pt41 pt4'>calculate</span><span> </span><span class='pt56'>from</span><span> </span><span class='pt23'>'../logic/calculate'</span><span class='pt43'>;</span></td></tr>
<tr><td class='ln' data-ln='5'></td><td><span class='pt56'>import</span><span> </span><span class='pt23'>'./App.css'</span><span class='pt43'>;</span></td></tr>
<tr><td class='ln' data-ln='6'></td><td> </td></tr>
<tr><td class='ln' data-ln='7'></td><td><span class='pt56'>class</span><span> </span><span class='pt52'>App</span><span> </span><span class='pt60 it'>extends</span><span> </span><span class='pt60'>React</span><span>.</span><span class='pt41 pt4'>Component</span><span> </span><span class='pt43'>{</span></td></tr>
<tr><td class='ln' data-ln='8'></td><td><span> </span><span class='pt60'>constructor</span><span class='pt43'>(</span><span class='pt41 pt4'>props</span><span class='pt43'>)</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='9'></td><td><span> </span><span class='pt55'>super</span><span>(</span><span class='pt41 pt4'>props</span><span>)</span><span class='pt43'>;</span></td></tr>
<tr><td class='ln' data-ln='10'></td><td> </td></tr>
<tr><td class='ln' data-ln='11'></td><td><span> </span><span class='pt55'>this</span><span>.</span><span class='pt41 pt4'>state</span><span> = {</span></td></tr>
<tr><td class='ln' data-ln='12'></td><td><span> </span><span class='pt21'>total</span><span class='pt43'>:</span><span> </span><span class='pt54'>null</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='13'></td><td><span> </span><span class='pt21'>next</span><span class='pt43'>:</span><span> </span><span class='pt54'>null</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='14'></td><td><span> </span><span class='pt21'>operation</span><span class='pt43'>:</span><span> </span><span class='pt54'>null</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='15'></td><td><span> }</span><span class='pt43'>;</span></td></tr>
<tr><td class='ln' data-ln='16'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='17'></td><td> </td></tr>
<tr><td class='ln' data-ln='18'></td><td><span> </span><span class='pt41 pt4'>handleClick</span><span> = </span><span class='pt43'>(</span><span class='pt41 pt4'>buttonName</span><span class='pt43'>)</span><span> </span><span class='pt60'>=></span><span> {</span></td></tr>
<tr><td class='ln' data-ln='19'></td><td><span> </span><span class='pt55'>this</span><span>.</span><span class='pt62'>setState</span><span>(</span><span class='pt62'>calculate</span><span>(</span><span class='pt55'>this</span><span>.</span><span class='pt41 pt4'>state</span><span>, </span><span class='pt41 pt4'>buttonName</span><span>))</span><span class='pt43'>;</span></td></tr>
<tr><td class='ln' data-ln='20'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='21'></td><td> </td></tr>
<tr><td class='ln' data-ln='22'></td><td class='hi'><span> </span><span class='pt60'>render</span><span class='pt43'>()</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='23'></td><td class='hi'><span> </span><span class='pt56'>return</span><span> (</span></td></tr>
<tr><td class='ln' data-ln='24'></td><td class='hi'><span> </span><span class='pt43'><</span><span class='pt35'>div</span><span> </span><span class='pt60 it'>className</span><span class='pt56'>=</span><span class='pt22'>"</span><span class='pt23'>component-app</span><span class='pt22'>"</span><span class='pt43'>></span></td></tr>
<tr><td class='ln' data-ln='25'></td><td class='hi'><span> </span><span class='pt43'><</span><span class='pt35'>Display</span></td></tr>
<tr><td class='ln' data-ln='26'></td><td class='hi'><span> </span><span class='pt60 it'>value</span><span class='pt56'>=</span><span class='pt43'>{</span><span class='pt55'>this</span><span>.</span><span class='pt41 pt4'>state</span><span>.</span><span class='pt41 pt4'>next</span><span> </span><span class='pt56'>||</span><span> </span><span class='pt55'>this</span><span>.</span><span class='pt41 pt4'>state</span><span>.</span><span class='pt41 pt4'>total</span><span> </span><span class='pt56'>||</span><span> </span><span class='pt23'>'0'</span><span class='pt43'>}</span></td></tr>
<tr><td class='ln' data-ln='27'></td><td class='hi'><span> </span><span class='pt43'>/></span></td></tr>
<tr><td class='ln' data-ln='28'></td><td class='hi'><span> </span><span class='pt43'><</span><span class='pt35'>ButtonPanel</span></td></tr>
<tr><td class='ln' data-ln='29'></td><td class='hi'><span> </span><span class='pt60 it'>clickHandler</span><span class='pt56'>=</span><span class='pt43'>{</span><span class='pt55'>this</span><span>.</span><span class='pt41 pt4'>handleClick</span><span class='pt43'>}</span></td></tr>
<tr><td class='ln' data-ln='30'></td><td class='hi'><span> </span><span class='pt43'>/></span></td></tr>
<tr><td class='ln' data-ln='31'></td><td class='hi'><span> </span><span class='pt43'></</span><span class='pt35'>div</span><span class='pt43'>></span></td></tr>
<tr><td class='ln' data-ln='32'></td><td class='hi'><span> )</span><span class='pt43'>;</span></td></tr>
<tr><td class='ln' data-ln='33'></td><td class='hi'><span> }</span></td></tr>
<tr><td class='ln' data-ln='34'></td><td><span class='pt43'>}</span></td></tr>
<tr><td class='ln' data-ln='35'></td><td> </td></tr>
<tr><td class='ln' data-ln='36'></td><td><span class='pt56'>export</span><span> </span><span class='pt56'>default</span><span> </span><span class='pt41 pt4'>App</span><span class='pt43'>;</span></td></tr>
</table>
</div>
</div>
</div>
<div class='style' id='P--dracula--jsx'>
<div class='P--dracula-bordered'>
<div class="info header">
<span class="left">app.jsx</span>
<span class="right"><span>36 lines</span><span>701.00 B</span></span>
</div>
<div class='P--dracula'>
<table>
<tr><td class='ln' data-ln='1'></td><td class='hi'><span class='pt9'>import</span><span> React </span><span class='pt9'>from</span><span> </span><span class='pt7'>'react'</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='2'></td><td><span class='pt9'>import</span><span> Display </span><span class='pt9'>from</span><span> </span><span class='pt7'>'./Display'</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='3'></td><td><span class='pt9'>import</span><span> ButtonPanel </span><span class='pt9'>from</span><span> </span><span class='pt7'>'./ButtonPanel'</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='4'></td><td><span class='pt9'>import</span><span> calculate </span><span class='pt9'>from</span><span> </span><span class='pt7'>'../logic/calculate'</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='5'></td><td><span class='pt9'>import</span><span> </span><span class='pt7'>'./App.css'</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='6'></td><td> </td></tr>
<tr><td class='ln' data-ln='7'></td><td><span class='pt9'>class</span><span> </span><span class='pt3'>App</span><span> </span><span class='pt9'>extends</span><span> </span><span class='pt3 it'>React</span><span>.</span><span class='pt3 it'>Component</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='8'></td><td><span> </span><span class='pt1'>constructor</span><span>(</span><span class='pt10 it'>props</span><span>) {</span></td></tr>
<tr><td class='ln' data-ln='9'></td><td><span> </span><span class='pt5 it'>super</span><span>(props);</span></td></tr>
<tr><td class='ln' data-ln='10'></td><td> </td></tr>
<tr><td class='ln' data-ln='11'></td><td><span> </span><span class='pt5 it'>this</span><span>.state = {</span></td></tr>
<tr><td class='ln' data-ln='12'></td><td><span> </span><span class='pt7'>total</span><span class='pt9 it'>:</span><span> </span><span class='pt5'>null</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='13'></td><td><span> </span><span class='pt7'>next</span><span class='pt9 it'>:</span><span> </span><span class='pt5'>null</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='14'></td><td><span> </span><span class='pt7'>operation</span><span class='pt9 it'>:</span><span> </span><span class='pt5'>null</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='15'></td><td><span> };</span></td></tr>
<tr><td class='ln' data-ln='16'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='17'></td><td> </td></tr>
<tr><td class='ln' data-ln='18'></td><td><span> handleClick = (</span><span class='pt10 it'>buttonName</span><span>) </span><span class='pt9'>=></span><span> {</span></td></tr>
<tr><td class='ln' data-ln='19'></td><td><span> </span><span class='pt5 it'>this</span><span>.</span><span class='pt1'>setState</span><span>(</span><span class='pt1'>calculate</span><span>(</span><span class='pt5 it'>this</span><span>.state, buttonName));</span></td></tr>
<tr><td class='ln' data-ln='20'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='21'></td><td> </td></tr>
<tr><td class='ln' data-ln='22'></td><td class='hi'><span> </span><span class='pt1'>render</span><span>() {</span></td></tr>
<tr><td class='ln' data-ln='23'></td><td class='hi'><span> </span><span class='pt9'>return</span><span> (</span></td></tr>
<tr><td class='ln' data-ln='24'></td><td class='hi'><span> <</span><span class='pt9'>div</span><span> </span><span class='pt1 it'>className</span><span class='pt9'>=</span><span class='pt6'>"</span><span class='pt7'>component-app</span><span class='pt6'>"</span><span>></span></td></tr>
<tr><td class='ln' data-ln='25'></td><td class='hi'><span> <</span><span class='pt9'>Display</span></td></tr>
<tr><td class='ln' data-ln='26'></td><td class='hi'><span> </span><span class='pt1 it'>value</span><span class='pt9'>=</span><span>{</span><span class='pt5 it'>this</span><span>.state.next </span><span class='pt9'>||</span><span> </span><span class='pt5 it'>this</span><span>.state.total </span><span class='pt9'>||</span><span> </span><span class='pt7'>'0'</span><span>}</span></td></tr>
<tr><td class='ln' data-ln='27'></td><td class='hi'><span> /></span></td></tr>
<tr><td class='ln' data-ln='28'></td><td class='hi'><span> <</span><span class='pt9'>ButtonPanel</span></td></tr>
<tr><td class='ln' data-ln='29'></td><td class='hi'><span> </span><span class='pt1 it'>clickHandler</span><span class='pt9'>=</span><span>{</span><span class='pt5 it'>this</span><span>.handleClick}</span></td></tr>
<tr><td class='ln' data-ln='30'></td><td class='hi'><span> /></span></td></tr>
<tr><td class='ln' data-ln='31'></td><td class='hi'><span> </</span><span class='pt9'>div</span><span>></span></td></tr>
<tr><td class='ln' data-ln='32'></td><td class='hi'><span> );</span></td></tr>
<tr><td class='ln' data-ln='33'></td><td class='hi'><span> }</span></td></tr>
<tr><td class='ln' data-ln='34'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='35'></td><td> </td></tr>
<tr><td class='ln' data-ln='36'></td><td><span class='pt9'>export</span><span> </span><span class='pt9'>default</span><span> App;</span></td></tr>
</table>
</div>
</div>
</div>
<div class='style' id='P--github--jsx'>
<div class='P--github-bordered'>
<div class="info header">
<span class="left">app.jsx</span>
<span class="right"><span>36 lines</span><span>701.00 B</span></span>
</div>
<div class='P--github'>
<table>
<tr><td class='ln' data-ln='1'></td><td class='hi'><span class='pt17'>import</span><span> </span><span class='pt10'>React</span><span> </span><span class='pt17'>from</span><span> </span><span class='pt8'>'react'</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='2'></td><td><span class='pt17'>import</span><span> </span><span class='pt10'>Display</span><span> </span><span class='pt17'>from</span><span> </span><span class='pt8'>'./Display'</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='3'></td><td><span class='pt17'>import</span><span> </span><span class='pt10'>ButtonPanel</span><span> </span><span class='pt17'>from</span><span> </span><span class='pt8'>'./ButtonPanel'</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='4'></td><td><span class='pt17'>import</span><span> </span><span class='pt10'>calculate</span><span> </span><span class='pt17'>from</span><span> </span><span class='pt8'>'../logic/calculate'</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='5'></td><td><span class='pt17'>import</span><span> </span><span class='pt8'>'./App.css'</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='6'></td><td> </td></tr>
<tr><td class='ln' data-ln='7'></td><td><span class='pt17'>class</span><span> </span><span class='pt13'>App</span><span> </span><span class='pt17'>extends</span><span> </span><span class='pt10'>React.Component</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='8'></td><td><span> </span><span class='pt13'>constructor</span><span>(</span><span class='pt10'>props</span><span>) {</span></td></tr>
<tr><td class='ln' data-ln='9'></td><td><span> </span><span class='pt7'>super</span><span>(</span><span class='pt10'>props</span><span>);</span></td></tr>
<tr><td class='ln' data-ln='10'></td><td> </td></tr>
<tr><td class='ln' data-ln='11'></td><td><span> </span><span class='pt7'>this</span><span class='pt10'>.state</span><span> = {</span></td></tr>
<tr><td class='ln' data-ln='12'></td><td><span> </span><span class='pt8'>total</span><span class='pt17'>:</span><span> </span><span class='pt7'>null</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='13'></td><td><span> </span><span class='pt8'>next</span><span class='pt17'>:</span><span> </span><span class='pt7'>null</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='14'></td><td><span> </span><span class='pt8'>operation</span><span class='pt17'>:</span><span> </span><span class='pt7'>null</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='15'></td><td><span> };</span></td></tr>
<tr><td class='ln' data-ln='16'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='17'></td><td> </td></tr>
<tr><td class='ln' data-ln='18'></td><td><span> </span><span class='pt10'>handleClick</span><span> = (</span><span class='pt10'>buttonName</span><span>) </span><span class='pt17'>=></span><span> {</span></td></tr>
<tr><td class='ln' data-ln='19'></td><td><span> </span><span class='pt7'>this</span><span class='pt10'>.</span><span class='pt13'>setState</span><span>(</span><span class='pt13'>calculate</span><span>(</span><span class='pt7'>this</span><span class='pt10'>.state</span><span>, </span><span class='pt10'>buttonName</span><span>));</span></td></tr>
<tr><td class='ln' data-ln='20'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='21'></td><td> </td></tr>
<tr><td class='ln' data-ln='22'></td><td class='hi'><span> </span><span class='pt13'>render</span><span>() {</span></td></tr>
<tr><td class='ln' data-ln='23'></td><td class='hi'><span> </span><span class='pt17'>return</span><span> (</span></td></tr>
<tr><td class='ln' data-ln='24'></td><td class='hi'><span> </span><span class='pt17'><</span><span class='pt10'>div</span><span> </span><span class='pt13'>className</span><span class='pt17'>=</span><span class='pt8'>"component-app"</span><span class='pt17'>></span></td></tr>
<tr><td class='ln' data-ln='25'></td><td class='hi'><span> </span><span class='pt17'><</span><span class='pt10'>Display</span></td></tr>
<tr><td class='ln' data-ln='26'></td><td class='hi'><span> </span><span class='pt13'>value</span><span class='pt17'>=</span><span>{</span><span class='pt7'>this</span><span class='pt10'>.state.next</span><span> </span><span class='pt17'>||</span><span> </span><span class='pt7'>this</span><span class='pt10'>.state.total</span><span> </span><span class='pt17'>||</span><span> </span><span class='pt8'>'0'</span><span>}</span></td></tr>
<tr><td class='ln' data-ln='27'></td><td class='hi'><span> </span><span class='pt17'>/></span></td></tr>
<tr><td class='ln' data-ln='28'></td><td class='hi'><span> </span><span class='pt17'><</span><span class='pt10'>ButtonPanel</span></td></tr>
<tr><td class='ln' data-ln='29'></td><td class='hi'><span> </span><span class='pt13'>clickHandler</span><span class='pt17'>=</span><span>{</span><span class='pt7'>this</span><span class='pt10'>.handleClick</span><span>}</span></td></tr>
<tr><td class='ln' data-ln='30'></td><td class='hi'><span> </span><span class='pt17'>/></span></td></tr>
<tr><td class='ln' data-ln='31'></td><td class='hi'><span> </span><span class='pt17'></</span><span class='pt10'>div</span><span class='pt17'>></span></td></tr>
<tr><td class='ln' data-ln='32'></td><td class='hi'><span> );</span></td></tr>
<tr><td class='ln' data-ln='33'></td><td class='hi'><span> }</span></td></tr>
<tr><td class='ln' data-ln='34'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='35'></td><td> </td></tr>
<tr><td class='ln' data-ln='36'></td><td><span class='pt17'>export</span><span> </span><span class='pt17'>default</span><span> </span><span class='pt10'>App</span><span>;</span></td></tr>
</table>
</div>
</div>
</div>
<div class='style' id='P--monokai_extended--jsx'>
<div class='P--monokai_extended-bordered'>
<div class="info header">
<span class="left">app.jsx</span>
<span class="right"><span>36 lines</span><span>701.00 B</span></span>
</div>
<div class='P--monokai_extended'>
<table>
<tr><td class='ln' data-ln='1'></td><td class='hi'><span class='pt32'>import</span><span> </span><span class='pt36'>React</span><span> </span><span class='pt32'>from</span><span> </span><span class='pt27'>'react'</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='2'></td><td><span class='pt32'>import</span><span> </span><span class='pt36'>Display</span><span> </span><span class='pt32'>from</span><span> </span><span class='pt27'>'./Display'</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='3'></td><td><span class='pt32'>import</span><span> </span><span class='pt36'>ButtonPanel</span><span> </span><span class='pt32'>from</span><span> </span><span class='pt27'>'./ButtonPanel'</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='4'></td><td><span class='pt32'>import</span><span> </span><span class='pt36'>calculate</span><span> </span><span class='pt32'>from</span><span> </span><span class='pt27'>'../logic/calculate'</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='5'></td><td><span class='pt32'>import</span><span> </span><span class='pt27'>'./App.css'</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='6'></td><td> </td></tr>
<tr><td class='ln' data-ln='7'></td><td><span class='pt9 it'>class</span><span> </span><span class='pt9 un'>App</span><span> </span><span class='pt9 it'>extends</span><span> </span><span class='pt36'>React.</span><span class='pt13'>Component</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='8'></td><td><span> </span><span class='pt13'>constructor</span><span class='pt36'>(</span><span class='pt34 it'>props</span><span class='pt36'>)</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='9'></td><td><span> </span><span class='pt9 it'>super</span><span class='pt36'>(props)</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='10'></td><td> </td></tr>
<tr><td class='ln' data-ln='11'></td><td><span> </span><span class='pt9 it'>this</span><span class='pt36'>.state</span><span> = {</span></td></tr>
<tr><td class='ln' data-ln='12'></td><td><span> </span><span class='pt36'>total:</span><span> </span><span class='pt17'>null</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='13'></td><td><span> </span><span class='pt36'>next:</span><span> </span><span class='pt17'>null</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='14'></td><td><span> </span><span class='pt36'>operation:</span><span> </span><span class='pt17'>null</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='15'></td><td><span> };</span></td></tr>
<tr><td class='ln' data-ln='16'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='17'></td><td> </td></tr>
<tr><td class='ln' data-ln='18'></td><td><span> </span><span class='pt36'>handleClick</span><span> = </span><span class='pt36'>(</span><span class='pt34 it'>buttonName</span><span class='pt36'>)</span><span> </span><span class='pt9 it'>=></span><span> {</span></td></tr>
<tr><td class='ln' data-ln='19'></td><td><span> </span><span class='pt9 it'>this</span><span class='pt36'>.</span><span>setState</span><span class='pt36'>(</span><span>calculate</span><span class='pt36'>(</span><span class='pt9 it'>this</span><span class='pt36'>.state</span><span>, </span><span class='pt36'>buttonName))</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='20'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='21'></td><td> </td></tr>
<tr><td class='ln' data-ln='22'></td><td class='hi'><span> </span><span class='pt13'>render</span><span class='pt36'>()</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='23'></td><td class='hi'><span> </span><span class='pt32'>return</span><span> </span><span class='pt36'>(</span></td></tr>
<tr><td class='ln' data-ln='24'></td><td class='hi'><span> </span><span class='pt36'><</span><span class='pt32'>div</span><span> </span><span class='pt13'>className</span><span class='pt32'>=</span><span class='pt27'>"component-app"</span><span class='pt36'>></span></td></tr>
<tr><td class='ln' data-ln='25'></td><td class='hi'><span> </span><span class='pt36'><</span><span class='pt32'>Display</span></td></tr>
<tr><td class='ln' data-ln='26'></td><td class='hi'><span> </span><span class='pt13'>value</span><span class='pt32'>=</span><span>{</span><span class='pt9 it'>this</span><span class='pt36'>.state.next</span><span> </span><span class='pt32'>||</span><span> </span><span class='pt9 it'>this</span><span class='pt36'>.state.total</span><span> </span><span class='pt32'>||</span><span> </span><span class='pt27'>'0'</span><span>}</span></td></tr>
<tr><td class='ln' data-ln='27'></td><td class='hi'><span> </span><span class='pt36'>/></span></td></tr>
<tr><td class='ln' data-ln='28'></td><td class='hi'><span> </span><span class='pt36'><</span><span class='pt32'>ButtonPanel</span></td></tr>
<tr><td class='ln' data-ln='29'></td><td class='hi'><span> </span><span class='pt13'>clickHandler</span><span class='pt32'>=</span><span>{</span><span class='pt9 it'>this</span><span class='pt36'>.handleClick</span><span>}</span></td></tr>
<tr><td class='ln' data-ln='30'></td><td class='hi'><span> </span><span class='pt36'>/></span></td></tr>
<tr><td class='ln' data-ln='31'></td><td class='hi'><span> </span><span class='pt36'></</span><span class='pt32'>div</span><span class='pt36'>></span></td></tr>
<tr><td class='ln' data-ln='32'></td><td class='hi'><span> </span><span class='pt36'>)</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='33'></td><td class='hi'><span> }</span></td></tr>
<tr><td class='ln' data-ln='34'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='35'></td><td> </td></tr>
<tr><td class='ln' data-ln='36'></td><td><span class='pt32'>export</span><span> </span><span class='pt32'>default</span><span> </span><span class='pt36'>App</span><span>;</span></td></tr>
</table>
</div>
</div>
</div>
<div class='style' id='P--oceanic_next--jsx'>
<div class='P--oceanic_next-bordered'>
<div class="info header">
<span class="left">app.jsx</span>
<span class="right"><span>36 lines</span><span>701.00 B</span></span>
</div>
<div class='P--oceanic_next'>
<table>
<tr><td class='ln' data-ln='1'></td><td class='hi'><span class='pt1'>import</span><span> React </span><span class='pt1'>from</span><span> </span><span class='pt1'>'</span><span class='pt4'>react</span><span class='pt1'>';</span></td></tr>
<tr><td class='ln' data-ln='2'></td><td><span class='pt1'>import</span><span> Display </span><span class='pt1'>from</span><span> </span><span class='pt1'>'</span><span class='pt4'>./Display</span><span class='pt1'>';</span></td></tr>
<tr><td class='ln' data-ln='3'></td><td><span class='pt1'>import</span><span> ButtonPanel </span><span class='pt1'>from</span><span> </span><span class='pt1'>'</span><span class='pt4'>./ButtonPanel</span><span class='pt1'>';</span></td></tr>
<tr><td class='ln' data-ln='4'></td><td><span class='pt1'>import</span><span> calculate </span><span class='pt1'>from</span><span> </span><span class='pt1'>'</span><span class='pt4'>../logic/calculate</span><span class='pt1'>';</span></td></tr>
<tr><td class='ln' data-ln='5'></td><td><span class='pt1'>import</span><span> </span><span class='pt1'>'</span><span class='pt4'>./App.css</span><span class='pt1'>';</span></td></tr>
<tr><td class='ln' data-ln='6'></td><td> </td></tr>
<tr><td class='ln' data-ln='7'></td><td><span class='pt7'>class</span><span> </span><span class='pt13'>App</span><span> </span><span class='pt7'>extends</span><span> </span><span class='pt10'>React</span><span>.</span><span class='pt4'>Component</span><span> </span><span class='pt1'>{</span></td></tr>
<tr><td class='ln' data-ln='8'></td><td><span> </span><span class='pt8'>constructor</span><span class='pt1'>(</span><span class='pt12'>props</span><span class='pt1'>)</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='9'></td><td><span> </span><span class='pt10 it'>super</span><span>(props)</span><span class='pt1'>;</span></td></tr>
<tr><td class='ln' data-ln='10'></td><td> </td></tr>
<tr><td class='ln' data-ln='11'></td><td><span> </span><span class='pt10 it'>this</span><span>.state = {</span></td></tr>
<tr><td class='ln' data-ln='12'></td><td><span> </span><span class='pt4'>total</span><span class='pt1'>:</span><span> </span><span class='pt12'>null</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='13'></td><td><span> </span><span class='pt4'>next</span><span class='pt1'>:</span><span> </span><span class='pt12'>null</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='14'></td><td><span> </span><span class='pt4'>operation</span><span class='pt1'>:</span><span> </span><span class='pt12'>null</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='15'></td><td><span> }</span><span class='pt1'>;</span></td></tr>
<tr><td class='ln' data-ln='16'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='17'></td><td> </td></tr>
<tr><td class='ln' data-ln='18'></td><td><span> handleClick = </span><span class='pt1'>(</span><span class='pt12'>buttonName</span><span class='pt1'>)</span><span> </span><span class='pt7'>=></span><span> {</span></td></tr>
<tr><td class='ln' data-ln='19'></td><td><span> </span><span class='pt10 it'>this</span><span>.</span><span class='pt3'>setState</span><span>(</span><span class='pt3'>calculate</span><span>(</span><span class='pt10 it'>this</span><span>.state, buttonName))</span><span class='pt1'>;</span></td></tr>
<tr><td class='ln' data-ln='20'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='21'></td><td> </td></tr>
<tr><td class='ln' data-ln='22'></td><td class='hi'><span> </span><span class='pt3'>render</span><span class='pt1'>()</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='23'></td><td class='hi'><span> </span><span class='pt7'>return</span><span> (</span></td></tr>
<tr><td class='ln' data-ln='24'></td><td class='hi'><span> </span><span class='pt1'><</span><span class='pt9'>div</span><span> </span><span class='pt6'>className</span><span class='pt1'>="</span><span class='pt4'>component-app</span><span class='pt1'>"></span></td></tr>
<tr><td class='ln' data-ln='25'></td><td class='hi'><span> </span><span class='pt1'><</span><span class='pt9'>Display</span></td></tr>
<tr><td class='ln' data-ln='26'></td><td class='hi'><span> </span><span class='pt6'>value</span><span class='pt1'>={</span><span class='pt10 it'>this</span><span>.state.next </span><span class='pt1'>||</span><span> </span><span class='pt10 it'>this</span><span>.state.total </span><span class='pt1'>||</span><span> </span><span class='pt1'>'</span><span class='pt4'>0</span><span class='pt1'>'}</span></td></tr>
<tr><td class='ln' data-ln='27'></td><td class='hi'><span> </span><span class='pt1'>/></span></td></tr>
<tr><td class='ln' data-ln='28'></td><td class='hi'><span> </span><span class='pt1'><</span><span class='pt9'>ButtonPanel</span></td></tr>
<tr><td class='ln' data-ln='29'></td><td class='hi'><span> </span><span class='pt6'>clickHandler</span><span class='pt1'>={</span><span class='pt10 it'>this</span><span>.handleClick</span><span class='pt1'>}</span></td></tr>
<tr><td class='ln' data-ln='30'></td><td class='hi'><span> </span><span class='pt1'>/></span></td></tr>
<tr><td class='ln' data-ln='31'></td><td class='hi'><span> </span><span class='pt1'></</span><span class='pt9'>div</span><span class='pt1'>></span></td></tr>
<tr><td class='ln' data-ln='32'></td><td class='hi'><span> )</span><span class='pt1'>;</span></td></tr>
<tr><td class='ln' data-ln='33'></td><td class='hi'><span> }</span></td></tr>
<tr><td class='ln' data-ln='34'></td><td><span class='pt1'>}</span></td></tr>
<tr><td class='ln' data-ln='35'></td><td> </td></tr>
<tr><td class='ln' data-ln='36'></td><td><span class='pt1'>export</span><span> </span><span class='pt7'>default</span><span> App</span><span class='pt1'>;</span></td></tr>
</table>
</div>
</div>
</div>
<div class='style' id='P--one_dark--jsx'>
<div class='P--one_dark-bordered'>
<div class="info header">
<span class="left">app.jsx</span>
<span class="right"><span>36 lines</span><span>701.00 B</span></span>
</div>
<div class='P--one_dark'>
<table>
<tr><td class='ln' data-ln='1'></td><td class='hi'><span class='pt5'>import</span><span> </span><span class='pt26'>React</span><span> </span><span class='pt5'>from</span><span> </span><span class='pt13'>'react'</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='2'></td><td><span class='pt5'>import</span><span> </span><span class='pt26'>Display</span><span> </span><span class='pt5'>from</span><span> </span><span class='pt13'>'./Display'</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='3'></td><td><span class='pt5'>import</span><span> </span><span class='pt26'>ButtonPanel</span><span> </span><span class='pt5'>from</span><span> </span><span class='pt13'>'./ButtonPanel'</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='4'></td><td><span class='pt5'>import</span><span> </span><span class='pt26'>calculate</span><span> </span><span class='pt5'>from</span><span> </span><span class='pt13'>'../logic/calculate'</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='5'></td><td><span class='pt5'>import</span><span> </span><span class='pt13'>'./App.css'</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='6'></td><td> </td></tr>
<tr><td class='ln' data-ln='7'></td><td><span class='pt20'>class</span><span> </span><span class='pt28'>App</span><span> </span><span class='pt20'>extends</span><span> </span><span class='pt28'>React</span><span class='pt17'>.</span><span class='pt13'>Component</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='8'></td><td><span> </span><span class='pt9'>constructor</span><span>(</span><span class='pt26 it'>props</span><span>) {</span></td></tr>
<tr><td class='ln' data-ln='9'></td><td><span> </span><span class='it'>super</span><span>(</span><span class='pt26'>props</span><span>);</span></td></tr>
<tr><td class='ln' data-ln='10'></td><td> </td></tr>
<tr><td class='ln' data-ln='11'></td><td><span> </span><span class='pt28 it'>this</span><span class='pt17'>.</span><span class='pt26'>state</span><span> = {</span></td></tr>
<tr><td class='ln' data-ln='12'></td><td><span> </span><span class='pt13'>total</span><span class='pt17'>:</span><span> </span><span class='pt24'>null</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='13'></td><td><span> </span><span class='pt13'>next</span><span class='pt17'>:</span><span> </span><span class='pt24'>null</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='14'></td><td><span> </span><span class='pt13'>operation</span><span class='pt17'>:</span><span> </span><span class='pt24'>null</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='15'></td><td><span> };</span></td></tr>
<tr><td class='ln' data-ln='16'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='17'></td><td> </td></tr>
<tr><td class='ln' data-ln='18'></td><td><span> </span><span class='pt26'>handleClick</span><span> = (</span><span class='pt26 it'>buttonName</span><span>) </span><span class='pt20'>=></span><span> {</span></td></tr>
<tr><td class='ln' data-ln='19'></td><td><span> </span><span class='pt28 it'>this</span><span class='pt17'>.</span><span class='pt9'>setState</span><span>(</span><span class='pt9'>calculate</span><span>(</span><span class='pt28 it'>this</span><span class='pt17'>.</span><span class='pt26'>state</span><span>, </span><span class='pt26'>buttonName</span><span>));</span></td></tr>
<tr><td class='ln' data-ln='20'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='21'></td><td> </td></tr>
<tr><td class='ln' data-ln='22'></td><td class='hi'><span> </span><span class='pt9'>render</span><span>() {</span></td></tr>
<tr><td class='ln' data-ln='23'></td><td class='hi'><span> </span><span class='pt20'>return</span><span> (</span></td></tr>
<tr><td class='ln' data-ln='24'></td><td class='hi'><span> <</span><span class='pt26'>div</span><span> </span><span class='pt24 it'>className</span><span class='pt5'>=</span><span class='pt12'>"</span><span class='pt13'>component-app</span><span class='pt12'>"</span><span>></span></td></tr>
<tr><td class='ln' data-ln='25'></td><td class='hi'><span> <</span><span class='pt26'>Display</span></td></tr>
<tr><td class='ln' data-ln='26'></td><td class='hi'><span> </span><span class='pt24 it'>value</span><span class='pt5'>=</span><span class='pt18'>{</span><span class='pt28 it'>this</span><span class='pt17'>.</span><span class='pt26'>state</span><span class='pt17'>.</span><span class='pt26'>next</span><span> </span><span class='pt5'>||</span><span> </span><span class='pt28 it'>this</span><span class='pt17'>.</span><span class='pt26'>state</span><span class='pt17'>.</span><span class='pt26'>total</span><span> </span><span class='pt5'>||</span><span> </span><span class='pt13'>'0'</span><span class='pt18'>}</span></td></tr>
<tr><td class='ln' data-ln='27'></td><td class='hi'><span> /></span></td></tr>
<tr><td class='ln' data-ln='28'></td><td class='hi'><span> <</span><span class='pt26'>ButtonPanel</span></td></tr>
<tr><td class='ln' data-ln='29'></td><td class='hi'><span> </span><span class='pt24 it'>clickHandler</span><span class='pt5'>=</span><span class='pt18'>{</span><span class='pt28 it'>this</span><span class='pt17'>.</span><span class='pt26'>handleClick</span><span class='pt18'>}</span></td></tr>
<tr><td class='ln' data-ln='30'></td><td class='hi'><span> /></span></td></tr>
<tr><td class='ln' data-ln='31'></td><td class='hi'><span> </</span><span class='pt26'>div</span><span>></span></td></tr>
<tr><td class='ln' data-ln='32'></td><td class='hi'><span> );</span></td></tr>
<tr><td class='ln' data-ln='33'></td><td class='hi'><span> }</span></td></tr>
<tr><td class='ln' data-ln='34'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='35'></td><td> </td></tr>
<tr><td class='ln' data-ln='36'></td><td><span class='pt5'>export</span><span> </span><span class='pt20'>default</span><span> </span><span class='pt26'>App</span><span>;</span></td></tr>
</table>
</div>
</div>
</div>
<div class='style' id='P--one_light--jsx'>
<div class='P--one_light-bordered'>
<div class="info header">
<span class="left">app.jsx</span>
<span class="right"><span>36 lines</span><span>701.00 B</span></span>
</div>
<div class='P--one_light'>
<table>
<tr><td class='ln' data-ln='1'></td><td class='hi'><span class='pt4'>import</span><span> React </span><span class='pt4'>from</span><span> </span><span class='pt8'>'react'</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='2'></td><td><span class='pt4'>import</span><span> Display </span><span class='pt4'>from</span><span> </span><span class='pt8'>'./Display'</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='3'></td><td><span class='pt4'>import</span><span> ButtonPanel </span><span class='pt4'>from</span><span> </span><span class='pt8'>'./ButtonPanel'</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='4'></td><td><span class='pt4'>import</span><span> calculate </span><span class='pt4'>from</span><span> </span><span class='pt8'>'../logic/calculate'</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='5'></td><td><span class='pt4'>import</span><span> </span><span class='pt8'>'./App.css'</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='6'></td><td> </td></tr>
<tr><td class='ln' data-ln='7'></td><td><span class='pt14'>class</span><span> </span><span class='pt15'>App</span><span> </span><span class='pt14'>extends</span><span> </span><span class='pt17'>React</span><span>.</span><span class='pt17'>Component</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='8'></td><td><span> </span><span class='pt7'>constructor</span><span>(</span><span class='pt17 it'>props</span><span>) {</span></td></tr>
<tr><td class='ln' data-ln='9'></td><td><span> </span><span class='pt17'>super</span><span>(props);</span></td></tr>
<tr><td class='ln' data-ln='10'></td><td> </td></tr>
<tr><td class='ln' data-ln='11'></td><td><span> </span><span class='pt17'>this</span><span>.</span><span class='pt17'>state</span><span> = {</span></td></tr>
<tr><td class='ln' data-ln='12'></td><td><span> total</span><span class='pt4'>:</span><span> </span><span class='pt12'>null</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='13'></td><td><span> next</span><span class='pt4'>:</span><span> </span><span class='pt12'>null</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='14'></td><td><span> operation</span><span class='pt4'>:</span><span> </span><span class='pt12'>null</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='15'></td><td><span> };</span></td></tr>
<tr><td class='ln' data-ln='16'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='17'></td><td> </td></tr>
<tr><td class='ln' data-ln='18'></td><td><span> </span><span class='pt17'>handleClick</span><span class='pt15'> = </span><span>(</span><span class='pt17 it'>buttonName</span><span>)</span><span class='pt15'> </span><span class='pt14'>=></span><span class='pt15'> {</span></td></tr>
<tr><td class='ln' data-ln='19'></td><td><span class='pt15'> </span><span class='pt17'>this</span><span>.</span><span class='pt7'>setState</span><span class='pt15'>(</span><span class='pt7'>calculate</span><span class='pt15'>(</span><span class='pt17'>this</span><span>.</span><span class='pt17'>state</span><span class='pt15'>, </span><span>buttonName</span><span class='pt15'>))</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='20'></td><td><span class='pt15'> }</span></td></tr>
<tr><td class='ln' data-ln='21'></td><td> </td></tr>
<tr><td class='ln' data-ln='22'></td><td class='hi'><span class='pt15'> </span><span class='pt7'>render</span><span>()</span><span class='pt15'> {</span></td></tr>
<tr><td class='ln' data-ln='23'></td><td class='hi'><span class='pt15'> </span><span class='pt14'>return</span><span class='pt15'> (</span></td></tr>
<tr><td class='ln' data-ln='24'></td><td class='hi'><span class='pt15'> </span><span><</span><span class='pt17'>div</span><span class='pt15'> </span><span class='pt12'>className</span><span class='pt4'>=</span><span class='pt8'>"component-app"</span><span>></span></td></tr>
<tr><td class='ln' data-ln='25'></td><td class='hi'><span class='pt15'> </span><span><</span><span class='pt17'>Display</span></td></tr>
<tr><td class='ln' data-ln='26'></td><td class='hi'><span class='pt15'> </span><span class='pt12'>value</span><span class='pt4'>=</span><span class='pt16'>{</span><span class='pt17'>this</span><span>.</span><span class='pt17'>state</span><span>.</span><span class='pt17'>next</span><span class='pt15'> </span><span class='pt4'>||</span><span class='pt15'> </span><span class='pt17'>this</span><span>.</span><span class='pt17'>state</span><span>.</span><span class='pt17'>total</span><span class='pt15'> </span><span class='pt4'>||</span><span class='pt15'> </span><span class='pt8'>'0'</span><span class='pt16'>}</span></td></tr>
<tr><td class='ln' data-ln='27'></td><td class='hi'><span class='pt15'> </span><span>/></span></td></tr>
<tr><td class='ln' data-ln='28'></td><td class='hi'><span class='pt15'> </span><span><</span><span class='pt17'>ButtonPanel</span></td></tr>
<tr><td class='ln' data-ln='29'></td><td class='hi'><span class='pt15'> </span><span class='pt12'>clickHandler</span><span class='pt4'>=</span><span class='pt16'>{</span><span class='pt17'>this</span><span>.</span><span class='pt17'>handleClick</span><span class='pt16'>}</span></td></tr>
<tr><td class='ln' data-ln='30'></td><td class='hi'><span class='pt15'> </span><span>/></span></td></tr>
<tr><td class='ln' data-ln='31'></td><td class='hi'><span class='pt15'> </span><span></</span><span class='pt17'>div</span><span>></span></td></tr>
<tr><td class='ln' data-ln='32'></td><td class='hi'><span class='pt15'> )</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='33'></td><td class='hi'><span class='pt15'> }</span></td></tr>
<tr><td class='ln' data-ln='34'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='35'></td><td> </td></tr>
<tr><td class='ln' data-ln='36'></td><td><span class='pt4'>export</span><span> </span><span class='pt14'>default</span><span> App;</span></td></tr>
</table>
</div>
</div>
</div>
<div class='style' id='P--one_monokai--jsx'>
<div class='P--one_monokai-bordered'>
<div class="info header">
<span class="left">app.jsx</span>
<span class="right"><span>36 lines</span><span>701.00 B</span></span>
</div>
<div class='P--one_monokai'>
<table>
<tr><td class='ln' data-ln='1'></td><td class='hi'><span class='pt10'>import</span><span> React </span><span class='pt10'>from</span><span> </span><span class='pt11'>'react'</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='2'></td><td><span class='pt10'>import</span><span> Display </span><span class='pt10'>from</span><span> </span><span class='pt11'>'./Display'</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='3'></td><td><span class='pt10'>import</span><span> ButtonPanel </span><span class='pt10'>from</span><span> </span><span class='pt11'>'./ButtonPanel'</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='4'></td><td><span class='pt10'>import</span><span> calculate </span><span class='pt10'>from</span><span> </span><span class='pt11'>'../logic/calculate'</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='5'></td><td><span class='pt10'>import</span><span> </span><span class='pt11'>'./App.css'</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='6'></td><td> </td></tr>
<tr><td class='ln' data-ln='7'></td><td><span class='pt3'>class</span><span> </span><span class='pt5'>App</span><span> </span><span class='pt3'>extends</span><span> </span><span class='pt5'>React</span><span>.</span><span class='pt7'>Component</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='8'></td><td><span> </span><span class='pt7'>constructor</span><span>(</span><span class='pt9 it'>props</span><span>) {</span></td></tr>
<tr><td class='ln' data-ln='9'></td><td><span> </span><span class='pt10'>super</span><span>(props);</span></td></tr>
<tr><td class='ln' data-ln='10'></td><td> </td></tr>
<tr><td class='ln' data-ln='11'></td><td><span> </span><span class='pt10'>this</span><span>.</span><span class='pt5'>state</span><span> = {</span></td></tr>
<tr><td class='ln' data-ln='12'></td><td><span> </span><span class='pt11'>total</span><span class='pt3'>:</span><span> </span><span class='pt3'>null</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='13'></td><td><span> </span><span class='pt11'>next</span><span class='pt3'>:</span><span> </span><span class='pt3'>null</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='14'></td><td><span> </span><span class='pt11'>operation</span><span class='pt3'>:</span><span> </span><span class='pt3'>null</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='15'></td><td><span> };</span></td></tr>
<tr><td class='ln' data-ln='16'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='17'></td><td> </td></tr>
<tr><td class='ln' data-ln='18'></td><td><span> handleClick = (</span><span class='pt9 it'>buttonName</span><span>) </span><span class='pt3'>=></span><span> {</span></td></tr>
<tr><td class='ln' data-ln='19'></td><td><span> </span><span class='pt10'>this</span><span>.</span><span class='pt7'>setState</span><span>(</span><span class='pt7'>calculate</span><span>(</span><span class='pt10'>this</span><span>.</span><span class='pt5'>state</span><span>, buttonName));</span></td></tr>
<tr><td class='ln' data-ln='20'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='21'></td><td> </td></tr>
<tr><td class='ln' data-ln='22'></td><td class='hi'><span> </span><span class='pt7'>render</span><span>() {</span></td></tr>
<tr><td class='ln' data-ln='23'></td><td class='hi'><span> </span><span class='pt10'>return</span><span> (</span></td></tr>
<tr><td class='ln' data-ln='24'></td><td class='hi'><span> <</span><span class='pt10'>div</span><span> </span><span class='pt7'>className</span><span class='pt10'>=</span><span class='pt11'>"component-app"</span><span>></span></td></tr>
<tr><td class='ln' data-ln='25'></td><td class='hi'><span> <</span><span class='pt10'>Display</span></td></tr>
<tr><td class='ln' data-ln='26'></td><td class='hi'><span> </span><span class='pt7'>value</span><span class='pt10'>=</span><span>{</span><span class='pt10'>this</span><span>.</span><span class='pt5'>state</span><span>.</span><span class='pt5'>next</span><span> </span><span class='pt10'>||</span><span> </span><span class='pt10'>this</span><span>.</span><span class='pt5'>state</span><span>.</span><span class='pt5'>total</span><span> </span><span class='pt10'>||</span><span> </span><span class='pt11'>'0'</span><span>}</span></td></tr>
<tr><td class='ln' data-ln='27'></td><td class='hi'><span> /></span></td></tr>
<tr><td class='ln' data-ln='28'></td><td class='hi'><span> <</span><span class='pt10'>ButtonPanel</span></td></tr>
<tr><td class='ln' data-ln='29'></td><td class='hi'><span> </span><span class='pt7'>clickHandler</span><span class='pt10'>=</span><span>{</span><span class='pt10'>this</span><span>.</span><span class='pt5'>handleClick</span><span>}</span></td></tr>
<tr><td class='ln' data-ln='30'></td><td class='hi'><span> /></span></td></tr>
<tr><td class='ln' data-ln='31'></td><td class='hi'><span> </</span><span class='pt10'>div</span><span>></span></td></tr>
<tr><td class='ln' data-ln='32'></td><td class='hi'><span> );</span></td></tr>
<tr><td class='ln' data-ln='33'></td><td class='hi'><span> }</span></td></tr>
<tr><td class='ln' data-ln='34'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='35'></td><td> </td></tr>
<tr><td class='ln' data-ln='36'></td><td><span class='pt10'>export</span><span> </span><span class='pt10'>default</span><span> App;</span></td></tr>
</table>
</div>
</div>
</div>
<div class='style' id='P--predawn--jsx'>
<div class='P--predawn-bordered'>
<div class="info header">
<span class="left">app.jsx</span>
<span class="right"><span>36 lines</span><span>701.00 B</span></span>
</div>
<div class='P--predawn'>
<table>
<tr><td class='ln' data-ln='1'></td><td class='hi'><span class='pt18'>import</span><span> React </span><span class='pt18'>from</span><span> </span><span class='pt13'>'react'</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='2'></td><td><span class='pt18'>import</span><span> Display </span><span class='pt18'>from</span><span> </span><span class='pt13'>'./Display'</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='3'></td><td><span class='pt18'>import</span><span> ButtonPanel </span><span class='pt18'>from</span><span> </span><span class='pt13'>'./ButtonPanel'</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='4'></td><td><span class='pt18'>import</span><span> calculate </span><span class='pt18'>from</span><span> </span><span class='pt13'>'../logic/calculate'</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='5'></td><td><span class='pt18'>import</span><span> </span><span class='pt13'>'./App.css'</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='6'></td><td> </td></tr>
<tr><td class='ln' data-ln='7'></td><td><span class='pt16'>class</span><span> </span><span class='pt11'>App</span><span> </span><span class='pt16'>extends</span><span> React.Component {</span></td></tr>
<tr><td class='ln' data-ln='8'></td><td><span> constructor(props) {</span></td></tr>
<tr><td class='ln' data-ln='9'></td><td><span> </span><span class='pt18'>super</span><span>(props);</span></td></tr>
<tr><td class='ln' data-ln='10'></td><td> </td></tr>
<tr><td class='ln' data-ln='11'></td><td><span> </span><span class='pt16'>this</span><span>.state = {</span></td></tr>
<tr><td class='ln' data-ln='12'></td><td><span> total: </span><span class='pt16'>null</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='13'></td><td><span> next: </span><span class='pt16'>null</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='14'></td><td><span> operation: </span><span class='pt16'>null</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='15'></td><td><span> };</span></td></tr>
<tr><td class='ln' data-ln='16'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='17'></td><td> </td></tr>
<tr><td class='ln' data-ln='18'></td><td><span> </span><span class='pt18'>handleClick</span><span> = (buttonName) </span><span class='pt16'>=></span><span> {</span></td></tr>
<tr><td class='ln' data-ln='19'></td><td><span> </span><span class='pt16'>this</span><span>.</span><span class='pt18'>setState</span><span>(</span><span class='pt11'>calculate</span><span>(</span><span class='pt16'>this</span><span>.state, buttonName));</span></td></tr>
<tr><td class='ln' data-ln='20'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='21'></td><td> </td></tr>
<tr><td class='ln' data-ln='22'></td><td class='hi'><span> render() {</span></td></tr>
<tr><td class='ln' data-ln='23'></td><td class='hi'><span> </span><span class='pt16'>return</span><span> (</span></td></tr>
<tr><td class='ln' data-ln='24'></td><td class='hi'><span> </span><span class='pt11'><</span><span class='pt12'>div</span><span> </span><span class='pt11'>className</span><span class='pt18'>=</span><span class='pt13'>"component-app"</span><span class='pt11'>></span></td></tr>
<tr><td class='ln' data-ln='25'></td><td class='hi'><span> </span><span class='pt11'><</span><span class='pt12'>Display</span></td></tr>
<tr><td class='ln' data-ln='26'></td><td class='hi'><span> </span><span class='pt11'>value</span><span class='pt18'>=</span><span>{</span><span class='pt16'>this</span><span>.state.next </span><span class='pt18'>||</span><span> </span><span class='pt16'>this</span><span>.state.total </span><span class='pt18'>||</span><span> </span><span class='pt13'>'0'</span><span>}</span></td></tr>
<tr><td class='ln' data-ln='27'></td><td class='hi'><span> </span><span class='pt11'>/></span></td></tr>
<tr><td class='ln' data-ln='28'></td><td class='hi'><span> </span><span class='pt11'><</span><span class='pt12'>ButtonPanel</span></td></tr>
<tr><td class='ln' data-ln='29'></td><td class='hi'><span> </span><span class='pt11'>clickHandler</span><span class='pt18'>=</span><span>{</span><span class='pt16'>this</span><span>.handleClick}</span></td></tr>
<tr><td class='ln' data-ln='30'></td><td class='hi'><span> </span><span class='pt11'>/></span></td></tr>
<tr><td class='ln' data-ln='31'></td><td class='hi'><span> </span><span class='pt11'></</span><span class='pt12'>div</span><span class='pt11'>></span></td></tr>
<tr><td class='ln' data-ln='32'></td><td class='hi'><span> );</span></td></tr>
<tr><td class='ln' data-ln='33'></td><td class='hi'><span> }</span></td></tr>
<tr><td class='ln' data-ln='34'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='35'></td><td> </td></tr>
<tr><td class='ln' data-ln='36'></td><td><span class='pt18'>export</span><span> </span><span class='pt18'>default</span><span> App;</span></td></tr>
</table>
</div>
</div>
</div>
<div class='style' id='P--solarized_dark--jsx'>
<div class='P--solarized_dark-bordered'>
<div class="info header">
<span class="left">app.jsx</span>
<span class="right"><span>36 lines</span><span>701.00 B</span></span>
</div>
<div class='P--solarized_dark'>
<table>
<tr><td class='ln' data-ln='1'></td><td class='hi'><span class='pt5'>import</span><span> </span><span class='pt1'>React</span><span> </span><span class='pt5'>from</span><span> </span><span class='pt2'>'react'</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='2'></td><td><span class='pt5'>import</span><span> </span><span class='pt1'>Display</span><span> </span><span class='pt5'>from</span><span> </span><span class='pt2'>'./Display'</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='3'></td><td><span class='pt5'>import</span><span> </span><span class='pt1'>ButtonPanel</span><span> </span><span class='pt5'>from</span><span> </span><span class='pt2'>'./ButtonPanel'</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='4'></td><td><span class='pt5'>import</span><span> </span><span class='pt1'>calculate</span><span> </span><span class='pt5'>from</span><span> </span><span class='pt2'>'../logic/calculate'</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='5'></td><td><span class='pt5'>import</span><span> </span><span class='pt2'>'./App.css'</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='6'></td><td> </td></tr>
<tr><td class='ln' data-ln='7'></td><td><span class='bo'>class</span><span> </span><span class='pt6'>App</span><span> </span><span class='bo'>extends</span><span> </span><span class='pt6'>React</span><span class='pt5'>.</span><span class='pt6'>Component</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='8'></td><td><span> </span><span class='pt1'>constructor</span><span>(props) {</span></td></tr>
<tr><td class='ln' data-ln='9'></td><td><span> </span><span class='pt1'>super</span><span>(</span><span class='pt1'>props</span><span>);</span></td></tr>
<tr><td class='ln' data-ln='10'></td><td> </td></tr>
<tr><td class='ln' data-ln='11'></td><td><span> </span><span class='pt1'>this</span><span class='pt5'>.</span><span class='pt1'>state</span><span> = {</span></td></tr>
<tr><td class='ln' data-ln='12'></td><td><span> </span><span class='pt2'>total</span><span class='pt7'>:</span><span> </span><span class='pt6'>null</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='13'></td><td><span> </span><span class='pt2'>next</span><span class='pt7'>:</span><span> </span><span class='pt6'>null</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='14'></td><td><span> </span><span class='pt2'>operation</span><span class='pt7'>:</span><span> </span><span class='pt6'>null</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='15'></td><td><span> };</span></td></tr>
<tr><td class='ln' data-ln='16'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='17'></td><td> </td></tr>
<tr><td class='ln' data-ln='18'></td><td><span> </span><span class='pt1'>handleClick</span><span> = (buttonName) </span><span class='bo'>=></span><span> {</span></td></tr>
<tr><td class='ln' data-ln='19'></td><td><span> </span><span class='pt1'>this</span><span class='pt5'>.</span><span>setState(calculate(</span><span class='pt1'>this</span><span class='pt5'>.</span><span class='pt1'>state</span><span>, </span><span class='pt1'>buttonName</span><span>));</span></td></tr>
<tr><td class='ln' data-ln='20'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='21'></td><td> </td></tr>
<tr><td class='ln' data-ln='22'></td><td class='hi'><span> </span><span class='pt1'>render</span><span>() {</span></td></tr>
<tr><td class='ln' data-ln='23'></td><td class='hi'><span> </span><span class='pt5'>return</span><span> (</span></td></tr>
<tr><td class='ln' data-ln='24'></td><td class='hi'><span> </span><span class='pt3'><</span><span class='pt1 bo'>div</span><span> className</span><span class='pt5'>=</span><span class='pt2'>"component-app"</span><span class='pt3'>></span></td></tr>
<tr><td class='ln' data-ln='25'></td><td class='hi'><span> </span><span class='pt3'><</span><span class='pt1 bo'>Display</span></td></tr>
<tr><td class='ln' data-ln='26'></td><td class='hi'><span> value</span><span class='pt5'>=</span><span class='pt9'>{</span><span class='pt1'>this</span><span class='pt5'>.</span><span class='pt1'>state</span><span class='pt5'>.</span><span class='pt1'>next</span><span> </span><span class='pt5'>||</span><span> </span><span class='pt1'>this</span><span class='pt5'>.</span><span class='pt1'>state</span><span class='pt5'>.</span><span class='pt1'>total</span><span> </span><span class='pt5'>||</span><span> </span><span class='pt2'>'0'</span><span class='pt9'>}</span></td></tr>
<tr><td class='ln' data-ln='27'></td><td class='hi'><span> </span><span class='pt3'>/></span></td></tr>
<tr><td class='ln' data-ln='28'></td><td class='hi'><span> </span><span class='pt3'><</span><span class='pt1 bo'>ButtonPanel</span></td></tr>
<tr><td class='ln' data-ln='29'></td><td class='hi'><span> clickHandler</span><span class='pt5'>=</span><span class='pt9'>{</span><span class='pt1'>this</span><span class='pt5'>.</span><span class='pt1'>handleClick</span><span class='pt9'>}</span></td></tr>
<tr><td class='ln' data-ln='30'></td><td class='hi'><span> </span><span class='pt3'>/></span></td></tr>
<tr><td class='ln' data-ln='31'></td><td class='hi'><span> </span><span class='pt3'></</span><span class='pt1 bo'>div</span><span class='pt3'>></span></td></tr>
<tr><td class='ln' data-ln='32'></td><td class='hi'><span> );</span></td></tr>
<tr><td class='ln' data-ln='33'></td><td class='hi'><span> }</span></td></tr>
<tr><td class='ln' data-ln='34'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='35'></td><td> </td></tr>
<tr><td class='ln' data-ln='36'></td><td><span class='pt5'>export</span><span> </span><span class='pt5'>default</span><span> </span><span class='pt1'>App</span><span>;</span></td></tr>
</table>
</div>
</div>
</div>
<div class='style' id='P--solarized_light--jsx'>
<div class='P--solarized_light-bordered'>
<div class="info header">
<span class="left">app.jsx</span>
<span class="right"><span>36 lines</span><span>701.00 B</span></span>
</div>
<div class='P--solarized_light'>
<table>
<tr><td class='ln' data-ln='1'></td><td class='hi'><span class='pt4'>import</span><span> </span><span class='pt2'>React</span><span> </span><span class='pt4'>from</span><span> </span><span class='pt3'>'react'</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='2'></td><td><span class='pt4'>import</span><span> </span><span class='pt2'>Display</span><span> </span><span class='pt4'>from</span><span> </span><span class='pt3'>'./Display'</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='3'></td><td><span class='pt4'>import</span><span> </span><span class='pt2'>ButtonPanel</span><span> </span><span class='pt4'>from</span><span> </span><span class='pt3'>'./ButtonPanel'</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='4'></td><td><span class='pt4'>import</span><span> </span><span class='pt2'>calculate</span><span> </span><span class='pt4'>from</span><span> </span><span class='pt3'>'../logic/calculate'</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='5'></td><td><span class='pt4'>import</span><span> </span><span class='pt3'>'./App.css'</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='6'></td><td> </td></tr>
<tr><td class='ln' data-ln='7'></td><td><span class='pt1 bo'>class</span><span> </span><span class='pt6'>App</span><span> </span><span class='pt1 bo'>extends</span><span> </span><span class='pt6'>React</span><span class='pt4'>.</span><span class='pt6'>Component</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='8'></td><td><span> </span><span class='pt2'>constructor</span><span>(props) {</span></td></tr>
<tr><td class='ln' data-ln='9'></td><td><span> </span><span class='pt2'>super</span><span>(</span><span class='pt2'>props</span><span>);</span></td></tr>
<tr><td class='ln' data-ln='10'></td><td> </td></tr>
<tr><td class='ln' data-ln='11'></td><td><span> </span><span class='pt2'>this</span><span class='pt4'>.</span><span class='pt2'>state</span><span> = {</span></td></tr>
<tr><td class='ln' data-ln='12'></td><td><span> </span><span class='pt3'>total</span><span class='pt7'>:</span><span> </span><span class='pt6'>null</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='13'></td><td><span> </span><span class='pt3'>next</span><span class='pt7'>:</span><span> </span><span class='pt6'>null</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='14'></td><td><span> </span><span class='pt3'>operation</span><span class='pt7'>:</span><span> </span><span class='pt6'>null</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='15'></td><td><span> };</span></td></tr>
<tr><td class='ln' data-ln='16'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='17'></td><td> </td></tr>
<tr><td class='ln' data-ln='18'></td><td><span> </span><span class='pt2'>handleClick</span><span> = (buttonName) </span><span class='pt1 bo'>=></span><span> {</span></td></tr>
<tr><td class='ln' data-ln='19'></td><td><span> </span><span class='pt2'>this</span><span class='pt4'>.</span><span>setState(calculate(</span><span class='pt2'>this</span><span class='pt4'>.</span><span class='pt2'>state</span><span>, </span><span class='pt2'>buttonName</span><span>));</span></td></tr>
<tr><td class='ln' data-ln='20'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='21'></td><td> </td></tr>
<tr><td class='ln' data-ln='22'></td><td class='hi'><span> </span><span class='pt2'>render</span><span>() {</span></td></tr>
<tr><td class='ln' data-ln='23'></td><td class='hi'><span> </span><span class='pt4'>return</span><span> (</span></td></tr>
<tr><td class='ln' data-ln='24'></td><td class='hi'><span> </span><span class='pt5'><</span><span class='pt2 bo'>div</span><span> </span><span class='pt5'>className</span><span class='pt4'>=</span><span class='pt3'>"component-app"</span><span class='pt5'>></span></td></tr>
<tr><td class='ln' data-ln='25'></td><td class='hi'><span> </span><span class='pt5'><</span><span class='pt2 bo'>Display</span></td></tr>
<tr><td class='ln' data-ln='26'></td><td class='hi'><span> </span><span class='pt5'>value</span><span class='pt4'>=</span><span class='pt9'>{</span><span class='pt2'>this</span><span class='pt4'>.</span><span class='pt2'>state</span><span class='pt4'>.</span><span class='pt2'>next</span><span> </span><span class='pt4'>||</span><span> </span><span class='pt2'>this</span><span class='pt4'>.</span><span class='pt2'>state</span><span class='pt4'>.</span><span class='pt2'>total</span><span> </span><span class='pt4'>||</span><span> </span><span class='pt3'>'0'</span><span class='pt9'>}</span></td></tr>
<tr><td class='ln' data-ln='27'></td><td class='hi'><span> </span><span class='pt5'>/></span></td></tr>
<tr><td class='ln' data-ln='28'></td><td class='hi'><span> </span><span class='pt5'><</span><span class='pt2 bo'>ButtonPanel</span></td></tr>
<tr><td class='ln' data-ln='29'></td><td class='hi'><span> </span><span class='pt5'>clickHandler</span><span class='pt4'>=</span><span class='pt9'>{</span><span class='pt2'>this</span><span class='pt4'>.</span><span class='pt2'>handleClick</span><span class='pt9'>}</span></td></tr>
<tr><td class='ln' data-ln='30'></td><td class='hi'><span> </span><span class='pt5'>/></span></td></tr>
<tr><td class='ln' data-ln='31'></td><td class='hi'><span> </span><span class='pt5'></</span><span class='pt2 bo'>div</span><span class='pt5'>></span></td></tr>
<tr><td class='ln' data-ln='32'></td><td class='hi'><span> );</span></td></tr>
<tr><td class='ln' data-ln='33'></td><td class='hi'><span> }</span></td></tr>
<tr><td class='ln' data-ln='34'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='35'></td><td> </td></tr>
<tr><td class='ln' data-ln='36'></td><td><span class='pt4'>export</span><span> </span><span class='pt4'>default</span><span> </span><span class='pt2'>App</span><span>;</span></td></tr>
</table>
</div>
</div>
</div>
<div class='style' id='P--wombat--jsx'>
<div class='P--wombat-bordered'>
<div class="info header">
<span class="left">app.jsx</span>
<span class="right"><span>36 lines</span><span>701.00 B</span></span>
</div>
<div class='P--wombat'>
<table>
<tr><td class='ln' data-ln='1'></td><td class='hi'><span class='pt23'>import</span><span> React </span><span class='pt23'>from</span><span> </span><span class='pt15'>'react'</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='2'></td><td><span class='pt23'>import</span><span> Display </span><span class='pt23'>from</span><span> </span><span class='pt15'>'./Display'</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='3'></td><td><span class='pt23'>import</span><span> ButtonPanel </span><span class='pt23'>from</span><span> </span><span class='pt15'>'./ButtonPanel'</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='4'></td><td><span class='pt23'>import</span><span> calculate </span><span class='pt23'>from</span><span> </span><span class='pt15'>'../logic/calculate'</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='5'></td><td><span class='pt23'>import</span><span> </span><span class='pt15'>'./App.css'</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='6'></td><td> </td></tr>
<tr><td class='ln' data-ln='7'></td><td><span class='pt13 it'>class</span><span> </span><span class='pt19'>App</span><span> </span><span class='pt13 it'>extends</span><span> </span><span class='pt19'>React</span><span>.</span><span class='pt19 un it'>Component</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='8'></td><td><span> </span><span class='pt19'>constructor</span><span class='pt25'>(</span><span class='pt24 it'>props</span><span class='pt25'>)</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='9'></td><td><span> </span><span class='pt24'>super</span><span class='pt25'>(</span><span>props</span><span class='pt25'>)</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='10'></td><td> </td></tr>
<tr><td class='ln' data-ln='11'></td><td><span> </span><span class='pt24'>this</span><span>.state = {</span></td></tr>
<tr><td class='ln' data-ln='12'></td><td><span> </span><span class='pt15'>total</span><span class='pt17'>:</span><span> </span><span class='pt17'>null</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='13'></td><td><span> </span><span class='pt15'>next</span><span class='pt17'>:</span><span> </span><span class='pt17'>null</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='14'></td><td><span> </span><span class='pt15'>operation</span><span class='pt17'>:</span><span> </span><span class='pt17'>null</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='15'></td><td><span> };</span></td></tr>
<tr><td class='ln' data-ln='16'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='17'></td><td> </td></tr>
<tr><td class='ln' data-ln='18'></td><td><span> handleClick = </span><span class='pt25'>(</span><span class='pt24 it'>buttonName</span><span class='pt25'>)</span><span> </span><span class='pt13 it'>=></span><span> {</span></td></tr>
<tr><td class='ln' data-ln='19'></td><td><span> </span><span class='pt24'>this</span><span>.</span><span class='pt19'>setState</span><span class='pt25'>(</span><span class='pt19'>calculate</span><span class='pt25'>(</span><span class='pt24'>this</span><span>.state, buttonName</span><span class='pt25'>))</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='20'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='21'></td><td> </td></tr>
<tr><td class='ln' data-ln='22'></td><td class='hi'><span> </span><span class='pt19'>render</span><span class='pt25'>()</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='23'></td><td class='hi'><span> </span><span class='pt23'>return</span><span> </span><span class='pt25'>(</span></td></tr>
<tr><td class='ln' data-ln='24'></td><td class='hi'><span> </span><span class='pt25'><</span><span class='pt23'>div</span><span> </span><span class='pt19'>className</span><span class='pt23'>=</span><span class='pt15'>"component-app"</span><span class='pt25'>></span></td></tr>
<tr><td class='ln' data-ln='25'></td><td class='hi'><span> </span><span class='pt25'><</span><span class='pt23'>Display</span></td></tr>
<tr><td class='ln' data-ln='26'></td><td class='hi'><span> </span><span class='pt19'>value</span><span class='pt23'>=</span><span>{</span><span class='pt24'>this</span><span>.state.next </span><span class='pt23'>||</span><span> </span><span class='pt24'>this</span><span>.state.total </span><span class='pt23'>||</span><span> </span><span class='pt15'>'0'</span><span>}</span></td></tr>
<tr><td class='ln' data-ln='27'></td><td class='hi'><span> </span><span class='pt25'>/></span></td></tr>
<tr><td class='ln' data-ln='28'></td><td class='hi'><span> </span><span class='pt25'><</span><span class='pt23'>ButtonPanel</span></td></tr>
<tr><td class='ln' data-ln='29'></td><td class='hi'><span> </span><span class='pt19'>clickHandler</span><span class='pt23'>=</span><span>{</span><span class='pt24'>this</span><span>.handleClick}</span></td></tr>
<tr><td class='ln' data-ln='30'></td><td class='hi'><span> </span><span class='pt25'>/></span></td></tr>
<tr><td class='ln' data-ln='31'></td><td class='hi'><span> </span><span class='pt25'></</span><span class='pt23'>div</span><span class='pt25'>></span></td></tr>
<tr><td class='ln' data-ln='32'></td><td class='hi'><span> </span><span class='pt25'>)</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='33'></td><td class='hi'><span> }</span></td></tr>
<tr><td class='ln' data-ln='34'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='35'></td><td> </td></tr>
<tr><td class='ln' data-ln='36'></td><td><span class='pt23'>export</span><span> </span><span class='pt23'>default</span><span> App;</span></td></tr>
</table>
</div>
</div>
</div>
<div class='style' id='P--atom_dark--py'>
<div class='P--atom_dark-bordered'>
<div class="info header">
<span class="left">middleware.http.py</span>
<span class="right"><span>41 lines</span><span>1.58 KB</span></span>
</div>
<div class='P--atom_dark'>
<table>
<tr><td class='ln' data-ln='1'></td><td><span class='pt4'>from</span><span> django.utils.cache </span><span class='pt4'>import</span><span> (</span></td></tr>
<tr><td class='ln' data-ln='2'></td><td><span> cc_delim_re, get_conditional_response, set_response_etag,</span></td></tr>
<tr><td class='ln' data-ln='3'></td><td><span>)</span></td></tr>
<tr><td class='ln' data-ln='4'></td><td><span class='pt4'>from</span><span> django.utils.deprecation </span><span class='pt4'>import</span><span> MiddlewareMixin</span></td></tr>
<tr><td class='ln' data-ln='5'></td><td><span class='pt4'>from</span><span> django.utils.http </span><span class='pt4'>import</span><span> parse_http_date_safe</span></td></tr>
<tr><td class='ln' data-ln='6'></td><td> </td></tr>
<tr><td class='ln' data-ln='7'></td><td> </td></tr>
<tr><td class='ln' data-ln='8'></td><td class='hi'><span class='pt2 it'>class</span><span> </span><span class='pt28 un'>ConditionalGetMiddleware</span><span>(</span><span class='pt8 un it'>MiddlewareMixin</span><span>):</span></td></tr>
<tr><td class='ln' data-ln='9'></td><td><span> </span><span class='pt9'>"""</span></td></tr>
<tr><td class='ln' data-ln='10'></td><td><span class='pt9'> Handle conditional GET operations. If the response has an ETag or</span></td></tr>
<tr><td class='ln' data-ln='11'></td><td><span class='pt9'> Last-Modified header and the request has If-None-Match or If-Modified-Since,</span></td></tr>
<tr><td class='ln' data-ln='12'></td><td><span class='pt9'> replace the response with HttpNotModified. Add an ETag header if needed.</span></td></tr>
<tr><td class='ln' data-ln='13'></td><td><span class='pt9'> """</span></td></tr>
<tr><td class='ln' data-ln='14'></td><td><span> </span><span class='pt2 it'>def</span><span> </span><span class='pt25'>process_response</span><span>(</span><span class='pt13 it'>self</span><span>, </span><span class='pt13 it'>request</span><span>, </span><span class='pt13 it'>response</span><span>):</span></td></tr>
<tr><td class='ln' data-ln='15'></td><td class='hi'><span> </span><span class='pt3'># It's too late to prevent an unsafe request with a 412 response, and</span></td></tr>
<tr><td class='ln' data-ln='16'></td><td class='hi'><span> </span><span class='pt3'># for a HEAD request, the response body is always empty so computing</span></td></tr>
<tr><td class='ln' data-ln='17'></td><td class='hi'><span> </span><span class='pt3'># an accurate ETag isn't possible.</span></td></tr>
<tr><td class='ln' data-ln='18'></td><td><span> </span><span class='pt4'>if</span><span> request.method </span><span class='pt4'>!=</span><span> </span><span class='pt9'>'GET'</span><span>:</span></td></tr>
<tr><td class='ln' data-ln='19'></td><td><span> </span><span class='pt4'>return</span><span> response</span></td></tr>
<tr><td class='ln' data-ln='20'></td><td> </td></tr>
<tr><td class='ln' data-ln='21'></td><td><span> </span><span class='pt4'>if</span><span> </span><span class='pt16'>self</span><span>.</span><span class='pt16'>needs_etag</span><span>(response) </span><span class='pt4'>and</span><span> </span><span class='pt4'>not</span><span> response.</span><span class='pt16'>has_header</span><span>(</span><span class='pt9'>'ETag'</span><span>):</span></td></tr>
<tr><td class='ln' data-ln='22'></td><td><span> </span><span class='pt16'>set_response_etag</span><span>(response)</span></td></tr>
<tr><td class='ln' data-ln='23'></td><td> </td></tr>
<tr><td class='ln' data-ln='24'></td><td><span> etag </span><span class='pt4'>=</span><span> response.</span><span class='pt16'>get</span><span>(</span><span class='pt9'>'ETag'</span><span>)</span></td></tr>
<tr><td class='ln' data-ln='25'></td><td><span> last_modified </span><span class='pt4'>=</span><span> response.</span><span class='pt16'>get</span><span>(</span><span class='pt9'>'Last-Modified'</span><span>)</span></td></tr>
<tr><td class='ln' data-ln='26'></td><td><span> last_modified </span><span class='pt4'>=</span><span> last_modified </span><span class='pt4'>and</span><span> </span><span class='pt16'>parse_http_date_safe</span><span>(last_modified)</span></td></tr>
<tr><td class='ln' data-ln='27'></td><td> </td></tr>
<tr><td class='ln' data-ln='28'></td><td><span> </span><span class='pt4'>if</span><span> etag </span><span class='pt4'>or</span><span> last_modified:</span></td></tr>
<tr><td class='ln' data-ln='29'></td><td><span> </span><span class='pt4'>return</span><span> </span><span class='pt16'>get_conditional_response</span><span>(</span></td></tr>
<tr><td class='ln' data-ln='30'></td><td><span> request,</span></td></tr>
<tr><td class='ln' data-ln='31'></td><td><span> </span><span class='pt13 it'>etag</span><span class='pt4'>=</span><span>etag,</span></td></tr>
<tr><td class='ln' data-ln='32'></td><td><span> </span><span class='pt13 it'>last_modified</span><span class='pt4'>=</span><span>last_modified,</span></td></tr>
<tr><td class='ln' data-ln='33'></td><td><span> </span><span class='pt13 it'>response</span><span class='pt4'>=</span><span>response,</span></td></tr>
<tr><td class='ln' data-ln='34'></td><td><span> )</span></td></tr>
<tr><td class='ln' data-ln='35'></td><td> </td></tr>
<tr><td class='ln' data-ln='36'></td><td><span> </span><span class='pt4'>return</span><span> response</span></td></tr>
<tr><td class='ln' data-ln='37'></td><td> </td></tr>
<tr><td class='ln' data-ln='38'></td><td><span> </span><span class='pt2 it'>def</span><span> </span><span class='pt25'>needs_etag</span><span>(</span><span class='pt13 it'>self</span><span>, </span><span class='pt13 it'>response</span><span>):</span></td></tr>
<tr><td class='ln' data-ln='39'></td><td><span> </span><span class='pt9'>"""Return True if an ETag header should be added to response."""</span></td></tr>
<tr><td class='ln' data-ln='40'></td><td><span> cache_control_headers </span><span class='pt4'>=</span><span> cc_delim_re.</span><span class='pt16'>split</span><span>(response.</span><span class='pt16'>get</span><span>(</span><span class='pt9'>'Cache-Control'</span><span>, </span><span class='pt9'>''</span><span>))</span></td></tr>
<tr><td class='ln' data-ln='41'></td><td><span> </span><span class='pt4'>return</span><span> </span><span class='pt2'>all</span><span>(header.</span><span class='pt16'>lower</span><span>() </span><span class='pt4'>!=</span><span> </span><span class='pt9'>'no-store'</span><span> </span><span class='pt4'>for</span><span> header </span><span class='pt4'>in</span><span> cache_control_headers)</span></td></tr>
</table>
</div>
</div>
</div>
<div class='style' id='P--ayu_dark--py'>
<div class='P--ayu_dark-bordered'>
<div class="info header">
<span class="left">middleware.http.py</span>
<span class="right"><span>41 lines</span><span>1.58 KB</span></span>
</div>
<div class='P--ayu_dark'>
<table>
<tr><td class='ln' data-ln='1'></td><td><span class='pt21'>from</span><span> django</span><span class='pt18'>.</span><span>utils</span><span class='pt18'>.</span><span>cache </span><span class='pt21'>import</span><span> (</span></td></tr>
<tr><td class='ln' data-ln='2'></td><td><span> cc_delim_re</span><span class='pt25'>,</span><span> get_conditional_response</span><span class='pt25'>,</span><span> set_response_etag</span><span class='pt25'>,</span></td></tr>
<tr><td class='ln' data-ln='3'></td><td><span>)</span></td></tr>
<tr><td class='ln' data-ln='4'></td><td><span class='pt21'>from</span><span> django</span><span class='pt18'>.</span><span>utils</span><span class='pt18'>.</span><span>deprecation </span><span class='pt21'>import</span><span> MiddlewareMixin</span></td></tr>
<tr><td class='ln' data-ln='5'></td><td><span class='pt21'>from</span><span> django</span><span class='pt18'>.</span><span>utils</span><span class='pt18'>.</span><span>http </span><span class='pt21'>import</span><span> parse_http_date_safe</span></td></tr>
<tr><td class='ln' data-ln='6'></td><td> </td></tr>
<tr><td class='ln' data-ln='7'></td><td> </td></tr>
<tr><td class='ln' data-ln='8'></td><td class='hi'><span class='pt21'>class</span><span> </span><span class='pt9'>ConditionalGetMiddleware</span><span>(</span><span class='pt9 un'>MiddlewareMixin</span><span>):</span></td></tr>
<tr><td class='ln' data-ln='9'></td><td><span> </span><span class='pt10 it'>"""</span></td></tr>
<tr><td class='ln' data-ln='10'></td><td><span class='pt13'> Handle conditional GET operations. If the response has an ETag or</span></td></tr>
<tr><td class='ln' data-ln='11'></td><td><span class='pt13'> Last-Modified header and the request has If-None-Match or If-Modified-Since,</span></td></tr>
<tr><td class='ln' data-ln='12'></td><td><span class='pt13'> replace the response with HttpNotModified. Add an ETag header if needed.</span></td></tr>
<tr><td class='ln' data-ln='13'></td><td><span class='pt13'> </span><span class='pt10 it'>"""</span></td></tr>
<tr><td class='ln' data-ln='14'></td><td><span> </span><span class='pt21'>def</span><span> </span><span class='pt9'>process_response</span><span>(</span><span class='pt23'>self</span><span class='pt25'>,</span><span> </span><span class='pt23'>request</span><span class='pt25'>,</span><span> </span><span class='pt23'>response</span><span>):</span></td></tr>
<tr><td class='ln' data-ln='15'></td><td class='hi'><span> </span><span class='pt10 it'># It's too late to prevent an unsafe request with a 412 response, and</span></td></tr>
<tr><td class='ln' data-ln='16'></td><td class='hi'><span> </span><span class='pt10 it'># for a HEAD request, the response body is always empty so computing</span></td></tr>
<tr><td class='ln' data-ln='17'></td><td class='hi'><span> </span><span class='pt10 it'># an accurate ETag isn't possible.</span></td></tr>
<tr><td class='ln' data-ln='18'></td><td><span> </span><span class='pt21'>if</span><span> request</span><span class='pt18'>.</span><span>method </span><span class='pt18'>!=</span><span> </span><span class='pt13'>'GET'</span><span>:</span></td></tr>
<tr><td class='ln' data-ln='19'></td><td><span> </span><span class='pt21'>return</span><span> response</span></td></tr>
<tr><td class='ln' data-ln='20'></td><td> </td></tr>
<tr><td class='ln' data-ln='21'></td><td><span> </span><span class='pt21'>if</span><span> </span><span class='pt8 it'>self</span><span class='pt18'>.</span><span class='pt22'>needs_etag</span><span>(response) </span><span class='pt18'>and</span><span> </span><span class='pt18'>not</span><span> response</span><span class='pt18'>.</span><span class='pt22'>has_header</span><span>(</span><span class='pt13'>'ETag'</span><span>):</span></td></tr>
<tr><td class='ln' data-ln='22'></td><td><span> </span><span class='pt22'>set_response_etag</span><span>(response)</span></td></tr>
<tr><td class='ln' data-ln='23'></td><td> </td></tr>
<tr><td class='ln' data-ln='24'></td><td><span> etag </span><span class='pt18'>=</span><span> response</span><span class='pt18'>.</span><span class='pt22'>get</span><span>(</span><span class='pt13'>'ETag'</span><span>)</span></td></tr>
<tr><td class='ln' data-ln='25'></td><td><span> last_modified </span><span class='pt18'>=</span><span> response</span><span class='pt18'>.</span><span class='pt22'>get</span><span>(</span><span class='pt13'>'Last-Modified'</span><span>)</span></td></tr>
<tr><td class='ln' data-ln='26'></td><td><span> last_modified </span><span class='pt18'>=</span><span> last_modified </span><span class='pt18'>and</span><span> </span><span class='pt22'>parse_http_date_safe</span><span>(last_modified)</span></td></tr>
<tr><td class='ln' data-ln='27'></td><td> </td></tr>
<tr><td class='ln' data-ln='28'></td><td><span> </span><span class='pt21'>if</span><span> etag </span><span class='pt18'>or</span><span> last_modified:</span></td></tr>
<tr><td class='ln' data-ln='29'></td><td><span> </span><span class='pt21'>return</span><span> </span><span class='pt22'>get_conditional_response</span><span>(</span></td></tr>
<tr><td class='ln' data-ln='30'></td><td><span> request</span><span class='pt25'>,</span></td></tr>
<tr><td class='ln' data-ln='31'></td><td><span> </span><span class='pt23'>etag</span><span class='pt18'>=</span><span>etag</span><span class='pt25'>,</span></td></tr>
<tr><td class='ln' data-ln='32'></td><td><span> </span><span class='pt23'>last_modified</span><span class='pt18'>=</span><span>last_modified</span><span class='pt25'>,</span></td></tr>
<tr><td class='ln' data-ln='33'></td><td><span> </span><span class='pt23'>response</span><span class='pt18'>=</span><span>response</span><span class='pt25'>,</span></td></tr>
<tr><td class='ln' data-ln='34'></td><td><span> )</span></td></tr>
<tr><td class='ln' data-ln='35'></td><td> </td></tr>
<tr><td class='ln' data-ln='36'></td><td><span> </span><span class='pt21'>return</span><span> response</span></td></tr>
<tr><td class='ln' data-ln='37'></td><td> </td></tr>
<tr><td class='ln' data-ln='38'></td><td><span> </span><span class='pt21'>def</span><span> </span><span class='pt9'>needs_etag</span><span>(</span><span class='pt23'>self</span><span class='pt25'>,</span><span> </span><span class='pt23'>response</span><span>):</span></td></tr>
<tr><td class='ln' data-ln='39'></td><td><span> </span><span class='pt10 it'>"""</span><span class='pt13'>Return True if an ETag header should be added to response.</span><span class='pt10 it'>"""</span></td></tr>
<tr><td class='ln' data-ln='40'></td><td><span> cache_control_headers </span><span class='pt18'>=</span><span> cc_delim_re</span><span class='pt18'>.</span><span class='pt22'>split</span><span>(response</span><span class='pt18'>.</span><span class='pt22'>get</span><span>(</span><span class='pt13'>'Cache-Control'</span><span class='pt25'>,</span><span> </span><span class='pt13'>''</span><span>))</span></td></tr>
<tr><td class='ln' data-ln='41'></td><td><span> </span><span class='pt21'>return</span><span> </span><span class='pt17'>all</span><span>(header</span><span class='pt18'>.</span><span class='pt22'>lower</span><span>() </span><span class='pt18'>!=</span><span> </span><span class='pt13'>'no-store'</span><span> </span><span class='pt21'>for</span><span> header </span><span class='pt21'>in</span><span> cache_control_headers)</span></td></tr>
</table>
</div>
</div>
</div>
<div class='style' id='P--ayu_light--py'>
<div class='P--ayu_light-bordered'>
<div class="info header">
<span class="left">middleware.http.py</span>
<span class="right"><span>41 lines</span><span>1.58 KB</span></span>
</div>
<div class='P--ayu_light'>
<table>
<tr><td class='ln' data-ln='1'></td><td><span class='pt21'>from</span><span> django</span><span class='pt17'>.</span><span>utils</span><span class='pt17'>.</span><span>cache </span><span class='pt21'>import</span><span> (</span></td></tr>
<tr><td class='ln' data-ln='2'></td><td><span> cc_delim_re</span><span class='pt26'>,</span><span> get_conditional_response</span><span class='pt26'>,</span><span> set_response_etag</span><span class='pt26'>,</span></td></tr>
<tr><td class='ln' data-ln='3'></td><td><span>)</span></td></tr>
<tr><td class='ln' data-ln='4'></td><td><span class='pt21'>from</span><span> django</span><span class='pt17'>.</span><span>utils</span><span class='pt17'>.</span><span>deprecation </span><span class='pt21'>import</span><span> MiddlewareMixin</span></td></tr>
<tr><td class='ln' data-ln='5'></td><td><span class='pt21'>from</span><span> django</span><span class='pt17'>.</span><span>utils</span><span class='pt17'>.</span><span>http </span><span class='pt21'>import</span><span> parse_http_date_safe</span></td></tr>
<tr><td class='ln' data-ln='6'></td><td> </td></tr>
<tr><td class='ln' data-ln='7'></td><td> </td></tr>
<tr><td class='ln' data-ln='8'></td><td class='hi'><span class='pt21'>class</span><span> </span><span class='pt7'>ConditionalGetMiddleware</span><span>(</span><span class='pt7 un'>MiddlewareMixin</span><span>):</span></td></tr>
<tr><td class='ln' data-ln='9'></td><td><span> </span><span class='pt12 it'>"""</span></td></tr>
<tr><td class='ln' data-ln='10'></td><td><span class='pt10'> Handle conditional GET operations. If the response has an ETag or</span></td></tr>
<tr><td class='ln' data-ln='11'></td><td><span class='pt10'> Last-Modified header and the request has If-None-Match or If-Modified-Since,</span></td></tr>
<tr><td class='ln' data-ln='12'></td><td><span class='pt10'> replace the response with HttpNotModified. Add an ETag header if needed.</span></td></tr>
<tr><td class='ln' data-ln='13'></td><td><span class='pt10'> </span><span class='pt12 it'>"""</span></td></tr>
<tr><td class='ln' data-ln='14'></td><td><span> </span><span class='pt21'>def</span><span> </span><span class='pt7'>process_response</span><span>(</span><span class='pt11'>self</span><span class='pt26'>,</span><span> </span><span class='pt11'>request</span><span class='pt26'>,</span><span> </span><span class='pt11'>response</span><span>):</span></td></tr>
<tr><td class='ln' data-ln='15'></td><td class='hi'><span> </span><span class='pt12 it'># It's too late to prevent an unsafe request with a 412 response, and</span></td></tr>
<tr><td class='ln' data-ln='16'></td><td class='hi'><span> </span><span class='pt12 it'># for a HEAD request, the response body is always empty so computing</span></td></tr>
<tr><td class='ln' data-ln='17'></td><td class='hi'><span> </span><span class='pt12 it'># an accurate ETag isn't possible.</span></td></tr>
<tr><td class='ln' data-ln='18'></td><td><span> </span><span class='pt21'>if</span><span> request</span><span class='pt17'>.</span><span>method </span><span class='pt17'>!=</span><span> </span><span class='pt10'>'GET'</span><span>:</span></td></tr>
<tr><td class='ln' data-ln='19'></td><td><span> </span><span class='pt21'>return</span><span> response</span></td></tr>
<tr><td class='ln' data-ln='20'></td><td> </td></tr>
<tr><td class='ln' data-ln='21'></td><td><span> </span><span class='pt21'>if</span><span> </span><span class='pt9 it'>self</span><span class='pt17'>.</span><span class='pt19'>needs_etag</span><span>(response) </span><span class='pt17'>and</span><span> </span><span class='pt17'>not</span><span> response</span><span class='pt17'>.</span><span class='pt19'>has_header</span><span>(</span><span class='pt10'>'ETag'</span><span>):</span></td></tr>
<tr><td class='ln' data-ln='22'></td><td><span> </span><span class='pt19'>set_response_etag</span><span>(response)</span></td></tr>
<tr><td class='ln' data-ln='23'></td><td> </td></tr>
<tr><td class='ln' data-ln='24'></td><td><span> etag </span><span class='pt17'>=</span><span> response</span><span class='pt17'>.</span><span class='pt19'>get</span><span>(</span><span class='pt10'>'ETag'</span><span>)</span></td></tr>
<tr><td class='ln' data-ln='25'></td><td><span> last_modified </span><span class='pt17'>=</span><span> response</span><span class='pt17'>.</span><span class='pt19'>get</span><span>(</span><span class='pt10'>'Last-Modified'</span><span>)</span></td></tr>
<tr><td class='ln' data-ln='26'></td><td><span> last_modified </span><span class='pt17'>=</span><span> last_modified </span><span class='pt17'>and</span><span> </span><span class='pt19'>parse_http_date_safe</span><span>(last_modified)</span></td></tr>
<tr><td class='ln' data-ln='27'></td><td> </td></tr>
<tr><td class='ln' data-ln='28'></td><td><span> </span><span class='pt21'>if</span><span> etag </span><span class='pt17'>or</span><span> last_modified:</span></td></tr>
<tr><td class='ln' data-ln='29'></td><td><span> </span><span class='pt21'>return</span><span> </span><span class='pt19'>get_conditional_response</span><span>(</span></td></tr>
<tr><td class='ln' data-ln='30'></td><td><span> request</span><span class='pt26'>,</span></td></tr>
<tr><td class='ln' data-ln='31'></td><td><span> </span><span class='pt11'>etag</span><span class='pt17'>=</span><span>etag</span><span class='pt26'>,</span></td></tr>
<tr><td class='ln' data-ln='32'></td><td><span> </span><span class='pt11'>last_modified</span><span class='pt17'>=</span><span>last_modified</span><span class='pt26'>,</span></td></tr>
<tr><td class='ln' data-ln='33'></td><td><span> </span><span class='pt11'>response</span><span class='pt17'>=</span><span>response</span><span class='pt26'>,</span></td></tr>
<tr><td class='ln' data-ln='34'></td><td><span> )</span></td></tr>
<tr><td class='ln' data-ln='35'></td><td> </td></tr>
<tr><td class='ln' data-ln='36'></td><td><span> </span><span class='pt21'>return</span><span> response</span></td></tr>
<tr><td class='ln' data-ln='37'></td><td> </td></tr>
<tr><td class='ln' data-ln='38'></td><td><span> </span><span class='pt21'>def</span><span> </span><span class='pt7'>needs_etag</span><span>(</span><span class='pt11'>self</span><span class='pt26'>,</span><span> </span><span class='pt11'>response</span><span>):</span></td></tr>
<tr><td class='ln' data-ln='39'></td><td><span> </span><span class='pt12 it'>"""</span><span class='pt10'>Return True if an ETag header should be added to response.</span><span class='pt12 it'>"""</span></td></tr>
<tr><td class='ln' data-ln='40'></td><td><span> cache_control_headers </span><span class='pt17'>=</span><span> cc_delim_re</span><span class='pt17'>.</span><span class='pt19'>split</span><span>(response</span><span class='pt17'>.</span><span class='pt19'>get</span><span>(</span><span class='pt10'>'Cache-Control'</span><span class='pt26'>,</span><span> </span><span class='pt10'>''</span><span>))</span></td></tr>
<tr><td class='ln' data-ln='41'></td><td><span> </span><span class='pt21'>return</span><span> </span><span class='pt18'>all</span><span>(header</span><span class='pt17'>.</span><span class='pt19'>lower</span><span>() </span><span class='pt17'>!=</span><span> </span><span class='pt10'>'no-store'</span><span> </span><span class='pt21'>for</span><span> header </span><span class='pt21'>in</span><span> cache_control_headers)</span></td></tr>
</table>
</div>
</div>
</div>
<div class='style' id='P--ayu_mirage--py'>
<div class='P--ayu_mirage-bordered'>
<div class="info header">
<span class="left">middleware.http.py</span>
<span class="right"><span>41 lines</span><span>1.58 KB</span></span>
</div>
<div class='P--ayu_mirage'>
<table>
<tr><td class='ln' data-ln='1'></td><td><span class='pt19'>from</span><span> django</span><span class='pt17'>.</span><span>utils</span><span class='pt17'>.</span><span>cache </span><span class='pt19'>import</span><span> (</span></td></tr>
<tr><td class='ln' data-ln='2'></td><td><span> cc_delim_re</span><span class='pt24'>,</span><span> get_conditional_response</span><span class='pt24'>,</span><span> set_response_etag</span><span class='pt24'>,</span></td></tr>
<tr><td class='ln' data-ln='3'></td><td><span>)</span></td></tr>
<tr><td class='ln' data-ln='4'></td><td><span class='pt19'>from</span><span> django</span><span class='pt17'>.</span><span>utils</span><span class='pt17'>.</span><span>deprecation </span><span class='pt19'>import</span><span> MiddlewareMixin</span></td></tr>
<tr><td class='ln' data-ln='5'></td><td><span class='pt19'>from</span><span> django</span><span class='pt17'>.</span><span>utils</span><span class='pt17'>.</span><span>http </span><span class='pt19'>import</span><span> parse_http_date_safe</span></td></tr>
<tr><td class='ln' data-ln='6'></td><td> </td></tr>
<tr><td class='ln' data-ln='7'></td><td> </td></tr>
<tr><td class='ln' data-ln='8'></td><td class='hi'><span class='pt19'>class</span><span> </span><span class='pt10'>ConditionalGetMiddleware</span><span>(</span><span class='pt10 un'>MiddlewareMixin</span><span>):</span></td></tr>
<tr><td class='ln' data-ln='9'></td><td><span> </span><span class='pt8 it'>"""</span></td></tr>
<tr><td class='ln' data-ln='10'></td><td><span class='pt12'> Handle conditional GET operations. If the response has an ETag or</span></td></tr>
<tr><td class='ln' data-ln='11'></td><td><span class='pt12'> Last-Modified header and the request has If-None-Match or If-Modified-Since,</span></td></tr>
<tr><td class='ln' data-ln='12'></td><td><span class='pt12'> replace the response with HttpNotModified. Add an ETag header if needed.</span></td></tr>
<tr><td class='ln' data-ln='13'></td><td><span class='pt12'> </span><span class='pt8 it'>"""</span></td></tr>
<tr><td class='ln' data-ln='14'></td><td><span> </span><span class='pt19'>def</span><span> </span><span class='pt10'>process_response</span><span>(</span><span class='pt14'>self</span><span class='pt24'>,</span><span> </span><span class='pt14'>request</span><span class='pt24'>,</span><span> </span><span class='pt14'>response</span><span>):</span></td></tr>
<tr><td class='ln' data-ln='15'></td><td class='hi'><span> </span><span class='pt8 it'># It's too late to prevent an unsafe request with a 412 response, and</span></td></tr>
<tr><td class='ln' data-ln='16'></td><td class='hi'><span> </span><span class='pt8 it'># for a HEAD request, the response body is always empty so computing</span></td></tr>
<tr><td class='ln' data-ln='17'></td><td class='hi'><span> </span><span class='pt8 it'># an accurate ETag isn't possible.</span></td></tr>
<tr><td class='ln' data-ln='18'></td><td><span> </span><span class='pt19'>if</span><span> request</span><span class='pt17'>.</span><span>method </span><span class='pt17'>!=</span><span> </span><span class='pt12'>'GET'</span><span>:</span></td></tr>
<tr><td class='ln' data-ln='19'></td><td><span> </span><span class='pt19'>return</span><span> response</span></td></tr>
<tr><td class='ln' data-ln='20'></td><td> </td></tr>
<tr><td class='ln' data-ln='21'></td><td><span> </span><span class='pt19'>if</span><span> </span><span class='pt9 it'>self</span><span class='pt17'>.</span><span class='pt22'>needs_etag</span><span>(response) </span><span class='pt17'>and</span><span> </span><span class='pt17'>not</span><span> response</span><span class='pt17'>.</span><span class='pt22'>has_header</span><span>(</span><span class='pt12'>'ETag'</span><span>):</span></td></tr>
<tr><td class='ln' data-ln='22'></td><td><span> </span><span class='pt22'>set_response_etag</span><span>(response)</span></td></tr>
<tr><td class='ln' data-ln='23'></td><td> </td></tr>
<tr><td class='ln' data-ln='24'></td><td><span> etag </span><span class='pt17'>=</span><span> response</span><span class='pt17'>.</span><span class='pt22'>get</span><span>(</span><span class='pt12'>'ETag'</span><span>)</span></td></tr>
<tr><td class='ln' data-ln='25'></td><td><span> last_modified </span><span class='pt17'>=</span><span> response</span><span class='pt17'>.</span><span class='pt22'>get</span><span>(</span><span class='pt12'>'Last-Modified'</span><span>)</span></td></tr>
<tr><td class='ln' data-ln='26'></td><td><span> last_modified </span><span class='pt17'>=</span><span> last_modified </span><span class='pt17'>and</span><span> </span><span class='pt22'>parse_http_date_safe</span><span>(last_modified)</span></td></tr>
<tr><td class='ln' data-ln='27'></td><td> </td></tr>
<tr><td class='ln' data-ln='28'></td><td><span> </span><span class='pt19'>if</span><span> etag </span><span class='pt17'>or</span><span> last_modified:</span></td></tr>
<tr><td class='ln' data-ln='29'></td><td><span> </span><span class='pt19'>return</span><span> </span><span class='pt22'>get_conditional_response</span><span>(</span></td></tr>
<tr><td class='ln' data-ln='30'></td><td><span> request</span><span class='pt24'>,</span></td></tr>
<tr><td class='ln' data-ln='31'></td><td><span> </span><span class='pt14'>etag</span><span class='pt17'>=</span><span>etag</span><span class='pt24'>,</span></td></tr>
<tr><td class='ln' data-ln='32'></td><td><span> </span><span class='pt14'>last_modified</span><span class='pt17'>=</span><span>last_modified</span><span class='pt24'>,</span></td></tr>
<tr><td class='ln' data-ln='33'></td><td><span> </span><span class='pt14'>response</span><span class='pt17'>=</span><span>response</span><span class='pt24'>,</span></td></tr>
<tr><td class='ln' data-ln='34'></td><td><span> )</span></td></tr>
<tr><td class='ln' data-ln='35'></td><td> </td></tr>
<tr><td class='ln' data-ln='36'></td><td><span> </span><span class='pt19'>return</span><span> response</span></td></tr>
<tr><td class='ln' data-ln='37'></td><td> </td></tr>
<tr><td class='ln' data-ln='38'></td><td><span> </span><span class='pt19'>def</span><span> </span><span class='pt10'>needs_etag</span><span>(</span><span class='pt14'>self</span><span class='pt24'>,</span><span> </span><span class='pt14'>response</span><span>):</span></td></tr>
<tr><td class='ln' data-ln='39'></td><td><span> </span><span class='pt8 it'>"""</span><span class='pt12'>Return True if an ETag header should be added to response.</span><span class='pt8 it'>"""</span></td></tr>
<tr><td class='ln' data-ln='40'></td><td><span> cache_control_headers </span><span class='pt17'>=</span><span> cc_delim_re</span><span class='pt17'>.</span><span class='pt22'>split</span><span>(response</span><span class='pt17'>.</span><span class='pt22'>get</span><span>(</span><span class='pt12'>'Cache-Control'</span><span class='pt24'>,</span><span> </span><span class='pt12'>''</span><span>))</span></td></tr>
<tr><td class='ln' data-ln='41'></td><td><span> </span><span class='pt19'>return</span><span> </span><span class='pt16'>all</span><span>(header</span><span class='pt17'>.</span><span class='pt22'>lower</span><span>() </span><span class='pt17'>!=</span><span> </span><span class='pt12'>'no-store'</span><span> </span><span class='pt19'>for</span><span> header </span><span class='pt19'>in</span><span> cache_control_headers)</span></td></tr>
</table>
</div>
</div>
</div>
<div class='style' id='P--cobalt2--py'>
<div class='P--cobalt2-bordered'>
<div class="info header">
<span class="left">middleware.http.py</span>
<span class="right"><span>41 lines</span><span>1.58 KB</span></span>
</div>
<div class='P--cobalt2'>
<table>
<tr><td class='ln' data-ln='1'></td><td><span class='pt56'>from</span><span> django</span><span class='pt43'>.</span><span>utils</span><span class='pt43'>.</span><span>cache </span><span class='pt56'>import</span><span> </span><span class='pt43'>(</span></td></tr>
<tr><td class='ln' data-ln='2'></td><td><span> cc_delim_re</span><span class='pt43'>,</span><span> get_conditional_response</span><span class='pt43'>,</span><span> set_response_etag</span><span class='pt43'>,</span></td></tr>
<tr><td class='ln' data-ln='3'></td><td><span class='pt43'>)</span></td></tr>
<tr><td class='ln' data-ln='4'></td><td><span class='pt56'>from</span><span> django</span><span class='pt43'>.</span><span>utils</span><span class='pt43'>.</span><span>deprecation </span><span class='pt56'>import</span><span> MiddlewareMixin</span></td></tr>
<tr><td class='ln' data-ln='5'></td><td><span class='pt56'>from</span><span> django</span><span class='pt43'>.</span><span>utils</span><span class='pt43'>.</span><span>http </span><span class='pt56'>import</span><span> parse_http_date_safe</span></td></tr>
<tr><td class='ln' data-ln='6'></td><td> </td></tr>
<tr><td class='ln' data-ln='7'></td><td> </td></tr>
<tr><td class='ln' data-ln='8'></td><td class='hi'><span class='pt60'>class</span><span> </span><span class='pt60'>ConditionalGetMiddleware</span><span class='pt43'>(</span><span class='pt27 it'>MiddlewareMixin</span><span class='pt43'>):</span></td></tr>
<tr><td class='ln' data-ln='9'></td><td><span> </span><span class='pt19'>"""</span></td></tr>
<tr><td class='ln' data-ln='10'></td><td><span class='pt23'> Handle conditional GET operations. If the response has an ETag or</span></td></tr>
<tr><td class='ln' data-ln='11'></td><td><span class='pt23'> Last-Modified header and the request has If-None-Match or If-Modified-Since,</span></td></tr>
<tr><td class='ln' data-ln='12'></td><td><span class='pt23'> replace the response with HttpNotModified. Add an ETag header if needed.</span></td></tr>
<tr><td class='ln' data-ln='13'></td><td><span class='pt23'> </span><span class='pt19'>"""</span></td></tr>
<tr><td class='ln' data-ln='14'></td><td><span> </span><span class='pt60'>def</span><span> </span><span class='pt60'>process_response</span><span class='pt43'>(</span><span class='pt41 pt4'>self</span><span class='pt43'>,</span><span> </span><span class='pt41 pt4'>request</span><span class='pt43'>,</span><span> </span><span class='pt41 pt4'>response</span><span class='pt43'>):</span></td></tr>
<tr><td class='ln' data-ln='15'></td><td class='hi'><span> </span><span class='pt19 it'># It's too late to prevent an unsafe request with a 412 response, and</span></td></tr>
<tr><td class='ln' data-ln='16'></td><td class='hi'><span> </span><span class='pt19 it'># for a HEAD request, the response body is always empty so computing</span></td></tr>
<tr><td class='ln' data-ln='17'></td><td class='hi'><span> </span><span class='pt19 it'># an accurate ETag isn't possible.</span></td></tr>
<tr><td class='ln' data-ln='18'></td><td><span> </span><span class='pt56'>if</span><span> request</span><span class='pt43'>.</span><span>method </span><span class='pt56'>!=</span><span> </span><span class='pt23'>'GET'</span><span class='pt43'>:</span></td></tr>
<tr><td class='ln' data-ln='19'></td><td><span> </span><span class='pt56'>return</span><span> response</span></td></tr>
<tr><td class='ln' data-ln='20'></td><td> </td></tr>
<tr><td class='ln' data-ln='21'></td><td><span> </span><span class='pt56'>if</span><span> </span><span class='pt55'>self</span><span class='pt43'>.</span><span class='pt62'>needs_etag</span><span class='pt43'>(</span><span class='pt41'>response</span><span class='pt43'>)</span><span> </span><span class='pt56'>and</span><span> </span><span class='pt56'>not</span><span> </span><span class='pt41'>response</span><span class='pt43'>.</span><span class='pt62'>has_header</span><span class='pt43'>(</span><span class='pt23'>'ETag'</span><span class='pt43'>):</span></td></tr>
<tr><td class='ln' data-ln='22'></td><td><span> </span><span class='pt62'>set_response_etag</span><span class='pt43'>(</span><span class='pt41'>response</span><span class='pt43'>)</span></td></tr>
<tr><td class='ln' data-ln='23'></td><td> </td></tr>
<tr><td class='ln' data-ln='24'></td><td><span> etag </span><span class='pt56'>=</span><span> </span><span class='pt41'>response</span><span class='pt43'>.</span><span class='pt62'>get</span><span class='pt43'>(</span><span class='pt23'>'ETag'</span><span class='pt43'>)</span></td></tr>
<tr><td class='ln' data-ln='25'></td><td><span> last_modified </span><span class='pt56'>=</span><span> </span><span class='pt41'>response</span><span class='pt43'>.</span><span class='pt62'>get</span><span class='pt43'>(</span><span class='pt23'>'Last-Modified'</span><span class='pt43'>)</span></td></tr>
<tr><td class='ln' data-ln='26'></td><td><span> last_modified </span><span class='pt56'>=</span><span> last_modified </span><span class='pt56'>and</span><span> </span><span class='pt62'>parse_http_date_safe</span><span class='pt43'>(</span><span class='pt41'>last_modified</span><span class='pt43'>)</span></td></tr>
<tr><td class='ln' data-ln='27'></td><td> </td></tr>
<tr><td class='ln' data-ln='28'></td><td><span> </span><span class='pt56'>if</span><span> etag </span><span class='pt56'>or</span><span> last_modified</span><span class='pt43'>:</span></td></tr>
<tr><td class='ln' data-ln='29'></td><td><span> </span><span class='pt56'>return</span><span> </span><span class='pt62'>get_conditional_response</span><span class='pt43'>(</span></td></tr>
<tr><td class='ln' data-ln='30'></td><td><span class='pt41'> request</span><span class='pt43'>,</span></td></tr>
<tr><td class='ln' data-ln='31'></td><td><span class='pt41'> </span><span class='pt41 pt4'>etag</span><span class='pt56'>=</span><span class='pt41'>etag</span><span class='pt43'>,</span></td></tr>
<tr><td class='ln' data-ln='32'></td><td><span class='pt41'> </span><span class='pt41 pt4'>last_modified</span><span class='pt56'>=</span><span class='pt41'>last_modified</span><span class='pt43'>,</span></td></tr>
<tr><td class='ln' data-ln='33'></td><td><span class='pt41'> </span><span class='pt41 pt4'>response</span><span class='pt56'>=</span><span class='pt41'>response</span><span class='pt43'>,</span></td></tr>
<tr><td class='ln' data-ln='34'></td><td><span class='pt41'> </span><span class='pt43'>)</span></td></tr>
<tr><td class='ln' data-ln='35'></td><td> </td></tr>
<tr><td class='ln' data-ln='36'></td><td><span> </span><span class='pt56'>return</span><span> response</span></td></tr>
<tr><td class='ln' data-ln='37'></td><td> </td></tr>
<tr><td class='ln' data-ln='38'></td><td><span> </span><span class='pt60'>def</span><span> </span><span class='pt60'>needs_etag</span><span class='pt43'>(</span><span class='pt41 pt4'>self</span><span class='pt43'>,</span><span> </span><span class='pt41 pt4'>response</span><span class='pt43'>):</span></td></tr>
<tr><td class='ln' data-ln='39'></td><td><span> </span><span class='pt19'>"""</span><span class='pt23'>Return True if an ETag header should be added to response.</span><span class='pt19'>"""</span></td></tr>
<tr><td class='ln' data-ln='40'></td><td><span> cache_control_headers </span><span class='pt56'>=</span><span> </span><span class='pt41'>cc_delim_re</span><span class='pt43'>.</span><span class='pt62'>split</span><span class='pt43'>(</span><span class='pt41'>response</span><span class='pt43'>.</span><span class='pt62'>get</span><span class='pt43'>(</span><span class='pt23'>'Cache-Control'</span><span class='pt43'>,</span><span class='pt41'> </span><span class='pt23'>''</span><span class='pt43'>))</span></td></tr>
<tr><td class='ln' data-ln='41'></td><td><span> </span><span class='pt56'>return</span><span> </span><span class='pt58'>all</span><span class='pt43'>(</span><span class='pt41'>header</span><span class='pt43'>.</span><span class='pt62'>lower</span><span class='pt43'>()</span><span class='pt41'> </span><span class='pt56'>!=</span><span class='pt41'> </span><span class='pt23'>'no-store'</span><span class='pt41'> </span><span class='pt56'>for</span><span class='pt41'> header </span><span class='pt56'>in</span><span class='pt41'> cache_control_headers</span><span class='pt43'>)</span></td></tr>
</table>
</div>
</div>
</div>
<div class='style' id='P--dracula--py'>
<div class='P--dracula-bordered'>
<div class="info header">
<span class="left">middleware.http.py</span>
<span class="right"><span>41 lines</span><span>1.58 KB</span></span>
</div>
<div class='P--dracula'>
<table>
<tr><td class='ln' data-ln='1'></td><td><span class='pt9'>from</span><span> django.utils.cache </span><span class='pt9'>import</span><span> (</span></td></tr>
<tr><td class='ln' data-ln='2'></td><td><span> cc_delim_re, get_conditional_response, set_response_etag,</span></td></tr>
<tr><td class='ln' data-ln='3'></td><td><span>)</span></td></tr>
<tr><td class='ln' data-ln='4'></td><td><span class='pt9'>from</span><span> django.utils.deprecation </span><span class='pt9'>import</span><span> MiddlewareMixin</span></td></tr>
<tr><td class='ln' data-ln='5'></td><td><span class='pt9'>from</span><span> django.utils.http </span><span class='pt9'>import</span><span> parse_http_date_safe</span></td></tr>
<tr><td class='ln' data-ln='6'></td><td> </td></tr>
<tr><td class='ln' data-ln='7'></td><td> </td></tr>
<tr><td class='ln' data-ln='8'></td><td class='hi'><span class='pt9'>class</span><span> </span><span class='pt3'>ConditionalGetMiddleware</span><span>(</span><span class='pt3 it'>MiddlewareMixin</span><span>):</span></td></tr>
<tr><td class='ln' data-ln='9'></td><td><span> </span><span class='pt2'>"""</span></td></tr>
<tr><td class='ln' data-ln='10'></td><td><span class='pt7'> Handle conditional GET operations. If the response has an ETag or</span></td></tr>
<tr><td class='ln' data-ln='11'></td><td><span class='pt7'> Last-Modified header and the request has If-None-Match or If-Modified-Since,</span></td></tr>
<tr><td class='ln' data-ln='12'></td><td><span class='pt7'> replace the response with HttpNotModified. Add an ETag header if needed.</span></td></tr>
<tr><td class='ln' data-ln='13'></td><td><span class='pt7'> </span><span class='pt2'>"""</span></td></tr>
<tr><td class='ln' data-ln='14'></td><td><span> </span><span class='pt9'>def</span><span> </span><span class='pt1'>process_response</span><span>(</span><span class='pt10 it'>self</span><span>, </span><span class='pt10 it'>request</span><span>, </span><span class='pt10 it'>response</span><span>):</span></td></tr>
<tr><td class='ln' data-ln='15'></td><td class='hi'><span> </span><span class='pt2'># It's too late to prevent an unsafe request with a 412 response, and</span></td></tr>
<tr><td class='ln' data-ln='16'></td><td class='hi'><span> </span><span class='pt2'># for a HEAD request, the response body is always empty so computing</span></td></tr>
<tr><td class='ln' data-ln='17'></td><td class='hi'><span> </span><span class='pt2'># an accurate ETag isn't possible.</span></td></tr>
<tr><td class='ln' data-ln='18'></td><td><span> </span><span class='pt9'>if</span><span> request.method </span><span class='pt9'>!=</span><span> </span><span class='pt6'>'</span><span class='pt7'>GET</span><span class='pt6'>'</span><span>:</span></td></tr>
<tr><td class='ln' data-ln='19'></td><td><span> </span><span class='pt9'>return</span><span> response</span></td></tr>
<tr><td class='ln' data-ln='20'></td><td> </td></tr>
<tr><td class='ln' data-ln='21'></td><td><span> </span><span class='pt9'>if</span><span> </span><span class='pt5 it'>self</span><span>.</span><span class='pt1'>needs_etag</span><span>(response) </span><span class='pt9'>and</span><span> </span><span class='pt9'>not</span><span> response.</span><span class='pt1'>has_header</span><span>(</span><span class='pt6'>'</span><span class='pt7'>ETag</span><span class='pt6'>'</span><span>):</span></td></tr>
<tr><td class='ln' data-ln='22'></td><td><span> </span><span class='pt1'>set_response_etag</span><span>(response)</span></td></tr>
<tr><td class='ln' data-ln='23'></td><td> </td></tr>
<tr><td class='ln' data-ln='24'></td><td><span> etag </span><span class='pt9'>=</span><span> response.</span><span class='pt1'>get</span><span>(</span><span class='pt6'>'</span><span class='pt7'>ETag</span><span class='pt6'>'</span><span>)</span></td></tr>
<tr><td class='ln' data-ln='25'></td><td><span> last_modified </span><span class='pt9'>=</span><span> response.</span><span class='pt1'>get</span><span>(</span><span class='pt6'>'</span><span class='pt7'>Last-Modified</span><span class='pt6'>'</span><span>)</span></td></tr>
<tr><td class='ln' data-ln='26'></td><td><span> last_modified </span><span class='pt9'>=</span><span> last_modified </span><span class='pt9'>and</span><span> </span><span class='pt1'>parse_http_date_safe</span><span>(last_modified)</span></td></tr>
<tr><td class='ln' data-ln='27'></td><td> </td></tr>
<tr><td class='ln' data-ln='28'></td><td><span> </span><span class='pt9'>if</span><span> etag </span><span class='pt9'>or</span><span> last_modified:</span></td></tr>
<tr><td class='ln' data-ln='29'></td><td><span> </span><span class='pt9'>return</span><span> </span><span class='pt1'>get_conditional_response</span><span>(</span></td></tr>
<tr><td class='ln' data-ln='30'></td><td><span> request,</span></td></tr>
<tr><td class='ln' data-ln='31'></td><td><span> </span><span class='pt10 it'>etag</span><span class='pt9'>=</span><span>etag,</span></td></tr>
<tr><td class='ln' data-ln='32'></td><td><span> </span><span class='pt10 it'>last_modified</span><span class='pt9'>=</span><span>last_modified,</span></td></tr>
<tr><td class='ln' data-ln='33'></td><td><span> </span><span class='pt10 it'>response</span><span class='pt9'>=</span><span>response,</span></td></tr>
<tr><td class='ln' data-ln='34'></td><td><span> )</span></td></tr>
<tr><td class='ln' data-ln='35'></td><td> </td></tr>
<tr><td class='ln' data-ln='36'></td><td><span> </span><span class='pt9'>return</span><span> response</span></td></tr>
<tr><td class='ln' data-ln='37'></td><td> </td></tr>
<tr><td class='ln' data-ln='38'></td><td><span> </span><span class='pt9'>def</span><span> </span><span class='pt1'>needs_etag</span><span>(</span><span class='pt10 it'>self</span><span>, </span><span class='pt10 it'>response</span><span>):</span></td></tr>
<tr><td class='ln' data-ln='39'></td><td><span> </span><span class='pt2'>"""</span><span class='pt7'>Return True if an ETag header should be added to response.</span><span class='pt2'>"""</span></td></tr>
<tr><td class='ln' data-ln='40'></td><td><span> cache_control_headers </span><span class='pt9'>=</span><span> cc_delim_re.</span><span class='pt1'>split</span><span>(response.</span><span class='pt1'>get</span><span>(</span><span class='pt6'>'</span><span class='pt7'>Cache-Control</span><span class='pt6'>'</span><span>, </span><span class='pt6'>''</span><span>))</span></td></tr>
<tr><td class='ln' data-ln='41'></td><td><span> </span><span class='pt9'>return</span><span> all(header.</span><span class='pt1'>lower</span><span>() </span><span class='pt9'>!=</span><span> </span><span class='pt6'>'</span><span class='pt7'>no-store</span><span class='pt6'>'</span><span> </span><span class='pt9'>for</span><span> header </span><span class='pt9'>in</span><span> cache_control_headers)</span></td></tr>
</table>
</div>
</div>
</div>
<div class='style' id='P--github--py'>
<div class='P--github-bordered'>
<div class="info header">
<span class="left">middleware.http.py</span>
<span class="right"><span>41 lines</span><span>1.58 KB</span></span>
</div>
<div class='P--github'>
<table>
<tr><td class='ln' data-ln='1'></td><td><span class='pt17'>from</span><span> django.utils.cache </span><span class='pt17'>import</span><span> (</span></td></tr>
<tr><td class='ln' data-ln='2'></td><td><span> cc_delim_re, get_conditional_response, set_response_etag,</span></td></tr>
<tr><td class='ln' data-ln='3'></td><td><span>)</span></td></tr>
<tr><td class='ln' data-ln='4'></td><td><span class='pt17'>from</span><span> django.utils.deprecation </span><span class='pt17'>import</span><span> MiddlewareMixin</span></td></tr>
<tr><td class='ln' data-ln='5'></td><td><span class='pt17'>from</span><span> django.utils.http </span><span class='pt17'>import</span><span> parse_http_date_safe</span></td></tr>
<tr><td class='ln' data-ln='6'></td><td> </td></tr>
<tr><td class='ln' data-ln='7'></td><td> </td></tr>
<tr><td class='ln' data-ln='8'></td><td class='hi'><span class='pt17'>class</span><span> </span><span class='pt13'>ConditionalGetMiddleware</span><span>(</span><span class='pt13'>MiddlewareMixin</span><span>):</span></td></tr>
<tr><td class='ln' data-ln='9'></td><td><span> </span><span class='pt12'>"""</span></td></tr>
<tr><td class='ln' data-ln='10'></td><td><span class='pt12'> Handle conditional GET operations. If the response has an ETag or</span></td></tr>
<tr><td class='ln' data-ln='11'></td><td><span class='pt12'> Last-Modified header and the request has If-None-Match or If-Modified-Since,</span></td></tr>
<tr><td class='ln' data-ln='12'></td><td><span class='pt12'> replace the response with HttpNotModified. Add an ETag header if needed.</span></td></tr>
<tr><td class='ln' data-ln='13'></td><td><span class='pt12'> """</span></td></tr>
<tr><td class='ln' data-ln='14'></td><td><span> </span><span class='pt17'>def</span><span> </span><span class='pt13'>process_response</span><span>(</span><span class='pt13'>self</span><span>, </span><span class='pt13'>request</span><span>, </span><span class='pt13'>response</span><span>):</span></td></tr>
<tr><td class='ln' data-ln='15'></td><td class='hi'><span> </span><span class='pt12'># It's too late to prevent an unsafe request with a 412 response, and</span></td></tr>
<tr><td class='ln' data-ln='16'></td><td class='hi'><span> </span><span class='pt12'># for a HEAD request, the response body is always empty so computing</span></td></tr>
<tr><td class='ln' data-ln='17'></td><td class='hi'><span> </span><span class='pt12'># an accurate ETag isn't possible.</span></td></tr>
<tr><td class='ln' data-ln='18'></td><td><span> </span><span class='pt17'>if</span><span> request.method </span><span class='pt17'>!=</span><span> </span><span class='pt8'>'GET'</span><span>:</span></td></tr>
<tr><td class='ln' data-ln='19'></td><td><span> </span><span class='pt17'>return</span><span> response</span></td></tr>
<tr><td class='ln' data-ln='20'></td><td> </td></tr>
<tr><td class='ln' data-ln='21'></td><td><span> </span><span class='pt17'>if</span><span> </span><span class='pt7'>self</span><span>.</span><span class='pt13'>needs_etag</span><span>(response) </span><span class='pt17'>and</span><span> </span><span class='pt17'>not</span><span> response.</span><span class='pt13'>has_header</span><span>(</span><span class='pt8'>'ETag'</span><span>):</span></td></tr>
<tr><td class='ln' data-ln='22'></td><td><span> </span><span class='pt13'>set_response_etag</span><span>(response)</span></td></tr>
<tr><td class='ln' data-ln='23'></td><td> </td></tr>
<tr><td class='ln' data-ln='24'></td><td><span> etag </span><span class='pt17'>=</span><span> response.</span><span class='pt13'>get</span><span>(</span><span class='pt8'>'ETag'</span><span>)</span></td></tr>
<tr><td class='ln' data-ln='25'></td><td><span> last_modified </span><span class='pt17'>=</span><span> response.</span><span class='pt13'>get</span><span>(</span><span class='pt8'>'Last-Modified'</span><span>)</span></td></tr>
<tr><td class='ln' data-ln='26'></td><td><span> last_modified </span><span class='pt17'>=</span><span> last_modified </span><span class='pt17'>and</span><span> </span><span class='pt13'>parse_http_date_safe</span><span>(last_modified)</span></td></tr>
<tr><td class='ln' data-ln='27'></td><td> </td></tr>
<tr><td class='ln' data-ln='28'></td><td><span> </span><span class='pt17'>if</span><span> etag </span><span class='pt17'>or</span><span> last_modified:</span></td></tr>
<tr><td class='ln' data-ln='29'></td><td><span> </span><span class='pt17'>return</span><span> </span><span class='pt13'>get_conditional_response</span><span>(</span></td></tr>
<tr><td class='ln' data-ln='30'></td><td><span> request,</span></td></tr>
<tr><td class='ln' data-ln='31'></td><td><span> </span><span class='pt13'>etag</span><span class='pt17'>=</span><span>etag,</span></td></tr>
<tr><td class='ln' data-ln='32'></td><td><span> </span><span class='pt13'>last_modified</span><span class='pt17'>=</span><span>last_modified,</span></td></tr>
<tr><td class='ln' data-ln='33'></td><td><span> </span><span class='pt13'>response</span><span class='pt17'>=</span><span>response,</span></td></tr>
<tr><td class='ln' data-ln='34'></td><td><span> )</span></td></tr>
<tr><td class='ln' data-ln='35'></td><td> </td></tr>
<tr><td class='ln' data-ln='36'></td><td><span> </span><span class='pt17'>return</span><span> response</span></td></tr>
<tr><td class='ln' data-ln='37'></td><td> </td></tr>
<tr><td class='ln' data-ln='38'></td><td><span> </span><span class='pt17'>def</span><span> </span><span class='pt13'>needs_etag</span><span>(</span><span class='pt13'>self</span><span>, </span><span class='pt13'>response</span><span>):</span></td></tr>
<tr><td class='ln' data-ln='39'></td><td><span> </span><span class='pt12'>"""Return True if an ETag header should be added to response."""</span></td></tr>
<tr><td class='ln' data-ln='40'></td><td><span> cache_control_headers </span><span class='pt17'>=</span><span> cc_delim_re.</span><span class='pt13'>split</span><span>(response.</span><span class='pt13'>get</span><span>(</span><span class='pt8'>'Cache-Control'</span><span>, </span><span class='pt8'>''</span><span>))</span></td></tr>
<tr><td class='ln' data-ln='41'></td><td><span> </span><span class='pt17'>return</span><span> </span><span class='pt7'>all</span><span>(header.</span><span class='pt13'>lower</span><span>() </span><span class='pt17'>!=</span><span> </span><span class='pt8'>'no-store'</span><span> </span><span class='pt17'>for</span><span> header </span><span class='pt17'>in</span><span> cache_control_headers)</span></td></tr>
</table>
</div>
</div>
</div>
<div class='style' id='P--monokai_extended--py'>
<div class='P--monokai_extended-bordered'>
<div class="info header">
<span class="left">middleware.http.py</span>
<span class="right"><span>41 lines</span><span>1.58 KB</span></span>
</div>
<div class='P--monokai_extended'>
<table>
<tr><td class='ln' data-ln='1'></td><td><span class='pt37'>from</span><span> django.utils.cache </span><span class='pt37'>import</span><span> (</span></td></tr>
<tr><td class='ln' data-ln='2'></td><td><span> cc_delim_re, get_conditional_response, set_response_etag,</span></td></tr>
<tr><td class='ln' data-ln='3'></td><td><span>)</span></td></tr>
<tr><td class='ln' data-ln='4'></td><td><span class='pt37'>from</span><span> django.utils.deprecation </span><span class='pt37'>import</span><span> MiddlewareMixin</span></td></tr>
<tr><td class='ln' data-ln='5'></td><td><span class='pt37'>from</span><span> django.utils.http </span><span class='pt37'>import</span><span> parse_http_date_safe</span></td></tr>
<tr><td class='ln' data-ln='6'></td><td> </td></tr>
<tr><td class='ln' data-ln='7'></td><td> </td></tr>
<tr><td class='ln' data-ln='8'></td><td class='hi'><span class='pt13'>class</span><span> </span><span class='pt9 un'>ConditionalGetMiddleware</span><span>(</span><span class='pt13 un it'>MiddlewareMixin</span><span>):</span></td></tr>
<tr><td class='ln' data-ln='9'></td><td><span> </span><span class='pt27'>"""</span></td></tr>
<tr><td class='ln' data-ln='10'></td><td><span class='pt27'> Handle conditional GET operations. If the response has an ETag or</span></td></tr>
<tr><td class='ln' data-ln='11'></td><td><span class='pt27'> Last-Modified header and the request has If-None-Match or If-Modified-Since,</span></td></tr>
<tr><td class='ln' data-ln='12'></td><td><span class='pt27'> replace the response with HttpNotModified. Add an ETag header if needed.</span></td></tr>
<tr><td class='ln' data-ln='13'></td><td><span class='pt27'> """</span></td></tr>
<tr><td class='ln' data-ln='14'></td><td><span> </span><span class='pt13'>def</span><span> </span><span class='pt13'>process_response</span><span>(</span><span class='pt34 it'>self</span><span>, </span><span class='pt34 it'>request</span><span>, </span><span class='pt34 it'>response</span><span>):</span></td></tr>
<tr><td class='ln' data-ln='15'></td><td class='hi'><span> </span><span class='pt10'># It's too late to prevent an unsafe request with a 412 response, and</span></td></tr>
<tr><td class='ln' data-ln='16'></td><td class='hi'><span> </span><span class='pt10'># for a HEAD request, the response body is always empty so computing</span></td></tr>
<tr><td class='ln' data-ln='17'></td><td class='hi'><span> </span><span class='pt10'># an accurate ETag isn't possible.</span></td></tr>
<tr><td class='ln' data-ln='18'></td><td><span> </span><span class='pt32'>if</span><span> request.method </span><span class='pt32'>!=</span><span> </span><span class='pt27'>'GET'</span><span>:</span></td></tr>
<tr><td class='ln' data-ln='19'></td><td><span> </span><span class='pt32'>return</span><span> response</span></td></tr>
<tr><td class='ln' data-ln='20'></td><td> </td></tr>
<tr><td class='ln' data-ln='21'></td><td><span> </span><span class='pt32'>if</span><span> </span><span class='pt36'>self</span><span>.needs_etag(response) </span><span class='pt32'>and</span><span> </span><span class='pt32'>not</span><span> response.has_header(</span><span class='pt27'>'ETag'</span><span>):</span></td></tr>
<tr><td class='ln' data-ln='22'></td><td><span> set_response_etag(response)</span></td></tr>
<tr><td class='ln' data-ln='23'></td><td> </td></tr>
<tr><td class='ln' data-ln='24'></td><td><span> etag </span><span class='pt32'>=</span><span> response.get(</span><span class='pt27'>'ETag'</span><span>)</span></td></tr>
<tr><td class='ln' data-ln='25'></td><td><span> last_modified </span><span class='pt32'>=</span><span> response.get(</span><span class='pt27'>'Last-Modified'</span><span>)</span></td></tr>
<tr><td class='ln' data-ln='26'></td><td><span> last_modified </span><span class='pt32'>=</span><span> last_modified </span><span class='pt32'>and</span><span> parse_http_date_safe(last_modified)</span></td></tr>
<tr><td class='ln' data-ln='27'></td><td> </td></tr>
<tr><td class='ln' data-ln='28'></td><td><span> </span><span class='pt32'>if</span><span> etag </span><span class='pt32'>or</span><span> last_modified:</span></td></tr>
<tr><td class='ln' data-ln='29'></td><td><span> </span><span class='pt32'>return</span><span> get_conditional_response(</span></td></tr>
<tr><td class='ln' data-ln='30'></td><td><span> request,</span></td></tr>
<tr><td class='ln' data-ln='31'></td><td><span> </span><span class='pt34 it'>etag</span><span class='pt32'>=</span><span>etag,</span></td></tr>
<tr><td class='ln' data-ln='32'></td><td><span> </span><span class='pt34 it'>last_modified</span><span class='pt32'>=</span><span>last_modified,</span></td></tr>
<tr><td class='ln' data-ln='33'></td><td><span> </span><span class='pt34 it'>response</span><span class='pt32'>=</span><span>response,</span></td></tr>
<tr><td class='ln' data-ln='34'></td><td><span> )</span></td></tr>
<tr><td class='ln' data-ln='35'></td><td> </td></tr>
<tr><td class='ln' data-ln='36'></td><td><span> </span><span class='pt32'>return</span><span> response</span></td></tr>
<tr><td class='ln' data-ln='37'></td><td> </td></tr>
<tr><td class='ln' data-ln='38'></td><td><span> </span><span class='pt13'>def</span><span> </span><span class='pt13'>needs_etag</span><span>(</span><span class='pt34 it'>self</span><span>, </span><span class='pt34 it'>response</span><span>):</span></td></tr>
<tr><td class='ln' data-ln='39'></td><td><span> </span><span class='pt27'>"""Return True if an ETag header should be added to response."""</span></td></tr>
<tr><td class='ln' data-ln='40'></td><td><span> cache_control_headers </span><span class='pt32'>=</span><span> cc_delim_re.split(response.get(</span><span class='pt27'>'Cache-Control'</span><span>, </span><span class='pt27'>''</span><span>))</span></td></tr>
<tr><td class='ln' data-ln='41'></td><td><span> </span><span class='pt32'>return</span><span> </span><span class='pt9'>all</span><span>(header.lower() </span><span class='pt32'>!=</span><span> </span><span class='pt27'>'no-store'</span><span> </span><span class='pt32'>for</span><span> header </span><span class='pt32'>in</span><span> cache_control_headers)</span></td></tr>
</table>
</div>
</div>
</div>
<div class='style' id='P--oceanic_next--py'>
<div class='P--oceanic_next-bordered'>
<div class="info header">
<span class="left">middleware.http.py</span>
<span class="right"><span>41 lines</span><span>1.58 KB</span></span>
</div>
<div class='P--oceanic_next'>
<table>
<tr><td class='ln' data-ln='1'></td><td><span class='pt7'>from</span><span> django</span><span class='pt1'>.</span><span>utils</span><span class='pt1'>.</span><span>cache </span><span class='pt7'>import</span><span> </span><span class='pt1'>(</span></td></tr>
<tr><td class='ln' data-ln='2'></td><td><span> cc_delim_re</span><span class='pt1'>,</span><span> get_conditional_response</span><span class='pt1'>,</span><span> set_response_etag</span><span class='pt1'>,</span></td></tr>
<tr><td class='ln' data-ln='3'></td><td><span class='pt1'>)</span></td></tr>
<tr><td class='ln' data-ln='4'></td><td><span class='pt7'>from</span><span> django</span><span class='pt1'>.</span><span>utils</span><span class='pt1'>.</span><span>deprecation </span><span class='pt7'>import</span><span> MiddlewareMixin</span></td></tr>
<tr><td class='ln' data-ln='5'></td><td><span class='pt7'>from</span><span> django</span><span class='pt1'>.</span><span>utils</span><span class='pt1'>.</span><span>http </span><span class='pt7'>import</span><span> parse_http_date_safe</span></td></tr>
<tr><td class='ln' data-ln='6'></td><td> </td></tr>
<tr><td class='ln' data-ln='7'></td><td> </td></tr>
<tr><td class='ln' data-ln='8'></td><td class='hi'><span class='pt7'>class</span><span> </span><span class='pt13'>ConditionalGetMiddleware</span><span class='pt1'>(</span><span class='pt4'>MiddlewareMixin</span><span class='pt1'>):</span></td></tr>
<tr><td class='ln' data-ln='9'></td><td><span> </span><span class='pt1'>"""</span></td></tr>
<tr><td class='ln' data-ln='10'></td><td><span class='pt4'> Handle conditional GET operations. If the response has an ETag or</span></td></tr>
<tr><td class='ln' data-ln='11'></td><td><span class='pt4'> Last-Modified header and the request has If-None-Match or If-Modified-Since,</span></td></tr>
<tr><td class='ln' data-ln='12'></td><td><span class='pt4'> replace the response with HttpNotModified. Add an ETag header if needed.</span></td></tr>
<tr><td class='ln' data-ln='13'></td><td><span class='pt4'> </span><span class='pt1'>"""</span></td></tr>
<tr><td class='ln' data-ln='14'></td><td><span> </span><span class='pt7'>def</span><span> </span><span class='pt3'>process_response</span><span class='pt1'>(</span><span class='pt12'>self</span><span class='pt1'>,</span><span> </span><span class='pt12'>request</span><span class='pt1'>,</span><span> </span><span class='pt12'>response</span><span class='pt1'>):</span></td></tr>
<tr><td class='ln' data-ln='15'></td><td class='hi'><span> </span><span class='pt2'># It's too late to prevent an unsafe request with a 412 response, and</span></td></tr>
<tr><td class='ln' data-ln='16'></td><td class='hi'><span> </span><span class='pt2'># for a HEAD request, the response body is always empty so computing</span></td></tr>
<tr><td class='ln' data-ln='17'></td><td class='hi'><span> </span><span class='pt2'># an accurate ETag isn't possible.</span></td></tr>
<tr><td class='ln' data-ln='18'></td><td><span> </span><span class='pt7'>if</span><span> request</span><span class='pt1'>.</span><span>method </span><span class='pt1'>!=</span><span> </span><span class='pt1'>'</span><span class='pt4'>GET</span><span class='pt1'>':</span></td></tr>
<tr><td class='ln' data-ln='19'></td><td><span> </span><span class='pt7'>return</span><span> response</span></td></tr>
<tr><td class='ln' data-ln='20'></td><td> </td></tr>
<tr><td class='ln' data-ln='21'></td><td><span> </span><span class='pt7'>if</span><span> </span><span class='pt10 it'>self</span><span class='pt1'>.</span><span class='pt3'>needs_etag</span><span class='pt1'>(</span><span>response</span><span class='pt1'>)</span><span> </span><span class='pt1'>and</span><span> </span><span class='pt1'>not</span><span> response</span><span class='pt1'>.</span><span class='pt3'>has_header</span><span class='pt1'>('</span><span class='pt4'>ETag</span><span class='pt1'>'):</span></td></tr>
<tr><td class='ln' data-ln='22'></td><td><span> </span><span class='pt3'>set_response_etag</span><span class='pt1'>(</span><span>response</span><span class='pt1'>)</span></td></tr>
<tr><td class='ln' data-ln='23'></td><td> </td></tr>
<tr><td class='ln' data-ln='24'></td><td><span> etag </span><span class='pt1'>=</span><span> response</span><span class='pt1'>.</span><span class='pt3'>get</span><span class='pt1'>('</span><span class='pt4'>ETag</span><span class='pt1'>')</span></td></tr>
<tr><td class='ln' data-ln='25'></td><td><span> last_modified </span><span class='pt1'>=</span><span> response</span><span class='pt1'>.</span><span class='pt3'>get</span><span class='pt1'>('</span><span class='pt4'>Last-Modified</span><span class='pt1'>')</span></td></tr>
<tr><td class='ln' data-ln='26'></td><td><span> last_modified </span><span class='pt1'>=</span><span> last_modified </span><span class='pt1'>and</span><span> </span><span class='pt3'>parse_http_date_safe</span><span class='pt1'>(</span><span>last_modified</span><span class='pt1'>)</span></td></tr>
<tr><td class='ln' data-ln='27'></td><td> </td></tr>
<tr><td class='ln' data-ln='28'></td><td><span> </span><span class='pt7'>if</span><span> etag </span><span class='pt1'>or</span><span> last_modified</span><span class='pt1'>:</span></td></tr>
<tr><td class='ln' data-ln='29'></td><td><span> </span><span class='pt7'>return</span><span> </span><span class='pt3'>get_conditional_response</span><span class='pt1'>(</span></td></tr>
<tr><td class='ln' data-ln='30'></td><td><span> request</span><span class='pt1'>,</span></td></tr>
<tr><td class='ln' data-ln='31'></td><td><span> </span><span class='pt12'>etag</span><span class='pt1'>=</span><span>etag</span><span class='pt1'>,</span></td></tr>
<tr><td class='ln' data-ln='32'></td><td><span> </span><span class='pt12'>last_modified</span><span class='pt1'>=</span><span>last_modified</span><span class='pt1'>,</span></td></tr>
<tr><td class='ln' data-ln='33'></td><td><span> </span><span class='pt12'>response</span><span class='pt1'>=</span><span>response</span><span class='pt1'>,</span></td></tr>
<tr><td class='ln' data-ln='34'></td><td><span> </span><span class='pt1'>)</span></td></tr>
<tr><td class='ln' data-ln='35'></td><td> </td></tr>
<tr><td class='ln' data-ln='36'></td><td><span> </span><span class='pt7'>return</span><span> response</span></td></tr>
<tr><td class='ln' data-ln='37'></td><td> </td></tr>
<tr><td class='ln' data-ln='38'></td><td><span> </span><span class='pt7'>def</span><span> </span><span class='pt3'>needs_etag</span><span class='pt1'>(</span><span class='pt12'>self</span><span class='pt1'>,</span><span> </span><span class='pt12'>response</span><span class='pt1'>):</span></td></tr>
<tr><td class='ln' data-ln='39'></td><td><span> </span><span class='pt1'>"""</span><span class='pt4'>Return True if an ETag header should be added to response.</span><span class='pt1'>"""</span></td></tr>
<tr><td class='ln' data-ln='40'></td><td><span> cache_control_headers </span><span class='pt1'>=</span><span> cc_delim_re</span><span class='pt1'>.</span><span class='pt3'>split</span><span class='pt1'>(</span><span>response</span><span class='pt1'>.</span><span class='pt3'>get</span><span class='pt1'>('</span><span class='pt4'>Cache-Control</span><span class='pt1'>',</span><span> </span><span class='pt1'>''))</span></td></tr>
<tr><td class='ln' data-ln='41'></td><td><span> </span><span class='pt7'>return</span><span> </span><span class='pt3'>all</span><span class='pt1'>(</span><span>header</span><span class='pt1'>.</span><span class='pt3'>lower</span><span class='pt1'>()</span><span> </span><span class='pt1'>!=</span><span> </span><span class='pt1'>'</span><span class='pt4'>no-store</span><span class='pt1'>'</span><span> </span><span class='pt7'>for</span><span> header </span><span class='pt7'>in</span><span> cache_control_headers</span><span class='pt1'>)</span></td></tr>
</table>
</div>
</div>
</div>
<div class='style' id='P--one_dark--py'>
<div class='P--one_dark-bordered'>
<div class="info header">
<span class="left">middleware.http.py</span>
<span class="right"><span>41 lines</span><span>1.58 KB</span></span>
</div>
<div class='P--one_dark'>
<table>
<tr><td class='ln' data-ln='1'></td><td><span class='pt20'>from</span><span> django.utils.cache </span><span class='pt20'>import</span><span> (</span></td></tr>
<tr><td class='ln' data-ln='2'></td><td><span> cc_delim_re, get_conditional_response, set_response_etag,</span></td></tr>
<tr><td class='ln' data-ln='3'></td><td><span>)</span></td></tr>
<tr><td class='ln' data-ln='4'></td><td><span class='pt20'>from</span><span> django.utils.deprecation </span><span class='pt20'>import</span><span> MiddlewareMixin</span></td></tr>
<tr><td class='ln' data-ln='5'></td><td><span class='pt20'>from</span><span> django.utils.http </span><span class='pt20'>import</span><span> parse_http_date_safe</span></td></tr>
<tr><td class='ln' data-ln='6'></td><td> </td></tr>
<tr><td class='ln' data-ln='7'></td><td> </td></tr>
<tr><td class='ln' data-ln='8'></td><td class='hi'><span class='pt20'>class</span><span> </span><span class='pt28'>ConditionalGetMiddleware</span><span>(</span><span class='pt13'>MiddlewareMixin</span><span>):</span></td></tr>
<tr><td class='ln' data-ln='9'></td><td><span> </span><span class='pt13'>"""</span></td></tr>
<tr><td class='ln' data-ln='10'></td><td><span class='pt13'> Handle conditional GET operations. If the response has an ETag or</span></td></tr>
<tr><td class='ln' data-ln='11'></td><td><span class='pt13'> Last-Modified header and the request has If-None-Match or If-Modified-Since,</span></td></tr>
<tr><td class='ln' data-ln='12'></td><td><span class='pt13'> replace the response with HttpNotModified. Add an ETag header if needed.</span></td></tr>
<tr><td class='ln' data-ln='13'></td><td><span class='pt13'> """</span></td></tr>
<tr><td class='ln' data-ln='14'></td><td><span> </span><span class='pt20'>def</span><span> </span><span class='pt9'>process_response</span><span>(</span><span class='pt24 it'>self</span><span>, </span><span class='pt24 it'>request</span><span>, </span><span class='pt24 it'>response</span><span>):</span></td></tr>
<tr><td class='ln' data-ln='15'></td><td class='hi'><span> </span><span class='pt11 it'># It's too late to prevent an unsafe request with a 412 response, and</span></td></tr>
<tr><td class='ln' data-ln='16'></td><td class='hi'><span> </span><span class='pt11 it'># for a HEAD request, the response body is always empty so computing</span></td></tr>
<tr><td class='ln' data-ln='17'></td><td class='hi'><span> </span><span class='pt11 it'># an accurate ETag isn't possible.</span></td></tr>
<tr><td class='ln' data-ln='18'></td><td><span> </span><span class='pt20'>if</span><span> request.method </span><span class='pt5'>!=</span><span> </span><span class='pt12'>'</span><span class='pt13'>GET</span><span class='pt12'>'</span><span>:</span></td></tr>
<tr><td class='ln' data-ln='19'></td><td><span> </span><span class='pt20'>return</span><span> response</span></td></tr>
<tr><td class='ln' data-ln='20'></td><td> </td></tr>
<tr><td class='ln' data-ln='21'></td><td><span> </span><span class='pt20'>if</span><span> </span><span class='pt26'>self</span><span>.</span><span class='pt9'>needs_etag</span><span>(response) </span><span class='pt20'>and</span><span> </span><span class='pt20'>not</span><span> response.</span><span class='pt9'>has_header</span><span>(</span><span class='pt12'>'</span><span class='pt13'>ETag</span><span class='pt12'>'</span><span>):</span></td></tr>
<tr><td class='ln' data-ln='22'></td><td><span> </span><span class='pt9'>set_response_etag</span><span>(response)</span></td></tr>
<tr><td class='ln' data-ln='23'></td><td> </td></tr>
<tr><td class='ln' data-ln='24'></td><td><span> etag </span><span class='pt5'>=</span><span> response.</span><span class='pt9'>get</span><span>(</span><span class='pt12'>'</span><span class='pt13'>ETag</span><span class='pt12'>'</span><span>)</span></td></tr>
<tr><td class='ln' data-ln='25'></td><td><span> last_modified </span><span class='pt5'>=</span><span> response.</span><span class='pt9'>get</span><span>(</span><span class='pt12'>'</span><span class='pt13'>Last-Modified</span><span class='pt12'>'</span><span>)</span></td></tr>
<tr><td class='ln' data-ln='26'></td><td><span> last_modified </span><span class='pt5'>=</span><span> last_modified </span><span class='pt20'>and</span><span> </span><span class='pt9'>parse_http_date_safe</span><span>(last_modified)</span></td></tr>
<tr><td class='ln' data-ln='27'></td><td> </td></tr>
<tr><td class='ln' data-ln='28'></td><td><span> </span><span class='pt20'>if</span><span> etag </span><span class='pt20'>or</span><span> last_modified:</span></td></tr>
<tr><td class='ln' data-ln='29'></td><td><span> </span><span class='pt20'>return</span><span> </span><span class='pt9'>get_conditional_response</span><span>(</span></td></tr>
<tr><td class='ln' data-ln='30'></td><td><span> request,</span></td></tr>
<tr><td class='ln' data-ln='31'></td><td><span> </span><span class='pt24 it'>etag</span><span class='pt5'>=</span><span>etag,</span></td></tr>
<tr><td class='ln' data-ln='32'></td><td><span> </span><span class='pt24 it'>last_modified</span><span class='pt5'>=</span><span>last_modified,</span></td></tr>
<tr><td class='ln' data-ln='33'></td><td><span> </span><span class='pt24 it'>response</span><span class='pt5'>=</span><span>response,</span></td></tr>
<tr><td class='ln' data-ln='34'></td><td><span> )</span></td></tr>
<tr><td class='ln' data-ln='35'></td><td> </td></tr>
<tr><td class='ln' data-ln='36'></td><td><span> </span><span class='pt20'>return</span><span> response</span></td></tr>
<tr><td class='ln' data-ln='37'></td><td> </td></tr>
<tr><td class='ln' data-ln='38'></td><td><span> </span><span class='pt20'>def</span><span> </span><span class='pt9'>needs_etag</span><span>(</span><span class='pt24 it'>self</span><span>, </span><span class='pt24 it'>response</span><span>):</span></td></tr>
<tr><td class='ln' data-ln='39'></td><td><span> </span><span class='pt13'>"""Return True if an ETag header should be added to response."""</span></td></tr>
<tr><td class='ln' data-ln='40'></td><td><span> cache_control_headers </span><span class='pt5'>=</span><span> cc_delim_re.</span><span class='pt9'>split</span><span>(response.</span><span class='pt9'>get</span><span>(</span><span class='pt12'>'</span><span class='pt13'>Cache-Control</span><span class='pt12'>'</span><span>, </span><span class='pt12'>''</span><span>))</span></td></tr>
<tr><td class='ln' data-ln='41'></td><td><span> </span><span class='pt20'>return</span><span> </span><span class='pt5'>all</span><span>(header.</span><span class='pt9'>lower</span><span>() </span><span class='pt5'>!=</span><span> </span><span class='pt12'>'</span><span class='pt13'>no-store</span><span class='pt12'>'</span><span> </span><span class='pt20'>for</span><span> header </span><span class='pt20'>in</span><span> cache_control_headers)</span></td></tr>
</table>
</div>
</div>
</div>
<div class='style' id='P--one_light--py'>
<div class='P--one_light-bordered'>
<div class="info header">
<span class="left">middleware.http.py</span>
<span class="right"><span>41 lines</span><span>1.58 KB</span></span>
</div>
<div class='P--one_light'>
<table>
<tr><td class='ln' data-ln='1'></td><td><span class='pt14'>from</span><span> django.utils.cache </span><span class='pt14'>import</span><span> (</span></td></tr>
<tr><td class='ln' data-ln='2'></td><td><span> cc_delim_re, get_conditional_response, set_response_etag,</span></td></tr>
<tr><td class='ln' data-ln='3'></td><td><span>)</span></td></tr>
<tr><td class='ln' data-ln='4'></td><td><span class='pt14'>from</span><span> django.utils.deprecation </span><span class='pt14'>import</span><span> MiddlewareMixin</span></td></tr>
<tr><td class='ln' data-ln='5'></td><td><span class='pt14'>from</span><span> django.utils.http </span><span class='pt14'>import</span><span> parse_http_date_safe</span></td></tr>
<tr><td class='ln' data-ln='6'></td><td> </td></tr>
<tr><td class='ln' data-ln='7'></td><td> </td></tr>
<tr><td class='ln' data-ln='8'></td><td class='hi'><span class='pt14'>class</span><span class='pt15'> ConditionalGetMiddleware(</span><span class='pt8'>MiddlewareMixin</span><span class='pt15'>)</span><span>:</span></td></tr>
<tr><td class='ln' data-ln='9'></td><td><span> </span><span class='pt8'>"""</span></td></tr>
<tr><td class='ln' data-ln='10'></td><td><span class='pt8'> Handle conditional GET operations. If the response has an ETag or</span></td></tr>
<tr><td class='ln' data-ln='11'></td><td><span class='pt8'> Last-Modified header and the request has If-None-Match or If-Modified-Since,</span></td></tr>
<tr><td class='ln' data-ln='12'></td><td><span class='pt8'> replace the response with HttpNotModified. Add an ETag header if needed.</span></td></tr>
<tr><td class='ln' data-ln='13'></td><td><span class='pt8'> """</span></td></tr>
<tr><td class='ln' data-ln='14'></td><td><span> </span><span class='pt14'>def</span><span> </span><span class='pt7'>process_response</span><span class='pt12'>(</span><span class='pt12 it'>self</span><span>,</span><span class='pt12'> </span><span class='pt12 it'>request</span><span>,</span><span class='pt12'> </span><span class='pt12 it'>response</span><span class='pt12'>)</span><span>:</span></td></tr>
<tr><td class='ln' data-ln='15'></td><td class='hi'><span> </span><span class='pt13 it'># It's too late to prevent an unsafe request with a 412 response, and</span></td></tr>
<tr><td class='ln' data-ln='16'></td><td class='hi'><span> </span><span class='pt13 it'># for a HEAD request, the response body is always empty so computing</span></td></tr>
<tr><td class='ln' data-ln='17'></td><td class='hi'><span> </span><span class='pt13 it'># an accurate ETag isn't possible.</span></td></tr>
<tr><td class='ln' data-ln='18'></td><td><span> </span><span class='pt14'>if</span><span> request.method != </span><span class='pt8'>'GET'</span><span>:</span></td></tr>
<tr><td class='ln' data-ln='19'></td><td><span> </span><span class='pt14'>return</span><span> response</span></td></tr>
<tr><td class='ln' data-ln='20'></td><td> </td></tr>
<tr><td class='ln' data-ln='21'></td><td><span> </span><span class='pt14'>if</span><span> </span><span class='pt17'>self</span><span>.</span><span class='pt7'>needs_etag</span><span>(response) </span><span class='pt14'>and</span><span> </span><span class='pt14'>not</span><span> response.</span><span class='pt7'>has_header</span><span>(</span><span class='pt8'>'ETag'</span><span>):</span></td></tr>
<tr><td class='ln' data-ln='22'></td><td><span> </span><span class='pt7'>set_response_etag</span><span>(response)</span></td></tr>
<tr><td class='ln' data-ln='23'></td><td> </td></tr>
<tr><td class='ln' data-ln='24'></td><td><span> etag = response.</span><span class='pt7'>get</span><span>(</span><span class='pt8'>'ETag'</span><span>)</span></td></tr>
<tr><td class='ln' data-ln='25'></td><td><span> last_modified = response.</span><span class='pt7'>get</span><span>(</span><span class='pt8'>'Last-Modified'</span><span>)</span></td></tr>
<tr><td class='ln' data-ln='26'></td><td><span> last_modified = last_modified </span><span class='pt14'>and</span><span> </span><span class='pt7'>parse_http_date_safe</span><span>(last_modified)</span></td></tr>
<tr><td class='ln' data-ln='27'></td><td> </td></tr>
<tr><td class='ln' data-ln='28'></td><td><span> </span><span class='pt14'>if</span><span> etag </span><span class='pt14'>or</span><span> last_modified:</span></td></tr>
<tr><td class='ln' data-ln='29'></td><td><span> </span><span class='pt14'>return</span><span> </span><span class='pt7'>get_conditional_response</span><span>(</span></td></tr>
<tr><td class='ln' data-ln='30'></td><td><span> request,</span></td></tr>
<tr><td class='ln' data-ln='31'></td><td><span> </span><span class='pt12 it'>etag</span><span>=etag,</span></td></tr>
<tr><td class='ln' data-ln='32'></td><td><span> </span><span class='pt12 it'>last_modified</span><span>=last_modified,</span></td></tr>
<tr><td class='ln' data-ln='33'></td><td><span> </span><span class='pt12 it'>response</span><span>=response,</span></td></tr>
<tr><td class='ln' data-ln='34'></td><td><span> )</span></td></tr>
<tr><td class='ln' data-ln='35'></td><td> </td></tr>
<tr><td class='ln' data-ln='36'></td><td><span> </span><span class='pt14'>return</span><span> response</span></td></tr>
<tr><td class='ln' data-ln='37'></td><td> </td></tr>
<tr><td class='ln' data-ln='38'></td><td><span> </span><span class='pt14'>def</span><span> </span><span class='pt7'>needs_etag</span><span class='pt12'>(</span><span class='pt12 it'>self</span><span>,</span><span class='pt12'> </span><span class='pt12 it'>response</span><span class='pt12'>)</span><span>:</span></td></tr>
<tr><td class='ln' data-ln='39'></td><td><span> </span><span class='pt8'>"""Return True if an ETag header should be added to response."""</span></td></tr>
<tr><td class='ln' data-ln='40'></td><td><span> cache_control_headers = cc_delim_re.</span><span class='pt7'>split</span><span>(response.</span><span class='pt7'>get</span><span>(</span><span class='pt8'>'Cache-Control'</span><span>, </span><span class='pt8'>''</span><span>))</span></td></tr>
<tr><td class='ln' data-ln='41'></td><td><span> </span><span class='pt14'>return</span><span> </span><span class='pt4'>all</span><span>(header.</span><span class='pt7'>lower</span><span>() != </span><span class='pt8'>'no-store'</span><span> </span><span class='pt14'>for</span><span> header </span><span class='pt14'>in</span><span> cache_control_headers)</span></td></tr>
</table>
</div>
</div>
</div>
<div class='style' id='P--one_monokai--py'>
<div class='P--one_monokai-bordered'>
<div class="info header">
<span class="left">middleware.http.py</span>
<span class="right"><span>41 lines</span><span>1.58 KB</span></span>
</div>
<div class='P--one_monokai'>
<table>
<tr><td class='ln' data-ln='1'></td><td><span class='pt10'>from</span><span> django.utils.cache </span><span class='pt10'>import</span><span> (</span></td></tr>
<tr><td class='ln' data-ln='2'></td><td><span> cc_delim_re, get_conditional_response, set_response_etag,</span></td></tr>
<tr><td class='ln' data-ln='3'></td><td><span>)</span></td></tr>
<tr><td class='ln' data-ln='4'></td><td><span class='pt10'>from</span><span> django.utils.deprecation </span><span class='pt10'>import</span><span> MiddlewareMixin</span></td></tr>
<tr><td class='ln' data-ln='5'></td><td><span class='pt10'>from</span><span> django.utils.http </span><span class='pt10'>import</span><span> parse_http_date_safe</span></td></tr>
<tr><td class='ln' data-ln='6'></td><td> </td></tr>
<tr><td class='ln' data-ln='7'></td><td> </td></tr>
<tr><td class='ln' data-ln='8'></td><td class='hi'><span class='pt3'>class</span><span> </span><span class='pt5'>ConditionalGetMiddleware</span><span>(</span><span class='pt7'>MiddlewareMixin</span><span>):</span></td></tr>
<tr><td class='ln' data-ln='9'></td><td><span> </span><span class='pt11'>"""</span></td></tr>
<tr><td class='ln' data-ln='10'></td><td><span class='pt11'> Handle conditional GET operations. If the response has an ETag or</span></td></tr>
<tr><td class='ln' data-ln='11'></td><td><span class='pt11'> Last-Modified header and the request has If-None-Match or If-Modified-Since,</span></td></tr>
<tr><td class='ln' data-ln='12'></td><td><span class='pt11'> replace the response with HttpNotModified. Add an ETag header if needed.</span></td></tr>
<tr><td class='ln' data-ln='13'></td><td><span class='pt11'> """</span></td></tr>
<tr><td class='ln' data-ln='14'></td><td><span> </span><span class='pt3'>def</span><span> </span><span class='pt7'>process_response</span><span>(</span><span class='pt9 it'>self</span><span>, </span><span class='pt9 it'>request</span><span>, </span><span class='pt9 it'>response</span><span>):</span></td></tr>
<tr><td class='ln' data-ln='15'></td><td class='hi'><span> </span><span class='pt4 it'># It's too late to prevent an unsafe request with a 412 response, and</span></td></tr>
<tr><td class='ln' data-ln='16'></td><td class='hi'><span> </span><span class='pt4 it'># for a HEAD request, the response body is always empty so computing</span></td></tr>
<tr><td class='ln' data-ln='17'></td><td class='hi'><span> </span><span class='pt4 it'># an accurate ETag isn't possible.</span></td></tr>
<tr><td class='ln' data-ln='18'></td><td><span> </span><span class='pt10'>if</span><span> request.method </span><span class='pt10'>!=</span><span> </span><span class='pt11'>'GET'</span><span>:</span></td></tr>
<tr><td class='ln' data-ln='19'></td><td><span> </span><span class='pt10'>return</span><span> response</span></td></tr>
<tr><td class='ln' data-ln='20'></td><td> </td></tr>
<tr><td class='ln' data-ln='21'></td><td><span> </span><span class='pt10'>if</span><span> </span><span class='pt10'>self</span><span>.</span><span class='pt7'>needs_etag</span><span>(response) </span><span class='pt10'>and</span><span> </span><span class='pt10'>not</span><span> response.</span><span class='pt7'>has_header</span><span>(</span><span class='pt11'>'ETag'</span><span>):</span></td></tr>
<tr><td class='ln' data-ln='22'></td><td><span> </span><span class='pt7'>set_response_etag</span><span>(response)</span></td></tr>
<tr><td class='ln' data-ln='23'></td><td> </td></tr>
<tr><td class='ln' data-ln='24'></td><td><span> etag </span><span class='pt10'>=</span><span> response.</span><span class='pt7'>get</span><span>(</span><span class='pt11'>'ETag'</span><span>)</span></td></tr>
<tr><td class='ln' data-ln='25'></td><td><span> last_modified </span><span class='pt10'>=</span><span> response.</span><span class='pt7'>get</span><span>(</span><span class='pt11'>'Last-Modified'</span><span>)</span></td></tr>
<tr><td class='ln' data-ln='26'></td><td><span> last_modified </span><span class='pt10'>=</span><span> last_modified </span><span class='pt10'>and</span><span> </span><span class='pt7'>parse_http_date_safe</span><span>(last_modified)</span></td></tr>
<tr><td class='ln' data-ln='27'></td><td> </td></tr>
<tr><td class='ln' data-ln='28'></td><td><span> </span><span class='pt10'>if</span><span> etag </span><span class='pt10'>or</span><span> last_modified:</span></td></tr>
<tr><td class='ln' data-ln='29'></td><td><span> </span><span class='pt10'>return</span><span> </span><span class='pt7'>get_conditional_response</span><span>(</span></td></tr>
<tr><td class='ln' data-ln='30'></td><td><span> request,</span></td></tr>
<tr><td class='ln' data-ln='31'></td><td><span> </span><span class='pt9 it'>etag</span><span class='pt10'>=</span><span>etag,</span></td></tr>
<tr><td class='ln' data-ln='32'></td><td><span> </span><span class='pt9 it'>last_modified</span><span class='pt10'>=</span><span>last_modified,</span></td></tr>
<tr><td class='ln' data-ln='33'></td><td><span> </span><span class='pt9 it'>response</span><span class='pt10'>=</span><span>response,</span></td></tr>
<tr><td class='ln' data-ln='34'></td><td><span> )</span></td></tr>
<tr><td class='ln' data-ln='35'></td><td> </td></tr>
<tr><td class='ln' data-ln='36'></td><td><span> </span><span class='pt10'>return</span><span> response</span></td></tr>
<tr><td class='ln' data-ln='37'></td><td> </td></tr>
<tr><td class='ln' data-ln='38'></td><td><span> </span><span class='pt3'>def</span><span> </span><span class='pt7'>needs_etag</span><span>(</span><span class='pt9 it'>self</span><span>, </span><span class='pt9 it'>response</span><span>):</span></td></tr>
<tr><td class='ln' data-ln='39'></td><td><span> </span><span class='pt11'>"""Return True if an ETag header should be added to response."""</span></td></tr>
<tr><td class='ln' data-ln='40'></td><td><span> cache_control_headers </span><span class='pt10'>=</span><span> cc_delim_re.</span><span class='pt7'>split</span><span>(response.</span><span class='pt7'>get</span><span>(</span><span class='pt11'>'Cache-Control'</span><span>, </span><span class='pt11'>''</span><span>))</span></td></tr>
<tr><td class='ln' data-ln='41'></td><td><span> </span><span class='pt10'>return</span><span> </span><span class='pt7'>all</span><span>(header.</span><span class='pt7'>lower</span><span>() </span><span class='pt10'>!=</span><span> </span><span class='pt11'>'no-store'</span><span> </span><span class='pt10'>for</span><span> header </span><span class='pt10'>in</span><span> cache_control_headers)</span></td></tr>
</table>
</div>
</div>
</div>
<div class='style' id='P--predawn--py'>
<div class='P--predawn-bordered'>
<div class="info header">
<span class="left">middleware.http.py</span>
<span class="right"><span>41 lines</span><span>1.58 KB</span></span>
</div>
<div class='P--predawn'>
<table>
<tr><td class='ln' data-ln='1'></td><td><span class='pt18'>from</span><span> django.utils.cache </span><span class='pt18'>import</span><span> (</span></td></tr>
<tr><td class='ln' data-ln='2'></td><td><span> cc_delim_re, get_conditional_response, set_response_etag,</span></td></tr>
<tr><td class='ln' data-ln='3'></td><td><span>)</span></td></tr>
<tr><td class='ln' data-ln='4'></td><td><span class='pt18'>from</span><span> django.utils.deprecation </span><span class='pt18'>import</span><span> MiddlewareMixin</span></td></tr>
<tr><td class='ln' data-ln='5'></td><td><span class='pt18'>from</span><span> django.utils.http </span><span class='pt18'>import</span><span> parse_http_date_safe</span></td></tr>
<tr><td class='ln' data-ln='6'></td><td> </td></tr>
<tr><td class='ln' data-ln='7'></td><td> </td></tr>
<tr><td class='ln' data-ln='8'></td><td class='hi'><span class='pt16'>class</span><span> </span><span class='pt11'>ConditionalGetMiddleware</span><span>(</span><span class='pt12'>MiddlewareMixin</span><span>):</span></td></tr>
<tr><td class='ln' data-ln='9'></td><td><span> </span><span class='pt13'>"""</span></td></tr>
<tr><td class='ln' data-ln='10'></td><td><span class='pt13'> Handle conditional GET operations. If the response has an ETag or</span></td></tr>
<tr><td class='ln' data-ln='11'></td><td><span class='pt13'> Last-Modified header and the request has If-None-Match or If-Modified-Since,</span></td></tr>
<tr><td class='ln' data-ln='12'></td><td><span class='pt13'> replace the response with HttpNotModified. Add an ETag header if needed.</span></td></tr>
<tr><td class='ln' data-ln='13'></td><td><span class='pt13'> """</span></td></tr>
<tr><td class='ln' data-ln='14'></td><td><span> </span><span class='pt16'>def</span><span> </span><span class='pt11'>process_response</span><span>(</span><span class='pt18'>self</span><span>, </span><span class='pt18'>request</span><span>, </span><span class='pt18'>response</span><span>):</span></td></tr>
<tr><td class='ln' data-ln='15'></td><td class='hi'><span> </span><span class='pt10'># It's too late to prevent an unsafe request with a 412 response, and</span></td></tr>
<tr><td class='ln' data-ln='16'></td><td class='hi'><span> </span><span class='pt10'># for a HEAD request, the response body is always empty so computing</span></td></tr>
<tr><td class='ln' data-ln='17'></td><td class='hi'><span> </span><span class='pt10'># an accurate ETag isn't possible.</span></td></tr>
<tr><td class='ln' data-ln='18'></td><td><span> </span><span class='pt18'>if</span><span> request.method </span><span class='pt18'>!=</span><span> </span><span class='pt13'>'GET'</span><span>:</span></td></tr>
<tr><td class='ln' data-ln='19'></td><td><span> </span><span class='pt18'>return</span><span> response</span></td></tr>
<tr><td class='ln' data-ln='20'></td><td> </td></tr>
<tr><td class='ln' data-ln='21'></td><td><span> </span><span class='pt18'>if</span><span> </span><span class='pt18'>self</span><span>.</span><span class='pt18'>needs_etag</span><span>(response) </span><span class='pt18'>and</span><span> </span><span class='pt18'>not</span><span> response.</span><span class='pt18'>has_header</span><span>(</span><span class='pt13'>'ETag'</span><span>):</span></td></tr>
<tr><td class='ln' data-ln='22'></td><td><span> </span><span class='pt18'>set_response_etag</span><span>(response)</span></td></tr>
<tr><td class='ln' data-ln='23'></td><td> </td></tr>
<tr><td class='ln' data-ln='24'></td><td><span> etag </span><span class='pt18'>=</span><span> response.</span><span class='pt18'>get</span><span>(</span><span class='pt13'>'ETag'</span><span>)</span></td></tr>
<tr><td class='ln' data-ln='25'></td><td><span> last_modified </span><span class='pt18'>=</span><span> response.</span><span class='pt18'>get</span><span>(</span><span class='pt13'>'Last-Modified'</span><span>)</span></td></tr>
<tr><td class='ln' data-ln='26'></td><td><span> last_modified </span><span class='pt18'>=</span><span> last_modified </span><span class='pt18'>and</span><span> </span><span class='pt18'>parse_http_date_safe</span><span>(last_modified)</span></td></tr>
<tr><td class='ln' data-ln='27'></td><td> </td></tr>
<tr><td class='ln' data-ln='28'></td><td><span> </span><span class='pt18'>if</span><span> etag </span><span class='pt18'>or</span><span> last_modified:</span></td></tr>
<tr><td class='ln' data-ln='29'></td><td><span> </span><span class='pt18'>return</span><span> </span><span class='pt18'>get_conditional_response</span><span>(</span></td></tr>
<tr><td class='ln' data-ln='30'></td><td><span> request,</span></td></tr>
<tr><td class='ln' data-ln='31'></td><td><span> </span><span class='pt18'>etag=</span><span>etag,</span></td></tr>
<tr><td class='ln' data-ln='32'></td><td><span> </span><span class='pt18'>last_modified=</span><span>last_modified,</span></td></tr>
<tr><td class='ln' data-ln='33'></td><td><span> </span><span class='pt18'>response=</span><span>response,</span></td></tr>
<tr><td class='ln' data-ln='34'></td><td><span> )</span></td></tr>
<tr><td class='ln' data-ln='35'></td><td> </td></tr>
<tr><td class='ln' data-ln='36'></td><td><span> </span><span class='pt18'>return</span><span> response</span></td></tr>
<tr><td class='ln' data-ln='37'></td><td> </td></tr>
<tr><td class='ln' data-ln='38'></td><td><span> </span><span class='pt16'>def</span><span> </span><span class='pt11'>needs_etag</span><span>(</span><span class='pt18'>self</span><span>, </span><span class='pt18'>response</span><span>):</span></td></tr>
<tr><td class='ln' data-ln='39'></td><td><span> </span><span class='pt13'>"""Return True if an ETag header should be added to response."""</span></td></tr>
<tr><td class='ln' data-ln='40'></td><td><span> cache_control_headers </span><span class='pt18'>=</span><span> cc_delim_re.</span><span class='pt18'>split</span><span>(response.</span><span class='pt18'>get</span><span>(</span><span class='pt13'>'Cache-Control'</span><span>, </span><span class='pt13'>''</span><span>))</span></td></tr>
<tr><td class='ln' data-ln='41'></td><td><span> </span><span class='pt18'>return</span><span> </span><span class='pt18'>all</span><span>(header.</span><span class='pt18'>lower</span><span>() </span><span class='pt18'>!=</span><span> </span><span class='pt13'>'no-store'</span><span> </span><span class='pt18'>for</span><span> header </span><span class='pt18'>in</span><span> cache_control_headers)</span></td></tr>
</table>
</div>
</div>
</div>
<div class='style' id='P--solarized_dark--py'>
<div class='P--solarized_dark-bordered'>
<div class="info header">
<span class="left">middleware.http.py</span>
<span class="right"><span>41 lines</span><span>1.58 KB</span></span>
</div>
<div class='P--solarized_dark'>
<table>
<tr><td class='ln' data-ln='1'></td><td><span class='pt5'>from</span><span> django.utils.cache </span><span class='pt5'>import</span><span> (</span></td></tr>
<tr><td class='ln' data-ln='2'></td><td><span> cc_delim_re, get_conditional_response, set_response_etag,</span></td></tr>
<tr><td class='ln' data-ln='3'></td><td><span>)</span></td></tr>
<tr><td class='ln' data-ln='4'></td><td><span class='pt5'>from</span><span> django.utils.deprecation </span><span class='pt5'>import</span><span> MiddlewareMixin</span></td></tr>
<tr><td class='ln' data-ln='5'></td><td><span class='pt5'>from</span><span> django.utils.http </span><span class='pt5'>import</span><span> parse_http_date_safe</span></td></tr>
<tr><td class='ln' data-ln='6'></td><td> </td></tr>
<tr><td class='ln' data-ln='7'></td><td> </td></tr>
<tr><td class='ln' data-ln='8'></td><td class='hi'><span class='bo'>class</span><span> </span><span class='pt6'>ConditionalGetMiddleware</span><span>(</span><span class='pt4'>MiddlewareMixin</span><span>):</span></td></tr>
<tr><td class='ln' data-ln='9'></td><td><span> </span><span class='pt2'>"""</span></td></tr>
<tr><td class='ln' data-ln='10'></td><td><span class='pt2'> Handle conditional GET operations. If the response has an ETag or</span></td></tr>
<tr><td class='ln' data-ln='11'></td><td><span class='pt2'> Last-Modified header and the request has If-None-Match or If-Modified-Since,</span></td></tr>
<tr><td class='ln' data-ln='12'></td><td><span class='pt2'> replace the response with HttpNotModified. Add an ETag header if needed.</span></td></tr>
<tr><td class='ln' data-ln='13'></td><td><span class='pt2'> """</span></td></tr>
<tr><td class='ln' data-ln='14'></td><td><span> </span><span class='bo'>def</span><span> </span><span class='pt1'>process_response</span><span>(self, request, response):</span></td></tr>
<tr><td class='ln' data-ln='15'></td><td class='hi'><span> </span><span class='pt3 it'># It's too late to prevent an unsafe request with a 412 response, and</span></td></tr>
<tr><td class='ln' data-ln='16'></td><td class='hi'><span> </span><span class='pt3 it'># for a HEAD request, the response body is always empty so computing</span></td></tr>
<tr><td class='ln' data-ln='17'></td><td class='hi'><span> </span><span class='pt3 it'># an accurate ETag isn't possible.</span></td></tr>
<tr><td class='ln' data-ln='18'></td><td><span> </span><span class='pt5'>if</span><span> request.method </span><span class='pt5'>!=</span><span> </span><span class='pt2'>'GET'</span><span>:</span></td></tr>
<tr><td class='ln' data-ln='19'></td><td><span> </span><span class='pt5'>return</span><span> response</span></td></tr>
<tr><td class='ln' data-ln='20'></td><td> </td></tr>
<tr><td class='ln' data-ln='21'></td><td><span> </span><span class='pt5'>if</span><span> </span><span class='pt1'>self</span><span>.needs_etag(response) </span><span class='pt5'>and</span><span> </span><span class='pt5'>not</span><span> response.has_header(</span><span class='pt2'>'ETag'</span><span>):</span></td></tr>
<tr><td class='ln' data-ln='22'></td><td><span> set_response_etag(response)</span></td></tr>
<tr><td class='ln' data-ln='23'></td><td> </td></tr>
<tr><td class='ln' data-ln='24'></td><td><span> etag </span><span class='pt5'>=</span><span> response.get(</span><span class='pt2'>'ETag'</span><span>)</span></td></tr>
<tr><td class='ln' data-ln='25'></td><td><span> last_modified </span><span class='pt5'>=</span><span> response.get(</span><span class='pt2'>'Last-Modified'</span><span>)</span></td></tr>
<tr><td class='ln' data-ln='26'></td><td><span> last_modified </span><span class='pt5'>=</span><span> last_modified </span><span class='pt5'>and</span><span> parse_http_date_safe(last_modified)</span></td></tr>
<tr><td class='ln' data-ln='27'></td><td> </td></tr>
<tr><td class='ln' data-ln='28'></td><td><span> </span><span class='pt5'>if</span><span> etag </span><span class='pt5'>or</span><span> last_modified:</span></td></tr>
<tr><td class='ln' data-ln='29'></td><td><span> </span><span class='pt5'>return</span><span> get_conditional_response(</span></td></tr>
<tr><td class='ln' data-ln='30'></td><td><span> request,</span></td></tr>
<tr><td class='ln' data-ln='31'></td><td><span> etag</span><span class='pt5'>=</span><span>etag,</span></td></tr>
<tr><td class='ln' data-ln='32'></td><td><span> last_modified</span><span class='pt5'>=</span><span>last_modified,</span></td></tr>
<tr><td class='ln' data-ln='33'></td><td><span> response</span><span class='pt5'>=</span><span>response,</span></td></tr>
<tr><td class='ln' data-ln='34'></td><td><span> )</span></td></tr>
<tr><td class='ln' data-ln='35'></td><td> </td></tr>
<tr><td class='ln' data-ln='36'></td><td><span> </span><span class='pt5'>return</span><span> response</span></td></tr>
<tr><td class='ln' data-ln='37'></td><td> </td></tr>
<tr><td class='ln' data-ln='38'></td><td><span> </span><span class='bo'>def</span><span> </span><span class='pt1'>needs_etag</span><span>(self, response):</span></td></tr>
<tr><td class='ln' data-ln='39'></td><td><span> </span><span class='pt2'>"""Return True if an ETag header should be added to response."""</span></td></tr>
<tr><td class='ln' data-ln='40'></td><td><span> cache_control_headers </span><span class='pt5'>=</span><span> cc_delim_re.split(response.get(</span><span class='pt2'>'Cache-Control'</span><span>, </span><span class='pt2'>''</span><span>))</span></td></tr>
<tr><td class='ln' data-ln='41'></td><td><span> </span><span class='pt5'>return</span><span> </span><span class='pt1'>all</span><span>(header.lower() </span><span class='pt5'>!=</span><span> </span><span class='pt2'>'no-store'</span><span> </span><span class='pt5'>for</span><span> header </span><span class='pt5'>in</span><span> cache_control_headers)</span></td></tr>
</table>
</div>
</div>
</div>
<div class='style' id='P--solarized_light--py'>
<div class='P--solarized_light-bordered'>
<div class="info header">
<span class="left">middleware.http.py</span>
<span class="right"><span>41 lines</span><span>1.58 KB</span></span>
</div>
<div class='P--solarized_light'>
<table>
<tr><td class='ln' data-ln='1'></td><td><span class='pt4'>from</span><span> django.utils.cache </span><span class='pt4'>import</span><span> (</span></td></tr>
<tr><td class='ln' data-ln='2'></td><td><span> cc_delim_re, get_conditional_response, set_response_etag,</span></td></tr>
<tr><td class='ln' data-ln='3'></td><td><span>)</span></td></tr>
<tr><td class='ln' data-ln='4'></td><td><span class='pt4'>from</span><span> django.utils.deprecation </span><span class='pt4'>import</span><span> MiddlewareMixin</span></td></tr>
<tr><td class='ln' data-ln='5'></td><td><span class='pt4'>from</span><span> django.utils.http </span><span class='pt4'>import</span><span> parse_http_date_safe</span></td></tr>
<tr><td class='ln' data-ln='6'></td><td> </td></tr>
<tr><td class='ln' data-ln='7'></td><td> </td></tr>
<tr><td class='ln' data-ln='8'></td><td class='hi'><span class='pt1 bo'>class</span><span> </span><span class='pt6'>ConditionalGetMiddleware</span><span>(MiddlewareMixin):</span></td></tr>
<tr><td class='ln' data-ln='9'></td><td><span> </span><span class='pt3'>"""</span></td></tr>
<tr><td class='ln' data-ln='10'></td><td><span class='pt3'> Handle conditional GET operations. If the response has an ETag or</span></td></tr>
<tr><td class='ln' data-ln='11'></td><td><span class='pt3'> Last-Modified header and the request has If-None-Match or If-Modified-Since,</span></td></tr>
<tr><td class='ln' data-ln='12'></td><td><span class='pt3'> replace the response with HttpNotModified. Add an ETag header if needed.</span></td></tr>
<tr><td class='ln' data-ln='13'></td><td><span class='pt3'> """</span></td></tr>
<tr><td class='ln' data-ln='14'></td><td><span> </span><span class='pt1 bo'>def</span><span> </span><span class='pt2'>process_response</span><span>(self, request, response):</span></td></tr>
<tr><td class='ln' data-ln='15'></td><td class='hi'><span> </span><span class='pt5'># It's too late to prevent an unsafe request with a 412 response, and</span></td></tr>
<tr><td class='ln' data-ln='16'></td><td class='hi'><span> </span><span class='pt5'># for a HEAD request, the response body is always empty so computing</span></td></tr>
<tr><td class='ln' data-ln='17'></td><td class='hi'><span> </span><span class='pt5'># an accurate ETag isn't possible.</span></td></tr>
<tr><td class='ln' data-ln='18'></td><td><span> </span><span class='pt4'>if</span><span> request.method </span><span class='pt4'>!=</span><span> </span><span class='pt3'>'GET'</span><span>:</span></td></tr>
<tr><td class='ln' data-ln='19'></td><td><span> </span><span class='pt4'>return</span><span> response</span></td></tr>
<tr><td class='ln' data-ln='20'></td><td> </td></tr>
<tr><td class='ln' data-ln='21'></td><td><span> </span><span class='pt4'>if</span><span> </span><span class='pt2'>self</span><span>.needs_etag(response) </span><span class='pt4'>and</span><span> </span><span class='pt4'>not</span><span> response.has_header(</span><span class='pt3'>'ETag'</span><span>):</span></td></tr>
<tr><td class='ln' data-ln='22'></td><td><span> set_response_etag(response)</span></td></tr>
<tr><td class='ln' data-ln='23'></td><td> </td></tr>
<tr><td class='ln' data-ln='24'></td><td><span> etag </span><span class='pt4'>=</span><span> response.get(</span><span class='pt3'>'ETag'</span><span>)</span></td></tr>
<tr><td class='ln' data-ln='25'></td><td><span> last_modified </span><span class='pt4'>=</span><span> response.get(</span><span class='pt3'>'Last-Modified'</span><span>)</span></td></tr>
<tr><td class='ln' data-ln='26'></td><td><span> last_modified </span><span class='pt4'>=</span><span> last_modified </span><span class='pt4'>and</span><span> parse_http_date_safe(last_modified)</span></td></tr>
<tr><td class='ln' data-ln='27'></td><td> </td></tr>
<tr><td class='ln' data-ln='28'></td><td><span> </span><span class='pt4'>if</span><span> etag </span><span class='pt4'>or</span><span> last_modified:</span></td></tr>
<tr><td class='ln' data-ln='29'></td><td><span> </span><span class='pt4'>return</span><span> get_conditional_response(</span></td></tr>
<tr><td class='ln' data-ln='30'></td><td><span> request,</span></td></tr>
<tr><td class='ln' data-ln='31'></td><td><span> etag</span><span class='pt4'>=</span><span>etag,</span></td></tr>
<tr><td class='ln' data-ln='32'></td><td><span> last_modified</span><span class='pt4'>=</span><span>last_modified,</span></td></tr>
<tr><td class='ln' data-ln='33'></td><td><span> response</span><span class='pt4'>=</span><span>response,</span></td></tr>
<tr><td class='ln' data-ln='34'></td><td><span> )</span></td></tr>
<tr><td class='ln' data-ln='35'></td><td> </td></tr>
<tr><td class='ln' data-ln='36'></td><td><span> </span><span class='pt4'>return</span><span> response</span></td></tr>
<tr><td class='ln' data-ln='37'></td><td> </td></tr>
<tr><td class='ln' data-ln='38'></td><td><span> </span><span class='pt1 bo'>def</span><span> </span><span class='pt2'>needs_etag</span><span>(self, response):</span></td></tr>
<tr><td class='ln' data-ln='39'></td><td><span> </span><span class='pt3'>"""Return True if an ETag header should be added to response."""</span></td></tr>
<tr><td class='ln' data-ln='40'></td><td><span> cache_control_headers </span><span class='pt4'>=</span><span> cc_delim_re.split(response.get(</span><span class='pt3'>'Cache-Control'</span><span>, </span><span class='pt3'>''</span><span>))</span></td></tr>
<tr><td class='ln' data-ln='41'></td><td><span> </span><span class='pt4'>return</span><span> </span><span class='pt2'>all</span><span>(header.lower() </span><span class='pt4'>!=</span><span> </span><span class='pt3'>'no-store'</span><span> </span><span class='pt4'>for</span><span> header </span><span class='pt4'>in</span><span> cache_control_headers)</span></td></tr>
</table>
</div>
</div>
</div>
<div class='style' id='P--wombat--py'>
<div class='P--wombat-bordered'>
<div class="info header">
<span class="left">middleware.http.py</span>
<span class="right"><span>41 lines</span><span>1.58 KB</span></span>
</div>
<div class='P--wombat'>
<table>
<tr><td class='ln' data-ln='1'></td><td><span class='pt23'>from</span><span> django.utils.cache </span><span class='pt23'>import</span><span> (</span></td></tr>
<tr><td class='ln' data-ln='2'></td><td><span> cc_delim_re, get_conditional_response, set_response_etag,</span></td></tr>
<tr><td class='ln' data-ln='3'></td><td><span>)</span></td></tr>
<tr><td class='ln' data-ln='4'></td><td><span class='pt23'>from</span><span> django.utils.deprecation </span><span class='pt23'>import</span><span> MiddlewareMixin</span></td></tr>
<tr><td class='ln' data-ln='5'></td><td><span class='pt23'>from</span><span> django.utils.http </span><span class='pt23'>import</span><span> parse_http_date_safe</span></td></tr>
<tr><td class='ln' data-ln='6'></td><td> </td></tr>
<tr><td class='ln' data-ln='7'></td><td> </td></tr>
<tr><td class='ln' data-ln='8'></td><td class='hi'><span class='pt13 it'>class</span><span> </span><span class='pt19'>ConditionalGetMiddleware</span><span>(</span><span class='pt19 un it'>MiddlewareMixin</span><span>):</span></td></tr>
<tr><td class='ln' data-ln='9'></td><td><span> </span><span class='pt15'>"""</span></td></tr>
<tr><td class='ln' data-ln='10'></td><td><span class='pt15'> Handle conditional GET operations. If the response has an ETag or</span></td></tr>
<tr><td class='ln' data-ln='11'></td><td><span class='pt15'> Last-Modified header and the request has If-None-Match or If-Modified-Since,</span></td></tr>
<tr><td class='ln' data-ln='12'></td><td><span class='pt15'> replace the response with HttpNotModified. Add an ETag header if needed.</span></td></tr>
<tr><td class='ln' data-ln='13'></td><td><span class='pt15'> """</span></td></tr>
<tr><td class='ln' data-ln='14'></td><td><span> </span><span class='pt13 it'>def</span><span> </span><span class='pt19'>process_response</span><span>(</span><span class='pt24 it'>self</span><span>, </span><span class='pt24 it'>request</span><span>, </span><span class='pt24 it'>response</span><span>):</span></td></tr>
<tr><td class='ln' data-ln='15'></td><td class='hi'><span> </span><span class='pt16 it'># It's too late to prevent an unsafe request with a 412 response, and</span></td></tr>
<tr><td class='ln' data-ln='16'></td><td class='hi'><span> </span><span class='pt16 it'># for a HEAD request, the response body is always empty so computing</span></td></tr>
<tr><td class='ln' data-ln='17'></td><td class='hi'><span> </span><span class='pt16 it'># an accurate ETag isn't possible.</span></td></tr>
<tr><td class='ln' data-ln='18'></td><td><span> </span><span class='pt23'>if</span><span> request.method </span><span class='pt23'>!=</span><span> </span><span class='pt15'>'GET'</span><span>:</span></td></tr>
<tr><td class='ln' data-ln='19'></td><td><span> </span><span class='pt23'>return</span><span> response</span></td></tr>
<tr><td class='ln' data-ln='20'></td><td> </td></tr>
<tr><td class='ln' data-ln='21'></td><td><span> </span><span class='pt23'>if</span><span> </span><span class='pt24'>self</span><span>.</span><span class='pt19'>needs_etag</span><span>(response) </span><span class='pt23'>and</span><span> </span><span class='pt23'>not</span><span> response.</span><span class='pt19'>has_header</span><span>(</span><span class='pt15'>'ETag'</span><span>):</span></td></tr>
<tr><td class='ln' data-ln='22'></td><td><span> </span><span class='pt19'>set_response_etag</span><span>(response)</span></td></tr>
<tr><td class='ln' data-ln='23'></td><td> </td></tr>
<tr><td class='ln' data-ln='24'></td><td><span> etag </span><span class='pt23'>=</span><span> response.</span><span class='pt19'>get</span><span>(</span><span class='pt15'>'ETag'</span><span>)</span></td></tr>
<tr><td class='ln' data-ln='25'></td><td><span> last_modified </span><span class='pt23'>=</span><span> response.</span><span class='pt19'>get</span><span>(</span><span class='pt15'>'Last-Modified'</span><span>)</span></td></tr>
<tr><td class='ln' data-ln='26'></td><td><span> last_modified </span><span class='pt23'>=</span><span> last_modified </span><span class='pt23'>and</span><span> </span><span class='pt19'>parse_http_date_safe</span><span>(last_modified)</span></td></tr>
<tr><td class='ln' data-ln='27'></td><td> </td></tr>
<tr><td class='ln' data-ln='28'></td><td><span> </span><span class='pt23'>if</span><span> etag </span><span class='pt23'>or</span><span> last_modified:</span></td></tr>
<tr><td class='ln' data-ln='29'></td><td><span> </span><span class='pt23'>return</span><span> </span><span class='pt19'>get_conditional_response</span><span>(</span></td></tr>
<tr><td class='ln' data-ln='30'></td><td><span> request,</span></td></tr>
<tr><td class='ln' data-ln='31'></td><td><span> </span><span class='pt24 it'>etag</span><span class='pt23'>=</span><span>etag,</span></td></tr>
<tr><td class='ln' data-ln='32'></td><td><span> </span><span class='pt24 it'>last_modified</span><span class='pt23'>=</span><span>last_modified,</span></td></tr>
<tr><td class='ln' data-ln='33'></td><td><span> </span><span class='pt24 it'>response</span><span class='pt23'>=</span><span>response,</span></td></tr>
<tr><td class='ln' data-ln='34'></td><td><span> )</span></td></tr>
<tr><td class='ln' data-ln='35'></td><td> </td></tr>
<tr><td class='ln' data-ln='36'></td><td><span> </span><span class='pt23'>return</span><span> response</span></td></tr>
<tr><td class='ln' data-ln='37'></td><td> </td></tr>
<tr><td class='ln' data-ln='38'></td><td><span> </span><span class='pt13 it'>def</span><span> </span><span class='pt19'>needs_etag</span><span>(</span><span class='pt24 it'>self</span><span>, </span><span class='pt24 it'>response</span><span>):</span></td></tr>
<tr><td class='ln' data-ln='39'></td><td><span> </span><span class='pt15'>"""Return True if an ETag header should be added to response."""</span></td></tr>
<tr><td class='ln' data-ln='40'></td><td><span> cache_control_headers </span><span class='pt23'>=</span><span> cc_delim_re.</span><span class='pt19'>split</span><span>(response.</span><span class='pt19'>get</span><span>(</span><span class='pt15'>'Cache-Control'</span><span>, </span><span class='pt15'>''</span><span>))</span></td></tr>
<tr><td class='ln' data-ln='41'></td><td><span> </span><span class='pt23'>return</span><span> </span><span class='pt13'>all</span><span>(header.</span><span class='pt19'>lower</span><span>() </span><span class='pt23'>!=</span><span> </span><span class='pt15'>'no-store'</span><span> </span><span class='pt23'>for</span><span> header </span><span class='pt23'>in</span><span> cache_control_headers)</span></td></tr>
</table>
</div>
</div>
</div>
<div class='style' id='P--atom_dark--rs'>
<div class='P--atom_dark-bordered'>
<div class="info header">
<span class="left">syntax_definition.rs</span>
<span class="right"><span>167 lines</span><span>5.55 KB</span></span>
</div>
<div class='P--atom_dark'>
<table>
<tr><td class='ln' data-ln='1'></td><td><span class='pt4'>use</span><span> std</span><span class='pt4'>::</span><span>collections</span><span class='pt4'>::</span><span>{BTreeMap, HashMap};</span></td></tr>
<tr><td class='ln' data-ln='2'></td><td><span class='pt4'>use</span><span> std</span><span class='pt4'>::</span><span>hash</span><span class='pt4'>::</span><span>Hash;</span></td></tr>
<tr><td class='ln' data-ln='3'></td><td><span class='pt4'>use</span><span> onig</span><span class='pt4'>::</span><span>{Regex, RegexOptions, Region, Syntax};</span></td></tr>
<tr><td class='ln' data-ln='4'></td><td><span class='pt4'>use</span><span> std</span><span class='pt4'>::</span><span>rc</span><span class='pt4'>::</span><span>{Rc, Weak};</span></td></tr>
<tr><td class='ln' data-ln='5'></td><td><span class='pt4'>use</span><span> std</span><span class='pt4'>::</span><span>cell</span><span class='pt4'>::</span><span>RefCell;</span></td></tr>
<tr><td class='ln' data-ln='6'></td><td><span class='pt4'>use</span><span> </span><span class='pt4'>super::</span><span>scope</span><span class='pt4'>::*</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='7'></td><td><span class='pt4'>use</span><span> regex_syntax</span><span class='pt4'>::</span><span>escape;</span></td></tr>
<tr><td class='ln' data-ln='8'></td><td class='hi'><span class='pt4'>use</span><span> serde</span><span class='pt4'>::</span><span>{Deserialize, Deserializer, Serialize, Serializer};</span></td></tr>
<tr><td class='ln' data-ln='9'></td><td> </td></tr>
<tr><td class='ln' data-ln='10'></td><td><span class='pt3'>/// The main data structure representing a syntax definition loaded from a</span></td></tr>
<tr><td class='ln' data-ln='11'></td><td><span class='pt3'>/// `.sublime-syntax` file. You'll probably only need these as references</span></td></tr>
<tr><td class='ln' data-ln='12'></td><td><span class='pt3'>/// to be passed around to parsing code.</span></td></tr>
<tr><td class='ln' data-ln='13'></td><td><span class='pt3'>///</span></td></tr>
<tr><td class='ln' data-ln='14'></td><td><span class='pt3'>/// Some useful public fields are the `name` field which is a human readable</span></td></tr>
<tr><td class='ln' data-ln='15'></td><td><span class='pt3'>/// name to display in syntax lists, and the `hidden` field which means hide</span></td></tr>
<tr><td class='ln' data-ln='16'></td><td><span class='pt3'>/// this syntax from any lists because it is for internal use.</span></td></tr>
<tr><td class='ln' data-ln='17'></td><td><span>#[</span><span class='pt25'>derive</span><span>(</span><span class='pt22'>Clone</span><span>, </span><span class='pt22'>Debug</span><span>, </span><span class='pt22'>Eq</span><span>, </span><span class='pt22'>PartialEq</span><span>, Serialize, Deserialize)]</span></td></tr>
<tr><td class='ln' data-ln='18'></td><td><span class='pt23'>pub</span><span> </span><span class='pt2 it'>struct</span><span> SyntaxDefinition {</span></td></tr>
<tr><td class='ln' data-ln='19'></td><td class='hi'><span> </span><span class='pt23'>pub</span><span> </span><span class='pt16'>name</span><span>: </span><span class='pt22'>String</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='20'></td><td class='hi'><span> </span><span class='pt23'>pub</span><span> </span><span class='pt16'>file_extensions</span><span>: </span><span class='pt22'>Vec</span><span class='pt4'><</span><span class='pt22'>String</span><span class='pt4'>></span><span>,</span></td></tr>
<tr><td class='ln' data-ln='21'></td><td class='hi'><span> </span><span class='pt23'>pub</span><span> </span><span class='pt16'>scope</span><span>: Scope,</span></td></tr>
<tr><td class='ln' data-ln='22'></td><td class='hi'><span> </span><span class='pt23'>pub</span><span> </span><span class='pt16'>first_line_match</span><span>: </span><span class='pt22'>Option</span><span class='pt4'><</span><span class='pt22'>String</span><span class='pt4'>></span><span>,</span></td></tr>
<tr><td class='ln' data-ln='23'></td><td class='hi'><span> </span><span class='pt23'>pub</span><span> </span><span class='pt16'>hidden</span><span>: </span><span class='pt2 it'>bool</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='24'></td><td><span> </span><span class='pt3'>/// Filled in at link time to avoid serializing it multiple times</span></td></tr>
<tr><td class='ln' data-ln='25'></td><td><span> #[</span><span class='pt25'>serde</span><span>(skip_serializing, skip_deserializing)]</span></td></tr>
<tr><td class='ln' data-ln='26'></td><td><span> </span><span class='pt23'>pub</span><span> </span><span class='pt16'>prototype</span><span>: </span><span class='pt22'>Option</span><span class='pt4'><</span><span>ContextPtr</span><span class='pt4'>></span><span>,</span></td></tr>
<tr><td class='ln' data-ln='27'></td><td><span> #[</span><span class='pt25'>serde</span><span>(serialize_with </span><span class='pt4'>=</span><span> </span><span class='pt9'>"ordered_map"</span><span>)]</span></td></tr>
<tr><td class='ln' data-ln='28'></td><td><span> </span><span class='pt23'>pub</span><span> </span><span class='pt16'>variables</span><span>: </span><span class='pt22'>HashMap</span><span class='pt4'><</span><span class='pt22'>String</span><span>, </span><span class='pt22'>String</span><span class='pt4'>></span><span>,</span></td></tr>
<tr><td class='ln' data-ln='29'></td><td><span> #[</span><span class='pt25'>serde</span><span>(serialize_with </span><span class='pt4'>=</span><span> </span><span class='pt9'>"ordered_map"</span><span>)]</span></td></tr>
<tr><td class='ln' data-ln='30'></td><td><span> </span><span class='pt23'>pub</span><span> </span><span class='pt16'>contexts</span><span>: </span><span class='pt22'>HashMap</span><span class='pt4'><</span><span class='pt22'>String</span><span>, ContextPtr</span><span class='pt4'>></span><span>,</span></td></tr>
<tr><td class='ln' data-ln='31'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='32'></td><td> </td></tr>
<tr><td class='ln' data-ln='33'></td><td><span class='pt2 it'>impl</span><span> Context {</span></td></tr>
<tr><td class='ln' data-ln='34'></td><td><span> </span><span class='pt3'>/// Returns the match pattern at an index, panics if the thing isn't a match pattern</span></td></tr>
<tr><td class='ln' data-ln='35'></td><td><span> </span><span class='pt23'>pub</span><span> </span><span class='pt2 it'>fn</span><span> </span><span class='pt25'>match_at</span><span>(</span><span class='pt4'>&</span><span class='pt16'>self</span><span>, </span><span class='pt13 it'>index</span><span>: </span><span class='pt2 it'>usize</span><span>) -> </span><span class='pt4'>&</span><span>MatchPattern {</span></td></tr>
<tr><td class='ln' data-ln='36'></td><td><span> </span><span class='pt4'>match</span><span> </span><span class='pt16'>self</span><span>.patterns[index] {</span></td></tr>
<tr><td class='ln' data-ln='37'></td><td><span> Pattern</span><span class='pt4'>::</span><span>Match(</span><span class='pt23'>ref</span><span> match_pat) </span><span class='pt4'>=></span><span> match_pat,</span></td></tr>
<tr><td class='ln' data-ln='38'></td><td><span> _ </span><span class='pt4'>=></span><span> </span><span class='pt13 it'>panic!</span><span>(</span><span class='pt9'>"bad index to match_at"</span><span>),</span></td></tr>
<tr><td class='ln' data-ln='39'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='40'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='41'></td><td> </td></tr>
<tr><td class='ln' data-ln='42'></td><td><span> </span><span class='pt3'>/// Returns a mutable reference, otherwise like `match_at`</span></td></tr>
<tr><td class='ln' data-ln='43'></td><td><span> </span><span class='pt23'>pub</span><span> </span><span class='pt2 it'>fn</span><span> </span><span class='pt25'>match_at_mut</span><span>(</span><span class='pt4'>&</span><span class='pt23'>mut</span><span> </span><span class='pt16'>self</span><span>, </span><span class='pt13 it'>index</span><span>: </span><span class='pt2 it'>usize</span><span>) -> </span><span class='pt4'>&</span><span class='pt23'>mut</span><span> MatchPattern {</span></td></tr>
<tr><td class='ln' data-ln='44'></td><td><span> </span><span class='pt4'>match</span><span> </span><span class='pt16'>self</span><span>.patterns[index] {</span></td></tr>
<tr><td class='ln' data-ln='45'></td><td><span> Pattern</span><span class='pt4'>::</span><span>Match(</span><span class='pt23'>ref</span><span> </span><span class='pt23'>mut</span><span> match_pat) </span><span class='pt4'>=></span><span> match_pat,</span></td></tr>
<tr><td class='ln' data-ln='46'></td><td><span> _ </span><span class='pt4'>=></span><span> </span><span class='pt13 it'>panic!</span><span>(</span><span class='pt9'>"bad index to match_at"</span><span>),</span></td></tr>
<tr><td class='ln' data-ln='47'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='48'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='49'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='50'></td><td> </td></tr>
<tr><td class='ln' data-ln='51'></td><td><span class='pt2 it'>impl</span><span> ContextReference {</span></td></tr>
<tr><td class='ln' data-ln='52'></td><td><span> </span><span class='pt3'>/// find the pointed to context, panics if ref is not linked</span></td></tr>
<tr><td class='ln' data-ln='53'></td><td><span> </span><span class='pt23'>pub</span><span> </span><span class='pt2 it'>fn</span><span> </span><span class='pt25'>resolve</span><span>(</span><span class='pt4'>&</span><span class='pt16'>self</span><span>) -> ContextPtr {</span></td></tr>
<tr><td class='ln' data-ln='54'></td><td><span> </span><span class='pt4'>match</span><span> </span><span class='pt4'>*</span><span class='pt16'>self</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='55'></td><td><span> ContextReference</span><span class='pt4'>::</span><span>Inline(</span><span class='pt23'>ref</span><span> ptr) </span><span class='pt4'>=></span><span> ptr.</span><span class='pt25'>clone</span><span>(),</span></td></tr>
<tr><td class='ln' data-ln='56'></td><td><span> ContextReference</span><span class='pt4'>::</span><span>Direct(</span><span class='pt23'>ref</span><span> ptr) </span><span class='pt4'>=></span><span> ptr.link.</span><span class='pt25'>upgrade</span><span>().</span><span class='pt25'>unwrap</span><span>(),</span></td></tr>
<tr><td class='ln' data-ln='57'></td><td><span> _ </span><span class='pt4'>=></span><span> </span><span class='pt13 it'>panic!</span><span>(</span><span class='pt9'>"Can only call resolve on linked references: </span><span class='pt5'>{:?}</span><span class='pt9'>"</span><span>, </span><span class='pt16'>self</span><span>),</span></td></tr>
<tr><td class='ln' data-ln='58'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='59'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='60'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='61'></td><td> </td></tr>
<tr><td class='ln' data-ln='62'></td><td><span class='pt2 it'>impl</span><span> MatchPattern {</span></td></tr>
<tr><td class='ln' data-ln='63'></td><td><span> </span><span class='pt3'>/// substitutes back-refs in Regex with regions from s</span></td></tr>
<tr><td class='ln' data-ln='64'></td><td><span> </span><span class='pt3'>/// used for match patterns which refer to captures from the pattern</span></td></tr>
<tr><td class='ln' data-ln='65'></td><td><span> </span><span class='pt3'>/// that pushed them.</span></td></tr>
<tr><td class='ln' data-ln='66'></td><td><span> </span><span class='pt23'>pub</span><span> </span><span class='pt2 it'>fn</span><span> </span><span class='pt25'>regex_with_substitutes</span><span>(</span><span class='pt4'>&</span><span class='pt16'>self</span><span>, </span><span class='pt13 it'>region</span><span>: </span><span class='pt4'>&</span><span>Region, </span><span class='pt13 it'>s</span><span>: </span><span class='pt4'>&</span><span class='pt2 it'>str</span><span>) -> </span><span class='pt22'>String</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='67'></td><td><span> </span><span class='pt4 it'>let</span><span> </span><span class='pt23'>mut</span><span> reg_str </span><span class='pt4'>=</span><span> </span><span class='pt22'>String</span><span class='pt4'>::</span><span class='pt25'>new</span><span>();</span></td></tr>
<tr><td class='ln' data-ln='68'></td><td><span> </span><span class='pt4 it'>let</span><span> </span><span class='pt23'>mut</span><span> last_was_escape </span><span class='pt4'>=</span><span> </span><span class='pt12'>false</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='69'></td><td> </td></tr>
<tr><td class='ln' data-ln='70'></td><td><span> </span><span class='pt4'>for</span><span> c </span><span class='pt4'>in</span><span> </span><span class='pt16'>self</span><span>.regex_str.</span><span class='pt25'>chars</span><span>() {</span></td></tr>
<tr><td class='ln' data-ln='71'></td><td><span> </span><span class='pt4'>if</span><span> last_was_escape </span><span class='pt4'>&&</span><span> c.</span><span class='pt25'>is_digit</span><span>(</span><span class='pt24'>10</span><span>) {</span></td></tr>
<tr><td class='ln' data-ln='72'></td><td><span> </span><span class='pt4 it'>let</span><span> val </span><span class='pt4'>=</span><span> c.</span><span class='pt25'>to_digit</span><span>(</span><span class='pt24'>10</span><span>).</span><span class='pt25'>unwrap</span><span>();</span></td></tr>
<tr><td class='ln' data-ln='73'></td><td> </td></tr>
<tr><td class='ln' data-ln='74'></td><td><span> </span><span class='pt4'>if</span><span> </span><span class='pt4 it'>let</span><span> </span><span class='pt2'>Some</span><span>((start, end)) </span><span class='pt4'>=</span><span> region.</span><span class='pt25'>pos</span><span>(val </span><span class='pt4'>as</span><span> </span><span class='pt2 it'>usize</span><span>) {</span></td></tr>
<tr><td class='ln' data-ln='75'></td><td><span> </span><span class='pt4 it'>let</span><span> escaped </span><span class='pt4'>=</span><span> </span><span class='pt25'>escape</span><span>(</span><span class='pt4'>&</span><span>s[start</span><span class='pt4'>..</span><span>end]);</span></td></tr>
<tr><td class='ln' data-ln='76'></td><td><span> reg_str.</span><span class='pt25'>push_str</span><span>(</span><span class='pt4'>&</span><span>escaped);</span></td></tr>
<tr><td class='ln' data-ln='77'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='78'></td><td><span> } </span><span class='pt4'>else</span><span> </span><span class='pt4'>if</span><span> last_was_escape {</span></td></tr>
<tr><td class='ln' data-ln='79'></td><td><span> reg_str.</span><span class='pt25'>push</span><span>(</span><span class='pt9'>'</span><span class='pt5'>\\</span><span class='pt9'>'</span><span>);</span></td></tr>
<tr><td class='ln' data-ln='80'></td><td><span> reg_str.</span><span class='pt25'>push</span><span>(c);</span></td></tr>
<tr><td class='ln' data-ln='81'></td><td><span> } </span><span class='pt4'>else</span><span> </span><span class='pt4'>if</span><span> c </span><span class='pt4'>!=</span><span> </span><span class='pt9'>'</span><span class='pt5'>\\</span><span class='pt9'>'</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='82'></td><td><span> reg_str.</span><span class='pt25'>push</span><span>(c);</span></td></tr>
<tr><td class='ln' data-ln='83'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='84'></td><td> </td></tr>
<tr><td class='ln' data-ln='85'></td><td><span> last_was_escape </span><span class='pt4'>=</span><span> c </span><span class='pt4'>==</span><span> </span><span class='pt9'>'</span><span class='pt5'>\\</span><span class='pt9'>'</span><span> </span><span class='pt4'>&&</span><span> </span><span class='pt4'>!</span><span>last_was_escape;</span></td></tr>
<tr><td class='ln' data-ln='86'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='87'></td><td><span> reg_str</span></td></tr>
<tr><td class='ln' data-ln='88'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='89'></td><td> </td></tr>
<tr><td class='ln' data-ln='90'></td><td><span> </span><span class='pt3'>/// Makes sure the regex is compiled if it doesn't have captures.</span></td></tr>
<tr><td class='ln' data-ln='91'></td><td><span> </span><span class='pt3'>/// May compile the regex if it isn't, panicing if compilation fails.</span></td></tr>
<tr><td class='ln' data-ln='92'></td><td><span> #[inline]</span></td></tr>
<tr><td class='ln' data-ln='93'></td><td><span> </span><span class='pt23'>pub</span><span> </span><span class='pt2 it'>fn</span><span> </span><span class='pt25'>ensure_compiled_if_possible</span><span>(</span><span class='pt4'>&</span><span class='pt23'>mut</span><span> </span><span class='pt16'>self</span><span>) {</span></td></tr>
<tr><td class='ln' data-ln='94'></td><td><span> </span><span class='pt4'>if</span><span> </span><span class='pt16'>self</span><span>.regex.</span><span class='pt25'>is_none</span><span>() </span><span class='pt4'>&&</span><span> </span><span class='pt4'>!</span><span class='pt16'>self</span><span>.has_captures {</span></td></tr>
<tr><td class='ln' data-ln='95'></td><td><span> </span><span class='pt16'>self</span><span>.</span><span class='pt25'>compile_regex</span><span>();</span></td></tr>
<tr><td class='ln' data-ln='96'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='97'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='98'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='99'></td><td> </td></tr>
<tr><td class='ln' data-ln='100'></td><td><span class='pt3'>/// This wrapper only exists so that I can implement a serialization</span></td></tr>
<tr><td class='ln' data-ln='101'></td><td><span class='pt3'>/// trait that crashes if you try and serialize this.</span></td></tr>
<tr><td class='ln' data-ln='102'></td><td><span>#[</span><span class='pt25'>derive</span><span>(</span><span class='pt22'>Debug</span><span>)]</span></td></tr>
<tr><td class='ln' data-ln='103'></td><td><span class='pt23'>pub</span><span> </span><span class='pt2 it'>struct</span><span> LinkerLink {</span></td></tr>
<tr><td class='ln' data-ln='104'></td><td><span> </span><span class='pt23'>pub</span><span> </span><span class='pt16'>link</span><span>: Weak</span><span class='pt4'><</span><span>RefCell</span><span class='pt4'><</span><span>Context</span><span class='pt4'>>></span><span>,</span></td></tr>
<tr><td class='ln' data-ln='105'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='106'></td><td> </td></tr>
<tr><td class='ln' data-ln='107'></td><td><span class='pt2 it'>impl</span><span> </span><span class='pt22'>Eq</span><span> </span><span class='pt4'>for</span><span> LinkerLink {}</span></td></tr>
<tr><td class='ln' data-ln='108'></td><td> </td></tr>
<tr><td class='ln' data-ln='109'></td><td><span class='pt2 it'>impl</span><span> </span><span class='pt22'>PartialEq</span><span> </span><span class='pt4'>for</span><span> LinkerLink {</span></td></tr>
<tr><td class='ln' data-ln='110'></td><td><span> </span><span class='pt2 it'>fn</span><span> </span><span class='pt25'>eq</span><span>(</span><span class='pt4'>&</span><span class='pt16'>self</span><span>, </span><span class='pt13 it'>other</span><span>: </span><span class='pt4'>&</span><span>LinkerLink) -> </span><span class='pt2 it'>bool</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='111'></td><td><span> </span><span class='pt16'>self</span><span>.link.</span><span class='pt25'>upgrade</span><span>() </span><span class='pt4'>==</span><span> other.link.</span><span class='pt25'>upgrade</span><span>()</span></td></tr>
<tr><td class='ln' data-ln='112'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='113'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='114'></td><td> </td></tr>
<tr><td class='ln' data-ln='115'></td><td><span class='pt3'>/// Just panics, we can't do anything with linked up syntaxes</span></td></tr>
<tr><td class='ln' data-ln='116'></td><td><span class='pt2 it'>impl</span><span> Serialize </span><span class='pt4'>for</span><span> LinkerLink {</span></td></tr>
<tr><td class='ln' data-ln='117'></td><td><span> </span><span class='pt2 it'>fn</span><span> </span><span class='pt25'>serialize</span><span class='pt4'><</span><span>S</span><span class='pt4'>></span><span>(</span><span class='pt4'>&</span><span class='pt16'>self</span><span>, </span><span class='pt4'>_</span><span>: S) -> </span><span class='pt22'>Result</span><span class='pt4'><</span><span class='pt2 it'>S::</span><span class='pt2'>Ok</span><span>, </span><span class='pt2 it'>S::</span><span>Error</span><span class='pt4'>></span><span> </span><span class='pt4'>where</span><span> S: Serializer {</span></td></tr>
<tr><td class='ln' data-ln='118'></td><td><span> </span><span class='pt13 it'>panic!</span><span>(</span><span class='pt9'>"Can't serialize syntax definitions which have been linked"</span><span>);</span></td></tr>
<tr><td class='ln' data-ln='119'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='120'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='121'></td><td> </td></tr>
<tr><td class='ln' data-ln='122'></td><td><span class='pt3'>/// Just panics, we can't do anything with linked up syntaxes</span></td></tr>
<tr><td class='ln' data-ln='123'></td><td><span class='pt2 it'>impl</span><span class='pt4'><</span><span class='pt23'>'de</span><span class='pt4'>></span><span> Deserialize</span><span class='pt4'><</span><span class='pt23'>'de</span><span class='pt4'>></span><span> </span><span class='pt4'>for</span><span> LinkerLink {</span></td></tr>
<tr><td class='ln' data-ln='124'></td><td><span> </span><span class='pt2 it'>fn</span><span> </span><span class='pt25'>deserialize</span><span class='pt4'><</span><span>D</span><span class='pt4'>></span><span>(</span><span class='pt4'>_</span><span>: D) -> </span><span class='pt22'>Result</span><span class='pt4'><</span><span class='pt2 it'>Self</span><span>, </span><span class='pt2 it'>D::</span><span>Error</span><span class='pt4'>></span><span> </span><span class='pt4'>where</span><span> D: Deserializer<'de> {</span></td></tr>
<tr><td class='ln' data-ln='125'></td><td><span> </span><span class='pt13 it'>panic!</span><span>(</span><span class='pt9'>"No linked syntax should ever have gotten serialized"</span><span>);</span></td></tr>
<tr><td class='ln' data-ln='126'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='127'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='128'></td><td> </td></tr>
<tr><td class='ln' data-ln='129'></td><td> </td></tr>
<tr><td class='ln' data-ln='130'></td><td><span class='pt3'>/// Serialize the provided map in natural key order, so that it's deterministic when dumping.</span></td></tr>
<tr><td class='ln' data-ln='131'></td><td><span class='pt2 it'>fn</span><span> </span><span class='pt25'>ordered_map</span><span class='pt4'><</span><span>K, V, S</span><span class='pt4'>></span><span>(</span><span class='pt13 it'>map</span><span>: </span><span class='pt4'>&</span><span class='pt22'>HashMap</span><span class='pt4'><</span><span>K, V</span><span class='pt4'>></span><span>, </span><span class='pt13 it'>serializer</span><span>: S) -> </span><span class='pt22'>Result</span><span class='pt4'><</span><span class='pt2 it'>S::</span><span class='pt2'>Ok</span><span>, </span><span class='pt2 it'>S::</span><span>Error</span><span class='pt4'>></span></td></tr>
<tr><td class='ln' data-ln='132'></td><td><span> </span><span class='pt4'>where</span><span> S: Serializer, K: Eq + Hash + Ord + Serialize, V: Serialize</span></td></tr>
<tr><td class='ln' data-ln='133'></td><td><span>{</span></td></tr>
<tr><td class='ln' data-ln='134'></td><td><span> </span><span class='pt4 it'>let</span><span> ordered: BTreeMap</span><span class='pt4'><_</span><span>, </span><span class='pt4'>_></span><span> </span><span class='pt4'>=</span><span> map.</span><span class='pt25'>iter</span><span>().</span><span class='pt25'>collect</span><span>();</span></td></tr>
<tr><td class='ln' data-ln='135'></td><td><span> ordered.</span><span class='pt25'>serialize</span><span>(serializer)</span></td></tr>
<tr><td class='ln' data-ln='136'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='137'></td><td> </td></tr>
<tr><td class='ln' data-ln='138'></td><td> </td></tr>
<tr><td class='ln' data-ln='139'></td><td><span>#[</span><span class='pt25'>cfg</span><span>(test)]</span></td></tr>
<tr><td class='ln' data-ln='140'></td><td><span class='pt2 it'>mod</span><span> tests {</span></td></tr>
<tr><td class='ln' data-ln='141'></td><td><span> </span><span class='pt4'>use</span><span> </span><span class='pt4'>super::*</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='142'></td><td> </td></tr>
<tr><td class='ln' data-ln='143'></td><td><span> #[test]</span></td></tr>
<tr><td class='ln' data-ln='144'></td><td><span> </span><span class='pt2 it'>fn</span><span> </span><span class='pt25'>can_compile_refs</span><span>() {</span></td></tr>
<tr><td class='ln' data-ln='145'></td><td><span> </span><span class='pt4'>use</span><span> onig</span><span class='pt4'>::</span><span>{SearchOptions, Regex, Region};</span></td></tr>
<tr><td class='ln' data-ln='146'></td><td> </td></tr>
<tr><td class='ln' data-ln='147'></td><td><span> </span><span class='pt4 it'>let</span><span> pat </span><span class='pt4'>=</span><span> MatchPattern {</span></td></tr>
<tr><td class='ln' data-ln='148'></td><td><span> has_captures: </span><span class='pt12'>true</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='149'></td><td><span> regex_str: </span><span class='pt22'>String</span><span class='pt4'>::</span><span class='pt25'>from</span><span>(</span><span class='pt2 it'>r</span><span class='pt9'>"lol \\ \2 \1 '\9' \wz"</span><span>),</span></td></tr>
<tr><td class='ln' data-ln='150'></td><td><span> regex: </span><span class='pt2'>None</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='151'></td><td><span> scope: </span><span class='pt13 it'>vec!</span><span>[],</span></td></tr>
<tr><td class='ln' data-ln='152'></td><td><span> captures: </span><span class='pt2'>None</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='153'></td><td><span> operation: MatchOperation</span><span class='pt4'>::</span><span class='pt2'>None</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='154'></td><td><span> with_prototype: </span><span class='pt2'>None</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='155'></td><td><span> };</span></td></tr>
<tr><td class='ln' data-ln='156'></td><td> </td></tr>
<tr><td class='ln' data-ln='157'></td><td><span> </span><span class='pt4 it'>let</span><span> r </span><span class='pt4'>=</span><span> Regex</span><span class='pt4'>::</span><span class='pt25'>new</span><span>(</span><span class='pt2 it'>r</span><span class='pt9'>"(\\\[\]\(\))(b)(c)(d)(e)"</span><span>).</span><span class='pt25'>unwrap</span><span>();</span></td></tr>
<tr><td class='ln' data-ln='158'></td><td><span> </span><span class='pt4 it'>let</span><span> </span><span class='pt23'>mut</span><span> region </span><span class='pt4'>=</span><span> Region</span><span class='pt4'>::</span><span class='pt25'>new</span><span>();</span></td></tr>
<tr><td class='ln' data-ln='159'></td><td><span> </span><span class='pt4 it'>let</span><span> s </span><span class='pt4'>=</span><span> </span><span class='pt2 it'>r</span><span class='pt9'>"\[]()bcde"</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='160'></td><td> </td></tr>
<tr><td class='ln' data-ln='161'></td><td><span> </span><span class='pt13 it'>assert!</span><span>(r.</span><span class='pt25'>match_with_options</span><span>(s, </span><span class='pt24'>0</span><span>, SearchOptions</span><span class='pt4'>::</span><span class='pt5'>SEARCH_OPTION_NONE</span><span>, </span><span class='pt2'>Some</span><span>(</span><span class='pt4'>&</span><span class='pt23'>mut</span><span> region)).</span><span class='pt25'>is_some</span><span>());</span></td></tr>
<tr><td class='ln' data-ln='162'></td><td> </td></tr>
<tr><td class='ln' data-ln='163'></td><td><span> </span><span class='pt4 it'>let</span><span> regex_res </span><span class='pt4'>=</span><span> pat.</span><span class='pt25'>regex_with_substitutes</span><span>(</span><span class='pt4'>&</span><span>region, s);</span></td></tr>
<tr><td class='ln' data-ln='164'></td><td><span> </span><span class='pt13 it'>assert_eq!</span><span>(regex_res, </span><span class='pt2 it'>r</span><span class='pt9'>"lol \\ b \\\[\]\(\) '' \wz"</span><span>);</span></td></tr>
<tr><td class='ln' data-ln='165'></td><td><span> pat.</span><span class='pt25'>compile_with_refs</span><span>(</span><span class='pt4'>&</span><span>region, s);</span></td></tr>
<tr><td class='ln' data-ln='166'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='167'></td><td><span>}</span></td></tr>
</table>
</div>
</div>
</div>
<div class='style' id='P--ayu_dark--rs'>
<div class='P--ayu_dark-bordered'>
<div class="info header">
<span class="left">syntax_definition.rs</span>
<span class="right"><span>167 lines</span><span>5.55 KB</span></span>
</div>
<div class='P--ayu_dark'>
<table>
<tr><td class='ln' data-ln='1'></td><td><span class='pt21'>use</span><span> std</span><span class='pt18'>::</span><span>collections</span><span class='pt18'>::</span><span>{BTreeMap, HashMap}</span><span class='pt25'>;</span></td></tr>
<tr><td class='ln' data-ln='2'></td><td><span class='pt21'>use</span><span> std</span><span class='pt18'>::</span><span>hash</span><span class='pt18'>::</span><span>Hash</span><span class='pt25'>;</span></td></tr>
<tr><td class='ln' data-ln='3'></td><td><span class='pt21'>use</span><span> onig</span><span class='pt18'>::</span><span>{Regex, RegexOptions, Region, Syntax}</span><span class='pt25'>;</span></td></tr>
<tr><td class='ln' data-ln='4'></td><td><span class='pt21'>use</span><span> std</span><span class='pt18'>::</span><span>rc</span><span class='pt18'>::</span><span>{Rc, Weak}</span><span class='pt25'>;</span></td></tr>
<tr><td class='ln' data-ln='5'></td><td><span class='pt21'>use</span><span> std</span><span class='pt18'>::</span><span>cell</span><span class='pt18'>::</span><span>RefCell</span><span class='pt25'>;</span></td></tr>
<tr><td class='ln' data-ln='6'></td><td><span class='pt21'>use</span><span> </span><span class='pt21'>super</span><span class='pt18'>::</span><span>scope</span><span class='pt18'>::*</span><span class='pt25'>;</span></td></tr>
<tr><td class='ln' data-ln='7'></td><td><span class='pt21'>use</span><span> regex_syntax</span><span class='pt18'>::</span><span>escape</span><span class='pt25'>;</span></td></tr>
<tr><td class='ln' data-ln='8'></td><td class='hi'><span class='pt21'>use</span><span> serde</span><span class='pt18'>::</span><span>{Deserialize, Deserializer, Serialize, Serializer}</span><span class='pt25'>;</span></td></tr>
<tr><td class='ln' data-ln='9'></td><td> </td></tr>
<tr><td class='ln' data-ln='10'></td><td><span class='pt10 it'>/// The main data structure representing a syntax definition loaded from a</span></td></tr>
<tr><td class='ln' data-ln='11'></td><td><span class='pt10 it'>/// `.sublime-syntax` file. You'll probably only need these as references</span></td></tr>
<tr><td class='ln' data-ln='12'></td><td><span class='pt10 it'>/// to be passed around to parsing code.</span></td></tr>
<tr><td class='ln' data-ln='13'></td><td><span class='pt10 it'>///</span></td></tr>
<tr><td class='ln' data-ln='14'></td><td><span class='pt10 it'>/// Some useful public fields are the `name` field which is a human readable</span></td></tr>
<tr><td class='ln' data-ln='15'></td><td><span class='pt10 it'>/// name to display in syntax lists, and the `hidden` field which means hide</span></td></tr>
<tr><td class='ln' data-ln='16'></td><td><span class='pt10 it'>/// this syntax from any lists because it is for internal use.</span></td></tr>
<tr><td class='ln' data-ln='17'></td><td><span>#[</span><span class='pt22'>derive</span><span>(</span><span class='pt8 it'>Clone</span><span>, </span><span class='pt8 it'>Debug</span><span>, </span><span class='pt8 it'>Eq</span><span>, </span><span class='pt8 it'>PartialEq</span><span>, Serialize, Deserialize)]</span></td></tr>
<tr><td class='ln' data-ln='18'></td><td><span class='pt21'>pub</span><span> </span><span class='pt21'>struct</span><span> </span><span class='pt9'>SyntaxDefinition</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='19'></td><td class='hi'><span> </span><span class='pt21'>pub</span><span> name</span><span class='pt25'>:</span><span> </span><span class='pt8 it'>String</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='20'></td><td class='hi'><span> </span><span class='pt21'>pub</span><span> file_extensions</span><span class='pt25'>:</span><span> </span><span class='pt8 it'>Vec</span><span><</span><span class='pt8 it'>String</span><span>>,</span></td></tr>
<tr><td class='ln' data-ln='21'></td><td class='hi'><span> </span><span class='pt21'>pub</span><span> scope</span><span class='pt25'>:</span><span> Scope,</span></td></tr>
<tr><td class='ln' data-ln='22'></td><td class='hi'><span> </span><span class='pt21'>pub</span><span> first_line_match</span><span class='pt25'>:</span><span> </span><span class='pt8 it'>Option</span><span><</span><span class='pt8 it'>String</span><span>>,</span></td></tr>
<tr><td class='ln' data-ln='23'></td><td class='hi'><span> </span><span class='pt21'>pub</span><span> hidden</span><span class='pt25'>:</span><span> </span><span class='pt21'>bool</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='24'></td><td><span> </span><span class='pt10 it'>/// Filled in at link time to avoid serializing it multiple times</span></td></tr>
<tr><td class='ln' data-ln='25'></td><td><span> #[</span><span class='pt22'>serde</span><span>(skip_serializing, skip_deserializing)]</span></td></tr>
<tr><td class='ln' data-ln='26'></td><td><span> </span><span class='pt21'>pub</span><span> prototype</span><span class='pt25'>:</span><span> </span><span class='pt8 it'>Option</span><span><ContextPtr>,</span></td></tr>
<tr><td class='ln' data-ln='27'></td><td><span> #[</span><span class='pt22'>serde</span><span>(serialize_with </span><span class='pt18'>=</span><span> </span><span class='pt13'>"ordered_map"</span><span>)]</span></td></tr>
<tr><td class='ln' data-ln='28'></td><td><span> </span><span class='pt21'>pub</span><span> variables</span><span class='pt25'>:</span><span> </span><span class='pt8 it'>HashMap</span><span><</span><span class='pt8 it'>String</span><span class='pt25'>,</span><span> </span><span class='pt8 it'>String</span><span>>,</span></td></tr>
<tr><td class='ln' data-ln='29'></td><td><span> #[</span><span class='pt22'>serde</span><span>(serialize_with </span><span class='pt18'>=</span><span> </span><span class='pt13'>"ordered_map"</span><span>)]</span></td></tr>
<tr><td class='ln' data-ln='30'></td><td><span> </span><span class='pt21'>pub</span><span> contexts</span><span class='pt25'>:</span><span> </span><span class='pt8 it'>HashMap</span><span><</span><span class='pt8 it'>String</span><span class='pt25'>,</span><span> ContextPtr>,</span></td></tr>
<tr><td class='ln' data-ln='31'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='32'></td><td> </td></tr>
<tr><td class='ln' data-ln='33'></td><td><span class='pt21'>impl</span><span> </span><span class='pt9'>Context</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='34'></td><td><span> </span><span class='pt10 it'>/// Returns the match pattern at an index, panics if the thing isn't a match pattern</span></td></tr>
<tr><td class='ln' data-ln='35'></td><td><span> </span><span class='pt21'>pub</span><span> </span><span class='pt21'>fn</span><span> </span><span class='pt22'>match_at</span><span>(</span><span class='pt18'>&</span><span class='pt8 it'>self</span><span>, </span><span class='pt23'>index</span><span class='pt25'>:</span><span> </span><span class='pt21'>usize</span><span>) </span><span class='pt25'>-></span><span> </span><span class='pt18'>&</span><span>MatchPattern {</span></td></tr>
<tr><td class='ln' data-ln='36'></td><td><span> </span><span class='pt21'>match</span><span> </span><span class='pt8 it'>self</span><span>.patterns[index] {</span></td></tr>
<tr><td class='ln' data-ln='37'></td><td><span> Pattern</span><span class='pt18'>::</span><span>Match(</span><span class='pt21'>ref</span><span> match_pat) </span><span class='pt18'>=></span><span> match_pat,</span></td></tr>
<tr><td class='ln' data-ln='38'></td><td><span> _ </span><span class='pt18'>=></span><span> </span><span class='pt17'>panic!</span><span>(</span><span class='pt13'>"bad index to match_at"</span><span>),</span></td></tr>
<tr><td class='ln' data-ln='39'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='40'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='41'></td><td> </td></tr>
<tr><td class='ln' data-ln='42'></td><td><span> </span><span class='pt10 it'>/// Returns a mutable reference, otherwise like `match_at`</span></td></tr>
<tr><td class='ln' data-ln='43'></td><td><span> </span><span class='pt21'>pub</span><span> </span><span class='pt21'>fn</span><span> </span><span class='pt22'>match_at_mut</span><span>(</span><span class='pt18'>&</span><span class='pt21'>mut</span><span> </span><span class='pt8 it'>self</span><span>, </span><span class='pt23'>index</span><span class='pt25'>:</span><span> </span><span class='pt21'>usize</span><span>) </span><span class='pt25'>-></span><span> </span><span class='pt18'>&</span><span class='pt21'>mut</span><span> MatchPattern {</span></td></tr>
<tr><td class='ln' data-ln='44'></td><td><span> </span><span class='pt21'>match</span><span> </span><span class='pt8 it'>self</span><span>.patterns[index] {</span></td></tr>
<tr><td class='ln' data-ln='45'></td><td><span> Pattern</span><span class='pt18'>::</span><span>Match(</span><span class='pt21'>ref</span><span> </span><span class='pt21'>mut</span><span> match_pat) </span><span class='pt18'>=></span><span> match_pat,</span></td></tr>
<tr><td class='ln' data-ln='46'></td><td><span> _ </span><span class='pt18'>=></span><span> </span><span class='pt17'>panic!</span><span>(</span><span class='pt13'>"bad index to match_at"</span><span>),</span></td></tr>
<tr><td class='ln' data-ln='47'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='48'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='49'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='50'></td><td> </td></tr>
<tr><td class='ln' data-ln='51'></td><td><span class='pt21'>impl</span><span> </span><span class='pt9'>ContextReference</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='52'></td><td><span> </span><span class='pt10 it'>/// find the pointed to context, panics if ref is not linked</span></td></tr>
<tr><td class='ln' data-ln='53'></td><td><span> </span><span class='pt21'>pub</span><span> </span><span class='pt21'>fn</span><span> </span><span class='pt22'>resolve</span><span>(</span><span class='pt18'>&</span><span class='pt8 it'>self</span><span>) </span><span class='pt25'>-></span><span> ContextPtr {</span></td></tr>
<tr><td class='ln' data-ln='54'></td><td><span> </span><span class='pt21'>match</span><span> </span><span class='pt18'>*</span><span class='pt8 it'>self</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='55'></td><td><span> ContextReference</span><span class='pt18'>::</span><span>Inline(</span><span class='pt21'>ref</span><span> ptr) </span><span class='pt18'>=></span><span> ptr.</span><span class='pt22'>clone</span><span>(),</span></td></tr>
<tr><td class='ln' data-ln='56'></td><td><span> ContextReference</span><span class='pt18'>::</span><span>Direct(</span><span class='pt21'>ref</span><span> ptr) </span><span class='pt18'>=></span><span> ptr.link.</span><span class='pt22'>upgrade</span><span>().</span><span class='pt22'>unwrap</span><span>(),</span></td></tr>
<tr><td class='ln' data-ln='57'></td><td><span> _ </span><span class='pt18'>=></span><span> </span><span class='pt17'>panic!</span><span>(</span><span class='pt13'>"Can only call resolve on linked references: </span><span class='pt19'>{:?}</span><span class='pt13'>"</span><span>, </span><span class='pt8 it'>self</span><span>),</span></td></tr>
<tr><td class='ln' data-ln='58'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='59'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='60'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='61'></td><td> </td></tr>
<tr><td class='ln' data-ln='62'></td><td><span class='pt21'>impl</span><span> </span><span class='pt9'>MatchPattern</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='63'></td><td><span> </span><span class='pt10 it'>/// substitutes back-refs in Regex with regions from s</span></td></tr>
<tr><td class='ln' data-ln='64'></td><td><span> </span><span class='pt10 it'>/// used for match patterns which refer to captures from the pattern</span></td></tr>
<tr><td class='ln' data-ln='65'></td><td><span> </span><span class='pt10 it'>/// that pushed them.</span></td></tr>
<tr><td class='ln' data-ln='66'></td><td><span> </span><span class='pt21'>pub</span><span> </span><span class='pt21'>fn</span><span> </span><span class='pt22'>regex_with_substitutes</span><span>(</span><span class='pt18'>&</span><span class='pt8 it'>self</span><span>, </span><span class='pt23'>region</span><span class='pt25'>:</span><span> </span><span class='pt18'>&</span><span>Region, </span><span class='pt23'>s</span><span class='pt25'>:</span><span> </span><span class='pt18'>&</span><span class='pt21'>str</span><span>) </span><span class='pt25'>-></span><span> </span><span class='pt8 it'>String</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='67'></td><td><span> </span><span class='pt21'>let</span><span> </span><span class='pt21'>mut</span><span> reg_str </span><span class='pt18'>=</span><span> </span><span class='pt8 it'>String</span><span class='pt18'>::</span><span class='pt22'>new</span><span>()</span><span class='pt25'>;</span></td></tr>
<tr><td class='ln' data-ln='68'></td><td><span> </span><span class='pt21'>let</span><span> </span><span class='pt21'>mut</span><span> last_was_escape </span><span class='pt18'>=</span><span> </span><span class='pt23'>false</span><span class='pt25'>;</span></td></tr>
<tr><td class='ln' data-ln='69'></td><td> </td></tr>
<tr><td class='ln' data-ln='70'></td><td><span> </span><span class='pt21'>for</span><span> c </span><span class='pt18'>in</span><span> </span><span class='pt8 it'>self</span><span>.regex_str.</span><span class='pt22'>chars</span><span>() {</span></td></tr>
<tr><td class='ln' data-ln='71'></td><td><span> </span><span class='pt21'>if</span><span> last_was_escape </span><span class='pt18'>&&</span><span> c.</span><span class='pt22'>is_digit</span><span>(</span><span class='pt23'>10</span><span>) {</span></td></tr>
<tr><td class='ln' data-ln='72'></td><td><span> </span><span class='pt21'>let</span><span> val </span><span class='pt18'>=</span><span> c.</span><span class='pt22'>to_digit</span><span>(</span><span class='pt23'>10</span><span>).</span><span class='pt22'>unwrap</span><span>()</span><span class='pt25'>;</span></td></tr>
<tr><td class='ln' data-ln='73'></td><td> </td></tr>
<tr><td class='ln' data-ln='74'></td><td><span> </span><span class='pt21'>if</span><span> </span><span class='pt21'>let</span><span> </span><span class='pt23'>Some</span><span>((start, end)) </span><span class='pt18'>=</span><span> region.</span><span class='pt22'>pos</span><span>(val </span><span class='pt18'>as</span><span> </span><span class='pt21'>usize</span><span>) {</span></td></tr>
<tr><td class='ln' data-ln='75'></td><td><span> </span><span class='pt21'>let</span><span> escaped </span><span class='pt18'>=</span><span> </span><span class='pt22'>escape</span><span>(</span><span class='pt18'>&</span><span>s[start</span><span class='pt18'>..</span><span>end])</span><span class='pt25'>;</span></td></tr>
<tr><td class='ln' data-ln='76'></td><td><span> reg_str.</span><span class='pt22'>push_str</span><span>(</span><span class='pt18'>&</span><span>escaped)</span><span class='pt25'>;</span></td></tr>
<tr><td class='ln' data-ln='77'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='78'></td><td><span> } </span><span class='pt21'>else</span><span> </span><span class='pt21'>if</span><span> last_was_escape {</span></td></tr>
<tr><td class='ln' data-ln='79'></td><td><span> reg_str.</span><span class='pt22'>push</span><span>(</span><span class='pt13'>'</span><span class='pt11'>\\</span><span class='pt13'>'</span><span>)</span><span class='pt25'>;</span></td></tr>
<tr><td class='ln' data-ln='80'></td><td><span> reg_str.</span><span class='pt22'>push</span><span>(c)</span><span class='pt25'>;</span></td></tr>
<tr><td class='ln' data-ln='81'></td><td><span> } </span><span class='pt21'>else</span><span> </span><span class='pt21'>if</span><span> c </span><span class='pt18'>!=</span><span> </span><span class='pt13'>'</span><span class='pt11'>\\</span><span class='pt13'>'</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='82'></td><td><span> reg_str.</span><span class='pt22'>push</span><span>(c)</span><span class='pt25'>;</span></td></tr>
<tr><td class='ln' data-ln='83'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='84'></td><td> </td></tr>
<tr><td class='ln' data-ln='85'></td><td><span> last_was_escape </span><span class='pt18'>=</span><span> c </span><span class='pt18'>==</span><span> </span><span class='pt13'>'</span><span class='pt11'>\\</span><span class='pt13'>'</span><span> </span><span class='pt18'>&&</span><span> </span><span class='pt18'>!</span><span>last_was_escape</span><span class='pt25'>;</span></td></tr>
<tr><td class='ln' data-ln='86'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='87'></td><td><span> reg_str</span></td></tr>
<tr><td class='ln' data-ln='88'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='89'></td><td> </td></tr>
<tr><td class='ln' data-ln='90'></td><td><span> </span><span class='pt10 it'>/// Makes sure the regex is compiled if it doesn't have captures.</span></td></tr>
<tr><td class='ln' data-ln='91'></td><td><span> </span><span class='pt10 it'>/// May compile the regex if it isn't, panicing if compilation fails.</span></td></tr>
<tr><td class='ln' data-ln='92'></td><td><span> #[inline]</span></td></tr>
<tr><td class='ln' data-ln='93'></td><td><span> </span><span class='pt21'>pub</span><span> </span><span class='pt21'>fn</span><span> </span><span class='pt22'>ensure_compiled_if_possible</span><span>(</span><span class='pt18'>&</span><span class='pt21'>mut</span><span> </span><span class='pt8 it'>self</span><span>) {</span></td></tr>
<tr><td class='ln' data-ln='94'></td><td><span> </span><span class='pt21'>if</span><span> </span><span class='pt8 it'>self</span><span>.regex.</span><span class='pt22'>is_none</span><span>() </span><span class='pt18'>&&</span><span> </span><span class='pt18'>!</span><span class='pt8 it'>self</span><span>.has_captures {</span></td></tr>
<tr><td class='ln' data-ln='95'></td><td><span> </span><span class='pt8 it'>self</span><span>.</span><span class='pt22'>compile_regex</span><span>()</span><span class='pt25'>;</span></td></tr>
<tr><td class='ln' data-ln='96'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='97'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='98'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='99'></td><td> </td></tr>
<tr><td class='ln' data-ln='100'></td><td><span class='pt10 it'>/// This wrapper only exists so that I can implement a serialization</span></td></tr>
<tr><td class='ln' data-ln='101'></td><td><span class='pt10 it'>/// trait that crashes if you try and serialize this.</span></td></tr>
<tr><td class='ln' data-ln='102'></td><td><span>#[</span><span class='pt22'>derive</span><span>(</span><span class='pt8 it'>Debug</span><span>)]</span></td></tr>
<tr><td class='ln' data-ln='103'></td><td><span class='pt21'>pub</span><span> </span><span class='pt21'>struct</span><span> </span><span class='pt9'>LinkerLink</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='104'></td><td><span> </span><span class='pt21'>pub</span><span> link</span><span class='pt25'>:</span><span> Weak<RefCell<Context>>,</span></td></tr>
<tr><td class='ln' data-ln='105'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='106'></td><td> </td></tr>
<tr><td class='ln' data-ln='107'></td><td><span class='pt21'>impl</span><span> </span><span class='pt8 it'>Eq</span><span> </span><span class='pt21'>for</span><span> </span><span class='pt9'>LinkerLink</span><span> {}</span></td></tr>
<tr><td class='ln' data-ln='108'></td><td> </td></tr>
<tr><td class='ln' data-ln='109'></td><td><span class='pt21'>impl</span><span> </span><span class='pt8 it'>PartialEq</span><span> </span><span class='pt21'>for</span><span> </span><span class='pt9'>LinkerLink</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='110'></td><td><span> </span><span class='pt21'>fn</span><span> </span><span class='pt22'>eq</span><span>(</span><span class='pt18'>&</span><span class='pt8 it'>self</span><span>, </span><span class='pt23'>other</span><span class='pt25'>:</span><span> </span><span class='pt18'>&</span><span>LinkerLink) </span><span class='pt25'>-></span><span> </span><span class='pt21'>bool</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='111'></td><td><span> </span><span class='pt8 it'>self</span><span>.link.</span><span class='pt22'>upgrade</span><span>() </span><span class='pt18'>==</span><span> other.link.</span><span class='pt22'>upgrade</span><span>()</span></td></tr>
<tr><td class='ln' data-ln='112'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='113'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='114'></td><td> </td></tr>
<tr><td class='ln' data-ln='115'></td><td><span class='pt10 it'>/// Just panics, we can't do anything with linked up syntaxes</span></td></tr>
<tr><td class='ln' data-ln='116'></td><td><span class='pt21'>impl</span><span> Serialize </span><span class='pt21'>for</span><span> </span><span class='pt9'>LinkerLink</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='117'></td><td><span> </span><span class='pt21'>fn</span><span> </span><span class='pt22'>serialize</span><span><S>(</span><span class='pt18'>&</span><span class='pt8 it'>self</span><span>, </span><span class='pt18'>_</span><span>: S) </span><span class='pt25'>-></span><span> </span><span class='pt8 it'>Result</span><span><</span><span class='pt21'>S::</span><span class='pt23'>Ok</span><span class='pt25'>,</span><span> </span><span class='pt21'>S::</span><span>Error> </span><span class='pt21'>where</span><span> S</span><span class='pt25'>:</span><span> Serializer {</span></td></tr>
<tr><td class='ln' data-ln='118'></td><td><span> </span><span class='pt17'>panic!</span><span>(</span><span class='pt13'>"Can't serialize syntax definitions which have been linked"</span><span>)</span><span class='pt25'>;</span></td></tr>
<tr><td class='ln' data-ln='119'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='120'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='121'></td><td> </td></tr>
<tr><td class='ln' data-ln='122'></td><td><span class='pt10 it'>/// Just panics, we can't do anything with linked up syntaxes</span></td></tr>
<tr><td class='ln' data-ln='123'></td><td><span class='pt21'>impl</span><span><</span><span class='pt21'>'de</span><span>> Deserialize<</span><span class='pt21'>'de</span><span>> </span><span class='pt21'>for</span><span> </span><span class='pt9'>LinkerLink</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='124'></td><td><span> </span><span class='pt21'>fn</span><span> </span><span class='pt22'>deserialize</span><span><D>(</span><span class='pt18'>_</span><span>: D) </span><span class='pt25'>-></span><span> </span><span class='pt8 it'>Result</span><span><</span><span class='pt21'>Self</span><span class='pt25'>,</span><span> </span><span class='pt21'>D::</span><span>Error> </span><span class='pt21'>where</span><span> D</span><span class='pt25'>:</span><span> Deserializer<'de> {</span></td></tr>
<tr><td class='ln' data-ln='125'></td><td><span> </span><span class='pt17'>panic!</span><span>(</span><span class='pt13'>"No linked syntax should ever have gotten serialized"</span><span>)</span><span class='pt25'>;</span></td></tr>
<tr><td class='ln' data-ln='126'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='127'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='128'></td><td> </td></tr>
<tr><td class='ln' data-ln='129'></td><td> </td></tr>
<tr><td class='ln' data-ln='130'></td><td><span class='pt10 it'>/// Serialize the provided map in natural key order, so that it's deterministic when dumping.</span></td></tr>
<tr><td class='ln' data-ln='131'></td><td><span class='pt21'>fn</span><span> </span><span class='pt22'>ordered_map</span><span><K</span><span class='pt25'>,</span><span> V</span><span class='pt25'>,</span><span> S>(</span><span class='pt23'>map</span><span class='pt25'>:</span><span> </span><span class='pt18'>&</span><span class='pt8 it'>HashMap</span><span><K</span><span class='pt25'>,</span><span> V>, </span><span class='pt23'>serializer</span><span class='pt25'>:</span><span> S) </span><span class='pt25'>-></span><span> </span><span class='pt8 it'>Result</span><span><</span><span class='pt21'>S::</span><span class='pt23'>Ok</span><span class='pt25'>,</span><span> </span><span class='pt21'>S::</span><span>Error></span></td></tr>
<tr><td class='ln' data-ln='132'></td><td><span> </span><span class='pt21'>where</span><span> S</span><span class='pt25'>:</span><span> Serializer, K</span><span class='pt25'>:</span><span> Eq + Hash + Ord + Serialize, V</span><span class='pt25'>:</span><span> Serialize</span></td></tr>
<tr><td class='ln' data-ln='133'></td><td><span>{</span></td></tr>
<tr><td class='ln' data-ln='134'></td><td><span> </span><span class='pt21'>let</span><span> ordered</span><span class='pt25'>:</span><span> BTreeMap<</span><span class='pt18'>_</span><span class='pt25'>,</span><span> </span><span class='pt18'>_</span><span>> </span><span class='pt18'>=</span><span> map.</span><span class='pt22'>iter</span><span>().</span><span class='pt22'>collect</span><span>()</span><span class='pt25'>;</span></td></tr>
<tr><td class='ln' data-ln='135'></td><td><span> ordered.</span><span class='pt22'>serialize</span><span>(serializer)</span></td></tr>
<tr><td class='ln' data-ln='136'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='137'></td><td> </td></tr>
<tr><td class='ln' data-ln='138'></td><td> </td></tr>
<tr><td class='ln' data-ln='139'></td><td><span>#[</span><span class='pt22'>cfg</span><span>(test)]</span></td></tr>
<tr><td class='ln' data-ln='140'></td><td><span class='pt21'>mod</span><span> </span><span class='pt9'>tests</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='141'></td><td><span> </span><span class='pt21'>use</span><span> </span><span class='pt21'>super</span><span class='pt18'>::*</span><span class='pt25'>;</span></td></tr>
<tr><td class='ln' data-ln='142'></td><td> </td></tr>
<tr><td class='ln' data-ln='143'></td><td><span> #[test]</span></td></tr>
<tr><td class='ln' data-ln='144'></td><td><span> </span><span class='pt21'>fn</span><span> </span><span class='pt22'>can_compile_refs</span><span>() {</span></td></tr>
<tr><td class='ln' data-ln='145'></td><td><span> </span><span class='pt21'>use</span><span> onig</span><span class='pt18'>::</span><span>{SearchOptions, Regex, Region}</span><span class='pt25'>;</span></td></tr>
<tr><td class='ln' data-ln='146'></td><td> </td></tr>
<tr><td class='ln' data-ln='147'></td><td><span> </span><span class='pt21'>let</span><span> pat </span><span class='pt18'>=</span><span> MatchPattern {</span></td></tr>
<tr><td class='ln' data-ln='148'></td><td><span> has_captures</span><span class='pt25'>:</span><span> </span><span class='pt23'>true</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='149'></td><td><span> regex_str</span><span class='pt25'>:</span><span> </span><span class='pt8 it'>String</span><span class='pt18'>::</span><span class='pt22'>from</span><span>(</span><span class='pt21'>r</span><span class='pt13'>"lol \\ \2 \1 '\9' \wz"</span><span>),</span></td></tr>
<tr><td class='ln' data-ln='150'></td><td><span> regex</span><span class='pt25'>:</span><span> </span><span class='pt23'>None</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='151'></td><td><span> scope</span><span class='pt25'>:</span><span> </span><span class='pt17'>vec!</span><span>[],</span></td></tr>
<tr><td class='ln' data-ln='152'></td><td><span> captures</span><span class='pt25'>:</span><span> </span><span class='pt23'>None</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='153'></td><td><span> operation</span><span class='pt25'>:</span><span> MatchOperation</span><span class='pt18'>::</span><span class='pt23'>None</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='154'></td><td><span> with_prototype</span><span class='pt25'>:</span><span> </span><span class='pt23'>None</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='155'></td><td><span> }</span><span class='pt25'>;</span></td></tr>
<tr><td class='ln' data-ln='156'></td><td> </td></tr>
<tr><td class='ln' data-ln='157'></td><td><span> </span><span class='pt21'>let</span><span> r </span><span class='pt18'>=</span><span> Regex</span><span class='pt18'>::</span><span class='pt22'>new</span><span>(</span><span class='pt21'>r</span><span class='pt13'>"(\\\[\]\(\))(b)(c)(d)(e)"</span><span>).</span><span class='pt22'>unwrap</span><span>()</span><span class='pt25'>;</span></td></tr>
<tr><td class='ln' data-ln='158'></td><td><span> </span><span class='pt21'>let</span><span> </span><span class='pt21'>mut</span><span> region </span><span class='pt18'>=</span><span> Region</span><span class='pt18'>::</span><span class='pt22'>new</span><span>()</span><span class='pt25'>;</span></td></tr>
<tr><td class='ln' data-ln='159'></td><td><span> </span><span class='pt21'>let</span><span> s </span><span class='pt18'>=</span><span> </span><span class='pt21'>r</span><span class='pt13'>"\[]()bcde"</span><span class='pt25'>;</span></td></tr>
<tr><td class='ln' data-ln='160'></td><td> </td></tr>
<tr><td class='ln' data-ln='161'></td><td><span> </span><span class='pt17'>assert!</span><span>(r.</span><span class='pt22'>match_with_options</span><span>(s, </span><span class='pt23'>0</span><span>, SearchOptions</span><span class='pt18'>::</span><span class='pt19'>SEARCH_OPTION_NONE</span><span>, </span><span class='pt23'>Some</span><span>(</span><span class='pt18'>&</span><span class='pt21'>mut</span><span> region)).</span><span class='pt22'>is_some</span><span>())</span><span class='pt25'>;</span></td></tr>
<tr><td class='ln' data-ln='162'></td><td> </td></tr>
<tr><td class='ln' data-ln='163'></td><td><span> </span><span class='pt21'>let</span><span> regex_res </span><span class='pt18'>=</span><span> pat.</span><span class='pt22'>regex_with_substitutes</span><span>(</span><span class='pt18'>&</span><span>region, s)</span><span class='pt25'>;</span></td></tr>
<tr><td class='ln' data-ln='164'></td><td><span> </span><span class='pt17'>assert_eq!</span><span>(regex_res, </span><span class='pt21'>r</span><span class='pt13'>"lol \\ b \\\[\]\(\) '' \wz"</span><span>)</span><span class='pt25'>;</span></td></tr>
<tr><td class='ln' data-ln='165'></td><td><span> pat.</span><span class='pt22'>compile_with_refs</span><span>(</span><span class='pt18'>&</span><span>region, s)</span><span class='pt25'>;</span></td></tr>
<tr><td class='ln' data-ln='166'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='167'></td><td><span>}</span></td></tr>
</table>
</div>
</div>
</div>
<div class='style' id='P--ayu_light--rs'>
<div class='P--ayu_light-bordered'>
<div class="info header">
<span class="left">syntax_definition.rs</span>
<span class="right"><span>167 lines</span><span>5.55 KB</span></span>
</div>
<div class='P--ayu_light'>
<table>
<tr><td class='ln' data-ln='1'></td><td><span class='pt21'>use</span><span> std</span><span class='pt23'>::</span><span>collections</span><span class='pt23'>::</span><span>{BTreeMap, HashMap}</span><span class='pt26'>;</span></td></tr>
<tr><td class='ln' data-ln='2'></td><td><span class='pt21'>use</span><span> std</span><span class='pt23'>::</span><span>hash</span><span class='pt23'>::</span><span>Hash</span><span class='pt26'>;</span></td></tr>
<tr><td class='ln' data-ln='3'></td><td><span class='pt21'>use</span><span> onig</span><span class='pt23'>::</span><span>{Regex, RegexOptions, Region, Syntax}</span><span class='pt26'>;</span></td></tr>
<tr><td class='ln' data-ln='4'></td><td><span class='pt21'>use</span><span> std</span><span class='pt23'>::</span><span>rc</span><span class='pt23'>::</span><span>{Rc, Weak}</span><span class='pt26'>;</span></td></tr>
<tr><td class='ln' data-ln='5'></td><td><span class='pt21'>use</span><span> std</span><span class='pt23'>::</span><span>cell</span><span class='pt23'>::</span><span>RefCell</span><span class='pt26'>;</span></td></tr>
<tr><td class='ln' data-ln='6'></td><td><span class='pt21'>use</span><span> </span><span class='pt21'>super</span><span class='pt23'>::</span><span>scope</span><span class='pt23'>::</span><span class='pt17'>*</span><span class='pt26'>;</span></td></tr>
<tr><td class='ln' data-ln='7'></td><td><span class='pt21'>use</span><span> regex_syntax</span><span class='pt23'>::</span><span>escape</span><span class='pt26'>;</span></td></tr>
<tr><td class='ln' data-ln='8'></td><td class='hi'><span class='pt21'>use</span><span> serde</span><span class='pt23'>::</span><span>{Deserialize, Deserializer, Serialize, Serializer}</span><span class='pt26'>;</span></td></tr>
<tr><td class='ln' data-ln='9'></td><td> </td></tr>
<tr><td class='ln' data-ln='10'></td><td><span class='pt12 it'>/// The main data structure representing a syntax definition loaded from a</span></td></tr>
<tr><td class='ln' data-ln='11'></td><td><span class='pt12 it'>/// `.sublime-syntax` file. You'll probably only need these as references</span></td></tr>
<tr><td class='ln' data-ln='12'></td><td><span class='pt12 it'>/// to be passed around to parsing code.</span></td></tr>
<tr><td class='ln' data-ln='13'></td><td><span class='pt12 it'>///</span></td></tr>
<tr><td class='ln' data-ln='14'></td><td><span class='pt12 it'>/// Some useful public fields are the `name` field which is a human readable</span></td></tr>
<tr><td class='ln' data-ln='15'></td><td><span class='pt12 it'>/// name to display in syntax lists, and the `hidden` field which means hide</span></td></tr>
<tr><td class='ln' data-ln='16'></td><td><span class='pt12 it'>/// this syntax from any lists because it is for internal use.</span></td></tr>
<tr><td class='ln' data-ln='17'></td><td><span>#[</span><span class='pt19'>derive</span><span>(</span><span class='pt9 it'>Clone</span><span>, </span><span class='pt9 it'>Debug</span><span>, </span><span class='pt9 it'>Eq</span><span>, </span><span class='pt9 it'>PartialEq</span><span>, Serialize, Deserialize)]</span></td></tr>
<tr><td class='ln' data-ln='18'></td><td><span class='pt21'>pub</span><span> </span><span class='pt21'>struct</span><span> </span><span class='pt7'>SyntaxDefinition</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='19'></td><td class='hi'><span> </span><span class='pt21'>pub</span><span> name</span><span class='pt26'>:</span><span> </span><span class='pt9 it'>String</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='20'></td><td class='hi'><span> </span><span class='pt21'>pub</span><span> file_extensions</span><span class='pt26'>:</span><span> </span><span class='pt9 it'>Vec</span><span><</span><span class='pt9 it'>String</span><span>>,</span></td></tr>
<tr><td class='ln' data-ln='21'></td><td class='hi'><span> </span><span class='pt21'>pub</span><span> scope</span><span class='pt26'>:</span><span> Scope,</span></td></tr>
<tr><td class='ln' data-ln='22'></td><td class='hi'><span> </span><span class='pt21'>pub</span><span> first_line_match</span><span class='pt26'>:</span><span> </span><span class='pt9 it'>Option</span><span><</span><span class='pt9 it'>String</span><span>>,</span></td></tr>
<tr><td class='ln' data-ln='23'></td><td class='hi'><span> </span><span class='pt21'>pub</span><span> hidden</span><span class='pt26'>:</span><span> </span><span class='pt21'>bool</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='24'></td><td><span> </span><span class='pt12 it'>/// Filled in at link time to avoid serializing it multiple times</span></td></tr>
<tr><td class='ln' data-ln='25'></td><td><span> #[</span><span class='pt19'>serde</span><span>(skip_serializing, skip_deserializing)]</span></td></tr>
<tr><td class='ln' data-ln='26'></td><td><span> </span><span class='pt21'>pub</span><span> prototype</span><span class='pt26'>:</span><span> </span><span class='pt9 it'>Option</span><span><ContextPtr>,</span></td></tr>
<tr><td class='ln' data-ln='27'></td><td><span> #[</span><span class='pt19'>serde</span><span>(serialize_with </span><span class='pt17'>=</span><span> </span><span class='pt10'>"ordered_map"</span><span>)]</span></td></tr>
<tr><td class='ln' data-ln='28'></td><td><span> </span><span class='pt21'>pub</span><span> variables</span><span class='pt26'>:</span><span> </span><span class='pt9 it'>HashMap</span><span><</span><span class='pt9 it'>String</span><span class='pt26'>,</span><span> </span><span class='pt9 it'>String</span><span>>,</span></td></tr>
<tr><td class='ln' data-ln='29'></td><td><span> #[</span><span class='pt19'>serde</span><span>(serialize_with </span><span class='pt17'>=</span><span> </span><span class='pt10'>"ordered_map"</span><span>)]</span></td></tr>
<tr><td class='ln' data-ln='30'></td><td><span> </span><span class='pt21'>pub</span><span> contexts</span><span class='pt26'>:</span><span> </span><span class='pt9 it'>HashMap</span><span><</span><span class='pt9 it'>String</span><span class='pt26'>,</span><span> ContextPtr>,</span></td></tr>
<tr><td class='ln' data-ln='31'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='32'></td><td> </td></tr>
<tr><td class='ln' data-ln='33'></td><td><span class='pt21'>impl</span><span> </span><span class='pt7'>Context</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='34'></td><td><span> </span><span class='pt12 it'>/// Returns the match pattern at an index, panics if the thing isn't a match pattern</span></td></tr>
<tr><td class='ln' data-ln='35'></td><td><span> </span><span class='pt21'>pub</span><span> </span><span class='pt21'>fn</span><span> </span><span class='pt19'>match_at</span><span>(</span><span class='pt17'>&</span><span class='pt9 it'>self</span><span>, </span><span class='pt11'>index</span><span class='pt26'>:</span><span> </span><span class='pt21'>usize</span><span>) </span><span class='pt26'>-></span><span> </span><span class='pt17'>&</span><span>MatchPattern {</span></td></tr>
<tr><td class='ln' data-ln='36'></td><td><span> </span><span class='pt21'>match</span><span> </span><span class='pt9 it'>self</span><span>.patterns[index] {</span></td></tr>
<tr><td class='ln' data-ln='37'></td><td><span> Pattern</span><span class='pt23'>::</span><span>Match(</span><span class='pt21'>ref</span><span> match_pat) </span><span class='pt17'>=></span><span> match_pat,</span></td></tr>
<tr><td class='ln' data-ln='38'></td><td><span> _ </span><span class='pt17'>=></span><span> </span><span class='pt18'>panic!</span><span>(</span><span class='pt10'>"bad index to match_at"</span><span>),</span></td></tr>
<tr><td class='ln' data-ln='39'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='40'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='41'></td><td> </td></tr>
<tr><td class='ln' data-ln='42'></td><td><span> </span><span class='pt12 it'>/// Returns a mutable reference, otherwise like `match_at`</span></td></tr>
<tr><td class='ln' data-ln='43'></td><td><span> </span><span class='pt21'>pub</span><span> </span><span class='pt21'>fn</span><span> </span><span class='pt19'>match_at_mut</span><span>(</span><span class='pt17'>&</span><span class='pt21'>mut</span><span> </span><span class='pt9 it'>self</span><span>, </span><span class='pt11'>index</span><span class='pt26'>:</span><span> </span><span class='pt21'>usize</span><span>) </span><span class='pt26'>-></span><span> </span><span class='pt17'>&</span><span class='pt21'>mut</span><span> MatchPattern {</span></td></tr>
<tr><td class='ln' data-ln='44'></td><td><span> </span><span class='pt21'>match</span><span> </span><span class='pt9 it'>self</span><span>.patterns[index] {</span></td></tr>
<tr><td class='ln' data-ln='45'></td><td><span> Pattern</span><span class='pt23'>::</span><span>Match(</span><span class='pt21'>ref</span><span> </span><span class='pt21'>mut</span><span> match_pat) </span><span class='pt17'>=></span><span> match_pat,</span></td></tr>
<tr><td class='ln' data-ln='46'></td><td><span> _ </span><span class='pt17'>=></span><span> </span><span class='pt18'>panic!</span><span>(</span><span class='pt10'>"bad index to match_at"</span><span>),</span></td></tr>
<tr><td class='ln' data-ln='47'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='48'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='49'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='50'></td><td> </td></tr>
<tr><td class='ln' data-ln='51'></td><td><span class='pt21'>impl</span><span> </span><span class='pt7'>ContextReference</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='52'></td><td><span> </span><span class='pt12 it'>/// find the pointed to context, panics if ref is not linked</span></td></tr>
<tr><td class='ln' data-ln='53'></td><td><span> </span><span class='pt21'>pub</span><span> </span><span class='pt21'>fn</span><span> </span><span class='pt19'>resolve</span><span>(</span><span class='pt17'>&</span><span class='pt9 it'>self</span><span>) </span><span class='pt26'>-></span><span> ContextPtr {</span></td></tr>
<tr><td class='ln' data-ln='54'></td><td><span> </span><span class='pt21'>match</span><span> </span><span class='pt17'>*</span><span class='pt9 it'>self</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='55'></td><td><span> ContextReference</span><span class='pt23'>::</span><span>Inline(</span><span class='pt21'>ref</span><span> ptr) </span><span class='pt17'>=></span><span> ptr.</span><span class='pt19'>clone</span><span>(),</span></td></tr>
<tr><td class='ln' data-ln='56'></td><td><span> ContextReference</span><span class='pt23'>::</span><span>Direct(</span><span class='pt21'>ref</span><span> ptr) </span><span class='pt17'>=></span><span> ptr.link.</span><span class='pt19'>upgrade</span><span>().</span><span class='pt19'>unwrap</span><span>(),</span></td></tr>
<tr><td class='ln' data-ln='57'></td><td><span> _ </span><span class='pt17'>=></span><span> </span><span class='pt18'>panic!</span><span>(</span><span class='pt10'>"Can only call resolve on linked references: </span><span class='pt22'>{:?}</span><span class='pt10'>"</span><span>, </span><span class='pt9 it'>self</span><span>),</span></td></tr>
<tr><td class='ln' data-ln='58'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='59'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='60'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='61'></td><td> </td></tr>
<tr><td class='ln' data-ln='62'></td><td><span class='pt21'>impl</span><span> </span><span class='pt7'>MatchPattern</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='63'></td><td><span> </span><span class='pt12 it'>/// substitutes back-refs in Regex with regions from s</span></td></tr>
<tr><td class='ln' data-ln='64'></td><td><span> </span><span class='pt12 it'>/// used for match patterns which refer to captures from the pattern</span></td></tr>
<tr><td class='ln' data-ln='65'></td><td><span> </span><span class='pt12 it'>/// that pushed them.</span></td></tr>
<tr><td class='ln' data-ln='66'></td><td><span> </span><span class='pt21'>pub</span><span> </span><span class='pt21'>fn</span><span> </span><span class='pt19'>regex_with_substitutes</span><span>(</span><span class='pt17'>&</span><span class='pt9 it'>self</span><span>, </span><span class='pt11'>region</span><span class='pt26'>:</span><span> </span><span class='pt17'>&</span><span>Region, </span><span class='pt11'>s</span><span class='pt26'>:</span><span> </span><span class='pt17'>&</span><span class='pt21'>str</span><span>) </span><span class='pt26'>-></span><span> </span><span class='pt9 it'>String</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='67'></td><td><span> </span><span class='pt21'>let</span><span> </span><span class='pt21'>mut</span><span> reg_str </span><span class='pt17'>=</span><span> </span><span class='pt9 it'>String</span><span class='pt23'>::</span><span class='pt19'>new</span><span>()</span><span class='pt26'>;</span></td></tr>
<tr><td class='ln' data-ln='68'></td><td><span> </span><span class='pt21'>let</span><span> </span><span class='pt21'>mut</span><span> last_was_escape </span><span class='pt17'>=</span><span> </span><span class='pt22'>false</span><span class='pt26'>;</span></td></tr>
<tr><td class='ln' data-ln='69'></td><td> </td></tr>
<tr><td class='ln' data-ln='70'></td><td><span> </span><span class='pt21'>for</span><span> c </span><span class='pt17'>in</span><span> </span><span class='pt9 it'>self</span><span>.regex_str.</span><span class='pt19'>chars</span><span>() {</span></td></tr>
<tr><td class='ln' data-ln='71'></td><td><span> </span><span class='pt21'>if</span><span> last_was_escape </span><span class='pt17'>&&</span><span> c.</span><span class='pt19'>is_digit</span><span>(</span><span class='pt22'>10</span><span>) {</span></td></tr>
<tr><td class='ln' data-ln='72'></td><td><span> </span><span class='pt21'>let</span><span> val </span><span class='pt17'>=</span><span> c.</span><span class='pt19'>to_digit</span><span>(</span><span class='pt22'>10</span><span>).</span><span class='pt19'>unwrap</span><span>()</span><span class='pt26'>;</span></td></tr>
<tr><td class='ln' data-ln='73'></td><td> </td></tr>
<tr><td class='ln' data-ln='74'></td><td><span> </span><span class='pt21'>if</span><span> </span><span class='pt21'>let</span><span> </span><span class='pt17 it'>Some</span><span>((start, end)) </span><span class='pt17'>=</span><span> region.</span><span class='pt19'>pos</span><span>(val </span><span class='pt17'>as</span><span> </span><span class='pt21'>usize</span><span>) {</span></td></tr>
<tr><td class='ln' data-ln='75'></td><td><span> </span><span class='pt21'>let</span><span> escaped </span><span class='pt17'>=</span><span> </span><span class='pt19'>escape</span><span>(</span><span class='pt17'>&</span><span>s[start</span><span class='pt17'>..</span><span>end])</span><span class='pt26'>;</span></td></tr>
<tr><td class='ln' data-ln='76'></td><td><span> reg_str.</span><span class='pt19'>push_str</span><span>(</span><span class='pt17'>&</span><span>escaped)</span><span class='pt26'>;</span></td></tr>
<tr><td class='ln' data-ln='77'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='78'></td><td><span> } </span><span class='pt21'>else</span><span> </span><span class='pt21'>if</span><span> last_was_escape {</span></td></tr>
<tr><td class='ln' data-ln='79'></td><td><span> reg_str.</span><span class='pt19'>push</span><span>(</span><span class='pt10'>'</span><span class='pt8'>\\</span><span class='pt10'>'</span><span>)</span><span class='pt26'>;</span></td></tr>
<tr><td class='ln' data-ln='80'></td><td><span> reg_str.</span><span class='pt19'>push</span><span>(c)</span><span class='pt26'>;</span></td></tr>
<tr><td class='ln' data-ln='81'></td><td><span> } </span><span class='pt21'>else</span><span> </span><span class='pt21'>if</span><span> c </span><span class='pt17'>!=</span><span> </span><span class='pt10'>'</span><span class='pt8'>\\</span><span class='pt10'>'</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='82'></td><td><span> reg_str.</span><span class='pt19'>push</span><span>(c)</span><span class='pt26'>;</span></td></tr>
<tr><td class='ln' data-ln='83'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='84'></td><td> </td></tr>
<tr><td class='ln' data-ln='85'></td><td><span> last_was_escape </span><span class='pt17'>=</span><span> c </span><span class='pt17'>==</span><span> </span><span class='pt10'>'</span><span class='pt8'>\\</span><span class='pt10'>'</span><span> </span><span class='pt17'>&&</span><span> </span><span class='pt17'>!</span><span>last_was_escape</span><span class='pt26'>;</span></td></tr>
<tr><td class='ln' data-ln='86'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='87'></td><td><span> reg_str</span></td></tr>
<tr><td class='ln' data-ln='88'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='89'></td><td> </td></tr>
<tr><td class='ln' data-ln='90'></td><td><span> </span><span class='pt12 it'>/// Makes sure the regex is compiled if it doesn't have captures.</span></td></tr>
<tr><td class='ln' data-ln='91'></td><td><span> </span><span class='pt12 it'>/// May compile the regex if it isn't, panicing if compilation fails.</span></td></tr>
<tr><td class='ln' data-ln='92'></td><td><span> #[inline]</span></td></tr>
<tr><td class='ln' data-ln='93'></td><td><span> </span><span class='pt21'>pub</span><span> </span><span class='pt21'>fn</span><span> </span><span class='pt19'>ensure_compiled_if_possible</span><span>(</span><span class='pt17'>&</span><span class='pt21'>mut</span><span> </span><span class='pt9 it'>self</span><span>) {</span></td></tr>
<tr><td class='ln' data-ln='94'></td><td><span> </span><span class='pt21'>if</span><span> </span><span class='pt9 it'>self</span><span>.regex.</span><span class='pt19'>is_none</span><span>() </span><span class='pt17'>&&</span><span> </span><span class='pt17'>!</span><span class='pt9 it'>self</span><span>.has_captures {</span></td></tr>
<tr><td class='ln' data-ln='95'></td><td><span> </span><span class='pt9 it'>self</span><span>.</span><span class='pt19'>compile_regex</span><span>()</span><span class='pt26'>;</span></td></tr>
<tr><td class='ln' data-ln='96'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='97'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='98'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='99'></td><td> </td></tr>
<tr><td class='ln' data-ln='100'></td><td><span class='pt12 it'>/// This wrapper only exists so that I can implement a serialization</span></td></tr>
<tr><td class='ln' data-ln='101'></td><td><span class='pt12 it'>/// trait that crashes if you try and serialize this.</span></td></tr>
<tr><td class='ln' data-ln='102'></td><td><span>#[</span><span class='pt19'>derive</span><span>(</span><span class='pt9 it'>Debug</span><span>)]</span></td></tr>
<tr><td class='ln' data-ln='103'></td><td><span class='pt21'>pub</span><span> </span><span class='pt21'>struct</span><span> </span><span class='pt7'>LinkerLink</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='104'></td><td><span> </span><span class='pt21'>pub</span><span> link</span><span class='pt26'>:</span><span> Weak<RefCell<Context>>,</span></td></tr>
<tr><td class='ln' data-ln='105'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='106'></td><td> </td></tr>
<tr><td class='ln' data-ln='107'></td><td><span class='pt21'>impl</span><span> </span><span class='pt9 it'>Eq</span><span> </span><span class='pt21'>for</span><span> </span><span class='pt7'>LinkerLink</span><span> {}</span></td></tr>
<tr><td class='ln' data-ln='108'></td><td> </td></tr>
<tr><td class='ln' data-ln='109'></td><td><span class='pt21'>impl</span><span> </span><span class='pt9 it'>PartialEq</span><span> </span><span class='pt21'>for</span><span> </span><span class='pt7'>LinkerLink</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='110'></td><td><span> </span><span class='pt21'>fn</span><span> </span><span class='pt19'>eq</span><span>(</span><span class='pt17'>&</span><span class='pt9 it'>self</span><span>, </span><span class='pt11'>other</span><span class='pt26'>:</span><span> </span><span class='pt17'>&</span><span>LinkerLink) </span><span class='pt26'>-></span><span> </span><span class='pt21'>bool</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='111'></td><td><span> </span><span class='pt9 it'>self</span><span>.link.</span><span class='pt19'>upgrade</span><span>() </span><span class='pt17'>==</span><span> other.link.</span><span class='pt19'>upgrade</span><span>()</span></td></tr>
<tr><td class='ln' data-ln='112'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='113'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='114'></td><td> </td></tr>
<tr><td class='ln' data-ln='115'></td><td><span class='pt12 it'>/// Just panics, we can't do anything with linked up syntaxes</span></td></tr>
<tr><td class='ln' data-ln='116'></td><td><span class='pt21'>impl</span><span> Serialize </span><span class='pt21'>for</span><span> </span><span class='pt7'>LinkerLink</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='117'></td><td><span> </span><span class='pt21'>fn</span><span> </span><span class='pt19'>serialize</span><span><S>(</span><span class='pt17'>&</span><span class='pt9 it'>self</span><span>, </span><span class='pt17'>_</span><span>: S) </span><span class='pt26'>-></span><span> </span><span class='pt9 it'>Result</span><span><</span><span class='pt21'>S::</span><span class='pt17 it'>Ok</span><span class='pt26'>,</span><span> </span><span class='pt21'>S::</span><span>Error> </span><span class='pt21'>where</span><span> S</span><span class='pt26'>:</span><span> Serializer {</span></td></tr>
<tr><td class='ln' data-ln='118'></td><td><span> </span><span class='pt18'>panic!</span><span>(</span><span class='pt10'>"Can't serialize syntax definitions which have been linked"</span><span>)</span><span class='pt26'>;</span></td></tr>
<tr><td class='ln' data-ln='119'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='120'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='121'></td><td> </td></tr>
<tr><td class='ln' data-ln='122'></td><td><span class='pt12 it'>/// Just panics, we can't do anything with linked up syntaxes</span></td></tr>
<tr><td class='ln' data-ln='123'></td><td><span class='pt21'>impl</span><span><</span><span class='pt21'>'de</span><span>> Deserialize<</span><span class='pt21'>'de</span><span>> </span><span class='pt21'>for</span><span> </span><span class='pt7'>LinkerLink</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='124'></td><td><span> </span><span class='pt21'>fn</span><span> </span><span class='pt19'>deserialize</span><span><D>(</span><span class='pt17'>_</span><span>: D) </span><span class='pt26'>-></span><span> </span><span class='pt9 it'>Result</span><span><</span><span class='pt21'>Self</span><span class='pt26'>,</span><span> </span><span class='pt21'>D::</span><span>Error> </span><span class='pt21'>where</span><span> D</span><span class='pt26'>:</span><span> Deserializer<'de> {</span></td></tr>
<tr><td class='ln' data-ln='125'></td><td><span> </span><span class='pt18'>panic!</span><span>(</span><span class='pt10'>"No linked syntax should ever have gotten serialized"</span><span>)</span><span class='pt26'>;</span></td></tr>
<tr><td class='ln' data-ln='126'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='127'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='128'></td><td> </td></tr>
<tr><td class='ln' data-ln='129'></td><td> </td></tr>
<tr><td class='ln' data-ln='130'></td><td><span class='pt12 it'>/// Serialize the provided map in natural key order, so that it's deterministic when dumping.</span></td></tr>
<tr><td class='ln' data-ln='131'></td><td><span class='pt21'>fn</span><span> </span><span class='pt19'>ordered_map</span><span><K</span><span class='pt26'>,</span><span> V</span><span class='pt26'>,</span><span> S>(</span><span class='pt11'>map</span><span class='pt26'>:</span><span> </span><span class='pt17'>&</span><span class='pt9 it'>HashMap</span><span><K</span><span class='pt26'>,</span><span> V>, </span><span class='pt11'>serializer</span><span class='pt26'>:</span><span> S) </span><span class='pt26'>-></span><span> </span><span class='pt9 it'>Result</span><span><</span><span class='pt21'>S::</span><span class='pt17 it'>Ok</span><span class='pt26'>,</span><span> </span><span class='pt21'>S::</span><span>Error></span></td></tr>
<tr><td class='ln' data-ln='132'></td><td><span> </span><span class='pt21'>where</span><span> S</span><span class='pt26'>:</span><span> Serializer, K</span><span class='pt26'>:</span><span> Eq + Hash + Ord + Serialize, V</span><span class='pt26'>:</span><span> Serialize</span></td></tr>
<tr><td class='ln' data-ln='133'></td><td><span>{</span></td></tr>
<tr><td class='ln' data-ln='134'></td><td><span> </span><span class='pt21'>let</span><span> ordered</span><span class='pt26'>:</span><span> BTreeMap<</span><span class='pt17'>_</span><span class='pt26'>,</span><span> </span><span class='pt17'>_</span><span>> </span><span class='pt17'>=</span><span> map.</span><span class='pt19'>iter</span><span>().</span><span class='pt19'>collect</span><span>()</span><span class='pt26'>;</span></td></tr>
<tr><td class='ln' data-ln='135'></td><td><span> ordered.</span><span class='pt19'>serialize</span><span>(serializer)</span></td></tr>
<tr><td class='ln' data-ln='136'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='137'></td><td> </td></tr>
<tr><td class='ln' data-ln='138'></td><td> </td></tr>
<tr><td class='ln' data-ln='139'></td><td><span>#[</span><span class='pt19'>cfg</span><span>(test)]</span></td></tr>
<tr><td class='ln' data-ln='140'></td><td><span class='pt21'>mod</span><span> </span><span class='pt7'>tests</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='141'></td><td><span> </span><span class='pt21'>use</span><span> </span><span class='pt21'>super</span><span class='pt23'>::</span><span class='pt17'>*</span><span class='pt26'>;</span></td></tr>
<tr><td class='ln' data-ln='142'></td><td> </td></tr>
<tr><td class='ln' data-ln='143'></td><td><span> #[test]</span></td></tr>
<tr><td class='ln' data-ln='144'></td><td><span> </span><span class='pt21'>fn</span><span> </span><span class='pt19'>can_compile_refs</span><span>() {</span></td></tr>
<tr><td class='ln' data-ln='145'></td><td><span> </span><span class='pt21'>use</span><span> onig</span><span class='pt23'>::</span><span>{SearchOptions, Regex, Region}</span><span class='pt26'>;</span></td></tr>
<tr><td class='ln' data-ln='146'></td><td> </td></tr>
<tr><td class='ln' data-ln='147'></td><td><span> </span><span class='pt21'>let</span><span> pat </span><span class='pt17'>=</span><span> MatchPattern {</span></td></tr>
<tr><td class='ln' data-ln='148'></td><td><span> has_captures</span><span class='pt26'>:</span><span> </span><span class='pt22'>true</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='149'></td><td><span> regex_str</span><span class='pt26'>:</span><span> </span><span class='pt9 it'>String</span><span class='pt23'>::</span><span class='pt19'>from</span><span>(</span><span class='pt21'>r</span><span class='pt10'>"lol \\ \2 \1 '\9' \wz"</span><span>),</span></td></tr>
<tr><td class='ln' data-ln='150'></td><td><span> regex</span><span class='pt26'>:</span><span> </span><span class='pt17 it'>None</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='151'></td><td><span> scope</span><span class='pt26'>:</span><span> </span><span class='pt18'>vec!</span><span>[],</span></td></tr>
<tr><td class='ln' data-ln='152'></td><td><span> captures</span><span class='pt26'>:</span><span> </span><span class='pt17 it'>None</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='153'></td><td><span> operation</span><span class='pt26'>:</span><span> MatchOperation</span><span class='pt23'>::</span><span class='pt17 it'>None</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='154'></td><td><span> with_prototype</span><span class='pt26'>:</span><span> </span><span class='pt17 it'>None</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='155'></td><td><span> }</span><span class='pt26'>;</span></td></tr>
<tr><td class='ln' data-ln='156'></td><td> </td></tr>
<tr><td class='ln' data-ln='157'></td><td><span> </span><span class='pt21'>let</span><span> r </span><span class='pt17'>=</span><span> Regex</span><span class='pt23'>::</span><span class='pt19'>new</span><span>(</span><span class='pt21'>r</span><span class='pt10'>"(\\\[\]\(\))(b)(c)(d)(e)"</span><span>).</span><span class='pt19'>unwrap</span><span>()</span><span class='pt26'>;</span></td></tr>
<tr><td class='ln' data-ln='158'></td><td><span> </span><span class='pt21'>let</span><span> </span><span class='pt21'>mut</span><span> region </span><span class='pt17'>=</span><span> Region</span><span class='pt23'>::</span><span class='pt19'>new</span><span>()</span><span class='pt26'>;</span></td></tr>
<tr><td class='ln' data-ln='159'></td><td><span> </span><span class='pt21'>let</span><span> s </span><span class='pt17'>=</span><span> </span><span class='pt21'>r</span><span class='pt10'>"\[]()bcde"</span><span class='pt26'>;</span></td></tr>
<tr><td class='ln' data-ln='160'></td><td> </td></tr>
<tr><td class='ln' data-ln='161'></td><td><span> </span><span class='pt18'>assert!</span><span>(r.</span><span class='pt19'>match_with_options</span><span>(s, </span><span class='pt22'>0</span><span>, SearchOptions</span><span class='pt23'>::</span><span class='pt22'>SEARCH_OPTION_NONE</span><span>, </span><span class='pt17 it'>Some</span><span>(</span><span class='pt17'>&</span><span class='pt21'>mut</span><span> region)).</span><span class='pt19'>is_some</span><span>())</span><span class='pt26'>;</span></td></tr>
<tr><td class='ln' data-ln='162'></td><td> </td></tr>
<tr><td class='ln' data-ln='163'></td><td><span> </span><span class='pt21'>let</span><span> regex_res </span><span class='pt17'>=</span><span> pat.</span><span class='pt19'>regex_with_substitutes</span><span>(</span><span class='pt17'>&</span><span>region, s)</span><span class='pt26'>;</span></td></tr>
<tr><td class='ln' data-ln='164'></td><td><span> </span><span class='pt18'>assert_eq!</span><span>(regex_res, </span><span class='pt21'>r</span><span class='pt10'>"lol \\ b \\\[\]\(\) '' \wz"</span><span>)</span><span class='pt26'>;</span></td></tr>
<tr><td class='ln' data-ln='165'></td><td><span> pat.</span><span class='pt19'>compile_with_refs</span><span>(</span><span class='pt17'>&</span><span>region, s)</span><span class='pt26'>;</span></td></tr>
<tr><td class='ln' data-ln='166'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='167'></td><td><span>}</span></td></tr>
</table>
</div>
</div>
</div>
<div class='style' id='P--ayu_mirage--rs'>
<div class='P--ayu_mirage-bordered'>
<div class="info header">
<span class="left">syntax_definition.rs</span>
<span class="right"><span>167 lines</span><span>5.55 KB</span></span>
</div>
<div class='P--ayu_mirage'>
<table>
<tr><td class='ln' data-ln='1'></td><td><span class='pt19'>use</span><span> std</span><span class='pt17'>::</span><span>collections</span><span class='pt17'>::</span><span>{BTreeMap, HashMap}</span><span class='pt24'>;</span></td></tr>
<tr><td class='ln' data-ln='2'></td><td><span class='pt19'>use</span><span> std</span><span class='pt17'>::</span><span>hash</span><span class='pt17'>::</span><span>Hash</span><span class='pt24'>;</span></td></tr>
<tr><td class='ln' data-ln='3'></td><td><span class='pt19'>use</span><span> onig</span><span class='pt17'>::</span><span>{Regex, RegexOptions, Region, Syntax}</span><span class='pt24'>;</span></td></tr>
<tr><td class='ln' data-ln='4'></td><td><span class='pt19'>use</span><span> std</span><span class='pt17'>::</span><span>rc</span><span class='pt17'>::</span><span>{Rc, Weak}</span><span class='pt24'>;</span></td></tr>
<tr><td class='ln' data-ln='5'></td><td><span class='pt19'>use</span><span> std</span><span class='pt17'>::</span><span>cell</span><span class='pt17'>::</span><span>RefCell</span><span class='pt24'>;</span></td></tr>
<tr><td class='ln' data-ln='6'></td><td><span class='pt19'>use</span><span> </span><span class='pt19'>super</span><span class='pt17'>::</span><span>scope</span><span class='pt17'>::*</span><span class='pt24'>;</span></td></tr>
<tr><td class='ln' data-ln='7'></td><td><span class='pt19'>use</span><span> regex_syntax</span><span class='pt17'>::</span><span>escape</span><span class='pt24'>;</span></td></tr>
<tr><td class='ln' data-ln='8'></td><td class='hi'><span class='pt19'>use</span><span> serde</span><span class='pt17'>::</span><span>{Deserialize, Deserializer, Serialize, Serializer}</span><span class='pt24'>;</span></td></tr>
<tr><td class='ln' data-ln='9'></td><td> </td></tr>
<tr><td class='ln' data-ln='10'></td><td><span class='pt8 it'>/// The main data structure representing a syntax definition loaded from a</span></td></tr>
<tr><td class='ln' data-ln='11'></td><td><span class='pt8 it'>/// `.sublime-syntax` file. You'll probably only need these as references</span></td></tr>
<tr><td class='ln' data-ln='12'></td><td><span class='pt8 it'>/// to be passed around to parsing code.</span></td></tr>
<tr><td class='ln' data-ln='13'></td><td><span class='pt8 it'>///</span></td></tr>
<tr><td class='ln' data-ln='14'></td><td><span class='pt8 it'>/// Some useful public fields are the `name` field which is a human readable</span></td></tr>
<tr><td class='ln' data-ln='15'></td><td><span class='pt8 it'>/// name to display in syntax lists, and the `hidden` field which means hide</span></td></tr>
<tr><td class='ln' data-ln='16'></td><td><span class='pt8 it'>/// this syntax from any lists because it is for internal use.</span></td></tr>
<tr><td class='ln' data-ln='17'></td><td><span>#[</span><span class='pt22'>derive</span><span>(</span><span class='pt9 it'>Clone</span><span>, </span><span class='pt9 it'>Debug</span><span>, </span><span class='pt9 it'>Eq</span><span>, </span><span class='pt9 it'>PartialEq</span><span>, Serialize, Deserialize)]</span></td></tr>
<tr><td class='ln' data-ln='18'></td><td><span class='pt19'>pub</span><span> </span><span class='pt19'>struct</span><span> </span><span class='pt10'>SyntaxDefinition</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='19'></td><td class='hi'><span> </span><span class='pt19'>pub</span><span> name</span><span class='pt24'>:</span><span> </span><span class='pt9 it'>String</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='20'></td><td class='hi'><span> </span><span class='pt19'>pub</span><span> file_extensions</span><span class='pt24'>:</span><span> </span><span class='pt9 it'>Vec</span><span><</span><span class='pt9 it'>String</span><span>>,</span></td></tr>
<tr><td class='ln' data-ln='21'></td><td class='hi'><span> </span><span class='pt19'>pub</span><span> scope</span><span class='pt24'>:</span><span> Scope,</span></td></tr>
<tr><td class='ln' data-ln='22'></td><td class='hi'><span> </span><span class='pt19'>pub</span><span> first_line_match</span><span class='pt24'>:</span><span> </span><span class='pt9 it'>Option</span><span><</span><span class='pt9 it'>String</span><span>>,</span></td></tr>
<tr><td class='ln' data-ln='23'></td><td class='hi'><span> </span><span class='pt19'>pub</span><span> hidden</span><span class='pt24'>:</span><span> </span><span class='pt19'>bool</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='24'></td><td><span> </span><span class='pt8 it'>/// Filled in at link time to avoid serializing it multiple times</span></td></tr>
<tr><td class='ln' data-ln='25'></td><td><span> #[</span><span class='pt22'>serde</span><span>(skip_serializing, skip_deserializing)]</span></td></tr>
<tr><td class='ln' data-ln='26'></td><td><span> </span><span class='pt19'>pub</span><span> prototype</span><span class='pt24'>:</span><span> </span><span class='pt9 it'>Option</span><span><ContextPtr>,</span></td></tr>
<tr><td class='ln' data-ln='27'></td><td><span> #[</span><span class='pt22'>serde</span><span>(serialize_with </span><span class='pt17'>=</span><span> </span><span class='pt12'>"ordered_map"</span><span>)]</span></td></tr>
<tr><td class='ln' data-ln='28'></td><td><span> </span><span class='pt19'>pub</span><span> variables</span><span class='pt24'>:</span><span> </span><span class='pt9 it'>HashMap</span><span><</span><span class='pt9 it'>String</span><span class='pt24'>,</span><span> </span><span class='pt9 it'>String</span><span>>,</span></td></tr>
<tr><td class='ln' data-ln='29'></td><td><span> #[</span><span class='pt22'>serde</span><span>(serialize_with </span><span class='pt17'>=</span><span> </span><span class='pt12'>"ordered_map"</span><span>)]</span></td></tr>
<tr><td class='ln' data-ln='30'></td><td><span> </span><span class='pt19'>pub</span><span> contexts</span><span class='pt24'>:</span><span> </span><span class='pt9 it'>HashMap</span><span><</span><span class='pt9 it'>String</span><span class='pt24'>,</span><span> ContextPtr>,</span></td></tr>
<tr><td class='ln' data-ln='31'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='32'></td><td> </td></tr>
<tr><td class='ln' data-ln='33'></td><td><span class='pt19'>impl</span><span> </span><span class='pt10'>Context</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='34'></td><td><span> </span><span class='pt8 it'>/// Returns the match pattern at an index, panics if the thing isn't a match pattern</span></td></tr>
<tr><td class='ln' data-ln='35'></td><td><span> </span><span class='pt19'>pub</span><span> </span><span class='pt19'>fn</span><span> </span><span class='pt22'>match_at</span><span>(</span><span class='pt17'>&</span><span class='pt9 it'>self</span><span>, </span><span class='pt14'>index</span><span class='pt24'>:</span><span> </span><span class='pt19'>usize</span><span>) </span><span class='pt24'>-></span><span> </span><span class='pt17'>&</span><span>MatchPattern {</span></td></tr>
<tr><td class='ln' data-ln='36'></td><td><span> </span><span class='pt19'>match</span><span> </span><span class='pt9 it'>self</span><span>.patterns[index] {</span></td></tr>
<tr><td class='ln' data-ln='37'></td><td><span> Pattern</span><span class='pt17'>::</span><span>Match(</span><span class='pt19'>ref</span><span> match_pat) </span><span class='pt17'>=></span><span> match_pat,</span></td></tr>
<tr><td class='ln' data-ln='38'></td><td><span> _ </span><span class='pt17'>=></span><span> </span><span class='pt16'>panic!</span><span>(</span><span class='pt12'>"bad index to match_at"</span><span>),</span></td></tr>
<tr><td class='ln' data-ln='39'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='40'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='41'></td><td> </td></tr>
<tr><td class='ln' data-ln='42'></td><td><span> </span><span class='pt8 it'>/// Returns a mutable reference, otherwise like `match_at`</span></td></tr>
<tr><td class='ln' data-ln='43'></td><td><span> </span><span class='pt19'>pub</span><span> </span><span class='pt19'>fn</span><span> </span><span class='pt22'>match_at_mut</span><span>(</span><span class='pt17'>&</span><span class='pt19'>mut</span><span> </span><span class='pt9 it'>self</span><span>, </span><span class='pt14'>index</span><span class='pt24'>:</span><span> </span><span class='pt19'>usize</span><span>) </span><span class='pt24'>-></span><span> </span><span class='pt17'>&</span><span class='pt19'>mut</span><span> MatchPattern {</span></td></tr>
<tr><td class='ln' data-ln='44'></td><td><span> </span><span class='pt19'>match</span><span> </span><span class='pt9 it'>self</span><span>.patterns[index] {</span></td></tr>
<tr><td class='ln' data-ln='45'></td><td><span> Pattern</span><span class='pt17'>::</span><span>Match(</span><span class='pt19'>ref</span><span> </span><span class='pt19'>mut</span><span> match_pat) </span><span class='pt17'>=></span><span> match_pat,</span></td></tr>
<tr><td class='ln' data-ln='46'></td><td><span> _ </span><span class='pt17'>=></span><span> </span><span class='pt16'>panic!</span><span>(</span><span class='pt12'>"bad index to match_at"</span><span>),</span></td></tr>
<tr><td class='ln' data-ln='47'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='48'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='49'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='50'></td><td> </td></tr>
<tr><td class='ln' data-ln='51'></td><td><span class='pt19'>impl</span><span> </span><span class='pt10'>ContextReference</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='52'></td><td><span> </span><span class='pt8 it'>/// find the pointed to context, panics if ref is not linked</span></td></tr>
<tr><td class='ln' data-ln='53'></td><td><span> </span><span class='pt19'>pub</span><span> </span><span class='pt19'>fn</span><span> </span><span class='pt22'>resolve</span><span>(</span><span class='pt17'>&</span><span class='pt9 it'>self</span><span>) </span><span class='pt24'>-></span><span> ContextPtr {</span></td></tr>
<tr><td class='ln' data-ln='54'></td><td><span> </span><span class='pt19'>match</span><span> </span><span class='pt17'>*</span><span class='pt9 it'>self</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='55'></td><td><span> ContextReference</span><span class='pt17'>::</span><span>Inline(</span><span class='pt19'>ref</span><span> ptr) </span><span class='pt17'>=></span><span> ptr.</span><span class='pt22'>clone</span><span>(),</span></td></tr>
<tr><td class='ln' data-ln='56'></td><td><span> ContextReference</span><span class='pt17'>::</span><span>Direct(</span><span class='pt19'>ref</span><span> ptr) </span><span class='pt17'>=></span><span> ptr.link.</span><span class='pt22'>upgrade</span><span>().</span><span class='pt22'>unwrap</span><span>(),</span></td></tr>
<tr><td class='ln' data-ln='57'></td><td><span> _ </span><span class='pt17'>=></span><span> </span><span class='pt16'>panic!</span><span>(</span><span class='pt12'>"Can only call resolve on linked references: </span><span class='pt21'>{:?}</span><span class='pt12'>"</span><span>, </span><span class='pt9 it'>self</span><span>),</span></td></tr>
<tr><td class='ln' data-ln='58'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='59'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='60'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='61'></td><td> </td></tr>
<tr><td class='ln' data-ln='62'></td><td><span class='pt19'>impl</span><span> </span><span class='pt10'>MatchPattern</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='63'></td><td><span> </span><span class='pt8 it'>/// substitutes back-refs in Regex with regions from s</span></td></tr>
<tr><td class='ln' data-ln='64'></td><td><span> </span><span class='pt8 it'>/// used for match patterns which refer to captures from the pattern</span></td></tr>
<tr><td class='ln' data-ln='65'></td><td><span> </span><span class='pt8 it'>/// that pushed them.</span></td></tr>
<tr><td class='ln' data-ln='66'></td><td><span> </span><span class='pt19'>pub</span><span> </span><span class='pt19'>fn</span><span> </span><span class='pt22'>regex_with_substitutes</span><span>(</span><span class='pt17'>&</span><span class='pt9 it'>self</span><span>, </span><span class='pt14'>region</span><span class='pt24'>:</span><span> </span><span class='pt17'>&</span><span>Region, </span><span class='pt14'>s</span><span class='pt24'>:</span><span> </span><span class='pt17'>&</span><span class='pt19'>str</span><span>) </span><span class='pt24'>-></span><span> </span><span class='pt9 it'>String</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='67'></td><td><span> </span><span class='pt19'>let</span><span> </span><span class='pt19'>mut</span><span> reg_str </span><span class='pt17'>=</span><span> </span><span class='pt9 it'>String</span><span class='pt17'>::</span><span class='pt22'>new</span><span>()</span><span class='pt24'>;</span></td></tr>
<tr><td class='ln' data-ln='68'></td><td><span> </span><span class='pt19'>let</span><span> </span><span class='pt19'>mut</span><span> last_was_escape </span><span class='pt17'>=</span><span> </span><span class='pt14'>false</span><span class='pt24'>;</span></td></tr>
<tr><td class='ln' data-ln='69'></td><td> </td></tr>
<tr><td class='ln' data-ln='70'></td><td><span> </span><span class='pt19'>for</span><span> c </span><span class='pt17'>in</span><span> </span><span class='pt9 it'>self</span><span>.regex_str.</span><span class='pt22'>chars</span><span>() {</span></td></tr>
<tr><td class='ln' data-ln='71'></td><td><span> </span><span class='pt19'>if</span><span> last_was_escape </span><span class='pt17'>&&</span><span> c.</span><span class='pt22'>is_digit</span><span>(</span><span class='pt14'>10</span><span>) {</span></td></tr>
<tr><td class='ln' data-ln='72'></td><td><span> </span><span class='pt19'>let</span><span> val </span><span class='pt17'>=</span><span> c.</span><span class='pt22'>to_digit</span><span>(</span><span class='pt14'>10</span><span>).</span><span class='pt22'>unwrap</span><span>()</span><span class='pt24'>;</span></td></tr>
<tr><td class='ln' data-ln='73'></td><td> </td></tr>
<tr><td class='ln' data-ln='74'></td><td><span> </span><span class='pt19'>if</span><span> </span><span class='pt19'>let</span><span> </span><span class='pt14'>Some</span><span>((start, end)) </span><span class='pt17'>=</span><span> region.</span><span class='pt22'>pos</span><span>(val </span><span class='pt17'>as</span><span> </span><span class='pt19'>usize</span><span>) {</span></td></tr>
<tr><td class='ln' data-ln='75'></td><td><span> </span><span class='pt19'>let</span><span> escaped </span><span class='pt17'>=</span><span> </span><span class='pt22'>escape</span><span>(</span><span class='pt17'>&</span><span>s[start</span><span class='pt17'>..</span><span>end])</span><span class='pt24'>;</span></td></tr>
<tr><td class='ln' data-ln='76'></td><td><span> reg_str.</span><span class='pt22'>push_str</span><span>(</span><span class='pt17'>&</span><span>escaped)</span><span class='pt24'>;</span></td></tr>
<tr><td class='ln' data-ln='77'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='78'></td><td><span> } </span><span class='pt19'>else</span><span> </span><span class='pt19'>if</span><span> last_was_escape {</span></td></tr>
<tr><td class='ln' data-ln='79'></td><td><span> reg_str.</span><span class='pt22'>push</span><span>(</span><span class='pt12'>'</span><span class='pt11'>\\</span><span class='pt12'>'</span><span>)</span><span class='pt24'>;</span></td></tr>
<tr><td class='ln' data-ln='80'></td><td><span> reg_str.</span><span class='pt22'>push</span><span>(c)</span><span class='pt24'>;</span></td></tr>
<tr><td class='ln' data-ln='81'></td><td><span> } </span><span class='pt19'>else</span><span> </span><span class='pt19'>if</span><span> c </span><span class='pt17'>!=</span><span> </span><span class='pt12'>'</span><span class='pt11'>\\</span><span class='pt12'>'</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='82'></td><td><span> reg_str.</span><span class='pt22'>push</span><span>(c)</span><span class='pt24'>;</span></td></tr>
<tr><td class='ln' data-ln='83'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='84'></td><td> </td></tr>
<tr><td class='ln' data-ln='85'></td><td><span> last_was_escape </span><span class='pt17'>=</span><span> c </span><span class='pt17'>==</span><span> </span><span class='pt12'>'</span><span class='pt11'>\\</span><span class='pt12'>'</span><span> </span><span class='pt17'>&&</span><span> </span><span class='pt17'>!</span><span>last_was_escape</span><span class='pt24'>;</span></td></tr>
<tr><td class='ln' data-ln='86'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='87'></td><td><span> reg_str</span></td></tr>
<tr><td class='ln' data-ln='88'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='89'></td><td> </td></tr>
<tr><td class='ln' data-ln='90'></td><td><span> </span><span class='pt8 it'>/// Makes sure the regex is compiled if it doesn't have captures.</span></td></tr>
<tr><td class='ln' data-ln='91'></td><td><span> </span><span class='pt8 it'>/// May compile the regex if it isn't, panicing if compilation fails.</span></td></tr>
<tr><td class='ln' data-ln='92'></td><td><span> #[inline]</span></td></tr>
<tr><td class='ln' data-ln='93'></td><td><span> </span><span class='pt19'>pub</span><span> </span><span class='pt19'>fn</span><span> </span><span class='pt22'>ensure_compiled_if_possible</span><span>(</span><span class='pt17'>&</span><span class='pt19'>mut</span><span> </span><span class='pt9 it'>self</span><span>) {</span></td></tr>
<tr><td class='ln' data-ln='94'></td><td><span> </span><span class='pt19'>if</span><span> </span><span class='pt9 it'>self</span><span>.regex.</span><span class='pt22'>is_none</span><span>() </span><span class='pt17'>&&</span><span> </span><span class='pt17'>!</span><span class='pt9 it'>self</span><span>.has_captures {</span></td></tr>
<tr><td class='ln' data-ln='95'></td><td><span> </span><span class='pt9 it'>self</span><span>.</span><span class='pt22'>compile_regex</span><span>()</span><span class='pt24'>;</span></td></tr>
<tr><td class='ln' data-ln='96'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='97'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='98'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='99'></td><td> </td></tr>
<tr><td class='ln' data-ln='100'></td><td><span class='pt8 it'>/// This wrapper only exists so that I can implement a serialization</span></td></tr>
<tr><td class='ln' data-ln='101'></td><td><span class='pt8 it'>/// trait that crashes if you try and serialize this.</span></td></tr>
<tr><td class='ln' data-ln='102'></td><td><span>#[</span><span class='pt22'>derive</span><span>(</span><span class='pt9 it'>Debug</span><span>)]</span></td></tr>
<tr><td class='ln' data-ln='103'></td><td><span class='pt19'>pub</span><span> </span><span class='pt19'>struct</span><span> </span><span class='pt10'>LinkerLink</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='104'></td><td><span> </span><span class='pt19'>pub</span><span> link</span><span class='pt24'>:</span><span> Weak<RefCell<Context>>,</span></td></tr>
<tr><td class='ln' data-ln='105'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='106'></td><td> </td></tr>
<tr><td class='ln' data-ln='107'></td><td><span class='pt19'>impl</span><span> </span><span class='pt9 it'>Eq</span><span> </span><span class='pt19'>for</span><span> </span><span class='pt10'>LinkerLink</span><span> {}</span></td></tr>
<tr><td class='ln' data-ln='108'></td><td> </td></tr>
<tr><td class='ln' data-ln='109'></td><td><span class='pt19'>impl</span><span> </span><span class='pt9 it'>PartialEq</span><span> </span><span class='pt19'>for</span><span> </span><span class='pt10'>LinkerLink</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='110'></td><td><span> </span><span class='pt19'>fn</span><span> </span><span class='pt22'>eq</span><span>(</span><span class='pt17'>&</span><span class='pt9 it'>self</span><span>, </span><span class='pt14'>other</span><span class='pt24'>:</span><span> </span><span class='pt17'>&</span><span>LinkerLink) </span><span class='pt24'>-></span><span> </span><span class='pt19'>bool</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='111'></td><td><span> </span><span class='pt9 it'>self</span><span>.link.</span><span class='pt22'>upgrade</span><span>() </span><span class='pt17'>==</span><span> other.link.</span><span class='pt22'>upgrade</span><span>()</span></td></tr>
<tr><td class='ln' data-ln='112'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='113'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='114'></td><td> </td></tr>
<tr><td class='ln' data-ln='115'></td><td><span class='pt8 it'>/// Just panics, we can't do anything with linked up syntaxes</span></td></tr>
<tr><td class='ln' data-ln='116'></td><td><span class='pt19'>impl</span><span> Serialize </span><span class='pt19'>for</span><span> </span><span class='pt10'>LinkerLink</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='117'></td><td><span> </span><span class='pt19'>fn</span><span> </span><span class='pt22'>serialize</span><span><S>(</span><span class='pt17'>&</span><span class='pt9 it'>self</span><span>, </span><span class='pt17'>_</span><span>: S) </span><span class='pt24'>-></span><span> </span><span class='pt9 it'>Result</span><span><</span><span class='pt19'>S::</span><span class='pt14'>Ok</span><span class='pt24'>,</span><span> </span><span class='pt19'>S::</span><span>Error> </span><span class='pt19'>where</span><span> S</span><span class='pt24'>:</span><span> Serializer {</span></td></tr>
<tr><td class='ln' data-ln='118'></td><td><span> </span><span class='pt16'>panic!</span><span>(</span><span class='pt12'>"Can't serialize syntax definitions which have been linked"</span><span>)</span><span class='pt24'>;</span></td></tr>
<tr><td class='ln' data-ln='119'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='120'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='121'></td><td> </td></tr>
<tr><td class='ln' data-ln='122'></td><td><span class='pt8 it'>/// Just panics, we can't do anything with linked up syntaxes</span></td></tr>
<tr><td class='ln' data-ln='123'></td><td><span class='pt19'>impl</span><span><</span><span class='pt19'>'de</span><span>> Deserialize<</span><span class='pt19'>'de</span><span>> </span><span class='pt19'>for</span><span> </span><span class='pt10'>LinkerLink</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='124'></td><td><span> </span><span class='pt19'>fn</span><span> </span><span class='pt22'>deserialize</span><span><D>(</span><span class='pt17'>_</span><span>: D) </span><span class='pt24'>-></span><span> </span><span class='pt9 it'>Result</span><span><</span><span class='pt19'>Self</span><span class='pt24'>,</span><span> </span><span class='pt19'>D::</span><span>Error> </span><span class='pt19'>where</span><span> D</span><span class='pt24'>:</span><span> Deserializer<'de> {</span></td></tr>
<tr><td class='ln' data-ln='125'></td><td><span> </span><span class='pt16'>panic!</span><span>(</span><span class='pt12'>"No linked syntax should ever have gotten serialized"</span><span>)</span><span class='pt24'>;</span></td></tr>
<tr><td class='ln' data-ln='126'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='127'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='128'></td><td> </td></tr>
<tr><td class='ln' data-ln='129'></td><td> </td></tr>
<tr><td class='ln' data-ln='130'></td><td><span class='pt8 it'>/// Serialize the provided map in natural key order, so that it's deterministic when dumping.</span></td></tr>
<tr><td class='ln' data-ln='131'></td><td><span class='pt19'>fn</span><span> </span><span class='pt22'>ordered_map</span><span><K</span><span class='pt24'>,</span><span> V</span><span class='pt24'>,</span><span> S>(</span><span class='pt14'>map</span><span class='pt24'>:</span><span> </span><span class='pt17'>&</span><span class='pt9 it'>HashMap</span><span><K</span><span class='pt24'>,</span><span> V>, </span><span class='pt14'>serializer</span><span class='pt24'>:</span><span> S) </span><span class='pt24'>-></span><span> </span><span class='pt9 it'>Result</span><span><</span><span class='pt19'>S::</span><span class='pt14'>Ok</span><span class='pt24'>,</span><span> </span><span class='pt19'>S::</span><span>Error></span></td></tr>
<tr><td class='ln' data-ln='132'></td><td><span> </span><span class='pt19'>where</span><span> S</span><span class='pt24'>:</span><span> Serializer, K</span><span class='pt24'>:</span><span> Eq + Hash + Ord + Serialize, V</span><span class='pt24'>:</span><span> Serialize</span></td></tr>
<tr><td class='ln' data-ln='133'></td><td><span>{</span></td></tr>
<tr><td class='ln' data-ln='134'></td><td><span> </span><span class='pt19'>let</span><span> ordered</span><span class='pt24'>:</span><span> BTreeMap<</span><span class='pt17'>_</span><span class='pt24'>,</span><span> </span><span class='pt17'>_</span><span>> </span><span class='pt17'>=</span><span> map.</span><span class='pt22'>iter</span><span>().</span><span class='pt22'>collect</span><span>()</span><span class='pt24'>;</span></td></tr>
<tr><td class='ln' data-ln='135'></td><td><span> ordered.</span><span class='pt22'>serialize</span><span>(serializer)</span></td></tr>
<tr><td class='ln' data-ln='136'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='137'></td><td> </td></tr>
<tr><td class='ln' data-ln='138'></td><td> </td></tr>
<tr><td class='ln' data-ln='139'></td><td><span>#[</span><span class='pt22'>cfg</span><span>(test)]</span></td></tr>
<tr><td class='ln' data-ln='140'></td><td><span class='pt19'>mod</span><span> </span><span class='pt10'>tests</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='141'></td><td><span> </span><span class='pt19'>use</span><span> </span><span class='pt19'>super</span><span class='pt17'>::*</span><span class='pt24'>;</span></td></tr>
<tr><td class='ln' data-ln='142'></td><td> </td></tr>
<tr><td class='ln' data-ln='143'></td><td><span> #[test]</span></td></tr>
<tr><td class='ln' data-ln='144'></td><td><span> </span><span class='pt19'>fn</span><span> </span><span class='pt22'>can_compile_refs</span><span>() {</span></td></tr>
<tr><td class='ln' data-ln='145'></td><td><span> </span><span class='pt19'>use</span><span> onig</span><span class='pt17'>::</span><span>{SearchOptions, Regex, Region}</span><span class='pt24'>;</span></td></tr>
<tr><td class='ln' data-ln='146'></td><td> </td></tr>
<tr><td class='ln' data-ln='147'></td><td><span> </span><span class='pt19'>let</span><span> pat </span><span class='pt17'>=</span><span> MatchPattern {</span></td></tr>
<tr><td class='ln' data-ln='148'></td><td><span> has_captures</span><span class='pt24'>:</span><span> </span><span class='pt14'>true</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='149'></td><td><span> regex_str</span><span class='pt24'>:</span><span> </span><span class='pt9 it'>String</span><span class='pt17'>::</span><span class='pt22'>from</span><span>(</span><span class='pt19'>r</span><span class='pt12'>"lol \\ \2 \1 '\9' \wz"</span><span>),</span></td></tr>
<tr><td class='ln' data-ln='150'></td><td><span> regex</span><span class='pt24'>:</span><span> </span><span class='pt14'>None</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='151'></td><td><span> scope</span><span class='pt24'>:</span><span> </span><span class='pt16'>vec!</span><span>[],</span></td></tr>
<tr><td class='ln' data-ln='152'></td><td><span> captures</span><span class='pt24'>:</span><span> </span><span class='pt14'>None</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='153'></td><td><span> operation</span><span class='pt24'>:</span><span> MatchOperation</span><span class='pt17'>::</span><span class='pt14'>None</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='154'></td><td><span> with_prototype</span><span class='pt24'>:</span><span> </span><span class='pt14'>None</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='155'></td><td><span> }</span><span class='pt24'>;</span></td></tr>
<tr><td class='ln' data-ln='156'></td><td> </td></tr>
<tr><td class='ln' data-ln='157'></td><td><span> </span><span class='pt19'>let</span><span> r </span><span class='pt17'>=</span><span> Regex</span><span class='pt17'>::</span><span class='pt22'>new</span><span>(</span><span class='pt19'>r</span><span class='pt12'>"(\\\[\]\(\))(b)(c)(d)(e)"</span><span>).</span><span class='pt22'>unwrap</span><span>()</span><span class='pt24'>;</span></td></tr>
<tr><td class='ln' data-ln='158'></td><td><span> </span><span class='pt19'>let</span><span> </span><span class='pt19'>mut</span><span> region </span><span class='pt17'>=</span><span> Region</span><span class='pt17'>::</span><span class='pt22'>new</span><span>()</span><span class='pt24'>;</span></td></tr>
<tr><td class='ln' data-ln='159'></td><td><span> </span><span class='pt19'>let</span><span> s </span><span class='pt17'>=</span><span> </span><span class='pt19'>r</span><span class='pt12'>"\[]()bcde"</span><span class='pt24'>;</span></td></tr>
<tr><td class='ln' data-ln='160'></td><td> </td></tr>
<tr><td class='ln' data-ln='161'></td><td><span> </span><span class='pt16'>assert!</span><span>(r.</span><span class='pt22'>match_with_options</span><span>(s, </span><span class='pt14'>0</span><span>, SearchOptions</span><span class='pt17'>::</span><span class='pt21'>SEARCH_OPTION_NONE</span><span>, </span><span class='pt14'>Some</span><span>(</span><span class='pt17'>&</span><span class='pt19'>mut</span><span> region)).</span><span class='pt22'>is_some</span><span>())</span><span class='pt24'>;</span></td></tr>
<tr><td class='ln' data-ln='162'></td><td> </td></tr>
<tr><td class='ln' data-ln='163'></td><td><span> </span><span class='pt19'>let</span><span> regex_res </span><span class='pt17'>=</span><span> pat.</span><span class='pt22'>regex_with_substitutes</span><span>(</span><span class='pt17'>&</span><span>region, s)</span><span class='pt24'>;</span></td></tr>
<tr><td class='ln' data-ln='164'></td><td><span> </span><span class='pt16'>assert_eq!</span><span>(regex_res, </span><span class='pt19'>r</span><span class='pt12'>"lol \\ b \\\[\]\(\) '' \wz"</span><span>)</span><span class='pt24'>;</span></td></tr>
<tr><td class='ln' data-ln='165'></td><td><span> pat.</span><span class='pt22'>compile_with_refs</span><span>(</span><span class='pt17'>&</span><span>region, s)</span><span class='pt24'>;</span></td></tr>
<tr><td class='ln' data-ln='166'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='167'></td><td><span>}</span></td></tr>
</table>
</div>
</div>
</div>
<div class='style' id='P--cobalt2--rs'>
<div class='P--cobalt2-bordered'>
<div class="info header">
<span class="left">syntax_definition.rs</span>
<span class="right"><span>167 lines</span><span>5.55 KB</span></span>
</div>
<div class='P--cobalt2'>
<table>
<tr><td class='ln' data-ln='1'></td><td><span class='pt56'>use</span><span> std</span><span class='pt56'>::</span><span>collections</span><span class='pt56'>::</span><span class='pt43'>{</span><span>BTreeMap, HashMap</span><span class='pt43'>};</span></td></tr>
<tr><td class='ln' data-ln='2'></td><td><span class='pt56'>use</span><span> std</span><span class='pt56'>::</span><span>hash</span><span class='pt56'>::</span><span>Hash</span><span class='pt43'>;</span></td></tr>
<tr><td class='ln' data-ln='3'></td><td><span class='pt56'>use</span><span> onig</span><span class='pt56'>::</span><span class='pt43'>{</span><span>Regex, RegexOptions, Region, Syntax</span><span class='pt43'>};</span></td></tr>
<tr><td class='ln' data-ln='4'></td><td><span class='pt56'>use</span><span> std</span><span class='pt56'>::</span><span>rc</span><span class='pt56'>::</span><span class='pt43'>{</span><span>Rc, Weak</span><span class='pt43'>};</span></td></tr>
<tr><td class='ln' data-ln='5'></td><td><span class='pt56'>use</span><span> std</span><span class='pt56'>::</span><span>cell</span><span class='pt56'>::</span><span>RefCell</span><span class='pt43'>;</span></td></tr>
<tr><td class='ln' data-ln='6'></td><td><span class='pt56'>use</span><span> </span><span class='pt56'>super::</span><span>scope</span><span class='pt56'>::*</span><span class='pt43'>;</span></td></tr>
<tr><td class='ln' data-ln='7'></td><td><span class='pt56'>use</span><span> regex_syntax</span><span class='pt56'>::</span><span>escape</span><span class='pt43'>;</span></td></tr>
<tr><td class='ln' data-ln='8'></td><td class='hi'><span class='pt56'>use</span><span> serde</span><span class='pt56'>::</span><span class='pt43'>{</span><span>Deserialize, Deserializer, Serialize, Serializer</span><span class='pt43'>};</span></td></tr>
<tr><td class='ln' data-ln='9'></td><td> </td></tr>
<tr><td class='ln' data-ln='10'></td><td><span class='pt19 it'>/// The main data structure representing a syntax definition loaded from a</span></td></tr>
<tr><td class='ln' data-ln='11'></td><td><span class='pt19 it'>/// `.sublime-syntax` file. You'll probably only need these as references</span></td></tr>
<tr><td class='ln' data-ln='12'></td><td><span class='pt19 it'>/// to be passed around to parsing code.</span></td></tr>
<tr><td class='ln' data-ln='13'></td><td><span class='pt19 it'>///</span></td></tr>
<tr><td class='ln' data-ln='14'></td><td><span class='pt19 it'>/// Some useful public fields are the `name` field which is a human readable</span></td></tr>
<tr><td class='ln' data-ln='15'></td><td><span class='pt19 it'>/// name to display in syntax lists, and the `hidden` field which means hide</span></td></tr>
<tr><td class='ln' data-ln='16'></td><td><span class='pt19 it'>/// this syntax from any lists because it is for internal use.</span></td></tr>
<tr><td class='ln' data-ln='17'></td><td><span>#[</span><span class='pt62'>derive</span><span class='pt43'>(</span><span class='pt29'>Clone</span><span>, </span><span class='pt29'>Debug</span><span>, </span><span class='pt29'>Eq</span><span>, </span><span class='pt29'>PartialEq</span><span>, Serialize, Deserialize</span><span class='pt43'>)</span><span>]</span></td></tr>
<tr><td class='ln' data-ln='18'></td><td><span class='pt60'>pub</span><span> </span><span class='pt60'>struct</span><span> </span><span class='pt60'>SyntaxDefinition</span><span> </span><span class='pt43'>{</span></td></tr>
<tr><td class='ln' data-ln='19'></td><td class='hi'><span> </span><span class='pt60'>pub</span><span> </span><span class='pt41 pt4'>name</span><span class='pt43'>:</span><span> </span><span class='pt29'>String</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='20'></td><td class='hi'><span> </span><span class='pt60'>pub</span><span> </span><span class='pt41 pt4'>file_extensions</span><span class='pt43'>:</span><span> </span><span class='pt29'>Vec</span><span class='pt43'><</span><span class='pt29'>String</span><span class='pt43'>></span><span>,</span></td></tr>
<tr><td class='ln' data-ln='21'></td><td class='hi'><span> </span><span class='pt60'>pub</span><span> </span><span class='pt41 pt4'>scope</span><span class='pt43'>:</span><span> Scope,</span></td></tr>
<tr><td class='ln' data-ln='22'></td><td class='hi'><span> </span><span class='pt60'>pub</span><span> </span><span class='pt41 pt4'>first_line_match</span><span class='pt43'>:</span><span> </span><span class='pt29'>Option</span><span class='pt43'><</span><span class='pt29'>String</span><span class='pt43'>></span><span>,</span></td></tr>
<tr><td class='ln' data-ln='23'></td><td class='hi'><span> </span><span class='pt60'>pub</span><span> </span><span class='pt41 pt4'>hidden</span><span class='pt43'>:</span><span> </span><span class='pt60'>bool</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='24'></td><td><span> </span><span class='pt19 it'>/// Filled in at link time to avoid serializing it multiple times</span></td></tr>
<tr><td class='ln' data-ln='25'></td><td><span> #[</span><span class='pt62'>serde</span><span class='pt43'>(</span><span>skip_serializing, skip_deserializing</span><span class='pt43'>)</span><span>]</span></td></tr>
<tr><td class='ln' data-ln='26'></td><td><span> </span><span class='pt60'>pub</span><span> </span><span class='pt41 pt4'>prototype</span><span class='pt43'>:</span><span> </span><span class='pt29'>Option</span><span class='pt43'><</span><span>ContextPtr</span><span class='pt43'>></span><span>,</span></td></tr>
<tr><td class='ln' data-ln='27'></td><td><span> #[</span><span class='pt62'>serde</span><span class='pt43'>(</span><span>serialize_with </span><span class='pt56'>=</span><span> </span><span class='pt23'>"ordered_map"</span><span class='pt43'>)</span><span>]</span></td></tr>
<tr><td class='ln' data-ln='28'></td><td><span> </span><span class='pt60'>pub</span><span> </span><span class='pt41 pt4'>variables</span><span class='pt43'>:</span><span> </span><span class='pt29'>HashMap</span><span class='pt43'><</span><span class='pt29'>String</span><span class='pt43'>,</span><span> </span><span class='pt29'>String</span><span class='pt43'>></span><span>,</span></td></tr>
<tr><td class='ln' data-ln='29'></td><td><span> #[</span><span class='pt62'>serde</span><span class='pt43'>(</span><span>serialize_with </span><span class='pt56'>=</span><span> </span><span class='pt23'>"ordered_map"</span><span class='pt43'>)</span><span>]</span></td></tr>
<tr><td class='ln' data-ln='30'></td><td><span> </span><span class='pt60'>pub</span><span> </span><span class='pt41 pt4'>contexts</span><span class='pt43'>:</span><span> </span><span class='pt29'>HashMap</span><span class='pt43'><</span><span class='pt29'>String</span><span class='pt43'>,</span><span> ContextPtr</span><span class='pt43'>></span><span>,</span></td></tr>
<tr><td class='ln' data-ln='31'></td><td><span class='pt43'>}</span></td></tr>
<tr><td class='ln' data-ln='32'></td><td> </td></tr>
<tr><td class='ln' data-ln='33'></td><td><span class='pt60'>impl</span><span> </span><span class='pt60'>Context</span><span> </span><span class='pt43'>{</span></td></tr>
<tr><td class='ln' data-ln='34'></td><td><span> </span><span class='pt19 it'>/// Returns the match pattern at an index, panics if the thing isn't a match pattern</span></td></tr>
<tr><td class='ln' data-ln='35'></td><td><span> </span><span class='pt60'>pub</span><span> </span><span class='pt60'>fn</span><span> </span><span class='pt62'>match_at</span><span class='pt43'>(</span><span class='pt56'>&</span><span class='pt55'>self</span><span>, </span><span class='pt41 pt4'>index</span><span class='pt43'>:</span><span> </span><span class='pt60'>usize</span><span class='pt43'>)</span><span> </span><span class='pt43'>-></span><span> </span><span class='pt56'>&</span><span>MatchPattern </span><span class='pt43'>{</span></td></tr>
<tr><td class='ln' data-ln='36'></td><td><span> </span><span class='pt56'>match</span><span> </span><span class='pt55'>self</span><span>.patterns</span><span class='pt43'>[</span><span>index</span><span class='pt43'>]</span><span> </span><span class='pt43'>{</span></td></tr>
<tr><td class='ln' data-ln='37'></td><td><span> Pattern</span><span class='pt56'>::</span><span>Match</span><span class='pt43'>(</span><span class='pt60'>ref</span><span> match_pat</span><span class='pt43'>)</span><span> </span><span class='pt56'>=></span><span> match_pat,</span></td></tr>
<tr><td class='ln' data-ln='38'></td><td><span> _ </span><span class='pt56'>=></span><span> </span><span class='pt29'>panic!</span><span class='pt43'>(</span><span class='pt23'>"bad index to match_at"</span><span class='pt43'>)</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='39'></td><td><span> </span><span class='pt43'>}</span></td></tr>
<tr><td class='ln' data-ln='40'></td><td><span> </span><span class='pt43'>}</span></td></tr>
<tr><td class='ln' data-ln='41'></td><td> </td></tr>
<tr><td class='ln' data-ln='42'></td><td><span> </span><span class='pt19 it'>/// Returns a mutable reference, otherwise like `match_at`</span></td></tr>
<tr><td class='ln' data-ln='43'></td><td><span> </span><span class='pt60'>pub</span><span> </span><span class='pt60'>fn</span><span> </span><span class='pt62'>match_at_mut</span><span class='pt43'>(</span><span class='pt56'>&</span><span class='pt60'>mut</span><span> </span><span class='pt55'>self</span><span>, </span><span class='pt41 pt4'>index</span><span class='pt43'>:</span><span> </span><span class='pt60'>usize</span><span class='pt43'>)</span><span> </span><span class='pt43'>-></span><span> </span><span class='pt56'>&</span><span class='pt60'>mut</span><span> MatchPattern </span><span class='pt43'>{</span></td></tr>
<tr><td class='ln' data-ln='44'></td><td><span> </span><span class='pt56'>match</span><span> </span><span class='pt55'>self</span><span>.patterns</span><span class='pt43'>[</span><span>index</span><span class='pt43'>]</span><span> </span><span class='pt43'>{</span></td></tr>
<tr><td class='ln' data-ln='45'></td><td><span> Pattern</span><span class='pt56'>::</span><span>Match</span><span class='pt43'>(</span><span class='pt60'>ref</span><span> </span><span class='pt60'>mut</span><span> match_pat</span><span class='pt43'>)</span><span> </span><span class='pt56'>=></span><span> match_pat,</span></td></tr>
<tr><td class='ln' data-ln='46'></td><td><span> _ </span><span class='pt56'>=></span><span> </span><span class='pt29'>panic!</span><span class='pt43'>(</span><span class='pt23'>"bad index to match_at"</span><span class='pt43'>)</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='47'></td><td><span> </span><span class='pt43'>}</span></td></tr>
<tr><td class='ln' data-ln='48'></td><td><span> </span><span class='pt43'>}</span></td></tr>
<tr><td class='ln' data-ln='49'></td><td><span class='pt43'>}</span></td></tr>
<tr><td class='ln' data-ln='50'></td><td> </td></tr>
<tr><td class='ln' data-ln='51'></td><td><span class='pt60'>impl</span><span> </span><span class='pt60'>ContextReference</span><span> </span><span class='pt43'>{</span></td></tr>
<tr><td class='ln' data-ln='52'></td><td><span> </span><span class='pt19 it'>/// find the pointed to context, panics if ref is not linked</span></td></tr>
<tr><td class='ln' data-ln='53'></td><td><span> </span><span class='pt60'>pub</span><span> </span><span class='pt60'>fn</span><span> </span><span class='pt62'>resolve</span><span class='pt43'>(</span><span class='pt56'>&</span><span class='pt55'>self</span><span class='pt43'>)</span><span> </span><span class='pt43'>-></span><span> ContextPtr </span><span class='pt43'>{</span></td></tr>
<tr><td class='ln' data-ln='54'></td><td><span> </span><span class='pt56'>match</span><span> </span><span class='pt56'>*</span><span class='pt55'>self</span><span> </span><span class='pt43'>{</span></td></tr>
<tr><td class='ln' data-ln='55'></td><td><span> ContextReference</span><span class='pt56'>::</span><span>Inline</span><span class='pt43'>(</span><span class='pt60'>ref</span><span> ptr</span><span class='pt43'>)</span><span> </span><span class='pt56'>=></span><span> ptr.</span><span class='pt62'>clone</span><span class='pt43'>()</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='56'></td><td><span> ContextReference</span><span class='pt56'>::</span><span>Direct</span><span class='pt43'>(</span><span class='pt60'>ref</span><span> ptr</span><span class='pt43'>)</span><span> </span><span class='pt56'>=></span><span> ptr.link.</span><span class='pt62'>upgrade</span><span class='pt43'>()</span><span>.</span><span class='pt62'>unwrap</span><span class='pt43'>()</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='57'></td><td><span> _ </span><span class='pt56'>=></span><span> </span><span class='pt29'>panic!</span><span class='pt43'>(</span><span class='pt23'>"Can only call resolve on linked references: </span><span class='pt28'>{:?}</span><span class='pt23'>"</span><span>, </span><span class='pt55'>self</span><span class='pt43'>)</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='58'></td><td><span> </span><span class='pt43'>}</span></td></tr>
<tr><td class='ln' data-ln='59'></td><td><span> </span><span class='pt43'>}</span></td></tr>
<tr><td class='ln' data-ln='60'></td><td><span class='pt43'>}</span></td></tr>
<tr><td class='ln' data-ln='61'></td><td> </td></tr>
<tr><td class='ln' data-ln='62'></td><td><span class='pt60'>impl</span><span> </span><span class='pt60'>MatchPattern</span><span> </span><span class='pt43'>{</span></td></tr>
<tr><td class='ln' data-ln='63'></td><td><span> </span><span class='pt19 it'>/// substitutes back-refs in Regex with regions from s</span></td></tr>
<tr><td class='ln' data-ln='64'></td><td><span> </span><span class='pt19 it'>/// used for match patterns which refer to captures from the pattern</span></td></tr>
<tr><td class='ln' data-ln='65'></td><td><span> </span><span class='pt19 it'>/// that pushed them.</span></td></tr>
<tr><td class='ln' data-ln='66'></td><td><span> </span><span class='pt60'>pub</span><span> </span><span class='pt60'>fn</span><span> </span><span class='pt62'>regex_with_substitutes</span><span class='pt43'>(</span><span class='pt56'>&</span><span class='pt55'>self</span><span>, </span><span class='pt41 pt4'>region</span><span class='pt43'>:</span><span> </span><span class='pt56'>&</span><span>Region, </span><span class='pt41 pt4'>s</span><span class='pt43'>:</span><span> </span><span class='pt56'>&</span><span class='pt60'>str</span><span class='pt43'>)</span><span> </span><span class='pt43'>-></span><span> </span><span class='pt29'>String</span><span> </span><span class='pt43'>{</span></td></tr>
<tr><td class='ln' data-ln='67'></td><td><span> </span><span class='pt56'>let</span><span> </span><span class='pt60'>mut</span><span> reg_str </span><span class='pt56'>=</span><span> </span><span class='pt29'>String</span><span class='pt56'>::</span><span class='pt62'>new</span><span class='pt43'>();</span></td></tr>
<tr><td class='ln' data-ln='68'></td><td><span> </span><span class='pt56'>let</span><span> </span><span class='pt60'>mut</span><span> last_was_escape </span><span class='pt56'>=</span><span> </span><span class='pt54'>false</span><span class='pt43'>;</span></td></tr>
<tr><td class='ln' data-ln='69'></td><td> </td></tr>
<tr><td class='ln' data-ln='70'></td><td><span> </span><span class='pt56'>for</span><span> c </span><span class='pt56'>in</span><span> </span><span class='pt55'>self</span><span>.regex_str.</span><span class='pt62'>chars</span><span class='pt43'>()</span><span> </span><span class='pt43'>{</span></td></tr>
<tr><td class='ln' data-ln='71'></td><td><span> </span><span class='pt56'>if</span><span> last_was_escape </span><span class='pt56'>&&</span><span> c.</span><span class='pt62'>is_digit</span><span class='pt43'>(</span><span class='pt54'>10</span><span class='pt43'>)</span><span> </span><span class='pt43'>{</span></td></tr>
<tr><td class='ln' data-ln='72'></td><td><span> </span><span class='pt56'>let</span><span> val </span><span class='pt56'>=</span><span> c.</span><span class='pt62'>to_digit</span><span class='pt43'>(</span><span class='pt54'>10</span><span class='pt43'>)</span><span>.</span><span class='pt62'>unwrap</span><span class='pt43'>();</span></td></tr>
<tr><td class='ln' data-ln='73'></td><td> </td></tr>
<tr><td class='ln' data-ln='74'></td><td><span> </span><span class='pt56'>if</span><span> </span><span class='pt56'>let</span><span> </span><span class='pt44'>Some</span><span class='pt43'>((</span><span>start, end</span><span class='pt43'>))</span><span> </span><span class='pt56'>=</span><span> region.</span><span class='pt62'>pos</span><span class='pt43'>(</span><span>val </span><span class='pt56'>as</span><span> </span><span class='pt60'>usize</span><span class='pt43'>)</span><span> </span><span class='pt43'>{</span></td></tr>
<tr><td class='ln' data-ln='75'></td><td><span> </span><span class='pt56'>let</span><span> escaped </span><span class='pt56'>=</span><span> </span><span class='pt62'>escape</span><span class='pt43'>(</span><span class='pt56'>&</span><span>s</span><span class='pt43'>[</span><span>start</span><span class='pt56'>..</span><span>end</span><span class='pt43'>]);</span></td></tr>
<tr><td class='ln' data-ln='76'></td><td><span> reg_str.</span><span class='pt62'>push_str</span><span class='pt43'>(</span><span class='pt56'>&</span><span>escaped</span><span class='pt43'>);</span></td></tr>
<tr><td class='ln' data-ln='77'></td><td><span> </span><span class='pt43'>}</span></td></tr>
<tr><td class='ln' data-ln='78'></td><td><span> </span><span class='pt43'>}</span><span> </span><span class='pt56'>else</span><span> </span><span class='pt56'>if</span><span> last_was_escape </span><span class='pt43'>{</span></td></tr>
<tr><td class='ln' data-ln='79'></td><td><span> reg_str.</span><span class='pt62'>push</span><span class='pt43'>(</span><span class='pt23'>'</span><span class='pt28'>\\</span><span class='pt23'>'</span><span class='pt43'>);</span></td></tr>
<tr><td class='ln' data-ln='80'></td><td><span> reg_str.</span><span class='pt62'>push</span><span class='pt43'>(</span><span>c</span><span class='pt43'>);</span></td></tr>
<tr><td class='ln' data-ln='81'></td><td><span> </span><span class='pt43'>}</span><span> </span><span class='pt56'>else</span><span> </span><span class='pt56'>if</span><span> c </span><span class='pt56'>!=</span><span> </span><span class='pt23'>'</span><span class='pt28'>\\</span><span class='pt23'>'</span><span> </span><span class='pt43'>{</span></td></tr>
<tr><td class='ln' data-ln='82'></td><td><span> reg_str.</span><span class='pt62'>push</span><span class='pt43'>(</span><span>c</span><span class='pt43'>);</span></td></tr>
<tr><td class='ln' data-ln='83'></td><td><span> </span><span class='pt43'>}</span></td></tr>
<tr><td class='ln' data-ln='84'></td><td> </td></tr>
<tr><td class='ln' data-ln='85'></td><td><span> last_was_escape </span><span class='pt56'>=</span><span> c </span><span class='pt56'>==</span><span> </span><span class='pt23'>'</span><span class='pt28'>\\</span><span class='pt23'>'</span><span> </span><span class='pt56'>&&</span><span> </span><span class='pt56'>!</span><span>last_was_escape</span><span class='pt43'>;</span></td></tr>
<tr><td class='ln' data-ln='86'></td><td><span> </span><span class='pt43'>}</span></td></tr>
<tr><td class='ln' data-ln='87'></td><td><span> reg_str</span></td></tr>
<tr><td class='ln' data-ln='88'></td><td><span> </span><span class='pt43'>}</span></td></tr>
<tr><td class='ln' data-ln='89'></td><td> </td></tr>
<tr><td class='ln' data-ln='90'></td><td><span> </span><span class='pt19 it'>/// Makes sure the regex is compiled if it doesn't have captures.</span></td></tr>
<tr><td class='ln' data-ln='91'></td><td><span> </span><span class='pt19 it'>/// May compile the regex if it isn't, panicing if compilation fails.</span></td></tr>
<tr><td class='ln' data-ln='92'></td><td><span> #[inline]</span></td></tr>
<tr><td class='ln' data-ln='93'></td><td><span> </span><span class='pt60'>pub</span><span> </span><span class='pt60'>fn</span><span> </span><span class='pt62'>ensure_compiled_if_possible</span><span class='pt43'>(</span><span class='pt56'>&</span><span class='pt60'>mut</span><span> </span><span class='pt55'>self</span><span class='pt43'>)</span><span> </span><span class='pt43'>{</span></td></tr>
<tr><td class='ln' data-ln='94'></td><td><span> </span><span class='pt56'>if</span><span> </span><span class='pt55'>self</span><span>.regex.</span><span class='pt62'>is_none</span><span class='pt43'>()</span><span> </span><span class='pt56'>&&</span><span> </span><span class='pt56'>!</span><span class='pt55'>self</span><span>.has_captures </span><span class='pt43'>{</span></td></tr>
<tr><td class='ln' data-ln='95'></td><td><span> </span><span class='pt55'>self</span><span>.</span><span class='pt62'>compile_regex</span><span class='pt43'>();</span></td></tr>
<tr><td class='ln' data-ln='96'></td><td><span> </span><span class='pt43'>}</span></td></tr>
<tr><td class='ln' data-ln='97'></td><td><span> </span><span class='pt43'>}</span></td></tr>
<tr><td class='ln' data-ln='98'></td><td><span class='pt43'>}</span></td></tr>
<tr><td class='ln' data-ln='99'></td><td> </td></tr>
<tr><td class='ln' data-ln='100'></td><td><span class='pt19 it'>/// This wrapper only exists so that I can implement a serialization</span></td></tr>
<tr><td class='ln' data-ln='101'></td><td><span class='pt19 it'>/// trait that crashes if you try and serialize this.</span></td></tr>
<tr><td class='ln' data-ln='102'></td><td><span>#[</span><span class='pt62'>derive</span><span class='pt43'>(</span><span class='pt29'>Debug</span><span class='pt43'>)</span><span>]</span></td></tr>
<tr><td class='ln' data-ln='103'></td><td><span class='pt60'>pub</span><span> </span><span class='pt60'>struct</span><span> </span><span class='pt60'>LinkerLink</span><span> </span><span class='pt43'>{</span></td></tr>
<tr><td class='ln' data-ln='104'></td><td><span> </span><span class='pt60'>pub</span><span> </span><span class='pt41 pt4'>link</span><span class='pt43'>:</span><span> Weak</span><span class='pt43'><</span><span>RefCell</span><span class='pt43'><</span><span>Context</span><span class='pt43'>>></span><span>,</span></td></tr>
<tr><td class='ln' data-ln='105'></td><td><span class='pt43'>}</span></td></tr>
<tr><td class='ln' data-ln='106'></td><td> </td></tr>
<tr><td class='ln' data-ln='107'></td><td><span class='pt60'>impl</span><span> </span><span class='pt29'>Eq</span><span> </span><span class='pt56'>for</span><span> </span><span class='pt60'>LinkerLink</span><span> </span><span class='pt43'>{}</span></td></tr>
<tr><td class='ln' data-ln='108'></td><td> </td></tr>
<tr><td class='ln' data-ln='109'></td><td><span class='pt60'>impl</span><span> </span><span class='pt29'>PartialEq</span><span> </span><span class='pt56'>for</span><span> </span><span class='pt60'>LinkerLink</span><span> </span><span class='pt43'>{</span></td></tr>
<tr><td class='ln' data-ln='110'></td><td><span> </span><span class='pt60'>fn</span><span> </span><span class='pt62'>eq</span><span class='pt43'>(</span><span class='pt56'>&</span><span class='pt55'>self</span><span>, </span><span class='pt41 pt4'>other</span><span class='pt43'>:</span><span> </span><span class='pt56'>&</span><span>LinkerLink</span><span class='pt43'>)</span><span> </span><span class='pt43'>-></span><span> </span><span class='pt60'>bool</span><span> </span><span class='pt43'>{</span></td></tr>
<tr><td class='ln' data-ln='111'></td><td><span> </span><span class='pt55'>self</span><span>.link.</span><span class='pt62'>upgrade</span><span class='pt43'>()</span><span> </span><span class='pt56'>==</span><span> other.link.</span><span class='pt62'>upgrade</span><span class='pt43'>()</span></td></tr>
<tr><td class='ln' data-ln='112'></td><td><span> </span><span class='pt43'>}</span></td></tr>
<tr><td class='ln' data-ln='113'></td><td><span class='pt43'>}</span></td></tr>
<tr><td class='ln' data-ln='114'></td><td> </td></tr>
<tr><td class='ln' data-ln='115'></td><td><span class='pt19 it'>/// Just panics, we can't do anything with linked up syntaxes</span></td></tr>
<tr><td class='ln' data-ln='116'></td><td><span class='pt60'>impl</span><span> Serialize </span><span class='pt56'>for</span><span> </span><span class='pt60'>LinkerLink</span><span> </span><span class='pt43'>{</span></td></tr>
<tr><td class='ln' data-ln='117'></td><td><span> </span><span class='pt60'>fn</span><span> </span><span class='pt62'>serialize</span><span class='pt43'><</span><span>S</span><span class='pt43'>>(</span><span class='pt56'>&</span><span class='pt55'>self</span><span>, </span><span class='pt56'>_</span><span>: S</span><span class='pt43'>)</span><span> </span><span class='pt43'>-></span><span> </span><span class='pt29'>Result</span><span class='pt43'><</span><span class='pt60'>S::</span><span class='pt44'>Ok</span><span class='pt43'>,</span><span> </span><span class='pt60'>S::</span><span>Error</span><span class='pt43'>></span><span> </span><span class='pt56'>where</span><span> S</span><span class='pt43'>:</span><span> Serializer </span><span class='pt43'>{</span></td></tr>
<tr><td class='ln' data-ln='118'></td><td><span> </span><span class='pt29'>panic!</span><span class='pt43'>(</span><span class='pt23'>"Can't serialize syntax definitions which have been linked"</span><span class='pt43'>);</span></td></tr>
<tr><td class='ln' data-ln='119'></td><td><span> </span><span class='pt43'>}</span></td></tr>
<tr><td class='ln' data-ln='120'></td><td><span class='pt43'>}</span></td></tr>
<tr><td class='ln' data-ln='121'></td><td> </td></tr>
<tr><td class='ln' data-ln='122'></td><td><span class='pt19 it'>/// Just panics, we can't do anything with linked up syntaxes</span></td></tr>
<tr><td class='ln' data-ln='123'></td><td><span class='pt60'>impl</span><span class='pt43'><</span><span class='pt60'>'de</span><span class='pt43'>></span><span> Deserialize</span><span class='pt43'><</span><span class='pt60'>'de</span><span class='pt43'>></span><span> </span><span class='pt56'>for</span><span> </span><span class='pt60'>LinkerLink</span><span> </span><span class='pt43'>{</span></td></tr>
<tr><td class='ln' data-ln='124'></td><td><span> </span><span class='pt60'>fn</span><span> </span><span class='pt62'>deserialize</span><span class='pt43'><</span><span>D</span><span class='pt43'>>(</span><span class='pt56'>_</span><span>: D</span><span class='pt43'>)</span><span> </span><span class='pt43'>-></span><span> </span><span class='pt29'>Result</span><span class='pt43'><</span><span class='pt60'>Self</span><span class='pt43'>,</span><span> </span><span class='pt60'>D::</span><span>Error</span><span class='pt43'>></span><span> </span><span class='pt56'>where</span><span> D</span><span class='pt43'>:</span><span> Deserializer<'de> </span><span class='pt43'>{</span></td></tr>
<tr><td class='ln' data-ln='125'></td><td><span> </span><span class='pt29'>panic!</span><span class='pt43'>(</span><span class='pt23'>"No linked syntax should ever have gotten serialized"</span><span class='pt43'>);</span></td></tr>
<tr><td class='ln' data-ln='126'></td><td><span> </span><span class='pt43'>}</span></td></tr>
<tr><td class='ln' data-ln='127'></td><td><span class='pt43'>}</span></td></tr>
<tr><td class='ln' data-ln='128'></td><td> </td></tr>
<tr><td class='ln' data-ln='129'></td><td> </td></tr>
<tr><td class='ln' data-ln='130'></td><td><span class='pt19 it'>/// Serialize the provided map in natural key order, so that it's deterministic when dumping.</span></td></tr>
<tr><td class='ln' data-ln='131'></td><td><span class='pt60'>fn</span><span> </span><span class='pt62'>ordered_map</span><span class='pt43'><</span><span>K</span><span class='pt43'>,</span><span> V</span><span class='pt43'>,</span><span> S</span><span class='pt43'>>(</span><span class='pt41 pt4'>map</span><span class='pt43'>:</span><span> </span><span class='pt56'>&</span><span class='pt29'>HashMap</span><span class='pt43'><</span><span>K</span><span class='pt43'>,</span><span> V</span><span class='pt43'>></span><span>, </span><span class='pt41 pt4'>serializer</span><span class='pt43'>:</span><span> S</span><span class='pt43'>)</span><span> </span><span class='pt43'>-></span><span> </span><span class='pt29'>Result</span><span class='pt43'><</span><span class='pt60'>S::</span><span class='pt44'>Ok</span><span class='pt43'>,</span><span> </span><span class='pt60'>S::</span><span>Error</span><span class='pt43'>></span></td></tr>
<tr><td class='ln' data-ln='132'></td><td><span> </span><span class='pt56'>where</span><span> S</span><span class='pt43'>:</span><span> Serializer, K</span><span class='pt43'>:</span><span> Eq + Hash + Ord + Serialize, V</span><span class='pt43'>:</span><span> Serialize</span></td></tr>
<tr><td class='ln' data-ln='133'></td><td><span class='pt43'>{</span></td></tr>
<tr><td class='ln' data-ln='134'></td><td><span> </span><span class='pt56'>let</span><span> ordered</span><span class='pt43'>:</span><span> BTreeMap</span><span class='pt43'><</span><span class='pt56'>_</span><span class='pt43'>,</span><span> </span><span class='pt56'>_</span><span class='pt43'>></span><span> </span><span class='pt56'>=</span><span> map.</span><span class='pt62'>iter</span><span class='pt43'>()</span><span>.</span><span class='pt62'>collect</span><span class='pt43'>();</span></td></tr>
<tr><td class='ln' data-ln='135'></td><td><span> ordered.</span><span class='pt62'>serialize</span><span class='pt43'>(</span><span>serializer</span><span class='pt43'>)</span></td></tr>
<tr><td class='ln' data-ln='136'></td><td><span class='pt43'>}</span></td></tr>
<tr><td class='ln' data-ln='137'></td><td> </td></tr>
<tr><td class='ln' data-ln='138'></td><td> </td></tr>
<tr><td class='ln' data-ln='139'></td><td><span>#[</span><span class='pt62'>cfg</span><span class='pt43'>(</span><span>test</span><span class='pt43'>)</span><span>]</span></td></tr>
<tr><td class='ln' data-ln='140'></td><td><span class='pt60'>mod</span><span> </span><span class='pt60'>tests</span><span> </span><span class='pt43'>{</span></td></tr>
<tr><td class='ln' data-ln='141'></td><td><span> </span><span class='pt56'>use</span><span> </span><span class='pt56'>super::*</span><span class='pt43'>;</span></td></tr>
<tr><td class='ln' data-ln='142'></td><td> </td></tr>
<tr><td class='ln' data-ln='143'></td><td><span> #[test]</span></td></tr>
<tr><td class='ln' data-ln='144'></td><td><span> </span><span class='pt60'>fn</span><span> </span><span class='pt62'>can_compile_refs</span><span class='pt43'>()</span><span> </span><span class='pt43'>{</span></td></tr>
<tr><td class='ln' data-ln='145'></td><td><span> </span><span class='pt56'>use</span><span> onig</span><span class='pt56'>::</span><span class='pt43'>{</span><span>SearchOptions, Regex, Region</span><span class='pt43'>};</span></td></tr>
<tr><td class='ln' data-ln='146'></td><td> </td></tr>
<tr><td class='ln' data-ln='147'></td><td><span> </span><span class='pt56'>let</span><span> pat </span><span class='pt56'>=</span><span> MatchPattern </span><span class='pt43'>{</span></td></tr>
<tr><td class='ln' data-ln='148'></td><td><span> has_captures</span><span class='pt43'>:</span><span> </span><span class='pt54'>true</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='149'></td><td><span> regex_str</span><span class='pt43'>:</span><span> </span><span class='pt29'>String</span><span class='pt56'>::</span><span class='pt62'>from</span><span class='pt43'>(</span><span class='pt60'>r</span><span class='pt23'>"lol \\ \2 \1 '\9' \wz"</span><span class='pt43'>)</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='150'></td><td><span> regex</span><span class='pt43'>:</span><span> </span><span class='pt44'>None</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='151'></td><td><span> scope</span><span class='pt43'>:</span><span> </span><span class='pt29'>vec!</span><span class='pt43'>[]</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='152'></td><td><span> captures</span><span class='pt43'>:</span><span> </span><span class='pt44'>None</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='153'></td><td><span> operation</span><span class='pt43'>:</span><span> MatchOperation</span><span class='pt56'>::</span><span class='pt44'>None</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='154'></td><td><span> with_prototype</span><span class='pt43'>:</span><span> </span><span class='pt44'>None</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='155'></td><td><span> </span><span class='pt43'>};</span></td></tr>
<tr><td class='ln' data-ln='156'></td><td> </td></tr>
<tr><td class='ln' data-ln='157'></td><td><span> </span><span class='pt56'>let</span><span> r </span><span class='pt56'>=</span><span> Regex</span><span class='pt56'>::</span><span class='pt62'>new</span><span class='pt43'>(</span><span class='pt60'>r</span><span class='pt23'>"(\\\[\]\(\))(b)(c)(d)(e)"</span><span class='pt43'>)</span><span>.</span><span class='pt62'>unwrap</span><span class='pt43'>();</span></td></tr>
<tr><td class='ln' data-ln='158'></td><td><span> </span><span class='pt56'>let</span><span> </span><span class='pt60'>mut</span><span> region </span><span class='pt56'>=</span><span> Region</span><span class='pt56'>::</span><span class='pt62'>new</span><span class='pt43'>();</span></td></tr>
<tr><td class='ln' data-ln='159'></td><td><span> </span><span class='pt56'>let</span><span> s </span><span class='pt56'>=</span><span> </span><span class='pt60'>r</span><span class='pt23'>"\[]()bcde"</span><span class='pt43'>;</span></td></tr>
<tr><td class='ln' data-ln='160'></td><td> </td></tr>
<tr><td class='ln' data-ln='161'></td><td><span> </span><span class='pt29'>assert!</span><span class='pt43'>(</span><span>r.</span><span class='pt62'>match_with_options</span><span class='pt43'>(</span><span>s, </span><span class='pt54'>0</span><span>, SearchOptions</span><span class='pt56'>::</span><span class='pt54'>SEARCH_OPTION_NONE</span><span>, </span><span class='pt44'>Some</span><span class='pt43'>(</span><span class='pt56'>&</span><span class='pt60'>mut</span><span> region</span><span class='pt43'>))</span><span>.</span><span class='pt62'>is_some</span><span class='pt43'>());</span></td></tr>
<tr><td class='ln' data-ln='162'></td><td> </td></tr>
<tr><td class='ln' data-ln='163'></td><td><span> </span><span class='pt56'>let</span><span> regex_res </span><span class='pt56'>=</span><span> pat.</span><span class='pt62'>regex_with_substitutes</span><span class='pt43'>(</span><span class='pt56'>&</span><span>region, s</span><span class='pt43'>);</span></td></tr>
<tr><td class='ln' data-ln='164'></td><td><span> </span><span class='pt29'>assert_eq!</span><span class='pt43'>(</span><span>regex_res, </span><span class='pt60'>r</span><span class='pt23'>"lol \\ b \\\[\]\(\) '' \wz"</span><span class='pt43'>);</span></td></tr>
<tr><td class='ln' data-ln='165'></td><td><span> pat.</span><span class='pt62'>compile_with_refs</span><span class='pt43'>(</span><span class='pt56'>&</span><span>region, s</span><span class='pt43'>);</span></td></tr>
<tr><td class='ln' data-ln='166'></td><td><span> </span><span class='pt43'>}</span></td></tr>
<tr><td class='ln' data-ln='167'></td><td><span class='pt43'>}</span></td></tr>
</table>
</div>
</div>
</div>
<div class='style' id='P--dracula--rs'>
<div class='P--dracula-bordered'>
<div class="info header">
<span class="left">syntax_definition.rs</span>
<span class="right"><span>167 lines</span><span>5.55 KB</span></span>
</div>
<div class='P--dracula'>
<table>
<tr><td class='ln' data-ln='1'></td><td><span class='pt9'>use</span><span> std</span><span class='pt9'>::</span><span>collections</span><span class='pt9'>::</span><span>{BTreeMap, HashMap};</span></td></tr>
<tr><td class='ln' data-ln='2'></td><td><span class='pt9'>use</span><span> std</span><span class='pt9'>::</span><span>hash</span><span class='pt9'>::</span><span>Hash;</span></td></tr>
<tr><td class='ln' data-ln='3'></td><td><span class='pt9'>use</span><span> onig</span><span class='pt9'>::</span><span>{Regex, RegexOptions, Region, Syntax};</span></td></tr>
<tr><td class='ln' data-ln='4'></td><td><span class='pt9'>use</span><span> std</span><span class='pt9'>::</span><span>rc</span><span class='pt9'>::</span><span>{Rc, Weak};</span></td></tr>
<tr><td class='ln' data-ln='5'></td><td><span class='pt9'>use</span><span> std</span><span class='pt9'>::</span><span>cell</span><span class='pt9'>::</span><span>RefCell;</span></td></tr>
<tr><td class='ln' data-ln='6'></td><td><span class='pt9'>use</span><span> </span><span class='pt9'>super::</span><span>scope</span><span class='pt9'>::*</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='7'></td><td><span class='pt9'>use</span><span> regex_syntax</span><span class='pt9'>::</span><span>escape;</span></td></tr>
<tr><td class='ln' data-ln='8'></td><td class='hi'><span class='pt9'>use</span><span> serde</span><span class='pt9'>::</span><span>{Deserialize, Deserializer, Serialize, Serializer};</span></td></tr>
<tr><td class='ln' data-ln='9'></td><td> </td></tr>
<tr><td class='ln' data-ln='10'></td><td><span class='pt2'>/// The main data structure representing a syntax definition loaded from a</span></td></tr>
<tr><td class='ln' data-ln='11'></td><td><span class='pt2'>/// `.sublime-syntax` file. You'll probably only need these as references</span></td></tr>
<tr><td class='ln' data-ln='12'></td><td><span class='pt2'>/// to be passed around to parsing code.</span></td></tr>
<tr><td class='ln' data-ln='13'></td><td><span class='pt2'>///</span></td></tr>
<tr><td class='ln' data-ln='14'></td><td><span class='pt2'>/// Some useful public fields are the `name` field which is a human readable</span></td></tr>
<tr><td class='ln' data-ln='15'></td><td><span class='pt2'>/// name to display in syntax lists, and the `hidden` field which means hide</span></td></tr>
<tr><td class='ln' data-ln='16'></td><td><span class='pt2'>/// this syntax from any lists because it is for internal use.</span></td></tr>
<tr><td class='ln' data-ln='17'></td><td><span>#[</span><span class='pt1'>derive</span><span>(</span><span class='pt3 it'>Clone</span><span>, </span><span class='pt3 it'>Debug</span><span>, </span><span class='pt3 it'>Eq</span><span>, </span><span class='pt3 it'>PartialEq</span><span>, Serialize, Deserialize)]</span></td></tr>
<tr><td class='ln' data-ln='18'></td><td><span class='pt9'>pub</span><span> </span><span class='pt9'>struct</span><span> </span><span class='pt3 it'>SyntaxDefinition</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='19'></td><td class='hi'><span> </span><span class='pt9'>pub</span><span> name: </span><span class='pt3 it'>String</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='20'></td><td class='hi'><span> </span><span class='pt9'>pub</span><span> file_extensions: </span><span class='pt3 it'>Vec</span><span class='pt9'><</span><span class='pt3 it'>String</span><span class='pt9'>></span><span>,</span></td></tr>
<tr><td class='ln' data-ln='21'></td><td class='hi'><span> </span><span class='pt9'>pub</span><span> scope: Scope,</span></td></tr>
<tr><td class='ln' data-ln='22'></td><td class='hi'><span> </span><span class='pt9'>pub</span><span> first_line_match: </span><span class='pt3 it'>Option</span><span class='pt9'><</span><span class='pt3 it'>String</span><span class='pt9'>></span><span>,</span></td></tr>
<tr><td class='ln' data-ln='23'></td><td class='hi'><span> </span><span class='pt9'>pub</span><span> hidden: </span><span class='pt3 it'>bool</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='24'></td><td><span> </span><span class='pt2'>/// Filled in at link time to avoid serializing it multiple times</span></td></tr>
<tr><td class='ln' data-ln='25'></td><td><span> #[</span><span class='pt1'>serde</span><span>(skip_serializing, skip_deserializing)]</span></td></tr>
<tr><td class='ln' data-ln='26'></td><td><span> </span><span class='pt9'>pub</span><span> prototype: </span><span class='pt3 it'>Option</span><span class='pt9'><</span><span>ContextPtr</span><span class='pt9'>></span><span>,</span></td></tr>
<tr><td class='ln' data-ln='27'></td><td><span> #[</span><span class='pt1'>serde</span><span>(serialize_with </span><span class='pt9'>=</span><span> </span><span class='pt6'>"</span><span class='pt7'>ordered_map</span><span class='pt6'>"</span><span>)]</span></td></tr>
<tr><td class='ln' data-ln='28'></td><td><span> </span><span class='pt9'>pub</span><span> variables: </span><span class='pt3 it'>HashMap</span><span class='pt9'><</span><span class='pt3 it'>String</span><span>, </span><span class='pt3 it'>String</span><span class='pt9'>></span><span>,</span></td></tr>
<tr><td class='ln' data-ln='29'></td><td><span> #[</span><span class='pt1'>serde</span><span>(serialize_with </span><span class='pt9'>=</span><span> </span><span class='pt6'>"</span><span class='pt7'>ordered_map</span><span class='pt6'>"</span><span>)]</span></td></tr>
<tr><td class='ln' data-ln='30'></td><td><span> </span><span class='pt9'>pub</span><span> contexts: </span><span class='pt3 it'>HashMap</span><span class='pt9'><</span><span class='pt3 it'>String</span><span>, ContextPtr</span><span class='pt9'>></span><span>,</span></td></tr>
<tr><td class='ln' data-ln='31'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='32'></td><td> </td></tr>
<tr><td class='ln' data-ln='33'></td><td><span class='pt9'>impl</span><span> </span><span class='pt3 it'>Context</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='34'></td><td><span> </span><span class='pt2'>/// Returns the match pattern at an index, panics if the thing isn't a match pattern</span></td></tr>
<tr><td class='ln' data-ln='35'></td><td><span> </span><span class='pt9'>pub</span><span> </span><span class='pt9'>fn</span><span> </span><span class='pt1'>match_at</span><span>(</span><span class='pt9'>&</span><span class='pt5 it'>self</span><span>, </span><span class='pt10 it'>index</span><span>: </span><span class='pt3 it'>usize</span><span>) -> </span><span class='pt9'>&</span><span>MatchPattern {</span></td></tr>
<tr><td class='ln' data-ln='36'></td><td><span> </span><span class='pt9'>match</span><span> </span><span class='pt5 it'>self</span><span>.patterns[index] {</span></td></tr>
<tr><td class='ln' data-ln='37'></td><td><span> Pattern</span><span class='pt9'>::</span><span>Match(</span><span class='pt9'>ref</span><span> match_pat) </span><span class='pt9'>=></span><span> match_pat,</span></td></tr>
<tr><td class='ln' data-ln='38'></td><td><span> _ </span><span class='pt9'>=></span><span> </span><span class='pt3 it'>panic!</span><span>(</span><span class='pt6'>"</span><span class='pt7'>bad index to match_at</span><span class='pt6'>"</span><span>),</span></td></tr>
<tr><td class='ln' data-ln='39'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='40'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='41'></td><td> </td></tr>
<tr><td class='ln' data-ln='42'></td><td><span> </span><span class='pt2'>/// Returns a mutable reference, otherwise like `match_at`</span></td></tr>
<tr><td class='ln' data-ln='43'></td><td><span> </span><span class='pt9'>pub</span><span> </span><span class='pt9'>fn</span><span> </span><span class='pt1'>match_at_mut</span><span>(</span><span class='pt9'>&mut</span><span> </span><span class='pt5 it'>self</span><span>, </span><span class='pt10 it'>index</span><span>: </span><span class='pt3 it'>usize</span><span>) -> </span><span class='pt9'>&mut</span><span> MatchPattern {</span></td></tr>
<tr><td class='ln' data-ln='44'></td><td><span> </span><span class='pt9'>match</span><span> </span><span class='pt5 it'>self</span><span>.patterns[index] {</span></td></tr>
<tr><td class='ln' data-ln='45'></td><td><span> Pattern</span><span class='pt9'>::</span><span>Match(</span><span class='pt9'>ref</span><span> </span><span class='pt9'>mut</span><span> match_pat) </span><span class='pt9'>=></span><span> match_pat,</span></td></tr>
<tr><td class='ln' data-ln='46'></td><td><span> _ </span><span class='pt9'>=></span><span> </span><span class='pt3 it'>panic!</span><span>(</span><span class='pt6'>"</span><span class='pt7'>bad index to match_at</span><span class='pt6'>"</span><span>),</span></td></tr>
<tr><td class='ln' data-ln='47'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='48'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='49'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='50'></td><td> </td></tr>
<tr><td class='ln' data-ln='51'></td><td><span class='pt9'>impl</span><span> </span><span class='pt3 it'>ContextReference</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='52'></td><td><span> </span><span class='pt2'>/// find the pointed to context, panics if ref is not linked</span></td></tr>
<tr><td class='ln' data-ln='53'></td><td><span> </span><span class='pt9'>pub</span><span> </span><span class='pt9'>fn</span><span> </span><span class='pt1'>resolve</span><span>(</span><span class='pt9'>&</span><span class='pt5 it'>self</span><span>) -> ContextPtr {</span></td></tr>
<tr><td class='ln' data-ln='54'></td><td><span> </span><span class='pt9'>match</span><span> </span><span class='pt9'>*</span><span class='pt5 it'>self</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='55'></td><td><span> ContextReference</span><span class='pt9'>::</span><span>Inline(</span><span class='pt9'>ref</span><span> ptr) </span><span class='pt9'>=></span><span> ptr.</span><span class='pt1'>clone</span><span>(),</span></td></tr>
<tr><td class='ln' data-ln='56'></td><td><span> ContextReference</span><span class='pt9'>::</span><span>Direct(</span><span class='pt9'>ref</span><span> ptr) </span><span class='pt9'>=></span><span> ptr.link.</span><span class='pt1'>upgrade</span><span>().</span><span class='pt1'>unwrap</span><span>(),</span></td></tr>
<tr><td class='ln' data-ln='57'></td><td><span> _ </span><span class='pt9'>=></span><span> </span><span class='pt3 it'>panic!</span><span>(</span><span class='pt6'>"</span><span class='pt7'>Can only call resolve on linked references: </span><span class='pt5'>{:?}</span><span class='pt6'>"</span><span>, </span><span class='pt5 it'>self</span><span>),</span></td></tr>
<tr><td class='ln' data-ln='58'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='59'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='60'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='61'></td><td> </td></tr>
<tr><td class='ln' data-ln='62'></td><td><span class='pt9'>impl</span><span> </span><span class='pt3 it'>MatchPattern</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='63'></td><td><span> </span><span class='pt2'>/// substitutes back-refs in Regex with regions from s</span></td></tr>
<tr><td class='ln' data-ln='64'></td><td><span> </span><span class='pt2'>/// used for match patterns which refer to captures from the pattern</span></td></tr>
<tr><td class='ln' data-ln='65'></td><td><span> </span><span class='pt2'>/// that pushed them.</span></td></tr>
<tr><td class='ln' data-ln='66'></td><td><span> </span><span class='pt9'>pub</span><span> </span><span class='pt9'>fn</span><span> </span><span class='pt1'>regex_with_substitutes</span><span>(</span><span class='pt9'>&</span><span class='pt5 it'>self</span><span>, </span><span class='pt10 it'>region</span><span>: </span><span class='pt9'>&</span><span>Region, </span><span class='pt10 it'>s</span><span>: </span><span class='pt9'>&</span><span class='pt3 it'>str</span><span>) -> </span><span class='pt3 it'>String</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='67'></td><td><span> </span><span class='pt9 it'>let</span><span> </span><span class='pt9'>mut</span><span> reg_str </span><span class='pt9'>=</span><span> </span><span class='pt3 it'>String</span><span class='pt9'>::</span><span class='pt1'>new</span><span>();</span></td></tr>
<tr><td class='ln' data-ln='68'></td><td><span> </span><span class='pt9 it'>let</span><span> </span><span class='pt9'>mut</span><span> last_was_escape </span><span class='pt9'>=</span><span> </span><span class='pt5'>false</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='69'></td><td> </td></tr>
<tr><td class='ln' data-ln='70'></td><td><span> </span><span class='pt9'>for</span><span> c </span><span class='pt9'>in</span><span> </span><span class='pt5 it'>self</span><span>.regex_str.</span><span class='pt1'>chars</span><span>() {</span></td></tr>
<tr><td class='ln' data-ln='71'></td><td><span> </span><span class='pt9'>if</span><span> last_was_escape </span><span class='pt9'>&&</span><span> c.</span><span class='pt1'>is_digit</span><span>(</span><span class='pt5'>10</span><span>) {</span></td></tr>
<tr><td class='ln' data-ln='72'></td><td><span> </span><span class='pt9 it'>let</span><span> val </span><span class='pt9'>=</span><span> c.</span><span class='pt1'>to_digit</span><span>(</span><span class='pt5'>10</span><span>).</span><span class='pt1'>unwrap</span><span>();</span></td></tr>
<tr><td class='ln' data-ln='73'></td><td> </td></tr>
<tr><td class='ln' data-ln='74'></td><td><span> </span><span class='pt9'>if</span><span> </span><span class='pt9 it'>let</span><span> </span><span class='pt5'>Some</span><span>((start, end)) </span><span class='pt9'>=</span><span> region.</span><span class='pt1'>pos</span><span>(val </span><span class='pt9'>as</span><span> </span><span class='pt3 it'>usize</span><span>) {</span></td></tr>
<tr><td class='ln' data-ln='75'></td><td><span> </span><span class='pt9 it'>let</span><span> escaped </span><span class='pt9'>=</span><span> </span><span class='pt1'>escape</span><span>(</span><span class='pt9'>&</span><span>s[start</span><span class='pt9'>..</span><span>end]);</span></td></tr>
<tr><td class='ln' data-ln='76'></td><td><span> reg_str.</span><span class='pt1'>push_str</span><span>(</span><span class='pt9'>&</span><span>escaped);</span></td></tr>
<tr><td class='ln' data-ln='77'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='78'></td><td><span> } </span><span class='pt9'>else</span><span> </span><span class='pt9'>if</span><span> last_was_escape {</span></td></tr>
<tr><td class='ln' data-ln='79'></td><td><span> reg_str.</span><span class='pt1'>push</span><span>(</span><span class='pt6'>'</span><span class='pt9'>\\</span><span class='pt6'>'</span><span>);</span></td></tr>
<tr><td class='ln' data-ln='80'></td><td><span> reg_str.</span><span class='pt1'>push</span><span>(c);</span></td></tr>
<tr><td class='ln' data-ln='81'></td><td><span> } </span><span class='pt9'>else</span><span> </span><span class='pt9'>if</span><span> c </span><span class='pt9'>!=</span><span> </span><span class='pt6'>'</span><span class='pt9'>\\</span><span class='pt6'>'</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='82'></td><td><span> reg_str.</span><span class='pt1'>push</span><span>(c);</span></td></tr>
<tr><td class='ln' data-ln='83'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='84'></td><td> </td></tr>
<tr><td class='ln' data-ln='85'></td><td><span> last_was_escape </span><span class='pt9'>=</span><span> c </span><span class='pt9'>==</span><span> </span><span class='pt6'>'</span><span class='pt9'>\\</span><span class='pt6'>'</span><span> </span><span class='pt9'>&&</span><span> </span><span class='pt9'>!</span><span>last_was_escape;</span></td></tr>
<tr><td class='ln' data-ln='86'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='87'></td><td><span> reg_str</span></td></tr>
<tr><td class='ln' data-ln='88'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='89'></td><td> </td></tr>
<tr><td class='ln' data-ln='90'></td><td><span> </span><span class='pt2'>/// Makes sure the regex is compiled if it doesn't have captures.</span></td></tr>
<tr><td class='ln' data-ln='91'></td><td><span> </span><span class='pt2'>/// May compile the regex if it isn't, panicing if compilation fails.</span></td></tr>
<tr><td class='ln' data-ln='92'></td><td><span> #[inline]</span></td></tr>
<tr><td class='ln' data-ln='93'></td><td><span> </span><span class='pt9'>pub</span><span> </span><span class='pt9'>fn</span><span> </span><span class='pt1'>ensure_compiled_if_possible</span><span>(</span><span class='pt9'>&mut</span><span> </span><span class='pt5 it'>self</span><span>) {</span></td></tr>
<tr><td class='ln' data-ln='94'></td><td><span> </span><span class='pt9'>if</span><span> </span><span class='pt5 it'>self</span><span>.regex.</span><span class='pt1'>is_none</span><span>() </span><span class='pt9'>&&</span><span> </span><span class='pt9'>!</span><span class='pt5 it'>self</span><span>.has_captures {</span></td></tr>
<tr><td class='ln' data-ln='95'></td><td><span> </span><span class='pt5 it'>self</span><span>.</span><span class='pt1'>compile_regex</span><span>();</span></td></tr>
<tr><td class='ln' data-ln='96'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='97'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='98'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='99'></td><td> </td></tr>
<tr><td class='ln' data-ln='100'></td><td><span class='pt2'>/// This wrapper only exists so that I can implement a serialization</span></td></tr>
<tr><td class='ln' data-ln='101'></td><td><span class='pt2'>/// trait that crashes if you try and serialize this.</span></td></tr>
<tr><td class='ln' data-ln='102'></td><td><span>#[</span><span class='pt1'>derive</span><span>(</span><span class='pt3 it'>Debug</span><span>)]</span></td></tr>
<tr><td class='ln' data-ln='103'></td><td><span class='pt9'>pub</span><span> </span><span class='pt9'>struct</span><span> </span><span class='pt3 it'>LinkerLink</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='104'></td><td><span> </span><span class='pt9'>pub</span><span> link: Weak</span><span class='pt9'><</span><span>RefCell</span><span class='pt9'><</span><span>Context</span><span class='pt9'>>></span><span>,</span></td></tr>
<tr><td class='ln' data-ln='105'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='106'></td><td> </td></tr>
<tr><td class='ln' data-ln='107'></td><td><span class='pt9'>impl</span><span> </span><span class='pt3 it'>Eq</span><span> </span><span class='pt9'>for</span><span> </span><span class='pt3 it'>LinkerLink</span><span> {}</span></td></tr>
<tr><td class='ln' data-ln='108'></td><td> </td></tr>
<tr><td class='ln' data-ln='109'></td><td><span class='pt9'>impl</span><span> </span><span class='pt3 it'>PartialEq</span><span> </span><span class='pt9'>for</span><span> </span><span class='pt3 it'>LinkerLink</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='110'></td><td><span> </span><span class='pt9'>fn</span><span> </span><span class='pt1'>eq</span><span>(</span><span class='pt9'>&</span><span class='pt5 it'>self</span><span>, </span><span class='pt10 it'>other</span><span>: </span><span class='pt9'>&</span><span>LinkerLink) -> </span><span class='pt3 it'>bool</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='111'></td><td><span> </span><span class='pt5 it'>self</span><span>.link.</span><span class='pt1'>upgrade</span><span>() </span><span class='pt9'>==</span><span> other.link.</span><span class='pt1'>upgrade</span><span>()</span></td></tr>
<tr><td class='ln' data-ln='112'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='113'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='114'></td><td> </td></tr>
<tr><td class='ln' data-ln='115'></td><td><span class='pt2'>/// Just panics, we can't do anything with linked up syntaxes</span></td></tr>
<tr><td class='ln' data-ln='116'></td><td><span class='pt9'>impl</span><span> Serialize </span><span class='pt9'>for</span><span> </span><span class='pt3 it'>LinkerLink</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='117'></td><td><span> </span><span class='pt9'>fn</span><span> </span><span class='pt1'>serialize</span><span class='pt9'><</span><span>S</span><span class='pt9'>></span><span>(</span><span class='pt9'>&</span><span class='pt5 it'>self</span><span>, </span><span class='pt9'>_</span><span>: S) -> </span><span class='pt3 it'>Result</span><span class='pt9'><</span><span class='pt3 it'>S::</span><span class='pt5'>Ok</span><span>, </span><span class='pt3 it'>S::</span><span>Error</span><span class='pt9'>></span><span> </span><span class='pt9'>where</span><span> S: Serializer {</span></td></tr>
<tr><td class='ln' data-ln='118'></td><td><span> </span><span class='pt3 it'>panic!</span><span>(</span><span class='pt6'>"</span><span class='pt7'>Can't serialize syntax definitions which have been linked</span><span class='pt6'>"</span><span>);</span></td></tr>
<tr><td class='ln' data-ln='119'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='120'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='121'></td><td> </td></tr>
<tr><td class='ln' data-ln='122'></td><td><span class='pt2'>/// Just panics, we can't do anything with linked up syntaxes</span></td></tr>
<tr><td class='ln' data-ln='123'></td><td><span class='pt9'>impl<'de></span><span> Deserialize</span><span class='pt9'><'de></span><span> </span><span class='pt9'>for</span><span> </span><span class='pt3 it'>LinkerLink</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='124'></td><td><span> </span><span class='pt9'>fn</span><span> </span><span class='pt1'>deserialize</span><span class='pt9'><</span><span>D</span><span class='pt9'>></span><span>(</span><span class='pt9'>_</span><span>: D) -> </span><span class='pt3 it'>Result</span><span class='pt9'><</span><span class='pt3 it'>Self</span><span>, </span><span class='pt3 it'>D::</span><span>Error</span><span class='pt9'>></span><span> </span><span class='pt9'>where</span><span> D: Deserializer<'de> {</span></td></tr>
<tr><td class='ln' data-ln='125'></td><td><span> </span><span class='pt3 it'>panic!</span><span>(</span><span class='pt6'>"</span><span class='pt7'>No linked syntax should ever have gotten serialized</span><span class='pt6'>"</span><span>);</span></td></tr>
<tr><td class='ln' data-ln='126'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='127'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='128'></td><td> </td></tr>
<tr><td class='ln' data-ln='129'></td><td> </td></tr>
<tr><td class='ln' data-ln='130'></td><td><span class='pt2'>/// Serialize the provided map in natural key order, so that it's deterministic when dumping.</span></td></tr>
<tr><td class='ln' data-ln='131'></td><td><span class='pt9'>fn</span><span> </span><span class='pt1'>ordered_map</span><span class='pt9'><</span><span>K, V, S</span><span class='pt9'>></span><span>(</span><span class='pt10 it'>map</span><span>: </span><span class='pt9'>&</span><span class='pt3 it'>HashMap</span><span class='pt9'><</span><span>K, V</span><span class='pt9'>></span><span>, </span><span class='pt10 it'>serializer</span><span>: S) -> </span><span class='pt3 it'>Result</span><span class='pt9'><</span><span class='pt3 it'>S::</span><span class='pt5'>Ok</span><span>, </span><span class='pt3 it'>S::</span><span>Error</span><span class='pt9'>></span></td></tr>
<tr><td class='ln' data-ln='132'></td><td><span> </span><span class='pt9'>where</span><span> S: Serializer, K: Eq + Hash + Ord + Serialize, V: Serialize</span></td></tr>
<tr><td class='ln' data-ln='133'></td><td><span>{</span></td></tr>
<tr><td class='ln' data-ln='134'></td><td><span> </span><span class='pt9 it'>let</span><span> ordered: BTreeMap</span><span class='pt9'><_</span><span>, </span><span class='pt9'>_></span><span> </span><span class='pt9'>=</span><span> map.</span><span class='pt1'>iter</span><span>().</span><span class='pt1'>collect</span><span>();</span></td></tr>
<tr><td class='ln' data-ln='135'></td><td><span> ordered.</span><span class='pt1'>serialize</span><span>(serializer)</span></td></tr>
<tr><td class='ln' data-ln='136'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='137'></td><td> </td></tr>
<tr><td class='ln' data-ln='138'></td><td> </td></tr>
<tr><td class='ln' data-ln='139'></td><td><span>#[</span><span class='pt1'>cfg</span><span>(test)]</span></td></tr>
<tr><td class='ln' data-ln='140'></td><td><span class='pt9'>mod</span><span> tests {</span></td></tr>
<tr><td class='ln' data-ln='141'></td><td><span> </span><span class='pt9'>use</span><span> </span><span class='pt9'>super::*</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='142'></td><td> </td></tr>
<tr><td class='ln' data-ln='143'></td><td><span> #[test]</span></td></tr>
<tr><td class='ln' data-ln='144'></td><td><span> </span><span class='pt9'>fn</span><span> </span><span class='pt1'>can_compile_refs</span><span>() {</span></td></tr>
<tr><td class='ln' data-ln='145'></td><td><span> </span><span class='pt9'>use</span><span> onig</span><span class='pt9'>::</span><span>{SearchOptions, Regex, Region};</span></td></tr>
<tr><td class='ln' data-ln='146'></td><td> </td></tr>
<tr><td class='ln' data-ln='147'></td><td><span> </span><span class='pt9 it'>let</span><span> pat </span><span class='pt9'>=</span><span> MatchPattern {</span></td></tr>
<tr><td class='ln' data-ln='148'></td><td><span> has_captures: </span><span class='pt5'>true</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='149'></td><td><span> regex_str: </span><span class='pt3 it'>String</span><span class='pt9'>::</span><span class='pt1'>from</span><span>(</span><span class='pt9'>r</span><span class='pt7'>"lol \\ \2 \1 '\9' \wz</span><span class='pt6'>"</span><span>),</span></td></tr>
<tr><td class='ln' data-ln='150'></td><td><span> regex: </span><span class='pt5'>None</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='151'></td><td><span> scope: </span><span class='pt3 it'>vec!</span><span>[],</span></td></tr>
<tr><td class='ln' data-ln='152'></td><td><span> captures: </span><span class='pt5'>None</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='153'></td><td><span> operation: MatchOperation</span><span class='pt9'>::</span><span class='pt5'>None</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='154'></td><td><span> with_prototype: </span><span class='pt5'>None</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='155'></td><td><span> };</span></td></tr>
<tr><td class='ln' data-ln='156'></td><td> </td></tr>
<tr><td class='ln' data-ln='157'></td><td><span> </span><span class='pt9 it'>let</span><span> r </span><span class='pt9'>=</span><span> Regex</span><span class='pt9'>::</span><span class='pt1'>new</span><span>(</span><span class='pt9'>r</span><span class='pt7'>"(\\\[\]\(\))(b)(c)(d)(e)</span><span class='pt6'>"</span><span>).</span><span class='pt1'>unwrap</span><span>();</span></td></tr>
<tr><td class='ln' data-ln='158'></td><td><span> </span><span class='pt9 it'>let</span><span> </span><span class='pt9'>mut</span><span> region </span><span class='pt9'>=</span><span> Region</span><span class='pt9'>::</span><span class='pt1'>new</span><span>();</span></td></tr>
<tr><td class='ln' data-ln='159'></td><td><span> </span><span class='pt9 it'>let</span><span> s </span><span class='pt9'>=</span><span> </span><span class='pt9'>r</span><span class='pt7'>"\[]()bcde</span><span class='pt6'>"</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='160'></td><td> </td></tr>
<tr><td class='ln' data-ln='161'></td><td><span> </span><span class='pt3 it'>assert!</span><span>(r.</span><span class='pt1'>match_with_options</span><span>(s, </span><span class='pt5'>0</span><span>, SearchOptions</span><span class='pt9'>::</span><span class='pt5'>SEARCH_OPTION_NONE</span><span>, </span><span class='pt5'>Some</span><span>(</span><span class='pt9'>&mut</span><span> region)).</span><span class='pt1'>is_some</span><span>());</span></td></tr>
<tr><td class='ln' data-ln='162'></td><td> </td></tr>
<tr><td class='ln' data-ln='163'></td><td><span> </span><span class='pt9 it'>let</span><span> regex_res </span><span class='pt9'>=</span><span> pat.</span><span class='pt1'>regex_with_substitutes</span><span>(</span><span class='pt9'>&</span><span>region, s);</span></td></tr>
<tr><td class='ln' data-ln='164'></td><td><span> </span><span class='pt3 it'>assert_eq!</span><span>(regex_res, </span><span class='pt9'>r</span><span class='pt7'>"lol \\ b \\\[\]\(\) '' \wz</span><span class='pt6'>"</span><span>);</span></td></tr>
<tr><td class='ln' data-ln='165'></td><td><span> pat.</span><span class='pt1'>compile_with_refs</span><span>(</span><span class='pt9'>&</span><span>region, s);</span></td></tr>
<tr><td class='ln' data-ln='166'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='167'></td><td><span>}</span></td></tr>
</table>
</div>
</div>
</div>
<div class='style' id='P--github--rs'>
<div class='P--github-bordered'>
<div class="info header">
<span class="left">syntax_definition.rs</span>
<span class="right"><span>167 lines</span><span>5.55 KB</span></span>
</div>
<div class='P--github'>
<table>
<tr><td class='ln' data-ln='1'></td><td><span class='pt17'>use</span><span> std</span><span class='pt17'>::</span><span>collections</span><span class='pt17'>::</span><span>{BTreeMap, HashMap};</span></td></tr>
<tr><td class='ln' data-ln='2'></td><td><span class='pt17'>use</span><span> std</span><span class='pt17'>::</span><span>hash</span><span class='pt17'>::</span><span>Hash;</span></td></tr>
<tr><td class='ln' data-ln='3'></td><td><span class='pt17'>use</span><span> onig</span><span class='pt17'>::</span><span>{Regex, RegexOptions, Region, Syntax};</span></td></tr>
<tr><td class='ln' data-ln='4'></td><td><span class='pt17'>use</span><span> std</span><span class='pt17'>::</span><span>rc</span><span class='pt17'>::</span><span>{Rc, Weak};</span></td></tr>
<tr><td class='ln' data-ln='5'></td><td><span class='pt17'>use</span><span> std</span><span class='pt17'>::</span><span>cell</span><span class='pt17'>::</span><span>RefCell;</span></td></tr>
<tr><td class='ln' data-ln='6'></td><td><span class='pt17'>use</span><span> </span><span class='pt17'>super::</span><span>scope</span><span class='pt17'>::*</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='7'></td><td><span class='pt17'>use</span><span> regex_syntax</span><span class='pt17'>::</span><span>escape;</span></td></tr>
<tr><td class='ln' data-ln='8'></td><td class='hi'><span class='pt17'>use</span><span> serde</span><span class='pt17'>::</span><span>{Deserialize, Deserializer, Serialize, Serializer};</span></td></tr>
<tr><td class='ln' data-ln='9'></td><td> </td></tr>
<tr><td class='ln' data-ln='10'></td><td><span class='pt12'>/// The main data structure representing a syntax definition loaded from a</span></td></tr>
<tr><td class='ln' data-ln='11'></td><td><span class='pt12'>/// `.sublime-syntax` file. You'll probably only need these as references</span></td></tr>
<tr><td class='ln' data-ln='12'></td><td><span class='pt12'>/// to be passed around to parsing code.</span></td></tr>
<tr><td class='ln' data-ln='13'></td><td><span class='pt12'>///</span></td></tr>
<tr><td class='ln' data-ln='14'></td><td><span class='pt12'>/// Some useful public fields are the `name` field which is a human readable</span></td></tr>
<tr><td class='ln' data-ln='15'></td><td><span class='pt12'>/// name to display in syntax lists, and the `hidden` field which means hide</span></td></tr>
<tr><td class='ln' data-ln='16'></td><td><span class='pt12'>/// this syntax from any lists because it is for internal use.</span></td></tr>
<tr><td class='ln' data-ln='17'></td><td><span>#[</span><span class='pt13'>derive</span><span>(</span><span class='pt17'>Clone</span><span>, </span><span class='pt17'>Debug</span><span>, </span><span class='pt17'>Eq</span><span>, </span><span class='pt17'>PartialEq</span><span>, Serialize, Deserialize)]</span></td></tr>
<tr><td class='ln' data-ln='18'></td><td><span class='pt17'>pub</span><span> </span><span class='pt17'>struct</span><span> </span><span class='pt13'>SyntaxDefinition</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='19'></td><td class='hi'><span> </span><span class='pt17'>pub</span><span> </span><span class='pt10'>name</span><span>: </span><span class='pt17'>String</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='20'></td><td class='hi'><span> </span><span class='pt17'>pub</span><span> </span><span class='pt10'>file_extensions</span><span>: </span><span class='pt17'>Vec<String></span><span>,</span></td></tr>
<tr><td class='ln' data-ln='21'></td><td class='hi'><span> </span><span class='pt17'>pub</span><span> </span><span class='pt10'>scope</span><span>: Scope,</span></td></tr>
<tr><td class='ln' data-ln='22'></td><td class='hi'><span> </span><span class='pt17'>pub</span><span> </span><span class='pt10'>first_line_match</span><span>: </span><span class='pt17'>Option<String></span><span>,</span></td></tr>
<tr><td class='ln' data-ln='23'></td><td class='hi'><span> </span><span class='pt17'>pub</span><span> </span><span class='pt10'>hidden</span><span>: </span><span class='pt17'>bool</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='24'></td><td><span> </span><span class='pt12'>/// Filled in at link time to avoid serializing it multiple times</span></td></tr>
<tr><td class='ln' data-ln='25'></td><td><span> #[</span><span class='pt13'>serde</span><span>(skip_serializing, skip_deserializing)]</span></td></tr>
<tr><td class='ln' data-ln='26'></td><td><span> </span><span class='pt17'>pub</span><span> </span><span class='pt10'>prototype</span><span>: </span><span class='pt17'>Option<</span><span>ContextPtr</span><span class='pt17'>></span><span>,</span></td></tr>
<tr><td class='ln' data-ln='27'></td><td><span> #[</span><span class='pt13'>serde</span><span>(serialize_with </span><span class='pt17'>=</span><span> </span><span class='pt8'>"ordered_map"</span><span>)]</span></td></tr>
<tr><td class='ln' data-ln='28'></td><td><span> </span><span class='pt17'>pub</span><span> </span><span class='pt10'>variables</span><span>: </span><span class='pt17'>HashMap<String</span><span>, </span><span class='pt17'>String></span><span>,</span></td></tr>
<tr><td class='ln' data-ln='29'></td><td><span> #[</span><span class='pt13'>serde</span><span>(serialize_with </span><span class='pt17'>=</span><span> </span><span class='pt8'>"ordered_map"</span><span>)]</span></td></tr>
<tr><td class='ln' data-ln='30'></td><td><span> </span><span class='pt17'>pub</span><span> </span><span class='pt10'>contexts</span><span>: </span><span class='pt17'>HashMap<String</span><span>, ContextPtr</span><span class='pt17'>></span><span>,</span></td></tr>
<tr><td class='ln' data-ln='31'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='32'></td><td> </td></tr>
<tr><td class='ln' data-ln='33'></td><td><span class='pt17'>impl</span><span> </span><span class='pt13'>Context</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='34'></td><td><span> </span><span class='pt12'>/// Returns the match pattern at an index, panics if the thing isn't a match pattern</span></td></tr>
<tr><td class='ln' data-ln='35'></td><td><span> </span><span class='pt17'>pub</span><span> </span><span class='pt17'>fn</span><span> </span><span class='pt13'>match_at</span><span>(</span><span class='pt17'>&</span><span class='pt7'>self</span><span>, </span><span class='pt10'>index</span><span>: </span><span class='pt17'>usize</span><span>) -> </span><span class='pt17'>&</span><span>MatchPattern {</span></td></tr>
<tr><td class='ln' data-ln='36'></td><td><span> </span><span class='pt17'>match</span><span> </span><span class='pt7'>self</span><span>.patterns[index] {</span></td></tr>
<tr><td class='ln' data-ln='37'></td><td><span> Pattern</span><span class='pt17'>::</span><span>Match(</span><span class='pt17'>ref</span><span> match_pat) </span><span class='pt17'>=></span><span> match_pat,</span></td></tr>
<tr><td class='ln' data-ln='38'></td><td><span> _ </span><span class='pt17'>=></span><span> </span><span class='pt7'>panic!</span><span>(</span><span class='pt8'>"bad index to match_at"</span><span>),</span></td></tr>
<tr><td class='ln' data-ln='39'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='40'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='41'></td><td> </td></tr>
<tr><td class='ln' data-ln='42'></td><td><span> </span><span class='pt12'>/// Returns a mutable reference, otherwise like `match_at`</span></td></tr>
<tr><td class='ln' data-ln='43'></td><td><span> </span><span class='pt17'>pub</span><span> </span><span class='pt17'>fn</span><span> </span><span class='pt13'>match_at_mut</span><span>(</span><span class='pt17'>&mut</span><span> </span><span class='pt7'>self</span><span>, </span><span class='pt10'>index</span><span>: </span><span class='pt17'>usize</span><span>) -> </span><span class='pt17'>&mut</span><span> MatchPattern {</span></td></tr>
<tr><td class='ln' data-ln='44'></td><td><span> </span><span class='pt17'>match</span><span> </span><span class='pt7'>self</span><span>.patterns[index] {</span></td></tr>
<tr><td class='ln' data-ln='45'></td><td><span> Pattern</span><span class='pt17'>::</span><span>Match(</span><span class='pt17'>ref</span><span> </span><span class='pt17'>mut</span><span> match_pat) </span><span class='pt17'>=></span><span> match_pat,</span></td></tr>
<tr><td class='ln' data-ln='46'></td><td><span> _ </span><span class='pt17'>=></span><span> </span><span class='pt7'>panic!</span><span>(</span><span class='pt8'>"bad index to match_at"</span><span>),</span></td></tr>
<tr><td class='ln' data-ln='47'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='48'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='49'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='50'></td><td> </td></tr>
<tr><td class='ln' data-ln='51'></td><td><span class='pt17'>impl</span><span> </span><span class='pt13'>ContextReference</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='52'></td><td><span> </span><span class='pt12'>/// find the pointed to context, panics if ref is not linked</span></td></tr>
<tr><td class='ln' data-ln='53'></td><td><span> </span><span class='pt17'>pub</span><span> </span><span class='pt17'>fn</span><span> </span><span class='pt13'>resolve</span><span>(</span><span class='pt17'>&</span><span class='pt7'>self</span><span>) -> ContextPtr {</span></td></tr>
<tr><td class='ln' data-ln='54'></td><td><span> </span><span class='pt17'>match</span><span> </span><span class='pt17'>*</span><span class='pt7'>self</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='55'></td><td><span> ContextReference</span><span class='pt17'>::</span><span>Inline(</span><span class='pt17'>ref</span><span> ptr) </span><span class='pt17'>=></span><span> ptr.</span><span class='pt13'>clone</span><span>(),</span></td></tr>
<tr><td class='ln' data-ln='56'></td><td><span> ContextReference</span><span class='pt17'>::</span><span>Direct(</span><span class='pt17'>ref</span><span> ptr) </span><span class='pt17'>=></span><span> ptr.link.</span><span class='pt13'>upgrade</span><span>().</span><span class='pt13'>unwrap</span><span>(),</span></td></tr>
<tr><td class='ln' data-ln='57'></td><td><span> _ </span><span class='pt17'>=></span><span> </span><span class='pt7'>panic!</span><span>(</span><span class='pt8'>"Can only call resolve on linked references: </span><span class='pt7'>{:?}</span><span class='pt8'>"</span><span>, </span><span class='pt7'>self</span><span>),</span></td></tr>
<tr><td class='ln' data-ln='58'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='59'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='60'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='61'></td><td> </td></tr>
<tr><td class='ln' data-ln='62'></td><td><span class='pt17'>impl</span><span> </span><span class='pt13'>MatchPattern</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='63'></td><td><span> </span><span class='pt12'>/// substitutes back-refs in Regex with regions from s</span></td></tr>
<tr><td class='ln' data-ln='64'></td><td><span> </span><span class='pt12'>/// used for match patterns which refer to captures from the pattern</span></td></tr>
<tr><td class='ln' data-ln='65'></td><td><span> </span><span class='pt12'>/// that pushed them.</span></td></tr>
<tr><td class='ln' data-ln='66'></td><td><span> </span><span class='pt17'>pub</span><span> </span><span class='pt17'>fn</span><span> </span><span class='pt13'>regex_with_substitutes</span><span>(</span><span class='pt17'>&</span><span class='pt7'>self</span><span>, </span><span class='pt10'>region</span><span>: </span><span class='pt17'>&</span><span>Region, </span><span class='pt10'>s</span><span>: </span><span class='pt17'>&str</span><span>) -> </span><span class='pt17'>String</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='67'></td><td><span> </span><span class='pt17'>let</span><span> </span><span class='pt17'>mut</span><span> reg_str </span><span class='pt17'>=</span><span> </span><span class='pt17'>String::</span><span class='pt13'>new</span><span>();</span></td></tr>
<tr><td class='ln' data-ln='68'></td><td><span> </span><span class='pt17'>let</span><span> </span><span class='pt17'>mut</span><span> last_was_escape </span><span class='pt17'>=</span><span> </span><span class='pt7'>false</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='69'></td><td> </td></tr>
<tr><td class='ln' data-ln='70'></td><td><span> </span><span class='pt17'>for</span><span> c </span><span class='pt17'>in</span><span> </span><span class='pt7'>self</span><span>.regex_str.</span><span class='pt13'>chars</span><span>() {</span></td></tr>
<tr><td class='ln' data-ln='71'></td><td><span> </span><span class='pt17'>if</span><span> last_was_escape </span><span class='pt17'>&&</span><span> c.</span><span class='pt13'>is_digit</span><span>(</span><span class='pt7'>10</span><span>) {</span></td></tr>
<tr><td class='ln' data-ln='72'></td><td><span> </span><span class='pt17'>let</span><span> val </span><span class='pt17'>=</span><span> c.</span><span class='pt13'>to_digit</span><span>(</span><span class='pt7'>10</span><span>).</span><span class='pt13'>unwrap</span><span>();</span></td></tr>
<tr><td class='ln' data-ln='73'></td><td> </td></tr>
<tr><td class='ln' data-ln='74'></td><td><span> </span><span class='pt17'>if</span><span> </span><span class='pt17'>let</span><span> </span><span class='pt7'>Some</span><span>((start, end)) </span><span class='pt17'>=</span><span> region.</span><span class='pt13'>pos</span><span>(val </span><span class='pt17'>as</span><span> </span><span class='pt17'>usize</span><span>) {</span></td></tr>
<tr><td class='ln' data-ln='75'></td><td><span> </span><span class='pt17'>let</span><span> escaped </span><span class='pt17'>=</span><span> </span><span class='pt13'>escape</span><span>(</span><span class='pt17'>&</span><span>s[start</span><span class='pt17'>..</span><span>end]);</span></td></tr>
<tr><td class='ln' data-ln='76'></td><td><span> reg_str.</span><span class='pt13'>push_str</span><span>(</span><span class='pt17'>&</span><span>escaped);</span></td></tr>
<tr><td class='ln' data-ln='77'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='78'></td><td><span> } </span><span class='pt17'>else</span><span> </span><span class='pt17'>if</span><span> last_was_escape {</span></td></tr>
<tr><td class='ln' data-ln='79'></td><td><span> reg_str.</span><span class='pt13'>push</span><span>(</span><span class='pt8'>'</span><span class='pt7'>\\</span><span class='pt8'>'</span><span>);</span></td></tr>
<tr><td class='ln' data-ln='80'></td><td><span> reg_str.</span><span class='pt13'>push</span><span>(c);</span></td></tr>
<tr><td class='ln' data-ln='81'></td><td><span> } </span><span class='pt17'>else</span><span> </span><span class='pt17'>if</span><span> c </span><span class='pt17'>!=</span><span> </span><span class='pt8'>'</span><span class='pt7'>\\</span><span class='pt8'>'</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='82'></td><td><span> reg_str.</span><span class='pt13'>push</span><span>(c);</span></td></tr>
<tr><td class='ln' data-ln='83'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='84'></td><td> </td></tr>
<tr><td class='ln' data-ln='85'></td><td><span> last_was_escape </span><span class='pt17'>=</span><span> c </span><span class='pt17'>==</span><span> </span><span class='pt8'>'</span><span class='pt7'>\\</span><span class='pt8'>'</span><span> </span><span class='pt17'>&&</span><span> </span><span class='pt17'>!</span><span>last_was_escape;</span></td></tr>
<tr><td class='ln' data-ln='86'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='87'></td><td><span> reg_str</span></td></tr>
<tr><td class='ln' data-ln='88'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='89'></td><td> </td></tr>
<tr><td class='ln' data-ln='90'></td><td><span> </span><span class='pt12'>/// Makes sure the regex is compiled if it doesn't have captures.</span></td></tr>
<tr><td class='ln' data-ln='91'></td><td><span> </span><span class='pt12'>/// May compile the regex if it isn't, panicing if compilation fails.</span></td></tr>
<tr><td class='ln' data-ln='92'></td><td><span> #[inline]</span></td></tr>
<tr><td class='ln' data-ln='93'></td><td><span> </span><span class='pt17'>pub</span><span> </span><span class='pt17'>fn</span><span> </span><span class='pt13'>ensure_compiled_if_possible</span><span>(</span><span class='pt17'>&mut</span><span> </span><span class='pt7'>self</span><span>) {</span></td></tr>
<tr><td class='ln' data-ln='94'></td><td><span> </span><span class='pt17'>if</span><span> </span><span class='pt7'>self</span><span>.regex.</span><span class='pt13'>is_none</span><span>() </span><span class='pt17'>&&</span><span> </span><span class='pt17'>!</span><span class='pt7'>self</span><span>.has_captures {</span></td></tr>
<tr><td class='ln' data-ln='95'></td><td><span> </span><span class='pt7'>self</span><span>.</span><span class='pt13'>compile_regex</span><span>();</span></td></tr>
<tr><td class='ln' data-ln='96'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='97'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='98'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='99'></td><td> </td></tr>
<tr><td class='ln' data-ln='100'></td><td><span class='pt12'>/// This wrapper only exists so that I can implement a serialization</span></td></tr>
<tr><td class='ln' data-ln='101'></td><td><span class='pt12'>/// trait that crashes if you try and serialize this.</span></td></tr>
<tr><td class='ln' data-ln='102'></td><td><span>#[</span><span class='pt13'>derive</span><span>(</span><span class='pt17'>Debug</span><span>)]</span></td></tr>
<tr><td class='ln' data-ln='103'></td><td><span class='pt17'>pub</span><span> </span><span class='pt17'>struct</span><span> </span><span class='pt13'>LinkerLink</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='104'></td><td><span> </span><span class='pt17'>pub</span><span> </span><span class='pt10'>link</span><span>: Weak</span><span class='pt17'><</span><span>RefCell</span><span class='pt17'><</span><span>Context</span><span class='pt17'>>></span><span>,</span></td></tr>
<tr><td class='ln' data-ln='105'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='106'></td><td> </td></tr>
<tr><td class='ln' data-ln='107'></td><td><span class='pt17'>impl</span><span> </span><span class='pt17'>Eq</span><span> </span><span class='pt17'>for</span><span> </span><span class='pt13'>LinkerLink</span><span> {}</span></td></tr>
<tr><td class='ln' data-ln='108'></td><td> </td></tr>
<tr><td class='ln' data-ln='109'></td><td><span class='pt17'>impl</span><span> </span><span class='pt17'>PartialEq</span><span> </span><span class='pt17'>for</span><span> </span><span class='pt13'>LinkerLink</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='110'></td><td><span> </span><span class='pt17'>fn</span><span> </span><span class='pt13'>eq</span><span>(</span><span class='pt17'>&</span><span class='pt7'>self</span><span>, </span><span class='pt10'>other</span><span>: </span><span class='pt17'>&</span><span>LinkerLink) -> </span><span class='pt17'>bool</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='111'></td><td><span> </span><span class='pt7'>self</span><span>.link.</span><span class='pt13'>upgrade</span><span>() </span><span class='pt17'>==</span><span> other.link.</span><span class='pt13'>upgrade</span><span>()</span></td></tr>
<tr><td class='ln' data-ln='112'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='113'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='114'></td><td> </td></tr>
<tr><td class='ln' data-ln='115'></td><td><span class='pt12'>/// Just panics, we can't do anything with linked up syntaxes</span></td></tr>
<tr><td class='ln' data-ln='116'></td><td><span class='pt17'>impl</span><span> Serialize </span><span class='pt17'>for</span><span> </span><span class='pt13'>LinkerLink</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='117'></td><td><span> </span><span class='pt17'>fn</span><span> </span><span class='pt13'>serialize</span><span class='pt17'><</span><span>S</span><span class='pt17'>></span><span>(</span><span class='pt17'>&</span><span class='pt7'>self</span><span>, </span><span class='pt17'>_</span><span>: S) -> </span><span class='pt17'>Result<S::</span><span class='pt7'>Ok</span><span>, </span><span class='pt17'>S::</span><span>Error</span><span class='pt17'>></span><span> </span><span class='pt17'>where</span><span> S: Serializer {</span></td></tr>
<tr><td class='ln' data-ln='118'></td><td><span> </span><span class='pt7'>panic!</span><span>(</span><span class='pt8'>"Can't serialize syntax definitions which have been linked"</span><span>);</span></td></tr>
<tr><td class='ln' data-ln='119'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='120'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='121'></td><td> </td></tr>
<tr><td class='ln' data-ln='122'></td><td><span class='pt12'>/// Just panics, we can't do anything with linked up syntaxes</span></td></tr>
<tr><td class='ln' data-ln='123'></td><td><span class='pt17'>impl<</span><span class='pt13'>'de</span><span class='pt17'>></span><span> Deserialize</span><span class='pt17'><</span><span class='pt13'>'de</span><span class='pt17'>></span><span> </span><span class='pt17'>for</span><span> </span><span class='pt13'>LinkerLink</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='124'></td><td><span> </span><span class='pt17'>fn</span><span> </span><span class='pt13'>deserialize</span><span class='pt17'><</span><span>D</span><span class='pt17'>></span><span>(</span><span class='pt17'>_</span><span>: D) -> </span><span class='pt17'>Result<Self</span><span>, </span><span class='pt17'>D::</span><span>Error</span><span class='pt17'>></span><span> </span><span class='pt17'>where</span><span> D: Deserializer<'de> {</span></td></tr>
<tr><td class='ln' data-ln='125'></td><td><span> </span><span class='pt7'>panic!</span><span>(</span><span class='pt8'>"No linked syntax should ever have gotten serialized"</span><span>);</span></td></tr>
<tr><td class='ln' data-ln='126'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='127'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='128'></td><td> </td></tr>
<tr><td class='ln' data-ln='129'></td><td> </td></tr>
<tr><td class='ln' data-ln='130'></td><td><span class='pt12'>/// Serialize the provided map in natural key order, so that it's deterministic when dumping.</span></td></tr>
<tr><td class='ln' data-ln='131'></td><td><span class='pt17'>fn</span><span> </span><span class='pt13'>ordered_map</span><span class='pt17'><</span><span>K, V, S</span><span class='pt17'>></span><span>(</span><span class='pt10'>map</span><span>: </span><span class='pt17'>&HashMap<</span><span>K, V</span><span class='pt17'>></span><span>, </span><span class='pt10'>serializer</span><span>: S) -> </span><span class='pt17'>Result<S::</span><span class='pt7'>Ok</span><span>, </span><span class='pt17'>S::</span><span>Error</span><span class='pt17'>></span></td></tr>
<tr><td class='ln' data-ln='132'></td><td><span> </span><span class='pt17'>where</span><span> S: Serializer, K: Eq + Hash + Ord + Serialize, V: Serialize</span></td></tr>
<tr><td class='ln' data-ln='133'></td><td><span>{</span></td></tr>
<tr><td class='ln' data-ln='134'></td><td><span> </span><span class='pt17'>let</span><span> ordered: BTreeMap</span><span class='pt17'><_</span><span>, </span><span class='pt17'>_></span><span> </span><span class='pt17'>=</span><span> map.</span><span class='pt13'>iter</span><span>().</span><span class='pt13'>collect</span><span>();</span></td></tr>
<tr><td class='ln' data-ln='135'></td><td><span> ordered.</span><span class='pt13'>serialize</span><span>(serializer)</span></td></tr>
<tr><td class='ln' data-ln='136'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='137'></td><td> </td></tr>
<tr><td class='ln' data-ln='138'></td><td> </td></tr>
<tr><td class='ln' data-ln='139'></td><td><span>#[</span><span class='pt13'>cfg</span><span>(test)]</span></td></tr>
<tr><td class='ln' data-ln='140'></td><td><span class='pt17'>mod</span><span> </span><span class='pt13'>tests</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='141'></td><td><span> </span><span class='pt17'>use</span><span> </span><span class='pt17'>super::*</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='142'></td><td> </td></tr>
<tr><td class='ln' data-ln='143'></td><td><span> #[test]</span></td></tr>
<tr><td class='ln' data-ln='144'></td><td><span> </span><span class='pt17'>fn</span><span> </span><span class='pt13'>can_compile_refs</span><span>() {</span></td></tr>
<tr><td class='ln' data-ln='145'></td><td><span> </span><span class='pt17'>use</span><span> onig</span><span class='pt17'>::</span><span>{SearchOptions, Regex, Region};</span></td></tr>
<tr><td class='ln' data-ln='146'></td><td> </td></tr>
<tr><td class='ln' data-ln='147'></td><td><span> </span><span class='pt17'>let</span><span> pat </span><span class='pt17'>=</span><span> MatchPattern {</span></td></tr>
<tr><td class='ln' data-ln='148'></td><td><span> has_captures: </span><span class='pt7'>true</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='149'></td><td><span> regex_str: </span><span class='pt17'>String::</span><span class='pt13'>from</span><span>(</span><span class='pt17'>r</span><span class='pt8'>"lol \\ \2 \1 '\9' \wz"</span><span>),</span></td></tr>
<tr><td class='ln' data-ln='150'></td><td><span> regex: </span><span class='pt7'>None</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='151'></td><td><span> scope: </span><span class='pt7'>vec!</span><span>[],</span></td></tr>
<tr><td class='ln' data-ln='152'></td><td><span> captures: </span><span class='pt7'>None</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='153'></td><td><span> operation: MatchOperation</span><span class='pt17'>::</span><span class='pt7'>None</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='154'></td><td><span> with_prototype: </span><span class='pt7'>None</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='155'></td><td><span> };</span></td></tr>
<tr><td class='ln' data-ln='156'></td><td> </td></tr>
<tr><td class='ln' data-ln='157'></td><td><span> </span><span class='pt17'>let</span><span> r </span><span class='pt17'>=</span><span> Regex</span><span class='pt17'>::</span><span class='pt13'>new</span><span>(</span><span class='pt17'>r</span><span class='pt8'>"(\\\[\]\(\))(b)(c)(d)(e)"</span><span>).</span><span class='pt13'>unwrap</span><span>();</span></td></tr>
<tr><td class='ln' data-ln='158'></td><td><span> </span><span class='pt17'>let</span><span> </span><span class='pt17'>mut</span><span> region </span><span class='pt17'>=</span><span> Region</span><span class='pt17'>::</span><span class='pt13'>new</span><span>();</span></td></tr>
<tr><td class='ln' data-ln='159'></td><td><span> </span><span class='pt17'>let</span><span> s </span><span class='pt17'>=</span><span> </span><span class='pt17'>r</span><span class='pt8'>"\[]()bcde"</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='160'></td><td> </td></tr>
<tr><td class='ln' data-ln='161'></td><td><span> </span><span class='pt7'>assert!</span><span>(r.</span><span class='pt13'>match_with_options</span><span>(s, </span><span class='pt7'>0</span><span>, SearchOptions</span><span class='pt17'>::</span><span class='pt7'>SEARCH_OPTION_NONE</span><span>, </span><span class='pt7'>Some</span><span>(</span><span class='pt17'>&mut</span><span> region)).</span><span class='pt13'>is_some</span><span>());</span></td></tr>
<tr><td class='ln' data-ln='162'></td><td> </td></tr>
<tr><td class='ln' data-ln='163'></td><td><span> </span><span class='pt17'>let</span><span> regex_res </span><span class='pt17'>=</span><span> pat.</span><span class='pt13'>regex_with_substitutes</span><span>(</span><span class='pt17'>&</span><span>region, s);</span></td></tr>
<tr><td class='ln' data-ln='164'></td><td><span> </span><span class='pt7'>assert_eq!</span><span>(regex_res, </span><span class='pt17'>r</span><span class='pt8'>"lol \\ b \\\[\]\(\) '' \wz"</span><span>);</span></td></tr>
<tr><td class='ln' data-ln='165'></td><td><span> pat.</span><span class='pt13'>compile_with_refs</span><span>(</span><span class='pt17'>&</span><span>region, s);</span></td></tr>
<tr><td class='ln' data-ln='166'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='167'></td><td><span>}</span></td></tr>
</table>
</div>
</div>
</div>
<div class='style' id='P--monokai_extended--rs'>
<div class='P--monokai_extended-bordered'>
<div class="info header">
<span class="left">syntax_definition.rs</span>
<span class="right"><span>167 lines</span><span>5.55 KB</span></span>
</div>
<div class='P--monokai_extended'>
<table>
<tr><td class='ln' data-ln='1'></td><td><span class='pt32'>use</span><span> std</span><span class='pt32'>::</span><span>collections</span><span class='pt32'>::</span><span>{BTreeMap, HashMap};</span></td></tr>
<tr><td class='ln' data-ln='2'></td><td><span class='pt32'>use</span><span> std</span><span class='pt32'>::</span><span>hash</span><span class='pt32'>::</span><span>Hash;</span></td></tr>
<tr><td class='ln' data-ln='3'></td><td><span class='pt32'>use</span><span> onig</span><span class='pt32'>::</span><span>{Regex, RegexOptions, Region, Syntax};</span></td></tr>
<tr><td class='ln' data-ln='4'></td><td><span class='pt32'>use</span><span> std</span><span class='pt32'>::</span><span>rc</span><span class='pt32'>::</span><span>{Rc, Weak};</span></td></tr>
<tr><td class='ln' data-ln='5'></td><td><span class='pt32'>use</span><span> std</span><span class='pt32'>::</span><span>cell</span><span class='pt32'>::</span><span>RefCell;</span></td></tr>
<tr><td class='ln' data-ln='6'></td><td><span class='pt32'>use</span><span> </span><span class='pt32'>super::</span><span>scope</span><span class='pt32'>::*</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='7'></td><td><span class='pt32'>use</span><span> regex_syntax</span><span class='pt32'>::</span><span>escape;</span></td></tr>
<tr><td class='ln' data-ln='8'></td><td class='hi'><span class='pt32'>use</span><span> serde</span><span class='pt32'>::</span><span>{Deserialize, Deserializer, Serialize, Serializer};</span></td></tr>
<tr><td class='ln' data-ln='9'></td><td> </td></tr>
<tr><td class='ln' data-ln='10'></td><td><span class='pt10'>/// The main data structure representing a syntax definition loaded from a</span></td></tr>
<tr><td class='ln' data-ln='11'></td><td><span class='pt10'>/// `.sublime-syntax` file. You'll probably only need these as references</span></td></tr>
<tr><td class='ln' data-ln='12'></td><td><span class='pt10'>/// to be passed around to parsing code.</span></td></tr>
<tr><td class='ln' data-ln='13'></td><td><span class='pt10'>///</span></td></tr>
<tr><td class='ln' data-ln='14'></td><td><span class='pt10'>/// Some useful public fields are the `name` field which is a human readable</span></td></tr>
<tr><td class='ln' data-ln='15'></td><td><span class='pt10'>/// name to display in syntax lists, and the `hidden` field which means hide</span></td></tr>
<tr><td class='ln' data-ln='16'></td><td><span class='pt10'>/// this syntax from any lists because it is for internal use.</span></td></tr>
<tr><td class='ln' data-ln='17'></td><td><span>#[</span><span class='pt13'>derive</span><span class='pt36'>(</span><span class='pt13 it'>Clone</span><span>, </span><span class='pt13 it'>Debug</span><span>, </span><span class='pt13 it'>Eq</span><span>, </span><span class='pt13 it'>PartialEq</span><span>, Serialize, Deserialize</span><span class='pt36'>)</span><span>]</span></td></tr>
<tr><td class='ln' data-ln='18'></td><td><span class='pt32'>pub</span><span> </span><span class='pt9 it'>struct</span><span> </span><span class='pt13'>SyntaxDefinition</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='19'></td><td class='hi'><span> </span><span class='pt32'>pub</span><span> </span><span class='pt36'>name</span><span>: </span><span class='pt13 it'>String</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='20'></td><td class='hi'><span> </span><span class='pt32'>pub</span><span> </span><span class='pt36'>file_extensions</span><span>: </span><span class='pt13 it'>Vec</span><span class='pt32'><</span><span class='pt13 it'>String</span><span class='pt32'>></span><span>,</span></td></tr>
<tr><td class='ln' data-ln='21'></td><td class='hi'><span> </span><span class='pt32'>pub</span><span> </span><span class='pt36'>scope</span><span>: Scope,</span></td></tr>
<tr><td class='ln' data-ln='22'></td><td class='hi'><span> </span><span class='pt32'>pub</span><span> </span><span class='pt36'>first_line_match</span><span>: </span><span class='pt13 it'>Option</span><span class='pt32'><</span><span class='pt13 it'>String</span><span class='pt32'>></span><span>,</span></td></tr>
<tr><td class='ln' data-ln='23'></td><td class='hi'><span> </span><span class='pt32'>pub</span><span> </span><span class='pt36'>hidden</span><span>: </span><span class='pt9 it'>bool</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='24'></td><td><span> </span><span class='pt10'>/// Filled in at link time to avoid serializing it multiple times</span></td></tr>
<tr><td class='ln' data-ln='25'></td><td><span> #[</span><span class='pt13'>serde</span><span class='pt36'>(</span><span>skip_serializing, skip_deserializing</span><span class='pt36'>)</span><span>]</span></td></tr>
<tr><td class='ln' data-ln='26'></td><td><span> </span><span class='pt32'>pub</span><span> </span><span class='pt36'>prototype</span><span>: </span><span class='pt13 it'>Option</span><span class='pt32'><</span><span>ContextPtr</span><span class='pt32'>></span><span>,</span></td></tr>
<tr><td class='ln' data-ln='27'></td><td><span> #[</span><span class='pt13'>serde</span><span class='pt36'>(</span><span>serialize_with </span><span class='pt32'>=</span><span> </span><span class='pt27'>"ordered_map"</span><span class='pt36'>)</span><span>]</span></td></tr>
<tr><td class='ln' data-ln='28'></td><td><span> </span><span class='pt32'>pub</span><span> </span><span class='pt36'>variables</span><span>: </span><span class='pt13 it'>HashMap</span><span class='pt32'><</span><span class='pt13 it'>String</span><span>, </span><span class='pt13 it'>String</span><span class='pt32'>></span><span>,</span></td></tr>
<tr><td class='ln' data-ln='29'></td><td><span> #[</span><span class='pt13'>serde</span><span class='pt36'>(</span><span>serialize_with </span><span class='pt32'>=</span><span> </span><span class='pt27'>"ordered_map"</span><span class='pt36'>)</span><span>]</span></td></tr>
<tr><td class='ln' data-ln='30'></td><td><span> </span><span class='pt32'>pub</span><span> </span><span class='pt36'>contexts</span><span>: </span><span class='pt13 it'>HashMap</span><span class='pt32'><</span><span class='pt13 it'>String</span><span>, ContextPtr</span><span class='pt32'>></span><span>,</span></td></tr>
<tr><td class='ln' data-ln='31'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='32'></td><td> </td></tr>
<tr><td class='ln' data-ln='33'></td><td><span class='pt9 it'>impl</span><span> </span><span class='pt13'>Context</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='34'></td><td><span> </span><span class='pt10'>/// Returns the match pattern at an index, panics if the thing isn't a match pattern</span></td></tr>
<tr><td class='ln' data-ln='35'></td><td><span> </span><span class='pt32'>pub</span><span> </span><span class='pt9 it'>fn</span><span> </span><span class='pt13'>match_at</span><span>(</span><span class='pt32'>&</span><span class='pt36'>self</span><span>, </span><span class='pt34 it'>index</span><span>: </span><span class='pt9 it'>usize</span><span>) -> </span><span class='pt32'>&</span><span>MatchPattern {</span></td></tr>
<tr><td class='ln' data-ln='36'></td><td><span> </span><span class='pt32'>match</span><span> </span><span class='pt36'>self</span><span>.patterns</span><span class='pt36'>[</span><span>index</span><span class='pt36'>]</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='37'></td><td><span> Pattern</span><span class='pt32'>::</span><span>Match</span><span class='pt36'>(</span><span class='pt32'>ref</span><span> match_pat</span><span class='pt36'>)</span><span> </span><span class='pt32'>=></span><span> match_pat,</span></td></tr>
<tr><td class='ln' data-ln='38'></td><td><span> _ </span><span class='pt32'>=></span><span> </span><span class='pt9'>panic!</span><span class='pt36'>(</span><span class='pt27'>"bad index to match_at"</span><span class='pt36'>)</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='39'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='40'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='41'></td><td> </td></tr>
<tr><td class='ln' data-ln='42'></td><td><span> </span><span class='pt10'>/// Returns a mutable reference, otherwise like `match_at`</span></td></tr>
<tr><td class='ln' data-ln='43'></td><td><span> </span><span class='pt32'>pub</span><span> </span><span class='pt9 it'>fn</span><span> </span><span class='pt13'>match_at_mut</span><span>(</span><span class='pt32'>&mut</span><span> </span><span class='pt36'>self</span><span>, </span><span class='pt34 it'>index</span><span>: </span><span class='pt9 it'>usize</span><span>) -> </span><span class='pt32'>&mut</span><span> MatchPattern {</span></td></tr>
<tr><td class='ln' data-ln='44'></td><td><span> </span><span class='pt32'>match</span><span> </span><span class='pt36'>self</span><span>.patterns</span><span class='pt36'>[</span><span>index</span><span class='pt36'>]</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='45'></td><td><span> Pattern</span><span class='pt32'>::</span><span>Match</span><span class='pt36'>(</span><span class='pt32'>ref</span><span> </span><span class='pt32'>mut</span><span> match_pat</span><span class='pt36'>)</span><span> </span><span class='pt32'>=></span><span> match_pat,</span></td></tr>
<tr><td class='ln' data-ln='46'></td><td><span> _ </span><span class='pt32'>=></span><span> </span><span class='pt9'>panic!</span><span class='pt36'>(</span><span class='pt27'>"bad index to match_at"</span><span class='pt36'>)</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='47'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='48'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='49'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='50'></td><td> </td></tr>
<tr><td class='ln' data-ln='51'></td><td><span class='pt9 it'>impl</span><span> </span><span class='pt13'>ContextReference</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='52'></td><td><span> </span><span class='pt10'>/// find the pointed to context, panics if ref is not linked</span></td></tr>
<tr><td class='ln' data-ln='53'></td><td><span> </span><span class='pt32'>pub</span><span> </span><span class='pt9 it'>fn</span><span> </span><span class='pt13'>resolve</span><span>(</span><span class='pt32'>&</span><span class='pt36'>self</span><span>) -> ContextPtr {</span></td></tr>
<tr><td class='ln' data-ln='54'></td><td><span> </span><span class='pt32'>match</span><span> </span><span class='pt32'>*</span><span class='pt36'>self</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='55'></td><td><span> ContextReference</span><span class='pt32'>::</span><span>Inline</span><span class='pt36'>(</span><span class='pt32'>ref</span><span> ptr</span><span class='pt36'>)</span><span> </span><span class='pt32'>=></span><span> ptr.</span><span class='pt13'>clone</span><span class='pt36'>()</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='56'></td><td><span> ContextReference</span><span class='pt32'>::</span><span>Direct</span><span class='pt36'>(</span><span class='pt32'>ref</span><span> ptr</span><span class='pt36'>)</span><span> </span><span class='pt32'>=></span><span> ptr.link.</span><span class='pt13'>upgrade</span><span class='pt36'>()</span><span>.</span><span class='pt13'>unwrap</span><span class='pt36'>()</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='57'></td><td><span> _ </span><span class='pt32'>=></span><span> </span><span class='pt9'>panic!</span><span class='pt36'>(</span><span class='pt27'>"Can only call resolve on linked references: </span><span class='pt17'>{:?}</span><span class='pt27'>"</span><span>, </span><span class='pt36'>self)</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='58'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='59'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='60'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='61'></td><td> </td></tr>
<tr><td class='ln' data-ln='62'></td><td><span class='pt9 it'>impl</span><span> </span><span class='pt13'>MatchPattern</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='63'></td><td><span> </span><span class='pt10'>/// substitutes back-refs in Regex with regions from s</span></td></tr>
<tr><td class='ln' data-ln='64'></td><td><span> </span><span class='pt10'>/// used for match patterns which refer to captures from the pattern</span></td></tr>
<tr><td class='ln' data-ln='65'></td><td><span> </span><span class='pt10'>/// that pushed them.</span></td></tr>
<tr><td class='ln' data-ln='66'></td><td><span> </span><span class='pt32'>pub</span><span> </span><span class='pt9 it'>fn</span><span> </span><span class='pt13'>regex_with_substitutes</span><span>(</span><span class='pt32'>&</span><span class='pt36'>self</span><span>, </span><span class='pt34 it'>region</span><span>: </span><span class='pt32'>&</span><span>Region, </span><span class='pt34 it'>s</span><span>: </span><span class='pt32'>&</span><span class='pt9 it'>str</span><span>) -> </span><span class='pt13 it'>String</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='67'></td><td><span> </span><span class='pt32 it'>let</span><span> </span><span class='pt32'>mut</span><span> reg_str </span><span class='pt32'>=</span><span> </span><span class='pt13 it'>String</span><span class='pt32'>::</span><span class='pt13'>new</span><span class='pt36'>()</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='68'></td><td><span> </span><span class='pt32 it'>let</span><span> </span><span class='pt32'>mut</span><span> last_was_escape </span><span class='pt32'>=</span><span> </span><span class='pt17'>false</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='69'></td><td> </td></tr>
<tr><td class='ln' data-ln='70'></td><td><span> </span><span class='pt32'>for</span><span> c </span><span class='pt32'>in</span><span> </span><span class='pt36'>self</span><span>.regex_str.</span><span class='pt13'>chars</span><span class='pt36'>()</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='71'></td><td><span> </span><span class='pt32'>if</span><span> last_was_escape </span><span class='pt32'>&&</span><span> c.</span><span class='pt13'>is_digit</span><span class='pt36'>(</span><span class='pt17'>10</span><span class='pt36'>)</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='72'></td><td><span> </span><span class='pt32 it'>let</span><span> val </span><span class='pt32'>=</span><span> c.</span><span class='pt13'>to_digit</span><span class='pt36'>(</span><span class='pt17'>10</span><span class='pt36'>)</span><span>.</span><span class='pt13'>unwrap</span><span class='pt36'>()</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='73'></td><td> </td></tr>
<tr><td class='ln' data-ln='74'></td><td><span> </span><span class='pt32'>if</span><span> </span><span class='pt32 it'>let</span><span> </span><span class='pt9'>Some</span><span class='pt36'>((</span><span>start, end</span><span class='pt36'>))</span><span> </span><span class='pt32'>=</span><span> region.</span><span class='pt13'>pos</span><span class='pt36'>(</span><span>val </span><span class='pt32'>as</span><span> </span><span class='pt9 it'>usize</span><span class='pt36'>)</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='75'></td><td><span> </span><span class='pt32 it'>let</span><span> escaped </span><span class='pt32'>=</span><span> </span><span class='pt13'>escape</span><span class='pt36'>(</span><span class='pt32'>&</span><span>s</span><span class='pt36'>[</span><span>start</span><span class='pt32'>..</span><span>end</span><span class='pt36'>])</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='76'></td><td><span> reg_str.</span><span class='pt13'>push_str</span><span class='pt36'>(</span><span class='pt32'>&</span><span>escaped</span><span class='pt36'>)</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='77'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='78'></td><td><span> } </span><span class='pt32'>else</span><span> </span><span class='pt32'>if</span><span> last_was_escape {</span></td></tr>
<tr><td class='ln' data-ln='79'></td><td><span> reg_str.</span><span class='pt13'>push</span><span class='pt36'>(</span><span class='pt27'>'</span><span class='pt17'>\\</span><span class='pt27'>'</span><span class='pt36'>)</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='80'></td><td><span> reg_str.</span><span class='pt13'>push</span><span class='pt36'>(</span><span>c</span><span class='pt36'>)</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='81'></td><td><span> } </span><span class='pt32'>else</span><span> </span><span class='pt32'>if</span><span> c </span><span class='pt32'>!=</span><span> </span><span class='pt27'>'</span><span class='pt17'>\\</span><span class='pt27'>'</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='82'></td><td><span> reg_str.</span><span class='pt13'>push</span><span class='pt36'>(</span><span>c</span><span class='pt36'>)</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='83'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='84'></td><td> </td></tr>
<tr><td class='ln' data-ln='85'></td><td><span> last_was_escape </span><span class='pt32'>=</span><span> c </span><span class='pt32'>==</span><span> </span><span class='pt27'>'</span><span class='pt17'>\\</span><span class='pt27'>'</span><span> </span><span class='pt32'>&&</span><span> </span><span class='pt32'>!</span><span>last_was_escape;</span></td></tr>
<tr><td class='ln' data-ln='86'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='87'></td><td><span> reg_str</span></td></tr>
<tr><td class='ln' data-ln='88'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='89'></td><td> </td></tr>
<tr><td class='ln' data-ln='90'></td><td><span> </span><span class='pt10'>/// Makes sure the regex is compiled if it doesn't have captures.</span></td></tr>
<tr><td class='ln' data-ln='91'></td><td><span> </span><span class='pt10'>/// May compile the regex if it isn't, panicing if compilation fails.</span></td></tr>
<tr><td class='ln' data-ln='92'></td><td><span> #[inline]</span></td></tr>
<tr><td class='ln' data-ln='93'></td><td><span> </span><span class='pt32'>pub</span><span> </span><span class='pt9 it'>fn</span><span> </span><span class='pt13'>ensure_compiled_if_possible</span><span>(</span><span class='pt32'>&mut</span><span> </span><span class='pt36'>self</span><span>) {</span></td></tr>
<tr><td class='ln' data-ln='94'></td><td><span> </span><span class='pt32'>if</span><span> </span><span class='pt36'>self</span><span>.regex.</span><span class='pt13'>is_none</span><span class='pt36'>()</span><span> </span><span class='pt32'>&&</span><span> </span><span class='pt32'>!</span><span class='pt36'>self</span><span>.has_captures {</span></td></tr>
<tr><td class='ln' data-ln='95'></td><td><span> </span><span class='pt36'>self</span><span>.</span><span class='pt13'>compile_regex</span><span class='pt36'>()</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='96'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='97'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='98'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='99'></td><td> </td></tr>
<tr><td class='ln' data-ln='100'></td><td><span class='pt10'>/// This wrapper only exists so that I can implement a serialization</span></td></tr>
<tr><td class='ln' data-ln='101'></td><td><span class='pt10'>/// trait that crashes if you try and serialize this.</span></td></tr>
<tr><td class='ln' data-ln='102'></td><td><span>#[</span><span class='pt13'>derive</span><span class='pt36'>(</span><span class='pt13 it'>Debug</span><span class='pt36'>)</span><span>]</span></td></tr>
<tr><td class='ln' data-ln='103'></td><td><span class='pt32'>pub</span><span> </span><span class='pt9 it'>struct</span><span> </span><span class='pt13'>LinkerLink</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='104'></td><td><span> </span><span class='pt32'>pub</span><span> </span><span class='pt36'>link</span><span>: Weak</span><span class='pt32'><</span><span>RefCell</span><span class='pt32'><</span><span>Context</span><span class='pt32'>>></span><span>,</span></td></tr>
<tr><td class='ln' data-ln='105'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='106'></td><td> </td></tr>
<tr><td class='ln' data-ln='107'></td><td><span class='pt9 it'>impl</span><span> </span><span class='pt13 it'>Eq</span><span> </span><span class='pt32'>for</span><span> </span><span class='pt13'>LinkerLink</span><span> {}</span></td></tr>
<tr><td class='ln' data-ln='108'></td><td> </td></tr>
<tr><td class='ln' data-ln='109'></td><td><span class='pt9 it'>impl</span><span> </span><span class='pt13 it'>PartialEq</span><span> </span><span class='pt32'>for</span><span> </span><span class='pt13'>LinkerLink</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='110'></td><td><span> </span><span class='pt9 it'>fn</span><span> </span><span class='pt13'>eq</span><span>(</span><span class='pt32'>&</span><span class='pt36'>self</span><span>, </span><span class='pt34 it'>other</span><span>: </span><span class='pt32'>&</span><span>LinkerLink) -> </span><span class='pt9 it'>bool</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='111'></td><td><span> </span><span class='pt36'>self</span><span>.link.</span><span class='pt13'>upgrade</span><span class='pt36'>()</span><span> </span><span class='pt32'>==</span><span> other.link.</span><span class='pt13'>upgrade</span><span class='pt36'>()</span></td></tr>
<tr><td class='ln' data-ln='112'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='113'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='114'></td><td> </td></tr>
<tr><td class='ln' data-ln='115'></td><td><span class='pt10'>/// Just panics, we can't do anything with linked up syntaxes</span></td></tr>
<tr><td class='ln' data-ln='116'></td><td><span class='pt9 it'>impl</span><span> Serialize </span><span class='pt32'>for</span><span> </span><span class='pt13'>LinkerLink</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='117'></td><td><span> </span><span class='pt9 it'>fn</span><span> </span><span class='pt13'>serialize</span><span class='pt32'><</span><span>S</span><span class='pt32'>></span><span>(</span><span class='pt32'>&</span><span class='pt36'>self</span><span>, </span><span class='pt32'>_</span><span>: S) -> </span><span class='pt13 it'>Result</span><span class='pt32'><</span><span class='pt9 it'>S::</span><span class='pt9'>Ok</span><span>, </span><span class='pt9 it'>S::</span><span>Error</span><span class='pt32'>></span><span> </span><span class='pt32'>where</span><span> S: Serializer {</span></td></tr>
<tr><td class='ln' data-ln='118'></td><td><span> </span><span class='pt9'>panic!</span><span class='pt36'>(</span><span class='pt27'>"Can't serialize syntax definitions which have been linked"</span><span class='pt36'>)</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='119'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='120'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='121'></td><td> </td></tr>
<tr><td class='ln' data-ln='122'></td><td><span class='pt10'>/// Just panics, we can't do anything with linked up syntaxes</span></td></tr>
<tr><td class='ln' data-ln='123'></td><td><span class='pt9 it'>impl</span><span class='pt32'><'de></span><span> Deserialize</span><span class='pt32'><'de></span><span> </span><span class='pt32'>for</span><span> </span><span class='pt13'>LinkerLink</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='124'></td><td><span> </span><span class='pt9 it'>fn</span><span> </span><span class='pt13'>deserialize</span><span class='pt32'><</span><span>D</span><span class='pt32'>></span><span>(</span><span class='pt32'>_</span><span>: D) -> </span><span class='pt13 it'>Result</span><span class='pt32'><</span><span class='pt9 it'>Self</span><span>, </span><span class='pt9 it'>D::</span><span>Error</span><span class='pt32'>></span><span> </span><span class='pt32'>where</span><span> D: Deserializer<'de> {</span></td></tr>
<tr><td class='ln' data-ln='125'></td><td><span> </span><span class='pt9'>panic!</span><span class='pt36'>(</span><span class='pt27'>"No linked syntax should ever have gotten serialized"</span><span class='pt36'>)</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='126'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='127'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='128'></td><td> </td></tr>
<tr><td class='ln' data-ln='129'></td><td> </td></tr>
<tr><td class='ln' data-ln='130'></td><td><span class='pt10'>/// Serialize the provided map in natural key order, so that it's deterministic when dumping.</span></td></tr>
<tr><td class='ln' data-ln='131'></td><td><span class='pt9 it'>fn</span><span> </span><span class='pt13'>ordered_map</span><span class='pt32'><</span><span>K, V, S</span><span class='pt32'>></span><span>(</span><span class='pt34 it'>map</span><span>: </span><span class='pt32'>&</span><span class='pt13 it'>HashMap</span><span class='pt32'><</span><span>K, V</span><span class='pt32'>></span><span>, </span><span class='pt34 it'>serializer</span><span>: S) -> </span><span class='pt13 it'>Result</span><span class='pt32'><</span><span class='pt9 it'>S::</span><span class='pt9'>Ok</span><span>, </span><span class='pt9 it'>S::</span><span>Error</span><span class='pt32'>></span></td></tr>
<tr><td class='ln' data-ln='132'></td><td><span> </span><span class='pt32'>where</span><span> S: Serializer, K: Eq + Hash + Ord + Serialize, V: Serialize</span></td></tr>
<tr><td class='ln' data-ln='133'></td><td><span>{</span></td></tr>
<tr><td class='ln' data-ln='134'></td><td><span> </span><span class='pt32 it'>let</span><span> ordered: BTreeMap</span><span class='pt32'><_</span><span>, </span><span class='pt32'>_></span><span> </span><span class='pt32'>=</span><span> map.</span><span class='pt13'>iter</span><span class='pt36'>()</span><span>.</span><span class='pt13'>collect</span><span class='pt36'>()</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='135'></td><td><span> ordered.</span><span class='pt13'>serialize</span><span class='pt36'>(</span><span>serializer</span><span class='pt36'>)</span></td></tr>
<tr><td class='ln' data-ln='136'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='137'></td><td> </td></tr>
<tr><td class='ln' data-ln='138'></td><td> </td></tr>
<tr><td class='ln' data-ln='139'></td><td><span>#[</span><span class='pt13'>cfg</span><span class='pt36'>(</span><span>test</span><span class='pt36'>)</span><span>]</span></td></tr>
<tr><td class='ln' data-ln='140'></td><td><span class='pt9 it'>mod</span><span> </span><span class='pt13'>tests</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='141'></td><td><span> </span><span class='pt32'>use</span><span> </span><span class='pt32'>super::*</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='142'></td><td> </td></tr>
<tr><td class='ln' data-ln='143'></td><td><span> #[test]</span></td></tr>
<tr><td class='ln' data-ln='144'></td><td><span> </span><span class='pt9 it'>fn</span><span> </span><span class='pt13'>can_compile_refs</span><span>() {</span></td></tr>
<tr><td class='ln' data-ln='145'></td><td><span> </span><span class='pt32'>use</span><span> onig</span><span class='pt32'>::</span><span>{SearchOptions, Regex, Region};</span></td></tr>
<tr><td class='ln' data-ln='146'></td><td> </td></tr>
<tr><td class='ln' data-ln='147'></td><td><span> </span><span class='pt32 it'>let</span><span> pat </span><span class='pt32'>=</span><span> MatchPattern {</span></td></tr>
<tr><td class='ln' data-ln='148'></td><td><span> has_captures: </span><span class='pt17'>true</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='149'></td><td><span> regex_str: </span><span class='pt13 it'>String</span><span class='pt32'>::</span><span class='pt13'>from</span><span class='pt36'>(</span><span class='pt9 it'>r</span><span class='pt27'>"lol \\ \2 \1 '\9' \wz"</span><span class='pt36'>)</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='150'></td><td><span> regex: </span><span class='pt9'>None</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='151'></td><td><span> scope: </span><span class='pt9'>vec!</span><span class='pt36'>[]</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='152'></td><td><span> captures: </span><span class='pt9'>None</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='153'></td><td><span> operation: MatchOperation</span><span class='pt32'>::</span><span class='pt9'>None</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='154'></td><td><span> with_prototype: </span><span class='pt9'>None</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='155'></td><td><span> };</span></td></tr>
<tr><td class='ln' data-ln='156'></td><td> </td></tr>
<tr><td class='ln' data-ln='157'></td><td><span> </span><span class='pt32 it'>let</span><span> r </span><span class='pt32'>=</span><span> Regex</span><span class='pt32'>::</span><span class='pt13'>new</span><span class='pt36'>(</span><span class='pt9 it'>r</span><span class='pt27'>"(\\\[\]\(\))(b)(c)(d)(e)"</span><span class='pt36'>)</span><span>.</span><span class='pt13'>unwrap</span><span class='pt36'>()</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='158'></td><td><span> </span><span class='pt32 it'>let</span><span> </span><span class='pt32'>mut</span><span> region </span><span class='pt32'>=</span><span> Region</span><span class='pt32'>::</span><span class='pt13'>new</span><span class='pt36'>()</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='159'></td><td><span> </span><span class='pt32 it'>let</span><span> s </span><span class='pt32'>=</span><span> </span><span class='pt9 it'>r</span><span class='pt27'>"\[]()bcde"</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='160'></td><td> </td></tr>
<tr><td class='ln' data-ln='161'></td><td><span> </span><span class='pt9'>assert!</span><span class='pt36'>(</span><span>r.</span><span class='pt13'>match_with_options</span><span class='pt36'>(</span><span>s, </span><span class='pt17'>0</span><span>, SearchOptions</span><span class='pt32'>::</span><span class='pt17'>SEARCH_OPTION_NONE</span><span>, </span><span class='pt9'>Some</span><span class='pt36'>(</span><span class='pt32'>&mut</span><span> region</span><span class='pt36'>))</span><span>.</span><span class='pt13'>is_some</span><span class='pt36'>())</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='162'></td><td> </td></tr>
<tr><td class='ln' data-ln='163'></td><td><span> </span><span class='pt32 it'>let</span><span> regex_res </span><span class='pt32'>=</span><span> pat.</span><span class='pt13'>regex_with_substitutes</span><span class='pt36'>(</span><span class='pt32'>&</span><span>region, s</span><span class='pt36'>)</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='164'></td><td><span> </span><span class='pt9'>assert_eq!</span><span class='pt36'>(</span><span>regex_res, </span><span class='pt9 it'>r</span><span class='pt27'>"lol \\ b \\\[\]\(\) '' \wz"</span><span class='pt36'>)</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='165'></td><td><span> pat.</span><span class='pt13'>compile_with_refs</span><span class='pt36'>(</span><span class='pt32'>&</span><span>region, s</span><span class='pt36'>)</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='166'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='167'></td><td><span>}</span></td></tr>
</table>
</div>
</div>
</div>
<div class='style' id='P--oceanic_next--rs'>
<div class='P--oceanic_next-bordered'>
<div class="info header">
<span class="left">syntax_definition.rs</span>
<span class="right"><span>167 lines</span><span>5.55 KB</span></span>
</div>
<div class='P--oceanic_next'>
<table>
<tr><td class='ln' data-ln='1'></td><td><span class='pt7'>use</span><span> std</span><span class='pt1'>::</span><span>collections</span><span class='pt1'>::{</span><span>BTreeMap, HashMap</span><span class='pt1'>};</span></td></tr>
<tr><td class='ln' data-ln='2'></td><td><span class='pt7'>use</span><span> std</span><span class='pt1'>::</span><span>hash</span><span class='pt1'>::</span><span>Hash</span><span class='pt1'>;</span></td></tr>
<tr><td class='ln' data-ln='3'></td><td><span class='pt7'>use</span><span> onig</span><span class='pt1'>::{</span><span>Regex, RegexOptions, Region, Syntax</span><span class='pt1'>};</span></td></tr>
<tr><td class='ln' data-ln='4'></td><td><span class='pt7'>use</span><span> std</span><span class='pt1'>::</span><span>rc</span><span class='pt1'>::{</span><span>Rc, Weak</span><span class='pt1'>};</span></td></tr>
<tr><td class='ln' data-ln='5'></td><td><span class='pt7'>use</span><span> std</span><span class='pt1'>::</span><span>cell</span><span class='pt1'>::</span><span>RefCell</span><span class='pt1'>;</span></td></tr>
<tr><td class='ln' data-ln='6'></td><td><span class='pt7'>use</span><span> </span><span class='pt7'>super</span><span class='pt1'>::</span><span>scope</span><span class='pt1'>::*;</span></td></tr>
<tr><td class='ln' data-ln='7'></td><td><span class='pt7'>use</span><span> regex_syntax</span><span class='pt1'>::</span><span>escape</span><span class='pt1'>;</span></td></tr>
<tr><td class='ln' data-ln='8'></td><td class='hi'><span class='pt7'>use</span><span> serde</span><span class='pt1'>::{</span><span>Deserialize, Deserializer, Serialize, Serializer</span><span class='pt1'>};</span></td></tr>
<tr><td class='ln' data-ln='9'></td><td> </td></tr>
<tr><td class='ln' data-ln='10'></td><td><span class='pt2'>/// The main data structure representing a syntax definition loaded from a</span></td></tr>
<tr><td class='ln' data-ln='11'></td><td><span class='pt2'>/// `.sublime-syntax` file. You'll probably only need these as references</span></td></tr>
<tr><td class='ln' data-ln='12'></td><td><span class='pt2'>/// to be passed around to parsing code.</span></td></tr>
<tr><td class='ln' data-ln='13'></td><td><span class='pt2'>///</span></td></tr>
<tr><td class='ln' data-ln='14'></td><td><span class='pt2'>/// Some useful public fields are the `name` field which is a human readable</span></td></tr>
<tr><td class='ln' data-ln='15'></td><td><span class='pt2'>/// name to display in syntax lists, and the `hidden` field which means hide</span></td></tr>
<tr><td class='ln' data-ln='16'></td><td><span class='pt2'>/// this syntax from any lists because it is for internal use.</span></td></tr>
<tr><td class='ln' data-ln='17'></td><td><span>#[</span><span class='pt3'>derive</span><span class='pt1'>(</span><span class='pt13'>Clone</span><span>, </span><span class='pt13'>Debug</span><span>, </span><span class='pt13'>Eq</span><span>, </span><span class='pt13'>PartialEq</span><span>, Serialize, Deserialize</span><span class='pt1'>)</span><span>]</span></td></tr>
<tr><td class='ln' data-ln='18'></td><td><span class='pt7'>pub</span><span> </span><span class='pt7'>struct</span><span> SyntaxDefinition </span><span class='pt1'>{</span></td></tr>
<tr><td class='ln' data-ln='19'></td><td class='hi'><span> </span><span class='pt7'>pub</span><span> name</span><span class='pt1'>:</span><span> </span><span class='pt13'>String</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='20'></td><td class='hi'><span> </span><span class='pt7'>pub</span><span> file_extensions</span><span class='pt1'>:</span><span> </span><span class='pt13'>Vec</span><span class='pt1'><</span><span class='pt13'>String</span><span class='pt1'>></span><span>,</span></td></tr>
<tr><td class='ln' data-ln='21'></td><td class='hi'><span> </span><span class='pt7'>pub</span><span> scope</span><span class='pt1'>:</span><span> Scope,</span></td></tr>
<tr><td class='ln' data-ln='22'></td><td class='hi'><span> </span><span class='pt7'>pub</span><span> first_line_match</span><span class='pt1'>:</span><span> </span><span class='pt13'>Option</span><span class='pt1'><</span><span class='pt13'>String</span><span class='pt1'>></span><span>,</span></td></tr>
<tr><td class='ln' data-ln='23'></td><td class='hi'><span> </span><span class='pt7'>pub</span><span> hidden</span><span class='pt1'>:</span><span> </span><span class='pt7'>bool</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='24'></td><td><span> </span><span class='pt2'>/// Filled in at link time to avoid serializing it multiple times</span></td></tr>
<tr><td class='ln' data-ln='25'></td><td><span> #[</span><span class='pt3'>serde</span><span class='pt1'>(</span><span>skip_serializing, skip_deserializing</span><span class='pt1'>)</span><span>]</span></td></tr>
<tr><td class='ln' data-ln='26'></td><td><span> </span><span class='pt7'>pub</span><span> prototype</span><span class='pt1'>:</span><span> </span><span class='pt13'>Option</span><span class='pt1'><</span><span>ContextPtr</span><span class='pt1'>></span><span>,</span></td></tr>
<tr><td class='ln' data-ln='27'></td><td><span> #[</span><span class='pt3'>serde</span><span class='pt1'>(</span><span>serialize_with </span><span class='pt1'>=</span><span> </span><span class='pt1'>"</span><span class='pt4'>ordered_map</span><span class='pt1'>")</span><span>]</span></td></tr>
<tr><td class='ln' data-ln='28'></td><td><span> </span><span class='pt7'>pub</span><span> variables</span><span class='pt1'>:</span><span> </span><span class='pt13'>HashMap</span><span class='pt1'><</span><span class='pt13'>String</span><span class='pt1'>,</span><span> </span><span class='pt13'>String</span><span class='pt1'>></span><span>,</span></td></tr>
<tr><td class='ln' data-ln='29'></td><td><span> #[</span><span class='pt3'>serde</span><span class='pt1'>(</span><span>serialize_with </span><span class='pt1'>=</span><span> </span><span class='pt1'>"</span><span class='pt4'>ordered_map</span><span class='pt1'>")</span><span>]</span></td></tr>
<tr><td class='ln' data-ln='30'></td><td><span> </span><span class='pt7'>pub</span><span> contexts</span><span class='pt1'>:</span><span> </span><span class='pt13'>HashMap</span><span class='pt1'><</span><span class='pt13'>String</span><span class='pt1'>,</span><span> ContextPtr</span><span class='pt1'>></span><span>,</span></td></tr>
<tr><td class='ln' data-ln='31'></td><td><span class='pt1'>}</span></td></tr>
<tr><td class='ln' data-ln='32'></td><td> </td></tr>
<tr><td class='ln' data-ln='33'></td><td><span class='pt7'>impl</span><span> Context </span><span class='pt1'>{</span></td></tr>
<tr><td class='ln' data-ln='34'></td><td><span> </span><span class='pt2'>/// Returns the match pattern at an index, panics if the thing isn't a match pattern</span></td></tr>
<tr><td class='ln' data-ln='35'></td><td><span> </span><span class='pt7'>pub</span><span> </span><span class='pt7'>fn</span><span> </span><span class='pt3'>match_at</span><span class='pt1'>(&</span><span class='pt10 it'>self</span><span>, </span><span class='pt12'>index</span><span class='pt1'>:</span><span> </span><span class='pt7'>usize</span><span class='pt1'>)</span><span> </span><span class='pt1'>-></span><span> </span><span class='pt1'>&</span><span>MatchPattern </span><span class='pt1'>{</span></td></tr>
<tr><td class='ln' data-ln='36'></td><td><span> </span><span class='pt7'>match</span><span> </span><span class='pt10 it'>self</span><span>.patterns</span><span class='pt1'>[</span><span>index</span><span class='pt1'>]</span><span> </span><span class='pt1'>{</span></td></tr>
<tr><td class='ln' data-ln='37'></td><td><span> Pattern</span><span class='pt1'>::</span><span>Match</span><span class='pt1'>(</span><span class='pt7'>ref</span><span> match_pat</span><span class='pt1'>)</span><span> </span><span class='pt1'>=></span><span> match_pat,</span></td></tr>
<tr><td class='ln' data-ln='38'></td><td><span> _ </span><span class='pt1'>=></span><span> </span><span class='pt1 it'>panic!</span><span class='pt1'>("</span><span class='pt4'>bad index to match_at</span><span class='pt1'>")</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='39'></td><td><span> </span><span class='pt1'>}</span></td></tr>
<tr><td class='ln' data-ln='40'></td><td><span> </span><span class='pt1'>}</span></td></tr>
<tr><td class='ln' data-ln='41'></td><td> </td></tr>
<tr><td class='ln' data-ln='42'></td><td><span> </span><span class='pt2'>/// Returns a mutable reference, otherwise like `match_at`</span></td></tr>
<tr><td class='ln' data-ln='43'></td><td><span> </span><span class='pt7'>pub</span><span> </span><span class='pt7'>fn</span><span> </span><span class='pt3'>match_at_mut</span><span class='pt1'>(&</span><span class='pt7'>mut</span><span> </span><span class='pt10 it'>self</span><span>, </span><span class='pt12'>index</span><span class='pt1'>:</span><span> </span><span class='pt7'>usize</span><span class='pt1'>)</span><span> </span><span class='pt1'>-></span><span> </span><span class='pt1'>&</span><span class='pt7'>mut</span><span> MatchPattern </span><span class='pt1'>{</span></td></tr>
<tr><td class='ln' data-ln='44'></td><td><span> </span><span class='pt7'>match</span><span> </span><span class='pt10 it'>self</span><span>.patterns</span><span class='pt1'>[</span><span>index</span><span class='pt1'>]</span><span> </span><span class='pt1'>{</span></td></tr>
<tr><td class='ln' data-ln='45'></td><td><span> Pattern</span><span class='pt1'>::</span><span>Match</span><span class='pt1'>(</span><span class='pt7'>ref</span><span> </span><span class='pt7'>mut</span><span> match_pat</span><span class='pt1'>)</span><span> </span><span class='pt1'>=></span><span> match_pat,</span></td></tr>
<tr><td class='ln' data-ln='46'></td><td><span> _ </span><span class='pt1'>=></span><span> </span><span class='pt1 it'>panic!</span><span class='pt1'>("</span><span class='pt4'>bad index to match_at</span><span class='pt1'>")</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='47'></td><td><span> </span><span class='pt1'>}</span></td></tr>
<tr><td class='ln' data-ln='48'></td><td><span> </span><span class='pt1'>}</span></td></tr>
<tr><td class='ln' data-ln='49'></td><td><span class='pt1'>}</span></td></tr>
<tr><td class='ln' data-ln='50'></td><td> </td></tr>
<tr><td class='ln' data-ln='51'></td><td><span class='pt7'>impl</span><span> ContextReference </span><span class='pt1'>{</span></td></tr>
<tr><td class='ln' data-ln='52'></td><td><span> </span><span class='pt2'>/// find the pointed to context, panics if ref is not linked</span></td></tr>
<tr><td class='ln' data-ln='53'></td><td><span> </span><span class='pt7'>pub</span><span> </span><span class='pt7'>fn</span><span> </span><span class='pt3'>resolve</span><span class='pt1'>(&</span><span class='pt10 it'>self</span><span class='pt1'>)</span><span> </span><span class='pt1'>-></span><span> ContextPtr </span><span class='pt1'>{</span></td></tr>
<tr><td class='ln' data-ln='54'></td><td><span> </span><span class='pt7'>match</span><span> </span><span class='pt1'>*</span><span class='pt10 it'>self</span><span> </span><span class='pt1'>{</span></td></tr>
<tr><td class='ln' data-ln='55'></td><td><span> ContextReference</span><span class='pt1'>::</span><span>Inline</span><span class='pt1'>(</span><span class='pt7'>ref</span><span> ptr</span><span class='pt1'>)</span><span> </span><span class='pt1'>=></span><span> ptr.</span><span class='pt3'>clone</span><span class='pt1'>()</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='56'></td><td><span> ContextReference</span><span class='pt1'>::</span><span>Direct</span><span class='pt1'>(</span><span class='pt7'>ref</span><span> ptr</span><span class='pt1'>)</span><span> </span><span class='pt1'>=></span><span> ptr.link.</span><span class='pt3'>upgrade</span><span class='pt1'>()</span><span>.</span><span class='pt3'>unwrap</span><span class='pt1'>()</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='57'></td><td><span> _ </span><span class='pt1'>=></span><span> </span><span class='pt1 it'>panic!</span><span class='pt1'>("</span><span class='pt4'>Can only call resolve on linked references: {:?}</span><span class='pt1'>"</span><span>, </span><span class='pt10 it'>self</span><span class='pt1'>)</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='58'></td><td><span> </span><span class='pt1'>}</span></td></tr>
<tr><td class='ln' data-ln='59'></td><td><span> </span><span class='pt1'>}</span></td></tr>
<tr><td class='ln' data-ln='60'></td><td><span class='pt1'>}</span></td></tr>
<tr><td class='ln' data-ln='61'></td><td> </td></tr>
<tr><td class='ln' data-ln='62'></td><td><span class='pt7'>impl</span><span> MatchPattern </span><span class='pt1'>{</span></td></tr>
<tr><td class='ln' data-ln='63'></td><td><span> </span><span class='pt2'>/// substitutes back-refs in Regex with regions from s</span></td></tr>
<tr><td class='ln' data-ln='64'></td><td><span> </span><span class='pt2'>/// used for match patterns which refer to captures from the pattern</span></td></tr>
<tr><td class='ln' data-ln='65'></td><td><span> </span><span class='pt2'>/// that pushed them.</span></td></tr>
<tr><td class='ln' data-ln='66'></td><td><span> </span><span class='pt7'>pub</span><span> </span><span class='pt7'>fn</span><span> </span><span class='pt3'>regex_with_substitutes</span><span class='pt1'>(&</span><span class='pt10 it'>self</span><span>, </span><span class='pt12'>region</span><span class='pt1'>:</span><span> </span><span class='pt1'>&</span><span>Region, </span><span class='pt12'>s</span><span class='pt1'>:</span><span> </span><span class='pt1'>&</span><span class='pt7'>str</span><span class='pt1'>)</span><span> </span><span class='pt1'>-></span><span> </span><span class='pt13'>String</span><span> </span><span class='pt1'>{</span></td></tr>
<tr><td class='ln' data-ln='67'></td><td><span> </span><span class='pt7'>let</span><span> </span><span class='pt7'>mut</span><span> reg_str </span><span class='pt1'>=</span><span> </span><span class='pt13'>String</span><span class='pt1'>::</span><span class='pt3'>new</span><span class='pt1'>();</span></td></tr>
<tr><td class='ln' data-ln='68'></td><td><span> </span><span class='pt7'>let</span><span> </span><span class='pt7'>mut</span><span> last_was_escape </span><span class='pt1'>=</span><span> </span><span class='pt12'>false</span><span class='pt1'>;</span></td></tr>
<tr><td class='ln' data-ln='69'></td><td> </td></tr>
<tr><td class='ln' data-ln='70'></td><td><span> </span><span class='pt7'>for</span><span> c </span><span class='pt1'>in</span><span> </span><span class='pt10 it'>self</span><span>.regex_str.</span><span class='pt3'>chars</span><span class='pt1'>()</span><span> </span><span class='pt1'>{</span></td></tr>
<tr><td class='ln' data-ln='71'></td><td><span> </span><span class='pt7'>if</span><span> last_was_escape </span><span class='pt1'>&&</span><span> c.</span><span class='pt3'>is_digit</span><span class='pt1'>(</span><span class='pt12'>10</span><span class='pt1'>)</span><span> </span><span class='pt1'>{</span></td></tr>
<tr><td class='ln' data-ln='72'></td><td><span> </span><span class='pt7'>let</span><span> val </span><span class='pt1'>=</span><span> c.</span><span class='pt3'>to_digit</span><span class='pt1'>(</span><span class='pt12'>10</span><span class='pt1'>)</span><span>.</span><span class='pt3'>unwrap</span><span class='pt1'>();</span></td></tr>
<tr><td class='ln' data-ln='73'></td><td> </td></tr>
<tr><td class='ln' data-ln='74'></td><td><span> </span><span class='pt7'>if</span><span> </span><span class='pt7'>let</span><span> </span><span class='pt12'>Some</span><span class='pt1'>((</span><span>start, end</span><span class='pt1'>))</span><span> </span><span class='pt1'>=</span><span> region.</span><span class='pt3'>pos</span><span class='pt1'>(</span><span>val </span><span class='pt1'>as</span><span> </span><span class='pt7'>usize</span><span class='pt1'>)</span><span> </span><span class='pt1'>{</span></td></tr>
<tr><td class='ln' data-ln='75'></td><td><span> </span><span class='pt7'>let</span><span> escaped </span><span class='pt1'>=</span><span> </span><span class='pt3'>escape</span><span class='pt1'>(&</span><span>s</span><span class='pt1'>[</span><span>start</span><span class='pt1'>..</span><span>end</span><span class='pt1'>]);</span></td></tr>
<tr><td class='ln' data-ln='76'></td><td><span> reg_str.</span><span class='pt3'>push_str</span><span class='pt1'>(&</span><span>escaped</span><span class='pt1'>);</span></td></tr>
<tr><td class='ln' data-ln='77'></td><td><span> </span><span class='pt1'>}</span></td></tr>
<tr><td class='ln' data-ln='78'></td><td><span> </span><span class='pt1'>}</span><span> </span><span class='pt7'>else</span><span> </span><span class='pt7'>if</span><span> last_was_escape </span><span class='pt1'>{</span></td></tr>
<tr><td class='ln' data-ln='79'></td><td><span> reg_str.</span><span class='pt3'>push</span><span class='pt1'>('\\');</span></td></tr>
<tr><td class='ln' data-ln='80'></td><td><span> reg_str.</span><span class='pt3'>push</span><span class='pt1'>(</span><span>c</span><span class='pt1'>);</span></td></tr>
<tr><td class='ln' data-ln='81'></td><td><span> </span><span class='pt1'>}</span><span> </span><span class='pt7'>else</span><span> </span><span class='pt7'>if</span><span> c </span><span class='pt1'>!=</span><span> </span><span class='pt1'>'\\'</span><span> </span><span class='pt1'>{</span></td></tr>
<tr><td class='ln' data-ln='82'></td><td><span> reg_str.</span><span class='pt3'>push</span><span class='pt1'>(</span><span>c</span><span class='pt1'>);</span></td></tr>
<tr><td class='ln' data-ln='83'></td><td><span> </span><span class='pt1'>}</span></td></tr>
<tr><td class='ln' data-ln='84'></td><td> </td></tr>
<tr><td class='ln' data-ln='85'></td><td><span> last_was_escape </span><span class='pt1'>=</span><span> c </span><span class='pt1'>==</span><span> </span><span class='pt1'>'\\'</span><span> </span><span class='pt1'>&&</span><span> </span><span class='pt1'>!</span><span>last_was_escape</span><span class='pt1'>;</span></td></tr>
<tr><td class='ln' data-ln='86'></td><td><span> </span><span class='pt1'>}</span></td></tr>
<tr><td class='ln' data-ln='87'></td><td><span> reg_str</span></td></tr>
<tr><td class='ln' data-ln='88'></td><td><span> </span><span class='pt1'>}</span></td></tr>
<tr><td class='ln' data-ln='89'></td><td> </td></tr>
<tr><td class='ln' data-ln='90'></td><td><span> </span><span class='pt2'>/// Makes sure the regex is compiled if it doesn't have captures.</span></td></tr>
<tr><td class='ln' data-ln='91'></td><td><span> </span><span class='pt2'>/// May compile the regex if it isn't, panicing if compilation fails.</span></td></tr>
<tr><td class='ln' data-ln='92'></td><td><span> #[inline]</span></td></tr>
<tr><td class='ln' data-ln='93'></td><td><span> </span><span class='pt7'>pub</span><span> </span><span class='pt7'>fn</span><span> </span><span class='pt3'>ensure_compiled_if_possible</span><span class='pt1'>(&</span><span class='pt7'>mut</span><span> </span><span class='pt10 it'>self</span><span class='pt1'>)</span><span> </span><span class='pt1'>{</span></td></tr>
<tr><td class='ln' data-ln='94'></td><td><span> </span><span class='pt7'>if</span><span> </span><span class='pt10 it'>self</span><span>.regex.</span><span class='pt3'>is_none</span><span class='pt1'>()</span><span> </span><span class='pt1'>&&</span><span> </span><span class='pt1'>!</span><span class='pt10 it'>self</span><span>.has_captures </span><span class='pt1'>{</span></td></tr>
<tr><td class='ln' data-ln='95'></td><td><span> </span><span class='pt10 it'>self</span><span>.</span><span class='pt3'>compile_regex</span><span class='pt1'>();</span></td></tr>
<tr><td class='ln' data-ln='96'></td><td><span> </span><span class='pt1'>}</span></td></tr>
<tr><td class='ln' data-ln='97'></td><td><span> </span><span class='pt1'>}</span></td></tr>
<tr><td class='ln' data-ln='98'></td><td><span class='pt1'>}</span></td></tr>
<tr><td class='ln' data-ln='99'></td><td> </td></tr>
<tr><td class='ln' data-ln='100'></td><td><span class='pt2'>/// This wrapper only exists so that I can implement a serialization</span></td></tr>
<tr><td class='ln' data-ln='101'></td><td><span class='pt2'>/// trait that crashes if you try and serialize this.</span></td></tr>
<tr><td class='ln' data-ln='102'></td><td><span>#[</span><span class='pt3'>derive</span><span class='pt1'>(</span><span class='pt13'>Debug</span><span class='pt1'>)</span><span>]</span></td></tr>
<tr><td class='ln' data-ln='103'></td><td><span class='pt7'>pub</span><span> </span><span class='pt7'>struct</span><span> LinkerLink </span><span class='pt1'>{</span></td></tr>
<tr><td class='ln' data-ln='104'></td><td><span> </span><span class='pt7'>pub</span><span> link</span><span class='pt1'>:</span><span> Weak</span><span class='pt1'><</span><span>RefCell</span><span class='pt1'><</span><span>Context</span><span class='pt1'>>></span><span>,</span></td></tr>
<tr><td class='ln' data-ln='105'></td><td><span class='pt1'>}</span></td></tr>
<tr><td class='ln' data-ln='106'></td><td> </td></tr>
<tr><td class='ln' data-ln='107'></td><td><span class='pt7'>impl</span><span> </span><span class='pt13'>Eq</span><span> </span><span class='pt7'>for</span><span> LinkerLink </span><span class='pt1'>{}</span></td></tr>
<tr><td class='ln' data-ln='108'></td><td> </td></tr>
<tr><td class='ln' data-ln='109'></td><td><span class='pt7'>impl</span><span> </span><span class='pt13'>PartialEq</span><span> </span><span class='pt7'>for</span><span> LinkerLink </span><span class='pt1'>{</span></td></tr>
<tr><td class='ln' data-ln='110'></td><td><span> </span><span class='pt7'>fn</span><span> </span><span class='pt3'>eq</span><span class='pt1'>(&</span><span class='pt10 it'>self</span><span>, </span><span class='pt12'>other</span><span class='pt1'>:</span><span> </span><span class='pt1'>&</span><span>LinkerLink</span><span class='pt1'>)</span><span> </span><span class='pt1'>-></span><span> </span><span class='pt7'>bool</span><span> </span><span class='pt1'>{</span></td></tr>
<tr><td class='ln' data-ln='111'></td><td><span> </span><span class='pt10 it'>self</span><span>.link.</span><span class='pt3'>upgrade</span><span class='pt1'>()</span><span> </span><span class='pt1'>==</span><span> other.link.</span><span class='pt3'>upgrade</span><span class='pt1'>()</span></td></tr>
<tr><td class='ln' data-ln='112'></td><td><span> </span><span class='pt1'>}</span></td></tr>
<tr><td class='ln' data-ln='113'></td><td><span class='pt1'>}</span></td></tr>
<tr><td class='ln' data-ln='114'></td><td> </td></tr>
<tr><td class='ln' data-ln='115'></td><td><span class='pt2'>/// Just panics, we can't do anything with linked up syntaxes</span></td></tr>
<tr><td class='ln' data-ln='116'></td><td><span class='pt7'>impl</span><span> Serialize </span><span class='pt7'>for</span><span> LinkerLink </span><span class='pt1'>{</span></td></tr>
<tr><td class='ln' data-ln='117'></td><td><span> </span><span class='pt7'>fn</span><span> </span><span class='pt3'>serialize</span><span class='pt1'><</span><span>S</span><span class='pt1'>>(&</span><span class='pt10 it'>self</span><span>, </span><span class='pt1'>_</span><span>: S</span><span class='pt1'>)</span><span> </span><span class='pt1'>-></span><span> </span><span class='pt13'>Result</span><span class='pt1'><</span><span class='pt7'>S::</span><span class='pt12'>Ok</span><span class='pt1'>,</span><span> </span><span class='pt7'>S::</span><span>Error</span><span class='pt1'>></span><span> </span><span class='pt7'>where</span><span> S</span><span class='pt1'>:</span><span> Serializer </span><span class='pt1'>{</span></td></tr>
<tr><td class='ln' data-ln='118'></td><td><span> </span><span class='pt1 it'>panic!</span><span class='pt1'>("</span><span class='pt4'>Can't serialize syntax definitions which have been linked</span><span class='pt1'>");</span></td></tr>
<tr><td class='ln' data-ln='119'></td><td><span> </span><span class='pt1'>}</span></td></tr>
<tr><td class='ln' data-ln='120'></td><td><span class='pt1'>}</span></td></tr>
<tr><td class='ln' data-ln='121'></td><td> </td></tr>
<tr><td class='ln' data-ln='122'></td><td><span class='pt2'>/// Just panics, we can't do anything with linked up syntaxes</span></td></tr>
<tr><td class='ln' data-ln='123'></td><td><span class='pt7'>impl</span><span class='pt1'><</span><span class='pt7'>'de</span><span class='pt1'>></span><span> Deserialize</span><span class='pt1'><</span><span class='pt7'>'de</span><span class='pt1'>></span><span> </span><span class='pt7'>for</span><span> LinkerLink </span><span class='pt1'>{</span></td></tr>
<tr><td class='ln' data-ln='124'></td><td><span> </span><span class='pt7'>fn</span><span> </span><span class='pt3'>deserialize</span><span class='pt1'><</span><span>D</span><span class='pt1'>>(_</span><span>: D</span><span class='pt1'>)</span><span> </span><span class='pt1'>-></span><span> </span><span class='pt13'>Result</span><span class='pt1'><</span><span class='pt7'>Self</span><span class='pt1'>,</span><span> </span><span class='pt7'>D::</span><span>Error</span><span class='pt1'>></span><span> </span><span class='pt7'>where</span><span> D</span><span class='pt1'>:</span><span> Deserializer<'de> </span><span class='pt1'>{</span></td></tr>
<tr><td class='ln' data-ln='125'></td><td><span> </span><span class='pt1 it'>panic!</span><span class='pt1'>("</span><span class='pt4'>No linked syntax should ever have gotten serialized</span><span class='pt1'>");</span></td></tr>
<tr><td class='ln' data-ln='126'></td><td><span> </span><span class='pt1'>}</span></td></tr>
<tr><td class='ln' data-ln='127'></td><td><span class='pt1'>}</span></td></tr>
<tr><td class='ln' data-ln='128'></td><td> </td></tr>
<tr><td class='ln' data-ln='129'></td><td> </td></tr>
<tr><td class='ln' data-ln='130'></td><td><span class='pt2'>/// Serialize the provided map in natural key order, so that it's deterministic when dumping.</span></td></tr>
<tr><td class='ln' data-ln='131'></td><td><span class='pt7'>fn</span><span> </span><span class='pt3'>ordered_map</span><span class='pt1'><</span><span>K</span><span class='pt1'>,</span><span> V</span><span class='pt1'>,</span><span> S</span><span class='pt1'>>(</span><span class='pt12'>map</span><span class='pt1'>:</span><span> </span><span class='pt1'>&</span><span class='pt13'>HashMap</span><span class='pt1'><</span><span>K</span><span class='pt1'>,</span><span> V</span><span class='pt1'>></span><span>, </span><span class='pt12'>serializer</span><span class='pt1'>:</span><span> S</span><span class='pt1'>)</span><span> </span><span class='pt1'>-></span><span> </span><span class='pt13'>Result</span><span class='pt1'><</span><span class='pt7'>S::</span><span class='pt12'>Ok</span><span class='pt1'>,</span><span> </span><span class='pt7'>S::</span><span>Error</span><span class='pt1'>></span></td></tr>
<tr><td class='ln' data-ln='132'></td><td><span> </span><span class='pt7'>where</span><span> S</span><span class='pt1'>:</span><span> Serializer, K</span><span class='pt1'>:</span><span> Eq + Hash + Ord + Serialize, V</span><span class='pt1'>:</span><span> Serialize</span></td></tr>
<tr><td class='ln' data-ln='133'></td><td><span class='pt1'>{</span></td></tr>
<tr><td class='ln' data-ln='134'></td><td><span> </span><span class='pt7'>let</span><span> ordered</span><span class='pt1'>:</span><span> BTreeMap</span><span class='pt1'><_,</span><span> </span><span class='pt1'>_></span><span> </span><span class='pt1'>=</span><span> map.</span><span class='pt3'>iter</span><span class='pt1'>()</span><span>.</span><span class='pt3'>collect</span><span class='pt1'>();</span></td></tr>
<tr><td class='ln' data-ln='135'></td><td><span> ordered.</span><span class='pt3'>serialize</span><span class='pt1'>(</span><span>serializer</span><span class='pt1'>)</span></td></tr>
<tr><td class='ln' data-ln='136'></td><td><span class='pt1'>}</span></td></tr>
<tr><td class='ln' data-ln='137'></td><td> </td></tr>
<tr><td class='ln' data-ln='138'></td><td> </td></tr>
<tr><td class='ln' data-ln='139'></td><td><span>#[</span><span class='pt3'>cfg</span><span class='pt1'>(</span><span>test</span><span class='pt1'>)</span><span>]</span></td></tr>
<tr><td class='ln' data-ln='140'></td><td><span class='pt7'>mod</span><span> tests </span><span class='pt1'>{</span></td></tr>
<tr><td class='ln' data-ln='141'></td><td><span> </span><span class='pt7'>use</span><span> </span><span class='pt7'>super</span><span class='pt1'>::*;</span></td></tr>
<tr><td class='ln' data-ln='142'></td><td> </td></tr>
<tr><td class='ln' data-ln='143'></td><td><span> #[test]</span></td></tr>
<tr><td class='ln' data-ln='144'></td><td><span> </span><span class='pt7'>fn</span><span> </span><span class='pt3'>can_compile_refs</span><span class='pt1'>()</span><span> </span><span class='pt1'>{</span></td></tr>
<tr><td class='ln' data-ln='145'></td><td><span> </span><span class='pt7'>use</span><span> onig</span><span class='pt1'>::{</span><span>SearchOptions, Regex, Region</span><span class='pt1'>};</span></td></tr>
<tr><td class='ln' data-ln='146'></td><td> </td></tr>
<tr><td class='ln' data-ln='147'></td><td><span> </span><span class='pt7'>let</span><span> pat </span><span class='pt1'>=</span><span> MatchPattern </span><span class='pt1'>{</span></td></tr>
<tr><td class='ln' data-ln='148'></td><td><span> has_captures</span><span class='pt1'>:</span><span> </span><span class='pt12'>true</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='149'></td><td><span> regex_str</span><span class='pt1'>:</span><span> </span><span class='pt13'>String</span><span class='pt1'>::</span><span class='pt3'>from</span><span class='pt1'>(</span><span class='pt7'>r</span><span class='pt4'>"lol \\ \2 \1 '\9' \wz</span><span class='pt1'>")</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='150'></td><td><span> regex</span><span class='pt1'>:</span><span> </span><span class='pt12'>None</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='151'></td><td><span> scope</span><span class='pt1'>:</span><span> </span><span class='pt1 it'>vec!</span><span class='pt1'>[]</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='152'></td><td><span> captures</span><span class='pt1'>:</span><span> </span><span class='pt12'>None</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='153'></td><td><span> operation</span><span class='pt1'>:</span><span> MatchOperation</span><span class='pt1'>::</span><span class='pt12'>None</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='154'></td><td><span> with_prototype</span><span class='pt1'>:</span><span> </span><span class='pt12'>None</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='155'></td><td><span> </span><span class='pt1'>};</span></td></tr>
<tr><td class='ln' data-ln='156'></td><td> </td></tr>
<tr><td class='ln' data-ln='157'></td><td><span> </span><span class='pt7'>let</span><span> r </span><span class='pt1'>=</span><span> Regex</span><span class='pt1'>::</span><span class='pt3'>new</span><span class='pt1'>(</span><span class='pt7'>r</span><span class='pt4'>"(\\\[\]\(\))(b)(c)(d)(e)</span><span class='pt1'>")</span><span>.</span><span class='pt3'>unwrap</span><span class='pt1'>();</span></td></tr>
<tr><td class='ln' data-ln='158'></td><td><span> </span><span class='pt7'>let</span><span> </span><span class='pt7'>mut</span><span> region </span><span class='pt1'>=</span><span> Region</span><span class='pt1'>::</span><span class='pt3'>new</span><span class='pt1'>();</span></td></tr>
<tr><td class='ln' data-ln='159'></td><td><span> </span><span class='pt7'>let</span><span> s </span><span class='pt1'>=</span><span> </span><span class='pt7'>r</span><span class='pt4'>"\[]()bcde</span><span class='pt1'>";</span></td></tr>
<tr><td class='ln' data-ln='160'></td><td> </td></tr>
<tr><td class='ln' data-ln='161'></td><td><span> </span><span class='pt1 it'>assert!</span><span class='pt1'>(</span><span>r.</span><span class='pt3'>match_with_options</span><span class='pt1'>(</span><span>s, </span><span class='pt12'>0</span><span>, SearchOptions</span><span class='pt1'>::</span><span>SEARCH_OPTION_NONE, </span><span class='pt12'>Some</span><span class='pt1'>(&</span><span class='pt7'>mut</span><span> region</span><span class='pt1'>))</span><span>.</span><span class='pt3'>is_some</span><span class='pt1'>());</span></td></tr>
<tr><td class='ln' data-ln='162'></td><td> </td></tr>
<tr><td class='ln' data-ln='163'></td><td><span> </span><span class='pt7'>let</span><span> regex_res </span><span class='pt1'>=</span><span> pat.</span><span class='pt3'>regex_with_substitutes</span><span class='pt1'>(&</span><span>region, s</span><span class='pt1'>);</span></td></tr>
<tr><td class='ln' data-ln='164'></td><td><span> </span><span class='pt1 it'>assert_eq!</span><span class='pt1'>(</span><span>regex_res, </span><span class='pt7'>r</span><span class='pt4'>"lol \\ b \\\[\]\(\) '' \wz</span><span class='pt1'>");</span></td></tr>
<tr><td class='ln' data-ln='165'></td><td><span> pat.</span><span class='pt3'>compile_with_refs</span><span class='pt1'>(&</span><span>region, s</span><span class='pt1'>);</span></td></tr>
<tr><td class='ln' data-ln='166'></td><td><span> </span><span class='pt1'>}</span></td></tr>
<tr><td class='ln' data-ln='167'></td><td><span class='pt1'>}</span></td></tr>
</table>
</div>
</div>
</div>
<div class='style' id='P--one_dark--rs'>
<div class='P--one_dark-bordered'>
<div class="info header">
<span class="left">syntax_definition.rs</span>
<span class="right"><span>167 lines</span><span>5.55 KB</span></span>
</div>
<div class='P--one_dark'>
<table>
<tr><td class='ln' data-ln='1'></td><td><span class='pt20'>use</span><span> std</span><span class='pt5'>::</span><span>collections</span><span class='pt5'>::</span><span>{</span><span class='pt17'>BTreeMap</span><span>, </span><span class='pt17'>HashMap</span><span>};</span></td></tr>
<tr><td class='ln' data-ln='2'></td><td><span class='pt20'>use</span><span> std</span><span class='pt5'>::</span><span>hash</span><span class='pt5'>::</span><span class='pt17'>Hash</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='3'></td><td><span class='pt20'>use</span><span> onig</span><span class='pt5'>::</span><span>{</span><span class='pt17'>Regex</span><span>, </span><span class='pt17'>RegexOptions</span><span>, </span><span class='pt17'>Region</span><span>, </span><span class='pt17'>Syntax</span><span>};</span></td></tr>
<tr><td class='ln' data-ln='4'></td><td><span class='pt20'>use</span><span> std</span><span class='pt5'>::</span><span>rc</span><span class='pt5'>::</span><span>{</span><span class='pt17'>Rc</span><span>, </span><span class='pt17'>Weak</span><span>};</span></td></tr>
<tr><td class='ln' data-ln='5'></td><td><span class='pt20'>use</span><span> std</span><span class='pt5'>::</span><span>cell</span><span class='pt5'>::</span><span class='pt17'>RefCell</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='6'></td><td><span class='pt20'>use</span><span> </span><span class='pt20'>super</span><span class='pt5'>::</span><span>scope</span><span class='pt5'>::*</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='7'></td><td><span class='pt20'>use</span><span> regex_syntax</span><span class='pt5'>::</span><span>escape;</span></td></tr>
<tr><td class='ln' data-ln='8'></td><td class='hi'><span class='pt20'>use</span><span> serde</span><span class='pt5'>::</span><span>{</span><span class='pt17'>Deserialize</span><span>, </span><span class='pt17'>Deserializer</span><span>, </span><span class='pt17'>Serialize</span><span>, </span><span class='pt17'>Serializer</span><span>};</span></td></tr>
<tr><td class='ln' data-ln='9'></td><td> </td></tr>
<tr><td class='ln' data-ln='10'></td><td><span class='pt11 it'>/// The main data structure representing a syntax definition loaded from a</span></td></tr>
<tr><td class='ln' data-ln='11'></td><td><span class='pt11 it'>/// `.sublime-syntax` file. You'll probably only need these as references</span></td></tr>
<tr><td class='ln' data-ln='12'></td><td><span class='pt11 it'>/// to be passed around to parsing code.</span></td></tr>
<tr><td class='ln' data-ln='13'></td><td><span class='pt11 it'>///</span></td></tr>
<tr><td class='ln' data-ln='14'></td><td><span class='pt11 it'>/// Some useful public fields are the `name` field which is a human readable</span></td></tr>
<tr><td class='ln' data-ln='15'></td><td><span class='pt11 it'>/// name to display in syntax lists, and the `hidden` field which means hide</span></td></tr>
<tr><td class='ln' data-ln='16'></td><td><span class='pt11 it'>/// this syntax from any lists because it is for internal use.</span></td></tr>
<tr><td class='ln' data-ln='17'></td><td><span>#[</span><span class='pt9'>derive</span><span>(</span><span class='pt26'>Clone</span><span>, </span><span class='pt26'>Debug</span><span>, </span><span class='pt26'>Eq</span><span>, </span><span class='pt26'>PartialEq</span><span>, </span><span class='pt17'>Serialize</span><span>, </span><span class='pt17'>Deserialize</span><span>)]</span></td></tr>
<tr><td class='ln' data-ln='18'></td><td><span class='pt20'>pub</span><span> </span><span class='pt20'>struct</span><span> </span><span class='pt28'>SyntaxDefinition</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='19'></td><td class='hi'><span> </span><span class='pt20'>pub</span><span> </span><span class='pt17'>name</span><span>: </span><span class='pt26'>String</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='20'></td><td class='hi'><span> </span><span class='pt20'>pub</span><span> </span><span class='pt17'>file_extensions</span><span>: </span><span class='pt26'>Vec</span><span class='pt5'><</span><span class='pt26'>String</span><span class='pt5'>></span><span>,</span></td></tr>
<tr><td class='ln' data-ln='21'></td><td class='hi'><span> </span><span class='pt20'>pub</span><span> </span><span class='pt17'>scope</span><span>: Scope,</span></td></tr>
<tr><td class='ln' data-ln='22'></td><td class='hi'><span> </span><span class='pt20'>pub</span><span> </span><span class='pt17'>first_line_match</span><span>: </span><span class='pt26'>Option</span><span class='pt5'><</span><span class='pt26'>String</span><span class='pt5'>></span><span>,</span></td></tr>
<tr><td class='ln' data-ln='23'></td><td class='hi'><span> </span><span class='pt20'>pub</span><span> </span><span class='pt17'>hidden</span><span>: </span><span class='pt20'>bool</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='24'></td><td><span> </span><span class='pt11 it'>/// Filled in at link time to avoid serializing it multiple times</span></td></tr>
<tr><td class='ln' data-ln='25'></td><td><span> #[</span><span class='pt9'>serde</span><span>(skip_serializing, skip_deserializing)]</span></td></tr>
<tr><td class='ln' data-ln='26'></td><td><span> </span><span class='pt20'>pub</span><span> </span><span class='pt17'>prototype</span><span>: </span><span class='pt26'>Option</span><span class='pt5'><</span><span>ContextPtr</span><span class='pt5'>></span><span>,</span></td></tr>
<tr><td class='ln' data-ln='27'></td><td><span> #[</span><span class='pt9'>serde</span><span>(serialize_with </span><span class='pt5'>=</span><span> </span><span class='pt12'>"</span><span class='pt13'>ordered_map</span><span class='pt12'>"</span><span>)]</span></td></tr>
<tr><td class='ln' data-ln='28'></td><td><span> </span><span class='pt20'>pub</span><span> </span><span class='pt17'>variables</span><span>: </span><span class='pt26'>HashMap</span><span class='pt5'><</span><span class='pt26'>String</span><span>, </span><span class='pt26'>String</span><span class='pt5'>></span><span>,</span></td></tr>
<tr><td class='ln' data-ln='29'></td><td><span> #[</span><span class='pt9'>serde</span><span>(serialize_with </span><span class='pt5'>=</span><span> </span><span class='pt12'>"</span><span class='pt13'>ordered_map</span><span class='pt12'>"</span><span>)]</span></td></tr>
<tr><td class='ln' data-ln='30'></td><td><span> </span><span class='pt20'>pub</span><span> </span><span class='pt17'>contexts</span><span>: </span><span class='pt26'>HashMap</span><span class='pt5'><</span><span class='pt26'>String</span><span>, ContextPtr</span><span class='pt5'>></span><span>,</span></td></tr>
<tr><td class='ln' data-ln='31'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='32'></td><td> </td></tr>
<tr><td class='ln' data-ln='33'></td><td><span class='pt20'>impl</span><span> </span><span class='pt28'>Context</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='34'></td><td><span> </span><span class='pt11 it'>/// Returns the match pattern at an index, panics if the thing isn't a match pattern</span></td></tr>
<tr><td class='ln' data-ln='35'></td><td><span> </span><span class='pt20'>pub</span><span> </span><span class='pt20'>fn</span><span> </span><span class='pt9'>match_at</span><span>(</span><span class='pt5'>&</span><span class='pt26'>self</span><span>, </span><span class='it'>index</span><span>: </span><span class='pt20'>usize</span><span>) -> </span><span class='pt5'>&</span><span>MatchPattern {</span></td></tr>
<tr><td class='ln' data-ln='36'></td><td><span> </span><span class='pt20'>match</span><span> </span><span class='pt26'>self</span><span>.patterns[index] {</span></td></tr>
<tr><td class='ln' data-ln='37'></td><td><span> </span><span class='pt17'>Pattern</span><span class='pt5'>::</span><span class='pt17'>Match</span><span>(</span><span class='pt20'>ref</span><span> match_pat) </span><span class='pt5'>=></span><span> match_pat,</span></td></tr>
<tr><td class='ln' data-ln='38'></td><td><span> _ </span><span class='pt5'>=></span><span> </span><span class='pt5'>panic!</span><span>(</span><span class='pt12'>"</span><span class='pt13'>bad index to match_at</span><span class='pt12'>"</span><span>),</span></td></tr>
<tr><td class='ln' data-ln='39'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='40'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='41'></td><td> </td></tr>
<tr><td class='ln' data-ln='42'></td><td><span> </span><span class='pt11 it'>/// Returns a mutable reference, otherwise like `match_at`</span></td></tr>
<tr><td class='ln' data-ln='43'></td><td><span> </span><span class='pt20'>pub</span><span> </span><span class='pt20'>fn</span><span> </span><span class='pt9'>match_at_mut</span><span>(</span><span class='pt5'>&</span><span class='pt20'>mut</span><span> </span><span class='pt26'>self</span><span>, </span><span class='it'>index</span><span>: </span><span class='pt20'>usize</span><span>) -> </span><span class='pt5'>&</span><span class='pt20'>mut</span><span> MatchPattern {</span></td></tr>
<tr><td class='ln' data-ln='44'></td><td><span> </span><span class='pt20'>match</span><span> </span><span class='pt26'>self</span><span>.patterns[index] {</span></td></tr>
<tr><td class='ln' data-ln='45'></td><td><span> </span><span class='pt17'>Pattern</span><span class='pt5'>::</span><span class='pt17'>Match</span><span>(</span><span class='pt20'>ref</span><span> </span><span class='pt20'>mut</span><span> match_pat) </span><span class='pt5'>=></span><span> match_pat,</span></td></tr>
<tr><td class='ln' data-ln='46'></td><td><span> _ </span><span class='pt5'>=></span><span> </span><span class='pt5'>panic!</span><span>(</span><span class='pt12'>"</span><span class='pt13'>bad index to match_at</span><span class='pt12'>"</span><span>),</span></td></tr>
<tr><td class='ln' data-ln='47'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='48'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='49'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='50'></td><td> </td></tr>
<tr><td class='ln' data-ln='51'></td><td><span class='pt20'>impl</span><span> </span><span class='pt28'>ContextReference</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='52'></td><td><span> </span><span class='pt11 it'>/// find the pointed to context, panics if ref is not linked</span></td></tr>
<tr><td class='ln' data-ln='53'></td><td><span> </span><span class='pt20'>pub</span><span> </span><span class='pt20'>fn</span><span> </span><span class='pt9'>resolve</span><span>(</span><span class='pt5'>&</span><span class='pt26'>self</span><span>) -> ContextPtr {</span></td></tr>
<tr><td class='ln' data-ln='54'></td><td><span> </span><span class='pt20'>match</span><span> </span><span class='pt5'>*</span><span class='pt26'>self</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='55'></td><td><span> </span><span class='pt17'>ContextReference</span><span class='pt5'>::</span><span class='pt17'>Inline</span><span>(</span><span class='pt20'>ref</span><span> ptr) </span><span class='pt5'>=></span><span> ptr.</span><span class='pt9'>clone</span><span>(),</span></td></tr>
<tr><td class='ln' data-ln='56'></td><td><span> </span><span class='pt17'>ContextReference</span><span class='pt5'>::</span><span class='pt17'>Direct</span><span>(</span><span class='pt20'>ref</span><span> ptr) </span><span class='pt5'>=></span><span> ptr.link.</span><span class='pt9'>upgrade</span><span>().</span><span class='pt9'>unwrap</span><span>(),</span></td></tr>
<tr><td class='ln' data-ln='57'></td><td><span> _ </span><span class='pt5'>=></span><span> </span><span class='pt5'>panic!</span><span>(</span><span class='pt12'>"</span><span class='pt13'>Can only call resolve on linked references: </span><span class='pt24'>{:?}</span><span class='pt12'>"</span><span>, </span><span class='pt26'>self</span><span>),</span></td></tr>
<tr><td class='ln' data-ln='58'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='59'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='60'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='61'></td><td> </td></tr>
<tr><td class='ln' data-ln='62'></td><td><span class='pt20'>impl</span><span> </span><span class='pt28'>MatchPattern</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='63'></td><td><span> </span><span class='pt11 it'>/// substitutes back-refs in Regex with regions from s</span></td></tr>
<tr><td class='ln' data-ln='64'></td><td><span> </span><span class='pt11 it'>/// used for match patterns which refer to captures from the pattern</span></td></tr>
<tr><td class='ln' data-ln='65'></td><td><span> </span><span class='pt11 it'>/// that pushed them.</span></td></tr>
<tr><td class='ln' data-ln='66'></td><td><span> </span><span class='pt20'>pub</span><span> </span><span class='pt20'>fn</span><span> </span><span class='pt9'>regex_with_substitutes</span><span>(</span><span class='pt5'>&</span><span class='pt26'>self</span><span>, </span><span class='it'>region</span><span>: </span><span class='pt5'>&</span><span>Region, </span><span class='it'>s</span><span>: </span><span class='pt5'>&</span><span class='pt20'>str</span><span>) -> </span><span class='pt26'>String</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='67'></td><td><span> </span><span class='pt20'>let</span><span> </span><span class='pt20'>mut</span><span> reg_str </span><span class='pt5'>=</span><span> </span><span class='pt26'>String</span><span class='pt5'>::</span><span class='pt9'>new</span><span>();</span></td></tr>
<tr><td class='ln' data-ln='68'></td><td><span> </span><span class='pt20'>let</span><span> </span><span class='pt20'>mut</span><span> last_was_escape </span><span class='pt5'>=</span><span> </span><span class='pt24'>false</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='69'></td><td> </td></tr>
<tr><td class='ln' data-ln='70'></td><td><span> </span><span class='pt20'>for</span><span> c </span><span class='pt5'>in</span><span> </span><span class='pt26'>self</span><span>.regex_str.</span><span class='pt9'>chars</span><span>() {</span></td></tr>
<tr><td class='ln' data-ln='71'></td><td><span> </span><span class='pt20'>if</span><span> last_was_escape </span><span class='pt5'>&&</span><span> c.</span><span class='pt9'>is_digit</span><span>(</span><span class='pt24'>10</span><span>) {</span></td></tr>
<tr><td class='ln' data-ln='72'></td><td><span> </span><span class='pt20'>let</span><span> val </span><span class='pt5'>=</span><span> c.</span><span class='pt9'>to_digit</span><span>(</span><span class='pt24'>10</span><span>).</span><span class='pt9'>unwrap</span><span>();</span></td></tr>
<tr><td class='ln' data-ln='73'></td><td> </td></tr>
<tr><td class='ln' data-ln='74'></td><td><span> </span><span class='pt20'>if</span><span> </span><span class='pt20'>let</span><span> </span><span class='pt24'>Some</span><span>((start, end)) </span><span class='pt5'>=</span><span> region.</span><span class='pt9'>pos</span><span>(val </span><span class='pt5'>as</span><span> </span><span class='pt20'>usize</span><span>) {</span></td></tr>
<tr><td class='ln' data-ln='75'></td><td><span> </span><span class='pt20'>let</span><span> escaped </span><span class='pt5'>=</span><span> </span><span class='pt9'>escape</span><span>(</span><span class='pt5'>&</span><span>s[start</span><span class='pt5'>..</span><span>end]);</span></td></tr>
<tr><td class='ln' data-ln='76'></td><td><span> reg_str.</span><span class='pt9'>push_str</span><span>(</span><span class='pt5'>&</span><span>escaped);</span></td></tr>
<tr><td class='ln' data-ln='77'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='78'></td><td><span> } </span><span class='pt20'>else</span><span> </span><span class='pt20'>if</span><span> last_was_escape {</span></td></tr>
<tr><td class='ln' data-ln='79'></td><td><span> reg_str.</span><span class='pt9'>push</span><span>(</span><span class='pt12'>'</span><span class='pt7'>\\</span><span class='pt12'>'</span><span>);</span></td></tr>
<tr><td class='ln' data-ln='80'></td><td><span> reg_str.</span><span class='pt9'>push</span><span>(c);</span></td></tr>
<tr><td class='ln' data-ln='81'></td><td><span> } </span><span class='pt20'>else</span><span> </span><span class='pt20'>if</span><span> c </span><span class='pt5'>!=</span><span> </span><span class='pt12'>'</span><span class='pt7'>\\</span><span class='pt12'>'</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='82'></td><td><span> reg_str.</span><span class='pt9'>push</span><span>(c);</span></td></tr>
<tr><td class='ln' data-ln='83'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='84'></td><td> </td></tr>
<tr><td class='ln' data-ln='85'></td><td><span> last_was_escape </span><span class='pt5'>=</span><span> c </span><span class='pt5'>==</span><span> </span><span class='pt12'>'</span><span class='pt7'>\\</span><span class='pt12'>'</span><span> </span><span class='pt5'>&&</span><span> </span><span class='pt5'>!</span><span>last_was_escape;</span></td></tr>
<tr><td class='ln' data-ln='86'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='87'></td><td><span> reg_str</span></td></tr>
<tr><td class='ln' data-ln='88'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='89'></td><td> </td></tr>
<tr><td class='ln' data-ln='90'></td><td><span> </span><span class='pt11 it'>/// Makes sure the regex is compiled if it doesn't have captures.</span></td></tr>
<tr><td class='ln' data-ln='91'></td><td><span> </span><span class='pt11 it'>/// May compile the regex if it isn't, panicing if compilation fails.</span></td></tr>
<tr><td class='ln' data-ln='92'></td><td><span> #[inline]</span></td></tr>
<tr><td class='ln' data-ln='93'></td><td><span> </span><span class='pt20'>pub</span><span> </span><span class='pt20'>fn</span><span> </span><span class='pt9'>ensure_compiled_if_possible</span><span>(</span><span class='pt5'>&</span><span class='pt20'>mut</span><span> </span><span class='pt26'>self</span><span>) {</span></td></tr>
<tr><td class='ln' data-ln='94'></td><td><span> </span><span class='pt20'>if</span><span> </span><span class='pt26'>self</span><span>.regex.</span><span class='pt9'>is_none</span><span>() </span><span class='pt5'>&&</span><span> </span><span class='pt5'>!</span><span class='pt26'>self</span><span>.has_captures {</span></td></tr>
<tr><td class='ln' data-ln='95'></td><td><span> </span><span class='pt26'>self</span><span>.</span><span class='pt9'>compile_regex</span><span>();</span></td></tr>
<tr><td class='ln' data-ln='96'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='97'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='98'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='99'></td><td> </td></tr>
<tr><td class='ln' data-ln='100'></td><td><span class='pt11 it'>/// This wrapper only exists so that I can implement a serialization</span></td></tr>
<tr><td class='ln' data-ln='101'></td><td><span class='pt11 it'>/// trait that crashes if you try and serialize this.</span></td></tr>
<tr><td class='ln' data-ln='102'></td><td><span>#[</span><span class='pt9'>derive</span><span>(</span><span class='pt26'>Debug</span><span>)]</span></td></tr>
<tr><td class='ln' data-ln='103'></td><td><span class='pt20'>pub</span><span> </span><span class='pt20'>struct</span><span> </span><span class='pt28'>LinkerLink</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='104'></td><td><span> </span><span class='pt20'>pub</span><span> </span><span class='pt17'>link</span><span>: Weak</span><span class='pt5'><</span><span>RefCell</span><span class='pt5'><</span><span>Context</span><span class='pt5'>>></span><span>,</span></td></tr>
<tr><td class='ln' data-ln='105'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='106'></td><td> </td></tr>
<tr><td class='ln' data-ln='107'></td><td><span class='pt20'>impl</span><span> </span><span class='pt26'>Eq</span><span> </span><span class='pt20'>for</span><span> </span><span class='pt28'>LinkerLink</span><span> {}</span></td></tr>
<tr><td class='ln' data-ln='108'></td><td> </td></tr>
<tr><td class='ln' data-ln='109'></td><td><span class='pt20'>impl</span><span> </span><span class='pt26'>PartialEq</span><span> </span><span class='pt20'>for</span><span> </span><span class='pt28'>LinkerLink</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='110'></td><td><span> </span><span class='pt20'>fn</span><span> </span><span class='pt9'>eq</span><span>(</span><span class='pt5'>&</span><span class='pt26'>self</span><span>, </span><span class='it'>other</span><span>: </span><span class='pt5'>&</span><span>LinkerLink) -> </span><span class='pt20'>bool</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='111'></td><td><span> </span><span class='pt26'>self</span><span>.link.</span><span class='pt9'>upgrade</span><span>() </span><span class='pt5'>==</span><span> other.link.</span><span class='pt9'>upgrade</span><span>()</span></td></tr>
<tr><td class='ln' data-ln='112'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='113'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='114'></td><td> </td></tr>
<tr><td class='ln' data-ln='115'></td><td><span class='pt11 it'>/// Just panics, we can't do anything with linked up syntaxes</span></td></tr>
<tr><td class='ln' data-ln='116'></td><td><span class='pt20'>impl</span><span> Serialize </span><span class='pt20'>for</span><span> </span><span class='pt28'>LinkerLink</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='117'></td><td><span> </span><span class='pt20'>fn</span><span> </span><span class='pt9'>serialize</span><span class='pt5'><</span><span>S</span><span class='pt5'>></span><span>(</span><span class='pt5'>&</span><span class='pt26'>self</span><span>, </span><span class='pt5'>_</span><span>: S) -> </span><span class='pt26'>Result</span><span class='pt5'><</span><span class='pt20'>S::</span><span class='pt24'>Ok</span><span>, </span><span class='pt20'>S::</span><span>Error</span><span class='pt5'>></span><span> </span><span class='pt20'>where</span><span> S: Serializer {</span></td></tr>
<tr><td class='ln' data-ln='118'></td><td><span> </span><span class='pt5'>panic!</span><span>(</span><span class='pt12'>"</span><span class='pt13'>Can't serialize syntax definitions which have been linked</span><span class='pt12'>"</span><span>);</span></td></tr>
<tr><td class='ln' data-ln='119'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='120'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='121'></td><td> </td></tr>
<tr><td class='ln' data-ln='122'></td><td><span class='pt11 it'>/// Just panics, we can't do anything with linked up syntaxes</span></td></tr>
<tr><td class='ln' data-ln='123'></td><td><span class='pt20'>impl</span><span class='pt5'><</span><span class='pt20'>'de</span><span class='pt5'>></span><span> Deserialize</span><span class='pt5'><</span><span class='pt20'>'de</span><span class='pt5'>></span><span> </span><span class='pt20'>for</span><span> </span><span class='pt28'>LinkerLink</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='124'></td><td><span> </span><span class='pt20'>fn</span><span> </span><span class='pt9'>deserialize</span><span class='pt5'><</span><span>D</span><span class='pt5'>></span><span>(</span><span class='pt5'>_</span><span>: D) -> </span><span class='pt26'>Result</span><span class='pt5'><</span><span class='pt20'>Self</span><span>, </span><span class='pt20'>D::</span><span>Error</span><span class='pt5'>></span><span> </span><span class='pt20'>where</span><span> D: Deserializer<'de> {</span></td></tr>
<tr><td class='ln' data-ln='125'></td><td><span> </span><span class='pt5'>panic!</span><span>(</span><span class='pt12'>"</span><span class='pt13'>No linked syntax should ever have gotten serialized</span><span class='pt12'>"</span><span>);</span></td></tr>
<tr><td class='ln' data-ln='126'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='127'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='128'></td><td> </td></tr>
<tr><td class='ln' data-ln='129'></td><td> </td></tr>
<tr><td class='ln' data-ln='130'></td><td><span class='pt11 it'>/// Serialize the provided map in natural key order, so that it's deterministic when dumping.</span></td></tr>
<tr><td class='ln' data-ln='131'></td><td><span class='pt20'>fn</span><span> </span><span class='pt9'>ordered_map</span><span class='pt5'><</span><span>K, V, S</span><span class='pt5'>></span><span>(</span><span class='it'>map</span><span>: </span><span class='pt5'>&</span><span class='pt26'>HashMap</span><span class='pt5'><</span><span>K, V</span><span class='pt5'>></span><span>, </span><span class='it'>serializer</span><span>: S) -> </span><span class='pt26'>Result</span><span class='pt5'><</span><span class='pt20'>S::</span><span class='pt24'>Ok</span><span>, </span><span class='pt20'>S::</span><span>Error</span><span class='pt5'>></span></td></tr>
<tr><td class='ln' data-ln='132'></td><td><span> </span><span class='pt20'>where</span><span> S: Serializer, K: Eq + Hash + Ord + Serialize, V: Serialize</span></td></tr>
<tr><td class='ln' data-ln='133'></td><td><span>{</span></td></tr>
<tr><td class='ln' data-ln='134'></td><td><span> </span><span class='pt20'>let</span><span> ordered: BTreeMap</span><span class='pt5'><_</span><span>, </span><span class='pt5'>_></span><span> </span><span class='pt5'>=</span><span> map.</span><span class='pt9'>iter</span><span>().</span><span class='pt9'>collect</span><span>();</span></td></tr>
<tr><td class='ln' data-ln='135'></td><td><span> ordered.</span><span class='pt9'>serialize</span><span>(serializer)</span></td></tr>
<tr><td class='ln' data-ln='136'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='137'></td><td> </td></tr>
<tr><td class='ln' data-ln='138'></td><td> </td></tr>
<tr><td class='ln' data-ln='139'></td><td><span>#[</span><span class='pt9'>cfg</span><span>(test)]</span></td></tr>
<tr><td class='ln' data-ln='140'></td><td><span class='pt20'>mod</span><span> tests {</span></td></tr>
<tr><td class='ln' data-ln='141'></td><td><span> </span><span class='pt20'>use</span><span> </span><span class='pt20'>super</span><span class='pt5'>::*</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='142'></td><td> </td></tr>
<tr><td class='ln' data-ln='143'></td><td><span> #[test]</span></td></tr>
<tr><td class='ln' data-ln='144'></td><td><span> </span><span class='pt20'>fn</span><span> </span><span class='pt9'>can_compile_refs</span><span>() {</span></td></tr>
<tr><td class='ln' data-ln='145'></td><td><span> </span><span class='pt20'>use</span><span> onig</span><span class='pt5'>::</span><span>{</span><span class='pt17'>SearchOptions</span><span>, </span><span class='pt17'>Regex</span><span>, </span><span class='pt17'>Region</span><span>};</span></td></tr>
<tr><td class='ln' data-ln='146'></td><td> </td></tr>
<tr><td class='ln' data-ln='147'></td><td><span> </span><span class='pt20'>let</span><span> pat </span><span class='pt5'>=</span><span> </span><span class='pt17'>MatchPattern</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='148'></td><td><span> has_captures: </span><span class='pt24'>true</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='149'></td><td><span> regex_str: </span><span class='pt26'>String</span><span class='pt5'>::</span><span class='pt9'>from</span><span>(</span><span class='pt20'>r</span><span class='pt13'>"lol \\ \2 \1 '\9' \wz</span><span class='pt12'>"</span><span>),</span></td></tr>
<tr><td class='ln' data-ln='150'></td><td><span> regex: </span><span class='pt24'>None</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='151'></td><td><span> scope: </span><span class='pt5'>vec!</span><span>[],</span></td></tr>
<tr><td class='ln' data-ln='152'></td><td><span> captures: </span><span class='pt24'>None</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='153'></td><td><span> operation: </span><span class='pt17'>MatchOperation</span><span class='pt5'>::</span><span class='pt24'>None</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='154'></td><td><span> with_prototype: </span><span class='pt24'>None</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='155'></td><td><span> };</span></td></tr>
<tr><td class='ln' data-ln='156'></td><td> </td></tr>
<tr><td class='ln' data-ln='157'></td><td><span> </span><span class='pt20'>let</span><span> r </span><span class='pt5'>=</span><span> </span><span class='pt17'>Regex</span><span class='pt5'>::</span><span class='pt9'>new</span><span>(</span><span class='pt20'>r</span><span class='pt13'>"(\\\[\]\(\))(b)(c)(d)(e)</span><span class='pt12'>"</span><span>).</span><span class='pt9'>unwrap</span><span>();</span></td></tr>
<tr><td class='ln' data-ln='158'></td><td><span> </span><span class='pt20'>let</span><span> </span><span class='pt20'>mut</span><span> region </span><span class='pt5'>=</span><span> </span><span class='pt17'>Region</span><span class='pt5'>::</span><span class='pt9'>new</span><span>();</span></td></tr>
<tr><td class='ln' data-ln='159'></td><td><span> </span><span class='pt20'>let</span><span> s </span><span class='pt5'>=</span><span> </span><span class='pt20'>r</span><span class='pt13'>"\[]()bcde</span><span class='pt12'>"</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='160'></td><td> </td></tr>
<tr><td class='ln' data-ln='161'></td><td><span> </span><span class='pt5'>assert!</span><span>(r.</span><span class='pt9'>match_with_options</span><span>(s, </span><span class='pt24'>0</span><span>, </span><span class='pt17'>SearchOptions</span><span class='pt5'>::</span><span class='pt24'>SEARCH_OPTION_NONE</span><span>, </span><span class='pt24'>Some</span><span>(</span><span class='pt5'>&</span><span class='pt20'>mut</span><span> region)).</span><span class='pt9'>is_some</span><span>());</span></td></tr>
<tr><td class='ln' data-ln='162'></td><td> </td></tr>
<tr><td class='ln' data-ln='163'></td><td><span> </span><span class='pt20'>let</span><span> regex_res </span><span class='pt5'>=</span><span> pat.</span><span class='pt9'>regex_with_substitutes</span><span>(</span><span class='pt5'>&</span><span>region, s);</span></td></tr>
<tr><td class='ln' data-ln='164'></td><td><span> </span><span class='pt5'>assert_eq!</span><span>(regex_res, </span><span class='pt20'>r</span><span class='pt13'>"lol \\ b \\\[\]\(\) '' \wz</span><span class='pt12'>"</span><span>);</span></td></tr>
<tr><td class='ln' data-ln='165'></td><td><span> pat.</span><span class='pt9'>compile_with_refs</span><span>(</span><span class='pt5'>&</span><span>region, s);</span></td></tr>
<tr><td class='ln' data-ln='166'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='167'></td><td><span>}</span></td></tr>
</table>
</div>
</div>
</div>
<div class='style' id='P--one_light--rs'>
<div class='P--one_light-bordered'>
<div class="info header">
<span class="left">syntax_definition.rs</span>
<span class="right"><span>167 lines</span><span>5.55 KB</span></span>
</div>
<div class='P--one_light'>
<table>
<tr><td class='ln' data-ln='1'></td><td><span class='pt14'>use</span><span> std</span><span class='pt14'>::</span><span>collections</span><span class='pt14'>::</span><span>{BTreeMap, HashMap};</span></td></tr>
<tr><td class='ln' data-ln='2'></td><td><span class='pt14'>use</span><span> std</span><span class='pt14'>::</span><span>hash</span><span class='pt14'>::</span><span>Hash;</span></td></tr>
<tr><td class='ln' data-ln='3'></td><td><span class='pt14'>use</span><span> onig</span><span class='pt14'>::</span><span>{Regex, RegexOptions, Region, Syntax};</span></td></tr>
<tr><td class='ln' data-ln='4'></td><td><span class='pt14'>use</span><span> std</span><span class='pt14'>::</span><span>rc</span><span class='pt14'>::</span><span>{Rc, Weak};</span></td></tr>
<tr><td class='ln' data-ln='5'></td><td><span class='pt14'>use</span><span> std</span><span class='pt14'>::</span><span>cell</span><span class='pt14'>::</span><span>RefCell;</span></td></tr>
<tr><td class='ln' data-ln='6'></td><td><span class='pt14'>use</span><span> </span><span class='pt14'>super::</span><span>scope</span><span class='pt14'>::</span><span>*;</span></td></tr>
<tr><td class='ln' data-ln='7'></td><td><span class='pt14'>use</span><span> regex_syntax</span><span class='pt14'>::</span><span>escape;</span></td></tr>
<tr><td class='ln' data-ln='8'></td><td class='hi'><span class='pt14'>use</span><span> serde</span><span class='pt14'>::</span><span>{Deserialize, Deserializer, Serialize, Serializer};</span></td></tr>
<tr><td class='ln' data-ln='9'></td><td> </td></tr>
<tr><td class='ln' data-ln='10'></td><td><span class='pt13 it'>/// The main data structure representing a syntax definition loaded from a</span></td></tr>
<tr><td class='ln' data-ln='11'></td><td><span class='pt13 it'>/// `.sublime-syntax` file. You'll probably only need these as references</span></td></tr>
<tr><td class='ln' data-ln='12'></td><td><span class='pt13 it'>/// to be passed around to parsing code.</span></td></tr>
<tr><td class='ln' data-ln='13'></td><td><span class='pt13 it'>///</span></td></tr>
<tr><td class='ln' data-ln='14'></td><td><span class='pt13 it'>/// Some useful public fields are the `name` field which is a human readable</span></td></tr>
<tr><td class='ln' data-ln='15'></td><td><span class='pt13 it'>/// name to display in syntax lists, and the `hidden` field which means hide</span></td></tr>
<tr><td class='ln' data-ln='16'></td><td><span class='pt13 it'>/// this syntax from any lists because it is for internal use.</span></td></tr>
<tr><td class='ln' data-ln='17'></td><td><span>#[</span><span class='pt7'>derive</span><span>(</span><span class='pt17'>Clone</span><span>, </span><span class='pt17'>Debug</span><span>, </span><span class='pt17'>Eq</span><span>, </span><span class='pt17'>PartialEq</span><span>, Serialize, Deserialize)]</span></td></tr>
<tr><td class='ln' data-ln='18'></td><td><span class='pt14'>pub</span><span> </span><span class='pt14'>struct</span><span> </span><span class='pt15'>SyntaxDefinition</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='19'></td><td class='hi'><span> </span><span class='pt14'>pub</span><span> </span><span class='pt6'>name</span><span>: </span><span class='pt17'>String</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='20'></td><td class='hi'><span> </span><span class='pt14'>pub</span><span> </span><span class='pt6'>file_extensions</span><span>: </span><span class='pt17'>Vec</span><span><</span><span class='pt17'>String</span><span>>,</span></td></tr>
<tr><td class='ln' data-ln='21'></td><td class='hi'><span> </span><span class='pt14'>pub</span><span> </span><span class='pt6'>scope</span><span>: Scope,</span></td></tr>
<tr><td class='ln' data-ln='22'></td><td class='hi'><span> </span><span class='pt14'>pub</span><span> </span><span class='pt6'>first_line_match</span><span>: </span><span class='pt17'>Option</span><span><</span><span class='pt17'>String</span><span>>,</span></td></tr>
<tr><td class='ln' data-ln='23'></td><td class='hi'><span> </span><span class='pt14'>pub</span><span> </span><span class='pt6'>hidden</span><span>: </span><span class='pt14'>bool</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='24'></td><td><span> </span><span class='pt13 it'>/// Filled in at link time to avoid serializing it multiple times</span></td></tr>
<tr><td class='ln' data-ln='25'></td><td><span> #[</span><span class='pt7'>serde</span><span>(skip_serializing, skip_deserializing)]</span></td></tr>
<tr><td class='ln' data-ln='26'></td><td><span> </span><span class='pt14'>pub</span><span> </span><span class='pt6'>prototype</span><span>: </span><span class='pt17'>Option</span><span><ContextPtr>,</span></td></tr>
<tr><td class='ln' data-ln='27'></td><td><span> #[</span><span class='pt7'>serde</span><span>(serialize_with = </span><span class='pt8'>"ordered_map"</span><span>)]</span></td></tr>
<tr><td class='ln' data-ln='28'></td><td><span> </span><span class='pt14'>pub</span><span> </span><span class='pt6'>variables</span><span>: </span><span class='pt17'>HashMap</span><span><</span><span class='pt17'>String</span><span>, </span><span class='pt17'>String</span><span>>,</span></td></tr>
<tr><td class='ln' data-ln='29'></td><td><span> #[</span><span class='pt7'>serde</span><span>(serialize_with = </span><span class='pt8'>"ordered_map"</span><span>)]</span></td></tr>
<tr><td class='ln' data-ln='30'></td><td><span> </span><span class='pt14'>pub</span><span> </span><span class='pt6'>contexts</span><span>: </span><span class='pt17'>HashMap</span><span><</span><span class='pt17'>String</span><span>, ContextPtr>,</span></td></tr>
<tr><td class='ln' data-ln='31'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='32'></td><td> </td></tr>
<tr><td class='ln' data-ln='33'></td><td><span class='pt14'>impl</span><span> </span><span class='pt15'>Context</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='34'></td><td><span> </span><span class='pt13 it'>/// Returns the match pattern at an index, panics if the thing isn't a match pattern</span></td></tr>
<tr><td class='ln' data-ln='35'></td><td><span> </span><span class='pt14'>pub</span><span> </span><span class='pt14'>fn</span><span> </span><span class='pt7'>match_at</span><span>(&</span><span class='pt17'>self</span><span>, index: </span><span class='pt14'>usize</span><span>) -> &MatchPattern {</span></td></tr>
<tr><td class='ln' data-ln='36'></td><td><span> </span><span class='pt14'>match</span><span> </span><span class='pt17'>self</span><span>.patterns[index] {</span></td></tr>
<tr><td class='ln' data-ln='37'></td><td><span> Pattern</span><span class='pt14'>::</span><span>Match(</span><span class='pt14'>ref</span><span> match_pat) => match_pat,</span></td></tr>
<tr><td class='ln' data-ln='38'></td><td><span> _ => </span><span class='pt4'>panic!</span><span>(</span><span class='pt8'>"bad index to match_at"</span><span>),</span></td></tr>
<tr><td class='ln' data-ln='39'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='40'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='41'></td><td> </td></tr>
<tr><td class='ln' data-ln='42'></td><td><span> </span><span class='pt13 it'>/// Returns a mutable reference, otherwise like `match_at`</span></td></tr>
<tr><td class='ln' data-ln='43'></td><td><span> </span><span class='pt14'>pub</span><span> </span><span class='pt14'>fn</span><span> </span><span class='pt7'>match_at_mut</span><span>(&</span><span class='pt14'>mut</span><span> </span><span class='pt17'>self</span><span>, index: </span><span class='pt14'>usize</span><span>) -> &</span><span class='pt14'>mut</span><span> MatchPattern {</span></td></tr>
<tr><td class='ln' data-ln='44'></td><td><span> </span><span class='pt14'>match</span><span> </span><span class='pt17'>self</span><span>.patterns[index] {</span></td></tr>
<tr><td class='ln' data-ln='45'></td><td><span> Pattern</span><span class='pt14'>::</span><span>Match(</span><span class='pt14'>ref</span><span> </span><span class='pt14'>mut</span><span> match_pat) => match_pat,</span></td></tr>
<tr><td class='ln' data-ln='46'></td><td><span> _ => </span><span class='pt4'>panic!</span><span>(</span><span class='pt8'>"bad index to match_at"</span><span>),</span></td></tr>
<tr><td class='ln' data-ln='47'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='48'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='49'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='50'></td><td> </td></tr>
<tr><td class='ln' data-ln='51'></td><td><span class='pt14'>impl</span><span> </span><span class='pt15'>ContextReference</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='52'></td><td><span> </span><span class='pt13 it'>/// find the pointed to context, panics if ref is not linked</span></td></tr>
<tr><td class='ln' data-ln='53'></td><td><span> </span><span class='pt14'>pub</span><span> </span><span class='pt14'>fn</span><span> </span><span class='pt7'>resolve</span><span>(&</span><span class='pt17'>self</span><span>) -> ContextPtr {</span></td></tr>
<tr><td class='ln' data-ln='54'></td><td><span> </span><span class='pt14'>match</span><span> *</span><span class='pt17'>self</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='55'></td><td><span> ContextReference</span><span class='pt14'>::</span><span>Inline(</span><span class='pt14'>ref</span><span> ptr) => ptr.</span><span class='pt7'>clone</span><span>(),</span></td></tr>
<tr><td class='ln' data-ln='56'></td><td><span> ContextReference</span><span class='pt14'>::</span><span>Direct(</span><span class='pt14'>ref</span><span> ptr) => ptr.link.</span><span class='pt7'>upgrade</span><span>().</span><span class='pt7'>unwrap</span><span>(),</span></td></tr>
<tr><td class='ln' data-ln='57'></td><td><span> _ => </span><span class='pt4'>panic!</span><span>(</span><span class='pt8'>"Can only call resolve on linked references: </span><span class='pt12'>{:?}</span><span class='pt8'>"</span><span>, </span><span class='pt17'>self</span><span>),</span></td></tr>
<tr><td class='ln' data-ln='58'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='59'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='60'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='61'></td><td> </td></tr>
<tr><td class='ln' data-ln='62'></td><td><span class='pt14'>impl</span><span> </span><span class='pt15'>MatchPattern</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='63'></td><td><span> </span><span class='pt13 it'>/// substitutes back-refs in Regex with regions from s</span></td></tr>
<tr><td class='ln' data-ln='64'></td><td><span> </span><span class='pt13 it'>/// used for match patterns which refer to captures from the pattern</span></td></tr>
<tr><td class='ln' data-ln='65'></td><td><span> </span><span class='pt13 it'>/// that pushed them.</span></td></tr>
<tr><td class='ln' data-ln='66'></td><td><span> </span><span class='pt14'>pub</span><span> </span><span class='pt14'>fn</span><span> </span><span class='pt7'>regex_with_substitutes</span><span>(&</span><span class='pt17'>self</span><span>, region: &Region, s: &</span><span class='pt14'>str</span><span>) -> </span><span class='pt17'>String</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='67'></td><td><span> </span><span class='pt14'>let</span><span> </span><span class='pt14'>mut</span><span> reg_str = </span><span class='pt17'>String</span><span class='pt14'>::</span><span class='pt7'>new</span><span>();</span></td></tr>
<tr><td class='ln' data-ln='68'></td><td><span> </span><span class='pt14'>let</span><span> </span><span class='pt14'>mut</span><span> last_was_escape = </span><span class='pt12'>false</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='69'></td><td> </td></tr>
<tr><td class='ln' data-ln='70'></td><td><span> </span><span class='pt14'>for</span><span> c in </span><span class='pt17'>self</span><span>.regex_str.</span><span class='pt7'>chars</span><span>() {</span></td></tr>
<tr><td class='ln' data-ln='71'></td><td><span> </span><span class='pt14'>if</span><span> last_was_escape && c.</span><span class='pt7'>is_digit</span><span>(</span><span class='pt12'>10</span><span>) {</span></td></tr>
<tr><td class='ln' data-ln='72'></td><td><span> </span><span class='pt14'>let</span><span> val = c.</span><span class='pt7'>to_digit</span><span>(</span><span class='pt12'>10</span><span>).</span><span class='pt7'>unwrap</span><span>();</span></td></tr>
<tr><td class='ln' data-ln='73'></td><td> </td></tr>
<tr><td class='ln' data-ln='74'></td><td><span> </span><span class='pt14'>if</span><span> </span><span class='pt14'>let</span><span> </span><span class='pt12'>Some</span><span>((start, end)) = region.</span><span class='pt7'>pos</span><span>(val as </span><span class='pt14'>usize</span><span>) {</span></td></tr>
<tr><td class='ln' data-ln='75'></td><td><span> </span><span class='pt14'>let</span><span> escaped = </span><span class='pt7'>escape</span><span>(&s[start..end]);</span></td></tr>
<tr><td class='ln' data-ln='76'></td><td><span> reg_str.</span><span class='pt7'>push_str</span><span>(&escaped);</span></td></tr>
<tr><td class='ln' data-ln='77'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='78'></td><td><span> } </span><span class='pt14'>else</span><span> </span><span class='pt14'>if</span><span> last_was_escape {</span></td></tr>
<tr><td class='ln' data-ln='79'></td><td><span> reg_str.</span><span class='pt7'>push</span><span>(</span><span class='pt8'>'</span><span class='pt4'>\\</span><span class='pt8'>'</span><span>);</span></td></tr>
<tr><td class='ln' data-ln='80'></td><td><span> reg_str.</span><span class='pt7'>push</span><span>(c);</span></td></tr>
<tr><td class='ln' data-ln='81'></td><td><span> } </span><span class='pt14'>else</span><span> </span><span class='pt14'>if</span><span> c != </span><span class='pt8'>'</span><span class='pt4'>\\</span><span class='pt8'>'</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='82'></td><td><span> reg_str.</span><span class='pt7'>push</span><span>(c);</span></td></tr>
<tr><td class='ln' data-ln='83'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='84'></td><td> </td></tr>
<tr><td class='ln' data-ln='85'></td><td><span> last_was_escape = c == </span><span class='pt8'>'</span><span class='pt4'>\\</span><span class='pt8'>'</span><span> && !last_was_escape;</span></td></tr>
<tr><td class='ln' data-ln='86'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='87'></td><td><span> reg_str</span></td></tr>
<tr><td class='ln' data-ln='88'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='89'></td><td> </td></tr>
<tr><td class='ln' data-ln='90'></td><td><span> </span><span class='pt13 it'>/// Makes sure the regex is compiled if it doesn't have captures.</span></td></tr>
<tr><td class='ln' data-ln='91'></td><td><span> </span><span class='pt13 it'>/// May compile the regex if it isn't, panicing if compilation fails.</span></td></tr>
<tr><td class='ln' data-ln='92'></td><td><span> #[inline]</span></td></tr>
<tr><td class='ln' data-ln='93'></td><td><span> </span><span class='pt14'>pub</span><span> </span><span class='pt14'>fn</span><span> </span><span class='pt7'>ensure_compiled_if_possible</span><span>(&</span><span class='pt14'>mut</span><span> </span><span class='pt17'>self</span><span>) {</span></td></tr>
<tr><td class='ln' data-ln='94'></td><td><span> </span><span class='pt14'>if</span><span> </span><span class='pt17'>self</span><span>.regex.</span><span class='pt7'>is_none</span><span>() && !</span><span class='pt17'>self</span><span>.has_captures {</span></td></tr>
<tr><td class='ln' data-ln='95'></td><td><span> </span><span class='pt17'>self</span><span>.</span><span class='pt7'>compile_regex</span><span>();</span></td></tr>
<tr><td class='ln' data-ln='96'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='97'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='98'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='99'></td><td> </td></tr>
<tr><td class='ln' data-ln='100'></td><td><span class='pt13 it'>/// This wrapper only exists so that I can implement a serialization</span></td></tr>
<tr><td class='ln' data-ln='101'></td><td><span class='pt13 it'>/// trait that crashes if you try and serialize this.</span></td></tr>
<tr><td class='ln' data-ln='102'></td><td><span>#[</span><span class='pt7'>derive</span><span>(</span><span class='pt17'>Debug</span><span>)]</span></td></tr>
<tr><td class='ln' data-ln='103'></td><td><span class='pt14'>pub</span><span> </span><span class='pt14'>struct</span><span> </span><span class='pt15'>LinkerLink</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='104'></td><td><span> </span><span class='pt14'>pub</span><span> </span><span class='pt6'>link</span><span>: Weak<RefCell<Context>>,</span></td></tr>
<tr><td class='ln' data-ln='105'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='106'></td><td> </td></tr>
<tr><td class='ln' data-ln='107'></td><td><span class='pt14'>impl</span><span> </span><span class='pt17'>Eq</span><span> </span><span class='pt14'>for</span><span> </span><span class='pt15'>LinkerLink</span><span> {}</span></td></tr>
<tr><td class='ln' data-ln='108'></td><td> </td></tr>
<tr><td class='ln' data-ln='109'></td><td><span class='pt14'>impl</span><span> </span><span class='pt17'>PartialEq</span><span> </span><span class='pt14'>for</span><span> </span><span class='pt15'>LinkerLink</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='110'></td><td><span> </span><span class='pt14'>fn</span><span> </span><span class='pt7'>eq</span><span>(&</span><span class='pt17'>self</span><span>, other: &LinkerLink) -> </span><span class='pt14'>bool</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='111'></td><td><span> </span><span class='pt17'>self</span><span>.link.</span><span class='pt7'>upgrade</span><span>() == other.link.</span><span class='pt7'>upgrade</span><span>()</span></td></tr>
<tr><td class='ln' data-ln='112'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='113'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='114'></td><td> </td></tr>
<tr><td class='ln' data-ln='115'></td><td><span class='pt13 it'>/// Just panics, we can't do anything with linked up syntaxes</span></td></tr>
<tr><td class='ln' data-ln='116'></td><td><span class='pt14'>impl</span><span> Serialize </span><span class='pt14'>for</span><span> </span><span class='pt15'>LinkerLink</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='117'></td><td><span> </span><span class='pt14'>fn</span><span> </span><span class='pt7'>serialize</span><span><S>(&</span><span class='pt17'>self</span><span>, _: S) -> </span><span class='pt17'>Result</span><span><</span><span class='pt14'>S::</span><span class='pt12'>Ok</span><span>, </span><span class='pt14'>S::</span><span>Error> </span><span class='pt14'>where</span><span> S: Serializer {</span></td></tr>
<tr><td class='ln' data-ln='118'></td><td><span> </span><span class='pt4'>panic!</span><span>(</span><span class='pt8'>"Can't serialize syntax definitions which have been linked"</span><span>);</span></td></tr>
<tr><td class='ln' data-ln='119'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='120'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='121'></td><td> </td></tr>
<tr><td class='ln' data-ln='122'></td><td><span class='pt13 it'>/// Just panics, we can't do anything with linked up syntaxes</span></td></tr>
<tr><td class='ln' data-ln='123'></td><td><span class='pt14'>impl</span><span><</span><span class='pt5'>'de</span><span>> Deserialize<</span><span class='pt5'>'de</span><span>> </span><span class='pt14'>for</span><span> </span><span class='pt15'>LinkerLink</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='124'></td><td><span> </span><span class='pt14'>fn</span><span> </span><span class='pt7'>deserialize</span><span><D>(_: D) -> </span><span class='pt17'>Result</span><span><</span><span class='pt14'>Self</span><span>, </span><span class='pt14'>D::</span><span>Error> </span><span class='pt14'>where</span><span> D: Deserializer<'de> {</span></td></tr>
<tr><td class='ln' data-ln='125'></td><td><span> </span><span class='pt4'>panic!</span><span>(</span><span class='pt8'>"No linked syntax should ever have gotten serialized"</span><span>);</span></td></tr>
<tr><td class='ln' data-ln='126'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='127'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='128'></td><td> </td></tr>
<tr><td class='ln' data-ln='129'></td><td> </td></tr>
<tr><td class='ln' data-ln='130'></td><td><span class='pt13 it'>/// Serialize the provided map in natural key order, so that it's deterministic when dumping.</span></td></tr>
<tr><td class='ln' data-ln='131'></td><td><span class='pt14'>fn</span><span> </span><span class='pt7'>ordered_map</span><span><K, V, S>(map: &</span><span class='pt17'>HashMap</span><span><K, V>, serializer: S) -> </span><span class='pt17'>Result</span><span><</span><span class='pt14'>S::</span><span class='pt12'>Ok</span><span>, </span><span class='pt14'>S::</span><span>Error></span></td></tr>
<tr><td class='ln' data-ln='132'></td><td><span> </span><span class='pt14'>where</span><span> S: Serializer, K: Eq + Hash + Ord + Serialize, V: Serialize</span></td></tr>
<tr><td class='ln' data-ln='133'></td><td><span>{</span></td></tr>
<tr><td class='ln' data-ln='134'></td><td><span> </span><span class='pt14'>let</span><span> ordered: BTreeMap<_, _> = map.</span><span class='pt7'>iter</span><span>().</span><span class='pt7'>collect</span><span>();</span></td></tr>
<tr><td class='ln' data-ln='135'></td><td><span> ordered.</span><span class='pt7'>serialize</span><span>(serializer)</span></td></tr>
<tr><td class='ln' data-ln='136'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='137'></td><td> </td></tr>
<tr><td class='ln' data-ln='138'></td><td> </td></tr>
<tr><td class='ln' data-ln='139'></td><td><span>#[</span><span class='pt7'>cfg</span><span>(test)]</span></td></tr>
<tr><td class='ln' data-ln='140'></td><td><span class='pt14'>mod</span><span> tests {</span></td></tr>
<tr><td class='ln' data-ln='141'></td><td><span> </span><span class='pt14'>use</span><span> </span><span class='pt14'>super::</span><span>*;</span></td></tr>
<tr><td class='ln' data-ln='142'></td><td> </td></tr>
<tr><td class='ln' data-ln='143'></td><td><span> #[test]</span></td></tr>
<tr><td class='ln' data-ln='144'></td><td><span> </span><span class='pt14'>fn</span><span> </span><span class='pt7'>can_compile_refs</span><span>() {</span></td></tr>
<tr><td class='ln' data-ln='145'></td><td><span> </span><span class='pt14'>use</span><span> onig</span><span class='pt14'>::</span><span>{SearchOptions, Regex, Region};</span></td></tr>
<tr><td class='ln' data-ln='146'></td><td> </td></tr>
<tr><td class='ln' data-ln='147'></td><td><span> </span><span class='pt14'>let</span><span> pat = MatchPattern {</span></td></tr>
<tr><td class='ln' data-ln='148'></td><td><span> has_captures: </span><span class='pt12'>true</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='149'></td><td><span> regex_str: </span><span class='pt17'>String</span><span class='pt14'>::</span><span class='pt7'>from</span><span>(</span><span class='pt14'>r</span><span class='pt8'>"lol \\ \2 \1 '\9' \wz"</span><span>),</span></td></tr>
<tr><td class='ln' data-ln='150'></td><td><span> regex: </span><span class='pt12'>None</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='151'></td><td><span> scope: </span><span class='pt4'>vec!</span><span>[],</span></td></tr>
<tr><td class='ln' data-ln='152'></td><td><span> captures: </span><span class='pt12'>None</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='153'></td><td><span> operation: MatchOperation</span><span class='pt14'>::</span><span class='pt12'>None</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='154'></td><td><span> with_prototype: </span><span class='pt12'>None</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='155'></td><td><span> };</span></td></tr>
<tr><td class='ln' data-ln='156'></td><td> </td></tr>
<tr><td class='ln' data-ln='157'></td><td><span> </span><span class='pt14'>let</span><span> r = Regex</span><span class='pt14'>::</span><span class='pt7'>new</span><span>(</span><span class='pt14'>r</span><span class='pt8'>"(\\\[\]\(\))(b)(c)(d)(e)"</span><span>).</span><span class='pt7'>unwrap</span><span>();</span></td></tr>
<tr><td class='ln' data-ln='158'></td><td><span> </span><span class='pt14'>let</span><span> </span><span class='pt14'>mut</span><span> region = Region</span><span class='pt14'>::</span><span class='pt7'>new</span><span>();</span></td></tr>
<tr><td class='ln' data-ln='159'></td><td><span> </span><span class='pt14'>let</span><span> s = </span><span class='pt14'>r</span><span class='pt8'>"\[]()bcde"</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='160'></td><td> </td></tr>
<tr><td class='ln' data-ln='161'></td><td><span> </span><span class='pt4'>assert!</span><span>(r.</span><span class='pt7'>match_with_options</span><span>(s, </span><span class='pt12'>0</span><span>, SearchOptions</span><span class='pt14'>::</span><span class='pt12'>SEARCH_OPTION_NONE</span><span>, </span><span class='pt12'>Some</span><span>(&</span><span class='pt14'>mut</span><span> region)).</span><span class='pt7'>is_some</span><span>());</span></td></tr>
<tr><td class='ln' data-ln='162'></td><td> </td></tr>
<tr><td class='ln' data-ln='163'></td><td><span> </span><span class='pt14'>let</span><span> regex_res = pat.</span><span class='pt7'>regex_with_substitutes</span><span>(&region, s);</span></td></tr>
<tr><td class='ln' data-ln='164'></td><td><span> </span><span class='pt4'>assert_eq!</span><span>(regex_res, </span><span class='pt14'>r</span><span class='pt8'>"lol \\ b \\\[\]\(\) '' \wz"</span><span>);</span></td></tr>
<tr><td class='ln' data-ln='165'></td><td><span> pat.</span><span class='pt7'>compile_with_refs</span><span>(&region, s);</span></td></tr>
<tr><td class='ln' data-ln='166'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='167'></td><td><span>}</span></td></tr>
</table>
</div>
</div>
</div>
<div class='style' id='P--one_monokai--rs'>
<div class='P--one_monokai-bordered'>
<div class="info header">
<span class="left">syntax_definition.rs</span>
<span class="right"><span>167 lines</span><span>5.55 KB</span></span>
</div>
<div class='P--one_monokai'>
<table>
<tr><td class='ln' data-ln='1'></td><td><span class='pt10'>use</span><span> std</span><span class='pt10'>::</span><span>collections</span><span class='pt10'>::</span><span>{BTreeMap, HashMap};</span></td></tr>
<tr><td class='ln' data-ln='2'></td><td><span class='pt10'>use</span><span> std</span><span class='pt10'>::</span><span>hash</span><span class='pt10'>::</span><span>Hash;</span></td></tr>
<tr><td class='ln' data-ln='3'></td><td><span class='pt10'>use</span><span> onig</span><span class='pt10'>::</span><span>{Regex, RegexOptions, Region, Syntax};</span></td></tr>
<tr><td class='ln' data-ln='4'></td><td><span class='pt10'>use</span><span> std</span><span class='pt10'>::</span><span>rc</span><span class='pt10'>::</span><span>{Rc, Weak};</span></td></tr>
<tr><td class='ln' data-ln='5'></td><td><span class='pt10'>use</span><span> std</span><span class='pt10'>::</span><span>cell</span><span class='pt10'>::</span><span>RefCell;</span></td></tr>
<tr><td class='ln' data-ln='6'></td><td><span class='pt10'>use</span><span> </span><span class='pt10'>super::</span><span>scope</span><span class='pt10'>::*</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='7'></td><td><span class='pt10'>use</span><span> regex_syntax</span><span class='pt10'>::</span><span>escape;</span></td></tr>
<tr><td class='ln' data-ln='8'></td><td class='hi'><span class='pt10'>use</span><span> serde</span><span class='pt10'>::</span><span>{Deserialize, Deserializer, Serialize, Serializer};</span></td></tr>
<tr><td class='ln' data-ln='9'></td><td> </td></tr>
<tr><td class='ln' data-ln='10'></td><td><span class='pt4 it'>/// The main data structure representing a syntax definition loaded from a</span></td></tr>
<tr><td class='ln' data-ln='11'></td><td><span class='pt4 it'>/// `.sublime-syntax` file. You'll probably only need these as references</span></td></tr>
<tr><td class='ln' data-ln='12'></td><td><span class='pt4 it'>/// to be passed around to parsing code.</span></td></tr>
<tr><td class='ln' data-ln='13'></td><td><span class='pt4 it'>///</span></td></tr>
<tr><td class='ln' data-ln='14'></td><td><span class='pt4 it'>/// Some useful public fields are the `name` field which is a human readable</span></td></tr>
<tr><td class='ln' data-ln='15'></td><td><span class='pt4 it'>/// name to display in syntax lists, and the `hidden` field which means hide</span></td></tr>
<tr><td class='ln' data-ln='16'></td><td><span class='pt4 it'>/// this syntax from any lists because it is for internal use.</span></td></tr>
<tr><td class='ln' data-ln='17'></td><td><span>#[</span><span class='pt7'>derive</span><span>(</span><span class='pt3'>Clone</span><span>, </span><span class='pt3'>Debug</span><span>, </span><span class='pt3'>Eq</span><span>, </span><span class='pt3'>PartialEq</span><span>, Serialize, Deserialize)]</span></td></tr>
<tr><td class='ln' data-ln='18'></td><td><span class='pt10'>pub</span><span> </span><span class='pt3'>struct</span><span> </span><span class='pt5'>SyntaxDefinition</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='19'></td><td class='hi'><span> </span><span class='pt10'>pub</span><span> name: </span><span class='pt3'>String</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='20'></td><td class='hi'><span> </span><span class='pt10'>pub</span><span> file_extensions: </span><span class='pt3'>Vec</span><span class='pt10'><</span><span class='pt3'>String</span><span class='pt10'>></span><span>,</span></td></tr>
<tr><td class='ln' data-ln='21'></td><td class='hi'><span> </span><span class='pt10'>pub</span><span> scope: Scope,</span></td></tr>
<tr><td class='ln' data-ln='22'></td><td class='hi'><span> </span><span class='pt10'>pub</span><span> first_line_match: </span><span class='pt3'>Option</span><span class='pt10'><</span><span class='pt3'>String</span><span class='pt10'>></span><span>,</span></td></tr>
<tr><td class='ln' data-ln='23'></td><td class='hi'><span> </span><span class='pt10'>pub</span><span> hidden: </span><span class='pt3'>bool</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='24'></td><td><span> </span><span class='pt4 it'>/// Filled in at link time to avoid serializing it multiple times</span></td></tr>
<tr><td class='ln' data-ln='25'></td><td><span> #[</span><span class='pt7'>serde</span><span>(skip_serializing, skip_deserializing)]</span></td></tr>
<tr><td class='ln' data-ln='26'></td><td><span> </span><span class='pt10'>pub</span><span> prototype: </span><span class='pt3'>Option</span><span class='pt10'><</span><span>ContextPtr</span><span class='pt10'>></span><span>,</span></td></tr>
<tr><td class='ln' data-ln='27'></td><td><span> #[</span><span class='pt7'>serde</span><span>(serialize_with </span><span class='pt10'>=</span><span> </span><span class='pt11'>"ordered_map"</span><span>)]</span></td></tr>
<tr><td class='ln' data-ln='28'></td><td><span> </span><span class='pt10'>pub</span><span> variables: </span><span class='pt3'>HashMap</span><span class='pt10'><</span><span class='pt3'>String</span><span>, </span><span class='pt3'>String</span><span class='pt10'>></span><span>,</span></td></tr>
<tr><td class='ln' data-ln='29'></td><td><span> #[</span><span class='pt7'>serde</span><span>(serialize_with </span><span class='pt10'>=</span><span> </span><span class='pt11'>"ordered_map"</span><span>)]</span></td></tr>
<tr><td class='ln' data-ln='30'></td><td><span> </span><span class='pt10'>pub</span><span> contexts: </span><span class='pt3'>HashMap</span><span class='pt10'><</span><span class='pt3'>String</span><span>, ContextPtr</span><span class='pt10'>></span><span>,</span></td></tr>
<tr><td class='ln' data-ln='31'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='32'></td><td> </td></tr>
<tr><td class='ln' data-ln='33'></td><td><span class='pt3'>impl</span><span> </span><span class='pt5'>Context</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='34'></td><td><span> </span><span class='pt4 it'>/// Returns the match pattern at an index, panics if the thing isn't a match pattern</span></td></tr>
<tr><td class='ln' data-ln='35'></td><td><span> </span><span class='pt10'>pub</span><span> </span><span class='pt10'>fn</span><span> </span><span class='pt7'>match_at</span><span>(</span><span class='pt10'>&self</span><span>, </span><span class='pt9 it'>index</span><span>: </span><span class='pt3'>usize</span><span>) -> </span><span class='pt10'>&</span><span>MatchPattern {</span></td></tr>
<tr><td class='ln' data-ln='36'></td><td><span> </span><span class='pt10'>match</span><span> </span><span class='pt10'>self</span><span>.patterns[index] {</span></td></tr>
<tr><td class='ln' data-ln='37'></td><td><span> Pattern</span><span class='pt10'>::</span><span>Match(</span><span class='pt10'>ref</span><span> match_pat) </span><span class='pt10'>=></span><span> match_pat,</span></td></tr>
<tr><td class='ln' data-ln='38'></td><td><span> _ </span><span class='pt10'>=></span><span> </span><span class='pt7'>panic!</span><span>(</span><span class='pt11'>"bad index to match_at"</span><span>),</span></td></tr>
<tr><td class='ln' data-ln='39'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='40'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='41'></td><td> </td></tr>
<tr><td class='ln' data-ln='42'></td><td><span> </span><span class='pt4 it'>/// Returns a mutable reference, otherwise like `match_at`</span></td></tr>
<tr><td class='ln' data-ln='43'></td><td><span> </span><span class='pt10'>pub</span><span> </span><span class='pt10'>fn</span><span> </span><span class='pt7'>match_at_mut</span><span>(</span><span class='pt10'>&mut</span><span> </span><span class='pt10'>self</span><span>, </span><span class='pt9 it'>index</span><span>: </span><span class='pt3'>usize</span><span>) -> </span><span class='pt10'>&mut</span><span> MatchPattern {</span></td></tr>
<tr><td class='ln' data-ln='44'></td><td><span> </span><span class='pt10'>match</span><span> </span><span class='pt10'>self</span><span>.patterns[index] {</span></td></tr>
<tr><td class='ln' data-ln='45'></td><td><span> Pattern</span><span class='pt10'>::</span><span>Match(</span><span class='pt10'>ref</span><span> </span><span class='pt10'>mut</span><span> match_pat) </span><span class='pt10'>=></span><span> match_pat,</span></td></tr>
<tr><td class='ln' data-ln='46'></td><td><span> _ </span><span class='pt10'>=></span><span> </span><span class='pt7'>panic!</span><span>(</span><span class='pt11'>"bad index to match_at"</span><span>),</span></td></tr>
<tr><td class='ln' data-ln='47'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='48'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='49'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='50'></td><td> </td></tr>
<tr><td class='ln' data-ln='51'></td><td><span class='pt3'>impl</span><span> </span><span class='pt5'>ContextReference</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='52'></td><td><span> </span><span class='pt4 it'>/// find the pointed to context, panics if ref is not linked</span></td></tr>
<tr><td class='ln' data-ln='53'></td><td><span> </span><span class='pt10'>pub</span><span> </span><span class='pt10'>fn</span><span> </span><span class='pt7'>resolve</span><span>(</span><span class='pt10'>&self</span><span>) -> ContextPtr {</span></td></tr>
<tr><td class='ln' data-ln='54'></td><td><span> </span><span class='pt10'>match</span><span> </span><span class='pt10'>*self</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='55'></td><td><span> ContextReference</span><span class='pt10'>::</span><span>Inline(</span><span class='pt10'>ref</span><span> ptr) </span><span class='pt10'>=></span><span> ptr.</span><span class='pt7'>clone</span><span>(),</span></td></tr>
<tr><td class='ln' data-ln='56'></td><td><span> ContextReference</span><span class='pt10'>::</span><span>Direct(</span><span class='pt10'>ref</span><span> ptr) </span><span class='pt10'>=></span><span> ptr.link.</span><span class='pt7'>upgrade</span><span>().</span><span class='pt7'>unwrap</span><span>(),</span></td></tr>
<tr><td class='ln' data-ln='57'></td><td><span> _ </span><span class='pt10'>=></span><span> </span><span class='pt7'>panic!</span><span>(</span><span class='pt11'>"Can only call resolve on linked references: </span><span class='pt3'>{:?}</span><span class='pt11'>"</span><span>, </span><span class='pt10'>self</span><span>),</span></td></tr>
<tr><td class='ln' data-ln='58'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='59'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='60'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='61'></td><td> </td></tr>
<tr><td class='ln' data-ln='62'></td><td><span class='pt3'>impl</span><span> </span><span class='pt5'>MatchPattern</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='63'></td><td><span> </span><span class='pt4 it'>/// substitutes back-refs in Regex with regions from s</span></td></tr>
<tr><td class='ln' data-ln='64'></td><td><span> </span><span class='pt4 it'>/// used for match patterns which refer to captures from the pattern</span></td></tr>
<tr><td class='ln' data-ln='65'></td><td><span> </span><span class='pt4 it'>/// that pushed them.</span></td></tr>
<tr><td class='ln' data-ln='66'></td><td><span> </span><span class='pt10'>pub</span><span> </span><span class='pt10'>fn</span><span> </span><span class='pt7'>regex_with_substitutes</span><span>(</span><span class='pt10'>&self</span><span>, </span><span class='pt9 it'>region</span><span>: </span><span class='pt10'>&</span><span>Region, </span><span class='pt9 it'>s</span><span>: </span><span class='pt10'>&</span><span class='pt3'>str</span><span>) -> </span><span class='pt3'>String</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='67'></td><td><span> </span><span class='pt10'>let</span><span> </span><span class='pt10'>mut</span><span> reg_str </span><span class='pt10'>=</span><span> </span><span class='pt3'>String</span><span class='pt10'>::</span><span class='pt7'>new</span><span>();</span></td></tr>
<tr><td class='ln' data-ln='68'></td><td><span> </span><span class='pt10'>let</span><span> </span><span class='pt10'>mut</span><span> last_was_escape </span><span class='pt10'>=</span><span> </span><span class='pt3'>false</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='69'></td><td> </td></tr>
<tr><td class='ln' data-ln='70'></td><td><span> </span><span class='pt10'>for</span><span> c </span><span class='pt10'>in</span><span> </span><span class='pt10'>self</span><span>.regex_str.</span><span class='pt7'>chars</span><span>() {</span></td></tr>
<tr><td class='ln' data-ln='71'></td><td><span> </span><span class='pt10'>if</span><span> last_was_escape </span><span class='pt10'>&&</span><span> c.</span><span class='pt7'>is_digit</span><span>(</span><span class='pt8'>10</span><span>) {</span></td></tr>
<tr><td class='ln' data-ln='72'></td><td><span> </span><span class='pt10'>let</span><span> val </span><span class='pt10'>=</span><span> c.</span><span class='pt7'>to_digit</span><span>(</span><span class='pt8'>10</span><span>).</span><span class='pt7'>unwrap</span><span>();</span></td></tr>
<tr><td class='ln' data-ln='73'></td><td> </td></tr>
<tr><td class='ln' data-ln='74'></td><td><span> </span><span class='pt10'>if</span><span> </span><span class='pt10'>let</span><span> </span><span class='pt3'>Some</span><span>((start, end)) </span><span class='pt10'>=</span><span> region.</span><span class='pt7'>pos</span><span>(val </span><span class='pt10'>as</span><span> </span><span class='pt3'>usize</span><span>) {</span></td></tr>
<tr><td class='ln' data-ln='75'></td><td><span> </span><span class='pt10'>let</span><span> escaped </span><span class='pt10'>=</span><span> </span><span class='pt7'>escape</span><span>(</span><span class='pt10'>&</span><span>s[start</span><span class='pt10'>..</span><span>end]);</span></td></tr>
<tr><td class='ln' data-ln='76'></td><td><span> reg_str.</span><span class='pt7'>push_str</span><span>(</span><span class='pt10'>&</span><span>escaped);</span></td></tr>
<tr><td class='ln' data-ln='77'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='78'></td><td><span> } </span><span class='pt10'>else</span><span> </span><span class='pt10'>if</span><span> last_was_escape {</span></td></tr>
<tr><td class='ln' data-ln='79'></td><td><span> reg_str.</span><span class='pt7'>push</span><span>(</span><span class='pt11'>'</span><span class='pt3'>\\</span><span class='pt11'>'</span><span>);</span></td></tr>
<tr><td class='ln' data-ln='80'></td><td><span> reg_str.</span><span class='pt7'>push</span><span>(c);</span></td></tr>
<tr><td class='ln' data-ln='81'></td><td><span> } </span><span class='pt10'>else</span><span> </span><span class='pt10'>if</span><span> c </span><span class='pt10'>!=</span><span> </span><span class='pt11'>'</span><span class='pt3'>\\</span><span class='pt11'>'</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='82'></td><td><span> reg_str.</span><span class='pt7'>push</span><span>(c);</span></td></tr>
<tr><td class='ln' data-ln='83'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='84'></td><td> </td></tr>
<tr><td class='ln' data-ln='85'></td><td><span> last_was_escape </span><span class='pt10'>=</span><span> c </span><span class='pt10'>==</span><span> </span><span class='pt11'>'</span><span class='pt3'>\\</span><span class='pt11'>'</span><span> </span><span class='pt10'>&&</span><span> </span><span class='pt10'>!</span><span>last_was_escape;</span></td></tr>
<tr><td class='ln' data-ln='86'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='87'></td><td><span> reg_str</span></td></tr>
<tr><td class='ln' data-ln='88'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='89'></td><td> </td></tr>
<tr><td class='ln' data-ln='90'></td><td><span> </span><span class='pt4 it'>/// Makes sure the regex is compiled if it doesn't have captures.</span></td></tr>
<tr><td class='ln' data-ln='91'></td><td><span> </span><span class='pt4 it'>/// May compile the regex if it isn't, panicing if compilation fails.</span></td></tr>
<tr><td class='ln' data-ln='92'></td><td><span> #[inline]</span></td></tr>
<tr><td class='ln' data-ln='93'></td><td><span> </span><span class='pt10'>pub</span><span> </span><span class='pt10'>fn</span><span> </span><span class='pt7'>ensure_compiled_if_possible</span><span>(</span><span class='pt10'>&mut</span><span> </span><span class='pt10'>self</span><span>) {</span></td></tr>
<tr><td class='ln' data-ln='94'></td><td><span> </span><span class='pt10'>if</span><span> </span><span class='pt10'>self</span><span>.regex.</span><span class='pt7'>is_none</span><span>() </span><span class='pt10'>&&</span><span> </span><span class='pt10'>!self</span><span>.has_captures {</span></td></tr>
<tr><td class='ln' data-ln='95'></td><td><span> </span><span class='pt10'>self</span><span>.</span><span class='pt7'>compile_regex</span><span>();</span></td></tr>
<tr><td class='ln' data-ln='96'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='97'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='98'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='99'></td><td> </td></tr>
<tr><td class='ln' data-ln='100'></td><td><span class='pt4 it'>/// This wrapper only exists so that I can implement a serialization</span></td></tr>
<tr><td class='ln' data-ln='101'></td><td><span class='pt4 it'>/// trait that crashes if you try and serialize this.</span></td></tr>
<tr><td class='ln' data-ln='102'></td><td><span>#[</span><span class='pt7'>derive</span><span>(</span><span class='pt3'>Debug</span><span>)]</span></td></tr>
<tr><td class='ln' data-ln='103'></td><td><span class='pt10'>pub</span><span> </span><span class='pt3'>struct</span><span> </span><span class='pt5'>LinkerLink</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='104'></td><td><span> </span><span class='pt10'>pub</span><span> link: Weak</span><span class='pt10'><</span><span>RefCell</span><span class='pt10'><</span><span>Context</span><span class='pt10'>>></span><span>,</span></td></tr>
<tr><td class='ln' data-ln='105'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='106'></td><td> </td></tr>
<tr><td class='ln' data-ln='107'></td><td><span class='pt3'>impl</span><span> </span><span class='pt3'>Eq</span><span> </span><span class='pt10'>for</span><span> </span><span class='pt5'>LinkerLink</span><span> {}</span></td></tr>
<tr><td class='ln' data-ln='108'></td><td> </td></tr>
<tr><td class='ln' data-ln='109'></td><td><span class='pt3'>impl</span><span> </span><span class='pt3'>PartialEq</span><span> </span><span class='pt10'>for</span><span> </span><span class='pt5'>LinkerLink</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='110'></td><td><span> </span><span class='pt10'>fn</span><span> </span><span class='pt7'>eq</span><span>(</span><span class='pt10'>&self</span><span>, </span><span class='pt9 it'>other</span><span>: </span><span class='pt10'>&</span><span>LinkerLink) -> </span><span class='pt3'>bool</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='111'></td><td><span> </span><span class='pt10'>self</span><span>.link.</span><span class='pt7'>upgrade</span><span>() </span><span class='pt10'>==</span><span> other.link.</span><span class='pt7'>upgrade</span><span>()</span></td></tr>
<tr><td class='ln' data-ln='112'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='113'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='114'></td><td> </td></tr>
<tr><td class='ln' data-ln='115'></td><td><span class='pt4 it'>/// Just panics, we can't do anything with linked up syntaxes</span></td></tr>
<tr><td class='ln' data-ln='116'></td><td><span class='pt3'>impl</span><span> Serialize </span><span class='pt10'>for</span><span> </span><span class='pt5'>LinkerLink</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='117'></td><td><span> </span><span class='pt10'>fn</span><span> </span><span class='pt7'>serialize</span><span class='pt10'><</span><span>S</span><span class='pt10'>></span><span>(</span><span class='pt10'>&self</span><span>, </span><span class='pt10'>_</span><span>: S) -> </span><span class='pt3'>Result</span><span class='pt10'><</span><span class='pt3'>S::Ok</span><span>, </span><span class='pt3'>S::</span><span>Error</span><span class='pt10'>></span><span> </span><span class='pt10'>where</span><span> S: Serializer {</span></td></tr>
<tr><td class='ln' data-ln='118'></td><td><span> </span><span class='pt7'>panic!</span><span>(</span><span class='pt11'>"Can't serialize syntax definitions which have been linked"</span><span>);</span></td></tr>
<tr><td class='ln' data-ln='119'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='120'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='121'></td><td> </td></tr>
<tr><td class='ln' data-ln='122'></td><td><span class='pt4 it'>/// Just panics, we can't do anything with linked up syntaxes</span></td></tr>
<tr><td class='ln' data-ln='123'></td><td><span class='pt3'>impl</span><span class='pt10'><'de></span><span> Deserialize</span><span class='pt10'><'de></span><span> </span><span class='pt10'>for</span><span> </span><span class='pt5'>LinkerLink</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='124'></td><td><span> </span><span class='pt10'>fn</span><span> </span><span class='pt7'>deserialize</span><span class='pt10'><</span><span>D</span><span class='pt10'>></span><span>(</span><span class='pt10'>_</span><span>: D) -> </span><span class='pt3'>Result</span><span class='pt10'><</span><span class='pt3'>Self</span><span>, </span><span class='pt3'>D::</span><span>Error</span><span class='pt10'>></span><span> </span><span class='pt10'>where</span><span> D: Deserializer<'de> {</span></td></tr>
<tr><td class='ln' data-ln='125'></td><td><span> </span><span class='pt7'>panic!</span><span>(</span><span class='pt11'>"No linked syntax should ever have gotten serialized"</span><span>);</span></td></tr>
<tr><td class='ln' data-ln='126'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='127'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='128'></td><td> </td></tr>
<tr><td class='ln' data-ln='129'></td><td> </td></tr>
<tr><td class='ln' data-ln='130'></td><td><span class='pt4 it'>/// Serialize the provided map in natural key order, so that it's deterministic when dumping.</span></td></tr>
<tr><td class='ln' data-ln='131'></td><td><span class='pt10'>fn</span><span> </span><span class='pt7'>ordered_map</span><span class='pt10'><</span><span>K, V, S</span><span class='pt10'>></span><span>(</span><span class='pt9 it'>map</span><span>: </span><span class='pt10'>&</span><span class='pt3'>HashMap</span><span class='pt10'><</span><span>K, V</span><span class='pt10'>></span><span>, </span><span class='pt9 it'>serializer</span><span>: S) -> </span><span class='pt3'>Result</span><span class='pt10'><</span><span class='pt3'>S::Ok</span><span>, </span><span class='pt3'>S::</span><span>Error</span><span class='pt10'>></span></td></tr>
<tr><td class='ln' data-ln='132'></td><td><span> </span><span class='pt10'>where</span><span> S: Serializer, K: Eq + Hash + Ord + Serialize, V: Serialize</span></td></tr>
<tr><td class='ln' data-ln='133'></td><td><span>{</span></td></tr>
<tr><td class='ln' data-ln='134'></td><td><span> </span><span class='pt10'>let</span><span> ordered: BTreeMap</span><span class='pt10'><_</span><span>, </span><span class='pt10'>_></span><span> </span><span class='pt10'>=</span><span> map.</span><span class='pt7'>iter</span><span>().</span><span class='pt7'>collect</span><span>();</span></td></tr>
<tr><td class='ln' data-ln='135'></td><td><span> ordered.</span><span class='pt7'>serialize</span><span>(serializer)</span></td></tr>
<tr><td class='ln' data-ln='136'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='137'></td><td> </td></tr>
<tr><td class='ln' data-ln='138'></td><td> </td></tr>
<tr><td class='ln' data-ln='139'></td><td><span>#[</span><span class='pt7'>cfg</span><span>(test)]</span></td></tr>
<tr><td class='ln' data-ln='140'></td><td><span class='pt3'>mod</span><span> </span><span class='pt5'>tests</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='141'></td><td><span> </span><span class='pt10'>use</span><span> </span><span class='pt10'>super::*</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='142'></td><td> </td></tr>
<tr><td class='ln' data-ln='143'></td><td><span> #[test]</span></td></tr>
<tr><td class='ln' data-ln='144'></td><td><span> </span><span class='pt10'>fn</span><span> </span><span class='pt7'>can_compile_refs</span><span>() {</span></td></tr>
<tr><td class='ln' data-ln='145'></td><td><span> </span><span class='pt10'>use</span><span> onig</span><span class='pt10'>::</span><span>{SearchOptions, Regex, Region};</span></td></tr>
<tr><td class='ln' data-ln='146'></td><td> </td></tr>
<tr><td class='ln' data-ln='147'></td><td><span> </span><span class='pt10'>let</span><span> pat </span><span class='pt10'>=</span><span> MatchPattern {</span></td></tr>
<tr><td class='ln' data-ln='148'></td><td><span> has_captures: </span><span class='pt3'>true</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='149'></td><td><span> regex_str: </span><span class='pt3'>String</span><span class='pt10'>::</span><span class='pt7'>from</span><span>(</span><span class='pt3'>r</span><span class='pt11'>"lol \\ \2 \1 '\9' \wz"</span><span>),</span></td></tr>
<tr><td class='ln' data-ln='150'></td><td><span> regex: </span><span class='pt3'>None</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='151'></td><td><span> scope: </span><span class='pt7'>vec!</span><span>[],</span></td></tr>
<tr><td class='ln' data-ln='152'></td><td><span> captures: </span><span class='pt3'>None</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='153'></td><td><span> operation: MatchOperation</span><span class='pt10'>::</span><span class='pt3'>None</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='154'></td><td><span> with_prototype: </span><span class='pt3'>None</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='155'></td><td><span> };</span></td></tr>
<tr><td class='ln' data-ln='156'></td><td> </td></tr>
<tr><td class='ln' data-ln='157'></td><td><span> </span><span class='pt10'>let</span><span> r </span><span class='pt10'>=</span><span> Regex</span><span class='pt10'>::</span><span class='pt7'>new</span><span>(</span><span class='pt3'>r</span><span class='pt11'>"(\\\[\]\(\))(b)(c)(d)(e)"</span><span>).</span><span class='pt7'>unwrap</span><span>();</span></td></tr>
<tr><td class='ln' data-ln='158'></td><td><span> </span><span class='pt10'>let</span><span> </span><span class='pt10'>mut</span><span> region </span><span class='pt10'>=</span><span> Region</span><span class='pt10'>::</span><span class='pt7'>new</span><span>();</span></td></tr>
<tr><td class='ln' data-ln='159'></td><td><span> </span><span class='pt10'>let</span><span> s </span><span class='pt10'>=</span><span> </span><span class='pt3'>r</span><span class='pt11'>"\[]()bcde"</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='160'></td><td> </td></tr>
<tr><td class='ln' data-ln='161'></td><td><span> </span><span class='pt7'>assert!</span><span>(r.</span><span class='pt7'>match_with_options</span><span>(s, </span><span class='pt8'>0</span><span>, SearchOptions</span><span class='pt10'>::</span><span class='pt3'>SEARCH_OPTION_NONE</span><span>, </span><span class='pt3'>Some</span><span>(</span><span class='pt10'>&mut</span><span> region)).</span><span class='pt7'>is_some</span><span>());</span></td></tr>
<tr><td class='ln' data-ln='162'></td><td> </td></tr>
<tr><td class='ln' data-ln='163'></td><td><span> </span><span class='pt10'>let</span><span> regex_res </span><span class='pt10'>=</span><span> pat.</span><span class='pt7'>regex_with_substitutes</span><span>(</span><span class='pt10'>&</span><span>region, s);</span></td></tr>
<tr><td class='ln' data-ln='164'></td><td><span> </span><span class='pt7'>assert_eq!</span><span>(regex_res, </span><span class='pt3'>r</span><span class='pt11'>"lol \\ b \\\[\]\(\) '' \wz"</span><span>);</span></td></tr>
<tr><td class='ln' data-ln='165'></td><td><span> pat.</span><span class='pt7'>compile_with_refs</span><span>(</span><span class='pt10'>&</span><span>region, s);</span></td></tr>
<tr><td class='ln' data-ln='166'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='167'></td><td><span>}</span></td></tr>
</table>
</div>
</div>
</div>
<div class='style' id='P--predawn--rs'>
<div class='P--predawn-bordered'>
<div class="info header">
<span class="left">syntax_definition.rs</span>
<span class="right"><span>167 lines</span><span>5.55 KB</span></span>
</div>
<div class='P--predawn'>
<table>
<tr><td class='ln' data-ln='1'></td><td><span class='pt18'>use</span><span> std</span><span class='pt18'>::</span><span>collections</span><span class='pt18'>::</span><span>{BTreeMap, HashMap};</span></td></tr>
<tr><td class='ln' data-ln='2'></td><td><span class='pt18'>use</span><span> std</span><span class='pt18'>::</span><span>hash</span><span class='pt18'>::</span><span>Hash;</span></td></tr>
<tr><td class='ln' data-ln='3'></td><td><span class='pt18'>use</span><span> onig</span><span class='pt18'>::</span><span>{Regex, RegexOptions, Region, Syntax};</span></td></tr>
<tr><td class='ln' data-ln='4'></td><td><span class='pt18'>use</span><span> std</span><span class='pt18'>::</span><span>rc</span><span class='pt18'>::</span><span>{Rc, Weak};</span></td></tr>
<tr><td class='ln' data-ln='5'></td><td><span class='pt18'>use</span><span> std</span><span class='pt18'>::</span><span>cell</span><span class='pt18'>::</span><span>RefCell;</span></td></tr>
<tr><td class='ln' data-ln='6'></td><td><span class='pt18'>use</span><span> </span><span class='pt18'>super::</span><span>scope</span><span class='pt18'>::*</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='7'></td><td><span class='pt18'>use</span><span> regex_syntax</span><span class='pt18'>::</span><span>escape;</span></td></tr>
<tr><td class='ln' data-ln='8'></td><td class='hi'><span class='pt18'>use</span><span> serde</span><span class='pt18'>::</span><span>{Deserialize, Deserializer, Serialize, Serializer};</span></td></tr>
<tr><td class='ln' data-ln='9'></td><td> </td></tr>
<tr><td class='ln' data-ln='10'></td><td><span class='pt10'>/// The main data structure representing a syntax definition loaded from a</span></td></tr>
<tr><td class='ln' data-ln='11'></td><td><span class='pt10'>/// `.sublime-syntax` file. You'll probably only need these as references</span></td></tr>
<tr><td class='ln' data-ln='12'></td><td><span class='pt10'>/// to be passed around to parsing code.</span></td></tr>
<tr><td class='ln' data-ln='13'></td><td><span class='pt10'>///</span></td></tr>
<tr><td class='ln' data-ln='14'></td><td><span class='pt10'>/// Some useful public fields are the `name` field which is a human readable</span></td></tr>
<tr><td class='ln' data-ln='15'></td><td><span class='pt10'>/// name to display in syntax lists, and the `hidden` field which means hide</span></td></tr>
<tr><td class='ln' data-ln='16'></td><td><span class='pt10'>/// this syntax from any lists because it is for internal use.</span></td></tr>
<tr><td class='ln' data-ln='17'></td><td><span>#[</span><span class='pt11'>derive</span><span>(</span><span class='pt11'>Clone</span><span>, </span><span class='pt11'>Debug</span><span>, </span><span class='pt11'>Eq</span><span>, </span><span class='pt11'>PartialEq</span><span>, Serialize, Deserialize)]</span></td></tr>
<tr><td class='ln' data-ln='18'></td><td><span class='pt16'>pub</span><span> </span><span class='pt16'>struct</span><span> </span><span class='pt11'>SyntaxDefinition</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='19'></td><td class='hi'><span> </span><span class='pt16'>pub</span><span> </span><span class='pt18'>name</span><span>: </span><span class='pt11'>String</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='20'></td><td class='hi'><span> </span><span class='pt16'>pub</span><span> </span><span class='pt18'>file_extensions</span><span>: </span><span class='pt11'>Vec</span><span class='pt18'><</span><span class='pt11'>String</span><span class='pt18'>></span><span>,</span></td></tr>
<tr><td class='ln' data-ln='21'></td><td class='hi'><span> </span><span class='pt16'>pub</span><span> </span><span class='pt18'>scope</span><span>: Scope,</span></td></tr>
<tr><td class='ln' data-ln='22'></td><td class='hi'><span> </span><span class='pt16'>pub</span><span> </span><span class='pt18'>first_line_match</span><span>: </span><span class='pt11'>Option</span><span class='pt18'><</span><span class='pt11'>String</span><span class='pt18'>></span><span>,</span></td></tr>
<tr><td class='ln' data-ln='23'></td><td class='hi'><span> </span><span class='pt16'>pub</span><span> </span><span class='pt18'>hidden</span><span>: </span><span class='pt16'>bool</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='24'></td><td><span> </span><span class='pt10'>/// Filled in at link time to avoid serializing it multiple times</span></td></tr>
<tr><td class='ln' data-ln='25'></td><td><span> #[</span><span class='pt11'>serde</span><span>(skip_serializing, skip_deserializing)]</span></td></tr>
<tr><td class='ln' data-ln='26'></td><td><span> </span><span class='pt16'>pub</span><span> </span><span class='pt18'>prototype</span><span>: </span><span class='pt11'>Option</span><span class='pt18'><</span><span>ContextPtr</span><span class='pt18'>></span><span>,</span></td></tr>
<tr><td class='ln' data-ln='27'></td><td><span> #[</span><span class='pt11'>serde</span><span>(serialize_with </span><span class='pt18'>=</span><span> </span><span class='pt13'>"ordered_map"</span><span>)]</span></td></tr>
<tr><td class='ln' data-ln='28'></td><td><span> </span><span class='pt16'>pub</span><span> </span><span class='pt18'>variables</span><span>: </span><span class='pt11'>HashMap</span><span class='pt18'><</span><span class='pt11'>String</span><span>, </span><span class='pt11'>String</span><span class='pt18'>></span><span>,</span></td></tr>
<tr><td class='ln' data-ln='29'></td><td><span> #[</span><span class='pt11'>serde</span><span>(serialize_with </span><span class='pt18'>=</span><span> </span><span class='pt13'>"ordered_map"</span><span>)]</span></td></tr>
<tr><td class='ln' data-ln='30'></td><td><span> </span><span class='pt16'>pub</span><span> </span><span class='pt18'>contexts</span><span>: </span><span class='pt11'>HashMap</span><span class='pt18'><</span><span class='pt11'>String</span><span>, ContextPtr</span><span class='pt18'>></span><span>,</span></td></tr>
<tr><td class='ln' data-ln='31'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='32'></td><td> </td></tr>
<tr><td class='ln' data-ln='33'></td><td><span class='pt16'>impl</span><span> </span><span class='pt11'>Context</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='34'></td><td><span> </span><span class='pt10'>/// Returns the match pattern at an index, panics if the thing isn't a match pattern</span></td></tr>
<tr><td class='ln' data-ln='35'></td><td><span> </span><span class='pt16'>pub</span><span> </span><span class='pt16'>fn</span><span> </span><span class='pt11'>match_at</span><span>(</span><span class='pt18'>&self</span><span>, </span><span class='pt18'>index</span><span>: </span><span class='pt16'>usize</span><span>) -> </span><span class='pt18'>&</span><span>MatchPattern {</span></td></tr>
<tr><td class='ln' data-ln='36'></td><td><span> </span><span class='pt18'>match</span><span> </span><span class='pt18'>self</span><span>.patterns[index] {</span></td></tr>
<tr><td class='ln' data-ln='37'></td><td><span> Pattern</span><span class='pt18'>::</span><span>Match(</span><span class='pt16'>ref</span><span> match_pat) </span><span class='pt18'>=></span><span> match_pat,</span></td></tr>
<tr><td class='ln' data-ln='38'></td><td><span> _ </span><span class='pt18'>=></span><span> </span><span class='pt11'>panic!</span><span>(</span><span class='pt13'>"bad index to match_at"</span><span>),</span></td></tr>
<tr><td class='ln' data-ln='39'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='40'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='41'></td><td> </td></tr>
<tr><td class='ln' data-ln='42'></td><td><span> </span><span class='pt10'>/// Returns a mutable reference, otherwise like `match_at`</span></td></tr>
<tr><td class='ln' data-ln='43'></td><td><span> </span><span class='pt16'>pub</span><span> </span><span class='pt16'>fn</span><span> </span><span class='pt11'>match_at_mut</span><span>(</span><span class='pt18'>&</span><span class='pt16'>mut</span><span> </span><span class='pt18'>self</span><span>, </span><span class='pt18'>index</span><span>: </span><span class='pt16'>usize</span><span>) -> </span><span class='pt18'>&</span><span class='pt16'>mut</span><span> MatchPattern {</span></td></tr>
<tr><td class='ln' data-ln='44'></td><td><span> </span><span class='pt18'>match</span><span> </span><span class='pt18'>self</span><span>.patterns[index] {</span></td></tr>
<tr><td class='ln' data-ln='45'></td><td><span> Pattern</span><span class='pt18'>::</span><span>Match(</span><span class='pt16'>ref</span><span> </span><span class='pt16'>mut</span><span> match_pat) </span><span class='pt18'>=></span><span> match_pat,</span></td></tr>
<tr><td class='ln' data-ln='46'></td><td><span> _ </span><span class='pt18'>=></span><span> </span><span class='pt11'>panic!</span><span>(</span><span class='pt13'>"bad index to match_at"</span><span>),</span></td></tr>
<tr><td class='ln' data-ln='47'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='48'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='49'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='50'></td><td> </td></tr>
<tr><td class='ln' data-ln='51'></td><td><span class='pt16'>impl</span><span> </span><span class='pt11'>ContextReference</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='52'></td><td><span> </span><span class='pt10'>/// find the pointed to context, panics if ref is not linked</span></td></tr>
<tr><td class='ln' data-ln='53'></td><td><span> </span><span class='pt16'>pub</span><span> </span><span class='pt16'>fn</span><span> </span><span class='pt11'>resolve</span><span>(</span><span class='pt18'>&self</span><span>) -> ContextPtr {</span></td></tr>
<tr><td class='ln' data-ln='54'></td><td><span> </span><span class='pt18'>match</span><span> </span><span class='pt18'>*self</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='55'></td><td><span> ContextReference</span><span class='pt18'>::</span><span>Inline(</span><span class='pt16'>ref</span><span> ptr) </span><span class='pt18'>=></span><span> ptr.</span><span class='pt11'>clone</span><span>(),</span></td></tr>
<tr><td class='ln' data-ln='56'></td><td><span> ContextReference</span><span class='pt18'>::</span><span>Direct(</span><span class='pt16'>ref</span><span> ptr) </span><span class='pt18'>=></span><span> ptr.link.</span><span class='pt11'>upgrade</span><span>().</span><span class='pt11'>unwrap</span><span>(),</span></td></tr>
<tr><td class='ln' data-ln='57'></td><td><span> _ </span><span class='pt18'>=></span><span> </span><span class='pt11'>panic!</span><span>(</span><span class='pt13'>"Can only call resolve on linked references: </span><span class='pt12'>{:?}</span><span class='pt13'>"</span><span>, </span><span class='pt18'>self</span><span>),</span></td></tr>
<tr><td class='ln' data-ln='58'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='59'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='60'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='61'></td><td> </td></tr>
<tr><td class='ln' data-ln='62'></td><td><span class='pt16'>impl</span><span> </span><span class='pt11'>MatchPattern</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='63'></td><td><span> </span><span class='pt10'>/// substitutes back-refs in Regex with regions from s</span></td></tr>
<tr><td class='ln' data-ln='64'></td><td><span> </span><span class='pt10'>/// used for match patterns which refer to captures from the pattern</span></td></tr>
<tr><td class='ln' data-ln='65'></td><td><span> </span><span class='pt10'>/// that pushed them.</span></td></tr>
<tr><td class='ln' data-ln='66'></td><td><span> </span><span class='pt16'>pub</span><span> </span><span class='pt16'>fn</span><span> </span><span class='pt11'>regex_with_substitutes</span><span>(</span><span class='pt18'>&self</span><span>, </span><span class='pt18'>region</span><span>: </span><span class='pt18'>&</span><span>Region, </span><span class='pt18'>s</span><span>: </span><span class='pt18'>&</span><span class='pt16'>str</span><span>) -> </span><span class='pt11'>String</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='67'></td><td><span> </span><span class='pt18'>let</span><span> </span><span class='pt16'>mut</span><span> reg_str </span><span class='pt18'>=</span><span> </span><span class='pt11'>String</span><span class='pt18'>::</span><span class='pt11'>new</span><span>();</span></td></tr>
<tr><td class='ln' data-ln='68'></td><td><span> </span><span class='pt18'>let</span><span> </span><span class='pt16'>mut</span><span> last_was_escape </span><span class='pt18'>=</span><span> </span><span class='pt16'>false</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='69'></td><td> </td></tr>
<tr><td class='ln' data-ln='70'></td><td><span> </span><span class='pt18'>for</span><span> c </span><span class='pt18'>in</span><span> </span><span class='pt18'>self</span><span>.regex_str.</span><span class='pt11'>chars</span><span>() {</span></td></tr>
<tr><td class='ln' data-ln='71'></td><td><span> </span><span class='pt18'>if</span><span> last_was_escape </span><span class='pt18'>&&</span><span> c.</span><span class='pt11'>is_digit</span><span>(</span><span class='pt16'>10</span><span>) {</span></td></tr>
<tr><td class='ln' data-ln='72'></td><td><span> </span><span class='pt18'>let</span><span> val </span><span class='pt18'>=</span><span> c.</span><span class='pt11'>to_digit</span><span>(</span><span class='pt16'>10</span><span>).</span><span class='pt11'>unwrap</span><span>();</span></td></tr>
<tr><td class='ln' data-ln='73'></td><td> </td></tr>
<tr><td class='ln' data-ln='74'></td><td><span> </span><span class='pt18'>if</span><span> </span><span class='pt18'>let</span><span> </span><span class='pt12'>Some</span><span>((start, end)) </span><span class='pt18'>=</span><span> region.</span><span class='pt11'>pos</span><span>(val </span><span class='pt18'>as</span><span> </span><span class='pt16'>usize</span><span>) {</span></td></tr>
<tr><td class='ln' data-ln='75'></td><td><span> </span><span class='pt18'>let</span><span> escaped </span><span class='pt18'>=</span><span> </span><span class='pt11'>escape</span><span>(</span><span class='pt18'>&</span><span>s[start</span><span class='pt18'>..</span><span>end]);</span></td></tr>
<tr><td class='ln' data-ln='76'></td><td><span> reg_str.</span><span class='pt11'>push_str</span><span>(</span><span class='pt18'>&</span><span>escaped);</span></td></tr>
<tr><td class='ln' data-ln='77'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='78'></td><td><span> } </span><span class='pt18'>else</span><span> </span><span class='pt18'>if</span><span> last_was_escape {</span></td></tr>
<tr><td class='ln' data-ln='79'></td><td><span> reg_str.</span><span class='pt11'>push</span><span>(</span><span class='pt13'>'</span><span class='pt12'>\\</span><span class='pt13'>'</span><span>);</span></td></tr>
<tr><td class='ln' data-ln='80'></td><td><span> reg_str.</span><span class='pt11'>push</span><span>(c);</span></td></tr>
<tr><td class='ln' data-ln='81'></td><td><span> } </span><span class='pt18'>else</span><span> </span><span class='pt18'>if</span><span> c </span><span class='pt18'>!=</span><span> </span><span class='pt13'>'</span><span class='pt12'>\\</span><span class='pt13'>'</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='82'></td><td><span> reg_str.</span><span class='pt11'>push</span><span>(c);</span></td></tr>
<tr><td class='ln' data-ln='83'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='84'></td><td> </td></tr>
<tr><td class='ln' data-ln='85'></td><td><span> last_was_escape </span><span class='pt18'>=</span><span> c </span><span class='pt18'>==</span><span> </span><span class='pt13'>'</span><span class='pt12'>\\</span><span class='pt13'>'</span><span> </span><span class='pt18'>&&</span><span> </span><span class='pt18'>!</span><span>last_was_escape;</span></td></tr>
<tr><td class='ln' data-ln='86'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='87'></td><td><span> reg_str</span></td></tr>
<tr><td class='ln' data-ln='88'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='89'></td><td> </td></tr>
<tr><td class='ln' data-ln='90'></td><td><span> </span><span class='pt10'>/// Makes sure the regex is compiled if it doesn't have captures.</span></td></tr>
<tr><td class='ln' data-ln='91'></td><td><span> </span><span class='pt10'>/// May compile the regex if it isn't, panicing if compilation fails.</span></td></tr>
<tr><td class='ln' data-ln='92'></td><td><span> #[inline]</span></td></tr>
<tr><td class='ln' data-ln='93'></td><td><span> </span><span class='pt16'>pub</span><span> </span><span class='pt16'>fn</span><span> </span><span class='pt11'>ensure_compiled_if_possible</span><span>(</span><span class='pt18'>&</span><span class='pt16'>mut</span><span> </span><span class='pt18'>self</span><span>) {</span></td></tr>
<tr><td class='ln' data-ln='94'></td><td><span> </span><span class='pt18'>if</span><span> </span><span class='pt18'>self</span><span>.regex.</span><span class='pt11'>is_none</span><span>() </span><span class='pt18'>&&</span><span> </span><span class='pt18'>!self</span><span>.has_captures {</span></td></tr>
<tr><td class='ln' data-ln='95'></td><td><span> </span><span class='pt18'>self</span><span>.</span><span class='pt11'>compile_regex</span><span>();</span></td></tr>
<tr><td class='ln' data-ln='96'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='97'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='98'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='99'></td><td> </td></tr>
<tr><td class='ln' data-ln='100'></td><td><span class='pt10'>/// This wrapper only exists so that I can implement a serialization</span></td></tr>
<tr><td class='ln' data-ln='101'></td><td><span class='pt10'>/// trait that crashes if you try and serialize this.</span></td></tr>
<tr><td class='ln' data-ln='102'></td><td><span>#[</span><span class='pt11'>derive</span><span>(</span><span class='pt11'>Debug</span><span>)]</span></td></tr>
<tr><td class='ln' data-ln='103'></td><td><span class='pt16'>pub</span><span> </span><span class='pt16'>struct</span><span> </span><span class='pt11'>LinkerLink</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='104'></td><td><span> </span><span class='pt16'>pub</span><span> </span><span class='pt18'>link</span><span>: Weak</span><span class='pt18'><</span><span>RefCell</span><span class='pt18'><</span><span>Context</span><span class='pt18'>>></span><span>,</span></td></tr>
<tr><td class='ln' data-ln='105'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='106'></td><td> </td></tr>
<tr><td class='ln' data-ln='107'></td><td><span class='pt16'>impl</span><span> </span><span class='pt11'>Eq</span><span> </span><span class='pt18'>for</span><span> </span><span class='pt11'>LinkerLink</span><span> {}</span></td></tr>
<tr><td class='ln' data-ln='108'></td><td> </td></tr>
<tr><td class='ln' data-ln='109'></td><td><span class='pt16'>impl</span><span> </span><span class='pt11'>PartialEq</span><span> </span><span class='pt18'>for</span><span> </span><span class='pt11'>LinkerLink</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='110'></td><td><span> </span><span class='pt16'>fn</span><span> </span><span class='pt11'>eq</span><span>(</span><span class='pt18'>&self</span><span>, </span><span class='pt18'>other</span><span>: </span><span class='pt18'>&</span><span>LinkerLink) -> </span><span class='pt16'>bool</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='111'></td><td><span> </span><span class='pt18'>self</span><span>.link.</span><span class='pt11'>upgrade</span><span>() </span><span class='pt18'>==</span><span> other.link.</span><span class='pt11'>upgrade</span><span>()</span></td></tr>
<tr><td class='ln' data-ln='112'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='113'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='114'></td><td> </td></tr>
<tr><td class='ln' data-ln='115'></td><td><span class='pt10'>/// Just panics, we can't do anything with linked up syntaxes</span></td></tr>
<tr><td class='ln' data-ln='116'></td><td><span class='pt16'>impl</span><span> Serialize </span><span class='pt18'>for</span><span> </span><span class='pt11'>LinkerLink</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='117'></td><td><span> </span><span class='pt16'>fn</span><span> </span><span class='pt11'>serialize</span><span class='pt18'><</span><span>S</span><span class='pt18'>></span><span>(</span><span class='pt18'>&self</span><span>, </span><span class='pt18'>_</span><span>: S) -> </span><span class='pt11'>Result</span><span class='pt18'><</span><span class='pt16'>S::</span><span class='pt12'>Ok</span><span>, </span><span class='pt16'>S::</span><span>Error</span><span class='pt18'>></span><span> </span><span class='pt18'>where</span><span> S: Serializer {</span></td></tr>
<tr><td class='ln' data-ln='118'></td><td><span> </span><span class='pt11'>panic!</span><span>(</span><span class='pt13'>"Can't serialize syntax definitions which have been linked"</span><span>);</span></td></tr>
<tr><td class='ln' data-ln='119'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='120'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='121'></td><td> </td></tr>
<tr><td class='ln' data-ln='122'></td><td><span class='pt10'>/// Just panics, we can't do anything with linked up syntaxes</span></td></tr>
<tr><td class='ln' data-ln='123'></td><td><span class='pt16'>impl</span><span class='pt18'><</span><span class='pt16'>'de</span><span class='pt18'>></span><span> Deserialize</span><span class='pt18'><</span><span class='pt16'>'de</span><span class='pt18'>></span><span> </span><span class='pt18'>for</span><span> </span><span class='pt11'>LinkerLink</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='124'></td><td><span> </span><span class='pt16'>fn</span><span> </span><span class='pt11'>deserialize</span><span class='pt18'><</span><span>D</span><span class='pt18'>></span><span>(</span><span class='pt18'>_</span><span>: D) -> </span><span class='pt11'>Result</span><span class='pt18'><</span><span class='pt16'>Self</span><span>, </span><span class='pt16'>D::</span><span>Error</span><span class='pt18'>></span><span> </span><span class='pt18'>where</span><span> D: Deserializer<'de> {</span></td></tr>
<tr><td class='ln' data-ln='125'></td><td><span> </span><span class='pt11'>panic!</span><span>(</span><span class='pt13'>"No linked syntax should ever have gotten serialized"</span><span>);</span></td></tr>
<tr><td class='ln' data-ln='126'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='127'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='128'></td><td> </td></tr>
<tr><td class='ln' data-ln='129'></td><td> </td></tr>
<tr><td class='ln' data-ln='130'></td><td><span class='pt10'>/// Serialize the provided map in natural key order, so that it's deterministic when dumping.</span></td></tr>
<tr><td class='ln' data-ln='131'></td><td><span class='pt16'>fn</span><span> </span><span class='pt11'>ordered_map</span><span class='pt18'><</span><span>K, V, S</span><span class='pt18'>></span><span>(</span><span class='pt18'>map</span><span>: </span><span class='pt18'>&</span><span class='pt11'>HashMap</span><span class='pt18'><</span><span>K, V</span><span class='pt18'>></span><span>, </span><span class='pt18'>serializer</span><span>: S) -> </span><span class='pt11'>Result</span><span class='pt18'><</span><span class='pt16'>S::</span><span class='pt12'>Ok</span><span>, </span><span class='pt16'>S::</span><span>Error</span><span class='pt18'>></span></td></tr>
<tr><td class='ln' data-ln='132'></td><td><span> </span><span class='pt18'>where</span><span> S: Serializer, K: Eq + Hash + Ord + Serialize, V: Serialize</span></td></tr>
<tr><td class='ln' data-ln='133'></td><td><span>{</span></td></tr>
<tr><td class='ln' data-ln='134'></td><td><span> </span><span class='pt18'>let</span><span> ordered: BTreeMap</span><span class='pt18'><_</span><span>, </span><span class='pt18'>_></span><span> </span><span class='pt18'>=</span><span> map.</span><span class='pt11'>iter</span><span>().</span><span class='pt11'>collect</span><span>();</span></td></tr>
<tr><td class='ln' data-ln='135'></td><td><span> ordered.</span><span class='pt11'>serialize</span><span>(serializer)</span></td></tr>
<tr><td class='ln' data-ln='136'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='137'></td><td> </td></tr>
<tr><td class='ln' data-ln='138'></td><td> </td></tr>
<tr><td class='ln' data-ln='139'></td><td><span>#[</span><span class='pt11'>cfg</span><span>(test)]</span></td></tr>
<tr><td class='ln' data-ln='140'></td><td><span class='pt16'>mod</span><span> </span><span class='pt11'>tests</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='141'></td><td><span> </span><span class='pt18'>use</span><span> </span><span class='pt18'>super::*</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='142'></td><td> </td></tr>
<tr><td class='ln' data-ln='143'></td><td><span> #[test]</span></td></tr>
<tr><td class='ln' data-ln='144'></td><td><span> </span><span class='pt16'>fn</span><span> </span><span class='pt11'>can_compile_refs</span><span>() {</span></td></tr>
<tr><td class='ln' data-ln='145'></td><td><span> </span><span class='pt18'>use</span><span> onig</span><span class='pt18'>::</span><span>{SearchOptions, Regex, Region};</span></td></tr>
<tr><td class='ln' data-ln='146'></td><td> </td></tr>
<tr><td class='ln' data-ln='147'></td><td><span> </span><span class='pt18'>let</span><span> pat </span><span class='pt18'>=</span><span> MatchPattern {</span></td></tr>
<tr><td class='ln' data-ln='148'></td><td><span> has_captures: </span><span class='pt16'>true</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='149'></td><td><span> regex_str: </span><span class='pt11'>String</span><span class='pt18'>::</span><span class='pt11'>from</span><span>(</span><span class='pt16'>r</span><span class='pt13'>"lol \\ \2 \1 '\9' \wz"</span><span>),</span></td></tr>
<tr><td class='ln' data-ln='150'></td><td><span> regex: </span><span class='pt12'>None</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='151'></td><td><span> scope: </span><span class='pt11'>vec!</span><span>[],</span></td></tr>
<tr><td class='ln' data-ln='152'></td><td><span> captures: </span><span class='pt12'>None</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='153'></td><td><span> operation: MatchOperation</span><span class='pt18'>::</span><span class='pt12'>None</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='154'></td><td><span> with_prototype: </span><span class='pt12'>None</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='155'></td><td><span> };</span></td></tr>
<tr><td class='ln' data-ln='156'></td><td> </td></tr>
<tr><td class='ln' data-ln='157'></td><td><span> </span><span class='pt18'>let</span><span> r </span><span class='pt18'>=</span><span> Regex</span><span class='pt18'>::</span><span class='pt11'>new</span><span>(</span><span class='pt16'>r</span><span class='pt13'>"(\\\[\]\(\))(b)(c)(d)(e)"</span><span>).</span><span class='pt11'>unwrap</span><span>();</span></td></tr>
<tr><td class='ln' data-ln='158'></td><td><span> </span><span class='pt18'>let</span><span> </span><span class='pt16'>mut</span><span> region </span><span class='pt18'>=</span><span> Region</span><span class='pt18'>::</span><span class='pt11'>new</span><span>();</span></td></tr>
<tr><td class='ln' data-ln='159'></td><td><span> </span><span class='pt18'>let</span><span> s </span><span class='pt18'>=</span><span> </span><span class='pt16'>r</span><span class='pt13'>"\[]()bcde"</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='160'></td><td> </td></tr>
<tr><td class='ln' data-ln='161'></td><td><span> </span><span class='pt11'>assert!</span><span>(r.</span><span class='pt11'>match_with_options</span><span>(s, </span><span class='pt16'>0</span><span>, SearchOptions</span><span class='pt18'>::</span><span class='pt16'>SEARCH_OPTION_NONE</span><span>, </span><span class='pt12'>Some</span><span>(</span><span class='pt18'>&</span><span class='pt16'>mut</span><span> region)).</span><span class='pt11'>is_some</span><span>());</span></td></tr>
<tr><td class='ln' data-ln='162'></td><td> </td></tr>
<tr><td class='ln' data-ln='163'></td><td><span> </span><span class='pt18'>let</span><span> regex_res </span><span class='pt18'>=</span><span> pat.</span><span class='pt11'>regex_with_substitutes</span><span>(</span><span class='pt18'>&</span><span>region, s);</span></td></tr>
<tr><td class='ln' data-ln='164'></td><td><span> </span><span class='pt11'>assert_eq!</span><span>(regex_res, </span><span class='pt16'>r</span><span class='pt13'>"lol \\ b \\\[\]\(\) '' \wz"</span><span>);</span></td></tr>
<tr><td class='ln' data-ln='165'></td><td><span> pat.</span><span class='pt11'>compile_with_refs</span><span>(</span><span class='pt18'>&</span><span>region, s);</span></td></tr>
<tr><td class='ln' data-ln='166'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='167'></td><td><span>}</span></td></tr>
</table>
</div>
</div>
</div>
<div class='style' id='P--solarized_dark--rs'>
<div class='P--solarized_dark-bordered'>
<div class="info header">
<span class="left">syntax_definition.rs</span>
<span class="right"><span>167 lines</span><span>5.55 KB</span></span>
</div>
<div class='P--solarized_dark'>
<table>
<tr><td class='ln' data-ln='1'></td><td><span class='pt5'>use</span><span> std</span><span class='pt5'>::</span><span>collections</span><span class='pt5'>::</span><span>{BTreeMap, HashMap};</span></td></tr>
<tr><td class='ln' data-ln='2'></td><td><span class='pt5'>use</span><span> std</span><span class='pt5'>::</span><span>hash</span><span class='pt5'>::</span><span>Hash;</span></td></tr>
<tr><td class='ln' data-ln='3'></td><td><span class='pt5'>use</span><span> onig</span><span class='pt5'>::</span><span>{Regex, RegexOptions, Region, Syntax};</span></td></tr>
<tr><td class='ln' data-ln='4'></td><td><span class='pt5'>use</span><span> std</span><span class='pt5'>::</span><span>rc</span><span class='pt5'>::</span><span>{Rc, Weak};</span></td></tr>
<tr><td class='ln' data-ln='5'></td><td><span class='pt5'>use</span><span> std</span><span class='pt5'>::</span><span>cell</span><span class='pt5'>::</span><span>RefCell;</span></td></tr>
<tr><td class='ln' data-ln='6'></td><td><span class='pt5'>use</span><span> </span><span class='pt5'>super::</span><span>scope</span><span class='pt5'>::*</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='7'></td><td><span class='pt5'>use</span><span> regex_syntax</span><span class='pt5'>::</span><span>escape;</span></td></tr>
<tr><td class='ln' data-ln='8'></td><td class='hi'><span class='pt5'>use</span><span> serde</span><span class='pt5'>::</span><span>{Deserialize, Deserializer, Serialize, Serializer};</span></td></tr>
<tr><td class='ln' data-ln='9'></td><td> </td></tr>
<tr><td class='ln' data-ln='10'></td><td><span class='pt3 it'>/// The main data structure representing a syntax definition loaded from a</span></td></tr>
<tr><td class='ln' data-ln='11'></td><td><span class='pt3 it'>/// `.sublime-syntax` file. You'll probably only need these as references</span></td></tr>
<tr><td class='ln' data-ln='12'></td><td><span class='pt3 it'>/// to be passed around to parsing code.</span></td></tr>
<tr><td class='ln' data-ln='13'></td><td><span class='pt3 it'>///</span></td></tr>
<tr><td class='ln' data-ln='14'></td><td><span class='pt3 it'>/// Some useful public fields are the `name` field which is a human readable</span></td></tr>
<tr><td class='ln' data-ln='15'></td><td><span class='pt3 it'>/// name to display in syntax lists, and the `hidden` field which means hide</span></td></tr>
<tr><td class='ln' data-ln='16'></td><td><span class='pt3 it'>/// this syntax from any lists because it is for internal use.</span></td></tr>
<tr><td class='ln' data-ln='17'></td><td><span>#[</span><span class='pt1'>derive</span><span>(</span><span class='pt5'>Clone</span><span>, </span><span class='pt5'>Debug</span><span>, </span><span class='pt5'>Eq</span><span>, </span><span class='pt5'>PartialEq</span><span>, Serialize, Deserialize)]</span></td></tr>
<tr><td class='ln' data-ln='18'></td><td><span class='bo'>pub</span><span> </span><span class='bo'>struct</span><span> SyntaxDefinition {</span></td></tr>
<tr><td class='ln' data-ln='19'></td><td class='hi'><span> </span><span class='bo'>pub</span><span> </span><span class='pt1'>name</span><span>: </span><span class='pt5'>String</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='20'></td><td class='hi'><span> </span><span class='bo'>pub</span><span> </span><span class='pt1'>file_extensions</span><span>: </span><span class='pt5'>Vec<String></span><span>,</span></td></tr>
<tr><td class='ln' data-ln='21'></td><td class='hi'><span> </span><span class='bo'>pub</span><span> </span><span class='pt1'>scope</span><span>: Scope,</span></td></tr>
<tr><td class='ln' data-ln='22'></td><td class='hi'><span> </span><span class='bo'>pub</span><span> </span><span class='pt1'>first_line_match</span><span>: </span><span class='pt5'>Option<String></span><span>,</span></td></tr>
<tr><td class='ln' data-ln='23'></td><td class='hi'><span> </span><span class='bo'>pub</span><span> </span><span class='pt1'>hidden</span><span>: </span><span class='bo'>bool</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='24'></td><td><span> </span><span class='pt3 it'>/// Filled in at link time to avoid serializing it multiple times</span></td></tr>
<tr><td class='ln' data-ln='25'></td><td><span> #[</span><span class='pt1'>serde</span><span>(skip_serializing, skip_deserializing)]</span></td></tr>
<tr><td class='ln' data-ln='26'></td><td><span> </span><span class='bo'>pub</span><span> </span><span class='pt1'>prototype</span><span>: </span><span class='pt5'>Option<</span><span>ContextPtr</span><span class='pt5'>></span><span>,</span></td></tr>
<tr><td class='ln' data-ln='27'></td><td><span> #[</span><span class='pt1'>serde</span><span>(serialize_with </span><span class='pt5'>=</span><span> </span><span class='pt2'>"ordered_map"</span><span>)]</span></td></tr>
<tr><td class='ln' data-ln='28'></td><td><span> </span><span class='bo'>pub</span><span> </span><span class='pt1'>variables</span><span>: </span><span class='pt5'>HashMap<String</span><span>, </span><span class='pt5'>String></span><span>,</span></td></tr>
<tr><td class='ln' data-ln='29'></td><td><span> #[</span><span class='pt1'>serde</span><span>(serialize_with </span><span class='pt5'>=</span><span> </span><span class='pt2'>"ordered_map"</span><span>)]</span></td></tr>
<tr><td class='ln' data-ln='30'></td><td><span> </span><span class='bo'>pub</span><span> </span><span class='pt1'>contexts</span><span>: </span><span class='pt5'>HashMap<String</span><span>, ContextPtr</span><span class='pt5'>></span><span>,</span></td></tr>
<tr><td class='ln' data-ln='31'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='32'></td><td> </td></tr>
<tr><td class='ln' data-ln='33'></td><td><span class='bo'>impl</span><span> Context {</span></td></tr>
<tr><td class='ln' data-ln='34'></td><td><span> </span><span class='pt3 it'>/// Returns the match pattern at an index, panics if the thing isn't a match pattern</span></td></tr>
<tr><td class='ln' data-ln='35'></td><td><span> </span><span class='bo'>pub</span><span> </span><span class='bo'>fn</span><span> </span><span class='pt1'>match_at</span><span>(</span><span class='pt5'>&</span><span class='pt1'>self</span><span>, index: </span><span class='bo'>usize</span><span>) -> </span><span class='pt5'>&</span><span>MatchPattern {</span></td></tr>
<tr><td class='ln' data-ln='36'></td><td><span> </span><span class='pt5'>match</span><span> </span><span class='pt1'>self</span><span>.patterns[index] {</span></td></tr>
<tr><td class='ln' data-ln='37'></td><td><span> Pattern</span><span class='pt5'>::</span><span>Match(</span><span class='bo'>ref</span><span> match_pat) </span><span class='pt5'>=></span><span> match_pat,</span></td></tr>
<tr><td class='ln' data-ln='38'></td><td><span> _ </span><span class='pt5'>=></span><span> </span><span class='pt1'>panic!</span><span>(</span><span class='pt2'>"bad index to match_at"</span><span>),</span></td></tr>
<tr><td class='ln' data-ln='39'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='40'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='41'></td><td> </td></tr>
<tr><td class='ln' data-ln='42'></td><td><span> </span><span class='pt3 it'>/// Returns a mutable reference, otherwise like `match_at`</span></td></tr>
<tr><td class='ln' data-ln='43'></td><td><span> </span><span class='bo'>pub</span><span> </span><span class='bo'>fn</span><span> </span><span class='pt1'>match_at_mut</span><span>(</span><span class='pt5'>&</span><span class='bo'>mut</span><span> </span><span class='pt1'>self</span><span>, index: </span><span class='bo'>usize</span><span>) -> </span><span class='pt5'>&</span><span class='bo'>mut</span><span> MatchPattern {</span></td></tr>
<tr><td class='ln' data-ln='44'></td><td><span> </span><span class='pt5'>match</span><span> </span><span class='pt1'>self</span><span>.patterns[index] {</span></td></tr>
<tr><td class='ln' data-ln='45'></td><td><span> Pattern</span><span class='pt5'>::</span><span>Match(</span><span class='bo'>ref</span><span> </span><span class='bo'>mut</span><span> match_pat) </span><span class='pt5'>=></span><span> match_pat,</span></td></tr>
<tr><td class='ln' data-ln='46'></td><td><span> _ </span><span class='pt5'>=></span><span> </span><span class='pt1'>panic!</span><span>(</span><span class='pt2'>"bad index to match_at"</span><span>),</span></td></tr>
<tr><td class='ln' data-ln='47'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='48'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='49'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='50'></td><td> </td></tr>
<tr><td class='ln' data-ln='51'></td><td><span class='bo'>impl</span><span> ContextReference {</span></td></tr>
<tr><td class='ln' data-ln='52'></td><td><span> </span><span class='pt3 it'>/// find the pointed to context, panics if ref is not linked</span></td></tr>
<tr><td class='ln' data-ln='53'></td><td><span> </span><span class='bo'>pub</span><span> </span><span class='bo'>fn</span><span> </span><span class='pt1'>resolve</span><span>(</span><span class='pt5'>&</span><span class='pt1'>self</span><span>) -> ContextPtr {</span></td></tr>
<tr><td class='ln' data-ln='54'></td><td><span> </span><span class='pt5'>match</span><span> </span><span class='pt5'>*</span><span class='pt1'>self</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='55'></td><td><span> ContextReference</span><span class='pt5'>::</span><span>Inline(</span><span class='bo'>ref</span><span> ptr) </span><span class='pt5'>=></span><span> ptr.</span><span class='pt1'>clone</span><span>(),</span></td></tr>
<tr><td class='ln' data-ln='56'></td><td><span> ContextReference</span><span class='pt5'>::</span><span>Direct(</span><span class='bo'>ref</span><span> ptr) </span><span class='pt5'>=></span><span> ptr.link.</span><span class='pt1'>upgrade</span><span>().</span><span class='pt1'>unwrap</span><span>(),</span></td></tr>
<tr><td class='ln' data-ln='57'></td><td><span> _ </span><span class='pt5'>=></span><span> </span><span class='pt1'>panic!</span><span>(</span><span class='pt2'>"Can only call resolve on linked references: </span><span class='pt7'>{:?}</span><span class='pt2'>"</span><span>, </span><span class='pt1'>self</span><span>),</span></td></tr>
<tr><td class='ln' data-ln='58'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='59'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='60'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='61'></td><td> </td></tr>
<tr><td class='ln' data-ln='62'></td><td><span class='bo'>impl</span><span> MatchPattern {</span></td></tr>
<tr><td class='ln' data-ln='63'></td><td><span> </span><span class='pt3 it'>/// substitutes back-refs in Regex with regions from s</span></td></tr>
<tr><td class='ln' data-ln='64'></td><td><span> </span><span class='pt3 it'>/// used for match patterns which refer to captures from the pattern</span></td></tr>
<tr><td class='ln' data-ln='65'></td><td><span> </span><span class='pt3 it'>/// that pushed them.</span></td></tr>
<tr><td class='ln' data-ln='66'></td><td><span> </span><span class='bo'>pub</span><span> </span><span class='bo'>fn</span><span> </span><span class='pt1'>regex_with_substitutes</span><span>(</span><span class='pt5'>&</span><span class='pt1'>self</span><span>, region: </span><span class='pt5'>&</span><span>Region, s: </span><span class='pt5'>&</span><span class='bo'>str</span><span>) -> </span><span class='pt5'>String</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='67'></td><td><span> </span><span class='pt5 bo'>let</span><span> </span><span class='bo'>mut</span><span> reg_str </span><span class='pt5'>=</span><span> </span><span class='pt5'>String::</span><span class='pt1'>new</span><span>();</span></td></tr>
<tr><td class='ln' data-ln='68'></td><td><span> </span><span class='pt5 bo'>let</span><span> </span><span class='bo'>mut</span><span> last_was_escape </span><span class='pt5'>=</span><span> </span><span class='pt6'>false</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='69'></td><td> </td></tr>
<tr><td class='ln' data-ln='70'></td><td><span> </span><span class='pt5'>for</span><span> c </span><span class='pt5'>in</span><span> </span><span class='pt1'>self</span><span>.regex_str.</span><span class='pt1'>chars</span><span>() {</span></td></tr>
<tr><td class='ln' data-ln='71'></td><td><span> </span><span class='pt5'>if</span><span> last_was_escape </span><span class='pt5'>&&</span><span> c.</span><span class='pt1'>is_digit</span><span>(</span><span class='pt10'>10</span><span>) {</span></td></tr>
<tr><td class='ln' data-ln='72'></td><td><span> </span><span class='pt5 bo'>let</span><span> val </span><span class='pt5'>=</span><span> c.</span><span class='pt1'>to_digit</span><span>(</span><span class='pt10'>10</span><span>).</span><span class='pt1'>unwrap</span><span>();</span></td></tr>
<tr><td class='ln' data-ln='73'></td><td> </td></tr>
<tr><td class='ln' data-ln='74'></td><td><span> </span><span class='pt5'>if</span><span> </span><span class='pt5 bo'>let</span><span> Some((start, end)) </span><span class='pt5'>=</span><span> region.</span><span class='pt1'>pos</span><span>(val </span><span class='pt5'>as</span><span> </span><span class='bo'>usize</span><span>) {</span></td></tr>
<tr><td class='ln' data-ln='75'></td><td><span> </span><span class='pt5 bo'>let</span><span> escaped </span><span class='pt5'>=</span><span> </span><span class='pt1'>escape</span><span>(</span><span class='pt5'>&</span><span>s[start</span><span class='pt5'>..</span><span>end]);</span></td></tr>
<tr><td class='ln' data-ln='76'></td><td><span> reg_str.</span><span class='pt1'>push_str</span><span>(</span><span class='pt5'>&</span><span>escaped);</span></td></tr>
<tr><td class='ln' data-ln='77'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='78'></td><td><span> } </span><span class='pt5'>else</span><span> </span><span class='pt5'>if</span><span> last_was_escape {</span></td></tr>
<tr><td class='ln' data-ln='79'></td><td><span> reg_str.</span><span class='pt1'>push</span><span>(</span><span class='pt2'>'</span><span class='pt7'>\\</span><span class='pt2'>'</span><span>);</span></td></tr>
<tr><td class='ln' data-ln='80'></td><td><span> reg_str.</span><span class='pt1'>push</span><span>(c);</span></td></tr>
<tr><td class='ln' data-ln='81'></td><td><span> } </span><span class='pt5'>else</span><span> </span><span class='pt5'>if</span><span> c </span><span class='pt5'>!=</span><span> </span><span class='pt2'>'</span><span class='pt7'>\\</span><span class='pt2'>'</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='82'></td><td><span> reg_str.</span><span class='pt1'>push</span><span>(c);</span></td></tr>
<tr><td class='ln' data-ln='83'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='84'></td><td> </td></tr>
<tr><td class='ln' data-ln='85'></td><td><span> last_was_escape </span><span class='pt5'>=</span><span> c </span><span class='pt5'>==</span><span> </span><span class='pt2'>'</span><span class='pt7'>\\</span><span class='pt2'>'</span><span> </span><span class='pt5'>&&</span><span> </span><span class='pt5'>!</span><span>last_was_escape;</span></td></tr>
<tr><td class='ln' data-ln='86'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='87'></td><td><span> reg_str</span></td></tr>
<tr><td class='ln' data-ln='88'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='89'></td><td> </td></tr>
<tr><td class='ln' data-ln='90'></td><td><span> </span><span class='pt3 it'>/// Makes sure the regex is compiled if it doesn't have captures.</span></td></tr>
<tr><td class='ln' data-ln='91'></td><td><span> </span><span class='pt3 it'>/// May compile the regex if it isn't, panicing if compilation fails.</span></td></tr>
<tr><td class='ln' data-ln='92'></td><td><span> #[inline]</span></td></tr>
<tr><td class='ln' data-ln='93'></td><td><span> </span><span class='bo'>pub</span><span> </span><span class='bo'>fn</span><span> </span><span class='pt1'>ensure_compiled_if_possible</span><span>(</span><span class='pt5'>&</span><span class='bo'>mut</span><span> </span><span class='pt1'>self</span><span>) {</span></td></tr>
<tr><td class='ln' data-ln='94'></td><td><span> </span><span class='pt5'>if</span><span> </span><span class='pt1'>self</span><span>.regex.</span><span class='pt1'>is_none</span><span>() </span><span class='pt5'>&&</span><span> </span><span class='pt5'>!</span><span class='pt1'>self</span><span>.has_captures {</span></td></tr>
<tr><td class='ln' data-ln='95'></td><td><span> </span><span class='pt1'>self</span><span>.</span><span class='pt1'>compile_regex</span><span>();</span></td></tr>
<tr><td class='ln' data-ln='96'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='97'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='98'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='99'></td><td> </td></tr>
<tr><td class='ln' data-ln='100'></td><td><span class='pt3 it'>/// This wrapper only exists so that I can implement a serialization</span></td></tr>
<tr><td class='ln' data-ln='101'></td><td><span class='pt3 it'>/// trait that crashes if you try and serialize this.</span></td></tr>
<tr><td class='ln' data-ln='102'></td><td><span>#[</span><span class='pt1'>derive</span><span>(</span><span class='pt5'>Debug</span><span>)]</span></td></tr>
<tr><td class='ln' data-ln='103'></td><td><span class='bo'>pub</span><span> </span><span class='bo'>struct</span><span> LinkerLink {</span></td></tr>
<tr><td class='ln' data-ln='104'></td><td><span> </span><span class='bo'>pub</span><span> </span><span class='pt1'>link</span><span>: Weak</span><span class='pt5'><</span><span>RefCell</span><span class='pt5'><</span><span>Context</span><span class='pt5'>>></span><span>,</span></td></tr>
<tr><td class='ln' data-ln='105'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='106'></td><td> </td></tr>
<tr><td class='ln' data-ln='107'></td><td><span class='bo'>impl</span><span> </span><span class='pt5'>Eq</span><span> </span><span class='pt5'>for</span><span> LinkerLink {}</span></td></tr>
<tr><td class='ln' data-ln='108'></td><td> </td></tr>
<tr><td class='ln' data-ln='109'></td><td><span class='bo'>impl</span><span> </span><span class='pt5'>PartialEq</span><span> </span><span class='pt5'>for</span><span> LinkerLink {</span></td></tr>
<tr><td class='ln' data-ln='110'></td><td><span> </span><span class='bo'>fn</span><span> </span><span class='pt1'>eq</span><span>(</span><span class='pt5'>&</span><span class='pt1'>self</span><span>, other: </span><span class='pt5'>&</span><span>LinkerLink) -> </span><span class='bo'>bool</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='111'></td><td><span> </span><span class='pt1'>self</span><span>.link.</span><span class='pt1'>upgrade</span><span>() </span><span class='pt5'>==</span><span> other.link.</span><span class='pt1'>upgrade</span><span>()</span></td></tr>
<tr><td class='ln' data-ln='112'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='113'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='114'></td><td> </td></tr>
<tr><td class='ln' data-ln='115'></td><td><span class='pt3 it'>/// Just panics, we can't do anything with linked up syntaxes</span></td></tr>
<tr><td class='ln' data-ln='116'></td><td><span class='bo'>impl</span><span> Serialize </span><span class='pt5'>for</span><span> LinkerLink {</span></td></tr>
<tr><td class='ln' data-ln='117'></td><td><span> </span><span class='bo'>fn</span><span> </span><span class='pt1'>serialize</span><span class='pt5'><</span><span>S</span><span class='pt5'>></span><span>(</span><span class='pt5'>&</span><span class='pt1'>self</span><span>, </span><span class='pt5'>_</span><span>: S) -> </span><span class='pt5'>Result<</span><span class='bo'>S::</span><span>Ok, </span><span class='bo'>S::</span><span>Error</span><span class='pt5'>></span><span> </span><span class='pt5'>where</span><span> S: Serializer {</span></td></tr>
<tr><td class='ln' data-ln='118'></td><td><span> </span><span class='pt1'>panic!</span><span>(</span><span class='pt2'>"Can't serialize syntax definitions which have been linked"</span><span>);</span></td></tr>
<tr><td class='ln' data-ln='119'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='120'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='121'></td><td> </td></tr>
<tr><td class='ln' data-ln='122'></td><td><span class='pt3 it'>/// Just panics, we can't do anything with linked up syntaxes</span></td></tr>
<tr><td class='ln' data-ln='123'></td><td><span class='bo'>impl</span><span class='pt5'><</span><span class='bo'>'de</span><span class='pt5'>></span><span> Deserialize</span><span class='pt5'><</span><span class='bo'>'de</span><span class='pt5'>></span><span> </span><span class='pt5'>for</span><span> LinkerLink {</span></td></tr>
<tr><td class='ln' data-ln='124'></td><td><span> </span><span class='bo'>fn</span><span> </span><span class='pt1'>deserialize</span><span class='pt5'><</span><span>D</span><span class='pt5'>></span><span>(</span><span class='pt5'>_</span><span>: D) -> </span><span class='pt5'>Result<</span><span class='bo'>Self</span><span>, </span><span class='bo'>D::</span><span>Error</span><span class='pt5'>></span><span> </span><span class='pt5'>where</span><span> D: Deserializer<'de> {</span></td></tr>
<tr><td class='ln' data-ln='125'></td><td><span> </span><span class='pt1'>panic!</span><span>(</span><span class='pt2'>"No linked syntax should ever have gotten serialized"</span><span>);</span></td></tr>
<tr><td class='ln' data-ln='126'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='127'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='128'></td><td> </td></tr>
<tr><td class='ln' data-ln='129'></td><td> </td></tr>
<tr><td class='ln' data-ln='130'></td><td><span class='pt3 it'>/// Serialize the provided map in natural key order, so that it's deterministic when dumping.</span></td></tr>
<tr><td class='ln' data-ln='131'></td><td><span class='bo'>fn</span><span> </span><span class='pt1'>ordered_map</span><span class='pt5'><</span><span>K, V, S</span><span class='pt5'>></span><span>(map: </span><span class='pt5'>&HashMap<</span><span>K, V</span><span class='pt5'>></span><span>, serializer: S) -> </span><span class='pt5'>Result<</span><span class='bo'>S::</span><span>Ok, </span><span class='bo'>S::</span><span>Error</span><span class='pt5'>></span></td></tr>
<tr><td class='ln' data-ln='132'></td><td><span> </span><span class='pt5'>where</span><span> S: Serializer, K: Eq + Hash + Ord + Serialize, V: Serialize</span></td></tr>
<tr><td class='ln' data-ln='133'></td><td><span>{</span></td></tr>
<tr><td class='ln' data-ln='134'></td><td><span> </span><span class='pt5 bo'>let</span><span> ordered: BTreeMap</span><span class='pt5'><_</span><span>, </span><span class='pt5'>_></span><span> </span><span class='pt5'>=</span><span> map.</span><span class='pt1'>iter</span><span>().</span><span class='pt1'>collect</span><span>();</span></td></tr>
<tr><td class='ln' data-ln='135'></td><td><span> ordered.</span><span class='pt1'>serialize</span><span>(serializer)</span></td></tr>
<tr><td class='ln' data-ln='136'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='137'></td><td> </td></tr>
<tr><td class='ln' data-ln='138'></td><td> </td></tr>
<tr><td class='ln' data-ln='139'></td><td><span>#[</span><span class='pt1'>cfg</span><span>(test)]</span></td></tr>
<tr><td class='ln' data-ln='140'></td><td><span class='bo'>mod</span><span> tests {</span></td></tr>
<tr><td class='ln' data-ln='141'></td><td><span> </span><span class='pt5'>use</span><span> </span><span class='pt5'>super::*</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='142'></td><td> </td></tr>
<tr><td class='ln' data-ln='143'></td><td><span> #[test]</span></td></tr>
<tr><td class='ln' data-ln='144'></td><td><span> </span><span class='bo'>fn</span><span> </span><span class='pt1'>can_compile_refs</span><span>() {</span></td></tr>
<tr><td class='ln' data-ln='145'></td><td><span> </span><span class='pt5'>use</span><span> onig</span><span class='pt5'>::</span><span>{SearchOptions, Regex, Region};</span></td></tr>
<tr><td class='ln' data-ln='146'></td><td> </td></tr>
<tr><td class='ln' data-ln='147'></td><td><span> </span><span class='pt5 bo'>let</span><span> pat </span><span class='pt5'>=</span><span> MatchPattern {</span></td></tr>
<tr><td class='ln' data-ln='148'></td><td><span> has_captures: </span><span class='pt6'>true</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='149'></td><td><span> regex_str: </span><span class='pt5'>String::</span><span class='pt1'>from</span><span>(</span><span class='bo'>r</span><span class='pt2'>"lol \\ \2 \1 '\9' \wz"</span><span>),</span></td></tr>
<tr><td class='ln' data-ln='150'></td><td><span> regex: None,</span></td></tr>
<tr><td class='ln' data-ln='151'></td><td><span> scope: </span><span class='pt1'>vec!</span><span>[],</span></td></tr>
<tr><td class='ln' data-ln='152'></td><td><span> captures: None,</span></td></tr>
<tr><td class='ln' data-ln='153'></td><td><span> operation: MatchOperation</span><span class='pt5'>::</span><span>None,</span></td></tr>
<tr><td class='ln' data-ln='154'></td><td><span> with_prototype: None,</span></td></tr>
<tr><td class='ln' data-ln='155'></td><td><span> };</span></td></tr>
<tr><td class='ln' data-ln='156'></td><td> </td></tr>
<tr><td class='ln' data-ln='157'></td><td><span> </span><span class='pt5 bo'>let</span><span> r </span><span class='pt5'>=</span><span> Regex</span><span class='pt5'>::</span><span class='pt1'>new</span><span>(</span><span class='bo'>r</span><span class='pt2'>"(\\\[\]\(\))(b)(c)(d)(e)"</span><span>).</span><span class='pt1'>unwrap</span><span>();</span></td></tr>
<tr><td class='ln' data-ln='158'></td><td><span> </span><span class='pt5 bo'>let</span><span> </span><span class='bo'>mut</span><span> region </span><span class='pt5'>=</span><span> Region</span><span class='pt5'>::</span><span class='pt1'>new</span><span>();</span></td></tr>
<tr><td class='ln' data-ln='159'></td><td><span> </span><span class='pt5 bo'>let</span><span> s </span><span class='pt5'>=</span><span> </span><span class='bo'>r</span><span class='pt2'>"\[]()bcde"</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='160'></td><td> </td></tr>
<tr><td class='ln' data-ln='161'></td><td><span> </span><span class='pt1'>assert!</span><span>(r.</span><span class='pt1'>match_with_options</span><span>(s, </span><span class='pt10'>0</span><span>, SearchOptions</span><span class='pt5'>::</span><span class='pt7'>SEARCH_OPTION_NONE</span><span>, Some(</span><span class='pt5'>&</span><span class='bo'>mut</span><span> region)).</span><span class='pt1'>is_some</span><span>());</span></td></tr>
<tr><td class='ln' data-ln='162'></td><td> </td></tr>
<tr><td class='ln' data-ln='163'></td><td><span> </span><span class='pt5 bo'>let</span><span> regex_res </span><span class='pt5'>=</span><span> pat.</span><span class='pt1'>regex_with_substitutes</span><span>(</span><span class='pt5'>&</span><span>region, s);</span></td></tr>
<tr><td class='ln' data-ln='164'></td><td><span> </span><span class='pt1'>assert_eq!</span><span>(regex_res, </span><span class='bo'>r</span><span class='pt2'>"lol \\ b \\\[\]\(\) '' \wz"</span><span>);</span></td></tr>
<tr><td class='ln' data-ln='165'></td><td><span> pat.</span><span class='pt1'>compile_with_refs</span><span>(</span><span class='pt5'>&</span><span>region, s);</span></td></tr>
<tr><td class='ln' data-ln='166'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='167'></td><td><span>}</span></td></tr>
</table>
</div>
</div>
</div>
<div class='style' id='P--solarized_light--rs'>
<div class='P--solarized_light-bordered'>
<div class="info header">
<span class="left">syntax_definition.rs</span>
<span class="right"><span>167 lines</span><span>5.55 KB</span></span>
</div>
<div class='P--solarized_light'>
<table>
<tr><td class='ln' data-ln='1'></td><td><span class='pt4'>use</span><span> std</span><span class='pt4'>::</span><span>collections</span><span class='pt4'>::</span><span>{BTreeMap, HashMap};</span></td></tr>
<tr><td class='ln' data-ln='2'></td><td><span class='pt4'>use</span><span> std</span><span class='pt4'>::</span><span>hash</span><span class='pt4'>::</span><span>Hash;</span></td></tr>
<tr><td class='ln' data-ln='3'></td><td><span class='pt4'>use</span><span> onig</span><span class='pt4'>::</span><span>{Regex, RegexOptions, Region, Syntax};</span></td></tr>
<tr><td class='ln' data-ln='4'></td><td><span class='pt4'>use</span><span> std</span><span class='pt4'>::</span><span>rc</span><span class='pt4'>::</span><span>{Rc, Weak};</span></td></tr>
<tr><td class='ln' data-ln='5'></td><td><span class='pt4'>use</span><span> std</span><span class='pt4'>::</span><span>cell</span><span class='pt4'>::</span><span>RefCell;</span></td></tr>
<tr><td class='ln' data-ln='6'></td><td><span class='pt4'>use</span><span> </span><span class='pt4'>super::</span><span>scope</span><span class='pt4'>::*</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='7'></td><td><span class='pt4'>use</span><span> regex_syntax</span><span class='pt4'>::</span><span>escape;</span></td></tr>
<tr><td class='ln' data-ln='8'></td><td class='hi'><span class='pt4'>use</span><span> serde</span><span class='pt4'>::</span><span>{Deserialize, Deserializer, Serialize, Serializer};</span></td></tr>
<tr><td class='ln' data-ln='9'></td><td> </td></tr>
<tr><td class='ln' data-ln='10'></td><td><span class='pt5'>/// The main data structure representing a syntax definition loaded from a</span></td></tr>
<tr><td class='ln' data-ln='11'></td><td><span class='pt5'>/// `.sublime-syntax` file. You'll probably only need these as references</span></td></tr>
<tr><td class='ln' data-ln='12'></td><td><span class='pt5'>/// to be passed around to parsing code.</span></td></tr>
<tr><td class='ln' data-ln='13'></td><td><span class='pt5'>///</span></td></tr>
<tr><td class='ln' data-ln='14'></td><td><span class='pt5'>/// Some useful public fields are the `name` field which is a human readable</span></td></tr>
<tr><td class='ln' data-ln='15'></td><td><span class='pt5'>/// name to display in syntax lists, and the `hidden` field which means hide</span></td></tr>
<tr><td class='ln' data-ln='16'></td><td><span class='pt5'>/// this syntax from any lists because it is for internal use.</span></td></tr>
<tr><td class='ln' data-ln='17'></td><td><span>#[</span><span class='pt2'>derive</span><span>(</span><span class='pt4'>Clone</span><span>, </span><span class='pt4'>Debug</span><span>, </span><span class='pt4'>Eq</span><span>, </span><span class='pt4'>PartialEq</span><span>, Serialize, Deserialize)]</span></td></tr>
<tr><td class='ln' data-ln='18'></td><td><span class='pt1 bo'>pub</span><span> </span><span class='pt1 bo'>struct</span><span> SyntaxDefinition {</span></td></tr>
<tr><td class='ln' data-ln='19'></td><td class='hi'><span> </span><span class='pt1 bo'>pub</span><span> </span><span class='pt2'>name</span><span>: </span><span class='pt4'>String</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='20'></td><td class='hi'><span> </span><span class='pt1 bo'>pub</span><span> </span><span class='pt2'>file_extensions</span><span>: </span><span class='pt4'>Vec<String></span><span>,</span></td></tr>
<tr><td class='ln' data-ln='21'></td><td class='hi'><span> </span><span class='pt1 bo'>pub</span><span> </span><span class='pt2'>scope</span><span>: Scope,</span></td></tr>
<tr><td class='ln' data-ln='22'></td><td class='hi'><span> </span><span class='pt1 bo'>pub</span><span> </span><span class='pt2'>first_line_match</span><span>: </span><span class='pt4'>Option<String></span><span>,</span></td></tr>
<tr><td class='ln' data-ln='23'></td><td class='hi'><span> </span><span class='pt1 bo'>pub</span><span> </span><span class='pt2'>hidden</span><span>: </span><span class='pt1 bo'>bool</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='24'></td><td><span> </span><span class='pt5'>/// Filled in at link time to avoid serializing it multiple times</span></td></tr>
<tr><td class='ln' data-ln='25'></td><td><span> #[</span><span class='pt2'>serde</span><span>(skip_serializing, skip_deserializing)]</span></td></tr>
<tr><td class='ln' data-ln='26'></td><td><span> </span><span class='pt1 bo'>pub</span><span> </span><span class='pt2'>prototype</span><span>: </span><span class='pt4'>Option<</span><span>ContextPtr</span><span class='pt4'>></span><span>,</span></td></tr>
<tr><td class='ln' data-ln='27'></td><td><span> #[</span><span class='pt2'>serde</span><span>(serialize_with </span><span class='pt4'>=</span><span> </span><span class='pt3'>"ordered_map"</span><span>)]</span></td></tr>
<tr><td class='ln' data-ln='28'></td><td><span> </span><span class='pt1 bo'>pub</span><span> </span><span class='pt2'>variables</span><span>: </span><span class='pt4'>HashMap<String</span><span>, </span><span class='pt4'>String></span><span>,</span></td></tr>
<tr><td class='ln' data-ln='29'></td><td><span> #[</span><span class='pt2'>serde</span><span>(serialize_with </span><span class='pt4'>=</span><span> </span><span class='pt3'>"ordered_map"</span><span>)]</span></td></tr>
<tr><td class='ln' data-ln='30'></td><td><span> </span><span class='pt1 bo'>pub</span><span> </span><span class='pt2'>contexts</span><span>: </span><span class='pt4'>HashMap<String</span><span>, ContextPtr</span><span class='pt4'>></span><span>,</span></td></tr>
<tr><td class='ln' data-ln='31'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='32'></td><td> </td></tr>
<tr><td class='ln' data-ln='33'></td><td><span class='pt1 bo'>impl</span><span> Context {</span></td></tr>
<tr><td class='ln' data-ln='34'></td><td><span> </span><span class='pt5'>/// Returns the match pattern at an index, panics if the thing isn't a match pattern</span></td></tr>
<tr><td class='ln' data-ln='35'></td><td><span> </span><span class='pt1 bo'>pub</span><span> </span><span class='pt1 bo'>fn</span><span> </span><span class='pt2'>match_at</span><span>(</span><span class='pt4'>&</span><span class='pt2'>self</span><span>, index: </span><span class='pt1 bo'>usize</span><span>) -> </span><span class='pt4'>&</span><span>MatchPattern {</span></td></tr>
<tr><td class='ln' data-ln='36'></td><td><span> </span><span class='pt4'>match</span><span> </span><span class='pt2'>self</span><span>.patterns[index] {</span></td></tr>
<tr><td class='ln' data-ln='37'></td><td><span> Pattern</span><span class='pt4'>::</span><span>Match(</span><span class='pt1 bo'>ref</span><span> match_pat) </span><span class='pt4'>=></span><span> match_pat,</span></td></tr>
<tr><td class='ln' data-ln='38'></td><td><span> _ </span><span class='pt4'>=></span><span> </span><span class='pt2'>panic!</span><span>(</span><span class='pt3'>"bad index to match_at"</span><span>),</span></td></tr>
<tr><td class='ln' data-ln='39'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='40'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='41'></td><td> </td></tr>
<tr><td class='ln' data-ln='42'></td><td><span> </span><span class='pt5'>/// Returns a mutable reference, otherwise like `match_at`</span></td></tr>
<tr><td class='ln' data-ln='43'></td><td><span> </span><span class='pt1 bo'>pub</span><span> </span><span class='pt1 bo'>fn</span><span> </span><span class='pt2'>match_at_mut</span><span>(</span><span class='pt4'>&</span><span class='pt1 bo'>mut</span><span> </span><span class='pt2'>self</span><span>, index: </span><span class='pt1 bo'>usize</span><span>) -> </span><span class='pt4'>&</span><span class='pt1 bo'>mut</span><span> MatchPattern {</span></td></tr>
<tr><td class='ln' data-ln='44'></td><td><span> </span><span class='pt4'>match</span><span> </span><span class='pt2'>self</span><span>.patterns[index] {</span></td></tr>
<tr><td class='ln' data-ln='45'></td><td><span> Pattern</span><span class='pt4'>::</span><span>Match(</span><span class='pt1 bo'>ref</span><span> </span><span class='pt1 bo'>mut</span><span> match_pat) </span><span class='pt4'>=></span><span> match_pat,</span></td></tr>
<tr><td class='ln' data-ln='46'></td><td><span> _ </span><span class='pt4'>=></span><span> </span><span class='pt2'>panic!</span><span>(</span><span class='pt3'>"bad index to match_at"</span><span>),</span></td></tr>
<tr><td class='ln' data-ln='47'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='48'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='49'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='50'></td><td> </td></tr>
<tr><td class='ln' data-ln='51'></td><td><span class='pt1 bo'>impl</span><span> ContextReference {</span></td></tr>
<tr><td class='ln' data-ln='52'></td><td><span> </span><span class='pt5'>/// find the pointed to context, panics if ref is not linked</span></td></tr>
<tr><td class='ln' data-ln='53'></td><td><span> </span><span class='pt1 bo'>pub</span><span> </span><span class='pt1 bo'>fn</span><span> </span><span class='pt2'>resolve</span><span>(</span><span class='pt4'>&</span><span class='pt2'>self</span><span>) -> ContextPtr {</span></td></tr>
<tr><td class='ln' data-ln='54'></td><td><span> </span><span class='pt4'>match</span><span> </span><span class='pt4'>*</span><span class='pt2'>self</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='55'></td><td><span> ContextReference</span><span class='pt4'>::</span><span>Inline(</span><span class='pt1 bo'>ref</span><span> ptr) </span><span class='pt4'>=></span><span> ptr.</span><span class='pt2'>clone</span><span>(),</span></td></tr>
<tr><td class='ln' data-ln='56'></td><td><span> ContextReference</span><span class='pt4'>::</span><span>Direct(</span><span class='pt1 bo'>ref</span><span> ptr) </span><span class='pt4'>=></span><span> ptr.link.</span><span class='pt2'>upgrade</span><span>().</span><span class='pt2'>unwrap</span><span>(),</span></td></tr>
<tr><td class='ln' data-ln='57'></td><td><span> _ </span><span class='pt4'>=></span><span> </span><span class='pt2'>panic!</span><span>(</span><span class='pt3'>"Can only call resolve on linked references: </span><span class='pt7'>{:?}</span><span class='pt3'>"</span><span>, </span><span class='pt2'>self</span><span>),</span></td></tr>
<tr><td class='ln' data-ln='58'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='59'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='60'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='61'></td><td> </td></tr>
<tr><td class='ln' data-ln='62'></td><td><span class='pt1 bo'>impl</span><span> MatchPattern {</span></td></tr>
<tr><td class='ln' data-ln='63'></td><td><span> </span><span class='pt5'>/// substitutes back-refs in Regex with regions from s</span></td></tr>
<tr><td class='ln' data-ln='64'></td><td><span> </span><span class='pt5'>/// used for match patterns which refer to captures from the pattern</span></td></tr>
<tr><td class='ln' data-ln='65'></td><td><span> </span><span class='pt5'>/// that pushed them.</span></td></tr>
<tr><td class='ln' data-ln='66'></td><td><span> </span><span class='pt1 bo'>pub</span><span> </span><span class='pt1 bo'>fn</span><span> </span><span class='pt2'>regex_with_substitutes</span><span>(</span><span class='pt4'>&</span><span class='pt2'>self</span><span>, region: </span><span class='pt4'>&</span><span>Region, s: </span><span class='pt4'>&</span><span class='pt1 bo'>str</span><span>) -> </span><span class='pt4'>String</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='67'></td><td><span> </span><span class='pt4 bo'>let</span><span> </span><span class='pt1 bo'>mut</span><span> reg_str </span><span class='pt4'>=</span><span> </span><span class='pt4'>String::</span><span class='pt2'>new</span><span>();</span></td></tr>
<tr><td class='ln' data-ln='68'></td><td><span> </span><span class='pt4 bo'>let</span><span> </span><span class='pt1 bo'>mut</span><span> last_was_escape </span><span class='pt4'>=</span><span> </span><span class='pt6'>false</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='69'></td><td> </td></tr>
<tr><td class='ln' data-ln='70'></td><td><span> </span><span class='pt4'>for</span><span> c </span><span class='pt4'>in</span><span> </span><span class='pt2'>self</span><span>.regex_str.</span><span class='pt2'>chars</span><span>() {</span></td></tr>
<tr><td class='ln' data-ln='71'></td><td><span> </span><span class='pt4'>if</span><span> last_was_escape </span><span class='pt4'>&&</span><span> c.</span><span class='pt2'>is_digit</span><span>(</span><span class='pt10'>10</span><span>) {</span></td></tr>
<tr><td class='ln' data-ln='72'></td><td><span> </span><span class='pt4 bo'>let</span><span> val </span><span class='pt4'>=</span><span> c.</span><span class='pt2'>to_digit</span><span>(</span><span class='pt10'>10</span><span>).</span><span class='pt2'>unwrap</span><span>();</span></td></tr>
<tr><td class='ln' data-ln='73'></td><td> </td></tr>
<tr><td class='ln' data-ln='74'></td><td><span> </span><span class='pt4'>if</span><span> </span><span class='pt4 bo'>let</span><span> Some((start, end)) </span><span class='pt4'>=</span><span> region.</span><span class='pt2'>pos</span><span>(val </span><span class='pt4'>as</span><span> </span><span class='pt1 bo'>usize</span><span>) {</span></td></tr>
<tr><td class='ln' data-ln='75'></td><td><span> </span><span class='pt4 bo'>let</span><span> escaped </span><span class='pt4'>=</span><span> </span><span class='pt2'>escape</span><span>(</span><span class='pt4'>&</span><span>s[start</span><span class='pt4'>..</span><span>end]);</span></td></tr>
<tr><td class='ln' data-ln='76'></td><td><span> reg_str.</span><span class='pt2'>push_str</span><span>(</span><span class='pt4'>&</span><span>escaped);</span></td></tr>
<tr><td class='ln' data-ln='77'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='78'></td><td><span> } </span><span class='pt4'>else</span><span> </span><span class='pt4'>if</span><span> last_was_escape {</span></td></tr>
<tr><td class='ln' data-ln='79'></td><td><span> reg_str.</span><span class='pt2'>push</span><span>(</span><span class='pt3'>'</span><span class='pt7'>\\</span><span class='pt3'>'</span><span>);</span></td></tr>
<tr><td class='ln' data-ln='80'></td><td><span> reg_str.</span><span class='pt2'>push</span><span>(c);</span></td></tr>
<tr><td class='ln' data-ln='81'></td><td><span> } </span><span class='pt4'>else</span><span> </span><span class='pt4'>if</span><span> c </span><span class='pt4'>!=</span><span> </span><span class='pt3'>'</span><span class='pt7'>\\</span><span class='pt3'>'</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='82'></td><td><span> reg_str.</span><span class='pt2'>push</span><span>(c);</span></td></tr>
<tr><td class='ln' data-ln='83'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='84'></td><td> </td></tr>
<tr><td class='ln' data-ln='85'></td><td><span> last_was_escape </span><span class='pt4'>=</span><span> c </span><span class='pt4'>==</span><span> </span><span class='pt3'>'</span><span class='pt7'>\\</span><span class='pt3'>'</span><span> </span><span class='pt4'>&&</span><span> </span><span class='pt4'>!</span><span>last_was_escape;</span></td></tr>
<tr><td class='ln' data-ln='86'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='87'></td><td><span> reg_str</span></td></tr>
<tr><td class='ln' data-ln='88'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='89'></td><td> </td></tr>
<tr><td class='ln' data-ln='90'></td><td><span> </span><span class='pt5'>/// Makes sure the regex is compiled if it doesn't have captures.</span></td></tr>
<tr><td class='ln' data-ln='91'></td><td><span> </span><span class='pt5'>/// May compile the regex if it isn't, panicing if compilation fails.</span></td></tr>
<tr><td class='ln' data-ln='92'></td><td><span> #[inline]</span></td></tr>
<tr><td class='ln' data-ln='93'></td><td><span> </span><span class='pt1 bo'>pub</span><span> </span><span class='pt1 bo'>fn</span><span> </span><span class='pt2'>ensure_compiled_if_possible</span><span>(</span><span class='pt4'>&</span><span class='pt1 bo'>mut</span><span> </span><span class='pt2'>self</span><span>) {</span></td></tr>
<tr><td class='ln' data-ln='94'></td><td><span> </span><span class='pt4'>if</span><span> </span><span class='pt2'>self</span><span>.regex.</span><span class='pt2'>is_none</span><span>() </span><span class='pt4'>&&</span><span> </span><span class='pt4'>!</span><span class='pt2'>self</span><span>.has_captures {</span></td></tr>
<tr><td class='ln' data-ln='95'></td><td><span> </span><span class='pt2'>self</span><span>.</span><span class='pt2'>compile_regex</span><span>();</span></td></tr>
<tr><td class='ln' data-ln='96'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='97'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='98'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='99'></td><td> </td></tr>
<tr><td class='ln' data-ln='100'></td><td><span class='pt5'>/// This wrapper only exists so that I can implement a serialization</span></td></tr>
<tr><td class='ln' data-ln='101'></td><td><span class='pt5'>/// trait that crashes if you try and serialize this.</span></td></tr>
<tr><td class='ln' data-ln='102'></td><td><span>#[</span><span class='pt2'>derive</span><span>(</span><span class='pt4'>Debug</span><span>)]</span></td></tr>
<tr><td class='ln' data-ln='103'></td><td><span class='pt1 bo'>pub</span><span> </span><span class='pt1 bo'>struct</span><span> LinkerLink {</span></td></tr>
<tr><td class='ln' data-ln='104'></td><td><span> </span><span class='pt1 bo'>pub</span><span> </span><span class='pt2'>link</span><span>: Weak</span><span class='pt4'><</span><span>RefCell</span><span class='pt4'><</span><span>Context</span><span class='pt4'>>></span><span>,</span></td></tr>
<tr><td class='ln' data-ln='105'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='106'></td><td> </td></tr>
<tr><td class='ln' data-ln='107'></td><td><span class='pt1 bo'>impl</span><span> </span><span class='pt4'>Eq</span><span> </span><span class='pt4'>for</span><span> LinkerLink {}</span></td></tr>
<tr><td class='ln' data-ln='108'></td><td> </td></tr>
<tr><td class='ln' data-ln='109'></td><td><span class='pt1 bo'>impl</span><span> </span><span class='pt4'>PartialEq</span><span> </span><span class='pt4'>for</span><span> LinkerLink {</span></td></tr>
<tr><td class='ln' data-ln='110'></td><td><span> </span><span class='pt1 bo'>fn</span><span> </span><span class='pt2'>eq</span><span>(</span><span class='pt4'>&</span><span class='pt2'>self</span><span>, other: </span><span class='pt4'>&</span><span>LinkerLink) -> </span><span class='pt1 bo'>bool</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='111'></td><td><span> </span><span class='pt2'>self</span><span>.link.</span><span class='pt2'>upgrade</span><span>() </span><span class='pt4'>==</span><span> other.link.</span><span class='pt2'>upgrade</span><span>()</span></td></tr>
<tr><td class='ln' data-ln='112'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='113'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='114'></td><td> </td></tr>
<tr><td class='ln' data-ln='115'></td><td><span class='pt5'>/// Just panics, we can't do anything with linked up syntaxes</span></td></tr>
<tr><td class='ln' data-ln='116'></td><td><span class='pt1 bo'>impl</span><span> Serialize </span><span class='pt4'>for</span><span> LinkerLink {</span></td></tr>
<tr><td class='ln' data-ln='117'></td><td><span> </span><span class='pt1 bo'>fn</span><span> </span><span class='pt2'>serialize</span><span class='pt4'><</span><span>S</span><span class='pt4'>></span><span>(</span><span class='pt4'>&</span><span class='pt2'>self</span><span>, </span><span class='pt4'>_</span><span>: S) -> </span><span class='pt4'>Result<</span><span class='pt1 bo'>S::</span><span>Ok, </span><span class='pt1 bo'>S::</span><span>Error</span><span class='pt4'>></span><span> </span><span class='pt4'>where</span><span> S: Serializer {</span></td></tr>
<tr><td class='ln' data-ln='118'></td><td><span> </span><span class='pt2'>panic!</span><span>(</span><span class='pt3'>"Can't serialize syntax definitions which have been linked"</span><span>);</span></td></tr>
<tr><td class='ln' data-ln='119'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='120'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='121'></td><td> </td></tr>
<tr><td class='ln' data-ln='122'></td><td><span class='pt5'>/// Just panics, we can't do anything with linked up syntaxes</span></td></tr>
<tr><td class='ln' data-ln='123'></td><td><span class='pt1 bo'>impl</span><span class='pt4'><</span><span class='pt1 bo'>'de</span><span class='pt4'>></span><span> Deserialize</span><span class='pt4'><</span><span class='pt1 bo'>'de</span><span class='pt4'>></span><span> </span><span class='pt4'>for</span><span> LinkerLink {</span></td></tr>
<tr><td class='ln' data-ln='124'></td><td><span> </span><span class='pt1 bo'>fn</span><span> </span><span class='pt2'>deserialize</span><span class='pt4'><</span><span>D</span><span class='pt4'>></span><span>(</span><span class='pt4'>_</span><span>: D) -> </span><span class='pt4'>Result<</span><span class='pt1 bo'>Self</span><span>, </span><span class='pt1 bo'>D::</span><span>Error</span><span class='pt4'>></span><span> </span><span class='pt4'>where</span><span> D: Deserializer<'de> {</span></td></tr>
<tr><td class='ln' data-ln='125'></td><td><span> </span><span class='pt2'>panic!</span><span>(</span><span class='pt3'>"No linked syntax should ever have gotten serialized"</span><span>);</span></td></tr>
<tr><td class='ln' data-ln='126'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='127'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='128'></td><td> </td></tr>
<tr><td class='ln' data-ln='129'></td><td> </td></tr>
<tr><td class='ln' data-ln='130'></td><td><span class='pt5'>/// Serialize the provided map in natural key order, so that it's deterministic when dumping.</span></td></tr>
<tr><td class='ln' data-ln='131'></td><td><span class='pt1 bo'>fn</span><span> </span><span class='pt2'>ordered_map</span><span class='pt4'><</span><span>K, V, S</span><span class='pt4'>></span><span>(map: </span><span class='pt4'>&HashMap<</span><span>K, V</span><span class='pt4'>></span><span>, serializer: S) -> </span><span class='pt4'>Result<</span><span class='pt1 bo'>S::</span><span>Ok, </span><span class='pt1 bo'>S::</span><span>Error</span><span class='pt4'>></span></td></tr>
<tr><td class='ln' data-ln='132'></td><td><span> </span><span class='pt4'>where</span><span> S: Serializer, K: Eq + Hash + Ord + Serialize, V: Serialize</span></td></tr>
<tr><td class='ln' data-ln='133'></td><td><span>{</span></td></tr>
<tr><td class='ln' data-ln='134'></td><td><span> </span><span class='pt4 bo'>let</span><span> ordered: BTreeMap</span><span class='pt4'><_</span><span>, </span><span class='pt4'>_></span><span> </span><span class='pt4'>=</span><span> map.</span><span class='pt2'>iter</span><span>().</span><span class='pt2'>collect</span><span>();</span></td></tr>
<tr><td class='ln' data-ln='135'></td><td><span> ordered.</span><span class='pt2'>serialize</span><span>(serializer)</span></td></tr>
<tr><td class='ln' data-ln='136'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='137'></td><td> </td></tr>
<tr><td class='ln' data-ln='138'></td><td> </td></tr>
<tr><td class='ln' data-ln='139'></td><td><span>#[</span><span class='pt2'>cfg</span><span>(test)]</span></td></tr>
<tr><td class='ln' data-ln='140'></td><td><span class='pt1 bo'>mod</span><span> tests {</span></td></tr>
<tr><td class='ln' data-ln='141'></td><td><span> </span><span class='pt4'>use</span><span> </span><span class='pt4'>super::*</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='142'></td><td> </td></tr>
<tr><td class='ln' data-ln='143'></td><td><span> #[test]</span></td></tr>
<tr><td class='ln' data-ln='144'></td><td><span> </span><span class='pt1 bo'>fn</span><span> </span><span class='pt2'>can_compile_refs</span><span>() {</span></td></tr>
<tr><td class='ln' data-ln='145'></td><td><span> </span><span class='pt4'>use</span><span> onig</span><span class='pt4'>::</span><span>{SearchOptions, Regex, Region};</span></td></tr>
<tr><td class='ln' data-ln='146'></td><td> </td></tr>
<tr><td class='ln' data-ln='147'></td><td><span> </span><span class='pt4 bo'>let</span><span> pat </span><span class='pt4'>=</span><span> MatchPattern {</span></td></tr>
<tr><td class='ln' data-ln='148'></td><td><span> has_captures: </span><span class='pt6'>true</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='149'></td><td><span> regex_str: </span><span class='pt4'>String::</span><span class='pt2'>from</span><span>(</span><span class='pt1 bo'>r</span><span class='pt3'>"lol \\ \2 \1 '\9' \wz"</span><span>),</span></td></tr>
<tr><td class='ln' data-ln='150'></td><td><span> regex: None,</span></td></tr>
<tr><td class='ln' data-ln='151'></td><td><span> scope: </span><span class='pt2'>vec!</span><span>[],</span></td></tr>
<tr><td class='ln' data-ln='152'></td><td><span> captures: None,</span></td></tr>
<tr><td class='ln' data-ln='153'></td><td><span> operation: MatchOperation</span><span class='pt4'>::</span><span>None,</span></td></tr>
<tr><td class='ln' data-ln='154'></td><td><span> with_prototype: None,</span></td></tr>
<tr><td class='ln' data-ln='155'></td><td><span> };</span></td></tr>
<tr><td class='ln' data-ln='156'></td><td> </td></tr>
<tr><td class='ln' data-ln='157'></td><td><span> </span><span class='pt4 bo'>let</span><span> r </span><span class='pt4'>=</span><span> Regex</span><span class='pt4'>::</span><span class='pt2'>new</span><span>(</span><span class='pt1 bo'>r</span><span class='pt3'>"(\\\[\]\(\))(b)(c)(d)(e)"</span><span>).</span><span class='pt2'>unwrap</span><span>();</span></td></tr>
<tr><td class='ln' data-ln='158'></td><td><span> </span><span class='pt4 bo'>let</span><span> </span><span class='pt1 bo'>mut</span><span> region </span><span class='pt4'>=</span><span> Region</span><span class='pt4'>::</span><span class='pt2'>new</span><span>();</span></td></tr>
<tr><td class='ln' data-ln='159'></td><td><span> </span><span class='pt4 bo'>let</span><span> s </span><span class='pt4'>=</span><span> </span><span class='pt1 bo'>r</span><span class='pt3'>"\[]()bcde"</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='160'></td><td> </td></tr>
<tr><td class='ln' data-ln='161'></td><td><span> </span><span class='pt2'>assert!</span><span>(r.</span><span class='pt2'>match_with_options</span><span>(s, </span><span class='pt10'>0</span><span>, SearchOptions</span><span class='pt4'>::</span><span class='pt7'>SEARCH_OPTION_NONE</span><span>, Some(</span><span class='pt4'>&</span><span class='pt1 bo'>mut</span><span> region)).</span><span class='pt2'>is_some</span><span>());</span></td></tr>
<tr><td class='ln' data-ln='162'></td><td> </td></tr>
<tr><td class='ln' data-ln='163'></td><td><span> </span><span class='pt4 bo'>let</span><span> regex_res </span><span class='pt4'>=</span><span> pat.</span><span class='pt2'>regex_with_substitutes</span><span>(</span><span class='pt4'>&</span><span>region, s);</span></td></tr>
<tr><td class='ln' data-ln='164'></td><td><span> </span><span class='pt2'>assert_eq!</span><span>(regex_res, </span><span class='pt1 bo'>r</span><span class='pt3'>"lol \\ b \\\[\]\(\) '' \wz"</span><span>);</span></td></tr>
<tr><td class='ln' data-ln='165'></td><td><span> pat.</span><span class='pt2'>compile_with_refs</span><span>(</span><span class='pt4'>&</span><span>region, s);</span></td></tr>
<tr><td class='ln' data-ln='166'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='167'></td><td><span>}</span></td></tr>
</table>
</div>
</div>
</div>
<div class='style' id='P--wombat--rs'>
<div class='P--wombat-bordered'>
<div class="info header">
<span class="left">syntax_definition.rs</span>
<span class="right"><span>167 lines</span><span>5.55 KB</span></span>
</div>
<div class='P--wombat'>
<table>
<tr><td class='ln' data-ln='1'></td><td><span class='pt23'>use</span><span> std</span><span class='pt23'>::</span><span>collections</span><span class='pt23'>::</span><span>{BTreeMap, HashMap};</span></td></tr>
<tr><td class='ln' data-ln='2'></td><td><span class='pt23'>use</span><span> std</span><span class='pt23'>::</span><span>hash</span><span class='pt23'>::</span><span>Hash;</span></td></tr>
<tr><td class='ln' data-ln='3'></td><td><span class='pt23'>use</span><span> onig</span><span class='pt23'>::</span><span>{Regex, RegexOptions, Region, Syntax};</span></td></tr>
<tr><td class='ln' data-ln='4'></td><td><span class='pt23'>use</span><span> std</span><span class='pt23'>::</span><span>rc</span><span class='pt23'>::</span><span>{Rc, Weak};</span></td></tr>
<tr><td class='ln' data-ln='5'></td><td><span class='pt23'>use</span><span> std</span><span class='pt23'>::</span><span>cell</span><span class='pt23'>::</span><span>RefCell;</span></td></tr>
<tr><td class='ln' data-ln='6'></td><td><span class='pt23'>use</span><span> </span><span class='pt23'>super::</span><span>scope</span><span class='pt23'>::*</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='7'></td><td><span class='pt23'>use</span><span> regex_syntax</span><span class='pt23'>::</span><span>escape;</span></td></tr>
<tr><td class='ln' data-ln='8'></td><td class='hi'><span class='pt23'>use</span><span> serde</span><span class='pt23'>::</span><span>{Deserialize, Deserializer, Serialize, Serializer};</span></td></tr>
<tr><td class='ln' data-ln='9'></td><td> </td></tr>
<tr><td class='ln' data-ln='10'></td><td><span class='pt16 it'>/// The main data structure representing a syntax definition loaded from a</span></td></tr>
<tr><td class='ln' data-ln='11'></td><td><span class='pt16 it'>/// `.sublime-syntax` file. You'll probably only need these as references</span></td></tr>
<tr><td class='ln' data-ln='12'></td><td><span class='pt16 it'>/// to be passed around to parsing code.</span></td></tr>
<tr><td class='ln' data-ln='13'></td><td><span class='pt16 it'>///</span></td></tr>
<tr><td class='ln' data-ln='14'></td><td><span class='pt16 it'>/// Some useful public fields are the `name` field which is a human readable</span></td></tr>
<tr><td class='ln' data-ln='15'></td><td><span class='pt16 it'>/// name to display in syntax lists, and the `hidden` field which means hide</span></td></tr>
<tr><td class='ln' data-ln='16'></td><td><span class='pt16 it'>/// this syntax from any lists because it is for internal use.</span></td></tr>
<tr><td class='ln' data-ln='17'></td><td><span>#[</span><span class='pt19'>derive</span><span>(</span><span class='pt13 it'>Clone</span><span>, </span><span class='pt13 it'>Debug</span><span>, </span><span class='pt13 it'>Eq</span><span>, </span><span class='pt13 it'>PartialEq</span><span>, Serialize, Deserialize)]</span></td></tr>
<tr><td class='ln' data-ln='18'></td><td><span class='pt23'>pub</span><span> </span><span class='pt13 it'>struct</span><span> </span><span class='pt19'>SyntaxDefinition</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='19'></td><td class='hi'><span> </span><span class='pt23'>pub</span><span> name: </span><span class='pt13 it'>String</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='20'></td><td class='hi'><span> </span><span class='pt23'>pub</span><span> file_extensions: </span><span class='pt13 it'>Vec</span><span class='pt23'><</span><span class='pt13 it'>String</span><span class='pt23'>></span><span>,</span></td></tr>
<tr><td class='ln' data-ln='21'></td><td class='hi'><span> </span><span class='pt23'>pub</span><span> scope: Scope,</span></td></tr>
<tr><td class='ln' data-ln='22'></td><td class='hi'><span> </span><span class='pt23'>pub</span><span> first_line_match: </span><span class='pt13 it'>Option</span><span class='pt23'><</span><span class='pt13 it'>String</span><span class='pt23'>></span><span>,</span></td></tr>
<tr><td class='ln' data-ln='23'></td><td class='hi'><span> </span><span class='pt23'>pub</span><span> hidden: </span><span class='pt13 it'>bool</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='24'></td><td><span> </span><span class='pt16 it'>/// Filled in at link time to avoid serializing it multiple times</span></td></tr>
<tr><td class='ln' data-ln='25'></td><td><span> #[</span><span class='pt19'>serde</span><span>(skip_serializing, skip_deserializing)]</span></td></tr>
<tr><td class='ln' data-ln='26'></td><td><span> </span><span class='pt23'>pub</span><span> prototype: </span><span class='pt13 it'>Option</span><span class='pt23'><</span><span>ContextPtr</span><span class='pt23'>></span><span>,</span></td></tr>
<tr><td class='ln' data-ln='27'></td><td><span> #[</span><span class='pt19'>serde</span><span>(serialize_with </span><span class='pt23'>=</span><span> </span><span class='pt15'>"ordered_map"</span><span>)]</span></td></tr>
<tr><td class='ln' data-ln='28'></td><td><span> </span><span class='pt23'>pub</span><span> variables: </span><span class='pt13 it'>HashMap</span><span class='pt23'><</span><span class='pt13 it'>String</span><span>, </span><span class='pt13 it'>String</span><span class='pt23'>></span><span>,</span></td></tr>
<tr><td class='ln' data-ln='29'></td><td><span> #[</span><span class='pt19'>serde</span><span>(serialize_with </span><span class='pt23'>=</span><span> </span><span class='pt15'>"ordered_map"</span><span>)]</span></td></tr>
<tr><td class='ln' data-ln='30'></td><td><span> </span><span class='pt23'>pub</span><span> contexts: </span><span class='pt13 it'>HashMap</span><span class='pt23'><</span><span class='pt13 it'>String</span><span>, ContextPtr</span><span class='pt23'>></span><span>,</span></td></tr>
<tr><td class='ln' data-ln='31'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='32'></td><td> </td></tr>
<tr><td class='ln' data-ln='33'></td><td><span class='pt13 it'>impl</span><span> </span><span class='pt19'>Context</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='34'></td><td><span> </span><span class='pt16 it'>/// Returns the match pattern at an index, panics if the thing isn't a match pattern</span></td></tr>
<tr><td class='ln' data-ln='35'></td><td><span> </span><span class='pt23'>pub</span><span> </span><span class='pt13 it'>fn</span><span> </span><span class='pt19'>match_at</span><span>(</span><span class='pt23'>&</span><span class='pt24'>self</span><span>, </span><span class='pt24 it'>index</span><span>: </span><span class='pt13 it'>usize</span><span>) -> </span><span class='pt23'>&</span><span>MatchPattern {</span></td></tr>
<tr><td class='ln' data-ln='36'></td><td><span> </span><span class='pt23'>match</span><span> </span><span class='pt24'>self</span><span>.patterns[index] {</span></td></tr>
<tr><td class='ln' data-ln='37'></td><td><span> Pattern</span><span class='pt23'>::</span><span>Match(</span><span class='pt23'>ref</span><span> match_pat) </span><span class='pt23'>=></span><span> match_pat,</span></td></tr>
<tr><td class='ln' data-ln='38'></td><td><span> _ </span><span class='pt23'>=></span><span> </span><span class='pt13'>panic!</span><span>(</span><span class='pt15'>"bad index to match_at"</span><span>),</span></td></tr>
<tr><td class='ln' data-ln='39'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='40'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='41'></td><td> </td></tr>
<tr><td class='ln' data-ln='42'></td><td><span> </span><span class='pt16 it'>/// Returns a mutable reference, otherwise like `match_at`</span></td></tr>
<tr><td class='ln' data-ln='43'></td><td><span> </span><span class='pt23'>pub</span><span> </span><span class='pt13 it'>fn</span><span> </span><span class='pt19'>match_at_mut</span><span>(</span><span class='pt23'>&mut</span><span> </span><span class='pt24'>self</span><span>, </span><span class='pt24 it'>index</span><span>: </span><span class='pt13 it'>usize</span><span>) -> </span><span class='pt23'>&mut</span><span> MatchPattern {</span></td></tr>
<tr><td class='ln' data-ln='44'></td><td><span> </span><span class='pt23'>match</span><span> </span><span class='pt24'>self</span><span>.patterns[index] {</span></td></tr>
<tr><td class='ln' data-ln='45'></td><td><span> Pattern</span><span class='pt23'>::</span><span>Match(</span><span class='pt23'>ref</span><span> </span><span class='pt23'>mut</span><span> match_pat) </span><span class='pt23'>=></span><span> match_pat,</span></td></tr>
<tr><td class='ln' data-ln='46'></td><td><span> _ </span><span class='pt23'>=></span><span> </span><span class='pt13'>panic!</span><span>(</span><span class='pt15'>"bad index to match_at"</span><span>),</span></td></tr>
<tr><td class='ln' data-ln='47'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='48'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='49'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='50'></td><td> </td></tr>
<tr><td class='ln' data-ln='51'></td><td><span class='pt13 it'>impl</span><span> </span><span class='pt19'>ContextReference</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='52'></td><td><span> </span><span class='pt16 it'>/// find the pointed to context, panics if ref is not linked</span></td></tr>
<tr><td class='ln' data-ln='53'></td><td><span> </span><span class='pt23'>pub</span><span> </span><span class='pt13 it'>fn</span><span> </span><span class='pt19'>resolve</span><span>(</span><span class='pt23'>&</span><span class='pt24'>self</span><span>) -> ContextPtr {</span></td></tr>
<tr><td class='ln' data-ln='54'></td><td><span> </span><span class='pt23'>match</span><span> </span><span class='pt23'>*</span><span class='pt24'>self</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='55'></td><td><span> ContextReference</span><span class='pt23'>::</span><span>Inline(</span><span class='pt23'>ref</span><span> ptr) </span><span class='pt23'>=></span><span> ptr.</span><span class='pt19'>clone</span><span>(),</span></td></tr>
<tr><td class='ln' data-ln='56'></td><td><span> ContextReference</span><span class='pt23'>::</span><span>Direct(</span><span class='pt23'>ref</span><span> ptr) </span><span class='pt23'>=></span><span> ptr.link.</span><span class='pt19'>upgrade</span><span>().</span><span class='pt19'>unwrap</span><span>(),</span></td></tr>
<tr><td class='ln' data-ln='57'></td><td><span> _ </span><span class='pt23'>=></span><span> </span><span class='pt13'>panic!</span><span>(</span><span class='pt15'>"Can only call resolve on linked references: </span><span class='pt17'>{:?}</span><span class='pt15'>"</span><span>, </span><span class='pt24'>self</span><span>),</span></td></tr>
<tr><td class='ln' data-ln='58'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='59'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='60'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='61'></td><td> </td></tr>
<tr><td class='ln' data-ln='62'></td><td><span class='pt13 it'>impl</span><span> </span><span class='pt19'>MatchPattern</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='63'></td><td><span> </span><span class='pt16 it'>/// substitutes back-refs in Regex with regions from s</span></td></tr>
<tr><td class='ln' data-ln='64'></td><td><span> </span><span class='pt16 it'>/// used for match patterns which refer to captures from the pattern</span></td></tr>
<tr><td class='ln' data-ln='65'></td><td><span> </span><span class='pt16 it'>/// that pushed them.</span></td></tr>
<tr><td class='ln' data-ln='66'></td><td><span> </span><span class='pt23'>pub</span><span> </span><span class='pt13 it'>fn</span><span> </span><span class='pt19'>regex_with_substitutes</span><span>(</span><span class='pt23'>&</span><span class='pt24'>self</span><span>, </span><span class='pt24 it'>region</span><span>: </span><span class='pt23'>&</span><span>Region, </span><span class='pt24 it'>s</span><span>: </span><span class='pt23'>&</span><span class='pt13 it'>str</span><span>) -> </span><span class='pt13 it'>String</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='67'></td><td><span> </span><span class='pt23 it'>let</span><span> </span><span class='pt23'>mut</span><span> reg_str </span><span class='pt23'>=</span><span> </span><span class='pt13 it'>String</span><span class='pt23'>::</span><span class='pt19'>new</span><span>();</span></td></tr>
<tr><td class='ln' data-ln='68'></td><td><span> </span><span class='pt23 it'>let</span><span> </span><span class='pt23'>mut</span><span> last_was_escape </span><span class='pt23'>=</span><span> </span><span class='pt17'>false</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='69'></td><td> </td></tr>
<tr><td class='ln' data-ln='70'></td><td><span> </span><span class='pt23'>for</span><span> c </span><span class='pt23'>in</span><span> </span><span class='pt24'>self</span><span>.regex_str.</span><span class='pt19'>chars</span><span>() {</span></td></tr>
<tr><td class='ln' data-ln='71'></td><td><span> </span><span class='pt23'>if</span><span> last_was_escape </span><span class='pt23'>&&</span><span> c.</span><span class='pt19'>is_digit</span><span>(</span><span class='pt24'>10</span><span>) {</span></td></tr>
<tr><td class='ln' data-ln='72'></td><td><span> </span><span class='pt23 it'>let</span><span> val </span><span class='pt23'>=</span><span> c.</span><span class='pt19'>to_digit</span><span>(</span><span class='pt24'>10</span><span>).</span><span class='pt19'>unwrap</span><span>();</span></td></tr>
<tr><td class='ln' data-ln='73'></td><td> </td></tr>
<tr><td class='ln' data-ln='74'></td><td><span> </span><span class='pt23'>if</span><span> </span><span class='pt23 it'>let</span><span> </span><span class='pt13'>Some</span><span>((start, end)) </span><span class='pt23'>=</span><span> region.</span><span class='pt19'>pos</span><span>(val </span><span class='pt23'>as</span><span> </span><span class='pt13 it'>usize</span><span>) {</span></td></tr>
<tr><td class='ln' data-ln='75'></td><td><span> </span><span class='pt23 it'>let</span><span> escaped </span><span class='pt23'>=</span><span> </span><span class='pt19'>escape</span><span>(</span><span class='pt23'>&</span><span>s[start</span><span class='pt23'>..</span><span>end]);</span></td></tr>
<tr><td class='ln' data-ln='76'></td><td><span> reg_str.</span><span class='pt19'>push_str</span><span>(</span><span class='pt23'>&</span><span>escaped);</span></td></tr>
<tr><td class='ln' data-ln='77'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='78'></td><td><span> } </span><span class='pt23'>else</span><span> </span><span class='pt23'>if</span><span> last_was_escape {</span></td></tr>
<tr><td class='ln' data-ln='79'></td><td><span> reg_str.</span><span class='pt19'>push</span><span>(</span><span class='pt15'>'</span><span class='pt17'>\\</span><span class='pt15'>'</span><span>);</span></td></tr>
<tr><td class='ln' data-ln='80'></td><td><span> reg_str.</span><span class='pt19'>push</span><span>(c);</span></td></tr>
<tr><td class='ln' data-ln='81'></td><td><span> } </span><span class='pt23'>else</span><span> </span><span class='pt23'>if</span><span> c </span><span class='pt23'>!=</span><span> </span><span class='pt15'>'</span><span class='pt17'>\\</span><span class='pt15'>'</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='82'></td><td><span> reg_str.</span><span class='pt19'>push</span><span>(c);</span></td></tr>
<tr><td class='ln' data-ln='83'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='84'></td><td> </td></tr>
<tr><td class='ln' data-ln='85'></td><td><span> last_was_escape </span><span class='pt23'>=</span><span> c </span><span class='pt23'>==</span><span> </span><span class='pt15'>'</span><span class='pt17'>\\</span><span class='pt15'>'</span><span> </span><span class='pt23'>&&</span><span> </span><span class='pt23'>!</span><span>last_was_escape;</span></td></tr>
<tr><td class='ln' data-ln='86'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='87'></td><td><span> reg_str</span></td></tr>
<tr><td class='ln' data-ln='88'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='89'></td><td> </td></tr>
<tr><td class='ln' data-ln='90'></td><td><span> </span><span class='pt16 it'>/// Makes sure the regex is compiled if it doesn't have captures.</span></td></tr>
<tr><td class='ln' data-ln='91'></td><td><span> </span><span class='pt16 it'>/// May compile the regex if it isn't, panicing if compilation fails.</span></td></tr>
<tr><td class='ln' data-ln='92'></td><td><span> #[inline]</span></td></tr>
<tr><td class='ln' data-ln='93'></td><td><span> </span><span class='pt23'>pub</span><span> </span><span class='pt13 it'>fn</span><span> </span><span class='pt19'>ensure_compiled_if_possible</span><span>(</span><span class='pt23'>&mut</span><span> </span><span class='pt24'>self</span><span>) {</span></td></tr>
<tr><td class='ln' data-ln='94'></td><td><span> </span><span class='pt23'>if</span><span> </span><span class='pt24'>self</span><span>.regex.</span><span class='pt19'>is_none</span><span>() </span><span class='pt23'>&&</span><span> </span><span class='pt23'>!</span><span class='pt24'>self</span><span>.has_captures {</span></td></tr>
<tr><td class='ln' data-ln='95'></td><td><span> </span><span class='pt24'>self</span><span>.</span><span class='pt19'>compile_regex</span><span>();</span></td></tr>
<tr><td class='ln' data-ln='96'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='97'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='98'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='99'></td><td> </td></tr>
<tr><td class='ln' data-ln='100'></td><td><span class='pt16 it'>/// This wrapper only exists so that I can implement a serialization</span></td></tr>
<tr><td class='ln' data-ln='101'></td><td><span class='pt16 it'>/// trait that crashes if you try and serialize this.</span></td></tr>
<tr><td class='ln' data-ln='102'></td><td><span>#[</span><span class='pt19'>derive</span><span>(</span><span class='pt13 it'>Debug</span><span>)]</span></td></tr>
<tr><td class='ln' data-ln='103'></td><td><span class='pt23'>pub</span><span> </span><span class='pt13 it'>struct</span><span> </span><span class='pt19'>LinkerLink</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='104'></td><td><span> </span><span class='pt23'>pub</span><span> link: Weak</span><span class='pt23'><</span><span>RefCell</span><span class='pt23'><</span><span>Context</span><span class='pt23'>>></span><span>,</span></td></tr>
<tr><td class='ln' data-ln='105'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='106'></td><td> </td></tr>
<tr><td class='ln' data-ln='107'></td><td><span class='pt13 it'>impl</span><span> </span><span class='pt13 it'>Eq</span><span> </span><span class='pt23'>for</span><span> </span><span class='pt19'>LinkerLink</span><span> {}</span></td></tr>
<tr><td class='ln' data-ln='108'></td><td> </td></tr>
<tr><td class='ln' data-ln='109'></td><td><span class='pt13 it'>impl</span><span> </span><span class='pt13 it'>PartialEq</span><span> </span><span class='pt23'>for</span><span> </span><span class='pt19'>LinkerLink</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='110'></td><td><span> </span><span class='pt13 it'>fn</span><span> </span><span class='pt19'>eq</span><span>(</span><span class='pt23'>&</span><span class='pt24'>self</span><span>, </span><span class='pt24 it'>other</span><span>: </span><span class='pt23'>&</span><span>LinkerLink) -> </span><span class='pt13 it'>bool</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='111'></td><td><span> </span><span class='pt24'>self</span><span>.link.</span><span class='pt19'>upgrade</span><span>() </span><span class='pt23'>==</span><span> other.link.</span><span class='pt19'>upgrade</span><span>()</span></td></tr>
<tr><td class='ln' data-ln='112'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='113'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='114'></td><td> </td></tr>
<tr><td class='ln' data-ln='115'></td><td><span class='pt16 it'>/// Just panics, we can't do anything with linked up syntaxes</span></td></tr>
<tr><td class='ln' data-ln='116'></td><td><span class='pt13 it'>impl</span><span> Serialize </span><span class='pt23'>for</span><span> </span><span class='pt19'>LinkerLink</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='117'></td><td><span> </span><span class='pt13 it'>fn</span><span> </span><span class='pt19'>serialize</span><span class='pt23'><</span><span>S</span><span class='pt23'>></span><span>(</span><span class='pt23'>&</span><span class='pt24'>self</span><span>, </span><span class='pt23'>_</span><span>: S) -> </span><span class='pt13 it'>Result</span><span class='pt23'><</span><span class='pt13 it'>S::</span><span class='pt13'>Ok</span><span>, </span><span class='pt13 it'>S::</span><span>Error</span><span class='pt23'>></span><span> </span><span class='pt23'>where</span><span> S: Serializer {</span></td></tr>
<tr><td class='ln' data-ln='118'></td><td><span> </span><span class='pt13'>panic!</span><span>(</span><span class='pt15'>"Can't serialize syntax definitions which have been linked"</span><span>);</span></td></tr>
<tr><td class='ln' data-ln='119'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='120'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='121'></td><td> </td></tr>
<tr><td class='ln' data-ln='122'></td><td><span class='pt16 it'>/// Just panics, we can't do anything with linked up syntaxes</span></td></tr>
<tr><td class='ln' data-ln='123'></td><td><span class='pt13 it'>impl</span><span class='pt23'><'de></span><span> Deserialize</span><span class='pt23'><'de></span><span> </span><span class='pt23'>for</span><span> </span><span class='pt19'>LinkerLink</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='124'></td><td><span> </span><span class='pt13 it'>fn</span><span> </span><span class='pt19'>deserialize</span><span class='pt23'><</span><span>D</span><span class='pt23'>></span><span>(</span><span class='pt23'>_</span><span>: D) -> </span><span class='pt13 it'>Result</span><span class='pt23'><</span><span class='pt13 it'>Self</span><span>, </span><span class='pt13 it'>D::</span><span>Error</span><span class='pt23'>></span><span> </span><span class='pt23'>where</span><span> D: Deserializer<'de> {</span></td></tr>
<tr><td class='ln' data-ln='125'></td><td><span> </span><span class='pt13'>panic!</span><span>(</span><span class='pt15'>"No linked syntax should ever have gotten serialized"</span><span>);</span></td></tr>
<tr><td class='ln' data-ln='126'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='127'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='128'></td><td> </td></tr>
<tr><td class='ln' data-ln='129'></td><td> </td></tr>
<tr><td class='ln' data-ln='130'></td><td><span class='pt16 it'>/// Serialize the provided map in natural key order, so that it's deterministic when dumping.</span></td></tr>
<tr><td class='ln' data-ln='131'></td><td><span class='pt13 it'>fn</span><span> </span><span class='pt19'>ordered_map</span><span class='pt23'><</span><span>K, V, S</span><span class='pt23'>></span><span>(</span><span class='pt24 it'>map</span><span>: </span><span class='pt23'>&</span><span class='pt13 it'>HashMap</span><span class='pt23'><</span><span>K, V</span><span class='pt23'>></span><span>, </span><span class='pt24 it'>serializer</span><span>: S) -> </span><span class='pt13 it'>Result</span><span class='pt23'><</span><span class='pt13 it'>S::</span><span class='pt13'>Ok</span><span>, </span><span class='pt13 it'>S::</span><span>Error</span><span class='pt23'>></span></td></tr>
<tr><td class='ln' data-ln='132'></td><td><span> </span><span class='pt23'>where</span><span> S: Serializer, K: Eq + Hash + Ord + Serialize, V: Serialize</span></td></tr>
<tr><td class='ln' data-ln='133'></td><td><span>{</span></td></tr>
<tr><td class='ln' data-ln='134'></td><td><span> </span><span class='pt23 it'>let</span><span> ordered: BTreeMap</span><span class='pt23'><_</span><span>, </span><span class='pt23'>_></span><span> </span><span class='pt23'>=</span><span> map.</span><span class='pt19'>iter</span><span>().</span><span class='pt19'>collect</span><span>();</span></td></tr>
<tr><td class='ln' data-ln='135'></td><td><span> ordered.</span><span class='pt19'>serialize</span><span>(serializer)</span></td></tr>
<tr><td class='ln' data-ln='136'></td><td><span>}</span></td></tr>
<tr><td class='ln' data-ln='137'></td><td> </td></tr>
<tr><td class='ln' data-ln='138'></td><td> </td></tr>
<tr><td class='ln' data-ln='139'></td><td><span>#[</span><span class='pt19'>cfg</span><span>(test)]</span></td></tr>
<tr><td class='ln' data-ln='140'></td><td><span class='pt13 it'>mod</span><span> </span><span class='pt19'>tests</span><span> {</span></td></tr>
<tr><td class='ln' data-ln='141'></td><td><span> </span><span class='pt23'>use</span><span> </span><span class='pt23'>super::*</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='142'></td><td> </td></tr>
<tr><td class='ln' data-ln='143'></td><td><span> #[test]</span></td></tr>
<tr><td class='ln' data-ln='144'></td><td><span> </span><span class='pt13 it'>fn</span><span> </span><span class='pt19'>can_compile_refs</span><span>() {</span></td></tr>
<tr><td class='ln' data-ln='145'></td><td><span> </span><span class='pt23'>use</span><span> onig</span><span class='pt23'>::</span><span>{SearchOptions, Regex, Region};</span></td></tr>
<tr><td class='ln' data-ln='146'></td><td> </td></tr>
<tr><td class='ln' data-ln='147'></td><td><span> </span><span class='pt23 it'>let</span><span> pat </span><span class='pt23'>=</span><span> MatchPattern {</span></td></tr>
<tr><td class='ln' data-ln='148'></td><td><span> has_captures: </span><span class='pt17'>true</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='149'></td><td><span> regex_str: </span><span class='pt13 it'>String</span><span class='pt23'>::</span><span class='pt19'>from</span><span>(</span><span class='pt13 it'>r</span><span class='pt15'>"lol \\ \2 \1 '\9' \wz"</span><span>),</span></td></tr>
<tr><td class='ln' data-ln='150'></td><td><span> regex: </span><span class='pt13'>None</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='151'></td><td><span> scope: </span><span class='pt13'>vec!</span><span>[],</span></td></tr>
<tr><td class='ln' data-ln='152'></td><td><span> captures: </span><span class='pt13'>None</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='153'></td><td><span> operation: MatchOperation</span><span class='pt23'>::</span><span class='pt13'>None</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='154'></td><td><span> with_prototype: </span><span class='pt13'>None</span><span>,</span></td></tr>
<tr><td class='ln' data-ln='155'></td><td><span> };</span></td></tr>
<tr><td class='ln' data-ln='156'></td><td> </td></tr>
<tr><td class='ln' data-ln='157'></td><td><span> </span><span class='pt23 it'>let</span><span> r </span><span class='pt23'>=</span><span> Regex</span><span class='pt23'>::</span><span class='pt19'>new</span><span>(</span><span class='pt13 it'>r</span><span class='pt15'>"(\\\[\]\(\))(b)(c)(d)(e)"</span><span>).</span><span class='pt19'>unwrap</span><span>();</span></td></tr>
<tr><td class='ln' data-ln='158'></td><td><span> </span><span class='pt23 it'>let</span><span> </span><span class='pt23'>mut</span><span> region </span><span class='pt23'>=</span><span> Region</span><span class='pt23'>::</span><span class='pt19'>new</span><span>();</span></td></tr>
<tr><td class='ln' data-ln='159'></td><td><span> </span><span class='pt23 it'>let</span><span> s </span><span class='pt23'>=</span><span> </span><span class='pt13 it'>r</span><span class='pt15'>"\[]()bcde"</span><span>;</span></td></tr>
<tr><td class='ln' data-ln='160'></td><td> </td></tr>
<tr><td class='ln' data-ln='161'></td><td><span> </span><span class='pt13'>assert!</span><span>(r.</span><span class='pt19'>match_with_options</span><span>(s, </span><span class='pt24'>0</span><span>, SearchOptions</span><span class='pt23'>::</span><span class='pt17'>SEARCH_OPTION_NONE</span><span>, </span><span class='pt13'>Some</span><span>(</span><span class='pt23'>&mut</span><span> region)).</span><span class='pt19'>is_some</span><span>());</span></td></tr>
<tr><td class='ln' data-ln='162'></td><td> </td></tr>
<tr><td class='ln' data-ln='163'></td><td><span> </span><span class='pt23 it'>let</span><span> regex_res </span><span class='pt23'>=</span><span> pat.</span><span class='pt19'>regex_with_substitutes</span><span>(</span><span class='pt23'>&</span><span>region, s);</span></td></tr>
<tr><td class='ln' data-ln='164'></td><td><span> </span><span class='pt13'>assert_eq!</span><span>(regex_res, </span><span class='pt13 it'>r</span><span class='pt15'>"lol \\ b \\\[\]\(\) '' \wz"</span><span>);</span></td></tr>
<tr><td class='ln' data-ln='165'></td><td><span> pat.</span><span class='pt19'>compile_with_refs</span><span>(</span><span class='pt23'>&</span><span>region, s);</span></td></tr>
<tr><td class='ln' data-ln='166'></td><td><span> }</span></td></tr>
<tr><td class='ln' data-ln='167'></td><td><span>}</span></td></tr>
</table>
</div>
</div>
</div>
</div> <!-- highlighted -->
<div class="gh">
<a href="https://github.com/demille/paint">
<svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
<path d="M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12"/>
</svg>
<span>/demille/paint</span>
</a>
</div>
</div> <!-- container -->
<div class="bg-overlay"></div>
<script src="main.js"></script>
</body>
</html>