Enhance source endnotes in some text reports.

svn: r8541
This commit is contained in:
Brian Matherly
2007-06-13 04:13:00 +00:00
parent 150a0fc05d
commit dae8c99230
9 changed files with 415 additions and 283 deletions

View File

@@ -2,6 +2,7 @@
# Gramps - a GTK+/GNOME based genealogy program
#
# Copyright (C) 2003-2006 Donald N. Allingham
# Copyright (C) 2007 Brian G. Matherly
#
# 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
@@ -1010,9 +1011,9 @@ class BookReportDialog(ReportDialog):
style_name = item.option_class.handler.get_default_stylesheet_name()
style_sheet = style_list.get_style_sheet(style_name)
for this_style_name in style_sheet.get_names():
self.selected_style.add_style(
this_style_name,style_sheet.get_style(this_style_name))
for this_style_name in style_sheet.get_paragraph_style_names():
self.selected_style.add_paragraph_style(
this_style_name,style_sheet.get_paragraph_style(this_style_name))
response = self.window.run()
if response == RESPONSE_OK:

View File

@@ -3,7 +3,7 @@
#
# Copyright (C) 2000-2002 Bruce J. DeGrasse
# Copyright (C) 2000-2006 Donald N. Allingham
# Copyright (C) 2007 Brian G. Matherly
# Copyright (C) 2007 Brian G. Matherly
#
# 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
@@ -30,7 +30,6 @@
#
#------------------------------------------------------------------------
from gettext import gettext as _
import cStringIO
#------------------------------------------------------------------------
#
@@ -48,6 +47,7 @@ import RelLib
from PluginUtils import register_report
from ReportBase import Report, ReportUtils, ReportOptions, \
CATEGORY_TEXT, MODE_GUI, MODE_BKI, MODE_CLI
from ReportBase import Bibliography, Endnotes
import BaseDoc
import Utils
@@ -129,8 +129,7 @@ class DetAncestorReport(Report):
else:
self.EMPTY_PLACE = ""
self.sref_map = {}
self.sref_index = 0
self.bibli = Bibliography()
def apply_filter(self,person_handle,index):
if (not person_handle) or (index >= 2**self.max_generations):
@@ -189,7 +188,7 @@ class DetAncestorReport(Report):
if self.includeEvents:
self.write_family_events(family)
if self.includeSources:
self.write_endnotes()
Endnotes.write_endnotes(self.bibli,self.database,self.doc)
def write_person(self, key):
"""Output birth, death, parentage, marriage and notes information """
@@ -210,12 +209,10 @@ class DetAncestorReport(Report):
self.doc.start_bold()
self.doc.write_text(name,mark)
if name[-1:] == '.':
self.doc.write_text(" ")
self.doc.write_text("%s " % self.endnotes(person))
else:
self.doc.write_text(". ")
self.doc.write_text("%s. " % self.endnotes(person))
self.doc.end_bold()
# Output the global source references for this person
self.endnotes(person)
if self.dupPerson:
# Check for duplicate record (result of distant cousins marrying)
@@ -237,25 +234,26 @@ class DetAncestorReport(Report):
text = ReportUtils.born_str(self.database,person,first,
self.EMPTY_DATE,self.EMPTY_PLACE)
if text:
self.doc.write_text(text)
birth_ref = person.get_birth_ref()
if birth_ref:
birth = self.database.get_event_from_handle(birth_ref.ref)
self.endnotes(birth)
text = text.rstrip(". ")
text = text + self.endnotes(birth) + ". "
self.doc.write_text(text)
first = 0
age,units = self.calc_age(person)
text = ReportUtils.died_str(self.database,person,first,
self.EMPTY_DATE,self.EMPTY_PLACE,age,units)
if text:
self.doc.write_text(text)
death_ref = person.get_birth_ref()
if death_ref:
death = self.database.get_event_from_handle(death_ref.ref)
self.endnotes(death)
text = text.rstrip(". ")
text = text + self.endnotes(death) + ". "
self.doc.write_text(text)
first = 0
text = ReportUtils.buried_str(self.database,person,first,
self.EMPTY_DATE,self.EMPTY_PLACE)
if text:
@@ -336,6 +334,7 @@ class DetAncestorReport(Report):
return 0 # Not duplicate person
def write_event(self, event_ref):
text = ""
event = self.database.get_event_from_handle(event_ref.ref)
date = DateHandler.get_date(event)
ph = event.get_place_handle()
@@ -347,30 +346,30 @@ class DetAncestorReport(Report):
self.doc.start_paragraph('DAR-MoreDetails')
evtName = str( event.get_type() )
if date and place:
self.doc.write_text(
_('%(event_name)s: %(date)s, %(place)s%(endnotes)s. ') % {
'event_name' : _(evtName),
'date' : date,
'endnotes' : self.endnotes(event),
'place' : place })
text += _('%(event_name)s: %(date)s, %(place)s') % {
'event_name' : _(evtName),
'date' : date,
'place' : place }
elif date:
self.doc.write_text(
_('%(event_name)s: %(date)s%(endnotes)s. ') % {
'event_name' : _(evtName),
'endnotes' : self.endnotes(event),
'date' : date})
text += _('%(event_name)s: %(date)s') % {
'event_name' : _(evtName),
'date' : date}
elif place:
self.doc.write_text(
_('%(event_name)s: %(place)s%(endnotes)s. ') % {
'event_name' : _(evtName),
'endnotes' : self.endnotes(event),
'place' : place })
text += _('%(event_name)s: %(place)s%') % {
'event_name' : _(evtName),
'place' : place }
else:
self.doc.write_text(_('%(event_name)s: ') % {
'event_name' : _(evtName)})
text += _('%(event_name)s: ') % {'event_name' : _(evtName)}
if event.get_description():
self.doc.write_text(event.get_description())
self.doc.write_text(".")
if text:
text += ". "
text += event.get_description()
if text:
text += _('%(endnotes)s.') % { 'endnotes' : self.endnotes(event) }
self.doc.write_text(text)
self.doc.end_paragraph()
def write_parents(self, person, firstName):
@@ -598,79 +597,11 @@ class DetAncestorReport(Report):
else:
return (0,0)
def write_endnotes(self):
keys = self.sref_map.keys()
if not keys:
return
self.doc.start_paragraph('DAR-Endnotes-Header')
self.doc.write_text(_('Endnotes'))
self.doc.end_paragraph()
keys.sort()
for key in keys:
srcref = self.sref_map[key]
sh = srcref.get_reference_handle()
base = self.database.get_source_from_handle(sh)
self.doc.start_paragraph('DAR-Endnotes',"%d." % key)
self.doc.write_text(base.get_title())
# Disable writing reference details, because only the details
# the first reference to this source will appear.
# FIXME: need to properly change self.endnotes() to put
# this feature back correclty.
## for item in [ base.get_author(), base.get_publication_info(),
## base.get_abbreviation(),
## _dd.display(srcref.get_date_object()),]:
## if item:
## self.doc.write_text('; %s' % item)
##
## item = srcref.get_text()
## if item:
## self.doc.write_text('; ')
## self.doc.write_text(_('Text:'))
## self.doc.write_text(' ')
## self.doc.write_text(item)
##
## item = srcref.get_note()
## 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):
if not obj or not self.includeSources:
return ""
msg = cStringIO.StringIO()
slist = obj.get_source_references()
if slist:
msg.write('<super>')
first = 1
for ref in slist:
if not first:
msg.write(',')
first = 0
ref_base = ref.get_reference_handle()
the_key = 0
for key in self.sref_map.keys():
if ref_base == self.sref_map[key].get_reference_handle():
the_key = key
break
if the_key:
msg.write("%d" % the_key)
else:
self.sref_index += 1
self.sref_map[self.sref_index] = ref
msg.write("%d" % self.sref_index)
msg.write('</super>')
the_str = msg.getvalue()
msg.close()
return the_str
return Endnotes.cite_source(self.bibli,obj)
#------------------------------------------------------------------------
#
@@ -843,22 +774,7 @@ class DetAncestorOptions(ReportOptions):
para.set_description(_('The style used for additional detail data.'))
default_style.add_paragraph_style("DAR-MoreDetails",para)
font = BaseDoc.FontStyle()
font.set(face=BaseDoc.FONT_SANS_SERIF,size=14,italic=1)
para = BaseDoc.ParagraphStyle()
para.set_font(font)
para.set_header_level(2)
para.set_top_margin(0.25)
para.set_bottom_margin(0.25)
para.set_description(_('The style used for the generation header.'))
default_style.add_paragraph_style("DAR-Endnotes-Header",para)
para = BaseDoc.ParagraphStyle()
para.set(first_indent=-0.8,lmargin=1.5)
para.set_top_margin(0.25)
para.set_bottom_margin(0.25)
para.set_description(_('The basic style used for the endnotes text display.'))
default_style.add_paragraph_style("DAR-Endnotes",para)
Endnotes.add_endnote_styles(default_style)
def add_user_options(self,dialog):
"""

View File

@@ -30,7 +30,6 @@
#
#------------------------------------------------------------------------
from gettext import gettext as _
import cStringIO
#------------------------------------------------------------------------
#
@@ -50,6 +49,7 @@ import Errors
from PluginUtils import register_report
from ReportBase import Report, ReportUtils, ReportOptions, \
CATEGORY_TEXT, MODE_GUI, MODE_BKI, MODE_CLI
from ReportBase import Bibliography, Endnotes
import BaseDoc
import const
import DateHandler
@@ -135,8 +135,7 @@ class DetDescendantReport(Report):
else:
self.EMPTY_PLACE = ""
self.sref_map = {}
self.sref_index = 0
self.bibli = Bibliography()
def apply_filter(self,person_handle,index,pid,cur_gen=1):
if (not person_handle) or (cur_gen > self.max_generations):
@@ -217,7 +216,7 @@ class DetDescendantReport(Report):
self.write_family_events(family)
if self.includeSources:
self.write_endnotes()
Endnotes.write_endnotes(self.bibli,self.database,self.doc)
def write_person(self, key):
"""Output birth, death, parentage, marriage and notes information """
@@ -238,12 +237,10 @@ class DetDescendantReport(Report):
self.doc.start_bold()
self.doc.write_text(name,mark)
if name[-1:] == '.':
self.doc.write_text(" ")
self.doc.write_text("%s " % self.endnotes(person))
else:
self.doc.write_text(". ")
self.doc.write_text("%s. " % self.endnotes(person))
self.doc.end_bold()
# Output the global source references for this person
self.endnotes(person)
if self.dupPerson:
# Check for duplicate record (result of distant cousins marrying)
@@ -264,25 +261,26 @@ class DetDescendantReport(Report):
text = ReportUtils.born_str(self.database,person,first,
self.EMPTY_DATE,self.EMPTY_PLACE)
if text:
self.doc.write_text(text)
birth_ref = person.get_birth_ref()
if birth_ref:
birth = self.database.get_event_from_handle(birth_ref.ref)
self.endnotes(birth)
text = text.rstrip(". ")
text = text + self.endnotes(birth) + ". "
self.doc.write_text(text)
first = 0
age,units = self.calc_age(person)
age,units = self.calc_age(person)
text = ReportUtils.died_str(self.database,person,first,
self.EMPTY_DATE,self.EMPTY_PLACE,age,units)
if text:
self.doc.write_text(text)
death_ref = person.get_birth_ref()
if death_ref:
death = self.database.get_event_from_handle(death_ref.ref)
self.endnotes(death)
text = text.rstrip(". ")
text = text + self.endnotes(death) + ". "
self.doc.write_text(text)
first = 0
text = ReportUtils.buried_str(self.database,person,first,
self.EMPTY_DATE,self.EMPTY_PLACE)
if text:
@@ -363,6 +361,7 @@ class DetDescendantReport(Report):
return 0 # Not duplicate person
def write_event(self, event_ref):
text = ""
event = self.database.get_event_from_handle(event_ref.ref)
date = DateHandler.get_date(event)
ph = event.get_place_handle()
@@ -374,30 +373,30 @@ class DetDescendantReport(Report):
self.doc.start_paragraph('DDR-MoreDetails')
evtName = str( event.get_type() )
if date and place:
self.doc.write_text(
_('%(event_name)s: %(date)s, %(place)s%(endnotes)s. ') % {
'event_name' : _(evtName),
'date' : date,
'endnotes' : self.endnotes(event),
'place' : place })
text += _('%(event_name)s: %(date)s, %(place)s') % {
'event_name' : _(evtName),
'date' : date,
'place' : place }
elif date:
self.doc.write_text(
_('%(event_name)s: %(date)s%(endnotes)s. ') % {
'event_name' : _(evtName),
'endnotes' : self.endnotes(event),
'date' : date})
text += _('%(event_name)s: %(date)s') % {
'event_name' : _(evtName),
'date' : date}
elif place:
self.doc.write_text(
_('%(event_name)s: %(place)s%(endnotes)s. ') % {
'event_name' : _(evtName),
'endnotes' : self.endnotes(event),
'place' : place })
text += _('%(event_name)s: %(place)s%') % {
'event_name' : _(evtName),
'place' : place }
else:
self.doc.write_text(_('%(event_name)s: ') % {
'event_name' : _(evtName)})
text += _('%(event_name)s: ') % {'event_name' : _(evtName)}
if event.get_description():
self.doc.write_text(event.get_description())
self.doc.write_text(".")
if text:
text += ". "
text += event.get_description()
if text:
text += _('%(endnotes)s.') % { 'endnotes' : self.endnotes(event) }
self.doc.write_text(text)
self.doc.end_paragraph()
def write_parents(self, person, firstName):
@@ -624,79 +623,11 @@ class DetDescendantReport(Report):
else:
return (0,0)
def write_endnotes(self):
keys = self.sref_map.keys()
if not keys:
return
self.doc.start_paragraph('DDR-Endnotes-Header')
self.doc.write_text(_('Endnotes'))
self.doc.end_paragraph()
keys.sort()
for key in keys:
srcref = self.sref_map[key]
base = self.database.get_source_from_handle(
srcref.get_reference_handle())
self.doc.start_paragraph('DDR-Endnotes',"%d." % key)
self.doc.write_text(base.get_title())
# Disable writing reference details, because only the details
# the first reference to this source will appear.
# FIXME: need to properly change self.endnotes() to put
# this feature back correclty.
## for item in [ base.get_author(), base.get_publication_info(), base.get_abbreviation(),
## _dd.display(srcref.get_date_object()),]:
## if item:
## self.doc.write_text('; %s' % item)
##
## item = srcref.get_text()
## if item:
## self.doc.write_text('; ')
## self.doc.write_text(_('Text:'))
## self.doc.write_text(' ')
## self.doc.write_text(item)
##
## item = srcref.get_note()
## 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):
if not obj or not self.includeSources:
return ""
msg = cStringIO.StringIO()
slist = obj.get_source_references()
if slist:
msg.write('<super>')
first = 1
for ref in slist:
if not first:
msg.write(',')
first = 0
ref_base = ref.get_reference_handle()
the_key = 0
for key in self.sref_map.keys():
if ref_base == self.sref_map[key].get_reference_handle():
the_key = key
break
if the_key:
msg.write("%d" % the_key)
else:
self.sref_index += 1
self.sref_map[self.sref_index] = ref
msg.write("%d" % self.sref_index)
msg.write('</super>')
str = msg.getvalue()
msg.close()
return str
return Endnotes.cite_source(self.bibli,obj)
#------------------------------------------------------------------------
#
@@ -873,22 +804,7 @@ class DetDescendantOptions(ReportOptions):
para.set_description(_('The style used for additional detail data.'))
default_style.add_paragraph_style("DDR-MoreDetails",para)
font = BaseDoc.FontStyle()
font.set(face=BaseDoc.FONT_SANS_SERIF,size=14,italic=1)
para = BaseDoc.ParagraphStyle()
para.set_font(font)
para.set_header_level(2)
para.set_top_margin(0.25)
para.set_bottom_margin(0.25)
para.set_description(_('The style used for the generation header.'))
default_style.add_paragraph_style("DDR-Endnotes-Header",para)
para = BaseDoc.ParagraphStyle()
para.set(first_indent=-0.8,lmargin=1.5)
para.set_top_margin(0.25)
para.set_bottom_margin(0.25)
para.set_description(_('The basic style used for the endnotes text display.'))
default_style.add_paragraph_style("DDR-Endnotes",para)
Endnotes.add_endnote_styles(default_style)
def add_user_options(self,dialog):
"""

