morse-code-rb 0.2.1 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 17c6ca85c62d3bd75096554e0a57044e99cf3769
4
- data.tar.gz: 05d61184298e1c8a55a4fdda5a1628293a7ca29e
3
+ metadata.gz: 5d52693f5ba4566000e1e1b3dbf4601e0639854f
4
+ data.tar.gz: c9e11a75d919dfabdfa5e6d45f93740790f7c4f0
5
5
  SHA512:
6
- metadata.gz: ed9c6be874649076fcccdf18543fbb484b3eaa86004c9b494b3d2c5ca495f16a7a5ccad0cb1d0085e35167d96a7e59abe5e17d61f22204b2355e5160592f335c
7
- data.tar.gz: dfb8f8958ababf42357d35a488ca0fa4890950cc645e4cabcdc92dbe9e0ff4165733d485178899bc78547f6ee901e0d891a501c48cfe26ff6ada1c644355af55
6
+ metadata.gz: 2508a171703c6e0fc04d39113221618c5fabfdcc66f5508ac4dae686d06e6b1c074246062cd82b208b9a79eeed24efd49517c7bfb24464ec74e5464d97a253a1
7
+ data.tar.gz: 148605233da1af1b81756e7b676cc34febda57e65706fabd433693edc567514af0ee29099412ce932f8a3164d3c1791b0ca8d986ee4537e609756fd1e2a532f5
data/README.md CHANGED
@@ -2,6 +2,8 @@
2
2
 
3
3
  Simple Morse Code Encode and Decode Tool
4
4
 
