pokebell 0.0.2 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
data/Gemfile CHANGED
@@ -12,3 +12,5 @@ group :development do
12
12
  gem "jeweler", "~> 2.0.1"
13
13
  gem "simplecov", ">= 0"
14
14
  end
15
+
16
+ gem "moji", "1.6"
data/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # pokebell
2
2
 
3
- This gem is convert from Japanese message written by Hiragana / Katakana / alphabet / digit to Japanese pager aka "Pokebell" 2-digits format codes.
3
+ This gem is convert from Japanese message written by Hiragana / Katakana / alphabet / digit to Japanese pager aka "Pokebell" 2-digits format codes, and from the code to Katakana message.
4
4
 
5
5
  ## usage
6
6
 
@@ -8,8 +8,15 @@ This gem is convert from Japanese message written by Hiragana / Katakana / alpha
8
8
  pokeberu = Pokebell.new("ぽけべる")
9
9
  pokeberu.pokebell #=> "650524640493"
10
10
  pokeberu.code #=> "650524640493"
11
- pokeberu.str #=> "ぽけべる"
12
- pokeberu.to_a #=> "ぽけべる"
11
+ pokeberu.str #=> "ポケベル"
12
+ pokeberu.to_s #=> "ポケベル"
13
+ ```
14
+ ```
15
+ pokeberu = Pokebell.number("650524640493")
16
+ pokeberu.pokebell #=> "650524640493"
17
+ pokeberu.code #=> "650524640493"
18
+ pokeberu.str #=> "ポケベル"
19
+ pokeberu.to_s #=> "ポケベル"
13
20
  ```
14
21
 
15
22
  ## convert table
@@ -53,12 +60,18 @@ Pokebell.new("ruby").pokebell #=> "48561750"
53
60
  Pokebell.new("hello pokebell").pokebell
54
61
  #=> "2810373730884630361017103737"
55
62
  ```
56
-
63
+ ```
64
+ Pokebell.number("61056993").str #=> "パール"
65
+ Pokebell.number("93620469").str #=> "ルビー"
66
+ Pokebell.number("46104837").str #=> "PERL"
67
+ Pokebell.number("48561750").str #=> "RUBY"
68
+ Pokebell.number("2810373730884630361017103737").str
69
+ #=> "HELLO POKEBELL"
70
+ ```
57
71
  ##TODO
58
72
 
59
73
  * RSpec
60
74
  * Emoji (Clock="78", Phone="79", Cup="70", Heart="89")
61
- * Convert (Decode) from codes to Japanese charactors
62
75
 
63
76
  ## Contributing to pokebell
64
77
 
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.0.2
1
+ 0.1.0
@@ -1,5 +1,8 @@
1
1
  #!/usr/bin/env ruby
2
2
  # coding: utf-8
3
+
4
+ require 'moji'
5
+
3
6
  require 'nkf'
4
7
 
5
8
  class Pokebell
@@ -7,23 +10,82 @@ class Pokebell
7
10
  # @param str [String] message (contains Hiragana / Katakana / alphabet / digit)
8
11
  # @return [Pokebell]
9
12
  def initialize(str)
10
- @str = str.gsub(/\\/, "")
13
+ @str = Moji.han_to_zen(hiragana2katakana(str.upcase.gsub(/\\/, "")))
11
14
  @pokebell = pick_hankaku_code(zenkaku2hankaku(@str)).map{ |code| encode(code) }.join
12
15
  end
13
16
 
