fusion_plugin.php 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. <?php
  2. /**
  3. * Fichier permettant de calculer les descriptions
  4. * d'un plugin.xml contenant plusieurs balises <plugin>
  5. *
  6. * @plugin SVP pour SPIP
  7. * @license GPL
  8. * @package SPIP\SVP\Plugins
  9. **/
  10. if (!defined('_ECRIRE_INC_VERSION')) return;
  11. include_spip('inc/plugin');
  12. include_spip('inc/svp_outiller');
  13. /**
  14. * Fusion des informations de chaque balise plugin d'un plugin.xml en
  15. * considérant la compatibilité SPIP
  16. *
  17. * Pour les balises plugins uniques cette fonction permet de générer une structure
  18. * identique pour les balises dites techniques
  19. *
  20. * On limite le traitement a deux balises plugins maximum,
  21. * ce qui est le cas de tous les plugin.xml actuellement connus
  22. *
  23. * @param array $plugins
  24. * Arbre des balises plugins présents dans un plugin.xml
  25. * @return array
  26. * Fusion des éléments classé par balise, puis par compatibilité à SPIP.
  27. * L'index 0 dans la compatibilité est valable quelque soit la version de SPIP.
  28. */
  29. function plugins_fusion_plugin($plugins) {
  30. global $balises_techniques;
  31. $fusion = array();
  32. if (!$plugins)
  33. return $fusion;
  34. if (count($plugins) == 1) {
  35. // Balise plugin unique : on ne traite que les balises techniques
  36. $fusion = $plugins[0];
  37. foreach ($balises_techniques as $_btech) {
  38. if (isset($fusion[$_btech]) and $fusion[$_btech]) {
  39. $balise = $fusion[$_btech];
  40. unset($fusion[$_btech]);
  41. $fusion[$_btech][0] = $balise;
  42. }
  43. else {
  44. $fusion[$_btech] = array();
  45. }
  46. }
  47. }
  48. else {
  49. // On initialise les informations a retourner avec le bloc a priori le plus recent determine par la compatibilite SPIP :
  50. // On selectionne le bloc dont la borne min de compatibilite SPIP est la plus elevee
  51. $cle_min_max = -1;
  52. $borne_min_max = _SVP_VERSION_SPIP_MIN;
  53. foreach ($plugins as $_cle => $_plugin) {
  54. if (!$_plugin['compatibilite'])
  55. $borne_min = _SVP_VERSION_SPIP_MIN;
  56. $bornes_spip = extraire_bornes($_plugin['compatibilite']);
  57. $borne_min = ($bornes_spip['min']['valeur']) ? $bornes_spip['min']['valeur'] : _SVP_VERSION_SPIP_MIN;
  58. if (spip_version_compare($borne_min_max, $borne_min, '<=')) {
  59. $cle_min_max = $_cle;
  60. $borne_min_max = $borne_min;
  61. }
  62. }
  63. $fusion = $plugins[$cle_min_max];
  64. // On relit les autres blocs que celui venant d'etre selectionne et on fusionne les informations necessaires
  65. // les traitements effectues sont les suivants :
  66. // -- nom, prefix, documentation, version, etat, version_base, description : *rien*, on conserve ces informations en l'etat
  67. // -- options, fonctions, install : *rien*, meme si certaines pourraient etre fusionnees ces infos ne sont pas stockees
  68. // -- auteur, licence : *rien*, l'heuristique pour fusionner ces infos est trop compliquee aujourdhui car c'est du texte libre
  69. // -- categorie, logo : si la valeur du bloc selectionne est vide on essaye d'en trouver une non vide dans les autres blocs
  70. // -- compatible : on constuit l'intervalle global de compatibilite SPIP
  71. // -- necessite, utilise, lib : on construit le tableau par intervalle de compatibilite SPIP
  72. $cle_min_min = ($cle_min_max==0) ? 1 : 0;
  73. if (!$fusion['categorie'] AND $plugins[$cle_min_min]['categorie'])
  74. $fusion['categorie'] = $plugins[$cle_min_min]['categorie'];
  75. if ((!isset($fusion['logo']) OR !$fusion['logo']) AND $plugins[$cle_min_min]['logo'])
  76. $fusion['logo'] = $plugins[$cle_min_min]['logo'];
  77. $fusion['compatibilite'] = fusionner_intervalles($fusion['compatibilite'], $plugins[$cle_min_min]['compatibilite']);
  78. // necessite, utilise, lib, chemin, pipeline, bouton, onglet : on indexe chaque liste de dependances
  79. // par l'intervalle de compatibilite sans regrouper les doublons pour l'instant
  80. foreach ($balises_techniques as $_btech) {
  81. if (!isset($fusion[$_btech]) AND !isset($plugins[$cle_min_min][$_btech])) {
  82. // Aucun des tableaux ne contient cette balise technique : on la positionne a un array vide
  83. $fusion[$_btech] = array();
  84. }
  85. else if (!isset($fusion[$_btech]) OR !$fusion[$_btech]) {
  86. if ($plugins[$cle_min_min][$_btech]) {
  87. // La balise technique est vide dans le tableau de fusion mais non vide dans la deuxieme balise plugin
  88. // On range cette balise dans le tableau fusion de sa compatibilite et on cree la cle commune vide
  89. $fusion[$_btech][$plugins[$cle_min_min]['compatibilite']] = $plugins[$cle_min_min][$_btech];
  90. $fusion[$_btech][0] = array();
  91. }
  92. }
  93. else if (!isset($plugins[$cle_min_min][$_btech]) OR !$plugins[$cle_min_min][$_btech]) {
  94. // La balise technique est non vide dans le tableau de fusion mais vide dans la deuxieme balise plugin
  95. // On deplace cette balise dans le tableau fusion de sa compatibilite et on cree la cle commune vide
  96. $balise = $fusion[$_btech];
  97. unset($fusion[$_btech]);
  98. $fusion[$_btech][$plugins[$cle_min_max]['compatibilite']] = $balise;
  99. $fusion[$_btech][0] = array();
  100. }
  101. else {
  102. // Les deux tableaux contiennent une balise technique non vide : il faut fusionner cette balise technique !
  103. // On parcourt le premier tableau (fusion) en verifiant une egalite avec le deuxieme tableau
  104. foreach ($fusion[$_btech] as $_cle0 => $_balise0) {
  105. $balise_commune = false;
  106. foreach ($plugins[$cle_min_min][$_btech] as $_cle1 => $_balise1) {
  107. if (balise_identique($_balise0, $_balise1)) {
  108. // On classe cette balise dans le bloc commun (index 0) et on la supprime dans les
  109. // 2 tableaux en cours de comparaison
  110. unset($fusion[$_btech][$_cle0]);
  111. $fusion[$_btech][0][] = $_balise1;
  112. unset($plugins[$cle_min_min][$_btech][$_cle1]);
  113. $balise_commune = true;
  114. break;
  115. }
  116. }
  117. if (!$balise_commune) {
  118. $fusion[$_btech][$plugins[$cle_min_max]['compatibilite']][] = $_balise0;
  119. unset($fusion[$_btech][$_cle0]);
  120. }
  121. if (!isset($fusion[$_btech][0]))
  122. $fusion[$_btech][0] = array();
  123. }
  124. // On traite maintenant les balises restantes du deuxieme tableau
  125. if ($plugins[$cle_min_min][$_btech]) {
  126. foreach ($plugins[$cle_min_min][$_btech] as $_balise2) {
  127. $fusion[$_btech][$plugins[$cle_min_min]['compatibilite']][] = $_balise2;
  128. }
  129. }
  130. }
  131. }
  132. }
  133. return $fusion;
  134. }
  135. ?>