charwidth 0.1.5 → 0.2.0
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 +4 -4
- data/.rubocop.yml +127 -0
- data/Gemfile +9 -1
- data/README.md +9 -3
- data/bin/rspec +29 -0
- data/bin/rubocop +29 -0
- data/charwidth.gemspec +6 -13
- data/lib/charwidth.rb +17 -13
- data/lib/charwidth/active_model.rb +24 -0
- data/lib/charwidth/characters.rb +13 -13
- data/lib/charwidth/cli.rb +6 -6
- data/lib/charwidth/version.rb +1 -1
- data/spec/charwidth/active_model_spec.rb +44 -0
- data/spec/charwidth_spec.rb +1 -2
- data/spec/spec_helper.rb +7 -6
- metadata +16 -110
- data/lib/charwidth/active_record.rb +0 -27
- data/spec/charwidth/active_record_spec.rb +0 -39
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4a160471d7981b5ac57ce572d4f1bd4e718c30d01572865089ca8ae594fb512b
|
4
|
+
data.tar.gz: c85aae5292b8aff58894f9af501dfd3c3bc4ee6d2848f6df44e3882399b4c473
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d6ee373af2b62eadff932a240cd06e12493a1e3b7681bcbf4053a75cc9d351f27f59751c1c7c705615659b67554f278245a41fc1a0255dcfe8df672dd5d376c0
|
7
|
+
data.tar.gz: 694fde3a7d2b19c772de341a3a6a478cc4befde8fc1ba7c2da0109c994fd58c3bce410abbd473396e6de8f6e8ec5043aa60f34ab88682f7319e48261efa63301
|
data/.rubocop.yml
ADDED
@@ -0,0 +1,127 @@
|
|
1
|
+
AllCops:
|
2
|
+
Exclude:
|
3
|
+
- bin/*
|
4
|
+
- node_modules/**/*
|
5
|
+
NewCops: enable
|
6
|
+
|
7
|
+
Layout/CaseIndentation:
|
8
|
+
EnforcedStyle: end
|
9
|
+
|
10
|
+
Layout/EndAlignment:
|
11
|
+
EnforcedStyleAlignWith: variable
|
12
|
+
|
13
|
+
Layout/LineLength:
|
14
|
+
Enabled: false
|
15
|
+
|
16
|
+
Layout/EmptyLinesAroundAccessModifier:
|
17
|
+
EnforcedStyle: only_before
|
18
|
+
|
19
|
+
Layout/SpaceInLambdaLiteral:
|
20
|
+
EnforcedStyle: require_space
|
21
|
+
|
22
|
+
Layout/SpaceInsideBlockBraces:
|
23
|
+
SpaceBeforeBlockParameters: false
|
24
|
+
|
25
|
+
Layout/SpaceInsideHashLiteralBraces:
|
26
|
+
EnforcedStyle: no_space
|
27
|
+
|
28
|
+
Metrics/AbcSize:
|
29
|
+
Enabled: false
|
30
|
+
|
31
|
+
Metrics/BlockLength:
|
32
|
+
Enabled: false
|
33
|
+
|
34
|
+
Metrics/ClassLength:
|
35
|
+
Enabled: false
|
36
|
+
|
37
|
+
Metrics/CyclomaticComplexity:
|
38
|
+
Enabled: false
|
39
|
+
|
40
|
+
Metrics/MethodLength:
|
41
|
+
Enabled: false
|
42
|
+
|
43
|
+
Metrics/ModuleLength:
|
44
|
+
Enabled: false
|
45
|
+
|
46
|
+
Metrics/PerceivedComplexity:
|
47
|
+
Enabled: false
|
48
|
+
|
49
|
+
Naming/HeredocDelimiterNaming:
|
50
|
+
Enabled: false
|
51
|
+
|
52
|
+
Naming/MethodParameterName:
|
53
|
+
Enabled: false
|
54
|
+
|
55
|
+
Naming/PredicateName:
|
56
|
+
Enabled: false
|
57
|
+
|
58
|
+
Style/Alias:
|
59
|
+
EnforcedStyle: prefer_alias_method
|
60
|
+
|
61
|
+
Style/AsciiComments:
|
62
|
+
Enabled: false
|
63
|
+
|
64
|
+
Style/BlockDelimiters:
|
65
|
+
Enabled: false
|
66
|
+
|
67
|
+
Style/Documentation:
|
68
|
+
Enabled: false
|
69
|
+
|
70
|
+
Style/EmptyCaseCondition:
|
71
|
+
Enabled: false
|
72
|
+
|
73
|
+
Style/EmptyMethod:
|
74
|
+
EnforcedStyle: expanded
|
75
|
+
|
76
|
+
Style/FrozenStringLiteralComment:
|
77
|
+
Enabled: false
|
78
|
+
|
79
|
+
Style/HashSyntax:
|
80
|
+
Exclude:
|
81
|
+
- Rakefile
|
82
|
+
- "**/*.rake"
|
83
|
+
|
84
|
+
Style/Lambda:
|
85
|
+
EnforcedStyle: literal
|
86
|
+
|
87
|
+
Style/IfUnlessModifier:
|
88
|
+
Enabled: false
|
89
|
+
|
90
|
+
Style/MultilineBlockChain:
|
91
|
+
Enabled: false
|
92
|
+
|
93
|
+
Style/NumericLiterals:
|
94
|
+
Enabled: false
|
95
|
+
|
96
|
+
Style/NumericPredicate:
|
97
|
+
Enabled: false
|
98
|
+
|
99
|
+
Style/PercentLiteralDelimiters:
|
100
|
+
PreferredDelimiters:
|
101
|
+
'%i': '()'
|
102
|
+
'%w': '()'
|
103
|
+
'%r': '()'
|
104
|
+
|
105
|
+
Style/SpecialGlobalVars:
|
106
|
+
Enabled: false
|
107
|
+
|
108
|
+
Style/StringLiterals:
|
109
|
+
EnforcedStyle: double_quotes
|
110
|
+
|
111
|
+
Style/StringLiteralsInInterpolation:
|
112
|
+
EnforcedStyle: double_quotes
|
113
|
+
|
114
|
+
Style/SymbolArray:
|
115
|
+
Enabled: false
|
116
|
+
|
117
|
+
Style/TrailingCommaInArguments:
|
118
|
+
EnforcedStyleForMultiline: consistent_comma
|
119
|
+
|
120
|
+
Style/TrailingCommaInArrayLiteral:
|
121
|
+
EnforcedStyleForMultiline: consistent_comma
|
122
|
+
|
123
|
+
Style/TrailingCommaInHashLiteral:
|
124
|
+
EnforcedStyleForMultiline: consistent_comma
|
125
|
+
|
126
|
+
Style/ZeroLengthPredicate:
|
127
|
+
Enabled: false
|
data/Gemfile
CHANGED
@@ -1,4 +1,12 @@
|
|
1
|
-
source
|
1
|
+
source "https://rubygems.org"
|
2
2
|
|
3
3
|
# Specify your gem's dependencies in charwidth_template.gemspec
|
4
4
|
gemspec
|
5
|
+
|
6
|
+
gem "activemodel", ">= 3"
|
7
|
+
gem "bundler"
|
8
|
+
gem "byebug"
|
9
|
+
gem "rake"
|
10
|
+
gem "rspec"
|
11
|
+
gem "rspec-its"
|
12
|
+
gem "rubocop"
|
data/README.md
CHANGED
@@ -31,13 +31,19 @@ Or extend String class.
|
|
31
31
|
"Hello, World!".normalize_charwidth! # => destructive
|
32
32
|
"「ハローワールド」".normalize_charwidth # => "「ハローワールド」"
|
33
33
|
|
34
|
-
#
|
34
|
+
# Rails integration
|
35
35
|
|
36
|
-
|
36
|
+
Add lines below to `app/models/application_record.rb`.
|
37
37
|
|
38
|
-
require "charwidth/
|
38
|
+
require "charwidth/active_model"
|
39
|
+
class ApplicationRecord < ActiveRecord::Base
|
40
|
+
include Charwidth::ActiveModel
|
41
|
+
end
|
42
|
+
|
43
|
+
And call `normalize_charwidth` class method in model class.
|
39
44
|
|
40
45
|
class Article < ActiveRecord::Base
|
46
|
+
normalize_charwidth :title, :body
|
41
47
|
end
|
42
48
|
|
43
49
|
a = Article.new(title: "Hello, World!")
|
data/bin/rspec
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
#
|
5
|
+
# This file was generated by Bundler.
|
6
|
+
#
|
7
|
+
# The application 'rspec' is installed as part of a gem, and
|
8
|
+
# this file is here to facilitate running it.
|
9
|
+
#
|
10
|
+
|
11
|
+
require "pathname"
|
12
|
+
ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile",
|
13
|
+
Pathname.new(__FILE__).realpath)
|
14
|
+
|
15
|
+
bundle_binstub = File.expand_path("../bundle", __FILE__)
|
16
|
+
|
17
|
+
if File.file?(bundle_binstub)
|
18
|
+
if File.read(bundle_binstub, 300) =~ /This file was generated by Bundler/
|
19
|
+
load(bundle_binstub)
|
20
|
+
else
|
21
|
+
abort("Your `bin/bundle` was not generated by Bundler, so this binstub cannot run.
|
22
|
+
Replace `bin/bundle` by running `bundle binstubs bundler --force`, then run this command again.")
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
require "rubygems"
|
27
|
+
require "bundler/setup"
|
28
|
+
|
29
|
+
load Gem.bin_path("rspec-core", "rspec")
|
data/bin/rubocop
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
#
|
5
|
+
# This file was generated by Bundler.
|
6
|
+
#
|
7
|
+
# The application 'rubocop' is installed as part of a gem, and
|
8
|
+
# this file is here to facilitate running it.
|
9
|
+
#
|
10
|
+
|
11
|
+
require "pathname"
|
12
|
+
ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile",
|
13
|
+
Pathname.new(__FILE__).realpath)
|
14
|
+
|
15
|
+
bundle_binstub = File.expand_path("../bundle", __FILE__)
|
16
|
+
|
17
|
+
if File.file?(bundle_binstub)
|
18
|
+
if File.read(bundle_binstub, 300) =~ /This file was generated by Bundler/
|
19
|
+
load(bundle_binstub)
|
20
|
+
else
|
21
|
+
abort("Your `bin/bundle` was not generated by Bundler, so this binstub cannot run.
|
22
|
+
Replace `bin/bundle` by running `bundle binstubs bundler --force`, then run this command again.")
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
require "rubygems"
|
27
|
+
require "bundler/setup"
|
28
|
+
|
29
|
+
load Gem.bin_path("rubocop", "rubocop")
|
data/charwidth.gemspec
CHANGED
@@ -1,28 +1,21 @@
|
|
1
|
-
|
2
|
-
lib = File.expand_path('../lib', __FILE__)
|
1
|
+
lib = File.expand_path("lib", __dir__)
|
3
2
|
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
-
require
|
3
|
+
require "charwidth/version"
|
5
4
|
|
6
5
|
Gem::Specification.new do |spec|
|
7
6
|
spec.name = "charwidth"
|
8
7
|
spec.version = Charwidth::VERSION
|
9
8
|
spec.authors = ["labocho"]
|
10
9
|
spec.email = ["labocho@penguinlab.jp"]
|
11
|
-
spec.description =
|
12
|
-
spec.summary =
|
10
|
+
spec.description = "Normalize Japanese / Korean fullwidth (zenkaku) and halfwidth (hankaku) characters"
|
11
|
+
spec.summary = "Normalize Japanese / Korean fullwidth (zenkaku) and halfwidth (hankaku) characters"
|
13
12
|
spec.homepage = "https://github.com/labocho/charwidth"
|
14
13
|
spec.license = "MIT"
|
15
14
|
|
16
15
|
spec.files = `git ls-files`.split($/)
|
17
|
-
spec.executables = spec.files.grep(%r
|
16
|
+
spec.executables = spec.files.grep(%r(^bin/)) {|f| File.basename(f) }
|
18
17
|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
18
|
spec.require_paths = ["lib"]
|
20
19
|
|
21
|
-
spec.
|
22
|
-
spec.add_development_dependency "rake"
|
23
|
-
spec.add_development_dependency "rspec"
|
24
|
-
spec.add_development_dependency "rspec-its"
|
25
|
-
spec.add_development_dependency "simplecov"
|
26
|
-
spec.add_development_dependency "activerecord", ">= 3"
|
27
|
-
spec.add_development_dependency "sqlite3", "< 1.4"
|
20
|
+
spec.required_ruby_version = ">= 2.4.0"
|
28
21
|
end
|
data/lib/charwidth.rb
CHANGED
@@ -39,7 +39,7 @@ module Charwidth
|
|
39
39
|
Characters::SPACE,
|
40
40
|
Characters::IDEOGRAPHIC_SPACE,
|
41
41
|
],
|
42
|
-
}
|
42
|
+
}.transform_values(&:freeze).freeze
|
43
43
|
|
44
44
|
# Normalize Unicode fullwidth / halfwidth (zenkaku / hankaku) characters
|
45
45
|
# options: {
|
@@ -63,7 +63,8 @@ module Charwidth
|
|
63
63
|
def to_full_width!(src)
|
64
64
|
unify_voiced_katakana!(src)
|
65
65
|
|
66
|
-
before
|
66
|
+
before = ""
|
67
|
+
after = ""
|
67
68
|
HALFWIDTH_TO_FULLWIDTH.each_value do |half, full|
|
68
69
|
before << half
|
69
70
|
after << full
|
@@ -77,7 +78,7 @@ module Charwidth
|
|
77
78
|
private
|
78
79
|
TYPES = [
|
79
80
|
:ascii, :white_parenthesis, :cjk_punctuation, :katakana, :hangul,
|
80
|
-
:latin_1_punctuation_and_symbols, :mathematical_symbols, :space
|
81
|
+
:latin_1_punctuation_and_symbols, :mathematical_symbols, :space,
|
81
82
|
].freeze
|
82
83
|
def normalize_charwidth!(src, options = {})
|
83
84
|
types = TYPES.dup
|
@@ -91,28 +92,31 @@ module Charwidth
|
|
91
92
|
unless (unexpected_types = options[:only] - TYPES).empty?
|
92
93
|
raise "Unexpected normalize type(s): #{unexpected_types.inspect}"
|
93
94
|
end
|
94
|
-
|
95
|
+
|
96
|
+
types &= options[:only]
|
95
97
|
end
|
96
98
|
|
97
99
|
if options[:expect]
|
98
100
|
unless (unexpected_types = options[:expected] - TYPES).empty?
|
99
|
-
raise "Unexpected normalize type(s): #{
|
101
|
+
raise "Unexpected normalize type(s): #{unexpected_types.inspect}"
|
100
102
|
end
|
101
|
-
|
103
|
+
|
104
|
+
types -= options[:expect]
|
102
105
|
end
|
103
106
|
|
104
|
-
before
|
107
|
+
before = ""
|
108
|
+
after = ""
|
105
109
|
types.each do |type|
|
106
110
|
case type
|
107
111
|
when :ascii, :white_parenthesis, :latin_1_punctuation_and_symbols, :space
|
108
112
|
# convert fullwidth to halfwidth
|
109
|
-
HALFWIDTH_TO_FULLWIDTH[type].tap{|half, full|
|
113
|
+
HALFWIDTH_TO_FULLWIDTH[type].tap {|half, full|
|
110
114
|
before << full
|
111
115
|
after << half
|
112
116
|
}
|
113
117
|
when :cjk_punctuation, :katakana, :hangul, :mathematical_symbols
|
114
118
|
# convert halfwidth to fullwidth
|
115
|
-
HALFWIDTH_TO_FULLWIDTH[type].tap{|half, full|
|
119
|
+
HALFWIDTH_TO_FULLWIDTH[type].tap {|half, full|
|
116
120
|
before << half
|
117
121
|
after << full
|
118
122
|
}
|
@@ -139,10 +143,10 @@ module Charwidth
|
|
139
143
|
|
140
144
|
def escape_for_tr!(s)
|
141
145
|
s.gsub!('\\', '\\\\')
|
142
|
-
s.gsub!(
|
143
|
-
s.gsub!(
|
144
|
-
s.gsub!(
|
145
|
-
s.gsub!(
|
146
|
+
s.gsub!("-", '\\-')
|
147
|
+
s.gsub!("^", '\\^')
|
148
|
+
s.gsub!("[", '\\[')
|
149
|
+
s.gsub!("]", '\\]')
|
146
150
|
s
|
147
151
|
end
|
148
152
|
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require "charwidth"
|
2
|
+
|
3
|
+
module Charwidth
|
4
|
+
module ActiveModel
|
5
|
+
module ClassMethods
|
6
|
+
def normalize_charwidth(*attribute_names)
|
7
|
+
m = Module.new do
|
8
|
+
attribute_names.each do |attribute|
|
9
|
+
define_method "#{attribute}=" do |v|
|
10
|
+
super(v.nil? ? nil : Charwidth.normalize(v.to_s))
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
prepend m
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
def self.included(base)
|
19
|
+
base.class_eval do
|
20
|
+
extend ClassMethods
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
data/lib/charwidth/characters.rb
CHANGED
@@ -10,7 +10,7 @@ module Charwidth
|
|
10
10
|
(0xffc2..0xffc7).to_a,
|
11
11
|
(0xffca..0xffcf).to_a,
|
12
12
|
(0xffd2..0xffd7).to_a,
|
13
|
-
(0xffda..0xffdc).to_a
|
13
|
+
(0xffda..0xffdc).to_a,
|
14
14
|
].flatten.pack("U*").freeze
|
15
15
|
FULLWIDTH_SYMBOL_VARIANTS = (0xffe0..0xffe6).to_a.pack("U*").freeze
|
16
16
|
HALFWIDTH_SYMBOL_VARIANTS = (0xffe8..0xffee).to_a.pack("U*").freeze
|
@@ -39,7 +39,7 @@ module Charwidth
|
|
39
39
|
].flatten.pack("U*").freeze
|
40
40
|
HANGUL = [
|
41
41
|
0x3164, # HANGUL FILLER
|
42
|
-
(0x3131..0x3163).to_a # HANGUL LETTER KIYEOK to I
|
42
|
+
(0x3131..0x3163).to_a, # HANGUL LETTER KIYEOK to I
|
43
43
|
].flatten.pack("U*").freeze
|
44
44
|
LATIN_1_PUNCTUATION_AND_SYMBOLS = [
|
45
45
|
0x00a2, # CENT SIGN
|
@@ -48,33 +48,33 @@ module Charwidth
|
|
48
48
|
0x00af, # MACRON
|
49
49
|
0x00a6, # BROKEN BAR
|
50
50
|
0x00a5, # YEN SIGN
|
51
|
-
0x20a9
|
51
|
+
0x20a9, # WON SIGN
|
52
52
|
].pack("U*").freeze
|
53
53
|
MATHEMATICAL_SYMBOLS = [
|
54
54
|
0x2502, # BOX DRAWINGS LIGHT VERTICAL
|
55
55
|
(0x2190..0x2193).to_a, # LEFTWARDS, UPWARDS, RIGHTWARDS, DOWNWARDS ARROW
|
56
56
|
0x25a0, # BLACK SQUARE
|
57
|
-
0x25cb
|
57
|
+
0x25cb, # WHITE CIRCLE
|
58
58
|
].flatten.pack("U*").freeze
|
59
59
|
SPACE = "\u0020".freeze
|
60
60
|
|
61
|
-
HALFWIDTH_KATAKANA_VOICED_SOUND_MARK = "\uff9e"
|
61
|
+
HALFWIDTH_KATAKANA_VOICED_SOUND_MARK = "\uff9e".freeze
|
62
62
|
HALFWIDTH_VOICED_KATAKANA = [
|
63
63
|
(0xff76..0xff84).to_a, # HALFWIDTH KATAKANA LETTER KA to TO
|
64
64
|
(0xff8a..0xff8e).to_a, # HALFWIDTH KATAKANA LETTER HA to HO
|
65
|
-
0xff73 # HALFWIDTH KATAKANA LETTER U
|
66
|
-
].flatten.map{|k| ([k].pack("U") + HALFWIDTH_KATAKANA_VOICED_SOUND_MARK).freeze }.freeze
|
65
|
+
0xff73, # HALFWIDTH KATAKANA LETTER U
|
66
|
+
].flatten.map {|k| ([k].pack("U") + HALFWIDTH_KATAKANA_VOICED_SOUND_MARK).freeze }.freeze
|
67
67
|
VOICED_KATAKANA = [
|
68
68
|
0x30ac.step(0x30be, 2).to_a, # KATAKANA LETTER GA to ZO
|
69
69
|
[0x30c0, 0x30c2, 0x30c5, 0x30c7, 0x30c9], # KATAKANA LETTER DA to DO
|
70
70
|
0x30d0.step(0x30dc, 3).to_a, # KATAKANA LETTER BA to BO
|
71
|
-
0x30f4 # KATAKANA LETTER VU
|
72
|
-
].flatten.map{|c| [c].pack("U").freeze }.freeze
|
71
|
+
0x30f4, # KATAKANA LETTER VU
|
72
|
+
].flatten.map {|c| [c].pack("U").freeze }.freeze
|
73
73
|
|
74
|
-
HALFWIDTH_KATAKANA_SEMI_VOICED_SOUND_MARK = "\uff9f"
|
74
|
+
HALFWIDTH_KATAKANA_SEMI_VOICED_SOUND_MARK = "\uff9f".freeze
|
75
75
|
HALFWIDTH_SEMI_VOICED_KATAKANA = [
|
76
|
-
(0xff8a..0xff8e).to_a # HALFWIDTH KATAKANA LETTER HA to HO
|
77
|
-
].flatten.map{|k| ([k].pack("U") + HALFWIDTH_KATAKANA_SEMI_VOICED_SOUND_MARK).freeze }.freeze
|
78
|
-
SEMI_VOICED_KATAKANA = 0x30d1.step(0x30dd, 3).map{|c| [c].pack("U").freeze }.flatten.freeze # KATAKANA LETTER PA to PO
|
76
|
+
(0xff8a..0xff8e).to_a, # HALFWIDTH KATAKANA LETTER HA to HO
|
77
|
+
].flatten.map {|k| ([k].pack("U") + HALFWIDTH_KATAKANA_SEMI_VOICED_SOUND_MARK).freeze }.freeze
|
78
|
+
SEMI_VOICED_KATAKANA = 0x30d1.step(0x30dd, 3).map {|c| [c].pack("U").freeze }.flatten.freeze # KATAKANA LETTER PA to PO
|
79
79
|
end
|
80
80
|
end
|
data/lib/charwidth/cli.rb
CHANGED
@@ -9,18 +9,18 @@ module Charwidth
|
|
9
9
|
options = {}
|
10
10
|
optparse = OptionParser.new do |o|
|
11
11
|
o.banner += " TEXT\nNormalize character width in arguments or STDIN.\nAvailable character types are #{Charwidth::ClassMethods::TYPES.join(",")}."
|
12
|
-
o.on("--only=TYPES", "Comma separated character types that should be converted"){|types| options[:only] = types.split(",").map(&:to_sym) }
|
13
|
-
o.on("--except=TYPES", "Comma separated character types that should not be converted"){|types| options[:except] = types.split(",").map(&:to_sym) }
|
12
|
+
o.on("--only=TYPES", "Comma separated character types that should be converted") {|types| options[:only] = types.split(",").map(&:to_sym) }
|
13
|
+
o.on("--except=TYPES", "Comma separated character types that should not be converted") {|types| options[:except] = types.split(",").map(&:to_sym) }
|
14
14
|
o.parse!(argv)
|
15
15
|
end
|
16
16
|
src = nil
|
17
17
|
if ARGV.empty?
|
18
|
-
if
|
19
|
-
|
20
|
-
|
18
|
+
if $stdin.tty?
|
19
|
+
warn optparse.banner
|
20
|
+
warn optparse.help
|
21
21
|
exit 1
|
22
22
|
else
|
23
|
-
src =
|
23
|
+
src = $stdin.read
|
24
24
|
end
|
25
25
|
else
|
26
26
|
src = ARGV.join(" ")
|
data/lib/charwidth/version.rb
CHANGED
@@ -0,0 +1,44 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
require "active_model"
|
3
|
+
require "charwidth/active_model"
|
4
|
+
|
5
|
+
describe Charwidth::ActiveModel do
|
6
|
+
before(:all) do
|
7
|
+
# rubocop:disable Lint/ConstantDefinitionInBlock
|
8
|
+
class User
|
9
|
+
include ActiveModel::Attributes
|
10
|
+
include Charwidth::ActiveModel
|
11
|
+
|
12
|
+
attribute :name, :string
|
13
|
+
normalize_charwidth :name
|
14
|
+
|
15
|
+
def initialize(name: nil)
|
16
|
+
super()
|
17
|
+
self.name = name
|
18
|
+
end
|
19
|
+
end
|
20
|
+
# rubocop:enable Lint/ConstantDefinitionInBlock
|
21
|
+
end
|
22
|
+
|
23
|
+
after(:all) do
|
24
|
+
Object.send(:remove_const, :User)
|
25
|
+
end
|
26
|
+
|
27
|
+
subject { User.new }
|
28
|
+
context "assign unnormalized valud" do
|
29
|
+
before(:each) do
|
30
|
+
subject.name = "ABCアイウ"
|
31
|
+
end
|
32
|
+
its(:name) { should == "ABCアイウ" }
|
33
|
+
end
|
34
|
+
context "assign nil" do
|
35
|
+
before(:each) do
|
36
|
+
subject.name = nil
|
37
|
+
end
|
38
|
+
its(:name) { should.nil? }
|
39
|
+
end
|
40
|
+
context "mass assignment" do
|
41
|
+
subject { User.new(name: "ABCアイウ") }
|
42
|
+
its(:name) { should == "ABCアイウ" }
|
43
|
+
end
|
44
|
+
end
|
data/spec/charwidth_spec.rb
CHANGED
data/spec/spec_helper.rb
CHANGED
@@ -1,13 +1,14 @@
|
|
1
|
-
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__),
|
1
|
+
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), "..", "lib"))
|
2
2
|
$LOAD_PATH.unshift(File.dirname(__FILE__))
|
3
|
-
require
|
4
|
-
require
|
5
|
-
require
|
3
|
+
require "rspec"
|
4
|
+
require "rspec/its"
|
5
|
+
require "charwidth"
|
6
|
+
require "byebug"
|
6
7
|
|
7
8
|
# Requires supporting files with custom matchers and macros, etc,
|
8
9
|
# in ./support/ and its subdirectories.
|
9
|
-
Dir["#{
|
10
|
+
Dir["#{__dir__}/support/**/*.rb"].sort.each {|f| require f }
|
10
11
|
|
11
12
|
RSpec.configure do |config|
|
12
|
-
|
13
|
+
# noop
|
13
14
|
end
|
metadata
CHANGED
@@ -1,119 +1,23 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: charwidth
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- labocho
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
12
|
-
dependencies:
|
13
|
-
- !ruby/object:Gem::Dependency
|
14
|
-
name: bundler
|
15
|
-
requirement: !ruby/object:Gem::Requirement
|
16
|
-
requirements:
|
17
|
-
- - "~>"
|
18
|
-
- !ruby/object:Gem::Version
|
19
|
-
version: '1.3'
|
20
|
-
type: :development
|
21
|
-
prerelease: false
|
22
|
-
version_requirements: !ruby/object:Gem::Requirement
|
23
|
-
requirements:
|
24
|
-
- - "~>"
|
25
|
-
- !ruby/object:Gem::Version
|
26
|
-
version: '1.3'
|
27
|
-
- !ruby/object:Gem::Dependency
|
28
|
-
name: rake
|
29
|
-
requirement: !ruby/object:Gem::Requirement
|
30
|
-
requirements:
|
31
|
-
- - ">="
|
32
|
-
- !ruby/object:Gem::Version
|
33
|
-
version: '0'
|
34
|
-
type: :development
|
35
|
-
prerelease: false
|
36
|
-
version_requirements: !ruby/object:Gem::Requirement
|
37
|
-
requirements:
|
38
|
-
- - ">="
|
39
|
-
- !ruby/object:Gem::Version
|
40
|
-
version: '0'
|
41
|
-
- !ruby/object:Gem::Dependency
|
42
|
-
name: rspec
|
43
|
-
requirement: !ruby/object:Gem::Requirement
|
44
|
-
requirements:
|
45
|
-
- - ">="
|
46
|
-
- !ruby/object:Gem::Version
|
47
|
-
version: '0'
|
48
|
-
type: :development
|
49
|
-
prerelease: false
|
50
|
-
version_requirements: !ruby/object:Gem::Requirement
|
51
|
-
requirements:
|
52
|
-
- - ">="
|
53
|
-
- !ruby/object:Gem::Version
|
54
|
-
version: '0'
|
55
|
-
- !ruby/object:Gem::Dependency
|
56
|
-
name: rspec-its
|
57
|
-
requirement: !ruby/object:Gem::Requirement
|
58
|
-
requirements:
|
59
|
-
- - ">="
|
60
|
-
- !ruby/object:Gem::Version
|
61
|
-
version: '0'
|
62
|
-
type: :development
|
63
|
-
prerelease: false
|
64
|
-
version_requirements: !ruby/object:Gem::Requirement
|
65
|
-
requirements:
|
66
|
-
- - ">="
|
67
|
-
- !ruby/object:Gem::Version
|
68
|
-
version: '0'
|
69
|
-
- !ruby/object:Gem::Dependency
|
70
|
-
name: simplecov
|
71
|
-
requirement: !ruby/object:Gem::Requirement
|
72
|
-
requirements:
|
73
|
-
- - ">="
|
74
|
-
- !ruby/object:Gem::Version
|
75
|
-
version: '0'
|
76
|
-
type: :development
|
77
|
-
prerelease: false
|
78
|
-
version_requirements: !ruby/object:Gem::Requirement
|
79
|
-
requirements:
|
80
|
-
- - ">="
|
81
|
-
- !ruby/object:Gem::Version
|
82
|
-
version: '0'
|
83
|
-
- !ruby/object:Gem::Dependency
|
84
|
-
name: activerecord
|
85
|
-
requirement: !ruby/object:Gem::Requirement
|
86
|
-
requirements:
|
87
|
-
- - ">="
|
88
|
-
- !ruby/object:Gem::Version
|
89
|
-
version: '3'
|
90
|
-
type: :development
|
91
|
-
prerelease: false
|
92
|
-
version_requirements: !ruby/object:Gem::Requirement
|
93
|
-
requirements:
|
94
|
-
- - ">="
|
95
|
-
- !ruby/object:Gem::Version
|
96
|
-
version: '3'
|
97
|
-
- !ruby/object:Gem::Dependency
|
98
|
-
name: sqlite3
|
99
|
-
requirement: !ruby/object:Gem::Requirement
|
100
|
-
requirements:
|
101
|
-
- - "<"
|
102
|
-
- !ruby/object:Gem::Version
|
103
|
-
version: '1.4'
|
104
|
-
type: :development
|
105
|
-
prerelease: false
|
106
|
-
version_requirements: !ruby/object:Gem::Requirement
|
107
|
-
requirements:
|
108
|
-
- - "<"
|
109
|
-
- !ruby/object:Gem::Version
|
110
|
-
version: '1.4'
|
11
|
+
date: 2021-05-19 00:00:00.000000000 Z
|
12
|
+
dependencies: []
|
111
13
|
description: Normalize Japanese / Korean fullwidth (zenkaku) and halfwidth (hankaku)
|
112
14
|
characters
|
113
15
|
email:
|
114
16
|
- labocho@penguinlab.jp
|
115
17
|
executables:
|
116
18
|
- charwidth
|
19
|
+
- rspec
|
20
|
+
- rubocop
|
117
21
|
extensions: []
|
118
22
|
extra_rdoc_files: []
|
119
23
|
files:
|
@@ -121,6 +25,7 @@ files:
|
|
121
25
|
- ".document"
|
122
26
|
- ".gitignore"
|
123
27
|
- ".rspec"
|
28
|
+
- ".rubocop.yml"
|
124
29
|
- CHANGELOG.md
|
125
30
|
- Gemfile
|
126
31
|
- Gemfile.lock
|
@@ -128,21 +33,23 @@ files:
|
|
128
33
|
- README.md
|
129
34
|
- Rakefile
|
130
35
|
- bin/charwidth
|
36
|
+
- bin/rspec
|
37
|
+
- bin/rubocop
|
131
38
|
- charwidth.gemspec
|
132
39
|
- lib/charwidth.rb
|
133
|
-
- lib/charwidth/
|
40
|
+
- lib/charwidth/active_model.rb
|
134
41
|
- lib/charwidth/characters.rb
|
135
42
|
- lib/charwidth/cli.rb
|
136
43
|
- lib/charwidth/string.rb
|
137
44
|
- lib/charwidth/version.rb
|
138
|
-
- spec/charwidth/
|
45
|
+
- spec/charwidth/active_model_spec.rb
|
139
46
|
- spec/charwidth_spec.rb
|
140
47
|
- spec/spec_helper.rb
|
141
48
|
homepage: https://github.com/labocho/charwidth
|
142
49
|
licenses:
|
143
50
|
- MIT
|
144
51
|
metadata: {}
|
145
|
-
post_install_message:
|
52
|
+
post_install_message:
|
146
53
|
rdoc_options: []
|
147
54
|
require_paths:
|
148
55
|
- lib
|
@@ -150,19 +57,18 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
150
57
|
requirements:
|
151
58
|
- - ">="
|
152
59
|
- !ruby/object:Gem::Version
|
153
|
-
version:
|
60
|
+
version: 2.4.0
|
154
61
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
155
62
|
requirements:
|
156
63
|
- - ">="
|
157
64
|
- !ruby/object:Gem::Version
|
158
65
|
version: '0'
|
159
66
|
requirements: []
|
160
|
-
|
161
|
-
|
162
|
-
signing_key:
|
67
|
+
rubygems_version: 3.1.2
|
68
|
+
signing_key:
|
163
69
|
specification_version: 4
|
164
70
|
summary: Normalize Japanese / Korean fullwidth (zenkaku) and halfwidth (hankaku) characters
|
165
71
|
test_files:
|
166
|
-
- spec/charwidth/
|
72
|
+
- spec/charwidth/active_model_spec.rb
|
167
73
|
- spec/charwidth_spec.rb
|
168
74
|
- spec/spec_helper.rb
|
@@ -1,27 +0,0 @@
|
|
1
|
-
require "charwidth"
|
2
|
-
|
3
|
-
module Charwidth
|
4
|
-
module ActiveRecord
|
5
|
-
module InstanceMethods
|
6
|
-
def write_attribute_with_normalize_charwidth(attr_name, value)
|
7
|
-
value = value.is_a?(String) ? Charwidth.normalize(value) : value
|
8
|
-
write_attribute_without_normalize_charwidth(attr_name, value)
|
9
|
-
end
|
10
|
-
end
|
11
|
-
|
12
|
-
def self.included(base)
|
13
|
-
base.class_eval do
|
14
|
-
include InstanceMethods
|
15
|
-
if ::ActiveRecord.version<Gem::Version.new("5.2")
|
16
|
-
alias_method :write_attribute_without_normalize_charwidth, :write_attribute
|
17
|
-
alias_method :write_attribute, :write_attribute_with_normalize_charwidth
|
18
|
-
else
|
19
|
-
alias_method :write_attribute_without_normalize_charwidth, :_write_attribute
|
20
|
-
alias_method :_write_attribute, :write_attribute_with_normalize_charwidth
|
21
|
-
end
|
22
|
-
end
|
23
|
-
end
|
24
|
-
end
|
25
|
-
end
|
26
|
-
|
27
|
-
ActiveRecord::Base.send(:include, Charwidth::ActiveRecord)
|
@@ -1,39 +0,0 @@
|
|
1
|
-
# encoding: UTF-8
|
2
|
-
require "spec_helper"
|
3
|
-
require "active_record"
|
4
|
-
require "charwidth/active_record"
|
5
|
-
|
6
|
-
describe Charwidth::ActiveRecord do
|
7
|
-
before(:all) do
|
8
|
-
ActiveRecord::Base.establish_connection(
|
9
|
-
adapter: "sqlite3",
|
10
|
-
database: ":memory:"
|
11
|
-
)
|
12
|
-
ActiveRecord::Base.connection.execute <<-SQL
|
13
|
-
CREATE TABLE users (
|
14
|
-
id integer PRIMARY KEY AUTOINCREMENT,
|
15
|
-
name text NOT NULL
|
16
|
-
)
|
17
|
-
SQL
|
18
|
-
|
19
|
-
class User < ActiveRecord::Base; end
|
20
|
-
end
|
21
|
-
|
22
|
-
subject { User.new }
|
23
|
-
context 'assign unnormalized valud' do
|
24
|
-
before(:each) do
|
25
|
-
subject.name = "ABCアイウ"
|
26
|
-
end
|
27
|
-
its(:name) { should == "ABCアイウ" }
|
28
|
-
end
|
29
|
-
context 'assign nil' do
|
30
|
-
before(:each) do
|
31
|
-
subject.name = nil
|
32
|
-
end
|
33
|
-
its(:name) { should == nil }
|
34
|
-
end
|
35
|
-
context 'mass assignment' do
|
36
|
-
subject { User.new(name: "ABCアイウ") }
|
37
|
-
its(:name) { should == "ABCアイウ" }
|
38
|
-
end
|
39
|
-
end
|