GEDCOM import of alternate dates

svn: r581
This commit is contained in:
Don Allingham 2001-11-25 04:38:30 +00:00
parent 9fef706518
commit 81202417e8
3 changed files with 55 additions and 16 deletions

View File

@ -18,6 +18,14 @@
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
# #
#
# The original algorithms for this module came from Scott E. Lee's
# C implementation. The original C source can be found at Scott's
# web site at http://www.scottlee.com
#
_FR_SDN_OFFSET = 2375474 _FR_SDN_OFFSET = 2375474
_FR_DAYS_PER_4_YEARS = 1461 _FR_DAYS_PER_4_YEARS = 1461
_FR_DAYS_PER_MONTH = 30 _FR_DAYS_PER_MONTH = 30

View File

@ -254,7 +254,7 @@ class Date:
return '' return ''
else: else:
d1 = self.start.display_calendar(month_map) d1 = self.start.display_calendar(month_map)
d2 = self.stop.display_calenar(month_map) d2 = self.stop.display_calendar(month_map)
return "%s %s %s %s (%s)" % ( _("from"),d1,_("to"), d2,cal_str) return "%s %s %s %s (%s)" % ( _("from"),d1,_("to"), d2,cal_str)
def getSaveDate(self): def getSaveDate(self):
@ -330,19 +330,15 @@ class SingleDate:
_("aft") : after } _("aft") : after }
modifiers = "(" + \ modifiers = "(" + \
_("abt") + '|' + \ _("abt\.?") + '|' + \
_("abt\.") + '|' + \
_("about") + '|' + \ _("about") + '|' + \
_("est") + '|' + \ _("est\.?") + '|' + \
_("est\.") + '|' + \
_("circa") + '|' + \ _("circa") + '|' + \
_("around") + '|' + \ _("around") + '|' + \
_("before") + '|' + \ _("before") + '|' + \
_("after") + '|' + \ _("after") + '|' + \
_("aft") + '|' + \ _("aft\.?") + '|' + \
_("aft\.") + '|' + \ _("bef\.?") + '|' + \
_("bef\.") + '|' + \
_("bef") + '|' + \
"abt" + '|' + \ "abt" + '|' + \
"aft" + '|' + \ "aft" + '|' + \
"bef" + ')' "bef" + ')'

View File

