From 4aa85a2e80963b73773e748fd4402fab2ad852ce Mon Sep 17 00:00:00 2001 From: Greg Burri Date: Thu, 7 Aug 2008 20:29:21 +0000 Subject: [PATCH] =?utf8?q?MOD=20am=C3=A9lioration=20de=20l'affichage=20des?= =?utf8?q?=20outils=20des=20messages=20(extraction)=20(pas=20fini)?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- js/pageMinichat/conversation.js | 54 +++-- js/pageMinichat/conversations.js | 47 ++-- js/pageMinichat/message.js | 1 - js/pageMinichat/pageMinichat.js | 14 +- styles/1/pageMinichat.css | 10 +- tools/tools.rb | 404 ++++++++++++++++--------------- 6 files changed, 275 insertions(+), 255 deletions(-) diff --git a/js/pageMinichat/conversation.js b/js/pageMinichat/conversation.js index 71a7b3d..645c4d5 100644 --- a/js/pageMinichat/conversation.js +++ b/js/pageMinichat/conversation.js @@ -253,7 +253,7 @@ euphorik.Conversation.prototype.flush = function() { } }); - var DOM = $(XHTML); + var DOM = $(XHTML); // pour chaque nouveau message au niveau du document on lui assigne ses événements DOM.each(function() { thisConversation.attacherEventsSurMessage(this); }); @@ -293,9 +293,6 @@ euphorik.Conversation.prototype.attacherEventsSurMessage = function(element) { if (idMess in this.conversations.messagesRepond) { $(element).addClass("repondEnEvidence"); } - - this.util.infoBulle("Extraction de la conversation à partir de ce message", $(".extraire", element)); - this.util.infoBulle("Extraction de la conversation complète", $(".extraireCompletement", element)); var thisConversation = this; $(".lienConv", element).click( @@ -307,30 +304,35 @@ euphorik.Conversation.prototype.attacherEventsSurMessage = function(element) { } ); - $(element).click( - function(event) { - if ($(event.target).is("a") || $(event.target).parents("#outilsBan").length > 0) { - return; - } - - // extraction d'une conversation - if ($(event.target).is(".extraire")) { - thisConversation.conversations.ouvrirConversation(idMess); - return; - } - - if ($(event.target).is(".extraireCompletement")) { - thisConversation.conversations.ouvrirConversation(thisConversation.messagesParId[idMess].racineId); - return; - } + $(element).click(function(event) { + if ($(event.target).is("a") || $(event.target).parents("#outilsBan").length > 0) { + return; + } - // met ou enlève la mise en evidence du message - thisConversation.conversations.toggleMessageRepond(thisConversation.messagesParId[idMess]); + // met ou enlève la mise en evidence du message + thisConversation.conversations.toggleMessageRepond(thisConversation.messagesParId[idMess]); - // donne le focus à la ligne de saisie - $("form input.message").focus(); + // donne le focus à la ligne de saisie + $("form input.message").focus(); + }).hover(function(event) { // affiche les outils liées au message + var top = $(this).offset().top + var left = $(this).offset().left + $(this).width() - thisConversation.util.outilsMessage.width() + thisConversation.util.outilsMessage.css("top", top + 1).css("left", left).prependTo(this).show(); + TODO + // + // extraction d'une conversation + /*if ($(event.target).is(".extraire")) { + thisConversation.conversations.ouvrirConversation(idMess); + return; } - ); + + if ($(event.target).is(".extraireCompletement")) { + thisConversation.conversations.ouvrirConversation(thisConversation.messagesParId[idMess].racineId); + return; + }*/ + }, function(event) { + thisConversation.util.outilsMessage.hide(); + }); // mise en évidence de la conversation $(".entete", element).hover( @@ -389,7 +391,7 @@ euphorik.Conversation.prototype.attacherEventsSurMessage = function(element) { ); }, function() { - $("#outilsBan", this).hide(); + thisConversation.util.outilsBan.hide(); } ); } diff --git a/js/pageMinichat/conversations.js b/js/pageMinichat/conversations.js index 0ad7878..90e5943 100644 --- a/js/pageMinichat/conversations.js +++ b/js/pageMinichat/conversations.js @@ -99,7 +99,7 @@ euphorik.Conversations.prototype.enleverMessageRepond = function(mess) { * Définit un message comme y répondant. */ euphorik.Conversations.prototype.ajouterMessageRepond = function(mess) { - var thisMessages = this; + var thisConversations = this; // est-ce que le message fait partie de la même conversation que les autres messages ? // TODO : solution plus élégante pour prendre un mess parmis messagesRepond !? @@ -126,7 +126,7 @@ euphorik.Conversations.prototype.ajouterMessageRepond = function(mess) { $("#" + mess.getId(this.prefixIdMessage)).click( function() { $(this).fadeOut("normal", function() { - thisMessages.enleverMessageRepond(mess); + thisConversations.enleverMessageRepond(mess); $("form#posterMessage #repondA .messages").hide(); }); } @@ -246,9 +246,7 @@ euphorik.Conversations.prototype.ajouterMessages = function(elements, numConvers * @param numConversation le numéro de la conversation, 0 = principale * @return true si une nouvelle conversation a été créée sinon false */ -euphorik.Conversations.prototype.ajouterMessage = function(element, numConversation) { - var thisConversations = this; - +euphorik.Conversations.prototype.ajouterMessage = function(element, numConversation) { var message = new euphorik.Message( this.client, @@ -267,24 +265,23 @@ euphorik.Conversations.prototype.ajouterMessage = function(element, numConversat return nouvelleConversation; }; -euphorik.Conversations.prototype.nouvelleConversation = function(num) -{ - var thisMessages = this; +euphorik.Conversations.prototype.nouvelleConversation = function(num) { + var thisConversations = this; this.conversations[num] = new euphorik.Conversation(this, num); this.conversations[num].setFunPage( function(num) { // page suivante - thisMessages.client.pageSuivante(num - 1); - thisMessages.rafraichirMessages(true); + thisConversations.client.pageSuivante(num - 1); + thisConversations.rafraichirMessages(true); }, function(num) { // page précédente - thisMessages.client.pagePrecedente(num - 1); - thisMessages.rafraichirMessages(true); + thisConversations.client.pagePrecedente(num - 1); + thisConversations.rafraichirMessages(true); }, function(num) { // retour à la page une - if (thisMessages.client.goPremierePage(num - 1)) { - thisMessages.rafraichirMessages(true); + if (thisConversations.client.goPremierePage(num - 1)) { + thisConversations.rafraichirMessages(true); } } ); @@ -365,7 +362,7 @@ euphorik.Conversations.prototype.viderMessages = function() { * @param vider vide tous les messages avant d'afficher les nouveaux */ euphorik.Conversations.prototype.rafraichirMessages = function(vider) { - var thisMessages = this; + var thisConversations = this; vider = vider || false; @@ -376,14 +373,14 @@ euphorik.Conversations.prototype.rafraichirMessages = function(vider) { } this.comet.waitEvent( - function() { return thisMessages.getJSONrafraichirMessages(); }, + function() { return thisConversations.getJSONrafraichirMessages(); }, { "new_troll" : - function(data) { - thisMessages.trollIdCourant = data.troll_id; - $("#trollCourant .troll").html(thisMessages.formateur.traitementComplet(data.content)).unbind("click").click( + function(data) { + thisConversations.trollIdCourant = data.troll_id; + $("#trollCourant .troll").html(thisConversations.formateur.traitementComplet(data.content)).unbind("click").click( function() { - thisMessages.ouvrirConversation(data.message_id); + thisConversations.ouvrirConversation(data.message_id); } ); @@ -392,19 +389,19 @@ euphorik.Conversations.prototype.rafraichirMessages = function(vider) { "new_messages" : function(data) { if (vider) { - thisMessages.viderMessages(); + thisConversations.viderMessages(); } // ajoute les messages reçus à leur conversation respective data.conversations.each(function(numConv, conv) { - if (!thisMessages.ajouterMessages(conv, numConv)) { - thisMessages.util.messageDialogue("La conversation {" + thisMessages.client.conversations[numConv - 1].root.toString(36) + "} n'existe pas"); - thisMessages.client.supprimerConversation(numConv - 1); + if (!thisConversations.ajouterMessages(conv, numConv)) { + thisConversations.util.messageDialogue("La conversation {" + thisConversations.client.conversations[numConv - 1].root.toString(36) + "} n'existe pas"); + thisConversations.client.supprimerConversation(numConv - 1); } }); if (vider) { - thisMessages.afficherMessagesRepondConversations(); + thisConversations.afficherMessagesRepondConversations(); } vider = false; diff --git a/js/pageMinichat/message.js b/js/pageMinichat/message.js index ba15ddc..417f330 100644 --- a/js/pageMinichat/message.js +++ b/js/pageMinichat/message.js @@ -144,7 +144,6 @@ euphorik.Message.prototype.XHTML = function(messagePair, pre) { (this.systeme ? " systeme" : "") + (this.ekMaster ? " ekMaster" + this.degreeOstentatoire : "") + "\">" + - "
"+ "" + "[" + this.date + "]" + "" + this.auteurId + "" + identifiant + "" + diff --git a/js/pageMinichat/pageMinichat.js b/js/pageMinichat/pageMinichat.js index da6ba74..d289a99 100755 --- a/js/pageMinichat/pageMinichat.js +++ b/js/pageMinichat/pageMinichat.js @@ -35,7 +35,7 @@ euphorik.PageMinichat = function(client, formateur, util) { }; euphorik.PageMinichat.prototype.contenu = function() { - // le fait que tout soit collé est fait exprès, permet d'éviter d'avoir des espaces supplémentaires entre les spans' + // le fait que tout soit collé est fait exprès, permet d'éviter d'avoir des espaces supplémentaires entre les spans var formulaireXHTML = '' + '
' + '

' + @@ -71,13 +71,14 @@ euphorik.PageMinichat.prototype.charger = function() { this.conversations = new euphorik.Conversations(this.client, this.formateur, this.util, this.fragment); this.chargerConversationsFragment(); - + this.conversations.rafraichirMessages(true); this.util.setCaretToEnd($("form#posterMessage input.message")[0]); // les outils de bannissement (uniquement pour les ekMaster) if (this.client.ekMaster) { + // TODO : augmentation un peu space, à revoir this.util.outilsBan = $( '' + ' ' + @@ -94,6 +95,11 @@ euphorik.PageMinichat.prototype.charger = function() { this.util.infoBulle("La raison", $("input", this.util.outilsBan)); } + // la barre d'outils liée à chaque message + this.util.outilsMessage = $('

').prependTo("#page.minichat") + this.util.infoBulle("Extraction de la conversation à partir de ce message", $(".extraire", this.util.outilsMessage)); + this.util.infoBulle("Extraction de la conversation complète", $(".extraireCompletement", this.util.outilsMessage)); + this.util.infoBulle("Ouvrir la conversation liée au troll de la semaine", $("#trollCourant .troll")); this.util.infoBulle("Cliquer sur les messages pour les enlevers de la liste", @@ -145,7 +151,7 @@ euphorik.PageMinichat.prototype.charger = function() { } ); // - + // événements var nouveauMessage = function() { @@ -279,7 +285,7 @@ euphorik.PageMinichat.prototype.envoyerMessage = function(pseudo, message) { xmlHttpRequest.setRequestHeader("X-Requested-With", ""); }, success : function(data, textStatus) { - if(data.reply === "ok") { + if(data.reply === "ok") { // TODO : revoir cette partie // met à jour la classe des messages auquel repond celui ci (c'est un peu de la triche) TODO : ya mieux ? objectEach(thisPageMinichat.conversations.messagesRepond, function(messId) { diff --git a/styles/1/pageMinichat.css b/styles/1/pageMinichat.css index d8fa986..6804ed4 100755 --- a/styles/1/pageMinichat.css +++ b/styles/1/pageMinichat.css @@ -335,11 +335,13 @@ margin-left: 5px; } #page.minichat .outilsMess { - float: right; + position: absolute; display: none; -} -#page.minichat div.message:hover .outilsMess { - display: block + opacity: 0.6; + + /* Hack IE 7 */ + filter: alpha(opacity = 60); + zoom: 1 } #page.minichat .extraire { float: right; diff --git a/tools/tools.rb b/tools/tools.rb index aff62af..5472a3c 100644 --- a/tools/tools.rb +++ b/tools/tools.rb @@ -1,195 +1,209 @@ -#!/usr/bin/ruby -# coding: utf-8 -=begin -Copyright 2008 Grégory Burri - -This file is part of Euphorik. - -Euphorik is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -Euphorik is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with Euphorik. If not, see . -=end - -# TODO : -# - création de unit tests (voir eunit) et validation avant la mise en prod - -# Met à disposition plusieurs outils (classes), tel que : -# - Vérification du code javascript -# - Mise à jour du numéro de version à partir du fichier VERSION -# - Mise en production et en preproduction -# tools.rb peut s'utiliser à la ligne de commande, exemples : -# * Mise en production : -# ./tools.rb --doprod gburri@euphorik.ch:/var/www/euphorik -# * Mise en préproduction, l'emplacement de production peut être indiqué pour copier la base -# ./tools.rb --dopreprod gburri@euphorik.ch:/var/www/euphorik_preprod --prod gburri@euphorik.ch:/var/www/euphorik - -# Classe permettant la vérification du code JS pas jslint. -# Passe en revu chaque fichier js de manière récursive à partir d'un dossier de départ.s -class VerifJS - - def initialize(dossier) - @dossier = dossier - end - - def verifier - verifierRecu(@dossier) - end - - def verifierRecu(dossier) - Dir.foreach(dossier){|fichier| - if fichier != '.' and fichier != '..' and File.directory?(fichier) and fichier != 'dirs' - if not verifierRecu(dossier + '/' + fichier) - return false - end - elsif fichier[-3, 3] == '.js' - puts "== Vérification de #{dossier}/#{fichier} ==" - system("java org.mozilla.javascript.tools.shell.Main jslint.js #{dossier}/#{fichier}") - puts $?.exitstatus - if $?.exitstatus > 0 - return false - end - end - } - return true - end -end - -# Classe de gestion de la version -class Version - # @param dossier la racine du site (par exemple "/var/www/euphorik" - def initialize(dossier) - @dossier = dossier - File.open(@dossier + '/VERSION') {|file| - @version = file.readline() - } - # les fichiers HTML dans lesquels mettre à jour la version - @fichiers = ['/pages/about.html'] - @balise = /().*?(<\/span>)/ - end - - # met à jour la version dans les fichiers @fichiers - def maj - @fichiers.each{|fichier| - fichier = @dossier + fichier - lines = IO.readlines(fichier) - File.open(fichier, 'w') {|io| - lines.each{|l| - io.write(l.sub(@balise){|m| $1 + @version + $2}) - } - } - } - end -end - -# Permet la mise en production et preproduction -class MiseEnProd - # obsolète ! - @@rep_remote = '/var/www/euphorik' - @@host = 'euphorik.ch' - @@opt_rsync = '' - - def initialize(prod_uri, preprod_uri) - @prod = prod_uri - @preprod = preprod_uri - end - - # Effectue la mise en production. - def miseEnProd - end - - # Effectue la mise en préproduction. - def miseEnPreProd - end - - def creer_remote_rep(rep) - begin - `ssh #{@@host} "mkdir #{@@rep_remote}/#{rep}"` - rescue - end - end - - def compiler_partie_serveuse - Dir.chdir(@@rep_remote + '/modules') - puts `make` - if $?.exitstatus != 0 - puts "Echec de compilation de la partie serveuse" - exit 1 - end - Dir.chdir('..') - end - - def creer_repertoire_bd - # création du repertoire BD - creer_remote_rep('BD') - creer_remote_rep('BD/backup') - `ssh #{@@host} "chmod g+w #{@@rep_remote}/BD"` - end - - # css, images, html, etc.. - def copier_partie_statique - print `rsync #{$opt_rsync} index.yaws #{$host}:#{$rep_remote}` - print `rsync #{$opt_rsync} favicon.ico #{$host}:#{$rep_remote}` - print `rsync #{$opt_rsync} -r css #{$host}:#{$rep_remote}` - print `rsync #{$opt_rsync} -r pages #{$host}:#{$rep_remote}` - print `rsync #{$opt_rsync} -r --exclude 'autres' img #{$host}:#{$rep_remote}` - end - - # minification et package des fichiers js dans euphorik.js - def pack_js - # copie des js avec minification - rep_js = 'js' - creer_remote_rep(rep_js) - Dir.entries(rep_js).each{|fichier| - if fichier[0..0] != '.' and fichier != 'debug.js' - puts "Minimisation et copie de #{fichier}" - print `tools/jsmin.rb < #{rep_js}/#{fichier} | ssh #{@@host} "cat > #{@@rep_remote}/#{rep_js}/#{fichier}"` - end - } - end - - def copie_modules_serveurs - # copie des modules erlang - creer_remote_rep('modules') - `rsync #{@@opt_rsync} -r --exclude 'euphorik_test.beam' modules/ebin #{@@host}:#{@@rep_remote}/modules` - `rsync #{@@opt_rsync} -r modules/include #{@@host}:#{@@rep_remote}/modules` - end - - def set_droits_fichiers - # attribution des droits - `ssh #{$host} "chmod -R g+rx #{$rep_remote}"` - end - - def maj - # execution du script de mise à jour - print `cat tools/mise_en_prod.erl | ssh #{$host} "cat > /tmp/mise_en_prod.erl"` - print `ssh #{$host} "chmod u+x /tmp/mise_en_prod.erl; /tmp/mise_en_prod.erl; rm /tmp/mise_en_prod.erl"` - end -end - - -# Traite la ligne de commande lorsque tools.rb est utilisé comme tel -class Commande - def traiter - ARGV - #miseEnProd = MiseEnProd.new("gburri@euphorik.ch:/var/www/euphorik", "gburri@euphorik.ch:/var/www/euphorik_preprod") - #miseEnProd.miseEnPreProd() - - #verifJS = VerifJS.new("../js") - #verifJS.verifier() - - #version = Version.new("..") - #version.maj() - end -end - -cl = Commande.new -cl.traiter() +#!/usr/bin/ruby +# coding: utf-8 +=begin +Copyright 2008 Grégory Burri + +This file is part of Euphorik. + +Euphorik is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Euphorik is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with Euphorik. If not, see . +=end + +# TODO : +# - création de unit tests (voir eunit) et validation avant la mise en prod + +# Met à disposition plusieurs outils (classes), tel que : +# - Vérification du code javascript +# - Mise à jour du numéro de version à partir du fichier VERSION +# - Mise en production et en preproduction +# tools.rb peut s'utiliser à la ligne de commande, exemples : +# * Mise en production : +# ./tools.rb --doprod gburri@euphorik.ch:/var/www/euphorik +# * Mise en préproduction, l'emplacement de production peut être indiqué pour copier la base +# ./tools.rb --dopreprod gburri@euphorik.ch:/var/www/euphorik_preprod --prod gburri@euphorik.ch:/var/www/euphorik + +# voir : http://net-ssh.rubyforge.org/ssh/v2/api/index.html +require 'net/ssh' + +# Classe permettant la vérification du code JS pas jslint. +# Passe en revu chaque fichier js de manière récursive à partir d'un dossier de départ.s +class VerifJS + + def initialize(dossier) + @dossier = dossier + end + + def verifier + verifierRecu(@dossier) + end + + def verifierRecu(dossier) + Dir.foreach(dossier){|fichier| + if fichier != '.' and fichier != '..' and File.directory?(fichier) and fichier != 'dirs' + if not verifierRecu(dossier + '/' + fichier) + return false + end + elsif fichier[-3, 3] == '.js' + puts "== Vérification de #{dossier}/#{fichier} ==" + system("java org.mozilla.javascript.tools.shell.Main jslint.js #{dossier}/#{fichier}") + puts $?.exitstatus + if $?.exitstatus > 0 + return false + end + end + } + return true + end +end + +# Classe de gestion de la version +class Version + # @param dossier la racine du site (par exemple "/var/www/euphorik" + def initialize(dossier) + @dossier = dossier + File.open(@dossier + '/VERSION') {|file| + @version = file.readline() + } + # les fichiers HTML dans lesquels mettre à jour la version + @fichiers = ['/pages/about.html'] + @balise = /().*?(<\/span>)/ + end + + # met à jour la version dans les fichiers @fichiers + def maj + @fichiers.each{|fichier| + fichier = @dossier + fichier + lines = IO.readlines(fichier) + File.open(fichier, 'w') {|io| + lines.each{|l| + io.write(l.sub(@balise){|m| $1 + @version + $2}) + } + } + } + end +end + +# Permet la mise en production et preproduction +class MiseEnProd + # obsolète ! + @@rep_remote = '/var/www/euphorik' + @@host = 'euphorik.ch' + @@opt_rsync = '' + + def initialize(prod_uri, preprod_uri) + @prod = prod_uri + @preprod = preprod_uri + end + + # Effectue la mise en production. + def miseEnProd + end + + # Effectue la mise en préproduction. + def miseEnPreProd + end + + def creer_remote_rep(rep) + begin + `ssh #{@@host} "mkdir #{@@rep_remote}/#{rep}"` + rescue + end + end + + def compiler_partie_serveuse + Dir.chdir(@@rep_remote + '/modules') + puts `make` + if $?.exitstatus != 0 + puts "Echec de compilation de la partie serveuse" + exit 1 + end + Dir.chdir('..') + end + + def creer_repertoire_bd + # création du repertoire BD + creer_remote_rep('BD') + creer_remote_rep('BD/backup') + `ssh #{@@host} "chmod g+w #{@@rep_remote}/BD"` + end + + # css, images, html, etc.. + def copier_partie_statique + print `rsync #{$opt_rsync} index.yaws #{$host}:#{$rep_remote}` + print `rsync #{$opt_rsync} favicon.ico #{$host}:#{$rep_remote}` + print `rsync #{$opt_rsync} -r css #{$host}:#{$rep_remote}` + print `rsync #{$opt_rsync} -r pages #{$host}:#{$rep_remote}` + print `rsync #{$opt_rsync} -r --exclude 'autres' img #{$host}:#{$rep_remote}` + end + + # minification et package des fichiers js dans euphorik.js + def pack_js + # copie des js avec minification + rep_js = 'js' + creer_remote_rep(rep_js) + Dir.entries(rep_js).each{|fichier| + if fichier[0..0] != '.' and fichier != 'debug.js' + puts "Minimisation et copie de #{fichier}" + print `tools/jsmin.rb < #{rep_js}/#{fichier} | ssh #{@@host} "cat > #{@@rep_remote}/#{rep_js}/#{fichier}"` + end + } + end + + def copie_modules_serveurs + # copie des modules erlang + creer_remote_rep('modules') + `rsync #{@@opt_rsync} -r --exclude 'euphorik_test.beam' modules/ebin #{@@host}:#{@@rep_remote}/modules` + `rsync #{@@opt_rsync} -r modules/include #{@@host}:#{@@rep_remote}/modules` + end + + def set_droits_fichiers + # attribution des droits + `ssh #{$host} "chmod -R g+rx #{$rep_remote}"` + end + + def maj + # execution du script de mise à jour + print `cat tools/mise_en_prod.erl | ssh #{$host} "cat > /tmp/mise_en_prod.erl"` + print `ssh #{$host} "chmod u+x /tmp/mise_en_prod.erl; /tmp/mise_en_prod.erl; rm /tmp/mise_en_prod.erl"` + end +end + + +# Traite la ligne de commande lorsque tools.rb est utilisé comme tel +class Commande + def traiter + #ARGV + + Net::SSH.start('euphorik.ch', 'gburri') {|ssh| + output = ssh.exec!("hostname") + stdout = "" + ssh.exec!("ls -l /tmp"){|channel, stream, data| + stdout << data if stream == :stdout + } + puts stdout + } + + + #miseEnProd = MiseEnProd.new("gburri@euphorik.ch:/var/www/euphorik", "gburri@euphorik.ch:/var/www/euphorik_preprod") + #miseEnProd.miseEnPreProd() + + #verifJS = VerifJS.new("../js") + #verifJS.verifier() + + #version = Version.new("..") + #version.maj() + end +end + +cl = Commande.new +cl.traiter() -- 2.45.2