From 7fb422d6d4a7a59c8f74d938371a4a10474e8ea4 Mon Sep 17 00:00:00 2001 From: Greg Burri Date: Thu, 17 Jul 2008 13:08:08 +0000 Subject: [PATCH] MOD avancement dans la Grande Restructuration --- js/euphorik.js | 231 ++---------------------------------------------- js/formateur.js | 167 ++++++++++++++++++++++++++++++++++ js/pages.js | 74 ++++++++++++++++ js/util.js | 12 +-- 4 files changed, 250 insertions(+), 234 deletions(-) create mode 100644 js/formateur.js create mode 100644 js/pages.js diff --git a/js/euphorik.js b/js/euphorik.js index 228ea3c..b93498f 100755 --- a/js/euphorik.js +++ b/js/euphorik.js @@ -48,7 +48,9 @@ var euphorik = {} ;; euphorik.include("json2") ;; euphorik.include("conf") -;; euphorik.include("util") +;; euphorik.include("util") +;; euphorik.include("formateur") +;; euphorik.include("pages") ;; euphorik.include("pageMinichat") ;; euphorik.include("pageAdmin") @@ -83,229 +85,6 @@ String.prototype.rtrim = function() { } -/////////////////////////////////////////////////////////////////////////////////////////////////// - -function Pages() -{ - this.pageCourante = null - this.pages = {} -} - -/** - * Accepte soit un objet soit un string. - * un string correspond au nom de la page, par exemple : "page" -> "page.html" - */ -Pages.prototype.ajouterPage = function(page) -{ - if (typeof page == "string") - { - this.pages[page] = page - } - else - { - page.pages = this // la magie des langages dynamiques : le foutoire - this.pages[page.nom] = page - } -} - -Pages.prototype.afficherPage = function(nomPage, forcerChargement) -{ - if (forcerChargement == undefined) forcerChargement = false - - var page = this.pages[nomPage] - if (page == undefined || (!forcerChargement && page == this.pageCourante)) return - - if (this.pageCourante != null && this.pageCourante.decharger) - this.pageCourante.decharger() - - $("#menu li").removeClass("courante") - $("#menu li." + nomPage).addClass("courante") - - this.pageCourante = page - var contenu = "" - if (typeof page == "string") - $.ajax({async: false, url: "pages/" + page + ".html", success : function(page) { contenu += page }}) - else - { - contenu += this.pageCourante.contenu() - } - $("#page").html(contenu).removeClass().addClass(this.pageCourante.nom + - (this.pageCourante.classes != undefined ? " " + this.pageCourante.classes() : "") // l'objet peut fournire des classes css supplémentaires sous la forme d'un string - ) - - if (this.pageCourante.charger) - this.pageCourante.charger() -} - -/////////////////////////////////////////////////////////////////////////////////////////////////// - -/** - * Classe permettant de formater du texte par exemple pour la substitution des liens dans les - * message par "[url]". - * TODO : améliorer l'efficacité des méthods notamment lié au smiles. - */ -function Formateur() -{ - this.smiles = euphorik.conf.smiles - this.protocoles = "http|https|ed2k" - - this.regexUrl = new RegExp("(?:(?:" + this.protocoles + ")://|www\\.)[^ ]*", "gi") - this.regexImg = new RegExp("^.*?\\.(gif|jpg|png|jpeg|bmp|tiff)$", "i") - this.regexDomaine = new RegExp("^(?:(?:" + this.protocoles + ")://|www\\.).*?([^/.]+\\.[^/.]+)(?:$|/).*$", "i") - this.regexTestProtocoleExiste = new RegExp("^(?:" + this.protocoles + ")://.*$", "i") - this.regexNomProtocole = new RegExp("^(.*?)://") -} - -/** - * Formate un pseudo saise par l'utilisateur. - * @param pseudo le pseudo brut - * @return le pseudo filtré - */ -Formateur.prototype.filtrerInputPseudo = function(pseudo) -{ - return pseudo.replace(/{|}/g, "").trim() -} - -Formateur.prototype.getSmilesHTML = function() -{ - var XHTML = "" - for (var sNom in this.smiles) - { - XHTML += "\""" - } - return XHTML -} - -/** - * Formatage complet d'un texte. - * @M le message - * @pseudo facultatif, permet de contruire le label des images sous la forme : " : " - */ -Formateur.prototype.traitementComplet = function(M, pseudo) -{ - return this.traiterLiensConv(this.traiterSmiles(this.traiterURL(this.traiterWikiSyntaxe(this.remplacerBalisesHTML(M)), pseudo))) -} - -/** - * Transforme les liens en entités clickables. - * Un lien vers une conversation permet d'ouvrire celle ci, elle se marque comme ceci dans un message : - * "{5F}" ou 5F est la racine de la conversation. - * Ce lien sera transformer en {5F} pouvant être clické pour créer la conv 5F. - */ -Formateur.prototype.traiterLiensConv = function(M) -{ - return M.replace( - /\{\w+\}/g, - function(lien) - { - return "" + lien + "" - } - ) -} - -/** - * FIXME : Cette méthode est attrocement lourde ! A optimiser. - * moyenne sur échantillon : 234ms - */ -Formateur.prototype.traiterSmiles = function(M) -{ - for (var sNom in this.smiles) - { - var ss = this.smiles[sNom] - for (var i = 0; i < ss.length; i++) - M = M.replace(ss[i], "\""") - } - return M -} - -Formateur.prototype.remplacerBalisesHTML = function(M) -{ - return M.replace(//g, ">").replace(/"/g, """) -} - -Formateur.prototype.traiterURL = function(M, pseudo) -{ - var thisFormateur = this - - var traitementUrl = function(url) - { - // si ya pas de protocole on rajoute "http://" - if (!thisFormateur.regexTestProtocoleExiste.test(url)) - url = "http://" + url - var extension = thisFormateur.getShort(url) - return "[" + extension[0] + "]" - } - return M.replace(this.regexUrl, traitementUrl) -} - -/** - * Formatage en utilisant un sous-ensemble des règles de mediwiki. - * par exemple ''italic'' devient italic - */ -Formateur.prototype.traiterWikiSyntaxe = function(M) -{ - return M.replace( - /'''(.*?)'''/g, - function(texte, capture) - { - return "" + capture + "" - } - ).replace( - /''(.*?)''/g, - function(texte, capture) - { - return "" + capture + "" - } - ) -} - -/** - * Renvoie une version courte de l'url. - * par exemple : http://en.wikipedia.org/wiki/Yakov_Smirnoff devient wikipedia.org - */ -Formateur.prototype.getShort = function(url) -{ - var estUneImage = false - var versionShort = null - var rechercheImg = this.regexImg.exec(url) - - if (rechercheImg != null) - { - versionShort = rechercheImg[1].toLowerCase() - if (versionShort == "jpeg") versionShort = "jpg" // jpeg -> jpg - estUneImage = true - } - else - { - var rechercheDomaine = this.regexDomaine.exec(url) - if (rechercheDomaine != null && rechercheDomaine.length >= 2) - versionShort = rechercheDomaine[1] - else - { - var nomProtocole = this.regexNomProtocole.exec(url) - if (nomProtocole != null && nomProtocole.length >= 2) - versionShort = nomProtocole[1] - } - } - - return [versionShort == null ? "url" : versionShort, estUneImage] - } - -/** - * Traite les pseudo et messages à être affiché dans le titre d'une image visualisé avec lightbox. - */ -Formateur.prototype.traiterPourFenetreLightBox = function(M, urlCourante) -{ - var thisFormateur = this - var traitementUrl = function(url) - { - return "[" + thisFormateur.getShort(url)[0] + (urlCourante == url ? "*" : "") + "]" - } - - return this.remplacerBalisesHTML(M).replace(this.regexUrl, traitementUrl) -} - - /////////////////////////////////////////////////////////////////////////////////////////////////// // les statuts possibes du client @@ -929,10 +708,10 @@ PageEvent.prototype.waitEvent2 = function(funSend, funsReceive) $(document).ready( function() { - var formateur = new Formateur() + var formateur = new euphorik.Formateur() var util = new euphorik.Util(formateur) var client = new Client(util) - var pages = new Pages() + var pages = new euphorik.Pages() // connexion vers le serveur (utilise un cookie qui traine) client.connexionCookie() diff --git a/js/formateur.js b/js/formateur.js new file mode 100644 index 0000000..34b108b --- /dev/null +++ b/js/formateur.js @@ -0,0 +1,167 @@ +// coding: utf-8 +// 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 . + +/*jslint laxbreak:true */ + + +/** + * Classe permettant de formater du texte par exemple pour la substitution des liens dans les + * message par "[url]". + * TODO : améliorer l'efficacité des méthods notamment lié au smiles. + */ +euphorik.Formateur = function() { + this.smiles = euphorik.conf.smiles; + this.protocoles = "http|https|ed2k"; + + this.regexUrl = new RegExp("(?:(?:" + this.protocoles + ")://|www\\.)[^ ]*", "gi"); + this.regexImg = new RegExp("^.*?\\.(gif|jpg|png|jpeg|bmp|tiff)$", "i"); + this.regexDomaine = new RegExp("^(?:(?:" + this.protocoles + ")://|www\\.).*?([^/.]+\\.[^/.]+)(?:$|/).*$", "i"); + this.regexTestProtocoleExiste = new RegExp("^(?:" + this.protocoles + ")://.*$", "i"); + this.regexNomProtocole = new RegExp("^(.*?)://"); +}; + +/** + * Formate un pseudo saise par l'utilisateur. + * @param pseudo le pseudo brut + * @return le pseudo filtré + */ +euphorik.Formateur.prototype.filtrerInputPseudo = function(pseudo) { + return pseudo.replace(/\{|\}/g, "").trim(); +}; + +euphorik.Formateur.prototype.getSmilesHTML = function() { + var XHTML = ""; + this.smiles.each(function(nom) { + XHTML += "\"""; + }); + return XHTML; +}; + +/** + * Formatage complet d'un texte. + * @m le message + * @pseudo facultatif, permet de contruire le label des images sous la forme : " : " + */ +euphorik.Formateur.prototype.traitementComplet = function(m, pseudo) { + return this.traiterLiensConv(this.traiterSmiles(this.traiterURL(this.traiterWikiSyntaxe(this.remplacerBalisesHTML(m)), pseudo))); +}; + +/** + * Transforme les liens en entités clickables. + * Un lien vers une conversation permet d'ouvrire celle ci, elle se marque comme ceci dans un message : + * "{5F}" ou 5F est la racine de la conversation. + * Ce lien sera transformer en {5F} pouvant être clické pour créer la conv 5F. + */ +euphorik.Formateur.prototype.traiterLiensConv = function(m) { + return m.replace( + /\{\w+\}/g, + function(lien) { + return "" + lien + ""; + } + ); +}; + +/** + * FIXME : Cette méthode est attrocement lourde ! A optimiser. + * moyenne sur échantillon : 234ms + */ +euphorik.Formateur.prototype.traiterSmiles = function(m) { + this.smiles.each(function(nom, smiles) { + for (var i = 0; i < smiles.length; i++) { + m = m.replace(smiles[i], "\"""); + } + }); + return m; +}; + +euphorik.Formateur.prototype.remplacerBalisesHTML = function(m) { + return m.replace(//g, ">").replace(/"/g, """); +}; + +euphorik.Formateur.prototype.traiterURL = function(m, pseudo) { + var thisFormateur = this; + var traitementUrl = function(url) { + // si ya pas de protocole on rajoute "http://" + if (!thisFormateur.regexTestProtocoleExiste.test(url)) { + url = "http://" + url; + } + var extension = thisFormateur.getShort(url); + return "[" + extension[0] + "]"; + }; + return m.replace(this.regexUrl, traitementUrl); +}; + +/** + * Formatage en utilisant un sous-ensemble des règles de mediwiki. + * par exemple ''italic'' devient italic + */ +euphorik.Formateur.prototype.traiterWikiSyntaxe = function(m) { + return m.replace( + /'''(.*?)'''/g, + function(texte, capture) { + return "" + capture + ""; + } + ).replace( + /''(.*?)''/g, + function(texte, capture) { + return "" + capture + ""; + } + ); +}; + +/** + * Renvoie une version courte de l'url. + * par exemple : http://en.wikipedia.org/wiki/Yakov_Smirnoff devient wikipedia.org + */ +euphorik.Formateur.prototype.getShort = function(url) { + var estUneImage = false; + var versionShort = null; + var rechercheImg = this.regexImg.exec(url); + + if (rechercheImg) { + versionShort = rechercheImg[1].toLowerCase(); + if (versionShort === "jpeg") { + versionShort = "jpg"; // jpeg -> jpg + } + estUneImage = true; + } else { + var rechercheDomaine = this.regexDomaine.exec(url); + if (rechercheDomaine && rechercheDomaine.length >= 2) { + versionShort = rechercheDomaine[1]; + } else { + var nomProtocole = this.regexNomProtocole.exec(url); + if (nomProtocole && nomProtocole.length >= 2) { + versionShort = nomProtocole[1]; + } + } + } + + return [versionShort ? versionShort : "url", estUneImage]; + }; + +/** + * Traite les pseudo et messages à être affiché dans le titre d'une image visualisé avec lightbox. + */ +euphorik.Formateur.prototype.traiterPourFenetreLightBox = function(M, urlCourante) { + var thisFormateur = this; + var traitementUrl = function(url) { + return "[" + thisFormateur.getShort(url)[0] + (urlCourante == url ? "*" : "") + "]"; + }; + + return this.remplacerBalisesHTML(M).replace(this.regexUrl, traitementUrl); +}; diff --git a/js/pages.js b/js/pages.js new file mode 100644 index 0000000..fe28860 --- /dev/null +++ b/js/pages.js @@ -0,0 +1,74 @@ +// coding: utf-8 +// 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 . + +/*jslint laxbreak:true */ + + +/** + * Gestion des pages. + */ +euphorik.Pages = function() { + this.pageCourante = undefined; + this.pages = {}; +}; + +/** + * Accepte soit un objet soit un string. + * un string correspond au nom de la page, par exemple : "page" -> "page.html" + */ +euphorik.Pages.prototype.ajouterPage = function(page) { + if (typeof page == "string") { + this.pages[page] = page; + } else { + page.pages = this; // la magie des langages dynamiques : le foutoire + this.pages[page.nom] = page; + } +}; + +euphorik.Pages.prototype.afficherPage = function(nomPage, forcerChargement) { + forcerChargement = forcerChargement || false; + + var page = this.pages[nomPage]; + if (!page || (!forcerChargement && page == this.pageCourante)) { + return; + } + + if (this.pageCourante && this.pageCourante.decharger) { + this.pageCourante.decharger(); + } + + $("#menu li").removeClass("courante"); + $("#menu li." + nomPage).addClass("courante"); + + this.pageCourante = page; + var contenu = ""; + if (typeof page == "string") { + $.ajax({async: false, url: "pages/" + page + ".html", success : function(page) { contenu += page; }}); + } else { + contenu += this.pageCourante.contenu(); + } + + $("#page").html(contenu).removeClass().addClass( + this.pageCourante.nom + + (this.pageCourante.classes ? " " + this.pageCourante.classes() : "") // l'objet peut fournire des classes css supplémentaires sous la forme d'un string + ); + + if (this.pageCourante.charger) { + this.pageCourante.charger(); + } +}; diff --git a/js/util.js b/js/util.js index c70f7e5..638fa6d 100644 --- a/js/util.js +++ b/js/util.js @@ -167,8 +167,7 @@ euphorik.Util.prototype.infoBulle = function(message, element, position) { var depassementDroit = (positionMessage.left + m.width()) - $("body").width(); if (depassementDroit > 0) { positionMessage.left -= depassementDroit; - } - else if (positionMessage.left < 0) { + } else if (positionMessage.left < 0) { positionMessage.left = 0; } @@ -200,8 +199,7 @@ euphorik.Util.prototype.setSelectionRange = function(input, selectionStart, sele if (input.setSelectionRange) { input.focus(); input.setSelectionRange(selectionStart, selectionEnd); - } - else if (input.createTextRange) { + } else if (input.createTextRange) { var range = input.createTextRange(); range.collapse(true); range.moveEnd('character', selectionEnd); @@ -233,12 +231,10 @@ euphorik.Util.prototype.replaceSelection = function(input, replaceString) { if (selectionStart != selectionEnd) { // has there been a selection this.setSelectionRange(input, selectionStart, selectionStart + replaceString.length); - } - else { // set caret + } else { // set caret this.setCaretToPos(input, selectionStart + replaceString.length); } - } - else if (document.selection) { + } else if (document.selection) { input.focus(); var range = document.selection.createRange(); if (range.parentElement() == input) { -- 2.45.2