From ee91b33a43d907b57dc051e56c8ac2c0d12b4410 Mon Sep 17 00:00:00 2001 From: Benny Malengier Date: Fri, 22 Oct 2010 14:20:01 +0000 Subject: [PATCH] gedcom import export for new name structure svn: r16022 --- src/gen/lib/name.py | 36 ----------------------- src/gen/lib/surname.py | 2 +- src/plugins/export/ExportGedcom.py | 33 ++++++++++++--------- src/plugins/lib/libgedcom.py | 47 +++++++++++++++++++++++------- src/plugins/tool/PatchNames.py | 6 ++-- 5 files changed, 58 insertions(+), 66 deletions(-) diff --git a/src/gen/lib/name.py b/src/gen/lib/name.py index 9e52beac5..bfa1884c0 100644 --- a/src/gen/lib/name.py +++ b/src/gen/lib/name.py @@ -456,39 +456,3 @@ class Name(SecondaryObject, PrivacyBase, SurnameBase, SourceBase, NoteBase, return '%s /%s/' % (firstname, surname) else: return '%s /%s/ %s' % (firstname, surname, suffix) - -## -## #DEPRECATED METHODS -## -## -## def get_surname_prefix(self): -## """ -## Return the prefix (or article) of a surname. -## -## The prefix is not used for sorting or grouping. -## """ -## return self.prefix -## -## def set_surname_prefix(self, val): -## """ -## Set the prefix (or article) of a surname. -## -## Examples of articles would be 'de' or 'van'. -## """ -## self.prefix = val -## -## def get_patronymic(self): -## """Return the patronymic name for the Name instance.""" -## return self.patronymic -## -## def set_patronymic(self, name): -## """Set the patronymic name for the Name instance.""" -## self.patronymic = name -## -## def get_surname(self): -## """Return the surname (or last name) for the Name instance.""" -## return self.surname -## -## def set_surname(self, name): -## """Set the surname (or last name) for the Name instance.""" -## self.surname = name diff --git a/src/gen/lib/surname.py b/src/gen/lib/surname.py index 251f308b5..8b7232a92 100644 --- a/src/gen/lib/surname.py +++ b/src/gen/lib/surname.py @@ -185,7 +185,7 @@ class Surname(SecondaryObject): """Return if this surname is the primary surname""" return self.primary - def set_primary(self, primary): + def set_primary(self, primary=True): """Set if this surname is the primary surname.replace Use :class:`~gen.lib.surname.SurnameBase` to set the primary surname via :method:`~gen.lib.surname.SurnameBase.set_primary_surname` diff --git a/src/plugins/export/ExportGedcom.py b/src/plugins/export/ExportGedcom.py index 2ab6fb460..8354bf13d 100644 --- a/src/plugins/export/ExportGedcom.py +++ b/src/plugins/export/ExportGedcom.py @@ -498,14 +498,12 @@ class GedcomWriter(UpdateCallback): """ Write the names associated with the person to the current level. - Since nicknames are now separate from the name structure, we search - the attribute list to see if we can find a nickname. Because we do - not know the mappings, we just take the first nickname we find, and - add it to the primary name. + Since nicknames in version < 3.3 are separate from the name structure, + we search the attribute list to see if we can find a nickname. + Because we do not know the mappings, we just take the first nickname + we find, and add it to the primary name. + If a nickname is present in the name structure, it has precedence - All other names are assumed to not have a nickname, even if other - nicknames exist in the attribute list. - """ nicknames = [ attr.get_value() for attr in person.get_attribute_list() if int(attr.get_type()) == gen.lib.AttributeType.NICKNAME ] @@ -1187,7 +1185,7 @@ class GedcomWriter(UpdateCallback): elif date.get_text(): self.__writeln(level, 'DATE', date.get_text()) - def __person_name(self, name, nick): + def __person_name(self, name, attr_nick): """ n NAME {1:1} +1 NPFX {0:1} @@ -1202,13 +1200,21 @@ class GedcomWriter(UpdateCallback): gedcom_name = name.get_gedcom_name() firstname = name.get_first_name().strip() - patron = name.get_patronymic().strip() - if patron: - firstname = "%s %s" % (firstname, patron) - surname = name.get_surname().replace('/', '?') - surprefix = name.get_surname_prefix().replace('/', '?') + surns = [] + surprefs = [] + for surn in name.get_surname_list(): + surns.append(surn.get_surname().replace('/', '?')) + if surn.get_connector(): + #we store connector with the surname + surns[-1] = surns[-1] + ' ' + surn.get_connector() + surprefs.append(surn.get_prefix().replace('/', '?')) + surname = ', '.join(surns) + surprefix = ', '.join(surprefs) suffix = name.get_suffix() title = name.get_title() + nick = name.get_nick_name() + if nick.strip() == '': + nick = attr_nick self.__writeln(1, 'NAME', gedcom_name) @@ -1218,7 +1224,6 @@ class GedcomWriter(UpdateCallback): self.__writeln(2, 'SPFX', surprefix) if surname: self.__writeln(2, 'SURN', surname) - if name.get_suffix(): self.__writeln(2, 'NSFX', suffix) if name.get_title(): diff --git a/src/plugins/lib/libgedcom.py b/src/plugins/lib/libgedcom.py index ce63d88b6..09724342a 100644 --- a/src/plugins/lib/libgedcom.py +++ b/src/plugins/lib/libgedcom.py @@ -1672,16 +1672,25 @@ class GedcomParser(UpdateCallback): match = SURNAME_RE.match(text) if match: + #/surname/ extra, we assume extra is given name names = match.groups() name.set_first_name(names[1].strip()) - name.set_surname(names[0].strip()) + surn = gen.lib.Surname() + surn.set_surname(names[0].strip()) + surn.set_primary() + name.set_surname_list([surn]) else: try: names = NAME_RE.match(text).groups() + # given /surname/ extra, we assume extra is suffix name.set_first_name(names[0].strip()) - name.set_surname(names[2].strip()) + surn = gen.lib.Surname() + surn.set_surname(names[2].strip()) + surn.set_primary() + name.set_surname_list([surn]) name.set_suffix(names[4].strip()) except: + # something strange, set as first name name.set_first_name(text.strip()) return name @@ -2781,7 +2790,7 @@ class GedcomParser(UpdateCallback): sub_state.name = name sub_state.level = 2 - self.__parse_level(sub_state, self.name_parse_tbl, self.__undefined) + self.__parse_level(sub_state, self.name_parse_tbl, self.__undefined) def __person_object(self, line, state): """ @@ -3163,7 +3172,13 @@ class GedcomParser(UpdateCallback): @param state: The current state @type state: CurrentState """ - state.name.set_surname_prefix(line.data.strip()) + if state.name.get_surname_list(): + state.name.get_surname_list()[0].set_prefix(line.data.strip()) + else: + surn = gen.lib.Surname() + surn.set_prefix(line.data.strip()) + surn.set_primary() + state.name.set_surname_list([surn]) self.__skip_subordinate_levels(state.level+1) def __name_surn(self, line, state): @@ -3173,7 +3188,13 @@ class GedcomParser(UpdateCallback): @param state: The current state @type state: CurrentState """ - state.name.set_surname(line.data.strip()) + if state.name.get_surname_list(): + state.name.get_surname_list()[0].set_surname(line.data.strip()) + else: + surn = gen.lib.Surname() + surn.set_surname(line.data.strip()) + surn.set_primary() + state.name.set_surname_list([surn]) self.__skip_subordinate_levels(state.level+1) def __name_marnm(self, line, state): @@ -3187,7 +3208,10 @@ class GedcomParser(UpdateCallback): data = text.split() if len(data) == 1: name = gen.lib.Name(state.person.primary_name) - name.set_surname(data[0].strip()) + surn = gen.lib.Surname() + surn.set_surname(data[0].strip()) + surn.set_primary() + name.set_surname_list([surn]) name.set_type(gen.lib.NameType.MARRIED) state.person.add_alternate_name(name) elif len(data) > 1: @@ -3202,8 +3226,12 @@ class GedcomParser(UpdateCallback): @param state: The current state @type state: CurrentState """ - if state.name.get_suffix() == "": + if state.name.get_suffix() == "" or state.name.get_suffix() == line.data: + #suffix might be set before when parsing name string state.name.set_suffix(line.data) + else: + #previously set suffix different, to not loose information, append + state.name.set_suffix(state.name.get_suffix() + ' ' + line.data) self.__skip_subordinate_levels(state.level+1) def __name_nick(self, line, state): @@ -3213,10 +3241,7 @@ class GedcomParser(UpdateCallback): @param state: The current state @type state: CurrentState """ - attr = gen.lib.Attribute() - attr.set_type(gen.lib.AttributeType.NICKNAME) - attr.set_value(line.data) - state.person.add_attribute(attr) + state.name.set_nick_name(line.data.strip()) self.__skip_subordinate_levels(state.level+1) def __name_aka(self, line, state): diff --git a/src/plugins/tool/PatchNames.py b/src/plugins/tool/PatchNames.py index 7a667d0db..11669b119 100644 --- a/src/plugins/tool/PatchNames.py +++ b/src/plugins/tool/PatchNames.py @@ -77,6 +77,7 @@ prefix_list = [ "um", "una", "uno", "der", "ter", "te", "die", ] +connector_list = ['e', 'y', ] _title_re = re.compile(r"^ ([A-Za-z][A-Za-z]+\.) \s+ (.+) $", re.VERBOSE) _nick_re = re.compile(r"(.+) \s* [(\"] (.+) [)\"]", re.VERBOSE) @@ -308,10 +309,7 @@ class PatchNames(tool.BatchTool, ManagedWindow.ManagedWindow): name = p.get_primary_name() name.set_first_name(grp[1].strip()) nick_name = grp[2].strip() - attr = gen.lib.Attribute() - attr.set_type(gen.lib.AttributeType.NICKNAME) - attr.set_value(nick_name) - p.add_attribute(attr) + name.set_nick_name(nick_name) self.db.commit_person(p, trans) for grp in self.title_list: