Mercurial > cpython-lru_cache-weakref
annotate Lib/calendar.py @ 4566:6403c94de50d legacy-trunk
Added safeguard against failure in __del__.
| author | Guido van Rossum <guido@python.org> |
|---|---|
| date | Wed, 27 Nov 1996 19:39:58 +0000 |
| parents | 1940892d2fe3 |
| children | 5e03ea6927f2 |
| rev | line source |
|---|---|
|
1316
2f3f293ef5f1
* calendar.py: all libC functionality now moved to built-in time module
Guido van Rossum <guido@python.org>
parents:
1315
diff
changeset
|
1 ############################### |
|
2f3f293ef5f1
* calendar.py: all libC functionality now moved to built-in time module
Guido van Rossum <guido@python.org>
parents:
1315
diff
changeset
|
2 # Calendar printing functions # |
|
2f3f293ef5f1
* calendar.py: all libC functionality now moved to built-in time module
Guido van Rossum <guido@python.org>
parents:
1315
diff
changeset
|
3 ############################### |
| 5 | 4 |
|
1316
2f3f293ef5f1
* calendar.py: all libC functionality now moved to built-in time module
Guido van Rossum <guido@python.org>
parents:
1315
diff
changeset
|
5 # Revision 2: uses funtions from built-in time module |
| 5 | 6 |
|
1315
acdc0b9a6c78
* aifc.py: don't die on invalid MARK chunk
Guido van Rossum <guido@python.org>
parents:
1314
diff
changeset
|
7 # Import functions and variables from time module |
|
1316
2f3f293ef5f1
* calendar.py: all libC functionality now moved to built-in time module
Guido van Rossum <guido@python.org>
parents:
1315
diff
changeset
|
8 from time import gmtime, localtime, mktime, asctime, ctime |
| 5 | 9 |
| 10 # Exception raised for bad input (with string parameter for details) | |
|
1315
acdc0b9a6c78
* aifc.py: don't die on invalid MARK chunk
Guido van Rossum <guido@python.org>
parents:
1314
diff
changeset
|
11 error = 'calendar.error' |
| 5 | 12 |
|
1315
acdc0b9a6c78
* aifc.py: don't die on invalid MARK chunk
Guido van Rossum <guido@python.org>
parents:
1314
diff
changeset
|
13 # Note when comparing these calendars to the ones printed by cal(1): |
|
acdc0b9a6c78
* aifc.py: don't die on invalid MARK chunk
Guido van Rossum <guido@python.org>
parents:
1314
diff
changeset
|
14 # My calendars have Monday as the first day of the week, and Sunday as |
|
acdc0b9a6c78
* aifc.py: don't die on invalid MARK chunk
Guido van Rossum <guido@python.org>
parents:
1314
diff
changeset
|
15 # the last! (I believe this is the European convention.) |
|
acdc0b9a6c78
* aifc.py: don't die on invalid MARK chunk
Guido van Rossum <guido@python.org>
parents:
1314
diff
changeset
|
16 |
|
acdc0b9a6c78
* aifc.py: don't die on invalid MARK chunk
Guido van Rossum <guido@python.org>
parents:
1314
diff
changeset
|
17 # Constants for months referenced later |
|
acdc0b9a6c78
* aifc.py: don't die on invalid MARK chunk
Guido van Rossum <guido@python.org>
parents:
1314
diff
changeset
|
18 January = 1 |
|
acdc0b9a6c78
* aifc.py: don't die on invalid MARK chunk
Guido van Rossum <guido@python.org>
parents:
1314
diff
changeset
|
19 February = 2 |
|
acdc0b9a6c78
* aifc.py: don't die on invalid MARK chunk
Guido van Rossum <guido@python.org>
parents:
1314
diff
changeset
|
20 |
|
acdc0b9a6c78
* aifc.py: don't die on invalid MARK chunk
Guido van Rossum <guido@python.org>
parents:
1314
diff
changeset
|
21 # Number of days per month (except for February in leap years) |
|
acdc0b9a6c78
* aifc.py: don't die on invalid MARK chunk
Guido van Rossum <guido@python.org>
parents:
1314
diff
changeset
|
22 mdays = [0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31] |
|
acdc0b9a6c78
* aifc.py: don't die on invalid MARK chunk
Guido van Rossum <guido@python.org>
parents:
1314
diff
changeset
|
23 |
|
acdc0b9a6c78
* aifc.py: don't die on invalid MARK chunk
Guido van Rossum <guido@python.org>
parents:
1314
diff
changeset
|
24 # Full and abbreviated names of weekdays |
|
acdc0b9a6c78
* aifc.py: don't die on invalid MARK chunk
Guido van Rossum <guido@python.org>
parents:
1314
diff
changeset
|
25 day_name = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', \ |
|
acdc0b9a6c78
* aifc.py: don't die on invalid MARK chunk
Guido van Rossum <guido@python.org>
parents:
1314
diff
changeset
|
26 'Friday', 'Saturday', 'Sunday'] |
|
acdc0b9a6c78
* aifc.py: don't die on invalid MARK chunk
Guido van Rossum <guido@python.org>
parents:
1314
diff
changeset
|
27 day_abbr = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'] |
|
acdc0b9a6c78
* aifc.py: don't die on invalid MARK chunk
Guido van Rossum <guido@python.org>
parents:
1314
diff
changeset
|
28 |
|
1316
2f3f293ef5f1
* calendar.py: all libC functionality now moved to built-in time module
Guido van Rossum <guido@python.org>
parents:
1315
diff
changeset
|
29 # Full and abbreviated names of months (1-based arrays!!!) |
|
1315
acdc0b9a6c78
* aifc.py: don't die on invalid MARK chunk
Guido van Rossum <guido@python.org>
parents:
1314
diff
changeset
|
30 month_name = ['', 'January', 'February', 'March', 'April', \ |
|
acdc0b9a6c78
* aifc.py: don't die on invalid MARK chunk
Guido van Rossum <guido@python.org>
parents:
1314
diff
changeset
|
31 'May', 'June', 'July', 'August', \ |
|
acdc0b9a6c78
* aifc.py: don't die on invalid MARK chunk
Guido van Rossum <guido@python.org>
parents:
1314
diff
changeset
|
32 'September', 'October', 'November', 'December'] |
|
1316
2f3f293ef5f1
* calendar.py: all libC functionality now moved to built-in time module
Guido van Rossum <guido@python.org>
parents:
1315
diff
changeset
|
33 month_abbr = [' ', 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', \ |
|
2f3f293ef5f1
* calendar.py: all libC functionality now moved to built-in time module
Guido van Rossum <guido@python.org>
parents:
1315
diff
changeset
|
34 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'] |
|
1315
acdc0b9a6c78
* aifc.py: don't die on invalid MARK chunk
Guido van Rossum <guido@python.org>
parents:
1314
diff
changeset
|
35 |
|
acdc0b9a6c78
* aifc.py: don't die on invalid MARK chunk
Guido van Rossum <guido@python.org>
parents:
1314
diff
changeset
|
36 # Return 1 for leap years, 0 for non-leap years |
|
acdc0b9a6c78
* aifc.py: don't die on invalid MARK chunk
Guido van Rossum <guido@python.org>
parents:
1314
diff
changeset
|
37 def isleap(year): |
|
acdc0b9a6c78
* aifc.py: don't die on invalid MARK chunk
Guido van Rossum <guido@python.org>
parents:
1314
diff
changeset
|
38 return year % 4 == 0 and (year % 100 <> 0 or year % 400 == 0) |
|
acdc0b9a6c78
* aifc.py: don't die on invalid MARK chunk
Guido van Rossum <guido@python.org>
parents:
1314
diff
changeset
|
39 |
|
acdc0b9a6c78
* aifc.py: don't die on invalid MARK chunk
Guido van Rossum <guido@python.org>
parents:
1314
diff
changeset
|
40 # Return number of leap years in range [y1, y2) |
|
acdc0b9a6c78
* aifc.py: don't die on invalid MARK chunk
Guido van Rossum <guido@python.org>
parents:
1314
diff
changeset
|
41 # Assume y1 <= y2 and no funny (non-leap century) years |
|
acdc0b9a6c78
* aifc.py: don't die on invalid MARK chunk
Guido van Rossum <guido@python.org>
parents:
1314
diff
changeset
|
42 def leapdays(y1, y2): |
|
acdc0b9a6c78
* aifc.py: don't die on invalid MARK chunk
Guido van Rossum <guido@python.org>
parents:
1314
diff
changeset
|
43 return (y2+3)/4 - (y1+3)/4 |
|
acdc0b9a6c78
* aifc.py: don't die on invalid MARK chunk
Guido van Rossum <guido@python.org>
parents:
1314
diff
changeset
|
44 |
| 5 | 45 # Return weekday (0-6 ~ Mon-Sun) for year (1970-...), month (1-12), day (1-31) |
| 46 def weekday(year, month, day): | |
|
1315
acdc0b9a6c78
* aifc.py: don't die on invalid MARK chunk
Guido van Rossum <guido@python.org>
parents:
1314
diff
changeset
|
47 secs = mktime((year, month, day, 0, 0, 0, 0, 0, 0)) |
|
acdc0b9a6c78
* aifc.py: don't die on invalid MARK chunk
Guido van Rossum <guido@python.org>
parents:
1314
diff
changeset
|
48 tuple = localtime(secs) |
|
acdc0b9a6c78
* aifc.py: don't die on invalid MARK chunk
Guido van Rossum <guido@python.org>
parents:
1314
diff
changeset
|
49 return tuple[6] |
| 5 | 50 |
| 51 # Return weekday (0-6 ~ Mon-Sun) and number of days (28-31) for year, month | |
| 52 def monthrange(year, month): | |
|
1315
acdc0b9a6c78
* aifc.py: don't die on invalid MARK chunk
Guido van Rossum <guido@python.org>
parents:
1314
diff
changeset
|
53 if not 1 <= month <= 12: raise ValueError, 'bad month number' |
| 5 | 54 day1 = weekday(year, month, 1) |
| 559 | 55 ndays = mdays[month] + (month == February and isleap(year)) |
| 5 | 56 return day1, ndays |
| 57 | |
| 58 # Return a matrix representing a month's calendar | |
| 59 # Each row represents a week; days outside this month are zero | |
| 60 def _monthcalendar(year, month): | |
| 61 day1, ndays = monthrange(year, month) | |
| 62 rows = [] | |
| 63 r7 = range(7) | |
| 64 day = 1 - day1 | |
| 65 while day <= ndays: | |
| 66 row = [0, 0, 0, 0, 0, 0, 0] | |
| 67 for i in r7: | |
| 68 if 1 <= day <= ndays: row[i] = day | |
| 69 day = day + 1 | |
| 70 rows.append(row) | |
| 71 return rows | |
| 72 | |
| 73 # Caching interface to _monthcalendar | |
|
1315
acdc0b9a6c78
* aifc.py: don't die on invalid MARK chunk
Guido van Rossum <guido@python.org>
parents:
1314
diff
changeset
|
74 _mc_cache = {} |
| 5 | 75 def monthcalendar(year, month): |
|
1315
acdc0b9a6c78
* aifc.py: don't die on invalid MARK chunk
Guido van Rossum <guido@python.org>
parents:
1314
diff
changeset
|
76 key = (year, month) |
|
acdc0b9a6c78
* aifc.py: don't die on invalid MARK chunk
Guido van Rossum <guido@python.org>
parents:
1314
diff
changeset
|
77 if _mc_cache.has_key(key): |
|
acdc0b9a6c78
* aifc.py: don't die on invalid MARK chunk
Guido van Rossum <guido@python.org>
parents:
1314
diff
changeset
|
78 return _mc_cache[key] |
|
acdc0b9a6c78
* aifc.py: don't die on invalid MARK chunk
Guido van Rossum <guido@python.org>
parents:
1314
diff
changeset
|
79 else: |
|
acdc0b9a6c78
* aifc.py: don't die on invalid MARK chunk
Guido van Rossum <guido@python.org>
parents:
1314
diff
changeset
|
80 _mc_cache[key] = ret = _monthcalendar(year, month) |
| 5 | 81 return ret |
| 82 | |
| 83 # Center a string in a field | |
|
1315
acdc0b9a6c78
* aifc.py: don't die on invalid MARK chunk
Guido van Rossum <guido@python.org>
parents:
1314
diff
changeset
|
84 def _center(str, width): |
| 5 | 85 n = width - len(str) |
|
1315
acdc0b9a6c78
* aifc.py: don't die on invalid MARK chunk
Guido van Rossum <guido@python.org>
parents:
1314
diff
changeset
|
86 if n <= 0: return str |
|
acdc0b9a6c78
* aifc.py: don't die on invalid MARK chunk
Guido van Rossum <guido@python.org>
parents:
1314
diff
changeset
|
87 return ' '*((n+1)/2) + str + ' '*((n)/2) |
| 5 | 88 |
| 89 # XXX The following code knows that print separates items with space! | |
| 90 | |
| 91 # Print a single week (no newline) | |
| 92 def prweek(week, width): | |
| 93 for day in week: | |
|
1315
acdc0b9a6c78
* aifc.py: don't die on invalid MARK chunk
Guido van Rossum <guido@python.org>
parents:
1314
diff
changeset
|
94 if day == 0: s = '' |
|
acdc0b9a6c78
* aifc.py: don't die on invalid MARK chunk
Guido van Rossum <guido@python.org>
parents:
1314
diff
changeset
|
95 else: s = `day` |
|
acdc0b9a6c78
* aifc.py: don't die on invalid MARK chunk
Guido van Rossum <guido@python.org>
parents:
1314
diff
changeset
|
96 print _center(s, width), |
| 5 | 97 |
| 98 # Return a header for a week | |
| 99 def weekheader(width): | |
| 100 str = '' | |
|
1315
acdc0b9a6c78
* aifc.py: don't die on invalid MARK chunk
Guido van Rossum <guido@python.org>
parents:
1314
diff
changeset
|
101 if width >= 9: names = day_name |
|
acdc0b9a6c78
* aifc.py: don't die on invalid MARK chunk
Guido van Rossum <guido@python.org>
parents:
1314
diff
changeset
|
102 else: names = day_abbr |
| 5 | 103 for i in range(7): |
| 104 if str: str = str + ' ' | |
|
1315
acdc0b9a6c78
* aifc.py: don't die on invalid MARK chunk
Guido van Rossum <guido@python.org>
parents:
1314
diff
changeset
|
105 str = str + _center(names[i%7][:width], width) |
| 5 | 106 return str |
| 107 | |
| 108 # Print a month's calendar | |
|
1746
1940892d2fe3
Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents:
1463
diff
changeset
|
109 def prmonth(year, month, w = 0, l = 0): |
|
1315
acdc0b9a6c78
* aifc.py: don't die on invalid MARK chunk
Guido van Rossum <guido@python.org>
parents:
1314
diff
changeset
|
110 w = max(2, w) |
|
acdc0b9a6c78
* aifc.py: don't die on invalid MARK chunk
Guido van Rossum <guido@python.org>
parents:
1314
diff
changeset
|
111 l = max(1, l) |
|
acdc0b9a6c78
* aifc.py: don't die on invalid MARK chunk
Guido van Rossum <guido@python.org>
parents:
1314
diff
changeset
|
112 print _center(month_name[month] + ' ' + `year`, 7*(w+1) - 1), |
|
acdc0b9a6c78
* aifc.py: don't die on invalid MARK chunk
Guido van Rossum <guido@python.org>
parents:
1314
diff
changeset
|
113 print '\n'*l, |
|
acdc0b9a6c78
* aifc.py: don't die on invalid MARK chunk
Guido van Rossum <guido@python.org>
parents:
1314
diff
changeset
|
114 print weekheader(w), |
|
acdc0b9a6c78
* aifc.py: don't die on invalid MARK chunk
Guido van Rossum <guido@python.org>
parents:
1314
diff
changeset
|
115 print '\n'*l, |
| 5 | 116 for week in monthcalendar(year, month): |
|
1315
acdc0b9a6c78
* aifc.py: don't die on invalid MARK chunk
Guido van Rossum <guido@python.org>
parents:
1314
diff
changeset
|
117 prweek(week, w) |
|
acdc0b9a6c78
* aifc.py: don't die on invalid MARK chunk
Guido van Rossum <guido@python.org>
parents:
1314
diff
changeset
|
118 print '\n'*l, |
| 5 | 119 |
|
1315
acdc0b9a6c78
* aifc.py: don't die on invalid MARK chunk
Guido van Rossum <guido@python.org>
parents:
1314
diff
changeset
|
120 # Spacing of month columns |
|
acdc0b9a6c78
* aifc.py: don't die on invalid MARK chunk
Guido van Rossum <guido@python.org>
parents:
1314
diff
changeset
|
121 _colwidth = 7*3 - 1 # Amount printed by prweek() |
|
acdc0b9a6c78
* aifc.py: don't die on invalid MARK chunk
Guido van Rossum <guido@python.org>
parents:
1314
diff
changeset
|
122 _spacing = ' '*4 # Spaces between columns |
| 5 | 123 |
| 124 # 3-column formatting for year calendars | |
| 125 def format3c(a, b, c): | |
|
1315
acdc0b9a6c78
* aifc.py: don't die on invalid MARK chunk
Guido van Rossum <guido@python.org>
parents:
1314
diff
changeset
|
126 print _center(a, _colwidth), |
|
acdc0b9a6c78
* aifc.py: don't die on invalid MARK chunk
Guido van Rossum <guido@python.org>
parents:
1314
diff
changeset
|
127 print _spacing, |
|
acdc0b9a6c78
* aifc.py: don't die on invalid MARK chunk
Guido van Rossum <guido@python.org>
parents:
1314
diff
changeset
|
128 print _center(b, _colwidth), |
|
acdc0b9a6c78
* aifc.py: don't die on invalid MARK chunk
Guido van Rossum <guido@python.org>
parents:
1314
diff
changeset
|
129 print _spacing, |
|
acdc0b9a6c78
* aifc.py: don't die on invalid MARK chunk
Guido van Rossum <guido@python.org>
parents:
1314
diff
changeset
|
130 print _center(c, _colwidth) |
| 5 | 131 |
| 132 # Print a year's calendar | |
| 133 def prcal(year): | |
| 134 header = weekheader(2) | |
| 135 format3c('', `year`, '') | |
| 136 for q in range(January, January+12, 3): | |
| 137 print | |
| 138 format3c(month_name[q], month_name[q+1], month_name[q+2]) | |
| 139 format3c(header, header, header) | |
| 140 data = [] | |
| 141 height = 0 | |
| 142 for month in range(q, q+3): | |
| 143 cal = monthcalendar(year, month) | |
| 144 if len(cal) > height: height = len(cal) | |
| 145 data.append(cal) | |
| 146 for i in range(height): | |
| 147 for cal in data: | |
| 148 if i >= len(cal): | |
|
1315
acdc0b9a6c78
* aifc.py: don't die on invalid MARK chunk
Guido van Rossum <guido@python.org>
parents:
1314
diff
changeset
|
149 print ' '*_colwidth, |
| 5 | 150 else: |
| 151 prweek(cal[i], 2) | |
|
1315
acdc0b9a6c78
* aifc.py: don't die on invalid MARK chunk
Guido van Rossum <guido@python.org>
parents:
1314
diff
changeset
|
152 print _spacing, |
| 5 | 153 print |
