- Move citeref formatting to gen.utils. Functions now have a db parameter, so they find the template themselves.

- Separate out the GEDCOM template creation. It becomes a separate plugin that can be loaded or not as the user chooses (but it is loaded automatically on upgrade).
- Fixes to allow templates to work even when no templates are loaded (data is input via the Attributes tab not the source template tab).
- Enhance upgrade to include GEDCOM template. The GEDCOM template is automatically loaded when a database that contains sources is upgraded.
- Tidy up unused variables and redundant code.


svn: r22856
This commit is contained in:
Tim G L Lyons 2013-08-12 16:04:37 +00:00
parent 06de73c8f4
commit 367de337a4
15 changed files with 788 additions and 588 deletions

View File

@ -148,25 +148,39 @@ def gramps_upgrade_17(self):
from ..lib.srcattrtype import SrcAttributeType
private = False
first = True
for handle in self.source_map.keys():
if first:
from gramps.plugins.srctemplates.gedcomtemplate import build_GEDCOM_template
template = build_GEDCOM_template()
if isinstance(template.handle, UNITYPE):
template.handle = template.handle.encode('utf-8')
teml_handle = template.handle
from gramps.gen.lib.srctemplate import SrcTemplate
template = SrcTemplate.serialize(template)
with BSDDBTxn(self.env, self.template_map) as txn:
txn.put(teml_handle, template)
with BSDDBTxn(self.env, self.metadata) as txn:
txn.put(b'gedcom_template', teml_handle)
first = False
source = self.source_map[handle]
(handle, gramps_id, title, author, pubinfo,
notelist, medialist, abbrev, change, datamap, reporef_list,
taglist, private) = source
srcattributelist = upgrade_datamap_17(datamap)
if title:
the_type = (SrcAttributeType.TITLE, '')
the_type = (SrcAttributeType.CUSTOM, SrcAttributeType.TITLE)
srcattributelist.append((private, the_type, title))
if author:
the_type = (SrcAttributeType.AUTHOR, '')
the_type = (SrcAttributeType.CUSTOM, SrcAttributeType.AUTHOR)
srcattributelist.append((private, the_type, author))
if pubinfo:
the_type = (SrcAttributeType.PUB_INFO, '')
the_type = (SrcAttributeType.CUSTOM, SrcAttributeType.PUB_INFO)
srcattributelist.append((private, the_type, pubinfo))
name = title
template = 'GEDCOM'
new_source = (handle, gramps_id, name, template,
new_source = (handle, gramps_id, name, teml_handle,
notelist, medialist, abbrev, change, srcattributelist, reporef_list,
taglist, private)
with BSDDBTxn(self.env, self.source_map) as txn:
@ -181,7 +195,7 @@ def gramps_upgrade_17(self):
notelist, medialist, datamap, change, taglist, private) = citation
srcattributelist = upgrade_datamap_17(datamap)
if page:
the_type = (SrcAttributeType.PAGE, '')
the_type = (SrcAttributeType.CUSTOM, SrcAttributeType.PAGE)
srcattributelist.append((private, the_type, page))
name = page

View File

