<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Module 2: Introduction au langage Java on INF 1220 - Introduction à la programmation</title><link>https://lemire.github.io/inf1220-nexam/docs/modules/module2/</link><description>Recent content in Module 2: Introduction au langage Java on INF 1220 - Introduction à la programmation</description><generator>Hugo</generator><language>fr</language><atom:link href="https://lemire.github.io/inf1220-nexam/docs/modules/module2/index.xml" rel="self" type="application/rss+xml"/><item><title>Préparation de l’espace de travail</title><link>https://lemire.github.io/inf1220-nexam/docs/modules/module2/preparation/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://lemire.github.io/inf1220-nexam/docs/modules/module2/preparation/</guid><description>&lt;h1 id="préparation-de-lespace-de-travail"&gt;&#10; Préparation de l&amp;rsquo;espace de travail&#10; &lt;a class="anchor" href="#pr%c3%a9paration-de-lespace-de-travail"&gt;#&lt;/a&gt;&#10;&lt;/h1&gt;&#10;&lt;p&gt;Comme langage de support à l&amp;rsquo;introduction des concepts de programmation, nous utiliserons le langage Java. Tel que présenté dans l&amp;rsquo;introduction du cours, le langage Java est un langage interprété multi-plateforme où le code est pré-compilé dans un ensemble d&amp;rsquo;instructions intermédiaires (appelé Java bytecode), puis interprété sur chaque système d&amp;rsquo;exploitation à partir de la machine virtuelle Java. Celle-ci transforme alors le bytecode en instructions machine propre au système d&amp;rsquo;exploitation et aux processeurs spécifiques de l&amp;rsquo;ordinateur.&lt;/p&gt;</description></item><item><title>Java pas à pas</title><link>https://lemire.github.io/inf1220-nexam/docs/modules/module2/pasapas/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://lemire.github.io/inf1220-nexam/docs/modules/module2/pasapas/</guid><description>&lt;h1 id="java-pas-à-pas"&gt;&#10; Java pas à pas&#10; &lt;a class="anchor" href="#java-pas-%c3%a0-pas"&gt;#&lt;/a&gt;&#10;&lt;/h1&gt;&#10;&lt;p&gt;Nous vous invitons maintenant à lire les chapitres suivants du manuel Java pas à pas par Robert Godin et Daniel Lemire.&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Chapitre 2. Introduction à la programmation Java&lt;/li&gt;&#10;&lt;li&gt;Chapitre 4. Types et expressions Java&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;Les chapitres comprennent plusieurs exemples et exercices. Vous devez compléter les exercices du manuel.&lt;/p&gt;&#10;&lt;p&gt;Après votre lecture, répondez aux questions suivantes.&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;Chapitre 2. Introduction à la programmation Java&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Quelles sont les principales étapes de la création et de l&amp;rsquo;exécution d’un programme Java, et pourquoi la méthode main() est-elle essentielle dans ce processus ?&lt;/li&gt;&#10;&lt;li&gt;Expliquez la différence entre une déclaration de variable et une initialisation de variable à la déclaration dans une méthode Java. Donnez un exemple concret pour illustrer votre réponse.&lt;/li&gt;&#10;&lt;li&gt;Comment la classe Scanner est-elle utilisée pour lire des données saisies par l’utilisateur, et quelles précautions doivent être prises lors de son importation et de son utilisation ?&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;Chapitre 4. Types et expressions Java&lt;/p&gt;</description></item><item><title>Création d'une classe en Java</title><link>https://lemire.github.io/inf1220-nexam/docs/modules/module2/oriente/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://lemire.github.io/inf1220-nexam/docs/modules/module2/oriente/</guid><description>&lt;h1 id="création-dune-classe-en-java"&gt;&#10; Création d&amp;rsquo;une classe en Java&#10; &lt;a class="anchor" href="#cr%c3%a9ation-dune-classe-en-java"&gt;#&lt;/a&gt;&#10;&lt;/h1&gt;&#10;&lt;p&gt;Créer une classe en Java, c’est définir un nouveau type d’objet qui regroupe à la fois des données (appelées attributs ou champs) et des comportements (appelés méthodes). Cette approche permet de modéliser des entités du monde réel ou conceptuel de façon structurée et réutilisable. Une classe sert de « plan » pour fabriquer des objets : chaque objet créé à partir d’une classe possède ses propres valeurs pour les attributs, mais partage les mêmes méthodes. La programmation orientée objet favorise ainsi la modularité, la clarté et la maintenance du code, car chaque classe peut être développée, testée et améliorée indépendamment des autres.&lt;/p&gt;</description></item><item><title>Introduction aux types de base et à leurs opérateurs</title><link>https://lemire.github.io/inf1220-nexam/docs/modules/module2/typeoperateur/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://lemire.github.io/inf1220-nexam/docs/modules/module2/typeoperateur/</guid><description>&lt;h1 id="introduction-aux-types-de-base-et-à-leurs-opérateurs"&gt;&#10; Introduction aux types de base et à leurs opérateurs&#10; &lt;a class="anchor" href="#introduction-aux-types-de-base-et-%c3%a0-leurs-op%c3%a9rateurs"&gt;#&lt;/a&gt;&#10;&lt;/h1&gt;&#10;&lt;h2 id="mise-en-garde-pédagogique"&gt;&#10; Mise en garde pédagogique&#10; &lt;a class="anchor" href="#mise-en-garde-p%c3%a9dagogique"&gt;#&lt;/a&gt;&#10;&lt;/h2&gt;&#10;&lt;p&gt;Si on prend un cours de Mandarin, on ne s'attend pas à comprendre tout le Mandarin lu ou écouté du premier coup ou même du deuxième. Il en va de même lorsqu'on étudie un langage de programmation, surtout s'il s'agit du premier langage de programmation appris. La première fois, la seconde fois, ou même la troisième fois que vous verrez un bout de code, il est parfaitement normal de ne pas le comprendre entièrement. C'est d'autant plus vrai que le langage Java a une syntaxe plutôt lourde avec beaucoup de mots réservés à la signification abstraite. Vous verrez beaucoup de mots comme "class", "public", "static", "void" dans ce cours. Si ça vous semble être du jargon, c'est parce que c'est exactement ce dont il s'agit. Monter un programme en Java n'est pas chose aisée, il faut comprendre que les "classes" vont dans des fichiers avec un nom correspondant à la classe, il faut comprendre que seule la méthode "public static void main(String[])" est exécutable, etc., etc. Il est impossible d'absorber tout ça en un jour, en une semaine ou même en quelques courtes semaines. Ça prend du temps avant de s'y retrouver.&lt;/p&gt;</description></item><item><title>Exercices sur les classes, les variables, les types et les opérateurs</title><link>https://lemire.github.io/inf1220-nexam/docs/modules/module2/exercices-2-1/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://lemire.github.io/inf1220-nexam/docs/modules/module2/exercices-2-1/</guid><description>&lt;h1 id="exercices-sur-les-classes-les-variables-les-types-et-les-opérateurs"&gt;&#10; Exercices sur les classes, les variables, les types et les opérateurs&#10; &lt;a class="anchor" href="#exercices-sur-les-classes-les-variables-les-types-et-les-op%c3%a9rateurs"&gt;#&lt;/a&gt;&#10;&lt;/h1&gt;&#10;&lt;p&gt;Prenez en note chaque question. Tentez par vos propres moyens, mais avec l&amp;rsquo;aide de tout le matériel et de l&amp;rsquo;Internet, de résoudre le problème. Prévoyez jusqu&amp;rsquo;à 15 minutes de travail par question. Après avoir bien travaillé la question, consultez la réponse.&lt;/p&gt;&#10;&lt;blockquote class="book-hint info"&gt;&#10;&lt;p&gt;N&amp;rsquo;oubliez pas d&amp;rsquo;utiliser notre &lt;a href="https://lemire.github.io/inf1220-nexam/docs/pensebete/"&gt;pense-bête Java&lt;/a&gt; au besoin. Pour les mathématiques,&#10;vous pouvez faire référence à notre rappel sur &lt;a href="https://lemire.github.io/inf1220-nexam/docs/extra/math/"&gt;les principales notions mathématiques&lt;/a&gt; du cours.&lt;/p&gt;</description></item><item><title>Méthodes et constructeurs</title><link>https://lemire.github.io/inf1220-nexam/docs/modules/module2/methodes/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://lemire.github.io/inf1220-nexam/docs/modules/module2/methodes/</guid><description>&lt;h1 id="la-conception-de-méthodesfonctions-et-leur-appel"&gt;&#10; La conception de méthodes/fonctions et leur appel&#10; &lt;a class="anchor" href="#la-conception-de-m%c3%a9thodesfonctions-et-leur-appel"&gt;#&lt;/a&gt;&#10;&lt;/h1&gt;&#10;&lt;p&gt;La conception de méthodes (ou fonctions) est un pilier de la programmation structurée et orientée objet. Une méthode permet d’isoler une opération ou un calcul précis, de lui donner un nom, et de la réutiliser à volonté dans différents contextes du programme. Cela favorise la clarté, la maintenance et la réutilisabilité du code. Lorsqu’on appelle une méthode, on peut lui transmettre des informations (paramètres) et récupérer un résultat (valeur de retour). En Java, chaque méthode appartient à une classe : elle définit le comportement que les objets de cette classe peuvent adopter ou les opérations qu’ils peuvent effectuer. Bien concevoir ses méthodes, c’est donc apprendre à découper un problème en sous-tâches logiques, à nommer clairement les opérations, et à limiter la duplication de code.&lt;/p&gt;</description></item><item><title>Exercices sur les classes et méthodes</title><link>https://lemire.github.io/inf1220-nexam/docs/modules/module2/exercices-2-2/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://lemire.github.io/inf1220-nexam/docs/modules/module2/exercices-2-2/</guid><description>&lt;h1 id="questionsréponses"&gt;&#10; Questions/Réponses&#10; &lt;a class="anchor" href="#questionsr%c3%a9ponses"&gt;#&lt;/a&gt;&#10;&lt;/h1&gt;&#10;&lt;p&gt;Veuillez répondre mentalement ou sur papier à ces questions avant de regarder la réponse.&#10;Certaines questions sont difficiles, et il est normal de ne pas toutes les réussir.&lt;/p&gt;&#10;&lt;blockquote class="book-hint info"&gt;&#10;&lt;p&gt;N&amp;rsquo;oubliez pas d&amp;rsquo;utiliser notre &lt;a href="https://lemire.github.io/inf1220-nexam/docs/pensebete/"&gt;pense-bête Java&lt;/a&gt; au besoin. Pour les mathématiques,&#10;vous pouvez faire référence à notre rappel sur &lt;a href="https://lemire.github.io/inf1220-nexam/docs/extra/math/"&gt;les principales notions mathématiques&lt;/a&gt; du cours.&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;h2 id="comment-faire-ces-exercices-"&gt;&#10; Comment faire ces exercices ?&#10; &lt;a class="anchor" href="#comment-faire-ces-exercices-"&gt;#&lt;/a&gt;&#10;&lt;/h2&gt;&#10;&lt;p&gt;N'allez pas trop vite. Il ne sert à rien de lire la question et d'immédiatement lire la réponse. Le but des exercices est de vous amener à travailler la matière. Si vous ne faites que regarder les solutions, vous n'apprenez pas grand chose. &lt;/p&gt;</description></item><item><title>Recommandations</title><link>https://lemire.github.io/inf1220-nexam/docs/modules/module2/conseils/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://lemire.github.io/inf1220-nexam/docs/modules/module2/conseils/</guid><description>&lt;h1 id="recommandations"&gt;&#10; Recommandations&#10; &lt;a class="anchor" href="#recommandations"&gt;#&lt;/a&gt;&#10;&lt;/h1&gt;&#10;&lt;p&gt;Il est important d&amp;rsquo;écrire du code lisible et bien documenté. Il s&amp;rsquo;agit d&amp;rsquo;un compétence&#10;nécessaire pour développer du logiciel en pratique.&lt;/p&gt;&#10;&lt;h2 id="importance-de-la-lisibilité-du-code-en-java"&gt;&#10; Importance de la lisibilité du code en Java&#10; &lt;a class="anchor" href="#importance-de-la-lisibilit%c3%a9-du-code-en-java"&gt;#&lt;/a&gt;&#10;&lt;/h2&gt;&#10;&lt;p&gt;La lisibilité du code est essentielle en Java pour faciliter la maintenance et la collaboration.&#10;Un code lisible réduit les erreurs et permet à d&amp;rsquo;autres développeurs (ou à vous-même dans le&#10;futur) de comprendre rapidement l&amp;rsquo;intention du programme. Pour y parvenir, il faut adopter&#10;des conventions de nommage claires et commenter judicieusement. Les normes de codage,&#10;comme celles définies par Oracle ou Google, standardisent la structure du code, rendant&#10;les projets cohérents. Une variable bien nommée, comme &lt;code&gt;nombreEtudiants&lt;/code&gt; au lieu de &lt;code&gt;n&lt;/code&gt;,&#10;et des commentaires explicatifs améliorent la compréhension.&lt;/p&gt;</description></item><item><title>Java moderne</title><link>https://lemire.github.io/inf1220-nexam/docs/modules/module2/javamodern/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://lemire.github.io/inf1220-nexam/docs/modules/module2/javamodern/</guid><description>&lt;h1 id="java-moderne"&gt;&#10; Java moderne&#10; &lt;a class="anchor" href="#java-moderne"&gt;#&lt;/a&gt;&#10;&lt;/h1&gt;&#10;&lt;p&gt;Le langage Java existe depuis des décennies. Pendant ce temps, les conventions&#10;qu&amp;rsquo;utilisent les programmeurs ont évoluées. Nous vous encourageons à utiliser&#10;un style plus moderne.&lt;/p&gt;&#10;&lt;h2 id="exemple-1"&gt;&#10; Exemple 1&#10; &lt;a class="anchor" href="#exemple-1"&gt;#&lt;/a&gt;&#10;&lt;/h2&gt;&#10;&lt;h3 id="conventionel"&gt;&#10; Conventionel&#10; &lt;a class="anchor" href="#conventionel"&gt;#&lt;/a&gt;&#10;&lt;/h3&gt;&#10;&lt;div class="java-inline"&gt;&#10;&#10;&#10;&#10;&#10;&#10;&#10; &lt;div id="java-runner-1789748553937152401"&gt;&#10; &lt;link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.65.16/codemirror.min.css"&gt;&#10; &lt;link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.65.16/theme/eclipse.min.css"&gt;&#10; &lt;style&gt;&#10; #java-runner-1789748553937152401 .export-form textarea { width:100%; min-height:120px; font-family:monospace; border-radius:4px; border:1px solid #ccc; }&#10; #java-runner-1789748553937152401 .export-form { margin-bottom:0; }&#10; #java-runner-1789748553937152401 .export-result { background:#222; color:#eee; padding:12px; border-radius:6px; margin-top:16px; white-space:pre-wrap; font-family:monospace; }&#10; #java-runner-1789748553937152401 .export-result.is-running::after { content:''; animation: exportRunningDots 2s steps(1, end) infinite; }&#10; @keyframes exportRunningDots { 0% { content:''; } 25% { content:'.'; } 50% { content:'..'; } 75% { content:'...'; } }&#10; @media (prefers-reduced-motion: reduce) { #java-runner-1789748553937152401 .export-result.is-running::after { animation:none; content:'…'; } }&#10; #java-runner-1789748553937152401 .export-endpoint-info { color:#1976d2; font-size:0.98em; margin-top:8px; }&#10; #java-runner-1789748553937152401 .export-btn { background:#1976d2; color:#fff; border:none; border-radius:4px; padding:8px 16px; font-size:1em; cursor:pointer; margin-top:8px; }&#10; #java-runner-1789748553937152401 .export-file-block { max-width: 100%;flex:1 1 350px; background:#f9f9f9; border:1px solid #ddd; border-radius:6px; padding:12px; margin-bottom:8px; }&#10; #java-runner-1789748553937152401 .export-file-block .export-file-name { font-weight:bold; margin-bottom:4px; }&#10; .cm-java-error { background: #ffe0e0 !important; border-bottom: 2px dotted #c00; cursor: pointer; }&#10; .cm-java-error-line { background: #fff0f0 !important; }&#10; &lt;/style&gt;&#10; &lt;form class="export-form java-runner-1789748553937152401-form" style="margin-bottom:0;" aria-label="Exécuter le programme Java Main.java"&gt;&#10; &lt;input type="hidden" class="export-endpoint-var" value="https://flask-service-inf1220-java.90qakjuvfj4f8.ca-central-1.cs.amazonlightsail.com/run"&gt;&#10; &lt;div style="display:flex;gap:12px;flex-wrap:wrap;"&gt;&#10; &lt;div class='export-file-block'&gt;&lt;div class='export-file-name' id='java-runner-1789748553937152401-name'&gt;Main.java&lt;/div&gt;&lt;textarea aria-labelledby='java-runner-1789748553937152401-name'&gt;&#10;class Point {&#10; private final double x;&#10; private final double y;&#10; public Point(double x, double y) {&#10; this.x = x;&#10; this.y = y;&#10; }&#10; public double x() {&#10; return x;&#10; }&#10; public double y() {&#10; return y;&#10; }&#10; public String toString() {&#10; return &amp;#34;Point[x=&amp;#34; &amp;#43; x &amp;#43; &amp;#34;, y=&amp;#34; &amp;#43; y &amp;#43; &amp;#34;]&amp;#34;;&#10; }&#10;}&#10;&#10;public class Main {&#10; public static void main(String[] args) {&#10; Point p = new Point(3.0, 4.5);&#10; System.out.println(p);&#10; }&#10;}&#10;&lt;/textarea&gt;&lt;/div&gt;&#10; &lt;/div&gt;&#10; &lt;button type="submit" class="export-btn java-runner-1789748553937152401-btn" style="background:#1976d2;color:#fff;border:none;border-radius:4px;padding:8px 16px;font-size:1em;cursor:pointer;margin-top:8px;"&gt;Exécuter&lt;/button&gt;&#10; &lt;/form&gt;&#10; &lt;div class="export-result" role="status" aria-live="polite" aria-atomic="true" aria-label="Résultat de l'exécution"&gt;&lt;/div&gt;&#10; &lt;div class="java-error-tooltip" style="display:none;position:absolute;z-index:1000;background:#fff0f0;color:#c00;border:1px solid #c00;padding:6px 12px;border-radius:6px;font-size:1em;box-shadow:0 2px 8px #0002;"&gt;&lt;/div&gt;&#10; &lt;script src="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.65.16/codemirror.min.js"&gt;&lt;/script&gt;&#10; &lt;script src="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.65.16/mode/clike/clike.min.js"&gt;&lt;/script&gt;&#10; &lt;script&gt;(function(){&#10; var root = document.getElementById('java-runner-1789748553937152401');&#10; if (!root) return;&#10; var form = root.querySelector('form');&#10; var resultDiv = root.querySelector('.export-result');&#10; var endpoint = form.querySelector('.export-endpoint-var').value;&#10; var tooltip = root.querySelector('.java-error-tooltip');&#10; &#10; root.querySelectorAll('.export-file-block').forEach(function(block){&#10; var name = block.querySelector('.export-file-name').textContent;&#10; var ta = block.querySelector('textarea');&#10; if(name.endsWith('.java')) {&#10; var cm = CodeMirror.fromTextArea(ta, {&#10; mode: "text/x-java",&#10; theme: "eclipse",&#10; lineNumbers: true,&#10; indentUnit: 4,&#10; tabSize: 4,&#10; &#10; &#10; extraKeys: {&#10; Tab: false,&#10; "Shift-Tab": false,&#10; Esc: function(c) { c.display.input.blur(); }&#10; }&#10; });&#10; (function(editor, fileName) {&#10; var label = "Éditeur de code Java : " + fileName;&#10; var wrapper = editor.getWrapperElement();&#10; wrapper.setAttribute('role', 'group');&#10; wrapper.setAttribute('aria-label', label);&#10; var field = editor.getInputField();&#10; if (field) { field.setAttribute('aria-label', label); }&#10; var scroll = wrapper.querySelector('.CodeMirror-scroll');&#10; if (scroll &amp;&amp; !scroll.hasAttribute('tabindex') &amp;&amp; !scroll.contains(field)) {&#10; scroll.setAttribute('tabindex', '0');&#10; scroll.setAttribute('role', 'region');&#10; scroll.setAttribute('aria-label', label);&#10; }&#10; })(cm, name);&#10; block._cm = cm;&#10; &#10; block._javaErrorLines = {};&#10; &#10; cm.on('cursorActivity', function() {&#10; var statusBar = block.querySelector('.java-error-status-bar');&#10; if (!statusBar) return;&#10; var cursor = cm.getCursor();&#10; var errMsg = block._javaErrorLines &amp;&amp; block._javaErrorLines[cursor.line];&#10; if (errMsg) {&#10; statusBar.textContent = 'Ligne ' + (cursor.line+1) + ' : ' + errMsg;&#10; statusBar.style.visibility = 'visible';&#10; } else {&#10; statusBar.textContent = '';&#10; statusBar.style.visibility = 'hidden';&#10; }&#10; });&#10; }&#10; &#10; if(name.endsWith('.java')) {&#10; if (!block.querySelector('.java-error-status-bar')) {&#10; var statusBar = document.createElement('div');&#10; statusBar.className = 'java-error-status-bar';&#10; statusBar.setAttribute('role', 'status');&#10; statusBar.setAttribute('aria-live', 'polite');&#10; statusBar.style.marginTop = '4px';&#10; statusBar.style.fontSize = '0.95em';&#10; statusBar.style.color = '#c00';&#10; statusBar.style.minHeight = '1.2em';&#10; statusBar.style.visibility = 'hidden';&#10; block.appendChild(statusBar);&#10; }&#10; }&#10; });&#10; &#10; function showTooltip(msg, x, y) {&#10; tooltip.textContent = msg;&#10; tooltip.style.display = 'block';&#10; tooltip.style.left = (x+10) + 'px';&#10; tooltip.style.top = (y+10) + 'px';&#10; }&#10; function hideTooltip() {&#10; tooltip.style.display = 'none';&#10; }&#10; &#10; function escapeHtml(str) {&#10; if (str == null) return '';&#10; return String(str)&#10; .replace(/&amp;/g, '&amp;amp;')&#10; .replace(/&lt;/g, '&amp;lt;')&#10; .replace(/&gt;/g, '&amp;gt;')&#10; .replace(/"/g, '&amp;quot;')&#10; .replace(/'/g, '&amp;#39;');&#10; }&#10; form.onsubmit = function(e){&#10; e.preventDefault();&#10; var java_files = [], txt_files = [];&#10; root.querySelectorAll('.export-file-block').forEach(function(block){&#10; var name = block.querySelector('.export-file-name').textContent;&#10; var ta = block.querySelector('textarea');&#10; var content = block._cm ? block._cm.getValue() : ta.value;&#10; if(name.endsWith('.java')) java_files.push({name: name, content: content});&#10; else txt_files.push({name: name, content: content});&#10; });&#10; &#10; resultDiv.textContent = 'Exécution en cours';&#10; resultDiv.classList.add('is-running');&#10; var execAnim = null;&#10; &#10; var controller = new AbortController();&#10; var timeoutId = setTimeout(function() { controller.abort(); }, 30000); &#10; fetch(endpoint, {&#10; method: 'POST',&#10; headers: { 'Content-Type': 'application/json' },&#10; body: JSON.stringify({ java_files: java_files, txt_files: txt_files }),&#10; signal: controller.signal&#10; })&#10; .then(function(r){&#10; clearInterval(execAnim);&#10; resultDiv.classList.remove('is-running');&#10; clearTimeout(timeoutId);&#10; if (!r.ok &amp;&amp; r.status !== 400 &amp;&amp; r.status !== 500) {&#10; throw new Error('Erreur HTTP ' + r.status + ' : ' + r.statusText);&#10; }&#10; return r.text();&#10; })&#10; .then(function(t){&#10; try {&#10; var j=JSON.parse(t);&#10; &#10; if(j.status==='ran_successfully') {&#10; resultDiv.innerHTML='&lt;pre style="color:#222;background:#e0ffe0;padding:12px;border-radius:6px;"&gt;'+escapeHtml(j.output||'').replace(/\n/g,'&lt;br&gt;')+escapeHtml(j.stderr||'')+'&lt;/pre&gt;';&#10; } else if(j.status==='compiling') {&#10; resultDiv.innerHTML='&lt;pre style="color:#c00;background:#ffe0e0;padding:12px;border-radius:6px;"&gt;'+escapeHtml(j.error||'').replace(/\n/g,'&lt;br&gt;')+escapeHtml(j.stderr||'')+'&lt;/pre&gt;';&#10; } else if(j.status==='runtime_error' || j.status==='error') {&#10; resultDiv.innerHTML=(j.output?'&lt;pre style="color:#222;background:#e0ffe0;padding:12px;border-radius:6px;"&gt;'+escapeHtml(j.output).replace(/\n/g,'&lt;br&gt;')+'&lt;/pre&gt;':'')+'&lt;pre style="color:#c00;background:#ffe0e0;padding:12px;border-radius:6px;"&gt;'+escapeHtml(j.stderr||j.error||'').replace(/\n/g,'&lt;br&gt;')+'&lt;/pre&gt;';&#10; } else {&#10; resultDiv.textContent = t;&#10; }&#10; &#10; if(j.status==='compiling') {&#10; var errorText = j.error || '';&#10; var errorRegex = new RegExp('([\\w./\\-]+\\.java):(\\d+): error: ([^\\n]+)([\\s\\S]*?)(?=\\n[\\w./\\-]+\\.java:|$)','g');&#10; var match;&#10; root.querySelectorAll('.export-file-block').forEach(function(block){&#10; if (block._cm) {&#10; block._cm.operation(function() {&#10; var marks = block._cm.getAllMarks();&#10; for (var i = 0; i &lt; marks.length; i++) { marks[i].clear(); }&#10; });&#10; }&#10; &#10; block._javaErrorLines = {};&#10; var statusBar = block.querySelector('.java-error-status-bar');&#10; if (statusBar) {&#10; statusBar.textContent = '';&#10; statusBar.style.visibility = 'hidden';&#10; }&#10; });&#10; while ((match = errorRegex.exec(errorText)) !== null) {&#10; var file = match[1], lineStr = match[2], msg = match[3], details = match[4];&#10; var line = parseInt(lineStr, 10) - 1;&#10; var errorMsg = (msg + (details ? details.replace(/\s+/g, ' ') : '')).trim();&#10; root.querySelectorAll('.export-file-block').forEach(function(block){&#10; var nameInput = block.querySelector('.export-file-name');&#10; if (nameInput &amp;&amp; (nameInput.textContent.trim() === file || nameInput.textContent.trim().endsWith('/'+file) || nameInput.textContent.trim().endsWith('\\'+file))) {&#10; if (block._cm) {&#10; block._cm.operation(function() {&#10; block._cm.markText({line:line, ch:0}, {line:line+1, ch:0}, {&#10; className: 'cm-java-error',&#10; title: errorMsg&#10; });&#10; });&#10; }&#10; &#10; if (!block._javaErrorLines) { block._javaErrorLines = {}; }&#10; block._javaErrorLines[line] = errorMsg;&#10; }&#10; });&#10; }&#10; &#10; root.querySelectorAll('.export-file-block').forEach(function(block){&#10; if (block._cm &amp;&amp; block._cm.getOption('lineNumbers')) {&#10; &#10; var statusBar = block.querySelector('.java-error-status-bar');&#10; if (statusBar) {&#10; var cursor = block._cm.getCursor();&#10; var errMsg = block._javaErrorLines &amp;&amp; block._javaErrorLines[cursor.line];&#10; if (errMsg) {&#10; statusBar.textContent = 'Ligne ' + (cursor.line+1) + ' : ' + errMsg;&#10; statusBar.style.visibility = 'visible';&#10; } else {&#10; statusBar.textContent = '';&#10; statusBar.style.visibility = 'hidden';&#10; }&#10; }&#10; }&#10; });&#10; } else if (j.status==='error' || j.status==='runtime_error') {&#10; var rtText = j.stderr || j.error || '';&#10; var rtCauses = rtText.split('\n').filter(function(l){ return /Caused by:/.test(l); });&#10; var rtMsg = (rtCauses.length&#10; ? rtCauses[rtCauses.length-1].replace(/^.*Caused by:\s*/, '')&#10; : (rtText.split('\n')[0] || 'Erreur d’exécution')).trim();&#10; root.querySelectorAll('.export-file-block').forEach(function(block){&#10; if (block._cm) {&#10; block._cm.operation(function(){&#10; block._cm.getAllMarks().forEach(function(m){ m.clear(); });&#10; });&#10; }&#10; block._javaErrorLines = {};&#10; var sb = block.querySelector('.java-error-status-bar');&#10; if (sb) { sb.textContent = ''; sb.style.visibility = 'hidden'; }&#10; });&#10; var rtRegex = /\(([\w$-]+\.java):(\d+)\)/g;&#10; var rtSeen = {}, rtMatch;&#10; while ((rtMatch = rtRegex.exec(rtText)) !== null) {&#10; var rtFile = rtMatch[1], rtLine = parseInt(rtMatch[2], 10) - 1;&#10; if (rtLine &lt; 0 || rtSeen[rtFile + ':' + rtLine]) { continue; }&#10; rtSeen[rtFile + ':' + rtLine] = true;&#10; root.querySelectorAll('.export-file-block').forEach(function(block){&#10; var nameEl = block.querySelector('.export-file-name');&#10; var nm = nameEl ? nameEl.textContent.trim() : '';&#10; if (block._cm &amp;&amp; rtLine &lt; block._cm.lineCount() &amp;&amp;&#10; (nm === rtFile || nm.endsWith('/'+rtFile) || nm.endsWith('\\'+rtFile))) {&#10; block._cm.operation(function(){&#10; block._cm.markText({line:rtLine, ch:0}, {line:rtLine+1, ch:0}, {&#10; className: 'cm-java-error', title: rtMsg&#10; });&#10; });&#10; if (!block._javaErrorLines) { block._javaErrorLines = {}; }&#10; block._javaErrorLines[rtLine] = rtMsg;&#10; }&#10; });&#10; }&#10; } else {&#10; &#10; root.querySelectorAll('.export-file-block').forEach(function(block){&#10; if (block._cm) {&#10; block._cm.operation(function() {&#10; var marks = block._cm.getAllMarks();&#10; for (var i = 0; i &lt; marks.length; i++) { marks[i].clear(); }&#10; });&#10; }&#10; block._javaErrorLines = {};&#10; var statusBar = block.querySelector('.java-error-status-bar');&#10; if (statusBar) {&#10; statusBar.textContent = '';&#10; statusBar.style.visibility = 'hidden';&#10; }&#10; });&#10; }&#10; } catch(e){ console.log(e); resultDiv.textContent=t; }&#10; })&#10; .catch(function(error){&#10; clearInterval(execAnim);&#10; resultDiv.classList.remove('is-running');&#10; clearTimeout(timeoutId);&#10; if (error.name === 'AbortError') {&#10; resultDiv.textContent = 'Erreur : délai d’attente dépassé (30 secondes).';&#10; } else {&#10; resultDiv.textContent = 'Erreur lors de la requête : ' + error;&#10; }&#10; });&#10; };&#10; &#10; root.querySelectorAll('.export-file-block').forEach(function(block){&#10; var cm = block._cm;&#10; if (!cm) return;&#10; cm.on('mouseover', function(cm, event) {&#10; var pos = cm.coordsChar({ left: event.clientX, top: event.clientY });&#10; var line = pos.line, ch = pos.ch;&#10; var cursor = cm.getCursor();&#10; if (line === cursor.line &amp;&amp; block._javaErrorLines &amp;&amp; block._javaErrorLines[line]) {&#10; var msg = block._javaErrorLines[line];&#10; showTooltip(msg, event.clientX, event.clientY);&#10; }&#10; });&#10; cm.on('mouseout', function(cm, event) {&#10; hideTooltip();&#10; });&#10; });&#10; })();&lt;/script&gt;&#10; &lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;h3 id="moderne"&gt;&#10; Moderne&#10; &lt;a class="anchor" href="#moderne"&gt;#&lt;/a&gt;&#10;&lt;/h3&gt;&#10;&lt;div class="java-inline"&gt;&#10;&#10;&#10;&#10;&#10;&#10;&#10; &lt;div id="java-runner-1789748553937211568"&gt;&#10; &lt;link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.65.16/codemirror.min.css"&gt;&#10; &lt;link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.65.16/theme/eclipse.min.css"&gt;&#10; &lt;style&gt;&#10; #java-runner-1789748553937211568 .export-form textarea { width:100%; min-height:120px; font-family:monospace; border-radius:4px; border:1px solid #ccc; }&#10; #java-runner-1789748553937211568 .export-form { margin-bottom:0; }&#10; #java-runner-1789748553937211568 .export-result { background:#222; color:#eee; padding:12px; border-radius:6px; margin-top:16px; white-space:pre-wrap; font-family:monospace; }&#10; #java-runner-1789748553937211568 .export-result.is-running::after { content:''; animation: exportRunningDots 2s steps(1, end) infinite; }&#10; @keyframes exportRunningDots { 0% { content:''; } 25% { content:'.'; } 50% { content:'..'; } 75% { content:'...'; } }&#10; @media (prefers-reduced-motion: reduce) { #java-runner-1789748553937211568 .export-result.is-running::after { animation:none; content:'…'; } }&#10; #java-runner-1789748553937211568 .export-endpoint-info { color:#1976d2; font-size:0.98em; margin-top:8px; }&#10; #java-runner-1789748553937211568 .export-btn { background:#1976d2; color:#fff; border:none; border-radius:4px; padding:8px 16px; font-size:1em; cursor:pointer; margin-top:8px; }&#10; #java-runner-1789748553937211568 .export-file-block { max-width: 100%;flex:1 1 350px; background:#f9f9f9; border:1px solid #ddd; border-radius:6px; padding:12px; margin-bottom:8px; }&#10; #java-runner-1789748553937211568 .export-file-block .export-file-name { font-weight:bold; margin-bottom:4px; }&#10; .cm-java-error { background: #ffe0e0 !important; border-bottom: 2px dotted #c00; cursor: pointer; }&#10; .cm-java-error-line { background: #fff0f0 !important; }&#10; &lt;/style&gt;&#10; &lt;form class="export-form java-runner-1789748553937211568-form" style="margin-bottom:0;" aria-label="Exécuter le programme Java Main.java"&gt;&#10; &lt;input type="hidden" class="export-endpoint-var" value="https://flask-service-inf1220-java.90qakjuvfj4f8.ca-central-1.cs.amazonlightsail.com/run"&gt;&#10; &lt;div style="display:flex;gap:12px;flex-wrap:wrap;"&gt;&#10; &lt;div class='export-file-block'&gt;&lt;div class='export-file-name' id='java-runner-1789748553937211568-name'&gt;Main.java&lt;/div&gt;&lt;textarea aria-labelledby='java-runner-1789748553937211568-name'&gt;&#10;record Point(double x, double y) {}&#10;void main() {&#10; Point p = new Point(3.0, 4.5);&#10; System.out.println(p);&#10;}&#10;&lt;/textarea&gt;&lt;/div&gt;&#10; &lt;/div&gt;&#10; &lt;button type="submit" class="export-btn java-runner-1789748553937211568-btn" style="background:#1976d2;color:#fff;border:none;border-radius:4px;padding:8px 16px;font-size:1em;cursor:pointer;margin-top:8px;"&gt;Exécuter&lt;/button&gt;&#10; &lt;/form&gt;&#10; &lt;div class="export-result" role="status" aria-live="polite" aria-atomic="true" aria-label="Résultat de l'exécution"&gt;&lt;/div&gt;&#10; &lt;div class="java-error-tooltip" style="display:none;position:absolute;z-index:1000;background:#fff0f0;color:#c00;border:1px solid #c00;padding:6px 12px;border-radius:6px;font-size:1em;box-shadow:0 2px 8px #0002;"&gt;&lt;/div&gt;&#10; &lt;script src="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.65.16/codemirror.min.js"&gt;&lt;/script&gt;&#10; &lt;script src="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.65.16/mode/clike/clike.min.js"&gt;&lt;/script&gt;&#10; &lt;script&gt;(function(){&#10; var root = document.getElementById('java-runner-1789748553937211568');&#10; if (!root) return;&#10; var form = root.querySelector('form');&#10; var resultDiv = root.querySelector('.export-result');&#10; var endpoint = form.querySelector('.export-endpoint-var').value;&#10; var tooltip = root.querySelector('.java-error-tooltip');&#10; &#10; root.querySelectorAll('.export-file-block').forEach(function(block){&#10; var name = block.querySelector('.export-file-name').textContent;&#10; var ta = block.querySelector('textarea');&#10; if(name.endsWith('.java')) {&#10; var cm = CodeMirror.fromTextArea(ta, {&#10; mode: "text/x-java",&#10; theme: "eclipse",&#10; lineNumbers: true,&#10; indentUnit: 4,&#10; tabSize: 4,&#10; &#10; &#10; extraKeys: {&#10; Tab: false,&#10; "Shift-Tab": false,&#10; Esc: function(c) { c.display.input.blur(); }&#10; }&#10; });&#10; (function(editor, fileName) {&#10; var label = "Éditeur de code Java : " + fileName;&#10; var wrapper = editor.getWrapperElement();&#10; wrapper.setAttribute('role', 'group');&#10; wrapper.setAttribute('aria-label', label);&#10; var field = editor.getInputField();&#10; if (field) { field.setAttribute('aria-label', label); }&#10; var scroll = wrapper.querySelector('.CodeMirror-scroll');&#10; if (scroll &amp;&amp; !scroll.hasAttribute('tabindex') &amp;&amp; !scroll.contains(field)) {&#10; scroll.setAttribute('tabindex', '0');&#10; scroll.setAttribute('role', 'region');&#10; scroll.setAttribute('aria-label', label);&#10; }&#10; })(cm, name);&#10; block._cm = cm;&#10; &#10; block._javaErrorLines = {};&#10; &#10; cm.on('cursorActivity', function() {&#10; var statusBar = block.querySelector('.java-error-status-bar');&#10; if (!statusBar) return;&#10; var cursor = cm.getCursor();&#10; var errMsg = block._javaErrorLines &amp;&amp; block._javaErrorLines[cursor.line];&#10; if (errMsg) {&#10; statusBar.textContent = 'Ligne ' + (cursor.line+1) + ' : ' + errMsg;&#10; statusBar.style.visibility = 'visible';&#10; } else {&#10; statusBar.textContent = '';&#10; statusBar.style.visibility = 'hidden';&#10; }&#10; });&#10; }&#10; &#10; if(name.endsWith('.java')) {&#10; if (!block.querySelector('.java-error-status-bar')) {&#10; var statusBar = document.createElement('div');&#10; statusBar.className = 'java-error-status-bar';&#10; statusBar.setAttribute('role', 'status');&#10; statusBar.setAttribute('aria-live', 'polite');&#10; statusBar.style.marginTop = '4px';&#10; statusBar.style.fontSize = '0.95em';&#10; statusBar.style.color = '#c00';&#10; statusBar.style.minHeight = '1.2em';&#10; statusBar.style.visibility = 'hidden';&#10; block.appendChild(statusBar);&#10; }&#10; }&#10; });&#10; &#10; function showTooltip(msg, x, y) {&#10; tooltip.textContent = msg;&#10; tooltip.style.display = 'block';&#10; tooltip.style.left = (x+10) + 'px';&#10; tooltip.style.top = (y+10) + 'px';&#10; }&#10; function hideTooltip() {&#10; tooltip.style.display = 'none';&#10; }&#10; &#10; function escapeHtml(str) {&#10; if (str == null) return '';&#10; return String(str)&#10; .replace(/&amp;/g, '&amp;amp;')&#10; .replace(/&lt;/g, '&amp;lt;')&#10; .replace(/&gt;/g, '&amp;gt;')&#10; .replace(/"/g, '&amp;quot;')&#10; .replace(/'/g, '&amp;#39;');&#10; }&#10; form.onsubmit = function(e){&#10; e.preventDefault();&#10; var java_files = [], txt_files = [];&#10; root.querySelectorAll('.export-file-block').forEach(function(block){&#10; var name = block.querySelector('.export-file-name').textContent;&#10; var ta = block.querySelector('textarea');&#10; var content = block._cm ? block._cm.getValue() : ta.value;&#10; if(name.endsWith('.java')) java_files.push({name: name, content: content});&#10; else txt_files.push({name: name, content: content});&#10; });&#10; &#10; resultDiv.textContent = 'Exécution en cours';&#10; resultDiv.classList.add('is-running');&#10; var execAnim = null;&#10; &#10; var controller = new AbortController();&#10; var timeoutId = setTimeout(function() { controller.abort(); }, 30000); &#10; fetch(endpoint, {&#10; method: 'POST',&#10; headers: { 'Content-Type': 'application/json' },&#10; body: JSON.stringify({ java_files: java_files, txt_files: txt_files }),&#10; signal: controller.signal&#10; })&#10; .then(function(r){&#10; clearInterval(execAnim);&#10; resultDiv.classList.remove('is-running');&#10; clearTimeout(timeoutId);&#10; if (!r.ok &amp;&amp; r.status !== 400 &amp;&amp; r.status !== 500) {&#10; throw new Error('Erreur HTTP ' + r.status + ' : ' + r.statusText);&#10; }&#10; return r.text();&#10; })&#10; .then(function(t){&#10; try {&#10; var j=JSON.parse(t);&#10; &#10; if(j.status==='ran_successfully') {&#10; resultDiv.innerHTML='&lt;pre style="color:#222;background:#e0ffe0;padding:12px;border-radius:6px;"&gt;'+escapeHtml(j.output||'').replace(/\n/g,'&lt;br&gt;')+escapeHtml(j.stderr||'')+'&lt;/pre&gt;';&#10; } else if(j.status==='compiling') {&#10; resultDiv.innerHTML='&lt;pre style="color:#c00;background:#ffe0e0;padding:12px;border-radius:6px;"&gt;'+escapeHtml(j.error||'').replace(/\n/g,'&lt;br&gt;')+escapeHtml(j.stderr||'')+'&lt;/pre&gt;';&#10; } else if(j.status==='runtime_error' || j.status==='error') {&#10; resultDiv.innerHTML=(j.output?'&lt;pre style="color:#222;background:#e0ffe0;padding:12px;border-radius:6px;"&gt;'+escapeHtml(j.output).replace(/\n/g,'&lt;br&gt;')+'&lt;/pre&gt;':'')+'&lt;pre style="color:#c00;background:#ffe0e0;padding:12px;border-radius:6px;"&gt;'+escapeHtml(j.stderr||j.error||'').replace(/\n/g,'&lt;br&gt;')+'&lt;/pre&gt;';&#10; } else {&#10; resultDiv.textContent = t;&#10; }&#10; &#10; if(j.status==='compiling') {&#10; var errorText = j.error || '';&#10; var errorRegex = new RegExp('([\\w./\\-]+\\.java):(\\d+): error: ([^\\n]+)([\\s\\S]*?)(?=\\n[\\w./\\-]+\\.java:|$)','g');&#10; var match;&#10; root.querySelectorAll('.export-file-block').forEach(function(block){&#10; if (block._cm) {&#10; block._cm.operation(function() {&#10; var marks = block._cm.getAllMarks();&#10; for (var i = 0; i &lt; marks.length; i++) { marks[i].clear(); }&#10; });&#10; }&#10; &#10; block._javaErrorLines = {};&#10; var statusBar = block.querySelector('.java-error-status-bar');&#10; if (statusBar) {&#10; statusBar.textContent = '';&#10; statusBar.style.visibility = 'hidden';&#10; }&#10; });&#10; while ((match = errorRegex.exec(errorText)) !== null) {&#10; var file = match[1], lineStr = match[2], msg = match[3], details = match[4];&#10; var line = parseInt(lineStr, 10) - 1;&#10; var errorMsg = (msg + (details ? details.replace(/\s+/g, ' ') : '')).trim();&#10; root.querySelectorAll('.export-file-block').forEach(function(block){&#10; var nameInput = block.querySelector('.export-file-name');&#10; if (nameInput &amp;&amp; (nameInput.textContent.trim() === file || nameInput.textContent.trim().endsWith('/'+file) || nameInput.textContent.trim().endsWith('\\'+file))) {&#10; if (block._cm) {&#10; block._cm.operation(function() {&#10; block._cm.markText({line:line, ch:0}, {line:line+1, ch:0}, {&#10; className: 'cm-java-error',&#10; title: errorMsg&#10; });&#10; });&#10; }&#10; &#10; if (!block._javaErrorLines) { block._javaErrorLines = {}; }&#10; block._javaErrorLines[line] = errorMsg;&#10; }&#10; });&#10; }&#10; &#10; root.querySelectorAll('.export-file-block').forEach(function(block){&#10; if (block._cm &amp;&amp; block._cm.getOption('lineNumbers')) {&#10; &#10; var statusBar = block.querySelector('.java-error-status-bar');&#10; if (statusBar) {&#10; var cursor = block._cm.getCursor();&#10; var errMsg = block._javaErrorLines &amp;&amp; block._javaErrorLines[cursor.line];&#10; if (errMsg) {&#10; statusBar.textContent = 'Ligne ' + (cursor.line+1) + ' : ' + errMsg;&#10; statusBar.style.visibility = 'visible';&#10; } else {&#10; statusBar.textContent = '';&#10; statusBar.style.visibility = 'hidden';&#10; }&#10; }&#10; }&#10; });&#10; } else if (j.status==='error' || j.status==='runtime_error') {&#10; var rtText = j.stderr || j.error || '';&#10; var rtCauses = rtText.split('\n').filter(function(l){ return /Caused by:/.test(l); });&#10; var rtMsg = (rtCauses.length&#10; ? rtCauses[rtCauses.length-1].replace(/^.*Caused by:\s*/, '')&#10; : (rtText.split('\n')[0] || 'Erreur d’exécution')).trim();&#10; root.querySelectorAll('.export-file-block').forEach(function(block){&#10; if (block._cm) {&#10; block._cm.operation(function(){&#10; block._cm.getAllMarks().forEach(function(m){ m.clear(); });&#10; });&#10; }&#10; block._javaErrorLines = {};&#10; var sb = block.querySelector('.java-error-status-bar');&#10; if (sb) { sb.textContent = ''; sb.style.visibility = 'hidden'; }&#10; });&#10; var rtRegex = /\(([\w$-]+\.java):(\d+)\)/g;&#10; var rtSeen = {}, rtMatch;&#10; while ((rtMatch = rtRegex.exec(rtText)) !== null) {&#10; var rtFile = rtMatch[1], rtLine = parseInt(rtMatch[2], 10) - 1;&#10; if (rtLine &lt; 0 || rtSeen[rtFile + ':' + rtLine]) { continue; }&#10; rtSeen[rtFile + ':' + rtLine] = true;&#10; root.querySelectorAll('.export-file-block').forEach(function(block){&#10; var nameEl = block.querySelector('.export-file-name');&#10; var nm = nameEl ? nameEl.textContent.trim() : '';&#10; if (block._cm &amp;&amp; rtLine &lt; block._cm.lineCount() &amp;&amp;&#10; (nm === rtFile || nm.endsWith('/'+rtFile) || nm.endsWith('\\'+rtFile))) {&#10; block._cm.operation(function(){&#10; block._cm.markText({line:rtLine, ch:0}, {line:rtLine+1, ch:0}, {&#10; className: 'cm-java-error', title: rtMsg&#10; });&#10; });&#10; if (!block._javaErrorLines) { block._javaErrorLines = {}; }&#10; block._javaErrorLines[rtLine] = rtMsg;&#10; }&#10; });&#10; }&#10; } else {&#10; &#10; root.querySelectorAll('.export-file-block').forEach(function(block){&#10; if (block._cm) {&#10; block._cm.operation(function() {&#10; var marks = block._cm.getAllMarks();&#10; for (var i = 0; i &lt; marks.length; i++) { marks[i].clear(); }&#10; });&#10; }&#10; block._javaErrorLines = {};&#10; var statusBar = block.querySelector('.java-error-status-bar');&#10; if (statusBar) {&#10; statusBar.textContent = '';&#10; statusBar.style.visibility = 'hidden';&#10; }&#10; });&#10; }&#10; } catch(e){ console.log(e); resultDiv.textContent=t; }&#10; })&#10; .catch(function(error){&#10; clearInterval(execAnim);&#10; resultDiv.classList.remove('is-running');&#10; clearTimeout(timeoutId);&#10; if (error.name === 'AbortError') {&#10; resultDiv.textContent = 'Erreur : délai d’attente dépassé (30 secondes).';&#10; } else {&#10; resultDiv.textContent = 'Erreur lors de la requête : ' + error;&#10; }&#10; });&#10; };&#10; &#10; root.querySelectorAll('.export-file-block').forEach(function(block){&#10; var cm = block._cm;&#10; if (!cm) return;&#10; cm.on('mouseover', function(cm, event) {&#10; var pos = cm.coordsChar({ left: event.clientX, top: event.clientY });&#10; var line = pos.line, ch = pos.ch;&#10; var cursor = cm.getCursor();&#10; if (line === cursor.line &amp;&amp; block._javaErrorLines &amp;&amp; block._javaErrorLines[line]) {&#10; var msg = block._javaErrorLines[line];&#10; showTooltip(msg, event.clientX, event.clientY);&#10; }&#10; });&#10; cm.on('mouseout', function(cm, event) {&#10; hideTooltip();&#10; });&#10; });&#10; })();&lt;/script&gt;&#10; &lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;h2 id="exemple-2"&gt;&#10; Exemple 2&#10; &lt;a class="anchor" href="#exemple-2"&gt;#&lt;/a&gt;&#10;&lt;/h2&gt;&#10;&lt;h3 id="conventionnel"&gt;&#10; Conventionnel&#10; &lt;a class="anchor" href="#conventionnel"&gt;#&lt;/a&gt;&#10;&lt;/h3&gt;&#10;&lt;div class="java-inline"&gt;&#10;&#10;&#10;&#10;&#10;&#10;&#10; &lt;div id="java-runner-1789748553937271396"&gt;&#10; &lt;link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.65.16/codemirror.min.css"&gt;&#10; &lt;link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.65.16/theme/eclipse.min.css"&gt;&#10; &lt;style&gt;&#10; #java-runner-1789748553937271396 .export-form textarea { width:100%; min-height:120px; font-family:monospace; border-radius:4px; border:1px solid #ccc; }&#10; #java-runner-1789748553937271396 .export-form { margin-bottom:0; }&#10; #java-runner-1789748553937271396 .export-result { background:#222; color:#eee; padding:12px; border-radius:6px; margin-top:16px; white-space:pre-wrap; font-family:monospace; }&#10; #java-runner-1789748553937271396 .export-result.is-running::after { content:''; animation: exportRunningDots 2s steps(1, end) infinite; }&#10; @keyframes exportRunningDots { 0% { content:''; } 25% { content:'.'; } 50% { content:'..'; } 75% { content:'...'; } }&#10; @media (prefers-reduced-motion: reduce) { #java-runner-1789748553937271396 .export-result.is-running::after { animation:none; content:'…'; } }&#10; #java-runner-1789748553937271396 .export-endpoint-info { color:#1976d2; font-size:0.98em; margin-top:8px; }&#10; #java-runner-1789748553937271396 .export-btn { background:#1976d2; color:#fff; border:none; border-radius:4px; padding:8px 16px; font-size:1em; cursor:pointer; margin-top:8px; }&#10; #java-runner-1789748553937271396 .export-file-block { max-width: 100%;flex:1 1 350px; background:#f9f9f9; border:1px solid #ddd; border-radius:6px; padding:12px; margin-bottom:8px; }&#10; #java-runner-1789748553937271396 .export-file-block .export-file-name { font-weight:bold; margin-bottom:4px; }&#10; .cm-java-error { background: #ffe0e0 !important; border-bottom: 2px dotted #c00; cursor: pointer; }&#10; .cm-java-error-line { background: #fff0f0 !important; }&#10; &lt;/style&gt;&#10; &lt;form class="export-form java-runner-1789748553937271396-form" style="margin-bottom:0;" aria-label="Exécuter le programme Java Main.java"&gt;&#10; &lt;input type="hidden" class="export-endpoint-var" value="https://flask-service-inf1220-java.90qakjuvfj4f8.ca-central-1.cs.amazonlightsail.com/run"&gt;&#10; &lt;div style="display:flex;gap:12px;flex-wrap:wrap;"&gt;&#10; &lt;div class='export-file-block'&gt;&lt;div class='export-file-name' id='java-runner-1789748553937271396-name'&gt;Main.java&lt;/div&gt;&lt;textarea aria-labelledby='java-runner-1789748553937271396-name'&gt;&#10;public class Main {&#10; public static void main(String[] args) {&#10; String name = &amp;#34;Marie&amp;#34;;&#10; int age = 37;&#10; String city = &amp;#34;Québec&amp;#34;;&#10; String message = &amp;#34;Bonjour, je m&amp;#39;appelle &amp;#34; &amp;#43; name &amp;#43;&#10; &amp;#34;, j&amp;#39;ai &amp;#34; &amp;#43; age &amp;#43; &amp;#34; ans et j&amp;#39;habite à &amp;#34; &amp;#43;&#10; city &amp;#43; &amp;#34;.&amp;#34;;&#10; System.out.println(message);&#10; }&#10;}&#10;&lt;/textarea&gt;&lt;/div&gt;&#10; &lt;/div&gt;&#10; &lt;button type="submit" class="export-btn java-runner-1789748553937271396-btn" style="background:#1976d2;color:#fff;border:none;border-radius:4px;padding:8px 16px;font-size:1em;cursor:pointer;margin-top:8px;"&gt;Exécuter&lt;/button&gt;&#10; &lt;/form&gt;&#10; &lt;div class="export-result" role="status" aria-live="polite" aria-atomic="true" aria-label="Résultat de l'exécution"&gt;&lt;/div&gt;&#10; &lt;div class="java-error-tooltip" style="display:none;position:absolute;z-index:1000;background:#fff0f0;color:#c00;border:1px solid #c00;padding:6px 12px;border-radius:6px;font-size:1em;box-shadow:0 2px 8px #0002;"&gt;&lt;/div&gt;&#10; &lt;script src="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.65.16/codemirror.min.js"&gt;&lt;/script&gt;&#10; &lt;script src="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.65.16/mode/clike/clike.min.js"&gt;&lt;/script&gt;&#10; &lt;script&gt;(function(){&#10; var root = document.getElementById('java-runner-1789748553937271396');&#10; if (!root) return;&#10; var form = root.querySelector('form');&#10; var resultDiv = root.querySelector('.export-result');&#10; var endpoint = form.querySelector('.export-endpoint-var').value;&#10; var tooltip = root.querySelector('.java-error-tooltip');&#10; &#10; root.querySelectorAll('.export-file-block').forEach(function(block){&#10; var name = block.querySelector('.export-file-name').textContent;&#10; var ta = block.querySelector('textarea');&#10; if(name.endsWith('.java')) {&#10; var cm = CodeMirror.fromTextArea(ta, {&#10; mode: "text/x-java",&#10; theme: "eclipse",&#10; lineNumbers: true,&#10; indentUnit: 4,&#10; tabSize: 4,&#10; &#10; &#10; extraKeys: {&#10; Tab: false,&#10; "Shift-Tab": false,&#10; Esc: function(c) { c.display.input.blur(); }&#10; }&#10; });&#10; (function(editor, fileName) {&#10; var label = "Éditeur de code Java : " + fileName;&#10; var wrapper = editor.getWrapperElement();&#10; wrapper.setAttribute('role', 'group');&#10; wrapper.setAttribute('aria-label', label);&#10; var field = editor.getInputField();&#10; if (field) { field.setAttribute('aria-label', label); }&#10; var scroll = wrapper.querySelector('.CodeMirror-scroll');&#10; if (scroll &amp;&amp; !scroll.hasAttribute('tabindex') &amp;&amp; !scroll.contains(field)) {&#10; scroll.setAttribute('tabindex', '0');&#10; scroll.setAttribute('role', 'region');&#10; scroll.setAttribute('aria-label', label);&#10; }&#10; })(cm, name);&#10; block._cm = cm;&#10; &#10; block._javaErrorLines = {};&#10; &#10; cm.on('cursorActivity', function() {&#10; var statusBar = block.querySelector('.java-error-status-bar');&#10; if (!statusBar) return;&#10; var cursor = cm.getCursor();&#10; var errMsg = block._javaErrorLines &amp;&amp; block._javaErrorLines[cursor.line];&#10; if (errMsg) {&#10; statusBar.textContent = 'Ligne ' + (cursor.line+1) + ' : ' + errMsg;&#10; statusBar.style.visibility = 'visible';&#10; } else {&#10; statusBar.textContent = '';&#10; statusBar.style.visibility = 'hidden';&#10; }&#10; });&#10; }&#10; &#10; if(name.endsWith('.java')) {&#10; if (!block.querySelector('.java-error-status-bar')) {&#10; var statusBar = document.createElement('div');&#10; statusBar.className = 'java-error-status-bar';&#10; statusBar.setAttribute('role', 'status');&#10; statusBar.setAttribute('aria-live', 'polite');&#10; statusBar.style.marginTop = '4px';&#10; statusBar.style.fontSize = '0.95em';&#10; statusBar.style.color = '#c00';&#10; statusBar.style.minHeight = '1.2em';&#10; statusBar.style.visibility = 'hidden';&#10; block.appendChild(statusBar);&#10; }&#10; }&#10; });&#10; &#10; function showTooltip(msg, x, y) {&#10; tooltip.textContent = msg;&#10; tooltip.style.display = 'block';&#10; tooltip.style.left = (x+10) + 'px';&#10; tooltip.style.top = (y+10) + 'px';&#10; }&#10; function hideTooltip() {&#10; tooltip.style.display = 'none';&#10; }&#10; &#10; function escapeHtml(str) {&#10; if (str == null) return '';&#10; return String(str)&#10; .replace(/&amp;/g, '&amp;amp;')&#10; .replace(/&lt;/g, '&amp;lt;')&#10; .replace(/&gt;/g, '&amp;gt;')&#10; .replace(/"/g, '&amp;quot;')&#10; .replace(/'/g, '&amp;#39;');&#10; }&#10; form.onsubmit = function(e){&#10; e.preventDefault();&#10; var java_files = [], txt_files = [];&#10; root.querySelectorAll('.export-file-block').forEach(function(block){&#10; var name = block.querySelector('.export-file-name').textContent;&#10; var ta = block.querySelector('textarea');&#10; var content = block._cm ? block._cm.getValue() : ta.value;&#10; if(name.endsWith('.java')) java_files.push({name: name, content: content});&#10; else txt_files.push({name: name, content: content});&#10; });&#10; &#10; resultDiv.textContent = 'Exécution en cours';&#10; resultDiv.classList.add('is-running');&#10; var execAnim = null;&#10; &#10; var controller = new AbortController();&#10; var timeoutId = setTimeout(function() { controller.abort(); }, 30000); &#10; fetch(endpoint, {&#10; method: 'POST',&#10; headers: { 'Content-Type': 'application/json' },&#10; body: JSON.stringify({ java_files: java_files, txt_files: txt_files }),&#10; signal: controller.signal&#10; })&#10; .then(function(r){&#10; clearInterval(execAnim);&#10; resultDiv.classList.remove('is-running');&#10; clearTimeout(timeoutId);&#10; if (!r.ok &amp;&amp; r.status !== 400 &amp;&amp; r.status !== 500) {&#10; throw new Error('Erreur HTTP ' + r.status + ' : ' + r.statusText);&#10; }&#10; return r.text();&#10; })&#10; .then(function(t){&#10; try {&#10; var j=JSON.parse(t);&#10; &#10; if(j.status==='ran_successfully') {&#10; resultDiv.innerHTML='&lt;pre style="color:#222;background:#e0ffe0;padding:12px;border-radius:6px;"&gt;'+escapeHtml(j.output||'').replace(/\n/g,'&lt;br&gt;')+escapeHtml(j.stderr||'')+'&lt;/pre&gt;';&#10; } else if(j.status==='compiling') {&#10; resultDiv.innerHTML='&lt;pre style="color:#c00;background:#ffe0e0;padding:12px;border-radius:6px;"&gt;'+escapeHtml(j.error||'').replace(/\n/g,'&lt;br&gt;')+escapeHtml(j.stderr||'')+'&lt;/pre&gt;';&#10; } else if(j.status==='runtime_error' || j.status==='error') {&#10; resultDiv.innerHTML=(j.output?'&lt;pre style="color:#222;background:#e0ffe0;padding:12px;border-radius:6px;"&gt;'+escapeHtml(j.output).replace(/\n/g,'&lt;br&gt;')+'&lt;/pre&gt;':'')+'&lt;pre style="color:#c00;background:#ffe0e0;padding:12px;border-radius:6px;"&gt;'+escapeHtml(j.stderr||j.error||'').replace(/\n/g,'&lt;br&gt;')+'&lt;/pre&gt;';&#10; } else {&#10; resultDiv.textContent = t;&#10; }&#10; &#10; if(j.status==='compiling') {&#10; var errorText = j.error || '';&#10; var errorRegex = new RegExp('([\\w./\\-]+\\.java):(\\d+): error: ([^\\n]+)([\\s\\S]*?)(?=\\n[\\w./\\-]+\\.java:|$)','g');&#10; var match;&#10; root.querySelectorAll('.export-file-block').forEach(function(block){&#10; if (block._cm) {&#10; block._cm.operation(function() {&#10; var marks = block._cm.getAllMarks();&#10; for (var i = 0; i &lt; marks.length; i++) { marks[i].clear(); }&#10; });&#10; }&#10; &#10; block._javaErrorLines = {};&#10; var statusBar = block.querySelector('.java-error-status-bar');&#10; if (statusBar) {&#10; statusBar.textContent = '';&#10; statusBar.style.visibility = 'hidden';&#10; }&#10; });&#10; while ((match = errorRegex.exec(errorText)) !== null) {&#10; var file = match[1], lineStr = match[2], msg = match[3], details = match[4];&#10; var line = parseInt(lineStr, 10) - 1;&#10; var errorMsg = (msg + (details ? details.replace(/\s+/g, ' ') : '')).trim();&#10; root.querySelectorAll('.export-file-block').forEach(function(block){&#10; var nameInput = block.querySelector('.export-file-name');&#10; if (nameInput &amp;&amp; (nameInput.textContent.trim() === file || nameInput.textContent.trim().endsWith('/'+file) || nameInput.textContent.trim().endsWith('\\'+file))) {&#10; if (block._cm) {&#10; block._cm.operation(function() {&#10; block._cm.markText({line:line, ch:0}, {line:line+1, ch:0}, {&#10; className: 'cm-java-error',&#10; title: errorMsg&#10; });&#10; });&#10; }&#10; &#10; if (!block._javaErrorLines) { block._javaErrorLines = {}; }&#10; block._javaErrorLines[line] = errorMsg;&#10; }&#10; });&#10; }&#10; &#10; root.querySelectorAll('.export-file-block').forEach(function(block){&#10; if (block._cm &amp;&amp; block._cm.getOption('lineNumbers')) {&#10; &#10; var statusBar = block.querySelector('.java-error-status-bar');&#10; if (statusBar) {&#10; var cursor = block._cm.getCursor();&#10; var errMsg = block._javaErrorLines &amp;&amp; block._javaErrorLines[cursor.line];&#10; if (errMsg) {&#10; statusBar.textContent = 'Ligne ' + (cursor.line+1) + ' : ' + errMsg;&#10; statusBar.style.visibility = 'visible';&#10; } else {&#10; statusBar.textContent = '';&#10; statusBar.style.visibility = 'hidden';&#10; }&#10; }&#10; }&#10; });&#10; } else if (j.status==='error' || j.status==='runtime_error') {&#10; var rtText = j.stderr || j.error || '';&#10; var rtCauses = rtText.split('\n').filter(function(l){ return /Caused by:/.test(l); });&#10; var rtMsg = (rtCauses.length&#10; ? rtCauses[rtCauses.length-1].replace(/^.*Caused by:\s*/, '')&#10; : (rtText.split('\n')[0] || 'Erreur d’exécution')).trim();&#10; root.querySelectorAll('.export-file-block').forEach(function(block){&#10; if (block._cm) {&#10; block._cm.operation(function(){&#10; block._cm.getAllMarks().forEach(function(m){ m.clear(); });&#10; });&#10; }&#10; block._javaErrorLines = {};&#10; var sb = block.querySelector('.java-error-status-bar');&#10; if (sb) { sb.textContent = ''; sb.style.visibility = 'hidden'; }&#10; });&#10; var rtRegex = /\(([\w$-]+\.java):(\d+)\)/g;&#10; var rtSeen = {}, rtMatch;&#10; while ((rtMatch = rtRegex.exec(rtText)) !== null) {&#10; var rtFile = rtMatch[1], rtLine = parseInt(rtMatch[2], 10) - 1;&#10; if (rtLine &lt; 0 || rtSeen[rtFile + ':' + rtLine]) { continue; }&#10; rtSeen[rtFile + ':' + rtLine] = true;&#10; root.querySelectorAll('.export-file-block').forEach(function(block){&#10; var nameEl = block.querySelector('.export-file-name');&#10; var nm = nameEl ? nameEl.textContent.trim() : '';&#10; if (block._cm &amp;&amp; rtLine &lt; block._cm.lineCount() &amp;&amp;&#10; (nm === rtFile || nm.endsWith('/'+rtFile) || nm.endsWith('\\'+rtFile))) {&#10; block._cm.operation(function(){&#10; block._cm.markText({line:rtLine, ch:0}, {line:rtLine+1, ch:0}, {&#10; className: 'cm-java-error', title: rtMsg&#10; });&#10; });&#10; if (!block._javaErrorLines) { block._javaErrorLines = {}; }&#10; block._javaErrorLines[rtLine] = rtMsg;&#10; }&#10; });&#10; }&#10; } else {&#10; &#10; root.querySelectorAll('.export-file-block').forEach(function(block){&#10; if (block._cm) {&#10; block._cm.operation(function() {&#10; var marks = block._cm.getAllMarks();&#10; for (var i = 0; i &lt; marks.length; i++) { marks[i].clear(); }&#10; });&#10; }&#10; block._javaErrorLines = {};&#10; var statusBar = block.querySelector('.java-error-status-bar');&#10; if (statusBar) {&#10; statusBar.textContent = '';&#10; statusBar.style.visibility = 'hidden';&#10; }&#10; });&#10; }&#10; } catch(e){ console.log(e); resultDiv.textContent=t; }&#10; })&#10; .catch(function(error){&#10; clearInterval(execAnim);&#10; resultDiv.classList.remove('is-running');&#10; clearTimeout(timeoutId);&#10; if (error.name === 'AbortError') {&#10; resultDiv.textContent = 'Erreur : délai d’attente dépassé (30 secondes).';&#10; } else {&#10; resultDiv.textContent = 'Erreur lors de la requête : ' + error;&#10; }&#10; });&#10; };&#10; &#10; root.querySelectorAll('.export-file-block').forEach(function(block){&#10; var cm = block._cm;&#10; if (!cm) return;&#10; cm.on('mouseover', function(cm, event) {&#10; var pos = cm.coordsChar({ left: event.clientX, top: event.clientY });&#10; var line = pos.line, ch = pos.ch;&#10; var cursor = cm.getCursor();&#10; if (line === cursor.line &amp;&amp; block._javaErrorLines &amp;&amp; block._javaErrorLines[line]) {&#10; var msg = block._javaErrorLines[line];&#10; showTooltip(msg, event.clientX, event.clientY);&#10; }&#10; });&#10; cm.on('mouseout', function(cm, event) {&#10; hideTooltip();&#10; });&#10; });&#10; })();&lt;/script&gt;&#10; &lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;h3 id="moderne-1"&gt;&#10; Moderne&#10; &lt;a class="anchor" href="#moderne-1"&gt;#&lt;/a&gt;&#10;&lt;/h3&gt;&#10;&lt;div class="java-inline"&gt;&#10;&#10;&#10;&#10;&#10;&#10;&#10; &lt;div id="java-runner-1789748553937311882"&gt;&#10; &lt;link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.65.16/codemirror.min.css"&gt;&#10; &lt;link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.65.16/theme/eclipse.min.css"&gt;&#10; &lt;style&gt;&#10; #java-runner-1789748553937311882 .export-form textarea { width:100%; min-height:120px; font-family:monospace; border-radius:4px; border:1px solid #ccc; }&#10; #java-runner-1789748553937311882 .export-form { margin-bottom:0; }&#10; #java-runner-1789748553937311882 .export-result { background:#222; color:#eee; padding:12px; border-radius:6px; margin-top:16px; white-space:pre-wrap; font-family:monospace; }&#10; #java-runner-1789748553937311882 .export-result.is-running::after { content:''; animation: exportRunningDots 2s steps(1, end) infinite; }&#10; @keyframes exportRunningDots { 0% { content:''; } 25% { content:'.'; } 50% { content:'..'; } 75% { content:'...'; } }&#10; @media (prefers-reduced-motion: reduce) { #java-runner-1789748553937311882 .export-result.is-running::after { animation:none; content:'…'; } }&#10; #java-runner-1789748553937311882 .export-endpoint-info { color:#1976d2; font-size:0.98em; margin-top:8px; }&#10; #java-runner-1789748553937311882 .export-btn { background:#1976d2; color:#fff; border:none; border-radius:4px; padding:8px 16px; font-size:1em; cursor:pointer; margin-top:8px; }&#10; #java-runner-1789748553937311882 .export-file-block { max-width: 100%;flex:1 1 350px; background:#f9f9f9; border:1px solid #ddd; border-radius:6px; padding:12px; margin-bottom:8px; }&#10; #java-runner-1789748553937311882 .export-file-block .export-file-name { font-weight:bold; margin-bottom:4px; }&#10; .cm-java-error { background: #ffe0e0 !important; border-bottom: 2px dotted #c00; cursor: pointer; }&#10; .cm-java-error-line { background: #fff0f0 !important; }&#10; &lt;/style&gt;&#10; &lt;form class="export-form java-runner-1789748553937311882-form" style="margin-bottom:0;" aria-label="Exécuter le programme Java Main.java"&gt;&#10; &lt;input type="hidden" class="export-endpoint-var" value="https://flask-service-inf1220-java.90qakjuvfj4f8.ca-central-1.cs.amazonlightsail.com/run"&gt;&#10; &lt;div style="display:flex;gap:12px;flex-wrap:wrap;"&gt;&#10; &lt;div class='export-file-block'&gt;&lt;div class='export-file-name' id='java-runner-1789748553937311882-name'&gt;Main.java&lt;/div&gt;&lt;textarea aria-labelledby='java-runner-1789748553937311882-name'&gt;&#10;void main() {&#10; String name = &amp;#34;Marie&amp;#34;;&#10; int age = 37;&#10; String city = &amp;#34;Québec&amp;#34;;&#10; String message = &amp;#34;&amp;#34;&amp;#34;&#10; Bonjour, je m&amp;#39;appelle %s,&#10; j&amp;#39;ai %d ans&#10; et j&amp;#39;habite à %s.&#10; &amp;#34;&amp;#34;&amp;#34;.formatted(name, age, city);&#10; System.out.println(message);&#10;}&#10;&lt;/textarea&gt;&lt;/div&gt;&#10; &lt;/div&gt;&#10; &lt;button type="submit" class="export-btn java-runner-1789748553937311882-btn" style="background:#1976d2;color:#fff;border:none;border-radius:4px;padding:8px 16px;font-size:1em;cursor:pointer;margin-top:8px;"&gt;Exécuter&lt;/button&gt;&#10; &lt;/form&gt;&#10; &lt;div class="export-result" role="status" aria-live="polite" aria-atomic="true" aria-label="Résultat de l'exécution"&gt;&lt;/div&gt;&#10; &lt;div class="java-error-tooltip" style="display:none;position:absolute;z-index:1000;background:#fff0f0;color:#c00;border:1px solid #c00;padding:6px 12px;border-radius:6px;font-size:1em;box-shadow:0 2px 8px #0002;"&gt;&lt;/div&gt;&#10; &lt;script src="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.65.16/codemirror.min.js"&gt;&lt;/script&gt;&#10; &lt;script src="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.65.16/mode/clike/clike.min.js"&gt;&lt;/script&gt;&#10; &lt;script&gt;(function(){&#10; var root = document.getElementById('java-runner-1789748553937311882');&#10; if (!root) return;&#10; var form = root.querySelector('form');&#10; var resultDiv = root.querySelector('.export-result');&#10; var endpoint = form.querySelector('.export-endpoint-var').value;&#10; var tooltip = root.querySelector('.java-error-tooltip');&#10; &#10; root.querySelectorAll('.export-file-block').forEach(function(block){&#10; var name = block.querySelector('.export-file-name').textContent;&#10; var ta = block.querySelector('textarea');&#10; if(name.endsWith('.java')) {&#10; var cm = CodeMirror.fromTextArea(ta, {&#10; mode: "text/x-java",&#10; theme: "eclipse",&#10; lineNumbers: true,&#10; indentUnit: 4,&#10; tabSize: 4,&#10; &#10; &#10; extraKeys: {&#10; Tab: false,&#10; "Shift-Tab": false,&#10; Esc: function(c) { c.display.input.blur(); }&#10; }&#10; });&#10; (function(editor, fileName) {&#10; var label = "Éditeur de code Java : " + fileName;&#10; var wrapper = editor.getWrapperElement();&#10; wrapper.setAttribute('role', 'group');&#10; wrapper.setAttribute('aria-label', label);&#10; var field = editor.getInputField();&#10; if (field) { field.setAttribute('aria-label', label); }&#10; var scroll = wrapper.querySelector('.CodeMirror-scroll');&#10; if (scroll &amp;&amp; !scroll.hasAttribute('tabindex') &amp;&amp; !scroll.contains(field)) {&#10; scroll.setAttribute('tabindex', '0');&#10; scroll.setAttribute('role', 'region');&#10; scroll.setAttribute('aria-label', label);&#10; }&#10; })(cm, name);&#10; block._cm = cm;&#10; &#10; block._javaErrorLines = {};&#10; &#10; cm.on('cursorActivity', function() {&#10; var statusBar = block.querySelector('.java-error-status-bar');&#10; if (!statusBar) return;&#10; var cursor = cm.getCursor();&#10; var errMsg = block._javaErrorLines &amp;&amp; block._javaErrorLines[cursor.line];&#10; if (errMsg) {&#10; statusBar.textContent = 'Ligne ' + (cursor.line+1) + ' : ' + errMsg;&#10; statusBar.style.visibility = 'visible';&#10; } else {&#10; statusBar.textContent = '';&#10; statusBar.style.visibility = 'hidden';&#10; }&#10; });&#10; }&#10; &#10; if(name.endsWith('.java')) {&#10; if (!block.querySelector('.java-error-status-bar')) {&#10; var statusBar = document.createElement('div');&#10; statusBar.className = 'java-error-status-bar';&#10; statusBar.setAttribute('role', 'status');&#10; statusBar.setAttribute('aria-live', 'polite');&#10; statusBar.style.marginTop = '4px';&#10; statusBar.style.fontSize = '0.95em';&#10; statusBar.style.color = '#c00';&#10; statusBar.style.minHeight = '1.2em';&#10; statusBar.style.visibility = 'hidden';&#10; block.appendChild(statusBar);&#10; }&#10; }&#10; });&#10; &#10; function showTooltip(msg, x, y) {&#10; tooltip.textContent = msg;&#10; tooltip.style.display = 'block';&#10; tooltip.style.left = (x+10) + 'px';&#10; tooltip.style.top = (y+10) + 'px';&#10; }&#10; function hideTooltip() {&#10; tooltip.style.display = 'none';&#10; }&#10; &#10; function escapeHtml(str) {&#10; if (str == null) return '';&#10; return String(str)&#10; .replace(/&amp;/g, '&amp;amp;')&#10; .replace(/&lt;/g, '&amp;lt;')&#10; .replace(/&gt;/g, '&amp;gt;')&#10; .replace(/"/g, '&amp;quot;')&#10; .replace(/'/g, '&amp;#39;');&#10; }&#10; form.onsubmit = function(e){&#10; e.preventDefault();&#10; var java_files = [], txt_files = [];&#10; root.querySelectorAll('.export-file-block').forEach(function(block){&#10; var name = block.querySelector('.export-file-name').textContent;&#10; var ta = block.querySelector('textarea');&#10; var content = block._cm ? block._cm.getValue() : ta.value;&#10; if(name.endsWith('.java')) java_files.push({name: name, content: content});&#10; else txt_files.push({name: name, content: content});&#10; });&#10; &#10; resultDiv.textContent = 'Exécution en cours';&#10; resultDiv.classList.add('is-running');&#10; var execAnim = null;&#10; &#10; var controller = new AbortController();&#10; var timeoutId = setTimeout(function() { controller.abort(); }, 30000); &#10; fetch(endpoint, {&#10; method: 'POST',&#10; headers: { 'Content-Type': 'application/json' },&#10; body: JSON.stringify({ java_files: java_files, txt_files: txt_files }),&#10; signal: controller.signal&#10; })&#10; .then(function(r){&#10; clearInterval(execAnim);&#10; resultDiv.classList.remove('is-running');&#10; clearTimeout(timeoutId);&#10; if (!r.ok &amp;&amp; r.status !== 400 &amp;&amp; r.status !== 500) {&#10; throw new Error('Erreur HTTP ' + r.status + ' : ' + r.statusText);&#10; }&#10; return r.text();&#10; })&#10; .then(function(t){&#10; try {&#10; var j=JSON.parse(t);&#10; &#10; if(j.status==='ran_successfully') {&#10; resultDiv.innerHTML='&lt;pre style="color:#222;background:#e0ffe0;padding:12px;border-radius:6px;"&gt;'+escapeHtml(j.output||'').replace(/\n/g,'&lt;br&gt;')+escapeHtml(j.stderr||'')+'&lt;/pre&gt;';&#10; } else if(j.status==='compiling') {&#10; resultDiv.innerHTML='&lt;pre style="color:#c00;background:#ffe0e0;padding:12px;border-radius:6px;"&gt;'+escapeHtml(j.error||'').replace(/\n/g,'&lt;br&gt;')+escapeHtml(j.stderr||'')+'&lt;/pre&gt;';&#10; } else if(j.status==='runtime_error' || j.status==='error') {&#10; resultDiv.innerHTML=(j.output?'&lt;pre style="color:#222;background:#e0ffe0;padding:12px;border-radius:6px;"&gt;'+escapeHtml(j.output).replace(/\n/g,'&lt;br&gt;')+'&lt;/pre&gt;':'')+'&lt;pre style="color:#c00;background:#ffe0e0;padding:12px;border-radius:6px;"&gt;'+escapeHtml(j.stderr||j.error||'').replace(/\n/g,'&lt;br&gt;')+'&lt;/pre&gt;';&#10; } else {&#10; resultDiv.textContent = t;&#10; }&#10; &#10; if(j.status==='compiling') {&#10; var errorText = j.error || '';&#10; var errorRegex = new RegExp('([\\w./\\-]+\\.java):(\\d+): error: ([^\\n]+)([\\s\\S]*?)(?=\\n[\\w./\\-]+\\.java:|$)','g');&#10; var match;&#10; root.querySelectorAll('.export-file-block').forEach(function(block){&#10; if (block._cm) {&#10; block._cm.operation(function() {&#10; var marks = block._cm.getAllMarks();&#10; for (var i = 0; i &lt; marks.length; i++) { marks[i].clear(); }&#10; });&#10; }&#10; &#10; block._javaErrorLines = {};&#10; var statusBar = block.querySelector('.java-error-status-bar');&#10; if (statusBar) {&#10; statusBar.textContent = '';&#10; statusBar.style.visibility = 'hidden';&#10; }&#10; });&#10; while ((match = errorRegex.exec(errorText)) !== null) {&#10; var file = match[1], lineStr = match[2], msg = match[3], details = match[4];&#10; var line = parseInt(lineStr, 10) - 1;&#10; var errorMsg = (msg + (details ? details.replace(/\s+/g, ' ') : '')).trim();&#10; root.querySelectorAll('.export-file-block').forEach(function(block){&#10; var nameInput = block.querySelector('.export-file-name');&#10; if (nameInput &amp;&amp; (nameInput.textContent.trim() === file || nameInput.textContent.trim().endsWith('/'+file) || nameInput.textContent.trim().endsWith('\\'+file))) {&#10; if (block._cm) {&#10; block._cm.operation(function() {&#10; block._cm.markText({line:line, ch:0}, {line:line+1, ch:0}, {&#10; className: 'cm-java-error',&#10; title: errorMsg&#10; });&#10; });&#10; }&#10; &#10; if (!block._javaErrorLines) { block._javaErrorLines = {}; }&#10; block._javaErrorLines[line] = errorMsg;&#10; }&#10; });&#10; }&#10; &#10; root.querySelectorAll('.export-file-block').forEach(function(block){&#10; if (block._cm &amp;&amp; block._cm.getOption('lineNumbers')) {&#10; &#10; var statusBar = block.querySelector('.java-error-status-bar');&#10; if (statusBar) {&#10; var cursor = block._cm.getCursor();&#10; var errMsg = block._javaErrorLines &amp;&amp; block._javaErrorLines[cursor.line];&#10; if (errMsg) {&#10; statusBar.textContent = 'Ligne ' + (cursor.line+1) + ' : ' + errMsg;&#10; statusBar.style.visibility = 'visible';&#10; } else {&#10; statusBar.textContent = '';&#10; statusBar.style.visibility = 'hidden';&#10; }&#10; }&#10; }&#10; });&#10; } else if (j.status==='error' || j.status==='runtime_error') {&#10; var rtText = j.stderr || j.error || '';&#10; var rtCauses = rtText.split('\n').filter(function(l){ return /Caused by:/.test(l); });&#10; var rtMsg = (rtCauses.length&#10; ? rtCauses[rtCauses.length-1].replace(/^.*Caused by:\s*/, '')&#10; : (rtText.split('\n')[0] || 'Erreur d’exécution')).trim();&#10; root.querySelectorAll('.export-file-block').forEach(function(block){&#10; if (block._cm) {&#10; block._cm.operation(function(){&#10; block._cm.getAllMarks().forEach(function(m){ m.clear(); });&#10; });&#10; }&#10; block._javaErrorLines = {};&#10; var sb = block.querySelector('.java-error-status-bar');&#10; if (sb) { sb.textContent = ''; sb.style.visibility = 'hidden'; }&#10; });&#10; var rtRegex = /\(([\w$-]+\.java):(\d+)\)/g;&#10; var rtSeen = {}, rtMatch;&#10; while ((rtMatch = rtRegex.exec(rtText)) !== null) {&#10; var rtFile = rtMatch[1], rtLine = parseInt(rtMatch[2], 10) - 1;&#10; if (rtLine &lt; 0 || rtSeen[rtFile + ':' + rtLine]) { continue; }&#10; rtSeen[rtFile + ':' + rtLine] = true;&#10; root.querySelectorAll('.export-file-block').forEach(function(block){&#10; var nameEl = block.querySelector('.export-file-name');&#10; var nm = nameEl ? nameEl.textContent.trim() : '';&#10; if (block._cm &amp;&amp; rtLine &lt; block._cm.lineCount() &amp;&amp;&#10; (nm === rtFile || nm.endsWith('/'+rtFile) || nm.endsWith('\\'+rtFile))) {&#10; block._cm.operation(function(){&#10; block._cm.markText({line:rtLine, ch:0}, {line:rtLine+1, ch:0}, {&#10; className: 'cm-java-error', title: rtMsg&#10; });&#10; });&#10; if (!block._javaErrorLines) { block._javaErrorLines = {}; }&#10; block._javaErrorLines[rtLine] = rtMsg;&#10; }&#10; });&#10; }&#10; } else {&#10; &#10; root.querySelectorAll('.export-file-block').forEach(function(block){&#10; if (block._cm) {&#10; block._cm.operation(function() {&#10; var marks = block._cm.getAllMarks();&#10; for (var i = 0; i &lt; marks.length; i++) { marks[i].clear(); }&#10; });&#10; }&#10; block._javaErrorLines = {};&#10; var statusBar = block.querySelector('.java-error-status-bar');&#10; if (statusBar) {&#10; statusBar.textContent = '';&#10; statusBar.style.visibility = 'hidden';&#10; }&#10; });&#10; }&#10; } catch(e){ console.log(e); resultDiv.textContent=t; }&#10; })&#10; .catch(function(error){&#10; clearInterval(execAnim);&#10; resultDiv.classList.remove('is-running');&#10; clearTimeout(timeoutId);&#10; if (error.name === 'AbortError') {&#10; resultDiv.textContent = 'Erreur : délai d’attente dépassé (30 secondes).';&#10; } else {&#10; resultDiv.textContent = 'Erreur lors de la requête : ' + error;&#10; }&#10; });&#10; };&#10; &#10; root.querySelectorAll('.export-file-block').forEach(function(block){&#10; var cm = block._cm;&#10; if (!cm) return;&#10; cm.on('mouseover', function(cm, event) {&#10; var pos = cm.coordsChar({ left: event.clientX, top: event.clientY });&#10; var line = pos.line, ch = pos.ch;&#10; var cursor = cm.getCursor();&#10; if (line === cursor.line &amp;&amp; block._javaErrorLines &amp;&amp; block._javaErrorLines[line]) {&#10; var msg = block._javaErrorLines[line];&#10; showTooltip(msg, event.clientX, event.clientY);&#10; }&#10; });&#10; cm.on('mouseout', function(cm, event) {&#10; hideTooltip();&#10; });&#10; });&#10; })();&lt;/script&gt;&#10; &lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;h2 id="exemple-3"&gt;&#10; Exemple 3&#10; &lt;a class="anchor" href="#exemple-3"&gt;#&lt;/a&gt;&#10;&lt;/h2&gt;&#10;&lt;h3 id="conventionnel-1"&gt;&#10; Conventionnel&#10; &lt;a class="anchor" href="#conventionnel-1"&gt;#&lt;/a&gt;&#10;&lt;/h3&gt;&#10;&lt;div class="java-inline"&gt;&#10;&#10;&#10;&#10;&#10;&#10;&#10; &lt;div id="java-runner-1789748553937353697"&gt;&#10; &lt;link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.65.16/codemirror.min.css"&gt;&#10; &lt;link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.65.16/theme/eclipse.min.css"&gt;&#10; &lt;style&gt;&#10; #java-runner-1789748553937353697 .export-form textarea { width:100%; min-height:120px; font-family:monospace; border-radius:4px; border:1px solid #ccc; }&#10; #java-runner-1789748553937353697 .export-form { margin-bottom:0; }&#10; #java-runner-1789748553937353697 .export-result { background:#222; color:#eee; padding:12px; border-radius:6px; margin-top:16px; white-space:pre-wrap; font-family:monospace; }&#10; #java-runner-1789748553937353697 .export-result.is-running::after { content:''; animation: exportRunningDots 2s steps(1, end) infinite; }&#10; @keyframes exportRunningDots { 0% { content:''; } 25% { content:'.'; } 50% { content:'..'; } 75% { content:'...'; } }&#10; @media (prefers-reduced-motion: reduce) { #java-runner-1789748553937353697 .export-result.is-running::after { animation:none; content:'…'; } }&#10; #java-runner-1789748553937353697 .export-endpoint-info { color:#1976d2; font-size:0.98em; margin-top:8px; }&#10; #java-runner-1789748553937353697 .export-btn { background:#1976d2; color:#fff; border:none; border-radius:4px; padding:8px 16px; font-size:1em; cursor:pointer; margin-top:8px; }&#10; #java-runner-1789748553937353697 .export-file-block { max-width: 100%;flex:1 1 350px; background:#f9f9f9; border:1px solid #ddd; border-radius:6px; padding:12px; margin-bottom:8px; }&#10; #java-runner-1789748553937353697 .export-file-block .export-file-name { font-weight:bold; margin-bottom:4px; }&#10; .cm-java-error { background: #ffe0e0 !important; border-bottom: 2px dotted #c00; cursor: pointer; }&#10; .cm-java-error-line { background: #fff0f0 !important; }&#10; &lt;/style&gt;&#10; &lt;form class="export-form java-runner-1789748553937353697-form" style="margin-bottom:0;" aria-label="Exécuter le programme Java Main.java"&gt;&#10; &lt;input type="hidden" class="export-endpoint-var" value="https://flask-service-inf1220-java.90qakjuvfj4f8.ca-central-1.cs.amazonlightsail.com/run"&gt;&#10; &lt;div style="display:flex;gap:12px;flex-wrap:wrap;"&gt;&#10; &lt;div class='export-file-block'&gt;&lt;div class='export-file-name' id='java-runner-1789748553937353697-name'&gt;Main.java&lt;/div&gt;&lt;textarea aria-labelledby='java-runner-1789748553937353697-name'&gt;&#10;public class Main {&#10; public static void main(String[] args) {&#10; int jour = 3; // 1 = lundi, 2 = mardi, ..., 7 = dimanche&#10; String type;&#10; switch (jour) {&#10; case 1:&#10; case 2:&#10; case 3:&#10; case 4:&#10; case 5:&#10; type = &amp;#34;Jour de semaine&amp;#34;;&#10; break;&#10; case 6:&#10; case 7:&#10; type = &amp;#34;Fin de semaine&amp;#34;;&#10; break;&#10; default:&#10; type = &amp;#34;Jour invalide&amp;#34;;&#10; break;&#10; }&#10; System.out.println(type);&#10; }&#10;}&#10;&lt;/textarea&gt;&lt;/div&gt;&#10; &lt;/div&gt;&#10; &lt;button type="submit" class="export-btn java-runner-1789748553937353697-btn" style="background:#1976d2;color:#fff;border:none;border-radius:4px;padding:8px 16px;font-size:1em;cursor:pointer;margin-top:8px;"&gt;Exécuter&lt;/button&gt;&#10; &lt;/form&gt;&#10; &lt;div class="export-result" role="status" aria-live="polite" aria-atomic="true" aria-label="Résultat de l'exécution"&gt;&lt;/div&gt;&#10; &lt;div class="java-error-tooltip" style="display:none;position:absolute;z-index:1000;background:#fff0f0;color:#c00;border:1px solid #c00;padding:6px 12px;border-radius:6px;font-size:1em;box-shadow:0 2px 8px #0002;"&gt;&lt;/div&gt;&#10; &lt;script src="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.65.16/codemirror.min.js"&gt;&lt;/script&gt;&#10; &lt;script src="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.65.16/mode/clike/clike.min.js"&gt;&lt;/script&gt;&#10; &lt;script&gt;(function(){&#10; var root = document.getElementById('java-runner-1789748553937353697');&#10; if (!root) return;&#10; var form = root.querySelector('form');&#10; var resultDiv = root.querySelector('.export-result');&#10; var endpoint = form.querySelector('.export-endpoint-var').value;&#10; var tooltip = root.querySelector('.java-error-tooltip');&#10; &#10; root.querySelectorAll('.export-file-block').forEach(function(block){&#10; var name = block.querySelector('.export-file-name').textContent;&#10; var ta = block.querySelector('textarea');&#10; if(name.endsWith('.java')) {&#10; var cm = CodeMirror.fromTextArea(ta, {&#10; mode: "text/x-java",&#10; theme: "eclipse",&#10; lineNumbers: true,&#10; indentUnit: 4,&#10; tabSize: 4,&#10; &#10; &#10; extraKeys: {&#10; Tab: false,&#10; "Shift-Tab": false,&#10; Esc: function(c) { c.display.input.blur(); }&#10; }&#10; });&#10; (function(editor, fileName) {&#10; var label = "Éditeur de code Java : " + fileName;&#10; var wrapper = editor.getWrapperElement();&#10; wrapper.setAttribute('role', 'group');&#10; wrapper.setAttribute('aria-label', label);&#10; var field = editor.getInputField();&#10; if (field) { field.setAttribute('aria-label', label); }&#10; var scroll = wrapper.querySelector('.CodeMirror-scroll');&#10; if (scroll &amp;&amp; !scroll.hasAttribute('tabindex') &amp;&amp; !scroll.contains(field)) {&#10; scroll.setAttribute('tabindex', '0');&#10; scroll.setAttribute('role', 'region');&#10; scroll.setAttribute('aria-label', label);&#10; }&#10; })(cm, name);&#10; block._cm = cm;&#10; &#10; block._javaErrorLines = {};&#10; &#10; cm.on('cursorActivity', function() {&#10; var statusBar = block.querySelector('.java-error-status-bar');&#10; if (!statusBar) return;&#10; var cursor = cm.getCursor();&#10; var errMsg = block._javaErrorLines &amp;&amp; block._javaErrorLines[cursor.line];&#10; if (errMsg) {&#10; statusBar.textContent = 'Ligne ' + (cursor.line+1) + ' : ' + errMsg;&#10; statusBar.style.visibility = 'visible';&#10; } else {&#10; statusBar.textContent = '';&#10; statusBar.style.visibility = 'hidden';&#10; }&#10; });&#10; }&#10; &#10; if(name.endsWith('.java')) {&#10; if (!block.querySelector('.java-error-status-bar')) {&#10; var statusBar = document.createElement('div');&#10; statusBar.className = 'java-error-status-bar';&#10; statusBar.setAttribute('role', 'status');&#10; statusBar.setAttribute('aria-live', 'polite');&#10; statusBar.style.marginTop = '4px';&#10; statusBar.style.fontSize = '0.95em';&#10; statusBar.style.color = '#c00';&#10; statusBar.style.minHeight = '1.2em';&#10; statusBar.style.visibility = 'hidden';&#10; block.appendChild(statusBar);&#10; }&#10; }&#10; });&#10; &#10; function showTooltip(msg, x, y) {&#10; tooltip.textContent = msg;&#10; tooltip.style.display = 'block';&#10; tooltip.style.left = (x+10) + 'px';&#10; tooltip.style.top = (y+10) + 'px';&#10; }&#10; function hideTooltip() {&#10; tooltip.style.display = 'none';&#10; }&#10; &#10; function escapeHtml(str) {&#10; if (str == null) return '';&#10; return String(str)&#10; .replace(/&amp;/g, '&amp;amp;')&#10; .replace(/&lt;/g, '&amp;lt;')&#10; .replace(/&gt;/g, '&amp;gt;')&#10; .replace(/"/g, '&amp;quot;')&#10; .replace(/'/g, '&amp;#39;');&#10; }&#10; form.onsubmit = function(e){&#10; e.preventDefault();&#10; var java_files = [], txt_files = [];&#10; root.querySelectorAll('.export-file-block').forEach(function(block){&#10; var name = block.querySelector('.export-file-name').textContent;&#10; var ta = block.querySelector('textarea');&#10; var content = block._cm ? block._cm.getValue() : ta.value;&#10; if(name.endsWith('.java')) java_files.push({name: name, content: content});&#10; else txt_files.push({name: name, content: content});&#10; });&#10; &#10; resultDiv.textContent = 'Exécution en cours';&#10; resultDiv.classList.add('is-running');&#10; var execAnim = null;&#10; &#10; var controller = new AbortController();&#10; var timeoutId = setTimeout(function() { controller.abort(); }, 30000); &#10; fetch(endpoint, {&#10; method: 'POST',&#10; headers: { 'Content-Type': 'application/json' },&#10; body: JSON.stringify({ java_files: java_files, txt_files: txt_files }),&#10; signal: controller.signal&#10; })&#10; .then(function(r){&#10; clearInterval(execAnim);&#10; resultDiv.classList.remove('is-running');&#10; clearTimeout(timeoutId);&#10; if (!r.ok &amp;&amp; r.status !== 400 &amp;&amp; r.status !== 500) {&#10; throw new Error('Erreur HTTP ' + r.status + ' : ' + r.statusText);&#10; }&#10; return r.text();&#10; })&#10; .then(function(t){&#10; try {&#10; var j=JSON.parse(t);&#10; &#10; if(j.status==='ran_successfully') {&#10; resultDiv.innerHTML='&lt;pre style="color:#222;background:#e0ffe0;padding:12px;border-radius:6px;"&gt;'+escapeHtml(j.output||'').replace(/\n/g,'&lt;br&gt;')+escapeHtml(j.stderr||'')+'&lt;/pre&gt;';&#10; } else if(j.status==='compiling') {&#10; resultDiv.innerHTML='&lt;pre style="color:#c00;background:#ffe0e0;padding:12px;border-radius:6px;"&gt;'+escapeHtml(j.error||'').replace(/\n/g,'&lt;br&gt;')+escapeHtml(j.stderr||'')+'&lt;/pre&gt;';&#10; } else if(j.status==='runtime_error' || j.status==='error') {&#10; resultDiv.innerHTML=(j.output?'&lt;pre style="color:#222;background:#e0ffe0;padding:12px;border-radius:6px;"&gt;'+escapeHtml(j.output).replace(/\n/g,'&lt;br&gt;')+'&lt;/pre&gt;':'')+'&lt;pre style="color:#c00;background:#ffe0e0;padding:12px;border-radius:6px;"&gt;'+escapeHtml(j.stderr||j.error||'').replace(/\n/g,'&lt;br&gt;')+'&lt;/pre&gt;';&#10; } else {&#10; resultDiv.textContent = t;&#10; }&#10; &#10; if(j.status==='compiling') {&#10; var errorText = j.error || '';&#10; var errorRegex = new RegExp('([\\w./\\-]+\\.java):(\\d+): error: ([^\\n]+)([\\s\\S]*?)(?=\\n[\\w./\\-]+\\.java:|$)','g');&#10; var match;&#10; root.querySelectorAll('.export-file-block').forEach(function(block){&#10; if (block._cm) {&#10; block._cm.operation(function() {&#10; var marks = block._cm.getAllMarks();&#10; for (var i = 0; i &lt; marks.length; i++) { marks[i].clear(); }&#10; });&#10; }&#10; &#10; block._javaErrorLines = {};&#10; var statusBar = block.querySelector('.java-error-status-bar');&#10; if (statusBar) {&#10; statusBar.textContent = '';&#10; statusBar.style.visibility = 'hidden';&#10; }&#10; });&#10; while ((match = errorRegex.exec(errorText)) !== null) {&#10; var file = match[1], lineStr = match[2], msg = match[3], details = match[4];&#10; var line = parseInt(lineStr, 10) - 1;&#10; var errorMsg = (msg + (details ? details.replace(/\s+/g, ' ') : '')).trim();&#10; root.querySelectorAll('.export-file-block').forEach(function(block){&#10; var nameInput = block.querySelector('.export-file-name');&#10; if (nameInput &amp;&amp; (nameInput.textContent.trim() === file || nameInput.textContent.trim().endsWith('/'+file) || nameInput.textContent.trim().endsWith('\\'+file))) {&#10; if (block._cm) {&#10; block._cm.operation(function() {&#10; block._cm.markText({line:line, ch:0}, {line:line+1, ch:0}, {&#10; className: 'cm-java-error',&#10; title: errorMsg&#10; });&#10; });&#10; }&#10; &#10; if (!block._javaErrorLines) { block._javaErrorLines = {}; }&#10; block._javaErrorLines[line] = errorMsg;&#10; }&#10; });&#10; }&#10; &#10; root.querySelectorAll('.export-file-block').forEach(function(block){&#10; if (block._cm &amp;&amp; block._cm.getOption('lineNumbers')) {&#10; &#10; var statusBar = block.querySelector('.java-error-status-bar');&#10; if (statusBar) {&#10; var cursor = block._cm.getCursor();&#10; var errMsg = block._javaErrorLines &amp;&amp; block._javaErrorLines[cursor.line];&#10; if (errMsg) {&#10; statusBar.textContent = 'Ligne ' + (cursor.line+1) + ' : ' + errMsg;&#10; statusBar.style.visibility = 'visible';&#10; } else {&#10; statusBar.textContent = '';&#10; statusBar.style.visibility = 'hidden';&#10; }&#10; }&#10; }&#10; });&#10; } else if (j.status==='error' || j.status==='runtime_error') {&#10; var rtText = j.stderr || j.error || '';&#10; var rtCauses = rtText.split('\n').filter(function(l){ return /Caused by:/.test(l); });&#10; var rtMsg = (rtCauses.length&#10; ? rtCauses[rtCauses.length-1].replace(/^.*Caused by:\s*/, '')&#10; : (rtText.split('\n')[0] || 'Erreur d’exécution')).trim();&#10; root.querySelectorAll('.export-file-block').forEach(function(block){&#10; if (block._cm) {&#10; block._cm.operation(function(){&#10; block._cm.getAllMarks().forEach(function(m){ m.clear(); });&#10; });&#10; }&#10; block._javaErrorLines = {};&#10; var sb = block.querySelector('.java-error-status-bar');&#10; if (sb) { sb.textContent = ''; sb.style.visibility = 'hidden'; }&#10; });&#10; var rtRegex = /\(([\w$-]+\.java):(\d+)\)/g;&#10; var rtSeen = {}, rtMatch;&#10; while ((rtMatch = rtRegex.exec(rtText)) !== null) {&#10; var rtFile = rtMatch[1], rtLine = parseInt(rtMatch[2], 10) - 1;&#10; if (rtLine &lt; 0 || rtSeen[rtFile + ':' + rtLine]) { continue; }&#10; rtSeen[rtFile + ':' + rtLine] = true;&#10; root.querySelectorAll('.export-file-block').forEach(function(block){&#10; var nameEl = block.querySelector('.export-file-name');&#10; var nm = nameEl ? nameEl.textContent.trim() : '';&#10; if (block._cm &amp;&amp; rtLine &lt; block._cm.lineCount() &amp;&amp;&#10; (nm === rtFile || nm.endsWith('/'+rtFile) || nm.endsWith('\\'+rtFile))) {&#10; block._cm.operation(function(){&#10; block._cm.markText({line:rtLine, ch:0}, {line:rtLine+1, ch:0}, {&#10; className: 'cm-java-error', title: rtMsg&#10; });&#10; });&#10; if (!block._javaErrorLines) { block._javaErrorLines = {}; }&#10; block._javaErrorLines[rtLine] = rtMsg;&#10; }&#10; });&#10; }&#10; } else {&#10; &#10; root.querySelectorAll('.export-file-block').forEach(function(block){&#10; if (block._cm) {&#10; block._cm.operation(function() {&#10; var marks = block._cm.getAllMarks();&#10; for (var i = 0; i &lt; marks.length; i++) { marks[i].clear(); }&#10; });&#10; }&#10; block._javaErrorLines = {};&#10; var statusBar = block.querySelector('.java-error-status-bar');&#10; if (statusBar) {&#10; statusBar.textContent = '';&#10; statusBar.style.visibility = 'hidden';&#10; }&#10; });&#10; }&#10; } catch(e){ console.log(e); resultDiv.textContent=t; }&#10; })&#10; .catch(function(error){&#10; clearInterval(execAnim);&#10; resultDiv.classList.remove('is-running');&#10; clearTimeout(timeoutId);&#10; if (error.name === 'AbortError') {&#10; resultDiv.textContent = 'Erreur : délai d’attente dépassé (30 secondes).';&#10; } else {&#10; resultDiv.textContent = 'Erreur lors de la requête : ' + error;&#10; }&#10; });&#10; };&#10; &#10; root.querySelectorAll('.export-file-block').forEach(function(block){&#10; var cm = block._cm;&#10; if (!cm) return;&#10; cm.on('mouseover', function(cm, event) {&#10; var pos = cm.coordsChar({ left: event.clientX, top: event.clientY });&#10; var line = pos.line, ch = pos.ch;&#10; var cursor = cm.getCursor();&#10; if (line === cursor.line &amp;&amp; block._javaErrorLines &amp;&amp; block._javaErrorLines[line]) {&#10; var msg = block._javaErrorLines[line];&#10; showTooltip(msg, event.clientX, event.clientY);&#10; }&#10; });&#10; cm.on('mouseout', function(cm, event) {&#10; hideTooltip();&#10; });&#10; });&#10; })();&lt;/script&gt;&#10; &lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;h3 id="moderne-2"&gt;&#10; Moderne&#10; &lt;a class="anchor" href="#moderne-2"&gt;#&lt;/a&gt;&#10;&lt;/h3&gt;&#10;&lt;div class="java-inline"&gt;&#10;&#10;&#10;&#10;&#10;&#10;&#10; &lt;div id="java-runner-1789748553937386888"&gt;&#10; &lt;link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.65.16/codemirror.min.css"&gt;&#10; &lt;link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.65.16/theme/eclipse.min.css"&gt;&#10; &lt;style&gt;&#10; #java-runner-1789748553937386888 .export-form textarea { width:100%; min-height:120px; font-family:monospace; border-radius:4px; border:1px solid #ccc; }&#10; #java-runner-1789748553937386888 .export-form { margin-bottom:0; }&#10; #java-runner-1789748553937386888 .export-result { background:#222; color:#eee; padding:12px; border-radius:6px; margin-top:16px; white-space:pre-wrap; font-family:monospace; }&#10; #java-runner-1789748553937386888 .export-result.is-running::after { content:''; animation: exportRunningDots 2s steps(1, end) infinite; }&#10; @keyframes exportRunningDots { 0% { content:''; } 25% { content:'.'; } 50% { content:'..'; } 75% { content:'...'; } }&#10; @media (prefers-reduced-motion: reduce) { #java-runner-1789748553937386888 .export-result.is-running::after { animation:none; content:'…'; } }&#10; #java-runner-1789748553937386888 .export-endpoint-info { color:#1976d2; font-size:0.98em; margin-top:8px; }&#10; #java-runner-1789748553937386888 .export-btn { background:#1976d2; color:#fff; border:none; border-radius:4px; padding:8px 16px; font-size:1em; cursor:pointer; margin-top:8px; }&#10; #java-runner-1789748553937386888 .export-file-block { max-width: 100%;flex:1 1 350px; background:#f9f9f9; border:1px solid #ddd; border-radius:6px; padding:12px; margin-bottom:8px; }&#10; #java-runner-1789748553937386888 .export-file-block .export-file-name { font-weight:bold; margin-bottom:4px; }&#10; .cm-java-error { background: #ffe0e0 !important; border-bottom: 2px dotted #c00; cursor: pointer; }&#10; .cm-java-error-line { background: #fff0f0 !important; }&#10; &lt;/style&gt;&#10; &lt;form class="export-form java-runner-1789748553937386888-form" style="margin-bottom:0;" aria-label="Exécuter le programme Java Main.java"&gt;&#10; &lt;input type="hidden" class="export-endpoint-var" value="https://flask-service-inf1220-java.90qakjuvfj4f8.ca-central-1.cs.amazonlightsail.com/run"&gt;&#10; &lt;div style="display:flex;gap:12px;flex-wrap:wrap;"&gt;&#10; &lt;div class='export-file-block'&gt;&lt;div class='export-file-name' id='java-runner-1789748553937386888-name'&gt;Main.java&lt;/div&gt;&lt;textarea aria-labelledby='java-runner-1789748553937386888-name'&gt;&#10;void main() {&#10; int jour = 3;&#10; String type = switch (jour) {&#10; case 1, 2, 3, 4, 5 -&amp;gt; &amp;#34;Jour de semaine&amp;#34;;&#10; case 6, 7 -&amp;gt; &amp;#34;Fin de semaine&amp;#34;;&#10; default -&amp;gt; &amp;#34;Jour invalide&amp;#34;;&#10; };&#10; System.out.println(type);&#10;}&#10;&lt;/textarea&gt;&lt;/div&gt;&#10; &lt;/div&gt;&#10; &lt;button type="submit" class="export-btn java-runner-1789748553937386888-btn" style="background:#1976d2;color:#fff;border:none;border-radius:4px;padding:8px 16px;font-size:1em;cursor:pointer;margin-top:8px;"&gt;Exécuter&lt;/button&gt;&#10; &lt;/form&gt;&#10; &lt;div class="export-result" role="status" aria-live="polite" aria-atomic="true" aria-label="Résultat de l'exécution"&gt;&lt;/div&gt;&#10; &lt;div class="java-error-tooltip" style="display:none;position:absolute;z-index:1000;background:#fff0f0;color:#c00;border:1px solid #c00;padding:6px 12px;border-radius:6px;font-size:1em;box-shadow:0 2px 8px #0002;"&gt;&lt;/div&gt;&#10; &lt;script src="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.65.16/codemirror.min.js"&gt;&lt;/script&gt;&#10; &lt;script src="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.65.16/mode/clike/clike.min.js"&gt;&lt;/script&gt;&#10; &lt;script&gt;(function(){&#10; var root = document.getElementById('java-runner-1789748553937386888');&#10; if (!root) return;&#10; var form = root.querySelector('form');&#10; var resultDiv = root.querySelector('.export-result');&#10; var endpoint = form.querySelector('.export-endpoint-var').value;&#10; var tooltip = root.querySelector('.java-error-tooltip');&#10; &#10; root.querySelectorAll('.export-file-block').forEach(function(block){&#10; var name = block.querySelector('.export-file-name').textContent;&#10; var ta = block.querySelector('textarea');&#10; if(name.endsWith('.java')) {&#10; var cm = CodeMirror.fromTextArea(ta, {&#10; mode: "text/x-java",&#10; theme: "eclipse",&#10; lineNumbers: true,&#10; indentUnit: 4,&#10; tabSize: 4,&#10; &#10; &#10; extraKeys: {&#10; Tab: false,&#10; "Shift-Tab": false,&#10; Esc: function(c) { c.display.input.blur(); }&#10; }&#10; });&#10; (function(editor, fileName) {&#10; var label = "Éditeur de code Java : " + fileName;&#10; var wrapper = editor.getWrapperElement();&#10; wrapper.setAttribute('role', 'group');&#10; wrapper.setAttribute('aria-label', label);&#10; var field = editor.getInputField();&#10; if (field) { field.setAttribute('aria-label', label); }&#10; var scroll = wrapper.querySelector('.CodeMirror-scroll');&#10; if (scroll &amp;&amp; !scroll.hasAttribute('tabindex') &amp;&amp; !scroll.contains(field)) {&#10; scroll.setAttribute('tabindex', '0');&#10; scroll.setAttribute('role', 'region');&#10; scroll.setAttribute('aria-label', label);&#10; }&#10; })(cm, name);&#10; block._cm = cm;&#10; &#10; block._javaErrorLines = {};&#10; &#10; cm.on('cursorActivity', function() {&#10; var statusBar = block.querySelector('.java-error-status-bar');&#10; if (!statusBar) return;&#10; var cursor = cm.getCursor();&#10; var errMsg = block._javaErrorLines &amp;&amp; block._javaErrorLines[cursor.line];&#10; if (errMsg) {&#10; statusBar.textContent = 'Ligne ' + (cursor.line+1) + ' : ' + errMsg;&#10; statusBar.style.visibility = 'visible';&#10; } else {&#10; statusBar.textContent = '';&#10; statusBar.style.visibility = 'hidden';&#10; }&#10; });&#10; }&#10; &#10; if(name.endsWith('.java')) {&#10; if (!block.querySelector('.java-error-status-bar')) {&#10; var statusBar = document.createElement('div');&#10; statusBar.className = 'java-error-status-bar';&#10; statusBar.setAttribute('role', 'status');&#10; statusBar.setAttribute('aria-live', 'polite');&#10; statusBar.style.marginTop = '4px';&#10; statusBar.style.fontSize = '0.95em';&#10; statusBar.style.color = '#c00';&#10; statusBar.style.minHeight = '1.2em';&#10; statusBar.style.visibility = 'hidden';&#10; block.appendChild(statusBar);&#10; }&#10; }&#10; });&#10; &#10; function showTooltip(msg, x, y) {&#10; tooltip.textContent = msg;&#10; tooltip.style.display = 'block';&#10; tooltip.style.left = (x+10) + 'px';&#10; tooltip.style.top = (y+10) + 'px';&#10; }&#10; function hideTooltip() {&#10; tooltip.style.display = 'none';&#10; }&#10; &#10; function escapeHtml(str) {&#10; if (str == null) return '';&#10; return String(str)&#10; .replace(/&amp;/g, '&amp;amp;')&#10; .replace(/&lt;/g, '&amp;lt;')&#10; .replace(/&gt;/g, '&amp;gt;')&#10; .replace(/"/g, '&amp;quot;')&#10; .replace(/'/g, '&amp;#39;');&#10; }&#10; form.onsubmit = function(e){&#10; e.preventDefault();&#10; var java_files = [], txt_files = [];&#10; root.querySelectorAll('.export-file-block').forEach(function(block){&#10; var name = block.querySelector('.export-file-name').textContent;&#10; var ta = block.querySelector('textarea');&#10; var content = block._cm ? block._cm.getValue() : ta.value;&#10; if(name.endsWith('.java')) java_files.push({name: name, content: content});&#10; else txt_files.push({name: name, content: content});&#10; });&#10; &#10; resultDiv.textContent = 'Exécution en cours';&#10; resultDiv.classList.add('is-running');&#10; var execAnim = null;&#10; &#10; var controller = new AbortController();&#10; var timeoutId = setTimeout(function() { controller.abort(); }, 30000); &#10; fetch(endpoint, {&#10; method: 'POST',&#10; headers: { 'Content-Type': 'application/json' },&#10; body: JSON.stringify({ java_files: java_files, txt_files: txt_files }),&#10; signal: controller.signal&#10; })&#10; .then(function(r){&#10; clearInterval(execAnim);&#10; resultDiv.classList.remove('is-running');&#10; clearTimeout(timeoutId);&#10; if (!r.ok &amp;&amp; r.status !== 400 &amp;&amp; r.status !== 500) {&#10; throw new Error('Erreur HTTP ' + r.status + ' : ' + r.statusText);&#10; }&#10; return r.text();&#10; })&#10; .then(function(t){&#10; try {&#10; var j=JSON.parse(t);&#10; &#10; if(j.status==='ran_successfully') {&#10; resultDiv.innerHTML='&lt;pre style="color:#222;background:#e0ffe0;padding:12px;border-radius:6px;"&gt;'+escapeHtml(j.output||'').replace(/\n/g,'&lt;br&gt;')+escapeHtml(j.stderr||'')+'&lt;/pre&gt;';&#10; } else if(j.status==='compiling') {&#10; resultDiv.innerHTML='&lt;pre style="color:#c00;background:#ffe0e0;padding:12px;border-radius:6px;"&gt;'+escapeHtml(j.error||'').replace(/\n/g,'&lt;br&gt;')+escapeHtml(j.stderr||'')+'&lt;/pre&gt;';&#10; } else if(j.status==='runtime_error' || j.status==='error') {&#10; resultDiv.innerHTML=(j.output?'&lt;pre style="color:#222;background:#e0ffe0;padding:12px;border-radius:6px;"&gt;'+escapeHtml(j.output).replace(/\n/g,'&lt;br&gt;')+'&lt;/pre&gt;':'')+'&lt;pre style="color:#c00;background:#ffe0e0;padding:12px;border-radius:6px;"&gt;'+escapeHtml(j.stderr||j.error||'').replace(/\n/g,'&lt;br&gt;')+'&lt;/pre&gt;';&#10; } else {&#10; resultDiv.textContent = t;&#10; }&#10; &#10; if(j.status==='compiling') {&#10; var errorText = j.error || '';&#10; var errorRegex = new RegExp('([\\w./\\-]+\\.java):(\\d+): error: ([^\\n]+)([\\s\\S]*?)(?=\\n[\\w./\\-]+\\.java:|$)','g');&#10; var match;&#10; root.querySelectorAll('.export-file-block').forEach(function(block){&#10; if (block._cm) {&#10; block._cm.operation(function() {&#10; var marks = block._cm.getAllMarks();&#10; for (var i = 0; i &lt; marks.length; i++) { marks[i].clear(); }&#10; });&#10; }&#10; &#10; block._javaErrorLines = {};&#10; var statusBar = block.querySelector('.java-error-status-bar');&#10; if (statusBar) {&#10; statusBar.textContent = '';&#10; statusBar.style.visibility = 'hidden';&#10; }&#10; });&#10; while ((match = errorRegex.exec(errorText)) !== null) {&#10; var file = match[1], lineStr = match[2], msg = match[3], details = match[4];&#10; var line = parseInt(lineStr, 10) - 1;&#10; var errorMsg = (msg + (details ? details.replace(/\s+/g, ' ') : '')).trim();&#10; root.querySelectorAll('.export-file-block').forEach(function(block){&#10; var nameInput = block.querySelector('.export-file-name');&#10; if (nameInput &amp;&amp; (nameInput.textContent.trim() === file || nameInput.textContent.trim().endsWith('/'+file) || nameInput.textContent.trim().endsWith('\\'+file))) {&#10; if (block._cm) {&#10; block._cm.operation(function() {&#10; block._cm.markText({line:line, ch:0}, {line:line+1, ch:0}, {&#10; className: 'cm-java-error',&#10; title: errorMsg&#10; });&#10; });&#10; }&#10; &#10; if (!block._javaErrorLines) { block._javaErrorLines = {}; }&#10; block._javaErrorLines[line] = errorMsg;&#10; }&#10; });&#10; }&#10; &#10; root.querySelectorAll('.export-file-block').forEach(function(block){&#10; if (block._cm &amp;&amp; block._cm.getOption('lineNumbers')) {&#10; &#10; var statusBar = block.querySelector('.java-error-status-bar');&#10; if (statusBar) {&#10; var cursor = block._cm.getCursor();&#10; var errMsg = block._javaErrorLines &amp;&amp; block._javaErrorLines[cursor.line];&#10; if (errMsg) {&#10; statusBar.textContent = 'Ligne ' + (cursor.line+1) + ' : ' + errMsg;&#10; statusBar.style.visibility = 'visible';&#10; } else {&#10; statusBar.textContent = '';&#10; statusBar.style.visibility = 'hidden';&#10; }&#10; }&#10; }&#10; });&#10; } else if (j.status==='error' || j.status==='runtime_error') {&#10; var rtText = j.stderr || j.error || '';&#10; var rtCauses = rtText.split('\n').filter(function(l){ return /Caused by:/.test(l); });&#10; var rtMsg = (rtCauses.length&#10; ? rtCauses[rtCauses.length-1].replace(/^.*Caused by:\s*/, '')&#10; : (rtText.split('\n')[0] || 'Erreur d’exécution')).trim();&#10; root.querySelectorAll('.export-file-block').forEach(function(block){&#10; if (block._cm) {&#10; block._cm.operation(function(){&#10; block._cm.getAllMarks().forEach(function(m){ m.clear(); });&#10; });&#10; }&#10; block._javaErrorLines = {};&#10; var sb = block.querySelector('.java-error-status-bar');&#10; if (sb) { sb.textContent = ''; sb.style.visibility = 'hidden'; }&#10; });&#10; var rtRegex = /\(([\w$-]+\.java):(\d+)\)/g;&#10; var rtSeen = {}, rtMatch;&#10; while ((rtMatch = rtRegex.exec(rtText)) !== null) {&#10; var rtFile = rtMatch[1], rtLine = parseInt(rtMatch[2], 10) - 1;&#10; if (rtLine &lt; 0 || rtSeen[rtFile + ':' + rtLine]) { continue; }&#10; rtSeen[rtFile + ':' + rtLine] = true;&#10; root.querySelectorAll('.export-file-block').forEach(function(block){&#10; var nameEl = block.querySelector('.export-file-name');&#10; var nm = nameEl ? nameEl.textContent.trim() : '';&#10; if (block._cm &amp;&amp; rtLine &lt; block._cm.lineCount() &amp;&amp;&#10; (nm === rtFile || nm.endsWith('/'+rtFile) || nm.endsWith('\\'+rtFile))) {&#10; block._cm.operation(function(){&#10; block._cm.markText({line:rtLine, ch:0}, {line:rtLine+1, ch:0}, {&#10; className: 'cm-java-error', title: rtMsg&#10; });&#10; });&#10; if (!block._javaErrorLines) { block._javaErrorLines = {}; }&#10; block._javaErrorLines[rtLine] = rtMsg;&#10; }&#10; });&#10; }&#10; } else {&#10; &#10; root.querySelectorAll('.export-file-block').forEach(function(block){&#10; if (block._cm) {&#10; block._cm.operation(function() {&#10; var marks = block._cm.getAllMarks();&#10; for (var i = 0; i &lt; marks.length; i++) { marks[i].clear(); }&#10; });&#10; }&#10; block._javaErrorLines = {};&#10; var statusBar = block.querySelector('.java-error-status-bar');&#10; if (statusBar) {&#10; statusBar.textContent = '';&#10; statusBar.style.visibility = 'hidden';&#10; }&#10; });&#10; }&#10; } catch(e){ console.log(e); resultDiv.textContent=t; }&#10; })&#10; .catch(function(error){&#10; clearInterval(execAnim);&#10; resultDiv.classList.remove('is-running');&#10; clearTimeout(timeoutId);&#10; if (error.name === 'AbortError') {&#10; resultDiv.textContent = 'Erreur : délai d’attente dépassé (30 secondes).';&#10; } else {&#10; resultDiv.textContent = 'Erreur lors de la requête : ' + error;&#10; }&#10; });&#10; };&#10; &#10; root.querySelectorAll('.export-file-block').forEach(function(block){&#10; var cm = block._cm;&#10; if (!cm) return;&#10; cm.on('mouseover', function(cm, event) {&#10; var pos = cm.coordsChar({ left: event.clientX, top: event.clientY });&#10; var line = pos.line, ch = pos.ch;&#10; var cursor = cm.getCursor();&#10; if (line === cursor.line &amp;&amp; block._javaErrorLines &amp;&amp; block._javaErrorLines[line]) {&#10; var msg = block._javaErrorLines[line];&#10; showTooltip(msg, event.clientX, event.clientY);&#10; }&#10; });&#10; cm.on('mouseout', function(cm, event) {&#10; hideTooltip();&#10; });&#10; });&#10; })();&lt;/script&gt;&#10; &lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;h2 id="exemple-4"&gt;&#10; Exemple 4&#10; &lt;a class="anchor" href="#exemple-4"&gt;#&lt;/a&gt;&#10;&lt;/h2&gt;&#10;&lt;h3 id="conventionnel-2"&gt;&#10; Conventionnel&#10; &lt;a class="anchor" href="#conventionnel-2"&gt;#&lt;/a&gt;&#10;&lt;/h3&gt;&#10;&lt;div class="java-inline"&gt;&#10;&#10;&#10;&#10;&#10;&#10;&#10; &lt;div id="java-runner-1789748553937431269"&gt;&#10; &lt;link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.65.16/codemirror.min.css"&gt;&#10; &lt;link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.65.16/theme/eclipse.min.css"&gt;&#10; &lt;style&gt;&#10; #java-runner-1789748553937431269 .export-form textarea { width:100%; min-height:120px; font-family:monospace; border-radius:4px; border:1px solid #ccc; }&#10; #java-runner-1789748553937431269 .export-form { margin-bottom:0; }&#10; #java-runner-1789748553937431269 .export-result { background:#222; color:#eee; padding:12px; border-radius:6px; margin-top:16px; white-space:pre-wrap; font-family:monospace; }&#10; #java-runner-1789748553937431269 .export-result.is-running::after { content:''; animation: exportRunningDots 2s steps(1, end) infinite; }&#10; @keyframes exportRunningDots { 0% { content:''; } 25% { content:'.'; } 50% { content:'..'; } 75% { content:'...'; } }&#10; @media (prefers-reduced-motion: reduce) { #java-runner-1789748553937431269 .export-result.is-running::after { animation:none; content:'…'; } }&#10; #java-runner-1789748553937431269 .export-endpoint-info { color:#1976d2; font-size:0.98em; margin-top:8px; }&#10; #java-runner-1789748553937431269 .export-btn { background:#1976d2; color:#fff; border:none; border-radius:4px; padding:8px 16px; font-size:1em; cursor:pointer; margin-top:8px; }&#10; #java-runner-1789748553937431269 .export-file-block { max-width: 100%;flex:1 1 350px; background:#f9f9f9; border:1px solid #ddd; border-radius:6px; padding:12px; margin-bottom:8px; }&#10; #java-runner-1789748553937431269 .export-file-block .export-file-name { font-weight:bold; margin-bottom:4px; }&#10; .cm-java-error { background: #ffe0e0 !important; border-bottom: 2px dotted #c00; cursor: pointer; }&#10; .cm-java-error-line { background: #fff0f0 !important; }&#10; &lt;/style&gt;&#10; &lt;form class="export-form java-runner-1789748553937431269-form" style="margin-bottom:0;" aria-label="Exécuter le programme Java Main.java"&gt;&#10; &lt;input type="hidden" class="export-endpoint-var" value="https://flask-service-inf1220-java.90qakjuvfj4f8.ca-central-1.cs.amazonlightsail.com/run"&gt;&#10; &lt;div style="display:flex;gap:12px;flex-wrap:wrap;"&gt;&#10; &lt;div class='export-file-block'&gt;&lt;div class='export-file-name' id='java-runner-1789748553937431269-name'&gt;Main.java&lt;/div&gt;&lt;textarea aria-labelledby='java-runner-1789748553937431269-name'&gt;&#10;class Livre {&#10; private final String titre;&#10; private final int annee;&#10; public Livre(String titre, int annee) {&#10; this.titre = titre;&#10; this.annee = annee;&#10; }&#10; public String getTitre() {&#10; return titre;&#10; }&#10; public int getAnnee() {&#10; return annee;&#10; }&#10; public String toString() {&#10; return &amp;#34;Livre{titre=&amp;#39;&amp;#34; &amp;#43; titre &amp;#43; &amp;#34;&amp;#39;, annee=&amp;#34; &amp;#43; annee &amp;#43; &amp;#34;}&amp;#34;;&#10; }&#10;}&#10;&#10;public class Main {&#10; public static void main(String[] args) {&#10; Livre livre = new Livre(&amp;#34;Le Petit Prince&amp;#34;, 1943);&#10; System.out.println(livre);&#10; }&#10;}&#10;&lt;/textarea&gt;&lt;/div&gt;&#10; &lt;/div&gt;&#10; &lt;button type="submit" class="export-btn java-runner-1789748553937431269-btn" style="background:#1976d2;color:#fff;border:none;border-radius:4px;padding:8px 16px;font-size:1em;cursor:pointer;margin-top:8px;"&gt;Exécuter&lt;/button&gt;&#10; &lt;/form&gt;&#10; &lt;div class="export-result" role="status" aria-live="polite" aria-atomic="true" aria-label="Résultat de l'exécution"&gt;&lt;/div&gt;&#10; &lt;div class="java-error-tooltip" style="display:none;position:absolute;z-index:1000;background:#fff0f0;color:#c00;border:1px solid #c00;padding:6px 12px;border-radius:6px;font-size:1em;box-shadow:0 2px 8px #0002;"&gt;&lt;/div&gt;&#10; &lt;script src="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.65.16/codemirror.min.js"&gt;&lt;/script&gt;&#10; &lt;script src="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.65.16/mode/clike/clike.min.js"&gt;&lt;/script&gt;&#10; &lt;script&gt;(function(){&#10; var root = document.getElementById('java-runner-1789748553937431269');&#10; if (!root) return;&#10; var form = root.querySelector('form');&#10; var resultDiv = root.querySelector('.export-result');&#10; var endpoint = form.querySelector('.export-endpoint-var').value;&#10; var tooltip = root.querySelector('.java-error-tooltip');&#10; &#10; root.querySelectorAll('.export-file-block').forEach(function(block){&#10; var name = block.querySelector('.export-file-name').textContent;&#10; var ta = block.querySelector('textarea');&#10; if(name.endsWith('.java')) {&#10; var cm = CodeMirror.fromTextArea(ta, {&#10; mode: "text/x-java",&#10; theme: "eclipse",&#10; lineNumbers: true,&#10; indentUnit: 4,&#10; tabSize: 4,&#10; &#10; &#10; extraKeys: {&#10; Tab: false,&#10; "Shift-Tab": false,&#10; Esc: function(c) { c.display.input.blur(); }&#10; }&#10; });&#10; (function(editor, fileName) {&#10; var label = "Éditeur de code Java : " + fileName;&#10; var wrapper = editor.getWrapperElement();&#10; wrapper.setAttribute('role', 'group');&#10; wrapper.setAttribute('aria-label', label);&#10; var field = editor.getInputField();&#10; if (field) { field.setAttribute('aria-label', label); }&#10; var scroll = wrapper.querySelector('.CodeMirror-scroll');&#10; if (scroll &amp;&amp; !scroll.hasAttribute('tabindex') &amp;&amp; !scroll.contains(field)) {&#10; scroll.setAttribute('tabindex', '0');&#10; scroll.setAttribute('role', 'region');&#10; scroll.setAttribute('aria-label', label);&#10; }&#10; })(cm, name);&#10; block._cm = cm;&#10; &#10; block._javaErrorLines = {};&#10; &#10; cm.on('cursorActivity', function() {&#10; var statusBar = block.querySelector('.java-error-status-bar');&#10; if (!statusBar) return;&#10; var cursor = cm.getCursor();&#10; var errMsg = block._javaErrorLines &amp;&amp; block._javaErrorLines[cursor.line];&#10; if (errMsg) {&#10; statusBar.textContent = 'Ligne ' + (cursor.line+1) + ' : ' + errMsg;&#10; statusBar.style.visibility = 'visible';&#10; } else {&#10; statusBar.textContent = '';&#10; statusBar.style.visibility = 'hidden';&#10; }&#10; });&#10; }&#10; &#10; if(name.endsWith('.java')) {&#10; if (!block.querySelector('.java-error-status-bar')) {&#10; var statusBar = document.createElement('div');&#10; statusBar.className = 'java-error-status-bar';&#10; statusBar.setAttribute('role', 'status');&#10; statusBar.setAttribute('aria-live', 'polite');&#10; statusBar.style.marginTop = '4px';&#10; statusBar.style.fontSize = '0.95em';&#10; statusBar.style.color = '#c00';&#10; statusBar.style.minHeight = '1.2em';&#10; statusBar.style.visibility = 'hidden';&#10; block.appendChild(statusBar);&#10; }&#10; }&#10; });&#10; &#10; function showTooltip(msg, x, y) {&#10; tooltip.textContent = msg;&#10; tooltip.style.display = 'block';&#10; tooltip.style.left = (x+10) + 'px';&#10; tooltip.style.top = (y+10) + 'px';&#10; }&#10; function hideTooltip() {&#10; tooltip.style.display = 'none';&#10; }&#10; &#10; function escapeHtml(str) {&#10; if (str == null) return '';&#10; return String(str)&#10; .replace(/&amp;/g, '&amp;amp;')&#10; .replace(/&lt;/g, '&amp;lt;')&#10; .replace(/&gt;/g, '&amp;gt;')&#10; .replace(/"/g, '&amp;quot;')&#10; .replace(/'/g, '&amp;#39;');&#10; }&#10; form.onsubmit = function(e){&#10; e.preventDefault();&#10; var java_files = [], txt_files = [];&#10; root.querySelectorAll('.export-file-block').forEach(function(block){&#10; var name = block.querySelector('.export-file-name').textContent;&#10; var ta = block.querySelector('textarea');&#10; var content = block._cm ? block._cm.getValue() : ta.value;&#10; if(name.endsWith('.java')) java_files.push({name: name, content: content});&#10; else txt_files.push({name: name, content: content});&#10; });&#10; &#10; resultDiv.textContent = 'Exécution en cours';&#10; resultDiv.classList.add('is-running');&#10; var execAnim = null;&#10; &#10; var controller = new AbortController();&#10; var timeoutId = setTimeout(function() { controller.abort(); }, 30000); &#10; fetch(endpoint, {&#10; method: 'POST',&#10; headers: { 'Content-Type': 'application/json' },&#10; body: JSON.stringify({ java_files: java_files, txt_files: txt_files }),&#10; signal: controller.signal&#10; })&#10; .then(function(r){&#10; clearInterval(execAnim);&#10; resultDiv.classList.remove('is-running');&#10; clearTimeout(timeoutId);&#10; if (!r.ok &amp;&amp; r.status !== 400 &amp;&amp; r.status !== 500) {&#10; throw new Error('Erreur HTTP ' + r.status + ' : ' + r.statusText);&#10; }&#10; return r.text();&#10; })&#10; .then(function(t){&#10; try {&#10; var j=JSON.parse(t);&#10; &#10; if(j.status==='ran_successfully') {&#10; resultDiv.innerHTML='&lt;pre style="color:#222;background:#e0ffe0;padding:12px;border-radius:6px;"&gt;'+escapeHtml(j.output||'').replace(/\n/g,'&lt;br&gt;')+escapeHtml(j.stderr||'')+'&lt;/pre&gt;';&#10; } else if(j.status==='compiling') {&#10; resultDiv.innerHTML='&lt;pre style="color:#c00;background:#ffe0e0;padding:12px;border-radius:6px;"&gt;'+escapeHtml(j.error||'').replace(/\n/g,'&lt;br&gt;')+escapeHtml(j.stderr||'')+'&lt;/pre&gt;';&#10; } else if(j.status==='runtime_error' || j.status==='error') {&#10; resultDiv.innerHTML=(j.output?'&lt;pre style="color:#222;background:#e0ffe0;padding:12px;border-radius:6px;"&gt;'+escapeHtml(j.output).replace(/\n/g,'&lt;br&gt;')+'&lt;/pre&gt;':'')+'&lt;pre style="color:#c00;background:#ffe0e0;padding:12px;border-radius:6px;"&gt;'+escapeHtml(j.stderr||j.error||'').replace(/\n/g,'&lt;br&gt;')+'&lt;/pre&gt;';&#10; } else {&#10; resultDiv.textContent = t;&#10; }&#10; &#10; if(j.status==='compiling') {&#10; var errorText = j.error || '';&#10; var errorRegex = new RegExp('([\\w./\\-]+\\.java):(\\d+): error: ([^\\n]+)([\\s\\S]*?)(?=\\n[\\w./\\-]+\\.java:|$)','g');&#10; var match;&#10; root.querySelectorAll('.export-file-block').forEach(function(block){&#10; if (block._cm) {&#10; block._cm.operation(function() {&#10; var marks = block._cm.getAllMarks();&#10; for (var i = 0; i &lt; marks.length; i++) { marks[i].clear(); }&#10; });&#10; }&#10; &#10; block._javaErrorLines = {};&#10; var statusBar = block.querySelector('.java-error-status-bar');&#10; if (statusBar) {&#10; statusBar.textContent = '';&#10; statusBar.style.visibility = 'hidden';&#10; }&#10; });&#10; while ((match = errorRegex.exec(errorText)) !== null) {&#10; var file = match[1], lineStr = match[2], msg = match[3], details = match[4];&#10; var line = parseInt(lineStr, 10) - 1;&#10; var errorMsg = (msg + (details ? details.replace(/\s+/g, ' ') : '')).trim();&#10; root.querySelectorAll('.export-file-block').forEach(function(block){&#10; var nameInput = block.querySelector('.export-file-name');&#10; if (nameInput &amp;&amp; (nameInput.textContent.trim() === file || nameInput.textContent.trim().endsWith('/'+file) || nameInput.textContent.trim().endsWith('\\'+file))) {&#10; if (block._cm) {&#10; block._cm.operation(function() {&#10; block._cm.markText({line:line, ch:0}, {line:line+1, ch:0}, {&#10; className: 'cm-java-error',&#10; title: errorMsg&#10; });&#10; });&#10; }&#10; &#10; if (!block._javaErrorLines) { block._javaErrorLines = {}; }&#10; block._javaErrorLines[line] = errorMsg;&#10; }&#10; });&#10; }&#10; &#10; root.querySelectorAll('.export-file-block').forEach(function(block){&#10; if (block._cm &amp;&amp; block._cm.getOption('lineNumbers')) {&#10; &#10; var statusBar = block.querySelector('.java-error-status-bar');&#10; if (statusBar) {&#10; var cursor = block._cm.getCursor();&#10; var errMsg = block._javaErrorLines &amp;&amp; block._javaErrorLines[cursor.line];&#10; if (errMsg) {&#10; statusBar.textContent = 'Ligne ' + (cursor.line+1) + ' : ' + errMsg;&#10; statusBar.style.visibility = 'visible';&#10; } else {&#10; statusBar.textContent = '';&#10; statusBar.style.visibility = 'hidden';&#10; }&#10; }&#10; }&#10; });&#10; } else if (j.status==='error' || j.status==='runtime_error') {&#10; var rtText = j.stderr || j.error || '';&#10; var rtCauses = rtText.split('\n').filter(function(l){ return /Caused by:/.test(l); });&#10; var rtMsg = (rtCauses.length&#10; ? rtCauses[rtCauses.length-1].replace(/^.*Caused by:\s*/, '')&#10; : (rtText.split('\n')[0] || 'Erreur d’exécution')).trim();&#10; root.querySelectorAll('.export-file-block').forEach(function(block){&#10; if (block._cm) {&#10; block._cm.operation(function(){&#10; block._cm.getAllMarks().forEach(function(m){ m.clear(); });&#10; });&#10; }&#10; block._javaErrorLines = {};&#10; var sb = block.querySelector('.java-error-status-bar');&#10; if (sb) { sb.textContent = ''; sb.style.visibility = 'hidden'; }&#10; });&#10; var rtRegex = /\(([\w$-]+\.java):(\d+)\)/g;&#10; var rtSeen = {}, rtMatch;&#10; while ((rtMatch = rtRegex.exec(rtText)) !== null) {&#10; var rtFile = rtMatch[1], rtLine = parseInt(rtMatch[2], 10) - 1;&#10; if (rtLine &lt; 0 || rtSeen[rtFile + ':' + rtLine]) { continue; }&#10; rtSeen[rtFile + ':' + rtLine] = true;&#10; root.querySelectorAll('.export-file-block').forEach(function(block){&#10; var nameEl = block.querySelector('.export-file-name');&#10; var nm = nameEl ? nameEl.textContent.trim() : '';&#10; if (block._cm &amp;&amp; rtLine &lt; block._cm.lineCount() &amp;&amp;&#10; (nm === rtFile || nm.endsWith('/'+rtFile) || nm.endsWith('\\'+rtFile))) {&#10; block._cm.operation(function(){&#10; block._cm.markText({line:rtLine, ch:0}, {line:rtLine+1, ch:0}, {&#10; className: 'cm-java-error', title: rtMsg&#10; });&#10; });&#10; if (!block._javaErrorLines) { block._javaErrorLines = {}; }&#10; block._javaErrorLines[rtLine] = rtMsg;&#10; }&#10; });&#10; }&#10; } else {&#10; &#10; root.querySelectorAll('.export-file-block').forEach(function(block){&#10; if (block._cm) {&#10; block._cm.operation(function() {&#10; var marks = block._cm.getAllMarks();&#10; for (var i = 0; i &lt; marks.length; i++) { marks[i].clear(); }&#10; });&#10; }&#10; block._javaErrorLines = {};&#10; var statusBar = block.querySelector('.java-error-status-bar');&#10; if (statusBar) {&#10; statusBar.textContent = '';&#10; statusBar.style.visibility = 'hidden';&#10; }&#10; });&#10; }&#10; } catch(e){ console.log(e); resultDiv.textContent=t; }&#10; })&#10; .catch(function(error){&#10; clearInterval(execAnim);&#10; resultDiv.classList.remove('is-running');&#10; clearTimeout(timeoutId);&#10; if (error.name === 'AbortError') {&#10; resultDiv.textContent = 'Erreur : délai d’attente dépassé (30 secondes).';&#10; } else {&#10; resultDiv.textContent = 'Erreur lors de la requête : ' + error;&#10; }&#10; });&#10; };&#10; &#10; root.querySelectorAll('.export-file-block').forEach(function(block){&#10; var cm = block._cm;&#10; if (!cm) return;&#10; cm.on('mouseover', function(cm, event) {&#10; var pos = cm.coordsChar({ left: event.clientX, top: event.clientY });&#10; var line = pos.line, ch = pos.ch;&#10; var cursor = cm.getCursor();&#10; if (line === cursor.line &amp;&amp; block._javaErrorLines &amp;&amp; block._javaErrorLines[line]) {&#10; var msg = block._javaErrorLines[line];&#10; showTooltip(msg, event.clientX, event.clientY);&#10; }&#10; });&#10; cm.on('mouseout', function(cm, event) {&#10; hideTooltip();&#10; });&#10; });&#10; })();&lt;/script&gt;&#10; &lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;h3 id="moderne-3"&gt;&#10; Moderne&#10; &lt;a class="anchor" href="#moderne-3"&gt;#&lt;/a&gt;&#10;&lt;/h3&gt;&#10;&lt;div class="java-inline"&gt;&#10;&#10;&#10;&#10;&#10;&#10;&#10; &lt;div id="java-runner-1789748553937478658"&gt;&#10; &lt;link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.65.16/codemirror.min.css"&gt;&#10; &lt;link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.65.16/theme/eclipse.min.css"&gt;&#10; &lt;style&gt;&#10; #java-runner-1789748553937478658 .export-form textarea { width:100%; min-height:120px; font-family:monospace; border-radius:4px; border:1px solid #ccc; }&#10; #java-runner-1789748553937478658 .export-form { margin-bottom:0; }&#10; #java-runner-1789748553937478658 .export-result { background:#222; color:#eee; padding:12px; border-radius:6px; margin-top:16px; white-space:pre-wrap; font-family:monospace; }&#10; #java-runner-1789748553937478658 .export-result.is-running::after { content:''; animation: exportRunningDots 2s steps(1, end) infinite; }&#10; @keyframes exportRunningDots { 0% { content:''; } 25% { content:'.'; } 50% { content:'..'; } 75% { content:'...'; } }&#10; @media (prefers-reduced-motion: reduce) { #java-runner-1789748553937478658 .export-result.is-running::after { animation:none; content:'…'; } }&#10; #java-runner-1789748553937478658 .export-endpoint-info { color:#1976d2; font-size:0.98em; margin-top:8px; }&#10; #java-runner-1789748553937478658 .export-btn { background:#1976d2; color:#fff; border:none; border-radius:4px; padding:8px 16px; font-size:1em; cursor:pointer; margin-top:8px; }&#10; #java-runner-1789748553937478658 .export-file-block { max-width: 100%;flex:1 1 350px; background:#f9f9f9; border:1px solid #ddd; border-radius:6px; padding:12px; margin-bottom:8px; }&#10; #java-runner-1789748553937478658 .export-file-block .export-file-name { font-weight:bold; margin-bottom:4px; }&#10; .cm-java-error { background: #ffe0e0 !important; border-bottom: 2px dotted #c00; cursor: pointer; }&#10; .cm-java-error-line { background: #fff0f0 !important; }&#10; &lt;/style&gt;&#10; &lt;form class="export-form java-runner-1789748553937478658-form" style="margin-bottom:0;" aria-label="Exécuter le programme Java Main.java"&gt;&#10; &lt;input type="hidden" class="export-endpoint-var" value="https://flask-service-inf1220-java.90qakjuvfj4f8.ca-central-1.cs.amazonlightsail.com/run"&gt;&#10; &lt;div style="display:flex;gap:12px;flex-wrap:wrap;"&gt;&#10; &lt;div class='export-file-block'&gt;&lt;div class='export-file-name' id='java-runner-1789748553937478658-name'&gt;Main.java&lt;/div&gt;&lt;textarea aria-labelledby='java-runner-1789748553937478658-name'&gt;&#10;record Livre(String titre, int annee) {}&#10;void main() {&#10; Livre livre = new Livre(&amp;#34;Le Petit Prince&amp;#34;, 1943);&#10; System.out.println(livre);&#10;}&#10;&lt;/textarea&gt;&lt;/div&gt;&#10; &lt;/div&gt;&#10; &lt;button type="submit" class="export-btn java-runner-1789748553937478658-btn" style="background:#1976d2;color:#fff;border:none;border-radius:4px;padding:8px 16px;font-size:1em;cursor:pointer;margin-top:8px;"&gt;Exécuter&lt;/button&gt;&#10; &lt;/form&gt;&#10; &lt;div class="export-result" role="status" aria-live="polite" aria-atomic="true" aria-label="Résultat de l'exécution"&gt;&lt;/div&gt;&#10; &lt;div class="java-error-tooltip" style="display:none;position:absolute;z-index:1000;background:#fff0f0;color:#c00;border:1px solid #c00;padding:6px 12px;border-radius:6px;font-size:1em;box-shadow:0 2px 8px #0002;"&gt;&lt;/div&gt;&#10; &lt;script src="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.65.16/codemirror.min.js"&gt;&lt;/script&gt;&#10; &lt;script src="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.65.16/mode/clike/clike.min.js"&gt;&lt;/script&gt;&#10; &lt;script&gt;(function(){&#10; var root = document.getElementById('java-runner-1789748553937478658');&#10; if (!root) return;&#10; var form = root.querySelector('form');&#10; var resultDiv = root.querySelector('.export-result');&#10; var endpoint = form.querySelector('.export-endpoint-var').value;&#10; var tooltip = root.querySelector('.java-error-tooltip');&#10; &#10; root.querySelectorAll('.export-file-block').forEach(function(block){&#10; var name = block.querySelector('.export-file-name').textContent;&#10; var ta = block.querySelector('textarea');&#10; if(name.endsWith('.java')) {&#10; var cm = CodeMirror.fromTextArea(ta, {&#10; mode: "text/x-java",&#10; theme: "eclipse",&#10; lineNumbers: true,&#10; indentUnit: 4,&#10; tabSize: 4,&#10; &#10; &#10; extraKeys: {&#10; Tab: false,&#10; "Shift-Tab": false,&#10; Esc: function(c) { c.display.input.blur(); }&#10; }&#10; });&#10; (function(editor, fileName) {&#10; var label = "Éditeur de code Java : " + fileName;&#10; var wrapper = editor.getWrapperElement();&#10; wrapper.setAttribute('role', 'group');&#10; wrapper.setAttribute('aria-label', label);&#10; var field = editor.getInputField();&#10; if (field) { field.setAttribute('aria-label', label); }&#10; var scroll = wrapper.querySelector('.CodeMirror-scroll');&#10; if (scroll &amp;&amp; !scroll.hasAttribute('tabindex') &amp;&amp; !scroll.contains(field)) {&#10; scroll.setAttribute('tabindex', '0');&#10; scroll.setAttribute('role', 'region');&#10; scroll.setAttribute('aria-label', label);&#10; }&#10; })(cm, name);&#10; block._cm = cm;&#10; &#10; block._javaErrorLines = {};&#10; &#10; cm.on('cursorActivity', function() {&#10; var statusBar = block.querySelector('.java-error-status-bar');&#10; if (!statusBar) return;&#10; var cursor = cm.getCursor();&#10; var errMsg = block._javaErrorLines &amp;&amp; block._javaErrorLines[cursor.line];&#10; if (errMsg) {&#10; statusBar.textContent = 'Ligne ' + (cursor.line+1) + ' : ' + errMsg;&#10; statusBar.style.visibility = 'visible';&#10; } else {&#10; statusBar.textContent = '';&#10; statusBar.style.visibility = 'hidden';&#10; }&#10; });&#10; }&#10; &#10; if(name.endsWith('.java')) {&#10; if (!block.querySelector('.java-error-status-bar')) {&#10; var statusBar = document.createElement('div');&#10; statusBar.className = 'java-error-status-bar';&#10; statusBar.setAttribute('role', 'status');&#10; statusBar.setAttribute('aria-live', 'polite');&#10; statusBar.style.marginTop = '4px';&#10; statusBar.style.fontSize = '0.95em';&#10; statusBar.style.color = '#c00';&#10; statusBar.style.minHeight = '1.2em';&#10; statusBar.style.visibility = 'hidden';&#10; block.appendChild(statusBar);&#10; }&#10; }&#10; });&#10; &#10; function showTooltip(msg, x, y) {&#10; tooltip.textContent = msg;&#10; tooltip.style.display = 'block';&#10; tooltip.style.left = (x+10) + 'px';&#10; tooltip.style.top = (y+10) + 'px';&#10; }&#10; function hideTooltip() {&#10; tooltip.style.display = 'none';&#10; }&#10; &#10; function escapeHtml(str) {&#10; if (str == null) return '';&#10; return String(str)&#10; .replace(/&amp;/g, '&amp;amp;')&#10; .replace(/&lt;/g, '&amp;lt;')&#10; .replace(/&gt;/g, '&amp;gt;')&#10; .replace(/"/g, '&amp;quot;')&#10; .replace(/'/g, '&amp;#39;');&#10; }&#10; form.onsubmit = function(e){&#10; e.preventDefault();&#10; var java_files = [], txt_files = [];&#10; root.querySelectorAll('.export-file-block').forEach(function(block){&#10; var name = block.querySelector('.export-file-name').textContent;&#10; var ta = block.querySelector('textarea');&#10; var content = block._cm ? block._cm.getValue() : ta.value;&#10; if(name.endsWith('.java')) java_files.push({name: name, content: content});&#10; else txt_files.push({name: name, content: content});&#10; });&#10; &#10; resultDiv.textContent = 'Exécution en cours';&#10; resultDiv.classList.add('is-running');&#10; var execAnim = null;&#10; &#10; var controller = new AbortController();&#10; var timeoutId = setTimeout(function() { controller.abort(); }, 30000); &#10; fetch(endpoint, {&#10; method: 'POST',&#10; headers: { 'Content-Type': 'application/json' },&#10; body: JSON.stringify({ java_files: java_files, txt_files: txt_files }),&#10; signal: controller.signal&#10; })&#10; .then(function(r){&#10; clearInterval(execAnim);&#10; resultDiv.classList.remove('is-running');&#10; clearTimeout(timeoutId);&#10; if (!r.ok &amp;&amp; r.status !== 400 &amp;&amp; r.status !== 500) {&#10; throw new Error('Erreur HTTP ' + r.status + ' : ' + r.statusText);&#10; }&#10; return r.text();&#10; })&#10; .then(function(t){&#10; try {&#10; var j=JSON.parse(t);&#10; &#10; if(j.status==='ran_successfully') {&#10; resultDiv.innerHTML='&lt;pre style="color:#222;background:#e0ffe0;padding:12px;border-radius:6px;"&gt;'+escapeHtml(j.output||'').replace(/\n/g,'&lt;br&gt;')+escapeHtml(j.stderr||'')+'&lt;/pre&gt;';&#10; } else if(j.status==='compiling') {&#10; resultDiv.innerHTML='&lt;pre style="color:#c00;background:#ffe0e0;padding:12px;border-radius:6px;"&gt;'+escapeHtml(j.error||'').replace(/\n/g,'&lt;br&gt;')+escapeHtml(j.stderr||'')+'&lt;/pre&gt;';&#10; } else if(j.status==='runtime_error' || j.status==='error') {&#10; resultDiv.innerHTML=(j.output?'&lt;pre style="color:#222;background:#e0ffe0;padding:12px;border-radius:6px;"&gt;'+escapeHtml(j.output).replace(/\n/g,'&lt;br&gt;')+'&lt;/pre&gt;':'')+'&lt;pre style="color:#c00;background:#ffe0e0;padding:12px;border-radius:6px;"&gt;'+escapeHtml(j.stderr||j.error||'').replace(/\n/g,'&lt;br&gt;')+'&lt;/pre&gt;';&#10; } else {&#10; resultDiv.textContent = t;&#10; }&#10; &#10; if(j.status==='compiling') {&#10; var errorText = j.error || '';&#10; var errorRegex = new RegExp('([\\w./\\-]+\\.java):(\\d+): error: ([^\\n]+)([\\s\\S]*?)(?=\\n[\\w./\\-]+\\.java:|$)','g');&#10; var match;&#10; root.querySelectorAll('.export-file-block').forEach(function(block){&#10; if (block._cm) {&#10; block._cm.operation(function() {&#10; var marks = block._cm.getAllMarks();&#10; for (var i = 0; i &lt; marks.length; i++) { marks[i].clear(); }&#10; });&#10; }&#10; &#10; block._javaErrorLines = {};&#10; var statusBar = block.querySelector('.java-error-status-bar');&#10; if (statusBar) {&#10; statusBar.textContent = '';&#10; statusBar.style.visibility = 'hidden';&#10; }&#10; });&#10; while ((match = errorRegex.exec(errorText)) !== null) {&#10; var file = match[1], lineStr = match[2], msg = match[3], details = match[4];&#10; var line = parseInt(lineStr, 10) - 1;&#10; var errorMsg = (msg + (details ? details.replace(/\s+/g, ' ') : '')).trim();&#10; root.querySelectorAll('.export-file-block').forEach(function(block){&#10; var nameInput = block.querySelector('.export-file-name');&#10; if (nameInput &amp;&amp; (nameInput.textContent.trim() === file || nameInput.textContent.trim().endsWith('/'+file) || nameInput.textContent.trim().endsWith('\\'+file))) {&#10; if (block._cm) {&#10; block._cm.operation(function() {&#10; block._cm.markText({line:line, ch:0}, {line:line+1, ch:0}, {&#10; className: 'cm-java-error',&#10; title: errorMsg&#10; });&#10; });&#10; }&#10; &#10; if (!block._javaErrorLines) { block._javaErrorLines = {}; }&#10; block._javaErrorLines[line] = errorMsg;&#10; }&#10; });&#10; }&#10; &#10; root.querySelectorAll('.export-file-block').forEach(function(block){&#10; if (block._cm &amp;&amp; block._cm.getOption('lineNumbers')) {&#10; &#10; var statusBar = block.querySelector('.java-error-status-bar');&#10; if (statusBar) {&#10; var cursor = block._cm.getCursor();&#10; var errMsg = block._javaErrorLines &amp;&amp; block._javaErrorLines[cursor.line];&#10; if (errMsg) {&#10; statusBar.textContent = 'Ligne ' + (cursor.line+1) + ' : ' + errMsg;&#10; statusBar.style.visibility = 'visible';&#10; } else {&#10; statusBar.textContent = '';&#10; statusBar.style.visibility = 'hidden';&#10; }&#10; }&#10; }&#10; });&#10; } else if (j.status==='error' || j.status==='runtime_error') {&#10; var rtText = j.stderr || j.error || '';&#10; var rtCauses = rtText.split('\n').filter(function(l){ return /Caused by:/.test(l); });&#10; var rtMsg = (rtCauses.length&#10; ? rtCauses[rtCauses.length-1].replace(/^.*Caused by:\s*/, '')&#10; : (rtText.split('\n')[0] || 'Erreur d’exécution')).trim();&#10; root.querySelectorAll('.export-file-block').forEach(function(block){&#10; if (block._cm) {&#10; block._cm.operation(function(){&#10; block._cm.getAllMarks().forEach(function(m){ m.clear(); });&#10; });&#10; }&#10; block._javaErrorLines = {};&#10; var sb = block.querySelector('.java-error-status-bar');&#10; if (sb) { sb.textContent = ''; sb.style.visibility = 'hidden'; }&#10; });&#10; var rtRegex = /\(([\w$-]+\.java):(\d+)\)/g;&#10; var rtSeen = {}, rtMatch;&#10; while ((rtMatch = rtRegex.exec(rtText)) !== null) {&#10; var rtFile = rtMatch[1], rtLine = parseInt(rtMatch[2], 10) - 1;&#10; if (rtLine &lt; 0 || rtSeen[rtFile + ':' + rtLine]) { continue; }&#10; rtSeen[rtFile + ':' + rtLine] = true;&#10; root.querySelectorAll('.export-file-block').forEach(function(block){&#10; var nameEl = block.querySelector('.export-file-name');&#10; var nm = nameEl ? nameEl.textContent.trim() : '';&#10; if (block._cm &amp;&amp; rtLine &lt; block._cm.lineCount() &amp;&amp;&#10; (nm === rtFile || nm.endsWith('/'+rtFile) || nm.endsWith('\\'+rtFile))) {&#10; block._cm.operation(function(){&#10; block._cm.markText({line:rtLine, ch:0}, {line:rtLine+1, ch:0}, {&#10; className: 'cm-java-error', title: rtMsg&#10; });&#10; });&#10; if (!block._javaErrorLines) { block._javaErrorLines = {}; }&#10; block._javaErrorLines[rtLine] = rtMsg;&#10; }&#10; });&#10; }&#10; } else {&#10; &#10; root.querySelectorAll('.export-file-block').forEach(function(block){&#10; if (block._cm) {&#10; block._cm.operation(function() {&#10; var marks = block._cm.getAllMarks();&#10; for (var i = 0; i &lt; marks.length; i++) { marks[i].clear(); }&#10; });&#10; }&#10; block._javaErrorLines = {};&#10; var statusBar = block.querySelector('.java-error-status-bar');&#10; if (statusBar) {&#10; statusBar.textContent = '';&#10; statusBar.style.visibility = 'hidden';&#10; }&#10; });&#10; }&#10; } catch(e){ console.log(e); resultDiv.textContent=t; }&#10; })&#10; .catch(function(error){&#10; clearInterval(execAnim);&#10; resultDiv.classList.remove('is-running');&#10; clearTimeout(timeoutId);&#10; if (error.name === 'AbortError') {&#10; resultDiv.textContent = 'Erreur : délai d’attente dépassé (30 secondes).';&#10; } else {&#10; resultDiv.textContent = 'Erreur lors de la requête : ' + error;&#10; }&#10; });&#10; };&#10; &#10; root.querySelectorAll('.export-file-block').forEach(function(block){&#10; var cm = block._cm;&#10; if (!cm) return;&#10; cm.on('mouseover', function(cm, event) {&#10; var pos = cm.coordsChar({ left: event.clientX, top: event.clientY });&#10; var line = pos.line, ch = pos.ch;&#10; var cursor = cm.getCursor();&#10; if (line === cursor.line &amp;&amp; block._javaErrorLines &amp;&amp; block._javaErrorLines[line]) {&#10; var msg = block._javaErrorLines[line];&#10; showTooltip(msg, event.clientX, event.clientY);&#10; }&#10; });&#10; cm.on('mouseout', function(cm, event) {&#10; hideTooltip();&#10; });&#10; });&#10; })();&lt;/script&gt;&#10; &lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;h3 id="exemple-5"&gt;&#10; Exemple 5&#10; &lt;a class="anchor" href="#exemple-5"&gt;#&lt;/a&gt;&#10;&lt;/h3&gt;&#10;&lt;h3 id="conventionnel-3"&gt;&#10; Conventionnel&#10; &lt;a class="anchor" href="#conventionnel-3"&gt;#&lt;/a&gt;&#10;&lt;/h3&gt;&#10;&lt;div class="java-inline"&gt;&#10;&#10;&#10;&#10;&#10;&#10;&#10; &lt;div id="java-runner-1789748553937513057"&gt;&#10; &lt;link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.65.16/codemirror.min.css"&gt;&#10; &lt;link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.65.16/theme/eclipse.min.css"&gt;&#10; &lt;style&gt;&#10; #java-runner-1789748553937513057 .export-form textarea { width:100%; min-height:120px; font-family:monospace; border-radius:4px; border:1px solid #ccc; }&#10; #java-runner-1789748553937513057 .export-form { margin-bottom:0; }&#10; #java-runner-1789748553937513057 .export-result { background:#222; color:#eee; padding:12px; border-radius:6px; margin-top:16px; white-space:pre-wrap; font-family:monospace; }&#10; #java-runner-1789748553937513057 .export-result.is-running::after { content:''; animation: exportRunningDots 2s steps(1, end) infinite; }&#10; @keyframes exportRunningDots { 0% { content:''; } 25% { content:'.'; } 50% { content:'..'; } 75% { content:'...'; } }&#10; @media (prefers-reduced-motion: reduce) { #java-runner-1789748553937513057 .export-result.is-running::after { animation:none; content:'…'; } }&#10; #java-runner-1789748553937513057 .export-endpoint-info { color:#1976d2; font-size:0.98em; margin-top:8px; }&#10; #java-runner-1789748553937513057 .export-btn { background:#1976d2; color:#fff; border:none; border-radius:4px; padding:8px 16px; font-size:1em; cursor:pointer; margin-top:8px; }&#10; #java-runner-1789748553937513057 .export-file-block { max-width: 100%;flex:1 1 350px; background:#f9f9f9; border:1px solid #ddd; border-radius:6px; padding:12px; margin-bottom:8px; }&#10; #java-runner-1789748553937513057 .export-file-block .export-file-name { font-weight:bold; margin-bottom:4px; }&#10; .cm-java-error { background: #ffe0e0 !important; border-bottom: 2px dotted #c00; cursor: pointer; }&#10; .cm-java-error-line { background: #fff0f0 !important; }&#10; &lt;/style&gt;&#10; &lt;form class="export-form java-runner-1789748553937513057-form" style="margin-bottom:0;" aria-label="Exécuter le programme Java Main.java"&gt;&#10; &lt;input type="hidden" class="export-endpoint-var" value="https://flask-service-inf1220-java.90qakjuvfj4f8.ca-central-1.cs.amazonlightsail.com/run"&gt;&#10; &lt;div style="display:flex;gap:12px;flex-wrap:wrap;"&gt;&#10; &lt;div class='export-file-block'&gt;&lt;div class='export-file-name' id='java-runner-1789748553937513057-name'&gt;Main.java&lt;/div&gt;&lt;textarea aria-labelledby='java-runner-1789748553937513057-name'&gt;&#10;public class Main {&#10; public static void main(String[] args) {&#10; String name = &amp;#34; Alice &amp;#34;;&#10; if (name != null) {&#10; if (!name.trim().isEmpty()) {&#10; System.out.println(&amp;#34;Bonjour &amp;#34; &amp;#43; name.trim());&#10; } else {&#10; System.out.println(&amp;#34;Bonjour inconnu&amp;#34;);&#10; }&#10; } else {&#10; System.out.println(&amp;#34;Bonjour inconnu&amp;#34;);&#10; }&#10; }&#10;}&#10;&lt;/textarea&gt;&lt;/div&gt;&#10; &lt;/div&gt;&#10; &lt;button type="submit" class="export-btn java-runner-1789748553937513057-btn" style="background:#1976d2;color:#fff;border:none;border-radius:4px;padding:8px 16px;font-size:1em;cursor:pointer;margin-top:8px;"&gt;Exécuter&lt;/button&gt;&#10; &lt;/form&gt;&#10; &lt;div class="export-result" role="status" aria-live="polite" aria-atomic="true" aria-label="Résultat de l'exécution"&gt;&lt;/div&gt;&#10; &lt;div class="java-error-tooltip" style="display:none;position:absolute;z-index:1000;background:#fff0f0;color:#c00;border:1px solid #c00;padding:6px 12px;border-radius:6px;font-size:1em;box-shadow:0 2px 8px #0002;"&gt;&lt;/div&gt;&#10; &lt;script src="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.65.16/codemirror.min.js"&gt;&lt;/script&gt;&#10; &lt;script src="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.65.16/mode/clike/clike.min.js"&gt;&lt;/script&gt;&#10; &lt;script&gt;(function(){&#10; var root = document.getElementById('java-runner-1789748553937513057');&#10; if (!root) return;&#10; var form = root.querySelector('form');&#10; var resultDiv = root.querySelector('.export-result');&#10; var endpoint = form.querySelector('.export-endpoint-var').value;&#10; var tooltip = root.querySelector('.java-error-tooltip');&#10; &#10; root.querySelectorAll('.export-file-block').forEach(function(block){&#10; var name = block.querySelector('.export-file-name').textContent;&#10; var ta = block.querySelector('textarea');&#10; if(name.endsWith('.java')) {&#10; var cm = CodeMirror.fromTextArea(ta, {&#10; mode: "text/x-java",&#10; theme: "eclipse",&#10; lineNumbers: true,&#10; indentUnit: 4,&#10; tabSize: 4,&#10; &#10; &#10; extraKeys: {&#10; Tab: false,&#10; "Shift-Tab": false,&#10; Esc: function(c) { c.display.input.blur(); }&#10; }&#10; });&#10; (function(editor, fileName) {&#10; var label = "Éditeur de code Java : " + fileName;&#10; var wrapper = editor.getWrapperElement();&#10; wrapper.setAttribute('role', 'group');&#10; wrapper.setAttribute('aria-label', label);&#10; var field = editor.getInputField();&#10; if (field) { field.setAttribute('aria-label', label); }&#10; var scroll = wrapper.querySelector('.CodeMirror-scroll');&#10; if (scroll &amp;&amp; !scroll.hasAttribute('tabindex') &amp;&amp; !scroll.contains(field)) {&#10; scroll.setAttribute('tabindex', '0');&#10; scroll.setAttribute('role', 'region');&#10; scroll.setAttribute('aria-label', label);&#10; }&#10; })(cm, name);&#10; block._cm = cm;&#10; &#10; block._javaErrorLines = {};&#10; &#10; cm.on('cursorActivity', function() {&#10; var statusBar = block.querySelector('.java-error-status-bar');&#10; if (!statusBar) return;&#10; var cursor = cm.getCursor();&#10; var errMsg = block._javaErrorLines &amp;&amp; block._javaErrorLines[cursor.line];&#10; if (errMsg) {&#10; statusBar.textContent = 'Ligne ' + (cursor.line+1) + ' : ' + errMsg;&#10; statusBar.style.visibility = 'visible';&#10; } else {&#10; statusBar.textContent = '';&#10; statusBar.style.visibility = 'hidden';&#10; }&#10; });&#10; }&#10; &#10; if(name.endsWith('.java')) {&#10; if (!block.querySelector('.java-error-status-bar')) {&#10; var statusBar = document.createElement('div');&#10; statusBar.className = 'java-error-status-bar';&#10; statusBar.setAttribute('role', 'status');&#10; statusBar.setAttribute('aria-live', 'polite');&#10; statusBar.style.marginTop = '4px';&#10; statusBar.style.fontSize = '0.95em';&#10; statusBar.style.color = '#c00';&#10; statusBar.style.minHeight = '1.2em';&#10; statusBar.style.visibility = 'hidden';&#10; block.appendChild(statusBar);&#10; }&#10; }&#10; });&#10; &#10; function showTooltip(msg, x, y) {&#10; tooltip.textContent = msg;&#10; tooltip.style.display = 'block';&#10; tooltip.style.left = (x+10) + 'px';&#10; tooltip.style.top = (y+10) + 'px';&#10; }&#10; function hideTooltip() {&#10; tooltip.style.display = 'none';&#10; }&#10; &#10; function escapeHtml(str) {&#10; if (str == null) return '';&#10; return String(str)&#10; .replace(/&amp;/g, '&amp;amp;')&#10; .replace(/&lt;/g, '&amp;lt;')&#10; .replace(/&gt;/g, '&amp;gt;')&#10; .replace(/"/g, '&amp;quot;')&#10; .replace(/'/g, '&amp;#39;');&#10; }&#10; form.onsubmit = function(e){&#10; e.preventDefault();&#10; var java_files = [], txt_files = [];&#10; root.querySelectorAll('.export-file-block').forEach(function(block){&#10; var name = block.querySelector('.export-file-name').textContent;&#10; var ta = block.querySelector('textarea');&#10; var content = block._cm ? block._cm.getValue() : ta.value;&#10; if(name.endsWith('.java')) java_files.push({name: name, content: content});&#10; else txt_files.push({name: name, content: content});&#10; });&#10; &#10; resultDiv.textContent = 'Exécution en cours';&#10; resultDiv.classList.add('is-running');&#10; var execAnim = null;&#10; &#10; var controller = new AbortController();&#10; var timeoutId = setTimeout(function() { controller.abort(); }, 30000); &#10; fetch(endpoint, {&#10; method: 'POST',&#10; headers: { 'Content-Type': 'application/json' },&#10; body: JSON.stringify({ java_files: java_files, txt_files: txt_files }),&#10; signal: controller.signal&#10; })&#10; .then(function(r){&#10; clearInterval(execAnim);&#10; resultDiv.classList.remove('is-running');&#10; clearTimeout(timeoutId);&#10; if (!r.ok &amp;&amp; r.status !== 400 &amp;&amp; r.status !== 500) {&#10; throw new Error('Erreur HTTP ' + r.status + ' : ' + r.statusText);&#10; }&#10; return r.text();&#10; })&#10; .then(function(t){&#10; try {&#10; var j=JSON.parse(t);&#10; &#10; if(j.status==='ran_successfully') {&#10; resultDiv.innerHTML='&lt;pre style="color:#222;background:#e0ffe0;padding:12px;border-radius:6px;"&gt;'+escapeHtml(j.output||'').replace(/\n/g,'&lt;br&gt;')+escapeHtml(j.stderr||'')+'&lt;/pre&gt;';&#10; } else if(j.status==='compiling') {&#10; resultDiv.innerHTML='&lt;pre style="color:#c00;background:#ffe0e0;padding:12px;border-radius:6px;"&gt;'+escapeHtml(j.error||'').replace(/\n/g,'&lt;br&gt;')+escapeHtml(j.stderr||'')+'&lt;/pre&gt;';&#10; } else if(j.status==='runtime_error' || j.status==='error') {&#10; resultDiv.innerHTML=(j.output?'&lt;pre style="color:#222;background:#e0ffe0;padding:12px;border-radius:6px;"&gt;'+escapeHtml(j.output).replace(/\n/g,'&lt;br&gt;')+'&lt;/pre&gt;':'')+'&lt;pre style="color:#c00;background:#ffe0e0;padding:12px;border-radius:6px;"&gt;'+escapeHtml(j.stderr||j.error||'').replace(/\n/g,'&lt;br&gt;')+'&lt;/pre&gt;';&#10; } else {&#10; resultDiv.textContent = t;&#10; }&#10; &#10; if(j.status==='compiling') {&#10; var errorText = j.error || '';&#10; var errorRegex = new RegExp('([\\w./\\-]+\\.java):(\\d+): error: ([^\\n]+)([\\s\\S]*?)(?=\\n[\\w./\\-]+\\.java:|$)','g');&#10; var match;&#10; root.querySelectorAll('.export-file-block').forEach(function(block){&#10; if (block._cm) {&#10; block._cm.operation(function() {&#10; var marks = block._cm.getAllMarks();&#10; for (var i = 0; i &lt; marks.length; i++) { marks[i].clear(); }&#10; });&#10; }&#10; &#10; block._javaErrorLines = {};&#10; var statusBar = block.querySelector('.java-error-status-bar');&#10; if (statusBar) {&#10; statusBar.textContent = '';&#10; statusBar.style.visibility = 'hidden';&#10; }&#10; });&#10; while ((match = errorRegex.exec(errorText)) !== null) {&#10; var file = match[1], lineStr = match[2], msg = match[3], details = match[4];&#10; var line = parseInt(lineStr, 10) - 1;&#10; var errorMsg = (msg + (details ? details.replace(/\s+/g, ' ') : '')).trim();&#10; root.querySelectorAll('.export-file-block').forEach(function(block){&#10; var nameInput = block.querySelector('.export-file-name');&#10; if (nameInput &amp;&amp; (nameInput.textContent.trim() === file || nameInput.textContent.trim().endsWith('/'+file) || nameInput.textContent.trim().endsWith('\\'+file))) {&#10; if (block._cm) {&#10; block._cm.operation(function() {&#10; block._cm.markText({line:line, ch:0}, {line:line+1, ch:0}, {&#10; className: 'cm-java-error',&#10; title: errorMsg&#10; });&#10; });&#10; }&#10; &#10; if (!block._javaErrorLines) { block._javaErrorLines = {}; }&#10; block._javaErrorLines[line] = errorMsg;&#10; }&#10; });&#10; }&#10; &#10; root.querySelectorAll('.export-file-block').forEach(function(block){&#10; if (block._cm &amp;&amp; block._cm.getOption('lineNumbers')) {&#10; &#10; var statusBar = block.querySelector('.java-error-status-bar');&#10; if (statusBar) {&#10; var cursor = block._cm.getCursor();&#10; var errMsg = block._javaErrorLines &amp;&amp; block._javaErrorLines[cursor.line];&#10; if (errMsg) {&#10; statusBar.textContent = 'Ligne ' + (cursor.line+1) + ' : ' + errMsg;&#10; statusBar.style.visibility = 'visible';&#10; } else {&#10; statusBar.textContent = '';&#10; statusBar.style.visibility = 'hidden';&#10; }&#10; }&#10; }&#10; });&#10; } else if (j.status==='error' || j.status==='runtime_error') {&#10; var rtText = j.stderr || j.error || '';&#10; var rtCauses = rtText.split('\n').filter(function(l){ return /Caused by:/.test(l); });&#10; var rtMsg = (rtCauses.length&#10; ? rtCauses[rtCauses.length-1].replace(/^.*Caused by:\s*/, '')&#10; : (rtText.split('\n')[0] || 'Erreur d’exécution')).trim();&#10; root.querySelectorAll('.export-file-block').forEach(function(block){&#10; if (block._cm) {&#10; block._cm.operation(function(){&#10; block._cm.getAllMarks().forEach(function(m){ m.clear(); });&#10; });&#10; }&#10; block._javaErrorLines = {};&#10; var sb = block.querySelector('.java-error-status-bar');&#10; if (sb) { sb.textContent = ''; sb.style.visibility = 'hidden'; }&#10; });&#10; var rtRegex = /\(([\w$-]+\.java):(\d+)\)/g;&#10; var rtSeen = {}, rtMatch;&#10; while ((rtMatch = rtRegex.exec(rtText)) !== null) {&#10; var rtFile = rtMatch[1], rtLine = parseInt(rtMatch[2], 10) - 1;&#10; if (rtLine &lt; 0 || rtSeen[rtFile + ':' + rtLine]) { continue; }&#10; rtSeen[rtFile + ':' + rtLine] = true;&#10; root.querySelectorAll('.export-file-block').forEach(function(block){&#10; var nameEl = block.querySelector('.export-file-name');&#10; var nm = nameEl ? nameEl.textContent.trim() : '';&#10; if (block._cm &amp;&amp; rtLine &lt; block._cm.lineCount() &amp;&amp;&#10; (nm === rtFile || nm.endsWith('/'+rtFile) || nm.endsWith('\\'+rtFile))) {&#10; block._cm.operation(function(){&#10; block._cm.markText({line:rtLine, ch:0}, {line:rtLine+1, ch:0}, {&#10; className: 'cm-java-error', title: rtMsg&#10; });&#10; });&#10; if (!block._javaErrorLines) { block._javaErrorLines = {}; }&#10; block._javaErrorLines[rtLine] = rtMsg;&#10; }&#10; });&#10; }&#10; } else {&#10; &#10; root.querySelectorAll('.export-file-block').forEach(function(block){&#10; if (block._cm) {&#10; block._cm.operation(function() {&#10; var marks = block._cm.getAllMarks();&#10; for (var i = 0; i &lt; marks.length; i++) { marks[i].clear(); }&#10; });&#10; }&#10; block._javaErrorLines = {};&#10; var statusBar = block.querySelector('.java-error-status-bar');&#10; if (statusBar) {&#10; statusBar.textContent = '';&#10; statusBar.style.visibility = 'hidden';&#10; }&#10; });&#10; }&#10; } catch(e){ console.log(e); resultDiv.textContent=t; }&#10; })&#10; .catch(function(error){&#10; clearInterval(execAnim);&#10; resultDiv.classList.remove('is-running');&#10; clearTimeout(timeoutId);&#10; if (error.name === 'AbortError') {&#10; resultDiv.textContent = 'Erreur : délai d’attente dépassé (30 secondes).';&#10; } else {&#10; resultDiv.textContent = 'Erreur lors de la requête : ' + error;&#10; }&#10; });&#10; };&#10; &#10; root.querySelectorAll('.export-file-block').forEach(function(block){&#10; var cm = block._cm;&#10; if (!cm) return;&#10; cm.on('mouseover', function(cm, event) {&#10; var pos = cm.coordsChar({ left: event.clientX, top: event.clientY });&#10; var line = pos.line, ch = pos.ch;&#10; var cursor = cm.getCursor();&#10; if (line === cursor.line &amp;&amp; block._javaErrorLines &amp;&amp; block._javaErrorLines[line]) {&#10; var msg = block._javaErrorLines[line];&#10; showTooltip(msg, event.clientX, event.clientY);&#10; }&#10; });&#10; cm.on('mouseout', function(cm, event) {&#10; hideTooltip();&#10; });&#10; });&#10; })();&lt;/script&gt;&#10; &lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;p&gt;(La méthode &lt;code&gt;trim()&lt;/code&gt; retourne une chaîne après avoir éliminé les espaces avant et après la chaîne.)&lt;/p&gt;</description></item><item><title>Markdown</title><link>https://lemire.github.io/inf1220-nexam/docs/modules/module2/markdown/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://lemire.github.io/inf1220-nexam/docs/modules/module2/markdown/</guid><description>&lt;h1 id="markdown"&gt;&#10; Markdown&#10; &lt;a class="anchor" href="#markdown"&gt;#&lt;/a&gt;&#10;&lt;/h1&gt;&#10;&lt;p&gt;Les traitements de texte comme Microsoft Word ne sont pas destinés à l&amp;rsquo;écriture&#10;technique avec du code informatique. Il est préférable d&amp;rsquo;utiliser une approche&#10;telle que Markdown pour la rédaction technique.&lt;/p&gt;&#10;&lt;p&gt;Markdown est un langage de balisage léger conçu pour formater du texte de manière simple et lisible, tout en permettant une conversion facile vers du HTML. Il a été créé en 2004 par John Gruber, avec l’aide d’Aaron Swartz, dans le but de rendre l’écriture de documents structurés accessible à tous, sans complexité technique.&#10;John Gruber, blogueur et développeur américain, a développé Markdown pour répondre au besoin d’un format de texte qui soit à la fois facile à lire en brut et simple à convertir en HTML pour le web. Aaron Swartz, programmeur et militant de l’Internet, a contribué à l’implémentation du premier convertisseur Markdown. Le nom &lt;em&gt;Markdown&lt;/em&gt; évoque l’idée de « réduire » (mark down) la complexité du balisage traditionnel.&lt;/p&gt;</description></item></channel></rss>