+272
| 'use strict'; | ||
| /** | ||
| * Module dependencies | ||
| */ | ||
| var isNumber = require('is-number'); | ||
| var extend = require('extend-shallow'); | ||
| var merge = require('mixin-deep'); | ||
| /** | ||
| * Decimal regex | ||
| * | ||
| * @type {RegExp} | ||
| */ | ||
| var decimalRe = /^\s*(\+|-)?((\d+([,\.]\d+)?)|([,\.]\d+))\s*$/; | ||
| /** | ||
| * Create a new `Parser` with the given `options`. | ||
| * | ||
| * ```js | ||
| * var csv = require('parse-csv'); | ||
| * var parser = new csv.Parser(); | ||
| * ``` | ||
| * @param {Options} `options` | ||
| * @api public | ||
| */ | ||
| function Parser(options) { | ||
| this.options = merge({}, { | ||
| headers: { | ||
| included: false, | ||
| downcase: true, | ||
| upcase: true | ||
| }, | ||
| delimiter: 'tab', | ||
| decimalSign: 'comma' | ||
| }, options); | ||
| } | ||
| /** | ||
| * Parse CSV or tab-delimited string into a data-grid formatted JavaScript object. | ||
| * | ||
| * ```js | ||
| * var parser = new Parser(); | ||
| * | ||
| * var str = ` | ||
| * id,fruit,vegetable | ||
| * 1,apple,carrot | ||
| * 2,orange,corn | ||
| * 3,banana,potato`; | ||
| * | ||
| * var datagrid = parser.parse(str); | ||
| * | ||
| * // results in: | ||
| * // { data: | ||
| * // [ [ '1', 'apple', 'carrot' ], | ||
| * // [ '2', 'orange', 'corn' ], | ||
| * // [ '3', 'banana', 'potato' ] ], | ||
| * // header: | ||
| * // { names: [ 'id', 'fruit', 'vegetable' ], | ||
| * // types: [ '-1': 'string' ] } } | ||
| * ``` | ||
| * | ||
| * @param {String} `str` | ||
| * @param {Object} `options` | ||
| * @return {Object} | ||
| * @api public | ||
| */ | ||
| Parser.prototype.parse = function(str, options) { | ||
| if (typeof str !== 'string') { | ||
| throw new TypeError('expected a string'); | ||
| } | ||
| var opts = extend({}, this.options, options); | ||
| var dataArray = []; | ||
| str = str.replace(/(\r|\r\n)/g, ''); | ||
| // count the number of commas | ||
| var numCommas = (str.match(/,/g) || []).length; | ||
| // count the number of tabs | ||
| var numTabs = (str.match(/\t/g) || []).length; | ||
| // set delimiter | ||
| var delimiter = ','; | ||
| if (opts.delimiter === 'tab') { | ||
| delimiter = '\t'; | ||
| } else if (numTabs > numCommas) { | ||
| delimiter = '\t'; | ||
| } | ||
| // strip extra empty lines | ||
| str = str.replace(/^\n+|\n+$/g, ''); | ||
| // Create an array of arrays from the given CSV | ||
| dataArray = toArray(str, opts); | ||
| // escape out any tabs or returns or new lines | ||
| for (var i = dataArray.length - 1; i >= 0; i--) { | ||
| for (var j = dataArray[i].length - 1; j >= 0; j--) { | ||
| dataArray[i][j] = dataArray[i][j].replace(/([\t\n])/, '\\$1'); | ||
| } | ||
| } | ||
| var headerNames = []; | ||
| var headerTypes = []; | ||
| var numColumns = dataArray[0].length; | ||
| var numRows = dataArray.length; | ||
| if (opts.headers.included) { | ||
| // remove header row | ||
| headerNames = dataArray.splice(0, 1)[0]; | ||
| numRows = dataArray.length; | ||
| } else { | ||
| // create generic property names if no header names are specified | ||
| for (var k = 0; k < numColumns; k++) { | ||
| headerNames.push('val' + String(k)); | ||
| headerTypes.push(''); | ||
| } | ||
| } | ||
| if (opts.headers.upcase) { | ||
| for (var l = headerNames.length - 1; l >= 0; l--) { | ||
| headerNames[l] = headerNames[l].toUpperCase(); | ||
| } | ||
| } | ||
| if (opts.headers.downcase) { | ||
| for (var m = headerNames.length - 1; m >= 0; m--) { | ||
| headerNames[m] = headerNames[m].toLowerCase(); | ||
| } | ||
| } | ||
| // test all the rows for proper number of columns. | ||
| for (var ii = 0; ii < dataArray.length; ii++) { | ||
| var numValues = dataArray[ii].length; | ||
| if (numValues != numColumns) { | ||
| this.log('Error parsing row ' + String(ii) + '. Wrong number of columns.'); | ||
| } | ||
| } | ||
| // test columns for number data type | ||
| var numRowsToTest = dataArray.length; | ||
| var threshold = 0.9; | ||
| for (var iii = 0; iii < headerNames.length; iii++) { | ||
| var numFloats = 0; | ||
| var numInts = 0; | ||
| for (var r = 0; r < numRowsToTest; r++) { | ||
| if (dataArray[r]) { | ||
| // replace comma with dot if comma is decimal separator | ||
| if (opts.decimalSign === 'comma' && decimalRe.test(dataArray[r][iii])) { | ||
| dataArray[r][iii] = dataArray[r][iii].replace(",", "."); | ||
| } | ||
| if (isNumber(dataArray[r][iii])) { | ||
| numInts++; | ||
| if (String(dataArray[r][iii]).indexOf('.') > 0) { | ||
| numFloats++; | ||
| } | ||
| } | ||
| } | ||
| } | ||
| if ((numInts / numRowsToTest) > threshold) { | ||
| if (numFloats > 0) { | ||
| headerTypes[i] = 'float'; | ||
| } else { | ||
| headerTypes[i] = 'int'; | ||
| } | ||
| } else { | ||
| headerTypes[i] = 'string'; | ||
| } | ||
| } | ||
| return { | ||
| data: dataArray, | ||
| header: { | ||
| names: headerNames, | ||
| types: headerTypes | ||
| } | ||
| }; | ||
| }; | ||
| /** | ||
| * Parse a delimited string into an array of arrays. | ||
| * | ||
| * The default delimiter is `comma`, this can be | ||
| * overriden by passed a different delimiter on | ||
| * the `delim` option as a second argument. | ||
| * | ||
| * This Function is from [Ben Nadel] by way of [Mr Data Converer] | ||
| * | ||
| * @param {String} `str` | ||
| * @param {Object} `options` | ||
| * @return {Array} | ||
| */ | ||
| function toArray(str, options) { | ||
| var opts = extend({delim: ','}, options); | ||
| // Create a regular expression to parse the CSV values. | ||
| var re = new RegExp( | ||
| // Delimiters. | ||
| '(\\' + opts.delim + '|\\n|^)' + | ||
| // Quoted fields. | ||
| '(?:"([^"]*(?:""[^"]*)*)"|' + | ||
| // Standard fields. | ||
| '([^"\\' + opts.delim + '\\n]*))', 'gi'); | ||
| // Create an array to hold our data. Give the array | ||
| // a default empty first row. | ||
| var arr = [[]]; | ||
| // Create an array to hold our individual pattern | ||
| // matching groups. | ||
| var match = null; | ||
| var value; | ||
| // Keep looping over the regular expression matches | ||
| // until we can no longer find a match. | ||
| while (match = re.exec(str)) { | ||
| // Get the delimiter that was found. | ||
| var matchedDelim = match[1]; | ||
| // Check to see if the given delimiter has a length | ||
| // (is not the start of string) and if it matches | ||
| // field delimiter. If it does not, then we can expect | ||
| // this delimiter to be a row delimiter. | ||
| if (matchedDelim.length && (matchedDelim != opts.delim)) { | ||
| // Since we have reached a new row of data, | ||
| // add an empty row to our data array. | ||
| arr.push([]); | ||
| } | ||
| // Now that we have our delimiter out of the way, | ||
| // let's check to see which kind of value we | ||
| // captured (quoted or unquoted). | ||
| if (match[2]) { | ||
| // We found a quoted value. When we capture | ||
| // this value, unescape any double quotes. | ||
| value = match[2].replace(/""/g, '"'); | ||
| } else { | ||
| // We found a non-quoted value. | ||
| value = match[3]; | ||
| } | ||
| // Now that we have our value string, let's add | ||
| // it to the data array. | ||
| arr[arr.length - 1].push(value); | ||
| } | ||
| // Return the parsed data. | ||
| return arr; | ||
| }; | ||
| /** | ||
| * Expose `Parser` | ||
| */ | ||
| module.exports = Parser; |
+656
| 'use strict'; | ||
| /** | ||
| * Module dependencies | ||
| */ | ||
| var isObject = require('isobject'); | ||
| var extend = require('extend-shallow'); | ||
| var merge = require('mixin-deep'); | ||
| /** | ||
| * Create a new `Renderer` with the given `options`. | ||
| * | ||
| * ```js | ||
| * var csv = require('parse-csv'); | ||
| * var renderer = new csv.Renderer(); | ||
| * ``` | ||
| * @param {Object} `options` | ||
| * @api public | ||
| */ | ||
| function Renderer(options) { | ||
| var defaults = { | ||
| headers: { | ||
| included: true, | ||
| downcase: true, | ||
| upcase: true | ||
| }, | ||
| delimiter: 'tab', | ||
| decimalSign: 'comma', | ||
| outputDataType: 'json', | ||
| columnDelimiter: "\t", | ||
| rowDelimiter: '\n', | ||
| inputHeader: {}, | ||
| outputHeader: {}, | ||
| dataSelect: {}, | ||
| outputText: '', | ||
| newline: '\n', | ||
| indent: ' ', | ||
| commentLine: '//', | ||
| commentLineEnd: '', | ||
| tableName: 'converter', | ||
| useUnderscores: true, | ||
| includeWhiteSpace: true, | ||
| useTabsForIndent: false | ||
| }; | ||
| this.options = merge({}, defaults, options); | ||
| if (this.options.includeWhiteSpace) { | ||
| this.options.newline = '\n'; | ||
| } else { | ||
| this.options.indent = ''; | ||
| this.options.newline = ''; | ||
| } | ||
| }; | ||
| Renderer.prototype.render = function(method/*, datagrid, options*/) { | ||
| var args = [].slice.call(arguments, 1); | ||
| return this[method].apply(this, args); | ||
| }; | ||
| /** | ||
| * JSON | ||
| */ | ||
| Renderer.prototype.json = function(datagrid, options) { | ||
| var opts = extend({}, this.options, options); | ||
| datagrid = extend({}, datagrid); | ||
| var data = datagrid.data; | ||
| var header = datagrid.header || opts.header; | ||
| var newline = opts.newline; | ||
| var numRows = data.length; | ||
| var numColumns = header.names.length; | ||
| var rowOutput; | ||
| var res = "["; | ||
| for (var i = 0; i < numRows; i++) { | ||
| var row = data[i]; | ||
| res += "{"; | ||
| for (var j = 0; j < numColumns; j++) { | ||
| if ((header.types[j] == "int") || (header.types[j] == "float")) { | ||
| rowOutput = row[j] || "null"; | ||
| } else { | ||
| rowOutput = '"' + (row[j] || "") + '"'; | ||
| } | ||
| res += ('"' + header.names[j] + '"' + ":" + rowOutput); | ||
| if (j < (numColumns - 1)) { | ||
| res += ","; | ||
| } | ||
| } | ||
| res += "}"; | ||
| if (i < (numRows - 1)) { | ||
| res += "," + newline; | ||
| } | ||
| } | ||
| res += "]"; | ||
| return res; | ||
| }; | ||
| /** | ||
| * JSON column arrays. | ||
| */ | ||
| Renderer.prototype.jsonArrayCols = function(datagrid, options) { | ||
| var opts = extend({}, this.options, options); | ||
| datagrid = extend({}, datagrid); | ||
| var data = datagrid.data; | ||
| var header = datagrid.header || opts.header; | ||
| var indent = opts.indent; | ||
| var newline = opts.newline; | ||
| var res = ""; | ||
| var numRows = data.length; | ||
| var numColumns = header.names.length; | ||
| res += "{" + newline; | ||
| for (var i = 0; i < numColumns; i++) { | ||
| res += indent + '"' + header.names[i] + '":['; | ||
| for (var j = 0; j < numRows; j++) { | ||
| if ((header.types[i] == "int") || (header.types[i] == "float")) { | ||
| res += data[j][i] || 0; | ||
| } else { | ||
| res += '"' + (data[j][i] || "") + '"'; | ||
| } | ||
| if (j < (numRows - 1)) { | ||
| res += ","; | ||
| } | ||
| } | ||
| res += "]"; | ||
| if (i < (numColumns - 1)) { | ||
| res += "," + newline; | ||
| } | ||
| } | ||
| res += newline + "}"; | ||
| return res; | ||
| }; | ||
| /** | ||
| * JSON row arrays. | ||
| */ | ||
| Renderer.prototype.jsonArrayRows = function(datagrid, options) { | ||
| var opts = extend({}, this.options, options); | ||
| datagrid = extend({}, datagrid); | ||
| var data = datagrid.data; | ||
| var header = datagrid.header || opts.header; | ||
| var indent = opts.indent; | ||
| var newline = opts.newline; | ||
| var res = ""; | ||
| var numRows = data.length; | ||
| var numColumns = header.names.length; | ||
| res += "[" + newline; | ||
| for (var i = 0; i < numRows; i++) { | ||
| res += indent + "["; | ||
| for (var j = 0; j < numColumns; j++) { | ||
| if ((header.types[j] == "int") || (header.types[j] == "float")) { | ||
| res += data[i][j] || 0; | ||
| } else { | ||
| res += '"' + (data[i][j] || "") + '"'; | ||
| } | ||
| if (j < (numColumns - 1)) { | ||
| res += ","; | ||
| } | ||
| } | ||
| res += "]"; | ||
| if (i < (numRows - 1)) { | ||
| res += "," + newline; | ||
| } | ||
| } | ||
| res += newline + "]"; | ||
| return res; | ||
| }; | ||
| /** | ||
| * JSON dictonary. | ||
| */ | ||
| Renderer.prototype.jsonDict = function(datagrid, options) { | ||
| var opts = extend({}, this.options, options); | ||
| datagrid = extend({}, datagrid); | ||
| var data = datagrid.data; | ||
| var header = datagrid.header || opts.header; | ||
| var indent = opts.indent; | ||
| var newline = opts.newline; | ||
| var res = ''; | ||
| var numRows = data.length; | ||
| var numColumns = header.names.length; | ||
| res += '{' + newline; | ||
| for (var i = 0; i < numRows; i++) { | ||
| res += indent + '"' + data[i][0] + '": '; | ||
| if (numColumns == 2) { | ||
| res += _fmtVal(i, 1, data); | ||
| } else { | ||
| res += '{ '; | ||
| for (var j = 1; j < numColumns; j++) { | ||
| if (j > 1) res += ', '; | ||
| res += '"' + header.names[j] + '"' + ":" + _fmtVal(i, j, data); | ||
| } | ||
| res += '}'; | ||
| } | ||
| if (i < (numRows - 1)) { | ||
| res += ',' + newline; | ||
| } | ||
| } | ||
| res += newline + '}'; | ||
| function _fmtVal(i, j) { | ||
| if ((header.types[j] == 'int') || (header.types[j] == "float")) { | ||
| return data[i][j] || 0; | ||
| } else { | ||
| return '"' + (data[i][j] || '') + '"'; | ||
| } | ||
| } | ||
| return res; | ||
| }; | ||
| /** | ||
| * Actionscript | ||
| */ | ||
| Renderer.prototype.as = function(datagrid, options) { | ||
| var opts = extend({}, this.options, options); | ||
| datagrid = extend({}, datagrid); | ||
| var data = datagrid.data; | ||
| var header = datagrid.header || opts.header; | ||
| var newline = opts.newline; | ||
| var res = '['; | ||
| var numRows = data.length; | ||
| var numColumns = header.names.length; | ||
| var rowOutput; | ||
| for (var i = 0; i < numRows; i++) { | ||
| var row = data[i]; | ||
| res += '{'; | ||
| for (var j = 0; j < numColumns; j++) { | ||
| if ((header.types[j] == 'int') || (header.types[j] == 'float')) { | ||
| rowOutput = row[j] || 'null'; | ||
| } else { | ||
| rowOutput = '"' + (row[j] || '') + '"'; | ||
| } | ||
| res += (header.names[j] + ':' + rowOutput); | ||
| if (j < (numColumns - 1)) { | ||
| res += ','; | ||
| } | ||
| } | ||
| res += '}'; | ||
| if (i < (numRows - 1)) { | ||
| res += ',' + newline; | ||
| } | ||
| } | ||
| res += '];'; | ||
| return res; | ||
| }; | ||
| /** | ||
| * Render a parsed CSV datagrid as ASP / VBScript | ||
| */ | ||
| Renderer.prototype.asp = function(datagrid, options) { | ||
| var opts = extend({}, this.options, options); | ||
| datagrid = extend({}, datagrid); | ||
| var data = datagrid.data; | ||
| var header = datagrid.header || opts.header; | ||
| var newline = opts.newline; | ||
| var res = ""; | ||
| var numRows = data.length; | ||
| var numColumns = header.names.length; | ||
| var rowOutput; | ||
| for (var i = 0; i < numRows; i++) { | ||
| var row = data[i]; | ||
| for (var j = 0; j < numColumns; j++) { | ||
| if ((header.types[j] == "int") || (header.types[j] == "float")) { | ||
| rowOutput = row[j] || "null"; | ||
| } else { | ||
| rowOutput = '"' + (row[j] || "") + '"'; | ||
| } | ||
| res += 'myArray(' + j + ',' + i + ') = ' + rowOutput + newline; | ||
| } | ||
| res = 'Dim myArray(' + (j - 1) + ',' + (i - 1) + ')' + newline + res; | ||
| } | ||
| return res; | ||
| }; | ||
| /** | ||
| * Render a parsed CSV datagrid as an HTML table | ||
| */ | ||
| Renderer.prototype.html = function(datagrid, options) { | ||
| var opts = extend({}, this.options, options); | ||
| datagrid = extend({}, datagrid); | ||
| var data = datagrid.data; | ||
| var header = datagrid.header || opts.header; | ||
| var indent = opts.indent; | ||
| var newline = opts.newline; | ||
| var res = ''; | ||
| var numRows = data.length; | ||
| var numColumns = header.names.length; | ||
| res += '<table>' + newline; | ||
| res += indent + '<thead>' + newline; | ||
| res += indent + indent + '<tr>' + newline; | ||
| for (var i = 0; i < numColumns; i++) { | ||
| res += indent + indent + indent + '<th class="' + header.names[i] + '-cell">'; | ||
| res += header.names[i]; | ||
| res += '</th>' + newline; | ||
| } | ||
| res += indent + indent + '</tr>' + newline; | ||
| res += indent + '</thead>' + newline; | ||
| res += indent + '<tbody>' + newline; | ||
| for (var ii = 0; ii < numRows; ii++) { | ||
| var row = data[ii]; | ||
| var rowClassName = ''; | ||
| if (ii === numRows - 1) { | ||
| rowClassName = ' class="lastRow"'; | ||
| } else if (ii === 0) { | ||
| rowClassName = ' class="firstRow"'; | ||
| } | ||
| res += indent + indent + '<tr' + rowClassName + '>' + newline; | ||
| for (var iii = 0; iii < numColumns; iii++) { | ||
| res += indent + indent + indent + '<td class="' + header.names[iii] + '-cell">'; | ||
| res += row[iii]; | ||
| res += '</td>' + newline; | ||
| } | ||
| res += indent + indent + '</tr>' + newline; | ||
| } | ||
| res += indent + '</tbody>' + newline; | ||
| res += '</table>'; | ||
| return res; | ||
| }; | ||
| /** | ||
| * Render a parsed CSV datagrid as MYSQL | ||
| */ | ||
| Renderer.prototype.mysql = function(datagrid, options) { | ||
| var opts = extend({}, this.options, options); | ||
| datagrid = extend({}, datagrid); | ||
| var data = datagrid.data; | ||
| var header = datagrid.header || opts.header; | ||
| var indent = opts.indent; | ||
| var newline = opts.newline; | ||
| var res = ''; | ||
| var numRows = data.length; | ||
| var numColumns = header.names.length; | ||
| var tableName = 'converter'; | ||
| res += 'CREATE TABLE ' + tableName + ' (' + newline; | ||
| res += indent + 'id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,' + newline; | ||
| for (var i = 0; i < numColumns; i++) { | ||
| var dataType = 'VARCHAR(255)'; | ||
| if ((header.types[i] == 'int') || (header.types[i] == 'float')) { | ||
| dataType = header.types[i].toUpperCase(); | ||
| } | ||
| res += indent + '' + header.names[i] + ' ' + dataType; | ||
| if (i < numColumns - 1) { | ||
| res += ','; | ||
| } | ||
| res += newline; | ||
| } | ||
| res += ');' + newline; | ||
| res += 'INSERT INTO ' + tableName + " " + newline + indent + '('; | ||
| for (var ii = 0; ii < numColumns; ii++) { | ||
| res += header.names[ii]; | ||
| if (ii < numColumns - 1) { | ||
| res += ','; | ||
| } | ||
| } | ||
| res += ') ' + newline + 'VALUES ' + newline; | ||
| for (var iii = 0; iii < numRows; iii++) { | ||
| res += indent + '('; | ||
| for (var j = 0; j < numColumns; j++) { | ||
| if ((header.types[j] == 'int') || (header.types[j] == 'float')) { | ||
| res += data[iii][j] || 'null'; | ||
| } else { | ||
| res += '\'' + (data[iii][j] || '') + '\''; | ||
| } | ||
| if (j < numColumns - 1) { | ||
| res += ','; | ||
| } | ||
| } | ||
| res += ')'; | ||
| if (iii < numRows - 1) { | ||
| res += "," + newline; | ||
| } | ||
| } | ||
| res += ";"; | ||
| return res; | ||
| }; | ||
| /** | ||
| * Render a parsed CSV datagrid as PHP | ||
| */ | ||
| Renderer.prototype.php = function(datagrid, options) { | ||
| var opts = extend({}, this.options, options); | ||
| datagrid = extend({}, datagrid); | ||
| var data = datagrid.data; | ||
| var header = datagrid.header || opts.header; | ||
| var indent = opts.indent; | ||
| var newline = opts.newline; | ||
| var res = ""; | ||
| var numRows = data.length; | ||
| var numColumns = header.names.length; | ||
| var rowOutput; | ||
| res += "array(" + newline; | ||
| for (var i = 0; i < numRows; i++) { | ||
| var row = data[i]; | ||
| res += indent + "array("; | ||
| for (var j = 0; j < numColumns; j++) { | ||
| if ((header.types[j] == "int") || (header.types[j] == "float")) { | ||
| rowOutput = row[j] || "null"; | ||
| } else { | ||
| rowOutput = '"' + (row[j] || "") + '"'; | ||
| } | ||
| res += ('"' + header.names[j] + '"' + "=>" + rowOutput); | ||
| if (j < (numColumns - 1)) { | ||
| res += ","; | ||
| } | ||
| } | ||
| res += ")"; | ||
| if (i < (numRows - 1)) { | ||
| res += "," + newline; | ||
| } | ||
| } | ||
| res += newline + ");"; | ||
| return res; | ||
| }; | ||
| /** | ||
| * Python dict. | ||
| */ | ||
| Renderer.prototype.python = function(datagrid, options) { | ||
| var opts = extend({}, this.options, options); | ||
| datagrid = extend({}, datagrid); | ||
| var data = datagrid.data; | ||
| var header = datagrid.header || opts.header; | ||
| var newline = opts.newline; | ||
| var res = "["; | ||
| var numRows = data.length; | ||
| var numColumns = header.names.length; | ||
| var rowOutput; | ||
| for (var i = 0; i < numRows; i++) { | ||
| var row = data[i]; | ||
| res += "{"; | ||
| for (var j = 0; j < numColumns; j++) { | ||
| if ((header.types[j] == "int") || (header.types[j] == "float")) { | ||
| rowOutput = row[j] || "None"; | ||
| } else { | ||
| rowOutput = '"' + (row[j] || "") + '"'; | ||
| } | ||
| res += ('"' + header.names[j] + '"' + ":" + rowOutput); | ||
| if (j < (numColumns - 1)) { | ||
| res += ","; | ||
| } | ||
| } | ||
| res += "}"; | ||
| if (i < (numRows - 1)) { | ||
| res += "," + newline; | ||
| } | ||
| } | ||
| res += "];"; | ||
| return res; | ||
| }; | ||
| /** | ||
| * Ruby | ||
| */ | ||
| Renderer.prototype.ruby = function(datagrid, options) { | ||
| var opts = extend({}, this.options, options); | ||
| datagrid = extend({}, datagrid); | ||
| var data = datagrid.data; | ||
| var header = datagrid.header || opts.header; | ||
| var newline = opts.newline; | ||
| var res = ''; | ||
| var numRows = data.length; | ||
| var numColumns = header.names.length; | ||
| var rowOutput; | ||
| res += '['; | ||
| for (var i = 0; i < numRows; i++) { | ||
| var row = data[i]; | ||
| res += '{'; | ||
| for (var j = 0; j < numColumns; j++) { | ||
| if ((header.types[j] == 'int') || (header.types[j] == 'float')) { | ||
| rowOutput = row[j] || 'nil'; | ||
| } else { | ||
| rowOutput = '"' + (row[j] || '') + '"'; | ||
| } | ||
| res += ('"' + header.names[j] + '"' + '=>' + rowOutput); | ||
| if (j < (numColumns - 1)) { | ||
| res += ','; | ||
| } | ||
| } | ||
| res += '}'; | ||
| if (i < (numRows - 1)) { | ||
| res += ',' + newline; | ||
| } | ||
| } | ||
| res += '];'; | ||
| return res; | ||
| }; | ||
| /** | ||
| * XML nodes | ||
| */ | ||
| Renderer.prototype.xml = function(datagrid, options) { | ||
| var opts = extend({}, this.options, options); | ||
| datagrid = extend({}, datagrid); | ||
| var data = datagrid.data; | ||
| var header = datagrid.header || opts.header; | ||
| var indent = opts.indent; | ||
| var newline = opts.newline; | ||
| var res = ''; | ||
| var numRows = data.length; | ||
| var numColumns = header.names.length; | ||
| res = '<?xml version="1.0" encoding="UTF-8"?>' + newline; | ||
| res += '<rows>' + newline; | ||
| for (var i = 0; i < numRows; i++) { | ||
| var row = data[i]; | ||
| res += indent + '<row>' + newline; | ||
| for (var j = 0; j < numColumns; j++) { | ||
| res += indent + indent + '<' + header.names[j] + '>'; | ||
| res += row[j] || ''; | ||
| res += '</' + header.names[j] + '>' + newline; | ||
| } | ||
| res += indent + '</row>' + newline; | ||
| } | ||
| res += '</rows>'; | ||
| return res; | ||
| }; | ||
| /** | ||
| * XML properties | ||
| */ | ||
| Renderer.prototype.xmlProperties = function(datagrid, options) { | ||
| var opts = extend({}, this.options, options); | ||
| datagrid = extend({}, datagrid); | ||
| var data = datagrid.data; | ||
| var header = datagrid.header || opts.header; | ||
| var indent = opts.indent; | ||
| var newline = opts.newline; | ||
| var res = ''; | ||
| var numRows = data.length; | ||
| var numColumns = header.names.length; | ||
| res = '<?xml version="1.0" encoding="UTF-8"?>' + newline; | ||
| res += '<rows>' + newline; | ||
| for (var i = 0; i < numRows; i++) { | ||
| var row = data[i]; | ||
| res += indent + '<row '; | ||
| for (var j = 0; j < numColumns; j++) { | ||
| res += header.names[j] + '='; | ||
| res += '"' + row[j] + '" '; | ||
| } | ||
| res += '></row>' + newline; | ||
| } | ||
| res += '</rows>'; | ||
| return res; | ||
| }; | ||
| /** | ||
| * XML Illustrator | ||
| */ | ||
| Renderer.prototype.xmlIllustrator = function(datagrid, options) { | ||
| var opts = extend({}, this.options, options); | ||
| datagrid = extend({}, datagrid); | ||
| var data = datagrid.data; | ||
| var header = datagrid.header || opts.header; | ||
| var indent = opts.indent; | ||
| var newline = opts.newline; | ||
| var res = ""; | ||
| var numRows = data.length; | ||
| var numColumns = header.names.length; | ||
| res = '<?xml version="1.0" encoding="utf-8"?>' + newline; | ||
| res += '<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20001102//EN" "http://www.w3.org/TR/2000/CR-SVG-20001102/DTD/svg-20001102.dtd" [' + newline; | ||
| res += indent + '<!ENTITY ns_graphs "http://ns.adobe.com/Graphs/1.0/">' + newline; | ||
| res += indent + '<!ENTITY ns_vars "http://ns.adobe.com/Variables/1.0/">' + newline; | ||
| res += indent + '<!ENTITY ns_imrep "http://ns.adobe.com/ImageReplacement/1.0/">' + newline; | ||
| res += indent + '<!ENTITY ns_custom "http://ns.adobe.com/GenericCustomNamespace/1.0/">' + newline; | ||
| res += indent + '<!ENTITY ns_flows "http://ns.adobe.com/Flows/1.0/">' + newline; | ||
| res += indent + '<!ENTITY ns_extend "http://ns.adobe.com/Extensibility/1.0/">' + newline; | ||
| res += ']>' + newline; | ||
| res += '<svg>' + newline; | ||
| res += '<variableSets xmlns="&ns_vars;">' + newline; | ||
| res += indent + '<variableSet varSetName="binding1" locked="none">' + newline; | ||
| res += indent + indent + '<variables>' + newline; | ||
| for (var i = 0; i < numColumns; i++) { | ||
| res += indent + indent + indent + '<variable varName="' + header.names[i] + '" trait="textcontent" category="&ns_flows;"></variable>' + newline; | ||
| } | ||
| res += indent + indent + '</variables>' + newline; | ||
| res += indent + indent + '<v:sampleDataSets xmlns:v="http://ns.adobe.com/Variables/1.0/" xmlns="http://ns.adobe.com/GenericCustomNamespace/1.0/">' + newline; | ||
| for (var ii = 0; ii < numRows; ii++) { | ||
| var row = data[ii]; | ||
| res += indent + indent + indent + '<v:sampleDataSet dataSetName="' + row[0] + '">' + newline; | ||
| for (var j = 0; j < numColumns; j++) { | ||
| res += indent + indent + indent + indent + '<' + header.names[j] + '>' + newline; | ||
| res += indent + indent + indent + indent + indent + '<p>' + row[j] + '</p>' + newline; | ||
| res += indent + indent + indent + indent + '</' + header.names[j] + '>' + newline; | ||
| } | ||
| res += indent + indent + indent + '</v:sampleDataSet>' + newline; | ||
| } | ||
| res += indent + indent + '</v:sampleDataSets>' + newline; | ||
| res += indent + '</variableSet>' + newline; | ||
| res += '</variableSets>' + newline; | ||
| res += '</svg>' + newline; | ||
| return res; | ||
| }; | ||
| /** | ||
| * Expose `Renderer` | ||
| */ | ||
| module.exports = Renderer; |
+21
| The MIT License (MIT) | ||
| Copyright (c) 2014-2016, Jon Schlinkert. | ||
| Permission is hereby granted, free of charge, to any person obtaining a copy | ||
| of this software and associated documentation files (the "Software"), to deal | ||
| in the Software without restriction, including without limitation the rights | ||
| to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||
| copies of the Software, and to permit persons to whom the Software is | ||
| furnished to do so, subject to the following conditions: | ||
| The above copyright notice and this permission notice shall be included in | ||
| all copies or substantial portions of the Software. | ||
| THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||
| IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||
| FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||
| AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||
| LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||
| OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | ||
| THE SOFTWARE. |
+90
-2
| /*! | ||
| * parse-csv <https://github.com/jonschlinkert/parse-csv> | ||
| * | ||
| * Copyright (c) 2014 Jon Schlinkert, contributors. | ||
| * Copyright (c) 2014-2016 Jon Schlinkert, contributors. | ||
| * Licensed under the MIT license. | ||
@@ -10,2 +10,90 @@ */ | ||
| module.exports = require('./lib'); | ||
| var extend = require('extend-shallow'); | ||
| var Renderer = require('./lib/renderer'); | ||
| var Parser = require('./lib/parser'); | ||
| /** | ||
| * Expose `csv` | ||
| */ | ||
| module.exports = csv; | ||
| /** | ||
| * Parse a string of CSV to a datagrid and render it using the specified [renderer](). | ||
| * The `.json` renderer is used by default. | ||
| * | ||
| * ```js | ||
| * var str = ` | ||
| * id,fruit,vegetable | ||
| * 1,apple,carrot | ||
| * 2,orange,corn | ||
| * 3,banana,potato`; | ||
| * | ||
| * var res = csv(str, {headers: {included: true}}); | ||
| * console.log(res); | ||
| * // results in: | ||
| * // [{"id":"1","fruit":"apple","vegetable":"carrot"}, | ||
| * // {"id":"2","fruit":"orange","vegetable":"corn"}, | ||
| * // {"id":"3","fruit":"banana","vegetable":"potato"}] | ||
| * ``` | ||
| * @param {String} `method` The name of the renderer method to use, or a string of CSV. If CSV, the `.json` method will be used. | ||
| * @param {String|Object} `str` String of CSV or options. | ||
| * @param {Object} `options` | ||
| * @return {String} | ||
| * @api public | ||
| */ | ||
| function csv(method, str, options) { | ||
| if (typeof str !== 'string') { | ||
| options = str; | ||
| str = method; | ||
| method = null; | ||
| } | ||
| if (typeof str !== 'string') { | ||
| throw new TypeError('expected csv to be a string'); | ||
| } | ||
| var opts = extend({renderer: 'json'}, options); | ||
| method = method || opts.renderer; | ||
| var parser = new Parser(options); | ||
| var renderer = new Renderer(options); | ||
| var datagrid = parser.parse(str); | ||
| return renderer.render(method, datagrid); | ||
| } | ||
| /** | ||
| * Parse a string of CSV to a datagrid, format it using one of the `.json*` [renderer]() methods, | ||
| * then parse it back to JSON. | ||
| * | ||
| * ```js | ||
| * var str = ` | ||
| * id,fruit,vegetable | ||
| * 1,apple,carrot | ||
| * 2,orange,corn | ||
| * 3,banana,potato`; | ||
| * | ||
| * var res = csv.toJSON('jsonDict', str, {headers: {included: true}}); | ||
| * console.log(res); | ||
| * // results in: | ||
| * // { '1': { fruit: 'apple', vegetable: 'carrot' }, | ||
| * // '2': { fruit: 'orange', vegetable: 'corn' }, | ||
| * // '3': { fruit: 'banana', vegetable: 'potato' } } | ||
| * ``` | ||
| * @param {String} `method` The name of the renderer method to use, or a string of CSV. If CSV, the `.json` method will be used. | ||
| * @param {String|Object} `str` String of CSV or options. | ||
| * @param {Object} `options` | ||
| * @return {String} | ||
| * @api public | ||
| */ | ||
| module.exports.toJSON = function(method, str, options) { | ||
| if (typeof str === 'string' && !/^json/.test(method)) { | ||
| throw new Error('a json* renderer must be specified with the .toJSON method'); | ||
| } | ||
| return JSON.parse(csv.apply(null, arguments)); | ||
| }; | ||
| module.exports.Renderer = Renderer; | ||
| module.exports.Parser = Parser; |
+39
-20
| { | ||
| "name": "parse-csv", | ||
| "description": "CSV parser for node.js.", | ||
| "version": "0.1.0", | ||
| "version": "0.2.0", | ||
| "homepage": "https://github.com/jonschlinkert/parse-csv", | ||
| "author": { | ||
| "name": "Jon Schlinkert", | ||
| "url": "https://github.com/jonschlinkert" | ||
| }, | ||
| "repository": { | ||
| "type": "git", | ||
| "url": "git://github.com/jonschlinkert/parse-csv.git" | ||
| }, | ||
| "author": "Jon Schlinkert (https://github.com/jonschlinkert)", | ||
| "repository": "jonschlinkert/parse-csv", | ||
| "bugs": { | ||
| "url": "https://github.com/jonschlinkert/parse-csv/issues" | ||
| }, | ||
| "licenses": [ | ||
| { | ||
| "type": "MIT", | ||
| "url": "https://github.com/jonschlinkert/parse-csv/blob/master/LICENSE-MIT" | ||
| } | ||
| "license": "MIT", | ||
| "files": [ | ||
| "index.js", | ||
| "lib" | ||
| ], | ||
@@ -28,14 +21,40 @@ "main": "index.js", | ||
| "scripts": { | ||
| "test": "mocha -R spec" | ||
| "test": "mocha" | ||
| }, | ||
| "dependencies": { | ||
| "extend-shallow": "^2.0.1", | ||
| "is-number": "^2.1.0", | ||
| "isobject": "^2.1.0", | ||
| "mixin-deep": "^1.1.3" | ||
| }, | ||
| "devDependencies": { | ||
| "mocha": "*", | ||
| "should": "*" | ||
| "gulp-format-md": "^0.1.9", | ||
| "mocha": "^2.4.5" | ||
| }, | ||
| "keywords": [ | ||
| "csv", | ||
| "parse" | ||
| ], | ||
| "dependencies": { | ||
| "lodash": "^2.4.1" | ||
| "verb": { | ||
| "plugins": [ | ||
| "gulp-format-md" | ||
| ], | ||
| "reflinks": [ | ||
| "verb" | ||
| ], | ||
| "toc": true, | ||
| "layout": "default", | ||
| "lint": { | ||
| "reflinks": true | ||
| }, | ||
| "tasks": [ | ||
| "readme" | ||
| ], | ||
| "related": { | ||
| "list": [ | ||
| "parser-csv", | ||
| "gulp-convert" | ||
| ] | ||
| } | ||
| } | ||
| } |
+311
-19
@@ -1,20 +0,31 @@ | ||
| # parse-csv [](http://badge.fury.io/js/parse-csv) | ||
| # parse-csv [](https://www.npmjs.com/package/parse-csv) [](https://npmjs.org/package/parse-csv) [](https://travis-ci.org/jonschlinkert/parse-csv) | ||
| > CSV parser for node.js. | ||
| CSV parser for node.js. | ||
| Based on [mr-data-converter](https://github.com/shancarter/mr-data-converter) by [@shancarter](https://github.com/shancarter). | ||
| ## TOC | ||
| - [Install](#install) | ||
| - [Usage](#usage) | ||
| - [API](#api) | ||
| * [Available renderers](#available-renderers) | ||
| - [Options](#options) | ||
| * [Parser options](#parser-options) | ||
| * [Renderer options](#renderer-options) | ||
| - [Related projects](#related-projects) | ||
| - [Contributing](#contributing) | ||
| - [Building docs](#building-docs) | ||
| - [Running tests](#running-tests) | ||
| - [Author](#author) | ||
| - [License](#license) | ||
| ## Install | ||
| ### Install with [npm](npmjs.org) | ||
| ```bash | ||
| npm i parse-csv --save | ||
| Install with [npm](https://www.npmjs.com/): | ||
| ```sh | ||
| $ npm install parse-csv --save | ||
| ``` | ||
| ## Run tests | ||
| Based on [mr-data-converter](https://github.com/shancarter/mr-data-converter) by [@shancarter](https://github.com/shancarter). Copyright (c) 2011 Shan Carter. | ||
| ```bash | ||
| npm test | ||
| ``` | ||
| ## Usage | ||
@@ -24,2 +35,12 @@ | ||
| var csv = require('parse-csv'); | ||
| var str = [ | ||
| 'id,fruit,vegetable', | ||
| '1,apple,carrot', | ||
| '2,orange,corn', | ||
| '3,banana,potato' | ||
| ].join('\n'); | ||
| var obj = csv.toJSON(str, {headers: {included: true}}); | ||
| console.log(obj); | ||
| ``` | ||
@@ -29,20 +50,291 @@ | ||
| ### [csv](index.js#L45) | ||
| Parse a string of CSV to a datagrid and render it using the specified [renderer](#renderer). The `.json` renderer is used by default. | ||
| **Params** | ||
| * `method` **{String}**: The name of the renderer method to use, or a string of CSV. If CSV, the `.json` method will be used. | ||
| * `str` **{String|Object}**: String of CSV or options. | ||
| * `options` **{Object}** | ||
| * `returns` **{String}** | ||
| **Example** | ||
| ```js | ||
| var str = ` | ||
| id,fruit,vegetable | ||
| 1,apple,carrot | ||
| 2,orange,corn | ||
| 3,banana,potato`; | ||
| var res = csv(str, {headers: {included: true}}); | ||
| console.log(res); | ||
| // results in: | ||
| // [{"id":"1","fruit":"apple","vegetable":"carrot"}, | ||
| // {"id":"2","fruit":"orange","vegetable":"corn"}, | ||
| // {"id":"3","fruit":"banana","vegetable":"potato"}] | ||
| ``` | ||
| ### [.toJSON](index.js#L90) | ||
| Parse a string of CSV to a datagrid, format it using one of the `.json*` [renderer](#renderer) methods, then parse it back to JSON. | ||
| **Params** | ||
| * `method` **{String}**: The name of the renderer method to use, or a string of CSV. If CSV, the `.json` method will be used. | ||
| * `str` **{String|Object}**: String of CSV or options. | ||
| * `options` **{Object}** | ||
| * `returns` **{String}** | ||
| **Example** | ||
| ```js | ||
| var str = ` | ||
| id,fruit,vegetable | ||
| 1,apple,carrot | ||
| 2,orange,corn | ||
| 3,banana,potato`; | ||
| var res = csv.toJSON('jsonDict', str, {headers: {included: true}}); | ||
| console.log(res); | ||
| // results in: | ||
| // { '1': { fruit: 'apple', vegetable: 'carrot' }, | ||
| // '2': { fruit: 'orange', vegetable: 'corn' }, | ||
| // '3': { fruit: 'banana', vegetable: 'potato' } } | ||
| ``` | ||
| ### [Parser](lib/parser.js#L30) | ||
| Create a new `Parser` with the given `options`. | ||
| **Params** | ||
| * `options` **{Options}** | ||
| **Example** | ||
| ```js | ||
| var csv = require('parse-csv'); | ||
| var parser = new csv.Parser(); | ||
| ``` | ||
| ### [.parse](lib/parser.js#L72) | ||
| Parse CSV or tab-delimited string into a data-grid formatted JavaScript object. | ||
| **Params** | ||
| * `str` **{String}** | ||
| * `options` **{Object}** | ||
| * `returns` **{Object}** | ||
| **Example** | ||
| ```js | ||
| var parser = new Parser(); | ||
| var str = ` | ||
| id,fruit,vegetable | ||
| 1,apple,carrot | ||
| 2,orange,corn | ||
| 3,banana,potato`; | ||
| var datagrid = parser.parse(str); | ||
| // results in: | ||
| // { data: | ||
| // [ [ '1', 'apple', 'carrot' ], | ||
| // [ '2', 'orange', 'corn' ], | ||
| // [ '3', 'banana', 'potato' ] ], | ||
| // header: | ||
| // { names: [ 'id', 'fruit', 'vegetable' ], | ||
| // types: [ '-1': 'string' ] } } | ||
| ``` | ||
| ### [Renderer](lib/renderer.js#L22) | ||
| Create a new `Renderer` with the given `options`. | ||
| **Params** | ||
| * `options` **{Object}** | ||
| **Example** | ||
| ```js | ||
| var csv = require('parse-csv'); | ||
| var renderer = new csv.Renderer(); | ||
| ``` | ||
| ### Available renderers | ||
| The following render methods are available when the renderer is used directly. Or specify the renderer on `options.renderer` when using the main export function. | ||
| * `.as`: Actionscript | ||
| * `.asp`: ASP/VBScript | ||
| * `.html`: HTML | ||
| * `.json`: JSON - Properties | ||
| * `.jsonArrayCols`: JSON - Column Arrays | ||
| * `.jsonArrayRows`: JSON - Row Arrays | ||
| * `.jsonDict`: JSON - Dictionary | ||
| * `.mysql`: MySQL | ||
| * `.php`: PHP | ||
| * `.python`: Python - Dict | ||
| * `.ruby`: Ruby | ||
| * `.xmlProperties`: XML - Properties | ||
| * `.xml`: XML - Nodes | ||
| * `.xmlIllustrator`: XML - Illustrator | ||
| **Example** | ||
| To render CSV as HTML: | ||
| ```js | ||
| var csv = require('parse-csv'); | ||
| var renderer = new csv.Renderer(); | ||
| var str = ` | ||
| id,fruit,vegetable | ||
| 1,apple,carrot | ||
| 2,orange,corn | ||
| 3,banana,potato`; | ||
| var html = renderer.html(str, {headers: {included: true}}); | ||
| console.log(html); | ||
| ``` | ||
| Results in: | ||
| ```html | ||
| <table> | ||
| <thead> | ||
| <tr> | ||
| <th class="id-cell">id</th> | ||
| <th class="fruit-cell">fruit</th> | ||
| <th class="vegetable-cell">vegetable</th> | ||
| </tr> | ||
| </thead> | ||
| <tbody> | ||
| <tr class="firstRow"> | ||
| <td class="id-cell">1</td> | ||
| <td class="fruit-cell">apple</td> | ||
| <td class="vegetable-cell">carrot</td> | ||
| </tr> | ||
| <tr> | ||
| <td class="id-cell">2</td> | ||
| <td class="fruit-cell">orange</td> | ||
| <td class="vegetable-cell">corn</td> | ||
| </tr> | ||
| <tr class="lastRow"> | ||
| <td class="id-cell">3</td> | ||
| <td class="fruit-cell">banana</td> | ||
| <td class="vegetable-cell">potato</td> | ||
| </tr> | ||
| </tbody> | ||
| </table> | ||
| ``` | ||
| ## Options | ||
| ### Parser options | ||
| Available parser options and the actual defaults used. | ||
| ```js | ||
| { | ||
| headers: { | ||
| included: false, | ||
| downcase: true, | ||
| upcase: true | ||
| }, | ||
| delimiter: 'tab', | ||
| decimalSign: 'comma' | ||
| } | ||
| ``` | ||
| ### Renderer options | ||
| Available renderer options and the actual defaults used. | ||
| ```js | ||
| { | ||
| headers: { | ||
| included: true, | ||
| downcase: true, | ||
| upcase: true | ||
| }, | ||
| delimiter: 'tab', | ||
| decimalSign: 'comma', | ||
| outputDataType: 'json', | ||
| columnDelimiter: "\t", | ||
| rowDelimiter: '\n', | ||
| inputHeader: {}, | ||
| outputHeader: {}, | ||
| dataSelect: {}, | ||
| outputText: '', | ||
| newline: '\n', | ||
| indent: ' ', | ||
| commentLine: '//', | ||
| commentLineEnd: '', | ||
| tableName: 'converter', | ||
| useUnderscores: true, | ||
| includeWhiteSpace: true, | ||
| useTabsForIndent: false | ||
| } | ||
| ``` | ||
| ## Related projects | ||
| You might also be interested in these projects: | ||
| * [gulp-convert](https://www.npmjs.com/package/gulp-convert): Gulp plugin to convert to or from JSON, YAML, XML, PLIST or CSV. | [homepage](https://github.com/assemble/gulp-convert) | ||
| * [parser-csv](https://www.npmjs.com/package/parser-csv): CSV parser, compatible with [parser-cache]. | [homepage](https://github.com/jonschlinkert/parser-csv) | ||
| ## Contributing | ||
| Pull requests and stars are always welcome. For bugs and feature requests, [please create an issue](https://github.com/jonschlinkert/parse-csv/issues) | ||
| Pull requests and stars are always welcome. For bugs and feature requests, [please create an issue](https://github.com/jonschlinkert/parse-csv/issues/new). | ||
| ## Building docs | ||
| Generate readme and API documentation with [verb](https://github.com/verbose/verb): | ||
| ```sh | ||
| $ npm install verb && npm run docs | ||
| ``` | ||
| Or, if [verb](https://github.com/verbose/verb) is installed globally: | ||
| ```sh | ||
| $ verb | ||
| ``` | ||
| ## Running tests | ||
| Install dev dependencies: | ||
| ```sh | ||
| $ npm install -d && npm test | ||
| ``` | ||
| ## Author | ||
| **Jon Schlinkert** | ||
| + [github/jonschlinkert](https://github.com/jonschlinkert) | ||
| + [twitter/jonschlinkert](http://twitter.com/jonschlinkert) | ||
| * [github/jonschlinkert](https://github.com/jonschlinkert) | ||
| * [twitter/jonschlinkert](http://twitter.com/jonschlinkert) | ||
| ## License | ||
| Copyright (c) 2014 Jon Schlinkert | ||
| Copyright (c) 2011 Shan Carter | ||
| Released under the MIT license | ||
| Copyright © 2016, [Jon Schlinkert](https://github.com/jonschlinkert). | ||
| Released under the [MIT license](https://github.com/jonschlinkert/parse-csv/blob/master/LICENSE). | ||
| *** | ||
| _This file was generated by [verb](https://github.com/assemble/verb) on November 21, 2014._ | ||
| _This file was generated by [verb](https://github.com/verbose/verb), v0.9.0, on May 09, 2016._ |
| # Enforce Unix newlines | ||
| *.* text eol=lf | ||
| *.css text eol=lf | ||
| *.html text eol=lf | ||
| *.js text eol=lf | ||
| *.json text eol=lf | ||
| *.less text eol=lf | ||
| *.md text eol=lf | ||
| *.yml text eol=lf | ||
| *.jpg binary | ||
| *.gif binary | ||
| *.png binary | ||
| *.jpeg binary |
-18
| { | ||
| "asi": false, | ||
| "boss": true, | ||
| "curly": true, | ||
| "eqeqeq": true, | ||
| "eqnull": true, | ||
| "esnext": true, | ||
| "immed": true, | ||
| "latedef": true, | ||
| "laxcomma": false, | ||
| "newcap": true, | ||
| "noarg": true, | ||
| "node": true, | ||
| "sub": true, | ||
| "undef": true, | ||
| "unused": true, | ||
| "mocha": true | ||
| } |
Sorry, the diff of this file is not supported yet
-38
| # {%= name %} {%= badge("fury") %} | ||
| > {%= description %} | ||
| Based on [mr-data-converter](https://github.com/shancarter/mr-data-converter) by [@shancarter](https://github.com/shancarter). | ||
| ## Install | ||
| {%= include("install-npm", {save: true}) %} | ||
| ## Run tests | ||
| ```bash | ||
| npm test | ||
| ``` | ||
| ## Usage | ||
| ```js | ||
| var csv = require('{%= name %}'); | ||
| ``` | ||
| ## API | ||
| {%= comments("index.js") %} | ||
| ## Contributing | ||
| Pull requests and stars are always welcome. For bugs and feature requests, [please create an issue]({%= bugs.url %}) | ||
| ## Author | ||
| {%= include("author") %} | ||
| ## License | ||
| {%= copyright() %} | ||
| Copyright (c) 2011 Shan Carter | ||
| {%= license() %} | ||
| *** | ||
| {%= include("footer") %} |
-13
| // var render = require('./lib/render.js'); | ||
| var csv = require('./lib/'); | ||
| var data = [ | ||
| 'id,fruit,vegetable', | ||
| '1,apple,carrot', | ||
| '2,orange,corn', | ||
| '3,banana,potato' | ||
| ].join('\n'); | ||
| console.log(csv.jsonDict(data, {headers: {included: true}})); | ||
| console.log(csv.to('jsonDict', data, {headers: {included: true}})); |
-244
| 'use strict'; | ||
| /** | ||
| * Module dependencies | ||
| */ | ||
| var _ = require('lodash'); | ||
| /** | ||
| * Decimal regex | ||
| * | ||
| * @type {RegExp} | ||
| */ | ||
| var decimalRe = /^\s*(\+|-)?((\d+([,\.]\d+)?)|([,\.]\d+))\s*$/; | ||
| /** | ||
| * Expose `csv` | ||
| */ | ||
| var csv = module.exports; | ||
| /** | ||
| * Parse CSV or tab-delimited string into a data | ||
| * grid-formatted JavaScript object. | ||
| * | ||
| * @param {String} `str` | ||
| * @param {Object} `options` | ||
| * @return {Object} | ||
| */ | ||
| csv.parse = function(str, options) { | ||
| str = str.replace(/\r/g, ''); | ||
| var opts = _.defaults({}, options, { | ||
| headers: { | ||
| included: false, | ||
| downcase: true, | ||
| upcase: true | ||
| }, | ||
| delimiter: 'tab', | ||
| decimalSign: 'comma' | ||
| }); | ||
| var dataArray = []; | ||
| // count the number of commas | ||
| var numCommas = str.replace(/[^,]/g, '').length; | ||
| // count the number of tabs | ||
| var numTabs = str.replace(/[^\t]/g, '').length; | ||
| // set delimiter | ||
| var delimiter = ','; | ||
| if (opts.delimiter === 'tab') { | ||
| delimiter = '\t'; | ||
| } else if (numTabs > numCommas) { | ||
| delimiter = '\t'; | ||
| } | ||
| // strip extra empty lines | ||
| str = str.replace(/^\n+|\n+$/g, ''); | ||
| // Create an array of arrays from the given CSV | ||
| dataArray = toArray(str, opts); | ||
| // escape out any tabs or returns or new lines | ||
| for (var i = dataArray.length - 1; i >= 0; i--) { | ||
| for (var j = dataArray[i].length - 1; j >= 0; j--) { | ||
| dataArray[i][j] = dataArray[i][j].replace(/([\t\n])/, '\\$1'); | ||
| } | ||
| } | ||
| var headerNames = []; | ||
| var headerTypes = []; | ||
| var numColumns = dataArray[0].length; | ||
| var numRows = dataArray.length; | ||
| if (opts.headers.included) { | ||
| // remove header row | ||
| headerNames = dataArray.splice(0, 1)[0]; | ||
| numRows = dataArray.length; | ||
| } else { | ||
| // create generic property names if no header names are specified | ||
| for (var k = 0; k < numColumns; k++) { | ||
| headerNames.push('val' + String(k)); | ||
| headerTypes.push(''); | ||
| } | ||
| } | ||
| if (opts.headers.upcase) { | ||
| for (var l = headerNames.length - 1; l >= 0; l--) { | ||
| headerNames[l] = headerNames[l].toUpperCase(); | ||
| } | ||
| } | ||
| if (opts.headers.downcase) { | ||
| for (var m = headerNames.length - 1; m >= 0; m--) { | ||
| headerNames[m] = headerNames[m].toLowerCase(); | ||
| } | ||
| } | ||
| // test all the rows for proper number of columns. | ||
| for (var ii = 0; ii < dataArray.length; ii++) { | ||
| var numValues = dataArray[ii].length; | ||
| if (numValues != numColumns) { | ||
| this.log('Error parsing row ' + String(ii) + '. Wrong number of columns.'); | ||
| } | ||
| } | ||
| // test columns for number data type | ||
| var numRowsToTest = dataArray.length; | ||
| var threshold = 0.9; | ||
| for (var iii = 0; iii < headerNames.length; iii++) { | ||
| var numFloats = 0; | ||
| var numInts = 0; | ||
| for (var r = 0; r < numRowsToTest; r++) { | ||
| if (dataArray[r]) { | ||
| // replace comma with dot if comma is decimal separator | ||
| if (opts.decimalSign === 'comma' && decimalRe.test(dataArray[r][iii])) { | ||
| dataArray[r][iii] = dataArray[r][iii].replace(",", "."); | ||
| } | ||
| if (isNumber(dataArray[r][iii])) { | ||
| numInts++; | ||
| if (String(dataArray[r][iii]).indexOf('.') > 0) { | ||
| numFloats++; | ||
| } | ||
| } | ||
| } | ||
| } | ||
| if ((numInts / numRowsToTest) > threshold) { | ||
| if (numFloats > 0) { | ||
| headerTypes[i] = 'float'; | ||
| } else { | ||
| headerTypes[i] = 'int'; | ||
| } | ||
| } else { | ||
| headerTypes[i] = 'string'; | ||
| } | ||
| } | ||
| return { | ||
| data: dataArray, | ||
| header: { | ||
| names: headerNames, | ||
| types: headerTypes | ||
| } | ||
| }; | ||
| }; | ||
| /** | ||
| * Parse a delimited string into an array of arrays. | ||
| * | ||
| * The default delimiter is `comma`, this can be | ||
| * overriden by passed a different delimiter on | ||
| * the `delim` option as a second argument. | ||
| * | ||
| * This Function is from [Ben Nadel] by way of [Mr Data Converer] | ||
| * | ||
| * @param {String} `str` | ||
| * @param {Object} `options` | ||
| * @return {Array} | ||
| */ | ||
| function toArray(str, options) { | ||
| var opts = _.extend({delim: ','}, options); | ||
| // Create a regular expression to parse the CSV values. | ||
| var re = new RegExp( | ||
| // Delimiters. | ||
| '(\\' + opts.delim + '|\\n|^)' + | ||
| // Quoted fields. | ||
| '(?:"([^"]*(?:""[^"]*)*)"|' + | ||
| // Standard fields. | ||
| '([^"\\' + opts.delim + '\\n]*))', 'gi' | ||
| ); | ||
| // Create an array to hold our data. Give the array | ||
| // a default empty first row. | ||
| var arr = [[]]; | ||
| // Create an array to hold our individual pattern | ||
| // matching groups. | ||
| var match = null; | ||
| var value; | ||
| // Keep looping over the regular expression matches | ||
| // until we can no longer find a match. | ||
| while (match = re.exec(str)) { | ||
| // Get the delimiter that was found. | ||
| var matchedDelim = match[1]; | ||
| // Check to see if the given delimiter has a length | ||
| // (is not the start of string) and if it matches | ||
| // field delimiter. If it does not, then we can expect | ||
| // this delimiter to be a row delimiter. | ||
| if (matchedDelim.length && (matchedDelim != opts.delim)) { | ||
| // Since we have reached a new row of data, | ||
| // add an empty row to our data array. | ||
| arr.push([]); | ||
| } | ||
| // Now that we have our delimiter out of the way, | ||
| // let's check to see which kind of value we | ||
| // captured (quoted or unquoted). | ||
| if (match[2]) { | ||
| // We found a quoted value. When we capture | ||
| // this value, unescape any double quotes. | ||
| value = match[2].replace(/""/g, '"'); | ||
| } else { | ||
| // We found a non-quoted value. | ||
| value = match[3]; | ||
| } | ||
| // Now that we have our value string, let's add | ||
| // it to the data array. | ||
| arr[arr.length - 1].push(value); | ||
| } | ||
| // Return the parsed data. | ||
| return arr; | ||
| } | ||
| //--------------------------------------- | ||
| // UTILS | ||
| //--------------------------------------- | ||
| function isNumber(string) { | ||
| if ((string == null) || isNaN(Number(string))) { | ||
| return false; | ||
| } | ||
| return true; | ||
| } |
-11
| 'use strict'; | ||
| var render = require('./render'); | ||
| Object.keys(render).forEach(function (type) { | ||
| module.exports[type] = function (data, options) { | ||
| return render(type, data, options); | ||
| }; | ||
| }); | ||
| module.exports.to = render; |
-636
| 'use strict'; | ||
| /** | ||
| * Module dependencies | ||
| */ | ||
| var csv = require('./csv'); | ||
| var _ = require('lodash'); | ||
| /** | ||
| * Expose `render` | ||
| */ | ||
| module.exports = render; | ||
| function render(type, data, options) { | ||
| var parsed; | ||
| var res = ''; | ||
| if (typeof type !== 'string') { | ||
| options = type; | ||
| type = 'json'; | ||
| } | ||
| var converter = render[type]; | ||
| var defaults = { | ||
| headers: { | ||
| included: true, | ||
| downcase: true, | ||
| upcase: true | ||
| }, | ||
| delimiter: 'tab', | ||
| decimalSign: 'comma', | ||
| outputDataType: 'json', | ||
| columnDelimiter: "\t", | ||
| rowDelimiter: '\n', | ||
| inputHeader: {}, | ||
| outputHeader: {}, | ||
| dataSelect: {}, | ||
| outputText: '', | ||
| newline: '\n', | ||
| indent: ' ', | ||
| commentLine: '//', | ||
| commentLineEnd: '', | ||
| tableName: 'converter', | ||
| useUnderscores: true, | ||
| includeWhiteSpace: true, | ||
| useTabsForIndent: false | ||
| }; | ||
| var opts = _.extend(defaults, options); | ||
| // make sure there is input data before converting... | ||
| if (data && data.length > 0) { | ||
| if (opts.includeWhiteSpace) { | ||
| opts.newline = '\n'; | ||
| } else { | ||
| opts.indent = ''; | ||
| opts.newline = ''; | ||
| } | ||
| parsed = csv.parse(data, opts); | ||
| opts.header = parsed.header; | ||
| res = converter(parsed.data, opts); | ||
| } | ||
| return res; | ||
| } | ||
| render.as = function as(datagrid, options) { | ||
| var opts = _.extend({}, options); | ||
| var header = opts.header; | ||
| var newline = opts.newline; | ||
| var res = '['; | ||
| var numRows = datagrid.length; | ||
| var numColumns = header.names.length; | ||
| var rowOutput; | ||
| for (var i = 0; i < numRows; i++) { | ||
| var row = datagrid[i]; | ||
| res += '{'; | ||
| for (var j = 0; j < numColumns; j++) { | ||
| if ((header.types[j] == 'int') || (header.types[j] == 'float')) { | ||
| rowOutput = row[j] || 'null'; | ||
| } else { | ||
| rowOutput = '"' + (row[j] || '') + '"'; | ||
| } | ||
| res += (header.names[j] + ':' + rowOutput); | ||
| if (j < (numColumns - 1)) { | ||
| res += ','; | ||
| } | ||
| } | ||
| res += '}'; | ||
| if (i < (numRows - 1)) { | ||
| res += ',' + newline; | ||
| } | ||
| } | ||
| res += '];'; | ||
| return res; | ||
| }; | ||
| //--------------------------------------- | ||
| // ASP / VBScript | ||
| //--------------------------------------- | ||
| render.asp = function asp(datagrid, options) { | ||
| var opts = _.extend({}, options); | ||
| var header = opts.header; | ||
| var newline = opts.newline; | ||
| var res = ""; | ||
| var numRows = datagrid.length; | ||
| var numColumns = header.names.length; | ||
| var rowOutput; | ||
| for (var i = 0; i < numRows; i++) { | ||
| var row = datagrid[i]; | ||
| for (var j = 0; j < numColumns; j++) { | ||
| if ((header.types[j] == "int") || (header.types[j] == "float")) { | ||
| rowOutput = row[j] || "null"; | ||
| } else { | ||
| rowOutput = '"' + (row[j] || "") + '"'; | ||
| } | ||
| res += 'myArray(' + j + ',' + i + ') = ' + rowOutput + newline; | ||
| } | ||
| res = 'Dim myArray(' + (j - 1) + ',' + (i - 1) + ')' + newline + res; | ||
| } | ||
| return res; | ||
| }; | ||
| //--------------------------------------- | ||
| // HTML Table | ||
| //--------------------------------------- | ||
| render.html = function html(datagrid, options) { | ||
| var opts = _.extend({}, options); | ||
| var header = opts.header; | ||
| var indent = opts.indent; | ||
| var newline = opts.newline; | ||
| var res = ''; | ||
| var numRows = datagrid.length; | ||
| var numColumns = header.names.length; | ||
| res += '<table>' + newline; | ||
| res += indent + '<thead>' + newline; | ||
| res += indent + indent + '<tr>' + newline; | ||
| for (var i = 0; i < numColumns; i++) { | ||
| res += indent + indent + indent + '<th class="' + header.names[i] + '-cell">'; | ||
| res += header.names[i]; | ||
| res += '</th>' + newline; | ||
| } | ||
| res += indent + indent + '</tr>' + newline; | ||
| res += indent + '</thead>' + newline; | ||
| res += indent + '<tbody>' + newline; | ||
| for (var ii = 0; ii < numRows; ii++) { | ||
| var row = datagrid[ii]; | ||
| var rowClassName = ''; | ||
| if (ii === numRows - 1) { | ||
| rowClassName = ' class="lastRow"'; | ||
| } else if (ii === 0) { | ||
| rowClassName = ' class="firstRow"'; | ||
| } | ||
| res += indent + indent + '<tr' + rowClassName + '>' + newline; | ||
| for (var iii = 0; iii < numColumns; iii++) { | ||
| res += indent + indent + indent + '<td class="' + header.names[iii] + '-cell">'; | ||
| res += row[iii]; | ||
| res += '</td>' + newline; | ||
| } | ||
| res += indent + indent + '</tr>' + newline; | ||
| } | ||
| res += indent + '</tbody>' + newline; | ||
| res += '</table>'; | ||
| return res; | ||
| }; | ||
| //--------------------------------------- | ||
| // JSON properties | ||
| //--------------------------------------- | ||
| render.json = function json(datagrid, options) { | ||
| var opts = _.extend({}, options); | ||
| var header = opts.header; | ||
| var newline = opts.newline; | ||
| var res = "["; | ||
| var numRows = datagrid.length; | ||
| var numColumns = header.names.length; | ||
| var rowOutput; | ||
| for (var i = 0; i < numRows; i++) { | ||
| var row = datagrid[i]; | ||
| res += "{"; | ||
| for (var j = 0; j < numColumns; j++) { | ||
| if ((header.types[j] == "int") || (header.types[j] == "float")) { | ||
| rowOutput = row[j] || "null"; | ||
| } else { | ||
| rowOutput = '"' + (row[j] || "") + '"'; | ||
| } | ||
| res += ('"' + header.names[j] + '"' + ":" + rowOutput); | ||
| if (j < (numColumns - 1)) { | ||
| res += ","; | ||
| } | ||
| } | ||
| res += "}"; | ||
| if (i < (numRows - 1)) { | ||
| res += "," + newline; | ||
| } | ||
| } | ||
| res += "]"; | ||
| return res; | ||
| }; | ||
| //--------------------------------------- | ||
| // JSON Array of Columns | ||
| //--------------------------------------- | ||
| render.jsonArrayCols = function jsonArrayCols(datagrid, options) { | ||
| var opts = _.extend({}, options); | ||
| var header = opts.header; | ||
| var indent = opts.indent; | ||
| var newline = opts.newline; | ||
| var res = ""; | ||
| var numRows = datagrid.length; | ||
| var numColumns = header.names.length; | ||
| res += "{" + newline; | ||
| for (var i = 0; i < numColumns; i++) { | ||
| res += indent + '"' + header.names[i] + '":['; | ||
| for (var j = 0; j < numRows; j++) { | ||
| if ((header.types[i] == "int") || (header.types[i] == "float")) { | ||
| res += datagrid[j][i] || 0; | ||
| } else { | ||
| res += '"' + (datagrid[j][i] || "") + '"'; | ||
| } | ||
| if (j < (numRows - 1)) { | ||
| res += ","; | ||
| } | ||
| } | ||
| res += "]"; | ||
| if (i < (numColumns - 1)) { | ||
| res += "," + newline; | ||
| } | ||
| } | ||
| res += newline + "}"; | ||
| return res; | ||
| }; | ||
| //--------------------------------------- | ||
| // JSON Array of Rows | ||
| //--------------------------------------- | ||
| render.jsonArrayRows = function jsonArrayRows(datagrid, options) { | ||
| var opts = _.extend({}, options); | ||
| var header = opts.header; | ||
| var indent = opts.indent; | ||
| var newline = opts.newline; | ||
| var res = ""; | ||
| var numRows = datagrid.length; | ||
| var numColumns = header.names.length; | ||
| res += "[" + newline; | ||
| for (var i = 0; i < numRows; i++) { | ||
| res += indent + "["; | ||
| for (var j = 0; j < numColumns; j++) { | ||
| if ((header.types[j] == "int") || (header.types[j] == "float")) { | ||
| res += datagrid[i][j] || 0; | ||
| } else { | ||
| res += '"' + (datagrid[i][j] || "") + '"'; | ||
| } | ||
| if (j < (numColumns - 1)) { | ||
| res += ","; | ||
| } | ||
| } | ||
| res += "]"; | ||
| if (i < (numRows - 1)) { | ||
| res += "," + newline; | ||
| } | ||
| } | ||
| res += newline + "]"; | ||
| return res; | ||
| }; | ||
| //--------------------------------------- | ||
| // JSON Dictionary | ||
| //--------------------------------------- | ||
| render.jsonDict = function jsonDict(datagrid, options) { | ||
| var opts = _.extend({}, options); | ||
| var header = opts.header; | ||
| var indent = opts.indent; | ||
| var newline = opts.newline; | ||
| var res = ''; | ||
| var numRows = datagrid.length; | ||
| var numColumns = header.names.length; | ||
| res += '{' + newline; | ||
| for (var i = 0; i < numRows; i++) { | ||
| res += indent + '"' + datagrid[i][0] + '": '; | ||
| if (numColumns == 2) { | ||
| res += _fmtVal(i, 1, datagrid); | ||
| } else { | ||
| res += '{ '; | ||
| for (var j = 1; j < numColumns; j++) { | ||
| if (j > 1) res += ', '; | ||
| res += '"' + header.names[j] + '"' + ":" + _fmtVal(i, j, datagrid); | ||
| } | ||
| res += '}'; | ||
| } | ||
| if (i < (numRows - 1)) { | ||
| res += ',' + newline; | ||
| } | ||
| } | ||
| res += newline + '}'; | ||
| function _fmtVal(i, j) { | ||
| if ((header.types[j] == 'int') || (header.types[j] == "float")) { | ||
| return datagrid[i][j] || 0; | ||
| } else { | ||
| return '"' + (datagrid[i][j] || '') + '"'; | ||
| } | ||
| } | ||
| return res; | ||
| }; | ||
| //--------------------------------------- | ||
| // MYSQL | ||
| //--------------------------------------- | ||
| render.mysql = function mysql(datagrid, options) { | ||
| var opts = _.extend({}, options); | ||
| var header = opts.header; | ||
| var indent = opts.indent; | ||
| var newline = opts.newline; | ||
| var res = ''; | ||
| var numRows = datagrid.length; | ||
| var numColumns = header.names.length; | ||
| var tableName = 'converter'; | ||
| res += 'CREATE TABLE ' + tableName + ' (' + newline; | ||
| res += indent + 'id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,' + newline; | ||
| for (var i = 0; i < numColumns; i++) { | ||
| var dataType = 'VARCHAR(255)'; | ||
| if ((header.types[i] == 'int') || (header.types[i] == 'float')) { | ||
| dataType = header.types[i].toUpperCase(); | ||
| } | ||
| res += indent + '' + header.names[i] + ' ' + dataType; | ||
| if (i < numColumns - 1) { | ||
| res += ','; | ||
| } | ||
| res += newline; | ||
| } | ||
| res += ');' + newline; | ||
| res += 'INSERT INTO ' + tableName + " " + newline + indent + '('; | ||
| for (var ii = 0; ii < numColumns; ii++) { | ||
| res += header.names[ii]; | ||
| if (ii < numColumns - 1) { | ||
| res += ','; | ||
| } | ||
| } | ||
| res += ') ' + newline + 'VALUES ' + newline; | ||
| for (var iii = 0; iii < numRows; iii++) { | ||
| res += indent + '('; | ||
| for (var j = 0; j < numColumns; j++) { | ||
| if ((header.types[j] == 'int') || (header.types[j] == 'float')) { | ||
| res += datagrid[iii][j] || 'null'; | ||
| } else { | ||
| res += '\'' + (datagrid[iii][j] || '') + '\''; | ||
| } | ||
| if (j < numColumns - 1) { | ||
| res += ','; | ||
| } | ||
| } | ||
| res += ')'; | ||
| if (iii < numRows - 1) { | ||
| res += "," + newline; | ||
| } | ||
| } | ||
| res += ";"; | ||
| return res; | ||
| }; | ||
| //--------------------------------------- | ||
| // PHP | ||
| //--------------------------------------- | ||
| render.php = function php(datagrid, options) { | ||
| var opts = _.extend({}, options); | ||
| var header = opts.header; | ||
| var indent = opts.indent; | ||
| var newline = opts.newline; | ||
| var res = ""; | ||
| var numRows = datagrid.length; | ||
| var numColumns = header.names.length; | ||
| var rowOutput; | ||
| res += "array(" + newline; | ||
| for (var i = 0; i < numRows; i++) { | ||
| var row = datagrid[i]; | ||
| res += indent + "array("; | ||
| for (var j = 0; j < numColumns; j++) { | ||
| if ((header.types[j] == "int") || (header.types[j] == "float")) { | ||
| rowOutput = row[j] || "null"; | ||
| } else { | ||
| rowOutput = '"' + (row[j] || "") + '"'; | ||
| } | ||
| res += ('"' + header.names[j] + '"' + "=>" + rowOutput); | ||
| if (j < (numColumns - 1)) { | ||
| res += ","; | ||
| } | ||
| } | ||
| res += ")"; | ||
| if (i < (numRows - 1)) { | ||
| res += "," + newline; | ||
| } | ||
| } | ||
| res += newline + ");"; | ||
| return res; | ||
| }; | ||
| //--------------------------------------- | ||
| // Python dict | ||
| //--------------------------------------- | ||
| render.python = function python(datagrid, options) { | ||
| var opts = _.extend({}, options); | ||
| var header = opts.header; | ||
| var newline = opts.newline; | ||
| var res = "["; | ||
| var numRows = datagrid.length; | ||
| var numColumns = header.names.length; | ||
| var rowOutput; | ||
| for (var i = 0; i < numRows; i++) { | ||
| var row = datagrid[i]; | ||
| res += "{"; | ||
| for (var j = 0; j < numColumns; j++) { | ||
| if ((header.types[j] == "int") || (header.types[j] == "float")) { | ||
| rowOutput = row[j] || "None"; | ||
| } else { | ||
| rowOutput = '"' + (row[j] || "") + '"'; | ||
| } | ||
| res += ('"' + header.names[j] + '"' + ":" + rowOutput); | ||
| if (j < (numColumns - 1)) { | ||
| res += ","; | ||
| } | ||
| } | ||
| res += "}"; | ||
| if (i < (numRows - 1)) { | ||
| res += "," + newline; | ||
| } | ||
| } | ||
| res += "];"; | ||
| return res; | ||
| }; | ||
| //--------------------------------------- | ||
| // Ruby | ||
| //--------------------------------------- | ||
| render.ruby = function ruby(datagrid, options) { | ||
| var opts = _.extend({}, options); | ||
| var header = opts.header; | ||
| var newline = opts.newline; | ||
| var res = ''; | ||
| var numRows = datagrid.length; | ||
| var numColumns = header.names.length; | ||
| var rowOutput; | ||
| res += '['; | ||
| for (var i = 0; i < numRows; i++) { | ||
| var row = datagrid[i]; | ||
| res += '{'; | ||
| for (var j = 0; j < numColumns; j++) { | ||
| if ((header.types[j] == 'int') || (header.types[j] == 'float')) { | ||
| rowOutput = row[j] || 'nil'; | ||
| } else { | ||
| rowOutput = '"' + (row[j] || '') + '"'; | ||
| } | ||
| res += ('"' + header.names[j] + '"' + '=>' + rowOutput); | ||
| if (j < (numColumns - 1)) { | ||
| res += ','; | ||
| } | ||
| } | ||
| res += '}'; | ||
| if (i < (numRows - 1)) { | ||
| res += ',' + newline; | ||
| } | ||
| } | ||
| res += '];'; | ||
| return res; | ||
| }; | ||
| //--------------------------------------- | ||
| // XML Nodes | ||
| //--------------------------------------- | ||
| render.xml = function xml(datagrid, options) { | ||
| var opts = _.extend({}, options); | ||
| var header = opts.header; | ||
| var indent = opts.indent; | ||
| var newline = opts.newline; | ||
| var res = ''; | ||
| var numRows = datagrid.length; | ||
| var numColumns = header.names.length; | ||
| res = '<?xml version="1.0" encoding="UTF-8"?>' + newline; | ||
| res += '<rows>' + newline; | ||
| for (var i = 0; i < numRows; i++) { | ||
| var row = datagrid[i]; | ||
| res += indent + '<row>' + newline; | ||
| for (var j = 0; j < numColumns; j++) { | ||
| res += indent + indent + '<' + header.names[j] + '>'; | ||
| res += row[j] || ''; | ||
| res += '</' + header.names[j] + '>' + newline; | ||
| } | ||
| res += indent + '</row>' + newline; | ||
| } | ||
| res += '</rows>'; | ||
| return res; | ||
| }; | ||
| //--------------------------------------- | ||
| // XML properties | ||
| //--------------------------------------- | ||
| render.xmlProperties = function xmlProperties(datagrid, options) { | ||
| var opts = _.extend({}, options); | ||
| var header = opts.header; | ||
| var indent = opts.indent; | ||
| var newline = opts.newline; | ||
| var res = ''; | ||
| var numRows = datagrid.length; | ||
| var numColumns = header.names.length; | ||
| res = '<?xml version="1.0" encoding="UTF-8"?>' + newline; | ||
| res += '<rows>' + newline; | ||
| for (var i = 0; i < numRows; i++) { | ||
| var row = datagrid[i]; | ||
| res += indent + '<row '; | ||
| for (var j = 0; j < numColumns; j++) { | ||
| res += header.names[j] + '='; | ||
| res += '"' + row[j] + '" '; | ||
| } | ||
| res += '></row>' + newline; | ||
| } | ||
| res += '</rows>'; | ||
| return res; | ||
| }; | ||
| //--------------------------------------- | ||
| // XML Illustrator | ||
| //--------------------------------------- | ||
| render.xmlIllustrator = function xmlIllustrator(datagrid, options) { | ||
| var opts = _.extend({}, options); | ||
| var header = opts.header; | ||
| var indent = opts.indent; | ||
| var newline = opts.newline; | ||
| var res = ""; | ||
| var numRows = datagrid.length; | ||
| var numColumns = header.names.length; | ||
| res = '<?xml version="1.0" encoding="utf-8"?>' + newline; | ||
| res += '<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20001102//EN" "http://www.w3.org/TR/2000/CR-SVG-20001102/DTD/svg-20001102.dtd" [' + newline; | ||
| res += indent + '<!ENTITY ns_graphs "http://ns.adobe.com/Graphs/1.0/">' + newline; | ||
| res += indent + '<!ENTITY ns_vars "http://ns.adobe.com/Variables/1.0/">' + newline; | ||
| res += indent + '<!ENTITY ns_imrep "http://ns.adobe.com/ImageReplacement/1.0/">' + newline; | ||
| res += indent + '<!ENTITY ns_custom "http://ns.adobe.com/GenericCustomNamespace/1.0/">' + newline; | ||
| res += indent + '<!ENTITY ns_flows "http://ns.adobe.com/Flows/1.0/">' + newline; | ||
| res += indent + '<!ENTITY ns_extend "http://ns.adobe.com/Extensibility/1.0/">' + newline; | ||
| res += ']>' + newline; | ||
| res += '<svg>' + newline; | ||
| res += '<variableSets xmlns="&ns_vars;">' + newline; | ||
| res += indent + '<variableSet varSetName="binding1" locked="none">' + newline; | ||
| res += indent + indent + '<variables>' + newline; | ||
| for (var i = 0; i < numColumns; i++) { | ||
| res += indent + indent + indent + '<variable varName="' + header.names[i] + '" trait="textcontent" category="&ns_flows;"></variable>' + newline; | ||
| } | ||
| res += indent + indent + '</variables>' + newline; | ||
| res += indent + indent + '<v:sampleDataSets xmlns:v="http://ns.adobe.com/Variables/1.0/" xmlns="http://ns.adobe.com/GenericCustomNamespace/1.0/">' + newline; | ||
| for (var ii = 0; ii < numRows; ii++) { | ||
| var row = datagrid[ii]; | ||
| res += indent + indent + indent + '<v:sampleDataSet dataSetName="' + row[0] + '">' + newline; | ||
| for (var j = 0; j < numColumns; j++) { | ||
| res += indent + indent + indent + indent + '<' + header.names[j] + '>' + newline; | ||
| res += indent + indent + indent + indent + indent + '<p>' + row[j] + '</p>' + newline; | ||
| res += indent + indent + indent + indent + '</' + header.names[j] + '>' + newline; | ||
| } | ||
| res += indent + indent + indent + '</v:sampleDataSet>' + newline; | ||
| } | ||
| res += indent + indent + '</v:sampleDataSets>' + newline; | ||
| res += indent + '</variableSet>' + newline; | ||
| res += '</variableSets>' + newline; | ||
| res += '</svg>' + newline; | ||
| return res; | ||
| }; |
Sorry, the diff of this file is not supported yet
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
No repository
Supply chain riskPackage does not have a linked source code repository. Without this field, a package will have no reference to the location of the source code use to generate the package.
AI-detected possible typosquat
Supply chain riskAI has identified this package as a potential typosquat of a more popular package. This suggests that the package may be intentionally mimicking another package's name, description, or other metadata.
35814
31.53%886
16.27%338
634.78%4
300%6
-50%2
100%+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
- Removed
- Removed