diff --git a/bower.json b/bower.json index 9ca79b4..a100f7d 100644 --- a/bower.json +++ b/bower.json @@ -1,6 +1,6 @@ { "name": "ng-csv", - "version": "0.3.2", + "version": "0.3.3", "main": "build/ng-csv.min.js", "dependencies": { "angular": "~1", diff --git a/build/ng-csv.js b/build/ng-csv.js index c1081fc..3babc8b 100644 --- a/build/ng-csv.js +++ b/build/ng-csv.js @@ -36,6 +36,14 @@ angular.module('ngCsv.services'). var EOL = '\r\n'; var BOM = "\ufeff"; + var specialChars = { + '\\t': '\t', + '\\b': '\b', + '\\v': '\v', + '\\f': '\f', + '\\r': '\r' + }; + /** * Stringify one field * @param data @@ -94,7 +102,7 @@ angular.module('ngCsv.services'). var csvContent = ""; var dataPromise = $q.when(data).then(function (responseData) { - responseData = angular.copy(responseData); + //responseData = angular.copy(responseData);//moved to row creation // Check if there's a provided header array if (angular.isDefined(options.header) && options.header) { var encodingArray, headerString; @@ -117,7 +125,8 @@ angular.module('ngCsv.services'). arrData = responseData(); } - angular.forEach(arrData, function (row, index) { + angular.forEach(arrData, function (oldRow, index) { + var row = angular.copy(arrData[index]); var dataString, infoArray; infoArray = []; @@ -148,6 +157,27 @@ angular.module('ngCsv.services'). return def.promise; }; + + /** + * Helper function to check if input is really a special character + * @param input + * @returns {boolean} + */ + this.isSpecialChar = function(input){ + return specialChars[input] !== undefined; + }; + + /** + * Helper function to get what the special character was supposed to be + * since Angular escapes the first backslash + * @param input + * @returns {special character string} + */ + this.getSpecialChar = function (input) { + return specialChars[input]; + }; + + }]); /** * ng-csv module @@ -200,8 +230,13 @@ angular.module('ngCsv.directives'). addByteOrderMarker: $scope.addByteOrderMarker }; if (angular.isDefined($attrs.csvHeader)) options.header = $scope.$eval($scope.header); + + options.fieldSep = $scope.fieldSep ? $scope.fieldSep : ","; + // Replaces any badly formatted special character string with correct special character + options.fieldSep = CSV.isSpecialChar(options.fieldSep) ? CSV.getSpecialChar(options.fieldSep) : options.fieldSep; + return options; } diff --git a/build/ng-csv.min.js b/build/ng-csv.min.js index 8ece3db..936c1b5 100644 --- a/build/ng-csv.min.js +++ b/build/ng-csv.min.js @@ -1,2 +1,2 @@ -/*! ng-csv 12-03-2015 */ -!function(a){angular.module("ngCsv.config",[]).value("ngCsv.config",{debug:!0}).config(["$compileProvider",function(a){angular.isDefined(a.urlSanitizationWhitelist)?a.urlSanitizationWhitelist(/^\s*(https?|ftp|mailto|file|data):/):a.aHrefSanitizationWhitelist(/^\s*(https?|ftp|mailto|file|data):/)}]),angular.module("ngCsv.directives",["ngCsv.services"]),angular.module("ngCsv.services",[]),angular.module("ngCsv",["ngCsv.config","ngCsv.services","ngCsv.directives","ngSanitize"]),angular.module("ngCsv.services").service("CSV",["$q",function(a){var b="\r\n",c="";this.stringifyField=function(a,b){return"locale"===b.decimalSep&&this.isFloat(a)?a.toLocaleString():"."!==b.decimalSep&&this.isFloat(a)?a.toString().replace(".",b.decimalSep):"string"==typeof a?(a=a.replace(/"/g,'""'),(b.quoteStrings||a.indexOf(",")>-1||a.indexOf("\n")>-1||a.indexOf("\r")>-1)&&(a=b.txtDelim+a+b.txtDelim),a):"boolean"==typeof a?a?"TRUE":"FALSE":a},this.isFloat=function(a){return+a===a&&(!isFinite(a)||Boolean(a%1))},this.stringify=function(d,e){var f=a.defer(),g=this,h="",i="",j=a.when(d).then(function(a){if(a=angular.copy(a),angular.isDefined(e.header)&&e.header){var d,j;d=[],angular.forEach(e.header,function(a){this.push(g.stringifyField(a,e))},d),j=d.join(e.fieldSep?e.fieldSep:","),i+=j+b}var k=[];angular.isArray(a)?k=a:angular.isFunction(a)&&(k=a()),angular.forEach(k,function(a,c){var d,f;f=[],angular.forEach(a,function(a){this.push(g.stringifyField(a,e))},f),d=f.join(e.fieldSep?e.fieldSep:","),i+=c");g.attr("href",a.URL.createObjectURL(d)),g.attr("download",b.getFilename()),g.attr("target","_blank"),e.find("body").append(g),f(function(){g[0].click(),g.remove()},null)}}c.bind("click",function(){b.buildCSV().then(function(){d()}),b.$apply()})}}}])}(window,document); \ No newline at end of file +/*! ng-csv 25-04-2015 */ +!function(a){angular.module("ngCsv.config",[]).value("ngCsv.config",{debug:!0}).config(["$compileProvider",function(a){angular.isDefined(a.urlSanitizationWhitelist)?a.urlSanitizationWhitelist(/^\s*(https?|ftp|mailto|file|data):/):a.aHrefSanitizationWhitelist(/^\s*(https?|ftp|mailto|file|data):/)}]),angular.module("ngCsv.directives",["ngCsv.services"]),angular.module("ngCsv.services",[]),angular.module("ngCsv",["ngCsv.config","ngCsv.services","ngCsv.directives","ngSanitize"]),angular.module("ngCsv.services").service("CSV",["$q",function(a){var b="\r\n",c="",d={"\\t":" ","\\b":"\b","\\v":" ","\\f":"\f","\\r":"\r"};this.stringifyField=function(a,b){return"locale"===b.decimalSep&&this.isFloat(a)?a.toLocaleString():"."!==b.decimalSep&&this.isFloat(a)?a.toString().replace(".",b.decimalSep):"string"==typeof a?(a=a.replace(/"/g,'""'),(b.quoteStrings||a.indexOf(",")>-1||a.indexOf("\n")>-1||a.indexOf("\r")>-1)&&(a=b.txtDelim+a+b.txtDelim),a):"boolean"==typeof a?a?"TRUE":"FALSE":a},this.isFloat=function(a){return+a===a&&(!isFinite(a)||Boolean(a%1))},this.stringify=function(d,e){var f=a.defer(),g=this,h="",i="",j=a.when(d).then(function(a){if(angular.isDefined(e.header)&&e.header){var d,j;d=[],angular.forEach(e.header,function(a){this.push(g.stringifyField(a,e))},d),j=d.join(e.fieldSep?e.fieldSep:","),i+=j+b}var k=[];angular.isArray(a)?k=a:angular.isFunction(a)&&(k=a()),angular.forEach(k,function(a,c){var d,f,h=angular.copy(k[c]);f=[],angular.forEach(h,function(a){this.push(g.stringifyField(a,e))},f),d=f.join(e.fieldSep?e.fieldSep:","),i+=c");g.attr("href",a.URL.createObjectURL(d)),g.attr("download",b.getFilename()),g.attr("target","_blank"),e.find("body").append(g),f(function(){g[0].click(),g.remove()},null)}}c.bind("click",function(){b.buildCSV().then(function(){d()}),b.$apply()})}}}])}(window,document); \ No newline at end of file diff --git a/package.json b/package.json index 5ca35ed..ef78d52 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ng-csv", - "version": "0.3.2", + "version": "0.3.3", "main": "build/ng-csv.min.js", "description": "Simple directive that turns arrays and objects into downloadable CSV files", "repository": {