Update Gramps XML Import/Export to support Citations

svn: r18086
This commit is contained in:
Nick Hall 2011-08-30 12:34:46 +00:00
parent 5a3cef062c
commit afef197a57
5 changed files with 306 additions and 194 deletions

View File

@ -5,7 +5,7 @@
# #
# Copyright (C) 2001 Graham J. Williams # Copyright (C) 2001 Graham J. Williams
# Copyright (C) 2000-2007 Donald N. Allingham # Copyright (C) 2000-2007 Donald N. Allingham
# Copyright (C) 2010 Nick Hall # Copyright (C) 2010-2011 Nick Hall
# #
# This program is free software; you can redistribute it and/or modify # 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 # it under the terms of the GNU General Public License as published by
@ -25,15 +25,15 @@
--> -->
<!-- <!--
This is the Document Type Definition file for v1.4.0 This is the Document Type Definition file for v1.5.0
of the GRAMPS XML genealogy data format. of the GRAMPS XML genealogy data format.
Please use the following formal public identifier to identify it: Please use the following formal public identifier to identify it:
"-//GRAMPS//DTD GRAMPS XML V1.4.0//EN" "-//GRAMPS//DTD GRAMPS XML V1.5.0//EN"
For example: For example:
<!DOCTYPE database PUBLIC "-//GRAMPS//DTD GRAMPS XML V1.4.0//EN" <!DOCTYPE database PUBLIC "-//GRAMPS//DTD GRAMPS XML V1.5.0//EN"
"http://gramps-project.org/xml/1.4.0/grampsxml.dtd" "http://gramps-project.org/xml/1.5.0/grampsxml.dtd"
[...]> [...]>
--> -->
@ -48,6 +48,7 @@ DATABASE
families families
events events
places places
citations
sources sources
objects objects
repositories repositories
@ -59,9 +60,9 @@ DATABASE
--> -->
<!ELEMENT database (header, name-formats?, tags?, events?, people?, families?, <!ELEMENT database (header, name-formats?, tags?, events?, people?, families?,
sources?, places?, objects?, repositories?, notes?, citations?, sources?, places?, objects?, repositories?,
bookmarks?, namemaps?)> notes?, bookmarks?, namemaps?)>
<!ATTLIST database xmlns CDATA #FIXED "http://gramps-project.org/xml/1.4.0/"> <!ATTLIST database xmlns CDATA #FIXED "http://gramps-project.org/xml/1.5.0/">
<!-- ************************************************************ <!-- ************************************************************
@ -105,12 +106,11 @@ PEOPLE
<!ELEMENT person (gender, name*, eventref*, lds_ord*, <!ELEMENT person (gender, name*, eventref*, lds_ord*,
objref*, address*, attribute*, url*, childof*, objref*, address*, attribute*, url*, childof*,
parentin*, personref*, noteref*, sourceref*, tagref*)> parentin*, personref*, noteref*, citationref*, tagref*)>
<!ATTLIST person <!ATTLIST person
id CDATA #IMPLIED id CDATA #IMPLIED
handle ID #REQUIRED handle ID #REQUIRED
priv (0|1) #IMPLIED priv (0|1) #IMPLIED
marker CDATA #IMPLIED
change CDATA #REQUIRED change CDATA #REQUIRED
> >
@ -119,8 +119,9 @@ GENDER has values of M, F, or U.
--> -->
<!ELEMENT gender (#PCDATA)> <!ELEMENT gender (#PCDATA)>
<!ELEMENT name (first?, call?, surname*, nick?, familynick?, suffix?, title?, group? <!ELEMENT name (first?, call?, surname*, nick?, familynick?, suffix?, title?,
(daterange|datespan|dateval|datestr)?, noteref*, sourceref*)> group?, (daterange|datespan|dateval|datestr)?, noteref*,
citationref*)>
<!ATTLIST name <!ATTLIST name
alt (0|1) #IMPLIED alt (0|1) #IMPLIED
type CDATA #IMPLIED type CDATA #IMPLIED
@ -151,7 +152,7 @@ GENDER has values of M, F, or U.
<!ELEMENT parentin EMPTY> <!ELEMENT parentin EMPTY>
<!ATTLIST parentin hlink IDREF #REQUIRED> <!ATTLIST parentin hlink IDREF #REQUIRED>
<!ELEMENT personref (sourceref*, noteref*)> <!ELEMENT personref (citationref*, noteref*)>
<!ATTLIST personref <!ATTLIST personref
hlink IDREF #REQUIRED hlink IDREF #REQUIRED
priv (0|1) #IMPLIED priv (0|1) #IMPLIED
@ -160,7 +161,7 @@ GENDER has values of M, F, or U.
<!ELEMENT address ((daterange|datespan|dateval|datestr)?, street?, city?, <!ELEMENT address ((daterange|datespan|dateval|datestr)?, street?, city?,
county?, state?, country?, postal?, phone?, noteref*, county?, state?, country?, postal?, phone?, noteref*,
sourceref*)> citationref*)>
<!ATTLIST address priv (0|1) #IMPLIED> <!ATTLIST address priv (0|1) #IMPLIED>
<!ELEMENT street (#PCDATA)> <!ELEMENT street (#PCDATA)>
@ -180,12 +181,11 @@ FAMILY
<!ELEMENT families (family)*> <!ELEMENT families (family)*>
<!ELEMENT family (rel?, father?, mother?, eventref*, lds_ord*, objref*, <!ELEMENT family (rel?, father?, mother?, eventref*, lds_ord*, objref*,
childref*, attribute*, noteref*, sourceref*, tagref*)> childref*, attribute*, noteref*, citationref*, tagref*)>
<!ATTLIST family <!ATTLIST family
id CDATA #IMPLIED id CDATA #IMPLIED
handle ID #REQUIRED handle ID #REQUIRED
priv (0|1) #IMPLIED priv (0|1) #IMPLIED
marker CDATA #IMPLIED
change CDATA #REQUIRED change CDATA #REQUIRED
> >
@ -195,7 +195,7 @@ FAMILY
<!ELEMENT mother EMPTY> <!ELEMENT mother EMPTY>
<!ATTLIST mother hlink IDREF #REQUIRED> <!ATTLIST mother hlink IDREF #REQUIRED>
<!ELEMENT childref (sourceref*,noteref*)> <!ELEMENT childref (citationref*,noteref*)>
<!ATTLIST childref <!ATTLIST childref
hlink IDREF #REQUIRED hlink IDREF #REQUIRED
priv (0|1) #IMPLIED priv (0|1) #IMPLIED
@ -214,12 +214,11 @@ EVENT
<!ELEMENT events (event)*> <!ELEMENT events (event)*>
<!ELEMENT event (type?, (daterange|datespan|dateval|datestr)?, place?, cause?, <!ELEMENT event (type?, (daterange|datespan|dateval|datestr)?, place?, cause?,
description?, attribute*, noteref*, sourceref*, objref*)> description?, attribute*, noteref*, citationref*, objref*)>
<!ATTLIST event <!ATTLIST event
id CDATA #IMPLIED id CDATA #IMPLIED
handle ID #REQUIRED handle ID #REQUIRED
priv (0|1) #IMPLIED priv (0|1) #IMPLIED
marker CDATA #IMPLIED
change CDATA #REQUIRED change CDATA #REQUIRED
> >
@ -234,7 +233,6 @@ SOURCES
id CDATA #IMPLIED id CDATA #IMPLIED
handle ID #REQUIRED handle ID #REQUIRED
priv (0|1) #IMPLIED priv (0|1) #IMPLIED
marker CDATA #IMPLIED
change CDATA #REQUIRED change CDATA #REQUIRED
> >
<!ELEMENT stitle (#PCDATA)> <!ELEMENT stitle (#PCDATA)>
@ -249,12 +247,11 @@ PLACES
<!ELEMENT places (placeobj)*> <!ELEMENT places (placeobj)*>
<!ELEMENT placeobj (ptitle?, coord?, location*, objref*, url*, noteref*, <!ELEMENT placeobj (ptitle?, coord?, location*, objref*, url*, noteref*,
sourceref*)> citationref*)>
<!ATTLIST placeobj <!ATTLIST placeobj
id CDATA #IMPLIED id CDATA #IMPLIED
handle ID #REQUIRED handle ID #REQUIRED
priv (0|1) #IMPLIED priv (0|1) #IMPLIED
marker CDATA #IMPLIED
change CDATA #REQUIRED change CDATA #REQUIRED
> >
@ -285,12 +282,11 @@ OBJECTS
<!ELEMENT objects (object)*> <!ELEMENT objects (object)*>
<!ELEMENT object (file, attribute*, noteref*, <!ELEMENT object (file, attribute*, noteref*,
(daterange|datespan|dateval|datestr)?, sourceref*, tagref*)> (daterange|datespan|dateval|datestr)?, citationref*, tagref*)>
<!ATTLIST object <!ATTLIST object
id CDATA #IMPLIED id CDATA #IMPLIED
handle ID #REQUIRED handle ID #REQUIRED
priv (0|1) #IMPLIED priv (0|1) #IMPLIED
marker CDATA #IMPLIED
change CDATA #REQUIRED change CDATA #REQUIRED
> >
@ -312,7 +308,6 @@ REPOSITORIES
id CDATA #IMPLIED id CDATA #IMPLIED
handle ID #REQUIRED handle ID #REQUIRED
priv (0|1) #IMPLIED priv (0|1) #IMPLIED
marker CDATA #IMPLIED
change CDATA #REQUIRED change CDATA #REQUIRED
> >
@ -329,7 +324,6 @@ NOTES
id CDATA #IMPLIED id CDATA #IMPLIED
handle ID #REQUIRED handle ID #REQUIRED
priv (0|1) #IMPLIED priv (0|1) #IMPLIED
marker CDATA #IMPLIED
change CDATA #REQUIRED change CDATA #REQUIRED
format (0|1) #IMPLIED format (0|1) #IMPLIED
type CDATA #REQUIRED type CDATA #REQUIRED
@ -365,6 +359,21 @@ TAGS
change CDATA #REQUIRED change CDATA #REQUIRED
> >
<!-- ************************************************************
CITATIONS
-->
<!ELEMENT citations (citation)*>
<!ELEMENT citation ((daterange|datespan|dateval|datestr)?, page?, confidence?,
noteref*, objref*, data_item*, sourceref)>
<!ATTLIST citation
id CDATA #IMPLIED
handle ID #REQUIRED
priv (0|1) #IMPLIED
change CDATA #REQUIRED
>
<!-- ************************************************************ <!-- ************************************************************
BOOKMARKS BOOKMARKS
--> -->
@ -436,11 +445,14 @@ SHARED ELEMENTS
<!ELEMENT datestr EMPTY> <!ELEMENT datestr EMPTY>
<!ATTLIST datestr val CDATA #REQUIRED> <!ATTLIST datestr val CDATA #REQUIRED>
<!ELEMENT sourceref (spage? ,noteref*, (daterange|datespan|dateval|datestr)?)> <!ELEMENT citationref EMPTY>
<!ATTLIST citationref
hlink IDREF #REQUIRED
>
<!ELEMENT sourceref EMPTY>
<!ATTLIST sourceref <!ATTLIST sourceref
hlink IDREF #REQUIRED hlink IDREF #REQUIRED
priv (0|1) #IMPLIED
conf CDATA #IMPLIED
> >
<!ELEMENT eventref (attribute*, noteref*)> <!ELEMENT eventref (attribute*, noteref*)>
@ -468,9 +480,10 @@ SHARED ELEMENTS
hlink IDREF #REQUIRED hlink IDREF #REQUIRED
> >
<!ELEMENT spage (#PCDATA)> <!ELEMENT page (#PCDATA)>
<!ELEMENT confidence (#PCDATA)>
<!ELEMENT attribute (sourceref*, noteref*)> <!ELEMENT attribute (citationref*, noteref*)>
<!ATTLIST attribute <!ATTLIST attribute
priv (0|1) #IMPLIED priv (0|1) #IMPLIED
type CDATA #REQUIRED type CDATA #REQUIRED
@ -491,7 +504,7 @@ SHARED ELEMENTS
description CDATA #IMPLIED description CDATA #IMPLIED
> >
<!ELEMENT objref (region?, attribute*, sourceref*, noteref*)> <!ELEMENT objref (region?, attribute*, citationref*, noteref*)>
<!ATTLIST objref <!ATTLIST objref
hlink IDREF #REQUIRED hlink IDREF #REQUIRED
priv (0|1) #IMPLIED priv (0|1) #IMPLIED
@ -512,7 +525,7 @@ SHARED ELEMENTS
> >
<!ELEMENT lds_ord ((daterange|datespan|dateval|datestr)?, temple?, place?, <!ELEMENT lds_ord ((daterange|datespan|dateval|datestr)?, temple?, place?,
status?, sealed_to?, noteref*, sourceref*)> status?, sealed_to?, noteref*, citationref*)>
<!ATTLIST lds_ord <!ATTLIST lds_ord
priv (0|1) #IMPLIED priv (0|1) #IMPLIED
type CDATA #REQUIRED type CDATA #REQUIRED

View File

@ -4,7 +4,7 @@
# Gramps - a GTK+/GNOME based genealogy program # Gramps - a GTK+/GNOME based genealogy program
# #
# Copyright (C) 2005-2007 Donald N. Allingham # Copyright (C) 2005-2007 Donald N. Allingham
# Copyright (C) 2010 Nick Hall # Copyright (C) 2010-2011 Nick Hall
# #
# This program is free software; you can redistribute it and/or modify # 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 # it under the terms of the GNU General Public License as published by
@ -32,7 +32,7 @@
<grammar <grammar
datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes" datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes"
ns="http://gramps-project.org/xml/1.4.0/" ns="http://gramps-project.org/xml/1.5.0/"
xmlns="http://relaxng.org/ns/structure/1.0"> xmlns="http://relaxng.org/ns/structure/1.0">
<start><element name="database"> <start><element name="database">
@ -82,6 +82,12 @@
</element></zeroOrMore> </element></zeroOrMore>
</element></optional> </element></optional>
<optional><element name="citations">
<zeroOrMore><element name="citation">
<ref name="citation-content"/>
</element></zeroOrMore>
</element></optional>
<optional><element name="sources"> <optional><element name="sources">
<zeroOrMore><element name="source"> <zeroOrMore><element name="source">
<ref name="source-content"/> <ref name="source-content"/>
@ -148,7 +154,6 @@
<value>0</value> <value>0</value>
<value>1</value> <value>1</value>
</choice></attribute></optional> </choice></attribute></optional>
<optional><attribute name="marker"><text/></attribute></optional>
</define> </define>
<define name="person-content"> <define name="person-content">
@ -195,8 +200,8 @@
<zeroOrMore><element name="noteref"> <zeroOrMore><element name="noteref">
<ref name="noteref-content"/> <ref name="noteref-content"/>
</element></zeroOrMore> </element></zeroOrMore>
<zeroOrMore><element name="sourceref"> <zeroOrMore><element name="citationref">
<ref name="sourceref-content"/> <ref name="citationref-content"/>
</element></zeroOrMore> </element></zeroOrMore>
<zeroOrMore><element name="tagref"> <zeroOrMore><element name="tagref">
<ref name="tagref-content"/> <ref name="tagref-content"/>
@ -234,20 +239,20 @@
<optional><attribute name="display"><text/></attribute></optional> <optional><attribute name="display"><text/></attribute></optional>
<optional><element name="first"><text/></element></optional> <optional><element name="first"><text/></element></optional>
<optional><element name="call"><text/></element></optional> <optional><element name="call"><text/></element></optional>
<zeroOrMore>
<ref name="surname-content"/>
</zeroOrMore>
<optional><element name="suffix"><text/></element></optional>
<optional><element name="title"><text/></element></optional>
<optional><element name="nick"><text/></element></optional> <optional><element name="nick"><text/></element></optional>
<optional><element name="familynick"><text/></element></optional> <optional><element name="familynick"><text/></element></optional>
<optional><element name="group"><text/></element></optional> <optional><element name="group"><text/></element></optional>
<zeroOrMore><element name="surname">
<ref name="surname-content"/>
</element></zeroOrMore>
<optional><element name="suffix"><text/></element></optional>
<optional><element name="title"><text/></element></optional>
<optional><ref name="date-content"/></optional> <optional><ref name="date-content"/></optional>
<zeroOrMore><element name="noteref"> <zeroOrMore><element name="noteref">
<ref name="noteref-content"/> <ref name="noteref-content"/>
</element></zeroOrMore> </element></zeroOrMore>
<zeroOrMore><element name="sourceref"> <zeroOrMore><element name="citationref">
<ref name="sourceref-content"/> <ref name="citationref-content"/>
</element></zeroOrMore> </element></zeroOrMore>
</define> </define>
@ -284,8 +289,8 @@
<zeroOrMore><element name="noteref"> <zeroOrMore><element name="noteref">
<ref name="noteref-content"/> <ref name="noteref-content"/>
</element></zeroOrMore> </element></zeroOrMore>
<zeroOrMore><element name="sourceref"> <zeroOrMore><element name="citationref">
<ref name="sourceref-content"/> <ref name="citationref-content"/>
</element></zeroOrMore> </element></zeroOrMore>
</define> </define>
@ -379,8 +384,8 @@
<ref name="noteref-content"/> <ref name="noteref-content"/>
</element></zeroOrMore> </element></zeroOrMore>
<optional><ref name="date-content"/></optional> <optional><ref name="date-content"/></optional>
<zeroOrMore><element name="sourceref"> <zeroOrMore><element name="citationref">
<ref name="sourceref-content"/> <ref name="citationref-content"/>
</element></zeroOrMore> </element></zeroOrMore>
<zeroOrMore><element name="tagref"> <zeroOrMore><element name="tagref">
<ref name="tagref-content"/> <ref name="tagref-content"/>
@ -401,14 +406,34 @@
<zeroOrMore><element name="noteref"> <zeroOrMore><element name="noteref">
<ref name="noteref-content"/> <ref name="noteref-content"/>
</element></zeroOrMore> </element></zeroOrMore>
<zeroOrMore><element name="sourceref"> <zeroOrMore><element name="citationref">
<ref name="sourceref-content"/> <ref name="citationref-content"/>
</element></zeroOrMore> </element></zeroOrMore>
<zeroOrMore><element name="objref"> <zeroOrMore><element name="objref">
<ref name="objref-content"/> <ref name="objref-content"/>
</element></zeroOrMore> </element></zeroOrMore>
</define> </define>
<define name="citation-content">
<ref name="primary-object"/>
<optional><ref name="date-content"/></optional>
<optional><element name="page"><text/></element></optional>
<optional><element name="confidence"><text/></element></optional>
<zeroOrMore><element name="noteref">
<ref name="noteref-content"/>
</element></zeroOrMore>
<zeroOrMore><element name="objref">
<ref name="objref-content"/>
</element></zeroOrMore>
<zeroOrMore><element name="data_item">
<attribute name="key"><text/></attribute>
<attribute name="value"><text/></attribute>
</element></zeroOrMore>
<element name="sourceref">
<ref name="sourceref-content"/>
</element>
</define>
<define name="source-content"> <define name="source-content">
<ref name="primary-object"/> <ref name="primary-object"/>
<optional><element name="stitle"><text/></element></optional> <optional><element name="stitle"><text/></element></optional>
@ -456,8 +481,8 @@
<zeroOrMore><element name="noteref"> <zeroOrMore><element name="noteref">
<ref name="noteref-content"/> <ref name="noteref-content"/>
</element></zeroOrMore> </element></zeroOrMore>
<zeroOrMore><element name="sourceref"> <zeroOrMore><element name="citationref">
<ref name="sourceref-content"/> <ref name="citationref-content"/>
</element></zeroOrMore> </element></zeroOrMore>
</define> </define>
@ -475,8 +500,8 @@
<ref name="noteref-content"/> <ref name="noteref-content"/>
</element></zeroOrMore> </element></zeroOrMore>
<optional><ref name="date-content"/></optional> <optional><ref name="date-content"/></optional>
<zeroOrMore><element name="sourceref"> <zeroOrMore><element name="citationref">
<ref name="sourceref-content"/> <ref name="citationref-content"/>
</element></zeroOrMore> </element></zeroOrMore>
<zeroOrMore><element name="tagref"> <zeroOrMore><element name="tagref">
<ref name="tagref-content"/> <ref name="tagref-content"/>
@ -564,17 +589,12 @@
</element></zeroOrMore> </element></zeroOrMore>
</define> </define>
<define name="citationref-content">
<attribute name="hlink"><data type="IDREF"/></attribute>
</define>
<define name="sourceref-content"> <define name="sourceref-content">
<attribute name="hlink"><data type="IDREF"/></attribute> <attribute name="hlink"><data type="IDREF"/></attribute>
<optional><attribute name="priv">
<ref name="priv-content"/>
</attribute></optional>
<optional><attribute name="conf"><text/></attribute></optional>
<optional><element name="spage"><text/></element></optional>
<zeroOrMore><element name="noteref">
<ref name="noteref-content"/>
</element></zeroOrMore>
<optional><ref name="date-content"/></optional>
</define> </define>
<define name="eventref-content"> <define name="eventref-content">
@ -620,8 +640,8 @@
</attribute></optional> </attribute></optional>
<attribute name="type"><text/></attribute> <attribute name="type"><text/></attribute>
<attribute name="value"><text/></attribute> <attribute name="value"><text/></attribute>
<zeroOrMore><element name="sourceref"> <zeroOrMore><element name="citationref">
<ref name="sourceref-content"/> <ref name="citationref-content"/>
</element></zeroOrMore> </element></zeroOrMore>
<zeroOrMore><element name="noteref"> <zeroOrMore><element name="noteref">
<ref name="noteref-content"/> <ref name="noteref-content"/>
@ -648,8 +668,8 @@
<zeroOrMore><element name="attribute"> <zeroOrMore><element name="attribute">
<ref name="attribute-content"/> <ref name="attribute-content"/>
</element></zeroOrMore> </element></zeroOrMore>
<zeroOrMore><element name="sourceref"> <zeroOrMore><element name="citationref">
<ref name="sourceref-content"/> <ref name="citationref-content"/>
</element></zeroOrMore> </element></zeroOrMore>
<zeroOrMore><element name="noteref"> <zeroOrMore><element name="noteref">
<ref name="noteref-content"/> <ref name="noteref-content"/>
@ -678,8 +698,8 @@
<ref name="noteref-content"/> <ref name="noteref-content"/>
</element></zeroOrMore> </element></zeroOrMore>
<optional><ref name="date-content"/></optional> <optional><ref name="date-content"/></optional>
<zeroOrMore><element name="sourceref"> <zeroOrMore><element name="citationref">
<ref name="sourceref-content"/> <ref name="citationref-content"/>
</element></zeroOrMore> </element></zeroOrMore>
</define> </define>

View File

@ -7,7 +7,7 @@
# Copyright (C) 2008 Robert Cheramy <robert@cheramy.net> # Copyright (C) 2008 Robert Cheramy <robert@cheramy.net>
# Copyright (C) 2009 Douglas S. Blank # Copyright (C) 2009 Douglas S. Blank
# Copyright (C) 2010 Jakim Friant # Copyright (C) 2010 Jakim Friant
# Copyright (C) 2010 Nick Hall # Copyright (C) 2010-2011 Nick Hall
# #
# This program is free software; you can redistribute it and/or modify # 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 # it under the terms of the GNU General Public License as published by
@ -200,6 +200,7 @@ class GrampsXmlWriter(UpdateCallback):
person_len = self.db.get_number_of_people() person_len = self.db.get_number_of_people()
family_len = self.db.get_number_of_families() family_len = self.db.get_number_of_families()
event_len = self.db.get_number_of_events() event_len = self.db.get_number_of_events()
citation_len = self.db.get_number_of_citations()
source_len = self.db.get_number_of_sources() source_len = self.db.get_number_of_sources()
place_len = self.db.get_number_of_places() place_len = self.db.get_number_of_places()
repo_len = self.db.get_number_of_repositories() repo_len = self.db.get_number_of_repositories()
@ -207,8 +208,9 @@ class GrampsXmlWriter(UpdateCallback):
note_len = self.db.get_number_of_notes() note_len = self.db.get_number_of_notes()
tag_len = self.db.get_number_of_tags() tag_len = self.db.get_number_of_tags()
total_steps = (person_len + family_len + event_len + source_len + total_steps = (person_len + family_len + event_len + citation_len +
place_len + repo_len + obj_len + note_len + tag_len source_len + place_len + repo_len + obj_len + note_len +
tag_len
) )
self.set_total(total_steps) self.set_total(total_steps)
@ -282,11 +284,20 @@ class GrampsXmlWriter(UpdateCallback):
self.update() self.update()
self.g.write(" </families>\n") self.g.write(" </families>\n")
if citation_len > 0:
self.g.write(" <citations>\n")
for handle in self.db.get_citation_handles():
citation = self.db.get_citation_from_handle(handle)
self.write_citation(citation,2)
self.update()
self.g.write(" </citations>\n")
if source_len > 0: if source_len > 0:
self.g.write(" <sources>\n") self.g.write(" <sources>\n")
for handle in self.db.get_source_handles(): for handle in self.db.get_source_handles():
source = self.db.get_source_from_handle(handle) source = self.db.get_source_from_handle(handle)
self.write_source(source,2) self.write_source(source,2)
self.update()
self.g.write(" </sources>\n") self.g.write(" </sources>\n")
if place_len > 0: if place_len > 0:
@ -522,8 +533,8 @@ class GrampsXmlWriter(UpdateCallback):
self.write_note_list(person.get_note_list(),index+1) self.write_note_list(person.get_note_list(),index+1)
for s in person.get_source_references(): for citation_handle in person.get_citation_references():
self.dump_source_ref(s,index+2) self.write_ref("citationref", citation_handle, index+2)
for tag_handle in person.get_tag_list(): for tag_handle in person.get_tag_list():
self.write_ref("tagref", tag_handle, index+1) self.write_ref("tagref", tag_handle, index+1)
@ -550,14 +561,26 @@ class GrampsXmlWriter(UpdateCallback):
self.dump_child_ref(child_ref,index+1) self.dump_child_ref(child_ref,index+1)
self.write_attribute_list(family.get_attribute_list()) self.write_attribute_list(family.get_attribute_list())
self.write_note_list(family.get_note_list(),index+1) self.write_note_list(family.get_note_list(),index+1)
for s in family.get_source_references(): for citation_handle in family.get_citation_references():
self.dump_source_ref(s,index+1) self.write_ref("citationref", citation_handle, index+1)
for tag_handle in family.get_tag_list(): for tag_handle in family.get_tag_list():
self.write_ref("tagref", tag_handle, index+1) self.write_ref("tagref", tag_handle, index+1)
self.g.write("%s</family>\n" % sp) self.g.write("%s</family>\n" % sp)
def write_citation(self, citation, index=1):
sp = " " * index
self.write_primary_tag("citation", citation, index)
self.write_date(citation.get_date_object(), index+1)
self.write_line("page", citation.get_page(), index+1)
self.write_line("confidence", citation.get_confidence_level(), index+1)
self.write_note_list(citation.get_note_list(), index+1)
self.write_media_list(citation.get_media_list(), index+1)
self.write_data_map(citation.get_data_map())
self.write_ref("sourceref", citation.get_reference_handle(), index+1)
self.g.write("%s</citation>\n" % sp)
def write_source(self,source,index=1): def write_source(self,source,index=1):
sp = " "*index sp = " "*index
self.write_primary_tag("source",source,index) self.write_primary_tag("source",source,index)
@ -602,8 +625,8 @@ class GrampsXmlWriter(UpdateCallback):
self.write_line("postal",address.get_postal_code(),index+1) self.write_line("postal",address.get_postal_code(),index+1)
self.write_line("phone",address.get_phone(),index+1) self.write_line("phone",address.get_phone(),index+1)
self.write_note_list(address.get_note_list(),index+1) self.write_note_list(address.get_note_list(),index+1)
for s in address.get_source_references(): for citation_handle in address.get_citation_references():
self.dump_source_ref(s,index+2) self.write_ref("citationref", citation_handle, index+1)
self.g.write('%s</address>\n' % sp) self.g.write('%s</address>\n' % sp)
def dump_person_ref(self,personref,index=1): def dump_person_ref(self,personref,index=1):
@ -613,16 +636,17 @@ class GrampsXmlWriter(UpdateCallback):
priv_text = conf_priv(personref) priv_text = conf_priv(personref)
rel_text = ' rel="%s"' % escxml(personref.get_relation()) rel_text = ' rel="%s"' % escxml(personref.get_relation())
sreflist = personref.get_source_references() citation_list = personref.get_citation_references()
nreflist = personref.get_note_list() nreflist = personref.get_note_list()
if (len(sreflist) + len(nreflist) == 0): if (len(citation_list) + len(nreflist) == 0):
self.write_ref('personref',personref.ref,index,close=True, self.write_ref('personref',personref.ref,index,close=True,
extra_text=priv_text+rel_text) extra_text=priv_text+rel_text)
else: else:
self.write_ref('personref',personref.ref,index,close=False, self.write_ref('personref',personref.ref,index,close=False,
extra_text=priv_text+rel_text) extra_text=priv_text+rel_text)
for sref in sreflist: for citation_handle in citation_list:
self.dump_source_ref(sref,index+1) self.write_ref("citationref", citation_handle, index+1)
self.write_note_list(nreflist,index+1) self.write_note_list(nreflist,index+1)
self.g.write('%s</personref>\n' % sp) self.g.write('%s</personref>\n' % sp)
@ -639,16 +663,16 @@ class GrampsXmlWriter(UpdateCallback):
mrel_text = '' mrel_text = ''
else: else:
mrel_text = ' mrel="%s"' % escxml(childref.mrel.xml_str()) mrel_text = ' mrel="%s"' % escxml(childref.mrel.xml_str())
sreflist = childref.get_source_references() citation_list = childref.get_citation_references()
nreflist = childref.get_note_list() nreflist = childref.get_note_list()
if (len(sreflist)+len(nreflist) == 0): if (len(citation_list)+len(nreflist) == 0):
self.write_ref('childref',childref.ref,index,close=True, self.write_ref('childref',childref.ref,index,close=True,
extra_text=priv_text+mrel_text+frel_text) extra_text=priv_text+mrel_text+frel_text)
else: else:
self.write_ref('childref',childref.ref,index,close=False, self.write_ref('childref',childref.ref,index,close=False,
extra_text=priv_text+mrel_text+frel_text) extra_text=priv_text+mrel_text+frel_text)
for sref in sreflist: for citation_handle in citation_list:
self.dump_source_ref(sref,index+1) self.write_ref("citationref", citation_handle, index+1)
self.write_note_list(nreflist,index+1) self.write_note_list(nreflist,index+1)
self.g.write('%s</childref>\n' % sp) self.g.write('%s</childref>\n' % sp)
@ -690,8 +714,8 @@ class GrampsXmlWriter(UpdateCallback):
self.write_attribute_list(event.get_attribute_list(),index+1) self.write_attribute_list(event.get_attribute_list(),index+1)
self.write_note_list(event.get_note_list(),index+1) self.write_note_list(event.get_note_list(),index+1)
for s in event.get_source_references(): for citation_handle in event.get_citation_references():
self.dump_source_ref(s,index+1) self.write_ref("citationref", citation_handle, index+1)
self.write_media_list(event.get_media_list(),index+1) self.write_media_list(event.get_media_list(),index+1)
self.g.write("%s</event>\n" % sp) self.g.write("%s</event>\n" % sp)
@ -717,40 +741,10 @@ class GrampsXmlWriter(UpdateCallback):
self.g.write('%s<sealed_to hlink="%s"/>\n' % self.g.write('%s<sealed_to hlink="%s"/>\n' %
(sp2,"_"+ord.get_family_handle())) (sp2,"_"+ord.get_family_handle()))
self.write_note_list(ord.get_note_list(),index+1) self.write_note_list(ord.get_note_list(),index+1)
for s in ord.get_source_references(): for citation_handle in ord.get_citation_references():
self.dump_source_ref(s,index+1) self.write_ref("citationref", citation_handle, index+1)
self.g.write('%s</lds_ord>\n' % sp) self.g.write('%s</lds_ord>\n' % sp)
def dump_source_ref(self,source_ref,index=1):
source = self.db.get_source_from_handle(
source_ref.get_reference_handle())
if source:
p = source_ref.get_page()
n = source_ref.get_note_list()
d = source_ref.get_date_object()
q = source_ref.get_confidence_level()
self.g.write(" " * index)
priv = conf_priv(source_ref)
if p == "" and n == [] and d.is_empty() and q == 2:
self.g.write('<sourceref hlink="%s"%s/>\n'
% ("_"+source.get_handle(), priv)
)
else:
if q == 2:
self.g.write('<sourceref hlink="%s"%s>\n'
% ("_"+source.get_handle(), priv)
)
else:
self.g.write('<sourceref hlink="%s" conf="%d"%s>\n'
% ("_"+source.get_handle(), q, priv)
)
self.write_line("spage",p,index+1)
self.write_note_list(n,index+1)
self.write_date(d,index+1)
self.g.write("%s</sourceref>\n" % (" " * index))
def write_ref(self,tagname, handle,index=1,close=True,extra_text=''): def write_ref(self,tagname, handle,index=1,close=True,extra_text=''):
if handle: if handle:
if close: if close:
@ -956,8 +950,8 @@ class GrampsXmlWriter(UpdateCallback):
if name.date: if name.date:
self.write_date(name.date,4) self.write_date(name.date,4)
self.write_note_list(name.get_note_list(),index+1) self.write_note_list(name.get_note_list(),index+1)
for s in name.get_source_references(): for citation_handle in name.get_citation_references():
self.dump_source_ref(s,index+1) self.write_ref("citationref", citation_handle, index+1)
self.g.write('%s</name>\n' % sp) self.g.write('%s</name>\n' % sp)
@ -1037,14 +1031,14 @@ class GrampsXmlWriter(UpdateCallback):
(sp,conf_priv(attr),escxml(attr.get_type().xml_str()), (sp,conf_priv(attr),escxml(attr.get_type().xml_str()),
self.fix(attr.get_value())) self.fix(attr.get_value()))
) )
slist = attr.get_source_references() citation_list = attr.get_citation_references()
nlist = attr.get_note_list() nlist = attr.get_note_list()
if (len(nlist)+len(slist)) == 0: if (len(nlist)+len(citation_list)) == 0:
self.g.write('/>\n') self.g.write('/>\n')
else: else:
self.g.write('>\n') self.g.write('>\n')
for s in attr.get_source_references(): for citation_handle in citation_list:
self.dump_source_ref(s,indent+1) self.write_ref("citationref", citation_handle, indent+1)
self.write_note_list(attr.get_note_list(),indent+1) self.write_note_list(attr.get_note_list(),indent+1)
self.g.write('%s</attribute>\n' % sp) self.g.write('%s</attribute>\n' % sp)
@ -1056,7 +1050,7 @@ class GrampsXmlWriter(UpdateCallback):
if photo.get_privacy(): if photo.get_privacy():
self.g.write(' priv="1"') self.g.write(' priv="1"')
proplist = photo.get_attribute_list() proplist = photo.get_attribute_list()
refslist = photo.get_source_references() citation_list = photo.get_citation_references()
nreflist = photo.get_note_list() nreflist = photo.get_note_list()
rect = photo.get_rectangle() rect = photo.get_rectangle()
if rect is not None : if rect is not None :
@ -1073,7 +1067,7 @@ class GrampsXmlWriter(UpdateCallback):
corner1_x == corner1_y == 0 and corner1_x == corner1_y == 0 and
corner2_x == corner2_y == 100): corner2_x == corner2_y == 100):
rect = None rect = None
if (len(proplist) + len(nreflist) + len(refslist) == 0 and if (len(proplist) + len(nreflist) + len(citation_list) == 0 and
rect is None): rect is None):
self.g.write("/>\n") self.g.write("/>\n")
else: else:
@ -1089,8 +1083,8 @@ class GrampsXmlWriter(UpdateCallback):
) )
) )
self.write_attribute_list(proplist,indent+1) self.write_attribute_list(proplist,indent+1)
for ref in refslist: for citation_handle in citation_list:
self.dump_source_ref(ref, indent+1) self.write_ref("citationref", citation_handle, indent+1)
self.write_note_list(nreflist, indent+1) self.write_note_list(nreflist, indent+1)
self.g.write('%s</objref>\n' % sp) self.g.write('%s</objref>\n' % sp)
@ -1169,7 +1163,7 @@ class GrampsXmlWriter(UpdateCallback):
llen = (len(place.get_alternate_locations()) + llen = (len(place.get_alternate_locations()) +
len(place.get_url_list()) + len(place.get_url_list()) +
len(place.get_media_list()) + len(place.get_media_list()) +
len(place.get_source_references()) len(place.get_citation_references())
) )
ml_empty = main_loc.is_empty() ml_empty = main_loc.is_empty()
@ -1186,8 +1180,8 @@ class GrampsXmlWriter(UpdateCallback):
self.write_media_list(place.get_media_list(), index+1) self.write_media_list(place.get_media_list(), index+1)
self.write_url_list(place.get_url_list()) self.write_url_list(place.get_url_list())
self.write_note_list(place.get_note_list(), index+1) self.write_note_list(place.get_note_list(), index+1)
for s in place.get_source_references(): for citation_handle in place.get_citation_references():
self.dump_source_ref(s, index+1) self.write_ref("citationref", citation_handle, index+1)
self.g.write("%s</placeobj>\n" % (" "*index)) self.g.write("%s</placeobj>\n" % (" "*index))
def write_object(self, obj, index=1): def write_object(self, obj, index=1):
@ -1216,8 +1210,8 @@ class GrampsXmlWriter(UpdateCallback):
dval = obj.get_date_object() dval = obj.get_date_object()
if not dval.is_empty(): if not dval.is_empty():
self.write_date(dval, index+1) self.write_date(dval, index+1)
for s in obj.get_source_references(): for citation_handle in obj.get_citation_references():
self.dump_source_ref(s, index+1) self.write_ref("citationref", citation_handle, index+1)
for tag_handle in obj.get_tag_list(): for tag_handle in obj.get_tag_list():
self.write_ref("tagref", tag_handle, index+1) self.write_ref("tagref", tag_handle, index+1)

