'use strict'; var FS = require('fs'); /** * Encode plain SVG data string into Data URI string. * * @param {String} str input string * @param {String} type Data URI type * @return {String} output string */ exports.encodeSVGDatauri = function(str, type) { var prefix = 'data:image/svg+xml'; // base64 if (!type || type === 'base64') { prefix += ';base64,'; if (Buffer.from) { str = prefix + Buffer.from(str).toString('base64'); } else { str = prefix + new Buffer(str).toString('base64'); } // URI encoded } else if (type === 'enc') { str = prefix + ',' + encodeURIComponent(str); // unencoded } else if (type === 'unenc') { str = prefix + ',' + str; } return str; }; /** * Decode SVG Data URI string into plain SVG string. * * @param {string} str input string * @return {String} output string */ exports.decodeSVGDatauri = function(str) { var regexp = /data:image\/svg\+xml(;charset=[^;,]*)?(;base64)?,(.*)/; var match = regexp.exec(str); // plain string if (!match) return str; var data = match[3]; // base64 if (match[2]) { str = new Buffer(data, 'base64').toString('utf8'); // URI encoded } else if (data.charAt(0) === '%') { str = decodeURIComponent(data); // unencoded } else if (data.charAt(0) === '<') { str = data; } return str; }; exports.intersectArrays = function(a, b) { return a.filter(function(n) { return b.indexOf(n) > -1; }); }; exports.cleanupOutData = function(data, params) { var str = '', delimiter, prev; data.forEach(function(item, i) { // space delimiter by default delimiter = ' '; // no extra space in front of first number if (i === 0) { delimiter = ''; } // remove floating-point numbers leading zeros // 0.5 → .5 // -0.5 → -.5 if (params.leadingZero) { item = removeLeadingZero(item); } // no extra space in front of negative number or // in front of a floating number if a previous number is floating too if ( params.negativeExtraSpace && (item < 0 || (String(item).charCodeAt(0) == 46 && prev % 1 !== 0) ) ) { delimiter = ''; } // save prev item value prev = item; str += delimiter + item; }); return str; }; /** * Remove floating-point numbers leading zero. * * @example * 0.5 → .5 * * @example * -0.5 → -.5 * * @param {Float} num input number * * @return {String} output number as string */ var removeLeadingZero = exports.removeLeadingZero = function(num) { var strNum = num.toString(); if (0 < num && num < 1 && strNum.charCodeAt(0) == 48) { strNum = strNum.slice(1); } else if (-1 < num && num < 0 && strNum.charCodeAt(1) == 48) { strNum = strNum.charAt(0) + strNum.slice(2); } return strNum; }; /** * Synchronously check if path is a directory. Tolerant to errors like ENOENT. * @param {string} path */ exports.checkIsDir = function(path) { try { return FS.lstatSync(path).isDirectory(); } catch(e) { return false; } };