UNPKG

biojs-io-clustal

Version:
71 lines (66 loc) 1.88 kB
// Generated by CoffeeScript 1.8.0 var Clustal, GenericReader, st; GenericReader = require("biojs-io-parser"); st = require("msa-seqtools"); module.exports = Clustal = { parse: function(text) { var blockstate, cSeq, k, keys, label, line, lines, match, obj, regex, seqCounter, seqs, sequence; seqs = []; if (Object.prototype.toString.call(text) === '[object Array]') { lines = text; } else { lines = text.split("\n"); } if (lines[0].slice(0, 6) === !"CLUSTAL") { throw new Error("Invalid CLUSTAL Header"); } k = 0; blockstate = 1; seqCounter = 0; while (k < lines.length) { k++; line = lines[k]; if ((line == null) || line.length === 0) { blockstate = 1; continue; } if (line.trim().length === 0) { blockstate = 1; continue; } else { if (st.contains(line, "*")) { continue; } if (blockstate === 1) { seqCounter = 0; blockstate = 0; } regex = /^(?:\s*)(\S+)(?:\s+)(\S+)(?:\s*)(\d*)(?:\s*|$)/g; match = regex.exec(line); if (match != null) { label = match[1]; sequence = match[2]; if (seqCounter >= seqs.length) { obj = st.getMeta(label); label = obj.name; cSeq = new st.model(sequence, label, seqCounter); cSeq.ids = obj.ids || {}; cSeq.details = obj.details || {}; keys = Object.keys(cSeq.ids); if (keys.length > 0) { cSeq.id = cSeq.ids[keys[0]]; } seqs.push(cSeq); } else { seqs[seqCounter].seq += sequence; } seqCounter++; } else { console.log("parse error", line); } } } return seqs; } }; GenericReader.mixin(Clustal);