source: spip-zone/_plugins_/svp/plugins/fusion_plugin.php @ 54127

Last change on this file since 54127 was 54127, checked in by eric@…, 8 years ago

Mise au point finale de la fusion des balises techniques d'un plugin.xml contenant deux balises <plugin>.
Incrément de version car il faut maintenant modifier l'affichage des squelettes utilisant SVP

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