[SPIP] v3.2.7-->v3.2.9
[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-2019 *
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\Core\Pipelines
17 **/
18 if (!defined('_ECRIRE_INC_VERSION')) {
19 return;
20 }
21 if (test_espace_prive()) {
22 include_spip('inc/pipelines_ecrire');
23 }
24
25
26 /**
27 * Inserer jQuery et ses plugins
28 *
29 * La fonction ajoute les balises scripts dans le texte qui appelent
30 * les scripts jQuery ainsi que certains de ses plugins. La liste
31 * des js chargée peut être complété par le pipeline 'jquery_plugins'
32 *
33 * Cette fonction est appelée par le pipeline insert_head
34 *
35 * @internal
36 * Ne pas vérifier ici qu'on ne doublonne pas `#INSERT_HEAD`
37 * car cela empêche un double appel (multi calcul en cache cool,
38 * ou erreur de l'espace privé)
39 *
40 * @see f_jQuery_prive()
41 * @pipeline insert_head
42 * @pipeline_appel jquery_plugins
43 *
44 * @param string $texte Contenu qui sera inséré dans le head HTML
45 * @return string Contenu qui sera inséré dans le head HTML
46 **/
47 function f_jQuery($texte) {
48 $x = '';
49 $jquery_plugins = pipeline('jquery_plugins',
50 array(
51 'javascript/jquery.js',
52 'javascript/jquery-migrate-3.0.1.js',
53 'javascript/jquery.form.js',
54 'javascript/jquery.autosave.js',
55 'javascript/jquery.placeholder-label.js',
56 'javascript/ajaxCallback.js',
57 'javascript/js.cookie.js',
58 'javascript/jquery.cookie.js'
59 ));
60 foreach (array_unique($jquery_plugins) as $script) {
61 if ($script = find_in_path(supprimer_timestamp($script))) {
62 $script = timestamp($script);
63 $x .= "\n<script src=\"$script\" type=\"text/javascript\"></script>\n";
64 }
65 }
66
67 $texte = $x . $texte;
68
69 return $texte;
70 }
71
72
73 /**
74 * Traiter var_recherche ou le referrer pour surligner les mots
75 *
76 * Surligne les mots de la recherche (si var_recherche est présent)
77 * ou des réferers (si la constante _SURLIGNE_RECHERCHE_REFERERS est
78 * définie à true) dans un texte HTML
79 *
80 * Cette fonction est appelée par le pipeline affichage_final
81 *
82 * @pipeline affichage_final
83 *
84 * @param string $texte Contenu de la page envoyée au navigateur
85 * @return string Contenu de la page envoyée au navigateur
86 **/
87 function f_surligne($texte) {
88 if (!$GLOBALS['html']) {
89 return $texte;
90 }
91 $rech = _request('var_recherche');
92 if (!$rech
93 and (!defined('_SURLIGNE_RECHERCHE_REFERERS')
94 or !_SURLIGNE_RECHERCHE_REFERERS
95 or !isset($_SERVER['HTTP_REFERER']))
96 ) {
97 return $texte;
98 }
99 include_spip('inc/surligne');
100
101 if (isset($_SERVER['HTTP_REFERER'])) {
102 $_SERVER['HTTP_REFERER'] = preg_replace(',[^\w\,/#&;:-]+,', ' ', $_SERVER['HTTP_REFERER']);
103 }
104 if ($rech){
105 $rech = preg_replace(',[^\w\,/#&;:-]+,', ' ', $rech);
106 }
107
108 return surligner_mots($texte, $rech);
109 }
110
111 /**
112 * Indente un code HTML
113 *
114 * Indente et valide un code HTML si la globale 'xhtml' est
115 * définie à true.
116 *
117 * Cette fonction est appelée par le pipeline affichage_final
118 *
119 * @pipeline affichage_final
120 *
121 * @param string $texte Contenu de la page envoyée au navigateur
122 * @return string Contenu de la page envoyée au navigateur
123 **/
124 function f_tidy($texte) {
125 /**
126 * Indentation à faire ?
127 *
128 * - true : actif.
129 * - false par défaut.
130 */
131
132 if ($GLOBALS['xhtml'] # tidy demande
133 and $GLOBALS['html'] # verifie que la page avait l'entete text/html
134 and strlen($texte)
135 and !headers_sent()
136 ) {
137 # Compatibilite ascendante
138 if (!is_string($GLOBALS['xhtml'])) {
139 $GLOBALS['xhtml'] = 'tidy';
140 }
141
142 if (!$f = charger_fonction($GLOBALS['xhtml'], 'inc', true)) {
143 spip_log("tidy absent, l'indenteur SPIP le remplace");
144 $f = charger_fonction('sax', 'xml');
145 }
146
147 return $f($texte);
148 }
149
150 return $texte;
151 }
152
153
154 /**
155 * Offre `#INSERT_HEAD` sur tous les squelettes (bourrin)
156 *
157 * À activer dans mes_options via :
158 * `$GLOBALS['spip_pipeline']['affichage_final'] .= '|f_insert_head';`
159 *
160 * Ajoute le contenu du pipeline insert head dans la page HTML
161 * si cela n'a pas été fait.
162 *
163 * @pipeline_appel insert_head
164 *
165 * @param string $texte Contenu de la page envoyée au navigateur
166 * @return string Contenu de la page envoyée au navigateur
167 **/
168 function f_insert_head($texte) {
169 if (!$GLOBALS['html']) {
170 return $texte;
171 }
172 include_spip('public/admin'); // pour strripos
173
174 ($pos = stripos($texte, '</head>'))
175 || ($pos = stripos($texte, '<body>'))
176 || ($pos = 0);
177
178 if (false === strpos(substr($texte, 0, $pos), '<!-- insert_head -->')) {
179 $insert = "\n" . pipeline('insert_head', '<!-- f_insert_head -->') . "\n";
180 $texte = substr_replace($texte, $insert, $pos, 0);
181 }
182
183 return $texte;
184 }
185
186
187 /**
188 * Insérer au besoin les boutons admins
189 *
190 * Cette fonction est appelée par le pipeline affichage_final
191 *
192 * @pipeline affichage_final
193 * @uses affiche_boutons_admin()
194 *
195 * @param string $texte Contenu de la page envoyée au navigateur
196 * @return string Contenu de la page envoyée au navigateur
197 **/
198 function f_admin($texte) {
199 if (defined('_VAR_PREVIEW') and _VAR_PREVIEW and $GLOBALS['html']) {
200 include_spip('inc/filtres'); // pour http_img_pack
201 $x = "<div class='spip-previsu' "
202 . http_style_background('preview-32.png')
203 . ">"
204 . _T('previsualisation')
205 . "</div>";
206 if (!$pos = stripos($texte, '</body>')) {
207 $pos = strlen($texte);
208 }
209 $texte = substr_replace($texte, $x, $pos, 0);
210 // pas de preview en fenetre enfant
211 $x = "<script type='text/javascript'>const frameEl = window.frameElement;if (frameEl) {frameEl.sandbox='sandbox';window.location.href='".addslashes($GLOBALS['meta']['adresse_site'])."';}</script>";
212 if (!$pos = stripos($texte, '<head') or !$pos = strpos($texte, '>', $pos)) {
213 $pos = -1;
214 }
215 $texte = substr_replace($texte, $x, $pos+1, 0);
216 }
217
218 if (isset($GLOBALS['affiche_boutons_admin']) and $GLOBALS['affiche_boutons_admin']) {
219 include_spip('public/admin');
220 $texte = affiche_boutons_admin($texte);
221 }
222 if (_request('var_mode') == 'noajax') {
223 $texte = preg_replace(',(class=[\'"][^\'"]*)ajax([^\'"]*[\'"]),Uims', "\\1\\2", $texte);
224 }
225
226 return $texte;
227 }
228
229 /**
230 * Actions sur chaque inclusion
231 *
232 * Appelle f_afficher_blocs_ecrire() sur les inclusions dans l'espace privé.
233 * Ne change rien dans l'espace public.
234 *
235 * Cette fonction est appelée par le pipeline recuperer_fond
236 *
237 * @uses f_afficher_blocs_ecrire()
238 * @pipeline recuperer_fond
239 *
240 * @param array $flux Description et contenu de l'inclusion
241 * @return array $flux Description et contenu de l'inclusion
242 **/
243 function f_recuperer_fond($flux) {
244 if (!test_espace_prive()) {
245 return $flux;
246 }
247
248 return f_afficher_blocs_ecrire($flux);
249 }
250
251 /**
252 * Gérer le lancement du cron si des tâches sont en attente
253 *
254 * @pipeline affichage_final
255 * @uses queue_sleep_time_to_next_job()
256 * @uses queue_affichage_cron()
257 *
258 * @param string $texte Contenu de la page envoyée au navigateur
259 * @return string Contenu de la page envoyée au navigateur
260 */
261 function f_queue($texte) {
262 // eviter une inclusion si rien a faire
263 if (_request('action') == 'cron'
264 or queue_sleep_time_to_next_job() > 0
265 or defined('_DEBUG_BLOCK_QUEUE')
266 ) {
267 return $texte;
268 }
269
270 include_spip('inc/queue');
271 $code = queue_affichage_cron();
272
273 // si rien a afficher
274 // ou si on est pas dans une page html, on ne sait rien faire de mieux
275 if (!$code or !isset($GLOBALS['html']) or !$GLOBALS['html']) {
276 return $texte;
277 }
278
279 // inserer avant le </body> fermant si on peut, a la fin de la page sinon
280 if (($p = strpos($texte, '</body>')) !== false) {
281 $texte = substr($texte, 0, $p) . $code . substr($texte, $p);
282 } else {
283 $texte .= $code;
284 }
285
286 return $texte;
287 }