Family Tree Maker style ancestor report

svn: r1487
This commit is contained in:
Don Allingham 2003-05-02 02:49:34 +00:00
parent 3afae5df31
commit 960e030100
4 changed files with 910 additions and 24 deletions

9
TODO
View File

@ -7,10 +7,6 @@
* Provide an "import" of a gramps package. Not too difficult to do this, * Provide an "import" of a gramps package. Not too difficult to do this,
since there is already a ReadTarFile class which will unpackage the since there is already a ReadTarFile class which will unpackage the
file. Needs have an interface built around it. file. Needs have an interface built around it.
* Catch uncaught exceptions at the top level, notifiy the user, and
store the results in a file that can be emailed. Have the start of
this with the gramps.err file, but most users don't realize that
this file has been created. Some type of notification is needed.
* Speed up the reading of the database. The python XML routines are not * Speed up the reading of the database. The python XML routines are not
as fast as I would like, and it can take a minute or so to read a as fast as I would like, and it can take a minute or so to read a
large database. This is way too slow. large database. This is way too slow.
@ -22,10 +18,5 @@
* Disable the save buttons if gramps database is marked read-only. Disable * Disable the save buttons if gramps database is marked read-only. Disable
the adding of media objects as well, since this will cause gramps to the adding of media objects as well, since this will cause gramps to
try to create a thumbnail in a readonly database. try to create a thumbnail in a readonly database.
* OpenOffice zip file is not handled very gracefully. Uses the "system"
call to generate the zip file using the hard coded path of /usr/bin/zip.
Python 2.0 provides a zip interface, so this may need to hold off until
the move is made to Python 2.0.
* Sort all lists
* Startup tips. * Startup tips.
* And a whole lot more.... * And a whole lot more....

View File

@ -64,7 +64,7 @@ class AbiWordDoc(TextDoc.TextDoc):
self.filename = filename self.filename = filename
self.f = open(self.filename,"w") self.f = open(self.filename,"w")
self.f.write('<?xml version="1.0" encoding="ISO-8859-1"?>\n') self.f.write('<?xml version="1.0"?>\n')
self.f.write('<!DOCTYPE abiword PUBLIC "-//ABISOURCE//DTD AWML') self.f.write('<!DOCTYPE abiword PUBLIC "-//ABISOURCE//DTD AWML')
self.f.write('1.0 Strict//EN" "http://www.abisource.com/awml.dtd">\n') self.f.write('1.0 Strict//EN" "http://www.abisource.com/awml.dtd">\n')
self.f.write('<abiword xmlns:awml="http://www.abisource.com/awml.dtd" ') self.f.write('<abiword xmlns:awml="http://www.abisource.com/awml.dtd" ')
@ -132,6 +132,13 @@ class AbiWordDoc(TextDoc.TextDoc):
self.f.write('" props="width:%.3fin; ' % act_width) self.f.write('" props="width:%.3fin; ' % act_width)
self.f.write('height:%.3fin"/>' % act_height) self.f.write('height:%.3fin"/>' % act_height)
def start_superscript(self):
fsize = self.my_para.get_font().get_size()
self.text = self.text + '<c props="text-position:superscript">'
def end_superscript(self):
self.text = self.text + '</c>'
def start_paragraph(self,style_name,leader=None): def start_paragraph(self,style_name,leader=None):
if self.in_table: if self.in_table:
self.start_paragraph_intable(style_name,leader) self.start_paragraph_intable(style_name,leader)
@ -142,6 +149,8 @@ class AbiWordDoc(TextDoc.TextDoc):
style = self.style_list[style_name] style = self.style_list[style_name]
self.current_style = style self.current_style = style
self.f.write('<p props="') self.f.write('<p props="')
self.f.write('margin-top:%.4fin; ' % (float(style.get_padding())/2.54))
self.f.write('margin-bottom:%.4fin; ' % (float(style.get_padding())/2.54))
if style.get_alignment() == TextDoc.PARA_ALIGN_RIGHT: if style.get_alignment() == TextDoc.PARA_ALIGN_RIGHT:
self.f.write('text-align:right;') self.f.write('text-align:right;')
elif style.get_alignment() == TextDoc.PARA_ALIGN_LEFT: elif style.get_alignment() == TextDoc.PARA_ALIGN_LEFT:
@ -216,9 +225,11 @@ class AbiWordDoc(TextDoc.TextDoc):
self.f.write('</c></p>\n') self.f.write('</c></p>\n')
def write_text(self,text): def write_text(self,text):
text = string.replace(text,'&','&amp;'); # Must be first text = text.replace('&','&amp;'); # Must be first
text = string.replace(text,'<','&lt;'); text = text.replace('<','&lt;');
text = string.replace(text,'>','&gt;'); text = text.replace('>','&gt;');
text = text.replace('&lt;super&gt;','<c props="text-position:superscript">')
text = text.replace('&lt;/super&gt;','</c>')
if self.in_table: if self.in_table:
self.cdata = self.cdata + text self.cdata = self.cdata + text
else: else:

