diff options
author | polo <ordipolo@gmx.fr> | 2021-04-20 21:46:33 +0200 |
---|---|---|
committer | polo <ordipolo@gmx.fr> | 2021-04-20 21:46:33 +0200 |
commit | 87798e5554eb0330cd2de255e5034f0472d410a4 (patch) | |
tree | acd9e26a7d912c7575cb6dd1c7b42cc3e9f52993 /controller/media.php | |
download | melaine-87798e5554eb0330cd2de255e5034f0472d410a4.zip |
mot de passe
Diffstat (limited to 'controller/media.php')
-rw-r--r-- | controller/media.php | 212 |
1 files changed, 212 insertions, 0 deletions
diff --git a/controller/media.php b/controller/media.php new file mode 100644 index 0000000..8105b4d --- /dev/null +++ b/controller/media.php | |||
@@ -0,0 +1,212 @@ | |||
1 | <?php | ||
2 | |||
3 | // traitement avant enregistrement dans le fichier submit.php | ||
4 | // cette fonction extrait les liens pointant vers des medias embarqués | ||
5 | // (liste de sites) et les restituent nus, sans les balises | ||
6 | function mediaSubmit($chaine) | ||
7 | { | ||
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"; | ||
10 | |||
11 | // sites gérés manuellement (l'éditeur semble ne pas les connaître) | ||
12 | $regexListeNonGeree = 'https://open.spotify.com/embed/\w+/\w+'; | ||
13 | |||
14 | // à faire plus tard | ||
15 | //https://www.openstreetmap.org.*layer=mapnik | ||
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 | ||
18 | //global $regexListeNonGeree; | ||
19 | |||
20 | //echo($chaine . "\n"); | ||
21 | |||
22 | // pour embarquer spotify, l'url doit ressembler à https://open.spotify.com/embed/... | ||
23 | // on ajoute "/embed" si necessaire | ||
24 | $chaine = preg_replace('#spotify.com(?!/embed)#', '$0/embed', $chaine); | ||
25 | |||
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> | ||
28 | |||
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> | ||
31 | // (?:) permet de matcher sans capturer, donc de retirer des choses | ||
32 | // pour la variable $tolere, on met: | ||
33 | // \w = [a-zA-Z0-9_], espace ' ', tabulation \t, CR et LF \r\n, | ||
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 | ||
36 | $tolere = '\w\s\t\n\r/,;:éèàçù€\#@%\.\(\)[\]\{\}\?\!\|-'; | ||
37 | $pattern = '#(?:<a href=")([' . $tolere . ']{1,})?(' . $regexListeNonGeree . ')([' . $tolere . ']{1,})?(?:">[' . $tolere . ']+</a>)#'; | ||
38 | $chaine = preg_replace($pattern, '$2', $chaine); | ||
39 | //echo($chaine . "\n"); | ||
40 | |||
41 | // on met les balises <span> | ||
42 | $pattern = '#' . $regexListeNonGeree . '#'; | ||
43 | $remplacement = '<span class="media_embed">$0</span>'; | ||
44 | $chaine = preg_replace($pattern, $remplacement, $chaine); | ||
45 | |||
46 | // c'est quoi cette merde? | ||
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 | ||
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 | ||
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 | ||
53 | $dom = new DOMDocument; | ||
54 | |||
55 | // pour ne pas s'arrêter sur les erreurs à cause des "nouvelles" balises | ||
56 | libxml_use_internal_errors(true); | ||
57 | |||
58 | if($dom->loadHTML($chaine)) // et non load() tout court qui sert à charger du XML | ||
59 | { | ||
60 | // <figure> | ||
61 | // détecter <figure class="media"><oembed url="http://..."> | ||
62 | // puis extraire le lien et supprimer les balises autour | ||
63 | if(preg_match("#<figure class=\"media\"><oembed url=\".+\"></oembed></figure>#", $chaine)) | ||
64 | { | ||
65 | $nbFigures = $dom->getElementsByTagName('figure')->length; | ||
66 | |||
67 | $j = 0; | ||
68 | for($i = 0; $i < $nbFigures ; $i++) // boucle foreach impossible, une <figure> disparaît à chaque tour | ||
69 | { | ||
70 | $balisesFigure = $dom->getElementsByTagName('figure'); | ||
71 | $figure = $balisesFigure->item($j); // l'item 1 devient 0 au deuxième passage, etc | ||
72 | $parent = $figure->parentNode; | ||
73 | |||
74 | if($figure->getAttribute("class") == 'media') | ||
75 | { | ||
76 | $oembed = $figure->getElementsByTagName('oembed'); // 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 | ||
79 | { | ||
80 | $lien = $oembed->item(0)->getAttribute('url') . ' '; // un espace pour ne pas coller deux adresses | ||
81 | $span = $dom->createElement('span', $lien); | ||
82 | $class = $dom->createAttribute('class'); | ||
83 | $class->value = 'media_embed'; | ||
84 | $span->appendChild($class); | ||
85 | $parent->replaceChild($span, $figure); | ||
86 | } | ||
87 | elseif($div->length > 0) // cette div créée par le ckeditor contient notre lien, plus bas se trouve une iframe | ||
88 | { | ||
89 | $lien = $div->item(0)->getAttribute('data-oembed-url') . ' '; | ||
90 | $span = $dom->createElement('span', $lien); | ||
91 | $class = $dom->createAttribute('class'); | ||
92 | $class->value = 'media_embed'; | ||
93 | $span->appendChild($class); | ||
94 | $parent->replaceChild($span, $figure); | ||
95 | } | ||
96 | else | ||
97 | { | ||
98 | $j++; // la balise <figure> n'est pas supprimée, on incrémente l'indice du tableau pour ne pas boucler à l'infini | ||
99 | } | ||
100 | } | ||
101 | } | ||
102 | } | ||
103 | |||
104 | // <iframe> | ||
105 | // détecter <iframe src="http://..." et remplacer par le lien nu, comme au dessus | ||
106 | // site sans oembed? | ||
107 | if(preg_match("#<iframe src=\".+\"></iframe>#", $chaine)) | ||
108 | { | ||
109 | $nbIframes = $dom->getElementsByTagName('iframe')->length; | ||
110 | |||
111 | for($i = 0; $i < $nbIframes ; $i++) | ||
112 | { | ||
113 | $balisesIframe = $dom->getElementsByTagName('iframe'); | ||
114 | $iframe = $balisesIframe->item(0); | ||
115 | $parent = $iframe->parentNode; | ||
116 | |||
117 | $lien = $iframe->getAttribute('src') . ' '; | ||
118 | $span = $dom->createElement('span', $lien); | ||
119 | $class = $dom->createAttribute('class'); | ||
120 | $class->value = 'media_embed'; | ||
121 | $span->appendChild($class); | ||
122 | $parent->replaceChild($span, $$iframe); | ||
123 | } | ||
124 | } | ||
125 | |||
126 | // <a> | ||
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" | ||
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 | ||
131 | if(preg_match("#<a href=\".+\">.*</a>#", $chaine)) | ||
132 | { | ||
133 | $nbA = $dom->getElementsByTagName('a')->length; | ||
134 | |||
135 | $j = 0; | ||
136 | for($i = 0; $i < $nbA ; $i++) | ||
137 | { | ||
138 | $balisesA = $dom->getElementsByTagName('a'); | ||
139 | $a = $balisesA->item($j); | ||
140 | $parent = $a->parentNode; | ||
141 | |||
142 | $lien = $a->getAttribute('href') . ' '; | ||
143 | |||
144 | // seules les liens pointant vers une des adresses de la liste sont concernés | ||
145 | if(preg_match("#" . $listeMedia . "#", $lien)) | ||
146 | { | ||
147 | $span = $dom->createElement('span', $lien); | ||
148 | $class = $dom->createAttribute('class'); | ||
149 | $class->value = 'media_embed'; | ||
150 | $span->appendChild($class); | ||
151 | $parent->replaceChild($span, $a); | ||
152 | } | ||
153 | else | ||
154 | { | ||
155 | $j++; // la balise <a> n'est pas supprimée, on incrémente l'indice du tableau pour ne pas boucler à l'infini | ||
156 | } | ||
157 | } | ||
158 | } | ||
159 | |||
160 | // pour nettoyer tous les warnings qu'on vient de produire et purifier nos fichiers log | ||
161 | libxml_clear_errors(); | ||
162 | // pour au contraire pouvoir les regarder, remplacer la ligne au dessus par celles en dessous | ||
163 | //~ $errors = libxml_get_errors(); | ||
164 | //~ var_dump($errors); | ||
165 | |||
166 | // mettre à jour le DOM et enlever le DOCTYPE et les balises <html> et <body> | ||
167 | $chaine = $dom->saveHTML($dom); | ||
168 | $pattern = array ('#<!DOCTYPE.*>#', '#<html><body>#', '#</html></body>#'); | ||
169 | $remplacement = array ('', '', ''); | ||
170 | $chaine = preg_replace($pattern, $remplacement, $chaine); | ||
171 | } | ||
172 | else | ||
173 | { | ||
174 | echo "Impossible de charger le HTML"; | ||
175 | } | ||
176 | |||
177 | |||
178 | |||
179 | // détecter soundcloud | ||
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)) | ||
182 | {} | ||
183 | |||
184 | // détecter facebook (éventuellement fb.watch) | ||
185 | // je crois que ça va être compliqué ici | ||
186 | if(preg_match("#facebook.com|fb.watch#", $chaine)) | ||
187 | {} | ||
188 | |||
189 | return($chaine); // = $contenu | ||
190 | } | ||
191 | |||
192 | |||
193 | // embarquement !! | ||
194 | function mediaEmbed($chaine) | ||
195 | { | ||
196 | //require("../Embera/src/Autoloader.php"); | ||
197 | //$embera = new Embera\Embera(); | ||
198 | //$chaine = $embera->autoEmbed($chaine); | ||
199 | |||
200 | $pattern = '#<span class="media_embed">(.+)</span>#'; | ||
201 | $remplacement = '<iframe src="$1" frameborder="0" allowtransparency="true"></iframe>'; | ||
202 | $chaine = preg_replace($pattern, $remplacement, $chaine); | ||
203 | |||
204 | // requête oembed | ||
205 | //~ echo('<br/><br/>'); | ||
206 | //~ print_r($embera->getUrlData([ | ||
207 | //~ 'https://vimeo.com/374131624', | ||
208 | //~ 'https://www.flickr.com/photos/bees/8597283706/in/photostream', | ||
209 | //~ ])); | ||
210 | |||
211 | return($chaine); // = $contenu | ||
212 | } | ||