From 5c88f9bd588ab6e088d50ad303593c0607c59232 Mon Sep 17 00:00:00 2001 From: Alex Roitman Date: Tue, 16 Nov 2004 03:44:23 +0000 Subject: [PATCH] * src/DateDisplay.py: Remove localized displayers. * src/DateParser.py: Remove localized parsers. * src/DateHandler.py: Remove hard-coded localization assignments; load localized classes from dates directory. * src/const.py.in: Add datesDir constant. * src/dates/Date_ru.py: Add to CVS. * src/dates/Date_fr.py: Add to CVS. * src/dates/Makefile.am: Add to CVS. * src/dates/.cvsignore: Add to CVS. * configure.in: Generate src/dates/Makefile. * src/Makefile.am: Add dates to SUBDIRS. svn: r3729 --- ChangeLog | 13 ++++ configure.in | 1 + src/DateDisplay.py | 87 ----------------------- src/DateHandler.py | 19 +++-- src/DateParser.py | 114 ------------------------------ src/Makefile.am | 2 +- src/const.py.in | 1 + src/dates/.cvsignore | 4 ++ src/dates/Date_fr.py | 146 ++++++++++++++++++++++++++++++++++++++ src/dates/Date_ru.py | 161 ++++++++++++++++++++++++++++++++++++++++++ src/dates/Makefile.am | 19 +++++ 11 files changed, 355 insertions(+), 212 deletions(-) create mode 100644 src/dates/.cvsignore create mode 100644 src/dates/Date_fr.py create mode 100644 src/dates/Date_ru.py create mode 100644 src/dates/Makefile.am diff --git a/ChangeLog b/ChangeLog index 0e0af67e1..24a241e6e 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,16 @@ +2004-11-15 Alex Roitman + * src/DateDisplay.py: Remove localized displayers. + * src/DateParser.py: Remove localized parsers. + * src/DateHandler.py: Remove hard-coded localization assignments; + load localized classes from dates directory. + * src/const.py.in: Add datesDir constant. + * src/dates/Date_ru.py: Add to CVS. + * src/dates/Date_fr.py: Add to CVS. + * src/dates/Makefile.am: Add to CVS. + * src/dates/.cvsignore: Add to CVS. + * configure.in: Generate src/dates/Makefile. + * src/Makefile.am: Add dates to SUBDIRS. + 2004-11-14 Don Allingham * src/DateParser.py: handle leap year in gregorial validity check * src/MergeData.py: Preserve more data when merging diff --git a/configure.in b/configure.in index 3fad13f0b..e8e532fc0 100644 --- a/configure.in +++ b/configure.in @@ -245,6 +245,7 @@ src/Makefile src/const.py src/docgen/Makefile src/plugins/Makefile +src/dates/Makefile src/data/Makefile src/data/templates/Makefile src/po/Makefile diff --git a/src/DateDisplay.py b/src/DateDisplay.py index 725ba7402..60fbb8c92 100644 --- a/src/DateDisplay.py +++ b/src/DateDisplay.py @@ -295,90 +295,3 @@ class DateDisplay: def _display_islamic(self,date_val): return self._display_calendar(date_val,self._islamic) - -#------------------------------------------------------------------------- -# -# French parser -# -#------------------------------------------------------------------------- -class DateDisplayFR(DateDisplay): - - calendar = ( - "", " (Julien)", " (H\xc3\xa9breu)", - " (R\xc3\xa9volutionnaire)", " (Perse)", " (Islamique)" - ) - - _mod_str = ("","avant ","apr\xc3\xa8s ","vers ","","","") - - def display(self,date): - """ - Returns a text string representing the date. - """ - mod = date.get_modifier() - cal = date.get_calendar() - qual = date.get_quality() - start = date.get_start_date() - - qual_str = self._qual_str[qual] - - if mod == Date.MOD_TEXTONLY: - return date.get_text() - elif start == Date.EMPTY: - return "" - elif mod == Date.MOD_SPAN: - d1 = self.display_cal[cal](start) - d2 = self.display_cal[cal](date.get_stop_date()) - return "%sde %s \xc3\xa0 %s%s" % (qual_str,d1,d2,self.calendar[cal]) - elif mod == Date.MOD_RANGE: - d1 = self.display_cal[cal](start) - d2 = self.display_cal[cal](date.get_stop_date()) - return "%sentre %s et %s%s" % (qual_str,d1,d2,self.calendar[cal]) - else: - text = self.display_cal[date.get_calendar()](start) - return "%s%s%s%s" % (qual_str,self._mod_str[mod],text,self.calendar[cal]) - -#------------------------------------------------------------------------- -# -# Russian parser -# -#------------------------------------------------------------------------- -class DateDisplayRU(DateDisplay): - - calendar = ( - "", " (\xd1\x8e\xd0\xbb\xd0\xb8\xd0\xb0\xd0\xbd\xd1\x81\xd0\xba\xd0\xb8\xd0\xb9)", - " (\xd0\xb5\xd0\xb2\xd1\x80\xd0\xb5\xd0\xb9\xd1\x81\xd0\xba\xd0\xb8\xd0\xb9)", - " (\xd1\x80\xd0\xb5\xd1\x81\xd0\xbf\xd1\x83\xd0\xb1\xd0\xbb\xd0\xb8\xd0\xba\xd0\xb0\xd0\xbd\xd1\x81\xd0\xba\xd0\xb8\xd0\xb9)", - " (\xd0\xbf\xd0\xb5\xd1\x80\xd1\x81\xd0\xb8\xd0\xb4\xd1\x81\xd0\xba\xd0\xb8\xd0\xb9)", - " (\xd0\xb8\xd1\x81\xd0\xbb\xd0\xb0\xd0\xbc\xd1\x81\xd0\xba\xd0\xb8\xd0\xb9)" - ) - - _mod_str = ("","\xd0\xb4\xd0\xbe ", - "\xd0\xbf\xd0\xbe\xd1\x81\xd0\xbb\xd0\xb5 ", - "\xd0\xbe\xd0\xba\xd0\xbe\xd0\xbb\xd0\xbe ","","","") - - def display(self,date): - """ - Returns a text string representing the date. - """ - mod = date.get_modifier() - cal = date.get_calendar() - qual = date.get_quality() - start = date.get_start_date() - - qual_str = self._qual_str[qual] - - if mod == Date.MOD_TEXTONLY: - return date.get_text() - elif start == Date.EMPTY: - return "" - elif mod == Date.MOD_SPAN: - d1 = self.display_cal[cal](start) - d2 = self.display_cal[cal](date.get_stop_date()) - return "%s\xd1\x81 %s \xd0\xbf\xd0\xbe %s%s" % (qual_str,d1,d2,self.calendar[cal]) - elif mod == Date.MOD_RANGE: - d1 = self.display_cal[cal](start) - d2 = self.display_cal[cal](date.get_stop_date()) - return "%s\xd0\xbc\xd0\xb5\xd0\xb6\xd0\xb4\xd1\x83 %s \xd0\xb8 %s%s" % (qual_str,d1,d2,self.calendar[cal]) - else: - text = self.display_cal[date.get_calendar()](start) - return "%s%s%s%s" % (qual_str,self._mod_str[mod],text,self.calendar[cal]) diff --git a/src/DateHandler.py b/src/DateHandler.py index 1f2a9c6f6..e26ada715 100644 --- a/src/DateHandler.py +++ b/src/DateHandler.py @@ -50,32 +50,22 @@ _lang = locale.getlocale(locale.LC_TIME)[0] _lang_to_parser = { 'C' : DateParser.DateParser, - 'fr_FR' : DateParser.DateParserFR, 'en_US' : DateParser.DateParser, 'en_GB' : DateParser.DateParser, 'en_AU' : DateParser.DateParser, 'en_CA' : DateParser.DateParser, 'en_SE' : DateParser.DateParser, 'en' : DateParser.DateParser, - 'ru_RU' : DateParser.DateParserRU, - 'ru_RU.koi8r' : DateParser.DateParserRU, - 'ru_RU.utf8' : DateParser.DateParserRU, - 'russian' : DateParser.DateParserRU, } _lang_to_display = { 'C' : DateDisplay.DateDisplay, - 'fr_FR' : DateDisplay.DateDisplayFR, 'en_US' : DateDisplay.DateDisplay, 'en_GB' : DateDisplay.DateDisplay, 'en_AU' : DateDisplay.DateDisplay, 'en_CA' : DateDisplay.DateDisplay, 'en_SE' : DateDisplay.DateDisplay, 'en' : DateDisplay.DateDisplay, - 'ru_RU' : DateDisplay.DateDisplayRU, - 'ru_RU.koi8r' : DateDisplay.DateDisplayRU, - 'ru_RU.utf8' : DateDisplay.DateDisplayRU, - 'russian' : DateDisplay.DateDisplayRU, } #------------------------------------------------------------------------- @@ -116,3 +106,12 @@ def get_format(): except: print "not found" return 0 + +#------------------------------------------------------------------------- +# +# Import localized date classes +# +#------------------------------------------------------------------------- +from Plugins import load_plugins +from const import datesDir +load_plugins(datesDir) diff --git a/src/DateParser.py b/src/DateParser.py index 1aef6eadd..1ed2c08f4 100644 --- a/src/DateParser.py +++ b/src/DateParser.py @@ -524,117 +524,3 @@ class DateParser: new_date = Date.Date() self.set_date(new_date,text) return new_date - -#------------------------------------------------------------------------- -# -# French parser -# -#------------------------------------------------------------------------- -class DateParserFR(DateParser): - - modifier_to_int = { - 'avant' : Date.MOD_BEFORE, - 'av.' : Date.MOD_BEFORE, - 'av' : Date.MOD_BEFORE, - 'apr\xc3\xa8s' : Date.MOD_AFTER, - 'ap.' : Date.MOD_AFTER, - 'ap' : Date.MOD_AFTER, - 'env.' : Date.MOD_ABOUT, - 'env' : Date.MOD_ABOUT, - 'circa' : Date.MOD_ABOUT, - 'c.' : Date.MOD_ABOUT, - 'vers' : Date.MOD_ABOUT, - } - - calendar_to_int = { - 'gr\xc3\xa9gorien' : Date.CAL_GREGORIAN, - 'g' : Date.CAL_GREGORIAN, - 'julien' : Date.CAL_JULIAN, - 'j' : Date.CAL_JULIAN, - 'h\xc3\xa9breu' : Date.CAL_HEBREW, - 'h' : Date.CAL_HEBREW, - 'islamique' : Date.CAL_ISLAMIC, - 'i' : Date.CAL_ISLAMIC, - 'r\xc3\xa9volutionnaire': Date.CAL_FRENCH, - 'r' : Date.CAL_FRENCH, - 'perse' : Date.CAL_PERSIAN, - 'p' : Date.CAL_PERSIAN, - } - - quality_to_int = { - 'estimated' : Date.QUAL_ESTIMATED, - 'est.' : Date.QUAL_ESTIMATED, - 'est' : Date.QUAL_ESTIMATED, - 'calc.' : Date.QUAL_CALCULATED, - 'calc' : Date.QUAL_CALCULATED, - 'calculated' : Date.QUAL_CALCULATED, - } - - def init_strings(self): - DateParser.init_strings(self) - self._span = re.compile("(de)\s+(.+)\s+(\xc3\xa0)\s+(.+)", - re.IGNORECASE) - self._range = re.compile("(ent.|ent|entre)\s+(.+)\s+(et)\s+(.+)", - re.IGNORECASE) - -#------------------------------------------------------------------------- -# -# Russian parser -# -#------------------------------------------------------------------------- -class DateParserRU(DateParser): - - modifier_to_int = { - '\xd0\xb4\xd0\xbe' : Date.MOD_BEFORE, - '\xd0\xbf\xd0\xbe' : Date.MOD_BEFORE, - '\xd0\xbf\xd0\xbe\xd1\x81\xd0\xbb\xd0\xb5' : Date.MOD_AFTER, - '\xd0\xbf.' : Date.MOD_AFTER, - '\xd0\xbf' : Date.MOD_AFTER, - '\xd1\x81' : Date.MOD_AFTER, - '\xd0\xbe\xd0\xba' : Date.MOD_ABOUT, - '\xd0\xbe\xd0\xba.' : Date.MOD_ABOUT, - '\xd0\xbe\xd0\xba\xd0\xbe\xd0\xbb\xd0\xbe' : Date.MOD_ABOUT, - '\xd0\xbf\xd1\x80\xd0\xb8\xd0\xbc\xd0\xb5\xd1\x80\xd0\xbd\xd0\xbe' : Date.MOD_ABOUT, - '\xd0\xbf\xd1\x80\xd0\xb8\xd0\xbc' : Date.MOD_ABOUT, - '\xd0\xbf\xd1\x80\xd0\xb8\xd0\xbc.' : Date.MOD_ABOUT, - '\xd0\xbf\xd1\x80\xd0\xb8\xd0\xb1\xd0\xbb\xd0\xb8\xd0\xb7\xd0\xb8\xd1\x82\xd0\xb5\xd0\xbb\xd1\x8c\xd0\xbd\xd0\xbe' : Date.MOD_ABOUT, - '\xd0\xbf\xd1\x80\xd0\xb8\xd0\xb1.' : Date.MOD_ABOUT, - '\xd0\xbf\xd1\x80\xd0\xb8\xd0\xb1\xd0\xbb.' : Date.MOD_ABOUT, - '\xd0\xbf\xd1\x80\xd0\xb8\xd0\xb1' : Date.MOD_ABOUT, - '\xd0\xbf\xd1\x80\xd0\xb8\xd0\xb1\xd0\xbb' : Date.MOD_ABOUT, - } - - calendar_to_int = { - '\xd0\xb3\xd1\x80\xd0\xb8\xd0\xb3\xd0\xbe\xd1\x80\xd0\xb8\xd0\xb0\xd0\xbd\xd1\x81\xd0\xba\xd0\xb8\xd0\xb9' : Date.CAL_GREGORIAN, - '\xd0\xb3' : Date.CAL_GREGORIAN, - '\xd1\x8e\xd0\xbb\xd0\xb8\xd0\xb0\xd0\xbd\xd1\x81\xd0\xba\xd0\xb8\xd0\xb9' : Date.CAL_JULIAN, - '\xd1\x8e' : Date.CAL_JULIAN, - '\xd0\xb5\xd0\xb2\xd1\x80\xd0\xb5\xd0\xb9\xd1\x81\xd0\xba\xd0\xb8\xd0\xb9' : Date.CAL_HEBREW, - '\xd0\xb5' : Date.CAL_HEBREW, - '\xd0\xb8\xd1\x81\xd0\xbb\xd0\xb0\xd0\xbc\xd1\x81\xd0\xba\xd0\xb8\xd0\xb9' : Date.CAL_ISLAMIC, - '\xd0\xb8' : Date.CAL_ISLAMIC, - '\xd1\x80\xd0\xb5\xd1\x81\xd0\xbf\xd1\x83\xd0\xb1\xd0\xbb\xd0\xb8\xd0\xba\xd0\xb0\xd0\xbd\xd1\x81\xd0\xba\xd0\xb8\xd0\xb9': Date.CAL_FRENCH, - '\xd1\x80' : Date.CAL_FRENCH, - '\xd0\xbf\xd0\xb5\xd1\x80\xd1\x81\xd0\xb8\xd0\xb4\xd1\x81\xd0\xba\xd0\xb8\xd0\xb9' : Date.CAL_PERSIAN, - '\xd0\xbf' : Date.CAL_PERSIAN, - } - - quality_to_int = { - '\xd0\xbe\xd1\x86\xd0\xb5\xd0\xbd\xd0\xb5\xd0\xbd\xd0\xbe' : Date.QUAL_ESTIMATED, - '\xd0\xbe\xd1\x86\xd0\xb5\xd0\xbd.' : Date.QUAL_ESTIMATED, - '\xd0\xbe\xd1\x86.' : Date.QUAL_ESTIMATED, - '\xd0\xbe\xd1\x86\xd0\xb5\xd0\xbd' : Date.QUAL_ESTIMATED, - '\xd0\xbe\xd1\x86' : Date.QUAL_ESTIMATED, - '\xd0\xb2\xd1\x8b\xd1\x87\xd0\xb8\xd1\x81\xd0\xbb\xd0\xb5\xd0\xbd\xd0\xbe' : Date.QUAL_CALCULATED, - '\xd0\xb2\xd1\x8b\xd1\x87\xd0\xb8\xd1\x81\xd0\xbb.' : Date.QUAL_CALCULATED, - '\xd0\xb2\xd1\x8b\xd1\x87.' : Date.QUAL_CALCULATED, - '\xd0\xb2\xd1\x8b\xd1\x87\xd0\xb8\xd1\x81\xd0\xbb' : Date.QUAL_CALCULATED, - '\xd0\xb2\xd1\x8b\xd1\x87' : Date.QUAL_CALCULATED, - } - - def init_strings(self): - DateParser.init_strings(self) - self._span = re.compile("(\xd1\x81|\xd0\xbe\xd1\x82)\\s+(.+)\\s+(\xd0\xbf\xd0\xbe|\xd0\xb4\xd0\xbe)\\s+(.+)", - re.IGNORECASE) - self._range = re.compile("(\xd0\xbc\xd0\xb5\xd0\xb6\xd0\xb4\xd1\x83|\xd0\xbc\xd0\xb5\xd0\xb6|\xd0\xbc\xd0\xb5\xd0\xb6.)\\s+(.+)\\s+(\xd0\xb8)\\s+(.+)", - re.IGNORECASE) diff --git a/src/Makefile.am b/src/Makefile.am index 105041c4c..8ce27e7b3 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -1,5 +1,5 @@ # This is the src level Makefile for Gramps -SUBDIRS = docgen plugins data po +SUBDIRS = docgen plugins dates data po # For intl. support, how do we compile? MOSTLYCLEANFILES = diff --git a/src/const.py.in b/src/const.py.in index 5caaca744..2f18189b0 100644 --- a/src/const.py.in +++ b/src/const.py.in @@ -96,6 +96,7 @@ filterFile = "%s/rule.glade" % rootDir errdialogsFile = "%s/gramps.glade" % rootDir pluginsDir = "%s/plugins" % rootDir +datesDir = "%s/dates" % rootDir docgenDir = "%s/docgen" % rootDir dataDir = "%s/data" % rootDir template_dir = "%s/templates" % dataDir diff --git a/src/dates/.cvsignore b/src/dates/.cvsignore new file mode 100644 index 000000000..c3ec8f1b3 --- /dev/null +++ b/src/dates/.cvsignore @@ -0,0 +1,4 @@ +Makefile +Makefile.in +*.pyc +*.pyo diff --git a/src/dates/Date_fr.py b/src/dates/Date_fr.py new file mode 100644 index 000000000..c9307deba --- /dev/null +++ b/src/dates/Date_fr.py @@ -0,0 +1,146 @@ +# -*- coding: utf-8 -*- +# +# Gramps - a GTK+/GNOME based genealogy program +# +# Copyright (C) 2004 Donald N. Allingham +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# + +# $Id$ + +""" +French-specific classes for parsing and displaying dates. +""" + +#------------------------------------------------------------------------- +# +# Python modules +# +#------------------------------------------------------------------------- +import re +import calendar + +#------------------------------------------------------------------------- +# +# GRAMPS modules +# +#------------------------------------------------------------------------- +import Date +from DateParser import DateParser +from DateDisplay import DateDisplay + +#------------------------------------------------------------------------- +# +# French parser +# +#------------------------------------------------------------------------- +class DateParserFR(DateParser): + + modifier_to_int = { + 'avant' : Date.MOD_BEFORE, + 'av.' : Date.MOD_BEFORE, + 'av' : Date.MOD_BEFORE, + 'après' : Date.MOD_AFTER, + 'ap.' : Date.MOD_AFTER, + 'ap' : Date.MOD_AFTER, + 'env.' : Date.MOD_ABOUT, + 'env' : Date.MOD_ABOUT, + 'circa' : Date.MOD_ABOUT, + 'c.' : Date.MOD_ABOUT, + 'vers' : Date.MOD_ABOUT, + } + + calendar_to_int = { + 'grégorien' : Date.CAL_GREGORIAN, + 'g' : Date.CAL_GREGORIAN, + 'julien' : Date.CAL_JULIAN, + 'j' : Date.CAL_JULIAN, + 'hébreu' : Date.CAL_HEBREW, + 'h' : Date.CAL_HEBREW, + 'islamique' : Date.CAL_ISLAMIC, + 'i' : Date.CAL_ISLAMIC, + 'révolutionnaire': Date.CAL_FRENCH, + 'r' : Date.CAL_FRENCH, + 'perse' : Date.CAL_PERSIAN, + 'p' : Date.CAL_PERSIAN, + } + + quality_to_int = { + 'estimated' : Date.QUAL_ESTIMATED, + 'est.' : Date.QUAL_ESTIMATED, + 'est' : Date.QUAL_ESTIMATED, + 'calc.' : Date.QUAL_CALCULATED, + 'calc' : Date.QUAL_CALCULATED, + 'calculated' : Date.QUAL_CALCULATED, + } + + def init_strings(self): + DateParser.init_strings(self) + self._span = re.compile("(de)\s+(.+)\s+(à)\s+(.+)", + re.IGNORECASE) + self._range = re.compile("(ent.|ent|entre)\s+(.+)\s+(et)\s+(.+)", + re.IGNORECASE) + +#------------------------------------------------------------------------- +# +# French display +# +#------------------------------------------------------------------------- +class DateDisplayFR(DateDisplay): + + calendar = ( + "", " (Julien)", " (Hébreu)", + " (Révolutionnaire)", " (Perse)", " (Islamique)" + ) + + _mod_str = ("","avant ","après ","vers ","","","") + + def display(self,date): + """ + Returns a text string representing the date. + """ + mod = date.get_modifier() + cal = date.get_calendar() + qual = date.get_quality() + start = date.get_start_date() + + qual_str = self._qual_str[qual] + + if mod == Date.MOD_TEXTONLY: + return date.get_text() + elif start == Date.EMPTY: + return "" + elif mod == Date.MOD_SPAN: + d1 = self.display_cal[cal](start) + d2 = self.display_cal[cal](date.get_stop_date()) + return "%sde %s à %s%s" % (qual_str,d1,d2,self.calendar[cal]) + elif mod == Date.MOD_RANGE: + d1 = self.display_cal[cal](start) + d2 = self.display_cal[cal](date.get_stop_date()) + return "%sentre %s et %s%s" % (qual_str,d1,d2,self.calendar[cal]) + else: + text = self.display_cal[date.get_calendar()](start) + return "%s%s%s%s" % (qual_str,self._mod_str[mod],text,self.calendar[cal]) + +#------------------------------------------------------------------------- +# +# Register classes +# +#------------------------------------------------------------------------- +from DateHandler import _lang_to_parser, _lang_to_display +for lang_str in ('fr_FR','fr_FR.iso88591','fr_FR.utf8','french'): + _lang_to_parser[lang_str] = DateParserFR + _lang_to_display[lang_str] = DateDisplayFR diff --git a/src/dates/Date_ru.py b/src/dates/Date_ru.py new file mode 100644 index 000000000..574ff0b60 --- /dev/null +++ b/src/dates/Date_ru.py @@ -0,0 +1,161 @@ +# -*- coding: utf-8 -*- +# +# Gramps - a GTK+/GNOME based genealogy program +# +# Copyright (C) 2004 Donald N. Allingham +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# + +# $Id$ + +""" +Russian-specific classes for parsing and displaying dates. +""" + +#------------------------------------------------------------------------- +# +# Python modules +# +#------------------------------------------------------------------------- +import re +import calendar + +#------------------------------------------------------------------------- +# +# GRAMPS modules +# +#------------------------------------------------------------------------- +import Date +from DateParser import DateParser +from DateDisplay import DateDisplay + +#------------------------------------------------------------------------- +# +# Russian parser +# +#------------------------------------------------------------------------- +class DateParserRU(DateParser): + + modifier_to_int = { + 'до' : Date.MOD_BEFORE, + 'по' : Date.MOD_BEFORE, + 'после' : Date.MOD_AFTER, + 'п.' : Date.MOD_AFTER, + 'п' : Date.MOD_AFTER, + 'с' : Date.MOD_AFTER, + 'ок' : Date.MOD_ABOUT, + 'ок.' : Date.MOD_ABOUT, + 'около' : Date.MOD_ABOUT, + 'примерно' : Date.MOD_ABOUT, + 'прим' : Date.MOD_ABOUT, + 'прим.' : Date.MOD_ABOUT, + 'приблизительно' : Date.MOD_ABOUT, + 'приб.' : Date.MOD_ABOUT, + 'прибл.' : Date.MOD_ABOUT, + 'приб' : Date.MOD_ABOUT, + 'прибл' : Date.MOD_ABOUT, + } + + calendar_to_int = { + 'григорианский' : Date.CAL_GREGORIAN, + 'г' : Date.CAL_GREGORIAN, + 'юлианский' : Date.CAL_JULIAN, + 'ю' : Date.CAL_JULIAN, + 'еврейский' : Date.CAL_HEBREW, + 'е' : Date.CAL_HEBREW, + 'исламский' : Date.CAL_ISLAMIC, + 'и' : Date.CAL_ISLAMIC, + 'республиканский': Date.CAL_FRENCH, + 'р' : Date.CAL_FRENCH, + 'персидский' : Date.CAL_PERSIAN, + 'п' : Date.CAL_PERSIAN, + } + + quality_to_int = { + 'оценено' : Date.QUAL_ESTIMATED, + 'оцен.' : Date.QUAL_ESTIMATED, + 'оц.' : Date.QUAL_ESTIMATED, + 'оцен' : Date.QUAL_ESTIMATED, + 'оц' : Date.QUAL_ESTIMATED, + 'вычислено' : Date.QUAL_CALCULATED, + 'вычисл.' : Date.QUAL_CALCULATED, + 'выч.' : Date.QUAL_CALCULATED, + 'вычисл' : Date.QUAL_CALCULATED, + 'выч' : Date.QUAL_CALCULATED, + } + + def init_strings(self): + DateParser.init_strings(self) + self._span = re.compile("(с|от)\s+(.+)\s+(по|до)\s+(.+)", + re.IGNORECASE) + self._range = re.compile("(между|меж|меж.)\s+(.+)\s+(и)\s+(.+)", + re.IGNORECASE) + +#------------------------------------------------------------------------- +# +# Russian displayer +# +#------------------------------------------------------------------------- +class DateDisplayRU(DateDisplay): + + calendar = ( + "", " (юлианский)", + " (еврейский)", + " (республиканский)", + " (персидский)", + " (исламский)" + ) + + _mod_str = ("","до ", + "после ", + "около ","","","") + + def display(self,date): + """ + Returns a text string representing the date. + """ + mod = date.get_modifier() + cal = date.get_calendar() + qual = date.get_quality() + start = date.get_start_date() + + qual_str = self._qual_str[qual] + + if mod == Date.MOD_TEXTONLY: + return date.get_text() + elif start == Date.EMPTY: + return "" + elif mod == Date.MOD_SPAN: + d1 = self.display_cal[cal](start) + d2 = self.display_cal[cal](date.get_stop_date()) + return "%sс %s по %s%s" % (qual_str,d1,d2,self.calendar[cal]) + elif mod == Date.MOD_RANGE: + d1 = self.display_cal[cal](start) + d2 = self.display_cal[cal](date.get_stop_date()) + return "%sмежду %s и %s%s" % (qual_str,d1,d2,self.calendar[cal]) + else: + text = self.display_cal[date.get_calendar()](start) + return "%s%s%s%s" % (qual_str,self._mod_str[mod],text,self.calendar[cal]) + +#------------------------------------------------------------------------- +# +# Register classes +# +#------------------------------------------------------------------------- +from DateHandler import _lang_to_parser, _lang_to_display +for lang_str in ('ru_RU','ru_RU.koi8r','ru_RU.utf8','russian'): + _lang_to_parser[lang_str] = DateParserRU + _lang_to_display[lang_str] = DateDisplayRU diff --git a/src/dates/Makefile.am b/src/dates/Makefile.am new file mode 100644 index 000000000..610156ed4 --- /dev/null +++ b/src/dates/Makefile.am @@ -0,0 +1,19 @@ +# This is the src/plugins level Makefile for Gramps +# We could use GNU make's ':=' syntax for nice wildcard use, +# but that is not necessarily portable. +# If not using GNU make, then list all .py files individually + +pkgdatadir = $(datadir)/@PACKAGE@/dates + +pkgdata_PYTHON = \ + Date_ru.py\ + Date_fr.py + +pkgpyexecdir = @pkgpyexecdir@/dates +pkgpythondir = @pkgpythondir@/dates + +GRAMPS_PY_MODPATH = ".." + +pycheck: + (export PYTHONPATH=$(GRAMPS_PY_MODPATH); \ + pychecker $(pkgdata_PYTHON));