lyracyst 0.0.7 → 0.0.8
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/LICENSE.md +22 -22
- data/bin/lyracyst +293 -81
- data/lib/lyracyst.rb +293 -81
- data/lib/lyracyst/rhymebrain.rb +138 -0
- data/lib/lyracyst/version.rb +1 -1
- data/lib/lyracyst/wordnik.rb +326 -0
- metadata +29 -46
- data/lib/lyracyst/define.rb +0 -35
- data/lib/lyracyst/get.rb +0 -21
- data/lib/lyracyst/relate.rb +0 -171
- data/lib/lyracyst/rhyme.rb +0 -48
@@ -0,0 +1,138 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
%w{httpi multi_json rainbow}.map {|lib| require lib}
|
3
|
+
|
4
|
+
module Lyracyst
|
5
|
+
# This class uses the Rhymebrain API to fetch rhymes, word info, and portmanteaus.
|
6
|
+
class Rhymebrain
|
7
|
+
HTTPI.log = false
|
8
|
+
|
9
|
+
# Optionally sets HTTP adapter with httpi. Supports [:httpclient,
|
10
|
+
# :curb, :em_http, :net_http_persistent, :excon, :rack]
|
11
|
+
#
|
12
|
+
# @param http [Symbol] The http adapter to use. Smart defaults.
|
13
|
+
def set_http(http)
|
14
|
+
HTTPI.adapter = http
|
15
|
+
end
|
16
|
+
|
17
|
+
# Optionally sets JSON adapter with multi_json. Supports [:oj,
|
18
|
+
# :yajl, :json_gem, :json_pure]
|
19
|
+
#
|
20
|
+
# @param mj [Symbol] The JSON adapter to use. Smart defaults.
|
21
|
+
def set_json(mj)
|
22
|
+
MultiJson.use(mj)
|
23
|
+
end
|
24
|
+
|
25
|
+
# Prints colored element label.
|
26
|
+
#
|
27
|
+
# @param label [String] The label to print
|
28
|
+
def label(label)
|
29
|
+
print Rainbow("[").blue.bright
|
30
|
+
print Rainbow(label).green.bright
|
31
|
+
print Rainbow("] ").blue.bright
|
32
|
+
end
|
33
|
+
|
34
|
+
# Fetches dynamically generated URL. Functions are Rhymes,
|
35
|
+
# WordInfo, and Portmaneaus.
|
36
|
+
#
|
37
|
+
# @param search [String] The word or phrase to search for.
|
38
|
+
# @param func [String] The search function to use.
|
39
|
+
# @param params [Hash] The search parameters to use.
|
40
|
+
# @param result [String] The search response.
|
41
|
+
def get_word(search, func, params, result)
|
42
|
+
prefix = "http://rhymebrain.com/talk?function=get"
|
43
|
+
word, pcont = "#{prefix}#{func}&word=#{search}&", []
|
44
|
+
params.map { |k,v|
|
45
|
+
if k == :lang then pcont.push "lang=#{v}&"; end
|
46
|
+
if k == :max && k != nil then pcont.push "maxResults=#{v}&"; end
|
47
|
+
}
|
48
|
+
url = "#{word}#{pcont.join}"
|
49
|
+
request = HTTPI::Request.new(url)
|
50
|
+
getter = HTTPI.get(request)
|
51
|
+
result = getter.body
|
52
|
+
end
|
53
|
+
|
54
|
+
# Fetches rhymes using the Rhymebrain API.
|
55
|
+
#
|
56
|
+
# @param search [String] The word or phrase to search for.
|
57
|
+
# @param params [Hash] The search parameters to use.
|
58
|
+
def get_rhyme(search, params)
|
59
|
+
func, label, result = 'Rhymes', 'Rhymes', nil
|
60
|
+
rh = Lyracyst::Rhymebrain.new
|
61
|
+
result = rh.get_word(search, func, params, result)
|
62
|
+
result = MultiJson.load(result)
|
63
|
+
if result != nil
|
64
|
+
a, b, rcont = 0, result.length - 1, []
|
65
|
+
while a <= b
|
66
|
+
match = result[a]
|
67
|
+
rhyme = match['word']
|
68
|
+
rcont.push rhyme
|
69
|
+
a += 1
|
70
|
+
end
|
71
|
+
rh.label(label)
|
72
|
+
print Rainbow('- ').bright
|
73
|
+
print rcont.join(Rainbow('|').bright)
|
74
|
+
puts ''
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
# Fetches word info using the Rhymebrain API.
|
79
|
+
#
|
80
|
+
# @param search [String] The word or phrase to search for.
|
81
|
+
# @param params [Hash] The search parameters to use.
|
82
|
+
def get_info(search, params)
|
83
|
+
func, label, result = 'WordInfo', 'Word info', nil
|
84
|
+
wi = Lyracyst::Rhymebrain.new
|
85
|
+
result = wi.get_word(search, func, params, result)
|
86
|
+
result = MultiJson.load(result)
|
87
|
+
if result != nil
|
88
|
+
word = result['word']
|
89
|
+
pron = result['pron']
|
90
|
+
ipa = result['ipa']
|
91
|
+
flags = result['flags']
|
92
|
+
syllables = result['syllables']
|
93
|
+
wi.label(label)
|
94
|
+
print Rainbow('- Word: ').bright
|
95
|
+
print "#{word}"
|
96
|
+
print Rainbow('|Pronunciation: ').bright
|
97
|
+
print "#{pron}"
|
98
|
+
print Rainbow('|IPA: ').bright
|
99
|
+
print "#{ipa}"
|
100
|
+
print Rainbow('|Syllables: ').bright
|
101
|
+
print "#{syllables}"
|
102
|
+
print Rainbow('|Flags: ').bright
|
103
|
+
fcont = []
|
104
|
+
if flags =~ /a/ then fcont.push 'The word is offensive.'; end
|
105
|
+
if flags =~ /b/ then fcont.push 'The word might be found in most dictionaries.'; end
|
106
|
+
if flags =~ /c/ then fcont.push 'The pronunciation is known with confidence. It was not automatically generated.'; end
|
107
|
+
puts "#{fcont.join(Rainbow('|').bright)}"
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
111
|
+
# Fetches portmaneaus using the Rhymebrain API.
|
112
|
+
#
|
113
|
+
# @param search [String] The word or phrase to search for.
|
114
|
+
# @param params [Hash] The search parameters to use.
|
115
|
+
def get_port(search, params)
|
116
|
+
func, label, result = 'Portmanteaus', 'Portmanteaus', nil
|
117
|
+
pm = Lyracyst::Rhymebrain.new
|
118
|
+
result = pm.get_word(search, func, params, result)
|
119
|
+
result = MultiJson.load(result)
|
120
|
+
if result != nil
|
121
|
+
a, b, pmcont = 0, result.length - 1, []
|
122
|
+
while a <= b
|
123
|
+
match = result[a]
|
124
|
+
roots = match['source']
|
125
|
+
combo = match['combined']
|
126
|
+
both = "#{Rainbow('Root words: ').bright}#{roots}#{Rainbow('| Combination: ').bright}#{combo}"
|
127
|
+
pmcont.push both
|
128
|
+
a += 1
|
129
|
+
end
|
130
|
+
pm.label(label)
|
131
|
+
print Rainbow('- ').bright
|
132
|
+
print pmcont.join(Rainbow('|').bright)
|
133
|
+
puts ''
|
134
|
+
end
|
135
|
+
end
|
136
|
+
|
137
|
+
end
|
138
|
+
end
|
data/lib/lyracyst/version.rb
CHANGED
@@ -0,0 +1,326 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
#%w(curb em-synchrony em-http eventmachine excon httpclient httpi net/http/persistent rainbow).map {|lib| require lib}
|
3
|
+
#%w(json/ext json/pure multi_json oj yajl).map {|lib| require lib}
|
4
|
+
#%w(libxml multi_xml ox rexml/document).map {|lib| require lib}
|
5
|
+
%w{httpi multi_json multi_xml rainbow}.map {|lib| require lib}
|
6
|
+
|
7
|
+
module Lyracyst
|
8
|
+
|
9
|
+
# Wordnik.com's service provides definitions, examples,
|
10
|
+
# related words, pronunciations, hyphenation, phrases,
|
11
|
+
# and etymologies.
|
12
|
+
class Wordnik
|
13
|
+
HTTPI.log = false
|
14
|
+
|
15
|
+
# Optionally sets HTTP adapter with httpi. Supports [:httpclient,
|
16
|
+
# :curb, :em_http, :net_http_persistent, :excon, :rack]
|
17
|
+
#
|
18
|
+
# @param http [Symbol] The http adapter to use. Smart defaults.
|
19
|
+
def set_http(http)
|
20
|
+
HTTPI.adapter = http
|
21
|
+
end
|
22
|
+
|
23
|
+
# Optionally sets JSON adapter with multi_json. Supports [:oj,
|
24
|
+
# :yajl, :json_gem, :json_pure]
|
25
|
+
#
|
26
|
+
# @param mj [Symbol] The JSON adapter to use. Smart defaults.
|
27
|
+
def set_json(mj)
|
28
|
+
MultiJson.use(mj)
|
29
|
+
end
|
30
|
+
|
31
|
+
# Optionally sets XML adapter with multi_json. Supports [:ox,
|
32
|
+
# :libxml, :nokogiri, :rexml]
|
33
|
+
#
|
34
|
+
# @param mx [Symbol] The XML adapter to use. Smart defaults.
|
35
|
+
def set_xml(mx)
|
36
|
+
MultiXml.parser = mx
|
37
|
+
end
|
38
|
+
|
39
|
+
# Prints colored element label.
|
40
|
+
#
|
41
|
+
# @param label [String] The label to print
|
42
|
+
def label(label)
|
43
|
+
print Rainbow("[").blue.bright
|
44
|
+
print Rainbow(label).green.bright
|
45
|
+
print Rainbow("] ").blue.bright
|
46
|
+
end
|
47
|
+
|
48
|
+
# Fetches dynamically generated URL. Functions are definitions,
|
49
|
+
# examples, relatedWords, pronunciations, hyphenation, phrases,
|
50
|
+
# and etymologies.
|
51
|
+
#
|
52
|
+
# @param search [String] The word or phrase to search for.
|
53
|
+
# @param func [String] The search function to use.
|
54
|
+
# @param params [Hash] The search parameters to use.
|
55
|
+
# @param result [String] The search response.
|
56
|
+
def get_word(search, func, params, result)
|
57
|
+
prefix = 'http://api.wordnik.com:80/v4/word.json/'
|
58
|
+
word, pcont = "#{prefix}#{search}/#{func}?", []
|
59
|
+
params.map { |k,v|
|
60
|
+
if k == :canon then pcont.push "useCanonical=#{v}&"; end
|
61
|
+
if k == :incdups then pcont.push "includeDuplicates=#{v}&"; end
|
62
|
+
if k == :increl then pcont.push "includeRelated=#{v}&"; end
|
63
|
+
if k == :inctags then pcont.push "includeTags=#{v}&"; end
|
64
|
+
if k == :limit then pcont.push "limit=#{v}&"; end
|
65
|
+
if k == :part then pcont.push "partOfSpeech=#{v}&"; end
|
66
|
+
if k == :rellimit then pcont.push "limitPerRelationshipType=#{v}&"; end
|
67
|
+
if k == :reltypes then pcont.push "relationshipTypes=#{v}&"; end
|
68
|
+
if k == :skip then pcont.push "skip=#{v}&"; end
|
69
|
+
if k == :source then pcont.push "sourceDictionary=#{v}&"; end
|
70
|
+
if k == :defdict then pcont.push "sourceDictionaries=#{v}&"; end
|
71
|
+
if k == :tformat then pcont.push "typeFormat=#{v}&"; end
|
72
|
+
if k == :wlmi then pcont.push "wlmi=#{v}&"; end
|
73
|
+
}
|
74
|
+
apikey = ENV['WORDNIK']
|
75
|
+
pcont.push "api_key=#{apikey}"
|
76
|
+
url = "#{word}#{pcont.join}"
|
77
|
+
request = HTTPI::Request.new(url)
|
78
|
+
getter = HTTPI.get(request)
|
79
|
+
result = getter.body
|
80
|
+
end
|
81
|
+
|
82
|
+
# Fetches definitions from Wordnik. Parts include:
|
83
|
+
# 'noun,adjective,verb,adverb,interjection,pronoun,
|
84
|
+
# preposition,abbreviation,affix,article,auxiliary-verb,
|
85
|
+
# conjunction,definite-article,family-name,given-name,
|
86
|
+
# idiom,imperative,noun-plural,noun-posessive,
|
87
|
+
# past-participle,phrasal-prefix,proper-noun,
|
88
|
+
# proper-noun-plural,proper-noun-posessive,suffix,
|
89
|
+
# verb-intransitive,verb-transitive'
|
90
|
+
#
|
91
|
+
# @param search [String] The word or phrase to search for.
|
92
|
+
# @param part [String] Comma-separated list of parts of speech.
|
93
|
+
# @param params [Hash] The search parameters to use.
|
94
|
+
def get_def(search, part, params)
|
95
|
+
func, label, result = 'definitions', 'Definition', nil
|
96
|
+
if part != nil then params[:part] = part; end
|
97
|
+
defi = Lyracyst::Wordnik.new
|
98
|
+
result = defi.get_word(search, func, params, result)
|
99
|
+
result = MultiJson.load(result)
|
100
|
+
if result != nil
|
101
|
+
x, y = 0, result.length - 1
|
102
|
+
while x <= y
|
103
|
+
d = result[x]
|
104
|
+
text = d['text']
|
105
|
+
part = d['partOfSpeech']
|
106
|
+
defi.label(label)
|
107
|
+
print Rainbow("#{part} - ").bright
|
108
|
+
puts "#{text}"
|
109
|
+
x += 1
|
110
|
+
end
|
111
|
+
else
|
112
|
+
puts 'Wordnik returned an empty string.'
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
116
|
+
# Fetches examples from Wordnik.
|
117
|
+
#
|
118
|
+
# @param search [String] The word or phrase to search for.
|
119
|
+
# @param params [Hash] The search parameters to use.
|
120
|
+
def get_ex(search, params)
|
121
|
+
func, label, result = 'examples', 'Example', nil
|
122
|
+
exam = Lyracyst::Wordnik.new
|
123
|
+
result = exam.get_word(search, func, params, result)
|
124
|
+
result = MultiJson.load(result)
|
125
|
+
result = result['examples']
|
126
|
+
if result != nil
|
127
|
+
x, y = 0, result.length - 1
|
128
|
+
while x <= y
|
129
|
+
ex = result[x]
|
130
|
+
title = ex['title']
|
131
|
+
text = ex['text']
|
132
|
+
url = ex['url']
|
133
|
+
exam.label(label)
|
134
|
+
print Rainbow("#{title} - ").bright
|
135
|
+
puts "#{text} - #{url}"
|
136
|
+
x += 1
|
137
|
+
end
|
138
|
+
else
|
139
|
+
puts 'Wordnik failed to fetch word info.'
|
140
|
+
end
|
141
|
+
end
|
142
|
+
|
143
|
+
# Fetches pronunciations from Wordnik. Types include ['ahd'
|
144
|
+
# 'arpabet', 'gcide-diacritical', 'IPA']
|
145
|
+
#
|
146
|
+
# @param search [String] The word or phrase to search for.
|
147
|
+
# @param params [Hash] The search parameters to use.
|
148
|
+
# @param ptype [String] Pronunciation type.
|
149
|
+
def get_pro(search, params, ptype)
|
150
|
+
func, label, result = 'pronunciations', 'Pronunciation', nil
|
151
|
+
if ptype != nil then params[:tformat] = ptype; end
|
152
|
+
pron = Lyracyst::Wordnik.new
|
153
|
+
result = pron.get_word(search, func, params, result)
|
154
|
+
result = MultiJson.load(result)
|
155
|
+
if result != nil
|
156
|
+
x, y = 0, result.length - 1
|
157
|
+
while x <= y
|
158
|
+
pro = result[x]
|
159
|
+
rawtype = pro['rawType']
|
160
|
+
raw = pro['raw']
|
161
|
+
pron.label(label)
|
162
|
+
print Rainbow("- ").bright
|
163
|
+
puts "#{raw} - #{rawtype}"
|
164
|
+
x += 1
|
165
|
+
end
|
166
|
+
else
|
167
|
+
puts 'Wordnik failed to fetch word info.'
|
168
|
+
end
|
169
|
+
end
|
170
|
+
|
171
|
+
# Fetches related words from Wordnik. Types include ['synonym',
|
172
|
+
# 'antonym', 'variant', 'equivalent', 'cross-reference',
|
173
|
+
# 'related-word', 'rhyme', 'form', 'etymologically-related-term',
|
174
|
+
# 'hypernym', 'hyponym', 'inflected-form', 'primary', 'same-context',
|
175
|
+
# 'verb-form', 'verb-stem']
|
176
|
+
#
|
177
|
+
# @param search [String] The word or phrase to search for.
|
178
|
+
# @param params [Hash] The search parameters to use.
|
179
|
+
# @param reltypes [String] Relationship type.
|
180
|
+
def get_rel(search, params, reltypes)
|
181
|
+
func, label, result = 'relatedWords', 'Related words', nil
|
182
|
+
if reltypes != nil then params[:reltypes] = reltypes; end
|
183
|
+
rel = Lyracyst::Wordnik.new
|
184
|
+
result = rel.get_word(search, func, params, result)
|
185
|
+
result = MultiJson.load(result)
|
186
|
+
if result != nil
|
187
|
+
x, y = 0, result.length - 1
|
188
|
+
while x <= y
|
189
|
+
re = result[x]
|
190
|
+
words, type = re['words'], re['relationshipType']
|
191
|
+
rel.label(label)
|
192
|
+
print Rainbow("#{type} - ").bright
|
193
|
+
puts "#{words.join(', ')}"
|
194
|
+
x += 1
|
195
|
+
end
|
196
|
+
else
|
197
|
+
puts 'Wordnik failed to fetch word info.'
|
198
|
+
end
|
199
|
+
end
|
200
|
+
|
201
|
+
# Fetches hyphenations from Wordnik.
|
202
|
+
#
|
203
|
+
# @param search [String] The word or phrase to search for.
|
204
|
+
# @param params [Hash] The search parameters to use.
|
205
|
+
def get_hyph(search, params)
|
206
|
+
func, label, result = 'hyphenation', 'Hyphenation', nil
|
207
|
+
hyph = Lyracyst::Wordnik.new
|
208
|
+
result = hyph.get_word(search, func, params, result)
|
209
|
+
result = MultiJson.load(result)
|
210
|
+
if result != nil
|
211
|
+
x, y, hcont = 0, result.length - 1, []
|
212
|
+
hyph.label(label)
|
213
|
+
print Rainbow("- ").bright
|
214
|
+
while x <= y
|
215
|
+
hy = result[x]
|
216
|
+
ht = hy['text']
|
217
|
+
if hy['type'] == 'stress'
|
218
|
+
hcont.push Rainbow(ht).red.bright
|
219
|
+
elsif hy['type'] == 'secondary stress'
|
220
|
+
hcont.push Rainbow(ht).bright
|
221
|
+
else
|
222
|
+
hcont.push ht
|
223
|
+
end
|
224
|
+
x += 1
|
225
|
+
end
|
226
|
+
puts hcont.join('-')
|
227
|
+
else
|
228
|
+
puts 'Wordnik failed to fetch word info.'
|
229
|
+
end
|
230
|
+
end
|
231
|
+
|
232
|
+
# Fetches bi-gram phrases from Wordnik.
|
233
|
+
#
|
234
|
+
# @param search [String] The word or phrase to search for.
|
235
|
+
# @param params [Hash] The search parameters to use.
|
236
|
+
def get_phr(search, params)
|
237
|
+
func, label, result = 'phrases', 'Bi-gram phrases', nil
|
238
|
+
phr = Lyracyst::Wordnik.new
|
239
|
+
result = phr.get_word(search, func, params, result)
|
240
|
+
result = MultiJson.load(result)
|
241
|
+
if result != nil
|
242
|
+
x, y, phcont = 0, result.length - 1, []
|
243
|
+
phr.label(label)
|
244
|
+
print Rainbow("- ").bright
|
245
|
+
while x <= y
|
246
|
+
ph = result[x]
|
247
|
+
one = ph['gram1']
|
248
|
+
two = ph['gram2']
|
249
|
+
if one == search
|
250
|
+
item = "#{Rainbow(one).bright} #{two}"
|
251
|
+
else
|
252
|
+
item = "#{one} #{Rainbow(two).bright}"
|
253
|
+
end
|
254
|
+
phcont.push item
|
255
|
+
x += 1
|
256
|
+
end
|
257
|
+
puts "#{phcont.join('|')}"
|
258
|
+
else
|
259
|
+
puts 'Wordnik failed to fetch word info.'
|
260
|
+
end
|
261
|
+
end
|
262
|
+
|
263
|
+
# Fetches etymologies from Wordnik.
|
264
|
+
#
|
265
|
+
# @param search [String] The word or phrase to search for.
|
266
|
+
# @param params [Hash] The search parameters to use.
|
267
|
+
def get_et(search, params)
|
268
|
+
func, label, result = 'etymologies', 'Etymology', nil
|
269
|
+
#etymology = Lyracyst::Wordnik.new
|
270
|
+
#result = etymology.get_word(search, func, params, result)
|
271
|
+
result = get_word(search, func, params, result)
|
272
|
+
if result != nil && result != '[]'
|
273
|
+
result = MultiJson.load(result)
|
274
|
+
a, b, cont = 0, result.length - 1, []
|
275
|
+
while a <= b
|
276
|
+
xml = result[a]
|
277
|
+
xml = MultiXml.parse(xml)
|
278
|
+
root = xml['ety']
|
279
|
+
content, ets, er = root['__content__'], root['ets'], root['er']
|
280
|
+
#etymology.label(label)
|
281
|
+
label(label)
|
282
|
+
print Rainbow("- ").bright
|
283
|
+
print "#{content} - "
|
284
|
+
if ets != nil
|
285
|
+
c, d, etscont = 0, ets.length - 1, []
|
286
|
+
while c <= d
|
287
|
+
if d == 0
|
288
|
+
etsc = ets['__content__']
|
289
|
+
etscont.push etsc
|
290
|
+
else
|
291
|
+
etsc = ets[c]
|
292
|
+
etscont.push etsc['__content__']
|
293
|
+
end
|
294
|
+
c += 1
|
295
|
+
end
|
296
|
+
print "#{etscont.join('|')}"
|
297
|
+
else
|
298
|
+
puts ''
|
299
|
+
end
|
300
|
+
if er != nil
|
301
|
+
print ' - '
|
302
|
+
e, f, ercont = 0, er.length - 1, []
|
303
|
+
while e <= f
|
304
|
+
if f == 0
|
305
|
+
erc = er['__content__']
|
306
|
+
ercont.push erc
|
307
|
+
else
|
308
|
+
erc = er[e]
|
309
|
+
ercont.push erc['__content__']
|
310
|
+
end
|
311
|
+
e += 1
|
312
|
+
end
|
313
|
+
print "#{ercont.join('|')}"
|
314
|
+
else
|
315
|
+
puts ''
|
316
|
+
end
|
317
|
+
a += 1
|
318
|
+
puts ''
|
319
|
+
end
|
320
|
+
else
|
321
|
+
puts 'Wordnik failed to fetch word info.'
|
322
|
+
end
|
323
|
+
end
|
324
|
+
|
325
|
+
end
|
326
|
+
end
|