/
symbol.rb
67 lines (55 loc) · 1.81 KB
/
symbol.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
# Extending the Symbol class.
#
class Symbol
# Returns a _single_ double metaphone code
# for this symbol.
#
def double_metaphone
codes = Text::Metaphone.double_metaphone self
codes.first.intern unless codes.empty?
end
# Returns a metaphone code for this symbol.
#
def metaphone
code = Text::Metaphone.metaphone self.to_s
code.intern if code
end
# Returns a soundex code for this symbol.
#
def soundex
code = Text::Soundex.soundex self.to_s
code.intern if code
end
# :keys.each_subtoken # => yields each of [:keys, :key, :ke, :k]
# :keys.each_subtoken(2) # => yields each of [:keys, :key, :ke]
#
def each_subtoken from_length = 1, range = nil
sub = self.id2name
sub = sub[range] if range
yield sub.intern
size = sub.size
from_length = size + from_length + 1 if from_length < 0
from_length = size if size < from_length
from_length = 1 if from_length < 1
size.downto(from_length + 1) { yield sub.chop!.intern }
end
# :keys.each_intoken # => yields each of [:keys, :key, :eys, :ke, :ey, :ys, :k, :e, :y, :s]
# :keys.each_intoken(2) # => yields each of [:keys, :key, :eys, :ke, :ey, :ys]
# :keys.each_intoken(2, 3) # => yields each of [:key, :eys, :ke, :ey, :ys]
# :keys.each_intoken(10, 12) # => yields nothing (min larger than sym)
#
def each_intoken min_length = 1, max_length = -1
max_length = size + max_length + 1 if max_length < 0
max_length = size if size < max_length
max_length = 1 if max_length < 1
min_length = size + min_length + 1 if min_length < 0
min_length = 1 if min_length < 1
this_many = size - max_length + 1
max_length.downto(min_length) do |length|
this_many.times do |offset|
yield self[offset, length].intern
end
this_many += 1
end
end
end