termit 1.2.2 → 2.0.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|