[SPIP] ~v3.0.20-->v3.0.25
[lhc/web/clavette_www.git] / www / ecrire / inc / plugin.php
index 1510889..442b0a5 100644 (file)
@@ -3,7 +3,7 @@
 /***************************************************************************\
  *  SPIP, Systeme de publication pour l'internet                           *
  *                                                                         *
- *  Copyright (c) 2001-2014                                                *
+ *  Copyright (c) 2001-2016                                                *
  *  Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James  *
  *                                                                         *
  *  Ce programme est un logiciel libre distribue sous licence GNU/GPL.     *
@@ -149,89 +149,139 @@ function plugin_version_compatible($intervalle, $version, $avec_quoi = '') {
 }
 
 
-
-// Construire la liste des infos strictement necessaires aux plugins a activer
-// afin de les memoriser dans une meta pas trop grosse
-// http://doc.spip.org/@liste_plugin_valides
-function liste_plugin_valides($liste_plug, $force = false)
-{
+/**
+ * Construire la liste des infos strictement necessaires aux plugins a activer
+ * afin de les memoriser dans une meta pas trop grosse
+ * http://code.spip.net/@liste_plugin_valides
+ *
+ * @param array $liste_plug
+ * @param bool $force
+ * @return array
+ */
+function liste_plugin_valides($liste_plug, $force = false){
        $liste_ext = liste_plugin_files(_DIR_PLUGINS_DIST);
-       $get_infos = charger_fonction('get_infos','plugins');
+       $get_infos = charger_fonction('get_infos', 'plugins');
        $infos = array(
                // lister les extensions qui sont automatiquement actives
                '_DIR_PLUGINS_DIST' => $get_infos($liste_ext, $force, _DIR_PLUGINS_DIST),
                '_DIR_PLUGINS' => $get_infos($liste_plug, $force, _DIR_PLUGINS)
-                      );
+       );
 
        // creer une premiere liste non ordonnee mais qui ne retient
        // que les plugins valides, et dans leur derniere version en cas de doublon
-       $infos['_DIR_RESTREINT'][''] = $get_infos('./',$force,_DIR_RESTREINT);
+       $infos['_DIR_RESTREINT'][''] = $get_infos('./', $force, _DIR_RESTREINT);
        $infos['_DIR_RESTREINT']['SPIP']['version'] = $GLOBALS['spip_version_branche'];
        $infos['_DIR_RESTREINT']['SPIP']['chemin'] = array();
