SesaParcours

SesaParcours est l’évolution de modulaire de j3p (au sens module javascript, appelé aussi es module ou esm, avec import/export, ≠ de commonJs ou cjs qui sont des modules à base de require/module.exports).

Remarque jQuery : On reste en 2.x car mathquill passe pas en 3.x, pb notamment avec $().andSelf()

Prérequis

Installer NodeJs et git

Dans toute la doc on utilise pnpm à la place de npm (plus économe en espace disque mais surtout beaucoup plus rapide), mais vous pouvez retirer le "p" pour revenir au npm classique (installé d’office avec nodeJs).

Pour installer pnpm c'est npm install -g pnpm (suivant votre config il faudra peut-être lancer cette commande en admin)

Installation

La première fois

  • Récupération du dépôt : git clone git@forge.apps.education.fr:sesamath/sesaparcours.git (ATTENTION à bien prendre cette commande en cliquant sur le bouton cloner sur gitlab, et pas l’url en https, sinon vous devrez saisir login/pass à chaque push)
  • installation des dépendances pnpm i

Ensuite, pour mettre à jour le dépôt git pull, et si le package.json a changé faut refaire un pnpm i (dans le doute vous pouvez le faire à chaque fois, c'est très rapide si rien n’a changé).

Utilisation

Pour tester le code en local, lancer pnpm start puis aller consulter http://localhost:8081/, qui propose la même chose que l’ancien j3p.html avec le test de

  • une section avec son paramétrage par défaut http://localhost:8081/#section=cm2exN4_22 pour sections/primaire/cahiercm2/sectioncm2exN4_22.js
  • un rid, par ex http://localhost:8081/#rid=sesabibli/32476, les baseId possibles sont sesabibli ou sesacommun ou sesabiblidev ou sesacommundev
  • un graphe passé dans l’url http://localhost:8081/#graphe=[[1,%22751%22,[{%22pe%22:%22sans%20condition%22,%22nn%22:%22fin%22,%22conclusion%22:%22fin%22}]],[2,%22fin%22,[]]]

Par exemple, pour reproduire localement ce que l’on a sur https://bibliotheque.sesamath.(dev|net)/public/voir/xxx :

  • lancer pnpm start
  • indiquer xxx en ressource (préciser l’origine si c'est pas sesabibli) et valider pour aller sur http://localhost:8081/#rid=sesabibli/xxx

Vous pouvez aussi faire un pnpm run build:mod puis aller tester docroot/index.html, par ex depuis webstorm (faire un run sur ce html). Le build:mod ne build que la version module, inutile de compiler la version es5 pour du test en local.

Développement

Le code est dans un dépôt git, cf https://wiki.sesamath.net/doku.php?id=public:dev:git:scenarios#cas_courantresolution_d_un_bug_ou_ajout_de_fonctionnalite_avec_framagit_gitlab_github pour la marche à suivre (et package.json pour l'adresse du dépôt).

Modifications de code, workflow git à suivre

Cf wiki

consulter la doc

Elle est sur https://j3p.sesamath.net/doc/ ou https://j3p.sesamath.net/tsdoc/ pour la partie concernant le moteur v2 en typescript (pas encore pu fusionner les deux)

Pour la générer c'est pnpm run doc, et vous pouvez ensuite la consulter localement (après un pnpm start) sur http://localhost:8081/doc/index.html ou http://localhost:8081/tsdoc/index.html

Tester avec une autre ip pour que ce soit accessible avec un autre terminal (tablette ou téléphone par ex)

Vous devez retrouver votre ip sur le réseau local, souvent de la forme 192.168.1.x (pour les box courantes des FAI), et ensuite lancer HOST=192.168.1.x pnpm start, ça vous permettra de tester depuis une tablette connectée sur le même wifi que votre PC avec du http://192.168.1.x/#section=… ou http://192.168.1.x/#rid=…

Vous pouvez également utuiliser la variable d’environnement PORT=xxx pour mettre un autre port que le 8081

Problèmes connus

On se retrouve parfois avec une erreur Failed to fetch dynamically imported module:… assez incompréhensible (le module existe bien, et ça fonctionnait 2 min plus tôt), stopper vite, vider node_modules/.vite et relancer vite règle le pb…

dev/mappemonde/buildMappemonde.js

Description:
  • Ce code js est chargé directement par buildMappemonde.html pour construire la figure mathgraph32 de la mappemonde Il sert à générer le code base64 en utilisant l’api, ce code étant ensuite copié/collé dans la section (nettement plus rapide à charger) Ouvrir mappemonde.html (à travers un serveur web, par ex dans webstorm avec un clic droit dessus puis run) et attendre 1~2min pour avoir le résultat

Source:

Ce code js est chargé directement par buildMappemonde.html pour construire la figure mathgraph32 de la mappemonde Il sert à générer le code base64 en utilisant l’api, ce code étant ensuite copié/collé dans la section (nettement plus rapide à charger) Ouvrir mappemonde.html (à travers un serveur web, par ex dans webstorm avec un clic droit dessus puis run) et attendre 1~2min pour avoir le résultat

legacy/core/jqueryTextWidth.js

Description:
  • Ajoute la méthode textWidth à toutes les instances jQuery $(selector)

Source:

Ajoute la méthode textWidth à toutes les instances jQuery $(selector)

legacy/outils/geometrie/Repere.js

Description:
  • Petit moteur de géométrie dynamique

Source:
Since:
  • Novembre 2012 Exemple de syntaxe d’appel ``` var repere = new Repere({ idConteneur: this.zones.MG, idDivRepere: 'unrepere', aimantage: false, visible: true, larg: 500, haut: 500, pasdunegraduationX: 1, pixelspargraduationX: 30, pasdunegraduationY: 1, pixelspargraduationY: 30, xO: 250, yO: 250, debuty: 0, negatifs: true, objets: [{ type: 'point', nom: 'A', par1: 6, par2: 4, fixe: false, visible: true, etiquette: true, style: {couleur: '#00F', epaisseur: 2, taille: 18} }, { type: 'point', nom: 'B', par1: 4, par2: -3, fixe: false, visible: true, etiquette: true, style: {couleur: '#00F', epaisseur: 2, taille: 18} }, { type: 'point', nom: 'C', par1: -3, par2: -6, fixe: false, visible: true, etiquette: true, style: {couleur: '#0F0', epaisseur: 2, taille: 18} }, {type: 'segment', nom: 's', par1: 'A', par2: 'B', style: {couleur: '#456', epaisseur: 2}}, {type: 'cercle', nom: 'ce', par1: 'A', par2: 'B', style: {couleur: '#456', epaisseur: 2}}, {type: 'droite', nom: 'd1', par1: 'A', par2: 'C', style: {couleur: '#382', epaisseur: 2}}, {type: 'droiteparallele', nom: 'd2', par1: 'B', par2: 'd1', style: {couleur: '#538', epaisseur: 2}}, {type: 'droiteperpendiculaire', nom: 'd3', par1: 'B', par2: 'd1', style: {couleur: '#F00', epaisseur: 2}}, { type: 'point', nom: 'D', par1: -1, par2: 5, fixe: false, visible: true, etiquette: true, style: {couleur: '#000', epaisseur: 2, taille: 18} }, { type: 'point', nom: 'E', par1: -2, par2: 3, fixe: false, visible: true, etiquette: true, style: {couleur: '#000', epaisseur: 2, taille: 18} }, {type: 'droite', nom: 'd4', par1: 'D', par2: 'E', style: {couleur: '#FA5', epaisseur: 2}}, { type: 'pointintersection', nom: 'T', par1: 'd4', par2: 'd3', visible: true, etiquette: true, style: {couleur: '#0F0', epaisseur: 2, taille: 18} }, { type: 'pointintersection', nom: 'S', par1: 'd4', par2: 'd2', visible: true, etiquette: true, style: {couleur: '#0F0', epaisseur: 2, taille: 18} }, {type: 'droite', nom: 'd5', par1: 'T', par2: 'A', style: {couleur: '#FA5', epaisseur: 2}}, {type: 'courbe', nom: 'c1', par1: '0.3*x^2-2', par2: -5, par3: 5, par4: 30, style: {couleur: '#FA5', epaisseur: 2}}, { type: 'courbe_tabvaleur', nom: 'c1', tab_val: [[0, 1], [0.1, 1.2], [0.2, 1.5]], style: {couleur: '#FA5', epaisseur: 2} }] }) repere.construit() ```
Author:
  • JP Vanroyen

Petit moteur de géométrie dynamique

legacy/outils/tableauSignesVariations/index.js

loader.js

Description:
  • Ce fichier est le seul qui devrait être appelé en cross-domain, il est es5 et doit être chargé par un tag script (de type module ou pas, async ou pas).

    Il en global toutes nos fonctions de chargement, mais sans rien charger de plus au départ

    • j3pLoad (player v1)
    • editGraphe (éditeur v1)
    • showParcours (afficheur de parcours v1)
    • spEdit (éditeur v2)
    • spPlay (player v2)
    • spView (afficheur de parcours v2)
    • start (interface de la home)

    L’appel d’une de ces fonctions globales va déclencher le chargement de son code js, cf chargement

    ATTENTION, ce fichier doit rester en ES5 et ne pas avoir d’import statique ni dynamique, il est appelé dans un tag script, ordinaire ou de type module (les deux sont possibles pour compatibilité ascendante).

    Il n’est pas traité par vite mais copié dans build après chaque build de vite, pour gérer les chargements depuis un autre domaine (cf scripts/fixLoader.js).

    1. loader.js

      • déclare nos fonctions en global (pour mémoriser d’éventuels appels et les refaire quand lazyLoader sera chargé)
      • ajoute un
    2. lazyLoader remplace les fonctions globales précédentes par une fct qui prend les arguments, charge le js de la fct puis l’appelle.

    On aurait pu mettre tout le code de lazyLoader dans ce fichier, mais ce loader était destiné à orienter entre deux lazyLoader, une version moderne et une version legacy (on verra pour le remettre quand il n'y aura plus de code v1 pour voir si le build passe avec le plugin legacy de vite). Et par ailleurs c'est plus confortable d'avoir lazyLoader en ts

Source:

Ce fichier est le seul qui devrait être appelé en cross-domain, il est es5 et doit être chargé par un tag script (de type module ou pas, async ou pas).

Il en global toutes nos fonctions de chargement, mais sans rien charger de plus au départ

  • j3pLoad (player v1)
  • editGraphe (éditeur v1)
  • showParcours (afficheur de parcours v1)
  • spEdit (éditeur v2)
  • spPlay (player v2)
  • spView (afficheur de parcours v2)
  • start (interface de la home)

L’appel d’une de ces fonctions globales va déclencher le chargement de son code js, cf chargement

ATTENTION, ce fichier doit rester en ES5 et ne pas avoir d’import statique ni dynamique, il est appelé dans un tag script, ordinaire ou de type module (les deux sont possibles pour compatibilité ascendante).

Il n’est pas traité par vite mais copié dans build après chaque build de vite, pour gérer les chargements depuis un autre domaine (cf scripts/fixLoader.js).

  1. loader.js

    • déclare nos fonctions en global (pour mémoriser d’éventuels appels et les refaire quand lazyLoader sera chargé)
    • ajoute un
  2. lazyLoader remplace les fonctions globales précédentes par une fct qui prend les arguments, charge le js de la fct puis l’appelle.

On aurait pu mettre tout le code de lazyLoader dans ce fichier, mais ce loader était destiné à orienter entre deux lazyLoader, une version moderne et une version legacy (on verra pour le remettre quand il n'y aura plus de code v1 pour voir si le build passe avec le plugin legacy de vite). Et par ailleurs c'est plus confortable d'avoir lazyLoader en ts