horai 0.7.0 → 0.7.1

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -1,3 +1,121 @@
1
- # What is Horai
1
+ # What to do
2
2
 
3
- Horai は日本語の時刻表現をパースし、DateTime型に変換することを目標としている Gem です。(beta)
3
+ Derive DateTime from Time expression with Natural language
4
+
5
+ # Sample
6
+
7
+ jajp = Horai::JaJP.new
8
+
9
+ time = jajp.parse("1999年")
10
+ => Fri, 01 Jan 1999 00:00:00 +0900
11
+
12
+ time = jajp.parse("1月")
13
+ => Sun, 01 Jan 2012 00:00:00 +0900
14
+
15
+ time = jajp.parse("1時半")
16
+ => Thu, 26 Apr 2012 01:30:00 +0900
17
+
18
+ time = jajp.parse("1分半後")
19
+ => Thu, 26 Apr 2012 14:11:34 +0900
20
+
21
+ time = jajp.parse("5時間半と1分半後")
22
+ => Thu, 26 Apr 2012 19:41:38 +0900
23
+
24
+ time = jajp.parse("夜の8時に")
25
+ => Thu, 26 Apr 2012 20:00:00 +0900
26
+
27
+ time = jajp.parse("午後一時に")
28
+ => Thu, 26 Apr 2012 13:00:00 +0900
29
+
30
+ time = jajp.parse("PM1時に")
31
+ => Thu, 26 Apr 2012 13:00:00 +0900
32
+
33
+ time = jajp.parse("rpm 6時に")
34
+ => Thu, 26 Apr 2012 06:00:00 +0900
35
+
36
+ time = jajp.parse("10日の正午に")
37
+ => Tue, 10 Apr 2012 12:00:00 +0900
38
+
39
+ time = jajp.parse("10:20")
40
+ => Thu, 26 Apr 2012 10:20:00 +0900
41
+
42
+ time = jajp.parse("10:20:30")
43
+ => Thu, 26 Apr 2012 10:20:30 +0900
44
+
45
+ time = jajp.parse("10/20")
46
+ => Sat, 20 Oct 2012 00:00:00 +0900
47
+
48
+ time = jajp.parse("2000/10/20")
49
+ => Fri, 20 Oct 2000 00:00:00 +0900
50
+
51
+ time = jajp.parse("10/10/20")
52
+ => Wed, 20 Oct 2010 00:00:00 +0900
53
+
54
+ time = jajp.parse("2000/10/20 12:30:40")
55
+ => Fri, 20 Oct 2000 12:30:40 +0900
56
+
57
+ time = jajp.parse("10年")
58
+ => Fri, 01 Jan 2010 00:00:00 +0900
59
+
60
+ time = jajp.parse("30年")
61
+ => Tue, 01 Jan 2030 00:00:00 +0900
62
+
63
+ time = jajp.parse("90年")
64
+ => Mon, 01 Jan 1990 00:00:00 +0900
65
+
66
+ time = jajp.parse("来年")
67
+ => Tue, 01 Jan 2013 00:00:00 +0900
68
+
69
+ time = jajp.parse("来月")
70
+ => Tue, 01 May 2012 00:00:00 +0900
71
+
72
+ time = jajp.parse("明日")
73
+ => Fri, 27 Apr 2012 00:00:00 +0900
74
+
75
+ time = jajp.parse("明後日")
76
+ => Sat, 28 Apr 2012 00:00:00 +0900
77
+
78
+ time = jajp.parse("昨日")
79
+ => Wed, 25 Apr 2012 00:00:00 +0900
80
+
81
+ time = jajp.parse("10年後の8月")
82
+ => Mon, 01 Aug 2022 00:00:00 +0900
83
+
84
+ time = jajp.parse("10分後")
85
+ => Thu, 26 Apr 2012 14:20:27 +0900
86
+
87
+ time = jajp.parse("10日後")
88
+ => Sun, 06 May 2012 14:10:27 +0900
89
+
90
+ time = jajp.parse("明日の10時")
91
+ => Fri, 27 Apr 2012 10:00:00 +0900
92
+
93
+ time = jajp.parse("明日の10:20:30")
94
+ => Fri, 27 Apr 2012 10:20:30 +0900
95
+
96
+ time = jajp.parse("明日の午後5時")
97
+ => Fri, 27 Apr 2012 17:00:00 +0900
98
+
99
+ time = jajp.parse("明日の正午")
100
+ => Fri, 27 Apr 2012 12:00:00 +0900
101
+
102
+ time = jajp.parse("3日後の12時")
103
+ => Sun, 29 Apr 2012 12:00:00 +0900
104
+
105
+ time = jajp.parse("3日後の12時45分")
106
+ => Sun, 29 Apr 2012 12:45:00 +0900
107
+
108
+ time = jajp.parse("3日後の12:45:55")
109
+ => Sun, 29 Apr 2012 12:45:55 +0900
110
+
111
+ time = jajp.parse("3日12時間45分後")
112
+ => Mon, 30 Apr 2012 02:55:27 +0900
113
+
114
+ time = jajp.parse("1時間半後")
115
+ => Thu, 26 Apr 2012 15:40:27 +0900
116
+
117
+ time = jajp.parse("1分半後")
118
+ => Thu, 26 Apr 2012 14:11:57 +0900
119
+
120
+ time = jajp.parse("5時間半と1分半後")
121
+ => Thu, 26 Apr 2012 19:42:03 +0900
data/Rakefile CHANGED
@@ -17,8 +17,8 @@ Jeweler::Tasks.new do |gem|
17
17
  gem.name = "horai"
18
18
  gem.homepage = "http://github.com/wneko/horai"
19
19
  gem.license = "MIT"
20
- gem.summary = "日本語の時刻表現をパースし、DateTime型に変換する Gem"
21
- gem.description = "Horai は日本語の時刻表現をパースし、DateTime型に変換することを目標としている Gem です。"
20
+ gem.summary = "Derive DateTime from Time expression with Natural language"
21
+ gem.description = "Derive DateTime from Time expression with Natural language (STILL ONLY IN JAPANESE)"
22
22
  gem.email = "aoki@u-ne.co"
23
23
  gem.authors = ["AOKI Yuuto"]
