summaryrefslogtreecommitdiff
path: root/controller/media.php
diff options
context:
space:
mode:
authorpolo <ordipolo@gmx.fr>2021-04-20 21:46:33 +0200
committerpolo <ordipolo@gmx.fr>2021-04-20 21:46:33 +0200
commit87798e5554eb0330cd2de255e5034f0472d410a4 (patch)
treeacd9e26a7d912c7575cb6dd1c7b42cc3e9f52993 /controller/media.php
downloadmelaine-87798e5554eb0330cd2de255e5034f0472d410a4.zip
mot de passe
Diffstat (limited to 'controller/media.php')
-rw-r--r--controller/media.php212
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
6function 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 !!
194function 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}