Skip to content

Commit

Permalink
Merge pull request #31 from dozen1488/master
Browse files Browse the repository at this point in the history
  • Loading branch information
kauegimenes authored Jun 27, 2017
2 parents 26e5428 + 882db41 commit 0735628
Show file tree
Hide file tree
Showing 5 changed files with 21 additions and 8 deletions.
11 changes: 9 additions & 2 deletions lib/core/escape-delimiters.js
Original file line number Diff line number Diff line change
Expand Up @@ -23,12 +23,19 @@ module.exports = function escapedDelimiters(textDelimiter, rowDelimiter) {
let textDelimiterRegex = new RegExp("\\" + textDelimiter, 'g');
let escapedDelimiter = textDelimiter + textDelimiter;

const enclosingCondition = (textDelimiter === '"') ?
(value) => (value.indexOf(rowDelimiter) >= 0 ||
value.indexOf(endOfLine) >= 0 ||
value.indexOf('"') >= 0)
: (value) => (value.indexOf(rowDelimiter) >= 0 ||
value.indexOf(endOfLine) >= 0);

return function(value) {
if (!value.replace) return value;
// Escape the textDelimiters contained in the field
var newValue = value.replace(textDelimiterRegex, escapedDelimiter);
// Escape the whole field if it contains a rowDelimiter or a linebreak
if (newValue.indexOf(rowDelimiter) >= 0 || newValue.indexOf(endOfLine) >= 0) {
// Escape the whole field if it contains a rowDelimiter or a linebreak or double quote
if (enclosingCondition(value)) {
newValue = textDelimiter + newValue + textDelimiter;
}

Expand Down
2 changes: 1 addition & 1 deletion tests/array.js
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ describe('Array', () => {
lastname: 'David',
escaped: 'I am a "quoted" field'
}], {}, (err, csv) => {
expect(csv).to.equal(`name,lastname,escaped${os.EOL}Bob,Smith${os.EOL}James,David,I am a ""quoted"" field`);
expect(csv).to.equal(`name,lastname,escaped${os.EOL}Bob,Smith${os.EOL}James,David,"I am a ""quoted"" field"`);
});
});
it('complex', () => {
Expand Down
10 changes: 8 additions & 2 deletions tests/escape-delimiters.js
Original file line number Diff line number Diff line change
Expand Up @@ -12,12 +12,18 @@ describe('escapeDelimiters', () => {
const mocks = {
simpleText: 'I am a "quoted" field',
simpleRow: 'I am a \n multi line field',
complexField: 'I am a \n multi line field containing "textDelimiters"'
complexField: 'I am a \n multi line field containing "textDelimiters"',
alreadyEscaped: '"I contain "double quotes" everywhere !"'
};

it('should escape textDelimiters', () => {
expect(escapeDelimiters(mocks.simpleText)).to.be.a.string;
expect(escapeDelimiters(mocks.simpleText)).to.be.equal('I am a ""quoted"" field');
expect(escapeDelimiters(mocks.simpleText)).to.be.equal('"I am a ""quoted"" field"');
});

it('should escape all textDelimiters', () => {
expect(escapeDelimiters(mocks.alreadyEscaped)).to.be.a.string;
expect(escapeDelimiters(mocks.alreadyEscaped)).to.be.equal('"""I contain ""double quotes"" everywhere !"""');
});

it('should escape rowDelimiters', () => {
Expand Down
2 changes: 1 addition & 1 deletion tests/object.js
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ describe('Object', () => {
size: [10, 20],
escaped: 'I am a "quoted" field'
}, {}, (err, csv) => {
expect(csv).to.equal(`cars,12${os.EOL}roads,5${os.EOL}traffic,slow${os.EOL}speed.max,123${os.EOL}speed.avg,20${os.EOL}speed.min,5${os.EOL}size,10;20${os.EOL}escaped,I am a ""quoted"" field`);
expect(csv).to.equal(`cars,12${os.EOL}roads,5${os.EOL}traffic,slow${os.EOL}speed.max,123${os.EOL}speed.avg,20${os.EOL}speed.min,5${os.EOL}size,10;20${os.EOL}escaped,"I am a ""quoted"" field"`);
});
});
});
4 changes: 2 additions & 2 deletions tests/stream.js
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ describe('Stream', () => {
it('simple', (done) => {
var read = new stream.Readable();
var write = getWriteStream((csv) => {
expect(csv).to.equal(`name,lastname,escaped${os.EOL}Bob,Smith${os.EOL}James,David,I am a ""quoted"" field`);
expect(csv).to.equal(`name,lastname,escaped${os.EOL}Bob,Smith${os.EOL}James,David,"I am a ""quoted"" field"`);
done();
});

Expand All @@ -44,7 +44,7 @@ describe('Stream', () => {
it('simple with options', (done) => {
var read = new stream.Readable();
var write = getWriteStream((csv) => {
expect(csv).to.equal(`name|lastname|escaped${os.EOL}Bob|Smith${os.EOL}James|David|I am a ""quoted"" field`);
expect(csv).to.equal(`name|lastname|escaped${os.EOL}Bob|Smith${os.EOL}James|David|"I am a ""quoted"" field"`);
done();
});

Expand Down

0 comments on commit 0735628

Please sign in to comment.