Changeset 102888 in spip-zone for _plugins_/foundation_6/trunk


Ignore:
Timestamp:
Feb 16, 2017, 4:48:54 PM (2 years ago)
Author:
p@…
Message:

Remplacer l'expression régulière par DOMDocument

L'expression régulière étant peu fiable, on sort la grosse artillerie et on
parse comme il faut le HTML.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • _plugins_/foundation_6/trunk/foundation_6_fonctions.php

    r102593 r102888  
    2424 */
    2525function filtre_responsive_embed_dist($texte) {
    26         include_spip('inc/foundation');
    27         // On détecte toute les iFrames et on les rends responsives.
    28         return preg_replace_callback('%<iframe(.+)></iframe>%s', 'responsive', $texte);
     26
     27        if (!empty($texte)) {
     28                $dom = new DomDocument;
     29
     30                // Charger le texte de l'article dans DOMDocument
     31                $dom->LoadHTML($texte, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD | LIBXML_NOENT);
     32
     33                // Récupérer les iframes du document
     34                $iframes = $dom->getElementsByTagName('iframe');
     35
     36                // Créer la div qui contiendra l'iframe et lui ajouter les class
     37                // foundation
     38                $div = $dom->createElement('div');
     39                $div->setAttribute('class', 'responsive-embed flex-video');
     40
     41                // On boucle sur toutes les iframes
     42                foreach ($iframes as $iframe) {
     43                        // Faire une copie de la div responsive
     44                        $div_clone = $div->cloneNode();
     45
     46                        // Récupérer la largeur et la hauteur définie dans l'iFrame
     47                        $height = $iframe->getAttribute('height');
     48                        $width = $iframe->getAttribute('width');
     49
     50                        // Définir s'il faut ajouter la class widescreen ou non
     51                        if ($height and $width) {
     52                                $ratio = intval($width)/intval($height);
     53                                $ratio_4_3 = 4/3;
     54
     55                                if ($ratio > $ratio_4_3) {
     56                                        $div_clone->setAttribute('class', 'responsive-embed flex-video widescreen');
     57                                }
     58                        }
     59
     60                        // Injecter la div à la place de l'iframe
     61                        $iframe->parentNode->replaceChild($div_clone, $iframe);
     62                        // Injecter l'iframe dans le div
     63                        $div_clone->appendChild($iframe);
     64                }
     65
     66                return $dom->saveHTML();
     67        }
     68
     69        return $texte;
    2970}
    3071
Note: See TracChangeset for help on using the changeset viewer.