Updates for dynamic GEDCOM, and drag/drop
svn: r608
This commit is contained in:
@@ -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
|
||||
|
||||
#------------------------------------------------------------------------
|
||||
|
||||
@@ -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":
|
||||
|
||||
@@ -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()
|
||||
|
||||
Reference in New Issue
Block a user