@ -281,6 +281,9 @@ class DbBsddb(DbBsddbRead, DbWriteBase, UpdateCallback):
self.brief_name = None
self.update_env_version = False
self.update_python_version = False
# Whether SrcTemplates need to be loaded. They need to be loaded on
# creating a new database, and on upgrade from schema version 16 to 17.
self.load_templates = False
def catch_db_error(func):
"""
@ -672,6 +675,7 @@ class DbBsddb(DbBsddbRead, DbWriteBase, UpdateCallback):
self.__load_metadata()
gstats = self.metadata.get(b'gender_stats', default=None)
self.load_templates = False
# Ensure version info in metadata
if not self.readonly:
@ -681,6 +685,7 @@ class DbBsddb(DbBsddbRead, DbWriteBase, UpdateCallback):
# New database. Set up the current version.
#self.metadata.put(b'version', _DBVERSION, txn=the_txn)
txn.put(b'version', _DBVERSION)
self.load_templates = True
elif b'version' not in self.metadata:
# Not new database, but the version is missing.
# Use 0, but it is likely to fail anyway.
@ -769,7 +774,7 @@ class DbBsddb(DbBsddbRead, DbWriteBase, UpdateCallback):
self.__open_undodb()
self.db_is_open = True
if gstats is None:
if self.load_templates:
# FIXME gstat is used as a proxy to say whether the database is new
# or not, This is not a very clean approach
from gramps.plugins.srctemplates.importcsv import load_srctemplates_data
@ -2214,6 +2219,10 @@ class DbBsddb(DbBsddbRead, DbWriteBase, UpdateCallback):
upgrade.gramps_upgrade_16(self)
if version < 17:
upgrade.gramps_upgrade_17(self)
# On upgrade from 16 to 17, SrcTemplate is added, so the templates
# need to be loaded. In the future, on upgrade from 17, the
# templates will already be present and will not need to be loaded
self.load_templates = True
self.reset()
self.set_total(6)

View File

@ -40,37 +40,6 @@ _ = glocale.translation.gettext
#-------------------------------------------------------------------------
from .grampstype import GrampsType
#-------------------------------------------------------------------------
#
# Template constants
#
#-------------------------------------------------------------------------
REF_TYPE_F = 1 # Full footnote citation to a source
REF_TYPE_S = 2 # Short footnote citation to a source
REF_TYPE_L = 3 # Listed reference of the source (no citation info)
EMPTY = 0
# template to GEDCOM field mapping for L reference fields
GED_AUTHOR = 1
GED_TITLE = 2
GED_PUBINF = 3
# template to GEDCOM field mapping for Date in F reference fields
GED_DATE = 4
GED_PAGE = 5
# template to a shortening algorithm mapping for predefined algorithms
SHORTERALG_LOC = 1 # reduce a location to a shorter format (typically city level)
SHORTERALG_YEAR = 2 # reduce a date to only the year part
SHORTERALG_ETAL = 3 # reduce an author list to "first author et al."
SHORTERALG_REVERT_TO_DOT = 4 # change a list of first, second, third to
# a list third. second. first.
# template to a style mapping
STYLE_QUOTE = 1 # add quotes around the field
STYLE_QUOTECONT = 2 # add quotes around this field combined with other
# QUOTECONT fields around it
STYLE_EMPH = 3 # emphasize field
STYLE_BOLD = 4 # make field bold
#-------------------------------------------------------------------------
#
# Classes

View File

@ -32,8 +32,7 @@ SrcTemplate class for GRAMPS.
#
#-------------------------------------------------------------------------
from __future__ import print_function
from collections import defaultdict, OrderedDict
import sys
from collections import defaultdict
#------------------------------------------------------------------------
#
@ -48,38 +47,11 @@ LOG = logging.getLogger('.template')
# GRAMPS modules
#
#-------------------------------------------------------------------------
from ..const import GRAMPS_LOCALE as glocale
_ = glocale.translation.gettext
from .srcattrtype import *
from .date import Date
from .tableobj import TableObject
from .secondaryobj import SecondaryObject
from .handle import Handle
from ..constfunc import cuni
#columns in a csv file defining templates
NRCOL = 0
CATCOL = 1
CATTYPECOL = 2
TYPECOL = 3
DESCRCOL= 4
CITETYPECOL = 5
IDENTCOL = 6
LDELCOL = 7 # left delimiter
FIELDCOL = 8
LABELCOL = 9
RDELCOL = 10 # right delimiter
GEDCOMCOL = 11
SHORTERCOL = 12
STYLECOL = 13
PRIVACYCOL = 14
OPTCOL = 15
HINTCOL = 16
TOOLTIPCOL = 17
UNKNOWN = 'UNKNOWN'
DESCR = -10
#-------------------------------------------------------------------------
#
# SrcTemplate class
@ -130,7 +102,6 @@ class SrcTemplate(TableObject):
7/ the REF_TYPE_L reference maps to GEDCOM fields on export via
this column. GEDCOM contains Title, Author and Pub.Info field
"""
UNKNOWN = UNKNOWN
def __init__(self, template_key=None):
"""
@ -145,9 +116,6 @@ class SrcTemplate(TableObject):
self.descr = ""
self.template_element_list = []
self.mapdict = defaultdict(str)
self.structure = {REF_TYPE_L: [], REF_TYPE_F: [],
REF_TYPE_S: []}
self.empty()
def serialize(self):
"""
@ -172,7 +140,7 @@ class SrcTemplate(TableObject):
self.name,
self.descr,
[template_element.serialize() for template_element in self.template_element_list],
self.mapdict,
self.mapdict
)
def to_struct(self):
@ -199,7 +167,7 @@ class SrcTemplate(TableObject):
"name": cuni(self.name),
"descr": cuni(self.descr),
"elements": [e.to_struct() for e in self.template_element_list],
"mapdict" : self.mapdict,
"mapdict" : {'dict': self.mapdict}
}
def unserialize(self, data):
@ -257,332 +225,6 @@ class SrcTemplate(TableObject):
def add_template_element(self, template_element):
self.template_element_list.append(template_element)
def add_structure_element(self, cite_type, slist):
self.structure[cite_type] += slist
def get_structure(self):
return self.structure
def empty(self):
"""
remove all computed data
"""
self.refL = None
self.refF = None
self.refS = None
# attrmap will hold mapping of field to normal value and short value
# short value will be None if not given
# map is field -> (normal value for ref L,
# normal value for ref F/S, short value ref S)
self.attrmap = {}
self.input_dict = defaultdict(str)
def set_attr_list(self, attr_list, attr_list_citation=None, date_citation=None):
"""
Set the attribute list of this template. Setting once for different
references saves some time.
attr_list should be the source attribute list
If citation given, citation attrib
utes overrule source attributes for
the Full and Short references
The citation date is not stored as attribute, so pass Date() object via
date_citation if a date is known.
"""
self.empty()
self.attrmap = {}
self.input_dict = defaultdict(str)
self.attr_list = attr_list or []
self.attr_list_cite = attr_list_citation or []
self.date_citation = date_citation
# -----------------------------------------------------------------
# Construct the input dictionary
# First pre-load the dictionary with default settings for citations
if not attr_list_citation:
for te in [x for x in self.get_template_element_list()
if x.get_citation()]:
name = str(SrcAttributeType(te.get_name())).upper().replace(' ', '_')
if te.get_display():
val = te.get_display().upper().replace(' ', '_')
else:
val = name
self.input_dict[name] = "[" + val + "]"
# Now get the actual attribute values. store attributes in a dict last
# to first. this overwrites data so first attribute will be the one
# taken if duplicates are present
for input_attr in ((attr_list or []) + (attr_list_citation or []))[::-1]:
typ = input_attr.get_type()
if int(typ) == SrcAttributeType.CUSTOM:
name = str(typ).upper().replace(' ', '_')
else:
name = typ.xml_str().upper().replace(' ', '_')
self.input_dict[name] = input_attr.get_value()
# if we haven't already got a value for the short attribute, we
# store the long attribute in the short attribute
if not name.endswith("(SHORT)"):
short_name = name + "_(SHORT)"
if self.input_dict.get(short_name) is None or \
(self.input_dict.get(short_name) and \
self.input_dict[short_name] == ("[" + short_name + "]")):
self.input_dict[short_name] = self.input_dict[name]
if self.date_citation and (not self.date_citation.is_empty()):
#we store the date of the citation in attrmap
name = SrcAttributeType.DATE.upper().replace(' ', '_')
txt = str(self.date_citation)
self.input_dict[name] = txt
short_name = name + "_(SHORT)"
if self.input_dict.get(short_name) is None or \
(self.input_dict.get(short_name) and \
self.input_dict[short_name] == ("[" + short_name + "]")):
self.input_dict[short_name] = txt
# FIXME: REPOSITORY, REPOSITORY_ADDRESS and REPOSITORY_CALL_NUMBER all
# need to be added to the self.input_dict. See srctemplatetab.py
# _add_repo_entry()
def reference_L(self, attr_list=None):
"""
Return the list reference based on the passed source attribute list
If attr_list is None, same list as before is used.
"""
if attr_list:
self.set_attr_list(attr_list)
if self.refL is not None:
return self.refL
self.refL = self._reference(REF_TYPE_L)
return self.refL
def reference_S(self, attr_list=None, attr_list_citation=None, date_citation=None):
"""
Return the short reference based on the passed source attribute list
If attr_list is None, same list as
before is used.
"""
if attr_list or attr_list_citation or date_citation:
self.set_attr_list(attr_list, attr_list_citation, date_citation)
if self.refS is not None:
return self.refS
self.refS = self._reference(REF_TYPE_S)
return self.refS
def reference_F(self, attr_list=None, attr_list_citation=None, date_citation=None):
"""
Return the full reference based on the passed source attribute list
If attr_list is None, same list as before is used.
"""
if attr_list or attr_list_citation or date_citation:
self.set_attr_list(attr_list, attr_list_citation, date_citation)
if self.refF is not None:
return self.refF
self.refF = self._reference(REF_TYPE_F)
return self.refF
def _reference(self, reftype, gedcomfield=None):
"""
Compute the reference based on data present.
"""
# http://bugs.python.org/issue6081
class DefaultBlank(dict):
def __missing__(self, key):
return ""
class DefaultKey(dict):
def __missing__(self, key):
return "[" + key + "]"
ged_table = {
GED_AUTHOR : "GEDCOM_A",
GED_TITLE : "GEDCOM_T",
GED_PUBINF : "GEDCOM_P",
GED_DATE : "GEDCOM_D",
GED_PAGE : "GEDCOM_PAGE",
}
if gedcomfield:
return (self.get_map_element(ged_table[gedcomfield]) %
DefaultKey(self.input_dict)) or ""
use_CSL = False
try:
import citeproc
if sys.version_info[0] >= 3:
use_CSL = True
except:
pass
if use_CSL:
# -----------------------------------------------------------------
# Construct the standard output-elements
self.output_dict = OrderedDict()
LOG.debug(self.get_map_dict())
LOG.debug("input_attributes \n" +
"".join(("%s: %s\n" % item) for item in list(self.input_dict.items())))
for key, val in list(self.get_map_dict().items()):
if key[0].islower():
try:
self.output_dict[key] = val % DefaultBlank(self.input_dict)
except:
LOG.warn("key error with key %s; val %s; input_dict %s" %
(key, val, self.input_dict))
self.output_dict[key] = ""
LOG.debug("CSL_attributes \n" +
"".join(("%s: %s\n" % item) for item in list(self.output_dict.items())))
# Temporary fix for not implemented yet templates
if len(self.output_dict) == 0:
return ""
# Now fix CSL attributes that need special sub-elements
for name in ["author", "container_author", "some other name"]:
if name in self.output_dict:
self.output_dict[name] = [{"family": self.output_dict[name],
"given": ""}]
# -----------------------------------------------------------------
# Modify the output-elements to allow the standard Chicago style to
# format the citations close to Evidence Style
# literal dates are not specially treated. Date accessed is converted to
# a literal publication date to conform to how ESM formats the accessed
# date
if "accessed" in self.output_dict:
self.output_dict["issued"] = {'literal' : "accessed " + self.output_dict['accessed']}
del self.output_dict['accessed']
# Website is rendered as publisher_place to conform to how ESM renders
# it.
if "url" in self.output_dict:
self.output_dict["publisher_place"] = \
self.output_dict["publisher_place"] if "publisher_place" in self.output_dict \
else "" + self.output_dict["url"]
LOG.debug("self.output_dictibutes modified \n" +
"".join((" %s: %s\n" % item) for item in self.output_dict.items()))
try:
(refF, refS, refL) = self.get_CSL_references(self.output_dict)
if reftype == REF_TYPE_F:
return refF
elif reftype == REF_TYPE_S:
return refS
else:
return refL
except:
print(sys.exc_info()[0], sys.exc_info()[1])
return ""
else:
# -----------------------------------------------------------------
# Construct the standard output-elements
ref_table = {
REF_TYPE_L : "EE_L",
REF_TYPE_F : "EE_F",
REF_TYPE_S : "EE_S",
}
return (self.get_map_element(ref_table[reftype]) %
DefaultKey(self.input_dict)) or ""
def get_CSL_references(self, CSL_attributes):
# Import the citeproc-py classes we'll use below.
from citeproc import CitationStylesStyle, CitationStylesBibliography
from citeproc import Citation, CitationItem
from citeproc import formatter, Locator
from citeproc.source.json import CiteProcJSON
# Process the JSON data to generate a citeproc-py BibliographySource.
if 'locator' in CSL_attributes:
loc = Locator("page", CSL_attributes["locator"])
import copy
c1 = copy.deepcopy(CSL_attributes)
c2 = copy.deepcopy(CSL_attributes)
bib_source = {"full": c1, "subs" : c2}
bib_source = {"full": c1}
# for key, entry in bib_source.items():
# print(key)
# for name, value in entry.items():
# print(' {}: {}'.format(name, value))
# load a CSL style (from the current directory)
bib_style = CitationStylesStyle('chicago-fullnote-bibliography-no-ibid.csl')
# Create the citeproc-py bibliography, passing it the:
# * CitationStylesStyle,
# * BibliographySource (CiteProcJSON in this case), and
# * a formatter (plain, html, or you can write a custom formatter)
bibliography = CitationStylesBibliography(bib_style, bib_source, formatter.plain)
# Processing citations in a document need to be done in two passes as for some
# CSL styles, a citation can depend on the order of citations in the
# bibliography and thus on citations following the current one.
# For this reason, we first need to register all citations with the
# CitationStylesBibliography.
if loc:
citation1 = Citation([CitationItem('full', locator=loc)])
citation2 = Citation([CitationItem('subs', locator=loc)])
else:
citation1 = Citation([CitationItem('full')])
citation2 = Citation([CitationItem('subs')])
citation1 = Citation([CitationItem('full')])
bibliography.register(citation1)
bibliography.register(citation2)
# In the second pass, CitationStylesBibliography can generate citations.
# CitationStylesBibliography.cite() requires a callback function to be passed
# along to be called in case a CitationItem's key is not present in the
# bilbiography.
def warn(citation_item):
print("WARNING: Reference with key '{}' not found in the bibliography."
.format(citation_item.key))
print('Citations')
print('---------')
print(bibliography.cite(citation1, warn))
print(bibliography.cite(citation2, warn))
# And finally, the bibliography can be rendered.
print('')
print('Bibliography')
print('------------')
print(bibliography.bibliography())
return(bibliography.cite(citation1, warn),
bibliography.cite(citation2, warn),
bibliography.bibliography())
def author_gedcom(self, attr_list=None):
if attr_list:
self.set_attr_list(attr_list)
return self._reference(REF_TYPE_L, GED_AUTHOR)
def title_gedcom(self, attr_list=None):
if attr_list:
self.set_attr_list(attr_list)
return self._reference(REF_TYPE_L, GED_TITLE)
def pubinfo_gedcom(self, attr_list=None):
if attr_list:
self.set_attr_list(attr_list)
return self._reference(REF_TYPE_L, GED_PUBINF)
def page_gedcom(self, attr_list=None):
if attr_list:
self.set_attr_list(attr_list)
return self._reference(REF_TYPE_F, GED_PAGE)
class TemplateElement(SecondaryObject):
"""
TemplateEelement class.

448
gramps/gen/utils/citeref.py Normal file
View File

@ -0,0 +1,448 @@
# -*- coding: utf-8 -*-
#
# Gramps - a GTK+/GNOME based genealogy program
#
# Copyright (C) 2013 Benny Malengier
# Copyright (C) 2013 Tim G L Lyons
#
# 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$
"""
Utility functions to create citation references for Gramps Sources and
Citations.
"""
#-------------------------------------------------------------------------
#
# Python modules
#
#-------------------------------------------------------------------------
from __future__ import print_function
from collections import defaultdict, OrderedDict
import sys
#-------------------------------------------------------------------------
#
# GRAMPS modules
#
#-------------------------------------------------------------------------
from ..const import GRAMPS_LOCALE as glocale
_ = glocale.translation.gettext
from gramps.gen.lib.srcattrtype import SrcAttributeType
#------------------------------------------------------------------------
#
# Set up logging
#
#------------------------------------------------------------------------
import logging
LOG = logging.getLogger('.template')
#-------------------------------------------------------------------------
#
# The functions are passed either a Source object or a Citation object or both.
# They call set_input_dict_and_template to construct a dictionary of template input elements
# to values. This dictionary includes the Date value and any Repository values
# although these are not stored as attributes.
#
# For the GEDCOM fields, the mapping is done immediately. For the bibliographic
# items, 'reference' is called to construct the various citation references.
#
#-------------------------------------------------------------------------
# The predefined template mappings are given names starting with underscore so
# they can be distinguished from CSL mappings.
REF_TYPE_F = "_full" # Full footnote citation to a source
REF_TYPE_S = "_subsequent" # Short footnote citation to a source
REF_TYPE_L = "_bibliography" # Listed reference of the source (no citation info)
GED_AUTHOR = "_GEDCOM_A"
GED_TITLE = "_GEDCOM_T"
GED_PUBINF = "_GEDCOM_P"
GED_DATE = "_GEDCOM_D"
GED_PAGE = "_GEDCOM_PAGE"
refL = None
refF = None
refS = None
input_dict = defaultdict(str)
template_cache = None
def reference_L(db, source=None):
"""
Return the list reference (bibliography entry) based on the passed source
If source is None, the same input_dict as before is used.
"""
global refL
if source:
set_input_dict_and_template(db, source)
if refL is not None:
return refL
refL = _reference(db, REF_TYPE_L)
return refL
def reference_S(db, source=None, citation=None):
"""
Return the short reference based on the passed source and/or citation
If both source and citation are None, the same list as before is used.
"""
global refS
if source or citation:
set_input_dict_and_template(db, source, citation)
if refS is not None:
return refS
refS = _reference(db, REF_TYPE_S)
return refS
def reference_F(db, source=None, citation=None):
"""
Return the full reference based on the passed source and/or citation
If both source and citation are None, the same list as before is used.
"""
global refF
if source or citation:
set_input_dict_and_template(db, source, citation)
if refF is not None:
return refF
refF = _reference(db, REF_TYPE_F)
return refF
def get_gedcom_title(db, source=None):
global template_cache, source_cache
if source:
set_input_dict_and_template(db, source)
if template_cache is None:
if source:
return source.get_name()
else:
return source_cache.get_name()
return (template_cache.get_map_element(GED_TITLE) %
DefaultKey(input_dict)) or ""
def get_gedcom_author(db, source=None):
global template_cache, source_cache
if source:
set_input_dict_and_template(db, source)
if template_cache is None:
return "author not available"
return (template_cache.get_map_element(GED_AUTHOR) %
DefaultKey(input_dict)) or ""
def get_gedcom_pubinfo(db, source=None):
global template_cache, source_cache
if source:
set_input_dict_and_template(db, source)
if template_cache is None:
return "pubinfo not available"
return (template_cache.get_map_element(GED_PUBINF) %
DefaultKey(input_dict)) or ""
def get_gedcom_page(db, citation=None):
global template_cache
if citation:
set_input_dict_and_template(db, source=None, citation=citation)
if template_cache is None:
return "page not available"
return (template_cache.get_map_element(GED_PAGE) %
DefaultKey(input_dict)) or ""
# http://bugs.python.org/issue6081
class DefaultBlank(dict):
def __missing__(self, key):
return ""
class DefaultKey(dict):
def __missing__(self, key):
return "[" + key + "]"
def empty():
"""
remove all computed data
"""
global refL, refF, refS, input_dict, template_cache, source_cache
refL = None
refF = None
refS = None
input_dict = defaultdict(str)
template_cache = None
source_cache = None
def set_input_dict_and_template(db, source=None, citation=None):
"""
Set the attribute dictionary of this template. Setting once for different
references saves some time.
attr_list should be the source attribute list
If citation given, citation attributes overrule source attributes for
the Full and Short references
The citation date is not stored as attribute, so pass Date() object via
date_citation if a date is known.
"""
global refL, refF, refS, input_dict, template_cache, source_cache
empty()
# Find the template
if not source and not citation:
# No source and no citation
raise NotImplementedError
elif not source:
# Citation and no source
# citation will be used to obtain the source
source_handle = citation.get_reference_handle()
source_cache = db.get_source_from_handle(source_handle)
template_handle = source_cache.get_template()
if template_handle is None:
return
template_cache = db.get_template_from_handle(template_handle)
attr_list = source_cache.get_attribute_list() + citation.get_attribute_list()
date_citation = citation.get_date_object()
elif citation:
#source and citation are given
source_cache = source
# FIXME: as both a source and a citation have been given, they should be
# connected, so a check for that should be made here. However, in
# editsource, the 'refernce_handle' for a new citation to an existing
# source is only set in __base_save when data is saved to the database.
# Hence the check cannot be done at the moment.
# if not (citation.get_reference_handle() == source_cache.handle):
# raise Exception('Citation must be a Citation of the Source being cited')
template_handle = source_cache.get_template()
if template_handle is None:
return
template_cache = db.get_template_from_handle(template_handle)
attr_list = source_cache.get_attribute_list() + citation.get_attribute_list()
date_citation = citation.get_date_object()
else:
# Source and no citation
source_cache = source
template_handle = source_cache.get_template()
if template_handle is None:
return
template_cache = db.get_template_from_handle(template_handle)
attr_list = source_cache.get_attribute_list()
date_citation = None
# -----------------------------------------------------------------
# Construct the input dictionary
# First pre-load the dictionary with default settings for citations
if not citation:
for te in [x for x in template_cache.get_template_element_list()
if x.get_citation()]:
name = str(SrcAttributeType(te.get_name())).upper().replace(' ', '_')
if te.get_display():
val = te.get_display().upper().replace(' ', '_')
else:
val = name
input_dict[name] = "[" + val + "]"
# Now get the actual attribute values. store attributes in a dict last
# to first. this overwrites data so first attribute will be the one
# taken if duplicates are present
for input_attr in attr_list[::-1]:
typ = input_attr.get_type()
if typ.is_custom():
name = str(typ).upper().replace(' ', '_')
else:
name = typ.xml_str().upper().replace(' ', '_')
input_dict[name] = input_attr.get_value()
# if we haven't already got a value for the short attribute, we
# store the long attribute in the short attribute
if not name.endswith("(SHORT)"):
short_name = name + "_(SHORT)"
if input_dict.get(short_name) is None or \
(input_dict.get(short_name) and \
input_dict[short_name] == ("[" + short_name + "]")):
input_dict[short_name] = input_dict[name]
if date_citation and (not date_citation.is_empty()):
#we store the date of the citation
name = SrcAttributeType.DATE.upper().replace(' ', '_')
txt = str(date_citation)
input_dict[name] = txt
short_name = name + "_(SHORT)"
if input_dict.get(short_name) is None or \
(input_dict.get(short_name) and \
input_dict[short_name] == ("[" + short_name + "]")):
input_dict[short_name] = txt
# FIXME: REPOSITORY, REPOSITORY_ADDRESS and REPOSITORY_CALL_NUMBER all
# need to be added to the input_dict. See srctemplatetab.py
# _add_repo_entry()
def _reference(self, reftype):
"""
Compute the reference based on data present.
"""
global refL, refF, refS, input_dict, template_cache
if template_cache is None:
return ""
use_CSL = False
try:
import citeproc
if sys.version_info[0] >= 3:
use_CSL = True
except:
pass
if use_CSL:
# -----------------------------------------------------------------
# Construct the standard output-elements
self.output_dict = OrderedDict()
LOG.debug(self.get_map_dict())
LOG.debug("input_attributes \n" +
"".join(("%s: %s\n" % item) for item in list(input_dict.items())))
for key, val in list(self.get_map_dict().items()):
if not key.startswith("_"):
try:
self.output_dict[key] = val % DefaultBlank(input_dict)
except:
LOG.warn("key error with key %s; val %s; input_dict %s" %
(key, val, input_dict))
self.output_dict[key] = ""
LOG.debug("CSL_attributes \n" +
"".join(("%s: %s\n" % item) for item in list(self.output_dict.items())))
# Temporary fix for not implemented yet templates
if len(self.output_dict) == 0:
return ""
# Now fix CSL attributes that need special sub-elements
for name in ["author", "container_author", "some other name"]:
if name in self.output_dict:
self.output_dict[name] = [{"family": self.output_dict[name],
"given": ""}]
# -----------------------------------------------------------------
# Modify the output-elements to allow the standard Chicago style to
# format the citations close to Evidence Style
# literal dates are not specially treated. Date accessed is converted to
# a literal publication date to conform to how ESM formats the accessed
# date
if "accessed" in self.output_dict:
self.output_dict["issued"] = {'literal' : "accessed " + self.output_dict['accessed']}
del self.output_dict['accessed']
# Website is rendered as publisher_place to conform to how ESM renders
# it.
if "url" in self.output_dict:
self.output_dict["publisher_place"] = \
self.output_dict["publisher_place"] if "publisher_place" in self.output_dict \
else "" + self.output_dict["url"]
LOG.debug("self.output_dictibutes modified \n" +
"".join((" %s: %s\n" % item) for item in self.output_dict.items()))
try:
(refF, refS, refL) = self.get_CSL_references(self.output_dict)
if reftype == REF_TYPE_F:
return refF
elif reftype == REF_TYPE_S:
return refS
else:
return refL
except:
print(sys.exc_info()[0], sys.exc_info()[1])
return ""
else:
# -----------------------------------------------------------------
# Construct the standard output-elements
return (template_cache.get_map_element(reftype) %
DefaultKey(input_dict)) or ""
def get_CSL_references(self, CSL_attributes):
# Import the citeproc-py classes we'll use below.
from citeproc import CitationStylesStyle, CitationStylesBibliography
from citeproc import Citation, CitationItem
from citeproc import formatter, Locator
from citeproc.source.json import CiteProcJSON
# Process the JSON data to generate a citeproc-py BibliographySource.
if 'locator' in CSL_attributes:
loc = Locator("page", CSL_attributes["locator"])
import copy
c1 = copy.deepcopy(CSL_attributes)
c2 = copy.deepcopy(CSL_attributes)
bib_source = {"full": c1, "subs" : c2}
bib_source = {"full": c1}
# for key, entry in bib_source.items():
# print(key)
# for name, value in entry.items():
# print(' {}: {}'.format(name, value))
# load a CSL style (from the current directory)
bib_style = CitationStylesStyle('chicago-fullnote-bibliography-no-ibid.csl')
# Create the citeproc-py bibliography, passing it the:
# * CitationStylesStyle,
# * BibliographySource (CiteProcJSON in this case), and
# * a formatter (plain, html, or you can write a custom formatter)
bibliography = CitationStylesBibliography(bib_style, bib_source, formatter.plain)
# Processing citations in a document need to be done in two passes as for some
# CSL styles, a citation can depend on the order of citations in the
# bibliography and thus on citations following the current one.
# For this reason, we first need to register all citations with the
# CitationStylesBibliography.
if loc:
citation1 = Citation([CitationItem('full', locator=loc)])
citation2 = Citation([CitationItem('subs', locator=loc)])
else:
citation1 = Citation([CitationItem('full')])
citation2 = Citation([CitationItem('subs')])
citation1 = Citation([CitationItem('full')])
bibliography.register(citation1)
bibliography.register(citation2)
# In the second pass, CitationStylesBibliography can generate citations.
# CitationStylesBibliography.cite() requires a callback function to be passed
# along to be called in case a CitationItem's key is not present in the
# bilbiography.
def warn(citation_item):
print("WARNING: Reference with key '{}' not found in the bibliography."
.format(citation_item.key))
print('Citations')
print('---------')
print(bibliography.cite(citation1, warn))
print(bibliography.cite(citation2, warn))
# And finally, the bibliography can be rendered.
print('')
print('Bibliography')
print('------------')
print(bibliography.bibliography())
return(bibliography.cite(citation1, warn),
bibliography.cite(citation2, warn),
bibliography.bibliography())

View File

@ -28,6 +28,14 @@
#-------------------------------------------------------------------------
from gi.repository import Gtk
#-------------------------------------------------------------------------
#
# GRAMPS modules
#
#-------------------------------------------------------------------------
from gramps.gen.utils.citeref import get_gedcom_author
#-------------------------------------------------------------------------
#
# CitationModel
@ -41,6 +49,6 @@ class CitationRefModel(Gtk.ListStore):
for handle in citation_list:
citation = self.db.get_citation_from_handle(handle)
src = self.db.get_source_from_handle(citation.get_reference_handle())
self.append(row=[src.get_name(), src.get_gedcom_author(), citation.get_name(),
self.append(row=[src.get_name(), get_gedcom_author(self.db, src), citation.get_name(),
citation.gramps_id, citation.get_privacy(),
handle, ])

View File

@ -50,8 +50,7 @@ LOG = logging.getLogger('.template')
# Gramps libraries
#
#-------------------------------------------------------------------------
from gramps.gen.lib.srcattrtype import (SrcAttributeType, REF_TYPE_F,
REF_TYPE_S, REF_TYPE_L, EMPTY)
from gramps.gen.lib.srcattrtype import SrcAttributeType
from gramps.gen.lib import SrcAttribute, SrcTemplate
from gramps.gen.plug.report.utils import get_address_ref_str
from ...autocomp import StandardCustomSelector
@ -60,6 +59,7 @@ from ...widgets import (UndoableEntry, MonitoredEntryIndicator, MonitoredDate,
ValidatableMaskedEntry)
from .grampstab import GrampsTab
from gramps.gen.constfunc import STRTYPE
from gramps.gen.utils.citeref import get_gedcom_title
#-------------------------------------------------------------------------
#
@ -148,9 +148,7 @@ class SrcTemplateTab(GrampsTab):
If title of the source is what we would set with autotitle, we set
the checkbox to true. Otherwise to False
"""
srctemp = self.db.get_template_from_handle(self.src.get_template())
srctemp.set_attr_list(self.src.get_attribute_list())
title = srctemp.title_gedcom()
title = get_gedcom_title(self.dbstate.db, self.src)
if self.src.get_title() == title:
self.autoset_title = True
else:
@ -311,7 +309,6 @@ class TemplateFields(object):
Note srcattrtype should actually be the English name of the type!
"""
self.gridfields.insert_row(row)
field = srcattrtype
#setup label
if alt_label:
label = _(alt_label)

View File

@ -44,7 +44,7 @@ from gi.repository import Gtk, Gdk
# gramps modules
#
#-------------------------------------------------------------------------
from gramps.gen.lib import NoteType, Source, SrcTemplate, Citation
from gramps.gen.lib import NoteType, Source, Citation
from gramps.gen.db import DbTxn
from gramps.gen.utils.file import media_path_full
from ..thumbnails import get_thumbnail_image
@ -61,6 +61,10 @@ from ..widgets import (MonitoredEntry, PrivacyButton, MonitoredTagList,
from ..dialog import ErrorDialog, QuestionDialog2
from ..utils import is_right_click, open_file_with_default_application
from ..glade import Glade
from gramps.gen.utils.citeref import (set_input_dict_and_template, reference_L,
reference_S, reference_F,
get_gedcom_title, get_gedcom_author,
get_gedcom_pubinfo)
#-------------------------------------------------------------------------
#
@ -83,7 +87,6 @@ class EditSource(EditPrimary):
nothing made!)
"""
self.db = dbstate.db
self.srctemp = None
self.citation = citation
self.template_tab = None
self.attr_tab = None
@ -107,6 +110,8 @@ class EditSource(EditPrimary):
self.citation_loaded = False
#we put an empty base citation ready.
self.citation = Citation()
if source.get_template() is None:
source.set_template(dbstate.db.get_GEDCOM_template_handle())
self.callertitle = callertitle
self.citation_ready = False
@ -350,28 +355,19 @@ class EditSource(EditPrimary):
"""
Reaction to update on attributes
"""
if self.srctemp is None or \
self.obj.get_template() != self.srctemp.get_name():
self.srctemp = self.db.get_template_from_handle(self.obj.get_template())
#set new attrlist in template
if self.citation_loaded:
citeattr = self.citation.get_attribute_list()
citedate = self.citation.get_date_object()
citation = self.citation
else:
citeattr = None
citedate = None
self.srctemp.set_attr_list(self.obj.get_attribute_list(), citeattr,
citedate)
citation = None
set_input_dict_and_template(self.db, self.obj, citation)
#set fields with the template
self.refL.set_markup(self.srctemp.reference_L())
self.refF.set_markup(self.srctemp.reference_F())
self.refS.set_markup(self.srctemp.reference_S())
self.author.set_markup(self.srctemp.author_gedcom())
self.pubinfo.set_markup(self.srctemp.pubinfo_gedcom())
self.refL.set_markup(reference_L(self.db))
self.refF.set_markup(reference_F(self.db))
self.refS.set_markup(reference_S(self.db))
self.author.set_markup(get_gedcom_author(self.db))
self.pubinfo.set_markup(get_gedcom_pubinfo(self.db))
if self.template_tab and self.template_tab.autoset_title:
title = self.srctemp.title_gedcom()
title = get_gedcom_title(self.db)
self.obj.set_name(title)
self.title.update()
#lastly update the window title

