morse-code-rb 0.2.1 → 0.3.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 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