diff options
Diffstat (limited to 'controller/media.php')
-rw-r--r-- | controller/media.php | 424 |
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 |
6 | function mediaSubmit($chaine) | 6 | function 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 !! |
194 | function mediaEmbed($chaine) | 194 | function 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 | } |