17
+ # Set Pokebell code and make message string.
18
+ # @param num [String] Pokebell code (length must be even)
19
+ # @raise [ArgumentError] if param does not makes digit or its length is not even
20
+ # @return [Pokebell]
21
+ # @since 0.1.0
22
+ def self.number(num)
23
+ num_str = num.to_s
24
+ unless num_str == num_str[/(\d\d)+/]
25
+ raise ArgumentError, "wrong digit length (must be even digits)"
26
+ end
27
+ two_digits_array = num_str.scan(/\d\d/)
28
+ str_array_with_daku_handaku = make_str_array(two_digits_array)
29
+ str_array = []
30
+ loop do
31
+ follow_char = nil
32
+ char = str_array_with_daku_handaku.shift
33
+ break unless char
34
+ follow_char_test = str_array_with_daku_handaku.first
35
+ unless follow_char_test
36
+ str_array << char
37
+ break
38
+ end
39
+ if follow_char_test[/[゛゜]/]
40
+ follow_char = str_array_with_daku_handaku.shift
41
+ char = merge_daku_handaku(char, follow_char)
42
+ end
43
+ str_array << char
44
+ end
45
+ str = str_array.join
46
+ Pokebell.new(str)
47
+ end
48
+
49
+ # @return [String]
50
+ # @since 0.1.0
51
+ def inspect
52
+ %[#<str="#{@str}", pokebell="#{@pokebell}">]
53
+ end
54
+
14
55
  # @!method pokebell
15
56
  # @return [String] Pokebell codes (2-digit string)
16
57
  attr_reader :pokebell
17
58
  alias :code :pokebell
59
+ alias :num :pokebell
18
60
 
19
61
  # @!method str
20
- # @return [String] original message
62
+ # @return [String] message (convert to Zenkaku charactors, especially from Hiragana to Katakana)
21
63
  attr_reader :str
22
- alias :to_a :str
64
+ alias :to_s :str
65
+ alias :text :str
23
66
 
24
67
  private
68
+ TABLE = [
69
+ %w[0 ワ ヲ ン ゛ ゜ 6 7 8 9],
70
+ %w[E ア イ ウ エ オ A B C D],
71
+ %w[J カ キ ク ケ コ F G H I],
72
+ %w[O サ シ ス セ ソ K L M N],
73
+ %w[T タ チ ツ テ ト P Q R S],
74
+ %w[Y ナ ニ ヌ ネ ノ U V W X],
75
+ %w[/ ハ ヒ フ ヘ ホ Z ? ! ー],
76
+ ([""] + %w[マ ミ ム メ モ ¥ &] + ["", ""]),
77
+ ([""] + %w[ヤ ( ユ ) ヨ * #  ] + [""]),
78
+ %w[5 ラ リ ル レ ロ 1 2 3 4],
79
+ ]
80
+ DAKU_BASE_REGEX = /[カキクケコサシスセソタチツテト]/
81
+ DAKU_HANDAKU_BASE_REGEX = /[ハヒフヘホ]/
82
+
25
83
  def zenkaku2hankaku(str)
26
- NKF.nkf('-j -Z4', NKF.nkf('-w -h2', str))
84
+ NKF.nkf('-jZ4', str)
85
+ end
86
+
87
+ def hiragana2katakana(str)
88
+ NKF.nkf("-wh2", str).gsub("¥", "¥")
27
89
  end
28
90
 
29
91
  def escape_char?(char)
@@ -53,6 +115,8 @@ class Pokebell
53
115
  else
54
116
  raise "out of aiming JIS charactor area"
55
117
  end
118
+ elsif char.unpack("C") == "\x21".unpack("C")
119
+
56
120
  else
57
121
  raise "out of aiming JIS charactor area"
58
122
  end
@@ -157,4 +221,24 @@ class Pokebell
157
221
  raise "out of aiming charactor area"
158
222
  end
159
223
  end
224
+
225
+ def self.make_str_array(array)
226
+ array.map { |digits|
227
+ i = digits[0].to_i
228
+ j = digits[1].to_i
229
+ TABLE[i][j]
230
+ }
231
+ end
232
+
233
+ def self.merge_daku_handaku(char, follow_char)
234
+ if follow_char[/゛/] && char[Regexp.union(DAKU_BASE_REGEX, DAKU_HANDAKU_BASE_REGEX)]
235
+ [char.unpack("U*").first + 1].pack("U")
236
+ elsif follow_char[/゜/] && char[DAKU_HANDAKU_BASE_REGEX]
237
+ [char.unpack("U*").first + 2].pack("U")
238
+ elsif follow_char[/゛/] && char[/ウ/]
239
+ "ヴ"
240
+ else
241
+ char + follow_char
242
+ end
243
+ end
160
244
  end
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = "pokebell"
8
- s.version = "0.0.2"
8
+ s.version = "0.1.0"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["riocampos"]
12
- s.date = "2014-06-26"
12
+ s.date = "2014-07-29"
13
13
  s.description = "Japanese charactor displayed by hiragana, alphabet, or number encode to 2-digit in used \"Pokebell\" pager."
14
14
  s.email = "riocampos22@gmail.com"
15
15
  s.extra_rdoc_files = [
@@ -38,12 +38,14 @@ Gem::Specification.new do |s|
38
38
  s.specification_version = 3
39
39
 
40
40
  if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
41
+ s.add_runtime_dependency(%q<moji>, ["= 1.6"])
41
42
  s.add_development_dependency(%q<rspec>, ["~> 2.8.0"])
42
43
  s.add_development_dependency(%q<rdoc>, ["~> 3.12"])
43
44
  s.add_development_dependency(%q<bundler>, ["~> 1.0"])
44
45
  s.add_development_dependency(%q<jeweler>, ["~> 2.0.1"])
45
46
  s.add_development_dependency(%q<simplecov>, [">= 0"])
46
47
  else
48
+ s.add_dependency(%q<moji>, ["= 1.6"])
47
49
  s.add_dependency(%q<rspec>, ["~> 2.8.0"])
48
50
  s.add_dependency(%q<rdoc>, ["~> 3.12"])
49
51
  s.add_dependency(%q<bundler>, ["~> 1.0"])
@@ -51,6 +53,7 @@ Gem::Specification.new do |s|
51
53
  s.add_dependency(%q<simplecov>, [">= 0"])
52
54
  end
53
55
  else
56
+ s.add_dependency(%q<moji>, ["= 1.6"])
54
57
  s.add_dependency(%q<rspec>, ["~> 2.8.0"])
55
58
  s.add_dependency(%q<rdoc>, ["~> 3.12"])
56
59
  s.add_dependency(%q<bundler>, ["~> 1.0"])
@@ -1,7 +1,67 @@
1
+ #!/usr/bin/env ruby
2
+ # coding: utf-8
1
3
  require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
4
 
5
+ match_hash = {
6
+ "カキクケコ" => "2122232425",
7
+ "ガギグゲゴ" => "21042204230424042504",
8
+ "パピプペポ" => "61056205630564056505",
9
+ "ヤユヨ" => "818385",
10
+ "()" => "8284",
11
+ "ラリルレロ" => "9192939495",
12
+ "ワヲン" => "010203",
13
+ "ABCDE" => "1617181910",
14
+ "Z?!ー/" => "6667686960",
15
+ "¥&*# " => "7677868788",
16
+ "1234567890" => "96979899900607080900",
17
+ "パンガオイシイー" => "61050321041512321269",
18
+ "ヴアイオリン" => "13041112159203",
19
+ }
20
+
21
+ match_hash1 = match_hash.merge({
22
+ "あいうえお" => "1112131415",
23
+ "サシスセソ" => "3132333435",
24
+ "゛゜" => "0405",
25
+ "あ゛" => "1104",
26
+ "バビブベボ" => "61046204630464046504",
27
+ "67890" => "0607080900",
28
+ "hello pokebell" => "2810373730884630361017103737",
29
+ })
30
+ match_hash2 = match_hash.merge({
31
+ " ゛ ゜" => "88048805",
32
+ "バビブベボ" => "61046204630464046504",
33
+ "67890" => "0607080900",
34
+ "HELLO POKEBELL" => "2810373730884630361017103737",
35
+ })
36
+
3
37
  describe "Pokebell" do
4
- it "fails" do
5
- fail "hey buddy, you should probably rename this file and start specing for real"
38
+ match_hash1.each_pair do |str, num|
39
+ context %[give string "#{str}"] do
40
+ it do
41
+ str_pokebell = Pokebell.new(str)
42
+ expect(str_pokebell.pokebell).to eq num
43
+ end
44
+ end
45
+ end
46
+
47
+ context "give number 111" do
48
+ it 'raise ArgumentError' do
49
+ expect { Pokebell.number("111") }.to raise_error ArgumentError, "wrong digit length (must be even digits)"
50
+ end
51
+ end
52
+
53
+ context 'give number "abc"' do
54
+ it 'raise ArgumentError' do
55
+ expect { Pokebell.number("abc") }.to raise_error ArgumentError, "wrong digit length (must be even digits)"
56
+ end
57
+ end
58
+
59
+ match_hash2.each_pair do |str, num|
60
+ context %[give number "#{num}"] do
61
+ it do
62
+ num_pokebell = Pokebell.number(num)
63
+ expect(num_pokebell.str).to eq str
64
+ end
65
+ end
6
66
  end
7
67
  end
@@ -8,7 +8,8 @@ end
8
8
 
9
9
  SimpleCov.configure do
10
10
  clean_filters
11
- load_adapter 'test_frameworks'
11
+ # load_adapter 'test_frameworks'
12
+ load_profile 'test_frameworks'
12
13
  end
13
14
 
14
15
  ENV["COVERAGE"] && SimpleCov.start do
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pokebell
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.1.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,8 +9,24 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2014-06-26 00:00:00.000000000 Z
12
+ date: 2014-07-29 00:00:00.000000000 Z
13
13
  dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: moji
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - '='
20
+ - !ruby/object:Gem::Version
21
+ version: '1.6'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - '='
28
+ - !ruby/object:Gem::Version
29
+ version: '1.6'
14
30
  - !ruby/object:Gem::Dependency
15
31
  name: rspec
16
32
  requirement: !ruby/object:Gem::Requirement
@@ -126,7 +142,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
126
142
  version: '0'
127
143
  segments:
128
144
  - 0
129
- hash: -2424198896221565706
145
+ hash: 2450097076129829719
130
146
  required_rubygems_version: !ruby/object:Gem::Requirement
131
147
  none: false
132
148
  requirements: