source: spip-zone/_plugins_/coloration_code/trunk/inc/spip_geshi.php @ 94456

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

Bugfix propre du cas fonction inexistante : this->language_dataREGEXPS?[] n'est pas forcement un array mais peut etre une string, comme dans le cas defini pour le langage 'css'. On ajout le test, et un log verbeux en cas d'erreur restante

File size: 3.6 KB
Line 
1<?php
2
3/**
4 * Surcharge de la classe GESHI 1.0.8
5 *
6**/
7
8if (!defined("_ECRIRE_INC_VERSION")) return;
9
10include_spip('geshi/geshi');
11
12// a la sauce GESHI
13define('SPIP_GESHI_REGEXP_FUNCTION', 99);
14
15
16
17class SPIP_GeSHi extends GeSHi {
18
19        // fonction de traitement de certaines regexp spip
20        var $_hmr_func = '';
21
22        /**
23         * Cette surcharge implemente simplement
24         * une nouvelle cle dans $language_data
25         * intitulee 'SPIP_GESHI_COLOR_FUNCTION' permettant d'appeler une fonction
26         * existante avec le code source a colorier, utilise dans la declaration geshi/spip3.php
27         *
28         * Cette fonction doit retourner le code avec les instructions
29         * en plus de geshi pour colorier, qui sont des choses comme :
30         * <| class="br0">contenu|>
31         */
32        function parse_non_string_part($stuff_to_parse) {
33
34                // Fonction de coloration definie
35                // doit s'occuper de retourner des <| et d'echapper les textes (hsc)
36                if (isset($this->language_data['SPIP_GESHI_COLOR_FUNCTION']) and $this->language_data['SPIP_GESHI_COLOR_FUNCTION']) {
37                        $parse = $this->language_data['SPIP_GESHI_COLOR_FUNCTION'];
38                        $stuff_to_parse = $parse($stuff_to_parse);
39                        # on reprend le minimum syndical de parse_non_string_part()
40                        # en esperant que ca suffise pour ce qu'on a a faire.
41                        # Ca semble que c'est ok.
42                        $stuff_to_parse = str_replace('<|', '<span', $stuff_to_parse);
43                        $stuff_to_parse = str_replace ( '|>', '</span>', $stuff_to_parse );
44                        return $stuff_to_parse;
45                }
46
47                return parent::parse_non_string_part($stuff_to_parse);
48        }
49
50
51        /**
52         * Cette surcharge implemente simplement
53         * une nouvelle cle dans le tableau de declaration d'une REGEXP
54         * permettant de passer une fonction via la cle SPIP_GESHI_REGEXP_FUNCTION.
55         * Cette fonction, si presente, sera appelee avec
56         * le resultat du match de la regexp, a la place des traitements
57         * habituels de GESHI, et doit alors retourner le code attendu par GESHI,
58         * a savoir quelque chose comme : "avant <|!REG3XP31!>contenu|> apres"
59         *
60         * Cette possibilite est utilise dans geshi/spip2.php
61         */
62        function handle_multiline_regexps($matches) {
63                $key = $this->_hmr_key;
64                if (  is_array($this->language_data['REGEXPS'][$key])
65                  and isset($this->language_data['REGEXPS'][$key][SPIP_GESHI_REGEXP_FUNCTION])
66                  and $func = $this->language_data['REGEXPS'][$key][SPIP_GESHI_REGEXP_FUNCTION]) {
67
68                        if (function_exists($func)) {
69                                return $func($matches, $this);
70                        }
71                        spip_log("$func inexistante dans this->language_data['REGEXPS'][$key]=" . var_export($this->language_data['REGEXPS'][$key],true), "geshi" . _LOG_ERREUR);
72                }
73
74                return parent::handle_multiline_regexps($matches);
75        }
76
77
78        /**
79         * Cette surcharge d'une surcharge de Geshi
80         * implemente pour le non multiligne la meme chose que
81         * pour handle_multiline_regexps() du dessus
82         *
83        **/
84        function handle_singleline_regexps($stuff_to_parse, $regexp, $key) {
85
86                if (  is_array($regexp)
87                  and isset($regexp[SPIP_GESHI_REGEXP_FUNCTION])
88                  and $func = $regexp[SPIP_GESHI_REGEXP_FUNCTION]
89                  and function_exists($func)) {
90
91                        $this->_hmr_key  = $key;
92                        $this->_hmr_func = $func;
93
94                        $stuff_to_parse = preg_replace_callback(
95                                '/' . $regexp[GESHI_SEARCH] . '/' . $regexp[GESHI_MODIFIERS],
96                                array($this, 'handle_singleline_regexps_bis'),
97                                $stuff_to_parse);
98
99                        $this->_hmr_func = '';
100
101                        return $stuff_to_parse;
102                }
103
104                return parent::handle_singleline_regexps($stuff_to_parse, $regexp, $key);
105        }
106
107
108
109        /**
110         * Renvoyer sur la fonction du colorieur SPIP demandee
111         *
112        **/
113        function handle_singleline_regexps_bis($matches) {
114                $func = $this->_hmr_func;
115                if (!$func or !function_exists($func)) {
116                        return '';
117                }
118                return $func($matches, $this);
119        }
120
121}
122
123?>
Note: See TracBrowser for help on using the repository browser.