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