Updates for dynamic GEDCOM, and drag/drop

svn: r608
This commit is contained in:
Don Allingham
2001-12-05 02:02:14 +00:00
parent 249852f1cf
commit a45e849fad
14 changed files with 696 additions and 119 deletions

View File

@@ -40,8 +40,18 @@ import gtk
import gnome.ui
import libglade
import xml.parsers.expat
_ = intl.gettext
#-------------------------------------------------------------------------
#
# Unicode to latin conversion
#
#-------------------------------------------------------------------------
from latin_utf8 import utf8_to_latin
u2l = utf8_to_latin
#------------------------------------------------------------------------
#
#
@@ -264,8 +274,7 @@ class ComplexFilterFile:
self.fname = name
try:
f = open(self.fname)
parser = make_parser()
parser.setContentHandler(ComplexFilterParser(self))
parser = ComplexFilterParser(self)
parser.parse(f)
f.close()
except IOError:
@@ -295,25 +304,32 @@ class ComplexFilterFile:
f.write('</filterlist>\n')
f.close()
class ComplexFilterParser(handler.ContentHandler):
class ComplexFilterParser:
def __init__(self,parent):
self.parent = parent
self.curfilter = []
self.curname = ""
def parse(self,f):
p = xml.parsers.expat.ParserCreate()
p.StartElementHandler = self.startElement
p.EndElementHandler = self.endElement
p.ParseFile(f)
def startElement(self,tag,attrs):
tag = u2l(tag)
if tag == "complex_filter":
self.curname = attrs['name']
self.curname = u2l(attrs['name'])
self.curfilter = []
elif tag == "filter":
name = attrs['name']
qual = attrs['text']
name = u2l(attrs['name'])
qual = u2l(attrs['text'])
invert = int(attrs['invert'])
f = Filter.make_filter_from_name(name,qual,invert)
self.curfilter.append(f)
def endElement(self,tag):
if tag == "complex_filter":
if u2l(tag) == "complex_filter":
self.parent.filters[self.curname] = self.curfilter
#------------------------------------------------------------------------

View File

@@ -25,6 +25,8 @@ import Date
import latin_ansel
import latin_utf8
import intl
from GedcomInfo import *
_ = intl.gettext
import os
@@ -163,6 +165,8 @@ class GedcomParser:
self.fmap = {}
self.smap = {}
self.nmap = {}
self.gedmap = GedcomInfoDB()
self.gedsource = None
self.dir_path = os.path.dirname(file)
self.localref = 0
self.placemap = {}
@@ -634,7 +638,11 @@ class GedcomParser:
self.parse_person_attr(attr,2)
continue
else:
event.setName(matches[1])
val = self.gedsource.tag2gramps(matches[1])
if val:
event.setName(val)
else:
event.setName(matches[1])
self.parse_person_event(event,2)
if matches[2] != None:
@@ -899,7 +907,11 @@ class GedcomParser:
if ged2gramps.has_key(matches[2]):
name = ged2gramps[matches[2]]
else:
name = matches[2]
val = self.gedsource.tag2gramps(matches[2])
if val:
name = val
else:
name = matches[2]
event.setName(name)
elif matches[1] == "DATE":
foo = self.extract_date(matches[2])
@@ -1054,7 +1066,11 @@ class GedcomParser:
if ged2gramps.has_key(matches[2]):
name = ged2gramps[matches[2]]
else:
name = matches[2]
val = self.gedsource.tag2gramps(matches[2])
if val:
name = val
else:
name = matches[2]
attr.setName(name)
elif matches[1] == ["CAUS", "DATE","TIME","ADDR","AGE","AGNC","STAT","TEMP","OBJE"]:
self.ignore_sub_junk(level+1)
@@ -1098,9 +1114,6 @@ class GedcomParser:
attr.setNote(note)
def parse_family_event(self,event,level):
global ged2fam
global ged2gramps
while 1:
matches = self.get_next()
if int(matches[0]) < level:
@@ -1286,7 +1299,7 @@ class GedcomParser:
self.index = self.index + 1
def parse_header_source(self):
genby = ""
while 1:
matches = self.get_next()
@@ -1296,12 +1309,11 @@ class GedcomParser:
elif matches[1] == "SOUR":
if self.created_obj.get_text() == "":
self.update(self.created_obj,matches[2])
if matches[2] in self.broken_conc_list:
self.broken_conc = 1
else:
self.broken_conc = 0
self.gedsource = self.gedmap.get_from_source_tag(matches[2])
self.broken_conc = self.gedsource.get_conc()
if matches[2] == "FTW":
self.is_ftw = 1
genby = matches[2]
elif matches[1] == "NAME":
self.update(self.created_obj,matches[2])
elif matches[1] == "VERS":
@@ -1315,7 +1327,9 @@ class GedcomParser:
elif matches[1] == "SUBN":
pass
elif matches[1] == "DEST":
pass
if genby == "GRAMPS":
self.gedsource = self.gedmap.get_from_source_tag(matches[2])
self.broken_conc = self.gedsource.get_conc()
elif matches[1] == "FILE":
self.ignore_sub_junk(2)
elif matches[1] == "COPR":

