[SPIP][PLUGINS] v3.0-->v3.2
[lhc/web/www.git] / www / plugins-dist / svp / inc / svp_phraser.php
index a6476fc..48eb9b2 100644 (file)
@@ -3,33 +3,41 @@
 /**
  * Fichier permettant de phraser les XML des fichiers paquet.xml et plugin.xml
  * ainsi que des fichiers décrivant le contenu d'un dépot de paquets.
- * 
+ *
  * @plugin SVP pour SPIP
  * @license GPL
  * @package SPIP\SVP\Plugins
-**/
+ **/
 
-if (!defined("_ECRIRE_INC_VERSION")) return;
+if (!defined("_ECRIRE_INC_VERSION")) {
+       return;
+}
 
 include_spip('inc/xml');
 include_spip('inc/config');
 
 if (!defined('_SVP_MODE_RUNTIME')) {
-/**
- * Mode d'utilisation de SVP runtime ou pas :
- * - En mode runtime (true), on ne charge que les plugins compatibles avec la version courante
- * - En mode non runtime (false) on charge tous les plugins : cas du site Plugins SPIP
- * Runtime est le mode par defaut
- * @var bool */
-       define('_SVP_MODE_RUNTIME', (lire_config('svp/mode_runtime', 'oui') == 'oui' ? true : false));
+       if (defined('_DEV_VERSION_SPIP_COMPAT')) {
+               /**
+                * Mode d'utilisation de SVP runtime ou pas :
+                * - En mode runtime (true), on ne charge que les plugins compatibles avec la version courante
+                * - En mode non runtime (false) on charge tous les plugins : cas du site Plugins SPIP
+                * Runtime est le mode par defaut
+                *
+                * @var bool
+                */
+               define('_SVP_MODE_RUNTIME', false);
+       } else {
+               define('_SVP_MODE_RUNTIME', (lire_config('svp/mode_runtime', 'oui') == 'oui' ? true : false));
+       }
 }
 
 
 // Type parseur XML à appliquer pour récupérer les infos du plugin
 /** @var string  Phraseur à utiliser pour un XML de plugin.xml */
-define('_SVP_DTD_PLUGIN', 'plugin'); 
+define('_SVP_DTD_PLUGIN', 'plugin');
 /** @var string  Phraseur à utiliser pour un XML de paquet.xml */
-define('_SVP_DTD_PAQUET', 'paquet'); 
+define('_SVP_DTD_PAQUET', 'paquet');
 
 // Regexp de recherche des balises principales de archives.xml
 define('_SVP_REGEXP_BALISE_DEPOT', '#<depot[^>]*>(.*)</depot>#Uims');
@@ -63,46 +71,63 @@ $GLOBALS['categories_plugin'] = array(
 
 /** Liste des balises techniques autorisées dans la balise <spip> */
 $GLOBALS['balises_techniques'] = array(
-       'menu', 'chemin', 'lib', 'necessite', 'onglet', 'procure', 'pipeline', 'utilise',
-       'options', 'fonctions', 'install');
+       'menu',
+       'chemin',
+       'lib',
+       'necessite',
+       'onglet',
+       'procure',
+       'pipeline',
+       'utilise',
+       'options',
+       'fonctions',
+       'install'
+);
 # define('_BALISES_TECHNIQUES', serialize($balises_techniques));
