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

Last change on this file since 102955 was 102955, checked in by erational@…, 3 years ago

On ajoute aussi la CSS personnalisée dans l'espace public
Un peu de PSR aussi

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