View File

@ -2,7 +2,7 @@
# Gramps - a GTK+/GNOME based genealogy program
#
# Copyright (C) 2000-2006 Donald N. Allingham
# Copyright (C) 2011 Tim G L Lyons, Nick Hall
# Copyright (C) 2011-2013 Tim G L Lyons, Nick Hall
#
# 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
@ -45,6 +45,7 @@ from gramps.gen.utils.string import confidence
from gramps.gen.config import config
from gramps.gen.constfunc import cuni
from gramps.gen.const import GRAMPS_LOCALE as glocale
from gramps.gen.utils.citeref import get_gedcom_author, get_gedcom_pubinfo
#-------------------------------------------------------------------------
#
@ -184,7 +185,7 @@ class CitationBaseModel(object):
source_handle = data[COLUMN_SOURCE]
try:
source = self.db.get_source_from_handle(source_handle)
return cuni(source.get_gedcom_author())
return cuni(get_gedcom_author(self.db, source))
except:
return ''
@ -201,7 +202,7 @@ class CitationBaseModel(object):
source_handle = data[COLUMN_SOURCE]
try:
source = self.db.get_source_from_handle(source_handle)
return cuni(source.get_gedcom_publication_info())
return cuni(get_gedcom_pubinfo(self.db, source))
except:
return ''
@ -247,14 +248,14 @@ class CitationBaseModel(object):
def source_src_auth(self, data):
source = self.db.get_source_from_handle(data[COLUMN2_HANDLE])
return cuni(source.get_gedcom_author())
return cuni(get_gedcom_author(self.db, source))
def source_src_abbr(self, data):
return cuni(data[COLUMN2_ABBREV])
def source_src_pinfo(self, data):
source = self.db.get_source_from_handle(data[COLUMN2_HANDLE])
return cuni(source.get_gedcom_publication_info())
return cuni(get_gedcom_pubinfo(self.db, source))
def source_src_private(self, data):
if data[COLUMN2_PRIV]:

