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

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

On favorise la semantique des balises : <code> pour code inline et <pre> pour un bloc de code, <p> pour le lien de telechargement
Cela permet de beneficier des stylages natifs de ces balises quand ils sont là et d'avoir des blocs qui se tiennent et ont une apparence correcte avec une base CSS complète, même sans stylage spécifique pour le plugin.

Corrolairement on laisse tomber les .spip_code et .spip_cadre qui generent plus de confusion qu'autre chose (et ne s'emboitent pas bien par rapport au pre, ajoutant cadre au cadre)

La css privée est enrichie des fioritures qui rendent le tout plus joli, et on les propose dans la css publique aussi, pour le cas ou elle servirait.


Voir si ça ne casse pas trop les sites qui utilisent le plugin.

File size: 6.0 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       
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        if($datatext)
121                $datatext_content = ' data-clipboard-text="'.attribut_html($code).'"';
122               
123        if ($cadre == 'cadre' OR $englobant=="div") {
124          $geshi->set_header_type(GESHI_HEADER_PRE);
125          $geshi->enable_line_numbers(GESHI_NORMAL_LINE_NUMBERS);
126        } else {
127          $geshi->set_header_type(GESHI_HEADER_NONE);
128          $geshi->enable_line_numbers(GESHI_NO_LINE_NUMBERS);
129        }
130
131        //
132        // And echo the result!
133        //
134        $rempl = $stylecss . '<' . $englobant . ' class="coloration_code '.$cadre.'"><' . $balise_code . ' class="spip_'.$language.' '.$cadre.'"'.$datatext_content.'>'.$geshi->parse_code().'</' . $balise_code . '>';
135
136        if ($telecharge) {
137                $rempl .= "<p class='download " . $cadre . "_download'><a href='$fichier'>"._T('bouton_download')."</a></p>";
138        }
139        return $rempl.'</' . $englobant . '>';
140}
141
142/**
143 * Est-ce à Geshi de traiter les codes et cadres ou on utilise les fonctions natives de SPIP
144 *
145 * @param array $regs
146 * @return string $ret
147 */
148function cadre_ou_code($regs) {
149        // pour l'instant, on oublie $matches[1] et $matches[4] les attributs autour de class="machin"
150        if (preg_match(',^(.*)class=("|\')(.*)\2(.*)$,Uims',$regs[2], $matches)){
151                $englobant = "div";
152                if ($regs[1]=="code" AND strpos($regs[3],"\n")===false)
153                        $englobant = "span";
154                if ($ret = coloration_code_color($regs[3], $matches[3], $regs[1], $englobant))
155                        return $ret;
156        }
157
158        if ($regs[1] == 'code')
159                return traiter_echap_code_dist($regs);
160
161        return traiter_echap_cadre_dist($regs);
162}
163
164/**
165 * Surcharge de la fonction traiter_echap_code_dist native de SPIP
166 * cf : ecrire/inc/texte_mini
167 *
168 * @param array $regs
169 * @return string
170 */
171function traiter_echap_code($regs) {
172        return cadre_ou_code($regs);
173}
174
175/**
176 * Surcharge de la fonction traiter_echap_cadre_dist native de SPIP
177 * cf : ecrire/inc/texte_mini
178 *
179 * @param array $regs
180 * @return string
181 */
182function traiter_echap_cadre($regs) {
183        return cadre_ou_code($regs);
184}
Note: See TracBrowser for help on using the repository browser.