fasta-parser
Version:
Buffer Stream parser from FASTA to JSON
119 lines (95 loc) • 6.13 kB
HTML
<html>
<head>
<title>fasta-parser</title>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<meta name="viewport" content="width=device-width, target-densitydpi=160dpi, initial-scale=1.0; maximum-scale=1.0; user-scalable=0;">
<link rel="stylesheet" media="all" href="docco.css" />
</head>
<body>
<div id="container">
<div id="background"></div>
<ul class="sections">
<li id="section-1">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-1">¶</a>
</div>
<h1 id="fasta-parser">fasta-parser</h1>
<blockquote>
<p>Buffer Stream parser from FASTA to JSON.</p>
<p>doi: <a href="?">?</a>
author: <a href="http://bmpvieira.com">Bruno Vieira</a>
email: <a href="mailto:mail@bmpvieira.com">mail@bmpvieira.com</a>
license: <a href="https://raw.githubusercontent.com/bionode/fasta-parser/master/LICENSE">MIT</a></p>
</blockquote>
<hr>
</div>
</li>
<li id="section-2">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-2">¶</a>
</div>
<h2 id="usage">Usage</h2>
<pre><code>$ npm install fasta-parser
<span class="hljs-keyword">var</span> parser = <span class="hljs-built_in">require</span>(<span class="hljs-string">'fasta-parser'</span>)
<span class="hljs-keyword">var</span> fastaData = <span class="hljs-keyword">new</span> Buffer (<span class="hljs-string">'>sequence1\n\
ATGCACGTCACGTCAGTACTCGTCAGTAC\n\
>sequence2\n\
CAGTCCTACTGCATGCATGCATGCATGCATCGATGCATGTCGACTGCATGCATGC\n'</span>)
<span class="hljs-keyword">var</span> parser = fasta()
parser.on(<span class="hljs-string">'data'</span>, <span class="hljs-function"><span class="hljs-keyword">function</span><span class="hljs-params">(data)</span> </span>{
<span class="hljs-built_in">console</span>.log(<span class="hljs-built_in">JSON</span>.parse(data.toString()))
})
parser.write(fastaData)
parser.end()
<span class="hljs-comment">// { id: 'sequence1',</span>
<span class="hljs-comment">// seq: 'ATGCACGTCACGTCAGTACTCGTCAGTAC' }</span>
<span class="hljs-comment">// { id: 'sequence2',</span>
<span class="hljs-comment">// seq: 'CAGTCCTACTGCATGCATGCATGCATGCATCGATGCATGTCGACTGCATGCATGC' }</span>
</code></pre><p>For a more useful API, check the dependent module:</p>
<p><a href="http://github.com/bionode/bionode-fasta">bionode-fasta</a></p>
</div>
<div class="content"><div class='highlight'><pre>
<span class="hljs-keyword">var</span> through = <span class="hljs-built_in">require</span>(<span class="hljs-string">'through2'</span>)
<span class="hljs-keyword">var</span> split = <span class="hljs-built_in">require</span>(<span class="hljs-string">'split'</span>)
<span class="hljs-keyword">var</span> pumpify = <span class="hljs-built_in">require</span>(<span class="hljs-string">'pumpify'</span>)
<span class="hljs-built_in">module</span>.exports = <span class="hljs-function"><span class="hljs-keyword">function</span><span class="hljs-params">()</span> </span>{
<span class="hljs-keyword">return</span> pumpify(split(), parser())
}
<span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">parser</span><span class="hljs-params">()</span> </span>{
<span class="hljs-keyword">var</span> cacheBuf
<span class="hljs-keyword">var</span> cacheBufLen = <span class="hljs-number">8</span>
<span class="hljs-keyword">var</span> openID = <span class="hljs-keyword">new</span> Buffer(<span class="hljs-string">'{"id":"'</span>)
<span class="hljs-keyword">var</span> closeIDOpenSeq = <span class="hljs-keyword">new</span> Buffer(<span class="hljs-string">'","seq":"'</span>)
<span class="hljs-keyword">var</span> closeSeq = <span class="hljs-keyword">new</span> Buffer(<span class="hljs-string">'"}\n'</span>)
<span class="hljs-keyword">var</span> stream = through(transform, flush)
<span class="hljs-keyword">return</span> stream
<span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">transform</span><span class="hljs-params">(buf, enc, next)</span> </span>{
<span class="hljs-keyword">if</span> (buf[<span class="hljs-number">0</span>] === <span class="hljs-number">62</span>) { <span class="hljs-comment">// If line starts with '>', this is an ID</span>
<span class="hljs-keyword">if</span> (cacheBuf) { <span class="hljs-comment">// If a previous object is in cache, push it</span>
cacheBuf = Buffer.concat([cacheBuf, closeSeq], cacheBufLen+<span class="hljs-number">3</span>)
<span class="hljs-keyword">this</span>.push(cacheBuf)
}
<span class="hljs-keyword">var</span> id = buf.toString().slice(<span class="hljs-number">1</span>).trim().replace(<span class="hljs-regexp">/"/g</span>, <span class="hljs-string">'\\"'</span>)
cacheBufLen = id.length + <span class="hljs-number">16</span>
cacheBuf = Buffer.concat([openID, <span class="hljs-keyword">new</span> Buffer(id), closeIDOpenSeq], cacheBufLen)
}
<span class="hljs-keyword">else</span> {
cacheBufLen += buf.length
cacheBuf = Buffer.concat([cacheBuf, buf], cacheBufLen)
}
next()
}
<span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">flush</span><span class="hljs-params">()</span> </span>{
cacheBuf = Buffer.concat([cacheBuf, closeSeq], cacheBufLen+<span class="hljs-number">3</span>)
<span class="hljs-keyword">this</span>.push(cacheBuf)
<span class="hljs-keyword">this</span>.push(<span class="hljs-literal">null</span>)
}
}</pre></div></div>
</li>
</ul>
</div>
</body>
</html>