View File

@ -2,6 +2,7 @@
# Gramps - a GTK+/GNOME based genealogy program
#
# Copyright (C) 2000-2006 Donald N. Allingham
# Copyright (C) 2013 Tim G L Lyons
#
# 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
@ -43,6 +44,8 @@ from gramps.gen.datehandler import format_time
from gramps.gen.constfunc import cuni
from .flatbasemodel import FlatBaseModel
from gramps.gen.const import GRAMPS_LOCALE as glocale
from gramps.gen.utils.citeref import (get_gedcom_title, get_gedcom_author,
get_gedcom_pubinfo)
COLUMN_HANDLE = 0
@ -117,7 +120,7 @@ class SourceModel(FlatBaseModel):
def column_author(self, data):
source = self.db.get_source_from_handle(data[COLUMN_HANDLE])
return cuni(source.get_gedcom_author())
return cuni(get_gedcom_author(self.db, source))
def column_template(self, data):
return cuni(data[COLUMN_TEMPLATE])
@ -130,7 +133,7 @@ class SourceModel(FlatBaseModel):
def column_pubinfo(self, data):
source = self.db.get_source_from_handle(data[COLUMN_HANDLE])
return cuni(source.get_gedcom_publication_info())
return cuni(get_gedcom_pubinfo(self.db, source))
def column_private(self, data):
if data[COLUMN_PRIV]:

