JAL-1807 Bob's JalviewJS prototype first commit
[jalviewjs.git] / bin / jalview / util / Format.js
1 Clazz.declarePackage ("jalview.util");\r
2 Clazz.load (null, "jalview.util.Format", ["java.lang.Character", "$.IllegalArgumentException", "$.StringBuffer"], function () {\r
3 c$ = Clazz.decorateAsClass (function () {\r
4 this.width = 0;\r
5 this.precision = 0;\r
6 this.pre = null;\r
7 this.post = null;\r
8 this.leading_zeroes = false;\r
9 this.show_plus = false;\r
10 this.alternate = false;\r
11 this.show_space = false;\r
12 this.left_align = false;\r
13 this.fmt = '\0';\r
14 this.formatString = null;\r
15 Clazz.instantialize (this, arguments);\r
16 }, jalview.util, "Format");\r
17 Clazz.makeConstructor (c$, \r
18 function (s) {\r
19 this.formatString = s;\r
20 this.width = 0;\r
21 this.precision = -1;\r
22 this.pre = "";\r
23 this.post = "";\r
24 this.leading_zeroes = false;\r
25 this.show_plus = false;\r
26 this.alternate = false;\r
27 this.show_space = false;\r
28 this.left_align = false;\r
29 this.fmt = ' ';\r
30 var length = s.length;\r
31 var parse_state = 0;\r
32 var i = 0;\r
33 while (parse_state == 0) {\r
34 if (i >= length) {\r
35 parse_state = 5;\r
36 } else if (s.charAt (i) == '%') {\r
37 if (i < (length - 1)) {\r
38 if (s.charAt (i + 1) == '%') {\r
39 this.pre = this.pre + '%';\r
40 i++;\r
41 } else {\r
42 parse_state = 1;\r
43 }} else {\r
44 throw  new IllegalArgumentException ();\r
45 }} else {\r
46 this.pre = this.pre + s.charAt (i);\r
47 }i++;\r
48 }\r
49 while (parse_state == 1) {\r
50 if (i >= length) {\r
51 parse_state = 5;\r
52 } else if (s.charAt (i) == ' ') {\r
53 this.show_space = true;\r
54 } else if (s.charAt (i) == '-') {\r
55 this.left_align = true;\r
56 } else if (s.charAt (i) == '+') {\r
57 this.show_plus = true;\r
58 } else if (s.charAt (i) == '0') {\r
59 this.leading_zeroes = true;\r
60 } else if (s.charAt (i) == '#') {\r
61 this.alternate = true;\r
62 } else {\r
63 parse_state = 2;\r
64 i--;\r
65 }i++;\r
66 }\r
67 while (parse_state == 2) {\r
68 if (i >= length) {\r
69 parse_state = 5;\r
70 } else if (('0' <= s.charAt (i)) && (s.charAt (i) <= '9')) {\r
71 this.width = ((this.width * 10) + s.charCodeAt (i)) - 48;\r
72 i++;\r
73 } else if (s.charAt (i) == '.') {\r
74 parse_state = 3;\r
75 this.precision = 0;\r
76 i++;\r
77 } else {\r
78 parse_state = 4;\r
79 }}\r
80 while (parse_state == 3) {\r
81 if (i >= length) {\r
82 parse_state = 5;\r
83 } else if (('0' <= s.charAt (i)) && (s.charAt (i) <= '9')) {\r
84 this.precision = ((this.precision * 10) + s.charCodeAt (i)) - 48;\r
85 i++;\r
86 } else {\r
87 parse_state = 4;\r
88 }}\r
89 if (parse_state == 4) {\r
90 if (i >= length) {\r
91 parse_state = 5;\r
92 } else {\r
93 this.fmt = s.charAt (i);\r
94 }i++;\r
95 }if (i < length) {\r
96 this.post = s.substring (i, length);\r
97 }}, "~S");\r
98 c$.getHexString = Clazz.defineMethod (c$, "getHexString", \r
99 function (color) {\r
100 var r;\r
101 var g;\r
102 var b;\r
103 r = Integer.toHexString (color.getRed ());\r
104 if (r.length < 2) {\r
105 r = "0" + r;\r
106 }g = Integer.toHexString (color.getGreen ());\r
107 if (g.length < 2) {\r
108 g = "0" + g;\r
109 }b = Integer.toHexString (color.getBlue ());\r
110 if (b.length < 2) {\r
111 b = "0" + b;\r
112 }return r + g + b;\r
113 }, "java.awt.Color");\r
114 c$.printDouble = Clazz.defineMethod (c$, "printDouble", \r
115 function (s, fmt, x) {\r
116 s.print ( new jalview.util.Format (fmt).formDouble (x));\r
117 }, "java.io.PrintStream,~S,~N");\r
118 c$.printLong = Clazz.defineMethod (c$, "printLong", \r
119 function (s, fmt, x) {\r
120 s.print ( new jalview.util.Format (fmt).formLong (x));\r
121 }, "java.io.PrintStream,~S,~N");\r
122 c$.printChar = Clazz.defineMethod (c$, "printChar", \r
123 function (s, fmt, x) {\r
124 s.print ( new jalview.util.Format (fmt).formChar (x));\r
125 }, "java.io.PrintStream,~S,~S");\r
126 c$.print = Clazz.defineMethod (c$, "print", \r
127 function (s, fmt, x) {\r
128 s.print ( new jalview.util.Format (fmt).form (x));\r
129 }, "java.io.PrintStream,~S,~S");\r
130 c$.atoi = Clazz.defineMethod (c$, "atoi", \r
131 function (s) {\r
132 return jalview.util.Format.atol (s);\r
133 }, "~S");\r
134 c$.atol = Clazz.defineMethod (c$, "atol", \r
135 function (s) {\r
136 var i = 0;\r
137 while ((i < s.length) && Character.isWhitespace (s.charAt (i))) {\r
138 i++;\r
139 }\r
140 if ((i < s.length) && (s.charAt (i) == '0')) {\r
141 if (((i + 1) < s.length) && ((s.charAt (i + 1) == 'x') || (s.charAt (i + 1) == 'X'))) {\r
142 return jalview.util.Format.parseLong (s.substring (i + 2), 16);\r
143 } else {\r
144 return jalview.util.Format.parseLong (s, 8);\r
145 }} else {\r
146 return jalview.util.Format.parseLong (s, 10);\r
147 }}, "~S");\r
148 c$.parseLong = Clazz.defineMethod (c$, "parseLong", \r
149 ($fz = function (s, base) {\r
150 var i = 0;\r
151 var sign = 1;\r
152 var r = 0;\r
153 while ((i < s.length) && Character.isWhitespace (s.charAt (i))) {\r
154 i++;\r
155 }\r
156 if ((i < s.length) && (s.charAt (i) == '-')) {\r
157 sign = -1;\r
158 i++;\r
159 } else if ((i < s.length) && (s.charAt (i) == '+')) {\r
160 i++;\r
161 }while (i < s.length) {\r
162 var ch = s.charAt (i);\r
163 if (('0' <= ch) && (ch.charCodeAt (0) < (48 + base))) {\r
164 r = ((r * base) + ch.charCodeAt (0)) - 48;\r
165 } else if (('A' <= ch) && (ch.charCodeAt (0) < ((65 + base) - 10))) {\r
166 r = ((r * base) + ch.charCodeAt (0)) - 65 + 10;\r
167 } else if (('a' <= ch) && (ch.charCodeAt (0) < ((97 + base) - 10))) {\r
168 r = ((r * base) + ch.charCodeAt (0)) - 97 + 10;\r
169 } else {\r
170 return r * sign;\r
171 }i++;\r
172 }\r
173 return r * sign;\r
174 }, $fz.isPrivate = true, $fz), "~S,~N");\r
175 c$.atof = Clazz.defineMethod (c$, "atof", \r
176 function (s) {\r
177 var i = 0;\r
178 var sign = 1;\r
179 var r = 0;\r
180 var p = 1;\r
181 var state = 0;\r
182 while ((i < s.length) && Character.isWhitespace (s.charAt (i))) {\r
183 i++;\r
184 }\r
185 if ((i < s.length) && (s.charAt (i) == '-')) {\r
186 sign = -1;\r
187 i++;\r
188 } else if ((i < s.length) && (s.charAt (i) == '+')) {\r
189 i++;\r
190 }while (i < s.length) {\r
191 var ch = s.charAt (i);\r
192 if (('0' <= ch) && (ch <= '9')) {\r
193 if (state == 0) {\r
194 r = ((r * 10) + ch.charCodeAt (0)) - 48;\r
195 } else if (state == 1) {\r
196 p = p / 10;\r
197 r = r + (p * (ch.charCodeAt (0) - 48));\r
198 }} else if (ch == '.') {\r
199 if (state == 0) {\r
200 state = 1;\r
201 } else {\r
202 return sign * r;\r
203 }} else if ((ch == 'e') || (ch == 'E')) {\r
204 var e = jalview.util.Format.parseLong (s.substring (i + 1), 10);\r
205 return sign * r * Math.pow (10, e);\r
206 } else {\r
207 return sign * r;\r
208 }i++;\r
209 }\r
210 return sign * r;\r
211 }, "~S");\r
212 Clazz.defineMethod (c$, "formDouble", \r
213 function (x) {\r
214 var r;\r
215 if (this.precision < 0) {\r
216 this.precision = 6;\r
217 }var s = 1;\r
218 if (x < 0) {\r
219 x = -x;\r
220 s = -1;\r
221 }if (this.fmt == 'f') {\r
222 r = this.fixed_format (x);\r
223 } else if ((this.fmt == 'e') || (this.fmt == 'E') || (this.fmt == 'g') || (this.fmt == 'G')) {\r
224 r = this.exp_format (x);\r
225 } else {\r
226 throw  new IllegalArgumentException ();\r
227 }return this.pad (this.sign (s, r));\r
228 }, "~N");\r
229 Clazz.defineMethod (c$, "formLong", \r
230 function (x) {\r
231 var r;\r
232 var s = 0;\r
233 if ((this.fmt == 'd') || (this.fmt == 'i')) {\r
234 if (x < 0) {\r
235 r = ("" + x).substring (1);\r
236 s = -1;\r
237 } else {\r
238 r = "" + x;\r
239 s = 1;\r
240 }} else if (this.fmt == 'o') {\r
241 r = jalview.util.Format.convert (x, 3, 7, "01234567");\r
242 } else if (this.fmt == 'x') {\r
243 r = jalview.util.Format.convert (x, 4, 15, "0123456789abcdef");\r
244 } else if (this.fmt == 'X') {\r
245 r = jalview.util.Format.convert (x, 4, 15, "0123456789ABCDEF");\r
246 } else {\r
247 throw  new IllegalArgumentException ();\r
248 }return this.pad (this.sign (s, r));\r
249 }, "~N");\r
250 Clazz.defineMethod (c$, "formChar", \r
251 function (c) {\r
252 if (this.fmt != 'c') {\r
253 throw  new IllegalArgumentException ();\r
254 }var r = "" + c;\r
255 return this.pad (r);\r
256 }, "~S");\r
257 Clazz.defineMethod (c$, "form", \r
258 function (s) {\r
259 if (this.fmt != 's') {\r
260 throw  new IllegalArgumentException ();\r
261 }if (this.precision >= 0) {\r
262 s = s.substring (0, this.precision);\r
263 }return this.pad (s);\r
264 }, "~S");\r
265 c$.repeat = Clazz.defineMethod (c$, "repeat", \r
266 ($fz = function (c, n) {\r
267 if (n <= 0) {\r
268 return "";\r
269 }var s =  new StringBuffer (n);\r
270 for (var i = 0; i < n; i++) {\r
271 s.append (c);\r
272 }\r
273 return s.toString ();\r
274 }, $fz.isPrivate = true, $fz), "~S,~N");\r
275 c$.convert = Clazz.defineMethod (c$, "convert", \r
276 ($fz = function (x, n, m, d) {\r
277 if (x == 0) {\r
278 return "0";\r
279 }var r = "";\r
280 while (x != 0) {\r
281 r = d.charAt ((x & m)) + r;\r
282 x = x >>> n;\r
283 }\r
284 return r;\r
285 }, $fz.isPrivate = true, $fz), "~N,~N,~N,~S");\r
286 Clazz.defineMethod (c$, "pad", \r
287 ($fz = function (r) {\r
288 var p = jalview.util.Format.repeat (' ', this.width - r.length);\r
289 if (this.left_align) {\r
290 return this.pre + r + p + this.post;\r
291 } else {\r
292 return this.pre + p + r + this.post;\r
293 }}, $fz.isPrivate = true, $fz), "~S");\r
294 Clazz.defineMethod (c$, "sign", \r
295 ($fz = function (s, r) {\r
296 var p = "";\r
297 if (s < 0) {\r
298 p = "-";\r
299 } else if (s > 0) {\r
300 if (this.show_plus) {\r
301 p = "+";\r
302 } else if (this.show_space) {\r
303 p = " ";\r
304 }} else {\r
305 if ((this.fmt == 'o') && this.alternate && (r.length > 0) && (r.charAt (0) != '0')) {\r
306 p = "0";\r
307 } else if ((this.fmt == 'x') && this.alternate) {\r
308 p = "0x";\r
309 } else if ((this.fmt == 'X') && this.alternate) {\r
310 p = "0X";\r
311 }}var w = 0;\r
312 if (this.leading_zeroes) {\r
313 w = this.width;\r
314 } else if (((this.fmt == 'd') || (this.fmt == 'i') || (this.fmt == 'x') || (this.fmt == 'X') || (this.fmt == 'o')) && (this.precision > 0)) {\r
315 w = this.precision;\r
316 }return p + jalview.util.Format.repeat ('0', w - p.length - r.length) + r;\r
317 }, $fz.isPrivate = true, $fz), "~N,~S");\r
318 Clazz.defineMethod (c$, "fixed_format", \r
319 ($fz = function (d) {\r
320 var removeTrailing = ((this.fmt == 'G') || (this.fmt == 'g')) && !this.alternate;\r
321 if (d > 0x7FFFFFFFFFFFFFFF) {\r
322 return this.exp_format (d);\r
323 }if (this.precision == 0) {\r
324 return Clazz.doubleToLong (d + 0.5) + (removeTrailing ? "" : ".");\r
325 }var whole = Clazz.doubleToLong (d);\r
326 var fr = d - whole;\r
327 if ((fr >= 1) || (fr < 0)) {\r
328 return this.exp_format (d);\r
329 }var factor = 1;\r
330 var leading_zeroes = "";\r
331 for (var i = 1; (i <= this.precision) && (factor <= 0x7FFFFFFFFFFFFFFF); i++) {\r
332 factor *= 10;\r
333 leading_zeroes = leading_zeroes + "0";\r
334 }\r
335 var l = Clazz.doubleToLong ((factor * fr) + 0.5);\r
336 if (l >= factor) {\r
337 l = 0;\r
338 whole++;\r
339 }var z = leading_zeroes + l;\r
340 z = "." + z.substring (z.length - this.precision, z.length);\r
341 if (removeTrailing) {\r
342 var t = z.length - 1;\r
343 while ((t >= 0) && (z.charAt (t) == '0')) {\r
344 t--;\r
345 }\r
346 if ((t >= 0) && (z.charAt (t) == '.')) {\r
347 t--;\r
348 }z = z.substring (0, t + 1);\r
349 }return whole + z;\r
350 }, $fz.isPrivate = true, $fz), "~N");\r
351 Clazz.defineMethod (c$, "exp_format", \r
352 ($fz = function (d) {\r
353 var f = "";\r
354 var e = 0;\r
355 var dd = d;\r
356 var factor = 1;\r
357 if (d != 0) {\r
358 while (dd > 10) {\r
359 e++;\r
360 factor /= 10;\r
361 dd = dd / 10;\r
362 }\r
363 while (dd < 1) {\r
364 e--;\r
365 factor *= 10;\r
366 dd = dd * 10;\r
367 }\r
368 }if (((this.fmt == 'g') || (this.fmt == 'G')) && (e >= -4) && (e < this.precision)) {\r
369 return this.fixed_format (d);\r
370 }d = d * factor;\r
371 f = f + this.fixed_format (d);\r
372 if ((this.fmt == 'e') || (this.fmt == 'g')) {\r
373 f = f + "e";\r
374 } else {\r
375 f = f + "E";\r
376 }var p = "000";\r
377 if (e >= 0) {\r
378 f = f + "+";\r
379 p = p + e;\r
380 } else {\r
381 f = f + "-";\r
382 p = p + (-e);\r
383 }return f + p.substring (p.length - 3, p.length);\r
384 }, $fz.isPrivate = true, $fz), "~N");\r
385 Clazz.overrideMethod (c$, "toString", \r
386 function () {\r
387 return this.formatString;\r
388 });\r
389 });\r