Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -273,6 +273,7 @@ In order to get the most of out of this module, you can customize many parameter
- Use `;` for (**windows excel .csv format**).
- `textDelimiter` - `String` The character used to escape the text content if needed (default to `"`)
- `forceTextDelimiter` - `Boolean` Set this option to true to wrap every data item and header in the textDelimiter. Defaults to `false`
- `forceTextStrings` - `Boolean` Set this option to true to wrap every string data item and header in the textDelimiter. Defaults to `false`
- `endOfLine` - `String` Replace the OS default EOL.
- `mainPathItem` - `String` Every header will have the `mainPathItem` as the base.
- `arrayPathString` - `String` This is used to output primitive arrays in a single column, defaults to `;`
Expand Down
9 changes: 6 additions & 3 deletions dist/core/escape-delimiters.js
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
For example: "aaa","b""bb","ccc"
*/

module.exports = function escapedDelimiters(textDelimiter, rowDelimiter, forceTextDelimiter) {
module.exports = function escapedDelimiters(textDelimiter, rowDelimiter, forceTextDelimiter, forceTextStrings) {
var endOfLine = '\n';

if (typeof textDelimiter !== 'string') {
Expand All @@ -30,14 +30,17 @@ module.exports = function escapedDelimiters(textDelimiter, rowDelimiter, forceTe
};

return function (value) {
if (forceTextDelimiter) value = "" + value;
var force = forceTextDelimiter;
if (forceTextStrings && typeof value === 'string') force = true;

if (force) value = "" + value;

if (!value.replace) return value;
// Escape the textDelimiters contained in the field
value = value.replace(textDelimiterRegex, escapedDelimiter);

// Escape the whole field if it contains a rowDelimiter or a linebreak or double quote
if (forceTextDelimiter || enclosingCondition(value)) {
if (force || enclosingCondition(value)) {
value = textDelimiter + value + textDelimiter;
}

Expand Down
3 changes: 2 additions & 1 deletion dist/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,8 @@ module.exports = function () {
includeHeaders: true, // Boolean
fillGaps: false, // Boolean
verticalOutput: true, // Boolean
forceTextDelimiter: false //Boolean
forceTextDelimiter: false, //Boolean
forceTextStrings: false // Boolean
};
// argument parsing
var json = void 0,
Expand Down
4 changes: 2 additions & 2 deletions dist/parser/csv.js
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ var Parser = function () {
this._options = options || {};
this._handler = new Handler(this._options);
this._headers = this._options.headers || [];
this._escape = require('../core/escape-delimiters')(this._options.textDelimiter, this._options.rowDelimiter, this._options.forceTextDelimiter);
this._escape = require('../core/escape-delimiters')(this._options.textDelimiter, this._options.rowDelimiter, this._options.forceTextDelimiter, this._options.forceTextStrings);
}

/**
Expand Down Expand Up @@ -237,7 +237,7 @@ var Parser = function () {
return _this._options.rename[_this._options.headers.indexOf(header)] || header;
});

if (this._options.forceTextDelimiter) {
if (this._options.forceTextDelimiter || this._options.forceTextStrings) {
headers = headers.map(function (header) {
return '' + _this._options.textDelimiter + header + _this._options.textDelimiter;
});
Expand Down
9 changes: 6 additions & 3 deletions lib/core/escape-delimiters.js
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
For example: "aaa","b""bb","ccc"
*/

module.exports = function escapedDelimiters(textDelimiter, rowDelimiter, forceTextDelimiter) {
module.exports = function escapedDelimiters(textDelimiter, rowDelimiter, forceTextDelimiter, forceTextStrings) {
let endOfLine = '\n';

if (typeof textDelimiter !== 'string') {
Expand All @@ -31,14 +31,17 @@ module.exports = function escapedDelimiters(textDelimiter, rowDelimiter, forceTe
value.indexOf(endOfLine) >= 0);

return function(value) {
if(forceTextDelimiter) value = "" + value;
let force=forceTextDelimiter;
if(forceTextStrings && typeof(value)==='string') force=true;

if(force) value = "" + value;

if (!value.replace) return value;
// Escape the textDelimiters contained in the field
value = value.replace(textDelimiterRegex, escapedDelimiter);

// Escape the whole field if it contains a rowDelimiter or a linebreak or double quote
if (forceTextDelimiter || enclosingCondition(value)) {
if (force || enclosingCondition(value)) {
value = textDelimiter + value + textDelimiter;
}

Expand Down
1 change: 1 addition & 0 deletions lib/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ module.exports = function() {
fillGaps: false, // Boolean
verticalOutput: true, // Boolean
forceTextDelimiter: false, //Boolean
forceTextStrings: false, // Boolean
};
// argument parsing
let json, userOptions, callback;
Expand Down
5 changes: 3 additions & 2 deletions lib/parser/csv.js
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,8 @@ class Parser {
this._escape = require('../core/escape-delimiters')(
this._options.textDelimiter,
this._options.rowDelimiter,
this._options.forceTextDelimiter
this._options.forceTextDelimiter,
this._options.forceTextStrings
);
}

Expand All @@ -41,7 +42,7 @@ class Parser {
if (this._options.rename && this._options.rename.length > 0)
headers = headers.map((header) => this._options.rename[this._options.headers.indexOf(header)] || header);

if (this._options.forceTextDelimiter) {
if (this._options.forceTextDelimiter || this._options.forceTextStrings) {
headers = headers.map((header) => {
return `${this._options.textDelimiter}${header}${this._options.textDelimiter}`;
});
Expand Down
18 changes: 16 additions & 2 deletions tests/escape-delimiters.js
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,8 @@ describe('escapeDelimiters', () => {
simpleRow: 'I am a \n multi line field',
complexField: 'I am a \n multi line field containing "textDelimiters"',
alreadyEscaped: '"I contain "double quotes" everywhere !"',
forceEscape: 42
forceEscape: 42,
forceString: "Sample",
};

it('should escape textDelimiters', () => {
Expand All @@ -38,9 +39,22 @@ describe('escapeDelimiters', () => {
});

it('should escape if forceTextDelimiter flag is true', () => {
var escapeDelimiters = require('../lib/core/escape-delimiters')('"', '\n', true);
const escapeDelimiters = require('../lib/core/escape-delimiters')('"', '\n', true);

expect(escapeDelimiters(mocks.forceEscape)).to.be.a.string;
expect(escapeDelimiters(mocks.forceEscape)).to.be.equal('"42"');
});

it('should escape if forceTextStrings flag is true', () => {
const escapeDelimiters = require('../lib/core/escape-delimiters')('"', '\n', false, true);

expect(escapeDelimiters(mocks.forceString)).to.be.a.string;
expect(escapeDelimiters(mocks.forceString)).to.be.equal('"Sample"');
});
it('should not escape if forceTextStrings flag is true', () => {
const escapeDelimiters = require('../lib/core/escape-delimiters')('"', '\n', false, true);

expect(escapeDelimiters(mocks.forceEscape)).to.be.a('number');
expect(escapeDelimiters(mocks.forceEscape)).to.be.equal(42);
});
});