diff --git a/Bash/move-gimp-directories.sh b/Bash/move-gimp-directories.sh
new file mode 100644
index 0000000..ff7042e
--- /dev/null
+++ b/Bash/move-gimp-directories.sh
@@ -0,0 +1,30 @@
+#!/usr/bin/env bash
+#Migration selon Freedesktop.org
+cd || exit 1
+if [ ! -d .local/share/GIMP/2.10/ ]
+then
+ mkdir -v -p .local/share/GIMP/2.10/
+fi
+for GIMP_DIR in brushes dynamics patterns palettes gradients fonts tool-presets scripts themes icons fractalexplorer gfig gflare gimpressionist
+do
+ if [ -d .config/GIMP/2.10/${GIMP_DIR} ]
+ then
+ mv -v .config/GIMP/2.10/${GIMP_DIR}/ .local/share/GIMP/2.10/${GIMP_DIR}
+ else
+ mkdir -v -p .local/share/GIMP/2.10/${GIMP_DIR}
+ fi
+done
+if [ ! -d .local/lib/GIMP/2.10/ ]
+then
+ mkdir -v -p .local/lib/GIMP/2.10/
+fi
+for GIMP_DIR in plug-ins modules interpreters environ
+do
+ if [ -d .config/GIMP/2.10/${GIMP_DIR} ]
+ then
+ mv -v .config/GIMP/2.10/${GIMP_DIR}/ .local/lib/GIMP/2.10/${GIMP_DIR}
+ else
+ mkdir -v -p .local/lib/GIMP/2.10/${GIMP_DIR}
+ fi
+done
+
diff --git a/Web/Pentis/Pentis.html b/Web/Pentis/Pentis.html
new file mode 100644
index 0000000..0afb46d
--- /dev/null
+++ b/Web/Pentis/Pentis.html
@@ -0,0 +1,55 @@
+
+
+
+
+
+
+ Pentis
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Pentis
+
+
+ Intéressé par les pentominos ?
+
+
+
+ Envie de voir derrière la scène ? Cliquer
+ ici
+
+
+ affichera la grille
+ .
+
+
+
+
+
+
diff --git a/Web/Pentis/Pentis.js b/Web/Pentis/Pentis.js
new file mode 100644
index 0000000..d5779a7
--- /dev/null
+++ b/Web/Pentis/Pentis.js
@@ -0,0 +1,1510 @@
+/**********************************|
+| Code pour interagir avec Pentis. |
+|**********************************/
+console.log("Début.");
+/* Pour contrôler la visibilité de la grille. */
+/* Texte interactif. */
+var iciTexte = document.getElementById("iciTexte");
+/* Lien hypertexte pour masquer la grille. */
+var ici = document.getElementById("ici");
+/* Cadre de la grille. */
+var cadreGrille = document.getElementById("grille");
+var grilleCachee = true;//Besoin de préciser ?
+function alterner(evt)
+{
+ if(grilleCachee)//Si caché.
+ {
+ cadreGrille.style.display = "block";
+ iciTexte.innerText = "masquera la grille";
+ grilleCachee = false;
+ }
+ else//Si visible.
+ {
+ cadreGrille.style.display = "none";
+ iciTexte.innerText = "affichera la grille";
+ grilleCachee = true;
+ }
+}
+/* Écoute des clics sur l'hypertexte "ici". */
+ici.addEventListener("click", alterner);
+/******************************************************************************/
+/* Début du tableau principal appelé la grille. */
+var grille = [];//Tableau principal vide.
+const NB_L = 24;//Total de ligne.
+const NB_C = 40;//Total de colonnes.
+for(let l=0; l fc.x-50 && cy < fc.y+50 && cy > fc.y-50)
+ {
+ console.log(`Curseur dans les flèches (x=${cx} y=${cy}).`);
+ }
+ if(cx < fc.x+50 && cx > fc.x-50 && cy < fc.y+50 && cy > fc.y-50)
+ {
+ console.log(`Curseur dans les flèches (x=${cx} y=${cy}).`);
+ }
+ if(cx < fc.x+50 && cx > fc.x-50 && cy < fc.y+50 && cy > fc.y-50)
+ {
+ console.log(`Curseur dans les flèches (x=${cx} y=${cy}).`);
+ }
+ if(cx < fc.x+50 && cx > fc.x-50 && cy < fc.y+50 && cy > fc.y-50)
+ {
+ console.log(`Curseur dans les flèches (x=${cx} y=${cy}).`);
+ }
+ /* Si dans les cercles. */
+ if(cx < bc.x+40 && cx > bc.x-40 && cy < bc.y+40 && cy > bc.y-40)
+ {
+ console.log(`Curseur dans les cercles (x=${cx} y=${cy}).`);
+ }
+ /* Si dans les ellipses. */
+ if(cx < ec.x+40 && cx > ec.x-40 && cy < ec.y+20 && cy > ec.y-20)
+ {
+ console.log(`Curseur dans les ellipses (x=${cx} y=${cy}).`);
+ }
+
+}
+/* Écouteur de position. */
+document.querySelector("#toile").addEventListener("mousemove", suivre);
+/* Écouteur de clic. */
+document.querySelector("#toile").addEventListener("click", action);
+/* Construction du tableau secondaire :
+ * un pentomino est construit dans un
+ * tableau mobile.
+ */
+var pento = {//Pentomino nul.
+ l:0,//Ligne d'origine.
+ c:0,//Colonne d'origine.
+ mtx:[//Sous-tableau mobile.
+ [0,0,0,0,0],
+ [0,0,0,0,0],
+ [0,0,0,0,0],
+ [0,0,0,0,0],
+ [0,0,0,0,0]
+ ]
+};
+nvPentomino(1,1,0,grille);
+tblEcrire(grille);//Matrice initiale.
+tblDessin(grille);
+var accesd = accesADroite(1,1,0,grille);
+var accesg = accesAGauche(1,1,0,grille);
+sprPentomino(1,1,0,grille);
+function essai(no)
+{
+ sprPentomino(no,0,0,grille);
+ nvPentomino(no+1,0,0,grille);
+ tblEcrire(grille);
+ tblDessin(grille);
+}
+var no=0;
+var boucle = window.setInterval( ()=>{no++; essai(no);}, 1000);
+window.setTimeout( ()=>{window.clearInterval(boucle);}, 64000);
+console.log("Fin.");
diff --git a/Web/Pentis/Pentis_404.md b/Web/Pentis/Pentis_404.md
new file mode 100644
index 0000000..0a4d2a9
--- /dev/null
+++ b/Web/Pentis/Pentis_404.md
@@ -0,0 +1,5 @@
+# 404 !
+
+## Fichier non trouvé.
+
+## :-(
diff --git a/Web/Pentis/Pentis_clair.css b/Web/Pentis/Pentis_clair.css
new file mode 100644
index 0000000..090a67f
--- /dev/null
+++ b/Web/Pentis/Pentis_clair.css
@@ -0,0 +1,32 @@
+/* Style clair. */
+body
+{
+ background: white;
+ color: black;
+}
+/* Toile où dessiner les pentominos. */
+canvas#toile
+{
+ border: 2px solid red;
+ width: 600px;
+ height: 800px;
+ margin: 1em;
+}
+/* Texte où faire apparaître la grille. */
+a#ici
+{
+ text-decoration: none;
+}
+a#ici:hover
+{
+ text-decoration: underline;
+}
+/* Grille effective. */
+div#grille
+{
+ width: 50%;
+ height: auto;
+ border: 2px dotted yellow;
+ line-height:0.8em;
+ display: none;
+}
diff --git a/Web/Pentis/Pentis_icone.svg b/Web/Pentis/Pentis_icone.svg
new file mode 100644
index 0000000..2a5f7fb
--- /dev/null
+++ b/Web/Pentis/Pentis_icone.svg
@@ -0,0 +1,31 @@
+
+
+ ]>
+
+
diff --git a/Web/Pentis/Pentis_sombre.css b/Web/Pentis/Pentis_sombre.css
new file mode 100644
index 0000000..ecdecb0
--- /dev/null
+++ b/Web/Pentis/Pentis_sombre.css
@@ -0,0 +1,32 @@
+/* Style sombre. */
+body
+{
+ background: black;
+ color: white;
+}
+/* Toile où dessiner les pentominos. */
+canvas#toile
+{
+ border: 2px solid red;
+ width: 600px;
+ height: 800px;
+ margin: 1em;
+}
+/* Texte où faire apparaître la grille. */
+a#ici
+{
+ text-decoration: none;
+}
+a#ici:hover
+{
+ text-decoration: underline;
+}
+/* Grille effective. */
+div#grille
+{
+ width: 50%;
+ height: auto;
+ border: 2px dotted yellow;
+ line-height:0.8em;
+ display: none;
+}
diff --git a/Web/Pentis/main.js b/Web/Pentis/main.js
new file mode 100644
index 0000000..2dc1213
--- /dev/null
+++ b/Web/Pentis/main.js
@@ -0,0 +1,116 @@
+#!/bin/env node
+var http = require('http');
+var url = require('url');
+var fs = require('fs');
+var console = require('console');
+console.log('Bonjour.');
+function deployment(req, res)//À déployer.
+{
+ var myURL = url.parse(req.url, true);//URL récupéré.
+ var name = myURL.query.name;//Option 'name'.
+ console.log('Début.');
+ console.log("L'adresse est\' "+req.url+" \'avec "+myURL.pathname+" pour chemin.");
+ /* Contrôle des pages. */
+ var uRLTest = (myURL.pathname !== "/Pentis.html") &&//Page principale.
+ (myURL.pathname !== "/Pentis.js") &&//JS principal.
+ (myURL.pathname !== "/Pentis_sombre.css") &&//CSS sombre.
+ (myURL.pathname !== "/Pentis_clair.css") &&//CSS clair.
+ (myURL.pathname !== "/Pentis_icone.svg") &&//Icone de page.
+ (myURL.pathname !== "/Pentis_404.md") &&//MD 404.
+ (myURL.pathname !== "/");//Racine.
+ function callback(err, data)
+ {
+ if(err)
+ {
+ console.error("Illisible ou inexistant!",err);
+ res.writeHead(302, {'Location': '/Pentis_404.md'});
+ res.end();
+ }
+ res.end(data);
+ }
+ if(uRLTest)//Page absente.
+ {
+ res.writeHead(302, {'Location': '/Pentis_404.md'});
+ res.end();
+ console.log("Adresse modifiée : /Pentis_404.md");
+ }
+ if (myURL.pathname === "/Pentis_sombre.css")//Si on demande le CSS.
+ {
+ console.log('Début CSS sombre.');
+ res.writeHead(200, {'Content-type' : 'text/css;charset=UTF-8', 'Content-Language': 'fr-FR, fr'});
+ fs.readFile("Pentis_sombre.css", 'utf8', callback);
+ console.log('CSS sombre envoyé.');
+ }
+ if (myURL.pathname === "/Pentis_clair.css")//Si on demande le CSS.
+ {
+ console.log('Début CSS clair.');
+ res.writeHead(200, {'Content-type' : 'text/css;charset=UTF-8', 'Content-Language': 'fr-FR, fr'});
+ fs.readFile("Pentis_clair.css", 'utf8', callback);
+ console.log('CSS clair envoyé.');
+ }
+ if (myURL.pathname === "/Pentis.js")//Si on demande le JS.
+ {
+ console.log('Début JS.');
+ res.writeHead(200, {'Content-type' : 'application/javascript;charset=UTF-8', 'Content-Language': 'fr-FR, fr'});
+ fs.readFile("Pentis.js", 'utf8', callback);
+ console.log('JS envoyé.');
+ }
+ if (myURL.pathname === "/Pentis_icone.svg")//Si on demande l'icone SVG.
+ {
+ console.log('Début icone-SVG.');
+ res.writeHead(200, {'Content-type' : 'image/svg+xml;charset=UTF-8', 'Content-Language': 'fr-FR, fr'});
+ fs.readFile("Pentis_icone.svg", 'utf8', callback);
+ console.log('icone-SVG envoyé.');
+ }
+
+ if(myURL.pathname === "/")//Redirection (alias) vers HTML.
+ {
+ res.writeHead(302, {'Location': '/Pentis.html'});
+ res.end();
+ console.log("Adresse modifiée : /Pentis.html");
+ }
+ if(myURL.pathname === "/Pentis.html")//Si on demande le HTML.
+ {
+ console.log('Début HTML.');
+ res.writeHead(200, {'Content-Type': 'text/html;charset=UTF-8', 'Content-Language': 'fr-FR, fr'});
+ fs.readFile('Pentis.html', 'utf8', callback);
+ console.log('HTML envoyé.');
+ console.log("----------res");
+ for(let item in res.headers)
+ {
+ console.log(item + ": " + res.headers[item]);
+ }
+ console.log("----------req");
+ for(let item in req.headers)
+ {
+ console.log(item + ": " + req.headers[item]);
+ }
+ console.log("----------\nRequête début:\n"+req.rawHeaders+"\nRequête fin\n----------");
+ console.log("----------\nRéponse début:\n"+res.rawHeaders+"\nRéponse fin\n----------");
+ }
+ if(myURL.pathname === "/Pentis_404.md")//Si on demande le MD 404.
+ {
+ console.log('Début MD 404.');
+ res.writeHead(200, {'Content-Type': 'text/markdown;charset=UTF-8, text/plain;charset=UTF-8', 'Content-Language': 'fr-FR, fr'});
+ fs.readFile('Pentis_404.md', 'utf8', callback);
+ console.log('MD 404 envoyé.');
+ }
+ console.log('Fin.');
+}
+var server = http.createServer(deployment);//Objet serveur à déployer.
+var listener = server.listen(1337, '127.0.0.1');//Sur écoute.
+console.log('Server running at http://127.0.0.1:1337/');
+var opt = {
+ host: '127.0.0.1',
+ port: '1337',
+ path: '/Pentis.html'};
+function lecture(res)
+{
+ console.log('--En-tête de réponse HTTP (HTML)--');
+ for(var item in res.headers)
+ {
+ console.log(item + ": " + res.headers[item]);
+ }
+ console.log('----');
+}
+http.get(opt, lecture);