gitlab-chronic 0.10.4 → 0.10.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.
Files changed (54) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +0 -1
  3. data/.travis.yml +4 -6
  4. data/HISTORY.md +4 -0
  5. data/README.md +7 -10
  6. data/chronic.gemspec +1 -1
  7. data/lib/chronic/date.rb +7 -6
  8. data/lib/chronic/{tags/grabber.rb → grabber.rb} +10 -6
  9. data/lib/chronic/handlers.rb +2 -27
  10. data/lib/chronic/mini_date.rb +2 -2
  11. data/lib/chronic/numerizer.rb +130 -0
  12. data/lib/chronic/{tags/ordinal.rb → ordinal.rb} +8 -11
  13. data/lib/chronic/parser.rb +80 -34
  14. data/lib/chronic/{tags/pointer.rb → pointer.rb} +9 -5
  15. data/lib/chronic/{tags/repeater.rb → repeater.rb} +11 -26
  16. data/lib/chronic/repeaters/repeater_day.rb +1 -1
  17. data/lib/chronic/repeaters/repeater_day_name.rb +2 -2
  18. data/lib/chronic/repeaters/repeater_day_portion.rb +3 -3
  19. data/lib/chronic/repeaters/repeater_fortnight.rb +1 -1
  20. data/lib/chronic/repeaters/repeater_hour.rb +1 -1
  21. data/lib/chronic/repeaters/repeater_minute.rb +1 -1
  22. data/lib/chronic/repeaters/repeater_month.rb +1 -1
  23. data/lib/chronic/repeaters/repeater_month_name.rb +2 -2
  24. data/lib/chronic/repeaters/repeater_season.rb +1 -1
  25. data/lib/chronic/repeaters/repeater_second.rb +1 -1
  26. data/lib/chronic/repeaters/repeater_time.rb +2 -2
  27. data/lib/chronic/repeaters/repeater_week.rb +22 -23
  28. data/lib/chronic/repeaters/repeater_weekday.rb +2 -2
  29. data/lib/chronic/repeaters/repeater_weekend.rb +1 -1
  30. data/lib/chronic/repeaters/repeater_year.rb +1 -1
  31. data/lib/chronic/{tags/scalar.rb → scalar.rb} +10 -18
  32. data/lib/chronic/separator.rb +207 -0
  33. data/lib/chronic/{tags/sign.rb → sign.rb} +16 -2
  34. data/lib/chronic/tag.rb +7 -59
  35. data/lib/chronic/time.rb +8 -8
  36. data/lib/chronic/{tags/time_zone.rb → time_zone.rb} +1 -1
  37. data/lib/chronic/token.rb +3 -13
  38. data/lib/chronic/version.rb +1 -1
  39. data/lib/gitlab-chronic.rb +14 -18
  40. data/test/test_chronic.rb +6 -26
  41. data/test/test_handler.rb +1 -1
  42. data/test/test_numerizer.rb +86 -0
  43. data/test/test_parsing.rb +8 -306
  44. data/test/test_repeater_week.rb +0 -53
  45. data/test/test_token.rb +0 -6
  46. metadata +13 -19
  47. data/lib/chronic/definition.rb +0 -128
  48. data/lib/chronic/dictionary.rb +0 -36
  49. data/lib/chronic/repeaters/repeater_quarter.rb +0 -59
  50. data/lib/chronic/repeaters/repeater_quarter_name.rb +0 -40
  51. data/lib/chronic/tags/separator.rb +0 -123
  52. data/lib/chronic/tokenizer.rb +0 -38
  53. data/test/test_repeater_quarter.rb +0 -70
  54. data/test/test_repeater_quarter_name.rb +0 -198
@@ -59,57 +59,4 @@ class TestRepeaterWeek < TestCase
59
59
  assert_equal Time.local(2006, 9, 6, 14, 0, 1), offset_span.end
60
60
  end
61
61
 
