source: spip-zone/_plugins_/svp/inc/svp_outiller.php @ 51318

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

On transfère finalement la fonction entite2charset dans svp_intervaller qu'on renomme en svp_outiller...

  • Property svn:eol-style set to native
File size: 5.7 KB
Line 
1<?php
2
3if (!defined('_ECRIRE_INC_VERSION')) return;
4
5function fusionner_intervalles($intervalle_a, $intervalle_b) {
6
7        // On recupere les bornes de chaque intervalle
8        $borne_a = extraire_bornes($intervalle_a);
9        $borne_b = extraire_bornes($intervalle_b);
10
11        // On initialise la borne min de chaque intervalle a 1.9.0 inclus si vide
12        if (!$borne_a['min']['valeur']) {
13                $borne_a['min']['valeur'] = _SVP_VERSION_SPIP_MIN;
14                $borne_a['min']['incluse'] = true;
15        }
16        if (!$borne_b['min']['valeur']) {
17                $borne_b['min']['valeur'] = _SVP_VERSION_SPIP_MIN;
18                $borne_b['min']['incluse'] = true;
19        }
20       
21        // On calcul maintenant :
22        // -- la borne min de l'intervalle fusionne = min(min_a, min_b)
23        // -- suivant l'intervalle retenu la borne max est forcement dans l'autre intervalle = max(autre intervalle)
24        //    On presuppose evidemment que les intervalles ne sont pas disjoints et coherents entre eux
25        if (spip_version_compare($borne_a['min']['valeur'], $borne_b['min']['valeur'], '<=')) {
26                $bornes_fusionnees['min'] = $borne_a['min'];
27                $bornes_fusionnees['max'] = $borne_b['max'];
28        }
29        else {
30                $bornes_fusionnees['min'] = $borne_b['min'];
31                $bornes_fusionnees['max'] = $borne_a['max'];
32        }
33
34        return contruire_intervalle($bornes_fusionnees);
35}
36
37function extraire_bornes($intervalle, $initialiser=false) {
38        static $borne_vide = array('valeur' => '', 'incluse' => false);
39        static $borne_inf_init = array('valeur' => _SVP_VERSION_SPIP_MIN, 'incluse' => true);
40        static $borne_sup_init = array('valeur' => _SVP_VERSION_SPIP_MAX, 'incluse' => true);
41
42        if ($initialiser)
43                $bornes = array('min' => $borne_inf_init, 'max' => $borne_sup_init);
44        else
45                $bornes = array('min' => $borne_vide, 'max' => $borne_vide);
46
47        if ($intervalle
48        AND preg_match(',^[\[\(\]]([0-9.a-zRC\s\-]*)[;]([0-9.a-zRC\s\-\*]*)[\]\)\[]$,Uis', $intervalle, $matches)) {
49                if ($matches[1]) {
50                        $bornes['min']['valeur'] = trim($matches[1]);
51                        $bornes['min']['incluse'] = ($intervalle{0} == "[");
52                }
53                if ($matches[2]) {
54                        $bornes['max']['valeur'] = trim($matches[2]);
55                        $bornes['max']['incluse'] = (substr($intervalle,-1) == "]");
56                }
57        }
58
59       
60        return $bornes;
61}
62
63function contruire_intervalle($bornes, $dtd='paquet') {
64        return ($bornes['min']['incluse'] ? '[' : ($dtd=='paquet' ? ']' : '('))
65                        . $bornes['min']['valeur'] . ';' . $bornes['max']['valeur']
66                        . ($bornes['max']['incluse'] ? ']' : ($dtd=='paquet' ? '[' : ')'));
67}
68
69
70function compiler_branches_spip($intervalle) {
71        include_spip('plugins/installer');
72
73        global $infos_branches_spip;
74        $liste_branches_spip = array_keys($GLOBALS['infos_branches_spip']);
75               
76        $bornes = extraire_bornes($intervalle, false);
77        // On traite d'abord les cas ou l'intervalle est :
78        // - vide
79        // - non vide mais avec les deux bornes vides
80        // Dans ces cas la compatibilite est totale, on renvoie toutes les branches
81        if (!$intervalle OR (!$bornes['min']['valeur'] AND !$bornes['max']['valeur']))
82                return implode(',', $liste_branches_spip);
83
84        // On force l'initialisation des bornes et on les nettoie des suffixes d'etat
85        $bornes = extraire_bornes($intervalle, true);
86        $borne_inf = strtolower(preg_replace(',([0-9])[\s-.]?(dev|alpha|a|beta|b|rc|pl|p),i','\\1',$bornes['min']['valeur']));
87        $borne_sup = strtolower(preg_replace(',([0-9])[\s-.]?(dev|alpha|a|beta|b|rc|pl|p),i','\\1',$bornes['max']['valeur']));
88
89        // On determine les branches inf et sup issues du phrasage de l'intervalle
90        // -- on initialise la branche inf de l'intervalle que l'on va preciser ensuite
91        $t = explode('.', $borne_inf);
92        $branche_inf = $t[0] . '.' . $t[1];
93        // -- pour eviter toutes erreur fatale on verifie que la branche est bien dans la liste des possibles
94        // -- -> si non, on renvoie vide
95        if (!in_array($branche_inf, $liste_branches_spip))
96                return '';
97        // -- on complete la borne inf de l'intervalle de x.y en x.y.z et on determine la vraie branche
98        if (!$t[2]) {
99                if ($bornes['min']['incluse'])
100                        $borne_inf = $infos_branches_spip[$branche_inf][0];
101                else {
102                        $branche_inf = $liste_branches_spip[array_search($branche_inf, $liste_branches_spip)+1];
103                        $borne_inf = $infos_branches_spip[$branche_inf][0];
104                }
105        }
106       
107        // -- on initialise la branche sup de l'intervalle que l'on va preciser ensuite
108        // HACK !!!!! on traite le cas particulier 3.1.0 tant que 3.0.* n'est pas utilisable
109        $borne_sup = $borne_sup=='3.1.0' ? _SVP_VERSION_SPIP_MAX : $borne_sup;
110        $t = explode('.', $borne_sup);
111        $branche_sup = $t[0] . '.' . $t[1];
112        // -- pour eviter toutes erreur fatale on verifie que la branche est bien dans la liste des possibles
113        // -- -> si non, on renvoie vide
114        if (!in_array($branche_sup, $liste_branches_spip))
115                return '';
116        // -- on complete la borne sup de l'intervalle de x.y en x.y.z et on determine la vraie branche
117        if (!$t[2]) {
118                if ($bornes['max']['incluse'])
119                        $borne_sup = $infos_branches_spip[$branche_sup][1];
120                else {
121                        $branche_sup = $liste_branches_spip[array_search($branche_sup, $liste_branches_spip)-1];
122                        $borne_sup = $infos_branches_spip[$branche_sup][1];
123                }
124        }
125
126        // -- on verifie que les bornes sont bien dans l'ordre :
127        //    -> sinon on retourne la branche sup uniquement
128        if (spip_version_compare($borne_inf, $borne_sup, '>='))
129                return $branche_sup;
130
131        // A ce stade, on a un intervalle ferme en bornes ou en branches
132        // Il suffit de trouver les branches qui y sont incluses, sachant que les branches inf et sup
133        // le sont a coup sur maintenant
134        $index_inf = array_search($branche_inf, $liste_branches_spip);
135        $index_sup = array_search($branche_sup, $liste_branches_spip);
136        $liste = array();
137        for ($i = $index_inf; $i <= $index_sup; $i++) {
138                $liste[] = $liste_branches_spip[$i];
139        }
140
141        return implode(',', $liste);
142}
143
144
145function entite2charset($texte) {
146        if (!$texte) return;
147        include_spip('inc/charsets');
148        return unicode2charset(html_entity_decode(preg_replace('/&([lg]t;)/S', '&amp;\1', $texte), ENT_NOQUOTES, $GLOBALS['meta']['charset']));
149}
150
151?>
Note: See TracBrowser for help on using the repository browser.