Changeset 108277 in spip-zone


Ignore:
Timestamp:
Dec 31, 2017, 4:53:53 PM (19 months ago)
Author:
eric@…
Message:

Quelques améliorations fonctionnels et de performance de certains filtres de Rainette.

Location:
_plugins_/rainette/trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • _plugins_/rainette/trunk/paquet.xml

    r108251 r108277  
    22        prefix="rainette"
    33        categorie="divers"
    4         version="3.5.2"
     4        version="3.5.3"
    55        etat="stable"
    66        compatibilite="]3.1.3;3.2.*]"
  • _plugins_/rainette/trunk/rainette_fonctions.php

    r108251 r108277  
    7474 * @filtre
    7575 *
    76  * @param array  $icone
    77  * @param string $taille
     76 * @param array      $icone
     77 * @param string|int $taille
     78 * @param array      $options
    7879 *
    7980 * @return string
    8081 */
    81 function rainette_afficher_icone($icone, $taille = 'petit') {
    82 
    83         // Initialisation de la source de la balise img avec le fichier icone.
    84         $source = $icone['source'];
    85 
    86         // On retaille si nécessaire l'image pour qu'elle soit toujours de la même taille (grande ou petite).
    87         list($largeur, $hauteur) = @getimagesize($source);
    88         include_spip('filtres/images_transforme');
    89         $taille_defaut = ($taille == 'petit') ? _RAINETTE_ICONES_PETITE_TAILLE : _RAINETTE_ICONES_GRANDE_TAILLE;
    90         if (($largeur < $taille_defaut) or ($hauteur < $taille_defaut)) {
    91                 // Image plus petite que celle par défaut :
    92                 // --> Il faut insérer et recadrer l'image dans une image plus grande à la taille par défaut
    93                 $source = extraire_attribut(image_recadre($source, $taille_defaut, $taille_defaut, 'center', 'transparent'), 'src');
    94         } elseif (($largeur > $taille_defaut) or ($hauteur > $taille_defaut)) {
    95                 // Image plus grande que celle par défaut :
    96                 // --> Il faut réduire l'image à la taille par défaut
    97                 $source = extraire_attribut(image_reduire($source, $taille_defaut), 'src');
    98         }
    99 
    100         // On construit la balise img
    101         $texte = $icone['code'];
    102         $balise_img = "<img src=\"${source}\" alt=\"${texte}\" title=\"${texte}\" width=\"${taille_defaut}\" height=\"${taille_defaut}\" />";
     82function rainette_afficher_icone($icone, $taille = 'petit', $options = array()) {
     83
     84        // Initialisation de la balise img afin de ne rien renvoyé si l'icone est vide.
     85        $balise_img = '';
     86
     87        if ($icone) {
     88                // Initialisation de la source de la balise img avec le fichier icone.
     89                $source = $icone['source'];
     90
     91                // On retaille si nécessaire l'image pour qu'elle soit toujours de la même taille (grande ou petite).
     92                list($largeur, $hauteur) = @getimagesize($source);
     93                include_spip('filtres/images_transforme');
     94
     95                // Calcul de la taille maximale de l'icone
     96                if ($taille == 'petit') {
     97                        $taille_max =_RAINETTE_ICONES_PETITE_TAILLE;
     98                } elseif ($taille == 'grand') {
     99                        $taille_max =_RAINETTE_ICONES_GRANDE_TAILLE;
     100                } else {
     101                        $taille_max = intval($taille);
     102                }
     103
     104                if (($largeur < $taille_max)    or ($hauteur < $taille_max)) {
     105                        // Image plus petite que celle par défaut :
     106                        // --> Il faut insérer et recadrer l'image dans une image plus grande à la taille par défaut
     107                        $source = extraire_attribut(image_recadre($source, $taille_max, $taille_max, 'center', 'transparent'), 'src');
     108                } elseif (($largeur > $taille_max) or ($hauteur > $taille_max)) {
     109                        // Image plus grande que celle par défaut :
     110                        // --> Il faut réduire l'image à la taille par défaut
     111                        $source = extraire_attribut(image_reduire($source, $taille_max), 'src');
     112                }
     113
     114                // On construit la balise img
     115                $texte = $icone['code'];
     116                $classe = !empty($options['classe']) ? 'class="' . $options['classe'] . '" ' : '';
     117                $balise_img = "<img src=\"${source}\" alt=\"${texte}\" title=\"${texte}\" width=\"${taille_max}\" height=\"${taille_max}\" ${classe}/>";
     118        }
    103119
    104120        return $balise_img;
     
    273289function rainette_lister_services($mode = 'tableau') {
    274290
    275         $services = array();
    276 
    277         // On lit les fichiers php dans répertoire services/ du plugin sachant ce répertoire
    278         // contient exclusivement les api de chaque service dans un fichier unique appelé
    279         // alias_du_service.php
    280         if ($fichiers_api = glob(_DIR_PLUGIN_RAINETTE . '/services/*.php')) {
    281                 foreach ($fichiers_api as $_fichier) {
    282                         // On détermine l'alias du service
    283                         $service = strtolower(basename($_fichier, '.php'));
    284 
    285                         // Acquérir la configuration statique du service.
    286                         include_spip("services/${service}");
    287                         $configurer = "${service}_service2configuration";
    288                         $configuration = $configurer('service');
    289 
    290                         $services[$service] = $configuration['nom'];
    291                 }
    292         }
    293 
    294         // Par défaut la liste est fournie comme un tableau.
    295         // Si le mode demandé est 'liste' on renvoie une chaîne énumérée des alias de service séparée par des virgules.
    296         if ($mode == 'liste') {
    297                 $services = implode(',', array_keys($services));
    298         }
    299 
    300         return $services;
     291        static $services = array();
     292
     293        if (!isset($service[$mode])) {
     294                // On lit les fichiers php dans répertoire services/ du plugin sachant ce répertoire
     295                // contient exclusivement les api de chaque service dans un fichier unique appelé
     296                // alias_du_service.php
     297                if ($fichiers_api = glob(_DIR_PLUGIN_RAINETTE . '/services/*.php')) {
     298                        foreach ($fichiers_api as $_fichier) {
     299                                // On détermine l'alias du service
     300                                $service = strtolower(basename($_fichier, '.php'));
     301
     302                                // Acquérir la configuration statique du service.
     303                                include_spip("services/${service}");
     304                                $configurer = "${service}_service2configuration";
     305                                $configuration = $configurer('service');
     306
     307                                $liste[$service] = $configuration['nom'];
     308                        }
     309                }
     310
     311                // Par défaut la liste est fournie comme un tableau.
     312                // Si le mode demandé est 'liste' on renvoie une chaîne énumérée des alias de service séparée par des virgules.
     313                $services[$mode] = ($mode == 'tableau') ? $liste : implode(',', array_keys($liste));
     314        }
     315
     316        return $services[$mode];
    301317}
    302318
     
    340356function rainette_lister_themes($service, $source = 'local') {
    341357
    342         $themes = array();
    343 
    344         // Certains services proposent des thèmes d'icones accessibles via l'API.
    345         // C'est le cas de wunderground.
    346         if (strtolower($source) == 'api') {
    347                 if ($service == 'wunderground') {
    348                         $cles = array('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k');
    349                         foreach ($cles as $_cle) {
    350                                 $themes[$_cle] = _T("rainette:label_theme_wunderground_${_cle}");
    351                         }
    352                 }
    353         } else {
    354                 // Les thèmes de Rainette sont toujours stockés dans l'arborescence themes/$service.
    355                 // Chaque thème a un alias qui correspond à son dossier et un titre pour l'affichage.
    356                 // On recherche les sous-dossiers themes/$service présents dans le path.
    357                 include_spip('inc/utils');
    358                 include_spip('inc/rainette_normaliser');
    359                 foreach (creer_chemin() as $_chemin) {
    360                         $dossier_service = $_chemin . icone_local_normaliser('', $service);
    361                         if (@is_dir($dossier_service)) {
    362                                 if ($dossiers_theme = glob($dossier_service . '/*', GLOB_ONLYDIR)) {
    363                                         foreach ($dossiers_theme as $_theme) {
    364                                                 $theme = strtolower(basename($_theme));
    365                                                 // On ne garde que le premier dossier de même nom.
    366                                                 if (!isset($themes[$theme])) {
    367                                                         $themes[$theme] = $theme;
     358        static $themes = array();
     359
     360        if (!isset($themes[$service][$source])) {
     361                // La liste des thèmes n'a pas encore été enregistrée, il faut la recalculer.
     362                // On l'initialise à vide car il faut toujours avoir une liste.
     363                $themes[$service][$source] = array();
     364
     365                if (strtolower($source) == 'api') {
     366                        // Certains services proposent des thèmes d'icones accessibles via l'API.
     367                        // C'est le cas de wunderground.
     368                        if ($service == 'wunderground') {
     369                                $cles = array('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k');
     370                                foreach ($cles as $_cle) {
     371                                        $themes[$service][$source][$_cle] = _T("rainette:label_theme_wunderground_${_cle}");
     372                                }
     373                        }
     374                } else {
     375                        // Les thèmes de Rainette sont toujours stockés dans l'arborescence themes/$service.
     376                        // Chaque thème a un alias qui correspond à son dossier et un titre pour l'affichage.
     377                        // On recherche les sous-dossiers themes/$service présents dans le path.
     378                        include_spip('inc/utils');
     379                        include_spip('inc/rainette_normaliser');
     380                        foreach (creer_chemin() as $_chemin) {
     381                                $dossier_service = $_chemin . icone_local_normaliser('', $service);
     382                                if (@is_dir($dossier_service)) {
     383                                        if ($dossiers_theme = glob($dossier_service . '/*', GLOB_ONLYDIR)) {
     384                                                foreach ($dossiers_theme as $_theme) {
     385                                                        $theme = strtolower(basename($_theme));
     386                                                        // On ne garde que le premier dossier de même nom.
     387                                                        if (!isset($themes[$theme])) {
     388                                                                $themes[$service][$source][$theme] = $theme;
     389                                                        }
    368390                                                }
    369391                                        }
     
    371393                        }
    372394                }
    373 
    374         }
    375 
    376         return $themes;
     395        }
     396
     397        return $themes[$service][$source];
    377398}
    378399
Note: See TracChangeset for help on using the changeset viewer.