-       
+
 /** Liste des balises autorisant une traduction */
 $GLOBALS['balises_multis'] = array(
-       'nom', 'slogan', 'description');
+       'nom',
+       'slogan',
+       'description'
+);
 # define('_BALISES_MULTIS', serialize($balises_multis));
 
 
 /**
  * Phrase un fichier décrivant un dépot, dont le chemin local est donné
- * 
+ *
  * Le fichier est au format XML et contient deux balises principales :
  * - <depot>...</depot> : informations de description du depot (facultatif)
  * - <archives>...</archives> : liste des informations sur chaque archive (obligatoire)
  *
  * La fonction met en cache le résultat du phrasage de chaque archive et ne
  * rephrase que les archives ayant changées.
- * 
+ *
+ * @uses  svp_aplatir_balises()
+ * @uses  svp_phraser_archives()
  * @param string $fichier_xml
  *     Chemin local du fichier XML de description du dépot
  * @return array|bool
  *     false si erreur,
  *     Tableau de 2 index sinon :
  *     - depot : description du dépot
- *     - paquets : 
+ *     - paquets :
  */
 function svp_phraser_depot($fichier_xml) {
 
        // le fichier xml fournit sous forme de fichier
-       lire_fichier($fichier_xml,$xml);
+       lire_fichier($fichier_xml, $xml);
 
        // Initialisation du tableau des informations
        // -- Si aucun bloc depot n'est trouve le titre et le type prennent une valeur par defaut
        $infos = array(
-                               'depot' => array(
-                                                       'titre' => _T('svp:titre_nouveau_depot'), 
-                                                       'type' => 'manuel'),
-                               'paquets' => array());
+               'depot' => array(
+                       'titre' => _T('svp:titre_nouveau_depot'),
+                       'type' => 'manuel'
+               ),
+               'paquets' => array()
+       );
 
 
        // Extraction et phrasage du bloc depot si il existe
@@ -118,22 +143,26 @@ function svp_phraser_depot($fichier_xml) {
        // -- Le bloc <archives> peut etre une chaine de grande taille et provoquer une erreur 
        // sur une recherche de regexp. On ne teste donc pas l'existence de cette balise
        // -- Si aucun bloc <archive> c'est aussi une erreur
-       if (!preg_match_all(_SVP_REGEXP_BALISE_ARCHIVE, $xml, $matches))
+       if (!preg_match_all(_SVP_REGEXP_BALISE_ARCHIVE, $xml, $matches)) {
                return false;
+       }
 
        // lire le cache des md5 pour ne parser que ce qui a change
        $fichier_xml_md5 = $fichier_xml . ".md5.txt";
-       lire_fichier($fichier_xml_md5,$cache_md5);
+       lire_fichier($fichier_xml_md5, $cache_md5);
        if (!$cache_md5
-         OR !$cache_md5 = unserialize($cache_md5))
+               or !$cache_md5 = unserialize($cache_md5)
+       ) {
                $cache_md5 = array();
+       }
 
        $infos['paquets'] = svp_phraser_archives($matches[0], $cache_md5);
-       ecrire_fichier($fichier_xml_md5,serialize($cache_md5));
+       ecrire_fichier($fichier_xml_md5, serialize($cache_md5));
 
        // -- Si aucun paquet extrait c'est aussi une erreur
-       if (!$infos['paquets'])
+       if (!$infos['paquets']) {
                return false;
+       }
 
        return $infos;
 }