62
- def test_next_future_starting_on_monday
63
- weeks = Chronic::RepeaterWeek.new(:week, nil, :week_start => :monday)
64
- weeks.start = @now
65
-
66
- next_week = weeks.next(:future)
67
- assert_equal Time.local(2006, 8, 21), next_week.begin
68
- assert_equal Time.local(2006, 8, 28), next_week.end
69
-
70
- next_next_week = weeks.next(:future)
71
- assert_equal Time.local(2006, 8, 28), next_next_week.begin
72
- assert_equal Time.local(2006, 9, 4), next_next_week.end
73
- end
74
-
75
- def test_next_past_starting_on_monday
76
- weeks = Chronic::RepeaterWeek.new(:week, nil, :week_start => :monday)
77
- weeks.start = @now
78
-
79
- last_week = weeks.next(:past)
80
- assert_equal Time.local(2006, 8, 7), last_week.begin
81
- assert_equal Time.local(2006, 8, 14), last_week.end
82
-
83
- last_last_week = weeks.next(:past)
84
- assert_equal Time.local(2006, 7, 31), last_last_week.begin
85
- assert_equal Time.local(2006, 8, 7), last_last_week.end
86
- end
87
-
88
- def test_this_future_starting_on_monday
89
- weeks = Chronic::RepeaterWeek.new(:week, nil, :week_start => :monday)
90
- weeks.start = @now
91
-
92
- this_week = weeks.this(:future)
93
- assert_equal Time.local(2006, 8, 16, 15), this_week.begin
94
- assert_equal Time.local(2006, 8, 21), this_week.end
95
- end
96
-
97
- def test_this_past_starting_on_monday
98
- weeks = Chronic::RepeaterWeek.new(:week, nil, :week_start => :monday)
99
- weeks.start = @now
100
-
101
- this_week = weeks.this(:past)
102
- assert_equal Time.local(2006, 8, 14, 0), this_week.begin
103
- assert_equal Time.local(2006, 8, 16, 14), this_week.end
104
- end
105
-
106
- def test_offset_starting_on_monday
107
- weeks = Chronic::RepeaterWeek.new(:week, nil, :week_start => :monday)
108
-
109
- span = Chronic::Span.new(@now, @now + 1)
110
- offset_span = weeks.offset(span, 3, :future)
111
-
112
- assert_equal Time.local(2006, 9, 6, 14), offset_span.begin
113
- assert_equal Time.local(2006, 9, 6, 14, 0, 1), offset_span.end
114
- end
115
62
  end
data/test/test_token.rb CHANGED
@@ -22,10 +22,4 @@ class TestToken < TestCase
22
22
  assert_equal 'foo', token.word
23
23
  end
24
24
 
25
- def test_token_inspect_doesnt_mutate_the_word
26
- token = Chronic::Token.new('foo')
27
- token.inspect
28
- assert_equal 'foo', token.word
29
- end
30
-
31
25
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: gitlab-chronic
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.10.4
4
+ version: 0.10.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tom Preston-Werner
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2019-11-24 00:00:00.000000000 Z
12
+ date: 2019-11-25 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: numerizer
@@ -102,12 +102,15 @@ files:
102
102
  - Rakefile
103
103
  - chronic.gemspec
104
104
  - lib/chronic/date.rb
105
- - lib/chronic/definition.rb
106
- - lib/chronic/dictionary.rb
105
+ - lib/chronic/grabber.rb
107
106
  - lib/chronic/handler.rb
108
107
  - lib/chronic/handlers.rb
109
108
  - lib/chronic/mini_date.rb
109
+ - lib/chronic/numerizer.rb
110
+ - lib/chronic/ordinal.rb
110
111
  - lib/chronic/parser.rb
112
+ - lib/chronic/pointer.rb
113
+ - lib/chronic/repeater.rb
111
114
  - lib/chronic/repeaters/repeater_day.rb
112
115
  - lib/chronic/repeaters/repeater_day_name.rb
113
116
  - lib/chronic/repeaters/repeater_day_portion.rb
@@ -116,8 +119,6 @@ files:
116
119
  - lib/chronic/repeaters/repeater_minute.rb
117
120
  - lib/chronic/repeaters/repeater_month.rb
118
121
  - lib/chronic/repeaters/repeater_month_name.rb
