summaryrefslogtreecommitdiff
path: root/lib/csv/writer.rb
diff options
context:
space:
mode:
Diffstat (limited to 'lib/csv/writer.rb')
-rw-r--r--lib/csv/writer.rb65
1 files changed, 37 insertions, 28 deletions
diff --git a/lib/csv/writer.rb b/lib/csv/writer.rb
index 2f2ab095d7..36db9d4014 100644
--- a/lib/csv/writer.rb
+++ b/lib/csv/writer.rb
@@ -31,7 +31,10 @@ class CSV
@headers ||= row if @use_headers
@lineno += 1
- line = row.collect(&@quote).join(@column_separator) + @row_separator
+ converted_row = row.collect do |field|
+ quote(field)
+ end
+ line = converted_row.join(@column_separator) + @row_separator
if @output_encoding
line = line.encode(@output_encoding)
end
@@ -90,37 +93,16 @@ class CSV
else
@row_separator = row_separator.to_s.encode(@encoding)
end
- quote_character = @options[:quote_character]
- quote = lambda do |field|
- field = String(field)
- encoded_quote_character = quote_character.encode(field.encoding)
- encoded_quote_character +
- field.gsub(encoded_quote_character,
- encoded_quote_character * 2) +
- encoded_quote_character
- end
- if @options[:force_quotes]
- @quote = quote
- else
- quotable_pattern =
+ @quote_character = @options[:quote_character]
+ @force_quotes = @options[:force_quotes]
+ unless @force_quotes
+ @quotable_pattern =
Regexp.new("[\r\n".encode(@encoding) +
Regexp.escape(@column_separator) +
- Regexp.escape(quote_character.encode(@encoding)) +
+ Regexp.escape(@quote_character.encode(@encoding)) +
"]".encode(@encoding))
- @quote = lambda do |field|
- if field.nil? # represent +nil+ fields as empty unquoted fields
- ""
- else
- field = String(field) # Stringify fields
- # represent empty fields as empty quoted fields
- if field.empty? or quotable_pattern.match?(field)
- quote.call(field)
- else
- field # unquoted field
- end
- end
- end
end
+ @quote_empty = @options.fetch(:quote_empty, true)
end
def prepare_output
@@ -140,5 +122,32 @@ class CSV
end
end
end
+
+ def quote_field(field)
+ field = String(field)
+ encoded_quote_character = @quote_character.encode(field.encoding)
+ encoded_quote_character +
+ field.gsub(encoded_quote_character,
+ encoded_quote_character * 2) +
+ encoded_quote_character
+ end
+
+ def quote(field)
+ if @force_quotes
+ quote_field(field)
+ else
+ if field.nil? # represent +nil+ fields as empty unquoted fields
+ ""
+ else
+ field = String(field) # Stringify fields
+ # represent empty fields as empty quoted fields
+ if (@quote_empty and field.empty?) or @quotable_pattern.match?(field)
+ quote_field(field)
+ else
+ field # unquoted field
+ end
+ end
+ end
+ end
end
end