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

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

Ajouter une class ouvrir_fermer sur les lien autour des titres de blocs

Ce sont ces liens qui ouvrent le bloc et non pas le block complet.

Cela permet d'être compatible notamment avec le plugin "Sommaire automatique" (https://contrib.spip.net/Sommaire-automatique)

Version 1.2.0

File size: 8.4 KB
Line 
1<?php
2/**
3 * Plugin Blocs Dépliables
4 * (c) 2013 Collectif
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) = preg_split(',(\n\n|\r\n\r\n|\r\r),', trim($matches[3]), 2);
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.