87
87
* do a correct calculation of "today" using user's timezone
89
89
* added template argument for specifying an edit template for new pages
91
* adapted to moin 1.7 new macro parameter parsing
92
[[MonthCalendar(BasePage,year,month,monthoffset,monthoffset2,height6)]]
94
<<MonthCalendar(BasePage,year,month,monthoffset,monthoffset2,height6)>>
94
96
each parameter can be empty and then defaults to currentpage or currentdate or monthoffset=0
96
98
Samples (paste that to one of your pages for a first try):
98
100
Calendar of current month for current page:
101
103
Calendar of last month:
102
[[MonthCalendar(,,,-1)]]
104
<<MonthCalendar(,,,-1)>>
104
106
Calendar of next month:
105
[[MonthCalendar(,,,+1)]]
107
<<MonthCalendar(,,,+1)>>
107
109
Calendar of Page SampleUser, this years december:
108
[[MonthCalendar(SampleUser,,12)]]
110
<<MonthCalendar(SampleUser,,12)>>
110
112
Calendar of current Page, this years december:
111
[[MonthCalendar(,,12)]]
113
<<MonthCalendar(,,12)>>
113
115
Calendar of December, 2001:
114
[[MonthCalendar(,2001,12)]]
116
<<MonthCalendar(,2001,12)>>
116
118
Calendar of the month two months after December, 2001
117
119
(maybe doesn't make much sense, but is possible)
118
[[MonthCalendar(,2001,12,+2)]]
120
<<MonthCalendar(,2001,12,+2)>>
120
122
Calendar of year 2002 (every month padded to height of 6):
121
123
||||||Year 2002||
122
||[[MonthCalendar(,2002,1,,,1)]]||[[MonthCalendar(,2002,2,,,1)]]||[[MonthCalendar(,2002,3,,,1)]]||
123
||[[MonthCalendar(,2002,4,,,1)]]||[[MonthCalendar(,2002,5,,,1)]]||[[MonthCalendar(,2002,6,,,1)]]||
124
||[[MonthCalendar(,2002,7,,,1)]]||[[MonthCalendar(,2002,8,,,1)]]||[[MonthCalendar(,2002,9,,,1)]]||
125
||[[MonthCalendar(,2002,10,,,1)]]||[[MonthCalendar(,2002,11,,,1)]]||[[MonthCalendar(,2002,12,,,1)]]||
124
||<<MonthCalendar(,2002,1,,,1)>>||<<MonthCalendar(,2002,2,,,1)>>||<<MonthCalendar(,2002,3,,,1)>>||
125
||<<MonthCalendar(,2002,4,,,1)>>||<<MonthCalendar(,2002,5,,,1)>>||<<MonthCalendar(,2002,6,,,1)>>||
126
||<<MonthCalendar(,2002,7,,,1)>>||<<MonthCalendar(,2002,8,,,1)>>||<<MonthCalendar(,2002,9,,,1)>>||
127
||<<MonthCalendar(,2002,10,,,1)>>||<<MonthCalendar(,2002,11,,,1)>>||<<MonthCalendar(,2002,12,,,1)>>||
127
129
Current calendar of me, also showing entries of A and B:
128
[[MonthCalendar(MyPage*TestUserA*TestUserB)]]
130
<<MonthCalendar(MyPage*TestUserA*TestUserB)>>
130
132
SubPage calendars:
131
[[MonthCalendar(MyName/CalPrivate)]]
132
[[MonthCalendar(MyName/CalBusiness)]]
133
[[MonthCalendar(MyName/CalBusiness*MyName/CalPrivate)]]
133
<<MonthCalendar(MyName/CalPrivate)>>
134
<<MonthCalendar(MyName/CalBusiness)>>
135
<<MonthCalendar(MyName/CalBusiness*MyName/CalPrivate)>>
136
138
Anniversary Calendars: (no year data)
137
[[MonthCalendar(Yearly,,,+1,,6,1)]]
139
<<MonthCalendar(Yearly,,,+1,,6,1)>>
139
This creates calendars of the format Yearly/MM-DD
140
By leaving out the year, you can set birthdays, and anniversaries in this
141
This creates calendars of the format Yearly/MM-DD
142
By leaving out the year, you can set birthdays, and anniversaries in this
141
143
calendar and not have to re-enter each year.
143
145
This creates a calendar which uses MonthCalendarTemplate for directly editing
144
146
nonexisting day pages:
145
[[MonthCalendar(,,,,,,MonthCalendarTemplate)]]
147
<<MonthCalendar(,,,,,,MonthCalendarTemplate)>>
148
Dependencies = ['namespace','time']
150
Dependencies = ['namespace', 'time', ]
152
import re, calendar, time
150
154
from MoinMoin import wikiutil
151
155
from MoinMoin.Page import Page
152
import re, calendar, time
154
157
# The following line sets the calendar to have either Sunday or Monday as
155
158
# the first day of the week. Only SUNDAY or MONDAY (case sensitive) are
158
161
# XXX change here ----------------vvvvvv
159
162
calendar.setfirstweekday(calendar.MONDAY)
161
def cliprgb(r,g,b): # don't use 255!
164
def cliprgb(r, g, b):
165
""" clip r,g,b values into range 0..254 """
167
""" clip x value into range 0..254 """
173
return clip(r), clip(g), clip(b)
170
175
def yearmonthplusoffset(year, month, offset):
176
""" calculate new year/month from year/month and offset """
172
178
# handle offset and under/overflows - quick and dirty, yes!
176
182
while month > 12:
179
185
return year, month
181
def parseargs(args, defpagename, defyear, defmonth, defoffset, defoffset2, defheight6, defanniversary, deftemplate):
182
strpagename = args.group('basepage')
184
parmpagename = wikiutil.unquoteWikiname(strpagename)
186
parmpagename = defpagename
187
def parseargs(request, args, defpagename, defyear, defmonth, defoffset, defoffset2, defheight6, defanniversary, deftemplate):
188
""" parse macro arguments """
189
args = wikiutil.parse_quoted_separated(args, name_value=False)
190
args += [None] * 8 # fill up with None to trigger defaults
191
parmpagename, parmyear, parmmonth, parmoffset, parmoffset2, parmheight6, parmanniversary, parmtemplate = args[:8]
192
parmpagename = wikiutil.get_unicode(request, parmpagename, 'pagename', defpagename)
193
parmyear = wikiutil.get_int(request, parmyear, 'year', defyear)
194
parmmonth = wikiutil.get_int(request, parmmonth, 'month', defmonth)
195
parmoffset = wikiutil.get_int(request, parmoffset, 'offset', defoffset)
196
parmoffset2 = wikiutil.get_int(request, parmoffset2, 'offset2', defoffset2)
197
parmheight6 = wikiutil.get_bool(request, parmheight6, 'height6', defheight6)
198
parmanniversary = wikiutil.get_bool(request, parmanniversary, 'anniversary', defanniversary)
199
parmtemplate = wikiutil.get_unicode(request, parmtemplate, 'template', deftemplate)
187
201
# multiple pagenames separated by "*" - split into list of pagenames
188
202
parmpagename = re.split(r'\*', parmpagename)
190
stryear = args.group('year')
192
parmyear = int(stryear)
196
strmonth = args.group('month')
198
parmmonth = int(strmonth)
202
stroffset = args.group('offset')
204
parmoffset = int(stroffset)
206
parmoffset = defoffset
208
stroffset2 = args.group('offset2')
210
parmoffset2 = int(stroffset2)
212
parmoffset2 = defoffset2
214
strheight6 = args.group('height6')
216
parmheight6 = int(strheight6)
218
parmheight6 = defheight6
220
stranniversary = args.group('anniversary')
222
parmanniversary = int(stranniversary)
224
parmanniversary = defanniversary
226
strtemplate = args.group('template')
228
parmtemplate = wikiutil.unquoteWikiname(strtemplate)
230
parmtemplate = deftemplate
231
204
return parmpagename, parmyear, parmmonth, parmoffset, parmoffset2, parmheight6, parmanniversary, parmtemplate
233
# FIXME: vvvvvv is there a better way for matching a pagename ?
234
_arg_basepage = r'\s*(?P<basepage>[^, ]+)?\s*'
235
_arg_year = r',\s*(?P<year>\d+)?\s*'
236
_arg_month = r',\s*(?P<month>\d+)?\s*'
237
_arg_offset = r',\s*(?P<offset>[+-]?\d+)?\s*'
238
_arg_offset2 = r',\s*(?P<offset2>[+-]?\d+)?\s*'
239
_arg_height6 = r',\s*(?P<height6>[+-]?\d+)?\s*'
240
_arg_anniversary = r',\s*(?P<anniversary>[+-]?\d+)?\s*'
241
_arg_template = r',\s*(?P<template>[^, ]+)?\s*' # XXX see basepage comment
242
_args_re_pattern = r'^(%s)?(%s)?(%s)?(%s)?(%s)?(%s)?(%s)?(%s)?$' % \
243
(_arg_basepage,_arg_year,_arg_month, \
244
_arg_offset,_arg_offset2,_arg_height6,_arg_anniversary,_arg_template)
247
206
def execute(macro, text):
248
207
request = macro.request
253
212
if request.mode_getpagelinks:
256
args_re = re.compile(_args_re_pattern)
258
215
currentyear, currentmonth, currentday, h, m, s, wd, yd, ds = request.user.getTime(time.time())
259
216
thispage = formatter.page.page_name
260
217
# does the url have calendar params (= somebody has clicked on prev/next links in calendar) ?
261
if macro.form.has_key('calparms'):
218
if 'calparms' in macro.form:
219
has_calparms = 1 # yes!
262
220
text2 = macro.form['calparms'][0]
263
args2 = args_re.match(text2)
265
return ('<p><strong class="error">%s</strong></p>' % _('Invalid MonthCalendar calparms "%s"!')) % (text2,)
267
has_calparms = 1 # yes!
268
222
cparmpagename, cparmyear, cparmmonth, cparmoffset, cparmoffset2, cparmheight6, cparmanniversary, cparmtemplate = \
269
parseargs(args2, thispage, currentyear, currentmonth, 0, 0, 0, 0, '')
223
parseargs(request, text2, thispage, currentyear, currentmonth, 0, 0, False, False, u'')
224
except (ValueError, TypeError), err:
225
return macro.format_error(err)
273
229
if text is None: # macro call without parameters
232
# parse and check arguments
274
234
parmpagename, parmyear, parmmonth, parmoffset, parmoffset2, parmheight6, anniversary, parmtemplate = \
275
[thispage], currentyear, currentmonth, 0, 0, 0, 0, ''
277
# parse and check arguments
278
args = args_re.match(text)
280
return ('<p><strong class="error">%s</strong></p>' % _('Invalid MonthCalendar arguments "%s"!')) % (text,)
282
parmpagename, parmyear, parmmonth, parmoffset, parmoffset2, parmheight6, anniversary, parmtemplate = \
283
parseargs(args, thispage, currentyear, currentmonth, 0, 0, 0, 0, '')
235
parseargs(request, text, thispage, currentyear, currentmonth, 0, 0, False, False, u'')
236
except (ValueError, TypeError), err:
237
return macro.format_error(err)
285
239
# does url have calendar params and is THIS the right calendar to modify (we can have multiple
286
240
# calendars on the same page)?
287
241
#if has_calparms and (cparmpagename,cparmyear,cparmmonth,cparmoffset) == (parmpagename,parmyear,parmmonth,parmoffset):
289
243
# move all calendars when using the navigation:
290
244
if has_calparms and cparmpagename == parmpagename:
291
year,month = yearmonthplusoffset(parmyear, parmmonth, parmoffset + cparmoffset2)
245
year, month = yearmonthplusoffset(parmyear, parmmonth, parmoffset + cparmoffset2)
292
246
parmoffset2 = cparmoffset2
293
247
parmtemplate = cparmtemplate
295
year,month = yearmonthplusoffset(parmyear, parmmonth, parmoffset)
249
year, month = yearmonthplusoffset(parmyear, parmmonth, parmoffset)
251
if request.isSpiderAgent and abs(currentyear - year) > 1:
252
return '' # this is a bot and it didn't follow the rules (see below)
253
if currentyear == year:
256
attrs = {'rel': 'nofollow' } # otherwise even well-behaved bots will index forever
297
258
# get the calendar
298
259
monthcal = calendar.monthcalendar(year, month)
300
261
# european / US differences
301
months = ('January','February','March','April','May','June','July','August','September','October','November','December')
262
months = ('January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December')
302
263
# Set things up for Monday or Sunday as the first day of the week
303
264
if calendar.firstweekday() == calendar.MONDAY:
311
272
p = Page(request, thispage)
312
qpagenames = '*'.join(map(wikiutil.quoteWikinameURL, parmpagename))
273
qpagenames = '*'.join([wikiutil.quoteWikinameURL(pn) for pn in parmpagename])
313
274
qtemplate = wikiutil.quoteWikinameURL(parmtemplate)
314
275
querystr = "calparms=%%s,%d,%d,%d,%%d,%%s" % (parmyear, parmmonth, parmoffset)
315
prevlink = p.url(request, querystr % (qpagenames, parmoffset2 - 1, qtemplate), 0)
316
nextlink = p.url(request, querystr % (qpagenames, parmoffset2 + 1, qtemplate), 0)
317
prevylink = p.url(request, querystr % (qpagenames, parmoffset2 - 12, qtemplate), 0)
318
nextylink = p.url(request, querystr % (qpagenames, parmoffset2 + 12, qtemplate), 0)
319
prevmonth = formatter.url(1, prevlink, 'cal-link') + '<' + formatter.url(0)
320
nextmonth = formatter.url(1, nextlink, 'cal-link') + '>' + formatter.url(0)
321
prevyear = formatter.url(1, prevylink, 'cal-link') + '<<' + formatter.url(0)
322
nextyear = formatter.url(1, nextylink, 'cal-link') + '>>' + formatter.url(0)
276
prevlink = p.url(request, querystr % (qpagenames, parmoffset2 - 1, qtemplate))
277
nextlink = p.url(request, querystr % (qpagenames, parmoffset2 + 1, qtemplate))
278
prevylink = p.url(request, querystr % (qpagenames, parmoffset2 - 12, qtemplate))
279
nextylink = p.url(request, querystr % (qpagenames, parmoffset2 + 12, qtemplate))
281
prevmonth = formatter.url(1, prevlink, 'cal-link', **attrs) + '<' + formatter.url(0)
282
nextmonth = formatter.url(1, nextlink, 'cal-link', **attrs) + '>' + formatter.url(0)
283
prevyear = formatter.url(1, prevylink, 'cal-link', **attrs) + '<<' + formatter.url(0)
284
nextyear = formatter.url(1, nextylink, 'cal-link', **attrs) + '>>' + formatter.url(0)
324
286
if parmpagename != [thispage]:
326
288
r, g, b = (255, 0, 0)
335
297
ch = parmpagename[0][st:st+chstep]
336
298
r, g, b = cliprgb(r, g, b)
337
pagelinks = pagelinks + '<a style="%s" href="%s">%s</a>' % \
338
('background-color:#%02x%02x%02x;color:#000000;text-decoration:none' % \
339
(r,g,b), Page(request, parmpagename[0]).url(request), ch)
299
link = Page(request, parmpagename[0]).link_to(request, ch,
301
style='background-color:#%02x%02x%02x;color:#000000;text-decoration:none' % (r, g, b))
302
pagelinks = pagelinks + link
340
303
r, g, b = (r, g+colorstep, b)
342
305
r, g, b = (255-colorstep, 255, 255-colorstep)
343
306
for page in parmpagename[1:]:
344
pagelinks = pagelinks + '*<a style="%s" href="%s">%s</a>' % \
345
('background-color:#%02x%02x%02x;color:#000000;text-decoration:none' % \
346
(r,g,b), Page(request, page).url(request), page)
307
link = Page(request, page).link_to(request, page,
309
style='background-color:#%02x%02x%02x;color:#000000;text-decoration:none' % (r, g, b))
310
pagelinks = pagelinks + '*' + link
347
311
showpagename = ' %s<BR>\n' % pagelinks
349
313
showpagename = ''