Skip to content

Commit

Permalink
Implement quotes config optionally as function (#703)
Browse files Browse the repository at this point in the history
  • Loading branch information
Puzzleton authored and pokoli committed Aug 29, 2019
1 parent 874161a commit 80a1044
Show file tree
Hide file tree
Showing 3 changed files with 21 additions and 7 deletions.
2 changes: 1 addition & 1 deletion docs/docs.html
Expand Up @@ -282,7 +282,7 @@ <h5>Unparse Config Options</h5>
<code>quotes</code>
</td>
<td>
If <code>true</code>, forces all fields to be enclosed in quotes. If an array of <code>true/false</code> values, specifies which fields should be force-quoted (first boolean is for the first column, second boolean for the second column, ...).
If <code>true</code>, forces all fields to be enclosed in quotes. If an array of <code>true/false</code> values, specifies which fields should be force-quoted (first boolean is for the first column, second boolean for the second column, ...). A function that returns a boolean values can be used to determine the quotes value of a cell. This function accepts the cell value and column index as parameters.
</td>
</tr>
<tr>
Expand Down
14 changes: 8 additions & 6 deletions papaparse.js
Expand Up @@ -334,6 +334,7 @@ License: MIT
}

if (typeof _config.quotes === 'boolean'
|| typeof _config.quotes === 'function'
|| Array.isArray(_config.quotes))
_quotes = _config.quotes;

Expand Down Expand Up @@ -446,16 +447,17 @@ License: MIT
if (str.constructor === Date)
return JSON.stringify(str).slice(1, 25);

str = str.toString().replace(quoteCharRegex, _escapedQuote);
var escapedQuoteStr = str.toString().replace(quoteCharRegex, _escapedQuote);

var needsQuotes = (typeof _quotes === 'boolean' && _quotes)
|| (typeof _quotes === 'function' && _quotes(str, col))
|| (Array.isArray(_quotes) && _quotes[col])
|| hasAny(str, Papa.BAD_DELIMITERS)
|| str.indexOf(_delimiter) > -1
|| str.charAt(0) === ' '
|| str.charAt(str.length - 1) === ' ';
|| hasAny(escapedQuoteStr, Papa.BAD_DELIMITERS)
|| escapedQuoteStr.indexOf(_delimiter) > -1
|| escapedQuoteStr.charAt(0) === ' '
|| escapedQuoteStr.charAt(escapedQuoteStr.length - 1) === ' ';

return needsQuotes ? _quoteChar + str + _quoteChar : str;
return needsQuotes ? _quoteChar + escapedQuoteStr + _quoteChar : escapedQuoteStr;
}

function hasAny(str, substrings)
Expand Down
12 changes: 12 additions & 0 deletions tests/test-cases.js
Expand Up @@ -1711,6 +1711,18 @@ var UNPARSE_TESTS = [
config: { quotes: [true, false, true] },
expected: '"Col1",Col2,"Col3"\r\n"a",b,"c"\r\n"d",e,"f"'
},
{
description: "Force quotes around string fields only",
input: [['a', 'b', 'c'], ['d', 10, true]],
config: { quotes: function(value) { return typeof value === 'string'; } },
expected: '"a","b","c"\r\n"d",10,true'
},
{
description: "Force quotes around string fields only (with header row)",
input: [{ "Col1": "a", "Col2": "b", "Col3": "c" }, { "Col1": "d", "Col2": 10, "Col3": true }],
config: { quotes: function(value) { return typeof value === 'string'; } },
expected: '"Col1","Col2","Col3"\r\n"a","b","c"\r\n"d",10,true'
},
{
description: "Empty input",
input: [],
Expand Down

0 comments on commit 80a1044

Please sign in to comment.