d92d645fc808e22966b82a63d92316eea7799d70f438ccd536e8d2555c4c93880321c8291853f3d63b5bceacda1f7026e6d42828bfa20427bd4521712e8969 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. 'use strict';
  2. var FS = require('fs');
  3. /**
  4. * Encode plain SVG data string into Data URI string.
  5. *
  6. * @param {String} str input string
  7. * @param {String} type Data URI type
  8. * @return {String} output string
  9. */
  10. exports.encodeSVGDatauri = function(str, type) {
  11. var prefix = 'data:image/svg+xml';
  12. if (!type || type === 'base64') {
  13. // base64
  14. prefix += ';base64,';
  15. if (Buffer.from) {
  16. str = prefix + Buffer.from(str).toString('base64');
  17. } else {
  18. str = prefix + new Buffer(str).toString('base64');
  19. }
  20. } else if (type === 'enc') {
  21. // URI encoded
  22. str = prefix + ',' + encodeURIComponent(str);
  23. } else if (type === 'unenc') {
  24. // unencoded
  25. str = prefix + ',' + str;
  26. }
  27. return str;
  28. };
  29. /**
  30. * Decode SVG Data URI string into plain SVG string.
  31. *
  32. * @param {string} str input string
  33. * @return {String} output string
  34. */
  35. exports.decodeSVGDatauri = function(str) {
  36. var regexp = /data:image\/svg\+xml(;charset=[^;,]*)?(;base64)?,(.*)/;
  37. var match = regexp.exec(str);
  38. // plain string
  39. if (!match) return str;
  40. var data = match[3];
  41. if (match[2]) {
  42. // base64
  43. str = new Buffer(data, 'base64').toString('utf8');
  44. } else if (data.charAt(0) === '%') {
  45. // URI encoded
  46. str = decodeURIComponent(data);
  47. } else if (data.charAt(0) === '<') {
  48. // unencoded
  49. str = data;
  50. }
  51. return str;
  52. };
  53. exports.intersectArrays = function(a, b) {
  54. return a.filter(function(n) {
  55. return b.indexOf(n) > -1;
  56. });
  57. };
  58. /**
  59. * Convert a row of numbers to an optimized string view.
  60. *
  61. * @example
  62. * [0, -1, .5, .5] → "0-1 .5.5"
  63. *
  64. * @param {number[]} data
  65. * @param {Object} params
  66. * @param {string?} command path data instruction
  67. * @return {string}
  68. */
  69. exports.cleanupOutData = function(data, params, command) {
  70. var str = '',
  71. delimiter,
  72. prev;
  73. data.forEach(function(item, i) {
  74. // space delimiter by default
  75. delimiter = ' ';
  76. // no extra space in front of first number
  77. if (i == 0) delimiter = '';
  78. // no extra space after 'arcto' command flags
  79. if (params.noSpaceAfterFlags && (command == 'A' || command == 'a')) {
  80. var pos = i % 7;
  81. if (pos == 4 || pos == 5) delimiter = '';
  82. }
  83. // remove floating-point numbers leading zeros
  84. // 0.5 → .5
  85. // -0.5 → -.5
  86. if (params.leadingZero) {
  87. item = removeLeadingZero(item);
  88. }
  89. // no extra space in front of negative number or
  90. // in front of a floating number if a previous number is floating too
  91. if (
  92. params.negativeExtraSpace &&
  93. delimiter != '' &&
  94. (item < 0 ||
  95. (String(item).charCodeAt(0) == 46 && prev % 1 !== 0)
  96. )
  97. ) {
  98. delimiter = '';
  99. }
  100. // save prev item value
  101. prev = item;
  102. str += delimiter + item;
  103. });
  104. return str;
  105. };
  106. /**
  107. * Remove floating-point numbers leading zero.
  108. *
  109. * @example
  110. * 0.5 → .5
  111. *
  112. * @example
  113. * -0.5 → -.5
  114. *
  115. * @param {Float} num input number
  116. *
  117. * @return {String} output number as string
  118. */
  119. var removeLeadingZero = exports.removeLeadingZero = function(num) {
  120. var strNum = num.toString();
  121. if (0 < num && num < 1 && strNum.charCodeAt(0) == 48) {
  122. strNum = strNum.slice(1);
  123. } else if (-1 < num && num < 0 && strNum.charCodeAt(1) == 48) {
  124. strNum = strNum.charAt(0) + strNum.slice(2);
  125. }
  126. return strNum;
  127. };
  128. /**
  129. * Synchronously check if path is a directory. Tolerant to errors like ENOENT.
  130. * @param {string} path
  131. */
  132. exports.checkIsDir = function(path) {
  133. try {
  134. return FS.lstatSync(path).isDirectory();
  135. } catch(e) {
  136. return false;
  137. }
  138. };