View File

@@ -50,6 +50,7 @@ import DateHandler
from PluginUtils import register_report
from ReportBase import Report, ReportUtils, ReportOptions, \
CATEGORY_TEXT, MODE_GUI, MODE_BKI, MODE_CLI
from ReportBase import Bibliography, Endnotes
from BasicUtils.NameDisplay import displayer as _nd
from QuestionDialog import WarningDialog
@@ -86,7 +87,7 @@ class IndivCompleteReport(Report):
filter_num = options_class.handler.options_dict['filter']
filters = ReportUtils.get_person_filters(person)
self.filter = filters[filter_num]
self.sref_map = {}
self.bibli = Bibliography()
def write_fact(self,event):
if event == None:
@@ -114,7 +115,7 @@ class IndivCompleteReport(Report):
text = '%s%s. ' % (text,description)
endnotes = ""
if self.use_srcs:
endnotes = ReportUtils.get_endnotes(self.sref_map,event)
endnotes = Endnotes.cite_source(self.bibli,event)
self.doc.start_row()
self.normal_cell(name)
@@ -249,7 +250,7 @@ class IndivCompleteReport(Report):
text = _nd.display_name(name)
endnotes = ""
if self.use_srcs:
endnotes = ReportUtils.get_endnotes(self.sref_map,name)
endnotes = Endnotes.cite_source(self.bibli,name)
self.normal_cell(text,endnotes)
self.doc.end_row()
self.doc.end_table()
@@ -277,7 +278,7 @@ class IndivCompleteReport(Report):
date = DateHandler.get_date(addr)
endnotes = ""
if self.use_srcs:
endnotes = ReportUtils.get_endnotes(self.sref_map,addr)
endnotes = Endnotes.cite_source(self.bibli,addr)
self.doc.start_row()
self.normal_cell(date)
self.normal_cell(text,endnotes)
@@ -399,9 +400,7 @@ class IndivCompleteReport(Report):
self.doc.start_paragraph('IDS-Normal')
self.doc.write_text(text,mark)
if endnotes:
self.doc.start_superscript()
self.doc.write_text(endnotes)
self.doc.end_superscript()
self.doc.end_paragraph()
self.doc.end_cell()
@@ -458,7 +457,7 @@ class IndivCompleteReport(Report):
mark = ReportUtils.get_person_mark(self.database, self.start_person)
endnotes = ""
if self.use_srcs:
endnotes = ReportUtils.get_endnotes(self.sref_map,name)
endnotes = Endnotes.cite_source(self.bibli,name)
self.normal_cell(text,endnotes,mark)
self.doc.end_row()
@@ -517,7 +516,8 @@ class IndivCompleteReport(Report):
self.write_families()
self.write_addresses()
self.write_note()
self.write_sources()
if self.use_srcs:
Endnotes.write_endnotes(self.bibli,self.database,self.doc)
#------------------------------------------------------------------------
#
@@ -648,6 +648,8 @@ class IndivCompleteOptions(ReportOptions):
cell = BaseDoc.TableCellStyle()
cell.set_longlist(1)
default_style.add_cell_style("IDS-ListCell",cell)
Endnotes.add_endnote_styles(default_style)
#------------------------------------------------------------------------
#