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.tar.gz melaine-87798e5554eb0330cd2de255e5034f0472d410a4.tar.bz2 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 | } | ||
