/
PrettyFasta.js
141 lines (133 loc) · 4.96 KB
/
PrettyFasta.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
// JavaScript Document
/*
Pretty fasta will load onload and change all fasta classed elements.
While if you want to prettify an element after load, you will have to send the sequence to PrettyFastaText.
taggedfasta=PrettyFastaText(rawfasta)
*/
//There is a weird thing that the non-breaking hyphen and the hyphen are not monospaced in some monospaced fonts.
var FASTAHYPHEN = "–";
//No breaking hyphen is "‑";
//rubbish title or a tooltip from Bootstrap, JQuery or something else?
var FASTATOOLTIP = "title";
if (window.attachEvent) {
window.attachEvent('onload', PrettyFasta);
} else {
if (window.onload) {
var curronload = window.onload;
var newonload = function() {
curronload();
PrettyFasta();
};
window.onload = newonload;
} else {
window.onload = PrettyFasta;
}
}
function PrettyFastaSequencer(seq, seqnumber) {
var munged="<span class='fastasequence'>";
//munged+="<span class='fasta"+fasta[l][c]+"'>"+fasta[l][c]+"</span>";
//I want to colour depending on type.
//Determine type.
var proteinaceous = 0;
var translation = 'error';
var translator = { //defaults to nucleotide...
A: 'adenine',
C: 'cytosine',
T: 'thymine',
G: 'guanine',
_: 'space',
N: 'any'
};
//There is only B and U which are give away nucleotides, so best do the protein way.
if (seq.search(/[EFILOPQ]/) != -1) {
proteinaceous = 1;
translator = {
A: 'alanine',
C: 'cysteine',
G: 'glycine',
P: 'proline',
V: 'valine',
I: 'isoleucine',
L: 'leucine',
M: 'methionine',
F: 'phenylalanine',
Y: 'tyrosine',
W: 'tryptophan',
H: 'histidine',
K: 'lysine',
R: 'arginine',
Q: 'glutamine',
N: 'asparagine',
E: 'glutamate',
D: 'aspartate',
S: 'serine',
T: 'threonine',
B: 'asparx', //no idea if there is a name for this...
Z: 'glutamz',
_: 'gap'
};
}
//Colour accordingly.
for (var c = 0; c < seq.length; c++) {
var label = "" + (1 + c)
var pad = Array(Math.floor(Math.log10(seq.length)) + 2).join('0');
var label = " " + pad.substring(0, pad.length - label.length) + label + " ";
if (c == 0) {
munged += "<span class='fastaspace0' block-number='" + label + "'></span>";
} else if (c % 1000 == 0) { //What if someone wants a babylonian counting system?
munged += "<span class='fastaspace1000' block-number='" + label + "'></span>";
} else if (c % 100 == 0) {
munged += "<span class='fastaspace100' block-number='" + label + "'></span>";
} else if (c % 50 == 0) {
munged += "<span class='fastaspace50' block-number='" + label + "'></span>";
} else if (c % 20 == 0) {
munged += "<span class='fastaspace20' block-number='" + label + "'></span>";
} else if (c % 10 == 0) {
munged += "<span class='fastaspace10' block-number='" + label + "'></span>";
} else if (c % 5 == 0) {
munged += "<span class='fastaspace5' block-number='" + label + "'></span>";
}
var token = seq[c];
var letter = seq[c];
if ((token == '.') || (token == '-')) {
token = '_';
letter = FASTAHYPHEN;
}
try { //I cannot figure out a case where this would trigger but I thought it best to be safe.
//seq
translation = translator[token];
} catch (err) {
console.log(seq[c] + ' is some weird unicode symbol?!');
translation = 'undefined';
}
munged += "<span class='fasta" + translation + "' " + FASTATOOLTIP + "='" + (c + 1) + "' id='fasta" + seqnumber + "_" + letter + (c + 1) + "'>" + letter + "</span>";
}
munged += "</span><br/><br/>";
return munged;
}
function PrettyFastaText(text, seqnumber) {
seqnumber = seqnumber || 0;
var munged = '';
var seq = '';
var fasta = text.split('\n');
for (var l = 0; l < fasta.length; l++) {
//console.log(fasta[l]);
if (fasta[l].search('>') != -1) {
if (seq) {munged += PrettyFastaSequencer(seq, seqnumber); seq='';}
fasta[l] = fasta[l].replace(/\[(.*?)\]/, "\[\<span class='fastaspecies'\>$1\<\/span\>\]")
munged += "<span class='fastaheader'>" + fasta[l] + "</span><br/>";
} else {
seq += fasta[l].replace(/\s|\r\w/g, '');
}
}
munged += PrettyFastaSequencer(seq, seqnumber);
return munged;
}
function PrettyFasta() {
var fastalist = document.getElementsByClassName("fasta");
for (var i = 0; i < fastalist.length; i++) {
var fastain = fastalist.item(i).innerHTML;
var fastout = PrettyFastaText(fastain, i + 1);
fastalist.item(i).innerHTML = fastout;
}
}