HEX
Server: Apache
System: Linux vps.mmtprep.com 4.18.0-477.21.1.el8_8.x86_64 #1 SMP Thu Aug 10 13:51:50 EDT 2023 x86_64
User: mmtprep (1001)
PHP: 8.1.34
Disabled: exec,passthru,shell_exec,system
Upload Files
File: /home/mmtprep/public_html/mathzen.mmtprep.com/assets/sandboxCE-vjl3PIlj.js.map
{"version":3,"file":"sandboxCE-vjl3PIlj.js","sources":["../../src/exercices/ressources/sandboxCE.ts"],"sourcesContent":["import './styleSandbox.scss'\nimport { CLAVIER_LYCEE, raccourcisLycee } from '../../lib/interactif/claviers/lycee'\n\nimport { MathfieldElement, type Expression } from 'mathlive'\nimport { ComputeEngine, type BoxedExpression } from '@cortex-js/compute-engine'\n\nexport type FOrmatValue = 'litteral' | 'numerique' | 'fonction' | 'liste' | 'fraction'\n\ninterface ILitteralValues {\n  developper?: boolean,\n  simplifier?: boolean,\n  ordonner?: boolean,\n  deriver?: boolean,\n  compiler?: boolean\n}\n\ninterface IFractionValues {\n  irreductible: boolean,\n  forcerdecimalenrationnel: boolean,\n  fractionplussimple: boolean\n}\n\ninterface INumeriqueValues {\n  // puissance: boolean,\n  notation: string\n}\n\ninterface IListeValues {\n  ordonnee: boolean,\n  croissant: boolean,\n  eliminedoublons: boolean\n}\n\ninterface IFonctionValues {\n  deriver: boolean,\n  simplifier: boolean,\n}\n\nconst litteralOptionsValues = ['développer', 'simplifier', 'dériver', 'compiler']\nconst numeriqueOptionsValue: [string, string, string][] = [['notation', 'scientifique', 'ingénieure']]\nconst fractionOptionsValues = ['irréductible', 'forcer décimal en rationnel', 'fraction plus simple']\nconst listeOptionsValues = ['ordonnée', 'croissant', 'élimine doublons']\nconst fonctionOptionsValues = ['simplifier', 'dériver']\n\ninterface IOptionFormat {\n  litteral?: ILitteralValues,\n  fraction?: IFractionValues,\n  fonction?: IFonctionValues,\n  liste?: IListeValues,\n  numerique?: INumeriqueValues\n}\n\nconst ce = new ComputeEngine()\nce.latexOptions.decimalMarker = '{,}'\n// ce.latexOptions.avoidExponentsInRange = [-9, 9]\nce.latexOptions.exponentProduct = '\\\\times'\n// ce.latexOptions.fractionStyle = ()=>\"display-quotient\"\n\nconst gcd = function (a: number, b: number): number {\n  if (!Number.isInteger(a)) a = Math.round(a)\n  if (!Number.isInteger(b)) b = Math.round(b)\n  if (!b) {\n    return a\n  }\n  return gcd(b, a % b)\n}\n\n/*\nce.jsonSerializationOptions = {\n    metadata: [\"latex\"]\n}\n*/\nfunction cleanDivTexContent (parent: HTMLDivElement) {\n  for (const child of Array.from(parent.children)) {\n    if (child.children.length > 0 && child instanceof HTMLDivElement) cleanDivTexContent(child)\n    else {\n      if (child.textContent !== '') {\n        child.textContent = ''\n      }\n    }\n  }\n}\n\n/**\n * La fonction qui effectue les vérifications en aiguillant vers les bonnes procédures (beaucoup restent à implémenter)\n * @param saisie\n * @param reponse\n * @param saisieCanonical\n * @param reponseCanonical\n * @param isEqual\n * @param formatSelector\n * @param optionsFormatSaisie\n * @param optionsFormatReponse\n */\nfunction compare (saisie: string, reponse: string, {\n  saisieCanonical,\n  reponseCanonical,\n  isEqual,\n  formatSelector, optionsFormatSaisie, optionsFormatReponse\n}: {\n  saisieCanonical: boolean,\n  reponseCanonical: boolean,\n  isEqual: boolean,\n  formatSelector: FOrmatValue,\n  optionsFormatSaisie: IOptionFormat,\n  optionsFormatReponse: IOptionFormat\n}): boolean {\n  if (formatSelector === 'fraction') {\n    saisieCanonical = false\n    reponseCanonical = false\n  }\n  const feedback = document.querySelector<HTMLDivElement>('div#feedback')\n\n  let saisieCompilee: ((args: Record<string, unknown>) => unknown) | undefined\n  let reponseCompilee: ((args: Record<string, unknown>) => unknown) | undefined\n  let saisieFinaleLatex: string\n  let reponseFinaleLatex: string\n  let notationSaisie: string | undefined\n  let notationReponse: string | undefined\n  // On nettoie le div 'feedback' du message précédent\n  if (feedback != null) cleanDivTexContent(feedback)\n  // on récupère le contenu des champs Mathlive\n  // let numSaisie, denSaisie, numReponse, denReponse\n  let saisieParsed: BoxedExpression\n  let reponseParsed: BoxedExpression\n  let result: boolean\n  // On aiguille vers la bonne fonction de vérification qui va appliquer les options sélectionnées\n  switch (formatSelector) {\n    case 'litteral':\n      saisieParsed = ce.parse(saisie, { canonical: saisieCanonical })\n      reponseParsed = ce.parse(reponse, { canonical: reponseCanonical })\n      if (optionsFormatSaisie.litteral) {\n        if (optionsFormatSaisie.litteral.developper) {\n          saisieParsed = ce.box(['Expand', saisieParsed]).evaluate()\n        }\n        if (optionsFormatSaisie.litteral.simplifier) {\n          saisieParsed = saisieParsed.simplify()\n        }\n        // Pour l'instant l'option n'est pas encore disponible dans Compute-engine, donc elle est retiré en attendant des choix possibles.\n        if (optionsFormatSaisie.litteral.deriver) {\n          alert('Attention ! la dérivée n\\'est fonctionnelle que pour les polynômes.')\n          saisieParsed = ce.box(['D', saisieParsed, 'x']).evaluate()\n        }\n        if (optionsFormatSaisie.litteral.compiler) {\n          saisieCompilee = saisieParsed.compile()\n        }\n      }\n      saisieFinaleLatex = saisieParsed.latex\n      if (optionsFormatReponse.litteral) {\n        if (optionsFormatReponse.litteral.developper) { // @todo comprendre comment ça fonctionne\n          reponseParsed = ce.box(['Expand', reponseParsed]).evaluate()\n        }\n        if (optionsFormatReponse.litteral.simplifier) {\n          reponseParsed = reponseParsed.simplify()\n        }\n        if (optionsFormatReponse.litteral.deriver) { // @todo comprendre comment ça fonctionne\n          reponseParsed = ce.box(['Derivative', reponseParsed, 'x']).evaluate()\n        }\n        if (optionsFormatReponse.litteral.compiler) { // @todo comprendre comment ça fonctionne\n          reponseCompilee = reponseParsed.compile()\n        }\n      }\n      reponseFinaleLatex = reponseParsed.latex\n      break\n    case 'numerique':\n      notationSaisie = optionsFormatSaisie.numerique?.notation\n      if (notationSaisie) {\n        if (notationSaisie === 'scientifique') {\n          ce.latexOptions.notation = 'scientific'\n          ce.latexOptions.avoidExponentsInRange = [0, 0]\n        } else if (notationSaisie === 'ingénieure') {\n          ce.latexOptions.notation = 'engineering'\n          ce.latexOptions.avoidExponentsInRange = [0, 0]\n        } else {\n          ce.latexOptions.notation = 'auto'\n          ce.latexOptions.avoidExponentsInRange = [-9, 9]\n        }\n      }\n      saisieParsed = ce.parse(saisie, { canonical: saisieCanonical })\n      saisieFinaleLatex = saisieParsed.latex\n      notationReponse = optionsFormatReponse.numerique?.notation\n      if (notationReponse) {\n        if (notationReponse === 'scientifique') {\n          ce.latexOptions.notation = 'scientific'\n          ce.latexOptions.avoidExponentsInRange = [0, 0]\n        } else if (notationReponse === 'ingénieure') {\n          ce.latexOptions.notation = 'engineering'\n          ce.latexOptions.avoidExponentsInRange = [0, 0]\n        } else {\n          ce.latexOptions.notation = 'auto'\n          ce.latexOptions.avoidExponentsInRange = [-9, 9]\n        }\n      }\n      reponseParsed = ce.parse(reponse, { canonical: reponseCanonical })\n      reponseFinaleLatex = reponseParsed.latex\n      break\n    case 'liste':// @todo à implémenter\n    case 'fonction':// @todo à implémenter\n    case 'fraction':\n    default:\n      if (optionsFormatSaisie.fraction?.forcerdecimalenrationnel) {\n        ce.latexOptions.parseNumbers = 'rational'\n      }\n      reponseParsed = ce.parse(reponse, { canonical: false })\n      saisieParsed = ce.parse(saisie, { canonical: false })\n      if (optionsFormatSaisie.fraction?.forcerdecimalenrationnel) {\n        isEqual = true\n      } else {\n        isEqual = true\n        if (optionsFormatSaisie.fraction?.irreductible) {\n          reponseParsed = reponseParsed.canonical\n        }\n      }\n      saisieFinaleLatex = saisieParsed.latex\n      reponseFinaleLatex = reponseParsed.latex\n      break\n  }\n  if (formatSelector === 'fraction') {\n    if (optionsFormatSaisie.fraction?.fractionplussimple) {\n      const num1 = saisieParsed.op1.numericValue\n      const num2 = reponseParsed.op1.numericValue\n      if (num1 != null && num2 != null) {\n        result = saisieParsed.isEqual(reponseParsed)\n        result = result && num1 < num2\n      } else {\n        console.warn(`On a un problème avec l'un des deux numérateurs : numSaisie = ${num1} et numReponse = ${num2} `)\n        result = false\n      }\n    } else if (optionsFormatSaisie.fraction?.irreductible) {\n      const numSaisie = Number(saisieParsed.op1.numericValue)\n      const denSaisie = Number(saisieParsed.op2.numericValue)\n      const irreductible = gcd(numSaisie, denSaisie) === 1\n      result = irreductible && saisieParsed.isEqual(reponseParsed)\n    } else { // ni irreductible, ni plus simple,\n      result = saisieParsed.isEqual(reponseParsed)\n    }\n  } else {\n    result = isEqual ? saisieParsed.isEqual(reponseParsed) : saisieParsed.isSame(reponseParsed)\n  }\n  // On connait la réponse, on va maintenant rendre compte dans les différents éléments de feedback.\n  const resultatSaisie = document.querySelector('#resultatSaisie')\n  const resultatReponse = document.querySelector('#resultatReponse')\n  if (resultatSaisie && resultatReponse) {\n    resultatSaisie.textContent = `${saisieFinaleLatex}`\n    resultatReponse.textContent = `${reponseFinaleLatex}`\n  }\n\n  if (feedback != null) { // c'est pour pas que ts râle feedback est dans la page html.\n    const p1 = document.querySelector('div#conclusion')\n    if (p1) p1.appendChild(document.createTextNode(`Comparaison de la saisie élève [${saisieParsed.json}] soit ${saisieParsed.latex} et de la réponse [${reponseParsed.json}] soit ${reponseParsed.latex} en utilisant la méthode ${isEqual ? 'isEqual()' : 'isSame()'} avec le processus de traitement pour le format ${formatSelector} : ${String(result)}`))\n    if (saisieCompilee) {\n      const div1 = document.querySelector('div#saisieCompile')\n      if (div1) div1.appendChild(document.createTextNode(`saisie compilée : ${saisieCompilee}`))\n    }\n    if (reponseCompilee) {\n      const div2 = document.querySelector('div#reponseCompile')\n      if (div2) div2.appendChild(document.createTextNode(`réponse compilée : ${reponseCompilee}`))\n    }\n  }\n  // alert(`Résultat de la comparaison = ${result}`)\n  return result\n}\n\nexport const uuid = 'sandboxCE'\nexport const titre = 'Compute-engine sandbox'\n\nclass ComputeEngineSandbox {\n  typeExercice: string\n  numeroExercice!: number\n  sup!: string\n  titre: string\n  container: HTMLDivElement\n\n  constructor () {\n    this.typeExercice = 'html'\n    this.titre = 'Compute-engine sandbox'\n    this.container = document.createElement('div')\n    this.container.setAttribute('overflow', 'auto')\n    const mathVirtualKeyboard = window.mathVirtualKeyboard\n    this.container.id = 'sandbox'\n    this.container.innerHTML = `<table id=\"table1\">\n        <thead>\n        <tr>\n            <th colspan=\"3\">\n                <h2>Saisir deux expressions puis choisir le type de comparaison</h2>\n            </th>\n        </tr>\n        <tr>\n            <td>\n             <label>Type de comparaison :\n                    <select id=\"format\">\n                        <option>littéral</option>\n                        <option>numérique</option>\n                        <option>fraction</option>\n                        <option>liste</option>\n                        <option>fonction</option>\n                    </select>\n                </label>\n</td>\n<td>    </td>\n     <td>séparateur décimal\n     <form id=\"sep\">\n     <input type=\"radio\" name=\"sep\" value=\"virgule\" checked><label>virgule</label></input>\n     <input type=\"radio\" name=\"sep\" value=\"point\"><label>point</label></input>\n</form>\n</td>          \n        </tr>\n        </thead>\n        <tbody>\n        <tr>\n            <td><h3>Saisie élève</h3></td>\n            <td><h3>Réponse attendue</h3></td>\n            <td><h3>Résultat de la comparaison</h3></td>\n        </tr>\n        <tr>\n            <td id=\"saisie\"></td>\n            <td id=\"reponse\"></td>\n            <td id=\"resultat\">true</td>\n        </tr>\n        <tr>\n            <td id=\"optionsSaisie\"></td>\n            <td id=\"optionsReponse\"></td>\n        </tr>\n        <tr>\n            <th>Rendre canonique la saisie élève ?</th>\n            <th>Rendre canonique la réponse attendue ?</th>\n            <th>Utiliser isSame() ou isEqual() ?</th>\n        </tr>\n        <tr>\n            <th>\n                <form id='canonicalSaisie'>\n                    <label><input type='radio' name='canonicalSaisie' value='true' checked>True</label><br>\n                    <label><input type='radio' name='canonicalSaisie' value='false'>False</label>\n                </form>\n            </th>\n            <th>\n                <form id='canonicalReponse'>\n                    <label><input type='radio' name='canonicalReponse' value='true' checked>True</label><br>\n                    <label><input type='radio' name='canonicalReponse' value='false'>False</label>\n                </form>\n            </th>\n            <th>\n                <form id=\"isEqual\">\n                    <label><input type='radio' name='isEqual' value='true' checked>isEqual()</label><br>\n                    <label><input type='radio' name='isEqual' value='false'>isSame()</label>\n                </form>\n            </th>\n        </tr>\n        <tr>\n\n        </tr>\n        <tr>\n            <th colspan=\"2\">\n                résultat après traitement\n            </th>\n        </tr>\n        <tr>\n            <th id=\"resultatSaisie\">\n                &nbsp;\n            </th>\n            <th id=\"resultatReponse\">\n                &nbsp;\n            </th>\n        </tr>\n        </tbody>\n    </table>\n    <div id=\"feedback\" style=\"display: block\">\n        <div id=\"conclusion\"></div>\n        <div id=\"divCompile\" style=\"display: inline\">\n            <div id=\"saisieCompile\" style=\"display: inline\"></div>\n            &nbsp;&nbsp;\n            <div id=\"reponseCompile\" style=\"display: inline\"></div>\n        </div>\n    </div>\n`\n    const inputSep = this.container.querySelector<HTMLFormElement>('#sep')\n    const formSaisieCanonical = this.container.querySelector<HTMLFormElement>('#canonicalSaisie')\n    const formReponseCanonical = this.container.querySelector<HTMLFormElement>('#canonicalReponse')\n    const optionsSaisie = this.container.querySelector<HTMLTableCellElement>('#optionsSaisie')\n    const optionsReponse = this.container.querySelector<HTMLTableCellElement>('#optionsReponse')\n    const formIsEqual = this.container.querySelector<HTMLFormElement>('#isEqual')\n    const radioSaisieCanonical = formSaisieCanonical?.querySelectorAll('input')\n    const radioReponseCanonical = formReponseCanonical?.querySelectorAll('input')\n    const radioIsEqual = formIsEqual?.querySelectorAll('input')\n    const cellSaisie = this.container.querySelector<HTMLTableCellElement>('#saisie')\n    const cellReponse = this.container.querySelector<HTMLTableCellElement>('#reponse')\n    const cellResultat = this.container.querySelector<HTMLTableCellElement>('#resultat')\n    const formatSelector = this.container.querySelector<HTMLSelectElement>('#format')\n    // les options pour chaque format (à implémenter)\n\n    // initialisation des variables\n    let saisieCanonical = false\n    let reponseCanonical = false\n    let isEqual = false\n    let optionsFormatSaisie: IOptionFormat\n    let optionsFormatReponse: IOptionFormat\n\n    // MathfieldElement.fontsDirectory = '../assets/fonts'\n    // MathfieldElement.soundsDirectory = '../assets/sounds'\n    MathfieldElement.decimalSeparator = ','\n    mathVirtualKeyboard.layouts = CLAVIER_LYCEE\n\n    // On crée les deux inputs Mathlive et on active le clavier au focus (on le vire au focusout)\n    const saisie = new MathfieldElement()\n    const reponse = new MathfieldElement()\n    saisie.mathVirtualKeyboardPolicy = 'manual'\n    reponse.mathVirtualKeyboardPolicy = 'manual'\n    saisie.inlineShortcuts = raccourcisLycee\n    reponse.inlineShortcuts = raccourcisLycee\n    saisie.addEventListener('focusin', () => mathVirtualKeyboard.show())\n    reponse.addEventListener('focusin', () => mathVirtualKeyboard.show())\n    saisie.addEventListener('focusout', () => mathVirtualKeyboard.hide())\n    reponse.addEventListener('focusout', () => mathVirtualKeyboard.hide())\n\n    // Les deux formulaires pour les options de format\n    const formOptionsSaisie: HTMLFormElement = document.createElement('form')\n    const formOptionsReponse: HTMLFormElement = document.createElement('form')\n\n    /**\n     * Une fonction pour nettoyer les zones d'options\n     */\n    function cleanOptions () {\n      if (optionsSaisie && formOptionsSaisie) {\n        for (const child of Array.from(formOptionsSaisie.children)) {\n          formOptionsSaisie.removeChild(child)\n        }\n        for (const child of Array.from(optionsSaisie.children)) {\n          optionsSaisie.removeChild(child)\n        }\n      }\n      if (optionsReponse && formOptionsReponse) {\n        for (const child of Array.from(formOptionsReponse.children)) {\n          formOptionsReponse.removeChild(child)\n        }\n        for (const child of Array.from(optionsReponse.children)) {\n          optionsReponse.removeChild(child)\n        }\n      }\n    }\n\n    /**\n     * crée un label contenant un input de type checkbox pour le formulaire de même nom que le label\n     * @param label\n     * @param value\n     * @param checked\n     */\n    function addCheckbox (label: string, value: string, checked: boolean) {\n      const lab1 = document.createElement('label')\n      const textContent = document.createTextNode(label)\n      const input1 = document.createElement('input')\n      input1.addEventListener('change', () => updateResultat())\n      input1.type = 'checkbox'\n      input1.value = value\n      input1.checked = checked\n      input1.name = value\n      lab1.appendChild(input1)\n      lab1.appendChild(textContent)\n      return lab1\n    }\n\n    function addRadios (label: [string, string, string], checked: boolean) {\n      const lab1 = document.createElement('label')\n      const textContent = document.createTextNode(label[0] + ' : ')\n      const input1 = document.createElement('input')\n      input1.addEventListener('change', () => updateResultat())\n      input1.type = 'radio'\n      input1.value = label[1]\n      input1.checked = checked\n      input1.name = label[0]\n      const input2 = document.createElement('input')\n      input2.addEventListener('change', () => updateResultat())\n      input2.type = 'radio'\n      input2.value = label[2]\n      input2.checked = false\n      input2.name = label[0]\n      const text1 = document.createTextNode(label[1])\n      const text2 = document.createTextNode(label[2])\n      lab1.appendChild(textContent)\n      lab1.appendChild(input1)\n      lab1.appendChild(text1)\n      lab1.appendChild(input2)\n      lab1.appendChild(text2)\n      return lab1\n    }\n\n    /**\n     * Ajoute les différents label/inputs à chaque formulaire pour les options de format\n     * @param {boolean} onlySaisie si true, il n'y aura pas de cases à cocher sur la réponse\n     * @param {strings} labels les différentes options du format.\n     */\n    function renseigneOptions (onlySaisie: boolean, ...labels: string[] | [string, string, string][]) {\n      cleanOptions()\n      for (const label of labels) {\n        const element = Array.isArray(label) ? addRadios(label, false) : addCheckbox(label, label.replaceAll('é', 'e').replaceAll(/\\s/g, ''), false)\n        formOptionsSaisie.appendChild(element)\n        formOptionsSaisie.appendChild(document.createElement('br'))\n        if (!onlySaisie) {\n          formOptionsReponse.appendChild(Array.isArray(label) ? addRadios(label, false) : addCheckbox(label, label.replaceAll('é', 'e').replaceAll(/\\s/g, ''), false))\n          formOptionsReponse.appendChild(document.createElement('br'))\n        }\n      }\n    }\n\n    /**\n     * met à jour les options du format (appelé à chaque changement de format et à l'init avec la valeur 'littéral')\n     * @param format\n     */\n    function updateOptions (format: string) {\n      if (format) {\n        if (optionsSaisie && optionsReponse) {\n          switch (format) {\n            case 'littéral': // mise en place des checkboxes de configuration du format littéral\n              renseigneOptions(false, ...litteralOptionsValues)\n              break\n            case 'numérique':\n              renseigneOptions(false, ...numeriqueOptionsValue)\n              break\n            case 'fonction':\n              renseigneOptions(false, ...fonctionOptionsValues)\n              break\n            case 'liste':\n              renseigneOptions(false, ...listeOptionsValues)\n              break\n            case 'fraction':\n              renseigneOptions(true, ...fractionOptionsValues)\n              break\n            default:\n              cleanOptions()\n              throw Error(`Le sélecteur de format a rencontré une valeur imprévue : ${formatSelector?.value}`)\n          }\n          optionsSaisie.appendChild(formOptionsSaisie)\n          optionsReponse.appendChild(formOptionsReponse)\n        }\n      }\n    }\n\n    // Mise en place des listeners sur les différents éléments qui provoque un changement\n    if (formatSelector) { // sélecteur de format\n      formatSelector.addEventListener('change', () => {\n        if (formatSelector?.value === 'fraction') {\n          alert('En format \"fraction\", le test se fait toujours avec isEqual, et l\\'option canonical à false.\\nSi l\\'option \"forcer décimal en rationnel\" est active, les nombres décimaux sont convertis en fractions décimales.\\nLes options permettent d\\'affiner le test.')\n          if (formReponseCanonical) {\n            const inputs = Array.from(formReponseCanonical.querySelectorAll('input'))\n            if (inputs[1]) inputs[1].checked = true\n          }\n        }\n        updateOptions(formatSelector.value)\n      }\n      )\n    }\n\n    if (inputSep) {\n      const jsonChange = ({ from, to, json }: {from: string, to: string, json: Expression|string}) => {\n        if (Array.isArray(json)) {\n          for (const element of json) {\n            jsonChange({ from, to, json: element })\n          }\n        } else if (typeof json === 'string') {\n          json.replaceAll(from, to)\n        }\n      }\n      inputSep.addEventListener('change', () => {\n        const buttons = Array.from(inputSep.querySelectorAll('input'))\n        const saisieExp = saisie.expression\n        const reponseExp = reponse.expression\n        if (Array.isArray(buttons) && buttons.length > 0) {\n          const button = buttons.find((el) => el?.checked)\n          if (button) {\n            const separator = button.value\n            console.log(inputSep.value)\n            if (separator === 'virgule') {\n              MathfieldElement.decimalSeparator = ','\n              jsonChange({ from: '.', to: ',', json: saisieExp })\n              jsonChange({ from: '.', to: ',', json: reponseExp })\n              saisie.expression = saisieExp\n              reponse.expression = reponseExp\n            } else {\n              MathfieldElement.decimalSeparator = '.'\n              jsonChange({ from: ',', to: '.', json: saisieExp })\n              jsonChange({ from: ',', to: '.', json: reponseExp })\n              saisie.expression = saisieExp\n              reponse.expression = reponseExp\n            }\n          }\n        }\n      })\n    }\n\n    if (formSaisieCanonical) { // radios forme canonique saisie\n      formSaisieCanonical.addEventListener('change', () => {\n        if (formatSelector?.value === 'fraction') {\n          alert('En format \"fraction\", le test se fait avec isEqual, l\\'option canonical à false.\\nLes options permettent de configurer plus finement le test.\\nDe plus, si l\\'option \"forcer décimal en rationnel\" est active, les nombres décimaux sont convertis en fraction décimale avant le test.')\n          const inputs = Array.from(formSaisieCanonical.querySelectorAll('input'))\n          if (inputs[1]) inputs[1].checked = true\n          return\n        }\n        if (radioSaisieCanonical) saisieCanonical = Boolean(radioSaisieCanonical[0]?.checked)\n        updateResultat()\n      })\n    }\n    if (formReponseCanonical) { // radios forme canonique réponse\n      formReponseCanonical.addEventListener('change', () => {\n        if (formatSelector?.value === 'fraction') {\n          alert('En format \"fraction\", l\\'option canonical reste à false car sinon, cela provoque la réduction de la fraction.')\n          const inputs = Array.from(formReponseCanonical.querySelectorAll('input'))\n          if (inputs[1]) inputs[1].checked = true\n          return\n        }\n        if (radioReponseCanonical) reponseCanonical = Boolean(radioReponseCanonical[0]?.checked)\n        updateResultat()\n      })\n    }\n    if (formIsEqual) { // radios isEqual/isSame\n      formIsEqual.addEventListener('change', () => {\n        if (radioIsEqual && formatSelector && formatSelector.value === 'fraction') {\n          const optionsSaisie = document.querySelector('#optionsSaisie')\n          if (optionsSaisie) {\n            const formSaisie = optionsSaisie.firstChild as HTMLFormElement\n            const elements = formSaisie.elements\n            // const irreductible = (elements[0] as HTMLInputElement).checked\n            const accepterDecimal = (elements[1] as HTMLInputElement).checked\n            // const plusSimple = (elements[2] as HTMLInputElement).checked\n            if (accepterDecimal) { // On accepte une valeur décimale même si irreductible ou plusSimple sont cochés... c'est pour faire des tests.\n              // En théorie, si on veut une fraction irréductible, on ne tolérera pas les décimaux.\n              isEqual = true\n              if (radioIsEqual[0] && radioIsEqual[1]) {\n                radioIsEqual[0].checked = true\n                radioIsEqual[1].checked = false\n              }\n            } else {\n              isEqual = false\n              if (radioIsEqual[0] && radioIsEqual[1]) {\n                radioIsEqual[1].checked = true\n                radioIsEqual[0].checked = false\n              }\n            }\n          }\n        } else if (radioIsEqual) isEqual = Boolean(radioIsEqual[0]?.checked)\n        updateResultat()\n      })\n    }\n    if (saisie) { // champ de saisie Mathlive\n      saisie.addEventListener('change', () => {\n        updateResultat()\n      })\n    }\n    if (reponse) { // champ de réponse Mathlive\n      reponse.addEventListener('change', () => {\n        updateResultat()\n      })\n    }\n\n    /**\n     * La fonction qui met à jour le résultat de la comparaison...\n     */\n    function updateResultat () {\n      optionsFormatSaisie = {}\n      optionsFormatReponse = {}\n      let property: FOrmatValue\n      if (formatSelector) {\n        const format = formatSelector.value\n        if (['littéral', 'fraction', 'fonction', 'numérique', 'liste'].includes(format)) {\n          property = format.replaceAll('é', 'e').replaceAll(/\\s/g, '') as FOrmatValue\n          const propsSaisie = (Array.from(formOptionsSaisie.elements) as HTMLInputElement[]).filter(elt => elt.checked).map(elt => {\n            return elt.name === 'notation' ? [elt.name, elt.value] : [elt.name, true]\n          })\n          const propsReponse = (Array.from(formOptionsReponse.elements) as HTMLInputElement[]).filter(elt => elt.checked).map(elt => {\n            return elt.name === 'notation' ? [elt.name, elt.value] : [elt.name, true]\n          })\n          const objetSaisie = [property, Object.fromEntries(propsSaisie)]\n          const objetReponse = [property, Object.fromEntries(propsReponse)]\n          optionsFormatSaisie = Object.fromEntries([objetSaisie])\n          optionsFormatReponse = Object.fromEntries([objetReponse])\n          if (cellResultat) {\n            const resultat = compare(saisie.value, reponse.value, {\n              saisieCanonical,\n              reponseCanonical,\n              isEqual,\n              formatSelector: property,\n              optionsFormatSaisie,\n              optionsFormatReponse\n            })\n            cellResultat.innerText = String(resultat)\n          }\n        }\n      }\n    }\n\n    // Mise en place des inputMathlive dans la table\n    if (cellSaisie) cellSaisie.appendChild(saisie)\n    if (cellReponse) cellReponse.appendChild(reponse)\n\n    updateOptions('littéral') // à la mise en route, on est en format 'littéral'\n  }\n\n  get html () {\n    return this.container\n  }\n}\nexport default ComputeEngineSandbox\n\n// Les éléments à piloter\n\n// Les éléments à piloter\n"],"names":["litteralOptionsValues","numeriqueOptionsValue","fractionOptionsValues","listeOptionsValues","fonctionOptionsValues","ce","ComputeEngine","gcd","a","b","cleanDivTexContent","parent","child","compare","saisie","reponse","saisieCanonical","reponseCanonical","isEqual","formatSelector","optionsFormatSaisie","optionsFormatReponse","feedback","saisieCompilee","reponseCompilee","saisieFinaleLatex","reponseFinaleLatex","notationSaisie","notationReponse","saisieParsed","reponseParsed","result","_a","_b","_c","_d","_e","_f","num1","num2","_g","numSaisie","denSaisie","resultatSaisie","resultatReponse","p1","div1","div2","uuid","titre","ComputeEngineSandbox","__publicField","mathVirtualKeyboard","inputSep","formSaisieCanonical","formReponseCanonical","optionsSaisie","optionsReponse","formIsEqual","radioSaisieCanonical","radioReponseCanonical","radioIsEqual","cellSaisie","cellReponse","cellResultat","MathfieldElement","CLAVIER_LYCEE","raccourcisLycee","formOptionsSaisie","formOptionsReponse","cleanOptions","addCheckbox","label","value","checked","lab1","textContent","input1","updateResultat","addRadios","input2","text1","text2","renseigneOptions","onlySaisie","labels","element","updateOptions","format","inputs","jsonChange","from","to","json","buttons","saisieExp","reponseExp","button","el","separator","property","propsSaisie","elt","propsReponse","objetSaisie","objetReponse","resultat"],"mappings":"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"}