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

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

Corriger les <code class='spip'> est bien complexe !
Il faut un peu plus surcharger geshi qui mélange un peu tout dans sa fonction d'analyse de 300 lignes.
On en extrait un bout que l'on surcharge avec notre classe SPIP et on appele comme pour les <cadre> les fonctions spécifiques au colorieur SPIP sur certaines déclarations de regexp (ce qui n'était pas fait avec <code>) donc.

File size: 6.0 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// Liens externes sur les mots cles de langage (defaut de geshi : true)
42if (!defined('PLUGIN_COLORATION_CODE_LIENS_LANGAGE')) {
43        define('PLUGIN_COLORATION_CODE_LIENS_LANGAGE', true); // false pour les eviter
44}
45
46
47// pour utiliser le colorieur 'spip' ou 'spip2' si on
48// passe une class "spip" simplement.
49// note: le colorieur "spip" est celui present originellement dans le plugin
50// mais possede des regexp qui se trompaient parfois à quelques } ou > pres...
51// il est laisse pour ceux qui le preferaient neanmoins (le nouveau n'a pas les memes couleurs).
52if (!defined('PLUGIN_COLORATION_CODE_COLORIEUR_SPIP')) {
53        define('PLUGIN_COLORATION_CODE_COLORIEUR_SPIP', 'spip2');
54}
55
56
57function coloration_code_color($code, $language, $cadre='cadre', $englobant='div') {
58
59        // On ajoute une argument a la fonction pour permettre d'afficher du code dans des <span>
60        // plutot que dans un <div>. Par contre, cette option de span est a utiliser avec la balise <code>
61        // et pas <cadre> pour des raisons de validite et de presentation.
62        // En outre, le bouton telecharger n'est pas affiche.
63        if ($cadre == 'cadre')
64                $englobant = 'div';
65
66        // Supprime le premier et le dernier retour chariot
67        $code = preg_replace("/^(\r\n|\n|\r)*/", "", $code);
68        $code = preg_replace("/(\r\n|\n|\r)*$/", "", $code);
69
70        $params = explode(' ', $language);
71        $language = array_shift($params);
72       
73        if ($language=='spip') $language = PLUGIN_COLORATION_CODE_COLORIEUR_SPIP;
74       
75        include_spip('inc/spip_geshi');
76        //
77        // Create a GeSHi object
78        //
79        $geshi = new SPIP_GeSHi($code, $language);
80        if ($geshi->error()) {
81                return false;
82        }
83        global $spip_lang_right;
84       
85        // eviter des ajouts abusifs de CSS par Geshy
86        // qui pose des 'font-family: monospace;' un peu partout
87        // et que FF ne gere pas comme les autres navigateurs (va comprendre).
88        $geshi->set_overall_style('');
89        $geshi->set_code_style('');
90       
91        $stylecss = "";
92        if (!PLUGIN_COLORATION_CODE_STYLES_INLINE OR PLUGIN_COLORATION_CODE_SANS_STYLES) {
93                $geshi->enable_classes();
94                if (!PLUGIN_COLORATION_CODE_SANS_STYLES) {
95                        $stylecss = "<style type='text/css'>".$geshi->get_stylesheet()."</style>";
96                }
97        }
98
99
100        if (defined('PLUGIN_COLORATION_CODE_TAB_WIDTH') and PLUGIN_COLORATION_CODE_TAB_WIDTH) {
101                $geshi->set_tab_width(PLUGIN_COLORATION_CODE_TAB_WIDTH);
102        }
103
104        // permettre de supprimer les liens vers les documentations sur les mots cles de langage
105        if (!PLUGIN_COLORATION_CODE_LIENS_LANGAGE) {
106                $geshi->enable_keyword_links(false);
107        }
108
109        include_spip('inc/texte');
110        $code = echappe_retour($code);
111
112        $telecharge = ($englobant == 'div')
113         &&     (PLUGIN_COLORATION_CODE_TELECHARGE || in_array('telechargement', $params))
114         && (strpos($code, "\n") !== false) && !in_array('sans_telechargement', $params);
115        if ($telecharge) {
116                // Gerer le fichier contenant le code au format texte
117                $nom_fichier = md5($code);
118                $dossier = sous_repertoire(_DIR_VAR, 'cache-code');
119                $fichier = "$dossier$nom_fichier.txt";
120
121                if (!file_exists($fichier)) {
122                        ecrire_fichier($fichier, $code);
123                }
124        }
125
126        if ($cadre == 'cadre') {
127          $spip_cadre = ' spip_cadre';
128          $geshi->set_header_type(GESHI_HEADER_DIV);
129          $geshi->enable_line_numbers(GESHI_NORMAL_LINE_NUMBERS);
130        } else {
131          $spip_cadre = ' ';
132          $geshi->set_header_type(GESHI_HEADER_NONE);
133          $geshi->enable_line_numbers(GESHI_NO_LINE_NUMBERS);
134        }
135
136        //
137        // And echo the result!
138        //
139        $rempl = $stylecss . '<' . $englobant . ' class="coloration_code"><' . $englobant . ' class="spip_'.$language.' '.$cadre.$spip_cadre.'">'.$geshi->parse_code().'</' . $englobant . '>';
140
141        if ($telecharge) {
142                $rempl .= "<div class='" . $cadre . "_download'
143                style='text-align: $spip_lang_right;'>
144                <a href='$fichier'
145                style='font-family: verdana, arial, sans; font-weight: bold; font-style: normal;'>" .
146                  _T('bouton_download') .
147                                "</a></div>";
148        }
149        return $rempl.'</' . $englobant . '>';
150}
151
152function cadre_ou_code($regs) {
153        $ret = false;
154// pour l'instant, on oublie $matches[1] et $matches[4] les attributs autour de class="machin"
155        if (!preg_match(',^(.*)class=("|\')(.*)\2(.*)$,Uims',$regs[2], $matches)
156        || !($ret = coloration_code_color($regs[3], $matches[3], $regs[1]))) {
157                $ret = $regs[1] == 'code' ? traiter_echap_code_dist($regs)
158                                        : traiter_echap_cadre_dist($regs);
159        }
160        return $ret;
161}
162
163function traiter_echap_code($regs) {
164        return cadre_ou_code($regs);
165}
166
167function traiter_echap_cadre($regs) {
168        return cadre_ou_code($regs);
169}
Note: See TracBrowser for help on using the repository browser.