View File

@ -141,8 +141,8 @@ class PdfDoc(TextDoc.TextDoc):
pdf_style.alignment = TA_CENTER pdf_style.alignment = TA_CENTER
else: else:
pdf_style.alignment = TA_JUSTIFY pdf_style.alignment = TA_JUSTIFY
pdf_style.spaceBefore = style.get_padding() pdf_style.spaceBefore = style.get_padding()*cm
pdf_style.spaceAfter = style.get_padding() pdf_style.spaceAfter = style.get_padding()*cm
pdf_style.textColor = make_color(font.get_color()) pdf_style.textColor = make_color(font.get_color())
self.pdfstyles[style_name] = pdf_style self.pdfstyles[style_name] = pdf_style
@ -158,6 +158,7 @@ class PdfDoc(TextDoc.TextDoc):
def start_paragraph(self,style_name,leader=None): def start_paragraph(self,style_name,leader=None):
self.current_para = self.pdfstyles[style_name] self.current_para = self.pdfstyles[style_name]
self.my_para = self.style_list[style_name] self.my_para = self.style_list[style_name]
self.super = "<font size=%d><super>" % (self.my_para.get_font().get_size()-2)
if leader==None: if leader==None:
self.text = '' self.text = ''
else: else:
@ -167,7 +168,6 @@ class PdfDoc(TextDoc.TextDoc):
def end_paragraph(self): def end_paragraph(self):
if self.in_table == 0 and self.image == 0: if self.in_table == 0 and self.image == 0:
self.story.append(Paragraph(self.text,self.current_para)) self.story.append(Paragraph(self.text,self.current_para))
self.story.append(Spacer(1,0.5*cm))
else: else:
self.image = 0 self.image = 0
@ -178,10 +178,11 @@ class PdfDoc(TextDoc.TextDoc):
self.text = self.text + '</b>' self.text = self.text + '</b>'
def start_superscript(self): def start_superscript(self):
self.text = self.text + '<super>' fsize = self.my_para.get_font().get_size()
self.text = self.text + '<font size=%d><super>' % (fsize-2)
def end_superscript(self): def end_superscript(self):
self.text = self.text + '</super>' self.text = self.text + '</super></font>'
def start_table(self,name,style_name): def start_table(self,name,style_name):
self.in_table = 1 self.in_table = 1
@ -283,12 +284,12 @@ class PdfDoc(TextDoc.TextDoc):
self.image = 1 self.image = 1
def write_text(self,text): def write_text(self,text):
text = text.replace('&','&amp;'); # Must be first text = text.replace('&','&amp;') # Must be first
text = text.replace('<','&lt;'); text = text.replace('<','&lt;')
text = text.replace('>','&gt;'); text = text.replace('>','&gt;')
text = text.replace('&lt;super&gt;','<super>'); text = text.replace('&lt;super&gt;',self.super)
text = text.replace('&lt;/super&gt;','</super>'); text = text.replace('&lt;/super&gt;','</super></font>')
self.text = self.text + text.replace('\n','<br>'); self.text = self.text + text.replace('\n','<br>')
#------------------------------------------------------------------------ #------------------------------------------------------------------------
# #

View File

