Move some functions outside the class.

Eliminate return value of six_weeks() and calender_build().
_easter() now gets the year as argument.
Note. There is still an off-by-one error with the days.
        * src/plugins/WebCal.py


svn: r10947
This commit is contained in:
Kees Bakker 2008-07-29 21:23:44 +00:00
parent b677214dac
commit 8c2dc12d62

View File

@ -76,7 +76,6 @@ log = logging.getLogger(".WebPage")
#------------------------------------------------------------------------
import gen.lib
import const
import BaseDoc
from GrampsCfg import get_researcher
from PluginUtils import PluginManager
from ReportBase import (Report, ReportUtils, MenuReportOptions, CATEGORY_WEB,
@ -262,31 +261,6 @@ class WebCalReport(Report):
"web pages."))
self.warn_dir = False
# code snippets for Easter and Daylight saving start/ stop
# are borrowed from Calendar.py
def easter(self):
"""
Computes the year/month/day of easter. Based on work by
J.-M. Oudin (1940) and is reprinted in the "Explanatory Supplement
to the Astronomical Almanac", ed. P. K. Seidelmann (1992). Note:
Ash Wednesday is 46 days before Easter Sunday.
"""
year = self.year
c = year / 100
n = year - 19 * (year / 19)
k = (c - 17) / 25
i = c - c / 4 - (c - k) / 3 + 19 * n + 15
i = i - 30 * (i / 30)
i = i - (i / 28) * (1 - (i / 28) * (29 / (i + 1))
* ((21 - n) / 11))
j = year + year / 4 + i + 2 - c + c / 4
j = j - 7 * (j / 7)
l = i - j
month = 3 + (l + 40) / 44
day = l + 28 - 31 * (month / 4)
return (year, month, day)
def dst(self, area="us"):
"""
Return Daylight Saving Time start/stop in a given area ("us", "eu").
@ -305,35 +279,6 @@ class WebCalReport(Report):
stop = (year, 10, (31 - (math.floor(year * 5 / 4) + 1) % 7)) # Oct
return (start, stop)
def get_short_name(self, person, maiden_name = None):
""" Return person's name, unless maiden_name given, unless married_name listed. """
# Get all of a person's names:
primary_name = person.get_primary_name()
married_name = None
names = [primary_name] + person.get_alternate_names()
for n in names:
if int(n.get_type()) == gen.lib.NameType.MARRIED:
married_name = n
# Now, decide which to use:
if maiden_name is not None:
if married_name is not None:
first_name, family_name = married_name.get_first_name(), married_name.get_surname()
call_name = married_name.get_call_name()
else:
first_name, family_name = primary_name.get_first_name(), maiden_name
call_name = primary_name.get_call_name()
else:
first_name, family_name = primary_name.get_first_name(), primary_name.get_surname()
call_name = primary_name.get_call_name()
# If they have a nickname use it
if call_name is not None and call_name.strip() != "":
first_name = call_name.strip()
else: # else just get the first name:
first_name = first_name.strip()
if " " in first_name:
first_name, rest = first_name.split(" ", 1) # just one split max
return ("%s %s" % (first_name, family_name)).strip()
def add_day_item(self, text, year, month, day):
month_dict = self.calendar.get(month, {})
day_list = month_dict.get(day, [])
@ -349,7 +294,6 @@ class WebCalReport(Report):
User directory is first choice if it exists, and does not use both holiday files any longer
"""
year = self.year
holiday_file = 'holidays.xml'
holiday_full_path = ""
fname1 = os.path.join(const.USER_PLUGINS, holiday_file)
@ -373,7 +317,7 @@ class WebCalReport(Report):
holidays = mycalendar.check_date( date )
for text in holidays:
if text == "Easter":
date1 = self.easter()
date1 = _easter(year)
self.add_day_item(text, date1[0], date1[1], date1[2])
elif text == "Daylight Saving begins":
if Utils.xml_lang() == "en-US":
@ -442,17 +386,14 @@ class WebCalReport(Report):
else:
url = _subdirs("wc", new_dir, url_fname)
url += self.ext
self.display_nav_link(of, url, nav_text, currentsection)
def display_nav_link(self, of, url, title, currentsection):
# Figure out if we need <li id="CurrentSection"> of just plain <li>
# Figure out if we need <li id="CurrentSection"> or just plain <li>
cs = False
if title == currentsection:
if nav_text == currentsection:
cs = True
cs = cs and ' id="CurrentSection"' or ''
of.write(' <li%s><a href="%s">%s</a></li>\n'
% (cs, url, title))
of.write(' <li%s><a href="%s">%s</a></li>\n' % (cs, url, nav_text))
def calendar_build(self, of, cal, month):
"""
@ -553,8 +494,8 @@ class WebCalReport(Report):
of.write(' <td id="day%d" ' % day)
thisday = current_date.fromordinal(current_ord)
if thisday.month == month: # Something this month
list_ = self.calendar.get(month, {}).get(thisday.day, {})
if ((thisday.day == day) and (list_ > [])):
list_ = self.calendar.get(month, {}).get(thisday.day, [])
if list_ > []:
specclass = "highlight " + dayclass
of.write('class="%s">\n' % specclass)
if cal == "yg": # Year at a Glance
@ -565,13 +506,13 @@ class WebCalReport(Report):
of.write(' <div class="date">%d'
'</div></a>\n' % day)
self.indiv_date(month, day, list_)
else: # WebCal
else:
# WebCal
of.write(' <div class="date">%d'
'</div>\n' % day)
of.write(' <ul>\n')
for p in list_:
lines = p.count("\n") + 1 # lines in the text
for line in p.split("\n"):
for line in p.splitlines():
of.write(' <li>')
of.write(line)
of.write('</li>\n')
@ -588,9 +529,7 @@ class WebCalReport(Report):
of.write(' </tr>\n')
# Complete six weeks for proper styling
of = self.six_weeks(of, nweeks)
return of
self.six_weeks(of, nweeks)
def write_header(self, of, title, cal, mystyle):
"""
@ -777,8 +716,7 @@ class WebCalReport(Report):
else:
ip.write(' <ul>\n')
for p in list_:
lines = p.count("\n") + 1 # lines in the text
for line in p.split("\n"):
for line in p.splitlines():
ip.write(' <li>')
ip.write(line)
ip.write('</li>\n')
@ -804,7 +742,6 @@ class WebCalReport(Report):
of.write(' <td id="emptyDays" colspan="7">\n')
of.write(' </td>\n')
of.write(' </tr>\n')
return of
def blank_year(self):
"""
@ -874,7 +811,7 @@ class WebCalReport(Report):
self.progress.step()
# build the calendar
by = self.calendar_build(by, "by", month)
self.calendar_build(by, "by", month)
# close table body
by.write(' </tbody>\n')
@ -978,7 +915,7 @@ class WebCalReport(Report):
self.progress.step()
# build the calendar
yg = self.calendar_build(yg, "yg", month)
self.calendar_build(yg, "yg", month)
# close table body before writing note
@ -1115,7 +1052,7 @@ class WebCalReport(Report):
# European calendar starts on Monday, default
# build the calendar
of = self.calendar_build(of, "wc", month)
self.calendar_build(of, "wc", month)
# close table body before note section
of.write(' </tbody>\n')
@ -1152,6 +1089,7 @@ class WebCalReport(Report):
birth_event = self.database.get_event_from_handle(birth_ref.ref)
birth_date = birth_event.get_date_object()
living = probably_alive(person, self.database, make_date(self.year, 1, 1), 0)
if self.birthday and birth_date != None and ((self.alive and living) or not self.alive):
year = birth_date.get_year()
month = birth_date.get_month()
@ -1172,7 +1110,7 @@ class WebCalReport(Report):
father = self.database.get_person_from_handle(father_handle)
if father != None:
father_lastname = father.get_primary_name().get_surname()
short_name = self.get_short_name(person, father_lastname)
short_name = _get_short_name(person, father_lastname)
if age == 0: # person is 0 years old, display nothing
text = ""
elif age == 1: # person is 1, and therefore display it correctly
@ -1181,6 +1119,7 @@ class WebCalReport(Report):
else:
text = '%s, <em>%d</em> years old' % (short_name, age)
self.add_day_item(text, year, month, day)
if self.anniv and ((self.alive and living) or not self.alive):
family_list = person.get_family_handle_list()
for fhandle in family_list:
@ -1194,8 +1133,8 @@ class WebCalReport(Report):
if spouse_handle:
spouse = self.database.get_person_from_handle(spouse_handle)
if spouse:
spouse_name = self.get_short_name(spouse)
short_name = self.get_short_name(person)
spouse_name = _get_short_name(spouse)
short_name = _get_short_name(person)
if self.alive:
if not probably_alive(spouse, self.database, make_date(self.year, 1, 1), 0):
continue
@ -1705,6 +1644,62 @@ def _get_countries():
# doesn't take so long to start up.
_COUNTRIES = _get_countries()
# code snippets for Easter and Daylight saving start/ stop
# are borrowed from Calendar.py
def _easter(year):
"""
Computes the year/month/day of easter. Based on work by
J.-M. Oudin (1940) and is reprinted in the "Explanatory Supplement
to the Astronomical Almanac", ed. P. K. Seidelmann (1992). Note:
Ash Wednesday is 46 days before Easter Sunday.
"""
c = year / 100
n = year - 19 * (year / 19)
k = (c - 17) / 25
i = c - c / 4 - (c - k) / 3 + 19 * n + 15
i = i - 30 * (i / 30)
i = i - (i / 28) * (1 - (i / 28) * (29 / (i + 1)) * ((21 - n) / 11))
j = year + year / 4 + i + 2 - c + c / 4
j = j - 7 * (j / 7)
l = i - j
month = 3 + (l + 40) / 44
day = l + 28 - 31 * (month / 4)
return year, month, day
# FIXME. Missing name prefix, suffix etc.
def _get_short_name(person, maiden_name = None):
""" Return person's name, unless maiden_name given, unless married_name listed. """
# Get all of a person's names:
primary_name = person.get_primary_name()
married_name = None
names = [primary_name] + person.get_alternate_names()
for n in names:
if int(n.get_type()) == gen.lib.NameType.MARRIED:
married_name = n
# Now, decide which to use:
if maiden_name is not None:
if married_name is not None:
first_name, family_name = married_name.get_first_name(), married_name.get_surname()
call_name = married_name.get_call_name()
else:
first_name, family_name = primary_name.get_first_name(), maiden_name
call_name = primary_name.get_call_name()
else:
first_name, family_name = primary_name.get_first_name(), primary_name.get_surname()
call_name = primary_name.get_call_name()
# If they have a nickname use it
if call_name is not None and call_name.strip() != "":
first_name = call_name.strip()
else: # else just get the first name:
first_name = first_name.strip()
if " " in first_name:
first_name, rest = first_name.split(" ", 1) # just one split max
return ("%s %s" % (first_name, family_name)).strip()
#-------------------------------------------------------------------------
#
#