Un site internet pour tester à la volée des codes html, css, javascript
Par
, en septembre 2020Tout est parti d’une question :
Comment peut-on faire tester du js aux élèves de NSI de la manière la plus simple et rapide ?
Introduction au projet
On ne voulait utiliser un site fait maison pour être sûr de pas se faire attaquer par le DNS du service informatique, qui peut arbitrairement décider de bloquer tel ou tel site web.
On a alors posé un cahier des charges :
- Un site permettant de charger du HTML, du CSS et du JS.
- Intuitif.
- Un retour console pour le JS car c’est mieux que d’aller dans la console du navigateur.
Une fois fait, on s’est mis a coder, on était large, on avait 2 jours pour proposer au prof un outil clé en main.
Interface
L’idée de l’interface est simple :
En rouge : le site retour.
En bleu : les zones d’édition.
En noir : le bouton pour envoyer tout ce beau code.
L’architecture est un système de div, très pratique pour la mise en page.
Afin de ne pas interférer avec le code éventuel des élèves, on donne des ID aléatoirement générés pour les parties vitales du site (inputs, outputs).
Le JavaScript
C’est la partie la plus importante du site.
Pour le bon fonctionnement du site, il nous faut 3 fonctions :
- Une fonction de récupération de console.
- Une fonction d’envoi du code.
- Une fonction traitant le CSS à envoyer.
Récupération console
On réécrit la fonction console.log et on associe cette fonction à la fonction window.onerror.
- console.log = function () {
- // On recupère le message passé en argument
- var message = [].join.call(arguments, " ");
- // On crée un nouvel élément <div> qu'on ajoute dans le code
- var div = document.createElement("div");
- div.appendChild(document.createTextNode(message));
- document.getElementById("vfRDiMPLLlGMBuKV").appendChild(div);
- };
- // Redéfinition de la fonction d'erreur
- window.onerror = console.log;
Fonction de traitement du CSS
On commence par convertir le CSS en une seule ligne.
Ensuite on split la chaine obtenue avec le charactère "}", ça nous permet d’avoir un Array contenant des strings commençant toujours par un objet à modifier en CSS ou une string vide.
Comme notre fenêtre visible et modifiable par les élèves porte l’ID "main", on ajoute "#main " a chaque objet ou on remplace "body" par "#main" afin de n’affecter que la div main.
- function convertCSS(code) {
- code = code.replace("\n", "");
- code = code.replace("\r", "");
- var newCode = code.split("}");
- for (var i = newCode.length ; i >= 0 ; i--) {
- if (newCode[i] !== undefined && newCode[i] !== "") {
- newCode[i] = newCode[i].replace(/^\s+|\s+$/g, "");
- if (newCode[i].startsWith("body")) {
- newCode[i] = "#main " + newCode[i].substring(4);
- }
- if (!newCode[i].startsWith("#main")) {
- newCode[i] = "#main " + newCode[i];
- }
- newCode[i] += "}";
- }
- }
- return newCode.join("");
- }
Fonction d’envoi du code
On commence par clear la console.
Puis on envoie un retour console avec un id précis pour changer son style. Ce retour permet de nous assurer que le code a été envoyé.
On actualise les balises du site qui assurent le bon fonctionnement de la fenêtre main en prenant bien soin de traiter le CSS.
Problème principal lors de la réalisation de cette fonction :
Pour pouvoir modifier le JS de la fenêtre, il est indispensable de supprimer la balise < script > qui contient l’ancien JS. On ne peut pas juste réécrire le JS, sinon la cache ne s’actualise pas.
- // Fonction d'envoi du code
- var sendCode = function() {
- document.getElementById("vfRDiMPLLlGMBuKV").innerHTML = "<p>Retour console</p>";
- // On crée un nouvel élément <div> qu'on ajoute dans le code
- var div = document.createElement("div");
- div.id = "change";
- div.appendChild(document.createTextNode("Code envoyé !"));
- document.getElementById("vfRDiMPLLlGMBuKV").appendChild(div);
- // Changement HTML
- document.getElementById("main").innerHTML = document.getElementById("html").value;
- // Changement JS
- document.getElementById("toAdd").remove();
- var script = document.createElement("script");
- script.id = "toAdd";
- document.body.appendChild(script);
- document.getElementById("toAdd").innerHTML = document.getElementById("js").value;
- // Changement CSS
- document.getElementById("maincss").innerHTML = convertCSS(document.getElementById("css").value);
- if(document.getElementById("html").value.toString().indexOf("<body onload=") !== -1)
- window[
- document.getElementById("html").value.substring(
- document.getElementById("html").value.toString().indexOf("\""
- ,document.getElementById("html").value.toString().indexOf("<body onload="))+1
- ,document.getElementById("html").value.toString().indexOf("("
- ,document.getElementById("html").value.toString().indexOf("<body onload=")))]();
- }
Conclusion
Le site fut fini dans les temps et opérationnel !
https://workspace.nsi.xyz/