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 +4 -4
- data/README.md +31 -16
- data/lib/morse_code/decoder.rb +12 -1
- data/lib/morse_code/decoders/base.rb +29 -0
- data/lib/morse_code/decoders/chinese.rb +26 -0
- data/lib/morse_code/decoders/english.rb +17 -0
- data/lib/morse_code/encoder.rb +18 -4
- data/lib/morse_code/encoders/base.rb +29 -0
- data/lib/morse_code/encoders/chinese.rb +17 -0
- data/lib/morse_code/encoders/english.rb +17 -0
- data/lib/morse_code/error.rb +3 -1
- data/lib/morse_code/version.rb +1 -1
- metadata +8 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5d52693f5ba4566000e1e1b3dbf4601e0639854f
|
4
|
+
data.tar.gz: c9e11a75d919dfabdfa5e6d45f93740790f7c4f0
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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
|
+
[](https://rubygems.org/gems/morse-code-rb) [](https://travis-ci.org/superiorlu/morse_code) [](https://codeclimate.com/github/superiorlu/morse_code/maintainability) [](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
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
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
|
-
$>
|
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
|
-
|
45
|
-
|
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
|
-
|
50
|
-
|
51
|
-
|
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
|
data/lib/morse_code/decoder.rb
CHANGED
@@ -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(
|
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
|
data/lib/morse_code/encoder.rb
CHANGED
@@ -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
|
data/lib/morse_code/error.rb
CHANGED
data/lib/morse_code/version.rb
CHANGED
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.
|
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-
|
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
|