| 
									
										
										
										
											2019-03-17 06:10:53 +00:00
										 |  |  | # frozen_string_literal: true | 
					
						
							| 
									
										
										
										
											2019-03-15 01:32:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-06-13 07:33:20 +00:00
										 |  |  | # Redmine - project management software | 
					
						
							| 
									
										
										
										
											2023-01-01 06:19:35 +00:00
										 |  |  | # Copyright (C) 2006-2023  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 | 
					
						
							| 
									
										
										
										
											2023-01-17 01:31:06 +00:00
										 |  |  |       def self.generate(...) | 
					
						
							|  |  |  |         Base.generate(...) | 
					
						
							| 
									
										
										
										
											2015-06-13 07:33:20 +00:00
										 |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       class Base < ::CSV | 
					
						
							|  |  |  |         include Redmine::I18n | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         class << self | 
					
						
							| 
									
										
										
										
											2018-05-07 01:13:12 +00:00
										 |  |  |           def generate(options = {}, &block) | 
					
						
							| 
									
										
										
										
											2023-10-21 06:19:13 +00:00
										 |  |  |             col_sep = (options[:field_separator].presence || 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
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-03-17 06:10:53 +00:00
										 |  |  |             str = | 
					
						
							|  |  |  |               if encoding == Encoding::UTF_8 | 
					
						
							|  |  |  |                 +"\xEF\xBB\xBF" # BOM | 
					
						
							|  |  |  |               else | 
					
						
							|  |  |  |                 (+'').force_encoding(encoding) | 
					
						
							|  |  |  |               end | 
					
						
							| 
									
										
										
										
											2015-06-13 07:55:30 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |             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 | 
					
						
							| 
									
										
										
										
											2023-12-20 07:15:11 +00:00
										 |  |  |           super(row) | 
					
						
							| 
									
										
										
										
											2015-06-13 07:33:20 +00:00
										 |  |  |         end | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | end |