24
24
  # dependencies defined in Gemfile
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.7.0
1
+ 0.7.1
@@ -5,12 +5,12 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = "horai"
8
- s.version = "0.7.0"
8
+ s.version = "0.7.1"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["AOKI Yuuto"]
12
- s.date = "2012-04-25"
13
- s.description = "Horai \u{306f}\u{65e5}\u{672c}\u{8a9e}\u{306e}\u{6642}\u{523b}\u{8868}\u{73fe}\u{3092}\u{30d1}\u{30fc}\u{30b9}\u{3057}\u{3001}DateTime\u{578b}\u{306b}\u{5909}\u{63db}\u{3059}\u{308b}\u{3053}\u{3068}\u{3092}\u{76ee}\u{6a19}\u{3068}\u{3057}\u{3066}\u{3044}\u{308b} Gem \u{3067}\u{3059}\u{3002}"
12
+ s.date = "2012-04-26"
13
+ s.description = "Derive DateTime from Time expression with Natural language (STILL ONLY IN JAPANESE)"
14
14
  s.email = "aoki@u-ne.co"
15
15
  s.extra_rdoc_files = [
16
16
  "LICENSE.txt",
@@ -27,6 +27,8 @@ Gem::Specification.new do |s|
27
27
  "VERSION",
28
28
  "horai.gemspec",
29
29
  "lib/horai.rb",
30
+ "lib/horai/parser.rb",
31
+ "lib/horai/parser/ja_jp.rb",
30
32
  "lib/ja_number.rb",
31
33
  "spec/horai_spec.rb",
32
34
  "spec/spec_helper.rb"
@@ -35,7 +37,7 @@ Gem::Specification.new do |s|
35
37
  s.licenses = ["MIT"]
36
38
  s.require_paths = ["lib"]
37
39
  s.rubygems_version = "1.8.11"
38
- s.summary = "\u{65e5}\u{672c}\u{8a9e}\u{306e}\u{6642}\u{523b}\u{8868}\u{73fe}\u{3092}\u{30d1}\u{30fc}\u{30b9}\u{3057}\u{3001}DateTime\u{578b}\u{306b}\u{5909}\u{63db}\u{3059}\u{308b} Gem"
40
+ s.summary = "Derive DateTime from Time expression with Natural language"
39
41
 
40
42
  if s.respond_to? :specification_version then
41
43
  s.specification_version = 3
@@ -1,272 +1,11 @@
1
1
  # coding: utf-8
2
2
 
3
- require 'active_support/time'
4
- require "ja_number"
5
-
6
- class Horai
7
- NORMALIZE_FROM = '0-9a-zA-Z:'
8
- NORMALIZE_TO = '0-9a-zA-Z:'
9
-
10
- DATE_DELIMITER = (/[\/-]/)
11
- TIME_DELIMITER = (/[:]/)
12
-
13
- AFTERNOON_PATTERN = (/午後|ごご|夜|よる|(?<![a-z])pm(?![a-z])/i)
14
- RELATIVE_KEYWORDS_PATTERN = (/(?<![明午])後(?![年月日])|(?:[経た]っ|し)たら/)
15
- RELATIVE_PATTERN = (/(\d+)(?:(?:年|ねん)|(?:月|がつ)|(?:日|にち)|(?:分|ふん|ぷん)|(?:時間?|じ(?:かん)?)|(?:秒|びょう))#{RELATIVE_KEYWORDS_PATTERN}/)
16
-
17
- def self.filter(pattern, type = :absolute, &block)
18
- @filters = [] if @filters.nil?
19
- @filters << { pattern: pattern, type => block }
20
- end
21
-
22
- def self.truncate_time(date)
23
- datetime_delta(date, hour: 0, minute: 0, second: 0)
24
- end
25
-
26
- def self.datetime_delta(date, methods = {})
27
- date = date.dup
28
- methods.each_pair do |key, value|
29
- converter = 1.0.respond_to?(key) ? :to_f : :to_i;
30
- date += value.send(converter).send(key) - date.send(key).send(key)
31
- end
32
- date
33
- end
34
-
35
- def self.register_filters
36
- dd = DATE_DELIMITER
37
- td = TIME_DELIMITER
38
-
39
- # 年 (絶対)
40
- filter /(\d+)年/, :absolute do |text, matches, date|
41
- year = year_normalize(matches[1].to_i)
42
- truncate_time(datetime_delta(date, year: year, month: 1, day: 1))
43
- end
44
-
45
- filter /一昨[々昨]年|さきおととし|いっさくさくねん/, :absolute do |text, matches, date|
46
- truncate_time(datetime_delta(date - 3.year, month: 1, day: 1))
47
- end
48
-
49
- filter /一昨年|おととし|いっさくねん/, :absolute do |text, matches, date|
50
- truncate_time(datetime_delta(date - 2.year, month: 1, day: 1))
51
- end
52
-
53
- filter /去年|昨年|きょねん|さくねん/, :absolute do |text, matches, date|
54
- truncate_time(datetime_delta(date - 1.year, month: 1, day: 1))
55
- end
56
-
57
- filter /今年|本年|ことし|ほんねん/, :absolute do |text, matches, date|
58
- end
59
-
60
- filter /来年|明年|らいねん|みょうねん/, :absolute do |text, matches, date|
61
- truncate_time(datetime_delta(date + 1.year, month: 1, day: 1))
62
- end
63
-
64
- filter /再来年|明後年|さらいねん|みょうごねん/, :absolute do |text, matches, date|
65
- truncate_time(datetime_delta(date + 2.year, month: 1, day: 1))
66
- end
67
-
68
- filter /明[々明]後年|みょうみょうごねん/, :absolute do |text, matches, date|
69
- truncate_time(datetime_delta(date + 3.year, month: 1, day: 1))
70
- end
71
-
72
- # 月 (絶対)
73
- filter /(\d+)月/, :absolute do |text, matches, date|
74
- truncate_time(datetime_delta(date, month: matches[1].to_i, day: 1))
75
- end
76
-
77
- filter /[先前][々先前]{3}月|せんせんせんげつ/, :absolute do |text, matches, date|
78
- truncate_time(datetime_delta(date - 3.month, day: 1))
79
- end
80
-
81
- filter /[先前][々先前]月|せんせんげつ/, :absolute do |text, matches, date|
82
- truncate_time(datetime_delta(date - 2.month, day: 1))
83
- end
84
-
85
- filter /先月|前月|せんげつ/, :absolute do |text, matches, date|
86
- truncate_time(datetime_delta(date - 1.month, day: 1))
87
- end
88
-
89
- filter /今月|こんげつ/, :absolute do |text, matches, date|
90
- end
91
-
92
- filter /来月|らいげつ/, :absolute do |text, matches, date|
93
- truncate_time(datetime_delta(date + 1.month, day: 1))
94
- end
95
-
96
- filter /再来月|来[々来]月|さらいげつ|らいらいげつ/, :absolute do |text, matches, date|
97
- truncate_time(datetime_delta(date + 2.month, day: 1))
98
- end
99
-
100
- filter /再[々再]来月|ささらいげつ/, :absolute do |text, matches, date|
101
- truncate_time(datetime_delta(date + 3.month, day: 1))
102
- end
103
-
104
- # 日 (絶対)
105
- filter /(\d+)日/, :absolute do |text, matches, date|
106
- truncate_time(datetime_delta(date, day: matches[1]))
107
- end
108
-
109
- filter /一昨[々昨]日|さきおと[とつ]い|いっさくさくじつ/, :absolute do |text, matches, date|
110
- truncate_time(date - 3.day)
111
- end
112
-
113
- filter /一昨日|おと[とつ]い|いっさくじつ/, :absolute do |text, matches, date|
114
- truncate_time(date - 2.day)
115
- end
116
-
117
- filter /昨日|きのう|さくじつ/, :absolute do |text, matches, date|
118
- truncate_time(date - 1.day)
119
- end
120
-
121
- filter /明日|あした|みょうじつ/, :absolute do |text, matches, date|
122
- truncate_time(date + 1.day)
123
- end
124
-
125
- filter /明後日|あさって|みょうごにち/, :absolute do |text, matches, date|
126
- truncate_time(date + 2.day)
127
- end
128
-
129
- filter /明[々明]後日|しあさって|みょうみょうごにち/, :absolute do |text, matches, date|
130
- truncate_time(date + 3.day)
131
- end
132
-
133
- # 月日表現 (絶対)
134
- filter /(?<![\d\/-])(?<!\d)(\d{1,2})#{dd}(\d{1,2})(?!#{dd})/, :absolute do |text, matches, date|
135
- truncate_time(datetime_delta(date, month: matches[1], day: matches[2]))
136
- end
137
-
138
- # 年月日表現 (絶対)
139
- filter /(?<![\d\/-])(\d{1,2}|\d{4})#{dd}(\d{1,2})#{dd}(\d{1,2})(?!#{dd})/, :absolute do |text, matches, date|
140
- year = year_normalize(matches[1].to_i)
141
- truncate_time(datetime_delta(date, year: year, month: matches[2], day: matches[3]))
142
- end
143
-
144
- # 時分表現 (絶対)
145
- filter /(?<![\d:])(\d{1,2})#{td}(\d{2})(?!#{td})/, :absolute do |text, matches, date|
146
- datetime_delta(date, hour: matches[1], minute: matches[2], second: 0)
147
- end
148
-
149
- # 時分秒表現 (絶対)
150
- filter /(?<![\d:])(\d{1,2})#{td}(\d{2})#{td}(\d{2})(?!#{td})/, :absolute do |text, matches, date|
151
- datetime_delta(date, hour: matches[1], minute: matches[2], second: matches[3])
152
- end
153
-
154
- # 時間 (絶対)
155
- filter /正午/, :absolute do |text, matches, date|
156
- datetime_delta(date, hour: 12, minute: 0, second: 0)
157
- end
158
-
159
- filter /(\d+)時(半)?/, :absolute do |text, matches, date|
160
- hour = matches[1]
161
- minute = matches[2] ? 30 : 0
162
- date = datetime_delta(date, hour: hour, minute: minute, second: 0)
163
- date += 12.hour if date.hour <= 12 && text =~ AFTERNOON_PATTERN
164
- date
165
- end
166
-
167
- filter /(\d+)分(半)?/, :absolute do |text, matches, date|
168
- minute = matches[1]
169
- second = matches[2] ? 30 : 0
170
- datetime_delta(date, minute: minute, second: second)
171
- end
172
-
173
- filter /(\d+)秒/, :absolute do |text, matches, date|
174
- datetime_delta(date, second: matches[1])
175
- end
176
-
177
- # 年 (相対)
178
- filter /(\d+)年/, :relative do |text, matches, date|
179
- date + matches[1].to_i.year
180
- end
181
-
182
- # 月 (相対)
183
- filter /(\d+)月/, :relative do |text, matches, date|
184
- date + matches[1].to_i.month
185
- end
186
-
187
- # 日 (相対)
188
- filter /(\d+)日/, :relative do |text, matches, date|
189
- date + matches[1].to_f.day
190
- end
191
-
192
- # 時間 (相対)
193
- filter /(\d+)時間(半)?/, :relative do |text, matches, date|
194
- date + matches[1].to_f.hour + (matches[2] ? 0.5 : 0.0).hour
195
- end
196
-
197
- filter /(\d+)分(半)?/, :relative do |text, matches, date|
198
- date + matches[1].to_f.minute + (matches[2] ? 0.5 : 0.0).minute
199
- end
200
-
201
- filter /(\d+)秒/, :relative do |text, matches, date|
202
- date + matches[1].to_f.second
203
- end
204
-
205
- end
206
-
207
- def self.now
208
- @now ||= DateTime.now
209
- @now.dup
210
- end
211
-
212
- def self.filters
213
- return @filters if @filters
214
- register_filters
215
- @filters
216
- end
217
-
218
- def self.relative?(text)
219
- text =~ RELATIVE_PATTERN
220
- end
3
+ require 'horai/parser'
4
+ require 'horai/parser/ja_jp'
221
5
 
6
+ module Horai
222
7
  def self.parse(text)
223
- normalized = normalize(text)
224
- contexts = (normalized + "$").split(RELATIVE_KEYWORDS_PATTERN)
225
- date = now
226
-
227
- filtered = false
228
-
229
- contexts.each_with_index do |context, index|
230
- if contexts.size >= 2 && index + 1 != contexts.size
231
- mode = :relative
232
- else
233
- mode = :absolute
234
- end
235
-
236
- self.filters.each do |filter|
237
- if (matches = context.match(filter[:pattern])) && filter[mode]
238
- date = filter[mode].call(normalized, matches, date)
239
- filtered = true unless filtered
240
- end
241
- end
242
- end
243
-
244
- @now = nil
245
-
246
- return nil unless filtered
247
- return date
248
- end
249
-
250
- def self.normalize(text)
251
- normalized = text
252
- normalized.tr!(NORMALIZE_FROM, NORMALIZE_TO)
253
- digits = "一二三四五六七八九十百千"
254
- classes = "万億兆"
255
- normalized.gsub!(/[#{digits}][#{digits}#{classes}]*/) do |match|
256
- JaNumber::JaNumberParser::parse(match)
257
- end
258
- return normalized
259
- end
260
-
261
- def self.year_normalize(year)
262
- if year < 100
263
- year_xx = (now.year / 100).to_i
264
- if (year_xx - year).abs < 50
265
- year += year_xx * 100
266
- else
267
- year += (year_xx - 1) * 100
268
- end
269
- end
270
- year
8
+ @@instance ||= Horai::JaJP.new
9
+ @@instance.parse(text)
271
10
  end
272
11
  end
@@ -0,0 +1,102 @@
1
+ # coding: utf-8
2
+
3
+ require 'active_support/time'
4
+ require "ja_number"
5
+
6
+ module Horai
7
+ class Parser
8
+ DATE_DELIMITER = (/[\/-]/)
9
+ TIME_DELIMITER = (/[:]/)
10
+
11
+ AFTERNOON_PATTERN = (/午後|ごご|夜|よる|(?<![a-z])pm(?![a-z])/i)
12
+
13
+ def self.parse(text)
14
+ @@instance ||= self.new
15
+ @@instance.parse(text)
16
+ end
17
+
18
+ def filter(pattern, type = :absolute, &block)
19
+ @filters = [] if @filters.nil?
20
+ @filters << { pattern: pattern, type => block }
21
+ end
22
+
23
+ def truncate_time(date)
24
+ datetime_delta(date, hour: 0, minute: 0, second: 0)
25
+ end
26
+
27
+ def datetime_delta(date, methods = {})
28
+ date = date.dup
29
+ methods.each_pair do |key, value|
30
+ converter = 1.0.respond_to?(key) ? :to_f : :to_i;
31
+ date += value.send(converter).send(key) - date.send(key).send(key)
32
+ end
33
+ date
34
+ end
35
+
36
+ def register_filters
37
+ end
38
+
39
+ def now
40
+ @now ||= DateTime.now
41
+ @now.dup
42
+ end
43
+
44
+ def filters
45
+ return @filters if @filters
46
+ register_filters
47
+ @filters
48
+ end
49
+
50
+ def relative_keyword_patterns
51
+ /after/
52
+ end
53
+
54
+ def relative?(text)
55
+ text =~ relative_keyword_patterns
56
+ end
57
+
58
+ def normalize(text)
59
+ text
60
+ end
61
+
62
+ def parse(text)
63
+ normalized = normalize(text)
64
+ contexts = (normalized + "$").split(relative_keyword_patterns)
65
+ date = now
66
+
67
+ filtered = false
68
+
69
+ contexts.each_with_index do |context, index|
70
+ if contexts.size >= 2 && index + 1 != contexts.size
71
+ mode = :relative
72
+ else
73
+ mode = :absolute
74
+ end
75
+
76
+ filters.each do |filter|
77
+ if (matches = context.match(filter[:pattern])) && filter[mode]
78
+ date = filter[mode].call(normalized, matches, date)
79
+ filtered = true unless filtered
80
+ end
81
+ end
82
+ end
83
+
84
+ @now = nil
85
+
86
+ return nil unless filtered
87
+ return date
88
+ end
89
+
90
+ def year_normalize(year)
91
+ if year < 100
92
+ year_xx = (now.year / 100).to_i
93
+ if (year_xx - year).abs < 50
94
+ year += year_xx * 100
95
+ else
96
+ year += (year_xx - 1) * 100
97
+ end
98
+ end
99
+ year
100
+ end
101
+ end
102
+ end
@@ -0,0 +1,203 @@
1
+ # coding: utf-8
2
+
3
+ require 'horai/parser'
4
+
5
+ module Horai
6
+ class JaJP < Parser
7
+ NORMALIZE_FROM = '0-9a-zA-Z:'
8
+ NORMALIZE_TO = '0-9a-zA-Z:'
9
+
10
+ AFTERNOON_PATTERN = (/午後|ごご|夜|よる|(?<![a-z])pm(?![a-z])/i)
11
+
12
+ def register_filters
13
+ dd = DATE_DELIMITER
14
+ td = TIME_DELIMITER
15
+
16
+ # 年 (絶対)
17
+ filter /(\d+)年/, :absolute do |text, matches, date|
18
+ year = year_normalize(matches[1].to_i)
19
+ truncate_time(datetime_delta(date, year: year, month: 1, day: 1))
20
+ end
21
+
22
+ filter /一昨[々昨]年|さきおととし|いっさくさくねん/, :absolute do |text, matches, date|
23
+ truncate_time(datetime_delta(date - 3.year, month: 1, day: 1))
24
+ end
25
+
26
+ filter /一昨年|おととし|いっさくねん/, :absolute do |text, matches, date|
27
+ truncate_time(datetime_delta(date - 2.year, month: 1, day: 1))
28
+ end
29
+
30
+ filter /去年|昨年|きょねん|さくねん/, :absolute do |text, matches, date|
31
+ truncate_time(datetime_delta(date - 1.year, month: 1, day: 1))
32
+ end
33
+
34
+ filter /今年|本年|ことし|ほんねん/, :absolute do |text, matches, date|
35
+ end
36
+
37
+ filter /来年|明年|らいねん|みょうねん/, :absolute do |text, matches, date|
38
+ truncate_time(datetime_delta(date + 1.year, month: 1, day: 1))
39
+ end
40
+
41
+ filter /再来年|明後年|さらいねん|みょうごねん/, :absolute do |text, matches, date|
42
+ truncate_time(datetime_delta(date + 2.year, month: 1, day: 1))
43
+ end
44
+
45
+ filter /明[々明]後年|みょうみょうごねん/, :absolute do |text, matches, date|
46
+ truncate_time(datetime_delta(date + 3.year, month: 1, day: 1))
47
+ end
48
+
49
+ # 月 (絶対)
50
+ filter /(\d+)月/, :absolute do |text, matches, date|
51
+ truncate_time(datetime_delta(date, month: matches[1].to_i, day: 1))
52
+ end
53
+
54
+ filter /[先前][々先前]{3}月|せんせんせんげつ/, :absolute do |text, matches, date|
55
+ truncate_time(datetime_delta(date - 3.month, day: 1))
56
+ end
57
+
58
+ filter /[先前][々先前]月|せんせんげつ/, :absolute do |text, matches, date|
59
+ truncate_time(datetime_delta(date - 2.month, day: 1))
60
+ end
61
+
62
+ filter /先月|前月|せんげつ/, :absolute do |text, matches, date|
63
+ truncate_time(datetime_delta(date - 1.month, day: 1))
64
+ end
65
+
66
+ filter /今月|こんげつ/, :absolute do |text, matches, date|
67
+ end
68
+
69
+ filter /来月|らいげつ/, :absolute do |text, matches, date|
70
+ truncate_time(datetime_delta(date + 1.month, day: 1))
71
+ end
72
+
73
+ filter /再来月|来[々来]月|さらいげつ|らいらいげつ/, :absolute do |text, matches, date|
74
+ truncate_time(datetime_delta(date + 2.month, day: 1))
75
+ end
76
+
77
+ filter /再[々再]来月|ささらいげつ/, :absolute do |text, matches, date|
78
+ truncate_time(datetime_delta(date + 3.month, day: 1))
79
+ end
80
+
81
+ # 日 (絶対)
82
+ filter /(\d+)日/, :absolute do |text, matches, date|
83
+ truncate_time(datetime_delta(date, day: matches[1]))
84
+ end
85
+
86
+ filter /一昨[々昨]日|さきおと[とつ]い|いっさくさくじつ/, :absolute do |text, matches, date|
87
+ truncate_time(date - 3.day)
88
+ end
89
+
90
+ filter /一昨日|おと[とつ]い|いっさくじつ/, :absolute do |text, matches, date|
91
+ truncate_time(date - 2.day)
92
+ end
93
+
94
+ filter /昨日|きのう|さくじつ/, :absolute do |text, matches, date|
95
+ truncate_time(date - 1.day)
96
+ end
97
+
98
+ filter /明日|あした|みょうじつ/, :absolute do |text, matches, date|
99
+ truncate_time(date + 1.day)
100
+ end
101
+
102
+ filter /明後日|あさって|みょうごにち/, :absolute do |text, matches, date|
103
+ truncate_time(date + 2.day)
104
+ end
105
+
106
+ filter /明[々明]後日|しあさって|みょうみょうごにち/, :absolute do |text, matches, date|
107
+ truncate_time(date + 3.day)
108
+ end
109
+
110
+ # 月日表現 (絶対)
111
+ filter /(?<![\d\/-])(?<!\d)(\d{1,2})#{dd}(\d{1,2})(?!#{dd})/, :absolute do |text, matches, date|
112
+ truncate_time(datetime_delta(date, month: matches[1], day: matches[2]))
113
+ end
114
+
115
+ # 年月日表現 (絶対)
116
+ filter /(?<![\d\/-])(\d{1,2}|\d{4})#{dd}(\d{1,2})#{dd}(\d{1,2})(?!#{dd})/, :absolute do |text, matches, date|
117
+ year = year_normalize(matches[1].to_i)
118
+ truncate_time(datetime_delta(date, year: year, month: matches[2], day: matches[3]))
119
+ end
120
+
121
+ # 時分表現 (絶対)
122
+ filter /(?<![\d:])(\d{1,2})#{td}(\d{2})(?!#{td})/, :absolute do |text, matches, date|
123
+ datetime_delta(date, hour: matches[1], minute: matches[2], second: 0)
124
+ end
125
+
126
+ # 時分秒表現 (絶対)
127
+ filter /(?<![\d:])(\d{1,2})#{td}(\d{2})#{td}(\d{2})(?!#{td})/, :absolute do |text, matches, date|
128
+ datetime_delta(date, hour: matches[1], minute: matches[2], second: matches[3])
129
+ end
130
+
131
+ # 時間 (絶対)
132
+ filter /正午/, :absolute do |text, matches, date|
133
+ datetime_delta(date, hour: 12, minute: 0, second: 0)
134
+ end
135
+
136
+ filter /(\d+)時(半)?/, :absolute do |text, matches, date|
137
+ hour = matches[1]
138
+ minute = matches[2] ? 30 : 0
139
+ date = datetime_delta(date, hour: hour, minute: minute, second: 0)
140
+ date += 12.hour if date.hour <= 12 && text =~ AFTERNOON_PATTERN
141
+ date
142
+ end
143
+
144
+ filter /(\d+)分(半)?/, :absolute do |text, matches, date|
145
+ minute = matches[1]
146
+ second = matches[2] ? 30 : 0
147
+ datetime_delta(date, minute: minute, second: second)
148
+ end
149
+
150
+ filter /(\d+)秒/, :absolute do |text, matches, date|
151
+ datetime_delta(date, second: matches[1])
152
+ end
153
+
154
+ # 年 (相対)
155
+ filter /(\d+)年/, :relative do |text, matches, date|
156
+ date + matches[1].to_i.year
157
+ end
158
+
159
+ # 月 (相対)
160
+ filter /(\d+)月/, :relative do |text, matches, date|
161
+ date + matches[1].to_i.month
162
+ end
163
+
164
+ # 日 (相対)
165
+ filter /(\d+)日/, :relative do |text, matches, date|
166
+ date + matches[1].to_f.day
167
+ end
168
+
169
+ # 時間 (相対)
170
+ filter /(\d+)時間(半)?/, :relative do |text, matches, date|
171
+ date + matches[1].to_f.hour + (matches[2] ? 0.5 : 0.0).hour
172
+ end
173
+
174
+ filter /(\d+)分(半)?/, :relative do |text, matches, date|
175
+ date + matches[1].to_f.minute + (matches[2] ? 0.5 : 0.0).minute
176
+ end
177
+
178
+ filter /(\d+)秒/, :relative do |text, matches, date|
179
+ date + matches[1].to_f.second
180
+ end
181
+ end
182
+
183
+ def relative_keyword_patterns
184
+ (/(?<![明午])後(?![年月日])|(?:[経た]っ|し)たら/)
185
+ end
186
+
187
+ def relative?(text)
188
+ unit = /(?:年|ねん)|(?:月|がつ)|(?:日|にち)|(?:分|ふん|ぷん)|(?:時間?|じ(?:かん)?)|(?:秒|びょう)/
189
+ text =~ (/(\d+)#{unit}#{relative_keyword_patterns}/)
190
+ end
191
+
192
+ def normalize(text)
193
+ normalized = text
194
+ normalized.tr!(NORMALIZE_FROM, NORMALIZE_TO)
195
+ digits = "一二三四五六七八九十百千"
196
+ classes = "万億兆"
197
+ normalized.gsub!(/[#{digits}][#{digits}#{classes}]*/) do |match|
198
+ JaNumber::JaNumberParser::parse(match)
199
+ end
200
+ return normalized
201
+ end
202
+ end
203
+ end
@@ -2,16 +2,10 @@
2
2
 
3
3
  require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
4
4
 
5
- def now (year = nil, month = nil, day = nil, hour = nil, minute = nil, second = nil)
6
- @now ||= Horai::now
5
+ $jajp = Horai::JaJP.new
7
6
 
8
- # puts "{" + [year || @now.year,
9
- # month || @now.month,
10
- # day || @now.day,
11
- # hour || @now.hour,
12
- # minute || @now.minute,
13
- # second || @now.second,
14
- # Rational(9, 24)].join(',') + "}"
7
+ def now (year = nil, month = nil, day = nil, hour = nil, minute = nil, second = nil)
8
+ @now ||= $jajp.now
15
9
 
16
10
  DateTime.new(year || @now.year,
17
11
  month || @now.month,
@@ -25,25 +19,25 @@ end
25
19
  describe Horai do
26
20
  context 'normalize' do
27
21
  it "number" do
28
- Horai.normalize('01234').should === '01234'
22
+ $jajp.normalize('01234').should === '01234'
29
23
  end
30
24
  it "alphabet" do
31
- Horai.normalize('abcde').should === 'abcde'
32
- Horai.normalize('ABCDE').should === 'ABCDE'
25
+ $jajp.normalize('abcde').should === 'abcde'
26
+ $jajp.normalize('ABCDE').should === 'ABCDE'
33
27
  end
34
28
  it "numeric kanji" do
35
- Horai.normalize('十五').should === '15'
36
- Horai.normalize('十四万二千三百四十五').should === '142345'
37
- Horai.normalize('百五十時間後').should === '150時間後'
29
+ $jajp.normalize('十五').should === '15'
30
+ $jajp.normalize('十四万二千三百四十五').should === '142345'
31
+ $jajp.normalize('百五十時間後').should === '150時間後'
38
32
 
39
33
  pending "漢数字パースライブラリがだめ"
40
- Horai.normalize('1万秒').should === '10000秒'
34
+ $jajp.normalize('1万秒').should === '10000秒'
41
35
  end
42
36
  end
43
37
 
44
38
  context 'invalid cases' do
45
39
  it 'not even one filter passed' do
46
- Horai.parse("なにもなし").should be_nil
40
+ $jajp.parse("なにもなし").should be_nil
47
41
  end
48
42
  end
49
43
 
@@ -53,169 +47,169 @@ describe Horai do
53
47
  @sample_text = @sample_date.strftime('%Y年%m月%d日の%H時%M分%S秒')
54
48
  end
55
49
  it "year, month, day, hour, minute, second" do
56
- time = Horai.parse(@sample_text)
50
+ time = $jajp.parse(@sample_text)
57
51
  time.to_s.should === @sample_date.to_s
58
52
  end
59
53
  it "year" do
60
- time = Horai.parse("1999年")
54
+ time = $jajp.parse("1999年")
61
55
  time.to_s.should === now(1999, 1, 1, 0, 0, 0).to_s
62
56
  end
63
57
  it "month" do
64
- time = Horai.parse("1月")
58
+ time = $jajp.parse("1月")
65
59
  time.to_s.should === now(nil, 1, 1, 0, 0, 0).to_s
66
60
  end
67
61
  it "half time" do
68
- time = Horai.parse("1時半")
62
+ time = $jajp.parse("1時半")
69
63
  time.to_s.should === now(nil, nil, nil, 1, 30, 0).to_s
70
64
  end
71
65
  it "half minute" do
72
- time = Horai.parse("1分半後")
66
+ time = $jajp.parse("1分半後")
73
67
  time.to_s.should === (now + 1.5.minute).to_s
74
68
  end
75
69
  it "half hour and minute" do
76
- time = Horai.parse("5時間半と1分半後")
70
+ time = $jajp.parse("5時間半と1分半後")
77
71
  time.to_s.should === (now + 5.5.hour + 1.5.minute).to_s
78
72
  end
79
73
  it "at night" do
80
- time = Horai.parse("夜の8時に")
74
+ time = $jajp.parse("夜の8時に")
81
75
  time.to_s.should === (now(nil, nil, nil, 20, 0, 0)).to_s
82
76
  end
83
77
  it "at afternoon" do
84
- time = Horai.parse("午後一時に")
78
+ time = $jajp.parse("午後一時に")
85
79
  time.to_s.should === (now(nil, nil, nil, 13, 0, 0)).to_s
86
80
  end
87
81
  it "at afternoon" do
88
- time = Horai.parse("PM1時に")
82
+ time = $jajp.parse("PM1時に")
89
83
  time.to_s.should === (now(nil, nil, nil, 13, 0, 0)).to_s
90
84
  end
91
85
  it "at AM and contains *pm*" do
92
- time = Horai.parse("rpm 6時に")
86
+ time = $jajp.parse("rpm 6時に")
93
87
  time.to_s.should === (now(nil, nil, nil, 6, 0, 0)).to_s
94
88
  end
95
89
  it "at noon" do
96
- time = Horai.parse("10日の正午に")
90
+ time = $jajp.parse("10日の正午に")
97
91
  time.to_s.should === (now(nil, nil, 10, 12, 0, 0)).to_s
98
92
  end
99
93
  it "at hh:mm" do
100
- time = Horai.parse("10:20")
94
+ time = $jajp.parse("10:20")
101
95
  time.to_s.should === (now(nil, nil, nil, 10, 20, 0)).to_s
102
96
  end
103
97
  it "at hh:mm:ss" do
104
- time = Horai.parse("10:20:30")
98
+ time = $jajp.parse("10:20:30")
105
99
  time.to_s.should === (now(nil, nil, nil, 10, 20, 30)).to_s
106
100
  end
107
101
  it "at MM/DD" do
108
- time = Horai.parse("10/20")
102
+ time = $jajp.parse("10/20")
109
103
  time.to_s.should === now(nil, 10, 20, 0, 0, 0).to_s
110
104
  end
111
105
  it "at YYYY/MM/DD" do
112
- time = Horai.parse("2000/10/20")
106
+ time = $jajp.parse("2000/10/20")
113
107
  time.to_s.should === now(2000, 10, 20, 0, 0, 0).to_s
114
108
  end
115
109
  it "at YY/MM/DD" do
116
- time = Horai.parse("10/10/20")
110
+ time = $jajp.parse("10/10/20")
117
111
  time.to_s.should === now(2010, 10, 20, 0, 0, 0).to_s
118
112
  end
119
113
  it "at YYYY/MM/DD hh:mm:ss" do
120
- time = Horai.parse("2000/10/20 12:30:40")
114
+ time = $jajp.parse("2000/10/20 12:30:40")
121
115
  time.to_s.should === now(2000, 10, 20, 12, 30, 40).to_s
122
116
  end
123
117
  it "at YY (near current year)" do
124
- time = Horai.parse("10年")
118
+ time = $jajp.parse("10年")
125
119
  time.to_s.should === now(2010, 1, 1, 0, 0, 0).to_s
126
120
  end
127
121
  it "at YY (near feature)" do
128
- time = Horai.parse("30年")
122
+ time = $jajp.parse("30年")
129
123
  time.to_s.should === now(2030, 1, 1, 0, 0, 0).to_s
130
124
  end
131
125
  it "at YY (not near feature)" do
132
- time = Horai.parse("90年")
126
+ time = $jajp.parse("90年")
133
127
  time.to_s.should === now(1990, 1, 1, 0, 0, 0).to_s
134
128
  end
135
129
  end
136
130
 
137
131
  context 'parse relative' do
138
132
  it "check" do
139
- Horai.relative?("10分後").should be_true
140
- Horai.relative?("10分経ったら").should be_true
141
- Horai.relative?("10分したら").should be_true
142
- Horai.relative?("10分").should be_false
143
- Horai.relative?("10時10分").should be_false
133
+ $jajp.relative?("10分後").should be_true
134
+ $jajp.relative?("10分経ったら").should be_true
135
+ $jajp.relative?("10分したら").should be_true
136
+ $jajp.relative?("10分").should be_false
137
+ $jajp.relative?("10時10分").should be_false
144
138
  end
145
139
  it "next year" do
146
- time = Horai.parse("来年")
140
+ time = $jajp.parse("来年")
147
141
  time.to_s.should === (now(nil, 1, 1, 0, 0, 0) + 1.year).to_s
148
142
  end
149
143
  it "next month" do
150
- time = Horai.parse("来月")
144
+ time = $jajp.parse("来月")
151
145
  time.to_s.should === (now(nil, nil, 1, 0, 0, 0) + 1.month).to_s
152
146
  end
153
147
  it "tomorrow" do
154
- time = Horai.parse("明日")
148
+ time = $jajp.parse("明日")
155
149
  time.to_s.should === (now(nil, nil, nil, 0, 0, 0) + 1.day).to_s
156
150
  end
157
151
  it "day after tomorrow" do
158
- time = Horai.parse("明後日")
152
+ time = $jajp.parse("明後日")
159
153
  time.to_s.should === (now(nil, nil, nil, 0, 0, 0) + 2.day).to_s
160
154
  end
161
155
  it "yesterday" do
162
- time = Horai.parse("昨日")
156
+ time = $jajp.parse("昨日")
163
157
  time.to_s.should === (now(nil, nil, nil, 0, 0, 0) - 1.day).to_s
164
158
  end
165
159
  it "numeric year after and absolute month" do
166
- time = Horai.parse("10年後の8月")
160
+ time = $jajp.parse("10年後の8月")
167
161
  time.to_s.should === (now(nil, 8, 1, 0, 0, 0) + 10.year).to_s
168
162
  end
169
163
  it "numeric minute after" do
170
- time = Horai.parse("10分後")
164
+ time = $jajp.parse("10分後")
171
165
  time.to_s.should === (now + 10.minute).to_s
172
166
  end
173
167
  it "numeric day after" do
174
- time = Horai.parse("10日後")
168
+ time = $jajp.parse("10日後")
175
169
  time.to_s.should === (now + 10.day).to_s
176
170
  end
177
171
  it "tomorrow and absolute time" do
178
- time = Horai.parse("明日の10時")
172
+ time = $jajp.parse("明日の10時")
179
173
  time.to_s.should === (now(nil, nil, nil, 10, 0, 0) + 1.day).to_s
180
174
  end
181
175
  it "tomorrow and absolute hh:mm:ss" do
182
- time = Horai.parse("明日の10:20:30")
176
+ time = $jajp.parse("明日の10:20:30")
183
177
  time.to_s.should === (now(nil, nil, nil, 10, 20, 30) + 1.day).to_s
184
178
  end
185
179
  it "tomorrow and afternoon" do
186
- time = Horai.parse("明日の午後5時")
180
+ time = $jajp.parse("明日の午後5時")
187
181
  time.to_s.should === (now(nil, nil, nil, 17, 0, 0) + 1.day).to_s
188
182
  end
189
183
  it "tomorrow and noon" do
190
- time = Horai.parse("明日の正午")
184
+ time = $jajp.parse("明日の正午")
191
185
  time.to_s.should === (now(nil, nil, nil, 12, 0, 0) + 1.day).to_s
192
186
  end
193
187
  it "numeric day after and absolute time" do
194
- time = Horai.parse("3日後の12時")
188
+ time = $jajp.parse("3日後の12時")
195
189
  time.to_s.should === (now(nil, nil, nil, 12, 0, 0) + 3.day).to_s
196
190
  end
197
191
  it "numeric day after and absolute time" do
198
- time = Horai.parse("3日後の12時45分")
192
+ time = $jajp.parse("3日後の12時45分")
199
193
  time.to_s.should === (now(nil, nil, nil, 12, 45, 0) + 3.day).to_s
200
194
  end
201
195
  it "numeric day after and absolute hh:mm:ss" do
202
- time = Horai.parse("3日後の12:45:55")
196
+ time = $jajp.parse("3日後の12:45:55")
203
197
  time.to_s.should === (now(nil, nil, nil, 12, 45, 55) + 3.day).to_s
204
198
  end
205
199
  it "numeric day after and relative time" do
206
- time = Horai.parse("3日12時間45分後")
200
+ time = $jajp.parse("3日12時間45分後")
207
201
  time.to_s.should === (now + 3.day + 12.hour + 45.minute).to_s
208
202
  end
209
203
  it "half time after" do
210
- time = Horai.parse("1時間半後")
204
+ time = $jajp.parse("1時間半後")
211
205
  time.to_s.should === (now + 1.5.hour).to_s
212
206
  end
213
207
  it "half minute after" do
214
- time = Horai.parse("1分半後")
208
+ time = $jajp.parse("1分半後")
215
209
  time.to_s.should === (now + 1.5.minute).to_s
216
210
  end
217
211
  it "half hour and half minute after" do
218
- time = Horai.parse("5時間半と1分半後")
212
+ time = $jajp.parse("5時間半と1分半後")
219
213
  time.to_s.should === (now + 5.5.hour + 1.5.minute).to_s
220
214
  end
221
215
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: horai
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.7.0
4
+ version: 0.7.1
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: 2012-04-25 00:00:00.000000000 Z
12
+ date: 2012-04-26 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: i18n
16
- requirement: &2157979040 !ruby/object:Gem::Requirement
16
+ requirement: &2171462920 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: 0.6.0
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *2157979040
24
+ version_requirements: *2171462920
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: activesupport
27
- requirement: &2157978480 !ruby/object:Gem::Requirement
27
+ requirement: &2171462420 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ! '>='
@@ -32,10 +32,10 @@ dependencies:
32
32
  version: 3.0.0
33
33
  type: :runtime
34
34
  prerelease: false
35
- version_requirements: *2157978480
35
+ version_requirements: *2171462420
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: rparsec-ruby19
38
- requirement: &2157977980 !ruby/object:Gem::Requirement
38
+ requirement: &2171461920 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ! '>='
@@ -43,10 +43,10 @@ dependencies:
43
43
  version: '1.0'
44
44
  type: :runtime
45
45
  prerelease: false
46
- version_requirements: *2157977980
46
+ version_requirements: *2171461920
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: rspec
49
- requirement: &2157977440 !ruby/object:Gem::Requirement
49
+ requirement: &2171461380 !ruby/object:Gem::Requirement
50
50
  none: false
51
51
  requirements:
52
52
  - - ~>
@@ -54,10 +54,10 @@ dependencies:
54
54
  version: 2.8.0
55
55
  type: :development
56
56
  prerelease: false
57
- version_requirements: *2157977440
57
+ version_requirements: *2171461380
58
58
  - !ruby/object:Gem::Dependency
59
59
  name: rdoc
60
- requirement: &2157976920 !ruby/object:Gem::Requirement
60
+ requirement: &2171460260 !ruby/object:Gem::Requirement
61
61
  none: false
62
62
  requirements:
63
63
  - - ~>
@@ -65,10 +65,10 @@ dependencies:
65
65
  version: '3.12'
66
66
  type: :development
67
67
  prerelease: false
68
- version_requirements: *2157976920
68
+ version_requirements: *2171460260
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: jeweler
71
- requirement: &2157976440 !ruby/object:Gem::Requirement
71
+ requirement: &2171459280 !ruby/object:Gem::Requirement
72
72
  none: false
73
73
  requirements:
74
74
  - - ~>
@@ -76,10 +76,10 @@ dependencies:
76
76
  version: 1.8.3
77
77
  type: :development
78
78
  prerelease: false
79
- version_requirements: *2157976440
79
+ version_requirements: *2171459280
80
80
  - !ruby/object:Gem::Dependency
81
81
  name: guard-shell
82
- requirement: &2157975860 !ruby/object:Gem::Requirement
82
+ requirement: &2171458480 !ruby/object:Gem::Requirement
83
83
  none: false
84
84
  requirements:
85
85
  - - ! '>='
@@ -87,10 +87,10 @@ dependencies:
87
87
  version: '0'
88
88
  type: :development
89
89
  prerelease: false
90
- version_requirements: *2157975860
90
+ version_requirements: *2171458480
91
91
  - !ruby/object:Gem::Dependency
92
92
  name: guard-rspec
93
- requirement: &2157975360 !ruby/object:Gem::Requirement
93
+ requirement: &2171281160 !ruby/object:Gem::Requirement
94
94
  none: false
95
95
  requirements:
96
96
  - - ! '>='
@@ -98,10 +98,10 @@ dependencies:
98
98
  version: '0'
99
99
  type: :development
100
100
  prerelease: false
101
- version_requirements: *2157975360
101
+ version_requirements: *2171281160
102
102
  - !ruby/object:Gem::Dependency
103
103
  name: pry
104
- requirement: &2157974880 !ruby/object:Gem::Requirement
104
+ requirement: &2171280460 !ruby/object:Gem::Requirement
105
105
  none: false
106
106
  requirements:
107
107
  - - ! '>='
@@ -109,8 +109,9 @@ dependencies:
109
109
  version: '0'
110
110
  type: :development
111
111
  prerelease: false
112
- version_requirements: *2157974880
113
- description: Horai は日本語の時刻表現をパースし、DateTime型に変換することを目標としている Gem です。
112
+ version_requirements: *2171280460
113
+ description: Derive DateTime from Time expression with Natural language (STILL ONLY
114
+ IN JAPANESE)
114
115
  email: aoki@u-ne.co
115
116
  executables: []
116
117
  extensions: []
@@ -128,6 +129,8 @@ files:
128
129
  - VERSION
129
130
  - horai.gemspec
130
131
  - lib/horai.rb
132
+ - lib/horai/parser.rb
133
+ - lib/horai/parser/ja_jp.rb
131
134
  - lib/ja_number.rb
132
135
  - spec/horai_spec.rb
133
136
  - spec/spec_helper.rb
@@ -146,7 +149,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
146
149
  version: '0'
147
150
  segments:
148
151
  - 0
149
- hash: -3122584729073349609
152
+ hash: 60693043854403678
150
153
  required_rubygems_version: !ruby/object:Gem::Requirement
151
154
  none: false
152
155
  requirements:
@@ -158,5 +161,5 @@ rubyforge_project:
158
161
  rubygems_version: 1.8.11
159
162
  signing_key:
160
163
  specification_version: 3
161
- summary: 日本語の時刻表現をパースし、DateTime型に変換する Gem
164
+ summary: Derive DateTime from Time expression with Natural language
162
165
  test_files: []