11548 sujets

JavaScript, DOM et API Web HTML5

Bonjour,

je me heurte actuellement à un problème en Javascript. J'essaye de mettre de la couleur au code à l'écran. Un exemple vaudra mieux qu'un longue explication...

Voici mon code d'exemple (en Java) :

package simple.lib;

import java.util.Arrays;

/**
 * Ceci est un test
 */
public class HelloWorld implements World {

    /**
     * Envoi "Bonjour le monde!"
     *
     * @throws Throwable improbable...
     */
    public void justdoit() throws Throwable {
        System.out.println("Bonjour le monde!");
    }

}


Pour mettre de la couleur, j'utilise des expressions reguliere (en Javascript) :

var list = [
        {regex: /\/\*(?!\*\/)\*[\s\S]*?\*\//gm, clazz: 'comments'},     // documentation comments
        {regex: /\/\*([^\*][\s\S]*)?\*\//gm, clazz: 'comments'},            // multiline comments
        {regex: /\/\/.*$/gm, clazz: 'comments'},                            // one line comments
        {regex: /"([^\\"\n]|\\.)*"/g, clazz: 'string'},                     // strings
        {regex: /'([^\\'\n]|\\.)*'/g, clazz: 'string'},                     // strings
        {regex: /\b([\d]+(\.[\d]+)?|0x[a-f0-9]+)\b/gi, clazz: 'value'},     // numbers
        {regex: /(?!\@interface\b)\@[\$\w]+\b/g, clazz: 'color1'},          // annotation @anno
        {regex: /\@interface\b/g, clazz: 'color2'},                         // @interface keyword
        {regex: new RegExp(getKeywords(                                     // java keyword
                'abstract assert boolean break byte case catch char ' +
                'class const continue default do double else enum ' +
                'extends false final finally float for goto if implements ' +
                'import instanceof int interface long native new null ' +
                'package private protected public return short static ' +
                'strictfp super switch synchronized this throw throws ' +
                'true transient try void volatile while'), 'gm'), clazz: 'keyword'}
    ]


function highlight(value) {
    for (var x in list) {
        var regex = list[x].regex;
        var clazz = list[x].clazz;

        value = value.replace(
            regex, '<span class="' +
                clazz + '">$&</span>')
    }

    return value;
}


Cette méthode fonctionne à l'exception que les regexp transforme les balises HTML ajouté :
/** ... */ devient <span class="comments">/** ... */</span> 

puis

<span class="comments">/ devient <span <span class="keyword">class</span>=<span class="string">"comments"</span>>

Bref les balises HTML ajouté sont interprètées.

Connaissez-vous un moyen d'éviter cela?
Modifié par ramy (09 Feb 2011 - 13:12)
L'idée serait de passer ta string originale à une fonction faisant la même chose que HTMLentities en PHP (Qui encoderait les caractères spéciaux).

À ma connaissance, une telle fonction n'existe pas directement en JS, mais voilà une fonction faisant la même chose que j'ai pu trouver sur un site web:


