[SPIP] v3.2.1-->v3.2.2
[lhc/web/www.git] / www / ecrire / inc / filtres_mime.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 * Déclaration de filtres permettent l'incrustation d'un document selon son type Mime
15 *
16 * Ces filtres peuvent être appelés par le modèle `<embXX>` dans certains cas,
17 * en utilisant `|appliquer_filtre{#MIME_TYPE}` sur un contenu
18 *
19 * @see appliquer_filtre()
20 *
21 * @package SPIP\Core\Filtres\Mime
22 **/
23
24 if (!defined('_ECRIRE_INC_VERSION')) {
25 return;
26 }
27 include_spip('inc/filtres');
28
29
30 // Les 7 familles de base ne font rien sauf celle des textes
31
32 /**
33 * Filtre d'incrustation d'un document image
34 *
35 * Ne fait rien.
36 *
37 * @filtre
38 * @param string $t Contenu
39 * @return string Rien.
40 **/
41 function filtre_image_dist($t) {
42 return '';
43 }
44
45 /**
46 * Filtre d'incrustation d'un document audio
47 *
48 * Ne fait rien.
49 *
50 * @filtre
51 * @param string $t Contenu
52 * @return string Rien.
53 **/
54 function filtre_audio_dist($t) {
55 return '';
56 }
57
58 /**
59 * Filtre d'incrustation d'un document video
60 *
61 * Ne fait rien.
62 *
63 * @filtre
64 * @param string $t Contenu
65 * @return string Rien.
66 **/
67 function filtre_video_dist($t) {
68 return '';
69 }
70
71 /**
72 * Filtre d'incrustation d'un document application
73 *
74 * Ne fait rien.
75 *
76 * @filtre
77 * @param string $t Contenu
78 * @return string Rien.
79 **/
80 function filtre_application_dist($t) {
81 return '';
82 }
83
84 /**
85 * Filtre d'incrustation d'un document message
86 *
87 * Ne fait rien.
88 *
89 * @filtre
90 * @param string $t Contenu
91 * @return string Rien.
92 **/
93 function filtre_message_dist($t) {
94 return '';
95 }
96
97 /**
98 * Filtre d'incrustation d'un document multipart
99 *
100 * Ne fait rien.
101 *
102 * @filtre
103 * @param string $t Contenu
104 * @return string Rien.
105 **/
106 function filtre_multipart_dist($t) {
107 return '';
108 }
109
110 /**
111 * Filtre d'incrustation d'un document test
112 *
113 * Échappe les chevrons et l'esperluette.
114 *
115 * @filtre
116 * @param string $t Contenu
117 * @return string Contenu échappé.
118 **/
119 function filtre_text_dist($t) {
120 static $t1 = array('&', '<', '>');
121 static $t2 = array('&amp;', '&lt;', '&gt;');
122
123 return '<pre>' . str_replace($t1, $t2, $t) . '</pre>';
124 }
125
126 /**
127 * Filtre d'incrustation d'un document CSV
128 *
129 * Produit un joli tableau à partir du texte CSV
130 *
131 * @filtre
132 * @param string $t
133 * Texte CSV
134 * @return string
135 * Tableau (formaté en SPIP)
136 **/
137 function filtre_text_csv_dist($t) {
138 include_spip('inc/csv');
139 list($entete, $lignes, $caption) = analyse_csv($t);
140 foreach ($lignes as &$l) {
141 $l = join('|', $l);
142 }
143 $corps = join("\n", $lignes) . "\n";
144 $corps = $caption .
145 "\n|{{" .
146 join('}}|{{', $entete) .
147 '}}|' .
148 "\n|" .
149 str_replace("\n", "|\n|", $corps);
150 $corps = str_replace('&#34#', '&#34;', $corps);
151 include_spip('inc/texte');
152
153 return propre($corps);
154 }
155
156 /**
157 * Filtre d'incrustation d'un document text/html
158 *
159 * Incrustation de HTML, si on est capable de le sécuriser,
160 * sinon, afficher la source
161 *
162 * @filtre
163 * @param string $t Code html
164 * @return string Code html sécurisé ou texte échappé
165 **/
166 function filtre_text_html_dist($t) {
167 if (!preg_match(',^(.*?)<body[^>]*>(.*)</body>,is', $t, $r)) {
168 return appliquer_filtre($t, 'text/plain');
169 }
170
171 list(, $h, $t) = $r;
172
173 $style = '';
174 // recuperer les styles internes
175 if (preg_match_all(',<style>(.*?)</style>,is', $h, $r, PREG_PATTERN_ORDER)) {
176 $style = join("\n", $r[1]);
177 }
178 // ... et externes
179
180 include_spip('inc/distant');
181 if (preg_match_all(',<link[^>]+type=.text/css[^>]*>,is', $h, $r, PREG_PATTERN_ORDER)) {
182 foreach ($r[0] as $l) {
183 preg_match("/href='([^']*)'/", str_replace('"', "'", $l), $m);
184 $style .= "\n/* $l */\n"
185 . str_replace('<', '', recuperer_page($m[1]));
186 }
187 }
188 // Pourquoi SafeHtml transforme-t-il en texte les scripts dans Body ?
189 $t = safehtml(preg_replace(',<script' . '.*?</script>,is', '', $t));
190
191 return (!$style ? '' : "\n<style>" . $style . '</style>') . $t;
192 }
193
194 /**
195 * Filtre d'incrustation d'un document RealAudio
196 *
197 * Retourne les paramètres `<param>` nécessaires à la balise `<object>`
198 *
199 * @filtre
200 * @param string $id
201 * @return string Code HTML des balises `<param>`
202 **/
203 function filtre_audio_x_pn_realaudio($id) {
204 return "
205 <param name='controls' value='PositionSlider' />
206 <param name='controls' value='ImageWindow' />
207 <param name='controls' value='PlayButton' />
208 <param name='console' value='Console$id' />
209 <param name='nojava' value='true' />";
210 }