Skip to content

Commit a5590ca

Browse files
committed
automatic converting from non-utf to utf encoding for Assets
1 parent 98586f5 commit a5590ca

File tree

7 files changed

+11
-14
lines changed

7 files changed

+11
-14
lines changed

app/models/kms/asset.rb

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ class Asset < ActiveRecord::Base
77
# inspired by Locomotive
88
before_validation :store_text
99

10-
validate :encoded_as_utf8, on: :create
1110
validate :unique_filename, on: :create
1211

1312
attr_accessor :text, :performing_plain_text
@@ -57,7 +56,10 @@ def store_text
5756

5857
return if !text_or_javascript? || data.blank?
5958

60-
sanitized_source = replace_urls(data)
59+
cd = CharDet.detect(data)
60+
encoded_source = data.force_encoding(cd['encoding']).encode('UTF-8') rescue data
61+
62+
sanitized_source = replace_urls(encoded_source)
6163

6264
self.file = ::CarrierWave::SanitizedFile.new({
6365
tempfile: StringIO.new(sanitized_source),
@@ -69,12 +71,6 @@ def store_text
6971

7072
protected
7173

72-
def encoded_as_utf8
73-
text.encode('UTF-8')
74-
rescue Encoding::UndefinedConversionError
75-
self.errors.add(:file, I18n.t(:wrong_encoding, scope: [:activerecord, :errors, :messages]))
76-
end
77-
7874
def unique_filename
7975
if Asset.where(file: file.filename).exists?
8076
self.errors.add(:file, I18n.t(:duplicate, scope: [:activerecord, :errors, :messages]))

config/locales/en.yml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -174,7 +174,6 @@ en:
174174
activerecord:
175175
errors:
176176
messages:
177-
wrong_encoding: "is not in UTF-8 encoding"
178177
duplicate: "is duplicate"
179178
models:
180179
kms/page:

config/locales/ru.yml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -174,7 +174,6 @@ ru:
174174
activerecord:
175175
errors:
176176
messages:
177-
wrong_encoding: "с некорректной кодировкой (необходима UTF-8)"
178177
duplicate: "с таким именем уже существует"
179178
models:
180179
kms/page:

kms.gemspec

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ Gem::Specification.new do |s|
3131
s.add_dependency 'dragonfly', '~> 1.1.3'
3232
s.add_dependency 'pg', '~> 0.21'
3333
s.add_dependency 'textacular', '~> 5.0.0'
34+
s.add_dependency 'rchardet', '~> 1.7.0'
3435

3536
s.add_development_dependency 'combustion', '~> 0.5.4'
3637
s.add_development_dependency 'factory_girl_rails'

lib/kms/dependencies.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,3 +13,4 @@
1313
require 'cancancan'
1414
require 'dragonfly'
1515
require 'textacular'
16+
require 'rchardet'

spec/internal/public/invalid_encoding.css

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
��� ������� �����������
2+
Êîäèðîâêà cp1251
33
*/
44
body {
55
font-size: 20px;

spec/models/kms/asset_spec.rb

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,10 @@
33
module Kms
44
describe Kms::Asset, type: :model do
55
context 'when file uploaded in not UTF-8 encoding' do
6-
let(:asset) { FactoryGirl.build(:invalid_encoding_css_asset) }
7-
it 'should be invalid' do
8-
expect(asset).to_not be_valid
6+
let(:asset) { FactoryGirl.create(:invalid_encoding_css_asset) }
7+
it 'will be converted into utf-8' do
8+
cd = CharDet.detect(asset.text)
9+
expect(cd['encoding']).to eq 'utf-8'
910
end
1011
end
1112

0 commit comments

Comments
 (0)