diff --git a/gramps/gen/datehandler/__init__.py b/gramps/gen/datehandler/__init__.py index 4174cca3f..25cc3457a 100644 --- a/gramps/gen/datehandler/__init__.py +++ b/gramps/gen/datehandler/__init__.py @@ -48,6 +48,7 @@ from . import _date_es from . import _date_fi from . import _date_fr from . import _date_hr +from . import _date_hu from . import _date_it from . import _date_ja from . import _date_lt diff --git a/gramps/gen/datehandler/_date_hu.py b/gramps/gen/datehandler/_date_hu.py new file mode 100644 index 000000000..0b64119b1 --- /dev/null +++ b/gramps/gen/datehandler/_date_hu.py @@ -0,0 +1,368 @@ +# -*- coding: utf-8 -*- +# +# Gramps - a GTK+/GNOME based genealogy program +# +# Copyright (C) 2004-2006 Donald N. Allingham +# Copyright (C) 2015 Lajos Nemeséri +# +# 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +# + +""" +Hungarian-specific classes for parsing and displaying dates. +""" + +#------------------------------------------------------------------------- +# +# Python modules +# +#------------------------------------------------------------------------- +import re + +#------------------------------------------------------------------------- +# +# GRAMPS modules +# +#------------------------------------------------------------------------- +from ..lib.date import Date +from ._dateparser import DateParser +from ._datedisplay import DateDisplay +from ._datehandler import register_datehandler + +#------------------------------------------------------------------------- +# +# Hungarian parser +# +# +#------------------------------------------------------------------------- +class DateParserHU(DateParser): + + + month_to_int = DateParser.month_to_int + + month_to_int["-"]=0 #to make the Zero month to work + + month_to_int["január"] = 1 + month_to_int["jan"] = 1 + month_to_int["jan."] = 1 + month_to_int["I"] = 1 +# month_to_int["i"] = 1 + + month_to_int["február"] = 2 + month_to_int["feb"] = 2 + month_to_int["feb."] = 2 + month_to_int["II"] = 2 +# month_to_int["ii"] = 2 + + month_to_int["március"] = 3 + month_to_int["márc"] = 3 + month_to_int["márc."] = 3 + month_to_int["III"] = 3 +# month_to_int["iii"] = 3 + + month_to_int["április"] = 4 + month_to_int["ápr"] = 4 + month_to_int["ápr."] = 4 + month_to_int["IV"] = 4 +# month_to_int["iv"] = 4 + + month_to_int["május"] = 5 + month_to_int["máj"] = 5 + month_to_int["máj."] = 5 + month_to_int["V"] = 5 +# month_to_int["v"] = 5 + + month_to_int["június"] = 6 + month_to_int["jún"] = 6 + month_to_int["jún."] = 6 + month_to_int["VI"] = 6 +# month_to_int["vi"] = 6 + + month_to_int["július"] = 7 + month_to_int["júl"] = 7 + month_to_int["júl."] = 7 + month_to_int["VII"] = 7 +# month_to_int["vii"] = 7 + + month_to_int["augusztus"] = 8 + month_to_int["aug"] = 8 + month_to_int["aug."] = 8 + month_to_int["VIII"] = 8 +# month_to_int["viii"] = 8 + + month_to_int["szeptember"] = 9 + month_to_int["szept"] = 9 + month_to_int["szept."] = 9 + month_to_int["IX"] = 9 +# month_to_int["ix"] = 9 + + month_to_int["október"] = 10 + month_to_int["okt"] = 10 + month_to_int["okt."] = 10 + month_to_int["X"] = 10 +# month_to_int["x"] = 10 + + month_to_int["november"] = 11 + month_to_int["nov"] = 11 + month_to_int["nov."] = 11 + month_to_int["XI"] = 11 +# month_to_int["xi"] = 11 + + month_to_int["december"] = 12 + month_to_int["dec"] = 12 + month_to_int["dec."] = 12 + month_to_int["XII"] = 12 +# month_to_int["xii"] = 12 + + +#----------------------------------------------------------------------- +# +# Alternative and latin names - not verified +# +#----------------------------------------------------------------------- + # Other common latin names + +# month_to_int["januaris"] = 01 +# month_to_int["januarii"] = 01 +# month_to_int["januarius"] = 01 +# month_to_int["februaris"] = 02 +# month_to_int["februarii"] = 02 +# month_to_int["februarius"] = 02 +# month_to_int["martii"] = 03 +# month_to_int["martius"] = 03 +# month_to_int["aprilis"] = 04 +# month_to_int["maius"] = 05 +# month_to_int["maii"] = 05 +# month_to_int["junius"] = 06 +# month_to_int["junii"] = 06 +# month_to_int["julius"] = 07 +# month_to_int["julii"] = 07 +# month_to_int["augustus"] = 08 +# month_to_int["augusti"] = 08 +# month_to_int["septembris"] = 09 +# month_to_int["7bris"] = 09 +# month_to_int["september"] = 09 +# month_to_int["october"] = 10 +# month_to_int["octobris"] = 10 +# month_to_int["8bris"] = 10 +# month_to_int["novembris"] = 11 +# month_to_int["9bris"] = 11 +# month_to_int["november"] = 11 +# month_to_int["decembris"] = 12 +# month_to_int["10bris"] = 12 +# month_to_int["xbris"] = 12 +# month_to_int["december"] = 12 + + # old Hungarian names + +# month_to_int["Boldogasszony hava"] = 01 +# month_to_int["Fergeteg hava"] = 01 +# month_to_int["Böjtelő hava"] = 02 +# month_to_int["Jégbontó hava"] = 02 +# month_to_int["Böjtmás hava"] = 03 +# month_to_int["Kikelet hava"] = 03 +# month_to_int["Szent György hava"] = 04 +# month_to_int["Szelek hava"] = 04 +# month_to_int["Pünkösd hava"] = 05 +# month_to_int["Ígéret hava"] = 05 +# month_to_int["Szent Iván hava"] = 06 +# month_to_int["Napisten hava"] = 06 +# month_to_int["Szent Jakab hava"] = 07 +# month_to_int["Áldás hava"] = 07 +# month_to_int["Kisasszony hava"] = 08 +# month_to_int["Újkenyér hava"] = 08 +# month_to_int["Szent Mihály hava"] = 09 +# month_to_int["Földanya hava"] = 09 +# month_to_int["Mindszent hava"] = 10 +# month_to_int["Magvető hava"] = 10 +# month_to_int["Szent András hava"] = 11 +# month_to_int["Enyészet hava"] = 11 +# month_to_int["Karácsony hava"] = 12 +# month_to_int["Álom hava"] = 12 + + modifier_after_to_int={ + 'előtt' : Date.MOD_BEFORE, + 'körül' : Date.MOD_ABOUT, + 'után' : Date.MOD_AFTER, + } + + quality_to_int = { + 'becsült' : Date.QUAL_ESTIMATED, + 'hozzávetőleg' : Date.QUAL_ESTIMATED, + 'becs.' : Date.QUAL_ESTIMATED, + 'számított' : Date.QUAL_CALCULATED, + 'körülbelül' : Date.QUAL_ESTIMATED, + 'számolt' : Date.QUAL_CALCULATED, + 'szám.' : Date.QUAL_CALCULATED, + } + + bce = ["időszámításunk előtt", "időszámítás előtt", "i. e.", + "Krisztus előtt", "Krisztus előtti", "Kr. e."] + DateParser.bce + + + calendar_to_int = { + 'Gergely' : Date.CAL_GREGORIAN, + 'Julián' : Date.CAL_JULIAN, + 'héber' : Date.CAL_HEBREW, + 'iszlám' : Date.CAL_ISLAMIC, + 'francia köztársasági' : Date.CAL_FRENCH, + 'perzsa' : Date.CAL_PERSIAN, + 'svéd' : Date.CAL_SWEDISH, + } + + + def init_strings(self): + # Compiles regular expression strings for matching dates + DateParser.init_strings(self) + + self._numeric = re.compile( + "((\d+)[/\.])?\s*((\d+)[/\.])?\s*(\d+)[/\. ]?$") + self._text2 = re.compile('((\d+)(/\d+)?\.)?\s+?%s\.?\s*(\d+\.)?\s*$' + % self._mon_str, re.IGNORECASE) + _span_1 = ['-tó\(ő\)l', '-tól', '-től'] + _span_2 = ['-ig'] + _range_1 = ['és'] + _range_2 = ['között'] + self._span = re.compile("(?P.+)(%s)\s+(?P.+)(%s)" % + ('|'.join(_span_1), '|'.join(_span_2)), + re.IGNORECASE) + self._range = re.compile("(?P.+)\s+(%s)\s+(?P.+)\s+(%s)" % + ('|'.join(_range_1), '|'.join(_range_2)), + re.IGNORECASE) + + + def _get_int(self, val): + """ + Convert the string to an integer if the value is not None. If the + value is None, a zero is returned + """ + if val is None: + return 0 + else: + return int(val.replace('.', '')) + +#------------------------------------------------------------------------- +# +# Hungarian display +# +#------------------------------------------------------------------------- +class DateDisplayHU(DateDisplay): + """ + Hungarian language date display class. + """ + + _bce_str = "i. e. %s" + + roman_months=( + "-.", "I.", "II.", "III.", "IV.", "V.", "VI.", + "VII.", "VIII.", "IX.", "X.", "XI.", "XII." + ) + + formats = ( + "ÉÉÉÉ-HH-NN (ISO)", # 0 + "Alapértelmezett éééé. hh. nn.", # 1 + "Év hónap nap", # year, full month name, day # 2 + "Év hó nap", #year, short month name, day # 3 + "Év római h.sz. nap" #year, Roman number, day # 4 + ) + # this definition must agree with its "_display_calendar" method + + display = DateDisplay.display_formatted + + def _display_calendar(self, date_val, long_months, short_months = None, + inflect=""): + # this must agree with its locale-specific "formats" definition + + year = self._slash_year(date_val[2], date_val[3]) + + if short_months is None: + # Let the short formats work the same as long formats + short_months = long_months + + if self.format == 0: + return self.display_iso(date_val) + + elif self.format == 1: + # Base defined Hungarian form + if date_val[3]: + return self.display_iso(date_val) + else: + if date_val[0]==0: #No day + if date_val[1]==0: #No month -> year + value="%s" % year + else: + value="%s. %02d." % (year, date_val[1]) #If no day -> year, month + else: + value="%s. %02d. %02d." % (year, date_val[1], date_val[0]) + + elif self.format == 2: + # year, full month name, day + + if date_val[0]==0: + if date_val[1]==0: + value="%s" % year + else: + value="%s. %s" % (year, self.long_months[date_val[1]]) #If no day -> year, month + else: + if date_val[1]==0: + value="%s. %s %02d." % (year, '-', date_val[0]) #To indicate somehow if the month is missing + else: + value="%s. %s %02d." % (year, self.long_months[date_val[1]], date_val[0]) + + + elif self.format == 3: + #year, short month name, day + + if date_val[0]==0: + if date_val[1]==0: + value="%s" % year + else: + value="%s. %s" % (year, self.short_months[date_val[1]]) #If no day -> year, month + else: + if date_val[1]==0: + value="%s. %s %02d." % (year, '-.', date_val[0]) #To indicate somehow if the month is missing + else: + value="%s. %s %02d." % (year, self.short_months[date_val[1]], date_val[0]) + + + elif self.format == 4: + #year, Roman number, day + + if date_val[0]==0: + if date_val[1]==0: + value="%s" % year + else: + value="%s. %s" % (year, self.roman_months[date_val[1]]) #If no day -> year, month + else: + value="%s. %s %02d." % (year, self.roman_months[date_val[1]], date_val[0]) + + + else: + # day month_name year + value = self.dd_dformat04(date_val, inflect, long_months) + + if date_val[2] < 0: + # TODO fix BUG 7064: non-Gregorian calendars wrongly use BCE notation for negative dates + return self._bce_str % value + else: + return value + +#------------------------------------------------------------------------- +# +# Register classes +# +#------------------------------------------------------------------------- +register_datehandler(('hu_HU', 'hu', 'hungarian', 'Hungarian', 'magyar'), + DateParserHU, DateDisplayHU)