Changeset 60671 in spip-zone for _plugins_/coloration_code


Ignore:
Timestamp:
Apr 26, 2012, 10:03:32 AM (8 years ago)
Author:
marcimat@…
Message:

Colorer au mieux les crochets de balise.

Là encore c'est pas simple. Il faudrait pouvoir faire une reccursion mais on en utilise déjà une dans la regexp des balise, pour les arguments, et il ne peut y en avoir plus pour une regexp.
Du coup, on relance l'expression plusieurs fois de suite (4 fois, mais un while serait mieux, mais on peut pas) en echappant à chaque fois parenthèses et crochets. On les remets en même temps que les echappements ensuite.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • _plugins_/coloration_code/trunk/geshi/geshi/spip2.php

    r60669 r60671  
    106106
    107107
    108 // /!\ pas encore au point
    109 @define('REG_BALISE_AVANT', '[^\[]*');
    110 @define('REG_BALISE_APRES', '[^\]]*');
    111 @define('REG_BALISE_COMPLET_START', '(\[)(' . REG_BALISE_AVANT . ')(\()'); // [ ... (
    112 @define('REG_BALISE_COMPLET_STOP',  '(\))(' . REG_BALISE_APRES . ')(\])'); // ) ... ]
     108
     109// Recherche des parties exterieures des balises.
     110// On ne peut pas avoir plus d'une seule recursivite
     111/* @define('REG_BALISE_EXTERIEUR', '(?:\s*(?:(?>[^\[\]]+)|(?R))*\s*)'); */
     112// du coup on ne peut attraper que les parties exterieures
     113// qui n'ont pas de crochets internes.
     114@define('REG_BALISE_EXTERIEUR', '(?:[^\[\]]*)');
     115@define('REG_BALISE_COMPLET_START', '(\[)(' . REG_BALISE_EXTERIEUR . ')(\()'); // [ ... (
     116@define('REG_BALISE_COMPLET_STOP',  '(\))(' . REG_BALISE_EXTERIEUR . ')(\])'); // ) ... ]
    113117// Attention a ne pas avoir plus de 9 parentheses capturantes car on ne peut pas ecrire \\10
    114118@define('REG_BALISE_COMPLET',
    115119          REG_BALISE_COMPLET_START . '(' // [ ... (
    116120        . '(?:' . REG_BALISE_TOUT . ')' // #BALISE
    117         . '(?:(?:' . REG_NOM_FILTRE_TOUT . '?' . REG_CRITERES_TOUT . '?)*)' // {arguments} |filtre{criteres}
     121        . '(?:(' . REG_NOM_FILTRE_TOUT . '?' . str_replace('?R', '?5', REG_CRITERES_BOUCLE) . '?)*)' // {arguments} |filtre{criteres}
    118122        . ')' . REG_BALISE_COMPLET_STOP ); // ) ... ]
    119123
     
    142146**/
    143147function spip2_geshi_regexp_critere_callback($matches, $geshi) {
    144 #var_dump($matches);
    145148        $key = $geshi->_hmr_key;
    146149        // 0 = tout
     
    169172
    170173
     174
     175
     176/**
     177 * Cette fonction recupere la liste des balises qui
     178 * ont des parties optionnelles [ ...( et ) ... ]
     179 *
     180 * Elle colorie les signes [()]
     181 * Elle les echappe egalement.
     182 * Ainsi, on peut relancer la regexp pour tenter de trouver des enchainements
     183 * de balise plus profonds.
     184 *
     185 * @param array $matches
     186 *              Le resultat du preg_match
     187 * @param Object $geshi
     188 *              Instance de l'objet SPIP_GESHI (issu de GESHI)
     189 * @return string
     190 *              La chaine attendu par Geshi
     191 *              qui est quelque chose comme
     192 *              "avant <|!REG3XP31!>contenu|> apres"
     193**/
     194function spip2_geshi_regexp_balise_callback($matches, $geshi) {
     195        $key = $geshi->_hmr_key;
     196        // on l'appelle plusieurs fois mais on colorie toujours avec la meme cle.
     197        $key = 4;
     198       
     199        // 0 = tout
     200        // 1 = [
     201        // 2 = avant
     202        // 3 = (
     203        // 4 = #BALISE|filtre{x}
     204        // 5 =
     205        // 6 =
     206        // 7 = )
     207        // 8 = apres
     208        // 9 = ]
     209        // -INERTE=x= sera remplace ensuite par le vrai caractere.
     210        $retour =
     211                  '<|!REG3XP' . $key .'!>-INERTE=' . ord('[') . '=|>' // [
     212                . $matches[2] // avant
     213                . '<|!REG3XP' . $key .'!>-INERTE=' . ord('(') . '=|>' // (
     214                . $matches[4] // balise
     215                . '<|!REG3XP' . $key .'!>-INERTE=' . ord(')') . '=|>' // )
     216                . $matches[8] // apres
     217                . '<|!REG3XP' . $key .'!>-INERTE=' . ord(']') . '=|>' // ]
     218                ;
     219
     220        return $retour;
     221}
     222
     223
     224
    171225/**
    172226 * Echapper les echappements \[ \] ...
     
    185239
    186240/**
    187  * Remettre les echappements \[ \] ...
     241 * Remettre les echappements \[ \] ...
     242 *
     243 * Remettre les [ ( ) ] echappes des balises
    188244 *
    189245**/
     
    193249        $inerte = '-INERTE';
    194250        $key = $geshi->_hmr_key;
     251        // echappements avec \
    195252        $contenu = preg_replace_callback(",$inerte-(\d+)-,",
    196253                #create_function('$a', 'return "\\\\" . chr($a[1]);'), $contenu);
    197254                create_function('$a', 'return "<|!REG3XP'.$key.'!>\\\\" . chr($a[1]) . "|>";'), $contenu);
    198255
     256        // echappements de balise faits par une regexp de ce colorieur (regexp 4 à 7).
     257        $contenu = preg_replace_callback(",$inerte=(\d+)=,",
     258                #create_function('$a', 'return "\\\\" . chr($a[1]);'), $contenu);
     259                create_function('$a', 'return chr($a[1]);'), $contenu);
     260
    199261        return $contenu;
    200262}
     263
     264
    201265
    202266
     
    241305                        1 => 'color: #CA5200;', // balise (#nom:TITRE) #TITRE
    242306                        2 => 'color: #e72;', // balise (#nom:TITRE) nom:
     307                        4 => 'color: #FF001E;', // [ ( et ) ]
    243308
    244309                        10 => 'color: #1DA3DD;', // fin boucle
     
    259324                        50 => 'color: #E1861A;', // filtres de balise
    260325
    261                         99 => 'color: #FF001E; font-weight:bold;', // [ ( et ) ]
    262                        
    263326                        // echappements
    264327                        101 => '', // \[ \] \{ ...
     
    277340                        GESHI_MODIFIERS => 's',
    278341                        ),
    279 /*
     342
     343
     344                #######  BALISES  ########
     345
    280346                // Balise complexe avec [ ( et ) ] si on peut
    281                 99 => array(
     347                // Colorie les [()] et les echappe lorsqu'il en trouve.
     348                // on l'applique plusieurs fois pour tenter de capturer un plus grand nombre
     349                // lorsqu'on a des imbrications comme [ [(#TITRE)] (#ENV) apres ]
     350                // car on ne peut pas effectuer d'autre recursion
     351                // dans cette regexp qui en possede deja une pour les criteres
     352                4 => array(
    282353                        GESHI_SEARCH => REG_BALISE_COMPLET,
    283                         GESHI_REPLACE => '\\1',
    284                         GESHI_MODIFIERS => '',
    285                         GESHI_BEFORE => '',
    286                         GESHI_AFTER => '\\2\\3\\4\\5\\6\\7'
    287                         ),*/
     354                        SPIP_GESHI_REGEXP_FUNCTION => 'spip2_geshi_regexp_balise_callback',
     355                        GESHI_MODIFIERS => '',
     356                        ),
     357                5 => array(
     358                        GESHI_SEARCH => REG_BALISE_COMPLET,
     359                        SPIP_GESHI_REGEXP_FUNCTION => 'spip2_geshi_regexp_balise_callback',
     360                        GESHI_MODIFIERS => '',
     361                        ),
     362                6 => array(
     363                        GESHI_SEARCH => REG_BALISE_COMPLET,
     364                        SPIP_GESHI_REGEXP_FUNCTION => 'spip2_geshi_regexp_balise_callback',
     365                        GESHI_MODIFIERS => '',
     366                        ),
     367                7 => array(
     368                        GESHI_SEARCH => REG_BALISE_COMPLET,
     369                        SPIP_GESHI_REGEXP_FUNCTION => 'spip2_geshi_regexp_balise_callback',
     370                        GESHI_MODIFIERS => '',
     371                        ),
     372
    288373
    289374                // Balise (#nom:TITRE**) (les etoiles)
     
    312397                        ),
    313398
     399
     400                #######  BOUCLES  ########
    314401
    315402                // Au fur et a mesure que GESHI trouve des regexp
     
    366453
    367454
     455                #######  INCLURE  ########
    368456
    369457                // inclure (entre parenthese)
     
    400488                        ),
    401489
     490
     491
     492                #######  CHAINES DE LANGUE  ########
     493
    402494                // idiome
    403495                30 => array(
     
    416508                        GESHI_AFTER => ''
    417509                        ),
     510
     511
     512                #######  PARAMETRES  ########
    418513
    419514                // parametres de filtre, balise
     
    436531
    437532
     533                #######  FILTRES  ########
     534
    438535                // filtre
    439536                50 => array(
     
    444541                        GESHI_AFTER => ''
    445542                        ),
     543
     544
     545                #######  ECHAPPEMENTS  ########
    446546
    447547                // remettre les echappements
Note: See TracChangeset for help on using the changeset viewer.