vlq.es.js 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. var charToInteger = {};
  2. var integerToChar = {};
  3. 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='
  4. .split('')
  5. .forEach(function (char, i) {
  6. charToInteger[char] = i;
  7. integerToChar[i] = char;
  8. });
  9. function decode(string) {
  10. var result = [];
  11. var shift = 0;
  12. var value = 0;
  13. for (var i = 0; i < string.length; i += 1) {
  14. var integer = charToInteger[string[i]];
  15. if (integer === undefined) {
  16. throw new Error('Invalid character (' + string[i] + ')');
  17. }
  18. var hasContinuationBit = integer & 32;
  19. integer &= 31;
  20. value += integer << shift;
  21. if (hasContinuationBit) {
  22. shift += 5;
  23. }
  24. else {
  25. var shouldNegate = value & 1;
  26. value >>>= 1;
  27. if (shouldNegate) {
  28. result.push(value === 0 ? -0x80000000 : -value);
  29. }
  30. else {
  31. result.push(value);
  32. }
  33. // reset
  34. value = shift = 0;
  35. }
  36. }
  37. return result;
  38. }
  39. function encode(value) {
  40. var result;
  41. if (typeof value === 'number') {
  42. result = encodeInteger(value);
  43. }
  44. else {
  45. result = '';
  46. for (var i = 0; i < value.length; i += 1) {
  47. result += encodeInteger(value[i]);
  48. }
  49. }
  50. return result;
  51. }
  52. function encodeInteger(num) {
  53. var result = '';
  54. if (num < 0) {
  55. num = (-num << 1) | 1;
  56. }
  57. else {
  58. num <<= 1;
  59. }
  60. do {
  61. var clamped = num & 31;
  62. num >>>= 5;
  63. if (num > 0) {
  64. clamped |= 32;
  65. }
  66. result += integerToChar[clamped];
  67. } while (num > 0);
  68. return result;
  69. }
  70. export { decode, encode };