Skip to content
Snippets Groups Projects
Commit bc6cf2e6 authored by juanf's avatar juanf
Browse files

SSDM-1648: Switch CSV to TSV format

SVN: 33784
parent 3688f383
No related branches found
No related tags found
No related merge requests found
Showing
with 70 additions and 2982 deletions
...@@ -57,13 +57,13 @@ ...@@ -57,13 +57,13 @@
<script type="text/javascript" src="./lib/jquery-blockui/js/jquery.blockUI.js"></script> <script type="text/javascript" src="./lib/jquery-blockui/js/jquery.blockUI.js"></script>
<script type="text/javascript" src="./lib/jquery-history/js/bundled/html5/jquery.history.js"></script> <script type="text/javascript" src="./lib/jquery-history/js/bundled/html5/jquery.history.js"></script>
<script type="text/javascript" src="./lib/jquery-tooltipster/js/jquery.tooltipster.min.js"></script> <script type="text/javascript" src="./lib/jquery-tooltipster/js/jquery.tooltipster.min.js"></script>
<script type="text/javascript" src="./lib/jquery-tsv/js/jquery.tsv-0.96.min.js"></script>
<script type="text/javascript" src="./lib/fuelux/js/fuelux.min.js"></script> <script type="text/javascript" src="./lib/fuelux/js/fuelux.min.js"></script>
<script type="text/javascript" src="./lib/d3/js/d3.min.js"></script> <script type="text/javascript" src="./lib/d3/js/d3.min.js"></script>
<script type="text/javascript" src="./lib/d3-dagre/js/dagre-d3.min.js"></script> <script type="text/javascript" src="./lib/d3-dagre/js/dagre-d3.min.js"></script>
<script type="text/javascript" src="./lib/naturalsort/js/naturalSort.js"></script> <script type="text/javascript" src="./lib/naturalsort/js/naturalSort.js"></script>
<script type="text/javascript" src="./lib/mozilla/js/infra.js"></script> <script type="text/javascript" src="./lib/mozilla/js/infra.js"></script>
<script type="text/javascript" src="./lib/filesaver/js/FileSaver.js"></script> <script type="text/javascript" src="./lib/filesaver/js/FileSaver.js"></script>
<script type="text/javascript" src="./lib/ucsv/js/ucsv-1.2.0.min.js"></script>
<script type="text/javascript" src="./lib/grid/js/Grid.js"></script> <script type="text/javascript" src="./lib/grid/js/Grid.js"></script>
<!-- ELN UI --> <!-- ELN UI -->
......
...@@ -158,9 +158,25 @@ $.extend(Grid.prototype, { ...@@ -158,9 +158,25 @@ $.extend(Grid.prototype, {
var thisGrid = this; var thisGrid = this;
var exportColumnsFromData = function(namePrefix, data, headings) { var exportColumnsFromData = function(namePrefix, data, headings) {
var csv = CSV.objectToCsv(data, {columns: headings}); var arrayOfRowArrays = [];
var blob = new Blob([csv], {type: 'text'}); arrayOfRowArrays.push(headings);
saveAs(blob,'exportedTable' + namePrefix + '.csv'); for(var dIdx = 0; dIdx < data.length; dIdx++) {
var rowAsArray = [];
for(var hIdx = 0; hIdx < headings.length; hIdx++) {
var headerKey = headings[hIdx];
var rowValue = data[dIdx][headerKey];
if(!rowValue) {
rowValue = "";
}
rowAsArray.push(rowValue);
}
arrayOfRowArrays.push(rowAsArray);
}
var tsv = $.tsv.formatRows(arrayOfRowArrays);
var indexOfFirstLine = tsv.indexOf('\n');
var tsvWithoutNumbers = tsv.substring(indexOfFirstLine + 1);
var blob = new Blob([tsvWithoutNumbers], {type: 'text'});
saveAs(blob,'exportedTable' + namePrefix + '.tsv');
} }
var headings = []; var headings = [];
......
Open Source - MIT License : http://www.opensource.org/licenses/mit-license.php
\ No newline at end of file
0.96
\ No newline at end of file
(function($){$.tsv={version:"0.96-git",options:{formatValue:null,parseValue:null,arrayToObject:null,objectToArray:null,includeHeader:true,stripHeader:false,startRownum:0,___defaults_applied:true,extend:$.extend,syntax:{parserKernel:tsvParserKernel,lexer:/[\t\r\n]|[^\t\r\n]+/g,valueSeparator:"\t",rowSeparator:"\n",formatterKernel:simpleFormatterKernel}},toArray:function toArray(line,options,rownum){var opts=tsvOptions(options);var result=parser(line,true,opts,rownum);switch(result.length){case 0:return[];case 1:return result[0];default:throw new Error("Parser returned too many values.");}},fromArray:function fromArray(array,options,rownum){var opts=tsvOptions(options);opts.includeHeader=(!options||options.includesHeader===undefined)?false:options.includesHeader;return $.tsv.fromArrays([array],opts,rownum);},toArrays:function toArrays(tsv,options){var opts=tsvOptions(options);var array=parser(tsv,false,opts);if(opts.stripHeader){array[-1]=array.shift();}
return array;},fromArrays:function fromArrays(array,options,startRownum){var opts=tsvOptions(options);var rownum=startRownum||opts.startRownum||0;var syntax=opts.syntax;var cols=tsvColumns(opts,array[0]);syntax.formatterKernel("begin");function doHeaderValue(value,col){syntax.formatterKernel("value",value,col,tsvColumn(syntax,col),-1);}
if(cols&&opts.includeHeader){syntax.formatterKernel("beginHeader");cols.forEach(doHeaderValue);syntax.formatterKernel("endHeader");}
var header_offset=0;function doRow(rowData,rowIndex){if(rowData===cols){header_offset=-1;}else{var row=rownum+rowIndex+header_offset;function doValue(value,col){syntax.formatterKernel("value",value,col,tsvColumn(opts,col),row);}
syntax.formatterKernel("beginRow");rowData.forEach(doValue);syntax.formatterKernel("endRow");}}
array.forEach(doRow);return syntax.formatterKernel("end");},arrayToObject:function arrayToObject(row,options,rownum){var opts=tsvOptions(options);rownum=rownum||0;var columns=tsvColumns(opts,row);if(opts.arrayToObject){return opts.arrayToObject(row,opts,rownum);}
var dict={};for(var j=0;j<columns.length;j++){dict[columns[j]]=row[j];}
return dict;},arraysToObjects:function arraysToObjects(array,options){var opts=tsvOptions(options);if(!opts.columns){opts.columns=array.shift();}
var rownum=opts.startRownum||0;return array.map(function convert(row){return $.tsv.arrayToObject(row,opts,rownum++);});},toObjects:function toObjects(tsv,options){var opts=tsvOptions(options);return $.tsv.arraysToObjects($.tsv.toArrays(tsv,opts),opts);},objectToArray:function objectToArray(obj,options,rownum){var opts=tsvOptions(options);var columns=tsvColumns(opts,obj);rownum=rownum||0;if(opts.objectToArray){return opts.objectToArray(obj,opts,rownum);}
var row=[];for(var j=0;j<columns.length;j++){row.push(obj[columns[j]]);}
return row;},objectsToArrays:function objectsToArrays(array,options){var opts=tsvOptions(options);var rownum=options.startRownum;var result=array.map(function convert(obj){return $.tsv.objectToArray(obj,opts,rownum++);});return result;},fromObject:function fromObject(object,options){var opts=tsvOptions(options);return $.tsv.fromArray($.tsv.objectToArray(object,opts),opts);},fromObjects:function fromObjects(array,options){var opts=tsvOptions(options);var first=array.length?array[0]:{};tsvColumns(opts,first);return $.tsv.fromArrays($.tsv.objectsToArrays(array,opts),opts);},extend:$.extend,test:{formatValue:formatValue,parseValue:parseValue}};function parseValue(value,options,colnum,colname,rownum){var opts=tsvOptions(options);if(opts.parseValue){return opts.parseValue(value,opts,colnum,colname,rownum);}
return value;}
function formatValue(value,options,rownum,colnum,colname,rownum){var opts=tsvOptions(options);if(opts.formatValue){return opts.formatValue(value,opts,colnum,colname,rownum);}
return String(value);}
function copyOptions(options){return $.extend({__copy:true},options);}
function tsvOptions(options){if(options){if(options.__defaults_applied){return options;}
return $.extend(copyOptions($.tsv.options),options);}
return copyOptions($.tsv.options);}
function tsvColumn(options,index){var opts=tsvOptions(options);return String(opts.columns?opts.columns[index]:index);}
function tsvColumns(options,top){if(options.columns){return options.columns;}else{var cols=Object.keys(top||{}).sort();options.columns=cols;return cols;}}
function parser(str,single,options,startRow){var opts=tsvOptions(options);var colIdx=0;var rowIdx=startRow||0;function endOfValue(value){value=(value!==undefined)?value:this.value;value=parseValue(value,opts,colIdx,tsvColumn(opts,colIdx),rowIdx);this.row.push(value);this.value="";colIdx++;}
function endOfRow(row){row=(row!==undefined)?row:this.row;this.array.push(row);this.row=[];if(this.single){this.array=this.endOfTable();}
rowIdx++;colIdx=0;}
function endOfHeader(headers){this.headers=(headers||this.headers);}
function endOfTable(result){result=(result!==undefined)?result:this.array;if(!this.done){this.done=true;if(opts.finalize){return opts.finalize.call(this,result);}}
return result;}
var state={options:opts,single:single,state:-1,value:"",row:[],array:[],headers:[],done:false,error:false,endOfValue:endOfValue,endOfRow:endOfRow,endOfTable:endOfTable,endOfHeader:endOfHeader};if(opts.syntax.initializeParser){opts.syntax.initializeParser.call(state,state);}
opts.syntax.lexer.lastIndex=0;str.replace(opts.syntax.lexer,function transition(m0,m1){if(!state.done){opts.syntax.parserKernel.apply(state,arguments);}
if(state.error){throw new Error((typeof error==="string")?state.error:"parsing error");}
return"";});if(!state.done){opts.syntax.parserKernel.apply(state,[]);}
return state.endOfTable();}
function tsvParserKernel(m){switch(m){case"\n":case undefined:if(!this.valueSeen){this.endOfValue("");}
this.endOfRow();this.valueSeen=false;break;case"\r":break;case"\t":if(!this.valueSeen){this.endOfValue("");}
this.valueSeen=false;break;default:this.endOfValue(m);this.valueSeen=true;}}
function simpleFormatterKernel(event,param){switch(event){case"begin":this.valueSeen=false;this.rowSeen=false;this.output=[];break;case"beginRow":case"beginHeader":if(this.rowSeen){this.output.push(this.rowSeparator);}
this.valueSeen=false;break;case"value":if(this.valueSeen){this.output.push(this.valueSeparator);}
this.output.push(param);this.valueSeen=true;break;case"endRow":case"endHeader":this.rowSeen=true;break;case"end":var result=this.output.join("");delete this.output;return result;default:throw new Error("Unknown formatter event: "+event);}}
$.tsv.parseRow=$.tsv.toArray;$.tsv.parseRows=$.tsv.toArrays;$.tsv.parseObject=$.tsv.toObject;$.tsv.parseObjects=$.tsv.toObjects;$.tsv.formatRow=$.tsv.fromArray;$.tsv.formatRows=$.tsv.fromArrays;$.tsv.formatObject=$.tsv.fromObject;$.tsv.formatObjects=$.tsv.fromObjects;if(!$.csv){$.csv=$.tsv.extend({},{toArrays:function csvToArrays(csv,options){var opts=tsvOptions(options);var state=0;var value="";var result=[];var row=[];function endOfCell(){row.push(value);value="";state=0;}
function endOfRow(){row.push(value);result.push(row);row=[];state=0;}
s.replace(/(\"|,|\n|\r|[^\",\r\n]+)/gm,function(m0,m1){switch(state){case 0:if(m1==="\""){state=1;}else if(m1===","){endOfCell();}else if(m1==="\n"){endOfRow();}else if(/^\r$/.test(m1)){}else{if(value){throw new Error("Internal error: we have a value already.");}
value=m1;state=3;}
break;case 1:if(m1==="\""){state=2;}else if((m1===",")||(m1==="\n")||(m1==="\r")){value+=m1;state=1;}else{value+=m1;state=1;}
break;case 2:if(m1==="\""){value+=m1;state=1;}else if(m1===","){endOfCell();}else if(m1==="\n"){endOfRow();}else if(m1==="\r"){}else{throw new Error("Illegal state");}
break;case 3:if(m1==="\""){throw new Error("Unquoted delimiter in string");}else if(m1===","){endOfCell();}else if(m1==="\n"){endOfRow();}else if(m1==="\r"){}else{throw new Error("Two values, no separator?");}
break;default:throw new Error("Unknown state");}
return"";});if(state!=0){endOfRow();}
return result;}});}})(jQuery);
\ No newline at end of file
MIT, GPL-3
\ No newline at end of file
1.2
\ No newline at end of file
/*global strictEqual, module */
(function () {
"use strict";
module('arrayToCsv');
test('arrayToCsv strings', function () {
var csvArray = [
['XBOX "XBONE" One', 2013],
['Nintendo 64, AKA Nintendo Ultra 64', 1996],
['Playstation\n4', 2013]
],
expected = '"XBOX ""XBONE"" One",2013\n' +
'"Nintendo 64, AKA Nintendo Ultra 64",1996\n' +
'"Playstation\n4",2013\n',
csv = CSV.arrayToCsv(csvArray);
strictEqual(csv, expected, 'Outputted correct CSV');
});
test('arrayToCsv integers', function () {
var csvArray = [[1, 2, 3], [4, 5, 6]],
csv = CSV.arrayToCsv(csvArray),
expected = '1,2,3\n4,5,6\n';
strictEqual(csv, expected, 'Outputted correct CSV');
});
test('arrayToCsv no trim', function () {
var csvArray = [['no need to trim', ' should not trim 1', 'should not trim 2 ', ' should not trim 3 ']],
csv = CSV.arrayToCsv(csvArray),
expected = 'no need to trim," should not trim 1","should not trim 2 "," should not trim 3 "\n';
strictEqual(csv, expected);
});
test('arrayToCsv nulls are empty fields', function () {
var csvArray = [["Tom", null, "Harry"]],
csv = CSV.arrayToCsv(csvArray),
expected = 'Tom,,Harry\n';
strictEqual(csv, expected);
});
test('arrayToCsv undefined values are empty fields', function () {
var csvArray = [["Tom", undefined, "Harry"]],
csv = CSV.arrayToCsv(csvArray),
expected = 'Tom,,Harry\n';
strictEqual(csv, expected);
});
test('arrayToCsv integers and quoted integers', function () {
var csvArray = [[1, 2, "3"]],
csv = CSV.arrayToCsv(csvArray),
expected = '1,2,"3"\n';
strictEqual(csv, expected);
});
test('arrayToCsv floats and quoted floats', function () {
var csvArray = [[1.5, 2.2, "3.14"]],
csv = CSV.arrayToCsv(csvArray),
expected = '1.5,2.2,"3.14"\n';
strictEqual(csv, expected);
});
test('arrayToCsv empty strings are empty strings', function () {
var csvArray = [["a", "", "b"]],
csv = CSV.arrayToCsv(csvArray),
expected = 'a,"",b\n';
strictEqual(csv, expected);
});
test('arrayToCsv newline in string', function () {
var csvArray = [["a", "b\nc", "d"]],
csv = CSV.arrayToCsv(csvArray),
expected = 'a,"b\nc",d\n';
strictEqual(csv, expected);
});
}());
/*global deepEqual, module */
(function () {
"use strict";
module('csvToArray');
test('csvToArray strings', function () {
var csv = '"XBOX ""XBONE"" One",2013\n' +
'"Nintendo 64, AKA Nintendo Ultra 64",1996\n' +
'"Playstation\n4",2013\n',
expected = [
['XBOX "XBONE" One', 2013],
['Nintendo 64, AKA Nintendo Ultra 64', 1996],
['Playstation\n4', 2013]
],
result = CSV.csvToArray(csv);
deepEqual(result, expected);
});
test('csvToArray integers', function () {
var csv = '1,2,3\n4,5,6',
expected = [
[1, 2, 3],
[4, 5, 6]
],
result = CSV.csvToArray(csv);
deepEqual(result, expected);
});
test('csvToArray no config', function () {
var csv = 'no need to trim, should not trim 1,should not trim 2 , should not trim 3 \n"quoted 1"," quoted 2","quoted 3 "," quoted 4 "',
expected = [
['no need to trim', ' should not trim 1', 'should not trim 2 ', ' should not trim 3 '],
['quoted 1', ' quoted 2', 'quoted 3 ', ' quoted 4 ']
],
result = CSV.csvToArray(csv);
deepEqual(result, expected);
});
test('csvToArray integers', function () {
var csv = '1,2,3\n4,5,6',
expected = [
[1, 2, 3],
[4, 5, 6]
],
result = CSV.csvToArray(csv);
deepEqual(result, expected);
});
test('csvToArray integers with trailing newline', function () {
var csv = '1,2,3\n4,5,6\n',
expected = [
[1, 2, 3],
[4, 5, 6]
],
result = CSV.csvToArray(csv);
deepEqual(result, expected);
});
test('csvToArray config === false', function () {
var csv = 'no need to trim, should not trim 1,should not trim 2 , should not trim 3 \n"quoted 1"," quoted 2","quoted 3 "," quoted 4 "',
expected = [
['no need to trim', ' should not trim 1', 'should not trim 2 ', ' should not trim 3 '],
['quoted 1', ' quoted 2', 'quoted 3 ', ' quoted 4 ']
],
result = CSV.csvToArray(csv, false);
deepEqual(result, expected);
});
test('csvToArray config === true (legacy trim)', function () {
var csv = 'no need to trim, should trim 1,should trim 2 , should trim 3 \n"quoted 1"," quoted 2","quoted 3 "," quoted 4 "',
expected = [
['no need to trim', 'should trim 1', 'should trim 2', 'should trim 3'],
['quoted 1', ' quoted 2', 'quoted 3 ', ' quoted 4 ']
],
result = CSV.csvToArray(csv, true);
deepEqual(result, expected);
});
test('csvToArray config trim', function () {
var csv = 'no need to trim, should trim 1,should trim 2 , should trim 3 \n"quoted 1"," quoted 2","quoted 3 "," quoted 4 "',
expected = [
['no need to trim', 'should trim 1', 'should trim 2', 'should trim 3'],
['quoted 1', ' quoted 2', 'quoted 3 ', ' quoted 4 ']
],
result = CSV.csvToArray(csv, {trim: true});
deepEqual(result, expected);
});
test('csvToArray empty fields are null', function () {
var csv = 'Billy West, Fry\nDavid X. Cohen,\nJohn Di Maggio,Bender',
expected = [
['Billy West', 'Fry'],
['David X. Cohen', null],
['John Di Maggio', 'Bender']
],
result = CSV.csvToArray(csv, true);
deepEqual(result, expected);
});
test('csvToArray integers and quoted integers', function () {
var csv = '1,2,"3"',
expected = [
[1, 2, '3']
],
result = CSV.csvToArray(csv, true);
deepEqual(result, expected);
});
test('csvToArray floats and quoted floats', function () {
var csv = '1.5,2.2,"3.14"',
expected = [
[1.5, 2.2, '3.14']
],
result = CSV.csvToArray(csv, true);
deepEqual(result, expected);
});
test('csvToArray numbers are interpreted as numbers even when not trimming fields', function () {
var csv = ' 1 , 2, 3.14',
expected = [
[1, 2, 3.14]
],
result = CSV.csvToArray(csv, true);
ok(Array.isArray(result), 'Result is an array');
deepEqual(result, expected);
});
test('csvToArray newline in string', function () {
var csv = 'a,"b\nc",d',
expected = [
['a', 'b\nc', 'd']
],
result = CSV.csvToArray(csv, true);
deepEqual(result, expected);
});
}());
/*global deepEqual, module */
(function () {
"use strict";
module('csvToObject');
// All the actual parsing is done by csvToArray, so these tests do not thoroughly cover all aspects
// of the parsing, only things particular to csvToObject since the other details of parsing are already
// tested in the tests for csvToArray.
test('csvToObject explicit headings, no trim', function () {
var headings = [' console ', 'introduced'],
csv = 'XBOX , 2001\n' +
'Nintendo 64,1996\n' +
' Playstation,1994\n',
expected = [
{
' console ': 'XBOX ',
'introduced': 2001,
},
{
' console ': 'Nintendo 64',
'introduced': 1996
},
{
' console ': ' Playstation',
'introduced': 1994
}
],
result = CSV.csvToObject(csv, {columns: headings});
deepEqual(result, expected);
});
test('csvToObject implicit headings, no trim', function () {
var csv = ' console ,introduced\n' +
'XBOX , 2001\n' +
'Nintendo 64,1996\n' +
' Playstation,1994\n',
expected = [
{
' console ': 'XBOX ',
'introduced': 2001,
},
{
' console ': 'Nintendo 64',
'introduced': 1996
},
{
' console ': ' Playstation',
'introduced': 1994
}
],
result = CSV.csvToObject(csv);
deepEqual(result, expected);
});
test('csvToObject explicit headings with trim', function () {
var headings = [' console ', 'introduced'],
csv = 'XBOX , 2001\n' +
'Nintendo 64,1996\n' +
' Playstation,1994\n',
expected = [
{
' console ': 'XBOX',
'introduced': 2001,
},
{
' console ': 'Nintendo 64',
'introduced': 1996
},
{
' console ': 'Playstation',
'introduced': 1994
}
],
result = CSV.csvToObject(csv, {columns: headings, trim: true});
deepEqual(result, expected);
});
test('csvToObject implicit headings', function () {
var csv = ' console , introduced\n' +
'XBOX , 2001\n' +
'Nintendo 64,1996\n' +
' Playstation,1994\n',
expected = [
{
'console': 'XBOX',
'introduced': 2001,
},
{
'console': 'Nintendo 64',
'introduced': 1996
},
{
'console': 'Playstation',
'introduced': 1994
}
],
result = CSV.csvToObject(csv, {trim: true});
deepEqual(result, expected);
});
}());
/*!
* QUnit 1.13.0
* http://qunitjs.com/
*
* Copyright 2013 jQuery Foundation and other contributors
* Released under the MIT license
* http://jquery.org/license
*
* Date: 2014-01-04T17:09Z
*/
/** Font Family and Sizes */
#qunit-tests, #qunit-header, #qunit-banner, #qunit-testrunner-toolbar, #qunit-userAgent, #qunit-testresult {
font-family: "Helvetica Neue Light", "HelveticaNeue-Light", "Helvetica Neue", Calibri, Helvetica, Arial, sans-serif;
}
#qunit-testrunner-toolbar, #qunit-userAgent, #qunit-testresult, #qunit-tests li { font-size: small; }
#qunit-tests { font-size: smaller; }
/** Resets */
#qunit-tests, #qunit-header, #qunit-banner, #qunit-userAgent, #qunit-testresult, #qunit-modulefilter {
margin: 0;
padding: 0;
}
/** Header */
#qunit-header {
padding: 0.5em 0 0.5em 1em;
color: #8699a4;
background-color: #0d3349;
font-size: 1.5em;
line-height: 1em;
font-weight: normal;
border-radius: 5px 5px 0 0;
-moz-border-radius: 5px 5px 0 0;
-webkit-border-top-right-radius: 5px;
-webkit-border-top-left-radius: 5px;
}
#qunit-header a {
text-decoration: none;
color: #c2ccd1;
}
#qunit-header a:hover,
#qunit-header a:focus {
color: #fff;
}
#qunit-testrunner-toolbar label {
display: inline-block;
padding: 0 .5em 0 .1em;
}
#qunit-banner {
height: 5px;
}
#qunit-testrunner-toolbar {
padding: 0.5em 0 0.5em 2em;
color: #5E740B;
background-color: #eee;
overflow: hidden;
}
#qunit-userAgent {
padding: 0.5em 0 0.5em 2.5em;
background-color: #2b81af;
color: #fff;
text-shadow: rgba(0, 0, 0, 0.5) 2px 2px 1px;
}
#qunit-modulefilter-container {
float: right;
}
/** Tests: Pass/Fail */
#qunit-tests {
list-style-position: inside;
}
#qunit-tests li {
padding: 0.4em 0.5em 0.4em 2.5em;
border-bottom: 1px solid #fff;
list-style-position: inside;
}
#qunit-tests.hidepass li.pass, #qunit-tests.hidepass li.running {
display: none;
}
#qunit-tests li strong {
cursor: pointer;
}
#qunit-tests li a {
padding: 0.5em;
color: #c2ccd1;
text-decoration: none;
}
#qunit-tests li a:hover,
#qunit-tests li a:focus {
color: #000;
}
#qunit-tests li .runtime {
float: right;
font-size: smaller;
}
.qunit-assert-list {
margin-top: 0.5em;
padding: 0.5em;
background-color: #fff;
border-radius: 5px;
-moz-border-radius: 5px;
-webkit-border-radius: 5px;
}
.qunit-collapsed {
display: none;
}
#qunit-tests table {
border-collapse: collapse;
margin-top: .2em;
}
#qunit-tests th {
text-align: right;
vertical-align: top;
padding: 0 .5em 0 0;
}
#qunit-tests td {
vertical-align: top;
}
#qunit-tests pre {
margin: 0;
white-space: pre-wrap;
word-wrap: break-word;
}
#qunit-tests del {
background-color: #e0f2be;
color: #374e0c;
text-decoration: none;
}
#qunit-tests ins {
background-color: #ffcaca;
color: #500;
text-decoration: none;
}
/*** Test Counts */
#qunit-tests b.counts { color: black; }
#qunit-tests b.passed { color: #5E740B; }
#qunit-tests b.failed { color: #710909; }
#qunit-tests li li {
padding: 5px;
background-color: #fff;
border-bottom: none;
list-style-position: inside;
}
/*** Passing Styles */
#qunit-tests li li.pass {
color: #3c510c;
background-color: #fff;
border-left: 10px solid #C6E746;
}
#qunit-tests .pass { color: #528CE0; background-color: #D2E0E6; }
#qunit-tests .pass .test-name { color: #366097; }
#qunit-tests .pass .test-actual,
#qunit-tests .pass .test-expected { color: #999999; }
#qunit-banner.qunit-pass { background-color: #C6E746; }
/*** Failing Styles */
#qunit-tests li li.fail {
color: #710909;
background-color: #fff;
border-left: 10px solid #EE5757;
white-space: pre;
}
#qunit-tests > li:last-child {
border-radius: 0 0 5px 5px;
-moz-border-radius: 0 0 5px 5px;
-webkit-border-bottom-right-radius: 5px;
-webkit-border-bottom-left-radius: 5px;
}
#qunit-tests .fail { color: #000000; background-color: #EE5757; }
#qunit-tests .fail .test-name,
#qunit-tests .fail .module-name { color: #000000; }
#qunit-tests .fail .test-actual { color: #EE5757; }
#qunit-tests .fail .test-expected { color: green; }
#qunit-banner.qunit-fail { background-color: #EE5757; }
/** Result */
#qunit-testresult {
padding: 0.5em 0.5em 0.5em 2.5em;
color: #2b81af;
background-color: #D2E0E6;
border-bottom: 1px solid white;
}
#qunit-testresult .module-name {
font-weight: bold;
}
/** Fixture */
#qunit-fixture {
position: absolute;
top: -10000px;
left: -10000px;
width: 1000px;
height: 1000px;
}
/*global strictEqual, module */
(function () {
"use strict";
module('objectToCsv');
test('objectToCsv explicit headings', function () {
var headings = ['console', 'introduced'],
objs = [
{
'console': 'XBOX',
'introduced': 2001,
},
{
'console': 'Nintendo 64',
'introduced': 1996
},
{
'console': 'Playstation',
'introduced': 1994
}
],
expected = 'console,introduced\n' +
'XBOX,2001\n' +
'Nintendo 64,1996\n' +
'Playstation,1994\n',
result = CSV.objectToCsv(objs, {columns: headings});
strictEqual(result, expected);
});
test('objectToCsv implicit headings', function () {
var objs = [
{
'console': 'XBOX',
'introduced': 2001,
},
{
'console': 'Nintendo 64',
'introduced': 1996
},
{
'console': 'Playstation',
'introduced': 1994
}
],
expected = 'console,introduced\n' +
'XBOX,2001\n' +
'Nintendo 64,1996\n' +
'Playstation,1994\n',
result = CSV.objectToCsv(objs);
strictEqual(result, expected);
});
test('objectToCsv implicit headings, missing and extra fields', function () {
var objs = [
{
'console': 'XBOX',
'introduced': 2001,
},
{
'console': 'Nintendo 64',
'discontinued': 2003
},
{
'console': 'Playstation',
'introduced': 1994
}
],
expected = 'console,introduced,discontinued\n' +
'XBOX,2001,\n' +
'Nintendo 64,,2003\n' +
'Playstation,1994,\n',
result = CSV.objectToCsv(objs);
strictEqual(result, expected);
});
test('objectToCsv explicit headings, missing and extra fields', function () {
var headings = ['console', 'introduced'],
objs = [
{
'console': 'XBOX',
'introduced': 2001,
},
{
'console': 'Nintendo 64',
'discontinued': 2003
},
{
'console': 'Playstation',
'introduced': 1994
}
],
expected = 'console,introduced\n' +
'XBOX,2001\n' +
'Nintendo 64,\n' +
'Playstation,1994\n',
result = CSV.objectToCsv(objs, {columns: headings});
strictEqual(result, expected);
});
test('objectToCsv with includeColumns = true', function () {
var headings = ['console', 'introduced'],
objs = [
{
'console': 'XBOX',
'introduced': 2001,
},
{
'console': 'Nintendo 64',
'introduced': 1996
},
{
'console': 'Playstation',
'introduced': 1994
}
],
expected = 'console,introduced\n' +
'XBOX,2001\n' +
'Nintendo 64,1996\n' +
'Playstation,1994\n',
result = CSV.objectToCsv(objs, {columns: headings, includeColumns: true});
strictEqual(result, expected);
});
test('objectToCsv with includeColumns = false', function () {
var headings = ['console', 'introduced'],
objs = [
{
'console': 'XBOX',
'introduced': 2001,
},
{
'console': 'Nintendo 64',
'introduced': 1996
},
{
'console': 'Playstation',
'introduced': 1994
}
],
expected = 'XBOX,2001\n' +
'Nintendo 64,1996\n' +
'Playstation,1994\n',
result = CSV.objectToCsv(objs, {columns: headings, includeColumns: false});
strictEqual(result, expected);
});
test('objectToCsv with commas double quotes and newlines', function () {
var headings = ['console', 'introduced'],
objs = [
{
'console': 'XBOX "XBONE" One',
'introduced': 2013,
},
{
'console': 'Nintendo 64, AKA Nintendo Ultra 64',
'introduced': 1996
},
{
'console': 'Playstation\n4',
'introduced': 2013
}
],
expected = '"XBOX ""XBONE"" One",2013\n' +
'"Nintendo 64, AKA Nintendo Ultra 64",1996\n' +
'"Playstation\n4",2013\n',
result = CSV.objectToCsv(objs, {columns: headings, includeColumns: false});
strictEqual(result, expected);
});
}());
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>QUnit Example</title>
<link rel="stylesheet" href="lib/qunit-1.13.0.css">
</head>
<body>
<div id="qunit"></div>
<div id="qunit-fixture"></div>
<script src="lib/qunit-1.13.0.js"></script>
<script src="../ucsv-1.2.0.min.js"></script>
<script src="csvToObject.js"></script>
<script src="objectToCsv.js"></script>
<script src="csvToArray.js"></script>
<script src="arrayToCsv.js"></script>
</body>
</html>
/*! ucsv v1.2.0 2014-04-09
* Copyright 2014 Peter Johnson
* Licensed MIT, GPL-3.0
* https://github.com/uselesscode/ucsv
*/
var CSV=function(){"use strict";var a=/^\d+$/,b=/^\d*\.\d+$|^\d+\.\d*$/,c=/^\s|\s$|,|"|\n/,d=function(){return String.prototype.trim?function(a){return a.trim()}:function(a){return a.replace(/^\s*/,"").replace(/\s*$/,"")}}(),e=function(a){return"[object Number]"===Object.prototype.toString.apply(a)},f=function(a){return"[object String]"===Object.prototype.toString.apply(a)},g=function(a){return"\n"!==a.charAt(a.length-1)?a:a.substring(0,a.length-1)},h=function(d){return f(d)?(d=d.replace(/"/g,'""'),c.test(d)||a.test(d)||b.test(d)?d='"'+d+'"':""===d&&(d='""')):d=e(d)?d.toString(10):null===d||void 0===d?"":d.toString(),d},i={arrayToCsv:function(a){var b,c,d,e,f="";for(d=0;d<a.length;d+=1){for(c=a[d],e=0;e<c.length;e+=1)b=c[e],b=h(b),f+=e<c.length-1?b+",":b;f+="\n"}return f},csvToArray:function(c,e){c=g(c),e=e===!0?{trim:!0}:e||{};var f,h="",i=!1,j=!1,k="",l=[],m=[],n=e.trim===!0?!0:!1,o=function(c){var e=d(c);return j!==!0&&(""===c?c=null:n===!0&&(c=e),(a.test(e)||b.test(e))&&(c=+e)),c};for(f=0;f<c.length;f+=1)h=c.charAt(f),i!==!1||","!==h&&"\n"!==h?'"'!==h?k+=h:i?'"'===c.charAt(f+1)?(k+='"',f+=1):i=!1:(i=!0,j=!0):(k=o(k),l.push(k),"\n"===h&&(m.push(l),l=[]),k="",j=!1);return k=o(k),l.push(k),m.push(l),m},csvToObject:function(a,b){b=void 0!==b?b:{};var c=b.columns,d=!!b.trim,e=this.csvToArray(a,d);return c||(c=e.shift()),e.map(function(a){for(var b={},d=0,e=c.length;e>d;d+=1)b[c[d]]=a[d];return b})},objectToCsv:function(a,b){b=void 0!==b?b:{};var c=b.columns,d=b.includeColumns,e="",f="",g=function(b){var d,e,f,g="",i=a.length,j=c.length;for(e=0;i>e;e+=1){for(b=a[e],f=0;j>f;f+=1)d=c[f],g+=h(b[d]),g+=j-1>f?",":"";g+="\n"}return g},i=function(){var b,d,e,f,g,i,j,k=[],l=a.length,m=[];for(g=0;l>g;g+=1){e=a[g],j=[];for(f in e)e.hasOwnProperty(f)&&(i=k.indexOf(f),-1===i&&(i=k.push(f),i-=1),j[i]=h(e[f]));0===g&&(b=j.length),m.push(j)}return d=k.length,b!==d&&m.forEach(function(a){a.length=d}),c=k,m.map(function(a){return a.join(",")}).join("\n")+"\n"};return d=void 0===d?!0:!!d,e=void 0!==c?g():i(),d&&(c.forEach(function(a){f+=h(a)+","}),f=f.substring(0,f.length-1),e=f+"\n"+e),e}};return"object"==typeof exports&&(exports.arrayToCsv=i.arrayToCsv,exports.csvToArray=i.csvToArray,exports.objectToCsv=i.objectToCsv,exports.csvToObject=i.csvToObject),i}();
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment