|
Par
franckysolo
Mise à jour : 27/07/2011
64 visites depuis 7 jours,
classé 638/786
|
1 | <gras>texte</gras> |








:















1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 | <!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <title>ZForm</title> <script type="text/javascript" src="public/js/mootools.js"></script> <script type="text/javascript" src="public/js/zform.js"></script> <link href="public/css/zform.css" rel="stylesheet" type="text/css" media="all" /> <script type="text/javascript"> window.addEvent('domready', function () { var form = new ZForm(); form.listeningEvent(); }); </script> </head> <body> <div id="main"> <form id="zform" action="" method="post"> <fieldset><legend>ZForm</legend> <!-- Boutons simples --> <img data-bt="gras" class="splButtons bt-code" src="public/images/boutons/bt-gras.gif" alt="Gras" title="Gras" /> <img data-bt="italique" class="splButtons bt-code" src="public/images/boutons/bt-italique-black.gif" alt="Itlalique" title="Italique"/> <img data-bt="souligne" class="splButtons bt-code" src="public/images/boutons/bt-souligne.gif" alt="Souligné" title="Souligner"/> <img data-bt="barre" class="splButtons bt-code" src="public/images/boutons/bt-surligne.gif" alt="Barré" title="Barrer" /> <img data-bt="marge" class="splButtons bt-code" src="public/images/boutons/bt-marge.gif" alt="Marge" title="Marge" /> <img data-bt="gras" class="splButtons bt-code" src="public/images/boutons/bt-gras.gif" alt="Gras" title="Gras" /> <!-- Boutons choix --> <img data-bt="liste" class="dlgButtons bt-code" src="public/images/boutons/bt-puce.gif" alt="Listes" /> <img data-bt="listnum" class="dlgButtons bt-code" src="public/images/boutons/bt-pucenum.gif" alt="Listes Numériques" /> <img data-bt="tableau" class="dlgButtons bt-code" src="public/images/boutons/bt-tableau.gif" alt="Tableau" /> <img data-bt="url" class="dlgButtons bt-code" src="public/images/boutons/bt-lien.gif" alt="lien" /> <img data-bt="ancre" class="dlgButtons bt-code" src="public/images/boutons/bt-ancre.gif" alt="Ancre" /> <img data-bt="urlancre" class="dlgButtons bt-code" src="public/images/boutons/bt-urlancre.gif" alt="Lien vers une ancre" /> <img data-bt="citation" class="dlgButtons bt-code" src="public/images/boutons/bt-citation.gif" alt="Citation" /> <img data-bt="image" class="dlgButtons bt-code" src="public/images/boutons/bt-image.gif" alt="Images" /> <img data-bt="clip" class="dlgButtons bt-code" src="public/images/boutons/bt-clip.gif" alt="Clip Video" /> <!-- Boutons listes --> <img data-bt="police" class="bt-code listButtons" src="public/images/boutons/bt-font.gif" alt="Police" title="Police" /> <div class="sliderBox"> <a class="slider-link" rel="Arial">Arial</a> <a class="slider-link" rel="Comic Sans MS">Comic Sans MS</a> <a class="slider-link" rel="Verdana">Verdana</a> <a class="slider-link" rel="Times New Roman" >Times New Roman</a> <a class="slider-link" rel="Rockwell Extra Bold">Rockwell Extra Bold</a> </div> <img data-bt="taille" class="bt-code listButtons" src="public/images/boutons/bt-size.gif" alt="Taille de la police" title="Taille de la police" /> <div class="sliderBox"> <a class="slider-link" rel="xx-small">Très très petit</a> <a class="slider-link" rel="x-small">Très petit</a> <a class="slider-link" rel="small">Petit</a> <a class="slider-link" rel="medium">Normal</a> <a class="slider-link" rel="large">Grand</a> <a class="slider-link" rel="x-large">Très grand</a> <a class="slider-link" rel="xx-large">Très très grand</a> </div> <img data-bt="couleur" class="bt-code listButtons" src="public/images/boutons/bt-color.gif" alt="Couleur de la police" title="Couleur de la Police" /> <div class="sliderBox"> <a class="slider-link bgWhite" rel="#FFFFFF"> </a> <a class="slider-link bgGray" rel="#CCCCCC"> </a> <a class="slider-link bgRed" rel="#FF0000"> </a> <a class="slider-link bgOrange" rel="#FF6600"> </a> <a class="slider-link bgYellow" rel="#FFCC00"> </a> <a class="slider-link bgGreen" rel="#33CC00"> </a> <a class="slider-link bgBlue" rel="#0000CC"> </a> <a class="slider-link bgMarine" rel="#000033"> </a> <a class="slider-link bgBlack" rel="#000000"> </a> </div> <img data-bt="titre" class="bt-code listButtons" src="public/images/boutons/bt-titre.gif" alt="Titre" title="Titre" /> <div class="sliderBox"> <a class="slider-link" rel="h1">Titre 1</a> <a class="slider-link" rel="h2">Titre 2</a> <a class="slider-link" rel="h3">Titre 3</a> </div> <img data-bt="position" class="bt-code listButtons" src="public/images/boutons/bt-position.gif" alt="Position du texte" /> <div class="sliderBox"> <a class="slider-link" rel="gauche">Gauche</a> <a class="slider-link" rel="center">Centrer</a> <a class="slider-link" rel="droite">Droite</a> <a class="slider-link" rel="justifier">Justifier</a> </div> <img data-bt="flottant" class="bt-code listButtons" src="public/images/boutons/bt-float.gif" alt="Couleur de la police" /> <div class="sliderBox"> <a class="slider-link" rel="gauche">Flottant à gauche</a> <a class="slider-link" rel="droit">Flottant à droite</a> </div> <img data-bt="avert" class="bt-code listButtons" src="public/images/boutons/bt-avert.gif" alt="Avertissements" /> <div class="sliderBox"> <img data-bt="question" class="splButtons bt-code" src="public/images/boutons/bt-question.gif" alt="Question" /> <img data-bt="attention" class="splButtons bt-code" src="public/images/boutons/bt-attention.gif" alt="Attention" /><br /> <img data-bt="infos" class="splButtons bt-code" src="public/images/boutons/bt-infos.gif" alt="Infos" /> <img data-bt="erreur" class="splButtons bt-code" src="public/images/boutons/bt-erreur.gif" alt="Erreur" /> </div> <div class="block"> <textarea id="text" name="text" cols="100" rows="10"></textarea> </div> <div id="control"> <input type="reset" value="effacer" /> <input type="submit" value="Valider" /> </div> </fieldset> </form> <div id="prev"> <h4>Prévisualisation : </h4> </div> </div> </body> </html> |
1 2 3 4 5 6 7 | <script type="text/javascript"> // Lorsque le dom est lu window.addEvent('domready', function () { var form = new ZForm(); // On crée notre objet ZForm form.listeningEvent(); // On écoute les événements du ZForm }); </script> |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 | #parser { margin: auto; width: 80%; } fieldset { margin: auto; width: 70%; } #control { float: none; display: block; clear: both; margin-left : 3%; } table { background-color: #ccc; padding : 1%; } td { border : 1px solid #eee; background-color: #fff; } .title-citation { background-color: #eee; font-weight: bold; border: #ccc 1px solid; border-bottom: none; text-indent : 1%; width: 20%; margin:0; margin-top : 1%; } .citation { margin:0; border: #ccc 1px solid; padding: 1%; } #prev { border: 1px solid #999; margin: auto; margin-top: 1%; padding: 1%; min-height: 200px; -moz-border-radius: 10px; overflow : auto; width: 78%; } .bt-code { cursor: pointer; width: 30px; height: 30px; padding-left: 0; /*float: left;*/ } .sliderBox { border: 1px solid #ccc; padding: 0.3%; background-color: #eee; max-width : 200px; } .slider-link { background-color: #fff; border: 1px solid #ccc; cursor: pointer; padding: 1%; margin: 1%; min-width: 150px; display : block; } .slider-link:hover { border: 1px solid #999; } .parser-erreur{ background: #eee url(public/images/zcode_erreur.png) no-repeat 10px center; border : 1px solid red; color: red; width: 80%; padding: 2%; margin: auto; padding-left: 5%; } .parser-attention{ background: #eee url(public/images/zcode_attention.png) no-repeat 10px center; border : 1px solid orange; color: orange; width: 80%; padding: 2%; margin: auto; padding-left: 5%; } .parser-question{ background: #eee url(public/images/zcode_question.png) no-repeat 10px center; border : 1px solid blue; color: blue; width: 80%; padding: 2%; margin: auto; padding-left: 5%; } .parser-infos{ background: #eee url(public/images/zcode_info.png) no-repeat 10px center; border : 1px solid green; color: green; width: 80%; padding: 2%; margin: auto; padding-left: 5%; } .block { float: left; } .bgWhite { background-color: white; } .bgBlack { background-color: black; } .bgMarine { background-color: #003; } .bgGray { background-color: #ccc; } .bgOrange { background-color: orange; } .bgBlue { background-color: blue; } .bgRed { background-color: red; } .bgGreen { background-color: green; } .bgYellow { background-color: yellow; } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | var ZForm = new Class({ Implements : Options, options : { textId : 'text', // id du textarea preview : 'prev', // id de la div de prévisualisation buttons : '.splButtons', // les boutons simples dlgButtons : '.dlgButtons', // les boutons ouvrant une boîte de dialogue listButtons : '.listButtons', // les boutons liste ouvrant un menu de choix slider : '.sliderBox', // les boîtes contenant un menu de choix sliderLink : '.slider-link', // les liens du menu de choix closeDelay : 500 // temps avant fermeture de la boîte de menu en millisecondes }, //Constructeur initialize : function(options) { this.setOptions(options); this.input = $(this.options.textId); // getElementById(textId) this.preview = $(this.options.preview); // getElementById(preview) this.timer = 0; //Buttons this.buttons = $$(this.options.buttons); // tableau de tous les boutons simples this.dlgButtons = $$(this.options.dlgButtons); // tableau de tous les boutons ouvrant une boîte de dialogue this.sliders = $$(this.options.slider); // tableau de toutes les boîtes contenant un menu de choix this.listButtons = $$(this.options.listButtons); // tableau de tous les boutons liste ouvrant un menu de choix this.sliderLink = $$(this.options.sliderLink); // tableau de tous les liens de menu de choix this.closeDelay = this.options.closeDelay; }, // Écoute les événements listeningEvent : function() { this.input.focus(); // On donne le focus au champ de texte } }); |
1 | var zform = new ZForm({textId: 'message'}); |
1 2 3 4 | this.buttons = $$(this.options.buttons); // correspond à this.buttons = $$('.splButtons'); // et nous renvoie un tableau de tous les éléments ayant une classe CSS splButtons |
1 2 | <!-- Boutons simples --> <img data-bt="gras" class="splButtons bt-code" src="public/images/boutons/bt-gras.gif" alt="Gras" title="Gras" /> |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | [...] * Events sur les boutons simples */ eventButtons : function() { //Si c'est I.E. on utilise plutôt l'event mousedown var event = (Browser.ie) ? 'mousedown' : 'click'; // On écoute tous les boutons simples this.buttons.each(function(button){ // Si un event est détecté button.addEvent(event, function(){ //On récupère l'attribut data-bt de l'image var name = button.getProperty('data-bt'); //On appelle la méthode d'insertion de tags avec les bons paramètres et la sélection du texte this.insertTag('<'+name+'>', '</'+name+'>', this.input.getSelectedText()); }.bind(this)); }, this); }, //Insertion des tags insertTag : function(startTag, endTag, select) { //On donne le focus à notre champ de texte this.input.focus(); //S'il n'y a pas de sélection if(select === null || undefined === select) { //On insère nos tags autour du curseur this.input.insertAroundCursor({'before' : startTag, 'after' : endTag}); } else { //Sinon on insère nos tags au curseur this.input.insertAtCursor(startTag + select + endTag, false); } this.input.focus(); }, //Écoute les événements listeningEvent : function() { this.input.focus(); this.eventButtons(); } [...] |
1 | <url value="adresse du lien">texte du lien</url> |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | // 1er type : citation, URL, urlancre, ancre <balise value="value">text</balise> // 2e type : image <balise>text</balise> // Les listes <balise-liste> <balise-puce>text</balise-puce> <balise-puce>text</balise-puce> </balise-liste> // Tableau <balise-tableau> <balise-tr> <balise-td>text</balise-td> <balise-td>text</balise-td> </balise-tr> </balise-tableau> |
1 2 | <!-- Boutons choix --> <img data-bt="url" class="dlgButtons bt-code" src="public/images/boutons/bt-lien.gif" alt="lien" /> |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 | /** * Lien ouvrant une fenêtre box pour insérer une ou des valeurs au choix */ eventMessageBox : function() { var event = (Browser.ie) ? 'mousedown' : 'click'; this.dlgButtons.each(function(bt){ var link = $(bt); var text = value = ''; if(undefined !== link) { link.addEvent(event, function(){ var name = link.getProperty('data-bt'); var startTag = endTag = ''; var select = this.input.getSelectedText(); switch(name) { case 'tableau': startTag = this.setTable(); text = ''; break; case 'liste': case 'listnum' : startTag = this.setList(name); text = ''; break; case 'image' : text = (select !== '') ? select : prompt("Tapez le nom d'emplacement de l'image : "); startTag = this.getSimpleTag(name, text); break; case 'clip': startTag = this.setObject(name); break; case 'citation' : value = prompt("Tapez le nom de l'auteur de la citation :"); text = null; startTag = this.getTagValue(name, value, 'auteur'); break; case 'url' : value = prompt("Tapez l'adresse du lien : "); text = (select === '') ? prompt("Tapez le texte du lien : "): select; startTag = this.getTagValue(name, value); break; case 'urlancre' : value = (select !== '') ? select : prompt("Tapez le nom de l'ancre : "); text = prompt("Tapez le texte du lien : "); startTag = this.getTagValue(name, value); break; case 'ancre' : alert('Lier avec un lien de type:'+"\n"+'<urlancre value="nomdeLancre">Texte du lien</url>'); value = (select !== '') ? select : prompt("Tapez le nom de l'ancre : "); text = prompt("Tapez le texte du lien : "); startTag = this.getTagValue(name, value); break; } endTag = '</'+name+'>'; this.insertTag(startTag, endTag, text); }.bind(this)); } }, this); }, [...] |
1 2 3 4 | //Si aucune sélection <image>null //Sinon <image> |
1 2 3 4 5 6 7 8 9 10 11 12 13 | /** * Formate un tag de la forme <tag>text */ getSimpleTag : function(name, text) { var tag = ''; //Si aucune sélection if (text === '') { tag = '<'+name+'>null'; // null entre les balises } else { tag = '<'+name+'>'; // Sinon on ajoute juste le tag (pour éviter qu'il se répète avec insertTag) } return tag; }, |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | [...] /** * Formate un tag à la forme <name attribut="value">text */ getTagValue : function(name, value, attribut) { var tag = ''; //Si aucun nom d'attribut n'est assigné if('' === attribut || undefined === attribut) { attribut = 'value';// l'attribut par défaut sera value } //Si aucune valeur d'attribut n'est assignée if (value === '') { tag += '<'+name+' '+attribut+'="null">';// attribut a pour valeur null } else { //Sinon on construit notre tag d'ouverture tag = '<'+name+' '+attribut+'="'+ value +'">'; } return tag; }, [...] |

1 2 3 | <Typedeliste> <unepuce>Texte de la puce</unepuce> </Typedeliste> |
:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | [...] /** * Liste et liste numérique */ setList : function(name) { var i = 1; var tag = ''; var puce = ''; var message = 'Tapez le texte de la puce : (Si vous voulez arrêter, cliquez sur Annuler)'; var insertText = this.input.getSelectedText(); if(insertText !== ''){ puce = "\t<puce>" + insertText + "</puce>\n"; tag = "" + tag + "" + puce + ""; } else { insertText = prompt(message, "Puce " + i); while (insertText) { i++; if (insertText) { puce = "\t<puce>" + insertText + "</puce>\n"; tag = "" + tag + "" + puce + ""; insertText = prompt (message,"Puce " + i); } else { break; } } } tag = "\n<"+name+">\n" + tag; return tag; }, [...] |
1 2 3 4 5 6 7 8 9 10 | <tableaux> <lignes> <colonnes>Texte de la colonne</colonne> <colonnes>Texte de la colonne</colonne> </ligne> <lignes> <colonnes>Texte de la colonne</colonne> <colonnes>Texte de la colonne</colonne> </lignes> </tableaux> |

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | [...] /** * Tableau */ setTable : function() { var tag = ''; var lineNumber = 0; var rowNumber = 0; var select = this.input.getSelectedText(); if(select !== ''){ tag += "\t<ligne>\n"; tag += "\t\t<colonne>" + select + "</colonne>\n"; tag += "\t</ligne>\n"; } else { lineNumber = prompt('Tapez le nombre de lignes que contiendra le tableau :','Nombre de lignes'); rowNumber = prompt('Tapez le nombre de colonnes que contiendra le tableau :','Nombre de colonnes'); for ( var i = 0; i < lineNumber; i++) { tag += "\t<ligne>\n"; for (var j = 1; j <= rowNumber; j++) { text = prompt("Ligne:" + (i + 1)+ "\nTapez le texte de cette colonne : ", "Texte colonne "+ j); if (text) { tag += "\t\t<colonne>" + text + "</colonne>\n"; } else { break; } } tag += "\t</ligne>\n"; } } tag = "<tableau>\n" + tag; return tag; }, [...] |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | [...] setObject : function(name) { var tag = ''; var app = prompt("Saisissez le type de l'application au choix :\n\r flash|wmv|avi|mpeg"); var video = prompt("Saisissez le chemin du clip"); var w = prompt("Saisissez la largeur"); var h = prompt("Saisissez la hauteur du clip"); var autoStart = '0'; var autoPlay = 'false'; var type = ''; switch(app) { case 'flash': type = 'x-shockwave-flash'; break; case 'wmv': type = 'video/x-ms-wmv'; autoPlay = ''; break; case 'avi': type = 'video/x-msvideo'; autoPlay = ''; break; case 'mpeg': type = 'video/mpeg'; break; } if(h ==='' || h > 600) h = 200; if(w === '' || w > 600) w = 150; if(app == '') { alert("Vous devez saisir le nom de l'application"); app = prompt("Saisissez le type de l'application au choix :\n\r flash|wmv|avi|mpeg"); } else { if(video != '') { tag = '<'+name+'="'+type+':'+w+':'+h+':'+autoStart+':'+autoPlay+'">'+video; } else { tag = '<'+name+'="'+type+':'+w+':'+h+':'+autoStart+':'+autoPlay+'">'; } } return tag; }, [...] |
1 2 3 4 5 6 7 8 | [...] // Écoute les événements listeningEvent : function() { this.input.focus(); this.eventButtons(); this.eventMessageBox(); }, [...] |
1 2 3 | <flottant value="droite">texte</flottant> //Correspond à la balise <div style="float: right;">Text</div> |
1 2 3 4 5 6 | <!-- Boutons listes --> <img data-bt="flottant" class="bt-code listButtons" src="public/images/boutons/bt-float.gif" alt="Couleur de la police" /> <div class="sliderBox"> <a class="slider-link" rel="gauche">Flottant à gauche</a> <a class="slider-link" rel="droit">Flottant à droite</a> </div> |

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | /** * Positionne et cache les boîtes des sélecteurs de liste */ initListButtons : function() { if(undefined !== this.sliders) { //On fait une boucle sur toutes les boîtes à menu this.sliders.each(function(slider){ //Je récupère l'attribut name de l'image var img = slider.getPrevious('img'); //Sa position var x = img.getPosition().x.toInt(); var y = img.getPosition().y.toInt() + img.getSize().y.toInt(); //Positionne les box par rapport au bouton cliqué slider.setStyles({ 'position' : 'absolute', 'left' : x, 'top' : y, 'display' : 'none', 'visibility' : 'hidden' }); }); } }, |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | [...] /** * Events sur les boutons sélecteurs */ eventList : function() { //Événements sur les listes de choix this.listButtons.each(function(bt){ if(undefined !== bt) { bt.addEvents({ 'mouseenter' : function(){ //On affiche la box et on écoute ses events this.eventBoxList(bt); }.bind(this), 'mouseleave' : function() { //On cache la box this.timer = this.hide.delay(this.closeDelay, this, bt.getNext(this.options.slider)); }.bind(this) }); } }, this); }, [...] |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | [...] // Event sur les menus eventBoxList : function(el) { var box = el.getNext('div'); if(undefined !== box) { this.show(el, box); //On affiche le menu box.addEvents({ 'mouseleave': function(){ this.timer = this.hide.delay(this.closeDelay, this, box); //On cache le menu au bout de 500 millisecondes }.bind(this), 'mouseenter': function(){ clearTimeout(this.timer);//On remet le timer à 0 }.bind(this) }); } }, [...] |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | [...] // Event sur les liens de la liste eventLinkList : function() { if(undefined !== this.sliderLink) { //On boucle sur tous les lien slider-link this.sliderLink.each(function(link){ //Si on clique link.addEvent('mousedown', function(){ //On récupère l'attribut data-bt de l'image var name = link.getParent('div').getPrevious('img').getProperty('data-bt'); //On insère notre tag avec la valeur de l'attribut rel du lien cliqué this.insertTag('<'+name+' value="'+link.get('rel')+'">', '</'+name+'>'); }.bind(this)); }, this); } }, [...] |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | /** * Cache les boîtes de menus */ hide : function(box) { var fx = new Fx.Morph(box, {duration:800,transition: Fx.Transitions.linear}); fx.start({ opacity : [1,0], display : 'block', visibility : 'hidden' }); }, /** * Affiche les boîtes de menus */ show : function(el, box) { var fx = new Fx.Morph(box, {duration:800,transition: Fx.Transitions.linear}); fx.start({ left : el.getPosition().x.toInt(), display : 'block', visibility : 'visible', opacity : [0,1] }); }, |
1 2 | this.eventSelectors(); this.eventLinkList(); |
1 | this.initListButtons(); |

1 2 3 4 5 6 7 8 9 10 11 12 13 14 | [...] //Parse le texte via PHP pour la visualisation parseText : function(text) { var prev = this.preview; var req = new Request({ url : 'parse.php', method : 'post', onComplete: function() { prev.set('html', this.response.text); } }); req.send('text='+escape(text)); }, [...] |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 | <?php /** * @author franckysolo * @see Tuto ZForm avec mootools - Site du Zéro * @since 24/09/2010 * @revision 13/02/2011 */ class ZCodeParser { /** * Tags autorisés dans le ZForm * @var array */ private $_authorizedTags = array( 'attention', 'erreur', 'infos', 'question', 'liste' , 'listnum', 'puce', 'tableau', 'ligne', 'colonne', 'citation', 'titre', 'image', 'clip', 'couleur', 'police', 'taille', 'gras', 'italique', 'souligne', 'barre', 'position', 'flottant', 'marge', 'url', 'urlancre', 'ancre' ); /** * Tags parsés avec str_replace * @var array */ private $_replaceTags = array ( //Simple Tag '<gras>' => '<span style="font-weight: bold;">', '</gras>' => '</span>', '<souligne>' => '<span style="text-decoration: underline;">', '</souligne>' => '</span>', '<barre>' => '<span style="text-decoration: line-through;">', '</barre>' => '</span>', //Div '<attention>' => '<div class="parser-attention">', '</attention>' => '</div>', '<erreur>' => '<div class="parser-erreur">', '</erreur>' => '</div>', '<infos>' => '<div class="parser-infos">', '</infos>' => '</div>', '<question>' => '<div class="parser-question">', '</question>' => '</div>', '<italique>' => '<em>', '</italique>' => '</em>', '<marge>' => '<blockquote>', '</marge>' => '</blockquote>', '<liste>' => '<ul>' , '</liste>' => '</ul>' , '<listnum>' => '<ol>', '</listnum>' => '</ol>', '<puce>' => '<li>', '</puce>' => '</li>', '<tableau>' => '<table>', '</tableau>' => '</table>', '<ligne>' => '<tr>', '</ligne>' => '</tr>', '<colonne>' => '<td>', '</colonne>' => '</td>', //Attr Tag '<titre value="h1">' => '<h1>', '</titre>' => '</h1>', '<titre value="h2">' => '<h2>', '</titre>' => '</h2>', '<titre value="h3">' => '<h3>', '</titre>' => '</h3>', '<position value="gauche">' => '<div style="text-align: left;">', '<position value="center">' => '<div style="text-align: center;">', '<position value="droite">' => '<div style="text-align: right;">', '<position value="justifier">' => '<div style="text-align: justified;">', '</position>' => '</div>', '<flottant value="gauche">' => '<div style="float: left;">', '<flottant value="droit">' => '<div style="float: right;">', '</flottant>' => '</div>', '<taille value="xx-large">' => '<span style="font-size: xx-large;">', '<taille value="x-large">' => '<span style="font-size: x-large;">', '<taille value="large">' => '<span style="font-size: large;">', '<taille value=="medium">' => '<span style="font-size: medium;">', '<taille value="xx-small">' => '<span style="font-size: xx-small;">', '<taille value="x-small">' => '<span style="font-size: x-small;">', '<taille value="small">' => '<span style="font-size: small;">', '</taille>' => '</span>', ); /** * Pattern Regex parsage avec preg_replace * @var array */ private $_patterns = array( '`\<image\>(.+)\<\/image\>`iU', '`\<ancre value=\"(.+)\"\>\</ancre\>`iU', '`\<urlancre value=\"(.+)\"\>(.+)\</urlancre\>`iU', '`\<url value=\"(.+)\"\>(.+)\</url\>`iU', '`\<couleur value=\"(\#[a-fA-F0-9]{6})\"\>(.+)\<\/couleur\>`isU', '`\<police value=\"(.+)\"\>(.+)\<\/police\>`isU', '`\<citation auteur=\"(.+)\">(.+)\<\/citation\>`isU', ); /** * Balises HTML de remplacement. Parsage avec preg_replace * @var array */ private $_remplacement = array( '<img src="$1" alt="Image utilisateur" />', '<a name="$1"></a>', '<a href="#$1">$2</a>', '<a href="$1">$2</a>', '<span style="color:$1">$2</span>', '<span style="font-family: $1">$2</span>', '<div class="title-citation">Citation : $1</div><div class="citation">$2</div>' ); /** * Enlève les \n sur tableau et liste et protège contre les failles XSS * @param string $text * @return string */ public function cleanText($text) { $parseValues = array(); //On « préparse » nos balises autorisées pour éviter la transformation des chevrons avec htmlspecialchars foreach($this->_authorizedTags as $key => $value) { $parseValues[$key] = '`<([\/]?'.$value.')( )*([^>]*)?>`i'; } $text = preg_replace_callback($parseValues, array(&$this, '_preparse'), $text); //On applique la protection à tout le texte $text = htmlspecialchars($text, ENT_NOQUOTES); //On « déparse » nos balises autorisées foreach($this->_authorizedTags as $key => $value) { $parseValues[$key] = '`\[([\/]?'.$value.')( )*([^\]]*)?\]`i'; } $text = preg_replace_callback($parseValues, array(&$this, '_postparse'), $text); $text = preg_replace_callback ( '`(\<script(?:.*)\>(?:.+)\<\/script\>)`isU', create_function('$text', 'return htmlspecialchars($text[0]);'), $text ); //On enlève les retours à la ligne ajoutés pour l'indentation dans le champ de texte $pattern = '`\<(?:(tableau|listnum|liste))\>(\n*)(?:.+)\<\/(?:(tableau|listnum|liste))\>`isU'; $text = preg_replace_callback($pattern, array(&$this, 'cleanBr'), $text); return $text; } /** * Supprime le retour à la ligne de mise en forme * @param string $text * @return string */ public function cleanBr($text) { return str_replace(array("\n", "\r"), '', $text[0]); } /** * Parse le texte avec str_replace * @param string $text * @return string */ public function parseReplace($text) { return str_replace(array_keys($this->_replaceTags), array_values($this->_replaceTags), $text); } /** * Parse le texte avec preg_replace * @param string $text */ public function parseRegex($text) { $array = array_combine($this->_patterns, $this->_remplacement); foreach($array as $pattern => $replacement){ $text = preg_replace($pattern, $replacement, $text); } return $text; } /** * Parse le texte * @param string $text */ public function parse($text) { $text = stripslashes($text); $text = $this->cleanText($text); $text = $this->parseReplace($text); $text = $this->parseRegex($text); $text = $this->parserObjectTag($text); $text = nl2br($text); return $text; } /** * Tag clip => <object><param value=value /></object> * @param string $text */ public function parserObjectTag($text) { $text = preg_replace ( '`\<clip=\"(video/x-msvideo|video/x-ms-wmv|x-shockwave-flash|video/mpeg):([\d]{3}):([\d]{3}):(0|1):(false|true|\s)*\"\>(.+)\</clip\>`i', '<object type="application/$1" data="$6" width="$2" height="$3" style="margin:auto; background-color: black;"> <param name="movie" value="$6" /> <param name="autostart" value="$4" /> <param name="autoplay" value="$5" /> <param name="quality" value="high" /> <param name="loop" value="false"> <param name="wmode" value="transparent" /> </object>', $text ); return $text; } /** * Convertit les < > en [ ] des balises autorisées * @param array $matches */ private function _preparse($matches) { return '['.$matches[1].$matches[2].$matches[3].']'; } /** * Convertit les [ ] en < > des balises autorisées * @param array $matches */ private function _postparse($matches) { return '<'.$matches[1].$matches[2].$matches[3].'>'; } } ?> |
1 2 3 4 5 | <?php include 'parser.class.php'; $text = $_POST['text']; $parser = new ZCodeParser(); echo $parser->parse($text); |
1 2 3 4 5 | //Visualisation dans la div id=prev previewParser : function() { var txt = this.input.value; this.parseText(txt); } |

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 | /** * @author franckysolo * @see Tuto ZForm avec mootools - Site du Zéro * @since 24/09/2010 * @revision 13/02/2011 */ var ZForm = new Class({ Implements : Options, options : { textId : 'text', // id du textarea preview : 'prev', // id de la div de prévisualisation buttons : '.splButtons', // les boutons simples dlgButtons : '.dlgButtons', // les boutons ouvrant une boite de dialogue listButtons : '.listButtons', // les boutons listes ouvrant un menu de choix slider : '.sliderBox', // les boites contenant un menu de choix sliderLink : '.slider-link', // les liens du menu de choix closeDelay : 500 // temps avant fermeture de la boite de menu en milliseconde }, /** * @param options */ initialize : function(options) { this.setOptions(options); this.input = $(this.options.textId); // getElementById(textId) this.preview = $(this.options.preview); // getElementById(preview) this.timer = 0; //Buttons this.buttons = $$(this.options.buttons); //tableau de tous les boutons simples this.dlgButtons = $$(this.options.dlgButtons);//tableau de tous les boutons ouvrant une boite de dialogue this.sliders = $$(this.options.slider);//tableau de toutes les boites contenant un menu de choix this.listButtons = $$(this.options.listButtons);//tableau de toutes les listes ouvrant un menu de choix this.sliderLink = $$(this.options.sliderLink);//tous les liens de menu de choix this.initListButtons(); }, //Écoute les événements listeningEvent : function() { this.input.focus(); this.eventButtons(); this.eventMessageBox(); this.eventList(); this.eventLinkList(); //Preview du parser if(undefined !== this.input) { this.input.addEvent('keyup', function() { this.previewParser(); }.bind(this)); } }, initListButtons : function() { if(undefined !== this.sliders) { //On fait une boucle sur toutes les boites à menu this.sliders.each(function(slider){ //Je récupère l'attribut name de l'image var img = slider.getPrevious('img'); var x = img.getPosition().x.toInt(); var y = img.getPosition().y.toInt() + img.getSize().y.toInt(); //Positionne les box par rapport au bouton cliqué slider.setStyles({ 'position' : 'absolute', 'left' : x, 'top' : y, 'display' : 'none', 'visibility' : 'hidden' }); }); } }, /** * Events sur les boutons simples */ eventButtons : function() { //Si c'est I.E. on utilise plutôt l'event mousedown var event = (Browser.ie) ? 'mousedown' : 'click'; //On écoute tous les boutons simples this.buttons.each(function(button){ //Si un event est détecté button.addEvent(event, function(){ //On récupère l'attribut data-bt de l'image var name = button.getProperty('data-bt'); //On appelle la méthode d'insertion de tags avec les bons paramètres this.insertTag('<'+name+'>', '</'+name+'>', this.input.getSelectedText()); }.bind(this)); }, this); }, //Insertion des tags insertTag : function(startTag, endTag, select) { //On donne le focus à notre champ de texte this.input.focus(); //S'il n'y a pas de sélection if(select === null || undefined === select) { //On insère nos tags autour du curseur this.input.insertAroundCursor({'before' : startTag, 'after' : endTag}); } else { //Sinon on insère nos tags au curseur this.input.insertAtCursor(startTag + select + endTag, false); } this.input.focus(); this.previewParser(); }, /** * Lien ouvrant une fenêtre box pour insérer une ou des valeurs au choix */ eventMessageBox : function() { var event = (Browser.ie) ? 'mousedown' : 'click'; this.dlgButtons.each(function(bt){ var link = $(bt); var text = value = ''; if(undefined !== link) { link.addEvent(event, function(){ var name = link.getProperty('data-bt'); var startTag = endTag = ''; var select = this.input.getSelectedText(); switch(name) { case 'tableau': startTag = this.setTable(); text = null; break; case 'liste': case 'listnum' : startTag = this.setList(name); text = null; break; case 'image' : text = (select !== '') ? select : prompt("Tapez le nom d'emplacement de l'image : "); startTag = this.getSimpleTag(name, text); break; case 'clip': startTag = this.setObject(name); break; case 'citation' : value = prompt("Tapez le nom de l'auteur de la citation :"); text = null; startTag = this.getTagValue(name, value, 'auteur'); break; case 'url' : value = prompt("Tapez l'adresse du lien : "); text = (select === '') ? prompt("Tapez le texte du lien : "): select; startTag = this.getTagValue(name, value); break; case 'urlancre' : value = (select !== '') ? select : prompt("Tapez le nom de l'ancre : "); text = prompt("Tapez le texte du lien : "); startTag = this.getTagValue(name, value); break; case 'ancre' : alert('Lier avec un lien de type:'+"\n"+'<urlancre value="nomdeLancre">Texte du lien</url>'); value = (select !== '') ? select : prompt("Tapez le nom de l'ancre : "); text = prompt("Tapez le texte du lien : "); startTag = this.getTagValue(name, value); break; } endTag = '</'+name+'>'; this.insertTag(startTag, endTag, text); }.bind(this)); } }, this); }, /** * Formate un tag à la forme <name attribut="value">text */ getTagValue : function(name, value, attribut) { var tag = ''; //Si aucun nom d'attribut n'est assigné if('' === attribut || undefined === attribut) { attribut = 'value'; // L'attribut par défaut sera value } //Si aucune valeur d'attribut n'est assignée if (value === '') { tag += '<'+name+' '+attribut+'="null">'; // attribut a pour valeur null } else { //Sinon on construit notre tag d'ouverture tag = '<'+name+' '+attribut+'="'+ value +'">'; } return tag; }, /** * Formate un tag à la forme <tag>text */ getSimpleTag : function(name, text) { var tag = ''; //Si aucune sélection if (text === '') { tag = '<'+name+'>null'; //null entre les balises } else { tag = '<'+name+'>'; //sinon on ajoute juste le tag } return tag; }, /** * Tableau */ setTable : function() { var tag = ''; var lineNumber = rowNumber = 0; lineNumber = prompt('Tapez le nombre de lignes que contiendra le tableau :','Nombre de lignes'); rowNumber = prompt('Tapez le nombre de colonnes que contiendra le tableau :','Nombre de colonnes'); for ( var i = 0; i < lineNumber; i++) { tag += "\t<ligne>\n"; for (var j = 1; j <= rowNumber; j++) { var text = prompt("Ligne:" + (i + 1)+ "\nTapez le texte de cette colonne : ", "Texte colonne "+ j); if (text) { tag += "\t\t<colonne>" + text + "</colonne>\n"; } else { break; } } tag += "\t</ligne>\n"; } tag = "<tableau>\n" + tag; return tag; }, /** * Liste et liste numérique */ setList : function(name) { var i = 1; var tag = ''; var insertText = prompt ( "Tapez le texte de la puce : (Si vous voulez arrêter, cliquez sur Annuler) ", "Puce " + i ); while (insertText) { i++; if (insertText) { var puce = "\t<puce>" + insertText + "</puce>\n"; tag = "" + tag + "" + puce + ""; insertText = prompt ( "Tapez le texte de la puce : (Si vous voulez arrêter, cliquez sur Annuler) ", "Puce " + i ); } else { break; } } tag = "\n<"+name+">\n" + tag; return tag; }, setObject : function(name) { var tag = ''; var app = prompt("Saisissez le type de l'application au choix:\n\r flash|wmv|avi|mpeg"); var video = prompt("Saisissez le chemin du clip"); var w = prompt("Saisissez la largeur"); var h = prompt("Saisissez la hauteur du clip"); var autoStart = '0'; var autoPlay = 'false'; var type = ''; switch(app) { case 'flash': type = 'x-shockwave-flash'; break; case 'wmv': type = 'video/x-ms-wmv'; autoPlay = ''; break; case 'avi': type = 'video/x-msvideo'; autoPlay = ''; break; case 'mpeg': type = 'video/mpeg'; break; } if(h ==='' || h > 600) h = 200; if(w === '' || w > 600) w = 150; if(app == '') { alert("Vous devez saisir le nom de l'application"); app = prompt("Saisissez le type de l'application au choix:\n\r flash|wmv|avi|mpeg"); } else { if(video != '') { tag = '<'+name+'="'+type+':'+w+':'+h+':'+autoStart+':'+autoPlay+'">'+video; } else { tag = '<'+name+'="'+type+':'+w+':'+h+':'+autoStart+':'+autoPlay+'">'; } } return tag; }, // Cache les boites à menu hide : function(box) { var fx = new Fx.Morph(box, {duration : 800, transition: Fx.Transitions.linear}); fx.start({ opacity : [1,0], display : 'block', visibility : 'hidden' }); }, // Affiche les boites à menu show : function(el, box) { var fx = new Fx.Morph(box, {duration : 800, transition: Fx.Transitions.linear}); fx.start({ left : el.getPosition().x.toInt(), display : 'block', visibility : 'visible', opacity : [0,1] }); }, // Event sur les boites à liste eventBoxList : function(el) { var box = el.getNext('div'); if(undefined !== box) { this.show(el, box); box.addEvents({ 'mouseleave': function(){ this.timer = this.hide.delay(this.closeDelay, this, box); }.bind(this), 'mouseenter': function(){ clearTimeout(this.timer); }.bind(this) }); } }, // Event sur les liens de la liste eventLinkList : function() { if(undefined !== this.sliderLink) { //On boucle sur tous les lien slider-link this.sliderLink.each(function(link){ //Si on clique link.addEvent('mousedown', function(){ //On récupère l'attribut data-bt de l'image var name = link.getParent('div').getPrevious('img').getProperty('data-bt'); //On insère notre tag avec la valeur de l'attribut rel du lien cliqué this.insertTag('<'+name+' value="'+link.get('rel')+'">', '</'+name+'>'); this.previewParser(); }.bind(this)); }, this); } }, /** * Events sur les boutons sélecteurs */ eventList : function() { //Événements sur un bouton sélecteur this.listButtons.each(function(bt){ if(undefined !== bt) { bt.addEvents({ 'mouseenter' : function(){ //On affiche la box et on écoute ses events this.eventBoxList(bt); }.bind(this), 'mouseleave' : function() { //On cache la box this.timer = this.hide.delay(this.closeDelay, this, bt.getNext(this.options.slider)); }.bind(this) }); } }, this); }, //Parse le texte via PHP pour la visualisation parseText : function(text) { var prev = this.preview; var req = new Request({ url : 'parse.php', method : 'post', evalResponse : true, evalScripts : true, onComplete: function() { prev.set('html', this.response.text); } }); req.send('text='+escape(text)); }, //Visualisation dans la div id=prev previewParser : function() { var txt = this.input.value; this.parseText(txt); } }); |