source: spip-zone/_plugins_/blocsdepliables/blocsdepliables_pipelines.php @ 112559

Last change on this file since 112559 was 112559, checked in by patfr@…, 20 months ago

Rendre à César... Et surtout éviter les erreurs 500 !

File size: 8.7 KB
Line 
1<?php
2/**
3 * Plugin Blocs Dépliables
4 * (c) 2013 Collectif, issu du plugin "Le Couteau Suisse"
5 * Licence GNU/GPL
6 */
7
8if (!defined('_ECRIRE_INC_VERSION')) {
9        return;
10}
11
12/**
13 * Insertion dans le pipeline insert_head (SPIP)
14 *
15 * @param string $flux
16 * @return string
17 */
18function blocsdepliables_insert_head($flux) {
19        $flux .= "<script type='text/javascript' src='".timestamp(find_in_path('js/blocs.js'))."'></script>";
20        return $flux;
21}
22
23function blocsdepliables_insert_head_css($flux) {
24        include_spip('inc/config');
25        $slide = lire_config('blocsdepliables/animation', 'aucun');
26        if ($slide == 'millisec') {
27                $slide = lire_config('blocsdepliables/duree', 100);
28        }
29        $js_cookie = '';
30        if (lire_config('blocsdepliables/cookie', 0)) {
31                $js_cookie = find_in_path('javascript/jquery.cookie.js');
32        }
33
34        $js = 'var blocs_replier_tout = '.intval(lire_config('blocsdepliables/unique', 0)).';
35var blocs_slide = '._q($slide).';
36var blocs_title_sep = /'.preg_quote(_BLOC_TITLE_SEP).'/g;
37var blocs_title_def = '._q(_T('blocsdepliables:bloc_deplier')._BLOC_TITLE_SEP._T('blocsdepliables:bloc_replier')).";
38var blocs_js_cookie = '$js_cookie';
39";
40        $flux =
41                "<script type='text/javascript'>/*<![CDATA[*/\n$js\n/*]]>*/</script>"
42                . $flux
43                . '<link rel="stylesheet" type="text/css" href="'.timestamp(find_in_path('css/blocs.css')).'" />';
44
45        return $flux;
46}
47
48/*
49   Cet outil 'blocs' permet aux redacteurs d'un site spip d'inclure des blocs visibles ou invisibles dans leurs textes
50   balises : <bloc></bloc> ou <invisible></invisible>, et <visible></visible>
51   le titre est obtenu en sautant deux lignes a l'interieur du bloc
52   Attention : seules les balises en minuscules sont reconnues.
53*/
54
55// depliage/repliage - fonction de personnalisation des title a placer dans mes_fonctions.php
56// function blocs_title($titre='', $corps='', $num='') {
57//      return array(_T('blocsdepliables:bloc_deplier'), _T('blocsdepliables:bloc_replier'));
58// }
59
60function blocsdepliables_callback($matches) {
61        list($titre, $corps) = array_pad(preg_split(',(\n\n|\r\n\r\n|\r\r),', trim($matches[3]), 2), 2, null);
62        // pas de corps !
63        if (!strlen($corps = trim($corps))) {
64                $corps = $titre;
65                $titre = preg_replace(',[\n\r]+,s', ' ', couper(propre($titre), 30));
66        }
67        // pas d'intertitre !
68        $titre = preg_replace(',^{{{(.*)}}}$,', '$1', trim($titre));
69        if (!strlen($titre)) {
70                $titre = '???';
71        }
72        // un resume facultatif
73        if (preg_match(',<resume>(.*)</resume>\s?(.*)$,ms', $corps, $res)) {
74                $corps = $res[2];
75                $res = $res[1];
76        } else {
77                $res = '';
78        }
79        // types de blocs : bloc|invisible|visible
80        if (in_array($matches[1], array('visible', 'visible#')) || defined('_CS_PRINT')) {
81                $h = $d = '';
82                $r = ' blocs_invisible blocs_slide';
83        } else {
84                $h = ' blocs_replie';
85                $d = ' blocs_invisible blocs_slide';
86                $r = '';
87        }
88
89        // blocs numerotes
90        $b = strlen($matches[2])?" cs_bloc$matches[2]' id='deplier_num$matches[2]":'';
91        // title
92        $title = function_exists('blocs_title')
93                ?"<div class='blocs_title blocs_invisible'>".join(_BLOC_TITLE_SEP, blocs_title($titre, $corps, $matches[2], $h<>'')).'</div>'
94                :''; // valeur par defaut geree en JS
95        $hn = blocdepliable_balise_titre();
96        return "<div class='cs_blocs$b'><$hn class='blocs_titre$h blocs_click'><a href='javascript:;' class='ouvrir_fermer'>$titre</a></$hn>"
97                .(strlen($res)?"<div class='blocs_resume$r'>\n$res\n</div>" : '')
98                ."<div class='blocs_destination$d'>\n\n".blocsdepliables_rempl($corps)."\n\n</div>$title</div>";
99}
100
101// cette fonction n'est pas appelee dans les balises html : html|code|cadre|frame|script
102function blocsdepliables_rempl($texte) {
103        if (strpos($texte, '<') === false) {
104                return $texte;
105        }
106        // balises blocs|visible|invisible : il faut un callback pour analyser l'interieur du texte
107        return preg_replace_callback(',<(bloc#?|visible#?|invisible#?|blocintertitre#?)([0-9]*)>(.*?)</\1\2>,ms', 'blocsdepliables_callback', $texte);
108}
109
110
111/**
112 * evite les transformations typo dans les balises $balises
113 * par exemple pour <html>, <cadre>, <code>, <frame>, <script>, <acronym> et <cite>, $balises = 'html|code|cadre|frame|script|acronym|cite'
114 *
115 * @param $texte
116 *   $texte a filtrer
117 * @param $filtre
118 *   le filtre a appliquer pour transformer $texte
119 *   si $filtre = false, alors le texte est retourne protege, sans filtre
120 * @param $balises
121 *   balises concernees par l'echappement
122 *   si $balises = '' alors la protection par defaut est sur les balises de _PROTEGE_BLOCS
123 *   si $balises = false alors le texte est utilise tel quel
124 * @param null|array $args
125 *   arguments supplementaires a passer au filtre
126 * @return string
127 */
128function blocsdepliables_filtre_texte_echappe($texte, $filtre, $balises = '', $args = null) {
129        if (!strlen($texte)) {
130                return '';
131        }
132
133        if ($filtre!==false) {
134                $fonction = chercher_filtre($filtre, false);
135                if (!$fonction) {
136                        spip_log("blocsdepliables_filtre_texte_echappe() : $filtre() non definie", _LOG_ERREUR);
137                        return $texte;
138                }
139                $filtre = $fonction;
140        }
141
142        // protection du texte
143        if ($balises !== false) {
144                if (!strlen($balises)) {
145                        $balises = _PROTEGE_BLOCS;//'html|code|cadre|frame|script';
146                } else {
147                        $balises = ',<('.$balises.')(\s[^>]*)?>(.*)</\1>,UimsS';
148                }
149                if (!function_exists('echappe_html')) {
150                        include_spip('inc/texte_mini');
151                }
152                $texte = echappe_html($texte, 'FILTRETEXTECHAPPE', true, $balises);
153        }
154        // retour du texte simplement protege
155        if ($filtre === false) {
156                return $texte;
157        }
158        // transformation par $fonction
159        if (!$args) {
160                $texte = $filtre($texte);
161        } else {
162                array_unshift($args, $texte);
163                $texte = call_user_func_array($filtre, $args);
164        }
165
166        // deprotection des balises
167        return echappe_retour($texte, 'FILTRETEXTECHAPPE');
168}
169
170
171// fonction pipeline
172function blocsdepliables_pre_typo($texte) {
173        if (strpos($texte, '<') === false) {
174                return $texte;
175        }
176        // on remplace apres echappement
177        return blocsdepliables_filtre_texte_echappe($texte, 'blocsdepliables_rempl');
178}
179
180// 2 fonctions pour le plugin Porte Plume, s'il est present (SPIP>=2.0)
181function blocsdepliables_porte_plume_cs_pre_charger($flux) {
182        $r = array(
183                array(
184                        'id' => 'blocs_bloc',
185                        'name' => _T('blocsdepliables:pp_blocs_bloc'),
186                        'className' => 'blocs_bloc',
187                        'replaceWith' => "\n<bloc>"._T('blocsdepliables:pp_un_titre')."\n\n"._T('blocsdepliables:pp_votre_texte')."\n</bloc>\n",
188                        'display' => true
189                ),
190                array(
191                        'id' => 'blocs_visible',
192                        'name' => _T('blocsdepliables:pp_blocs_visible'),
193                        'className' => 'blocs_visible',
194                        'replaceWith' => "\n<visible>"._T('blocsdepliables:pp_un_titre')."\n\n"._T('blocsdepliables:pp_votre_texte')."\n</visible>\n",
195                        'display' => true)
196                );
197        if (function_exists('cs_pp_liste_barres')) {
198                foreach (cs_pp_liste_barres('blocs') as $b) {
199                        if ($b!='forum') {
200                                $flux[$b] = isset($flux[$b])?array_merge($flux[$b], $r):$r;
201                        }
202                }
203        }
204        return $flux;
205}
206
207// 2 fonctions pour le plugin Porte Plume, s'il est present (SPIP>=2.0)
208function blocsdepliables_porte_plume_barre_pre_charger($flux) {
209        if (!function_exists('cs_pp_liste_barres')) {
210                $barre = &$flux['edition'];
211                if (defined('_DIR_PLUGIN_TYPOENLUMINEE')) {
212                        $barre->ajouterApres('barre_cadre', array(
213                                'id' => 'blocs_bloc',
214                                'name' => _T('blocsdepliables:pp_blocs_bloc'),
215                                'className' => 'blocs_bloc',
216                                'replaceWith' => "\n<bloc>"._T('blocsdepliables:pp_un_titre')."\n\n"._T('blocsdepliables:pp_votre_texte')."\n</bloc>\n",
217                                'display' => true));
218                        $barre->ajouterApres('blocs_bloc', array(
219                                'id' => 'blocs_visible',
220                                'name' => _T('blocsdepliables:pp_blocs_visible'),
221                                'className' => 'blocs_visible',
222                                'replaceWith' => "\n<visible>"._T('blocsdepliables:pp_un_titre')."\n\n"._T('blocsdepliables:pp_votre_texte')."\n</visible>\n",
223                                'display' => true));
224                } else {
225                        $barre->set('header1', array(
226                                // groupe formatage paragraphe
227                                'dropMenu' => array(
228                                        // bouton <cadre>
229                                        array(
230                                                'id' => 'blocs_bloc',
231                                                'name' => _T('blocsdepliables:pp_blocs_bloc'),
232                                                'className' => 'blocs_bloc',
233                                                'replaceWith' => "\n<bloc>"._T('blocsdepliables:pp_un_titre')."\n\n"._T('blocsdepliables:pp_votre_texte')."\n</bloc>\n",
234                                                'display' => true
235                                        ),
236                                        array(
237                                                'id' => 'blocs_visible',
238                                                'name' => _T('blocsdepliables:pp_blocs_visible'),
239                                                'className' => 'blocs_visible',
240                                                'replaceWith' => "\n<visible>"._T('blocsdepliables:pp_un_titre')."\n\n"._T('blocsdepliables:pp_votre_texte')."\n</visible>\n",
241                                                'display' => true
242                                        )
243                                )
244                        ));
245                }
246        }
247        return $flux;
248}
249
250function blocsdepliables_porte_plume_lien_classe_vers_icone($flux) {
251        $flux['blocs_bloc'] = 'bloc_invisible.png';
252        $flux['blocs_visible'] = 'bloc_visible.png';
253        return $flux;
254}
Note: See TracBrowser for help on using the repository browser.