/
pattern.cr
198 lines (190 loc) · 4.14 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
struct Time::Format
# :nodoc:
module Pattern
MONTH_NAMES = %w(January February March April May June July August September October November December)
DAY_NAMES = %w(Sunday Monday Tuesday Wednesday Thursday Friday Saturday)
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'
iso_8601_date
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 'p'
am_pm
when 'P'
am_pm_upcase
when 'r'
twelve_hour_time
when 'R'
twenty_four_hour_time
when 's'
epoch
when 'S'
second
when 'T', 'X'
twenty_four_hour_time_with_seconds
when 'u'
day_of_week_monday_1_7
when 'w'
day_of_week_sunday_0_6
when 'y'
year_modulo_100
when 'Y'
year
when 'z'
time_zone
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
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 '%'
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 iso_8601_date
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