/
pattern.cr
226 lines (219 loc) · 4.74 KB
/
pattern.cr
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
struct Time::Format
# :nodoc:
module Pattern
def visit(pattern)
reader = Char::Reader.new(pattern)
while reader.has_next?
char = reader.current_char
reader = check_char reader, char
reader.next_char
end
end
private def check_char(reader, char)
case char
when '%'
case char = reader.next_char
when 'a'
short_day_name
when 'A'
day_name
when 'b', 'h'
short_month_name
when 'c'
date_and_time
when 'B'
month_name
when 'C'
year_divided_by_100
when 'd'
day_of_month_zero_padded
when 'D', 'x'
date
when 'e'
day_of_month_blank_padded
when 'F'
year_month_day
when 'g'
calendar_week_year_modulo100
when 'G'
calendar_week_year
when 'H'
hour_24_zero_padded
when 'I'
hour_12_zero_padded
when 'j'
day_of_year_zero_padded
when 'k'
hour_24_blank_padded
when 'l'
hour_12_blank_padded
when 'L'
milliseconds
when 'm'
month_zero_padded
when 'M'
minute
when 'N'
second_fraction
when 'p'
am_pm
when 'P'
am_pm_upcase
when 'r'
twelve_hour_time
when 'R'
twenty_four_hour_time
when 's'
unix_seconds
when 'S'
second
when 'T', 'X'
twenty_four_hour_time_with_seconds
when 'u'
day_of_week_monday_1_7
when 'V'
calendar_week_week
when 'w'
day_of_week_sunday_0_6
when 'y'
year_modulo_100
when 'Y'
year
when 'z'
time_zone
when 'Z'
time_zone_name
when '_'
case char = reader.next_char
when 'm'
month_blank_padded
else
char '%'
char '_'
reader = check_char reader, char
end
when '-'
case char = reader.next_char
when 'd'
day_of_month
when 'm'
month
else
char '%'
char '-'
reader = check_char reader, char
end
when '^'
case char = reader.next_char
when 'a'
short_day_name_upcase
when 'A'
day_name_upcase
when 'b', 'h'
short_month_name_upcase
when 'B'
month_name_upcase
when 'Z'
time_zone_name(zone: true)
else
char '%'
char '^'
reader = check_char reader, char
end
when ':'
case char = reader.next_char
when 'z'
time_zone_colon
when ':'
case char = reader.next_char
when 'z'
time_zone_colon_with_seconds
else
char '%'
char ':'
char ':'
reader = check_char reader, char
end
else
char '%'
char ':'
reader = check_char reader, char
end
when '3', '6', '9'
digit_char = char
case char = reader.next_char
when 'N'
case digit_char
when '3'
milliseconds
when '6'
microseconds
when '9'
nanoseconds
else
raise "Bug: someone forgot to match some numbers"
end
else
char '%'
char digit_char
reader = check_char reader, char
end
when '%'
char '%'
else
char '%'
char char
end
else
char char
end
reader
end
def date_and_time
short_day_name
char ' '
short_month_name
char ' '
day_of_month_blank_padded
char ' '
twenty_four_hour_time_with_seconds
char ' '
year
end
def date
month_zero_padded
char '/'
day_of_month_zero_padded
char '/'
year_modulo_100
end
def year_month_day
year
char '-'
month_zero_padded
char '-'
day_of_month_zero_padded
end
def twelve_hour_time
hour_12_zero_padded
char ':'
minute
char ':'
second
char ' '
am_pm_upcase
end
def twenty_four_hour_time
hour_24_zero_padded
char ':'
minute
end
def twenty_four_hour_time_with_seconds
hour_24_zero_padded
char ':'
minute
char ':'
second
end
end
end