5
+ [![Gem Version](http://img.shields.io/gem/v/morse-code-rb.svg)](https://rubygems.org/gems/morse-code-rb) [![Build Status](https://travis-ci.org/superiorlu/morse_code.svg)](https://travis-ci.org/superiorlu/morse_code) [![Maintainability](https://api.codeclimate.com/v1/badges/62b6eb7ed9b65c62d3f6/maintainability)](https://codeclimate.com/github/superiorlu/morse_code/maintainability) [![GitHub license](https://img.shields.io/github/license/superiorlu/morse_code.svg)](https://github.com/superiorlu/morse_code/blob/master/LICENSE.md)
6
+
5
7
  ## Installation
6
8
 
7
9
  Add this line to your application's Gemfile:
@@ -26,13 +28,18 @@ Or install it yourself as:
26
28
  require 'morse_code'
27
29
 
28
30
  content = 'I am Robot.'
29
- encode_content = MorseCode::Encoder.new(content).encode
30
- dit_dah = MorseCode::Encoder.new(content).dit_dah
31
- puts encode_content
32
- puts dit_dah
31
+ MorseCode::Encoder.new(content).encode
32
+ $> ".. / .- -- / .-. --- -... --- - .-.-.-"
33
+
34
+ MorseCode::Encoder.new(content).dit_dah
35
+ $> "DITDIT / DITDAH DAHDAH / DITDAHDIT DAHDAHDAH DAHDITDITDIT DAHDAHDAH DAH DITDAHDITDAHDITDAH"
36
+
37
+ content = '我是中国人'
38
+ MorseCode::Encoder.new(content).encode
39
+ $> "--...-....-...- --..--...-.---- -..---...-.--.- -.-.--.------.- -..---.-.---.-."
33
40
 
34
- $> .. / .- -- / .-. --- -... --- - .-.-.-
35
- $> DITDIT / DITDAH DAHDAH / DITDAHDIT DAHDAHDAH DAHDITDITDIT DAHDAHDAH DAH DITDAHDITDAHDITDAH
41
+ MorseCode::Encoder.new(content).dit_dah
42
+ $> "DAHDAHDITDITDITDAHDITDITDITDITDAHDITDITDITDAH DAHDAHDITDITDAHDAHDITDITDITDAHDITDAHDAHDAHDAH DAHDITDITDAHDAHDAHDITDITDITDAHDITDAHDAHDITDAH DAHDITDAHDITDAHDAHDITDAHDAHDAHDAHDAHDAHDITDAH DAHDITDITDAHDAHDAHDITDAHDITDAHDAHDAHDITDAHDIT"
36
43
  ```
37
44
 
38
45
  ### Decode
@@ -41,14 +48,16 @@ $> DITDIT / DITDAH DAHDAH / DITDAHDIT DAHDAHDAH DAHDITDITDIT DAHDAHDAH DAH DITDA
41
48
  require 'morse_code'
42
49
 
43
50
  content = '.. / .- -- / .-. --- -... --- - .-.-.-'
44
- decode_content = MorseCode::Decoder.new(content).decode
45
- puts decode_content
46
- $> I AM ROBOT.
51
+ MorseCode::Decoder.new(content).decode
52
+ $> "I AM ROBOT."
47
53
 
48
54
  dit_dah = 'DITDIT / DITDAH DAHDAH / DITDAHDIT DAHDAHDAH DAHDITDITDIT DAHDAHDAH DAH DITDAHDITDAHDITDAH'
49
- dit_dah_to = MorseCode::Decoder.new(dit_dah).dit_dah_to
50
- puts dit_dah_to
51
- $> I AM ROBOT.
55
+ MorseCode::Decoder.new(dit_dah).dit_dah_to
56
+ $> "I AM ROBOT."
57
+
58
+ content = '--...-....-...- --..--...-.---- -..---...-.--.- -.-.--.------.- -..---.-.---.-.'
59
+ MorseCode::Decoder.new(content).decode
60
+ $> "我是中国人"
52
61
  ```
53
62
 
54
63
  ### Terminal
@@ -65,20 +74,26 @@ mc commands:
65
74
 
66
75
  ```shell
67
76
  $> mc -e 'I am Robot.'
68
- .. / .- -- / .-. --- -... --- - .-.-.-
77
+ $> ".. / .- -- / .-. --- -... --- - .-.-.-"
69
78
 
70
79
  $> mc -e 'I am Robot.' --dit-dah
71
- DITDIT / DITDAH DAHDAH / DITDAHDIT DAHDAHDAH DAHDITDITDIT DAHDAHDAH DAH DITDAHDITDAHDITDAH
80
+ $> "DITDIT / DITDAH DAHDAH / DITDAHDIT DAHDAHDAH DAHDITDITDIT DAHDAHDAH DAH DITDAHDITDAHDITDAH"
81
+
82
+ $> mc -e '我是中国人'
83
+ $> "--...-....-...- --..--...-.---- -..---...-.--.- -.-.--.------.- -..---.-.---.-."
72
84
  ```
73
85
 
74
86
  #### decode
75
87
 
76
88
  ```shell
77
89
  $> mc -d '.. / .- -- / .-. --- -... --- - .-.-.-'
78
- I AM ROBOT.
90
+ $> "I AM ROBOT."
79
91
 
80
92
  $> mc -d 'DITDIT / DITDAH DAHDAH / DITDAHDIT DAHDAHDAH DAHDITDITDIT DAHDAHDAH DAH DITDAHDITDAHDITDAH' --dit-dah
81
- I AM ROBOT.
93
+ $> "I AM ROBOT."
94
+
95
+ $> mc -d '--...-....-...- --..--...-.---- -..---...-.--.- -.-.--.------.- -..---.-.---.-.'
96
+ $> "我是中国人"
82
97
  ```
83
98
 
84
99
  ### Contributing
@@ -1,4 +1,7 @@
1
1
  require 'morse_code/error'
2
+ require 'morse_code/decoders/base'
3
+ require 'morse_code/decoders/chinese'
4
+ require 'morse_code/decoders/english'
2
5
 
3
6
  module MorseCode
4
7
  class Decoder
@@ -14,7 +17,7 @@ module MorseCode
14
17
  decode_words.push(word.join)
15
18
  word = []
16
19
  else
17
- word.push(MorseCode::DECODE_MAP[char] || char)
20
+ word.push(decode_char(char))
18
21
  end
19
22
  end
20
23
  decode_words.push(word.join) if word.size > 0
@@ -26,5 +29,13 @@ module MorseCode
26
29
  decode
27
30
  end
28
31
  alias dit_dah_to decode_with
32
+
33
+ private
34
+
35
+ def decode_char(char)
36
+ supported_class = MorseCode::Decoders::Base.new(char).supported_class
37
+ return supported_class.new(char).decode if supported_class
38
+ return char
39
+ end
29
40
  end
30
41
  end
@@ -0,0 +1,29 @@
1
+ require 'morse_code/error'
2
+
3
+ module MorseCode
4
+ module Decoders
5
+ class Base
6
+
7
+ def self.inherited(subclass)
8
+ @@subclasses ||= []
9
+ @@subclasses << subclass
10
+ end
11
+
12
+ attr_reader :word
13
+
14
+ def initialize(word = '')
15
+ @word = word
16
+ end
17
+
18
+ def supported?
19
+ raise NotImplementedError, 'Subclass must override supported? method'
20
+ end
21
+
22
+ def supported_class
23
+ supported_class = Array(@@subclasses).detect { |subclass| subclass.new(word).supported? }
24
+ puts "[WARING] Not Classs can decode this #{word}!" unless supported_class
25
+ supported_class
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,26 @@
1
+ require 'morse_code/error'
2
+ require_relative 'base'
3
+
4
+ module MorseCode
5
+ module Decoders
6
+ class Chinese < Base
7
+
8
+ MIN_CHINESE_CODEPOINT = 19_968 # \u4e00
9
+ MAX_CHINESE_CODEPOINT = 40_869 # \u9fa5
10
+
11
+ def supported?
12
+ decode_binary_word >= MIN_CHINESE_CODEPOINT && decode_binary_word <= MAX_CHINESE_CODEPOINT
13
+ end
14
+
15
+ def decode
16
+ decode_binary_word.chr('UTF-8')
17
+ end
18
+
19
+ private
20
+
21
+ def decode_binary_word
22
+ @decode_binary_word ||= word.gsub('.', '0').gsub('-', '1').to_i(2)
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,17 @@
1
+ require 'morse_code/error'
2
+ require_relative 'base'
3
+
4
+ module MorseCode
5
+ module Decoders
6
+ class English < Base
7
+
8
+ def supported?
9
+ !MorseCode::DECODE_MAP[word].nil?
10
+ end
11
+
12
+ def decode
13
+ MorseCode::DECODE_MAP[word]
14
+ end
15
+ end
16
+ end
17
+ end
@@ -1,4 +1,7 @@
1
1
  require 'morse_code/error'
2
+ require 'morse_code/encoders/base'
3
+ require 'morse_code/encoders/chinese'
4
+ require 'morse_code/encoders/english'
2
5
 
3
6
  module MorseCode
4
7
  class Encoder
@@ -9,10 +12,7 @@ module MorseCode
9
12
  def encode
10
13
  [].tap do |encode_words|
11
14
  @message.split(/\s+/).each do |word|
12
- encode_word = []
13
- word.each_char { |char| encode_word << (MorseCode::ENCODE_MAP[char] || char) }
14
- encode_word.push('/')
15
- encode_words.concat(encode_word)
15
+ encode_words.concat(encode_word(word))
16
16
  end
17
17
  encode_words.pop
18
18
  end.join(' ')
@@ -22,5 +22,19 @@ module MorseCode
22
22
  encode.tap { |message| message.gsub!('.', 'DIT'); message.gsub!('-', 'DAH') }
23
23
  end
24
24
  alias dit_dah encode_with
25
+
26
+ private
27
+
28
+ def encode_word(word)
29
+ encode_word = []
30
+ word.each_char { |char| encode_word << encode_letter(char) }
31
+ encode_word.push('/')
32
+ end
33
+
34
+ def encode_letter(letter)
35
+ supported_class = MorseCode::Encoders::Base.new(letter).supported_class
36
+ return supported_class.new(letter).encode if supported_class
37
+ return letter
38
+ end
25
39
  end
26
40
  end
@@ -0,0 +1,29 @@
1
+ require 'morse_code/error'
2
+
3
+ module MorseCode
4
+ module Encoders
5
+ class Base
6
+
7
+ def self.inherited(subclass)
8
+ @@subclasses ||= []
9
+ @@subclasses << subclass
10
+ end
11
+
12
+ attr_reader :word
13
+
14
+ def initialize(word = '')
15
+ @word = word
16
+ end
17
+
18
+ def supported?
19
+ raise NotImplementedError, 'Subclass must override supported? method'
20
+ end
21
+
22
+ def supported_class
23
+ supported_class = Array(@@subclasses).detect { |subclass| subclass.new(word).supported? }
24
+ puts "[WARING] Not Classs can encode #{word}!" unless supported_class
25
+ supported_class
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,17 @@
1
+ require 'morse_code/error'
2
+ require_relative 'base'
3
+
4
+ module MorseCode
5
+ module Encoders
6
+ class Chinese < Base
7
+
8
+ def supported?
9
+ !/\p{Han}/.match(word).nil? # \u4e00-\u9fa5
10
+ end
11
+
12
+ def encode
13
+ word.ord.to_s(2).gsub!('0', '.').gsub!('1', '-')
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,17 @@
1
+ require 'morse_code/error'
2
+ require_relative 'base'
3
+
4
+ module MorseCode
5
+ module Encoders
6
+ class English < Base
7
+
8
+ def supported?
9
+ !MorseCode::ENCODE_MAP[word].nil?
10
+ end
11
+
12
+ def encode
13
+ MorseCode::ENCODE_MAP[word]
14
+ end
15
+ end
16
+ end
17
+ end
@@ -1,5 +1,7 @@
1
1
  module MorseCode
2
2
  class Error < StandardError; end
3
3
 
4
- class NotSupported < Error; end
4
+ class NotSupportedError < Error; end
5
+
6
+ class NotImplementedError < Error; end
5
7
  end
@@ -1,3 +1,3 @@
1
1
  module MorseCode
2
- VERSION = '0.2.1'.freeze
2
+ VERSION = '0.3.0'.freeze
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: morse-code-rb
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.1
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - YingRui Lu
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-10-14 00:00:00.000000000 Z
11
+ date: 2018-10-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -163,7 +163,13 @@ files:
163
163
  - lib/morse_code.rb
164
164
  - lib/morse_code/cli.rb
165
165
  - lib/morse_code/decoder.rb
166
+ - lib/morse_code/decoders/base.rb
167
+ - lib/morse_code/decoders/chinese.rb
168
+ - lib/morse_code/decoders/english.rb
166
169
  - lib/morse_code/encoder.rb
170
+ - lib/morse_code/encoders/base.rb
171
+ - lib/morse_code/encoders/chinese.rb
172
+ - lib/morse_code/encoders/english.rb
167
173
  - lib/morse_code/error.rb
168
174
  - lib/morse_code/version.rb
169
175
  homepage: https://github.com/superiorlu/morse_code