From 787d03e48471ba62cd830379428f04d996f0b74b Mon Sep 17 00:00:00 2001 From: polo Date: Thu, 17 Feb 2022 18:13:00 +0100 Subject: model update --- controller/media.php | 424 +++++++++++++++++++++++++-------------------------- 1 file changed, 212 insertions(+), 212 deletions(-) (limited to 'controller/media.php') 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 @@ - - - // 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 -} + + + // 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