return "i" + el.get_pointer().replace('@', '').lower() g = Parser() g.parse_file(workpath) gedcom_dict = g.get_element_dictionary() individuals, marriages = {}, {} for k, v in gedcom_dict.items(): if isinstance(v, IndividualElement): children, siblings = set(), set() idx = term2id(v) title = v.get_name()[0] + " " + v.get_name()[1] title = title.replace('"', '').replace('[', '').replace(']', '').replace('(', '').replace(')', '').strip() own_families = g.get_families(v, 'FAMS') for fam in own_families: children |= set(term2id(i) for i in g.get_family_members(fam, "CHIL")) parent_families = g.get_families(v, 'FAMC') if len(parent_families): for member in g.get_family_members(parent_families[0], "CHIL"): # NB adoptive families i.e len(parent_families)>1 are not considered (TODO?) if member.get_pointer() == v.get_pointer(): continue siblings.add(term2id(member)) if idx in individuals: children |= individuals[idx].get('children', set()) siblings |= individuals[idx].get('siblings', set()) individuals[idx] = {'sex': v.get_gender().lower(), 'children': children, 'siblings': siblings, 'title': title}
def run_checker(file_path): results = "Individual Name,Spouse Name,Shared Ancestor, # of Generations Removed from Individual, # of Generations Removed from Spouse<br />" # Initialize the parser gedcom_parser = Parser() # Parse your file gedcom_parser.parse_file(file_path, False) root_child_elements = gedcom_parser.get_root_child_elements() def print_name(person): name = person.get_name() return name[0] + " " + name[1] def get_ancestors(person, level=0): parents = gedcom_parser.get_parents(person, "ALL") for index, parent in enumerate(parents): parents[index] = (parent, level) ancestors = [] ancestors.extend(parents) for parent in parents: ancestors.extend(get_ancestors(parent[0], level + 1)) return ancestors def are_related(person_one, person_two): ancestors_one = get_ancestors(person_one) ancestors_two = get_ancestors(person_two) # traverse in the 1st list for x in ancestors_one: # traverse in the 2nd list for y in ancestors_two: # if one common if x[0] == y[0]: return (x[0], x[1], y[1]) return False count = 0 # Iterate through all root child elements for individual in root_child_elements: # Is the `element` an actual `IndividualElement`? (Allows usage of extra functions such as `surname_match` and `get_name`.) if isinstance(individual, IndividualElement): families = gedcom_parser.get_families( individual, gedcom.tags.GEDCOM_TAG_FAMILY_SPOUSE) for family in families: family_members = gedcom_parser.get_family_members( family, members_type=gedcom.tags.GEDCOM_TAG_WIFE) if len(family_members) > 0: for spouse in family_members: shared_ancestor_tuple = are_related(individual, spouse) if individual != spouse and shared_ancestor_tuple: results += print_name( individual ) + "," + print_name(spouse) + "," + print_name( shared_ancestor_tuple[0]) + "," + str( shared_ancestor_tuple[1]) + "," + str( shared_ancestor_tuple[2]) + "<br />" count += 1 results += 'Total count: ' + str(count) return results