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

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

Notice PHP en moins.

File size: 6.1 KB
Line 
1<?php
2/**
3 * Plugin coloration code
4 * Fonctions spécifiques au plugin
5 *
6 * @package SPIP\Coloration_code\Fonctions
7 */
8 
9if (!defined("_ECRIRE_INC_VERSION")) return;
10
11// pour interdire globalement et optionnellement le téléchargement associé
12if (!defined('PLUGIN_COLORATION_CODE_TELECHARGE')) {
13        define('PLUGIN_COLORATION_CODE_TELECHARGE', true);
14}
15
16// pour utiliser des styles inline (ou des classes css)
17if (!defined('PLUGIN_COLORATION_CODE_STYLES_INLINE')) {
18        define('PLUGIN_COLORATION_CODE_STYLES_INLINE', true); // false mettra des class et une css associe
19}
20
21// pour mettre des classes css MAIS ne mettre aucun style correspondant
22// cela suppose donc qu'une CSS externe a ce plugin s'occupe de les styler
23if (!defined('PLUGIN_COLORATION_CODE_SANS_STYLES')) {
24        define('PLUGIN_COLORATION_CODE_SANS_STYLES', false); // true mettra des class mais pas de css associe
25}
26
27// pouvoir definir la taille des tablations (defaut de geshi : 8)
28// define('PLUGIN_COLORATION_CODE_TAB_WIDTH', 4);
29
30// Liens externes sur les mots cles de langage (defaut de geshi : true)
31if (!defined('PLUGIN_COLORATION_CODE_LIENS_LANGAGE')) {
32        define('PLUGIN_COLORATION_CODE_LIENS_LANGAGE', true); // false pour les eviter
33}
34
35
36// pour utiliser le colorieur 'spip' ou 'spip2' si on
37// passe une class "spip" simplement.
38// note: le colorieur "spip" est celui present originellement dans le plugin
39// mais possede des regexp qui se trompaient parfois à quelques } ou > pres...
40// il est laisse pour ceux qui le preferaient neanmoins (le nouveau n'a pas les memes couleurs).
41if (!defined('PLUGIN_COLORATION_CODE_COLORIEUR_SPIP')) {
42        define('PLUGIN_COLORATION_CODE_COLORIEUR_SPIP', 'spip2');
43}
44
45
46function coloration_code_color($code, $language, $cadre='cadre', $englobant='div') {
47
48        // On ajoute une argument a la fonction pour permettre d'afficher du code dans des <span>
49        // plutot que dans un <div>. Par contre, cette option de span est a utiliser avec la balise <code>
50        // et pas <cadre> pour des raisons de validite et de presentation.
51        // En outre, le bouton telecharger n'est pas affiche.
52        if ($cadre == 'cadre')
53                $englobant = 'div';
54        $balise_code = ($englobant == 'div' ? "div":"code");
55
56        // Supprime le premier et le dernier retour chariot
57        $code = preg_replace("/^(\r\n|\n|\r)*/", "", $code);
58        $code = preg_replace("/(\r\n|\n|\r)*$/", "", $code);
59
60        $params = explode(' ', $language);
61        $language = array_shift($params);
62       
63        if ($language=='spip') $language = PLUGIN_COLORATION_CODE_COLORIEUR_SPIP;
64        if ($language=='bibtex' and _COLORATION_BIBTEX_COMME_BIBLATEX == 1) $language = 'biblatex';
65        include_spip('inc/spip_geshi');
66        //
67        // Create a GeSHi object
68        //
69        $geshi = new SPIP_GeSHi($code, $language);
70        if ($geshi->error()) {
71                return false;
72        }
73        global $spip_lang_right;
74       
75        // eviter des ajouts abusifs de CSS par Geshy
76        // qui pose des 'font-family: monospace;' un peu partout
77        // et que FF ne gere pas comme les autres navigateurs (va comprendre).
78        $geshi->set_overall_style('');
79        $geshi->set_code_style('');
80
81        $stylecss = "";
82        if (!PLUGIN_COLORATION_CODE_STYLES_INLINE OR PLUGIN_COLORATION_CODE_SANS_STYLES) {
83                $geshi->enable_classes();
84                if (!PLUGIN_COLORATION_CODE_SANS_STYLES) {
85                        $stylecss = "<style type='text/css'>".$geshi->get_stylesheet()."</style>";
86                }
87        }
88
89
90        if (defined('PLUGIN_COLORATION_CODE_TAB_WIDTH') and PLUGIN_COLORATION_CODE_TAB_WIDTH) {
91                $geshi->set_tab_width(PLUGIN_COLORATION_CODE_TAB_WIDTH);
92        }
93
94        // permettre de supprimer les liens vers les documentations sur les mots cles de langage
95        if (!PLUGIN_COLORATION_CODE_LIENS_LANGAGE) {
96                $geshi->enable_keyword_links(false);
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        /**
117         * On insère un attribut data-clipboard-text si on n'a pas le lien de téléchargement car pas de saut de ligne
118         */
119        $datatext = !$telecharge && PLUGIN_COLORATION_CODE_TELECHARGE;
120        $datatext_content = "";
121        if ($datatext) {
122                $datatext_content = ' data-clipboard-text="'.attribut_html($code).'"';
123        }
124
125        if ($cadre == 'cadre' OR $englobant=="div") {
126                $geshi->set_header_type(GESHI_HEADER_PRE);
127                $geshi->enable_line_numbers(GESHI_NORMAL_LINE_NUMBERS);
128        } else {
129                $geshi->set_header_type(GESHI_HEADER_NONE);
130                $geshi->enable_line_numbers(GESHI_NO_LINE_NUMBERS);
131        }
132
133        //
134        // And echo the result!
135        //
136        $rempl = $stylecss . '<' . $englobant . ' class="coloration_code '.$cadre.'"><' . $balise_code . ' class="spip_'.$language.' '.$cadre.'"'.$datatext_content.'>'.$geshi->parse_code().'</' . $balise_code . '>';
137
138        if ($telecharge) {
139                $rempl .= "<p class='download " . $cadre . "_download'><a href='$fichier'>"._T('bouton_download')."</a></p>";
140        }
141        return $rempl.'</' . $englobant . '>';
142}
143
144/**
145 * Est-ce à Geshi de traiter les codes et cadres ou on utilise les fonctions natives de SPIP
146 *
147 * @param array $regs
148 * @return string $ret
149 */
150function cadre_ou_code($regs) {
151        // pour l'instant, on oublie $matches[1] et $matches[4] les attributs autour de class="machin"
152        if (preg_match(',^(.*)class=("|\')(.*)\2(.*)$,Uims',$regs[2], $matches)){
153                $englobant = "div";
154                if ($regs[1]=="code" AND strpos($regs[3],"\n")===false)
155                        $englobant = "span";
156                if ($ret = coloration_code_color($regs[3], $matches[3], $regs[1], $englobant))
157                        return $ret;
158        }
159
160        if ($regs[1] == 'code')
161                return traiter_echap_code_dist($regs);
162
163        return traiter_echap_cadre_dist($regs);
164}
165
166/**
167 * Surcharge de la fonction traiter_echap_code_dist native de SPIP
168 * cf : ecrire/inc/texte_mini
169 *
170 * @param array $regs
171 * @return string
172 */
173function traiter_echap_code($regs) {
174        return cadre_ou_code($regs);
175}
176
177/**
178 * Surcharge de la fonction traiter_echap_cadre_dist native de SPIP
179 * cf : ecrire/inc/texte_mini
180 *
181 * @param array $regs
182 * @return string
183 */
184function traiter_echap_cadre($regs) {
185        return cadre_ou_code($regs);
186}
Note: See TracBrowser for help on using the repository browser.