tools.js 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. 'use strict';
  2. /**
  3. * Encode plain SVG data string into Data URI string.
  4. *
  5. * @param {String} str input string
  6. * @param {String} type Data URI type
  7. * @return {String} output string
  8. */
  9. exports.encodeSVGDatauri = function(str, type) {
  10. var prefix = 'data:image/svg+xml';
  11. // base64
  12. if (!type || type === 'base64') {
  13. prefix += ';base64,';
  14. str = prefix + new Buffer(str).toString('base64');
  15. // URI encoded
  16. } else if (type === 'enc') {
  17. str = prefix + ',' + encodeURIComponent(str);
  18. // unencoded
  19. } else if (type === 'unenc') {
  20. str = prefix + ',' + str;
  21. }
  22. return str;
  23. };
  24. /**
  25. * Decode SVG Data URI string into plain SVG string.
  26. *
  27. * @param {string} str input string
  28. * @return {String} output string
  29. */
  30. exports.decodeSVGDatauri = function(str) {
  31. var regexp = /data:image\/svg\+xml(;charset=[^;,]*)?(;base64)?,(.*)/;
  32. var match = regexp.exec(str);
  33. // plain string
  34. if (!match) return str;
  35. var data = match[3];
  36. // base64
  37. if (match[2]) {
  38. str = new Buffer(data, 'base64').toString('utf8');
  39. // URI encoded
  40. } else if (data.charAt(0) === '%') {
  41. str = decodeURIComponent(data);
  42. // unencoded
  43. } else if (data.charAt(0) === '<') {
  44. str = data;
  45. }
  46. return str;
  47. };
  48. exports.intersectArrays = function(a, b) {
  49. return a.filter(function(n) {
  50. return b.indexOf(n) > -1;
  51. });
  52. };
  53. exports.cleanupOutData = function(data, params) {
  54. var str = '',
  55. delimiter,
  56. prev;
  57. data.forEach(function(item, i) {
  58. // space delimiter by default
  59. delimiter = ' ';
  60. // no extra space in front of first number
  61. if (i === 0) {
  62. delimiter = '';
  63. }
  64. // remove floating-point numbers leading zeros
  65. // 0.5 → .5
  66. // -0.5 → -.5
  67. if (params.leadingZero) {
  68. item = removeLeadingZero(item);
  69. }
  70. // no extra space in front of negative number or
  71. // in front of a floating number if a previous number is floating too
  72. if (
  73. params.negativeExtraSpace &&
  74. (item < 0 ||
  75. (String(item).charCodeAt(0) == 46 && prev % 1 !== 0)
  76. )
  77. ) {
  78. delimiter = '';
  79. }
  80. // save prev item value
  81. prev = item;
  82. str += delimiter + item;
  83. });
  84. return str;
  85. };
  86. /**
  87. * Remove floating-point numbers leading zero.
  88. *
  89. * @example
  90. * 0.5 → .5
  91. *
  92. * @example
  93. * -0.5 → -.5
  94. *
  95. * @param {Float} num input number
  96. *
  97. * @return {String} output number as string
  98. */
  99. var removeLeadingZero = exports.removeLeadingZero = function(num) {
  100. var strNum = num.toString();
  101. if (0 < num && num < 1 && strNum.charCodeAt(0) == 48) {
  102. strNum = strNum.slice(1);
  103. } else if (-1 < num && num < 0 && strNum.charCodeAt(1) == 48) {
  104. strNum = strNum.charAt(0) + strNum.slice(2);
  105. }
  106. return strNum;
  107. };