pick_ja_date 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 813d4f19172202cf554e58d0be41050dfecd293d
4
+ data.tar.gz: 04658bf1797a781376f8db976b88512e867a954e
5
+ SHA512:
6
+ metadata.gz: b8515a5350934c66ebebdbdcfcf43b5ab9e2f72e5bd9b5908bc82a6cb7e92accaddb07c384be31e3b1837c5ecbe7a5558378dc792caf337d79d2319e62848b0e
7
+ data.tar.gz: 5be65134be159031a3bcbb974d82bab644310c7085a9427d1eb52145f48ef08a73a4f633191289018d33fda9b970688beaa1a7b1ec8efa320f41b0b960e94574
@@ -0,0 +1,17 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
data/.rspec ADDED
@@ -0,0 +1 @@
1
+ --color
@@ -0,0 +1 @@
1
+ 2.0.0-p247
data/Gemfile ADDED
@@ -0,0 +1,10 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in pick_ja_date.gemspec
4
+ gemspec
5
+
6
+ gem 'active_support'
7
+ gem 'pry'
8
+ gem 'i18n'
9
+ gem 'rspec'
10
+ gem 'guard-rspec', require: false
@@ -0,0 +1,8 @@
1
+ # A sample Guardfile
2
+ # More info at https://github.com/guard/guard#readme
3
+
4
+ guard :rspec do
5
+ watch(%r{^spec/.+_spec\.rb$})
6
+ watch('lib/pick_ja_date.rb') { 'spec/pick_ja_date_spec.rb' }
7
+ end
8
+
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2013 hiroshi kobayashi
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,35 @@
1
+ # PickJaDate
2
+
3
+ 日本語の文字列から日付を取得する
4
+
5
+ ## Installation
6
+
7
+ Add this line to your application's Gemfile:
8
+
9
+ gem 'pick_ja_date'
10
+
11
+ And then execute:
12
+
13
+ $ bundle
14
+
15
+ Or install it yourself as:
16
+
17
+ $ gem install pick_ja_date
18
+
19
+ ## Usage
20
+
21
+ 現在時刻が '2011/10/10 10:10:00' の時に
22
+
23
+ ```
24
+ time,text = PickJaDate.extract('三ヶ月後の3日の13:00に地下鉄にのる')
25
+ p time # 2011-11-03 13:00:00 +0900
26
+ p text # 地下鉄にのる
27
+ ```
28
+
29
+ ## Contributing
30
+
31
+ 1. Fork it
32
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
33
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
34
+ 4. Push to the branch (`git push origin my-new-feature`)
35
+ 5. Create new Pull Request
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
@@ -0,0 +1,174 @@
1
+ #encoding=utf-8
2
+ require "pick_ja_date/version"
3
+
4
+ require 'rubygems'
5
+ require 'bundler'
6
+ Bundler.setup
7
+ require 'active_support/time'
8
+
9
+ class PickJaDate
10
+ attr_accessor :input, :str, :time
11
+
12
+ KANJI_NUMBER = '一二三四五六七八九十'
13
+ DAYS_OF_WEEK = %w{日 月 火 水 木 金 土}
14
+ TODAY = ['今日']
15
+ TOMORROW = ['明日', 'あした']
16
+ DAT = ['明後日', 'あさって'] # day after tomorrow
17
+
18
+ def self.extract(str)
19
+ p = self.new(str)
20
+ p.parse
21
+ [p.time, p.str]
22
+ end
23
+
24
+ def self.date(str)
25
+ p = self.new(str)
26
+ p.parse
27
+ p.time
28
+ end
29
+
30
+ def initialize(input)
31
+ @input = input
32
+ @now = Time.now
33
+ @time = Time.now
34
+ @str = input
35
+ end
36
+
37
+ def parse
38
+ set_day
39
+ set_time
40
+ end
41
+
42
+ def set_day
43
+ num2 = '([0-9]{1,2})'
44
+
45
+ match?(/再来月/){|x|
46
+ remove_time_word x[0]
47
+ @time = (@time + 2.month)
48
+ }
49
+
50
+ match?(/来月/){|x|
51
+ remove_time_word x[0]
52
+ @time = (@time + 1.month)
53
+ }
54
+
55
+ match?(%r{(([0-9]{2,4})[年/-])?#{num2}[月/-]#{num2}日?})do |x|
56
+ all, y_with_suffix, y, m, d = x
57
+ remove_time_word all
58
+ y = @now.year unless y
59
+ @time = @time.change(year: y.to_i, month: m.to_i, day: d.to_i)
60
+ @time += 1.year if @time < @now
61
+ return
62
+ end
63
+
64
+ match?(/月末/){|x|
65
+ remove_time_word x[0]
66
+ @time = @time.change(day: @now.end_of_month.day)
67
+ return
68
+ }
69
+
70
+ match?(/月初|[1一]日/){|x|
71
+ remove_time_word x[0]
72
+ @time = (@time + 1.month).change(day: 1)
73
+ return
74
+ }
75
+
76
+ match?(%r{(次の)?(#{DAYS_OF_WEEK.join("|")})曜}) do |x|
77
+ remove, dummy, dow_str = x
78
+ remove_time_word remove
79
+ @time += next_dow_days(dow_str).day
80
+ return
81
+ end
82
+
83
+ match?(/#{(TODAY + TOMORROW + DAT).join('|')}/) do |x|
84
+ case x.first
85
+ when *TODAY; add = 0
86
+ when *TOMORROW; add = 1
87
+ when *DAT; add = 2
88
+ end
89
+ remove_time_word x.first
90
+ @time += add.day
91
+ return
92
+ end
93
+
94
+ # N 日後
95
+ units = '(分|時間|日|週間?|ヶ?月)'
96
+ [
97
+ /([0-9#{KANJI_NUMBER}]{1,2})#{units}後/,
98
+ /あと([0-9]{1,2})#{units}/,
99
+ ].each do |regex|
100
+ match?(regex)do |x|
101
+ str, num, unit = x
102
+ add_unit_time kanji_to_number(num), unit
103
+ remove_time_word str
104
+ end
105
+ end
106
+
107
+ match?(%r{#{num2}日}){|x|
108
+ remove_time_word x.first
109
+ @time = @time.change(day: x[1])
110
+ }
111
+ end
112
+
113
+ def set_time
114
+ num = '([0-9]{1,2})'
115
+ space = '[  ]?'
116
+ match?(/#{num}([::])#{num}/){|x| set_time_result x[0], x[1], x[2]; return}
117
+ match?(/#{num+space}時半/){|x| set_time_result x[0], x[1], 30; return}
118
+ match?(/#{num+space}時/){|x| set_time_result x[0], x[1], 0}
119
+ match?(/#{num+space}分/){|x| set_time_result x[0], @time.hour, x[1]}
120
+ end
121
+
122
+ def match?(regex)
123
+ if @str =~ regex
124
+ yield $~.to_a
125
+ else
126
+ nil
127
+ end
128
+ end
129
+
130
+ def format(time)
131
+ time.strftime '%Y/%m/%d %H:%M'
132
+ end
133
+
134
+ def set_time_result(remove, hour, min)
135
+ remove_time_word remove
136
+ hour = hour.to_i
137
+ if hour > 24
138
+ @time += (hour.div(24)).day
139
+ hour = hour % 24
140
+ end
141
+ @time = @time.change(hour: hour, min: min)
142
+ end
143
+
144
+ def remove_time_word(key)
145
+ @str.sub!(%r{#{key}[のにで]?}, '')
146
+ @str.sub!(%r{^[  ]|[  ]$}, '')
147
+ end
148
+
149
+ def next_dow_days(str)
150
+ now = @now.wday
151
+ target = DAYS_OF_WEEK.index(str).to_i
152
+ target += 7 if target <= now
153
+ (target - now)
154
+ end
155
+
156
+ def add_unit_time(num, unit)
157
+ num = num.to_i
158
+ case unit
159
+ when '分'; @time += num.minute
160
+ when '時間'; @time += num.hour
161
+ when '日'; @time += num.day
162
+ when '週間', '週'; @time += num.week
163
+ when 'ヶ月', '月'; @time += num.month
164
+ end
165
+ end
166
+
167
+ def kanji_to_number(kanji)
168
+ if i = KANJI_NUMBER.chars.index(kanji)
169
+ i + 1
170
+ else
171
+ kanji
172
+ end
173
+ end
174
+ end
@@ -0,0 +1,3 @@
1
+ class PickJaDate
2
+ VERSION = "0.0.1"
3
+ end
@@ -0,0 +1,25 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'pick_ja_date/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "pick_ja_date"
8
+ spec.version = PickJaDate::VERSION
9
+ spec.authors = ["hiroshi kobayashi"]
10
+ spec.email = ["koba.shipbuilding@gmail.com"]
11
+ spec.description = %q{日本語のテキストから日付を取得する}
12
+ spec.summary = %q{日本語のテキストから日付を取得する}
13
+ spec.homepage = ""
14
+ spec.license = "MIT"
15
+
16
+ spec.files = `git ls-files`.split($/)
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ["lib"]
20
+
21
+ spec.add_development_dependency "bundler", "~> 1.3"
22
+ spec.add_development_dependency "rake"
23
+ spec.add_development_dependency "active_support"
24
+ spec.add_development_dependency "i18n"
25
+ end
@@ -0,0 +1,58 @@
1
+ #encoding=utf-8
2
+ require './lib/pick_ja_date.rb'
3
+ require 'yaml'
4
+
5
+ describe PickJaDate do
6
+ def format_time(time)
7
+ time.strftime '%Y/%m/%d %H:%M'
8
+ end
9
+
10
+ before do
11
+ Time.stub(:now).and_return(Time.parse('2011/10/10 10:10:00')) # monday
12
+ @now = Time.now
13
+ end
14
+
15
+ yml = YAML.load <<-YML
16
+ 土曜の15 時半に地下鉄にのる: 2011/10/15 15:30
17
+ 土曜 15時半 地下鉄にのる: 2011/10/15 15:30
18
+ 地下鉄にのる土曜の15時半に: 2011/10/15 15:30
19
+ 次の土曜の15時半に地下鉄にのる: 2011/10/15 15:30
20
+
21
+ 明日地下鉄にのる: 2011/10/11 10:10
22
+ あしたの15:00に地下鉄にのる: 2011/10/11 15:00
23
+ 明後日の15:00に地下鉄にのる: 2011/10/12 15:00
24
+
25
+ 3時間後に地下鉄にのる: 2011/10/10 13:10
26
+ 3日後に地下鉄にのる: 2011/10/13 10:10
27
+ 3週間後に地下鉄にのる: 2011/10/31 10:10
28
+ 1月後に地下鉄にのる: 2011/11/10 10:10
29
+ 1ヶ月後に地下鉄にのる: 2011/11/10 10:10
30
+
31
+ 12/10 10:00に地下鉄にのる: 2011/12/10 10:00
32
+ 2011/12/10 10:00に地下鉄にのる: 2011/12/10 10:00
33
+ 2012/12/10 10:00に地下鉄にのる: 2012/12/10 10:00
34
+ 9/10 18:00に地下鉄にのる: 2012/09/10 18:00
35
+
36
+ 3日後の1時に地下鉄にのる: 2011/10/13 01:00
37
+ 3日後の25時に地下鉄にのる: 2011/10/14 01:00
38
+ あと30分で地下鉄にのる: 2011/10/10 10:40
39
+
40
+ 月末の13:00に地下鉄にのる: 2011/10/31 13:00
41
+ 1日の13:00に地下鉄にのる: 2011/11/01 13:00
42
+ 月初の13:00に地下鉄にのる: 2011/11/01 13:00
43
+ 来月の3日の13:00に地下鉄にのる: 2011/11/03 13:00
44
+ 再来月の3日の13:00に地下鉄にのる: 2011/12/03 13:00
45
+ 三ヶ月後の3日の13:00に地下鉄にのる: 2012/01/03 13:00
46
+ YML
47
+
48
+ describe "日付を解析できる" do
49
+ yml.each do|text,time|
50
+ it "#{text}" do
51
+ r_time,r_text = PickJaDate.extract(text.dup)
52
+ expect(format_time(r_time)).to eq(time)
53
+ expect(r_text).to eq('地下鉄にのる')
54
+ expect(format_time(PickJaDate.date(text.dup))).to eq(time)
55
+ end
56
+ end
57
+ end
58
+ end
metadata ADDED
@@ -0,0 +1,113 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: pick_ja_date
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - hiroshi kobayashi
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2013-11-09 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ~>
18
+ - !ruby/object:Gem::Version
19
+ version: '1.3'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ~>
25
+ - !ruby/object:Gem::Version
26
+ version: '1.3'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - '>='
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - '>='
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: active_support
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - '>='
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: i18n
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - '>='
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ description: 日本語のテキストから日付を取得する
70
+ email:
71
+ - koba.shipbuilding@gmail.com
72
+ executables: []
73
+ extensions: []
74
+ extra_rdoc_files: []
75
+ files:
76
+ - .gitignore
77
+ - .rspec
78
+ - .ruby-version
79
+ - Gemfile
80
+ - Guardfile
81
+ - LICENSE.txt
82
+ - README.md
83
+ - Rakefile
84
+ - lib/pick_ja_date.rb
85
+ - lib/pick_ja_date/version.rb
86
+ - pick_ja_date.gemspec
87
+ - spec/pick_ja_date_spec.rb
88
+ homepage: ''
89
+ licenses:
90
+ - MIT
91
+ metadata: {}
92
+ post_install_message:
93
+ rdoc_options: []
94
+ require_paths:
95
+ - lib
96
+ required_ruby_version: !ruby/object:Gem::Requirement
97
+ requirements:
98
+ - - '>='
99
+ - !ruby/object:Gem::Version
100
+ version: '0'
101
+ required_rubygems_version: !ruby/object:Gem::Requirement
102
+ requirements:
103
+ - - '>='
104
+ - !ruby/object:Gem::Version
105
+ version: '0'
106
+ requirements: []
107
+ rubyforge_project:
108
+ rubygems_version: 2.0.3
109
+ signing_key:
110
+ specification_version: 4
111
+ summary: 日本語のテキストから日付を取得する
112
+ test_files:
113
+ - spec/pick_ja_date_spec.rb