Source: config.js

/**
 * This file is part of Sesatheque.
 *   Copyright 2014-2015, Association Sésamath
 *
 * Sesatheque is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Affero General Public License version 3
 * as published by the Free Software Foundation.
 *
 * Sesatheque 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 Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License
 * along with Sesatheque (LICENCE.txt).
 * @see http://www.gnu.org/licenses/agpl.txt
 *
 *
 * Ce fichier fait partie de lapplication Sésathèque, créée par lassociation Sésamath.
 *
 * Sésathèque est un logiciel libre ; vous pouvez le redistribuer ou le modifier suivant
 * les termes de la GNU Affero General Public License version 3 telle que publiée par la
 * Free Software Foundation.
 * Sésathèque est distribué dans lespoir quil sera utile, mais SANS AUCUNE GARANTIE ;
 * sans même la garantie tacite de QUALITÉ MARCHANDE ou dADÉQUATION à UN BUT PARTICULIER.
 * Consultez la GNU Affero General Public License pour plus de détails.
 * Vous devez avoir reçu une copie de la GNU General Public License en même temps que Sésathèque
 * (cf LICENCE.txt et http://vvlibri.org/fr/Analyse/gnu-affero-general-public-license-v3-analyse
 * pour une explication en français)
 */
'use strict'

// attention, les niveaux sont à 3 endroits (pas top, on fera mieux la prochaine fois)
// ici, dans config.constantes.niveaux pour avoir des propriétés intelligibles
// à utiliser dans le code pour comparer les valeurs, et dans config.ordre
export const niveaux = {
  mtps: 'très petite section',
  mps: 'petite section',
  mms: 'moyenne section',
  mgs: 'grande section',
  11: 'CP',
  10: 'CE1',
  9: 'CE2',
  8: 'CM1',
  7: 'CM2',
  6: 'sixième',
  5: 'cinquième',
  4: 'quatrième',
  3: 'troisième',
  2: 'seconde',
  '2p': 'seconde pro',
  1: 'première',
  '1p': 'première pro',
  12: 'terminale',
  '12p': 'terminale pro',
  cap1: 'CAP 1re année',
  cap2: 'CAP 2e année',
  bep1: 'BEP 1re année',
  bep2: 'BEP 2e année'
}

export const constantes = {
  // reverse nomLisible => id pour rendre le code js plus lisible
  niveaux: {
    maternelleTps: 'mtps',
    maternellePs: 'mps',
    maternelleMs: 'mms',
    maternelleGs: 'mgs',
    cp: '11',
    ce1: '10',
    ce2: '9',
    cm1: '8',
    cm2: '7',
    '6e': '6',
    '5e': '5',
    '4e': '4',
    '3e': '3',
    '2de': '2',
    '2pro': '2p',
    '1re': '1',
    '1pro': '1p',
    tle: '12',
    tpro: '12p',
    cap1: 'cap1',
    cap2: 'cap2',
    bep1: 'bep1',
    bep2: 'bep2'
  },
  restriction: {
    aucune: 0,
    correction: 1,
    groupe: 2,
    prive: 3
  },
  routes: {
    api: '',
    display: 'voir',
    preview: 'apercevoir',
    create: 'ajouter',
    edit: 'modifier',
    describe: 'decrire',
    delete: 'supprimer',
    search: 'rechercher',
    history: 'voirHistorique'
  }
}

/**
 * Les options éditable / effaçable de chaque plugin
 * (utiliser isDeletable, isEditable & getLabel pour avoir les infos)
 * @private
 */
const options = {
  am: { deletable: false, editable: false, label: 'aide mathenpoche' },
  arbre: { deletable: true, editable: true, label: 'arbre' },
  ato: { deletable: false, editable: false, label: 'atome de manuel' },
  calkc: { deletable: true, editable: true, label: 'calculatrice cassée' },
  coll_doc: { deletable: false, editable: false, label: 'complément de manuel' },
  ec2: { deletable: false, editable: false, label: 'calcul@tice (flash)' },
  ecjs: { deletable: true, editable: true, label: 'calcul@tice' },
  em: { deletable: false, editable: false, label: 'exercice mathenpoche' },
  iep: { deletable: true, editable: true, label: 'instrumenpoche' },
  j3p: { deletable: true, editable: true, label: 'j3p' },
  lingot: { deletable: false, editable: false, label: 'tests diagnostiques Lingot' },
  mathgraph: { deletable: true, editable: true, label: 'mathgraph' },
  mental: { deletable: true, editable: true, label: 'calcul mental' },
  qcm: { deletable: true, editable: true, label: 'qcm' },
  serie: { deletable: true, editable: false, label: 'série' },
  tep: { deletable: false, editable: false, label: 'figure tracenpoche' },
  testd: { deletable: false, editable: false, label: 'tests diagnostiques IREM de Lorraine' },
  url: { deletable: true, editable: true, label: 'page externe' }
}
export const ordre = {
  niveaux: ['mtps', 'mps', 'mms', 'mgs', '11', '10', '9', '8', '7', '6', '5', '4', '3', 'cap1', 'cap2', 'bep1', 'bep2', '2', '2p', '1', '1p', '12', '12p']
}