View File

@ -71,7 +71,9 @@ class SrcTemplateTreeView(Gtk.TreeView):
self.make_columns()
self.selection = self.get_selection()
self.set_model(self.model)
self.goto(default_key)
if default_key:
# The default key, normally the GEDCOM template, is available
self.goto(default_key)
# set up selection and fields on click
self.connect('button-release-event', self._on_button_release)
self.connect('key_press_event', self._on_key_press_event)

View File

@ -43,6 +43,7 @@ csvfile = path_csv('evidence_style.csv')
#name of this style
style = 'EE'
input_type = 'csv'
#strings to translate
#following translations are generated with extract_trans_csv.py

View File

@ -0,0 +1,41 @@
# -*- coding: utf-8 -*-
#
# Gramps - a GTK+/GNOME based genealogy program
#
# Copyright (C) 2013 Tim G L Lyons
#
# 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$
"""
Registering srctemplates for GRAMPS.
"""
#
# SrcTemplates distributed with Gramps
#
# GEDCOM
plg = newplugin()
plg.id = 'GEDCOM styles'
plg.name = _("GEDCOM Source Templates")
plg.description = _("Defines source templates corresponding with GEDCOM.")
plg.version = '1.0'
plg.gramps_target_version = '4.1'
plg.status = STABLE
plg.fname = 'gedcomtemplate.py'
plg.ptype = SRCTEMPLATE