-       $liste_non_classee = array('SPIP'=>array(
+       $liste_non_classee = array('SPIP' => array(
                'nom' => 'SPIP',
                'etat' => 'stable',
                'version' => $GLOBALS['spip_version_branche'],
                'dir_type' => '_DIR_RESTREINT',
-               'dir'=> '',
+               'dir' => '',
        )
        );
 
-       foreach($liste_ext as $plug){
-         if (isset($infos['_DIR_PLUGINS_DIST'][$plug]))
-           plugin_valide_resume($liste_non_classee, $plug, $infos, '_DIR_PLUGINS_DIST');
+       foreach ($liste_ext as $plug){
+               if (isset($infos['_DIR_PLUGINS_DIST'][$plug]))
+                       plugin_valide_resume($liste_non_classee, $plug, $infos, '_DIR_PLUGINS_DIST');
        }
-       foreach($liste_plug as $plug) {
-         if (isset($infos['_DIR_PLUGINS'][$plug]))
-           plugin_valide_resume($liste_non_classee, $plug, $infos, '_DIR_PLUGINS');
+       foreach ($liste_plug as $plug){
+               if (isset($infos['_DIR_PLUGINS'][$plug]))
+                       plugin_valide_resume($liste_non_classee, $plug, $infos, '_DIR_PLUGINS');
        }
        
-       if (defined('_DIR_PLUGINS_SUPPL') and _DIR_PLUGINS_SUPPL) {
+       if (defined('_DIR_PLUGINS_SUPPL') and _DIR_PLUGINS_SUPPL){
                $infos['_DIR_PLUGINS_SUPPL'] = $get_infos($liste_plug, false, _DIR_PLUGINS_SUPPL);
-               foreach($liste_plug as $plug) {
+               foreach ($liste_plug as $plug){
                        if (isset($infos['_DIR_PLUGINS_SUPPL'][$plug]))
                                plugin_valide_resume($liste_non_classee, $plug, $infos, '_DIR_PLUGINS_SUPPL');
                }
        }
        
-       // les procure de core.xml sont consideres comme des plugins proposes,
-       // mais surchargeables (on peut activer un plugin qui procure ca pour l'ameliorer,
-       // donc avec le meme prefixe)
-       foreach($infos['_DIR_RESTREINT']['']['procure'] as $procure) {
-               $p = strtoupper($procure['nom']);
-               if (!isset($liste_non_classee[$p])){
-                       $procure['etat'] = '?';
-                       $procure['dir_type'] = '_DIR_RESTREINT';
-                       $procure['dir'] = '';
-                       $liste_non_classee[$p] = $procure;
-               }
-       }
+       plugin_fixer_procure($liste_non_classee, $infos);
 
        return array($infos, $liste_non_classee);
 }
 
-// Ne retenir un plugin que s'il est valide
-// et dans leur plus recente version compatible
-// avec la version presente de SPIP
-
-function plugin_valide_resume(&$liste, $plug, $infos, $dir)
-{
-       $i = $infos[$dir][$plug];
+/**
+ * Ne retenir un plugin que s'il est valide
+ * et dans leur plus recente version compatible
+ * avec la version presente de SPIP
+ *
+ * @param array $liste
+ * @param string $plug
+ * @param array $infos
+ * @param string $dir_type
+ */
+function plugin_valide_resume(&$liste, $plug, $infos, $dir_type){
+       $i = $infos[$dir_type][$plug];
        if (isset($i['erreur']) AND $i['erreur'])
                return;
-       if (!plugin_version_compatible($i['compatibilite'], $GLOBALS['spip_version_branche'],'spip'))
+       if (!plugin_version_compatible($i['compatibilite'], $GLOBALS['spip_version_branche'], 'spip'))
                return;
        $p = strtoupper($i['prefix']);
        if (!isset($liste[$p]) 
-       OR spip_version_compare($i['version'],$liste[$p]['version'],'>')) {
+               OR spip_version_compare($i['version'], $liste[$p]['version'], '>')
+         ){
                $liste[$p] = array(
                        'nom' => $i['nom'],
                        'etat' => $i['etat'],
-                       'version'=> $i['version'],
-                       'dir'=> $plug,
-                       'dir_type' => $dir
-                                              );
+                       'version' => $i['version'],
+                       'dir' => $plug,
+                       'dir_type' => $dir_type
+               );
+       }
+}
+
+/**
+ * Completer la liste des plugins avec les eventuels procure
+ *
+ * les <procure> sont consideres comme des plugins proposes,
+ * mais surchargeables (on peut activer un plugin qui procure ca pour l'ameliorer,
+ * donc avec le meme prefixe, qui sera pris en compte si il a une version plus grande)
+ *
+ * @param array $liste
+ * @param array $infos
+ */
+function plugin_fixer_procure(&$liste, &$infos){
+       foreach($liste as $p=>$resume){
+               $i = $infos[$resume['dir_type']][$resume['dir']];
+               if (isset($i['procure']) AND $i['procure']){
+                       foreach($i['procure'] as $procure){
+                               $p = strtoupper($procure['nom']);
+                               $dir = $resume['dir'];
+                               if ($dir) $dir .= "/";
+                               $dir .= "procure:".$procure['nom'];
+
+                               $procure['etat'] = '?';
+                               $procure['dir_type'] = $resume['dir_type'];
+                               $procure['dir'] = $dir;
+
+                               // si ce plugin n'est pas deja procure, ou dans une version plus ancienne
+                               // on ajoute cette version a la liste
+                               if (!isset($liste[$p])
+                                       OR spip_version_compare($procure['version'], $liste[$p]['version'], '>')
+                                 ){
+                                       $liste[$p] = $procure;
+
+                                       // on fournit une information minimale pour ne pas perturber la compilation
+                                       $infos[$resume['dir_type']][$dir] = array(
+                                               'prefix' => $procure['nom'],
+                                               'nom' => $procure['nom'],
+                                               'etat' => $procure['etat'],
+                                               'version' => $procure['version'],
+                                               'chemin' => array(),
+                                               'necessite' => array(),
+                                               'utilise' => array(),
+                                               'lib' => array(),
+                                               'menu' => array(),
+                                               'onglet' => array(),
+                                               'procure' => array(),
+                                       );
+                               }
+                       }
                }
+       }
 }
 
 /**
@@ -594,6 +644,7 @@ function plugins_precompile_xxxtions($plugin_valides, $ordre)
                                // donc ni sa relecture, ni sa detection
                                if (!isset($info[$charge])
                                        AND $dir // exclure le cas du plugin "SPIP"
+                                       AND strpos($dir,":")===false // exclure le cas des procure:
                                        AND file_exists("$dir$plug/paquet.xml") // uniquement pour les paquet.xml
                                        ){
                                        if (is_readable("$dir$plug/".($file=$info['prefix']."_".$charge.".php"))){