gimchi 0.1.4 → 0.1.5

Sign up to get free protection for your applications and to get access to all the features.
@@ -84,14 +84,22 @@ pronouncer:
84
84
  rule_16: [rule_30]
85
85
 
86
86
  number:
87
+ positive: 플러스
87
88
  negative: 마이너스
88
89
  decimal point: 점
89
90
  units: ["", 만, 억, 조, 경, 해, 자, 양, 구, 간, 정, 재, 극, 항하사, 아승기, 나유타, 불가사의, 무량대수]
90
91
  digits: [영, 일, 이, 삼, 사, 오, 육, 칠, 팔, 구]
92
+ post substitution:
93
+ ? !ruby/regexp /^일만/
94
+ : 만
91
95
 
92
96
  # 정수형일 때 또다른 표현법 (나이, 시간)
93
97
  alt notation:
94
98
  when suffix:
99
+ 개:
100
+ max:
101
+ 명:
102
+ max:
95
103
  살:
96
104
  max:
97
105
  시:
@@ -72,8 +72,8 @@ class Korean
72
72
  def read_number str
73
73
  nconfig = config['number']
74
74
 
75
- str.to_s.gsub(/([+-]\s*)?[0-9,]*,*[0-9]+(\.[0-9]+)?(\s*.)?/) {
76
- read_number_sub($&, $3)
75
+ str.to_s.gsub(/([+-]\s*)?[0-9,]*,*[0-9]+(\.[0-9]+(e[+-][0-9]+)?)?(\s*.)?/) {
76
+ read_number_sub($&, $4)
77
77
  }
78
78
  end
79
79
 
@@ -171,101 +171,120 @@ private
171
171
  def read_number_sub num, next_char = nil
172
172
  nconfig = config['number']
173
173
 
174
- # To number
175
- if num.is_a? String
176
- num = num.gsub(/[\s,]/, '')
177
- raise ArgumentError.new("Invalid number format") unless num =~ /[-+]?[0-9,]*\.?[0-9]*/
178
- num = num.to_f == num.to_i ? num.to_i : num.to_f
179
- end
174
+ num = num.gsub(',', '')
175
+ num = num.sub(/#{next_char}$/, '') if next_char
176
+ is_float = num.match(/[\.e]/) != nil
180
177
 
181
178
  # Alternative notation for integers with proper suffix
182
179
  alt = false
183
- if num.is_a?(Float) == false && nconfig['alt notation']['when suffix'].keys.include?(next_char.to_s.strip)
180
+ if is_float == false &&
181
+ nconfig['alt notation']['when suffix'].keys.include?(next_char.to_s.strip)
184
182
  max = nconfig['alt notation']['when suffix'][next_char.strip]['max']
185
183
 
186
- if max.nil? || num <= max
184
+ if max.nil? || num.to_i <= max
187
185
  alt = true
188
186
  end
189
187
  end
190
188
 
191
189
  # Sign
192
- if num < 0
193
- num = -1 * num
190
+ sign = []
191
+ negative = false
192
+ if num =~ /^-/
193
+ num = num.sub(/^-\s*/, '')
194
+ sign << nconfig['negative']
194
195
  negative = true
195
- else
196
- negative = false
196
+ elsif num =~ /^\+/
197
+ num = num.sub(/^\+\s*/, '')
198
+ sign << nconfig['positive']
197
199
  end
198
200
 
199
- if num.is_a? Float
201
+ if is_float
200
202
  below = nconfig['decimal point']
201
- below = nconfig['digits'][0] + below if num < 1
203
+ below = nconfig['digits'][0] + below if num.to_f < 1
202
204
 
203
- s = num.to_s
204
- if md = s.match(/(.*)e(.*)/)
205
- s = md[1].tr '.', ''
205
+ if md = num.match(/(.*)e(.*)/)
206
+ dp = md[1].index('.')
207
+ num = md[1].tr '.', ''
206
208
  exp = md[2].to_i
207
- if exp > 0
208
- s = s.ljust(exp + 1, '0')
209
+
210
+ dp += exp
211
+ if dp > num.length
212
+ num = num.ljust(dp, '0')
213
+ num = num.sub(/^0+([1-9])/, "\\1")
214
+
215
+ below = ""
216
+ elsif dp < 0
217
+ num = '0.' + '0' * (-dp) + num
209
218
  else
210
- s = '0.' + '0' * (-exp - 1) + s
219
+ num[dp] = '.' + num[dp]
211
220
  end
212
221
  end
213
- s.sub(/.*\./, '').each_char do | char |
222
+ num.sub(/.*\./, '').each_char do | char |
214
223
  below += nconfig['digits'][char.to_i]
215
- end
216
- num = num.floor.to_i
224
+ end if num.include? '.'
225
+ num = num.sub(/\..*/, '')
217
226
  else
218
227
  below = ""
219
228
  end
220
229
 
221
230
  tokens = []
222
231
  unit_idx = -1
232
+ num = num.to_i
223
233
  while num > 0
224
234
  v = num % 10000
225
235
 
226
- if alt == false || unit_idx >= 0
227
- str = ""
228
- # Cannot use hash as they're unordered in 1.8
229
- [[1000, '천'],
230
- [100, '백'],
231
- [10, '']].each do | arr |
232
- u, sub_unit = arr
233
- str += (nconfig['digits'][v/u] if v/u != 1).to_s + sub_unit + ' ' if v / u > 0
234
- v %= u
235
- end
236
- str += nconfig['digits'][v] if v > 0
237
-
238
- tokens << str.sub(/ $/, '') + nconfig['units'][unit_idx += 1]
239
- else
240
- str = ""
241
- tenfolds = nconfig['alt notation']['tenfolds']
242
- digits = nconfig['alt notation']['digits']
243
- post_subs = nconfig['alt notation']['post substitution']
244
-
245
- # Likewise.
246
- [[1000, '천'],
247
- [100, '백']].each do | u, sub_unit |
248
- str += (nconfig['digits'][v/u] if v/u != 1).to_s + sub_unit + ' ' if v / u > 0
249
- v %= u
250
- end
251
-
252
- str += tenfolds[(v / 10) - 1] if v / 10 > 0
253
- v %= 10
254
- str += digits[v] if v > 0
255
-
256
- suffix = next_char.strip
257
- str = str + suffix
258
- post_subs.each do | k, v |
259
- str.gsub!(k, v)
236
+ unit_idx += 1
237
+ if v > 0
238
+ if alt == false || unit_idx >= 1
239
+ str = ""
240
+ # Cannot use hash as they're unordered in 1.8
241
+ [[1000, ''],
242
+ [100, '백'],
243
+ [10, '']].each do | arr |
244
+ u, sub_unit = arr
245
+ str += (nconfig['digits'][v/u] if v/u != 1).to_s + sub_unit + ' ' if v / u > 0
246
+ v %= u
247
+ end
248
+ str += nconfig['digits'][v] if v > 0
249
+
250
+ tokens << str.sub(/ $/, '') + nconfig['units'][unit_idx]
251
+ else
252
+ str = ""
253
+ tenfolds = nconfig['alt notation']['tenfolds']
254
+ digits = nconfig['alt notation']['digits']
255
+ alt_post_subs = nconfig['alt notation']['post substitution']
256
+
257
+ # Likewise.
258
+ [[1000, ''],
259
+ [100, '백']].each do | u, sub_unit |
260
+ str += (nconfig['digits'][v/u] if v/u != 1).to_s + sub_unit + ' ' if v / u > 0
261
+ v %= u
262
+ end
263
+
264
+ str += tenfolds[(v / 10) - 1] if v / 10 > 0
265
+ v %= 10
266
+ str += digits[v] if v > 0
267
+
268
+ if alt
269
+ suffix = next_char.strip
270
+ str = str + suffix
271
+ alt_post_subs.each do | k, v |
272
+ str.gsub!(k, v)
273
+ end
274
+ str.sub!(/#{suffix}$/, '')
275
+ end
276
+ tokens << str.sub(/ $/, '') + nconfig['units'][unit_idx]
260
277
  end
261
- str.sub!(/#{suffix}$/, '')
262
- tokens << str.sub(/ $/, '') + nconfig['units'][unit_idx += 1]
263
278
  end
264
279
  num /= 10000
265
280
  end
266
281
 
267
- tokens << nconfig['negative'] if negative
268
- tokens.reverse.join(' ') + next_char.to_s + below
282
+ tokens += sign unless sign.empty?
283
+ ret = tokens.reverse.join(' ') + below + next_char.to_s
284
+ nconfig['post substitution'].each do | k, v |
285
+ ret.gsub!(k, v)
286
+ end
287
+ ret
269
288
  end
270
289
  end#Korean
271
290
  end#Gimchi
@@ -77,12 +77,25 @@ class TestGimchi < Test::Unit::TestCase
77
77
  ko = Gimchi::Korean.new
78
78
  assert_equal "천 구백 구십 구", ko.read_number(1999)
79
79
  assert_equal "마이너스 백점일이삼", ko.read_number(- 100.123)
80
- assert_equal "오백 삼십 일억 구천 백 십만 육백 칠십 팔점삼이일사",
81
- ko.read_number("53,191,100,678.3214")
82
-
83
- # 나이, 시간 ( -살, -시 )
80
+ assert_equal "오백 삼십 일억 구천 백 십만 육백 칠십 팔점삼이일사오육칠",
81
+ ko.read_number("53,191,100,678.3214567")
82
+ assert_equal "영점영영영영영일이삼사오", ko.read_number("1.2345e-06")
83
+ assert_equal "일해 이천 삼백 사십 오경", ko.read_number("1.2345e+20")
84
+ assert_equal "플러스 일해 이천 삼백 사십 오경", ko.read_number("+ 1.2345e+20")
85
+ assert_equal "마이너스 일해 이천 삼백 사십 오경", ko.read_number("- 1.2345e+20")
86
+ assert_equal "만 십 이점삼", ko.read_number("100.123e+2")
87
+ assert_equal "십만 십 이점삼", ko.read_number("1000.123e+2")
88
+ assert_equal "백 일만 십 이점삼", ko.read_number("10100.123e+2")
89
+ assert_equal "천 십 이점삼", ko.read_number("10.123e+2")
90
+ assert_equal "십점영", ko.read_number("10.0")
91
+ assert_equal "플러스 십점영", ko.read_number("+ 10.0")
92
+
93
+ # 나이, 시간, 개수, 명 ( -살, -시, -개, -명 )
84
94
  assert_equal "나는 스무살", ko.read_number("나는 20살")
95
+ assert_equal "이십 칠점일살", ko.read_number("27.1살")
85
96
  assert_equal "너는 열세 살", ko.read_number("너는 13 살")
97
+ assert_equal "백 서른두명", ko.read_number("132명")
98
+ assert_equal "이천 오백 아흔아홉개", ko.read_number("2,599개")
86
99
  assert_equal "지금은 일곱시 삼십분", ko.read_number("지금은 7시 30분")
87
100
  end
88
101
 
@@ -118,7 +131,7 @@ class TestGimchi < Test::Unit::TestCase
118
131
  assert s >= 411
119
132
  end
120
133
 
121
- def test_romanize_preservce_non_korean
134
+ def test_romanize_preserve_non_korean
122
135
  ko = Gimchi::Korean.new
123
136
  assert_equal 'ttok-kkateun kkk', ko.romanize('똑같은 kkk')
124
137
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: gimchi
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.4
4
+ version: 0.1.5
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2011-04-08 00:00:00.000000000Z
12
+ date: 2011-04-12 00:00:00.000000000Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: bundler
16
- requirement: &2152726760 !ruby/object:Gem::Requirement
16
+ requirement: &2152493140 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ~>
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: 1.0.0
22
22
  type: :development
23
23
  prerelease: false
24
- version_requirements: *2152726760
24
+ version_requirements: *2152493140
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: jeweler
27
- requirement: &2152726280 !ruby/object:Gem::Requirement
27
+ requirement: &2152491800 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ~>
@@ -32,10 +32,10 @@ dependencies:
32
32
  version: 1.5.2
33
33
  type: :development
34
34
  prerelease: false
35
- version_requirements: *2152726280
35
+ version_requirements: *2152491800
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: rcov
38
- requirement: &2152742180 !ruby/object:Gem::Requirement
38
+ requirement: &2152490620 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ! '>='
@@ -43,10 +43,10 @@ dependencies:
43
43
  version: '0'
44
44
  type: :development
45
45
  prerelease: false
46
- version_requirements: *2152742180
46
+ version_requirements: *2152490620
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: ansi
49
- requirement: &2152741700 !ruby/object:Gem::Requirement
49
+ requirement: &2152489680 !ruby/object:Gem::Requirement
50
50
  none: false
51
51
  requirements:
52
52
  - - ! '>='
@@ -54,7 +54,7 @@ dependencies:
54
54
  version: 1.2.2
55
55
  type: :development
56
56
  prerelease: false
57
- version_requirements: *2152741700
57
+ version_requirements: *2152489680
58
58
  description: Gimchi knows how to pronounce Korean strings and how to write them in
59
59
  roman alphabet.
60
60
  email: junegunn.c@gmail.com
@@ -91,6 +91,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
91
91
  - - ! '>='
92
92
  - !ruby/object:Gem::Version
93
93
  version: '0'
94
+ segments:
95
+ - 0
96
+ hash: -4096346844211308775
94
97
  required_rubygems_version: !ruby/object:Gem::Requirement
95
98
  none: false
96
99
  requirements: