gtoubiana/acte

View on GitHub
src/js/private/functions/tabGregorien.js

Summary

Maintainability
C
1 day
Test Coverage
/**
 * Pour convertir la saisie grégorienne ou julienne en Objet Jour.
 * @access private
 * @author Gilles Toubiana
 * @since 0.0.1
 * @license MIT
 * @see {@link https://github.com/gtoubiana/acte|Projet sur GitHub}
 * @param {String} saisie - Saisie d'une date
 * @param {Boolean} limites - Par défaut, les résultats sont limités
 * aux périodes d'utilisation des calendriers. Seule la valeur `false`
 * permet de désactiver ces limites.
 * @return {Array} Les dates républicaines, grégoriennes et juliennes
 * @example
 * tabGregorien(saisie, this.limites);
 */
const tabGregorien = (saisie, limites) => {
  // Uniformisation de la saisie
  const iesaisie = saisie[0] === '/' ? `1${saisie}` : saisie;
  let saisieGregorien = iesaisie.replace(/\W?an\s-?([-MDCLXVI]+)\W?/gi,

    // jscs:disable
    (x, p1) => {
      const rva = romainVersArabe(p1);

      return x.match(/-/) ? ` -${rva}` : ` ${rva}`;
    });

  // jscs:enable
  const tab = [];

  saisieGregorien = saisieValide(saisieGregorien, regexpGregorien);

  if (saisieGregorien[2] <= dateDebutGregorien[2]) {
    joursDansLeMois[1] = julienBissextile(saisieGregorien[2]) ? '29' : '28';
  } else {
    joursDansLeMois[1] = gregorienBissextile(saisieGregorien[2]) ?
      '29' : '28';
  }

  // Lorsque la date est valide [gjmc,gmc,gac]
  if (saisieGregorien[2] && saisieGregorien[0] < 32 &&
    absInt(saisieGregorien[0]) !== 0 &&
    saisieGregorien[1] < 13 && saisieGregorien[1] > 0 &&
    saisieGregorien[1] !== '' && absInt(saisieGregorien[1]) !== 0 &&
    (saisieGregorien[0] <= joursDansLeMois[saisieGregorien[1] - 1])) {
    tab[4] = gregorienVersJj(parseInt(saisieGregorien[2], 10), absInt(
      saisieGregorien[1]), absInt(saisieGregorien[0]));

    // Si limitation et avant début du calendrier grégorien
    if ((limites) && (tab[4] < gregorienVersJj(
        dateDebutGregorien[2], dateDebutGregorien[1], dateDebutGregorien[
          0]))) {
      tab[5] = absInt(saisieGregorien[0]);
      tab[6] = absInt(saisieGregorien[1]);
      tab[7] = parseInt(saisieGregorien[2], 10);
      tab[8] = dateValide(tab[5], tab[6], tab[7]);

      // Si limitation et après la fin du calendrier julien
      if (tab[8] > dateValide(dateFinJulien[0], dateFinJulien[1],
          dateFinJulien[2])) {
        /* istanbul ignore if */
        if (tab[5] + retardJulien > joursDansLeMois[tab[6] - 1]) {
          tab[0] = (tab[5] + retardJulien) - joursDansLeMois[tab[6] - 1];
          tab[1] = tab[6] + 1;
        } else {
          tab[0] = tab[5] + retardJulien;
          tab[1] = tab[6];
        }
        tab[2] = tab[7];
        tab[3] = dateValide(tab[0], tab[1], tab[2]);
      }

      // Résultats gregorien/julien standards et/ou débridés
    } else {
      tab[0] = absInt(saisieGregorien[0]);
      tab[1] = absInt(saisieGregorien[1]);
      tab[2] = parseInt(saisieGregorien[2], 10);
      tab[3] = dateValide(tab[0], tab[1], tab[2]);

      // Si débridé
      if (!limites) {
        const dateJulienne = jjVersJulien(tab[4]);

        tab[5] = dateJulienne[2];
        tab[6] = dateJulienne[1];
        tab[7] = dateJulienne[0];
        tab[8] = dateValide(tab[5], tab[6], tab[7]);
      }
    }

    // Limitations republicain
    if (((tab[4] >= jjDebutRepublicain) &&
        (tab[4] <= jjFinRepublicain)) ||
      ((tab[4] >= jjDebutCommuneDeParis) &&
        (tab[4] <= jjFinCommuneDeParis)) ||
      !limites) {
      const dateRepublicaine = jjVersRepublicain(tab[4]);

      tab[9] = dateRepublicaine[3];
      tab[10] = dateRepublicaine[2];
      tab[11] = ((dateRepublicaine[2] - 1) * 10) + dateRepublicaine[3];
      tab[12] = dateRepublicaine[1];
      tab[13] = dateRepublicaine[0];
    }
  }

  return tab;
};