From 87798e5554eb0330cd2de255e5034f0472d410a4 Mon Sep 17 00:00:00 2001 From: polo Date: Tue, 20 Apr 2021 21:46:33 +0200 Subject: mot de passe --- controller/media.php | 212 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 212 insertions(+) create mode 100644 controller/media.php (limited to 'controller/media.php') 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 @@ + + + // on vire les balises et ce qu'il y a entre les deux pour ne garder que les liens + // on pourra ensuite traiter ensemble les url avec et sans balises + // (?:) permet de matcher sans capturer, donc de retirer des choses + // pour la variable $tolere, on met: + // \w = [a-zA-Z0-9_], espace ' ', tabulation \t, CR et LF \r\n, + // /, @, %, deux-points ';', virgule ',' et point-virgule ; + // et devant être échappés: . # ( ) ] { } ? ! | et le tiret qui est placé au début ou la fin + $tolere = '\w\s\t\n\r/,;:éèàçù€\#@%\.\(\)[\]\{\}\?\!\|-'; + $pattern = '#(?:[' . $tolere . ']+)#'; + $chaine = preg_replace($pattern, '$2', $chaine); + //echo($chaine . "\n"); + + // on met les balises + $pattern = '#' . $regexListeNonGeree . '#'; + $remplacement = '$0'; + $chaine = preg_replace($pattern, $remplacement, $chaine); + + // c'est quoi cette merde? + // l'API DOM de PHP bien sur!! pour manipuler le "document object model" + // c'est du complètement calqué sur le javascript, avec une syntaxe PHP + // et en plus elle est super vieille, elle ne connaît pas les balises HTML5 ! + // mais une balise c'est une balise donc ça marche quand même + // la doc de PHP est comme toujours plutôt bonne, elle indique les types de données manipulées + // https://www.php.net/manual/fr/book.dom.php + $dom = new DOMDocument; + + // pour ne pas s'arrêter sur les erreurs à cause des "nouvelles" balises + libxml_use_internal_errors(true); + + if($dom->loadHTML($chaine)) // et non load() tout court qui sert à charger du XML + { + //
+ // détecter
+ // puis extraire le lien et supprimer les balises autour + if(preg_match("#
#", $chaine)) + { + $nbFigures = $dom->getElementsByTagName('figure')->length; + + $j = 0; + for($i = 0; $i < $nbFigures ; $i++) // boucle foreach impossible, une
disparaît à chaque tour + { + $balisesFigure = $dom->getElementsByTagName('figure'); + $figure = $balisesFigure->item($j); // l'item 1 devient 0 au deuxième passage, etc + $parent = $figure->parentNode; + + if($figure->getAttribute("class") == 'media') + { + $oembed = $figure->getElementsByTagName('oembed'); // tableau d'une seule case + $div = $figure->getElementsByTagName('div'); // tableau d'une seule case + if($oembed->length > 0) // si taille = 0, c'est que la balise figure contient autre chose qu'une oembed + { + $lien = $oembed->item(0)->getAttribute('url') . ' '; // un espace pour ne pas coller deux adresses + $span = $dom->createElement('span', $lien); + $class = $dom->createAttribute('class'); + $class->value = 'media_embed'; + $span->appendChild($class); + $parent->replaceChild($span, $figure); + } + elseif($div->length > 0) // cette div créée par le ckeditor contient notre lien, plus bas se trouve une iframe + { + $lien = $div->item(0)->getAttribute('data-oembed-url') . ' '; + $span = $dom->createElement('span', $lien); + $class = $dom->createAttribute('class'); + $class->value = 'media_embed'; + $span->appendChild($class); + $parent->replaceChild($span, $figure); + } + else + { + $j++; // la balise
n'est pas supprimée, on incrémente l'indice du tableau pour ne pas boucler à l'infini + } + } + } + } + + // #", $chaine)) + { + $nbIframes = $dom->getElementsByTagName('iframe')->length; + + for($i = 0; $i < $nbIframes ; $i++) + { + $balisesIframe = $dom->getElementsByTagName('iframe'); + $iframe = $balisesIframe->item(0); + $parent = $iframe->parentNode; + + $lien = $iframe->getAttribute('src') . ' '; + $span = $dom->createElement('span', $lien); + $class = $dom->createAttribute('class'); + $class->value = 'media_embed'; + $span->appendChild($class); + $parent->replaceChild($span, $$iframe); + } + } + + // + // pour tout les sites multimedia, remplacer les balises par les liens nus + // en effet, en revenant dans l'éditeur les liens ne déclenchent pas automatiquement "l'embarquement" + // cliquer à la fin d'un lien et passer à la ligne a pour effet de créer des balises + // ça pose un problème parce que la bibliothèque "embera" ne gère pas les liens dans des balises + if(preg_match("#.*#", $chaine)) + { + $nbA = $dom->getElementsByTagName('a')->length; + + $j = 0; + for($i = 0; $i < $nbA ; $i++) + { + $balisesA = $dom->getElementsByTagName('a'); + $a = $balisesA->item($j); + $parent = $a->parentNode; + + $lien = $a->getAttribute('href') . ' '; + + // seules les liens pointant vers une des adresses de la liste sont concernés + if(preg_match("#" . $listeMedia . "#", $lien)) + { + $span = $dom->createElement('span', $lien); + $class = $dom->createAttribute('class'); + $class->value = 'media_embed'; + $span->appendChild($class); + $parent->replaceChild($span, $a); + } + else + { + $j++; // la balise n'est pas supprimée, on incrémente l'indice du tableau pour ne pas boucler à l'infini + } + } + } + + // pour nettoyer tous les warnings qu'on vient de produire et purifier nos fichiers log + libxml_clear_errors(); + // pour au contraire pouvoir les regarder, remplacer la ligne au dessus par celles en dessous + //~ $errors = libxml_get_errors(); + //~ var_dump($errors); + + // mettre à jour le DOM et enlever le DOCTYPE et les balises et + $chaine = $dom->saveHTML($dom); + $pattern = array ('##', '##', '##'); + $remplacement = array ('', '', ''); + $chaine = preg_replace($pattern, $remplacement, $chaine); + } + else + { + echo "Impossible de charger le HTML"; + } + + + + // détecter soundcloud + // normallement il n'y a rien à faire ici mais on sait jamais (une mise à jour du ckeditor?) + if(preg_match("#soundcloud.com#", $chaine)) + {} + + // détecter facebook (éventuellement fb.watch) + // je crois que ça va être compliqué ici + if(preg_match("#facebook.com|fb.watch#", $chaine)) + {} + + return($chaine); // = $contenu +} + + +// embarquement !! +function mediaEmbed($chaine) +{ + //require("../Embera/src/Autoloader.php"); + //$embera = new Embera\Embera(); + //$chaine = $embera->autoEmbed($chaine); + + $pattern = '#(.+)#'; + $remplacement = ''; + $chaine = preg_replace($pattern, $remplacement, $chaine); + + // requête oembed + //~ echo('

'); + //~ print_r($embera->getUrlData([ + //~ 'https://vimeo.com/374131624', + //~ 'https://www.flickr.com/photos/bees/8597283706/in/photostream', + //~ ])); + + return($chaine); // = $contenu +} -- cgit v1.2.3