3 /***************************************************************************\
4 * SPIP, Systeme de publication pour l'internet *
6 * Copyright (c) 2001-2019 *
7 * Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James *
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 \***************************************************************************/
14 * Fonctions déclarées dans des pipelines (espace public)
16 * @package SPIP\Core\Pipelines
18 if (!defined('_ECRIRE_INC_VERSION')) {
21 if (test_espace_prive()) {
22 include_spip('inc/pipelines_ecrire');
27 * Inserer jQuery et ses plugins
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'
33 * Cette fonction est appelée par le pipeline insert_head
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é)
40 * @see f_jQuery_prive()
41 * @pipeline insert_head
42 * @pipeline_appel jquery_plugins
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
47 function f_jQuery($texte) {
49 $jquery_plugins = pipeline('jquery_plugins',
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'
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";
74 * Traiter var_recherche ou le referrer pour surligner les mots
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
80 * Cette fonction est appelée par le pipeline affichage_final
82 * @pipeline affichage_final
84 * @param string $texte Contenu de la page envoyée au navigateur
85 * @return string Contenu de la page envoyée au navigateur
87 function f_surligne($texte) {
88 if (!$GLOBALS['html']) {
91 $rech = _request('var_recherche');
93 and (!defined('_SURLIGNE_RECHERCHE_REFERERS')
94 or !_SURLIGNE_RECHERCHE_REFERERS
95 or !isset($_SERVER['HTTP_REFERER']))
99 include_spip('inc/surligne');
101 if (isset($_SERVER['HTTP_REFERER'])) {
102 $_SERVER['HTTP_REFERER'] = preg_replace(',[^\w\,/#&;:-]+,', ' ', $_SERVER['HTTP_REFERER']);
105 $rech = preg_replace(',[^\w\,/#&;:-]+,', ' ', $rech);
108 return surligner_mots($texte, $rech);
112 * Indente un code HTML
114 * Indente et valide un code HTML si la globale 'xhtml' est
117 * Cette fonction est appelée par le pipeline affichage_final
119 * @pipeline affichage_final
121 * @param string $texte Contenu de la page envoyée au navigateur
122 * @return string Contenu de la page envoyée au navigateur
124 function f_tidy($texte) {
126 * Indentation à faire ?
129 * - false par défaut.
132 if ($GLOBALS['xhtml'] # tidy demande
133 and $GLOBALS['html'] # verifie que la page avait l'entete text/html
137 # Compatibilite ascendante
138 if (!is_string($GLOBALS['xhtml'])) {
139 $GLOBALS['xhtml'] = 'tidy';
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');
155 * Offre `#INSERT_HEAD` sur tous les squelettes (bourrin)
157 * À activer dans mes_options via :
158 * `$GLOBALS['spip_pipeline']['affichage_final'] .= '|f_insert_head';`
160 * Ajoute le contenu du pipeline insert head dans la page HTML
161 * si cela n'a pas été fait.
163 * @pipeline_appel insert_head
165 * @param string $texte Contenu de la page envoyée au navigateur
166 * @return string Contenu de la page envoyée au navigateur
168 function f_insert_head($texte) {
169 if (!$GLOBALS['html']) {
172 include_spip('public/admin'); // pour strripos
174 ($pos = stripos($texte, '</head>'))
175 ||
($pos = stripos($texte, '<body>'))
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);
188 * Insérer au besoin les boutons admins
190 * Cette fonction est appelée par le pipeline affichage_final
192 * @pipeline affichage_final
193 * @uses affiche_boutons_admin()
195 * @param string $texte Contenu de la page envoyée au navigateur
196 * @return string Contenu de la page envoyée au navigateur
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')
204 . _T('previsualisation')
206 if (!$pos = stripos($texte, '</body>')) {
207 $pos = strlen($texte);
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)) {
215 $texte = substr_replace($texte, $x, $pos+
1, 0);
218 if (isset($GLOBALS['affiche_boutons_admin']) and $GLOBALS['affiche_boutons_admin']) {
219 include_spip('public/admin');
220 $texte = affiche_boutons_admin($texte);
222 if (_request('var_mode') == 'noajax') {
223 $texte = preg_replace(',(class=[\'"][^\'"]*)ajax([^\'"]*[\'"]),Uims', "\\1\\2", $texte);
230 * Actions sur chaque inclusion
232 * Appelle f_afficher_blocs_ecrire() sur les inclusions dans l'espace privé.
233 * Ne change rien dans l'espace public.
235 * Cette fonction est appelée par le pipeline recuperer_fond
237 * @uses f_afficher_blocs_ecrire()
238 * @pipeline recuperer_fond
240 * @param array $flux Description et contenu de l'inclusion
241 * @return array $flux Description et contenu de l'inclusion
243 function f_recuperer_fond($flux) {
244 if (!test_espace_prive()) {
248 return f_afficher_blocs_ecrire($flux);
252 * Gérer le lancement du cron si des tâches sont en attente
254 * @pipeline affichage_final
255 * @uses queue_sleep_time_to_next_job()
256 * @uses queue_affichage_cron()
258 * @param string $texte Contenu de la page envoyée au navigateur
259 * @return string Contenu de la page envoyée au navigateur
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')
270 include_spip('inc/queue');
271 $code = queue_affichage_cron();
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']) {
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);