mail-jenc 1.0.4 → 1.0.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 32da2bde725e3d20eab75a686cc14d111d9be8c01f5ab2b54fbd2fa57e8b9ad0
4
- data.tar.gz: 65503198ba6b1e3ddcfd27c495614e003c1e368ae6ec2b2935da219e9e3d6d2b
3
+ metadata.gz: dfee35d6df629f80ba43bf19452f290442843ca98012c672d60077efd6e21834
4
+ data.tar.gz: 39712976e5b7dcf560fe7c969176243a540f8080cb3b17e0cd82878bba312aa5
5
5
  SHA512:
6
- metadata.gz: dd7a383c86ccfbccd98f10f7ad2b0c517afa1b2588bdbe5cf3401d3dd24c633847f11d2c5cbd2e9461d163a565aa28911e21d9de58018a4e685b03bc2042e3e8
7
- data.tar.gz: 142b1c5a9ed24ed17f0f1ee3b0ab6a141d61156f1b824130d93a3ed8e19d6643e17c75929a235389d957993a7127e959ace8a97b7b1013f7f5400a8b87b4953f
6
+ metadata.gz: 00c777f94d40b33f15f1effe417674639002db244af18f1e19f08577d1b4e1b80dc036241acc96bc1c396fc7984c40e9cb0ad936a7afe767c4030724875e6aa4
7
+ data.tar.gz: fc6e89e2d1fe3293d3f82631eaa15e1f4093feceb0a677b413e7af447d71ee0c31cacf3f999d6860c8a813c1c1e4ea1c8f5fbf30894defb6c1b1f1740ae5efaf
@@ -5,14 +5,13 @@ module Mail
5
5
  if Jenc.enabled?
6
6
  if name && !name.ascii_only? && name.encoding == Encoding::UTF_8 && value.is_a?(Hash) && (charset = value.delete(:header_charset))
7
7
  mime_type = set_mime_type(name)
8
- transcoded = Mail::Encodings.transcode_charset(name, name.encoding, charset)
9
- if value.key?(:rfc2231) ? value[:rfc2231] : Jenc.rfc2231
10
- encoded = RFC2231Encoder.encode(transcoded, charset: charset)
8
+ if (value.key?(:rfc2231) ? value.delete(:rfc2231) : Jenc.rfc2231)
9
+ encoded = RFC2231Encoder.encode(name, charset)
11
10
  value[:content_disposition] ||= %Q|#{@content_disposition_type}; #{encoded}|
12
- encoded = Mail::Encodings.b_value_encode(transcoded)
11
+ encoded = BEncoder.encode(name, charset)
13
12
  value[:content_type] ||= %Q|#{mime_type}; name="#{encoded}"|
14
13
  else
15
- encoded = Mail::Encodings.b_value_encode(transcoded)
14
+ encoded = BEncoder.encode(name, charset)
16
15
  value[:content_disposition] ||= %Q|#{@content_disposition_type}; filename="#{encoded}"|
17
16
  value[:content_type] ||= %Q|#{mime_type}; name="#{encoded}"|
18
17
  end
@@ -0,0 +1,35 @@
1
+ module Mail
2
+ module Jenc
3
+ class BEncoder
4
+ class << self
5
+ def encode(str, charset)
6
+ if Jenc.escape_sequence_charsets.include?(charset.to_s.downcase)
7
+ split(str).map { |s| transcode_and_encode(s, charset) }.join(' ')
8
+ else
9
+ transcode_and_encode(str, charset)
10
+ end
11
+ end
12
+
13
+ private
14
+
15
+ def transcode_and_encode(str, charset)
16
+ Mail::Encodings.b_value_encode(Mail::Encodings.transcode_charset(str, str.encoding, charset))
17
+ end
18
+
19
+ def split(str, max: 40)
20
+ results = []
21
+ work = ''
22
+ str.chars.each do |char|
23
+ if work.bytesize + char.bytesize >= max
24
+ results << work
25
+ work = ''
26
+ end
27
+ work += char
28
+ end
29
+ results << work unless work.empty?
30
+ results
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
@@ -7,9 +7,7 @@ module Mail
7
7
  list = Mail::AddressList.new(value)
8
8
  list.addresses.each do |addr|
9
9
  if addr.display_name && !addr.display_name.ascii_only?
10
- addr.display_name = Mail::Encodings.b_value_encode(
11
- Mail::Encodings.transcode_charset(addr.display_name, addr.display_name.encoding, charset)
12
- )
10
+ addr.display_name = BEncoder.encode(addr.display_name, charset)
13
11
  end
14
12
  end
15
13
  value = list.addresses.map(&:encoded).join(', ')
@@ -5,9 +5,7 @@ module Mail
5
5
  if Jenc.enabled?
6
6
  if value.is_a?(String) && value.encoding == Encoding::UTF_8 && charset && charset.downcase != 'utf-8'
7
7
  if !value.ascii_only?
8
- value = Mail::Encodings.b_value_encode(
9
- Mail::Encodings.transcode_charset(value, value.encoding, charset)
10
- )
8
+ value = BEncoder.encode(value, charset)
11
9
  elsif value !~ Mail::Encodings::ENCODED_VALUE