View File

@ -0,0 +1,193 @@
# -*- coding: utf-8 -*-
#
# Gramps - a GTK+/GNOME based genealogy program
#
# Copyright (C) 2013 Tim G L Lyons
#
# 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$
"""
Registering GEDCOM srctemplates for GRAMPS.
N.B. This is used both from creating a new database (when the database is in its
normal state), and
"""
#-------------------------------------------------------------------------
#
# Python modules
#
#-------------------------------------------------------------------------
from __future__ import print_function
#-------------------------------------------------------------------------
#
# GRAMPS modules
#
#-------------------------------------------------------------------------
from gramps.gen.const import GRAMPS_LOCALE as glocale
_ = glocale.translation.gettext
from gramps.gen.db import DbTxn
from gramps.gen.utils.id import create_id
from gramps.gen.lib.srctemplate import SrcTemplate, TemplateElement
from gramps.gen.utils.citeref import (REF_TYPE_L, REF_TYPE_S, REF_TYPE_F,
GED_TITLE, GED_AUTHOR, GED_PUBINF,
GED_DATE, GED_PAGE)
#------------------------------------------------------------------------
#
# Set up logging
#
#------------------------------------------------------------------------
import logging
LOG = logging.getLogger('.template')
#
# GEDCOM SrcTemplates distributed with Gramps
#
#name of this style
style = 'GEDCOM'
input_type = 'code'
def load_template(db):
# Don't load the GEDCOM template twice
if db.get_GEDCOM_template_handle() is None:
template = build_GEDCOM_template()
msg = _("Add template (%s)") % template.get_name()
with DbTxn(msg, db) as trans:
db.commit_template(template, trans)
db.set_GEDCOM_template_handle(template.get_handle())
def build_GEDCOM_template():
"""
Builds the GEDCOM template. This does not commit the template to the
database. For Upgrade commit is done in the upgrade code. For new databases,
commit is done by load_template function.
"""
EMPTY = 0
DESCR = -10
# template to GEDCOM field mapping for L reference fields
# template to a style mapping
STYLE_QUOTE = 1 # add quotes around the field
DEFAULTS = {
"Author" : ("Doe, D.P. & Cameron, E." , "Give names in following form:'FirstAuthorSurname, Given Names & SecondAuthorSurname, Given Names'. Like this Gramps can parse the name and shorten as needed."),
"Date" : ("17 Sep 1745" , "The date that this event data was entered into the original source document. ."),
"Page" : ("5; or 4,6-8, ..." , "Specific location with in the information referenced. For a published work, this could include the volume of a multi-volume work and the page number(s). For a periodical, it could include volume, issue, and page numbers. For a newspaper, it could include a column number and page number. For an unpublished source, this could be a sheet number, page number, frame number, etc. A census record might have a line number or dwelling and family numbers in addition to the page number. "),
"Pub_info" : ("Springer, Berlin, 2014" , "When and where the record was created. For published works, this includes information such as the city of publication, name of the publisher, and year of publication."),
"Title" : ("Diary Title, Message Title, Bible Name, Article Title, ..." , "The title of the work, record, or item and, when appropriate, the title of the larger work or series of which it is a part."),
}
TEMPLATES = {
'GEDCOM': {
REF_TYPE_L: [
('', "Author", '', '.', EMPTY, False, False, EMPTY, GED_AUTHOR,
None, None),
('', "Title", '', '.', STYLE_QUOTE, False, False, EMPTY, GED_TITLE,
None, None),
('', "Pub_info", '', '', EMPTY, False, False, EMPTY, GED_PUBINF,
None, None),
],
REF_TYPE_F: [
('', "Author", '', ',', EMPTY, False, False, EMPTY, EMPTY,
None, None),
('', "Title", '', ',', STYLE_QUOTE, False, False, EMPTY, EMPTY,
None, None),
('', "Pub_info", '', '.', EMPTY, False, False, EMPTY, EMPTY,
None, None),
('', "Date", '', ' -', EMPTY, False, False, EMPTY, EMPTY,
None, None),
('', "Page", 'Page(s)', '.', EMPTY, False, False, EMPTY, EMPTY,
None, None),
],
REF_TYPE_S: [
('', "Author", '', ',', EMPTY, False, False, EMPTY, EMPTY,
None, None),
('', "Date", '', ' -', EMPTY, False, False, EMPTY, EMPTY,
None, None),
('', "Page", 'Page(s)', '.', EMPTY, False, False, EMPTY, EMPTY,
None, None),
],
DESCR: '%(first)s - %(sec)s - %(third)s' % { 'first': _('Basic'), 'sec': _('GEDCOM Style'), 'third': _('')},
},
}
template = SrcTemplate()
template.set_name('GEDCOM')
template.set_descr('%(first)s - %(sec)s - %(third)s' % { 'first': _('Basic'), 'sec': _('GEDCOM Style'), 'third': _('')})
handle = create_id()
template.set_handle(handle)
for (cite_type, slist) in list(TEMPLATES['GEDCOM'].items()):
if cite_type != DESCR:
for struct in slist:
if cite_type == REF_TYPE_L or cite_type == REF_TYPE_F:
elem = [x for x in template.get_template_element_list()
if x.get_name()==struct[1] and x.get_short()==False]
if elem:
te = elem[0]
else:
te = TemplateElement()
template.add_template_element(te)
elif cite_type == REF_TYPE_S:
te = TemplateElement()
template.add_template_element(te)
ldel = struct[0]
field_type = struct[1]
field_label = struct[2]
rdel = struct[3]
style = struct[4]
private = struct[5]
optional = struct[6]
shorteralg = struct[7]
gedcommap = struct[8]
hint = struct[9]
tooltip = struct[10]
te.set_name(field_type)
te.set_display(field_label)
if DEFAULTS.get(field_type):
te.set_hint(hint or (DEFAULTS[field_type][0] or ""))
te.set_tooltip(tooltip or (DEFAULTS[field_type][1] or ""))
else:
te.set_hint("")
te.set_tooltip("")
if cite_type == REF_TYPE_S:
te.set_short(True)
if field_type.lower().endswith(' (short)'):
te.set_name(field_type)
else:
te.set_name(field_type + ' (Short)')
if field_type == "Page" or \
field_type == "Date":
te.set_citation(True)
template.set_map_element(GED_AUTHOR, "%(AUTHOR)s")
template.set_map_element(GED_TITLE, "%(TITLE)s")
template.set_map_element(GED_PUBINF, "%(PUB_INFO)s")
template.set_map_element(GED_DATE, "%(DATE)s")
template.set_map_element(GED_PAGE, "%(PAGE)s")
template.set_map_element(REF_TYPE_L, "%(AUTHOR)s. %(TITLE)s. %(PUB_INFO)s")
template.set_map_element(REF_TYPE_F, "%(AUTHOR)s, %(TITLE)s, %(PUB_INFO)s. %(DATE)s - %(PAGE)s")
template.set_map_element(REF_TYPE_S, "%(AUTHOR_(SHORT))s, %(DATE_(SHORT))s - %(PAGE_(SHORT))s.")
return template

