4
CalendarConstants defines all constants used by parsedatetime.py.
7
__license__ = """Copyright (c) 2004-2006 Mike Taylor, All rights reserved.
9
Licensed under the Apache License, Version 2.0 (the "License");
10
you may not use this file except in compliance with the License.
11
You may obtain a copy of the License at
13
http://www.apache.org/licenses/LICENSE-2.0
15
Unless required by applicable law or agreed to in writing, software
16
distributed under the License is distributed on an "AS IS" BASIS,
17
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18
See the License for the specific language governing permissions and
19
limitations under the License.
21
__author__ = 'Mike Taylor <http://code-bear.com>'
22
__contributors__ = ['Darshana Chhajed <mailto://darshana@osafoundation.org>',
26
class CalendarConstants:
28
self.Locale = 'American'
32
self.RE_SPECIAL = r'(?P<special>^[in|on|of|at]+)\s+'
33
self.RE_UNITS = r'(?P<qty>(-?\d+\s*(?P<units>((hour|hr|minute|min|second|sec|day|dy|week|wk|month|mth|year|yr)s?))))'
34
self.RE_QUNITS = r'(?P<qty>(-?\d+\s?(?P<qunits>h|m|s|d|w|m|y)(\s|,|$)))'
35
self.RE_MODIFIER = r'(?P<modifier>(previous|prev|last|next|this|eo|(end\sof)|(in\sa)))'
36
self.RE_MODIFIER2 = r'(?P<modifier>(from|before|after|ago|prior))'
37
self.RE_TIMEHMS = r'(?P<hours>\d\d?)(?P<tsep>:|)(?P<minutes>\d\d)(?:(?P=tsep)(?P<seconds>\d\d(?:[.,]\d+)?))?'
38
self.RE_TIMEHMS2 = r'(?P<hours>(\d\d?))((?P<tsep>:|)(?P<minutes>(\d\d?))(?:(?P=tsep)(?P<seconds>\d\d?(?:[.,]\d+)?))?)?\s?(?P<meridian>(am|pm|a.m.|p.m.|a|p))'
39
self.RE_DATE = r'(?P<date>\d+([/.\\]\d+)+)'
40
self.RE_DATE2 = r'[/.\\]'
41
self.RE_DATE3 = r'(?P<date>((?P<mthname>(january|february|march|april|may|june|july|august|september|october|november|december))\s?((?P<day>\d\d?)(\s|rd|st|nd|th|,|$)+)?(?P<year>\d\d\d\d)?))'
42
self.RE_MONTH = r'(?P<month>((?P<mthname>(january|february|march|april|may|june|july|august|september|october|november|december))(\s?(?P<year>(\d\d\d\d)))?))'
43
self.RE_WEEKDAY = r'(?P<weekday>(monday|mon|tuesday|tue|wednesday|wed|thursday|thu|friday|fri|saturday|sat|sunday|sun))'
44
self.RE_DAY = r'(?P<day>(today|tomorrow|yesterday))'
45
self.RE_TIME = r'\s*(?P<time>(morning|breakfast|noon|lunch|evening|midnight|tonight|dinner|night|now))'
46
self.RE_REMAINING = r'\s+'
48
# Regex for date/time ranges
49
self.RE_RTIMEHMS = r'(\d\d?):(\d\d)(:(\d\d))?'
50
self.RE_RTIMEHMS2 = r'(\d\d?)(:(\d\d?))?(:(\d\d?))?\s?(am|pm|a.m.|p.m.|a|p)'
51
self.RE_RDATE = r'(\d+([/.\\]\d+)+)'
52
self.RE_RDATE3 = r'((((january|february|march|april|may|june|july|august|september|october|november|december))\s?((\d\d?)(\s|rd|st|nd|th|,|$)+)?(\d\d\d\d)?))'
53
self.DATERNG1 = self.RE_RDATE + r'\s?-\s?' + self.RE_RDATE #"06/07/06 - 08/09/06"
54
self.DATERNG2 = self.RE_RDATE3 + r'\s?-\s?' + self.RE_RDATE3 #"march 31 - june 1st, 2006"
55
self.DATERNG3 = self.RE_RDATE3 + r'\s?' + r'-' + r'\s?(\d\d?)\s?(rd|st|nd|th)?' #"march 1rd -13th"
56
self.TIMERNG1 = self.RE_RTIMEHMS2 + r'\s?-\s?'+ self.RE_RTIMEHMS2 #"4:00:55 pm - 5:90:44 am",'4p-5p'
57
self.TIMERNG2 = self.RE_RTIMEHMS + r'\s?-\s?'+ self.RE_RTIMEHMS #"4:00 - 5:90 ","4:55:55-3:44:55"
58
self.TIMERNG3 = r'\d\d?\s?-\s?'+ self.RE_RTIMEHMS2 #"4-5pm "
60
# Used to adjust the returned date before/after the source
62
self.Modifiers = { 'from': 1,
78
self.Minute = 60 * self.Second
79
self.Hour = 60 * self.Minute
80
self.Day = 24 * self.Hour
81
self.Week = 7 * self.Day
82
self.Month = 30 * self.Day
83
self.Year = 365 * self.Day
85
self.WeekDays = { 'monday': 0,
101
# dictionary to allow for locale specific text
102
# NOTE: The keys are the localized values - the parsing
103
# code will be using Target_Text using the values
104
# extracted *from* the user's input
106
self.Target_Text = { 'datesep': '-',
130
'morning': 'morning',
131
'evening': 'evening',
132
'breakfast': 'breakfast',
137
'tuesday': 'tuesday',
139
'wednesday': 'wednesday',
141
'thursday': 'thursday',
145
'saturday': 'saturday',
149
'january': 'january',
151
'febuary': 'febuary',
165
'september': 'september',
167
'october': 'october',
169
'november': 'november',
171
'december': 'december',
175
# FIXME: there *has* to be a standard routine that does this
177
self.DOW_Text = [self.Target_Text['mon'],
178
self.Target_Text['tue'],
179
self.Target_Text['wed'],
180
self.Target_Text['thu'],
181
self.Target_Text['fri'],
182
self.Target_Text['sat'],
183
self.Target_Text['sun'],
186
self.DaysInMonthList = (31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31)
188
self.DaysInMonth = {}
189
self.DaysInMonth[self.Target_Text['january']] = self.DaysInMonthList[0]
190
self.DaysInMonth[self.Target_Text['febuary']] = self.DaysInMonthList[1]
191
self.DaysInMonth[self.Target_Text['march']] = self.DaysInMonthList[2]
192
self.DaysInMonth[self.Target_Text['april']] = self.DaysInMonthList[3]
193
self.DaysInMonth[self.Target_Text['may']] = self.DaysInMonthList[4]
194
self.DaysInMonth[self.Target_Text['june']] = self.DaysInMonthList[5]
195
self.DaysInMonth[self.Target_Text['july']] = self.DaysInMonthList[6]
196
self.DaysInMonth[self.Target_Text['august']] = self.DaysInMonthList[7]
197
self.DaysInMonth[self.Target_Text['september']] = self.DaysInMonthList[8]
198
self.DaysInMonth[self.Target_Text['october']] = self.DaysInMonthList[9]
199
self.DaysInMonth[self.Target_Text['november']] = self.DaysInMonthList[10]
200
self.DaysInMonth[self.Target_Text['december']] = self.DaysInMonthList[11]
202
self.Month_Text = [ self.Target_Text['january'],
203
self.Target_Text['febuary'],
204
self.Target_Text['march'],
205
self.Target_Text['april'],
206
self.Target_Text['may'],
207
self.Target_Text['june'],
208
self.Target_Text['july'],
209
self.Target_Text['august'],
210
self.Target_Text['september'],
211
self.Target_Text['october'],
212
self.Target_Text['november'],
213
self.Target_Text['december'],
217
self.MthNames = { 'january': 1,
233
# This looks hokey - but it is a nice simple way to get
234
# the proper unit value and it has the advantage that
235
# later I can morph it into something localized.
236
# Any trailing s will be removed before lookup.
239
self.Units[self.Target_Text['second']] = self.Second
240
self.Units[self.Target_Text['sec']] = self.Second
241
self.Units[self.Target_Text['s']] = self.Second
242
self.Units[self.Target_Text['minute']] = self.Minute
243
self.Units[self.Target_Text['min']] = self.Minute
244
self.Units[self.Target_Text['m']] = self.Minute
245
self.Units[self.Target_Text['hour']] = self.Hour
246
self.Units[self.Target_Text['hr']] = self.Hour
247
self.Units[self.Target_Text['h']] = self.Hour
248
self.Units[self.Target_Text['day']] = self.Day
249
self.Units[self.Target_Text['dy']] = self.Day
250
self.Units[self.Target_Text['d']] = self.Day
251
self.Units[self.Target_Text['week']] = self.Week
252
self.Units[self.Target_Text['wk']] = self.Week
253
self.Units[self.Target_Text['w']] = self.Week
254
self.Units[self.Target_Text['month']] = self.Month
255
self.Units[self.Target_Text['mth']] = self.Month
256
self.Units[self.Target_Text['year']] = self.Year
257
self.Units[self.Target_Text['yr']] = self.Year
258
self.Units[self.Target_Text['y']] = self.Year
260
self.Units_Text = { 'one': 1,