diff --git a/ChangeLog b/ChangeLog index 43a1f1540..986e9c9b0 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,12 @@ +2007-07-23 Brian Matherly + * src/plugins/IndivComplete.py: + * src/plugins/DetDescendantReport.py: + * src/plugins/DetAncestralReport.py: + * src/plugins/NarrativeWeb.py: + * src/ReportBase/_Endnotes.py: + * src/ReportBase/_Bibliography.py: + Improve Bibliography and use it in Narrative Web report as well. + 2007-07-23 Stephane Charette * src/plugins/FamilyLines.py: added FamilyLines to trunk * src/plugins/makefile.am: added FamilyLines diff --git a/src/ReportBase/_Bibliography.py b/src/ReportBase/_Bibliography.py index 5720a1035..176f1b7dd 100644 --- a/src/ReportBase/_Bibliography.py +++ b/src/ReportBase/_Bibliography.py @@ -22,6 +22,7 @@ """ Contain and organize bibliographic information. """ +import string class Citation: """ @@ -68,28 +69,43 @@ class Citation: @param source_ref: Source Reference @type source_ref: L{Relib.SourceRef} - @return: The index of the added reference among all the references. - @rtype: int + @return: The key of the added reference among all the references. + @rtype: char """ - index = 0 - for ref in self.__ref_list: - if _srefs_are_equal(ref,source_ref): - # if a reference like this already exists, don't add another one - return index - index += 1 - - self.__ref_list.append(source_ref) - return index + key = string.lowercase[ len(self.__ref_list) ] + self.__ref_list.append((key,source_ref)) + return key class Bibliography: """ Store and organize multiple citations into a bibliography. """ - def __init__(self): + MODE_DATE = 2**0 + MODE_PAGE = 2**1 + MODE_CONF = 2**2 + MODE_NOTE = 2**3 + MODE_ALL = MODE_DATE | MODE_PAGE | MODE_CONF | MODE_NOTE + + def __init__(self,mode=MODE_ALL): """ - Initialize members. + A bibliography will store citations (sources) and references to those + citations (source refs). Duplicate entries will not be added. To change + what is considered duplicate, you can tell the bibliography what source + ref information you are interested in by passing in the mode. + + Possible modes include: + MODE_DATE + MODE_PAGE + MODE_CONF + MODE_NOTE + MODE_ALL + + If you only care about pages, set "mode=MODE_PAGE". + If you only care about dates and pages, set "mode=MODE_DATE|MODE_PAGE". + If you care about everything, set "mode=MODE_ALL". """ self.__citation_list = [] + self.mode = mode def add_reference(self, source_ref): """ @@ -100,13 +116,13 @@ class Bibliography: @param source_ref: Source Reference @type source_ref: L{Relib.SourceRef} @return: A tuple containing the index of the source among all the - sources and the index of the reference among all the references. If + sources and the key of the reference among all the references. If there is no reference information, the second element will be None. - @rtype: (int,int) or (int,None) + @rtype: (int,char) or (int,None) """ source_handle = source_ref.get_reference_handle() cindex = 0 - rindex = None + rkey = None citation = None citation_found = False for citation in self.__citation_list: @@ -121,10 +137,14 @@ class Bibliography: cindex = len(self.__citation_list) self.__citation_list.append(citation) - if _sref_has_info(source_ref): - rindex = citation.add_reference(source_ref) + if self.__sref_has_info(source_ref): + for key,ref in citation.get_ref_list(): + if self.__srefs_are_equal(ref,source_ref): + # if a reference like this already exists, don't add another one + return (cindex,key) + rkey = citation.add_reference(source_ref) - return (cindex,rindex) + return (cindex,rkey) def get_citation_count(self): """ @@ -144,14 +164,45 @@ class Bibliography: """ return self.__citation_list -def _sref_has_info(source_ref): - if source_ref.get_page() == "": + def __sref_has_info(self,source_ref): + if ( self.mode & self.MODE_PAGE ) == self.MODE_PAGE: + if source_ref.get_page() != "": + return True + if ( self.mode & self.MODE_DATE ) == self.MODE_DATE: + if source_ref.get_date_object() != None: + return True + if ( self.mode & self.MODE_CONF ) == self.MODE_CONF: + if source_ref.get_confidence_level() != None: + return True + if ( self.mode & self.MODE_NOTE ) == self.MODE_NOTE: + if len(source_ref.get_note_list()) != 0: + return True + # Can't find anything interesting. return False - else: - return True - -def _srefs_are_equal(source_ref1,source_ref2): - if source_ref1.get_page() == source_ref2.get_page(): - return True - else: - return False \ No newline at end of file + + def __srefs_are_equal(self,source_ref1,source_ref2): + if self.mode == self.MODE_ALL: + return source_ref1.is_equal(source_ref2) + if ( self.mode & self.MODE_PAGE ) == self.MODE_PAGE: + if source_ref1.get_page() != source_ref2.get_page(): + return False + if ( self.mode & self.MODE_DATE ) == self.MODE_DATE: + date1 = source_ref1.get_date_object() + date2 = source_ref2.get_date_object() + if date1.is_equal(date2): + return False + if ( self.mode & self.MODE_CONF ) == self.MODE_CONF: + conf1 = source_ref1.get_confidence_level() + conf2 = source_ref2.get_confidence_level() + if conf1 != conf2: + return False + if ( self.mode & self.MODE_NOTE ) == self.MODE_NOTE: + nl1 = source_ref1.get_note_list() + nl2 = source_ref2.get_note_list() + if len(nl1) != len(nl2): + return False + for notehandle in nl1: + if notehandle not in nl2: + return False + # Can't find anything different. They must be equal. + return True \ No newline at end of file diff --git a/src/ReportBase/_Endnotes.py b/src/ReportBase/_Endnotes.py index 270d77a8f..929091bf2 100644 --- a/src/ReportBase/_Endnotes.py +++ b/src/ReportBase/_Endnotes.py @@ -23,7 +23,6 @@ Provide utilities for printing endnotes in text reports. """ -import string import BaseDoc def add_endnote_styles(style_sheet): @@ -74,10 +73,10 @@ def cite_source(bibliography,obj): if not first: txt += ',' first = 0 - (cindex,rindex) = bibliography.add_reference(ref) + (cindex,key) = bibliography.add_reference(ref) txt += "%d" % (cindex + 1) - if rindex != None: - txt += "%s" % string.lowercase[rindex] + if key != None: + txt += key return txt def write_endnotes(bibliography,database,doc): @@ -118,8 +117,8 @@ def write_endnotes(bibliography,database,doc): first = True rindex = 0 - for ref in ref_list: - txt = "%s: %s" % (string.lowercase[rindex],ref.get_page()) + for key,ref in ref_list: + txt = "%s: %s" % (key,ref.get_page()) if first: doc.write_text(txt) first = False diff --git a/src/plugins/DetAncestralReport.py b/src/plugins/DetAncestralReport.py index d6a52b5d3..e37831e40 100644 --- a/src/plugins/DetAncestralReport.py +++ b/src/plugins/DetAncestralReport.py @@ -129,7 +129,7 @@ class DetAncestorReport(Report): else: self.EMPTY_PLACE = "" - self.bibli = Bibliography() + self.bibli = Bibliography(Bibliography.MODE_PAGE) def apply_filter(self,person_handle,index): if (not person_handle) or (index >= 2**self.max_generations): diff --git a/src/plugins/DetDescendantReport.py b/src/plugins/DetDescendantReport.py index 065caf6b2..29486f157 100644 --- a/src/plugins/DetDescendantReport.py +++ b/src/plugins/DetDescendantReport.py @@ -137,7 +137,7 @@ class DetDescendantReport(Report): else: self.EMPTY_PLACE = "" - self.bibli = Bibliography() + self.bibli = Bibliography(Bibliography.MODE_PAGE) def apply_filter(self,person_handle,index,pid,cur_gen=1): if (not person_handle) or (cur_gen > self.max_generations): diff --git a/src/plugins/IndivComplete.py b/src/plugins/IndivComplete.py index 6a3da1c47..e087d0d96 100644 --- a/src/plugins/IndivComplete.py +++ b/src/plugins/IndivComplete.py @@ -87,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.bibli = Bibliography() + self.bibli = Bibliography(Bibliography.MODE_PAGE) def write_fact(self,event): if event == None: diff --git a/src/plugins/NarrativeWeb.py b/src/plugins/NarrativeWeb.py index 1f4dd9974..156c7d2ed 100644 --- a/src/plugins/NarrativeWeb.py +++ b/src/plugins/NarrativeWeb.py @@ -68,6 +68,7 @@ import Sort from PluginUtils import register_report from ReportBase import Report, ReportUtils, ReportOptions, \ CATEGORY_WEB, MODE_GUI, MODE_CLI +from ReportBase import Bibliography from ReportBase._ReportDialog import ReportDialog from ReportBase._CommandLineReport import CommandLineReport import Errors @@ -1616,7 +1617,7 @@ class IndividualPage(BasePage): self.db = db self.ind_list = ind_list self.src_list = src_list - self.src_refs = [] + self.bibli = Bibliography() self.place_list = place_list self.sort_name = sort_nameof(self.person,self.exclude_private) self.name = sort_nameof(self.person,self.exclude_private) @@ -1786,43 +1787,59 @@ class IndividualPage(BasePage): self.draw_tree(of,gen,maxgen,max_size,new_center,m_center,m_handle) def display_ind_sources(self,of): - sreflist = self.src_refs + self.person.get_source_references() - if not sreflist or self.restrict: + for sref in self.person.get_source_references(): + self.bibli.add_reference(sref) + if self.restrict or self.bibli.get_citation_count() == 0: return of.write('
\n') of.write('