12
10
  charset = 'us-ascii'
13
11
  end
@@ -5,7 +5,7 @@ module Mail
5
5
  if Jenc.enabled?
6
6
  if value.is_a?(String) && !value.ascii_only? && value.encoding == Encoding::UTF_8 && charset && charset.downcase != 'utf-8' && @transport_encoding.to_s != '8bit'
7
7
  value = Mail::Encodings.transcode_charset(value, value.encoding, charset)
8
- value.force_encoding('us-ascii') if @transport_encoding.to_s == '7bit'
8
+ value.force_encoding('us-ascii') if @transport_encoding.to_s == '7bit' && charset.downcase == 'iso-2022-jp'
9
9
  value = @transport_encoding.encode(value)
10
10
  end
11
11
  end
@@ -0,0 +1,15 @@
1
+ module Mail
2
+ module Jenc
3
+ class PercentEncoder
4
+ class << self
5
+ def encode(str)
6
+ encode_to_array(str).join
7
+ end
8
+
9
+ def encode_to_array(str)
10
+ str.unpack('H*').first.scan(/.{2}/).map { |hex| "%#{hex.upcase}" }
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
@@ -1,25 +1,15 @@
1
1
  module Mail
2
2
  module Jenc
3
- module PercentEncoder
3
+ class RFC2231Encoder
4
4
  class << self
5
- def encode(str)
6
- encode_to_array(str).join
5
+ def encode(name, charset, **options)
6
+ encode_to_hash(name, charset, **options).map { |k, v| "#{k}=#{v}" }.join(";\r\n\s")
7
7
  end
8
8
 
9
- def encode_to_array(str)
10
- str.unpack('H*').first.scan(/.{2}/).map { |hex| "%#{hex.upcase}" }
11
- end
12
- end
13
- end
14
-
15
- module RFC2231Encoder
16
- class << self
17
- def encode(name, options = {})
18
- encode_to_hash(name, options).map { |k, v| "#{k}=#{v}" }.join(";\r\n\s")
19
- end
20
-
21
- def encode_to_hash(name, key: 'filename', charset: 'utf-8')
22
- hexes = name.unpack('H*')[0].scan(/.{2}/).map { |hex| "%#{hex.upcase}" }
9
+ def encode_to_hash(name, charset, key: 'filename')
10
+ hexes = PercentEncoder.encode_to_array(
11
+ Mail::Encodings.transcode_charset(name, name.encoding, charset)
12
+ )
23
13
 
24
14
  first_hex_num = hex_num(charset.size + key.size + 3)
25
15
  if hexes.size <= first_hex_num
@@ -1,5 +1,5 @@
1
1
  module Mail
2
2
  module Jenc
3
- VERSION = '1.0.4'
3
+ VERSION = '1.0.8'
4
4
  end
5
5
  end
data/lib/mail/jenc.rb CHANGED
@@ -9,6 +9,7 @@ module Mail
9
9
  class << self
10
10
  attr_reader :enabled
11
11
  attr_accessor :rfc2231
12
+ attr_accessor :escape_sequence_charsets
12
13
  attr_accessor :preferred_charsets
13
14
 
14
15
  def enabled?
@@ -26,6 +27,7 @@ module Mail
26
27
 
27
28
  self.enable
28
29
  self.rfc2231 = false
30
+ self.escape_sequence_charsets = ['iso-2022-jp']
29
31
  self.preferred_charsets = {
30
32
  'iso-2022-jp' => 'cp50221',
31
33
  'shift_jis' => 'cp932'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mail-jenc
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.4
4
+ version: 1.0.8
5
5
  platform: ruby
6
6
  authors:
7
7
  - Yoshikazu Kaneta
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-03-25 00:00:00.000000000 Z
11
+ date: 2021-12-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: mail
@@ -77,10 +77,12 @@ files:
77
77
  - Rakefile
78
78
  - lib/mail/jenc.rb
79
79
  - lib/mail/jenc/attachments_list_patch.rb
80
- - lib/mail/jenc/encoder.rb
80
+ - lib/mail/jenc/b_encoder.rb
81
81
  - lib/mail/jenc/fields/address_field_patch.rb
82
82
  - lib/mail/jenc/fields/unstructured_field_patch.rb
83
83
  - lib/mail/jenc/message_patch.rb
84
+ - lib/mail/jenc/percent_encoder.rb
85
+ - lib/mail/jenc/rfc2231_encoder.rb
84
86
  - lib/mail/jenc/ruby_1_9_patch.rb
85
87
  - lib/mail/jenc/version.rb
86
88
  homepage: https://github.com/kanety/mail-jenc
@@ -102,7 +104,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
102
104
  - !ruby/object:Gem::Version
103
105
  version: '0'
104
106
  requirements: []
105
- rubygems_version: 3.0.1
107
+ rubygems_version: 3.0.3
106
108
  signing_key:
107
109
  specification_version: 4
108
110
  summary: A mail patch for encoding conventional mail