[SPIP] +2.1.12
[velocampus/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-2011 *
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 if (!defined('_ECRIRE_INC_VERSION')) return;
14 include_spip('inc/filtres');
15
16 // Fichier des filtres d'incrustation d'un document selon son type MIME
17 // Les 7 familles de base ne font rien sauf celle des textes
18
19 function filtre_image_dist($t) {return '';}
20 function filtre_audio_dist($t) {return '';}
21 function filtre_video_dist($t) {return '';}
22 function filtre_application_dist($t) {return '';}
23 function filtre_message_dist($t) {return '';}
24 function filtre_multipart_dist($t) {return '';}
25
26 // http://doc.spip.org/@filtre_text_txt_dist
27 function filtre_text_dist($t) {
28 return '<pre>' . echapper_tags($t) . '</pre>';
29 }
30
31 // http://doc.spip.org/@filtre_text_csv_dist
32 function filtre_text_csv_dist($t)
33 {
34 $virg = substr_count($t, ',');
35 $pvirg = substr_count($t, ';');
36 $tab = substr_count($t, "\t");
37 if ($virg > $pvirg)
38 { $sep = ','; $hs = '&#44;';}
39 else { $sep = ';'; $hs = '&#59;'; $virg = $pvirg;}
40 if ($tab > $virg) {$sep = "\t"; $hs = "\t";}
41
42 $t = preg_replace('/\r?\n/', "\n",
43 preg_replace('/[\r\n]+/', "\n", $t));
44 // un separateur suivi de 3 guillemets attention !
45 // attention au ; suceptible d'etre confondu avec un separateur
46 // on substitue un # et on remplacera a la fin
47 $t = preg_replace("/([\n$sep])\"\"\"/",'\\1"&#34#',$t);
48 $t = str_replace('""','&#34#',$t);
49 preg_match_all('/"[^"]*"/', $t, $r);
50 foreach($r[0] as $cell)
51 $t = str_replace($cell,
52 str_replace($sep, $hs,
53 str_replace("\n", "<br />",
54 substr($cell,1,-1))),
55 $t);
56 list($entete, $corps) = explode("\n",$t,2);
57 $caption = '';
58 // sauter la ligne de tete formee seulement de separateurs
59 if (substr_count($entete, $sep) == strlen($entete)) {
60 list($entete, $corps) = explode("\n",$corps,2);
61 }
62 // si une seule colonne, en faire le titre
63 if (preg_match("/^([^$sep]+)$sep+\$/", $entete, $l)) {
64 $caption = "\n||" . $l[1] . "|";
65 list($entete, $corps) = explode("\n",$corps,2);
66 }
67 // si premiere colonne vide, le raccourci doit quand meme produire <th...
68 if ($entete[0] == $sep) $entete = ' ' . $entete;
69
70 $lignes = explode("\n", $corps);
71 // retrait des lignes vides finales
72 while(count($lignes) > 0
73 AND preg_match("/^$sep*$/", $lignes[count($lignes)-1]))
74 unset($lignes[count($lignes)-1]);
75 // calcul du nombre de colonne a chaque ligne
76 $nbcols = array();
77 $max = $mil = substr_count($entete, $sep);
78 foreach($lignes as $k=>$v) {
79 if ($max <> ($nbcols[$k]= substr_count($v, $sep))) {
80 if ($max > $nbcols[$k])
81 $mil = $nbcols[$k];
82 else { $mil = $max; $max = $nbcols[$k];}
83 }
84 }
85 // Si pas le meme nombre, cadrer au nombre max
86 if ($mil <> $max)
87 foreach($nbcols as $k=>$v) {
88 if ($v < $max) $lignes[$k].= str_repeat($sep, $max-$v);
89 }
90 // et retirer les colonnes integralement vides
91 while(true) {
92 $nbcols = ($entete[strlen($entete)-1]===$sep);
93 foreach($lignes as $v) $nbcols &= ($v[strlen($v)-1]===$sep);
94 if (!$nbcols) break;
95 $entete = substr($entete,0,-1);
96 foreach($lignes as $k=>$v) $lignes[$k] = substr($v,0,-1);
97 }
98 $corps = join("\n", $lignes) . "\n";
99 $corps = $caption .
100 "\n|{{" .
101 str_replace($sep,'}}|{{',$entete) .
102 "}}|" .
103 "\n|" .
104 str_replace($sep,'|',str_replace("\n", "|\n|",$corps));
105 $corps = str_replace('&#34#','&#34;',$corps);
106 include_spip('inc/texte');
107 return propre($corps);
108 }
109
110 // Incrustation de HTML, si on est capable de le securiser
111 // sinon, afficher le source
112 // http://doc.spip.org/@filtre_text_html_dist
113 function filtre_text_html_dist($t)
114 {
115 if (!preg_match(',^(.*?)<body[^>]*>(.*)</body>,is', $t, $r))
116 return appliquer_filtre($t,'text/plain');
117
118 list(,$h,$t) = $r;
119
120 $style = '';
121 // recuperer les styles internes
122 if (preg_match_all(',<style>(.*?)</style>,is', $h, $r, PREG_PATTERN_ORDER))
123 $style = join("\n",$r[1]);
124 // ... et externes
125
126 include_spip('inc/distant');
127 if (preg_match_all(',<link[^>]+type=.text/css[^>]*>,is', $h, $r, PREG_PATTERN_ORDER))
128 foreach($r[0] as $l) {
129 preg_match("/href='([^']*)'/", str_replace('"',"'",$l), $m);
130 $style .= "\n/* $l */\n"
131 . str_replace('<','',recuperer_page($m[1]));
132 }
133 // Pourquoi SafeHtml transforme-t-il en texte les scripts dans Body ?
134 $t = safehtml(preg_replace(',<script.*?</script>,is','',$t));
135 return (!$style ? '' : "\n<style>$style</style>") . $t;
136 }
137
138 // http://doc.spip.org/@filtre_audio_x_pn_realaudio
139 function filtre_audio_x_pn_realaudio($id)
140 {
141 return "
142 <param name='controls' value='PositionSlider' />
143 <param name='controls' value='ImageWindow' />
144 <param name='controls' value='PlayButton' />
145 <param name='console' value='Console$id' />
146 <param name='nojava' value='true' />";
147 }
148 ?>