%s

\n' % _('Source References')) of.write('\n') - index = 1 - for sref in sreflist: + cindex = 0 + for citation in self.bibli.get_citation_list(): + cindex += 1 + # Add this source to the global list of sources to be displayed + # on each source page. lnk = (self.cur_name, self.page_title, self.gid) - shandle = sref.get_reference_handle() - if not shandle: - continue + shandle = citation.get_source_handle() if self.src_list.has_key(shandle): if lnk not in self.src_list[shandle]: self.src_list[shandle].append(lnk) else: self.src_list[shandle] = [lnk] - + + # Add this source and its references to the page source = self.db.get_source_from_handle(shandle) title = source.get_title() of.write('' % (index,index)) - of.write('' % (cindex,cindex)) + of.write('\n') - index += 1 + + for key,sref in citation.get_ref_list(): + of.write('\t') + of.write('' % (cindex,key)) + of.write('\n') of.write('
') - of.write('%d.') + of.write('%d.') self.source_link(of,source.handle,title,source.gramps_id,True) - tmp = [] - confidence = Utils.confidence.get(sref.confidence, _('Unknown')) - for (label,data) in [(_('Date'),_dd.display(sref.date)), - (_('Page'),sref.page), - (_('Confidence'),confidence), - (_('Text'),sref.text)]: - if data: - tmp.append("%s: %s" % (label,data)) - if len(tmp) > 0: - of.write('
' + '
'.join(tmp)) + of.write('

