summaryrefslogtreecommitdiff
path: root/controller/media.php
diff options
context:
space:
mode:
Diffstat (limited to 'controller/media.php')
-rw-r--r--controller/media.php424
1 files changed, 212 insertions, 212 deletions
diff --git a/controller/media.php b/controller/media.php
index 8105b4d..c6682df 100644
--- a/controller/media.php
+++ b/controller/media.php
@@ -1,212 +1,212 @@
1<?php 1<?php
2 2
3// traitement avant enregistrement dans le fichier submit.php 3// traitement avant enregistrement dans le fichier submit.php
4// cette fonction extrait les liens pointant vers des medias embarqués 4// cette fonction extrait les liens pointant vers des medias embarqués
5// (liste de sites) et les restituent nus, sans les balises 5// (liste de sites) et les restituent nus, sans les balises
6function mediaSubmit($chaine) 6function mediaSubmit($chaine)
7{ 7{
8 // liste de sites concernés par les fonctions de ce fichiers 8 // liste de sites concernés par les fonctions de ce fichiers
9 $listeMedia = "youtube.com|vimeo.com|dailymotion.com|spotify.com|soundcloud.com|instagram.com|twitter.com|flickr.com|facebook.com|fb.watch|deezer.com|openstreetmap.org|goo.gl/maps|google.com/maps|itunes.apple.com|wordpress.com"; 9 $listeMedia = "youtube.com|vimeo.com|dailymotion.com|spotify.com|soundcloud.com|instagram.com|twitter.com|flickr.com|facebook.com|fb.watch|deezer.com|openstreetmap.org|goo.gl/maps|google.com/maps|itunes.apple.com|wordpress.com";
10 10
11 // sites gérés manuellement (l'éditeur semble ne pas les connaître) 11 // sites gérés manuellement (l'éditeur semble ne pas les connaître)
12 $regexListeNonGeree = 'https://open.spotify.com/embed/\w+/\w+'; 12 $regexListeNonGeree = 'https://open.spotify.com/embed/\w+/\w+';
13 13
14 // à faire plus tard 14 // à faire plus tard
15 //https://www.openstreetmap.org.*layer=mapnik 15 //https://www.openstreetmap.org.*layer=mapnik
16 16
17 //global $listeMedia; // avec global, au lieu de créer une variable locale, on crée une référence vers celle à l'extérieur 17 //global $listeMedia; // avec global, au lieu de créer une variable locale, on crée une référence vers celle à l'extérieur
18 //global $regexListeNonGeree; 18 //global $regexListeNonGeree;
19 19
20 //echo($chaine . "\n"); 20 //echo($chaine . "\n");
21 21
22 // pour embarquer spotify, l'url doit ressembler à https://open.spotify.com/embed/... 22 // pour embarquer spotify, l'url doit ressembler à https://open.spotify.com/embed/...
23 // on ajoute "/embed" si necessaire 23 // on ajoute "/embed" si necessaire
24 $chaine = preg_replace('#spotify.com(?!/embed)#', '$0/embed', $chaine); 24 $chaine = preg_replace('#spotify.com(?!/embed)#', '$0/embed', $chaine);
25 25
26 // adaptation pour les sites non gérés par l'éditeur 26 // adaptation pour les sites non gérés par l'éditeur
27 // on gère deux cas: celui ou l'éditeur ne fait rien (lien nu) et celui où l'utilisateur a créé un lien <a> 27 // on gère deux cas: celui ou l'éditeur ne fait rien (lien nu) et celui où l'utilisateur a créé un lien <a>
28 28
29 // on vire les balises <a> et ce qu'il y a entre les deux pour ne garder que les liens 29 // on vire les balises <a> et ce qu'il y a entre les deux pour ne garder que les liens
30 // on pourra ensuite traiter ensemble les url avec et sans balises <a> 30 // on pourra ensuite traiter ensemble les url avec et sans balises <a>
31 // (?:) permet de matcher sans capturer, donc de retirer des choses 31 // (?:) permet de matcher sans capturer, donc de retirer des choses
32 // pour la variable $tolere, on met: 32 // pour la variable $tolere, on met:
33 // \w = [a-zA-Z0-9_], espace ' ', tabulation \t, CR et LF \r\n, 33 // \w = [a-zA-Z0-9_], espace ' ', tabulation \t, CR et LF \r\n,
34 // /, @, %, deux-points ';', virgule ',' et point-virgule ; 34 // /, @, %, deux-points ';', virgule ',' et point-virgule ;
35 // et devant être échappés: . # ( ) ] { } ? ! | et le tiret qui est placé au début ou la fin 35 // et devant être échappés: . # ( ) ] { } ? ! | et le tiret qui est placé au début ou la fin
36 $tolere = '\w\s\t\n\r/,;:éèàçù€\#@%\.\(\)[\]\{\}\?\!\|-'; 36 $tolere = '\w\s\t\n\r/,;:éèàçù€\#@%\.\(\)[\]\{\}\?\!\|-';
37 $pattern = '#(?:<a href=")([' . $tolere . ']{1,})?(' . $regexListeNonGeree . ')([' . $tolere . ']{1,})?(?:">[' . $tolere . ']+</a>)#'; 37 $pattern = '#(?:<a href=")([' . $tolere . ']{1,})?(' . $regexListeNonGeree . ')([' . $tolere . ']{1,})?(?:">[' . $tolere . ']+</a>)#';
38 $chaine = preg_replace($pattern, '$2', $chaine); 38 $chaine = preg_replace($pattern, '$2', $chaine);
39 //echo($chaine . "\n"); 39 //echo($chaine . "\n");
40 40
41 // on met les balises <span> 41 // on met les balises <span>
42 $pattern = '#' . $regexListeNonGeree . '#'; 42 $pattern = '#' . $regexListeNonGeree . '#';
43 $remplacement = '<span class="media_embed">$0</span>'; 43 $remplacement = '<span class="media_embed">$0</span>';
44 $chaine = preg_replace($pattern, $remplacement, $chaine); 44 $chaine = preg_replace($pattern, $remplacement, $chaine);
45 45
46 // c'est quoi cette merde? 46 // c'est quoi cette merde?
47 // l'API DOM de PHP bien sur!! pour manipuler le "document object model" 47 // l'API DOM de PHP bien sur!! pour manipuler le "document object model"
48 // c'est du complètement calqué sur le javascript, avec une syntaxe PHP 48 // c'est du complètement calqué sur le javascript, avec une syntaxe PHP
49 // et en plus elle est super vieille, elle ne connaît pas les balises HTML5 ! 49 // et en plus elle est super vieille, elle ne connaît pas les balises HTML5 !
50 // mais une balise c'est une balise donc ça marche quand même 50 // mais une balise c'est une balise donc ça marche quand même
51 // la doc de PHP est comme toujours plutôt bonne, elle indique les types de données manipulées 51 // la doc de PHP est comme toujours plutôt bonne, elle indique les types de données manipulées
52 // https://www.php.net/manual/fr/book.dom.php 52 // https://www.php.net/manual/fr/book.dom.php
53 $dom = new DOMDocument; 53 $dom = new DOMDocument;
54 54
55 // pour ne pas s'arrêter sur les erreurs à cause des "nouvelles" balises 55 // pour ne pas s'arrêter sur les erreurs à cause des "nouvelles" balises
56 libxml_use_internal_errors(true); 56 libxml_use_internal_errors(true);
57 57
58 if($dom->loadHTML($chaine)) // et non load() tout court qui sert à charger du XML 58 if($dom->loadHTML($chaine)) // et non load() tout court qui sert à charger du XML
59 { 59 {
60 // <figure> 60 // <figure>
61 // détecter <figure class="media"><oembed url="http://..."> 61 // détecter <figure class="media"><oembed url="http://...">
62 // puis extraire le lien et supprimer les balises autour 62 // puis extraire le lien et supprimer les balises autour
63 if(preg_match("#<figure class=\"media\"><oembed url=\".+\"></oembed></figure>#", $chaine)) 63 if(preg_match("#<figure class=\"media\"><oembed url=\".+\"></oembed></figure>#", $chaine))
64 { 64 {
65 $nbFigures = $dom->getElementsByTagName('figure')->length; 65 $nbFigures = $dom->getElementsByTagName('figure')->length;
66 66
67 $j = 0; 67 $j = 0;
68 for($i = 0; $i < $nbFigures ; $i++) // boucle foreach impossible, une <figure> disparaît à chaque tour 68 for($i = 0; $i < $nbFigures ; $i++) // boucle foreach impossible, une <figure> disparaît à chaque tour
69 { 69 {
70 $balisesFigure = $dom->getElementsByTagName('figure'); 70 $balisesFigure = $dom->getElementsByTagName('figure');
71 $figure = $balisesFigure->item($j); // l'item 1 devient 0 au deuxième passage, etc 71 $figure = $balisesFigure->item($j); // l'item 1 devient 0 au deuxième passage, etc
72 $parent = $figure->parentNode; 72 $parent = $figure->parentNode;
73 73
74 if($figure->getAttribute("class") == 'media') 74 if($figure->getAttribute("class") == 'media')
75 { 75 {
76 $oembed = $figure->getElementsByTagName('oembed'); // tableau d'une seule case 76 $oembed = $figure->getElementsByTagName('oembed'); // tableau d'une seule case
77 $div = $figure->getElementsByTagName('div'); // tableau d'une seule case 77 $div = $figure->getElementsByTagName('div'); // tableau d'une seule case
78 if($oembed->length > 0) // si taille = 0, c'est que la balise figure contient autre chose qu'une oembed 78 if($oembed->length > 0) // si taille = 0, c'est que la balise figure contient autre chose qu'une oembed
79 { 79 {
80 $lien = $oembed->item(0)->getAttribute('url') . ' '; // un espace pour ne pas coller deux adresses 80 $lien = $oembed->item(0)->getAttribute('url') . ' '; // un espace pour ne pas coller deux adresses
81 $span = $dom->createElement('span', $lien); 81 $span = $dom->createElement('span', $lien);
82 $class = $dom->createAttribute('class'); 82 $class = $dom->createAttribute('class');
83 $class->value = 'media_embed'; 83 $class->value = 'media_embed';
84 $span->appendChild($class); 84 $span->appendChild($class);
85 $parent->replaceChild($span, $figure); 85 $parent->replaceChild($span, $figure);
86 } 86 }
87 elseif($div->length > 0) // cette div créée par le ckeditor contient notre lien, plus bas se trouve une iframe 87 elseif($div->length > 0) // cette div créée par le ckeditor contient notre lien, plus bas se trouve une iframe
88 { 88 {
89 $lien = $div->item(0)->getAttribute('data-oembed-url') . ' '; 89 $lien = $div->item(0)->getAttribute('data-oembed-url') . ' ';
90 $span = $dom->createElement('span', $lien); 90 $span = $dom->createElement('span', $lien);
91 $class = $dom->createAttribute('class'); 91 $class = $dom->createAttribute('class');
92 $class->value = 'media_embed'; 92 $class->value = 'media_embed';
93 $span->appendChild($class); 93 $span->appendChild($class);
94 $parent->replaceChild($span, $figure); 94 $parent->replaceChild($span, $figure);
95 } 95 }
96 else 96 else
97 { 97 {
98 $j++; // la balise <figure> n'est pas supprimée, on incrémente l'indice du tableau pour ne pas boucler à l'infini 98 $j++; // la balise <figure> n'est pas supprimée, on incrémente l'indice du tableau pour ne pas boucler à l'infini
99 } 99 }
100 } 100 }
101 } 101 }
102 } 102 }
103 103
104 // <iframe> 104 // <iframe>
105 // détecter <iframe src="http://..." et remplacer par le lien nu, comme au dessus 105 // détecter <iframe src="http://..." et remplacer par le lien nu, comme au dessus
106 // site sans oembed? 106 // site sans oembed?
107 if(preg_match("#<iframe src=\".+\"></iframe>#", $chaine)) 107 if(preg_match("#<iframe src=\".+\"></iframe>#", $chaine))
108 { 108 {
109 $nbIframes = $dom->getElementsByTagName('iframe')->length; 109 $nbIframes = $dom->getElementsByTagName('iframe')->length;
110 110
111 for($i = 0; $i < $nbIframes ; $i++) 111 for($i = 0; $i < $nbIframes ; $i++)
112 { 112 {
113 $balisesIframe = $dom->getElementsByTagName('iframe'); 113 $balisesIframe = $dom->getElementsByTagName('iframe');
114 $iframe = $balisesIframe->item(0); 114 $iframe = $balisesIframe->item(0);
115 $parent = $iframe->parentNode; 115 $parent = $iframe->parentNode;
116 116
117 $lien = $iframe->getAttribute('src') . ' '; 117 $lien = $iframe->getAttribute('src') . ' ';
118 $span = $dom->createElement('span', $lien); 118 $span = $dom->createElement('span', $lien);
119 $class = $dom->createAttribute('class'); 119 $class = $dom->createAttribute('class');
120 $class->value = 'media_embed'; 120 $class->value = 'media_embed';
121 $span->appendChild($class); 121 $span->appendChild($class);
122 $parent->replaceChild($span, $$iframe); 122 $parent->replaceChild($span, $$iframe);
123 } 123 }
124 } 124 }
125 125
126 // <a> 126 // <a>
127 // pour tout les sites multimedia, remplacer les balises <a> par les liens nus 127 // pour tout les sites multimedia, remplacer les balises <a> par les liens nus
128 // en effet, en revenant dans l'éditeur les liens ne déclenchent pas automatiquement "l'embarquement" 128 // en effet, en revenant dans l'éditeur les liens ne déclenchent pas automatiquement "l'embarquement"
129 // cliquer à la fin d'un lien et passer à la ligne a pour effet de créer des balises <a> 129 // cliquer à la fin d'un lien et passer à la ligne a pour effet de créer des balises <a>
130 // ça pose un problème parce que la bibliothèque "embera" ne gère pas les liens dans des balises 130 // ça pose un problème parce que la bibliothèque "embera" ne gère pas les liens dans des balises
131 if(preg_match("#<a href=\".+\">.*</a>#", $chaine)) 131 if(preg_match("#<a href=\".+\">.*</a>#", $chaine))
132 { 132 {
133 $nbA = $dom->getElementsByTagName('a')->length; 133 $nbA = $dom->getElementsByTagName('a')->length;
134 134
135 $j = 0; 135 $j = 0;
136 for($i = 0; $i < $nbA ; $i++) 136 for($i = 0; $i < $nbA ; $i++)
137 { 137 {
138 $balisesA = $dom->getElementsByTagName('a'); 138 $balisesA = $dom->getElementsByTagName('a');
139 $a = $balisesA->item($j); 139 $a = $balisesA->item($j);
140 $parent = $a->parentNode; 140 $parent = $a->parentNode;
141 141
142 $lien = $a->getAttribute('href') . ' '; 142 $lien = $a->getAttribute('href') . ' ';
143 143
144 // seules les liens pointant vers une des adresses de la liste sont concernés 144 // seules les liens pointant vers une des adresses de la liste sont concernés
145 if(preg_match("#" . $listeMedia . "#", $lien)) 145 if(preg_match("#" . $listeMedia . "#", $lien))
146 { 146 {
147 $span = $dom->createElement('span', $lien); 147 $span = $dom->createElement('span', $lien);
148 $class = $dom->createAttribute('class'); 148 $class = $dom->createAttribute('class');
149 $class->value = 'media_embed'; 149 $class->value = 'media_embed';
150 $span->appendChild($class); 150 $span->appendChild($class);
151 $parent->replaceChild($span, $a); 151 $parent->replaceChild($span, $a);
152 } 152 }
153 else 153 else
154 { 154 {
155 $j++; // la balise <a> n'est pas supprimée, on incrémente l'indice du tableau pour ne pas boucler à l'infini 155 $j++; // la balise <a> n'est pas supprimée, on incrémente l'indice du tableau pour ne pas boucler à l'infini
156 } 156 }
157 } 157 }
158 } 158 }
159 159
160 // pour nettoyer tous les warnings qu'on vient de produire et purifier nos fichiers log 160 // pour nettoyer tous les warnings qu'on vient de produire et purifier nos fichiers log
161 libxml_clear_errors(); 161 libxml_clear_errors();
162 // pour au contraire pouvoir les regarder, remplacer la ligne au dessus par celles en dessous 162 // pour au contraire pouvoir les regarder, remplacer la ligne au dessus par celles en dessous
163 //~ $errors = libxml_get_errors(); 163 //~ $errors = libxml_get_errors();
164 //~ var_dump($errors); 164 //~ var_dump($errors);
165 165
166 // mettre à jour le DOM et enlever le DOCTYPE et les balises <html> et <body> 166 // mettre à jour le DOM et enlever le DOCTYPE et les balises <html> et <body>
167 $chaine = $dom->saveHTML($dom); 167 $chaine = $dom->saveHTML($dom);
168 $pattern = array ('#<!DOCTYPE.*>#', '#<html><body>#', '#</html></body>#'); 168 $pattern = array ('#<!DOCTYPE.*>#', '#<html><body>#', '#</html></body>#');
169 $remplacement = array ('', '', ''); 169 $remplacement = array ('', '', '');
170 $chaine = preg_replace($pattern, $remplacement, $chaine); 170 $chaine = preg_replace($pattern, $remplacement, $chaine);
171 } 171 }
172 else 172 else
173 { 173 {
174 echo "Impossible de charger le HTML"; 174 echo "Impossible de charger le HTML";
175 } 175 }
176 176
177 177
178 178
179 // détecter soundcloud 179 // détecter soundcloud
180 // normallement il n'y a rien à faire ici mais on sait jamais (une mise à jour du ckeditor?) 180 // normallement il n'y a rien à faire ici mais on sait jamais (une mise à jour du ckeditor?)
181 if(preg_match("#soundcloud.com#", $chaine)) 181 if(preg_match("#soundcloud.com#", $chaine))
182 {} 182 {}
183 183
184 // détecter facebook (éventuellement fb.watch) 184 // détecter facebook (éventuellement fb.watch)
185 // je crois que ça va être compliqué ici 185 // je crois que ça va être compliqué ici
186 if(preg_match("#facebook.com|fb.watch#", $chaine)) 186 if(preg_match("#facebook.com|fb.watch#", $chaine))
187 {} 187 {}
188 188
189 return($chaine); // = $contenu 189 return($chaine); // = $contenu
190} 190}
191 191
192 192
193// embarquement !! 193// embarquement !!
194function mediaEmbed($chaine) 194function mediaEmbed($chaine)
195{ 195{
196 //require("../Embera/src/Autoloader.php"); 196 //require("../Embera/src/Autoloader.php");
197 //$embera = new Embera\Embera(); 197 //$embera = new Embera\Embera();
198 //$chaine = $embera->autoEmbed($chaine); 198 //$chaine = $embera->autoEmbed($chaine);
199 199
200 $pattern = '#<span class="media_embed">(.+)</span>#'; 200 $pattern = '#<span class="media_embed">(.+)</span>#';
201 $remplacement = '<iframe src="$1" frameborder="0" allowtransparency="true"></iframe>'; 201 $remplacement = '<iframe src="$1" frameborder="0" allowtransparency="true"></iframe>';
202 $chaine = preg_replace($pattern, $remplacement, $chaine); 202 $chaine = preg_replace($pattern, $remplacement, $chaine);
203 203
204 // requête oembed 204 // requête oembed
205 //~ echo('<br/><br/>'); 205 //~ echo('<br/><br/>');
206 //~ print_r($embera->getUrlData([ 206 //~ print_r($embera->getUrlData([
207 //~ 'https://vimeo.com/374131624', 207 //~ 'https://vimeo.com/374131624',
208 //~ 'https://www.flickr.com/photos/bees/8597283706/in/photostream', 208 //~ 'https://www.flickr.com/photos/bees/8597283706/in/photostream',
209 //~ ])); 209 //~ ]));
210 210
211 return($chaine); // = $contenu 211 return($chaine); // = $contenu
212} 212}