@@ -147,6 +176,10 @@ function svp_phraser_depot($fichier_xml) {
  * - <traductions> : contient la compilation des informations de traduction (facultatif)
  * - <plugin> ou <paquet> suivant la DTD : le contenu du fichier plugin.xml ou paquet.xml (facultatif)
  *
+ * @uses  svp_phraser_zip()
+ * @uses  svp_phraser_traductions()
+ * @uses  svp_phraser_plugin()
+ * @uses  plugin_version_compatible()
  * @param array $archives
  *     Tableau de la liste des archives trouvées dans la description d'un dépot
  * @param array $md5_cache
@@ -156,56 +189,60 @@ function svp_phraser_depot($fichier_xml) {
  *     Tableau décrivant chaque archive, avec en index l'url de l'archive.
  *     Tableau (url => Tableau de description de l'archive)
  */
-function svp_phraser_archives($archives,&$md5_cache=array()) {
+function svp_phraser_archives($archives, &$md5_cache = array()) {
        include_spip('inc/plugin');
        $seen = array();
 
        $paquets = array();
-       $version_spip = $GLOBALS['spip_version_branche'].".".$GLOBALS['spip_version_code'];
+       $version_spip = $GLOBALS['spip_version_branche'] . "." . $GLOBALS['spip_version_code'];
 
        // On verifie qu'il existe au moins une archive
-       if (!$archives)
+       if (!$archives) {
                return $paquets;
+       }
 
        // On phrase chacune des archives
        // Seul le bloc <zip> est obligatoire
-       foreach ($archives as $_cle => $_archive){
+       foreach ($archives as $_cle => $_archive) {
                // quand version spip ou mode runtime changent,
                // il faut mettre le xml a jour pour voir les plugins compatibles ou non
-               $md5 = md5($_archive.":$version_spip:"._SVP_MODE_RUNTIME);
-               if (isset($md5_cache[$md5])){
-                       if (is_array($p=$md5_cache[$md5]))
-                               $paquets[$p['file']] = $p; // ce paquet est connu
+               $md5 = md5($_archive . ":$version_spip:" . _SVP_MODE_RUNTIME);
+               if (isset($md5_cache[$md5])) {
+                       if (is_array($p = $md5_cache[$md5])) {
+                               $paquets[$p['file']] = $p;
+                       } // ce paquet est connu
                        $seen[] = $md5;
-               }
-               elseif (preg_match(_SVP_REGEXP_BALISE_ZIP, $_archive, $matches)) {
+               } elseif (preg_match(_SVP_REGEXP_BALISE_ZIP, $_archive, $matches)) {
 
                        // Extraction de la balise <zip>
                        $zip = svp_phraser_zip($matches[1]);
 
                        if ($zip) {
-                               
+
                                // Extraction de la balise traductions
                                $traductions = array();
-                               if (preg_match(_SVP_REGEXP_BALISE_TRADUCTIONS, $_archive, $matches))
+                               if (preg_match(_SVP_REGEXP_BALISE_TRADUCTIONS, $_archive, $matches)) {
                                        $traductions = svp_phraser_traductions($matches[1]);
+                               }
+
 
-                               
                                // La balise <archive> peut posseder un attribut qui precise la DTD utilisee pour les plugins (plugin ou paquet)
                                // Sinon, c'est la DTD plugin qui est utilisee
                                list($tag, $attributs) = spip_xml_decompose_tag($_archive);
                                // -- On stocke la DTD d'extraction des infos du plugin
-                               $dtd = (isset($attributs['dtd']) AND $attributs['dtd']) ? $attributs['dtd'] : _SVP_DTD_PLUGIN;
+                               $dtd = (isset($attributs['dtd']) and $attributs['dtd']) ? $attributs['dtd'] : _SVP_DTD_PLUGIN;
 
                                // Extraction *des balises* plugin ou *de la balise* paquet suivant la DTD et la version SPIP
                                // -- DTD : si on utilise plugin.xml on extrait la balise <plugin> sinon la balise <paquet>
                                $xml = svp_phraser_plugin($dtd, $_archive);
-                       
+
                                // Si on est en mode runtime, on est seulement interesse par les plugins compatibles avec
                                // la version courant de SPIP. On ne stocke donc pas les autres plugins.
                                // Si on est pas en mode runtime on prend tout !
                                if (!_SVP_MODE_RUNTIME
-                               OR (_SVP_MODE_RUNTIME AND isset($xml['compatibilite']) AND plugin_version_compatible($xml['compatibilite'], $version_spip, 'spip'))) {
+                                       or (_SVP_MODE_RUNTIME and isset($xml['compatibilite']) and plugin_version_compatible($xml['compatibilite'],
+                                                       $version_spip, 'spip'))
+                               ) {
                                        $paquets[$zip['file']] = $zip;
                                        $paquets[$zip['file']]['traductions'] = $traductions;
                                        $paquets[$zip['file']]['dtd'] = $dtd;
@@ -213,8 +250,7 @@ function svp_phraser_archives($archives,&$md5_cache=array()) {
                                        $paquets[$zip['file']]['md5'] = $md5;
                                        $md5_cache[$md5] = $paquets[$zip['file']];
                                        $seen[] = $md5;
-                               }
-                               else{
+                               } else {
                                        $md5_cache[$md5] = $zip['file'];
                                        $seen[] = $md5;
                                }
@@ -223,8 +259,8 @@ function svp_phraser_archives($archives,&$md5_cache=array()) {
        }
 
        // supprimer du cache les zip qui ne sont pas dans le nouveau $archives
-       $oldies = array_diff(array_keys($md5_cache),$seen);
-       foreach ($oldies as $old_md5){
+       $oldies = array_diff(array_keys($md5_cache), $seen);
+       foreach ($oldies as $old_md5) {
                unset($md5_cache[$old_md5]);
        }
 
@@ -232,7 +268,6 @@ function svp_phraser_archives($archives,&$md5_cache=array()) {
 }
 
 
-
 /**
  * Phrase le contenu du XML décrivant une archive suivant une DTD
  * de plugin.xml ou de paquet.xml donnée
@@ -241,21 +276,24 @@ function svp_phraser_archives($archives,&$md5_cache=array()) {
  * Elle phrase la balise <multi> dans le cas d'une DTD paquet qui contient
  * les traductions du nom, slogan et description
  *
+ * @uses svp_aplatir_balises()
+ *
  * @global $balises_multis
- * 
+ * @static array $informer
+ *
  * @param string $dtd
  *     Nom du type de dtd : plugin ou paquet (pour phraser un plugin.xml ou un paquet.xml)
  * @param string $contenu
  *     Contenu XML à phraser
  * @return array
  *     Description du plugin
-**/
+ **/
 function svp_phraser_plugin($dtd, $contenu) {
        global $balises_multis;
        static $informer = array();
-       
+
        $plugin = array();
-       
+
        // On initialise les informations du plugin avec le contenu du plugin.xml ou paquet.xml
        $regexp = ($dtd == 'plugin') ? _SVP_REGEXP_BALISE_PLUGIN : _SVP_REGEXP_BALISE_PAQUET;
        if ($nb_balises = preg_match_all($regexp, $contenu, $matches)) {
@@ -275,20 +313,23 @@ function svp_phraser_plugin($dtd, $contenu) {
                // -- sinon on arrange la structure pour deplacer le contenu des balises dites techniques dans un sous tableau
                //    d'index 0 par similitude avec la structure fusionnee
                $fusionner = charger_fonction('fusion_' . $dtd, 'plugins');
-               if ($dtd == 'plugin')
+               if ($dtd == 'plugin') {
                        $plugin = $fusionner($plugins);
-               else
+               } else {
                        $plugin = $fusionner($plugins[0]);
+               }
 
                // Pour la DTD paquet, les traductions du nom, slogan et description sont compilees dans une balise
                // du fichier archives.xml. Il faut donc completer les informations precedentes avec cette balise
-               if (($dtd == _SVP_DTD_PAQUET) AND (preg_match(_SVP_REGEXP_BALISE_MULTIS, $contenu, $matches))) {
+               if (($dtd == _SVP_DTD_PAQUET) and (preg_match(_SVP_REGEXP_BALISE_MULTIS, $contenu, $matches))) {
                        $multis = array();
-                       if (is_array($arbre = spip_xml_parse($matches[1])))
+                       if (is_array($arbre = spip_xml_parse($matches[1]))) {
                                $multis = svp_aplatir_balises($balises_multis, $arbre);
+                       }
                        // Le nom peut etre traduit ou pas, il faut donc le tester
-                       if ($multis['nom'])
+                       if ($multis['nom']) {
                                $plugin['nom'] = $multis['nom'];
+                       }
                        // Slogan et description sont forcement des items de langue 
                        $plugin['slogan'] = $multis['slogan'];
                        $plugin['description'] = $multis['description'];
@@ -303,7 +344,9 @@ function svp_phraser_plugin($dtd, $contenu) {
  * Phrase le contenu de la balise <zip>
  *
  * Extrait du XML les informations du zip
- * 
+ *
+ * @uses svp_aplatir_balises()
+ *
  * @param string $contenu
  *     Description XML de l'archive
  * @return array
@@ -316,10 +359,11 @@ function svp_phraser_plugin($dtd, $contenu) {
  */
 function svp_phraser_zip($contenu) {
        static $balises_zip = array('file', 'size', 'date', 'source', 'last_commit');
-       
+
        $zip = array();
-       if (is_array($arbre = spip_xml_parse($contenu)))
+       if (is_array($arbre = spip_xml_parse($contenu))) {
                $zip = svp_aplatir_balises($balises_zip, $arbre);
+       }
 
        return $zip;
 }
@@ -340,15 +384,15 @@ function svp_phraser_zip($contenu) {
  *       l'ensemble des traducteurs pour chacune des langues présentes
  */
 function svp_phraser_traductions($contenu) {
-       
+
        $traductions = array();
        if (is_array($arbre = spip_xml_parse($contenu))) {
                foreach ($arbre as $_tag => $_langues) {
                        // On commence par les balises <traduction> et leurs attributs
                        list($tag, $attributs_traduction) = spip_xml_decompose_tag($_tag);
                        $traductions[$attributs_traduction['module']]['reference'] = $attributs_traduction['reference'];
-                       $traductions[$attributs_traduction['module']]['gestionnaire'] = isset($attributs_traduction['gestionnaire']) ? $attributs_traduction['gestionnaire'] : '' ;
-       
+                       $traductions[$attributs_traduction['module']]['gestionnaire'] = isset($attributs_traduction['gestionnaire']) ? $attributs_traduction['gestionnaire'] : '';
+
                        // On continue par les balises <langue> qui donnent le code en attribut
                        // et les balises <traducteur> qui donnent uniquement le nom en attribut
                        if (is_array($_langues[0])) {
@@ -373,9 +417,11 @@ function svp_phraser_traductions($contenu) {
 
 /**
  * Aplatit plusieurs clés d'un arbre xml dans un tableau
- * 
+ *
  * Effectue un trim() de la valeur trouvée dans l'arbre
  *
+ * @uses  spip_xml_aplatit()
+ *
  * @param array $balises
  *     Liste de noms de balises XML.
  *     Peut aussi être un tableau indiquant un renommage d'une balise
@@ -390,30 +436,31 @@ function svp_phraser_traductions($contenu) {
  *     - 'nonvide' : Si la balise n'est pas trouvée dans l'arbre ou si son
  *       contenu est vide, affecte la valeur du tableau initial concernant
  *       cette balise si elle est connue.
- * @param array
+ * @param array $tableau_initial
  *     Tableau initial pouvant contenir des valeurs par défaut à affecter
  *     à chaque balise avec 'x' => 'valeur'
  */
-function svp_aplatir_balises($balises, $arbre_xml, $mode='vide_et_nonvide', $tableau_initial=array()) {
+function svp_aplatir_balises($balises, $arbre_xml, $mode = 'vide_et_nonvide', $tableau_initial = array()) {
        $tableau_aplati = array();
 
-       if (!$balises)
+       if (!$balises) {
                return $tableau_initial;
+       }
 
-       foreach ($balises as $_cle => $_valeur){
+       foreach ($balises as $_cle => $_valeur) {
                $tag = (is_string($_cle)) ? $_cle : $_valeur;
                $valeur_aplatie = '';
                if (isset($arbre_xml[$tag])) {
                        $valeur_aplatie = trim(spip_xml_aplatit($arbre_xml[$tag]));
                }
                if (($mode == 'vide_et_nonvide')
-               OR (($mode == 'nonvide') AND $valeur_aplatie))
+                       or (($mode == 'nonvide') and $valeur_aplatie)
+               ) {
                        $tableau_aplati[$_valeur] = $valeur_aplatie;
-               else
+               } else {
                        $tableau_aplati[$_valeur] = isset($tableau_initial[$_valeur]) ? $tableau_initial[$_valeur] : '';
+               }
        }
 
        return $tableau_aplati;
 }
-
-?>