119
- - lib/chronic/repeaters/repeater_quarter.rb
120
- - lib/chronic/repeaters/repeater_quarter_name.rb
121
122
  - lib/chronic/repeaters/repeater_season.rb
122
123
  - lib/chronic/repeaters/repeater_season_name.rb
123
124
  - lib/chronic/repeaters/repeater_second.rb
@@ -126,20 +127,15 @@ files:
126
127
  - lib/chronic/repeaters/repeater_weekday.rb
127
128
  - lib/chronic/repeaters/repeater_weekend.rb
128
129
  - lib/chronic/repeaters/repeater_year.rb
130
+ - lib/chronic/scalar.rb
129
131
  - lib/chronic/season.rb
132
+ - lib/chronic/separator.rb
133
+ - lib/chronic/sign.rb
130
134
  - lib/chronic/span.rb
131
135
  - lib/chronic/tag.rb
132
- - lib/chronic/tags/grabber.rb
133
- - lib/chronic/tags/ordinal.rb
134
- - lib/chronic/tags/pointer.rb
135
- - lib/chronic/tags/repeater.rb
136
- - lib/chronic/tags/scalar.rb
137
- - lib/chronic/tags/separator.rb
138
- - lib/chronic/tags/sign.rb
139
- - lib/chronic/tags/time_zone.rb
140
136
  - lib/chronic/time.rb
137
+ - lib/chronic/time_zone.rb
141
138
  - lib/chronic/token.rb
142
- - lib/chronic/tokenizer.rb
143
139
  - lib/chronic/version.rb
144
140
  - lib/gitlab-chronic.rb
145
141
  - test/helper.rb
@@ -147,6 +143,7 @@ files:
147
143
  - test/test_daylight_savings.rb
148
144
  - test/test_handler.rb
149
145
  - test/test_mini_date.rb
146
+ - test/test_numerizer.rb
150
147
  - test/test_parsing.rb
151
148
  - test/test_repeater_day_name.rb
152
149
  - test/test_repeater_day_portion.rb
@@ -155,8 +152,6 @@ files:
155
152
  - test/test_repeater_minute.rb
156
153
  - test/test_repeater_month.rb
157
154
  - test/test_repeater_month_name.rb
158
- - test/test_repeater_quarter.rb
159
- - test/test_repeater_quarter_name.rb
160
155
  - test/test_repeater_season.rb
161
156
  - test/test_repeater_time.rb
162
157
  - test/test_repeater_week.rb
@@ -195,6 +190,7 @@ test_files:
195
190
  - test/test_daylight_savings.rb
196
191
  - test/test_handler.rb
197
192
  - test/test_mini_date.rb
193
+ - test/test_numerizer.rb
198
194
  - test/test_parsing.rb
199
195
  - test/test_repeater_day_name.rb
200
196
  - test/test_repeater_day_portion.rb
@@ -203,8 +199,6 @@ test_files:
203
199
  - test/test_repeater_minute.rb
204
200
  - test/test_repeater_month.rb
205
201
  - test/test_repeater_month_name.rb
206
- - test/test_repeater_quarter.rb
207
- - test/test_repeater_quarter_name.rb
208
202
  - test/test_repeater_season.rb
209
203
  - test/test_repeater_time.rb
210
204
  - test/test_repeater_week.rb