') of.write('

') + of.write('' % (cindex,key)) + of.write('%d%s.') + + tmp = [] + confidence = Utils.confidence.get(sref.confidence, _('Unknown')) + for (label,data) in [(_('Date'),_dd.display(sref.date)), + (_('Page'),sref.page), + (_('Confidence'),confidence)]: + if data: + tmp.append("%s: %s" % (label,data)) + notelist = sref.get_note_list() + for notehandle in notelist: + note = self.db.get_note_from_handle(notehandle) + tmp.append("%s: %s" % (_('Text'),note.get(True))) + if len(tmp) > 0: + of.write('
'.join(tmp)) + of.write('

') + of.write('

\n') of.write('
\n') @@ -1896,32 +1913,13 @@ class IndividualPage(BasePage): # Names [and their sources] for name in [self.person.get_primary_name(),]+self.person.get_alternate_names(): pname = name_nameof(name,self.exclude_private) + pname += self.get_citation_links( name.get_source_references() ) type = str( name.get_type() ) of.write('%s\n' % _(type)) of.write('%s' % pname) - if not self.restrict: - nshl = [] - for nsref in name.get_source_references(): - self.src_refs.append(nsref) - nsh = nsref.get_reference_handle() - lnk = (self.cur_name, self.page_title, self.gid) - if self.src_list.has_key(nsh): - if self.person.handle not in self.src_list[nsh]: - self.src_list[nsh].append(lnk) - else: - self.src_list[nsh] = [lnk] - nshl.append(nsref) - if nshl: - of.write( " ") - for nsh in nshl: - index = self.src_refs.index(nsh)+1 - of.write(' %d' % (index,index)) - of.write( " ") - of.write('\n\n') # Gender - nick = self.person.get_nick_name() if nick: of.write('%s\n' % _('Nickname')) @@ -2328,13 +2326,13 @@ class IndividualPage(BasePage): self.src_list[handle].append(lnk) else: self.src_list[handle] = [lnk] - self.src_refs.append(sref) if len(gid_list) > 0: text = text + " " for ref in gid_list: - index = self.src_refs.index(ref)+1 - text = text + ' %d' % (index,index) + index,key = self.bibli.add_reference(ref) + id = "%d%s" % (index+1,key) + text = text + ' %s' % (id,id) text = text + "" return text