dict 0.1.5 → 0.1.6
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.
- data/bin/translate +3 -29
- data/lib/dict.rb +19 -5
- data/lib/dictionary.rb +33 -0
- data/lib/dictpl.rb +9 -45
- data/lib/module_main.rb +67 -0
- data/lib/wiktionary.rb +13 -93
- metadata +4 -3
- data/lib/result.rb +0 -37
data/bin/translate
CHANGED
@@ -1,33 +1,7 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
1
|
# -*- coding: utf-8 -*-
|
3
2
|
|
4
|
-
|
5
|
-
require 'slop'
|
6
|
-
|
7
|
-
if ARGV.empty? then puts "Please enter the word. (-h for help)" ; exit end
|
8
|
-
|
9
|
-
opts = Slop.parse do
|
10
|
-
banner "Usage: $translate -w word [Options]"
|
11
|
-
on '-w', :word=, 'after this option is a word to translate'
|
12
|
-
on '-h', :help=, 'help', :argument => :optional
|
13
|
-
on '-s', :services=, 'available services', :argument => :optional
|
14
|
-
#on '-t', :time=, 'time in seconds, default: 300 seconds', :as => :int
|
15
|
-
on '-d', :dict=, 'dictionaries: wiktionary, dictpl; default is all dictionaries'
|
16
|
-
end
|
17
|
-
|
18
|
-
# translation
|
19
|
-
if opts.word?
|
20
|
-
if opts.dict?
|
21
|
-
puts Dict.get_single_dictionary_translations(opts[:word],opts[:dict])
|
22
|
-
else
|
23
|
-
puts Dict.get_all_dictionaries_translations(opts[:word])
|
24
|
-
end
|
25
|
-
end
|
26
|
-
|
27
|
-
# help
|
28
|
-
puts opts if opts.help?
|
29
|
-
|
30
|
-
# services
|
31
|
-
puts Dict.available_services if opts.services?
|
3
|
+
require_relative '../lib/module_main.rb'
|
32
4
|
|
5
|
+
opts = Hash.new
|
33
6
|
|
7
|
+
Main::main(opts)
|
data/lib/dict.rb
CHANGED
@@ -1,8 +1,8 @@
|
|
1
|
-
#!/usr/bin/ruby -w
|
2
1
|
# -*- coding: utf-8 -*-
|
3
2
|
|
4
3
|
require_relative 'wiktionary'
|
5
4
|
require_relative 'dictpl'
|
5
|
+
require 'json'
|
6
6
|
|
7
7
|
module Dict
|
8
8
|
class << self
|
@@ -12,20 +12,34 @@ module Dict
|
|
12
12
|
available_services.each do |service|
|
13
13
|
dictionaries[service] = get_single_dictionary_translations(word, service)
|
14
14
|
end
|
15
|
-
|
16
15
|
dictionaries
|
17
16
|
end
|
18
17
|
|
18
|
+
def print_all_dictionaries_translations(word)
|
19
|
+
end
|
20
|
+
|
19
21
|
def get_single_dictionary_translations(word, service)
|
20
22
|
case service
|
21
23
|
when 'wiktionary'
|
22
|
-
Wiktionary.new(word).translate
|
24
|
+
Wiktionary.new(word, WIKI_URL).translate
|
23
25
|
when 'dictpl'
|
24
|
-
Dictpl.new(word).translate
|
25
|
-
else
|
26
|
+
Dictpl.new(word, DICT_URL).translate
|
27
|
+
else Dictionary.message
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def print_single_dictionary_translations(word, service)
|
32
|
+
obj = get_single_dictionary_translations(word, service)
|
33
|
+
hash = obj.translate
|
34
|
+
hash.each do |k, v|
|
35
|
+
puts "#{k} - #{v}"
|
26
36
|
end
|
27
37
|
end
|
28
38
|
|
39
|
+
def to_json(hash)
|
40
|
+
hash.to_json
|
41
|
+
end
|
42
|
+
|
29
43
|
def available_services
|
30
44
|
['wiktionary', 'dictpl']
|
31
45
|
end
|
data/lib/dictionary.rb
ADDED
@@ -0,0 +1,33 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
|
3
|
+
require 'open-uri'
|
4
|
+
|
5
|
+
class Dictionary
|
6
|
+
attr_accessor :translations, :examples
|
7
|
+
def initialize(word, url)
|
8
|
+
check_arguments(word)
|
9
|
+
@translations = []
|
10
|
+
@examples = []
|
11
|
+
@uri = URI(URI.escape(url + word.downcase.tr(' ', '_')))
|
12
|
+
end
|
13
|
+
|
14
|
+
def make_hash_results(arr)
|
15
|
+
hash = arr.each_slice(2).inject({}) do |h, (key, value)|
|
16
|
+
if h.has_key?(key)
|
17
|
+
h[key].push(value) ; h
|
18
|
+
else
|
19
|
+
h[key] = [value] ; h
|
20
|
+
end
|
21
|
+
end
|
22
|
+
@translations, @examples = hash.keys, hash.values
|
23
|
+
hash
|
24
|
+
end
|
25
|
+
|
26
|
+
def check_arguments(word)
|
27
|
+
raise ArgumentError.new("No given word") if word.empty?
|
28
|
+
end
|
29
|
+
|
30
|
+
def self.message
|
31
|
+
'There\'s no such dictionary in database.'
|
32
|
+
end
|
33
|
+
end
|
data/lib/dictpl.rb
CHANGED
@@ -1,53 +1,17 @@
|
|
1
1
|
# -*- coding: utf-8 -*-
|
2
|
-
require 'open-uri'
|
3
|
-
require 'nokogiri'
|
4
|
-
require_relative 'result'
|
5
2
|
|
3
|
+
require 'nokogiri'
|
4
|
+
require_relative 'dictionary'
|
6
5
|
|
7
|
-
|
6
|
+
DICT_URL = 'http://dict.pl/dict?word='
|
8
7
|
|
9
|
-
|
10
|
-
|
11
|
-
check_arguments(word)
|
12
|
-
initialize_instance_arguments(word)
|
13
|
-
end
|
14
|
-
|
15
|
-
#
|
16
|
-
# Method returns hash with translations in many context for a word.
|
17
|
-
# Example: for the word 'krowa' it returns translations in such a form:
|
18
|
-
# {"krowa"=>["cow"], "krowa bliska wycielenia"=>["freshen of cow"], ... }
|
19
|
-
#
|
8
|
+
class Dictpl < Dictionary
|
9
|
+
# Method returns hash with translations as keys and examples of using words as values
|
20
10
|
def translate
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
@context_words = []
|
25
|
-
|
26
|
-
doc = get_html(@uri)
|
27
|
-
doc.xpath('//td[@class="resWordCol"]/a').each do |node|
|
28
|
-
@context_words << node.text
|
11
|
+
context_words = []
|
12
|
+
Nokogiri::HTML(open(@uri)).xpath('//td[@class="resWordCol"]/a').each do |node|
|
13
|
+
context_words << node.text
|
29
14
|
end
|
30
|
-
|
31
|
-
@mapped_words = {} # hash containing words with matched translations
|
32
|
-
|
33
|
-
@context_words.each_slice(2) do |word|
|
34
|
-
@mapped_words[word.first] = word.last
|
35
|
-
@result.add_translation(word.first, word.last)
|
36
|
-
end
|
37
|
-
@result
|
38
|
-
end
|
39
|
-
|
40
|
-
def check_arguments(word)
|
41
|
-
raise ArgumentError.new("No given word") if word.empty?
|
42
|
-
end
|
43
|
-
|
44
|
-
def initialize_instance_arguments(word)
|
45
|
-
@uri = URI(URI.escape(DICT_URL + word + "&lang=EN"))
|
46
|
-
@result = Result.new(word)
|
15
|
+
make_hash_results(context_words)
|
47
16
|
end
|
48
|
-
|
49
|
-
def get_html(uri)
|
50
|
-
Nokogiri::HTML(open(uri))
|
51
|
-
end
|
52
|
-
|
53
17
|
end
|
data/lib/module_main.rb
ADDED
@@ -0,0 +1,67 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
|
3
|
+
require 'dict'
|
4
|
+
require 'slop'
|
5
|
+
require 'timeout'
|
6
|
+
|
7
|
+
module Main
|
8
|
+
def self.check_parameters?
|
9
|
+
ARGV.empty?
|
10
|
+
end
|
11
|
+
|
12
|
+
def self.parse_parameters
|
13
|
+
opts = Slop.parse do
|
14
|
+
banner "Usage: $translate -w word [Options]"
|
15
|
+
on '-w', :word=, 'after this option is a word to translate'
|
16
|
+
on '-h', :help=, 'help', :argument => :optional
|
17
|
+
on '-t', :time=, 'time in seconds, default: 300', :as => :int
|
18
|
+
on '-d', :dict=, 'wiktionary, dictpl', :argument => :optional
|
19
|
+
end
|
20
|
+
opts
|
21
|
+
end
|
22
|
+
|
23
|
+
def self.get_translations(opts)
|
24
|
+
|
25
|
+
if opts.word?
|
26
|
+
begin
|
27
|
+
Timeout::timeout(opts[:time].to_i || 300) do
|
28
|
+
if opts.dict? && opts[:dict] != nil
|
29
|
+
Dict.get_single_dictionary_translations(opts[:word],opts[:dict])
|
30
|
+
else
|
31
|
+
Dict.get_all_dictionaries_translations(opts[:word])
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
rescue
|
36
|
+
"Timeout for the query."
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
end
|
41
|
+
|
42
|
+
def self.main(opts)
|
43
|
+
|
44
|
+
if check_parameters? == true
|
45
|
+
puts "Please enter the word. (-h for help)"
|
46
|
+
exit
|
47
|
+
end
|
48
|
+
|
49
|
+
begin
|
50
|
+
opts = parse_parameters
|
51
|
+
rescue Slop::MissingArgumentError
|
52
|
+
puts "Missing argument"
|
53
|
+
exit
|
54
|
+
end
|
55
|
+
|
56
|
+
puts get_translations(opts)
|
57
|
+
|
58
|
+
begin
|
59
|
+
puts opts if opts.help?
|
60
|
+
puts Dict.available_services if opts.dict?
|
61
|
+
rescue
|
62
|
+
nil
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
end
|
67
|
+
|
data/lib/wiktionary.rb
CHANGED
@@ -1,104 +1,24 @@
|
|
1
|
-
#!/usr/bin/ruby -w
|
2
1
|
# -*- coding: utf-8 -*-
|
3
2
|
|
4
|
-
# Method returns an Result Object containing given word,
|
5
|
-
# translations, word usage examples.
|
6
|
-
# Usage example:
|
7
|
-
# result = Wiktionary.new("samochód").translate
|
8
|
-
# result.term # => "samochód"
|
9
|
-
# result.translations # => {"samochód"=>
|
10
|
-
# ["car", "automobile"]}
|
11
|
-
# result.examples # => {"samochód"=>["She drove her
|
12
|
-
# car to the mall.", "The conductor linked the cars to
|
13
|
-
# the locomotive.", "The 11:10 to London was operated by
|
14
|
-
# a 4-car diesel multiple unit", "From the front-most
|
15
|
-
# car of the subway, he filmed the progress
|
16
|
-
# through the tunnel.", "We ordered five hundred cars of gypsum.", ...]}
|
17
|
-
|
18
|
-
require 'net/http'
|
19
3
|
require 'nokogiri'
|
4
|
+
require_relative 'dictionary'
|
20
5
|
|
21
|
-
|
6
|
+
WIKI_URL = 'http://en.wiktionary.org/wiki/'
|
22
7
|
|
23
|
-
class Wiktionary
|
24
|
-
|
25
|
-
WIKI_PL = "http://pl.wiktionary.org/wiki/"
|
26
|
-
def initialize(word)
|
27
|
-
check_arguments(word)
|
28
|
-
initialize_instance_arguments(word)
|
29
|
-
end
|
30
|
-
|
8
|
+
class Wiktionary < Dictionary
|
9
|
+
# Method returns hash with translations as keys and examples of using words as values
|
31
10
|
def translate
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
doc.css('div#mw-content-text[lang=en] ol > li a').each do |link|
|
38
|
-
@result.add_translation(@result.term, link.content)
|
39
|
-
end
|
40
|
-
|
41
|
-
doc.css('div#mw-content-text[lang=en] ol > li a').each do |link|
|
42
|
-
translations.push(link.content)
|
11
|
+
context_words = []
|
12
|
+
url = 'http://en.wiktionary.org/wiki/'
|
13
|
+
get_html(@uri).css('p + ol li a').each do |node|
|
14
|
+
get_html(url + node.text.tr(' ', '_')).css('p + ol > li dl dd').each do |example|
|
15
|
+
context_words << node.text << example.text
|
43
16
|
end
|
44
|
-
|
45
|
-
get_examples_of_translations_en(@result, translations, WIKI_EN)
|
46
|
-
|
47
|
-
@result
|
48
|
-
else
|
49
|
-
@uri = URI.parse(URI.escape("#{WIKI_PL}#{@word}"))
|
50
|
-
doc = get_html(@uri)
|
51
|
-
|
52
|
-
doc.css('div#mw-content-text dfn a').each do |link|
|
53
|
-
@result.add_translation(@result.term, link.content)
|
54
|
-
end
|
55
|
-
|
56
|
-
doc.css('div#mw-content-text dfn a').each do |link|
|
57
|
-
translations.push(link.content)
|
58
|
-
end
|
59
|
-
|
60
|
-
get_examples_of_translations_pl(@result, translations, WIKI_PL)
|
61
|
-
@result
|
62
17
|
end
|
63
|
-
|
18
|
+
make_hash_results(context_words)
|
19
|
+
end
|
64
20
|
|
65
|
-
|
66
|
-
|
67
|
-
def get_html(uri)
|
68
|
-
Nokogiri::HTML(Net::HTTP.get(uri))
|
69
|
-
end
|
70
|
-
|
71
|
-
def get_examples_of_translations_en(result, translations, adres)
|
72
|
-
translations.each do |item|
|
73
|
-
example = Nokogiri::HTML(Net::HTTP.get(URI(adres + item.tr(' ', '_'))))
|
74
|
-
example.css('div#mw-content-text[lang=en] ol:first > li dl dd i').each do |s|
|
75
|
-
result.add_example(result.term, s.content)
|
76
|
-
end
|
77
|
-
end
|
78
|
-
end
|
79
|
-
|
80
|
-
def get_examples_of_translations_pl(result, translations, adres)
|
81
|
-
translations.each do |item|
|
82
|
-
example = Nokogiri::HTML(Net::HTTP.get(adres + item))
|
83
|
-
example.css('div#mw-content-text[lang=pl] dl dd').each do |s|
|
84
|
-
result.add_example(result.term, s.content)
|
85
|
-
end
|
86
|
-
end
|
87
|
-
end
|
88
|
-
|
89
|
-
def initialize_instance_arguments(word)
|
90
|
-
@result = Result.new(word.downcase.tr(' ', '_'))
|
91
|
-
@word = word
|
92
|
-
end
|
93
|
-
|
94
|
-
def check_arguments(word)
|
95
|
-
if word.empty? then raise ArgumentError.new("No word given.") end
|
96
|
-
end
|
97
|
-
|
98
|
-
def is_polish?(doc)
|
99
|
-
doc.css('div#mw-content-text h2 .mw-headline').any? do |lang|
|
100
|
-
lang.content == 'Polish'
|
101
|
-
end
|
21
|
+
def get_html(url)
|
22
|
+
Nokogiri::HTML(open(url))
|
102
23
|
end
|
103
|
-
|
104
24
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: dict
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.6
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -12,7 +12,7 @@ authors:
|
|
12
12
|
autorequire:
|
13
13
|
bindir: bin
|
14
14
|
cert_chain: []
|
15
|
-
date: 2012-07-
|
15
|
+
date: 2012-07-10 00:00:00.000000000 Z
|
16
16
|
dependencies:
|
17
17
|
- !ruby/object:Gem::Dependency
|
18
18
|
name: slop
|
@@ -56,9 +56,10 @@ extensions: []
|
|
56
56
|
extra_rdoc_files: []
|
57
57
|
files:
|
58
58
|
- lib/dict.rb
|
59
|
-
- lib/
|
59
|
+
- lib/dictionary.rb
|
60
60
|
- lib/wiktionary.rb
|
61
61
|
- lib/dictpl.rb
|
62
|
+
- lib/module_main.rb
|
62
63
|
- bin/translate
|
63
64
|
homepage: https://github.com/Ragnarson/dict-gem
|
64
65
|
licenses: []
|
data/lib/result.rb
DELETED
@@ -1,37 +0,0 @@
|
|
1
|
-
class Result
|
2
|
-
attr_accessor :term, :dictionaries, :translations, :examples
|
3
|
-
def initialize(term, dictionaries = nil)
|
4
|
-
@term = term
|
5
|
-
@dictionaries = dictionaries
|
6
|
-
@translations = {}
|
7
|
-
@examples = {}
|
8
|
-
end
|
9
|
-
|
10
|
-
def add_translation(term, translation)
|
11
|
-
add_result(@translations, term, translation)
|
12
|
-
end
|
13
|
-
|
14
|
-
def add_example(term, example)
|
15
|
-
add_result(@examples, term, example)
|
16
|
-
end
|
17
|
-
|
18
|
-
def each_translation
|
19
|
-
@translations.each_pair do |term,translation|
|
20
|
-
yield term, translation
|
21
|
-
end
|
22
|
-
end
|
23
|
-
|
24
|
-
def to_s
|
25
|
-
"#{@term}\n#{@dictionaries}\n#{@translations}\n#{@examples}\n"
|
26
|
-
end
|
27
|
-
|
28
|
-
private
|
29
|
-
def add_result(hash, key, value)
|
30
|
-
if hash.has_key?(key)
|
31
|
-
hash[key].push(value)
|
32
|
-
else
|
33
|
-
hash.merge!({ key => [value] })
|
34
|
-
end
|
35
|
-
self
|
36
|
-
end
|
37
|
-
end
|