/**
 * Retourne true si la ressource peut être effacée (l'originale,
 * un alias peut toujours être effacé par son proprio)
 * @param {string} type
 * @return {boolean}
 */
export function isDeletable (type) {
  if (!options[type]) throw Error(`Type ${type} inconnu`)
  return options[type].deletable
}

/**
 * Retourne true si la ressource peut être modifiée (i.e. un éditeur existe)
 * @param {string} type
 * @return {boolean}
 */
export function isEditable (type) {
  if (!options[type]) throw Error(`Type ${type} inconnu`)
  return options[type].editable
}
/**
 * Retourne le label pour ce type de ressource
 * @param {string} type
 * @return {string} un nom plus intelligible que le type am|em|…
 */
export function getLabel (type) {
  if (!options[type]) throw Error(`Type ${type} inconnu`)
  return options[type].label
}

/**
 * Retourne le code niveau probable d'après un nom de classe
 * @param {string} classe
 * @param {string} [forceDegre] passer primaire ou secondaire pour ne tester que ces niveaux (utile de forcer primaire pour éviter que du "tps" ne se retrouve en terminale)
 * @returns {string} Le code du niveau, undefined si on a rien deviné
 */
export function guessNiveau (classe, forceDegre) {
  function guessPrimaire () {
    // primaire
    if (/^cp/.test(classe)) return n.cp
    if (/^ce1/.test(classe)) return n.ce1
    if (/^ce2/.test(classe)) return n.ce2
    if (/^cm1/.test(classe)) return n.cm1
    if (/^cm2/.test(classe)) return n.cm2
    if (/^cours/.test(classe)) {
      if (/préparatoire/.test(classe)) return n.cp
      if (/élémentaire.1/.test(classe)) return n.ce1
      if (/élémentaire.2/.test(classe)) return n.ce2
      if (/moyen.1/.test(classe)) return n.cm1
      if (/moyen.2/.test(classe)) return n.cm2
    }
    // maternelle
    if (/section/.test(classe)) {
      // et si en plus de "section" on trouve ces patterns (avant ou après osef)
      if (/(?:très|tout).+petit/.test(classe)) return n.maternelleTps
      if (/petit/.test(classe)) return n.maternellePs
      if (/moyen/.test(classe)) return n.maternelleMs
      if (/grand/.test(classe)) return n.maternelleGs
    }
    // au cas où certains mettrait ces abbréviations
    if (/^tps/.test(classe)) return n.maternelleTps
    if (/^ps/.test(classe)) return n.maternellePs
    if (/^ms/.test(classe)) return n.maternelleMs
    if (/^gs/.test(classe)) return n.maternelleGs
  }

  function guessSecondaire () {
    // d'abord le collège, plus simple et plus fréquent
    if (/^6/.test(classe)) return n['6e']
    if (/^5/.test(classe)) return n['5e']
    if (/^4/.test(classe)) return n['4e']
    if (/^3/.test(classe)) return n['3e']
    // lycée
    if (/^2.*pro/.test(classe)) return n['2pro']
    if (/^2.*cap/.test(classe)) return n.cap2
    if (/^2.*bep/.test(classe)) return n.bep2
    if (/cap.*2/.test(classe)) return n.cap2
    if (/bep.*2/.test(classe)) return n.bep2
    if (/^2/.test(classe)) return n['2de']
    if (/^1.*cap/.test(classe)) return n.cap1
    if (/cap.*1/.test(classe)) return n.cap1
    if (/^1.*bep/.test(classe)) return n.bep1
    if (/bep.*1/.test(classe)) return n.bep1
    if (/^1/.test(classe)) return n['1re']
    if (/^t.*pro/.test(classe)) return n.tpro
    if (/^t/.test(classe)) return n.tle
  }
  var n = constantes.niveaux
  // on fait ça une fois pour tous les tests, pour s'éviter le /i partout
  classe = classe.toLowerCase()
  switch (forceDegre) {
    case 'primaire': return guessPrimaire()
    case 'secondaire': return guessSecondaire()
    default: return guessSecondaire() || guessPrimaire()
  }
}

export default {
  constantes,
  getLabel,
  guessNiveau,
  isDeletable,
  isEditable,
  niveaux
}