source: spip-zone/_plugins_/coloration_code/trunk/coloration_code_fonctions.php @ 60585

Last change on this file since 60585 was 60585, checked in by marcimat@…, 7 years ago

1) correction des sauts de lignes qui étaient mangés ! Ce n'est pas geshi, mais une regexp un rien gourmande avant l'appel de geshi qui s'appliquait à toutes les lignes au lieu de tout le code.

2) un nouveau colorieur :

On tente un nouveau colorieur un peu spécial pour spip. <cadre class='spip3'> pour le tester.

Ce colorieur utilise le décompilateur de SPIP pour reformater le code en ajoutant les éléments de coloration pour GESHI lui-même.
Avantage : On peut être très précis dans la coloration, et trouver les [ et ( ou ) et ] des balises mêmes imbriqués de façon tordue. Le seul endroit pas très précis est les critères de balises qui ne semblent pas phrasés dans l'AST, ou du moins pas avec le phraseur à ce niveau.

Inconvénient (et il est assez embêtant) : le code est reformaté. Le code est reproduit à partir de l'AST (arbre d'analyse du code d'un squelette) de SPIP, mais il est du coup pas forcément fidèle à ce qui y était. Par exemple :

  • les sauts de lignes entre critères de boucle disparaissent
  • les espaces ou non entre arguments séparés par des virgules sont unifiés {env,ajax, id_article} devient {env, ajax, id_article} (on pourrait choisir sans espace, mais on perd l'info source de savoir s'il y en avait un, plusieurs ou pas)
  • on perd la casse de la table de la boucle (ARTICLES) devient (articles)
  • <INCLURE qui accepte (fichier) ou {fond=fichier} ne sortira qu'un seul des 2 propositions (là c'est (fichier) dans ce que j'ai mis dans le code)
  • et certainements d'autres choses que je n'ai pas encore vues.
