예제 #1
0
class GedcomParser:

    MAP_TAG_TO_DATA = {
        "FAMC": "origin",
        "HUSB": "head",
        "WIFE": "partner",
        "BIRT": "birth",
        "DEAT": "death",
        "SURN": "surname",
        "GIVN": "name"
    }

    def __init__(self, filename):
        self.file = filename
        self.env = Env()
        self.data_holder = None
        self.current_tag = None

    def line_to_tuple(line):
        ret = line.split()
        if len(ret) > 0:
            ret[0] = int(ret[0])
            if len(ret) > 2 and ret[0] == 0:
                temp = ret[1][1:-1]
                ret[1] = ret[2]
                ret[2] = temp
            return ret

    def create_entry(self):
        if self.data_holder is not None:
            idn = str(self.data_holder.get_idn())
            self.env.add_entry(idn, self.data_holder)
            if isinstance(self.data_holder, Person):
                self.env.next_indi_id += 1
            elif isinstance(self.data_holder, Family):
                self.env.next_fam_id += 1

    # def fam_tag()
    #    self.data_holder.add(value[1:-1])
    def assign_child_to_family(self):
        return 0

    def assign_person_to_family(self, per):
        self.data_holder.add(per)

    def set_birth_tag(self):
        self.current_tag = "birth"

    def set_death_tag(self):
        self.current_tag = "death"

    '''parse_tag = {
        # "INDI": lambda x: person(idn=x),
        "NAME":
        "GIVN":
        "SURN":
        "BIRT": self.set_birth_tag,
        "DEAT": self.set_death_tag,
        "FAMC":
        "FAM": lambda x: family(idn=x),
        "HUSB":
        "WIFE":
        "CHIL":
        "MARR":
        "DATE":
        "PLAC":
    }'''

    def parse_tag_after_0(self, tag, value):
        if tag == "INDI":
            self.data_holder = Person(idn=value[0])
        elif tag == "FAM":
            self.data_holder = Family(idn=value[0])
        # else "not_yet_implemented"
# TODO switcher:
# https://jaxenter.com/implement-switch-case-statement-python-138315.html

    def parse_tag_after_1(self, tag, value):
        # if tag == "NAME":
        if tag == "FAM" or tag == "CHIL":
            self.data_holder.add(value[0][1:-1])
        elif tag in ["FAMC", "HUSB", "WIFE"]:
            data_type = GedcomParser.MAP_TAG_TO_DATA[tag]
            self.data_holder.update_data(data_type, value[0][1:-1])
        elif tag == "BIRT" or tag == "DEAT":
            self.current_tag = GedcomParser.MAP_TAG_TO_DATA[tag]
        elif tag == "MARR":
            self.data_holder.update_data("relation_type", "marriage")
        else:
            return "not_yet_implemented"  # DIV

    def parse_tag_after_2(self, tag, value):
        if tag == "DATE":
            self.data_holder.update_data(self.current_tag, value)
        elif tag == "GIVN" or tag == "SURN":
            data_type = GedcomParser.MAP_TAG_TO_DATA[tag]
            self.data_holder.update_data(data_type, value)
        # elif tag == "PLACE":
        #   self.data_holder.update_data(self.current_tag, value)
        # else "not_yet_implemented"

    def parse_tup(self, tup):
        if tup is not None:
            if tup[0] == 0:
                self.create_entry()
                self.parse_tag_after_0(tup[1], tup[2:])
            elif tup[0] == 1:
                self.parse_tag_after_1(tup[1], tup[2:])
            elif tup[0] == 2:
                self.parse_tag_after_2(tup[1], tup[2:])
            # indidata
            # sex
            # famdata
            # DIV
            return 0

    def parse(self):
        with open(self.file + '.GED', 'r') as reader:
            line = reader.readline()
            while line != '':
                # print(GedcomParser.parse_line(line), end='')
                tup = GedcomParser.line_to_tuple(line)
                self.parse_tup(tup)
                #  create new families and individuals
                #  with correct data
                line = reader.readline()

        return self.env