termit 1.2.2 → 2.0.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/.gitignore +1 -0
- data/README.md +28 -18
- data/bin/termit +3 -16
- data/lib/termit.rb +3 -1
- data/lib/termit/data_fetcher.rb +1 -0
- data/lib/termit/main.rb +2 -1
- data/lib/termit/modules/delegation.rb +11 -0
- data/lib/termit/output_manager.rb +34 -0
- data/lib/termit/sound_response_handler.rb +2 -1
- data/lib/termit/speech_synthesizer.rb +1 -0
- data/lib/termit/text_response_handler.rb +29 -7
- data/lib/termit/text_translator.rb +3 -7
- data/lib/termit/url_constructor.rb +9 -10
- data/lib/termit/user_input_parser.rb +30 -14
- data/lib/termit/version.rb +1 -1
- data/spec/fixtures/google_1.yml +73 -0
- data/spec/fixtures/google_2.yml +67 -0
- data/spec/fixtures/text_response +1 -1
- data/spec/termit/data_fetcher_spec.rb +1 -0
- data/spec/termit/main_spec.rb +2 -2
- data/spec/termit/output_manager_spec.rb +28 -0
- data/spec/termit/sound_response_handler_spec.rb +1 -0
- data/spec/termit/text_response_handler_spec.rb +22 -5
- data/spec/termit/text_translator_spec.rb +13 -3
- data/spec/termit/url_constructor_spec.rb +7 -5
- data/spec/termit/user_input_parser_spec.rb +24 -16
- metadata +16 -10
- data/spec/fixtures/google_translate.yml +0 -582
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1cf7b6172a5154290b498284dd9905edf9a39a7f
|
4
|
+
data.tar.gz: 424b0e353b635f690344f4018d7a08a3a67f5c25
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: dc71554597190cebb2e2d3dc453cfd9fe5fb42fcf0bea4ba1854bb8fc44a99aacbec8f1a468a7cf9af0b0b34c2cf0f31ddcf174e12812e4f25fe664733e671c5
|
7
|
+
data.tar.gz: 739ed90976ed42c59773d754f43b48e9a8c635878cce6d60961cc7779f216eb19e0a7c68d341c5332e3eada1792baff9ad64dbdb54a7f2316f0bd4022bc5d8b8
|
data/.gitignore
CHANGED
data/README.md
CHANGED
@@ -3,19 +3,10 @@
|
|
3
3
|
|
4
4
|
Termit is an easy way to use Google Translate in your terminal. It does not use paid Google Translate API but instead it headlessly browses www.translate.google.com and parses the response.
|
5
5
|
|
6
|
-
##
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
To use speech synthesis (yes it talks) you need to have mpg123 installed.
|
11
|
-
|
12
|
-
For Ubuntu:
|
13
|
-
|
14
|
-
sudo apt-get install mpg123
|
15
|
-
|
16
|
-
For MacOSX:
|
17
|
-
|
18
|
-
brew install mpg123
|
6
|
+
## Installation
|
7
|
+
```ruby
|
8
|
+
gem install termit
|
9
|
+
```
|
19
10
|
|
20
11
|
## Usage
|
21
12
|
```ruby
|
@@ -25,7 +16,6 @@ termit 'source_language' 'target_language' 'text'
|
|
25
16
|
Example:
|
26
17
|
|
27
18
|
```ruby
|
28
|
-
gem install termit
|
29
19
|
|
30
20
|
termit en es "hey cowboy where is your horse?"
|
31
21
|
=> "Hey vaquero dónde está tu caballo?"
|
@@ -41,12 +31,23 @@ termit fr ru qui est votre papa?
|
|
41
31
|
```
|
42
32
|
#### Speech synthesis
|
43
33
|
|
44
|
-
Specify a **-
|
34
|
+
Specify a **-t** (talk) flag to use speech synthesis:
|
45
35
|
``` ruby
|
46
36
|
termit en zh "hey cowboy where is your horse?" -v
|
47
|
-
=> "嘿,牛仔是你的马在哪里?" #and a
|
37
|
+
=> "嘿,牛仔是你的马在哪里?" #and a chinese voice says something about a horse
|
48
38
|
```
|
49
39
|
|
40
|
+
#### Synonyms
|
41
|
+
|
42
|
+
Specify a **-s** (synonyms) flag to get the list of synonyms if available:
|
43
|
+
``` ruby
|
44
|
+
termit es en muchacho -s
|
45
|
+
=> boy
|
46
|
+
=> Synonyms: boy, lad, youngster, laddie, cully
|
47
|
+
```
|
48
|
+
|
49
|
+
|
50
|
+
|
50
51
|
## Language codes:
|
51
52
|
* english - en
|
52
53
|
* polish - pl
|
@@ -59,15 +60,24 @@ termit en zh "hey cowboy where is your horse?" -v
|
|
59
60
|
|
60
61
|
To find all available language codes visit www.translate.google.com. Choose langauges and their codes will appear in the url.
|
61
62
|
|
62
|
-
##
|
63
|
+
## Requirements
|
64
|
+
|
65
|
+
Works with Ruby 1.9.2 and higher.
|
66
|
+
|
67
|
+
To use speech synthesis (yes it talks) you need to have mpg123 installed.
|
68
|
+
|
69
|
+
For Ubuntu:
|
63
70
|
|
64
|
-
|
71
|
+
sudo apt-get install mpg123
|
65
72
|
|
73
|
+
For MacOSX:
|
66
74
|
|
75
|
+
brew install mpg123
|
67
76
|
|
68
77
|
|
69
78
|
|
70
79
|
|
80
|
+
Any feedback will be appreciated. You can contact me on: p.urbanek89@gmail.com
|
71
81
|
|
72
82
|
|
73
83
|
|
data/bin/termit
CHANGED
@@ -5,20 +5,7 @@ $LOAD_PATH.unshift(File.dirname(__FILE__) + '/../lib') unless $LOAD_PATH.include
|
|
5
5
|
|
6
6
|
require 'termit'
|
7
7
|
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
puts "USAGE:"
|
12
|
-
puts "termit 'source_language' 'target_language' 'text'"
|
13
|
-
puts ""
|
14
|
-
puts 'Example:'
|
15
|
-
puts "termit en fr 'hey cowboy where is your horse?'"
|
16
|
-
puts "=> 'hey cow-boy ou est votre cheval?'"
|
17
|
-
puts ""
|
18
|
-
puts "Check docs at: github.com/pawurb/termit "
|
19
|
-
puts ""
|
20
|
-
else
|
21
|
-
options = Termit::UserInputParser.new(ARGV).options
|
22
|
-
Termit::Main.new(options).translate
|
23
|
-
end
|
8
|
+
options = Termit::UserInputParser.new(ARGV).options
|
9
|
+
Termit::Main.new(options).translate
|
10
|
+
|
24
11
|
|
data/lib/termit.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
require 'termit/modules/delegation'
|
2
|
+
require 'termit/output_manager'
|
1
3
|
require 'termit/user_input_parser'
|
2
4
|
require 'termit/main'
|
3
5
|
require 'termit/sound_response_handler'
|
@@ -8,4 +10,4 @@ require 'termit/data_fetcher'
|
|
8
10
|
require 'termit/text_response_handler'
|
9
11
|
|
10
12
|
module Termit
|
11
|
-
end
|
13
|
+
end
|
data/lib/termit/data_fetcher.rb
CHANGED
data/lib/termit/main.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
#encoding: UTF-8
|
1
2
|
module Termit
|
2
3
|
class Main
|
3
4
|
def initialize options
|
@@ -7,7 +8,7 @@ module Termit
|
|
7
8
|
def translate
|
8
9
|
text_translator = Termit::TextTranslator.new(@options)
|
9
10
|
text_translator.call
|
10
|
-
speech_synthesis text_translator.text if @options[:
|
11
|
+
speech_synthesis text_translator.text if @options[:talk]
|
11
12
|
end
|
12
13
|
|
13
14
|
private
|
@@ -0,0 +1,34 @@
|
|
1
|
+
#encoding: UTF-8
|
2
|
+
class Termit::OutputManager
|
3
|
+
def display_error_info
|
4
|
+
puts "TERMIT: Wrong data. Example: 'termit en es the cowboy ' => 'el vaquero"
|
5
|
+
end
|
6
|
+
|
7
|
+
def display_help
|
8
|
+
puts <<-EOS
|
9
|
+
=========TERMIT=========
|
10
|
+
USAGE:
|
11
|
+
termit 'source_language' 'target_language' 'text'
|
12
|
+
|
13
|
+
Example:
|
14
|
+
termit en fr 'hey cowboy where is your horse?'
|
15
|
+
=> 'hey cow-boy ou est votre cheval?'
|
16
|
+
|
17
|
+
Check docs at: github.com/pawurb/termit
|
18
|
+
EOS
|
19
|
+
end
|
20
|
+
|
21
|
+
def display_version
|
22
|
+
puts "Termit #{Termit::VERSION}"
|
23
|
+
end
|
24
|
+
|
25
|
+
def display_translation text
|
26
|
+
print "=> "
|
27
|
+
puts text
|
28
|
+
end
|
29
|
+
|
30
|
+
def display_synonyms synonyms
|
31
|
+
print '=> Synonyms:'
|
32
|
+
puts synonyms
|
33
|
+
end
|
34
|
+
end
|
@@ -1,3 +1,4 @@
|
|
1
|
+
#encoding: UTF-8
|
1
2
|
require 'fileutils'
|
2
3
|
|
3
4
|
module Termit
|
@@ -7,7 +8,7 @@ module Termit
|
|
7
8
|
end
|
8
9
|
|
9
10
|
def call
|
10
|
-
location = "#{File.expand_path('~')}/.
|
11
|
+
location = "#{File.expand_path('~')}/.termit"
|
11
12
|
create_target_dir location
|
12
13
|
File.open("#{location}/sound_response.mpeg", "wb") do |file|
|
13
14
|
file.write(@data)
|
@@ -1,20 +1,42 @@
|
|
1
|
+
#encoding: UTF-8
|
1
2
|
module Termit
|
2
3
|
class TextResponseHandler
|
3
|
-
|
4
|
-
|
4
|
+
extend ::Delegation
|
5
|
+
@output_manager = Termit::OutputManager.new
|
6
|
+
delegate :display_synonyms, :display_translation, to: @output_manager
|
7
|
+
|
8
|
+
def initialize text, synonyms_wanted
|
9
|
+
@text = decode text
|
10
|
+
@synonyms_wanted = synonyms_wanted
|
5
11
|
end
|
6
12
|
|
7
13
|
def call
|
8
|
-
|
14
|
+
translation = extract_translation
|
15
|
+
display_translation translation
|
16
|
+
display_synonyms extract_synonyms if @synonyms_wanted
|
17
|
+
translation
|
9
18
|
end
|
10
19
|
|
11
20
|
private
|
12
21
|
|
13
|
-
def
|
14
|
-
|
22
|
+
def extract_translation
|
23
|
+
@text.split("[[")[1].split("\"")[1]
|
24
|
+
end
|
25
|
+
|
26
|
+
def extract_synonyms
|
27
|
+
synonyms_data = @text.split("[[")[2].split("[")[1]
|
28
|
+
length = synonyms_data.length
|
29
|
+
if synonyms_data[0] == '4' # my code works i have no idea why ..
|
30
|
+
" ---"
|
31
|
+
else
|
32
|
+
synonyms_data[0..(length-3)].delete("\"").gsub(/(,)/, ", ")
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
def decode text
|
15
37
|
encoding = 'UTF-8'
|
16
|
-
|
17
|
-
|
38
|
+
text.gsub!(/(\\x26#39;)/, "'")
|
39
|
+
text.force_encoding(encoding).encode(encoding)
|
18
40
|
end
|
19
41
|
end
|
20
42
|
end
|
@@ -1,20 +1,16 @@
|
|
1
|
+
#encoding: UTF-8
|
1
2
|
module Termit
|
2
3
|
class TextTranslator
|
3
4
|
attr_reader :text
|
4
5
|
|
5
6
|
def initialize options
|
6
|
-
@options = options.merge(
|
7
|
+
@options = options.merge(talk: false)
|
7
8
|
@url = Termit::UrlConstructor.new(@options).url
|
8
9
|
end
|
9
10
|
|
10
11
|
def call
|
11
12
|
response = Termit::DataFetcher.new(@url, @options[:text]).data
|
12
|
-
|
13
|
-
@text = Termit::TextResponseHandler.new(response.body).call
|
14
|
-
end
|
15
|
-
|
16
|
-
def print_info
|
17
|
-
puts "Translation from #{@options[:source_lang].upcase} to #{@options[:target_lang].upcase}:"
|
13
|
+
@text = Termit::TextResponseHandler.new(response.body, @options[:synonyms]).call
|
18
14
|
end
|
19
15
|
end
|
20
16
|
end
|
@@ -1,12 +1,15 @@
|
|
1
|
+
#encoding: UTF-8
|
1
2
|
module Termit
|
2
3
|
class UrlConstructor
|
4
|
+
Host = "http://translate.google.com"
|
5
|
+
|
3
6
|
def initialize options
|
4
7
|
@options = options
|
5
8
|
end
|
6
9
|
|
7
10
|
def url
|
8
|
-
if @options[:
|
9
|
-
|
11
|
+
if @options[:talk]
|
12
|
+
construct_sound_url
|
10
13
|
else
|
11
14
|
construct_text_url
|
12
15
|
end
|
@@ -15,15 +18,11 @@ module Termit
|
|
15
18
|
private
|
16
19
|
|
17
20
|
def construct_text_url
|
18
|
-
"#{
|
19
|
-
end
|
20
|
-
|
21
|
-
def construct_voice_url
|
22
|
-
"#{host}/translate_tts?tl=#{@options[:target_lang]}&ie=UTF-8&oe=UTF-8"
|
21
|
+
"#{Host}/translate_a/t?client=t&sl=#{@options[:source_lang]}&tl=#{@options[:target_lang]}&hl=pl&sc=2&ie=UTF-8&oe=UTF-8&prev=enter&ssel=0&tsel=0&"
|
23
22
|
end
|
24
23
|
|
25
|
-
def
|
26
|
-
"
|
24
|
+
def construct_sound_url
|
25
|
+
"#{Host}/translate_tts?tl=#{@options[:target_lang]}&ie=UTF-8&oe=UTF-8"
|
27
26
|
end
|
28
27
|
end
|
29
|
-
end
|
28
|
+
end
|
@@ -1,39 +1,55 @@
|
|
1
|
+
#encoding: UTF-8
|
1
2
|
module Termit
|
2
3
|
class UserInputParser
|
4
|
+
extend ::Delegation
|
5
|
+
@output_manager = Termit::OutputManager.new
|
6
|
+
|
7
|
+
delegate :display_error_info, :display_help, :display_version, to: @output_manager
|
3
8
|
def initialize user_input
|
4
|
-
raise ArgumentError unless user_input.is_a? Array
|
5
9
|
@user_input = user_input
|
10
|
+
quit_if_required
|
11
|
+
validate_user_input
|
6
12
|
end
|
7
13
|
|
8
14
|
def options
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
rescue ArgumentError, NoMethodError
|
13
|
-
puts "TERMIT: Wrong data. Example: 'termit pl en morowy' => pestiferous"
|
15
|
+
parse_input
|
16
|
+
rescue ArgumentError
|
17
|
+
display_error_info
|
14
18
|
exit
|
15
19
|
end
|
16
20
|
|
17
|
-
|
18
21
|
private
|
19
22
|
|
20
23
|
def parse_input
|
21
|
-
|
22
|
-
|
24
|
+
{
|
25
|
+
talk: extract_flag('t'),
|
26
|
+
synonyms: extract_flag('s'),
|
23
27
|
source_lang: @user_input.shift.to_sym,
|
24
28
|
target_lang: @user_input.shift.to_sym,
|
25
29
|
text: @user_input.join(' ')
|
26
30
|
}
|
27
31
|
end
|
28
32
|
|
29
|
-
def
|
30
|
-
flag_index = @user_input.index(
|
33
|
+
def extract_flag(symbol)
|
34
|
+
flag_index = @user_input.index("-#{symbol}")
|
31
35
|
flag_index ? !!@user_input.delete_at(flag_index) : false
|
32
36
|
end
|
33
37
|
|
34
|
-
def validate_user_input
|
35
|
-
|
36
|
-
|
38
|
+
def validate_user_input
|
39
|
+
raise ArgumentError unless @user_input.is_a? Array
|
40
|
+
[0, 1].each do |index|
|
41
|
+
raise ArgumentError unless [2, 4].include?(@user_input[index].length)
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
def quit_if_required
|
46
|
+
if @user_input.index("-h") || @user_input.empty?
|
47
|
+
display_help
|
48
|
+
exit
|
49
|
+
end
|
50
|
+
if @user_input.index("-v")
|
51
|
+
display_version
|
52
|
+
exit
|
37
53
|
end
|
38
54
|
end
|
39
55
|
end
|
data/lib/termit/version.rb
CHANGED
@@ -0,0 +1,73 @@
|
|
1
|
+
---
|
2
|
+
http_interactions:
|
3
|
+
- request:
|
4
|
+
method: post
|
5
|
+
uri: http://translate.google.com/translate_a/t?client=t&hl=pl&ie=UTF-8&oe=UTF-8&prev=enter&sc=2&sl=en&ssel=0&tl=pl&tsel=0
|
6
|
+
body:
|
7
|
+
encoding: US-ASCII
|
8
|
+
string: text=hey+cowboy+where+is+your+horse
|
9
|
+
headers:
|
10
|
+
Accept-Encoding:
|
11
|
+
- gzip;q=1.0,deflate;q=0.6,identity;q=0.3
|
12
|
+
Accept:
|
13
|
+
- '*/*'
|
14
|
+
User-Agent:
|
15
|
+
- Ruby
|
16
|
+
Content-Type:
|
17
|
+
- application/x-www-form-urlencoded
|
18
|
+
response:
|
19
|
+
status:
|
20
|
+
code: 200
|
21
|
+
message: OK
|
22
|
+
headers:
|
23
|
+
Pragma:
|
24
|
+
- no-cache
|
25
|
+
Date:
|
26
|
+
- Wed, 23 Oct 2013 15:15:36 GMT
|
27
|
+
Expires:
|
28
|
+
- Wed, 23 Oct 2013 15:15:36 GMT
|
29
|
+
Cache-Control:
|
30
|
+
- private, max-age=600
|
31
|
+
Content-Type:
|
32
|
+
- text/javascript; charset=UTF-8
|
33
|
+
Content-Language:
|
34
|
+
- pl
|
35
|
+
Set-Cookie:
|
36
|
+
- PREF=ID=59f956040e7bb9f8:TM=1382541336:LM=1382541336:S=8F7wmAjCUSXM3gWD; expires=Fri,
|
37
|
+
23-Oct-2015 15:15:36 GMT; path=/; domain=.google.com
|
38
|
+
X-Content-Type-Options:
|
39
|
+
- nosniff
|
40
|
+
Content-Disposition:
|
41
|
+
- attachment
|
42
|
+
Server:
|
43
|
+
- HTTP server (unknown)
|
44
|
+
X-Xss-Protection:
|
45
|
+
- 1; mode=block
|
46
|
+
Alternate-Protocol:
|
47
|
+
- 80:quic
|
48
|
+
Transfer-Encoding:
|
49
|
+
- chunked
|
50
|
+
body:
|
51
|
+
encoding: ASCII-8BIT
|
52
|
+
string: !binary |-
|
53
|
+
W1tbImhleSBjb3dib3kgZ2R6aWUgamVzdCB0d8OzaiBrb8WEIiwiaGV5IGNv
|
54
|
+
d2JveSB3aGVyZSBpcyB5b3VyIGhvcnNlIiwiIiwiIl1dLCwiZW4iLCxbWyJo
|
55
|
+
ZXkiLFs0XSwxLDAsNzk3LDAsMSwwXSxbImNvd2JveSIsWzVdLDEsMCw3OTEs
|
56
|
+
MSwyLDBdLFsiZ2R6aWUiLFs2XSwxLDAsNzU5LDIsMywwXSxbImplc3QiLFs3
|
57
|
+
XSwxLDAsNzU3LDMsNCwwXSxbInR3w7NqIGtvxYQiLFs4XSwxLDAsNzAzLDQs
|
58
|
+
NiwwXV0sW1siaGV5Iiw0LFtbImhleSIsNzk3LDEsMF0sWyJoZWoiLDIwMiwx
|
59
|
+
LDBdLFsiQ3plxZvEhyIsMCwxLDBdXSxbWzAsM11dLCJoZXkgY293Ym95IHdo
|
60
|
+
ZXJlIGlzIHlvdXIgaG9yc2UiXSxbImNvd2JveSIsNSxbWyJjb3dib3kiLDc5
|
61
|
+
MSwxLDBdLFsia293Ym9qIiw1LDEsMF0sWyJrb3dib2plbSIsMCwxLDBdLFsi
|
62
|
+
a293Ym9qc2tpZSIsMCwxLDBdLFsia293Ym9qc2tpIiwwLDEsMF1dLFtbNCwx
|
63
|
+
MF1dLCIiXSxbIndoZXJlIiw2LFtbImdkemllIiw3NTksMSwwXSxbImt0w7Ny
|
64
|
+
eW0iLDAsMSwwXSxbImt0w7NyeWNoIiwwLDEsMF0sWyJ3IGt0w7NyeW0iLDAs
|
65
|
+
MSwwXV0sW1sxMSwxNl1dLCIiXSxbImlzIiw3LFtbImplc3QiLDc1NywxLDBd
|
66
|
+
LFsidG8iLDAsMSwwXSxbIm1hIiwwLDEsMF0sWyJ6bmFqZHVqZSIsMCwxLDBd
|
67
|
+
LFsic2nEmSIsMCwxLDBdXSxbWzE3LDE5XV0sIiJdLFsieW91ciBob3JzZSIs
|
68
|
+
OCxbWyJ0d8OzaiBrb8WEIiw3MDMsMSwwXSxbImtvxYQiLDUzLDEsMF0sWyJr
|
69
|
+
b25pYSIsMCwxLDBdLFsidHdvamVnbyBrb25pYSIsMCwxLDBdLFsic3dvamVn
|
70
|
+
byBrb25pYSIsMCwxLDBdXSxbWzIwLDMwXV0sIiJdXSwsLFtbImVuIl1dLDFd
|
71
|
+
http_version:
|
72
|
+
recorded_at: Wed, 23 Oct 2013 15:15:36 GMT
|
73
|
+
recorded_with: VCR 2.5.0
|