@ -0,0 +1,883 @@
#
# Gramps - a GTK+/GNOME based genealogy program
#
# Copyright (C) 2003 Donald N. Allingham
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#
#------------------------------------------------------------------------
#
# python modules
#
#------------------------------------------------------------------------
import os
import string
import cStringIO
#------------------------------------------------------------------------
#
# gramps modules
#
#------------------------------------------------------------------------
import Report
import TextDoc
import RelLib
import Errors
from QuestionDialog import ErrorDialog
from intl import gettext as _
#------------------------------------------------------------------------
#
# AncestorReport
#
#------------------------------------------------------------------------
class FtmAncestorReport(Report.Report):
def __init__(self,database,person,output,max,doc,pgbrk):
self.map = {}
self.database = database
self.start = person
self.max_generations = max
self.pgbrk = pgbrk
self.doc = doc
self.doc.open(output)
self.sref_map = {}
self.sref_index = 1
def apply_filter(self,person,index,generation=1):
if person == None or index >= (1 << 30):
return
self.map[index] = (person,generation)
family = person.getMainParents()
if family != None:
self.apply_filter(family.getFather(),index*2,generation+1)
self.apply_filter(family.getMother(),(index*2)+1,generation+1)
def write_report(self):
self.apply_filter(self.start,1)
name = self.start.getPrimaryName().getRegularName()
self.doc.start_paragraph("Title")
title = _("Ancestors of %s") % name
self.doc.write_text(title)
self.doc.end_paragraph()
keys = self.map.keys()
keys.sort()
old_gen = 0
for key in keys :
(person,generation) = self.map[key]
if old_gen != generation:
if self.pgbrk and generation > 0:
self.doc.page_break()
self.doc.start_paragraph("Generation")
t = _("Generation No. %d") % generation
self.doc.write_text(t)
self.doc.end_paragraph()
old_gen = generation
pri_name = person.getPrimaryName()
self.doc.start_paragraph("Entry","%d." % key)
name = pri_name.getRegularName()
self.doc.start_bold()
self.doc.write_text(name)
self.doc.end_bold()
# add source information here
self.doc.write_text(self.endnotes(pri_name))
# Check birth record
birth = person.getBirth()
death = person.getDeath()
birth_valid = birth.getDate() != "" or birth.getPlaceName() != ""
death_valid = death.getDate() != "" or death.getPlaceName() != ""
if birth_valid or death_valid:
self.doc.write_text(', ')
else:
self.doc.write_text('.')
if birth_valid:
date = birth.getDateObj().get_start_date()
place = birth.getPlaceName()
if place[-1:] == '.':
place = place[:-1]
if date.getDate() != "":
if place != "":
t = _("born %(date)s in %(place)s%(endnotes)s") % {
'date' : date.getDate(),
'place' : place,
'endnotes' : self.endnotes(birth),
}
else:
t = _("born %(date)s%(endnotes)s") % {
'date' : date.getDate(),
'endnotes' : self.endnotes(birth),
}
else:
if place != "":
t = _("born in %(place)s%(endnotes)s") % {
'place' : place,
'endnotes' : self.endnotes(birth),
}
else:
t = ''
self.doc.write_text(t)
if death_valid:
self.doc.write_text('; ')
else:
self.doc.write_text('. ')
if death_valid:
date = death.getDateObj().get_start_date()
place = death.getPlaceName()
if place[-1:] == '.':
place = place[:-1]
if date.getDate() != "":
if place != "":
t = _("died %(date)s in %(place)s%(endnotes)s.") % {
'date' : date.getDate(),
'place' : place,
'endnotes' : self.endnotes(death),
}
else:
t = _("died %(date)s%(endnotes)s.") % {
'date' : date.getDate(),
'endnotes' : self.endnotes(death),
}
else:
if place != "":
t = _("died in %(place)s%(endnotes)s.") % {
'place' : place,
'endnotes' : self.endnotes(death),
}
else:
t = '.'
self.doc.write_text(t + ' ')
self.print_parents(person,death_valid)
self.print_spouse(person)
self.doc.end_paragraph()
self.print_notes(person)
self.print_more_about(person)
self.write_endnotes()
self.doc.close()
def write_endnotes(self):
keys = self.sref_map.keys()
if not keys:
return
self.doc.start_paragraph('Generation')
self.doc.write_text('Endnotes')
self.doc.end_paragraph()
keys.sort()
for key in keys:
srcref = self.sref_map[key]
base = srcref.getBase()
self.doc.start_paragraph('Endnotes',"%d." % key)
self.doc.write_text(base.getTitle())
for item in [ base.getAuthor(), base.getPubInfo(), base.getCallNumber(),
srcref.getDate().getDate(),]:
if item:
self.doc.write_text('; %s' % item)
item = srcref.getText()
if item:
self.doc.write_text('; ')
self.doc.write_text(_('Text:'))
self.doc.write_text(' ')
self.doc.write_text(item)
item = srcref.getComments()
if item:
self.doc.write_text('; ')
self.doc.write_text(_('Comments:'))
self.doc.write_text(' ')
self.doc.write_text(item)
self.doc.write_text('.')
self.doc.end_paragraph()
def endnotes(self,obj):
msg = cStringIO.StringIO()
slist = obj.getSourceRefList()
if slist:
msg.write('<super>')
first = 0
for ref in slist:
if first == 1:
msg.write(',')
msg.write("%d" % self.sref_index)
self.sref_map[self.sref_index] = ref
self.sref_index += 1
msg.write('</super>')
str = msg.getvalue()
msg.close()
return str
def print_notes(self,person):
note = person.getNote()
if not note.strip():
return
self.doc.start_paragraph('SubEntry')
self.doc.write_text(_('Notes for %(person)s:') % { 'person' : person.getPrimaryName().getName()} )
self.doc.end_paragraph()
for line in note.split('\n'):
self.doc.start_paragraph('Details')
self.doc.write_text(line.strip())
self.doc.end_paragraph()
def print_more_about(self,person):
first = 1
ncount = 0
for name in person.getAlternateNames():
if first:
self.doc.start_paragraph('SubEntry')
self.doc.write_text(_('More about %(person_name)s:') % { 'person_name' : name })
self.doc.end_paragraph()
first = 0
self.doc.start_paragraph('Details')
self.doc.write_text(_('Name %(count)d: %(name)s%(endnotes)s') % {
'count' : ncount, 'name' : name.getRegularName(),
'endnotes' : self.endnotes(name),
})
self.doc.end_paragraph()
ncount += 1
for event in person.getEventList():
date = event.getDate()
place = event.getPlace()
if not date and not place:
continue
if first:
self.doc.start_paragraph('SubEntry')
name = person.getPrimaryName().getName()
self.doc.write_text(_('More about %(person_name)s:') % { 'person_name' : name })
self.doc.end_paragraph()
first = 0
self.doc.start_paragraph('Details')
if date and place:
self.doc.write_text(_('%(event_name)s: %(date)s, %(place)s%(endnotes)s') % {
'event_name' : event.getName(),
'date' : event.getDate(),
'endnotes' : self.endnotes(event),
'place' : event.getPlaceName() })
elif date:
self.doc.write_text(_('%(event_name)s: %(date)s%(endnotes)s') % {
'event_name' : event.getName(),
'endnotes' : self.endnotes(event),
'date' : event.getDate()})
else:
self.doc.write_text(_('%(event_name)s: %(place)s%(endnotes)s') % {
'event_name' : event.getName(),
'place' : event.getPlaceName() })
self.doc.end_paragraph()
def print_spouse(self,person):
family_list = person.getFamilyList()
if not family_list:
return
family = family_list[0]
if family.getFather() == person:
spouse = family.getMother()
else:
spouse = family.getFather()
if not spouse:
return
event = family.getMarriage()
if not event:
return
date = event.getDate()
place = event.getPlaceName()
if date and place:
if person.getGender() == RelLib.Person.male:
self.doc.write_text(_('He married %(spouse)s %(date)s in %(place)s%(endnotes)s.') % {
'spouse' : spouse.getPrimaryName().getRegularName(),
'endnotes' : self.endnotes(event),
'date' : date,
'place' : place})
else:
self.doc.write_text(_('She married %(spouse)s %(date)s in %(place)s%(endnotes)s.') % {
'spouse' : spouse.getPrimaryName().getRegularName(),
'date' : date,
'endnotes' : self.endnotes(event),
'place' : place})
elif date:
if person.getGender() == RelLib.Person.male:
self.doc.write_text(_('He married %(spouse)s %(date)s%(endnotes)s.') % {
'spouse' : spouse.getPrimaryName().getRegularName(),
'endnotes' : self.endnotes(event),
'date' : date,})
else:
self.doc.write_text(_('She married %(spouse)s in %(place)s%(endnotes)s.') % {
'spouse' : spouse.getPrimaryName().getRegularName(),
'endnotes' : self.endnotes(event),
'place' : place,})
elif place:
if person.getGender() == RelLib.Person.male:
self.doc.write_text(_('He married %(spouse)s in %(place)s%(endnotes)s.') % {
'spouse' : spouse.getPrimaryName().getRegularName(),
'endnotes' : self.endnotes(event),
'place' : place})
else:
self.doc.write_text(_('She married %(spouse)s in %(place)s%(endnotes)s.') % {
'spouse' : spouse.getPrimaryName().getRegularName(),
'endnotes' : self.endnotes(event),
'place' : place})
else:
if person.getGender() == RelLib.Person.male:
self.doc.write_text(_('He married %(spouse)s%(endnotes)s.') % {
'spouse' : spouse.getPrimaryName().getRegularName(),
'endnotes' : self.endnotes(event),
})
else:
self.doc.write_text(_('She married %(spouse)s%(endnotes)s ') % {
'spouse' : spouse.getPrimaryName().getRegularName(),})
self.doc.write_text(' ')
death = spouse.getDeath()
dplace = death.getPlaceName()
ddate = death.getDate()
birth = spouse.getBirth()
bplace = birth.getPlaceName()
bdate = birth.getDate()
death_valid = ddate != "" or dplace != ""
birth_valid = bdate != "" or bplace != ""
if birth_valid and death_valid:
if person.getGender() == RelLib.Person.male:
if bdate:
if bplace:
if ddate:
if dplace:
self.doc.write_text(_("He was born %(birth_date)s in %(birth_place)s"
"%(birth_endnotes)s, "
"and died %(death_date)s in %(death_place)s"
"%(death_endnotes)s.") % {
'birth_date' : bdate, 'birth_place' : bplace,
'death_date' : ddate,'death_place' : dplace,
'birth_endnotes' : self.endnotes(birth),
'death_endnotes' : self.endnotes(death),
})
else:
self.doc.write_text(_("He was born %(birth_date)s in %(birth_place)s"
"%(birth_endnotes)s, "
"and died %(death_date)s%(death_endnotes)s.") % {
'birth_date' : bdate, 'birth_place' : bplace,
'death_date' : ddate,
'birth_endnotes' : self.endnotes(birth),
'death_endnotes' : self.endnotes(death),
})
else:
if dplace:
self.doc.write_text(_("He was born %(birth_date)s in %(birth_place)s"
"%(birth_endnotes)s, "
"and died in %(death_place)s%(death_endnotes)s.") % {
'birth_date' : bdate, 'birth_place' : bplace,
'birth_endnotes' : self.endnotes(birth),
'death_endnotes' : self.endnotes(death),
'death_place' : dplace,
})
else:
self.doc.write_text(_("He was born %(birth_date)s in "
"%(birth_place)s%(birth_endnotes)s. ") % {
'birth_date' : bdate, 'birth_place' : bplace,
'birth_endnotes' : self.endnotes(birth),
})
else:
if ddate:
if dplace:
self.doc.write_text(_("He was born %(birth_date)s%(birth_endnotes)s, "
"and died %(death_date)s in %(death_place)s"
"%(death_endnotes)s.") % {
'birth_date' : bdate, 'death_date' : ddate,
'death_place' : dplace,
'birth_endnotes' : self.endnotes(birth),
'death_endnotes' : self.endnotes(death),
})
else:
self.doc.write_text(_("He was born %(birth_date)s%(birth_endnotes)s, "
"and died %(death_date)s%(death_endnotes)s.") % {
'birth_date' : bdate, 'death_date' : ddate,
'birth_endnotes' : self.endnotes(birth),
'death_endnotes' : self.endnotes(death),
})
else:
if dplace:
self.doc.write_text(_("He was born %(birth_date)s%(birth_endnotes)s, "
"and died in %(death_place)s%(death_endnotes)s.") % {
'birth_date' : bdate, 'death_place' : dplace,
'birth_endnotes' : self.endnotes(birth),
'death_endnotes' : self.endnotes(death),
})
else:
self.doc.write_text(_("He was born %(birth_date)s%(birth_endnotes)s. ") % {
'birth_date' : bdate,
'birth_endnotes' : self.endnotes(birth),
})
else:
if bplace:
if ddate:
if dplace:
self.doc.write_text(_("He was born in %(birth_place)s%(birth_endnotes)s, "
"and died %(death_date)s in %(death_place)s"
"%(death_endnotes)s.") % {
'birth_place' : bplace, 'death_date' : ddate, 'death_place' : dplace,
'birth_endnotes' : self.endnotes(birth),
'death_endnotes' : self.endnotes(death),
})
else:
self.doc.write_text(_("He was born in %(birth_place)s%(birth_endnotes)s, "
"and died %(death_date)s$(death_endnotes)s.") % {
'birth_endnotes' : self.endnotes(birth),
'death_endnotes' : self.endnotes(death),
'birth_place' : bplace, 'death_date' : ddate,
})
else:
if dplace:
self.doc.write_text(_("He was born in %(birth_place)s%(birth_endnotes)s, "
"and died in %(death_place)s%(death_endnotes)s.") % {
'birth_place' : bplace,'death_place' : dplace,
'birth_endnotes' : self.endnotes(birth),
'death_endnotes' : self.endnotes(death),
})
else:
self.doc.write_text(_("He was born in %(birth_place)s%(birth_endnotes)s. ") % {
'birth_place' : bplace,
'birth_endnotes' : self.endnotes(birth),
})
else:
if ddate:
if dplace:
self.doc.write_text(_("He died %(death_date)s in "
"%(death_place)s%(death_endnotes)s.") % {
'death_date' : ddate, 'death_place' : dplace,
'death_endnotes' : self.endnotes(death),
})
else:
self.doc.write_text(_("He died %(death_date)s%(death_endnotes)s.") % {
'death_date' : ddate,
'death_endnotes' : self.endnotes(death),
})
else:
if dplace:
self.doc.write_text(_("He died in %(death_place)s%(death_endnotes)s.") % {
'death_endnotes' : self.endnotes(death),
'death_place' : dplace,
})
else:
if bdate:
if bplace:
if ddate:
if dplace:
self.doc.write_text(_("She was born %(birth_date)s in %(birth_place)s"
"%(birth_endnotes)s, "
"and died %(death_date)s in %(death_place)s"
"%(death_endnotes)s.") % {
'birth_date' : bdate, 'birth_place' : bplace,
'death_date' : ddate,'death_place' : dplace,
'birth_endnotes' : self.endnotes(birth),
'death_endnotes' : self.endnotes(death),
})
else:
self.doc.write_text(_("She was born %(birth_date)s in %(birth_place)s"
"%(birth_endnotes)s, "
"and died %(death_date)s%(death_endnotes)s.") % {
'birth_date' : bdate, 'birth_place' : bplace,
'birth_endnotes' : self.endnotes(birth),
'death_endnotes' : self.endnotes(death),
'death_date' : ddate,
})
else:
if dplace:
self.doc.write_text(_("She was born %(birth_date)s in %(birth_place)s"
"%(birth_endnotes)s, "
"and died in %(death_place)s%(death_endnotes)s.") % {
'birth_date' : bdate, 'birth_place' : bplace,
'death_place' : dplace,
'birth_endnotes' : self.endnotes(birth),
'death_endnotes' : self.endnotes(death),
})
else:
self.doc.write_text(_("She was born %(birth_date)s in %(birth_place)s"
"%(birth_endnotes)s. ") % {
'birth_endnotes' : self.endnotes(birth),
'birth_date' : bdate, 'birth_place' : bplace,
})
else:
if ddate:
if dplace:
self.doc.write_text(_("She was born %(birth_date)s%(birth_endnotes)s, "
"and died %(death_date)s in %(death_place)s"
"%(death_endnotes)s.") % {
'birth_date' : bdate, 'death_date' : ddate,
'birth_endnotes' : self.endnotes(birth),
'death_endnotes' : self.endnotes(death),
'death_place' : dplace,
})
else:
self.doc.write_text(_("She was born %(birth_date)s%(birth_endnotes)s, "
"and died %(death_date)s%(death_endnotes)s.") % {
'birth_endnotes' : self.endnotes(birth),
'death_endnotes' : self.endnotes(death),
'birth_date' : bdate, 'death_date' : ddate,
})
else:
if dplace:
self.doc.write_text(_("She was born %(birth_date)s%(birth_endnotes)s, "
"and died in %(death_place)s%(death_endnotes)s.") % {
'birth_endnotes' : self.endnotes(birth),
'death_endnotes' : self.endnotes(death),
'birth_date' : bdate, 'death_place' : dplace,
})
else:
self.doc.write_text(_("She was born %(birth_date)s%(birth_endnotes)s. ") % {
'birth_endnotes' : self.endnotes(birth),
'birth_date' : bdate,
})
else:
if bplace:
if ddate:
if dplace:
self.doc.write_text(_("She was born in %(birth_place)s%(birth_endnotes)s, "
"and died %(death_date)s in %(death_place)s%(death_endnotes)s.") % {
'birth_endnotes' : self.endnotes(birth),
'death_endnotes' : self.endnotes(death),
'birth_place' : bplace, 'death_date' : ddate, 'death_place' : dplace,
})
else:
self.doc.write_text(_("She was born in %(birth_place)s%(birth_endnotes)s, "
"and died %(death_date)s%(death_endnotes)s.") % {
'birth_endnotes' : self.endnotes(birth),
'death_endnotes' : self.endnotes(death),
'birth_place' : bplace, 'death_date' : ddate,
})
else:
if dplace:
self.doc.write_text(_("She was born in %(birth_place)s%(birth_endnotes)s, "
"and died in %(death_place)s$(death_endnotes)s.") % {
'birth_endnotes' : self.endnotes(birth),
'death_endnotes' : self.endnotes(death),
'birth_place' : bplace,'death_place' : dplace,
})
else:
self.doc.write_text(_("She was born in %(birth_place)s%(birth_endnotes)s. ") % {
'birth_endnotes' : self.endnotes(birth),
'birth_place' : bplace,
})
else:
if ddate:
if dplace:
self.doc.write_text(_("She died %(death_date)s in "
"%(death_place)s%(death_endnotes)s.") % {
'death_endnotes' : self.endnotes(death),
'death_date' : ddate, 'death_place' : dplace,
})
else:
self.doc.write_text(_("She died %(death_date)s$(death_endotes)s.") % {
'death_endnotes' : self.endnotes(death),
'death_date' : ddate,
})
else:
if dplace:
self.doc.write_text(_("She died in %(death_place)s$(death_endnotes)s.") % {
'death_endnotes' : self.endnotes(death),
'birth_date' : bdate, 'death_place' : dplace,
})
self.doc.write_text(' ')
self.print_parents(spouse,death_valid)
def print_parents(self,person,dead):
family = person.getMainParents()
if family:
mother = family.getMother()
father = family.getFather()
if person.getGender() == RelLib.Person.male:
if mother and father:
if dead:
self.doc.write_text(_("He was the son of %(father)s and %(mother)s.") % {
'father' : father.getPrimaryName().getRegularName(),
'mother' : mother.getPrimaryName().getRegularName(), })
else:
self.doc.write_text(_("He is the son of %(father)s and %(mother)s.") % {
'father' : father.getPrimaryName().getRegularName(),
'mother' : mother.getPrimaryName().getRegularName(), })
elif mother:
if dead:
self.doc.write_text(_("He was the son of %(mother)s.") % {
'mother' : mother.getPrimaryName().getRegularName(), })
else:
self.doc.write_text(_("He is the son of %(mother)s.") % {
'mother' : mother.getPrimaryName().getRegularName(), })
elif father:
if dead:
self.doc.write_text(_("He was the son of %(father)s.") % {
'father' : mother.getPrimaryName().getRegularName(), })
else:
self.doc.write_text(_("He is the son of %(father)s.") % {
'father' : mother.getPrimaryName().getRegularName(), })
else:
if mother and father:
if dead:
self.doc.write_text(_("She was the daughter of %(father)s and %(mother)s.") % {
'father' : father.getPrimaryName().getRegularName(),
'mother' : mother.getPrimaryName().getRegularName(), })
else:
self.doc.write_text(_("She is the daughter of %(father)s and %(mother)s.") % {
'father' : father.getPrimaryName().getRegularName(),
'mother' : mother.getPrimaryName().getRegularName(), })
elif mother:
if dead:
self.doc.write_text(_("She was the daughter of %(mother)s.") % {
'mother' : mother.getPrimaryName().getRegularName(), })
else:
self.doc.write_text(_("She is the daughter of %(mother)s.") % {
'mother' : mother.getPrimaryName().getRegularName(), })
elif father:
if dead:
self.doc.write_text(_("She was the daughter of %(father)s.") % {
'father' : mother.getPrimaryName().getRegularName(), })
else:
self.doc.write_text(_("She is the daughter of %(father)s.") % {
'father' : mother.getPrimaryName().getRegularName(), })
self.doc.write_text(' ');
#------------------------------------------------------------------------
#
#
#
#------------------------------------------------------------------------
class FtmAncestorReportDialog(Report.TextReportDialog):
def __init__(self,database,person):
Report.TextReportDialog.__init__(self,database,person)
#------------------------------------------------------------------------
#
# Customization hooks
#
#------------------------------------------------------------------------
def get_title(self):
"""The window title for this dialog"""
return "%s - %s - GRAMPS" % (_("Ahnentafel Report"),_("Text Reports"))
def get_header(self, name):
"""The header line at the top of the dialog contents"""
return _("Ahnentafel Report for %s") % name
def get_target_browser_title(self):
"""The title of the window created when the 'browse' button is
clicked in the 'Save As' frame."""
return _("Save Ancestor Report")
def get_stylesheet_savefile(self):
"""Where to save styles for this report."""
return "ftm_ancestor_report.xml"
def make_default_style(self):
"""Make the default output style for the Ahnentafel report."""
font = TextDoc.FontStyle()
font.set(face=TextDoc.FONT_SANS_SERIF,size=16,bold=1,italic=1)
para = TextDoc.ParagraphStyle()
para.set_font(font)
para.set_header_level(1)
para.set_alignment(TextDoc.PARA_ALIGN_CENTER)
para.set(pad=0.5)
para.set_description(_('The style used for the title of the page.'))
self.default_style.add_style("Title",para)
font = TextDoc.FontStyle()
font.set(face=TextDoc.FONT_SANS_SERIF,size=14,italic=1)
para = TextDoc.ParagraphStyle()
para.set_font(font)
para.set_header_level(2)
para.set(pad=0.5)
para.set_alignment(TextDoc.PARA_ALIGN_CENTER)
para.set_description(_('The style used for the generation header.'))
self.default_style.add_style("Generation",para)
para = TextDoc.ParagraphStyle()
para.set(first_indent=-1.0,lmargin=1.0,pad=0.25)
para.set_description(_('The basic style used for the text display.'))
self.default_style.add_style("Entry",para)
para = TextDoc.ParagraphStyle()
para.set(lmargin=1.0,pad=0.05)
para.set_description(_('The basic style used for the text display.'))
self.default_style.add_style("Details",para)
para = TextDoc.ParagraphStyle()
para.set(lmargin=1.0,pad=0.25)
para.set_description(_('The basic style used for the text display.'))
self.default_style.add_style("SubEntry",para)
para = TextDoc.ParagraphStyle()
para.set(pad=0.05)
para.set_description(_('The basic style used for the text display.'))
self.default_style.add_style("Endnotes",para)
def make_report(self):
"""Create the object that will produce the Ahnentafel Report.
All user dialog has already been handled and the output file
opened."""
try:
MyReport = FtmAncestorReport(self.db, self.person, self.target_path,
self.max_gen, self.doc, self.pg_brk)
MyReport.write_report()
except Errors.ReportError, msg:
ErrorDialog(str(msg))
except:
import DisplayTrace
DisplayTrace.DisplayTrace()
#------------------------------------------------------------------------
#
#
#
#------------------------------------------------------------------------
def report(database,person):
FtmAncestorReportDialog(database,person)
#------------------------------------------------------------------------
#
#
#
#------------------------------------------------------------------------
def get_xpm_image():
return [
"48 48 33 1",
" c None",
". c #1A1A1A",
"+ c #847B6E",
"@ c #B7AC9C",
"# c #D1D1D0",
"$ c #EEE2D0",
"% c #6A655C",
"& c #868686",
"* c #F1EADF",
"= c #5C5854",
"- c #B89C73",
"; c #E2C8A1",
"> c #55524C",
", c #F5EEE6",
"' c #4F4E4C",
") c #A19C95",
"! c #B3966E",
"~ c #CDC8BF",
"{ c #F6F2ED",
"] c #A6A5A4",
"^ c #413F3F",
"/ c #D8D1C5",
"( c #968977",
"_ c #BAB9B6",
": c #FAFAF9",
"< c #BEA27B",
"[ c #E9DAC2",
"} c #9D9385",
"| c #E4E3E3",
"1 c #7A7062",
"2 c #E6D3B4",
"3 c #BAA488",
"4 c #322E2B",
" ",
" ",
" (+(+++++111%1%%%%===%1 ",
" +______________@_@)&==1 ",
" +_::::::::::::::*|#_&&}> ",
" &_:::::::::::::::{|#]1~}^ ",
" +_::::::::::::::::{|#=|~&4 ",
" +_::::]]]]]]]]:::::|{':|~&4 ",
" +_::::::::::::::::::{'::|~&4 ",
" +_:::::::::::::::::::'*::|~&^ ",
" +_:::::::::::::::::::'|*::|~}> ",
" 1_::::]]]]]]]]]]]]:::'~|{::|_}% ",
" 1_:::::::::::::::::::'..4^'=1+%1 ",
" +_::::]]]]]]]]]]]]:::|__])&+%=^% ",
" 1_::::::::::::::::::::|#__)&&+'^ ",
" 1_::::]]]]]]]]]::::::::|#~_])&%^ ",
" 1_::::::::::::::::::::{||#~_])14 ",
" 1_::::]]]]]]]]]]]]]]]]]]&}#~_]+4 ",
" 1_::::::::::::::::::{{{{||#~~@&4 ",
" %_::::]]]]]]]]]]]]]]]])))}(~~~&4 ",
" %_:::::::::::::::::{{{{{*|#/~_(4 ",
" %_::::]]]]]]]]]]]]]]])))))}2;/}4 ",
" %_:::::::::::::::{{{{{***||[#~}4 ",
" %_::::]]]]]]]]]])]))))))))}2/;)4 ",
" %_::::::::::::::{{{{{**|$$[/2~!4 ",
" %_::::]]]]]]]]){{{{******$$[2/}4 ",
" %_::::::::::::{{{{****$$$$$[2/!4 ",
" =_::::]]]]]]])]))))))))})}}[2/!4 ",
" %_:::::::::{{{{{{**|$$$$$$[[2;)4 ",
" =_::::]]]])]]))))))))))}}}}[22!4 ",
" %_::::::::{{{{{|**|$$[$[[[[[22}4 ",
" =_::::]]])])))))))))}}}}}}}222-4 ",
" =_:::::{{{{{|{*|$$$$$[[[[22222!4 ",
" =_::::)]])))))))))}}}}}}(}(2;2-4 ",
" =_:::{{{{{{***|$$$$$[[[[22222;-4 ",
" =_:::{])))))))))}}}}}}}(}((2;;<4 ",
" >_:{{{{{{**|$$$$$[[[[22222;2;;-4 ",
" >_{{{{)))))))}}}}}}}(!(((((;;;-4 ",
" >_{{{{|**|*$$$$$[[[[22222;;;;;!4 ",
" '_{{{{****$$$$$2[[222222;2;;;;-4 ",
" '@{{****$$$$$[[[2[222;;2;;;;;;!4 ",
" >]{******$$$[$[2[[2222;;;;;;;;!4 ",
" '_****$$$$[$[[[[2222;2;;;;;;;;!4 ",
" '@__@@@@@@@33<3<<<<<<-<-!!!!!!!4 ",
" 44444444444444444444444444444444 ",
" ",
" ",
" "]
#------------------------------------------------------------------------
#
#
#
#------------------------------------------------------------------------
from Plugins import register_report
register_report(
report,
_("FTM Style Ancestor Report"),
category=_("Text Reports"),
status=(_("Beta")),
description= _("Produces a textual ancestral report similar to Family Tree Maker."),
xpm=get_xpm_image(),
author_name="Donald N. Allingham",
author_email="dallingham@users.sourceforge.net"
)