View File

@ -49,6 +49,9 @@ from gramps.gen.utils.id import create_id
from gramps.gen.lib.srcattrtype import *
from gramps.gen.lib.date import Date
from gramps.gen.lib.srctemplate import SrcTemplate, TemplateElement
from gramps.gen.utils.citeref import (REF_TYPE_L, REF_TYPE_S, REF_TYPE_F,
GED_TITLE, GED_AUTHOR, GED_PUBINF,
GED_DATE, GED_PAGE)
#------------------------------------------------------------------------
#
@ -184,9 +187,6 @@ def load_srctemplates_data(db):
Loads the srctemplates defined, and returns a dict with template data
"""
LOG.debug("**** load_srctemplate_data. Starting")
load_srctemplate_gedcom(db)
LOG.debug("**** load_srctemplate_data. GEDCOM and UNKNOWN loaded")
from gramps.gen.plug import BasePluginManager
bpmgr = BasePluginManager.get_instance()
@ -195,16 +195,20 @@ def load_srctemplates_data(db):
for plugin in pdatas:
mod = bpmgr.load_plugin(plugin)
if mod:
csvfilename = mod.csvfile
LOG.debug("**** load_srctemplate_data. Loading csv from %s" % csvfilename)
if sys.version_info[0] <3:
with open(csvfilename, 'rb') as csvfile:
load_srctemplate_csv(csvfile, db)
else:
with open(csvfilename, 'r') as csvfile:
load_srctemplate_csv(csvfile, db)
LOG.debug("**** load_srctemplate_data. csv data loaded")
if mod.input_type == 'csv':
csvfilename = mod.csvfile
LOG.debug("**** load_srctemplate_data. Loading csv from %s" % csvfilename)
if sys.version_info[0] <3:
with open(csvfilename, 'rb') as csvfile:
load_srctemplate_csv(csvfile, db)
else:
with open(csvfilename, 'r') as csvfile:
load_srctemplate_csv(csvfile, db)
LOG.debug("**** load_srctemplate_data. csv data loaded")
elif mod.input_type == 'code':
mod.load_template(db)
LOG.debug("**** load_srctemplate_data. GEDCOM loaded")
for handle in db.get_template_handles():
LOG.debug("handle %s" % handle)
@ -223,144 +227,6 @@ def load_srctemplates_data(db):
(template.get_name(), target, template.get_map_element(target)))
LOG.debug("**** load_srctemplate_data. finished")
def load_srctemplate_gedcom(db):
"""
Loads the GEDCOM and UNKNOWN templates which are always pre-defined
"""
global DEFAULTS
TEMPLATES = {
'GEDCOM': {
REF_TYPE_L: [
('', "Author", '', '.', EMPTY, False, False, EMPTY, GED_AUTHOR,
None, None),
('', "Title", '', '.', STYLE_QUOTE, False, False, EMPTY, GED_TITLE,
None, None),
('', "Pub_info", '', '', EMPTY, False, False, EMPTY, GED_PUBINF,
None, None),
],
REF_TYPE_F: [
('', "Author", '', ',', EMPTY, False, False, EMPTY, EMPTY,
None, None),
('', "Title", '', ',', STYLE_QUOTE, False, False, EMPTY, EMPTY,
None, None),
('', "Pub_info", '', '.', EMPTY, False, False, EMPTY, EMPTY,
None, None),
('', "Date", '', ' -', EMPTY, False, False, EMPTY, EMPTY,
None, None),
('', "Page", 'Page(s)', '.', EMPTY, False, False, EMPTY, EMPTY,
None, None),
],
REF_TYPE_S: [
('', "Author", '', ',', EMPTY, False, False, EMPTY, EMPTY,
None, None),
('', "Date", '', ' -', EMPTY, False, False, EMPTY, EMPTY,
None, None),
('', "Page", 'Page(s)', '.', EMPTY, False, False, EMPTY, EMPTY,
None, None),
],
DESCR: '%(first)s - %(sec)s - %(third)s' % { 'first': _('Basic'), 'sec': _('GEDCOM Style'), 'third': _('')},
},
UNKNOWN: {
REF_TYPE_L: [
],
REF_TYPE_F: [
],
REF_TYPE_S: [
],
DESCR: _("Unrecognized Template. Download it's definition."),
},
}
template = SrcTemplate()
template.set_name('GEDCOM')
template.set_descr('%(first)s - %(sec)s - %(third)s' % { 'first': _('Basic'), 'sec': _('GEDCOM Style'), 'third': _('')})
handle = create_id()
template.set_handle(handle)
for (cite_type, slist) in list(TEMPLATES['GEDCOM'].items()):
if cite_type != DESCR:
for struct in slist:
if cite_type == REF_TYPE_L or cite_type == REF_TYPE_F:
elem = [x for x in template.get_template_element_list()
if x.get_name()==struct[1] and x.get_short()==False]
if elem:
te = elem[0]
else:
te = TemplateElement()
template.add_template_element(te)
elif cite_type == REF_TYPE_S:
te = TemplateElement()
template.add_template_element(te)
ldel = struct[0]
field_type = struct[1]
field_label = struct[2]
rdel = struct[3]
style = struct[4]
private = struct[5]
optional = struct[6]
shorteralg = struct[7]
gedcommap = struct[8]
hint = struct[9]
tooltip = struct[10]
te.set_name(field_type)
te.set_display(field_label)
if DEFAULTS.get(field_type):
te.set_hint(hint or (DEFAULTS[field_type][0] or ""))
te.set_tooltip(tooltip or (DEFAULTS[field_type][1] or ""))
else:
te.set_hint("")
te.set_tooltip("")
if cite_type == REF_TYPE_S:
te.set_short(True)
if field_type.lower().endswith(' (short)'):
te.set_name(field_type)
else:
te.set_name(field_type + ' (Short)')
if field_type == "Page" or \
field_type == "Date":
te.set_citation(True)
template.add_structure_element(cite_type, [(ldel, field_type,
field_label, rdel, style, private, optional,
shorteralg, gedcommap, hint, tooltip)])
template.set_map_element("GEDCOM_A", "%(AUTHOR)s")
template.set_map_element("GEDCOM_T", "%(TITLE)s")
template.set_map_element("GEDCOM_P", "%(PUB_INFO)s")
template.set_map_element("GEDCOM_D", "%(DATE)s")
template.set_map_element("GEDCOM_PAGE", "%(PAGE)s")
template.set_map_element("EE_L", "%(AUTHOR)s. %(TITLE)s. %(PUB_INFO)s")
template.set_map_element("EE_F", "%(AUTHOR)s, %(TITLE)s, %(PUB_INFO)s. %(DATE)s - %(PAGE)s")
template.set_map_element("EE_S", "%(AUTHOR_(SHORT))s, %(DATE_(SHORT))s - %(PAGE_(SHORT))s.")
msg = _("Add template (%s)") % template.get_name()
with DbTxn(msg, db) as trans:
db.commit_template(template, trans)
db.set_GEDCOM_template_handle(template.get_handle())
# for handle in db.get_template_handles():
# template = db.get_template_from_handle(handle)
# LOG.debug("source_type: %s; handle %s" % (template.get_name(), template.get_handle()))
# for te in template.get_template_element_list():
# LOG.debug(" name: %s; display: %s; hint: %s; tooltip: %s; citation %s; "
# "short %s; short_alg %s" %
# (te.get_name(),
# te.get_display(), te.get_hint(),
# te.get_tooltip(), te.get_citation(),
# te.get_short(), te.get_short_alg()
# ))
# Now load the UNKNOWN template
template = SrcTemplate()
template.set_name(UNKNOWN)
template.set_descr(_("Unrecognized Template. Download it's definition."))
handle = create_id()
template.set_handle(handle)
msg = _("Add template (%s)") % template.get_name()
with DbTxn(msg, db) as trans:
db.commit_template(template, trans)
for cite_type in (REF_TYPE_F, REF_TYPE_L, REF_TYPE_S):
template.add_structure_element(cite_type, [])
def load_srctemplate_csv(csvfile, db):
"""
Loads a template csvfile, and returns a dict with template data
@ -373,6 +239,19 @@ def load_srctemplate_csv(csvfile, db):
CITE_TYPES = {'F': REF_TYPE_F, 'L': REF_TYPE_L, 'S': REF_TYPE_S}
GEDCOMFIELDS = {'A': GED_AUTHOR, 'T': GED_TITLE,
'P': GED_PUBINF, 'D': GED_DATE}
EMPTY = 0
# template to a shortening algorithm mapping for predefined algorithms
SHORTERALG_LOC = 1 # reduce a location to a shorter format (typically city level)
SHORTERALG_YEAR = 2 # reduce a date to only the year part
SHORTERALG_ETAL = 3 # reduce an author list to "first author et al."
SHORTERALG_REVERT_TO_DOT = 4 # change a list of first, second, third to
# a list third. second. first.
# template to a style mapping
STYLE_QUOTE = 1 # add quotes around the field
STYLE_QUOTECONT = 2 # add quotes around this field combined with other
# QUOTECONT fields around it
STYLE_EMPH = 3 # emphasize field
STYLE_BOLD = 4 # make field bold
SHORTERALG = {'LOC': SHORTERALG_LOC, 'YEAR': SHORTERALG_YEAR,
'ETAL': SHORTERALG_ETAL, 'REV.': SHORTERALG_REVERT_TO_DOT}
STYLES = {'Quoted': STYLE_QUOTE, 'Italics': STYLE_EMPH,
@ -494,9 +373,6 @@ def load_srctemplate_csv(csvfile, db):
'normal_version_label': lblval})
template.add_template_element(te)
TYPE2FIELDS[source_type][cite_type].append(field_type)
template.add_structure_element(cite_type, [(row[LDELCOL], field_type,
field_label, row[RDELCOL], style, private, optional,
shorteralg, gedcommap, hint, tooltip)])
# Setup the mapping. A typical mapping would look like:
# ('EE_Full' : '%(COMPILER)s, "%(TITLE)s", %(TYPE)s, %(WEBSITE CREATOR/OWNER)s, <i>%(WEBSITE)s</i>, (%(URL (DIGITAL LOCATION))s: accessed %(DATE ACCESSED)s), %(ITEM OF INTEREST)s; %(CREDIT LINE)s.')