gimchi 0.1.4 → 0.1.5

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.
@@ -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: