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

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

Permettre de supprimer les liens vers les documentations sur les mots cles de langage via la constante : PLUGIN_COLORATION_CODE_LIENS_LANGAGE à passer à false.

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.