klookup 0.2.2 → 0.2.4
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/cklookup +1 -1
- data/bin/klookup.cgi +27 -23
- data/lib/klookup.rb +5 -0
- data/lib/klookup/database.rb +11 -11
- data/lib/klookup/database_flatfile.rb +42 -5
- data/lib/klookup/database_flatfile_kanjidic.rb +5 -0
- data/lib/klookup/database_flatfile_radk.rb +5 -2
- data/lib/klookup/database_quickfile.rb +38 -0
- data/lib/klookup/database_unihan.rb +1 -28
- data/lib/klookup/lookup_kanji.rb +120 -18
- data/lib/klookup/lookup_radical.rb +3 -3
- data/test/database_test.rb +127 -0
- data/test/suite.rb +82 -12
- metadata +5 -12
data/bin/cklookup
CHANGED
@@ -64,7 +64,7 @@ DOC
|
|
64
64
|
puts radicals
|
65
65
|
puts radicals.size
|
66
66
|
elsif str.match /^\s*kanji\s+with\s+(.+)$/
|
67
|
-
kanji = Kanji.lookup(
|
67
|
+
kanji = Kanji.lookup(:radical=>$1.split(//))
|
68
68
|
puts kanji
|
69
69
|
puts kanji.size
|
70
70
|
elsif str.match /^\s*meaning\s+of\s+(.)\s*$/
|
data/bin/klookup.cgi
CHANGED
@@ -102,6 +102,24 @@ def put_list(items)
|
|
102
102
|
puts "<p>Total: " + items.size.to_s
|
103
103
|
end
|
104
104
|
|
105
|
+
def show_radicals(params)
|
106
|
+
puts "<p><a href=\"?"+query_string(params.merge({'show_radicals'=>['false']}))+'">'+_('Hide radicals')+'</a>'
|
107
|
+
puts '<table>'
|
108
|
+
tparams = params.dup
|
109
|
+
tparams.delete 'kanji'
|
110
|
+
Radical.strokes.each { |strokes|
|
111
|
+
puts '<tr>'
|
112
|
+
puts '<td>' + strokes.to_s + ':'
|
113
|
+
Radical.list(strokes).each { |rad|
|
114
|
+
puts '<td>'
|
115
|
+
put_link rad.to_s, '?'+query_string(tparams.merge({'radicals'=>[params['radicals'].join+rad.to_s]}))
|
116
|
+
puts '</td>'
|
117
|
+
}
|
118
|
+
puts '</tr>'
|
119
|
+
}
|
120
|
+
puts '</table>'
|
121
|
+
end
|
122
|
+
|
105
123
|
def run
|
106
124
|
cgi = CGI.new
|
107
125
|
params = cgi.params
|
@@ -110,7 +128,14 @@ def run
|
|
110
128
|
puts '<style type="text/css">'
|
111
129
|
puts 'a {text-decoration: none}'
|
112
130
|
puts '</style>' # This could be external
|
113
|
-
puts '<title>' + _('klookup
|
131
|
+
puts '<title>' + _('klookup') + '</title>'
|
132
|
+
|
133
|
+
if not params['show_radicals'].empty? and params['show_radicals'].first=='true'
|
134
|
+
show_radicals(params)
|
135
|
+
else
|
136
|
+
puts "<p><a href=\"?"+query_string(params.merge({'show_radicals'=>['true']}))+'">'+_('Show radicals')+'</a>'
|
137
|
+
end
|
138
|
+
puts '<hr>'
|
114
139
|
|
115
140
|
if not params['radicals'].empty?
|
116
141
|
radicals = []
|
@@ -130,7 +155,7 @@ def run
|
|
130
155
|
problem = true unless Radical.exist?(r) }
|
131
156
|
|
132
157
|
unless problem
|
133
|
-
kanji = Kanji.lookup(
|
158
|
+
kanji = Kanji.lookup(:radical=>radicals)
|
134
159
|
kanji.collect! { |k|
|
135
160
|
get_kanji(k, params)
|
136
161
|
}
|
@@ -168,27 +193,6 @@ def run
|
|
168
193
|
puts '<p>' + _('Hello there. This is the greatest kanji lookup tool in existence!')
|
169
194
|
end
|
170
195
|
|
171
|
-
puts '<hr>'
|
172
|
-
if not params['show_radicals'].empty? and params['show_radicals'].first=='true'
|
173
|
-
puts "<p><a href=\"?"+query_string(params.merge({'show_radicals'=>['false']}))+'">'+_('Hide radicals')+'</a>'
|
174
|
-
puts '<table>'
|
175
|
-
tparams = params.dup
|
176
|
-
tparams.delete 'kanji'
|
177
|
-
Radical.strokes.each { |strokes|
|
178
|
-
puts '<tr>'
|
179
|
-
puts '<td>' + strokes.to_s + ':'
|
180
|
-
Radical.list(strokes).each { |rad|
|
181
|
-
puts '<td>'
|
182
|
-
put_link rad.to_s, '?'+query_string(tparams.merge({'radicals'=>[params['radicals'].join+rad.to_s]}))
|
183
|
-
puts '</td>'
|
184
|
-
}
|
185
|
-
puts '</tr>'
|
186
|
-
}
|
187
|
-
puts '</table>'
|
188
|
-
else
|
189
|
-
puts "<p><a href=\"?"+query_string(params.merge({'show_radicals'=>['true']}))+'">'+_('Show radicals')+'</a>'
|
190
|
-
end
|
191
|
-
|
192
196
|
puts <<DOC
|
193
197
|
<hr>
|
194
198
|
<p><a href="?">Start over</a>
|
data/lib/klookup.rb
CHANGED
data/lib/klookup/database.rb
CHANGED
@@ -26,15 +26,15 @@ class KLookup::Database
|
|
26
26
|
# Opens a resource.
|
27
27
|
#
|
28
28
|
# Priority: LOOKUP_PATH environment variable, Gem load path.
|
29
|
-
def self.open_resource(path)
|
29
|
+
def self.open_resource(path, mod='klookup')
|
30
30
|
# Choose a directory
|
31
31
|
env=ENV['KLOOKUP_PATH']
|
32
32
|
if env and env != ''
|
33
|
-
dir=env+
|
33
|
+
dir=env+"/#{mod}"
|
34
34
|
else
|
35
35
|
begin
|
36
|
-
gem
|
37
|
-
dir=Gem.datadir
|
36
|
+
gem mod
|
37
|
+
dir=Gem.datadir(mod)
|
38
38
|
rescue NameError
|
39
39
|
raise IOError, 'Could not find resource %s' % path
|
40
40
|
end
|
@@ -49,17 +49,17 @@ class KLookup::Database
|
|
49
49
|
end
|
50
50
|
end
|
51
51
|
|
52
|
-
alias :
|
53
|
-
alias :
|
54
|
-
alias :
|
55
|
-
alias :
|
56
|
-
alias :
|
57
|
-
alias :get_radicals :undefined
|
52
|
+
alias :radical_stroke_count :undefined
|
53
|
+
alias :find_radical :undefined
|
54
|
+
alias :find_kanji :undefined
|
55
|
+
alias :get_stroke_count :undefined
|
56
|
+
alias :get_radical :undefined
|
58
57
|
alias :get_reading :undefined
|
59
58
|
alias :get_meaning :undefined
|
60
59
|
alias :is_kanji? :undefined
|
61
60
|
alias :is_radical? :undefined
|
62
61
|
|
63
62
|
require 'klookup/database_flatfile'
|
64
|
-
require 'klookup/
|
63
|
+
# require 'klookup/database_quickfile'
|
64
|
+
# require 'klookup/database_unihan'
|
65
65
|
end
|
@@ -18,23 +18,60 @@ class KLookup::Database::FlatFile < KLookup::Database
|
|
18
18
|
require 'singleton'
|
19
19
|
include Singleton
|
20
20
|
|
21
|
-
def
|
21
|
+
def radical_stroke_count(*args)
|
22
22
|
RadK.instance.stroke_count_list(*args)
|
23
23
|
end
|
24
|
+
|
25
|
+
private
|
24
26
|
def radicals_by_strokes
|
25
27
|
RadK.instance.radicals_by_strokes
|
26
28
|
end
|
27
|
-
|
28
|
-
|
29
|
-
|
29
|
+
public
|
30
|
+
|
31
|
+
def find_radical(args={})
|
32
|
+
raise ArgumentError, 'a hash or nothing' unless args.kind_of?(Hash)
|
33
|
+
if not args[:stroke]
|
34
|
+
RadK.instance.radicals_by_strokes.values.flatten
|
35
|
+
elsif not args[:stroke].kind_of?(Integer)
|
36
|
+
raise ArgumentError, ':stroke must be an Integer'
|
37
|
+
elsif radical_stroke_count.include?(args[:stroke])
|
38
|
+
RadK.instance.radicals_by_strokes[args[:stroke]]
|
39
|
+
else
|
40
|
+
[]
|
41
|
+
end
|
42
|
+
end
|
43
|
+
private
|
44
|
+
# If *args is nil, returns all kanji.
|
45
|
+
def get_kanji(strokes=nil, *args)
|
46
|
+
radicals = *args
|
47
|
+
if radicals.nil? or radicals.length == 0 or radicals.all? {|r| r.nil?}
|
48
|
+
kanji = KanjiDic.instance.get_all_kanji
|
49
|
+
else
|
50
|
+
kanji = RadK.instance.get_kanji(*args)
|
51
|
+
end
|
52
|
+
unless strokes.nil?
|
53
|
+
return kanji.select {|k| get_kanji_strokes(k) == strokes }
|
54
|
+
end
|
55
|
+
return kanji
|
56
|
+
end
|
57
|
+
public
|
58
|
+
def find_kanji(args)
|
59
|
+
get_kanji(args[:stroke], args[:radical])
|
30
60
|
end
|
31
61
|
def get_radical_strokes(*args)
|
32
62
|
RadK.instance.get_strokes(*args)
|
33
63
|
end
|
64
|
+
def get_stroke_count
|
65
|
+
begin
|
66
|
+
RadK.instance.get_strokes(*args)
|
67
|
+
rescue
|
68
|
+
KanjiDic.instance.get_strokes(*args)
|
69
|
+
end
|
70
|
+
end
|
34
71
|
def get_kanji_strokes(*args)
|
35
72
|
KanjiDic.instance.get_strokes(*args)
|
36
73
|
end
|
37
|
-
def
|
74
|
+
def get_radical(*args)
|
38
75
|
RadK.instance.get_radicals(*args)
|
39
76
|
end
|
40
77
|
def get_reading(*args)
|
@@ -69,6 +69,11 @@ class KLookup::Database::FlatFile::KanjiDic
|
|
69
69
|
i =~ /^S\d+$/}.first.sub(/^S(\d+)$/, '\1').to_i
|
70
70
|
end
|
71
71
|
|
72
|
+
# Returns an array of all kanji
|
73
|
+
def get_all_kanji
|
74
|
+
@records.keys
|
75
|
+
end
|
76
|
+
|
72
77
|
#Returns a Struct of arrays of Japanese readings.
|
73
78
|
#
|
74
79
|
# KLookup::Database::FlatFile::KanjiDic.instance.get_reading('富')
|
@@ -106,10 +106,13 @@ class KLookup::Database::FlatFile::RadK
|
|
106
106
|
# Returns a list of kanji corresponding to given radicals.
|
107
107
|
def get_kanji(*radicals)
|
108
108
|
kanji = nil
|
109
|
+
if radicals.nil? or radicals.length == 0 or radicals.all? {|r| r.nil?}
|
110
|
+
raise ArgumentError, "This method doesn't do that sort of thing."
|
111
|
+
end
|
109
112
|
radicals.flatten.each { |rad|
|
110
|
-
raise ArgumentError unless @records[rad.to_s]
|
113
|
+
raise ArgumentError, 'Radical does not exist' unless @records[rad.to_s]
|
111
114
|
current_kanji = @records[rad.to_s][:kanji]
|
112
|
-
if kanji
|
115
|
+
if kanji.nil?
|
113
116
|
kanji = current_kanji
|
114
117
|
else
|
115
118
|
kanji &= current_kanji
|
@@ -0,0 +1,38 @@
|
|
1
|
+
=begin
|
2
|
+
|
3
|
+
lib/klookup/database_flatfile.rb
|
4
|
+
|
5
|
+
Copyright © Tom Adams 2006
|
6
|
+
|
7
|
+
This programme is free software.
|
8
|
+
You can distribute/modify this program under
|
9
|
+
the terms of the Ruby License.
|
10
|
+
|
11
|
+
=end
|
12
|
+
|
13
|
+
# A singleton class to abstract RadK and KanjiDic.
|
14
|
+
class KLookup::Database::QuickFile < KLookup::Database
|
15
|
+
|
16
|
+
require 'singleton'
|
17
|
+
include Singleton
|
18
|
+
|
19
|
+
def radical_stroke_count
|
20
|
+
end
|
21
|
+
def find_radical(opts)
|
22
|
+
end
|
23
|
+
def find_kanji(opts)
|
24
|
+
end
|
25
|
+
def get_stroke_count(character)
|
26
|
+
end
|
27
|
+
def get_radical(character)
|
28
|
+
end
|
29
|
+
def get_reading(character)
|
30
|
+
end
|
31
|
+
def get_meaning(character)
|
32
|
+
end
|
33
|
+
def is_kanji?(character)
|
34
|
+
end
|
35
|
+
def is_radical?(character)
|
36
|
+
end
|
37
|
+
|
38
|
+
end
|
@@ -35,7 +35,7 @@ class KLookup::Database::Unihan < KLookup::Database
|
|
35
35
|
private
|
36
36
|
|
37
37
|
def initialize
|
38
|
-
@unihan = KLookup::Database
|
38
|
+
@unihan = KLookup::Database.open_resource('Unihan.txt','unihan')
|
39
39
|
end
|
40
40
|
|
41
41
|
# Returns the numeric codepoint of the first codepoint in +str+.
|
@@ -51,33 +51,6 @@ class KLookup::Database::Unihan < KLookup::Database
|
|
51
51
|
|
52
52
|
public
|
53
53
|
|
54
|
-
# Opens a resource.
|
55
|
-
#
|
56
|
-
# Priority: LOOKUP_PATH environment variable, Gem load path.
|
57
|
-
def self.open_resource(path)
|
58
|
-
# Choose a directory
|
59
|
-
env=ENV['KLOOKUP_PATH']
|
60
|
-
if env and env != ''
|
61
|
-
dir=env+'/unihan'
|
62
|
-
else
|
63
|
-
dir=gem_path
|
64
|
-
begin
|
65
|
-
gem 'unihan'
|
66
|
-
dir=Gem.datadir 'unihan'
|
67
|
-
rescue NameError
|
68
|
-
raise IOError, 'Could not find resource %s' % path
|
69
|
-
end
|
70
|
-
end
|
71
|
-
|
72
|
-
# Open a file
|
73
|
-
file = open("#{dir}/#{path}")
|
74
|
-
if block_given?
|
75
|
-
yield file
|
76
|
-
else
|
77
|
-
return file
|
78
|
-
end
|
79
|
-
end
|
80
|
-
|
81
54
|
def stroke_count_list(*args)
|
82
55
|
end
|
83
56
|
def radicals_by_strokes
|
data/lib/klookup/lookup_kanji.rb
CHANGED
@@ -10,11 +10,76 @@
|
|
10
10
|
|
11
11
|
=end
|
12
12
|
|
13
|
-
# An abstract representation of 漢字 (kanji).
|
13
|
+
# An abstract representation of 漢字 (kanji/Chinese characters).
|
14
14
|
class KLookup::Lookup::Kanji
|
15
|
-
# A class variable because we have class methods which
|
15
|
+
# A class variable because we have class methods which use this.
|
16
16
|
@@data = KLookup::Lookup.default_handler
|
17
17
|
|
18
|
+
private
|
19
|
+
# Returns a string containing the UTF-8 encoded character represented by the
|
20
|
+
# receiver’s value.
|
21
|
+
#
|
22
|
+
# This should ideally be elsewhere - i.e. jcode or active_support
|
23
|
+
def self.int_to_utf8(val)
|
24
|
+
case val
|
25
|
+
when 0xD800..0xDFFF
|
26
|
+
raise RangeError, 'these values are surrogate pairs'
|
27
|
+
when 0x0000..0x007F
|
28
|
+
return "%c" % (val & 0b01111111) # 7
|
29
|
+
when 0x0080..0x07FF
|
30
|
+
byte = []
|
31
|
+
byte[0] = 0b11000000 + ((val >> 6) & 0b11111) # 5
|
32
|
+
byte[1] = 0b10000000 + (val & 0b111111) # 6
|
33
|
+
return "%c%c" % byte
|
34
|
+
when 0x0800..0xFFFF
|
35
|
+
byte = []
|
36
|
+
byte[0] = 0b11100000 + ((val >> 12) & 0b1111) # 4
|
37
|
+
byte[1] = 0b10000000 + ((val >> 6) & 0b111111) # 6
|
38
|
+
byte[2] = 0b10000000 + (val & 0b111111) # 6
|
39
|
+
return "%c%c%c" % byte
|
40
|
+
when 0x00010000..0x0010FFFF
|
41
|
+
byte = []
|
42
|
+
byte[0] = 0b11110000 + ((val >> 18) & 0b11111) # 5
|
43
|
+
byte[1] = 0b10000000 + ((val >> 12) & 0b111111) # 6
|
44
|
+
byte[2] = 0b10000000 + ((val >> 6) & 0b111111) # 6
|
45
|
+
byte[3] = 0b10000000 + (val & 0b111111) # 6
|
46
|
+
return "%c%c%c%c" % byte
|
47
|
+
else
|
48
|
+
raise RangeError, 'out of Unicode range'
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
# Returns a regular expression that matches strings in a kana-insensitive
|
53
|
+
# manner.
|
54
|
+
def self.norm_kana(str)
|
55
|
+
# Relevant codepoints:
|
56
|
+
# ひらがな == カタカナ
|
57
|
+
# 3041 - 3096 == 30A1 - 30F6 - ァ-ヶ
|
58
|
+
# 309D - 309E == 30FD - 30FE - ヽ-ヾ
|
59
|
+
hiragana = (0x3041..0x3096).to_a + (0x309D..0x309E).to_a
|
60
|
+
katakana = (0x30A1..0x30F6).to_a + (0x30FD..0x30FE).to_a
|
61
|
+
hkhash = {}
|
62
|
+
khhash = {}
|
63
|
+
i=0
|
64
|
+
hiragana.each {|c|
|
65
|
+
hkhash[c] = katakana[i]
|
66
|
+
khhash[katakana[i]] = c
|
67
|
+
i+=1
|
68
|
+
}
|
69
|
+
re=''
|
70
|
+
str.each_char {|c|
|
71
|
+
if hiragana.include?(c.chars.first)
|
72
|
+
re << "[#{c}#{int_to_utf8(hkhash[c.chars.first])}]"
|
73
|
+
elsif katakana.include?(c.chars.first)
|
74
|
+
re << "[#{c}#{int_to_utf8(khhash[c.chars.first])}]"
|
75
|
+
else
|
76
|
+
re << c
|
77
|
+
end
|
78
|
+
}
|
79
|
+
Regexp.new("^#{re}$")
|
80
|
+
end
|
81
|
+
public
|
82
|
+
|
18
83
|
def initialize(kanji)
|
19
84
|
unless @@data.instance.is_kanji?(kanji)
|
20
85
|
raise ArgumentError
|
@@ -34,24 +99,60 @@ class KLookup::Lookup::Kanji
|
|
34
99
|
@@data = h
|
35
100
|
end
|
36
101
|
|
37
|
-
# Returns an array of Kanji
|
38
|
-
#
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
102
|
+
# Returns an array of Kanji made up of :radicals, with a particular :meaning,
|
103
|
+
# with a particular :reading, or with a particular number of :strokes.
|
104
|
+
# A block can also be used which yields to Kanji objects. With no arguments
|
105
|
+
# and no block, all characters in the database are returned (you have been
|
106
|
+
# warned!).
|
107
|
+
#
|
108
|
+
# Note that :meaning and :reading are slow.
|
109
|
+
def self.lookup(hash=nil)
|
110
|
+
# Check values of the hash
|
111
|
+
unless hash.respond_to?(:to_hash) or hash.nil?
|
112
|
+
raise ArgumentError, 'Requires a hash or a block.'
|
43
113
|
end
|
114
|
+
hash = {} if hash.nil?
|
44
115
|
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
116
|
+
meaning = hash[:meaning]
|
117
|
+
meaning = [meaning] unless meaning.kind_of?(Array) or meaning.nil?
|
118
|
+
|
119
|
+
reading = hash[:reading]
|
120
|
+
reading = [reading] unless reading.kind_of?(Array) or reading.nil?
|
121
|
+
|
122
|
+
radical = hash[:radical]
|
123
|
+
unless radical.nil?
|
124
|
+
radical = [radical] unless radical.kind_of?(Array)
|
125
|
+
radical.map {|r| r.to_s }
|
126
|
+
end
|
127
|
+
|
128
|
+
stroke = hash[:stroke]
|
129
|
+
stroke = stroke.to_i unless stroke.nil?
|
130
|
+
|
131
|
+
kanji = @@data.instance.find_kanji(:stroke=>stroke, :radical=>radical).collect {|k|
|
53
132
|
KLookup::Lookup::Kanji.new(k)
|
54
133
|
}
|
134
|
+
|
135
|
+
# Don't filter
|
136
|
+
if reading.nil? and meaning.nil? and (not block_given?)
|
137
|
+
return kanji
|
138
|
+
end
|
139
|
+
|
140
|
+
truths = 0
|
141
|
+
# Filter according to hash and block
|
142
|
+
kanji = kanji.select {|k|
|
143
|
+
unless reading.nil?
|
144
|
+
next unless reading.any? {|r|
|
145
|
+
k.reading.reading.any?{|s| norm_kana(r) === s } or
|
146
|
+
k.reading.name_reading.any?{|s| norm_kana(r) === s } }
|
147
|
+
end
|
148
|
+
unless meaning.nil?
|
149
|
+
next unless meaning.any? {|m| k.meaning.include?(m) }
|
150
|
+
end
|
151
|
+
next if block_given? and not yield k
|
152
|
+
true
|
153
|
+
}
|
154
|
+
|
155
|
+
return kanji
|
55
156
|
end
|
56
157
|
|
57
158
|
# Returns true if kanji exists in database.
|
@@ -73,11 +174,12 @@ class KLookup::Lookup::Kanji
|
|
73
174
|
end
|
74
175
|
|
75
176
|
# Returns an array of radicals that make up a kanji.
|
76
|
-
def
|
77
|
-
return @@data.instance.
|
177
|
+
def radical
|
178
|
+
return @@data.instance.get_radical(to_s).collect {|r|
|
78
179
|
KLookup::Lookup::Radical.new(r)
|
79
180
|
}
|
80
181
|
end
|
182
|
+
alias :radicals :radical
|
81
183
|
|
82
184
|
# Returns a textual representation of a radical.
|
83
185
|
def to_s
|
@@ -34,18 +34,18 @@ class KLookup::Lookup::Radical
|
|
34
34
|
|
35
35
|
# Return an array of how many strokes radicals can be made up of.
|
36
36
|
def self.strokes
|
37
|
-
@@data.instance.
|
37
|
+
@@data.instance.radical_stroke_count
|
38
38
|
end
|
39
39
|
|
40
40
|
# Returns an array of radicals with +strokes+ strokes. Without an argument,
|
41
41
|
# all radicals are returned.
|
42
42
|
def self.list(strokes=nil)
|
43
43
|
if strokes.nil?
|
44
|
-
@@data.instance.
|
44
|
+
@@data.instance.find_radical
|
45
45
|
else
|
46
46
|
raise ArgumentError unless strokes.respond_to?(:to_i)
|
47
47
|
|
48
|
-
@@data.instance.
|
48
|
+
@@data.instance.find_radical(:stroke=>strokes.to_i)
|
49
49
|
end
|
50
50
|
end
|
51
51
|
|
@@ -0,0 +1,127 @@
|
|
1
|
+
require 'klookup'
|
2
|
+
require 'test/unit'
|
3
|
+
|
4
|
+
class Database_Test < Test::Unit::TestCase
|
5
|
+
|
6
|
+
def self.set_handler(cl)
|
7
|
+
@@dbc = cl
|
8
|
+
@@db = @@dbc.instance
|
9
|
+
end
|
10
|
+
|
11
|
+
# Asserts false with message +msg+ if +exception+ is not raised within
|
12
|
+
# the given block.
|
13
|
+
def must_except(exception=Exception, msg=nil)
|
14
|
+
raise LocalJumpError unless block_given?
|
15
|
+
begin
|
16
|
+
yield
|
17
|
+
rescue exception
|
18
|
+
else
|
19
|
+
assert false, msg
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
|
24
|
+
def test_open_resource
|
25
|
+
f = @@dbc.open_resource('newradkfile')
|
26
|
+
assert f.respond_to?(:each_line), 'valid path'
|
27
|
+
|
28
|
+
f = @@dbc.open_resource('newradkfile', 'klookup')
|
29
|
+
assert f.respond_to?(:each_line), 'valid path and valid gem'
|
30
|
+
|
31
|
+
flag=false
|
32
|
+
@@dbc.open_resource('newradkfile') {|f|
|
33
|
+
assert f.respond_to?(:each_line)
|
34
|
+
flag=true
|
35
|
+
}
|
36
|
+
assert flag, 'using a block'
|
37
|
+
|
38
|
+
must_except(Errno::ENOENT, 'invalid path') {
|
39
|
+
@@dbc.open_resource('all your base are belong to us')
|
40
|
+
}
|
41
|
+
must_except(Errno::ENOENT, 'invalid gem') {
|
42
|
+
@@dbc.open_resource('newradkfile', 'cookies are yummy')
|
43
|
+
}
|
44
|
+
end
|
45
|
+
|
46
|
+
def test_methods_exist
|
47
|
+
[:radical_stroke_count,
|
48
|
+
:find_radical,
|
49
|
+
:find_kanji, #TODO
|
50
|
+
:get_stroke_count, #TODO
|
51
|
+
:get_radical, #TODO
|
52
|
+
:get_reading, #TODO
|
53
|
+
:get_meaning, #TODO
|
54
|
+
:is_kanji?, #TODO
|
55
|
+
:is_radical? #TODO
|
56
|
+
].each {|m|
|
57
|
+
assert @@db.respond_to?(m), "#{m.to_s} exists"
|
58
|
+
}
|
59
|
+
assert @@dbc.respond_to?(:open_resource)
|
60
|
+
end
|
61
|
+
|
62
|
+
def test_radical_stroke_count
|
63
|
+
assert @@db.radical_stroke_count.kind_of?(Enumerable), 'an Enumerable'
|
64
|
+
assert (@@db.radical_stroke_count.size > 0), 'more than zero'
|
65
|
+
assert @@db.radical_stroke_count.each {|s|
|
66
|
+
assert s.kind_of?(Integer), 'an Integer'
|
67
|
+
}
|
68
|
+
end
|
69
|
+
|
70
|
+
def test_find_radical
|
71
|
+
test = @@db.find_radical(:stroke=>11)
|
72
|
+
assert test.include?('鳥')
|
73
|
+
assert (not test.include?('馬'))
|
74
|
+
test = @@db.find_radical(:stroke=>10)
|
75
|
+
assert test.include?('馬')
|
76
|
+
assert (not test.include?('鳥'))
|
77
|
+
test = @@db.find_radical
|
78
|
+
assert test.include?('鳥')
|
79
|
+
assert test.include?('馬')
|
80
|
+
newtest = @@db.find_radical(:stroke=>nil)
|
81
|
+
assert test==newtest, 'Sets are identical'
|
82
|
+
test = @@db.find_radical(:stroke=>0)
|
83
|
+
assert test.size == 0, 'Size is zero'
|
84
|
+
|
85
|
+
must_except(ArgumentError, 'not a hash (String)') {
|
86
|
+
@@db.find_radical('cats')
|
87
|
+
}
|
88
|
+
must_except(ArgumentError, 'not a hash (Integer)') {
|
89
|
+
@@db.find_radical(6)
|
90
|
+
}
|
91
|
+
must_except(ArgumentError, 'invalid :stroke') {
|
92
|
+
@@db.find_radical(:stroke=>'nobbly knees')
|
93
|
+
}
|
94
|
+
test = @@db.find_radical(:stroke=>10,:cats=>:dogs)
|
95
|
+
assert test.include?('馬')
|
96
|
+
assert (not test.include?('鳥'))
|
97
|
+
end
|
98
|
+
|
99
|
+
def test_find_kanji
|
100
|
+
end
|
101
|
+
|
102
|
+
end
|
103
|
+
|
104
|
+
|
105
|
+
|
106
|
+
require 'test/unit/ui/console/testrunner'
|
107
|
+
results=[]
|
108
|
+
db=KLookup::Database
|
109
|
+
puts
|
110
|
+
puts "= Database_Test"
|
111
|
+
# Just use FlatFile for the moment
|
112
|
+
#[:FlatFile].each {|h|
|
113
|
+
db.constants.each {|h|
|
114
|
+
handler = "#{db.to_s}::#{h}"
|
115
|
+
next unless eval(handler).superclass == db
|
116
|
+
puts
|
117
|
+
puts "== Handler: #{handler}"
|
118
|
+
Database_Test.set_handler(eval(handler)) # Database class
|
119
|
+
results << [handler, Test::Unit::UI::Console::TestRunner.run(Database_Test)]
|
120
|
+
puts
|
121
|
+
}
|
122
|
+
|
123
|
+
results.each {|p|
|
124
|
+
h,r=p
|
125
|
+
puts "#{r.passed? ? 'PASS' : 'FAIL'} : #{h}"
|
126
|
+
puts (" %s" % r.to_s) unless r.passed?
|
127
|
+
}
|
data/test/suite.rb
CHANGED
@@ -15,11 +15,13 @@ begin
|
|
15
15
|
rescue LoadError
|
16
16
|
end
|
17
17
|
|
18
|
+
require 'database_test.rb'
|
19
|
+
|
18
20
|
require 'klookup'
|
19
21
|
require 'test/unit'
|
20
22
|
|
21
|
-
#
|
22
|
-
class
|
23
|
+
# Lookup::Lookup tests
|
24
|
+
class Lookup_Test < Test::Unit::TestCase
|
23
25
|
|
24
26
|
# Check classes
|
25
27
|
def test_radical_type
|
@@ -46,24 +48,22 @@ class KLookup_Test < Test::Unit::TestCase
|
|
46
48
|
# Lookups should work
|
47
49
|
def test_kanji_lookup
|
48
50
|
# Cat
|
49
|
-
assert KLookup::Lookup::Kanji.lookup(
|
50
|
-
assert KLookup::Lookup::Kanji.lookup(11, KLookup::Lookup::Radical.new('艹'), KLookup::Lookup::Radical.new('犭'), KLookup::Lookup::Radical.new('田')).include?(KLookup::Lookup::Kanji.new('猫')), 'With stroke count.
|
51
|
-
assert KLookup::Lookup::Kanji.lookup(nil, [KLookup::Lookup::Radical.new('艹'), KLookup::Lookup::Radical.new('犭'), KLookup::Lookup::Radical.new('田')]).include?(KLookup::Lookup::Kanji.new('猫')), 'Without stroke count. Arrayed grass, left-dog, field => cat'
|
52
|
-
assert KLookup::Lookup::Kanji.lookup(11, [KLookup::Lookup::Radical.new('艹'), KLookup::Lookup::Radical.new('犭'), KLookup::Lookup::Radical.new('田')]).include?(KLookup::Lookup::Kanji.new('猫')), 'With stroke count. Arrayed grass, left-dog, field => cat'
|
51
|
+
assert KLookup::Lookup::Kanji.lookup(:radical=>[KLookup::Lookup::Radical.new('艹'), KLookup::Lookup::Radical.new('犭'), KLookup::Lookup::Radical.new('田')]).include?(KLookup::Lookup::Kanji.new('猫')), 'Without stroke count. Arrayed grass, left-dog, field => cat'
|
52
|
+
assert KLookup::Lookup::Kanji.lookup(:stroke=>11, :radical=>[KLookup::Lookup::Radical.new('艹'), KLookup::Lookup::Radical.new('犭'), KLookup::Lookup::Radical.new('田')]).include?(KLookup::Lookup::Kanji.new('猫')), 'With stroke count. Arrayed grass, left-dog, field => cat'
|
53
53
|
|
54
54
|
# Chestnut
|
55
|
-
assert KLookup::Lookup::Kanji.lookup(nil, KLookup::Lookup::Radical.new('西'), KLookup::Lookup::Radical.new('木')).include?(KLookup::Lookup::Kanji.new('栗')), 'Without stroke count. West, tree => chestnut.'
|
56
|
-
assert KLookup::Lookup::Kanji.lookup(10, KLookup::Lookup::Radical.new('西'), KLookup::Lookup::Radical.new('木')).include?(KLookup::Lookup::Kanji.new('栗')), 'With stroke count. West, tree => chestnut.'
|
55
|
+
assert KLookup::Lookup::Kanji.lookup(:stroke=>nil, :radical=>[KLookup::Lookup::Radical.new('西'), KLookup::Lookup::Radical.new('木')]).include?(KLookup::Lookup::Kanji.new('栗')), 'Without stroke count. West, tree => chestnut.'
|
56
|
+
assert KLookup::Lookup::Kanji.lookup(:stroke=>10, :radical=>[KLookup::Lookup::Radical.new('西'), KLookup::Lookup::Radical.new('木')]).include?(KLookup::Lookup::Kanji.new('栗')), 'With stroke count. West, tree => chestnut.'
|
57
57
|
|
58
58
|
# Test that radicals are using to_s
|
59
|
-
assert KLookup::Lookup::Kanji.lookup(10, '西'.to_sym, KLookup::Lookup::Radical.new('木'.to_sym)).include?(KLookup::Lookup::Kanji.new('栗'.to_sym)), 'With stroke count (and symbols). West, tree => chestnut.'
|
59
|
+
assert KLookup::Lookup::Kanji.lookup(:radical=>10, :radical=>['西'.to_sym, KLookup::Lookup::Radical.new('木'.to_sym)]).include?(KLookup::Lookup::Kanji.new('栗'.to_sym)), 'With stroke count (and symbols). West, tree => chestnut.'
|
60
60
|
end
|
61
61
|
|
62
62
|
# Checks stroke count works
|
63
63
|
def test_kanji_lookup_stroke
|
64
64
|
# Unmatching stroke counts should result in empty lists
|
65
|
-
assert KLookup::Lookup::Kanji.lookup(10, [KLookup::Lookup::Radical.new('艹'), KLookup::Lookup::Radical.new('犭'), KLookup::Lookup::Radical.new('田')])==[], '10 strokes for grass, left-dog, and field is impossible.'
|
66
|
-
assert KLookup::Lookup::Kanji.lookup(12, [KLookup::Lookup::Radical.new('艹'), KLookup::Lookup::Radical.new('犭'), KLookup::Lookup::Radical.new('田')])==[], '12 strokes for grass, left-dog, and field results in no characters.'
|
65
|
+
assert KLookup::Lookup::Kanji.lookup(:stroke=>10, :radical=>[KLookup::Lookup::Radical.new('艹'), KLookup::Lookup::Radical.new('犭'), KLookup::Lookup::Radical.new('田')])==[], '10 strokes for grass, left-dog, and field is impossible.'
|
66
|
+
assert KLookup::Lookup::Kanji.lookup(:stroke=>12, :radical=>[KLookup::Lookup::Radical.new('艹'), KLookup::Lookup::Radical.new('犭'), KLookup::Lookup::Radical.new('田')])==[], '12 strokes for grass, left-dog, and field results in no characters.'
|
67
67
|
end
|
68
68
|
|
69
69
|
def test_kanji_radicals
|
@@ -125,19 +125,89 @@ class KLookup_Test < Test::Unit::TestCase
|
|
125
125
|
assert KLookup::Lookup::Radical.exist?('田')
|
126
126
|
assert (not KLookup::Lookup::Radical.exist?('た'))
|
127
127
|
end
|
128
|
+
|
129
|
+
def test_just_meaning_lookup
|
130
|
+
cat_m = KLookup::Lookup::Kanji.lookup(:meaning=>'cat')
|
131
|
+
cat = KLookup::Lookup::Kanji.new('猫')
|
132
|
+
dog = KLookup::Lookup::Kanji.new('犬')
|
133
|
+
assert (cat_m.include?(cat) and not cat_m.include?(dog)), ':meaning'
|
134
|
+
end
|
135
|
+
|
136
|
+
def test_meaning_lookup
|
137
|
+
cat_m = KLookup::Lookup::Kanji.lookup(:meaning=>'cat')
|
138
|
+
cat_ms = KLookup::Lookup::Kanji.lookup(:meaning=>'cat', :stroke=>11)
|
139
|
+
cat_mss = KLookup::Lookup::Kanji.lookup(:meaning=>'cat', :stroke=>12)
|
140
|
+
cat = KLookup::Lookup::Kanji.new('猫')
|
141
|
+
dog = KLookup::Lookup::Kanji.new('犬')
|
142
|
+
assert (cat_m.include?(cat) and not cat_m.include?(dog)), ':meaning'
|
143
|
+
assert (cat_ms.include?(cat) and not cat_ms.include?(dog)), ':meaning and valid :stroke'
|
144
|
+
assert (not cat_mss.include?(cat) and not cat_mss.include?(dog)), ':meaning and invalid :stroke'
|
145
|
+
end
|
146
|
+
|
147
|
+
def test_reading_lookup
|
148
|
+
cat_r = KLookup::Lookup::Kanji.lookup(:reading=>'ねこ')
|
149
|
+
cat_rs = KLookup::Lookup::Kanji.lookup(:reading=>'ねこ', :stroke=>11)
|
150
|
+
cat_rss = KLookup::Lookup::Kanji.lookup(:reading=>'ねこ', :stroke=>12)
|
151
|
+
cat = KLookup::Lookup::Kanji.new('猫')
|
152
|
+
dog = KLookup::Lookup::Kanji.new('犬')
|
153
|
+
assert (cat_r.include?(cat) and not cat_r.include?(dog)), ':reading'
|
154
|
+
assert (cat_rs.include?(cat) and not cat_rs.include?(dog)), ':reading and valid :stroke'
|
155
|
+
assert (not cat_rss.include?(cat) and not cat_rss.include?(dog)), ':reading and invalid :stroke'
|
156
|
+
end
|
157
|
+
|
158
|
+
def test_just_reading_lookup
|
159
|
+
cat = KLookup::Lookup::Kanji.new('猫')
|
160
|
+
dog = KLookup::Lookup::Kanji.new('犬')
|
161
|
+
cat_r = KLookup::Lookup::Kanji.lookup(:reading=>'ねこ')
|
162
|
+
assert (cat_r.include?(cat) and not cat_r.include?(dog)), ':reading in same kana'
|
163
|
+
cat_r = KLookup::Lookup::Kanji.lookup(:reading=>'ネコ')
|
164
|
+
assert (cat_r.include?(cat) and not cat_r.include?(dog)), ':reading in different kana'
|
165
|
+
end
|
166
|
+
|
167
|
+
def test_all_lookup
|
168
|
+
#TODO: this may not be a good test
|
169
|
+
assert KLookup::Lookup::Kanji.lookup.length > 1000
|
170
|
+
end
|
171
|
+
|
172
|
+
def test_just_block_lookup
|
173
|
+
cat = KLookup::Lookup::Kanji.new('猫')
|
174
|
+
dog = KLookup::Lookup::Kanji.new('犬')
|
175
|
+
|
176
|
+
look = KLookup::Lookup::Kanji.lookup {|k| k.meaning.include?('cat')}
|
177
|
+
assert (look.include?(cat) and not look.include?(dog)), 'meaning in block'
|
178
|
+
end
|
179
|
+
|
180
|
+
def test_block_lookup
|
181
|
+
cat = KLookup::Lookup::Kanji.new('猫')
|
182
|
+
dog = KLookup::Lookup::Kanji.new('犬')
|
183
|
+
|
184
|
+
look = KLookup::Lookup::Kanji.lookup(:reading=>'ねこ') {|k|
|
185
|
+
k.meaning.include?('cat')}
|
186
|
+
assert (look.include?(cat) and not look.include?(dog)),
|
187
|
+
'meaning in block and reading'
|
188
|
+
|
189
|
+
look = KLookup::Lookup::Kanji.lookup(:reading=>'ねこ') {|k|
|
190
|
+
true}
|
191
|
+
assert (look.include?(cat) and not look.include?(dog)),
|
192
|
+
'true in block and reading'
|
193
|
+
end
|
128
194
|
end
|
129
195
|
|
130
196
|
|
131
197
|
require 'test/unit/ui/console/testrunner'
|
132
198
|
results=[]
|
133
199
|
db=KLookup::Database
|
200
|
+
puts
|
201
|
+
puts "= Lookup_Test"
|
202
|
+
# Just use FlatFile for the moment
|
203
|
+
#[:FlatFile].each {|h|
|
134
204
|
db.constants.each {|h|
|
135
205
|
handler = "#{db.to_s}::#{h}"
|
136
206
|
next unless eval(handler).superclass == db
|
137
207
|
puts
|
138
208
|
puts "== KLookup::Lookup.handler = #{handler}"
|
139
209
|
KLookup::Lookup.handler = eval(handler)
|
140
|
-
results << [handler, Test::Unit::UI::Console::TestRunner.run(
|
210
|
+
results << [handler, Test::Unit::UI::Console::TestRunner.run(Lookup_Test)]
|
141
211
|
puts
|
142
212
|
}
|
143
213
|
|
metadata
CHANGED
@@ -1,10 +1,10 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
|
-
rubygems_version: 0.9.
|
2
|
+
rubygems_version: 0.9.2
|
3
3
|
specification_version: 1
|
4
4
|
name: klookup
|
5
5
|
version: !ruby/object:Gem::Version
|
6
|
-
version: 0.2.
|
7
|
-
date: 2007-
|
6
|
+
version: 0.2.4
|
7
|
+
date: 2007-02-18 00:00:00 +00:00
|
8
8
|
summary: A set of kanji lookup tools and a library.
|
9
9
|
require_paths:
|
10
10
|
- lib
|
@@ -36,6 +36,7 @@ files:
|
|
36
36
|
- lib/klookup/lookup.rb
|
37
37
|
- lib/klookup/lookup_radical.rb
|
38
38
|
- lib/klookup/database.rb
|
39
|
+
- lib/klookup/database_quickfile.rb
|
39
40
|
- lib/klookup/database_flatfile_radk.rb
|
40
41
|
- lib/klookup/database_unihan.rb
|
41
42
|
- lib/klookup/database_flatfile_kanjidic.rb
|
@@ -43,6 +44,7 @@ files:
|
|
43
44
|
- lib/klookup/lookup_kanji.rb
|
44
45
|
test_files:
|
45
46
|
- test/suite.rb
|
47
|
+
- test/database_test.rb
|
46
48
|
rdoc_options:
|
47
49
|
- - --main
|
48
50
|
- KLookup
|
@@ -67,12 +69,3 @@ dependencies:
|
|
67
69
|
- !ruby/object:Gem::Version
|
68
70
|
version: 1.4.0
|
69
71
|
version:
|
70
|
-
- !ruby/object:Gem::Dependency
|
71
|
-
name: unihan
|
72
|
-
version_requirement:
|
73
|
-
version_requirements: !ruby/object:Gem::Version::Requirement
|
74
|
-
requirements:
|
75
|
-
- - ">="
|
76
|
-
- !ruby/object:Gem::Version
|
77
|
-
version: 5.0.0.1.1
|
78
|
-
version:
|