function HTMLentities(texte) {

texte = texte.replace(/"/g,'&quot;'); // 34 22
texte = texte.replace(/&/g,'&amp;'); // 38 26
texte = texte.replace(/\'/g,'&#39;'); // 39 27
texte = texte.replace(/</g,'&lt;'); // 60 3C
texte = texte.replace(/>/g,'&gt;'); // 62 3E
texte = texte.replace(/\^/g,'&circ;'); // 94 5E
texte = texte.replace(/‘/g,'&lsquo;'); // 145 91
texte = texte.replace(/’/g,'&rsquo;'); // 146 92
texte = texte.replace(/“/g,'&ldquo;'); // 147 93
texte = texte.replace(/”/g,'&rdquo;'); // 148 94
texte = texte.replace(/•/g,'&bull;'); // 149 95
texte = texte.replace(/–/g,'&ndash;'); // 150 96
texte = texte.replace(/—/g,'&mdash;'); // 151 97
texte = texte.replace(/˜/g,'&tilde;'); // 152 98
texte = texte.replace(/™/g,'&trade;'); // 153 99
texte = texte.replace(/š/g,'&scaron;'); // 154 9A
texte = texte.replace(/›/g,'&rsaquo;'); // 155 9B
texte = texte.replace(/œ/g,'&oelig;'); // 156 9C
texte = texte.replace(//g,'&#357;'); // 157 9D
texte = texte.replace(/ž/g,'&#382;'); // 158 9E
texte = texte.replace(/Ÿ/g,'&Yuml;'); // 159 9F
// texte = texte.replace(/ /g,'&nbsp;'); // 160 A0
texte = texte.replace(/¡/g,'&iexcl;'); // 161 A1
texte = texte.replace(/¢/g,'&cent;'); // 162 A2
texte = texte.replace(/£/g,'&pound;'); // 163 A3
//texte = texte.replace(/ /g,'&curren;'); // 164 A4
texte = texte.replace(/¥/g,'&yen;'); // 165 A5
texte = texte.replace(/¦/g,'&brvbar;'); // 166 A6
texte = texte.replace(/§/g,'&sect;'); // 167 A7
texte = texte.replace(/¨/g,'&uml;'); // 168 A8
texte = texte.replace(/©/g,'&copy;'); // 169 A9
texte = texte.replace(/ª/g,'&ordf;'); // 170 AA
texte = texte.replace(/«/g,'&laquo;'); // 171 AB
texte = texte.replace(/¬/g,'&not;'); // 172 AC
texte = texte.replace(/­/g,'&shy;'); // 173 AD
texte = texte.replace(/®/g,'&reg;'); // 174 AE
texte = texte.replace(/¯/g,'&macr;'); // 175 AF
texte = texte.replace(/°/g,'&deg;'); // 176 B0
texte = texte.replace(/±/g,'&plusmn;'); // 177 B1
texte = texte.replace(/²/g,'&sup2;'); // 178 B2
texte = texte.replace(/³/g,'&sup3;'); // 179 B3
texte = texte.replace(/´/g,'&acute;'); // 180 B4
texte = texte.replace(/µ/g,'&micro;'); // 181 B5
texte = texte.replace(/¶/g,'&para'); // 182 B6
texte = texte.replace(/·/g,'&middot;'); // 183 B7
texte = texte.replace(/¸/g,'&cedil;'); // 184 B8
texte = texte.replace(/¹/g,'&sup1;'); // 185 B9
texte = texte.replace(/º/g,'&ordm;'); // 186 BA
texte = texte.replace(/»/g,'&raquo;'); // 187 BB
texte = texte.replace(/¼/g,'&frac14;'); // 188 BC
texte = texte.replace(/½/g,'&frac12;'); // 189 BD
texte = texte.replace(/¾/g,'&frac34;'); // 190 BE
texte = texte.replace(/¿/g,'&iquest;'); // 191 BF
texte = texte.replace(/À/g,'&Agrave;'); // 192 C0
texte = texte.replace(/Á/g,'&Aacute;'); // 193 C1
texte = texte.replace(/Â/g,'&Acirc;'); // 194 C2
texte = texte.replace(/Ã/g,'&Atilde;'); // 195 C3
texte = texte.replace(/Ä/g,'&Auml;'); // 196 C4
texte = texte.replace(/Å/g,'&Aring;'); // 197 C5
texte = texte.replace(/Æ/g,'&AElig;'); // 198 C6
texte = texte.replace(/Ç/g,'&Ccedil;'); // 199 C7
texte = texte.replace(/È/g,'&Egrave;'); // 200 C8
texte = texte.replace(/É/g,'&Eacute;'); // 201 C9
texte = texte.replace(/Ê/g,'&Ecirc;'); // 202 CA
texte = texte.replace(/Ë/g,'&Euml;'); // 203 CB
texte = texte.replace(/Ì/g,'&Igrave;'); // 204 CC
texte = texte.replace(/Í/g,'&Iacute;'); // 205 CD
texte = texte.replace(/Î/g,'&Icirc;'); // 206 CE
texte = texte.replace(/Ï/g,'&Iuml;'); // 207 CF
texte = texte.replace(/Ð/g,'&ETH;'); // 208 D0
texte = texte.replace(/Ñ/g,'&Ntilde;'); // 209 D1
texte = texte.replace(/Ò/g,'&Ograve;'); // 210 D2
texte = texte.replace(/Ó/g,'&Oacute;'); // 211 D3
texte = texte.replace(/Ô/g,'&Ocirc;'); // 212 D4
texte = texte.replace(/Õ/g,'&Otilde;'); // 213 D5
texte = texte.replace(/Ö/g,'&Ouml;'); // 214 D6
texte = texte.replace(/×/g,'&times;'); // 215 D7
texte = texte.replace(/Ø/g,'&Oslash;'); // 216 D8
texte = texte.replace(/Ù/g,'&Ugrave;'); // 217 D9
texte = texte.replace(/Ú/g,'&Uacute;'); // 218 DA
texte = texte.replace(/Û/g,'&Ucirc;'); // 219 DB
texte = texte.replace(/Ü/g,'&Uuml;'); // 220 DC
texte = texte.replace(/Ý/g,'&Yacute;'); // 221 DD
texte = texte.replace(/Þ/g,'&THORN;'); // 222 DE
texte = texte.replace(/ß/g,'&szlig;'); // 223 DF
texte = texte.replace(/à/g,'&aacute;'); // 224 E0
texte = texte.replace(/á/g,'&aacute;'); // 225 E1
texte = texte.replace(/â/g,'&acirc;'); // 226 E2
texte = texte.replace(/ã/g,'&atilde;'); // 227 E3
texte = texte.replace(/ä/g,'&auml;'); // 228 E4
texte = texte.replace(/å/g,'&aring;'); // 229 E5
texte = texte.replace(/æ/g,'&aelig;'); // 230 E6
texte = texte.replace(/ç/g,'&ccedil;'); // 231 E7
texte = texte.replace(/è/g,'&egrave;'); // 232 E8
texte = texte.replace(/é/g,'&eacute;'); // 233 E9
texte = texte.replace(/ê/g,'&ecirc;'); // 234 EA
texte = texte.replace(/ë/g,'&euml;'); // 235 EB
texte = texte.replace(/ì/g,'&igrave;'); // 236 EC
texte = texte.replace(/í/g,'&iacute;'); // 237 ED
texte = texte.replace(/î/g,'&icirc;'); // 238 EE
texte = texte.replace(/ï/g,'&iuml;'); // 239 EF
texte = texte.replace(/ð/g,'&eth;'); // 240 F0
texte = texte.replace(/ñ/g,'&ntilde;'); // 241 F1
texte = texte.replace(/ò/g,'&ograve;'); // 242 F2
texte = texte.replace(/ó/g,'&oacute;'); // 243 F3
texte = texte.replace(/ô/g,'&ocirc;'); // 244 F4
texte = texte.replace(/õ/g,'&otilde;'); // 245 F5
texte = texte.replace(/ö/g,'&ouml;'); // 246 F6
texte = texte.replace(/÷/g,'&divide;'); // 247 F7
texte = texte.replace(/ø/g,'&oslash;'); // 248 F8
texte = texte.replace(/ù/g,'&ugrave;'); // 249 F9
texte = texte.replace(/ú/g,'&uacute;'); // 250 FA
texte = texte.replace(/û/g,'&ucirc;'); // 251 FB
texte = texte.replace(/ü/g,'&uuml;'); // 252 FC
texte = texte.replace(/ý/g,'&yacute;'); // 253 FD
texte = texte.replace(/þ/g,'&thorn;'); // 254 FE
texte = texte.replace(/ÿ/g,'&yuml;'); // 255 FF
return texte;
}



(Sinon, il y a un plugin Jquery faisant la même chose; mais le nom m'échappe !)
J'ai peur de mettre fait mal comprendre. Mon problème n'est pas de remplace une expression régulière en une quelconque valeur. Je veux encadrer les expressions régulières entre <span>...</span> pour leur attribuer des propriétés css - couleur notamment. Le problème est que certaine de ces expressions s'imbriquent ensembles.

Disons que je veux griser les commentaires ainsi que les mots clés d'un texte CSS. Je vais donc mettre les commentaires renvoyés par une première expression régulière entre <span class="comment">...</span> et les mots clés renvoyés par la seconde entre <span class="keyword">...</span>. Mais voila les mots clés qui pourrait se trouver dans les commentaires ne doivent pas apparaitre coloré. De même, si le mot clés "class" fait parti des mots clés du langage, il ne doit pas être affété puisqu'il fait parti du code HTML de la page.

Suis-je plus clair ?
Modifié par ramy (10 Feb 2011 - 12:59)
Et si l'on pouvait «disqualifier» les mots clefs (c'est-à-dire leur permettre de passer à travers les sélections opérées avec les expressions régulières) pour rétablir ensuite les expressions convenables ?
en CSS simplement ça me semblerait jouable en utilisant le sélecteur d'enfant direct ">".

Exemple:


<div class="conteneur">
  <span class="commentaire">
     Il d'agit ici d'un commentaire et d'un <span class="keyword"> mot clé </span>.
  </span>
</div>



.conteneur > .commentaire{
  color: red;
}
.conteneur > .keyword{
  color: blue;
}


Dans cet exemple, keyword ne sera pas coloré.