encode64.js 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. 'use strict'
  2. // Encode code taken from the PlantUML website:
  3. // http://plantuml.sourceforge.net/codejavascript2.html
  4. // It is described as being "a transformation close to base64"
  5. // The code has been slightly modified to pass linters
  6. function encode6bit (b) {
  7. if (b < 10) {
  8. return String.fromCharCode(48 + b)
  9. }
  10. b -= 10
  11. if (b < 26) {
  12. return String.fromCharCode(65 + b)
  13. }
  14. b -= 26
  15. if (b < 26) {
  16. return String.fromCharCode(97 + b)
  17. }
  18. b -= 26
  19. if (b === 0) {
  20. return '-'
  21. }
  22. if (b === 1) {
  23. return '_'
  24. }
  25. return '?'
  26. }
  27. function append3bytes (b1, b2, b3) {
  28. var c1 = b1 >> 2
  29. var c2 = ((b1 & 0x3) << 4) | (b2 >> 4)
  30. var c3 = ((b2 & 0xF) << 2) | (b3 >> 6)
  31. var c4 = b3 & 0x3F
  32. var r = ''
  33. r += encode6bit(c1 & 0x3F)
  34. r += encode6bit(c2 & 0x3F)
  35. r += encode6bit(c3 & 0x3F)
  36. r += encode6bit(c4 & 0x3F)
  37. return r
  38. }
  39. module.exports = function (data) {
  40. var r = ''
  41. for (var i = 0; i < data.length; i += 3) {
  42. if (i + 2 === data.length) {
  43. r += append3bytes(data.charCodeAt(i), data.charCodeAt(i + 1), 0)
  44. } else if (i + 1 === data.length) {
  45. r += append3bytes(data.charCodeAt(i), 0, 0)
  46. } else {
  47. r += append3bytes(data.charCodeAt(i),
  48. data.charCodeAt(i + 1),
  49. data.charCodeAt(i + 2))
  50. }
  51. }
  52. return r
  53. }