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

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

Rester compatible avec les surchagres de blocs.js du cs

File size: 6.6 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')) return;
9
10
11function blocsdepliables_insert_head($flux){
12        include_spip("inc/config");
13        $slide = lire_config('blocsdepliables/animation','aucun');
14        if ($slide=="millisec") $slide = lire_config('blocsdepliables/duree',100);
15        $js_cookie = "";
16        if (lire_config('blocsdepliables/cookie',0)){
17                $js_cookie = find_in_path("javascript/jquery.cookie.js");
18                $js_cookie = "if(jQuery('div.cs_blocs').length) jQuery.getScript('$js_cookie', cs_blocs_cookie);";
19        }
20
21        $js = "var blocs_replier_tout = ".intval(lire_config('blocsdepliables/unique',0)).";
22var blocs_slide = "._q($slide).";
23var blocs_title_sep = /".preg_quote(_BLOC_TITLE_SEP)."/g;
24var blocs_title_def = "._q(_T('couteau:bloc_deplier')._BLOC_TITLE_SEP._T('couteau:bloc_replier')).";
25jQuery.fn.cs_todo=function(){return this.not('.cs_done').addClass('cs_done');};
26var cs_sel_jQuery='';
27jQuery(function(){
28blocs_init.apply(document);
29if(typeof onAjaxLoad=='function') onAjaxLoad(blocs_init);
30$js_cookie });";
31
32        $flux .= "<script type='text/javascript' src='".find_in_path("js/blocs.js")."'></script>
33<script type='text/javascript'>/*<![CDATA[*/\n$js\n/*]]>*/</script>";
34        return $flux;
35}
36
37function blocsdepliables_insert_head_css($flux){
38        $flux .= '<link rel="stylesheet" type="text/css" href="'.find_in_path("css/blocs.css").'" />';
39        return $flux;
40}
41
42/*
43   Cet outil 'blocs' permet aux redacteurs d'un site spip d'inclure des blocs visibles ou invisibles dans leurs textes
44   balises : <bloc></bloc> ou <invisible></invisible>, et <visible></visible>
45   le titre est obtenu en sautant deux lignes a l'interieur du bloc
46   Attention : seules les balises en minuscules sont reconnues.
47*/
48
49// depliage/repliage - fonction de personnalisation des title a placer dans mes_fonctions.php
50// function blocs_title($titre='', $corps='', $num='') {
51//      return array(_T('couteau:bloc_deplier'), _T('couteau:bloc_replier'));
52// }
53
54function blocsdepliables_callback($matches) {
55        list($titre, $corps) = preg_split(',(\n\n|\r\n\r\n|\r\r),', trim($matches[3]), 2);
56        // pas de corps !
57        if(!strlen($corps = trim($corps))) {
58                $corps = $titre;
59                $titre = preg_replace(',[\n\r]+,s', ' ', couper(propre($titre), 30));
60        }
61        // pas d'intertitre !
62        $titre = preg_replace(',^{{{(.*)}}}$,', '$1', trim($titre));
63        if(!strlen($titre)) $titre = '???';
64        // un resume facultatif
65        if(preg_match(',<resume>(.*)</resume>\s?(.*)$,ms', $corps, $res))
66                { $corps = $res[2]; $res = $res[1]; } else $res = '';
67        // types de blocs : bloc|invisible|visible
68        if ($matches[1]=='visible' || defined('_CS_PRINT')) {
69                $h = $d = '';
70                $r = ' blocs_invisible blocs_slide';
71        } else {
72                $h = ' blocs_replie';
73                $d = ' blocs_invisible blocs_slide';
74                $r = '';
75        }
76
77        // blocs numerotes
78        $b = strlen($matches[2])?" cs_bloc$matches[2]' id='deplier_num$matches[2]":'';
79        // title
80        $title = function_exists('blocs_title')
81                ?"<div class='blocs_title blocs_invisible'>".join(_BLOC_TITLE_SEP, blocs_title($titre, $corps, $matches[2], $h<>'')).'</div>'
82                :''; // valeur par defaut geree en JS
83        $hn = blocdepliable_balise_titre();
84        return "<div class='cs_blocs$b'><$hn class='blocs_titre$h blocs_click'><a href='javascript:;'>$titre</a></$hn>"
85                .(strlen($res)?"<div class='blocs_resume$r'>\n$res\n</div>":"")
86                ."<div class='blocs_destination$d'>\n\n".blocsdepliables_rempl($corps)."\n\n</div>$title</div>";
87}
88
89// cette fonction n'est pas appelee dans les balises html : html|code|cadre|frame|script
90function blocsdepliables_rempl($texte) {
91        if (strpos($texte, '<')===false) return $texte;
92        // balises blocs|visible|invisible : il faut un callback pour analyser l'interieur du texte
93        return preg_replace_callback(',<(bloc#?|visible#?|invisible#?|blocintertitre#?)([0-9]*)>(.*?)</\1\2>,ms', 'blocsdepliables_callback', $texte);
94}
95
96
97/**
98 * evite les transformations typo dans les balises $balises
99 * par exemple pour <html>, <cadre>, <code>, <frame>, <script>, <acronym> et <cite>, $balises = 'html|code|cadre|frame|script|acronym|cite'
100 *
101 * @param $texte
102 *   $texte a filtrer
103 * @param $filtre
104 *   le filtre a appliquer pour transformer $texte
105 *   si $filtre = false, alors le texte est retourne protege, sans filtre
106 * @param $balises
107 *   balises concernees par l'echappement
108 *   si $balises = '' alors la protection par defaut est sur les balises de _PROTEGE_BLOCS
109 *   si $balises = false alors le texte est utilise tel quel
110 * @param null|array $args
111 *   arguments supplementaires a passer au filtre
112 * @return string
113 */
114function blocsdepliables_filtre_texte_echappe($texte, $filtre, $balises='', $args=NULL){
115        if(!strlen($texte)) return '';
116
117        if ($filtre!==false){
118                $fonction = chercher_filtre($filtre,false);
119                if (!$fonction) {
120                        spip_log("blocsdepliables_filtre_texte_echappe() : $filtre() non definie",_LOG_ERREUR);
121                        return $texte;
122                }
123                $filtre = $fonction;
124        }
125
126        // protection du texte
127        if($balises!==false) {
128                if(!strlen($balises)) $balises = _PROTEGE_BLOCS;//'html|code|cadre|frame|script';
129                else $balises = ',<('.$balises.')(\s[^>]*)?>(.*)</\1>,UimsS';
130                if (!function_exists('echappe_html'))
131                        include_spip('inc/texte_mini');
132                $texte = echappe_html($texte, 'FILTRETEXTECHAPPE', true, $balises);
133        }
134        // retour du texte simplement protege
135        if ($filtre===false) return $texte;
136        // transformation par $fonction
137        if (!$args)
138                $texte = $filtre($texte);
139        else {
140                array_unshift($args,$texte);
141                $texte = call_user_func_array($filtre, $args);
142        }
143
144        // deprotection des balises
145        return echappe_retour($texte, 'FILTRETEXTECHAPPE');
146}
147
148
149// fonction pipeline
150function blocsdepliables_pre_typo($texte) {
151        if (strpos($texte, '<')===false) return $texte;
152        // on remplace apres echappement
153        return blocsdepliables_filtre_texte_echappe($texte, 'blocsdepliables_rempl');
154}
155
156// 2 fonctions pour le plugin Porte Plume, s'il est present (SPIP>=2.0)
157function blocsdepliables_porte_plume_cs_pre_charger($flux) {
158        $r = array(array(
159                "id" => 'blocs_bloc',
160                "name" => _T('couteau:pp_blocs_bloc'),
161                "className" => 'blocs_bloc',
162                "replaceWith" => "\n<bloc>"._T('couteau:pp_un_titre')."\n\n"._T('couteau:pp_votre_texte')."\n</bloc>\n",
163                "display" => true), array(
164                "id" => 'blocs_visible',
165                "name" => _T('couteau:pp_blocs_visible'),
166                "className" => 'blocs_visible',
167                "replaceWith" => "\n<visible>"._T('couteau:pp_un_titre')."\n\n"._T('couteau:pp_votre_texte')."\n</visible>\n",
168                "display" => true));
169        foreach(cs_pp_liste_barres('blocs') as $b)
170                $flux[$b] = isset($flux[$b])?array_merge($flux[$b], $r):$r;
171        return $flux;
172}
173function blocsdepliables_porte_plume_lien_classe_vers_icone($flux) {
174        $flux['blocs_bloc'] = 'bloc_invisible.png';
175        $flux['blocs_visible'] = 'bloc_visible.png';
176        return $flux;
177}
178
179?>
Note: See TracBrowser for help on using the repository browser.