| 
									
										
										
										
											2015-06-13 07:33:20 +00:00
										 |  |  | # encoding: utf-8 | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | # Redmine - project management software | 
					
						
							| 
									
										
										
										
											2017-06-25 08:40:31 +00:00
										 |  |  | # Copyright (C) 2006-2017  Jean-Philippe Lang | 
					
						
							| 
									
										
										
										
											2015-06-13 07:33:20 +00:00
										 |  |  | # | 
					
						
							|  |  |  | # This program is free software; you can redistribute it and/or | 
					
						
							|  |  |  | # modify it under the terms of the GNU General Public License | 
					
						
							|  |  |  | # as published by the Free Software Foundation; either version 2 | 
					
						
							|  |  |  | # of the License, or (at your option) any later version. | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | # This program is distributed in the hope that it will be useful, | 
					
						
							|  |  |  | # but WITHOUT ANY WARRANTY; without even the implied warranty of | 
					
						
							|  |  |  | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | 
					
						
							|  |  |  | # GNU General Public License for more details. | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | # You should have received a copy of the GNU General Public License | 
					
						
							|  |  |  | # along with this program; if not, write to the Free Software | 
					
						
							|  |  |  | # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | require 'csv' | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | module Redmine | 
					
						
							|  |  |  |   module Export | 
					
						
							|  |  |  |     module CSV | 
					
						
							|  |  |  |       def self.generate(*args, &block) | 
					
						
							|  |  |  |         Base.generate(*args, &block) | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       class Base < ::CSV | 
					
						
							|  |  |  |         include Redmine::I18n | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         class << self | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-07 01:13:12 +00:00
										 |  |  |           def generate(options = {}, &block) | 
					
						
							| 
									
										
										
										
											2015-06-13 07:33:20 +00:00
										 |  |  |             col_sep = l(:general_csv_separator) | 
					
						
							| 
									
										
										
										
											2018-05-07 01:13:12 +00:00
										 |  |  |             encoding = Encoding.find(options[:encoding]) rescue Encoding.find(l(:general_csv_encoding)) | 
					
						
							| 
									
										
										
										
											2015-06-13 07:33:20 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-06-13 07:55:30 +00:00
										 |  |  |             str = ''.force_encoding(encoding) | 
					
						
							| 
									
										
										
										
											2018-05-07 01:13:12 +00:00
										 |  |  |             if encoding == Encoding::UTF_8 | 
					
						
							| 
									
										
										
										
											2015-06-13 07:55:30 +00:00
										 |  |  |               # BOM | 
					
						
							|  |  |  |               str = "\xEF\xBB\xBF".force_encoding(encoding) | 
					
						
							|  |  |  |             end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             super(str, :col_sep => col_sep, :encoding => encoding, &block) | 
					
						
							| 
									
										
										
										
											2015-06-13 07:33:20 +00:00
										 |  |  |           end | 
					
						
							|  |  |  |         end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         def <<(row) | 
					
						
							|  |  |  |           row = row.map do |field| | 
					
						
							|  |  |  |             case field | 
					
						
							|  |  |  |             when String | 
					
						
							|  |  |  |               Redmine::CodesetUtil.from_utf8(field, self.encoding.name) | 
					
						
							|  |  |  |             when Float | 
					
						
							|  |  |  |               @decimal_separator ||= l(:general_csv_decimal_separator) | 
					
						
							|  |  |  |               ("%.2f" % field).gsub('.', @decimal_separator) | 
					
						
							|  |  |  |             else | 
					
						
							|  |  |  |               field | 
					
						
							|  |  |  |             end | 
					
						
							|  |  |  |           end | 
					
						
							|  |  |  |           super row | 
					
						
							|  |  |  |         end | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | end |