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

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

Normalisation de l'url d'un auteur afin d'éviter l bug remonté par Sylvain sur NoSpam?

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