diff --git a/text_formatter.go b/text_formatter.go index 2d15a23..431b5fd 100644 --- a/text_formatter.go +++ b/text_formatter.go @@ -37,6 +37,9 @@ type TextFormatter struct { // Force quoting of all values ForceQuote bool + // DisableQuote disables quoting for all values + DisableQuote bool + // Override coloring based on CLICOLOR and CLICOLOR_FORCE. - https://bixense.com/clicolors/ EnvironmentOverrideColors bool @@ -292,6 +295,9 @@ func (f *TextFormatter) needsQuoting(text string) bool { if f.QuoteEmptyFields && len(text) == 0 { return true } + if f.DisableQuote { + return false + } for _, ch := range text { if !((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z') || diff --git a/text_formatter_test.go b/text_formatter_test.go index 5d94ebb..5b1cc0a 100644 --- a/text_formatter_test.go +++ b/text_formatter_test.go @@ -59,6 +59,7 @@ func TestQuoting(t *testing.T) { checkQuoting(false, "foo@bar") checkQuoting(false, "foobar^") checkQuoting(false, "+/-_^@f.oobar") + checkQuoting(true, "foo\n\rbar") checkQuoting(true, "foobar$") checkQuoting(true, "&foobar") checkQuoting(true, "x y") @@ -70,13 +71,30 @@ func TestQuoting(t *testing.T) { tf.QuoteEmptyFields = true checkQuoting(true, "") checkQuoting(false, "abcd") + checkQuoting(true, "foo\n\rbar") checkQuoting(true, errors.New("invalid argument")) // Test forcing quotes. tf.ForceQuote = true checkQuoting(true, "") checkQuoting(true, "abcd") + checkQuoting(true, "foo\n\rbar") checkQuoting(true, errors.New("invalid argument")) + + // Test forcing quotes when also disabling them. + tf.DisableQuote = true + checkQuoting(true, "") + checkQuoting(true, "abcd") + checkQuoting(true, "foo\n\rbar") + checkQuoting(true, errors.New("invalid argument")) + + // Test disabling quotes + tf.ForceQuote = false + tf.QuoteEmptyFields = false + checkQuoting(false, "") + checkQuoting(false, "abcd") + checkQuoting(false, "foo\n\rbar") + checkQuoting(false, errors.New("invalid argument")) } func TestEscaping(t *testing.T) {