File size: 5.6 KB
Line 
1<?php
2
3if (!defined("_ECRIRE_INC_VERSION")) return;
4
5//    Fichier créé pour SPIP avec un bout de code emprunté à celui ci.
6//    Distribué sans garantie sous licence GPL./
7//    Copyright (C) 2006  Pierre ANDREWS
8//
9//    This program is free software; you can redistribute it and/or modify
10//    it under the terms of the GNU General Public License as published by
11//    the Free Software Foundation; either version 2 of the License, or any later version.
12//
13//    This program is distributed in the hope that it will be useful,
14//    but WITHOUT ANY WARRANTY; without even the implied warranty of
15//    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16//    GNU General Public License for more details.
17//
18//    You should have received a copy of the GNU General Public License
19//    along with this program; if not, write to the Free Software
20//    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
21
22// pour interdire globalement et optionnellement le téléchargement associé
23if (!defined('PLUGIN_COLORATION_CODE_TELECHARGE')) {
24        define('PLUGIN_COLORATION_CODE_TELECHARGE', true);
25}
26
27// pour utiliser des styles inline (ou des classes css)
28if (!defined('PLUGIN_COLORATION_CODE_STYLES_INLINE')) {
29        define('PLUGIN_COLORATION_CODE_STYLES_INLINE', true); // false mettra des class et une css associe
30}
31
32// pour mettre des classes css MAIS ne mettre aucun style correspondant
33// cela suppose donc qu'une CSS externe a ce plugin s'occupe de les styler
34if (!defined('PLUGIN_COLORATION_CODE_SANS_STYLES')) {
35        define('PLUGIN_COLORATION_CODE_SANS_STYLES', false); // true mettra des class mais pas de css associe
36}
37
38// pouvoir definir la taille des tablations (defaut de geshi : 8)
39// define('PLUGIN_COLORATION_CODE_TAB_WIDTH', 4);
40
41       
42// pour utiliser le colorieur 'spip' ou 'spip2' si on
43// passe une class "spip" simplement.
44// note: le colorieur "spip" est celui present originellement dans le plugin
45// mais possede des regexp qui se trompaient parfois à quelques } ou > pres...
46// il est laisse pour ceux qui le preferaient neanmoins (le nouveau n'a pas les memes couleurs).
47if (!defined('PLUGIN_COLORATION_CODE_COLORIEUR_SPIP')) {
48        define('PLUGIN_COLORATION_CODE_COLORIEUR_SPIP', 'spip2');
49}
50
51
52function coloration_code_color($code, $language, $cadre='cadre', $englobant='div') {
53
54        // On ajoute une argument a la fonction pour permettre d'afficher du code dans des <span>
55        // plutot que dans un <div>. Par contre, cette option de span est a utiliser avec la balise <code>
56        // et pas <cadre> pour des raisons de validite et de presentation.
57        // En outre, le bouton telecharger n'est pas affiche.
58        if ($cadre == 'cadre')
59                $englobant = 'div';
60
61        // Supprime le premier et le dernier retour chariot
62        $code = preg_replace("/^(\r\n|\n|\r)*/", "", $code);
63        $code = preg_replace("/(\r\n|\n|\r)*$/", "", $code);
64
65        $params = explode(' ', $language);
66        $language = array_shift($params);
67       
68        if ($language=='spip') $language = PLUGIN_COLORATION_CODE_COLORIEUR_SPIP;
69       
70        include_spip('inc/spip_geshi');
71        //
72        // Create a GeSHi object
73        //
74        $geshi = new SPIP_GeSHi($code, $language);
75        if ($geshi->error()) {
76                return false;
77        }
78        global $spip_lang_right;
79       
80        // eviter des ajouts abusifs de CSS par Geshy
81        // qui pose des 'font-family: monospace;' un peu partout
82        // et que FF ne gere pas comme les autres navigateurs (va comprendre).
83        $geshi->set_overall_style('');
84        $geshi->set_code_style('');
85       
86        $stylecss = "";
87        if (!PLUGIN_COLORATION_CODE_STYLES_INLINE OR PLUGIN_COLORATION_CODE_SANS_STYLES) {
88                $geshi->enable_classes();
89                if (!PLUGIN_COLORATION_CODE_SANS_STYLES) {
90                        $stylecss = "<style type='text/css'>".$geshi->get_stylesheet()."</style>";
91                }
92        }
93
94
95        if (defined('PLUGIN_COLORATION_CODE_TAB_WIDTH') and PLUGIN_COLORATION_CODE_TAB_WIDTH) {
96                $geshi->set_tab_width(PLUGIN_COLORATION_CODE_TAB_WIDTH);
97        }
98               
99        include_spip('inc/texte');
100        $code = echappe_retour($code);
101
102        $telecharge = ($englobant == 'div')
103         &&     (PLUGIN_COLORATION_CODE_TELECHARGE || in_array('telechargement', $params))
104         && (strpos($code, "\n") !== false) && !in_array('sans_telechargement', $params);
105        if ($telecharge) {
106                // Gerer le fichier contenant le code au format texte
107                $nom_fichier = md5($code);
108                $dossier = sous_repertoire(_DIR_VAR, 'cache-code');
109                $fichier = "$dossier$nom_fichier.txt";
110
111                if (!file_exists($fichier)) {
112                        ecrire_fichier($fichier, $code);
113                }
114        }
115
116        if ($cadre == 'cadre') {
117          $spip_cadre = ' spip_cadre';
118          $geshi->set_header_type(GESHI_HEADER_DIV);
119          $geshi->enable_line_numbers(GESHI_NORMAL_LINE_NUMBERS);
120        } else {
121          $spip_cadre = '';
122          $geshi->set_header_type(GESHI_HEADER_NONE);
123          $geshi->enable_line_numbers(GESHI_NO_LINE_NUMBERS);
124        }
125
126        //
127        // And echo the result!
128        //
129        $rempl = $stylecss . '<' . $englobant . ' class="coloration_code"><' . $englobant . ' class="spip_'.$language.' '.$cadre.$spip_cadre.'">'.$geshi->parse_code().'</' . $englobant . '>';
130
131        if ($telecharge) {
132                $rempl .= "<div class='" . $cadre . "_download'
133                style='text-align: $spip_lang_right;'>
134                <a href='$fichier'
135                style='font-family: verdana, arial, sans; font-weight: bold; font-style: normal;'>" .
136                  _T('bouton_download') .
137                                "</a></div>";
138        }
139        return $rempl.'</' . $englobant . '>';
140}
141
142function cadre_ou_code($regs) {
143        $ret = false;
144// pour l'instant, on oublie $matches[1] et $matches[4] les attributs autour de class="machin"
145        if (!preg_match(',^(.*)class=("|\')(.*)\2(.*)$,Uims',$regs[2], $matches)
146        || !($ret = coloration_code_color($regs[3], $matches[3], $regs[1]))) {
147                $ret = $regs[1] == 'code' ? traiter_echap_code_dist($regs)
148                                        : traiter_echap_cadre_dist($regs);
149        }
150        return $ret;
151}
152
153function traiter_echap_code($regs) {
154        return cadre_ou_code($regs);
155}
156
157function traiter_echap_cadre($regs) {
158        return cadre_ou_code($regs);
159}
Note: See TracBrowser for help on using the repository browser.