[SPIP] ~maj 3.0.10 --> 3.0.14
[lhc/web/www.git] / www / ecrire / inc / pipelines.php
1 <?php
2
3 /***************************************************************************\
4 * SPIP, Systeme de publication pour l'internet *
5 * *
6 * Copyright (c) 2001-2014 *
7 * Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James *
8 * *
9 * Ce programme est un logiciel libre distribue sous licence GNU/GPL. *
10 * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. *
11 \***************************************************************************/
12
13 /**
14 * Fonctions déclarées dans des pipelines (espace public)
15 *
16 * @package SPIP\Pipelines
17 **/
18 if (!defined('_ECRIRE_INC_VERSION')) return;
19 if (test_espace_prive())
20 include_spip('inc/pipelines_ecrire');
21
22
23
24 /**
25 * Inserer jQuery et ses plugins
26 *
27 * La fonction ajoute les balises scripts dans le texte qui appelent
28 * les scripts jQuery ainsi que certains de ses plugins. La liste
29 * des js chargée peut être complété par le pipeline 'jquery_plugins'
30 *
31 * Cette fonction est appelée par le pipeline insert_head
32 *
33 * @internal
34 * Ne pas vérifier ici qu'on ne doublonne pas #INSERT_HEAD
35 * car cela empêche un double appel (multi calcul en cache cool,
36 * ou erreur de l'espace privé)
37 *
38 * @see f_jQuery_prive()
39 * @link http://doc.spip.org/@f_jQuery
40 *
41 * @param string $texte Contenu qui sera inséré dans le head HTML
42 * @return string Contenu qui sera inséré dans le head HTML
43 **/
44 function f_jQuery ($texte) {
45 $x = '';
46 $jquery_plugins = pipeline('jquery_plugins',
47 array(
48 'javascript/jquery.js',
49 'javascript/jquery.form.js',
50 'javascript/jquery.autosave.js',
51 'javascript/jquery.placeholder-label.js',
52 'javascript/ajaxCallback.js',
53 'javascript/jquery.cookie.js'
54 ));
55 foreach (array_unique($jquery_plugins) as $script)
56 if ($script = find_in_path($script))
57 $x .= "\n<script src=\"$script\" type=\"text/javascript\"></script>\n";
58
59 $texte = $x.$texte;
60 return $texte;
61 }
62
63
64 /**
65 * Traiter var_recherche ou le referrer pour surligner les mots
66 *
67 * Surligne les mots de la recherche (si var_recherche est présent)
68 * ou des réferers (si la constante _SURLIGNE_RECHERCHE_REFERERS est
69 * définie à true) dans un texte HTML
70 *
71 * Cette fonction est appelée par le pipeline affichage_final
72 *
73 * @param string $texte Contenu de la page envoyée au navigateur
74 * @return string Contenu de la page envoyée au navigateur
75 **/
76 function f_surligne ($texte) {
77 if (!$GLOBALS['html']) return $texte;
78 $rech = _request('var_recherche');
79 if (!$rech
80 AND (!defined('_SURLIGNE_RECHERCHE_REFERERS')
81 OR !_SURLIGNE_RECHERCHE_REFERERS
82 OR !isset($_SERVER['HTTP_REFERER'])))
83 return $texte;
84 include_spip('inc/surligne');
85 return surligner_mots($texte, $rech);
86 }
87
88 /**
89 * Indente un code HTML
90 *
91 * Indente et valide un code HTML si la globale 'xhtml' est
92 * définie à true.
93 *
94 * Cette fonction est appelée par le pipeline affichage_final
95 *
96 * @param string $texte Contenu de la page envoyée au navigateur
97 * @return string Contenu de la page envoyée au navigateur
98 **/
99 function f_tidy ($texte) {
100 /**
101 * Indentation à faire ?
102 *
103 * - true : actif.
104 * - false par défaut.
105 */
106 global $xhtml;
107
108 if ($xhtml # tidy demande
109 AND $GLOBALS['html'] # verifie que la page avait l'entete text/html
110 AND strlen($texte)
111 AND !headers_sent()) {
112 # Compatibilite ascendante
113 if (!is_string($xhtml)) $xhtml ='tidy';
114
115 if (!$f = charger_fonction($xhtml, 'inc', true)) {
116 spip_log("tidy absent, l'indenteur SPIP le remplace");
117 $f = charger_fonction('sax', 'xml');
118 }
119 return $f($texte);
120 }
121
122 return $texte;
123 }
124
125
126 /**
127 * Offre #INSERT_HEAD sur tous les squelettes (bourrin)
128 *
129 * À activer dans mes_options via :
130 * $GLOBALS['spip_pipeline']['affichage_final'] .= '|f_insert_head';
131 *
132 * Ajoute le contenu du pipeline insert head dans la page HTML
133 * si cela n'a pas été fait.
134 *
135 * @param string $texte Contenu de la page envoyée au navigateur
136 * @return string Contenu de la page envoyée au navigateur
137 **/
138 function f_insert_head($texte) {
139 if (!$GLOBALS['html']) return $texte;
140 include_spip('public/admin'); // pour strripos
141
142 ($pos = stripos($texte, '</head>'))
143 || ($pos = stripos($texte, '<body>'))
144 || ($pos = 0);
145
146 if (false === strpos(substr($texte, 0,$pos), '<!-- insert_head -->')) {
147 $insert = "\n".pipeline('insert_head','<!-- f_insert_head -->')."\n";
148 $texte = substr_replace($texte, $insert, $pos, 0);
149 }
150
151 return $texte;
152 }
153
154
155 /**
156 * Insérer au besoin les boutons admins
157 *
158 * Cette fonction est appelée par le pipeline affichage_final
159 *
160 * @param string $texte Contenu de la page envoyée au navigateur
161 * @return string Contenu de la page envoyée au navigateur
162 **/
163 function f_admin ($texte) {
164 if (defined('_VAR_PREVIEW') AND _VAR_PREVIEW AND $GLOBALS['html']) {
165 include_spip('inc/filtres'); // pour http_img_pack
166 $x = "<div class='spip-previsu' "
167 . http_style_background('preview-32.png')
168 . ">"
169 . _T('previsualisation')
170 . "</div>";
171 if (!$pos = stripos($texte, '</body>'))
172 $pos = strlen($texte);
173 $texte = substr_replace($texte, $x, $pos, 0);
174 }
175
176 if (isset($GLOBALS['affiche_boutons_admin']) AND $GLOBALS['affiche_boutons_admin']) {
177 include_spip('public/admin');
178 $texte = affiche_boutons_admin($texte);
179 }
180 if (_request('var_mode')=='noajax'){
181 $texte = preg_replace(',(class=[\'"][^\'"]*)ajax([^\'"]*[\'"]),Uims',"\\1\\2",$texte);
182 }
183 return $texte;
184 }
185
186 /**
187 * Actions sur chaque inclusion
188 *
189 * Appelle f_afficher_blocs_ecrire() sur les inclusions dans l'espace privé.
190 * Ne change rien dans l'espace public.
191 *
192 * Cette fonction est appelée par le pipeline recuperer_fond
193 *
194 * @see f_afficher_blocs_ecrire()
195 *
196 * @param array $flux Description et contenu de l'inclusion
197 * @return array $flux Description et contenu de l'inclusion
198 **/
199 function f_recuperer_fond($flux) {
200 if (!test_espace_prive()) return $flux;
201 return f_afficher_blocs_ecrire($flux);
202 }
203
204 /**
205 * Gérer le lancement du cron si des tâches sont en attente
206 *
207 * Cette fonction est appelée par le pipeline affichage_final
208 *
209 * @param string $texte Contenu de la page envoyée au navigateur
210 * @return string Contenu de la page envoyée au navigateur
211 */
212 function f_queue(&$texte){
213
214 // eviter une inclusion si rien a faire
215 if (_request('action')=='cron'
216 OR queue_sleep_time_to_next_job()
217 OR defined('_DEBUG_BLOCK_QUEUE')){
218 return $texte;
219 }
220
221 include_spip('inc/queue');
222 $code = queue_affichage_cron();
223
224 // si rien a afficher
225 // ou si on est pas dans une page html, on ne sait rien faire de mieux
226 if (!$code OR !$GLOBALS['html'])
227 return $texte;
228
229 // inserer avant le </body> fermant si on peut, a la fin de la page sinon
230 if (($p=strpos($texte,'</body>'))!==FALSE)
231 $texte = substr($texte,0,$p).$code.substr($texte,$p);
232 else
233 $texte .= $code;
234
235 return $texte;
236 }
237
238 ?>