Gedcom export, upgrade OBJE handling to Gedcom 5.5.1 style (#702)
Fixes #10797
This commit is contained in:
parent
e356573605
commit
dd43cde20e
@ -1,12 +1,12 @@
|
|||||||
0 HEAD
|
0 HEAD
|
||||||
1 SOUR Gramps
|
1 SOUR Gramps
|
||||||
2 VERS 5.0.0-alpha2
|
2 VERS 5.0.1
|
||||||
2 NAME Gramps
|
2 NAME Gramps
|
||||||
1 DATE 1 SEP 2017
|
1 DATE 7 NOV 2018
|
||||||
2 TIME 12:10:38
|
2 TIME 16:03:33
|
||||||
1 SUBM @SUBM@
|
1 SUBM @SUBM@
|
||||||
1 FILE C:\Users\prc\AppData\Roaming\gramps\temp\exp_sample_ged.ged
|
1 FILE C:\Users\prc\AppData\Roaming\gramps\temp\exp_sample_ged.ged
|
||||||
1 COPR Copyright (c) 2017 Alex Roitman,,,.
|
1 COPR Copyright (c) 2018 Alex Roitman,,,.
|
||||||
1 GEDC
|
1 GEDC
|
||||||
2 VERS 5.5.1
|
2 VERS 5.5.1
|
||||||
2 FORM LINEAGE-LINKED
|
2 FORM LINEAGE-LINKED
|
||||||
@ -786,11 +786,7 @@
|
|||||||
3 ADOP BOTH
|
3 ADOP BOTH
|
||||||
1 FAMC @F0005@
|
1 FAMC @F0005@
|
||||||
2 PEDI adopted
|
2 PEDI adopted
|
||||||
1 OBJE
|
1 OBJE @O0000@
|
||||||
2 FORM jpeg
|
|
||||||
2 TITL Michael O'Toole 2015-11
|
|
||||||
2 FILE c:\grampsaio64-5.0.0\share\gramps\tests\O0.jpg
|
|
||||||
2 NOTE @N0019@
|
|
||||||
1 NOTE @N0007@
|
1 NOTE @N0007@
|
||||||
1 CHAN
|
1 CHAN
|
||||||
2 DATE 18 JUN 2016
|
2 DATE 18 JUN 2016
|
||||||
@ -1423,4 +1419,12 @@
|
|||||||
0 @N0017@ NOTE A citation Note Source text
|
0 @N0017@ NOTE A citation Note Source text
|
||||||
0 @N0018@ NOTE Another Citation Note
|
0 @N0018@ NOTE Another Citation Note
|
||||||
0 @N0019@ NOTE A bad photo for sure
|
0 @N0019@ NOTE A bad photo for sure
|
||||||
|
0 @O0000@ OBJE
|
||||||
|
1 FILE c:\users\prc\workspace\grampsm\main\data\tests\O0.jpg
|
||||||
|
2 FORM jpeg
|
||||||
|
2 TITL Michael O'Toole 2015-11
|
||||||
|
1 NOTE @N0019@
|
||||||
|
1 CHAN
|
||||||
|
2 DATE 29 OCT 2016
|
||||||
|
3 TIME 15:23:37
|
||||||
0 TRLR
|
0 TRLR
|
||||||
|
@ -259,6 +259,7 @@ class GedcomWriter(UpdateCallback):
|
|||||||
self._sources()
|
self._sources()
|
||||||
self._repos()
|
self._repos()
|
||||||
self._notes()
|
self._notes()
|
||||||
|
self._all_media()
|
||||||
|
|
||||||
self._writeln(0, "TRLR")
|
self._writeln(0, "TRLR")
|
||||||
|
|
||||||
@ -1421,27 +1422,68 @@ class GedcomWriter(UpdateCallback):
|
|||||||
|
|
||||||
def _photo(self, photo, level):
|
def _photo(self, photo, level):
|
||||||
"""
|
"""
|
||||||
n OBJE {1:1}
|
n OBJE @<XREF:OBJE>@ {1:1}
|
||||||
+1 FORM <MULTIMEDIA_FORMAT> {1:1}
|
|
||||||
+1 TITL <DESCRIPTIVE_TITLE> {0:1}
|
|
||||||
+1 FILE <MULTIMEDIA_FILE_REFERENCE> {1:1}
|
|
||||||
+1 <<NOTE_STRUCTURE>> {0:M}
|
|
||||||
"""
|
"""
|
||||||
photo_obj_id = photo.get_reference_handle()
|
photo_obj_id = photo.get_reference_handle()
|
||||||
photo_obj = self.dbase.get_media_from_handle(photo_obj_id)
|
photo_obj = self.dbase.get_media_from_handle(photo_obj_id)
|
||||||
if photo_obj:
|
if photo_obj:
|
||||||
mime = photo_obj.get_mime_type()
|
# if not os.path.isfile(path):
|
||||||
form = MIME2GED.get(mime, mime)
|
# return
|
||||||
path = media_path_full(self.dbase, photo_obj.get_path())
|
self._writeln(level, 'OBJE @%s@' % photo_obj.get_gramps_id())
|
||||||
if not os.path.isfile(path):
|
|
||||||
return
|
|
||||||
self._writeln(level, 'OBJE')
|
|
||||||
if form:
|
|
||||||
self._writeln(level + 1, 'FORM', form)
|
|
||||||
self._writeln(level + 1, 'TITL', photo_obj.get_description())
|
|
||||||
self._writeln(level + 1, 'FILE', path, limit=255)
|
|
||||||
|
|
||||||
self._note_references(photo_obj.get_note_list(), level + 1)
|
def _all_media(self):
|
||||||
|
"""
|
||||||
|
Write out the list of media, sorting by Gramps ID.
|
||||||
|
"""
|
||||||
|
self.set_text(_("Writing media"))
|
||||||
|
# generate a list of (GRAMPS_ID, HANDLE) pairs. This list
|
||||||
|
# can then be sorted by the sort routine, which will use the
|
||||||
|
# first value of the tuple as the sort key.
|
||||||
|
sorted_list = sort_handles_by_id(self.dbase.get_media_handles(),
|
||||||
|
self.dbase.get_media_from_handle)
|
||||||
|
|
||||||
|
# loop through the sorted list, pulling of the handle. This list
|
||||||
|
# has already been sorted by GRAMPS_ID
|
||||||
|
for media_handle in [hndl[1] for hndl in sorted_list]:
|
||||||
|
self.update()
|
||||||
|
self._media(self.dbase.get_media_from_handle(media_handle))
|
||||||
|
|
||||||
|
def _media(self, media):
|
||||||
|
"""
|
||||||
|
n @XREF:OBJE@ OBJE {1:1}
|
||||||
|
+1 FILE <MULTIMEDIA_FILE_REFN> {1:M}
|
||||||
|
+2 FORM <MULTIMEDIA_FORMAT> {1:1}
|
||||||
|
+3 TYPE <SOURCE_MEDIA_TYPE> {0:1}
|
||||||
|
+2 TITL <DESCRIPTIVE_TITLE> {0:1} p.48
|
||||||
|
+1 REFN <USER_REFERENCE_NUMBER> {0:M}
|
||||||
|
+2 TYPE <USER_REFERENCE_TYPE> {0:1}
|
||||||
|
+1 RIN <AUTOMATED_RECORD_ID> {0:1}
|
||||||
|
+1 <<NOTE_STRUCTURE>> {0:M}
|
||||||
|
+1 <<SOURCE_CITATION>> {0:M}
|
||||||
|
+1 <<CHANGE_DATE>> {0:1}
|
||||||
|
"""
|
||||||
|
if media is None:
|
||||||
|
return
|
||||||
|
gramps_id = media.get_gramps_id()
|
||||||
|
|
||||||
|
self._writeln(0, '@%s@' % gramps_id, 'OBJE')
|
||||||
|
mime = media.get_mime_type()
|
||||||
|
form = MIME2GED.get(mime, mime)
|
||||||
|
path = media_path_full(self.dbase, media.get_path())
|
||||||
|
self._writeln(1, 'FILE', path, limit=255)
|
||||||
|
if form:
|
||||||
|
self._writeln(2, 'FORM', form)
|
||||||
|
self._writeln(2, 'TITL', media.get_description())
|
||||||
|
|
||||||
|
for attr in media.get_attribute_list():
|
||||||
|
key = str(attr.get_type())
|
||||||
|
value = attr.get_value().replace('\r', ' ')
|
||||||
|
if key in ("RIN", "RFN", "REFN"):
|
||||||
|
self._writeln(1, key, value)
|
||||||
|
continue
|
||||||
|
self._note_references(media.get_note_list(), 1)
|
||||||
|
self._source_references(media.get_citation_list(), 1)
|
||||||
|
self._change(media.get_change_time(), 1)
|
||||||
|
|
||||||
def _place(self, place, dateobj, level):
|
def _place(self, place, dateobj, level):
|
||||||
"""
|
"""
|
||||||
|
@ -93,6 +93,10 @@ def gedfilt(line):
|
|||||||
The differences are not functional, but are related to changes in Gramps
|
The differences are not functional, but are related to changes in Gramps
|
||||||
version, file date/time and filename.
|
version, file date/time and filename.
|
||||||
"""
|
"""
|
||||||
|
def get_prev_token(back):
|
||||||
|
if back > gedfilt.indx:
|
||||||
|
return None
|
||||||
|
return gedfilt.prev[gedfilt.indx - back][0]
|
||||||
#pylint: disable=unsubscriptable-object
|
#pylint: disable=unsubscriptable-object
|
||||||
if line.startswith('@@'):
|
if line.startswith('@@'):
|
||||||
gedfilt.prev = [None] * 8
|
gedfilt.prev = [None] * 8
|
||||||
@ -112,13 +116,13 @@ def gedfilt(line):
|
|||||||
# save the line for later if needed to figure out the data element
|
# save the line for later if needed to figure out the data element
|
||||||
gedfilt.prev[gedfilt.indx] = token, level, line
|
gedfilt.prev[gedfilt.indx] = token, level, line
|
||||||
gedfilt.indx = (gedfilt.indx + 1) % 8
|
gedfilt.indx = (gedfilt.indx + 1) % 8
|
||||||
if token == "VERS" and gedfilt.prev[gedfilt.indx-2][0] == "SOUR":
|
if token == "VERS" and get_prev_token(2) == "SOUR":
|
||||||
# we must have a header with Gramps version
|
# we must have a header with Gramps version
|
||||||
retval = False
|
retval = False
|
||||||
elif token == "DATE" and gedfilt.prev[gedfilt.indx-2][0] == "NAME":
|
elif token == "DATE" and get_prev_token(2) == "NAME":
|
||||||
# we must have a header with file date
|
# we must have a header with file date
|
||||||
retval = False
|
retval = False
|
||||||
elif token == "TIME" and gedfilt.prev[gedfilt.indx-2][0] == "DATE":
|
elif token == "TIME" and get_prev_token(2) == "DATE":
|
||||||
# probably have a header with file time
|
# probably have a header with file time
|
||||||
retval = False
|
retval = False
|
||||||
elif token == "FILE" and line.endswith('.ged\n'):
|
elif token == "FILE" and line.endswith('.ged\n'):
|
||||||
@ -131,15 +135,15 @@ def gedfilt(line):
|
|||||||
# probably have a copyright line with year
|
# probably have a copyright line with year
|
||||||
retval = False
|
retval = False
|
||||||
else: # this is an addition
|
else: # this is an addition
|
||||||
if token == "VERS" and gedfilt.prev[gedfilt.indx-1][0] == "VERS":
|
if token == "VERS" and get_prev_token(1) == "VERS":
|
||||||
# we must have a header with Gramps version
|
# we must have a header with Gramps version
|
||||||
retval = False
|
retval = False
|
||||||
elif token == "DATE" and (gedfilt.prev[gedfilt.indx-2][0] == "NAME" or
|
elif token == "DATE" and (get_prev_token(2) == "NAME" or
|
||||||
gedfilt.prev[gedfilt.indx-3][0] == "NAME"):
|
get_prev_token(3) == "NAME"):
|
||||||
# we must have a header with file date
|
# we must have a header with file date
|
||||||
retval = False
|
retval = False
|
||||||
elif token == "TIME" and (gedfilt.prev[gedfilt.indx-2][0] == "DATE" or
|
elif token == "TIME" and (get_prev_token(2) == "DATE" or
|
||||||
gedfilt.prev[gedfilt.indx-3][0] == "DATE"):
|
get_prev_token(3) == "DATE"):
|
||||||
# probably have a header with file time
|
# probably have a header with file time
|
||||||
retval = False
|
retval = False
|
||||||
elif token == "FILE" and line.endswith('.ged\n'):
|
elif token == "FILE" and line.endswith('.ged\n'):
|
||||||
|
Loading…
Reference in New Issue
Block a user