bert.js 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  1. // API
  2. function tuple() { return { t: 104, v: Array.apply(null, arguments) }; }
  3. function list() { return { t: 108, v: Array.apply(null, arguments) }; }
  4. function map() { return { t: 116, v: Array.apply(null, arguments) }; }
  5. function atom(o) { return { t: 100, v: utf8_enc(o) }; }
  6. function string(o) { return { t: 107, v: utf8_enc(o) }; }
  7. function float(o) { return { t: 70, v: o }; }
  8. function number(o) {
  9. var s, isInteger = (o % 1 === 0);
  10. if (isInteger && o >= 0 && o < 256) { return { t: 97, v: o }; }
  11. if (isInteger && o >= -134217728 && o <= 134217727) { return {t: 98, v: o}; }
  12. return {t: 110, v: o}; }
  13. function bin(o) {
  14. return { t: 109, v: o instanceof ArrayBuffer ? new Uint8Array(o) :
  15. o instanceof Uint8Array ? o : utf8_enc(o) }; }
  16. // ENCODER
  17. function enc(o) { return fl([131, ein(o)]); }
  18. function ein(o) { return Array.isArray(o) ? en_108({ t: 108, v: o }) : eval('en_' + o.t)(o); }
  19. function en_undefined(o) { return [106]; }
  20. function en_70(o) {
  21. var x = Array(8).fill(0).flat();
  22. write_Float(x,o.v,0,false,52,8);
  23. return [70].concat(x);
  24. }
  25. function en_97(o) { return [97, o.v]; }
  26. function en_98(o) { return [98, o.v >>> 24, (o.v >>> 16) & 255, (o.v >>> 8) & 255, o.v & 255]; }
  27. function en_99(o) {
  28. var obj = o.v.toExponential(20),
  29. match = /([^e]+)(e[+-])(\d+)/.exec(obj),
  30. exponentialPart = match[3].length == 1 ? "0" + match[3] : match[3],
  31. num = Array.from(bin(match[1] + match[2] + exponentialPart).v);
  32. return [o.t].concat(num).concat(Array(31 - num.length).fill(0).flat());
  33. }
  34. function en_106(o) { return [106]; }
  35. function en_115(o) { return [115, o.v.length, ar(o)]; }
  36. function en_119(o) { return [119, ar(o).length, ar(o)]; }
  37. function en_118(o) { return [118, ar(o).length >>> 8, ar(o).length & 255, ar(o)]; }
  38. function en_100(o) { return [100, o.v.length >>> 8, o.v.length & 255, ar(o)]; }
  39. function en_107(o) { return [107, o.v.length >>> 8, o.v.length & 255, ar(o)]; }
  40. function en_104(o) {
  41. var l = o.v.length, r = [];
  42. for (var i = 0; i < l; i++)r[i] = ein(o.v[i]);
  43. return [104, l, r];
  44. }
  45. function en_109(o) {
  46. var l = o.v instanceof ArrayBuffer ? o.v.byteLength : o.v.length;
  47. return [109, l >>> 24, (l >>> 16) & 255, (l >>> 8) & 255, l & 255, ar(o)];
  48. }
  49. function en_108(o) {
  50. var l = o.v.length, r = [];
  51. for (var i = 0; i < l; i++)r.push(ein(o.v[i]));
  52. return o.v.length == 0 ? [106] :
  53. [108, l >>> 24, (l >>> 16) & 255, (l >>> 8) & 255, l & 255, r, 106];
  54. }
  55. function en_116(o) {
  56. var l=o.v.length,x=[],r = [];
  57. for (var i = 0; i < l; i++) r.push([ein(o.v[i].k),ein(o.v[i].v)]);
  58. x = [116, l >>> 24, (l >>> 16) & 255, (l >>> 8) & 255, l & 255];
  59. return o.v.length == 0 ? x : [x,r];
  60. }
  61. function en_110(o) {
  62. var s=int_to_bytes(o.v); return [110,s.length,(o.v<0)?1:0,...s];
  63. }
  64. // DECODER
  65. function nop(b) { return []; };
  66. function big(b) {
  67. var sk = b == 1 ? sx.getUint8(ix++) : sx.getInt32((a = ix, ix += 4, a));
  68. var ret = 0, sig = sx.getUint8(ix++), count = sk;
  69. while (count-- > 0) { ret = 256 * ret + sx.getUint8(ix + count); }
  70. ix += sk; return ret * (sig == 0 ? 1 : -1);
  71. }
  72. function int(b) {
  73. return b == 1 ? sx.getUint8(ix++) : sx.getInt32((a = ix, ix += 4, a));
  74. }
  75. function dec(d) {
  76. sx = new DataView(d); ix = 0;
  77. if (sx.getUint8(ix++) !== 131) throw ("BERT?");
  78. return din();
  79. }
  80. function str(b) {
  81. var dv, sz = (b==2?sx.getUint16(ix):(b==1?sx.getUint8(ix):sx.getUint32(ix)));
  82. ix += b; var r = sx.buffer.slice(ix, ix += sz);
  83. return utf8_arr(r);
  84. }
  85. function run(b) {
  86. var sz = (b == 1 ? sx.getUint8(ix) : sx.getUint32(ix)), r = []; ix += b;
  87. for (var i = 0; i < sz; i++) r.push(din());
  88. return r;
  89. }
  90. function rut(b) {
  91. var sz = (b == 1 ? sx.getUint8(ix) : sx.getUint32(ix)), r = []; ix += b;
  92. for (var i = 0; i < sz; i++) r.push(din()); din();
  93. return r;
  94. }
  95. function dic(b) {
  96. var sz = sx.getUint32(ix), r = []; ix += 4;
  97. for (var i = 0; i < sz; i++) r.push({k:din(),v:din()});
  98. return r;
  99. }
  100. function iee(x) {
  101. return read_Float(new Uint8Array(sx.buffer.slice(ix,ix+=8)),0,false,52,8);
  102. }
  103. function flo(x) {
  104. return parseFloat(utf8_arr(sx.buffer.slice(ix, ix += 31)));
  105. }
  106. function arr(b) {
  107. var dv, sz = sx.getUint16(ix); ix += b;
  108. return new Uint8Array(sx.buffer.slice(ix, ix += sz));
  109. }
  110. function din() {
  111. var c = sx.getUint8(ix++), x; switch (c) {
  112. case 97: x = [int, 1]; break; case 98: x = [int, 4]; break;
  113. case 99: x = [flo, 0]; break; case 70: x = [iee, 0]; break;
  114. case 100: x = [str, 2]; break; case 104: x = [run, 1]; break;
  115. case 107: x = [arr, 2]; break; case 108: x = [rut, 4]; break;
  116. case 109: x = [str, 4]; break; case 110: x = [big, 1]; break;
  117. case 111: x = [big, 4]; break; case 115: x = [str, 1]; break;
  118. case 118: x = [str, 2]; break; case 119: x = [str, 1]; break;
  119. case 105: x = [run, 4]; break; case 116: x = [dic, 4]; break;
  120. default: x = [nop, 0];
  121. } return { t: c, v: x[0](x[1]) };
  122. }
  123. // HELPERS
  124. function int_to_bytes(Int) {
  125. var isNegative, OriginalInt, i, Rem, s = [];
  126. isNegative = (Int < 0);
  127. if (isNegative) { Int = - Int - 1; }
  128. OriginalInt = Int;
  129. var length = 0;
  130. while (Int !== 0) { Rem = Int % 256;
  131. if (isNegative) { Rem = 255 - Rem; }
  132. s.push(Rem); Int = Math.floor(Int / 256); length++; }
  133. if (Int > 0) { throw ("Argument out of range: " + OriginalInt); }
  134. return s;
  135. }
  136. function uc(u1, u2) {
  137. if (u1.byteLength == 0) return u2; if (u2.byteLength == 0) return u1;
  138. var a = new Uint8Array(u1.byteLength + u2.byteLength);
  139. a.set(u1, 0); a.set(u2, u1.byteLength); return a;
  140. }
  141. function ar(o) {
  142. return o.v instanceof ArrayBuffer ? new Uint8Array(o.v) : o.v instanceof Uint8Array ? o.v :
  143. Array.isArray(o.v) ? new Uint8Array(o.v) : new Uint8Array(utf8_enc(o.v));
  144. }
  145. function fl(a) {
  146. return a.reduce(function (f, t) {
  147. return uc(f, t instanceof Uint8Array ? t :
  148. Array.isArray(t) ? fl(t) : new Uint8Array([t]));
  149. }, new Uint8Array());
  150. }