source: spip-zone/_plugins_/svp/plugins/preparer_sql_plugin.php @ 48411

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

On fait évoluer la fonction de normalisation du nom afin de pouvoir simplement s'adapter...
Pour l'instant seul la version française (ou autre si unique) est conservée.
La normalisation consistant à supprimer les numéros en bout de nom est désactivée temporairement.
Les tris multi nom deviennent des tris simples.

  • Property svn:eol-style set to native
File size: 10.1 KB
Line 
1<?php
2
3/***************************************************************************\
4 *  SPIP, Systeme de publication pour l'internet                           *
5 *                                                                         *
6 *  Copyright (c) 2001-2011                                                *
7 *  Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James  *
8 *                                                                         *
9 *  Ce programme est un logiciel libre distribue sous licence GNU/GPL.     *
10 *  Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne.   *
11\***************************************************************************/
12
13if (!defined('_ECRIRE_INC_VERSION')) return;
14
15function plugins_preparer_sql_plugin($plugin)
16{
17        $champs = array();
18        if (!$plugin)
19                return $champs;
20       
21        // On initialise les champs ne necessitant aucune transformation
22        $champs['categorie'] = $plugin['categorie'] ? $plugin['categorie'] : '';
23        $champs['etat'] = $plugin['etat'] ? $plugin['etat'] : '';
24        $champs['version'] = $plugin['version'] ? $plugin['version'] : '';
25        $champs['version_base'] = $plugin['version_base'] ? $plugin['version_base'] : '';
26
27        // Renommage de certains champs
28        $champs['logo'] = $plugin['icon'] ? $plugin['icon'] : '';
29        $champs['lien_doc'] = $plugin['lien'] ? normaliser_lien($plugin['lien']) : '';
30        // On passe le prefixe en lettres majuscules comme ce qui est fait dans SPIP
31        // Ainsi les valeurs dans la table spip_plugins coincideront avec celles de la meta plugin
32        $champs['prefixe'] = strtoupper($plugin['prefix']);
33
34        // Indicateurs d'etat numerique (pour simplifier la recherche des maj de STP)
35        static $num = array('stable'=>4, 'test'=>3, 'dev'=>2, 'experimental'=>1);
36        $champs['etatnum'] = isset($num[$plugin['etat']]) ? $num[$plugin['etat']] : 0;
37
38        // Tags : liste de mots-cles
39        $champs['tags'] = ($plugin['tags']) ? serialize($plugin['tags']) : '';
40       
41        // On passe en utf-8 avec le bon charset les champs pouvant contenir des entites html
42        $champs['description'] = unicode2charset(html2unicode($plugin['description']));
43       
44        // Traitement des auteurs, credits, licences et copyright
45        // -- on extrait les auteurs, licences et copyrights sous forme de tableaux
46        $plugin['auteur'] = unicode2charset(html2unicode($plugin['auteur']));
47        $auteurs = normaliser_auteur_licence($plugin['auteur'], 'auteur');
48        $plugin['licence'] = unicode2charset(html2unicode($plugin['licence']));
49        $licences = normaliser_auteur_licence($plugin['licence'], 'licence');
50        // -- on merge les tableaux recuperes dans auteur et licence
51        $champs['auteur'] = $champs['licence'] = $champs['copyright'] = '';
52        if ($t = array_merge($auteurs['auteur'], $licences['auteur']))
53                $champs['auteur'] = serialize($t);
54        if ($t = array_merge($auteurs['licence'], $licences['licence']))
55                $champs['licence'] = serialize($t);
56        if ($t = array_merge($auteurs['copyright'], $licences['copyright']))
57                $champs['copyright'] = serialize($t);
58       
59        // Extrait d'un nom et un slogan normalises
60        $plugin['slogan'] = unicode2charset(html2unicode($plugin['slogan']));
61        $plugin['nom'] = unicode2charset(html2unicode($plugin['nom']));
62        // Calcul *temporaire* de la nouvelles balise slogan si celle-ci n'est
63        // pas renseignee et de la balise nom. Ceci devrait etre temporaire jusqu'a la nouvelle ere
64        // glaciaire des plugins
65        // - Slogan     :       si vide alors on prend la premiere phrase de la description limitee a 255
66        $champs['slogan'] = (!$plugin['slogan']) ? normaliser_slogan($champs['description']) : $plugin['slogan'];
67        // - Nom :      on repere dans le nom du plugin un chiffre en fin de nom
68        //                      et on l'ampute de ce numero pour le normaliser
69        //                      et on passe tout en unicode avec le charset du site
70        $champs['nom'] = normaliser_nom($plugin['nom'], 'fr', false);
71
72        // Extraction de la compatibilite SPIP
73        $champs['compatibilite_spip'] = ($plugin['compatible']) ? $plugin['compatible'] : '';
74       
75        // Construction du tableau des dependances necessite, lib et utilise
76        $dependances['necessite'] = $plugin['necessite'];
77        $dependances['librairie'] = $plugin['lib'];
78        $dependances['utilise'] = $plugin['utilise'];
79        $champs['dependances'] = serialize($dependances);
80
81        // Champs non supportes par la DTD plugin et ne pouvant etre deduits d'autres balises
82        $champs['lien_demo'] = '';
83        $champs['lien_dev'] = '';
84        $champs['credit'] = '';
85
86        return $champs;
87}
88
89
90function normaliser_slogan($description) {
91        include_spip('inc/texte');
92
93        // On extrait les traductions de l'eventuel multi
94        // Si le nom n'est pas un multi alors le tableau renvoye est de la forme '' => 'nom'
95        $descriptions = extraire_trads(str_replace(array('<multi>', '</multi>'), array(), $description, $nbr_replace));
96        $multi = ($nbr_replace > 0) ? true : false;
97
98        // On boucle sur chaque multi ou sur la chaine elle-meme en extrayant le slogan
99        // dans les differentes langues
100        $slogan = '';
101        foreach ($descriptions as $_lang => $_descr) {
102                $_descr = trim($_descr);
103                if (!$_lang)
104                        $_lang = 'fr';
105                $nbr_matches = preg_match(',^(.+)[.!?\r\n\f],Um', $_descr, $matches);
106                $slogan .= (($multi) ? '[' . $_lang . ']' : '') . 
107                                        (($nbr_matches > 0) ? trim($matches[1]) : couper($_descr, 150, ''));
108        }
109
110        if ($slogan)
111                // On renvoie un nouveau slogan multi ou pas
112                $slogan = (($multi) ? '<multi>' : '') . $slogan . (($multi) ? '</multi>' : '');
113
114        return $slogan;
115}
116
117
118function normaliser_nom($nom, $langue='', $supprimer_numero=true) {
119        include_spip('inc/texte');
120
121        // On extrait les traductions de l'eventuel multi
122        // Si le nom n'est pas un multi alors le tableau renvoye est de la forme '' => 'nom'
123        $noms = extraire_trads(str_replace(array('<multi>', '</multi>'), array(), $nom, $nbr_replace));
124        $multi = ($nbr_replace > 0 AND !langue) ? true : false;
125
126        $nouveau_nom = '';
127        foreach ($noms as $_lang => $_nom) {
128                $_nom = trim($_nom);
129                if (!$_lang)
130                        $_lang = 'fr';
131                if ($supprimer_numero)
132                        $nbr_matches = preg_match(',(.+)(\s+[\d._]*)$,Um', $_nom, $matches);
133                else
134                        $nbr_matches = 0;
135                if (!$langue OR $langue == $_lang OR count($noms) == 1)
136                        $nouveau_nom .= (($multi) ? '[' . $_lang . ']' : '') . 
137                                                        (($nbr_matches > 0) ? trim($matches[1]) : $_nom);
138        }
139       
140        if ($nouveau_nom)
141                // On renvoie un nouveau nom multi ou pas sans la valeur de la branche
142                $nouveau_nom = (($multi) ? '<multi>' : '') . $nouveau_nom . (($multi) ? '</multi>' : '');
143               
144        return $nouveau_nom;
145}
146
147
148// Eliminer les textes superflus dans les liens (raccourcis [XXX->http...])
149// et normaliser l'esperluete pour eviter l'erreur d'entite indefinie
150function normaliser_lien($url) {
151        if (!preg_match(',https?://[^]\s]+,', $url, $r))
152                return '';
153        $url = str_replace('&', '&amp;', str_replace('&amp;', '&', $r[0]));
154        return $url;
155}
156
157
158// - elimination des multi (exclue dans la nouvelle version)
159// - transformation en attribut des balises A
160// - interpretation des balises BR et LI et de la virgule et du espace+tiret comme separateurs
161function normaliser_auteur_licence($texte, $balise) {
162
163        // On extrait le multi si besoin et on selectionne la traduction francaise
164        $t = normaliser_multi($texte);
165
166        $res = array('auteur' => array(), 'licence' => array(),'copyright' => array());
167        foreach(preg_split('@(<br */?>)|<li>|,|\s-|\n_*\s*|&amp;| & | et @', $t['fr']) as $v) {
168                // On detecte d'abord si le bloc texte en cours contient un eventuel copyright
169                // -- cela generera une balise copyright et non auteur
170                $copy = '';
171                if (preg_match('/(?:\&#169;|©|copyright|\(c\)|&copy;)[\s:]*([\d-]+)/i', $v, $r)) {
172                        $copy = trim($r[1]);
173                        $v = str_replace($r[0], '', $v);
174                        $res['copyright'][] = $copy;
175                }
176               
177                // On detecte ensuite un lien eventuel d'un auteur
178                // -- soit sous la forme d'une href d'une ancre
179                // -- soit sous la forme d'un raccourci SPIP
180                // Dans les deux cas on garde preferentiellement le contenu de l'ancre ou du raccourci
181                // si il existe
182                if (preg_match('@<a[^>]*href=(\W)(.*?)\1[^>]*>(.*?)</a>@', $v, $r)) {
183                        $href = $r[2];
184                        $v = str_replace($r[0], $r[3], $v);
185                } elseif (preg_match(_RACCOURCI_LIEN,$v, $r)) {
186                        $href = $r[4];
187                        $v = ($r[1]) ? $r[1] : str_replace($r[0], '', $v);
188                } else 
189                        $href = '';
190               
191                // On detecte ensuite un mail eventuel
192                if (preg_match('/([^\w\d._-]*)(([\w\d._-]+)@([\w\d.-]+))/', $v, $r)) {
193                        $mail = $r[2];
194                        $v = str_replace($r[2], '', $v);
195                        if (!$v) {
196                                // On considere alors que la premiere partie du mail peut faire office de nom d'auteur
197                                if (preg_match('/(([\w\d_-]+)[.]([\w\d_-]+))@/', $r[2], $s))
198                                        $v = ucfirst($s[2]) . ' ' . ucfirst($s[3]);
199                                else
200                                        $v = ucfirst($r[3]);
201                        }
202                } else 
203                        $mail = '';
204               
205                // On detecte aussi si le bloc texte en cours contient une eventuelle licence
206                // -- cela generera une balise licence et non auteur
207                //    cette heuristique n'est pas deterministe car la phrase de licence n'est pas connue
208                $licnom = $licurl ='';
209                if (preg_match('/(apache|mit|bsd|lgpl|gnu\/gpl|gpl\s*v*\d*)/i', $v, $r)) {
210                        $licnom = strtoupper(trim($r[1]));
211                        if (strtolower($licnom) == 'apache') {
212                                $licnom = 'Apache Licence, Version 2.0';
213                                $licurl = 'http://www.apache.org/licenses/LICENSE-2.0';
214                        }
215                        else if (strtolower($licnom) == 'mit')
216                                $licurl = 'http://opensource.org/licenses/mit-license.php';
217                        else if (strtolower($licnom) == 'bsd')
218                                $licurl = 'http://www.freebsd.org/copyright/license.html';
219                        else
220                                $licurl = ($licnom=='LGPL') ? 'http://www.gnu.org/licenses/lgpl-3.0.html' : 'http://www.gnu.org/licenses/gpl-3.0.html';
221                        $res['licence'][] = array('nom' => $licnom, 'url' => $licurl);
222                }
223               
224                // On finalise la balise auteur ou licence si on a pas trouve de licence prioritaire
225                $v = trim(textebrut($v));
226                if ((strlen($v) > 2) AND !$licnom)
227                        if ($balise == 'auteur')
228                                $res['auteur'][] = array('nom' => $v, 'url' => $href, 'mail' => $mail);
229                        else
230                                $res['licence'][] = array('nom' => $v, 'url' => $href);
231        }
232
233        return $res;
234}
235
236
237// Expanse les multi en un tableau de textes complets, un par langue
238function normaliser_multi($texte)
239{
240        if (!preg_match_all(_EXTRAIRE_MULTI, $texte, $regs, PREG_SET_ORDER))
241                return array('fr' => $texte);
242        $trads = array();
243        foreach ($regs as $reg) {
244                foreach (extraire_trads($reg[1]) as $k => $v) {
245                        // Si le code de langue n'est pas precise dans le multi c'est donc fr
246                        $lang = ($k) ? $k : 'fr';
247                        $trads[$lang]= str_replace($reg[0], $v, isset($trads[$k]) ? $trads[$k] : $texte);
248                }
249        }
250        return $trads;
251}
252
253?>
Note: See TracBrowser for help on using the repository browser.