Enhance source endnotes in some text reports.
svn: r8541
This commit is contained in:
157
src/ReportBase/_Bibliography.py
Normal file
157
src/ReportBase/_Bibliography.py
Normal file
@@ -0,0 +1,157 @@
|
||||
#
|
||||
# Gramps - a GTK+/GNOME based genealogy program
|
||||
#
|
||||
# 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
|
||||
# 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
|
||||
#
|
||||
# $Id: $
|
||||
|
||||
"""
|
||||
Contain and organize bibliographic information.
|
||||
"""
|
||||
|
||||
class Citation:
|
||||
"""
|
||||
Store information about a citation and all of its references.
|
||||
"""
|
||||
def __init__(self):
|
||||
"""
|
||||
Initialize members.
|
||||
"""
|
||||
self.__src_handle = None
|
||||
self.__ref_list = []
|
||||
|
||||
def get_source_handle(self):
|
||||
"""
|
||||
Provide the handle to the source that this citation is for.
|
||||
|
||||
@return: Source Handle
|
||||
@rtype: handle
|
||||
"""
|
||||
return self.__src_handle
|
||||
|
||||
def set_source_handle(self,handle):
|
||||
"""
|
||||
Set the handle for the source that this citation is for.
|
||||
|
||||
@param handle: Source Handle
|
||||
@type handle: handle
|
||||
"""
|
||||
self.__src_handle = handle
|
||||
|
||||
def get_ref_list(self):
|
||||
"""
|
||||
List all the references to this citation.
|
||||
|
||||
@return: a list of references
|
||||
@rtype: list of L{Relib.SourceRef} objects
|
||||
"""
|
||||
return self.__ref_list
|
||||
|
||||
def add_reference(self, source_ref):
|
||||
"""
|
||||
Add a reference to this citation. If a similar reference exists, don't
|
||||
add another one.
|
||||
|
||||
@param source_ref: Source Reference
|
||||
@type source_ref: L{Relib.SourceRef}
|
||||
@return: The index of the added reference among all the references.
|
||||
@rtype: int
|
||||
"""
|
||||
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
|
||||
|
||||
class Bibliography:
|
||||
"""
|
||||
Store and organize multiple citations into a bibliography.
|
||||
"""
|
||||
def __init__(self):
|
||||
"""
|
||||
Initialize members.
|
||||
"""
|
||||
self.__citation_list = []
|
||||
|
||||
def add_reference(self, source_ref):
|
||||
"""
|
||||
Add a reference to a source to this bibliography. If the source already
|
||||
exists, don't add it again. If a similar reference exists, don't
|
||||
add another one.
|
||||
|
||||
@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
|
||||
there is no reference information, the second element will be None.
|
||||
@rtype: (int,int) or (int,None)
|
||||
"""
|
||||
source_handle = source_ref.get_reference_handle()
|
||||
cindex = 0
|
||||
rindex = None
|
||||
citation = None
|
||||
citation_found = False
|
||||
for citation in self.__citation_list:
|
||||
if citation.get_source_handle() == source_handle:
|
||||
citation_found = True
|
||||
break
|
||||
cindex += 1
|
||||
|
||||
if not citation_found:
|
||||
citation = Citation()
|
||||
citation.set_source_handle(source_handle)
|
||||
cindex = len(self.__citation_list)
|
||||
self.__citation_list.append(citation)
|
||||
|
||||
if _sref_has_info(source_ref):
|
||||
rindex = citation.add_reference(source_ref)
|
||||
|
||||
return (cindex,rindex)
|
||||
|
||||
def get_citation_count(self):
|
||||
"""
|
||||
Report the number of citations in this bibliography.
|
||||
|
||||
@return: number of citations
|
||||
@rtype: int
|
||||
"""
|
||||
return len(self.__citation_list)
|
||||
|
||||
def get_citation_list(self):
|
||||
"""
|
||||
Return a list containing all the citations in this bibliography.
|
||||
|
||||
@return: citation list
|
||||
@rtype: list of L{Citation} objects
|
||||
"""
|
||||
return self.__citation_list
|
||||
|
||||
def _sref_has_info(source_ref):
|
||||
if source_ref.get_page() == "":
|
||||
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
|
||||
Reference in New Issue
Block a user