View File

@ -3,7 +3,7 @@
# #
# Copyright (C) 2000-2007 Donald N. Allingham # Copyright (C) 2000-2007 Donald N. Allingham
# Copyright (C) 2009 Douglas S. Blank # Copyright (C) 2009 Douglas S. Blank
# Copyright (C) 2010 Nick Hall # Copyright (C) 2010-2011 Nick Hall
# Copyright (C) 2011 Michiel D. Nauta # Copyright (C) 2011 Michiel D. Nauta
# #
# This program is free software; you can redistribute it and/or modify # This program is free software; you can redistribute it and/or modify
@ -52,7 +52,7 @@ import DateHandler
from gen.display.name import displayer as name_displayer from gen.display.name import displayer as name_displayer
from gen.db.dbconst import (PERSON_KEY, FAMILY_KEY, SOURCE_KEY, EVENT_KEY, from gen.db.dbconst import (PERSON_KEY, FAMILY_KEY, SOURCE_KEY, EVENT_KEY,
MEDIA_KEY, PLACE_KEY, REPOSITORY_KEY, NOTE_KEY, MEDIA_KEY, PLACE_KEY, REPOSITORY_KEY, NOTE_KEY,
TAG_KEY) TAG_KEY, CITATION_KEY)
from gen.updatecallback import UpdateCallback from gen.updatecallback import UpdateCallback
import const import const
import libgrampsxml import libgrampsxml
@ -190,7 +190,7 @@ class ImportInfo(object):
Class object that can hold information about the import Class object that can hold information about the import
""" """
keyorder = [PERSON_KEY, FAMILY_KEY, SOURCE_KEY, EVENT_KEY, MEDIA_KEY, keyorder = [PERSON_KEY, FAMILY_KEY, SOURCE_KEY, EVENT_KEY, MEDIA_KEY,
PLACE_KEY, REPOSITORY_KEY, NOTE_KEY, TAG_KEY] PLACE_KEY, REPOSITORY_KEY, NOTE_KEY, TAG_KEY, CITATION_KEY]
key2data = { key2data = {
PERSON_KEY : 0, PERSON_KEY : 0,
FAMILY_KEY : 1, FAMILY_KEY : 1,
@ -200,7 +200,8 @@ class ImportInfo(object):
PLACE_KEY: 5, PLACE_KEY: 5,
REPOSITORY_KEY: 6, REPOSITORY_KEY: 6,
NOTE_KEY: 7, NOTE_KEY: 7,
TAG_KEY: 8 TAG_KEY: 8,
CITATION_KEY: 9
} }
def __init__(self): def __init__(self):
@ -209,8 +210,8 @@ class ImportInfo(object):
This creates the datastructures to hold info This creates the datastructures to hold info
""" """
self.data_mergecandidate = [{}, {}, {}, {}, {}, {}, {}, {}, {}] self.data_mergecandidate = [{}, {}, {}, {}, {}, {}, {}, {}, {}, {}]
self.data_newobject = [0] * 9 self.data_newobject = [0] * 10
self.data_relpath = False self.data_relpath = False
def add(self, category, key, obj, sec_obj=None): def add(self, category, key, obj, sec_obj=None):
@ -260,6 +261,9 @@ class ImportInfo(object):
'id': obj.gramps_id, 'id2': sec_obj.gramps_id} 'id': obj.gramps_id, 'id2': sec_obj.gramps_id}
elif key == TAG_KEY: elif key == TAG_KEY:
pass # Tags can't be merged pass # Tags can't be merged
elif key == CITATION_KEY:
return _(" Citation %(id)s with %(id2)s\n") % {
'id': obj.gramps_id, 'id2': sec_obj.gramps_id}
def info_text(self): def info_text(self):
""" """
@ -275,6 +279,7 @@ class ImportInfo(object):
REPOSITORY_KEY : _(' Repositories: %d\n'), REPOSITORY_KEY : _(' Repositories: %d\n'),
NOTE_KEY : _(' Notes: %d\n'), NOTE_KEY : _(' Notes: %d\n'),
TAG_KEY : _(' Tags: %d\n'), TAG_KEY : _(' Tags: %d\n'),
CITATION_KEY : _(' Citations: %d\n'),
} }
txt = _("Number of new objects imported:\n") txt = _("Number of new objects imported:\n")
for key in self.keyorder: for key in self.keyorder:
@ -453,8 +458,9 @@ class GrampsParser(UpdateCallback):
self.person = None self.person = None
self.family = None self.family = None
self.address = None self.address = None
self.citation = None
self.in_old_sourceref = False
self.source = None self.source = None
self.source_ref = None
self.attribute = None self.attribute = None
self.placeobj = None self.placeobj = None
self.locations = 0 self.locations = 0
@ -500,6 +506,7 @@ class GrampsParser(UpdateCallback):
self.idswap = {} self.idswap = {}
self.fidswap = {} self.fidswap = {}
self.eidswap = {} self.eidswap = {}
self.cidswap = {}
self.sidswap = {} self.sidswap = {}
self.pidswap = {} self.pidswap = {}
self.oidswap = {} self.oidswap = {}
@ -540,10 +547,14 @@ class GrampsParser(UpdateCallback):
"childof": (self.start_childof, None), "childof": (self.start_childof, None),
"childref": (self.start_childref, self.stop_childref), "childref": (self.start_childref, self.stop_childref),
"personref": (self.start_personref, self.stop_personref), "personref": (self.start_personref, self.stop_personref),
"citation": (self.start_citation, self.stop_citation),
"citationref": (self.start_citationref, None),
"citations": (None, None),
"city": (None, self.stop_city), "city": (None, self.stop_city),
"county": (None, self.stop_county), "county": (None, self.stop_county),
"country": (None, self.stop_country), "country": (None, self.stop_country),
"comment": (None, self.stop_comment), "comment": (None, self.stop_comment),
"confidence": (None, self.stop_confidence),
"created": (self.start_created, None), "created": (self.start_created, None),
"ref": (None, self.stop_ref), "ref": (None, self.stop_ref),
"database": (self.start_database, self.stop_database), "database": (self.start_database, self.stop_database),
@ -576,6 +587,7 @@ class GrampsParser(UpdateCallback):
"objref": (self.start_objref, self.stop_objref), "objref": (self.start_objref, self.stop_objref),
"object": (self.start_object, self.stop_object), "object": (self.start_object, self.stop_object),
"file": (self.start_file, None), "file": (self.start_file, None),
"page": (None, self.stop_page),
"place": (self.start_place, self.stop_place), "place": (self.start_place, self.stop_place),
"dateval": (self.start_dateval, None), "dateval": (self.start_dateval, None),
"daterange": (self.start_daterange, None), "daterange": (self.start_daterange, None),
@ -1698,9 +1710,9 @@ class GrampsParser(UpdateCallback):
self.note.format = int(attrs.get('format', gen.lib.Note.FLOWED)) self.note.format = int(attrs.get('format', gen.lib.Note.FLOWED))
# The order in this long if-then statement should reflect the # The order in this long if-then statement should reflect the
# DTD: most deeply nested elements come first. # DTD: most deeply nested elements come first.
if self.source_ref: if self.citation:
self.note.type.set(gen.lib.NoteType.SOURCEREF) self.note.type.set(gen.lib.NoteType.CITATION)
self.note.private = self.source_ref.private self.note.private = self.citation.private
elif self.address: elif self.address:
self.note.type.set(gen.lib.NoteType.ADDRESS) self.note.type.set(gen.lib.NoteType.ADDRESS)
self.note.private = self.address.private self.note.private = self.address.private
@ -1774,8 +1786,8 @@ class GrampsParser(UpdateCallback):
# The order in this long if-then statement should reflect the # The order in this long if-then statement should reflect the
# DTD: most deeply nested elements come first. # DTD: most deeply nested elements come first.
if self.source_ref: if self.citation:
self.source_ref.add_note(handle) self.citation.add_note(handle)
elif self.address: elif self.address:
self.address.add_note(handle) self.address.add_note(handle)
elif self.ord: elif self.ord:
@ -1811,11 +1823,79 @@ class GrampsParser(UpdateCallback):
elif self.repo: elif self.repo:
self.repo.add_note(handle) self.repo.add_note(handle)
def __add_citation(self, citation_handle):
"""
Add a citation to the object currently processed.
"""
if self.photo:
self.photo.add_citation(citation_handle)
elif self.ord:
self.ord.add_citation(citation_handle)
elif self.attribute:
self.attribute.add_citation(citation_handle)
elif self.object:
self.object.add_citation(citation_handle)
elif self.objref:
self.objref.add_citation(citation_handle)
elif self.event:
self.event.add_citation(citation_handle)
elif self.address:
self.address.add_citation(citation_handle)
elif self.name:
self.name.add_citation(citation_handle)
elif self.placeobj:
self.placeobj.add_citation(citation_handle)
elif self.childref:
self.childref.add_citation(citation_handle)
elif self.family:
self.family.add_citation(citation_handle)
elif self.personref:
self.personref.add_citation(citation_handle)
elif self.person:
self.person.add_citation(citation_handle)
def start_citationref(self, attrs):
"""
Add a citation reference to the object currently processed.
"""
handle = self.inaugurate(attrs['hlink'], gen.lib.Citation,
self.db.has_citation_handle,
self.db.add_citation,
self.db.get_raw_citation_data)
self.__add_citation(handle)
def start_citation(self, attrs):
"""
Add a citation object to db if it doesn't exist yet and assign
id, privacy and changetime.
"""
self.update(self.p.CurrentLineNumber)
self.citation = gen.lib.Citation()
orig_handle = attrs['handle'].replace('_', '')
is_merge_candidate = (self.replace_import_handle and
self.db.has_citation_handle(orig_handle))
self.inaugurate(orig_handle, self.citation,
self.db.has_citation_handle,
self.db.add_citation,
self.db.get_raw_citation_data)
gramps_id = self.legalize_id(attrs.get('id'), CITATION_KEY,
self.cidswap, self.db.cid2user_format,
self.db.find_next_citation_gramps_id)
self.citation.set_gramps_id(gramps_id)
if is_merge_candidate:
orig_citation = self.db.get_citation_from_handle(orig_handle)
self.info.add('merge-candidate', CITATION_KEY, orig_citation,
self.citation)
self.citation.private = bool(attrs.get("priv"))
self.citation.change = int(attrs.get('change', self.change))
self.citation.confidence = self.conf # default
self.info.add('new-object', CITATION_KEY, self.citation)
def start_sourceref(self, attrs): def start_sourceref(self, attrs):
""" """
Add a source reference to the object currently processed. Add a source reference to the object currently processed.
""" """
self.source_ref = gen.lib.SourceRef()
if 'hlink' in attrs: if 'hlink' in attrs:
handle = self.inaugurate(attrs['hlink'], gen.lib.Source, handle = self.inaugurate(attrs['hlink'], gen.lib.Source,
self.db.has_source_handle, self.db.has_source_handle,
@ -1824,36 +1904,22 @@ class GrampsParser(UpdateCallback):
else: else:
handle = self.inaugurate_id(attrs.get('ref'), SOURCE_KEY, handle = self.inaugurate_id(attrs.get('ref'), SOURCE_KEY,
gen.lib.Source) gen.lib.Source)
self.source_ref.ref = handle
self.source_ref.confidence = int(attrs.get("conf", self.conf))
self.source_ref.private = bool(attrs.get("priv"))
if self.photo: if self.citation:
self.photo.add_source_reference(self.source_ref) self.citation.set_reference_handle(handle)
elif self.ord: else:
self.ord.add_source_reference(self.source_ref) # GRAMPS LEGACY: Prior to v1.5.0 there were no citation objects.
elif self.attribute: # We need to copy the contents of the old SourceRef into a new
self.attribute.add_source_reference(self.source_ref) # Citation object.
elif self.object: self.in_old_sourceref = True
self.object.add_source_reference(self.source_ref)
elif self.objref: self.citation = gen.lib.Citation()
self.objref.add_source_reference(self.source_ref) self.citation.set_reference_handle(handle)
elif self.event: self.citation.confidence = int(attrs.get("conf", self.conf))
self.event.add_source_reference(self.source_ref) self.citation.private = bool(attrs.get("priv"))
elif self.address:
self.address.add_source_reference(self.source_ref) citation_handle = self.db.add_citation(self.citation, self.trans)
elif self.name: self.__add_citation(citation_handle)
self.name.add_source_reference(self.source_ref)
elif self.placeobj:
self.placeobj.add_source_reference(self.source_ref)
elif self.childref:
self.childref.add_source_reference(self.source_ref)
elif self.family:
self.family.add_source_reference(self.source_ref)
elif self.personref:
self.personref.add_source_reference(self.source_ref)
elif self.person:
self.person.add_source_reference(self.source_ref)
def start_source(self, attrs): def start_source(self, attrs):
""" """
@ -2066,8 +2132,8 @@ class GrampsParser(UpdateCallback):
self.start_compound_date(attrs, gen.lib.Date.MOD_SPAN) self.start_compound_date(attrs, gen.lib.Date.MOD_SPAN)
def start_compound_date(self, attrs, mode): def start_compound_date(self, attrs, mode):
if self.source_ref: if self.citation:
date_value = self.source_ref.get_date_object() date_value = self.citation.get_date_object()
elif self.ord: elif self.ord:
date_value = self.ord.get_date_object() date_value = self.ord.get_date_object()
elif self.object: elif self.object:
@ -2148,8 +2214,8 @@ class GrampsParser(UpdateCallback):
newyear=newyear) newyear=newyear)
def start_dateval(self, attrs): def start_dateval(self, attrs):
if self.source_ref: if self.citation:
date_value = self.source_ref.get_date_object() date_value = self.citation.get_date_object()
elif self.ord: elif self.ord:
date_value = self.ord.get_date_object() date_value = self.ord.get_date_object()
elif self.object: elif self.object:
@ -2227,8 +2293,8 @@ class GrampsParser(UpdateCallback):
newyear=newyear) newyear=newyear)
def start_datestr(self, attrs): def start_datestr(self, attrs):
if self.source_ref: if self.citation:
date_value = self.source_ref.get_date_object() date_value = self.citation.get_date_object()
elif self.ord: elif self.ord:
date_value = self.ord.get_date_object() date_value = self.ord.get_date_object()
elif self.object: elif self.object:
@ -2531,13 +2597,23 @@ class GrampsParser(UpdateCallback):
self.source.title = tag self.source.title = tag
def stop_sourceref(self, *tag): def stop_sourceref(self, *tag):
self.source_ref = None # if we are in an old style sourceref we need to commit the citation
if self.in_old_sourceref:
self.db.commit_citation(self.citation, self.trans,
self.citation.get_change_time())
self.citation = None
self.in_old_sourceref = False
def stop_source(self, *tag): def stop_source(self, *tag):
self.db.commit_source(self.source, self.trans, self.db.commit_source(self.source, self.trans,
self.source.get_change_time()) self.source.get_change_time())
self.source = None self.source = None
def stop_citation(self, *tag):
self.db.commit_citation(self.citation, self.trans,
self.citation.get_change_time())
self.citation = None
def stop_sauthor(self, tag): def stop_sauthor(self, tag):
self.source.author = tag self.source.author = tag
@ -2566,7 +2642,16 @@ class GrampsParser(UpdateCallback):
self.address.set_postal_code(tag) self.address.set_postal_code(tag)
def stop_spage(self, tag): def stop_spage(self, tag):
self.source_ref.set_page(tag) # Valid for version <= 1.4.0
self.citation.set_page(tag)
def stop_page(self, tag):
# Valid for version >= 1.5.0
self.citation.set_page(tag)
def stop_confidence(self, tag):
# Valid for version >= 1.5.0
self.citation.set_confidence_level(int(tag))
def stop_lds_ord(self, *tag): def stop_lds_ord(self, *tag):
self.ord = None self.ord = None
@ -2587,14 +2672,14 @@ class GrampsParser(UpdateCallback):
# So we create a new note, commit, and add the handle to note list. # So we create a new note, commit, and add the handle to note list.
note = gen.lib.Note() note = gen.lib.Note()
note.handle = Utils.create_id() note.handle = Utils.create_id()
note.private = self.source_ref.private note.private = self.citation.private
note.set(text) note.set(text)
note.type.set(gen.lib.NoteType.SOURCE_TEXT) note.type.set(gen.lib.NoteType.SOURCE_TEXT)
self.db.add_note(note, self.trans) self.db.add_note(note, self.trans)
#set correct change time #set correct change time
self.db.commit_note(note, self.trans, self.change) self.db.commit_note(note, self.trans, self.change)
self.info.add('new-object', NOTE_KEY, note) self.info.add('new-object', NOTE_KEY, note)
self.source_ref.add_note(note.handle) self.citation.add_note(note.handle)
def stop_scomments(self, tag): def stop_scomments(self, tag):
if self.use_p: if self.use_p:
@ -2604,14 +2689,14 @@ class GrampsParser(UpdateCallback):
text = tag text = tag
note = gen.lib.Note() note = gen.lib.Note()
note.handle = Utils.create_id() note.handle = Utils.create_id()
note.private = self.source_ref.private note.private = self.citation.private
note.set(text) note.set(text)
note.type.set(gen.lib.NoteType.SOURCEREF) note.type.set(gen.lib.NoteType.CITATION)
self.db.add_note(note, self.trans) self.db.add_note(note, self.trans)
#set correct change time #set correct change time
self.db.commit_note(note, self.trans, self.change) self.db.commit_note(note, self.trans, self.change)
self.info.add('new-object', NOTE_KEY, note) self.info.add('new-object', NOTE_KEY, note)
self.source_ref.add_note(note.handle) self.citation.add_note(note.handle)
def stop_last(self, tag): def stop_last(self, tag):
if self.surname: if self.surname:

View File

@ -35,5 +35,5 @@
# Public Constants # Public Constants
# #
#------------------------------------------------------------------------ #------------------------------------------------------------------------
GRAMPS_XML_VERSION = "1.4.0" GRAMPS_XML_VERSION = "1.5.0"