diff --git a/src/plugins/WebCal.py b/src/plugins/WebCal.py
index ee0c62411..d2bf34b69 100644
--- a/src/plugins/WebCal.py
+++ b/src/plugins/WebCal.py
@@ -207,6 +207,7 @@ class WebCalReport(Report):
self.encoding = menu.get_option_by_name('encoding').get_value()
self.css = menu.get_option_by_name('css').get_value()
self.country = menu.get_option_by_name('country').get_value()
+ self.start_dow = menu.get_option_by_name('start_dow').get_value()
self.year = menu.get_option_by_name('year').get_value()
self.fullyear = menu.get_option_by_name('fullyear').get_value()
self.blankyear = menu.get_option_by_name('blankyear').get_value()
@@ -395,15 +396,40 @@ class WebCalReport(Report):
'month' - month number 1, 2, .., 12
"""
- def _get_class_for_daycol(day):
- if day == 0:
+ # dow (day-of-week) uses Gramps numbering, sunday => 1, etc
+ start_dow = self.start_dow
+ col2day = [(x-1)%7+1 for x in range(start_dow, start_dow + 7)]
+
+ # Note. GrampsLocale has sunday => 1, monday => 2, etc
+ # We slice out the first empty element.
+ if cal == "yg":
+ day_names = GrampsLocale.short_days
+ else:
+ day_names = GrampsLocale.long_days
+
+ # Translate a Gramps day number into a HTMLclass
+ def get_class_for_daycol(col):
+ day = col2day[col]
+ if day == 1:
return "weekend sunday"
- elif day == 6:
+ elif day == 7:
return "weekend saturday"
return "weekday"
+ def get_name_for_daycol(col):
+ day = col2day[col]
+ return day_names[day]
+
year = self.year
+ # This calendar has first column sunday. Do not use locale!
+ calendar.setfirstweekday(_dow_gramps2iso[start_dow])
+
+ # monthinfo is filled using standard Python library calendar.monthcalendar
+ # It fills a list of 7-day-lists. The first day of the 7-day-list is
+ # determined by calendar.firstweekday
+ monthinfo = calendar.monthcalendar(year, month)
+
# Begin calendar head
title = GrampsLocale.long_months[month]
of.write('\n' % title)
@@ -413,18 +439,11 @@ class WebCalReport(Report):
of.write('
%s | \n' % title)
of.write(' \n')
- # This calendar has first column sunday. Do not use locale!
- calendar.setfirstweekday(calendar.SUNDAY)
-
# Calendar weekday names header
- if cal == "yg":
- day_names = GrampsLocale.short_days
- else:
- day_names = GrampsLocale.long_days
of.write(' \n')
for day_col in range(7):
- dayclass = _get_class_for_daycol(day_col)
- of.write(' | %s\n' % (dayclass, day_names[day_col + 1]))
+ dayclass = get_class_for_daycol(day_col)
+ of.write(' | %s\n' % (dayclass, get_name_for_daycol(day_col)))
of.write('
\n')
of.write(' \n')
@@ -433,14 +452,12 @@ class WebCalReport(Report):
# Compute the first day to display for this month.
# It can also be a day in the previous month.
+ # Count number of days in first 7-day-list of monthinfo.
current_date = datetime.date(year, month, 1) # first day of the month
- # isoweekday: 1=monday, 2=tuesday, etc
- if current_date.isoweekday() != 7: # start dow here is 7, sunday
- # Compute the sunday before this date.
- current_ord = current_date.toordinal() - current_date.isoweekday()
- else:
- # First day of the month is sunday, that's OK
- current_ord = current_date.toordinal()
+ current_ord = current_date.toordinal()
+ for i in range(7):
+ if monthinfo[0][i] == 0:
+ current_ord = current_ord - 1
# get last month's last week for previous days in the month
if month == 1:
@@ -457,15 +474,13 @@ class WebCalReport(Report):
nextmonth = calendar.monthcalendar(year, month + 1)
firstweek_nextmonth = nextmonth[0]
- # Begin calendar
- monthinfo = calendar.monthcalendar(year, month)
nweeks = len(monthinfo)
for week_row in range(0, nweeks):
week = monthinfo[week_row]
of.write(' \n' % week_row)
for day_col in range(0, 7):
- dayclass = _get_class_for_daycol(day_col)
+ dayclass = get_class_for_daycol(day_col)
day = week[day_col]
if day == 0: # a day in the previous or in the next month
@@ -1184,10 +1199,8 @@ class WebCalOptions(MenuReportOptions):
menu.add_option(category_name, "ext", ext)
cright = EnumeratedListOption(_('Copyright'), 0 )
- index = 0
- for copt in _COPY_OPTIONS:
+ for index, copt in enumerate(_COPY_OPTIONS):
cright.add_item(index, copt)
- index += 1
cright.set_help( _("The copyright to be used for the web files"))
menu.add_option(category_name, "cright", cright)
@@ -1223,14 +1236,19 @@ class WebCalOptions(MenuReportOptions):
menu.add_option(category_name, 'blankyear', blankyear)
country = EnumeratedListOption(_('Country for holidays'), 0 )
- index = 0
- for item in _COUNTRIES:
+ for index, item in enumerate(_COUNTRIES):
country.add_item(index, item)
- index += 1
country.set_help( _("Holidays will be included for the selected "
"country"))
menu.add_option(category_name, "country", country)
+ # Default selection ????
+ start_dow = EnumeratedListOption(_("First day of week"), 1)
+ for count in range(1, 8):
+ start_dow.add_item(count, GrampsLocale.long_days[count].capitalize())
+ start_dow.set_help(_("Select the first day of the week for the calendar"))
+ menu.add_option(category_name, "start_dow", start_dow)
+
home_link = StringOption(_('Home link'), '../index.html')
home_link.set_help(_("The link to be included to direct the user to "
"the main page of the web site"))
@@ -1670,6 +1688,15 @@ def _get_dst_start_stop(year, area="us"):
stop = (year, 10, (31 - (math.floor(year * 5 / 4) + 1) % 7)) # Oct
return start, stop
+# Simple utility list to convert Gramps day-of-week numbering to calendar.firstweekday numbering
+_dow_gramps2iso = [ -1, calendar.SUNDAY, calendar.MONDAY, calendar.TUESDAY, calendar.WEDNESDAY, calendar.THURSDAY, calendar.FRIDAY, calendar.SATURDAY ]
+
+def _gramps2iso(dow):
+ """ Convert GRAMPS day of week to ISO day of week """
+ # GRAMPS: SUN = 1
+ # ISO: MON = 1
+ return (dow + 5) % 7 + 1
+
#-------------------------------------------------------------------------
#
#