View File

@@ -34,56 +34,10 @@ import gtk
import gnome.ui
import libglade
from GedcomInfo import *
from latin_ansel import latin_to_ansel
from latin_utf8 import latin_to_utf8
#-------------------------------------------------------------------------
#
# GEDCOM feature support
#
#-------------------------------------------------------------------------
_ADOP_NONE = 0
_ADOP_EVENT = 1
_ADOP_FTW = 2
_ADOP_LEGACY = 3
_ADOP_PEDI = 4
_ADOP_EVEXT = 5
_CONC_OK = 0
_CONC_BROKEN = 1
_ALT_NONE = 0
_ALT_STD = 1
_ALT_ALIAS = 2
_ALT_AKA = 3
_ALT_EVAKA = 4
_CAL_NO = 0
_CAL_YES = 1
_EVEN_NONE = 0
_EVEN_GED = 1
_EVEN_FTW = 2
_OBJE_NO = 0
_OBJE_YES = 1
_RESI_ADDR = 0
_RESI_PLAC = 1
targets = [
("Standard GEDCOM 5.5","GEDCOM 5.5",_ADOP_EVEXT,_CONC_OK,_ALT_STD,_CAL_YES,_EVEN_GED,_OBJE_YES,_RESI_ADDR),
("Brother's Keeper","BROSKEEP",_ADOP_NONE,_CONC_OK,_ALT_NONE,_CAL_NO,_EVEN_GED,_OBJE_NO,_RESI_ADDR),
("Family Origins","FamilyOrigins",_ADOP_EVENT,_CONC_BROKEN,_ALT_EVAKA,_CAL_NO,_EVEN_GED,_OBJE_NO,_RESI_ADDR),
("Family Tree Maker","FTW",_ADOP_FTW,_CONC_BROKEN,_ALT_ALIAS,_CAL_NO,_EVEN_FTW,_OBJE_NO,_RESI_PLAC),
("Ftree","",_ADOP_NONE,_CONC_BROKEN,_ALT_NONE,_CAL_NO,_EVEN_GED,_OBJE_NO,_RESI_ADDR),
("GeneWeb","",_ADOP_EVEXT,_CONC_OK,_ALT_NONE,_CAL_YES,_EVEN_GED,_OBJE_NO,_RESI_ADDR),
("Legacy","Legacy",_ADOP_LEGACY,_CONC_BROKEN,_ALT_STD,_CAL_NO,_EVEN_GED,_OBJE_NO,_RESI_ADDR),
("Personal Ancestral File","PAF",_ADOP_PEDI,_CONC_OK,_ALT_AKA,_CAL_NO,_EVEN_GED,_OBJE_NO,_RESI_ADDR),
("Reunion", "REUNION", _ADOP_NONE,_CONC_BROKEN,_ALT_NONE,_CAL_NO,_EVEN_GED,_OBJE_NO,_RESI_ADDR),
("Visual Genealogie","",_ADOP_NONE,_CONC_BROKEN,_ALT_NONE,_CAL_NO,_EVEN_GED,_OBJE_NO,_RESI_ADDR),
]
#-------------------------------------------------------------------------
#
# Calendar month names
@@ -96,7 +50,7 @@ _hmonth = [
_fmonth = [
"", "VEND", "BRUM", "FRIM", "NIVO", "PLUV", "VENT",
"GERM", "FLOR", "PRAI", "MESS", "THER", "FRUC", "EXTR"]
"GERM", "FLOR", "PRAI", "MESS", "THER", "FRUC", "COMP"]
_month = [
"", "JAN", "FEB", "MAR", "APR", "MAY", "JUN",
@@ -336,7 +290,6 @@ def make_date(subdate,mmap):
retval = "BEF %s" % retval
elif mode == Date.SingleDate.after:
retval = "AFT %s" % retval
return retval
def fmtline(text,limit,level):
@@ -424,7 +377,7 @@ class GedcomWriter:
self.plist = []
self.slist = []
self.flist = []
self.adopt = _ADOP_EVENT
self.adopt = ADOPT_EVENT
self.fidval = 0
self.fidmap = {}
self.pidval = 0
@@ -466,12 +419,15 @@ class GedcomWriter:
filter_obj.set_menu(myMenu)
self.filter_menu = myMenu
gedmap = GedcomInfoDB()
target_obj = self.topDialog.get_widget("target")
myMenu = gtk.GtkMenu()
for (name,dest,adopt,conc,alt,cal,even,obje,resi) in targets:
for name in gedmap.get_name_list():
menuitem = gtk.GtkMenuItem(name)
myMenu.append(menuitem)
menuitem.set_data("data",(dest,adopt,conc,alt,cal,even,obje,resi))
data = gedmap.get_description(name)
menuitem.set_data("data",data)
menuitem.show()
target_obj.set_menu(myMenu)
@@ -486,7 +442,17 @@ class GedcomWriter:
filter = self.filter_menu.get_active().get_data("filter")
act_tgt = self.target_menu.get_active()
(self.dest,self.adopt,self.conc,self.altname,self.cal,self.even,self.obje,self.resi) = act_tgt.get_data("data")
self.target_ged = act_tgt.get_data("data")
self.dest = self.target_ged.get_dest()
self.adopt = self.target_ged.get_adopt()
self.conc = self.target_ged.get_conc()
self.altname = self.target_ged.get_alt_name()
self.cal = self.target_ged.get_alt_calendar()
self.obje = self.target_ged.get_obje()
self.resi = self.target_ged.get_resi()
if self.topDialog.get_widget("ansel").get_active():
self.cnvtxt = latin_to_ansel
@@ -620,17 +586,13 @@ class GedcomWriter:
if self.private and event.getPrivacy():
continue
name = event.getName()
val = ""
if const.familyConstantEvents.has_key(name):
val = const.familyConstantEvents[name]
if val[0] == '_' and self.even != _EVEN_FTW:
val = ''
else:
val = ""
if val == "":
val = self.target_ged.gramps2tag(name)
if val != "":
if self.even == _EVEN_NONE:
continue
self.g.write("1 %s %s\n" % (self.cnvtxt(val),
self.cnvtxt(event.getDescription())))
else:
@@ -641,7 +603,7 @@ class GedcomWriter:
for person in family.getChildList():
self.g.write("1 CHIL @%s@\n" % self.pid(person.getId()))
if self.adopt == _ADOP_FTW:
if self.adopt == ADOPT_FTW:
if person.getMainFamily() == family:
self.g.write('2 _FREL Natural\n')
self.g.write('2 _MREL Natural\n')
@@ -651,7 +613,7 @@ class GedcomWriter:
self.g.write('2 _FREL %s\n' % f[2])
self.g.write('2 _MREL %s\n' % f[1])
break
if self.adopt == _ADOP_LEGACY:
if self.adopt == ADOPT_LEGACY:
for f in person.getAltFamilyList():
if f[0] == family:
self.g.write('2 _STAT %s\n' % f[2])
@@ -691,7 +653,7 @@ class GedcomWriter:
self.write_person_name(person.getPrimaryName(),person.getNickName())
if self.altname == _ALT_STD:
if self.altname == ALT_NAME_STD:
for name in person.getAlternateNames():
self.write_person_name(name,"")
@@ -728,14 +690,13 @@ class GedcomWriter:
if self.private and event.getPrivacy():
continue
name = event.getName()
val = ""
if const.personalConstantEvents.has_key(name):
val = const.personalConstantEvents[name]
if val[0] == '_' and self.even != _EVEN_FTW:
val = ''
else:
val = ""
if val == "":
val = self.target_ged.gramps2tag(name)
if self.adopt == _ADOP_EVENT and val == "ADOP":
if self.adopt == ADOPT_EVENT and val == "ADOP":
ad = 1
self.g.write('1 ADOP\n')
fam = None
@@ -754,8 +715,6 @@ class GedcomWriter:
else:
self.g.write('3 ADOP HUSB\n')
elif val != "" :
if self.even == _EVEN_NONE:
continue
self.g.write("1 %s %s\n" % (self.cnvtxt(val),\
self.cnvtxt(event.getDescription())))
else:
@@ -764,7 +723,7 @@ class GedcomWriter:
self.dump_event_stats(event)
if self.adopt == _ADOP_EVENT and ad == 0 and len(person.getAltFamilyList()) != 0:
if self.adopt == ADOPT_EVENT and ad == 0 and len(person.getAltFamilyList()) != 0:
self.g.write('1 ADOP\n')
fam = None
for f in person.getAltFamilyList():
@@ -837,7 +796,7 @@ class GedcomWriter:
for family in person.getAltFamilyList():
self.g.write("1 FAMC @%s@\n" % self.fid(family[0].getId()))
if self.adopt == _ADOP_PEDI:
if self.adopt == ADOPT_PEDI:
if string.lower(family[1]) == "adopted":
self.g.write("2 PEDI Adopted\n")
@@ -858,7 +817,7 @@ class GedcomWriter:
self.write_long_text("NOTE",1,person.getNote())
def write_long_text(self,tag,level,note):
if self.conc == _CONC_OK:
if self.conc == CONC_OK:
self.write_conc_ok(tag,level,note)
else:
self.write_conc_broken(tag,level,note)
@@ -956,7 +915,7 @@ class GedcomWriter:
val = make_date(start,_month)
self.g.write("%s %s\n" % (prefix,val))
else:
if self.cal == _CAL_YES:
if self.cal == CALENDAR_YES:
(mlist,cal) = _calmap[date.get_calendar()]
if date.isRange():
stop = date.get_stop_date()