123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155 |
- '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';
- if (!type || type === 'base64') {
- // base64
- prefix += ';base64,';
- if (Buffer.from) {
- str = prefix + Buffer.from(str).toString('base64');
- } else {
- str = prefix + new Buffer(str).toString('base64');
- }
- } else if (type === 'enc') {
- // URI encoded
- str = prefix + ',' + encodeURIComponent(str);
- } else if (type === 'unenc') {
- // unencoded
- 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];
- if (match[2]) {
- // base64
- str = new Buffer(data, 'base64').toString('utf8');
- } else if (data.charAt(0) === '%') {
- // URI encoded
- str = decodeURIComponent(data);
- } else if (data.charAt(0) === '<') {
- // unencoded
- str = data;
- }
- return str;
- };
- exports.intersectArrays = function(a, b) {
- return a.filter(function(n) {
- return b.indexOf(n) > -1;
- });
- };
- /**
- * Convert a row of numbers to an optimized string view.
- *
- * @example
- * [0, -1, .5, .5] → "0-1 .5.5"
- *
- * @param {number[]} data
- * @param {Object} params
- * @param {string?} command path data instruction
- * @return {string}
- */
- exports.cleanupOutData = function(data, params, command) {
- 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 = '';
- // no extra space after 'arcto' command flags
- if (params.noSpaceAfterFlags && (command == 'A' || command == 'a')) {
- var pos = i % 7;
- if (pos == 4 || pos == 5) 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 &&
- delimiter != '' &&
- (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;
- }
- };
|