@@ -1,128 +0,0 @@
1
- require 'chronic/handlers'
2
-
3
- module Chronic
4
- # SpanDefinitions subclasses return definitions constructed by Handler instances (see handler.rb)
5
- # SpanDefinitions subclasses follow a <Type> + Definitions naming pattern
6
- # Types of Definitions are collected in Dictionaries (see dictionary.rb)
7
- class Definitions
8
- attr_reader :options
9
-
10
- def initialize(options = {})
11
- @options = options
12
- end
13
-
14
- def definitions
15
- raise "definitions are set in subclasses of #{self.class}"
16
- end
17
- end
18
-
19
- class SpanDefinitions < Definitions
20
- include Handlers
21
- end
22
-
23
- class TimeDefinitions < SpanDefinitions
24
- def definitions
25
- [
26
- Handler.new([:repeater_time, :repeater_day_portion?], nil)
27
- ]
28
- end
29
- end
30
-
31
- class DateDefinitions < SpanDefinitions
32
- def definitions
33
- [
34
- Handler.new([:repeater_day_name, :repeater_month_name, :scalar_day, :repeater_time, [:separator_slash?, :separator_dash?], :time_zone, :scalar_year], :handle_generic),
35
- Handler.new([:repeater_day_name, :repeater_month_name, :scalar_day], :handle_rdn_rmn_sd),
36
- Handler.new([:repeater_day_name, :repeater_month_name, :scalar_day, :scalar_year], :handle_rdn_rmn_sd_sy),
37
- Handler.new([:repeater_day_name, :repeater_month_name, :ordinal_day], :handle_rdn_rmn_od),
38
- Handler.new([:repeater_day_name, :repeater_month_name, :ordinal_day, :scalar_year], :handle_rdn_rmn_od_sy),
39
- Handler.new([:repeater_day_name, :repeater_month_name, :scalar_day, :separator_at?, 'time?'], :handle_rdn_rmn_sd),
40
- Handler.new([:repeater_day_name, :repeater_month_name, :ordinal_day, :separator_at?, 'time?'], :handle_rdn_rmn_od),
41
- Handler.new([:repeater_day_name, :ordinal_day, :separator_at?, 'time?'], :handle_rdn_od),
42
- Handler.new([:scalar_year, [:separator_slash, :separator_dash], :scalar_month, [:separator_slash, :separator_dash], :scalar_day, :repeater_time, :time_zone], :handle_generic),
43
- Handler.new([:ordinal_day], :handle_generic),
44
- Handler.new([:repeater_month_name, :scalar_day, :scalar_year], :handle_rmn_sd_sy),
45
- Handler.new([:repeater_month_name, :ordinal_day, :scalar_year], :handle_rmn_od_sy),
46
- Handler.new([:repeater_month_name, :scalar_day, :scalar_year, :separator_at?, 'time?'], :handle_rmn_sd_sy),
47
- Handler.new([:repeater_month_name, :ordinal_day, :scalar_year, :separator_at?, 'time?'], :handle_rmn_od_sy),
48
- Handler.new([:repeater_month_name, [:separator_slash?, :separator_dash?], :scalar_day, :separator_at?, 'time?'], :handle_rmn_sd),
49
- Handler.new([:repeater_time, :repeater_day_portion?, :separator_on?, :repeater_month_name, :scalar_day], :handle_rmn_sd_on),
50
- Handler.new([:repeater_month_name, :ordinal_day, :separator_at?, 'time?'], :handle_rmn_od),
51
- Handler.new([:ordinal_day, :repeater_month_name, :scalar_year, :separator_at?, 'time?'], :handle_od_rmn_sy),
52
- Handler.new([:ordinal_day, :repeater_month_name, :separator_at?, 'time?'], :handle_od_rmn),
53
- Handler.new([:ordinal_day, :grabber?, :repeater_month, :separator_at?, 'time?'], :handle_od_rm),
54
- Handler.new([:scalar_year, :repeater_month_name, :ordinal_day], :handle_sy_rmn_od),
55
- Handler.new([:repeater_time, :repeater_day_portion?, :separator_on?, :repeater_month_name, :ordinal_day], :handle_rmn_od_on),
56
- Handler.new([:repeater_month_name, :scalar_year], :handle_rmn_sy),
57
- Handler.new([:repeater_quarter_name, :scalar_year], :handle_rqn_sy),
58
- Handler.new([:scalar_year, :repeater_quarter_name], :handle_sy_rqn),
59
- Handler.new([:scalar_day, :repeater_month_name, :scalar_year, :separator_at?, 'time?'], :handle_sd_rmn_sy),
60
- Handler.new([:scalar_day, [:separator_slash?, :separator_dash?], :repeater_month_name, :separator_at?, 'time?'], :handle_sd_rmn),
61
- Handler.new([:scalar_year, [:separator_slash, :separator_dash], :scalar_month, [:separator_slash, :separator_dash], :scalar_day, :separator_at?, 'time?'], :handle_sy_sm_sd),
62
- Handler.new([:scalar_year, [:separator_slash, :separator_dash], :scalar_month], :handle_sy_sm),
63
- Handler.new([:scalar_month, [:separator_slash, :separator_dash], :scalar_year], :handle_sm_sy),
64
- Handler.new([:scalar_day, [:separator_slash, :separator_dash], :repeater_month_name, [:separator_slash, :separator_dash], :scalar_year, :repeater_time?], :handle_sm_rmn_sy),
65
- Handler.new([:scalar_year, [:separator_slash, :separator_dash], :scalar_month, [:separator_slash, :separator_dash], :scalar?, :time_zone], :handle_generic),
66
- ]
67
- end
68
- end
69
-
70
- class AnchorDefinitions < SpanDefinitions
71
- def definitions
72
- [
73
- Handler.new([:separator_on?, :grabber?, :repeater, :separator_at?, :repeater?, :repeater?], :handle_r),
74
- Handler.new([:grabber?, :repeater, :repeater, :separator?, :repeater?, :repeater?], :handle_r),
75
- Handler.new([:repeater, :grabber, :repeater], :handle_r_g_r)
76
- ]
77
- end
78
- end
79
-
80
- class ArrowDefinitions < SpanDefinitions
81
- def definitions
82
- [
83
- Handler.new([:repeater_month_name, :scalar, :repeater, :pointer], :handle_rmn_s_r_p),
84
- Handler.new([:scalar, :repeater, :pointer], :handle_s_r_p),
85
- Handler.new([:scalar, :repeater, :separator_and?, :scalar, :repeater, :pointer, :separator_at?, 'anchor'], :handle_s_r_a_s_r_p_a),
86
- Handler.new([:pointer, :scalar, :repeater], :handle_p_s_r),
87
- Handler.new([:scalar, :repeater, :pointer, :separator_at?, 'anchor'], :handle_s_r_p_a)
88
- ]
89
- end
90
- end
91
-
92
- class NarrowDefinitions < SpanDefinitions
93
- def definitions
94
- [
95
- Handler.new([:ordinal, :repeater, :separator_in, :repeater], :handle_o_r_s_r),
96
- Handler.new([:ordinal, :repeater, :grabber, :repeater], :handle_o_r_g_r)
97
- ]
98
- end
99
- end
100
-
101
- class EndianDefinitions < SpanDefinitions
102
- def definitions
103
- prefered_endian
104
- end
105
-
106
- def prefered_endian
107
- options[:endian_precedence] ||= [:middle, :little]
108
-
109
- definitions = [
110
- Handler.new([:scalar_month, [:separator_slash, :separator_dash], :scalar_day, [:separator_slash, :separator_dash], :scalar_year, :separator_at?, 'time?'], :handle_sm_sd_sy),
111
- Handler.new([:scalar_month, [:separator_slash, :separator_dash], :scalar_day, :separator_at?, 'time?'], :handle_sm_sd),
112
- Handler.new([:scalar_day, [:separator_slash, :separator_dash], :scalar_month, :separator_at?, 'time?'], :handle_sd_sm),
113
- Handler.new([:scalar_day, [:separator_slash, :separator_dash], :scalar_month, [:separator_slash, :separator_dash], :scalar_year, :separator_at?, 'time?'], :handle_sd_sm_sy),
114
- Handler.new([:scalar_day, :repeater_month_name, :scalar_year, :separator_at?, 'time?'], :handle_sd_rmn_sy)
115
- ]
116
-
117
- case endian = Array(options[:endian_precedence]).first
118
- when :little
119
- definitions.reverse
120
- when :middle
121
- definitions
122
- else
123
- raise ArgumentError, "Unknown endian option '#{endian}'"
124
- end
125
- end
126
- end
127
-
128
- end
@@ -1,36 +0,0 @@
1
- require 'chronic/definition'
2
-
3
- module Chronic
4
- # A collection of definitions
5
- class Dictionary
6
- attr_reader :defined_items, :options
7
-
8
- def initialize(options = {})
9
- @options = options
10
- @defined_items = []
11
- end
12
-
13
- # returns a hash of each word's Definitions
14
- def definitions
15
- defined_items.each_with_object({}) do |word, defs|
16
- word_type = "#{word.capitalize.to_s + 'Definitions'}"
17
- defs[word] = Chronic.const_get(word_type).new(options).definitions
18
- end
19
- end
20
- end
21
-
22
- class SpanDictionary < Dictionary
23
- # Collection of SpanDefinitions
24
- def initialize(options = {})
25
- super
26
- @defined_items = [:time,:date,:anchor,:arrow,:narrow,:endian]
27
- end
28
-
29
- # returns the definitions of a specific subclass of SpanDefinitions
30
- # SpanDefinition#definitions returns an Hash of Handler instances
31
- # arguments should come in as symbols
32
- def [](handler_type=:symbol)
33
- definitions[handler_type]
34
- end
35
- end
36
- end
@@ -1,59 +0,0 @@
1
- module Chronic
2
- class RepeaterQuarter < Repeater #:nodoc:
3
- MONTHS_PER_QUARTER = 3
4
- QUARTER_SECONDS = 7_776_000 # 3 * 30 * 24 * 60 * 60
5
-
6
- def next(pointer)
7
- @current_span ||= quarter(@now)
8
- offset_quarter_amount = pointer == :future ? 1 : -1
9
- @current_span = offset_quarter(@current_span.begin, offset_quarter_amount)
10
- end
11
-
12
- def this(*)
13
- @current_span = quarter(@now)
14
- end
15
-
16
- def offset(span, amount, pointer)
17
- direction = pointer == :future ? 1 : -1
18
- offset_quarter(span.begin, amount * direction)
19
- end
20
-
21
- def width
22
- @current_span ? @current_span.width : QUARTER_SECONDS
23
- end
24
-
25
- def to_s
26
- super << '-quarter'
27
- end
28
-
29
- protected
30
-
31
- def quarter_index(month)
32
- (month - 1) / MONTHS_PER_QUARTER
33
- end
34
-
35
- def quarter(time)
36
- year, month = time.year, time.month
37
-
38
- quarter_index = quarter_index(month)
39
- quarter_month_start = (quarter_index * MONTHS_PER_QUARTER) + 1
40
- quarter_month_end = quarter_month_start + MONTHS_PER_QUARTER
41
-
42
- quarter_start = Chronic.construct(year, quarter_month_start)
43
- quarter_end = Chronic.construct(year, quarter_month_end)
44
-
45
- Span.new(quarter_start, quarter_end)
46
- end
47
-
48
- def offset_quarter(time, amount)
49
- new_month = time.month - 1
50
- new_month = new_month + MONTHS_PER_QUARTER * amount
51
- new_year = time.year + new_month / 12
52
- new_month = new_month % 12 + 1
53
-
54
- offset_time_basis = Chronic.construct(new_year, new_month)
55
-
56
- quarter(offset_time_basis)
57
- end
58
- end
59
- end
@@ -1,40 +0,0 @@
1
- module Chronic
2
- class RepeaterQuarterName < RepeaterQuarter #:nodoc:
3
- QUARTERS = {
4
- :q1 => 0,
5
- :q2 => 1,
6
- :q3 => 2,
7
- :q4 => 3
8
- }
9
-
10
- def next(pointer)
11
- unless @current_span
12
- @current_span = this(pointer)
13
- else
14
- year_offset = pointer == :future ? 1 : -1
15
- new_year = @current_span.begin.year + year_offset
16
- time_basis = Chronic.construct(new_year, @current_span.begin.month)
17
- @current_span = quarter(time_basis)
18
- end
19
-
20
- @current_span
21
- end
22
-
23
- def this(pointer = :future)
24
- current_quarter_index = quarter_index(@now.month)
25
- target_quarter_index = QUARTERS[type]
26
-
27
- year_basis_offset = case pointer
28
- when :past then current_quarter_index > target_quarter_index ? 0 : -1
29
- when :future then current_quarter_index < target_quarter_index ? 0 : 1
30
- else 0
31
- end
32
-
33
- year_basis = @now.year + year_basis_offset
34
- month_basis = (MONTHS_PER_QUARTER * target_quarter_index) + 1
35
- time_basis = Chronic.construct(year_basis, month_basis)
36
-
37
- @current_span = quarter(time_basis)
38
- end
39
- end
40
- end
@@ -1,123 +0,0 @@
1
- module Chronic
2
- class Separator < Tag
3
-
4
- # Scan an Array of Token objects and apply any necessary Separator
5
- # tags to each token.
6
- #
7
- # tokens - An Array of tokens to scan.
8
- # options - The Hash of options specified in Chronic::parse.
9
- #
10
- # Returns an Array of tokens.
11
- def self.scan(tokens, options)
12
- tokens.each do |token|
13
- token.tag scan_for(token, SeparatorComma, { ','.to_sym => :comma })
14
- token.tag scan_for(token, SeparatorDot, { '.'.to_sym => :dot })
15
- token.tag scan_for(token, SeparatorColon, { ':'.to_sym => :colon })
16
- token.tag scan_for(token, SeparatorSpace, { ' '.to_sym => :space })
17
- token.tag scan_for(token, SeparatorSlash, { '/'.to_sym => :slash })
18
- token.tag scan_for(token, SeparatorDash, { :- => :dash })
19
- token.tag scan_for(token, SeparatorAt, { /^(at|@)$/i => :at })
20
- token.tag scan_for(token, SeparatorIn, { 'in' => :in })
21
- token.tag scan_for(token, SeparatorOn, { 'on' => :on })
22
- token.tag scan_for(token, SeparatorAnd, { 'and' => :and })
23
- token.tag scan_for(token, SeparatorT, { :T => :T })
24
- token.tag scan_for(token, SeparatorW, { :W => :W })
25
- token.tag scan_for_quote(token)
26
- end
27
- end
28
-
29
- # token - The Token object we want to scan.
30
- #
31
- # Returns a new SeparatorQuote object.
32
- def self.scan_for_quote(token)
33
- scan_for token, SeparatorQuote,
34
- {
35
- "'".to_sym => :single_quote,
36
- '"'.to_sym => :double_quote
37
- }
38
- end
39
-
40
- def to_s
41
- 'separator'
42
- end
43
- end
44
-
45
- class SeparatorComma < Separator #:nodoc:
46
- def to_s
47
- super << '-comma'
48
- end
49
- end
50
-
51
- class SeparatorDot < Separator #:nodoc:
52
- def to_s
53
- super << '-dot'
54
- end
55
- end
56
-
57
- class SeparatorColon < Separator #:nodoc:
58
- def to_s
59
- super << '-colon'
60
- end
61
- end
62
-
63
- class SeparatorSpace < Separator #:nodoc:
64
- def to_s
65
- super << '-space'
66
- end
67
- end
68
-
69
- class SeparatorSlash < Separator #:nodoc:
70
- def to_s
71
- super << '-slash'
72
- end
73
- end
74
-
75
- class SeparatorDash < Separator #:nodoc:
76
- def to_s
77
- super << '-dash'
78
- end
79
- end
80
-
81
- class SeparatorQuote < Separator #:nodoc:
82
- def to_s
83
- super << '-quote-' << @type.to_s
84
- end
85
- end
86
-
87
- class SeparatorAt < Separator #:nodoc:
88
- def to_s
89
- super << '-at'
90
- end
91
- end
92
-
93
- class SeparatorIn < Separator #:nodoc:
94
- def to_s
95
- super << '-in'
96
- end
97
- end
98
-
99
- class SeparatorOn < Separator #:nodoc:
100
- def to_s
101
- super << '-on'
102
- end
103
- end
104
-
105
- class SeparatorAnd < Separator #:nodoc:
106
- def to_s
107
- super << '-and'
108
- end
109
- end
110
-
111
- class SeparatorT < Separator #:nodoc:
112
- def to_s
113
- super << '-T'
114
- end
115
- end
116
-
117
- class SeparatorW < Separator #:nodoc:
118
- def to_s
119
- super << '-W'
120
- end
121
- end
122
-
123
- end