Index: gc_lang/fr/modules-js/gce_date_verif.js ================================================================== --- gc_lang/fr/modules-js/gce_date_verif.js +++ gc_lang/fr/modules-js/gce_date_verif.js @@ -14,10 +14,26 @@ ]); const _dDaysInMonth = new Map ([ [1, 31], [2, 28], [3, 31], [4, 30], [5, 31], [6, 30], [7, 31], [8, 31], [8, 31], [9, 30], [10, 31], [11, 30], [12, 31] ]); + +// Dans Python, datetime.weekday() envoie le résultat comme si nous étions dans un calendrier grégorien universal. +// https://fr.wikipedia.org/wiki/Passage_du_calendrier_julien_au_calendrier_gr%C3%A9gorien +// Selon Grégoire, le jeudi 4 octobre 1582 est immédiatement suivi par le vendredi 15 octobre. +// En France, la bascule eut lieu le 9 décembre 1582 qui fut suivi par le 20 décembre 1582. +// C’est la date retenue pour la bascule dans Grammalecte, mais le calendrier grégorien fut adopté dans le monde diversement. +// Il fallut des siècles pour qu’il soit adopté par l’Occident et une grande partie du reste du monde. +const _dGregorianToJulian = new Map ([ + ["lundi", "jeudi"], + ["mardi", "vendredi"], + ["mercredi", "samedi"], + ["jeudi", "dimanche"], + ["vendredi", "lundi"], + ["samedi", "mardi"], + ["dimanche", "mercredi"] +]); function _checkDate (nDay, nMonth, nYear) { // returns true or false if (nMonth > 12 || nMonth < 1 || nDay > 31 || nDay < 1) { return false; @@ -31,49 +47,60 @@ } return false; } function checkDate (sDay, sMonth, sYear) { - // to use if sMonth is a number - return _checkDate(parseInt(sDay, 10), parseInt(sMonth, 10), parseInt(sYear, 10)); -} - -function checkDateWithString (sDay, sMonth, sYear) { - // to use if sMonth is a noun - return _checkDate(parseInt(sDay, 10), _dMonth.get(sMonth.toLowerCase()), parseInt(sYear, 10)); -} - -function checkDay (sWeekday, sDay, sMonth, sYear) { - // to use if sMonth is a number - if (checkDate(sDay, sMonth, sYear)) { - let oDate = new Date(parseInt(sYear, 10), parseInt(sMonth, 10)-1, parseInt(sDay, 10)); - if (_lDay[oDate.getDay()] != sWeekday.toLowerCase()) { - return false; - } - return true; - } - return false; -} - -function checkDayWithString (sWeekday, sDay, sMonth, sYear) { - // to use if sMonth is a noun - if (checkDateWithString(sDay, sMonth, sYear)) { - let oDate = new Date(parseInt(sYear, 10), _dMonth.get(sMonth.toLowerCase())-1, parseInt(sDay, 10)); - if (_lDay[oDate.getDay()] != sWeekday.toLowerCase()) { - return false; - } - return true; - } - return false; -} - -function getDay (sDay, sMonth, sYear) { - // to use if sMonth is a number - let oDate = new Date(parseInt(sYear, 10), parseInt(sMonth, 10)-1, parseInt(sDay, 10)); - return _lDay[oDate.getDay()]; -} - -function getDayWithString (sDay, sMonth, sYear) { - // to use if sMonth is a noun - let oDate = new Date(parseInt(sYear, 10), _dMonth.get(sMonth.toLowerCase())-1, parseInt(sDay, 10)); - return _lDay[oDate.getDay()]; + // return True if the date is valid + if (!sMonth.gl_isDigit()) { + sMonth = _dMonth.get(sMonth.toLowerCase()); + } + if (_checkDate(parseInt(sDay, 10), parseInt(sMonth, 10), parseInt(sYear, 10))) { + return new Date(parseInt(sYear, 10), parseInt(sMonth, 10)-1, parseInt(sDay, 10)); + } + return false; +} + +function checkDay (sWeekday, sDay, sMonth, sYear) { + // return True if sWeekday is valid according to the given date + let xDate = checkDate(sDay, sMonth, sYear); + if (xDate && _getDay(xDate) != sWeekday.toLowerCase()) { + return false; + } + // if the date isn’t valid, any day is valid. + return true; +} + +function getDay (sDay, sMonth, sYear) { + // return the day of the date (in Gregorian calendar after 1582-12-20, in Julian calendar before 1582-12-09) + let xDate = checkDate(sDay, sMonth, sYear); + if (xDate) { + return _getDay(xDate); + } + return "" +} + +function _getDay (xDate) { + // return the day of the date (in Gregorian calendar after 1582-12-20, in Julian calendar before 1582-12-09) + if (xDate.getFullYear() > 1582) { + // Calendrier grégorien + return _lDay[xDate.getDay()]; + } + if (xDate.getFullYear() < 1582) { + // Calendrier julien + let sGregorianDay = _lDay[xDate.getDay()]; + return _dGregorianToJulian.get(sGregorianDay, "Erreur: jour inconnu") + } + // 1582 + if ((xDate.getMonth()+1) < 12 || xDate.getDate() <= 9) { + // Calendrier julien + let sGregorianDay = _lDay[xDate.getDay()]; + return _dGregorianToJulian.get(sGregorianDay, "Erreur: jour inconnu"); + } + else if (xDate.getDate() >= 20) { + // Calendrier grégorien + return _lDay[xDate.getDay()]; + } + else { + // 10 - 19 décembre 1582: jours inexistants en France. + return ""; + } } Index: gc_lang/fr/modules/gce_date_verif.py ================================================================== --- gc_lang/fr/modules/gce_date_verif.py +++ gc_lang/fr/modules/gce_date_verif.py @@ -1,54 +1,76 @@ #### GRAMMAR CHECKING ENGINE PLUGIN #### Check date validity -_lDay = ["lundi", "mardi", "mercredi", "jeudi", "vendredi", "samedi", "dimanche"] -_dMonth = { "janvier":1, "février":2, "mars":3, "avril":4, "mai":5, "juin":6, "juillet":7, "août":8, "aout":8, "septembre":9, "octobre":10, "novembre":11, "décembre":12 } - import datetime + +_lDay = ["lundi", "mardi", "mercredi", "jeudi", "vendredi", "samedi", "dimanche"] +_dMonth = { "janvier":1, "février":2, "mars":3, "avril":4, "mai":5, "juin":6, "juillet":7, "août":8, "aout":8, "septembre":9, "octobre":10, "novembre":11, "décembre":12 } + +# Dans Python, datetime.weekday() envoie le résultat comme si nous étions dans un calendrier grégorien universal. +# https://fr.wikipedia.org/wiki/Passage_du_calendrier_julien_au_calendrier_gr%C3%A9gorien +# Selon Grégoire, le jeudi 4 octobre 1582 est immédiatement suivi par le vendredi 15 octobre. +# En France, la bascule eut lieu le 9 décembre 1582 qui fut suivi par le 20 décembre 1582. +# C’est la date retenue pour la bascule dans Grammalecte, mais le calendrier grégorien fut adopté dans le monde diversement. +# Il fallut des siècles pour qu’il soit adopté par l’Occident et une grande partie du reste du monde. +_dGregorianToJulian = { + "lundi": "jeudi", + "mardi": "vendredi", + "mercredi": "samedi", + "jeudi": "dimanche", + "vendredi": "lundi", + "samedi": "mardi", + "dimanche": "mercredi" +} + def checkDate (sDay, sMonth, sYear): - "to use if is a number" + "return True if the date is valid" + if not sMonth.isdigit(): + sMonth = _dMonth.get(sMonth.lower(), "13") try: return datetime.date(int(sYear), int(sMonth), int(sDay)) except ValueError: return False except: return True -def checkDateWithString (sDay, sMonth, sYear): - "to use if is a noun" - try: - return datetime.date(int(sYear), _dMonth.get(sMonth.lower(), ""), int(sDay)) - except ValueError: - return False - except: - return True - - -def checkDay (sWeekday, sDay, sMonth, sYear): - "to use if is a number" - oDate = checkDate(sDay, sMonth, sYear) - if oDate and _lDay[oDate.weekday()] != sWeekday.lower(): - return False - return True - - -def checkDayWithString (sWeekday, sDay, sMonth, sYear): - "to use if is a noun" - oDate = checkDate(sDay, _dMonth.get(sMonth, ""), sYear) - if oDate and _lDay[oDate.weekday()] != sWeekday.lower(): - return False +def checkDay (sWeekday, sDay, sMonth, sYear): + "return True if sWeekday is valid according to the given date" + xDate = checkDate(sDay, sMonth, sYear) + if xDate and _getDay(xDate) != sWeekday.lower(): + return False + # if the date isn’t valid, any day is valid. return True def getDay (sDay, sMonth, sYear): - "to use if is a number" - return _lDay[datetime.date(int(sYear), int(sMonth), int(sDay)).weekday()] + "return the day of the date (in Gregorian calendar after 1582-12-20, in Julian calendar before 1582-12-09)" + xDate = checkDate(sDay, sMonth, sYear) + if xDate: + return _getDay(xDate) + return "" -def getDayWithString (sDay, sMonth, sYear): - "to use if is a noun" - return _lDay[datetime.date(int(sYear), _dMonth.get(sMonth.lower(), ""), int(sDay)).weekday()] +def _getDay (xDate): + "return the day of the date (in Gregorian calendar after 1582-12-20, in Julian calendar before 1582-12-09)" + if xDate.year > 1582: + # Calendrier grégorien + return _lDay[xDate.weekday()] + if xDate.year < 1582: + # Calendrier julien + sGregorianDay = _lDay[xDate.weekday()] + return _dGregorianToJulian.get(sGregorianDay, "Erreur: jour inconnu") + # 1582 + if xDate.month < 12 or xDate.day <= 9: + # Calendrier julien + sGregorianDay = _lDay[xDate.weekday()] + return _dGregorianToJulian.get(sGregorianDay, "Erreur: jour inconnu") + elif xDate.day >= 20: + # Calendrier grégorien + return _lDay[xDate.weekday()] + else: + # 10 - 19 décembre 1582: jours inexistants en France. + return "" Index: gc_lang/fr/rules.grx ================================================================== --- gc_lang/fr/rules.grx +++ gc_lang/fr/rules.grx @@ -3008,32 +3008,31 @@ [30|31] février <<- /date/ space_after(\1, 1, 1) ->> 28 février|29 février # Cette date est invalide. Il n’y a que 28 ou 29 jours en février. ~^\d\d?$ [janvier|février|mars|avril|mai|juin|juillet|aout|août|septembre|octobre|novembre|décembre] ~^\d{2,5}$ - <<- /date/ not checkDateWithString(\1, \2, \3) ->> _ # Cette date est invalide. + <<- /date/ not checkDate(\1, \2, \3) ->> _ # Cette date est invalide. TEST: le {{31 avril}} TEST: le {{30 février}} TEST: {{29 février 2011}} __date_journée_jour_mois_année__ ([lundi|mardi|mercredi|jeudi|vendredi|samedi|dimanche]) ?,¿ ?le¿ (~^\d\d?$) - (~^\d\d?$) - (~^\d{2,5}$) - <<- /date/ not after("^ +av(?:ant|) +J(?:C|ésus-Christ)") and not checkDay(\1, \2, \3, \4) - -1>> =getDay(\2, \3, \4) # Le jour de la date suivante est incorrect. - ([lundi|mardi|mercredi|jeudi|vendredi|samedi|dimanche]) ?,¿ ?le¿ (~^\d\d?$) ([janvier|février|mars|avril|mai|juin|juillet|aout|août|septembre|octobre|novembre|décembre]) (~^\d{2,5}$) - <<- /date/ not after("^ +av(?:ant|) +J(?:C|ésus-Christ)") and not checkDayWithString(\1, \2, \3, \4) - -1>> =getDayWithString(\2, \3, \4) # Le jour de la date suivante est incorrect. + <<- /date/ not after("^ +av(?:ant|) +J(?:C|ésus-Christ)") and not checkDay(\1, \2, \3, \4) + -1>> =getDay(\2, \3, \4) + # Le jour de la date suivante est incorrect (selon le calendrier grégorien).|https://fr.wikipedia.org/wiki/Passage_du_calendrier_julien_au_calendrier_gr%C3%A9gorien TEST: {{samedi}}, le 10-06-2014 ->> mardi TEST: {{mercredi}}, le 10 juin 2014 ->> mardi TEST: {{lundi}}, 18 août 1912 ->> dimanche TEST: {{jeudi}} 17 aout 1912 ->> samedi TEST: lundi, 18 août 1912 avant Jésus-Christ (date imaginaire) - +TEST: {{jeudi}}, 18 août 1563 : mort de La Boétie (calendrier julien) ->> mercredi +TEST: mercredi, 18 août 1563 : mort de La Boétie (calendrier julien) !! !! !!!! Traits d’union !!