@ -21,6 +21,7 @@
"Import from GEDCOM" "Import from GEDCOM"
from RelLib import * from RelLib import *
import Date
import latin_ansel import latin_ansel
import latin_utf8 import latin_utf8
import intl import intl
@ -67,6 +68,8 @@ for val in const.familyConstantEvents.keys():
lineRE = re.compile(r"\s*(\d+)\s+(\S+)\s*(.*)$") lineRE = re.compile(r"\s*(\d+)\s+(\S+)\s*(.*)$")
headRE = re.compile(r"\s*(\d+)\s+HEAD") headRE = re.compile(r"\s*(\d+)\s+HEAD")
nameRegexp = re.compile(r"([\S\s]*\S)?\s*/([^/]+)?/\s*,?\s*([\S]+)?") nameRegexp = re.compile(r"([\S\s]*\S)?\s*/([^/]+)?/\s*,?\s*([\S]+)?")
calRegexp = re.compile(r"\s*@#D([^@]+)@\s*(.*)$")
fromtoRegexp = re.compile(r"\s*FROM\s+@#D([^@]+)@\s*(.*)\s+TO\s+@#D([^@]+)@\s*(.*)$")
#------------------------------------------------------------------------- #-------------------------------------------------------------------------
# #
@ -558,8 +561,6 @@ class GedcomParser:
addr.setStreet(matches[2] + self.parse_continue_data(2)) addr.setStreet(matches[2] + self.parse_continue_data(2))
self.parse_address(addr,2) self.parse_address(addr,2)
self.person.addAddress(addr) self.person.addAddress(addr)
# elif matches[1] == "TITL":
# self.person.getPrimaryName().setTitle(matches[2])
elif matches[1] == "BIRT": elif matches[1] == "BIRT":
event = Event() event = Event()
if self.person.getBirth().getDate() != "" or \ if self.person.getBirth().getDate() != "" or \
@ -789,7 +790,7 @@ class GedcomParser:
self.backup() self.backup()
return return
elif matches[1] == "DATE": elif matches[1] == "DATE":
address.setDate(matches[2]) address.setDateObj(self.extract_date(matches[2]))
elif matches[1] == "ADDR": elif matches[1] == "ADDR":
address.setStreet(matches[2] + self.parse_continue_data(2)) address.setStreet(matches[2] + self.parse_continue_data(2))
self.parse_address(address,level+1) self.parse_address(address,level+1)
@ -864,7 +865,8 @@ class GedcomParser:
name = matches[2] name = matches[2]
event.setName(name) event.setName(name)
elif matches[1] == "DATE": elif matches[1] == "DATE":
event.setDate(matches[2]) foo = self.extract_date(matches[2])
event.setDateObj(foo)
elif matches[1] == ["TIME","ADDR","AGE","AGNC","STAT","TEMP","OBJE"]: elif matches[1] == ["TIME","ADDR","AGE","AGNC","STAT","TEMP","OBJE"]:
self.ignore_sub_junk(level+1) self.ignore_sub_junk(level+1)
elif matches[1] == "SOUR": elif matches[1] == "SOUR":
@ -927,7 +929,7 @@ class GedcomParser:
self.backup() self.backup()
break break
elif matches[1] == "DATE": elif matches[1] == "DATE":
event.setDate(matches[2]) event.setDateObj(self.extract_date(matches[2]))
elif matches[1] == ["TIME","ADDR","AGE","AGNC","STAT","TEMP","OBJE"]: elif matches[1] == ["TIME","ADDR","AGE","AGNC","STAT","TEMP","OBJE"]:
self.ignore_sub_junk(level+1) self.ignore_sub_junk(level+1)
elif matches[1] == "SOUR": elif matches[1] == "SOUR":
@ -1070,7 +1072,7 @@ class GedcomParser:
except: except:
event.setName(matches[2]) event.setName(matches[2])
elif matches[1] == "DATE": elif matches[1] == "DATE":
event.setDate(matches[2]) event.setDateObj(self.extract_date(matches[2]))
elif matches[1] == ["TIME","AGE","AGNC","CAUS","ADDR","STAT","TEMP","HUSB","WIFE","OBJE"]: elif matches[1] == ["TIME","AGE","AGNC","CAUS","ADDR","STAT","TEMP","HUSB","WIFE","OBJE"]:
self.ignore_sub_junk(level+1) self.ignore_sub_junk(level+1)
elif matches[1] == "SOUR": elif matches[1] == "SOUR":
@ -1126,7 +1128,7 @@ class GedcomParser:
source.setPage(matches[2] + self.parse_continue_data(level+1)) source.setPage(matches[2] + self.parse_continue_data(level+1))
elif matches[1] == "DATA": elif matches[1] == "DATA":
date,text = self.parse_source_data(level+1) date,text = self.parse_source_data(level+1)
d = Date() d = Date.Date()
d.set(date) d.set(date)
source.setDate(d) source.setDate(d)
source.setText(text) source.setText(text)
@ -1408,6 +1410,39 @@ class GedcomParser:
else: else:
self.barf(level+1) self.barf(level+1)
def extract_date(self,text):
dateobj = Date.Date()
match = fromtoRegexp.match(text)
if match:
(cal1,data1,cal2,data2) = match.groups()
if cal1 != cal2:
pass
if cal1 == "FRENCH R":
dateobj.set_calendar(Date.FRENCH)
elif cal1 == "JULIAN":
dateobj.set_calendar(Date.JULIAN)
elif cal1 == "HEBREW":
dateobj.set_calendar(Date.HEBREW)
dateobj.get_start_date().set(data1)
dateobj.get_stop_date().set(data2)
dateobj.set_range(1)
return dateobj
match = calRegexp.match(text)
if match:
(cal,data) = match.groups()
if cal == "FRENCH R":
dateobj.set_calendar(Date.FRENCH)
elif cal == "JULIAN":
dateobj.set_calendar(Date.JULIAN)
elif cal == "HEBREW":
dateobj.set_calendar(Date.HEBREW)
dateobj.set(data)
else:
dateobj.set(text)
return dateobj
#------------------------------------------------------------------------- #-------------------------------------------------------------------------
# #
# #