vlq.js 2.1 KB

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