PageRenderTime 26ms CodeModel.GetById 18ms RepoModel.GetById 0ms app.codeStats 0ms

/_core_/tags/spip-3.0.3/plugins/svp/plugins/preparer_sql_plugin.php

https://bitbucket.org/pombredanne/spip-zone-treemap
PHP | 218 lines | 139 code | 35 blank | 44 comment | 27 complexity | da277413d640c98b9f3c342c1cf442f1 MD5 | raw file
  1. <?php
  2. if (!defined('_ECRIRE_INC_VERSION')) return;
  3. function plugins_preparer_sql_plugin($plugin)
  4. {
  5. include_spip('inc/svp_outiller');
  6. $champs = array();
  7. if (!$plugin)
  8. return $champs;
  9. // On initialise les champs ne necessitant aucune transformation
  10. $champs['categorie'] = $plugin['categorie'] ? $plugin['categorie'] : '';
  11. $champs['etat'] = $plugin['etat'] ? $plugin['etat'] : '';
  12. $champs['version'] = $plugin['version'] ? normaliser_version($plugin['version']) : '';
  13. $champs['version_base'] = $plugin['schema'] ? $plugin['schema'] : '';
  14. // Renommage de certains champs
  15. $champs['logo'] = $plugin['logo'] ? $plugin['logo'] : '';
  16. $champs['lien_doc'] = $plugin['documentation'] ? normaliser_lien($plugin['documentation']) : '';
  17. // On passe le prefixe en lettres majuscules comme ce qui est fait dans SPIP
  18. // Ainsi les valeurs dans la table spip_plugins coincideront avec celles de la meta plugin
  19. $champs['prefixe'] = strtoupper($plugin['prefix']);
  20. // Indicateurs d'etat numerique (pour simplifier la recherche des maj de STP)
  21. static $num = array('stable'=>4, 'test'=>3, 'dev'=>2, 'experimental'=>1);
  22. $champs['etatnum'] = isset($num[$plugin['etat']]) ? $num[$plugin['etat']] : 0;
  23. // Tags : liste de mots-cles
  24. $champs['tags'] = ($plugin['tags']) ? serialize($plugin['tags']) : '';
  25. // On passe en utf-8 avec le bon charset les champs pouvant contenir des entites html
  26. $champs['description'] = entite2charset($plugin['description']);
  27. // Traitement des auteurs, credits, licences et copyright
  28. // -- on extrait les auteurs, licences et copyrights sous forme de tableaux
  29. // -- depuis le commit 18294 du core la balise auteur est renvoyee sous forme de tableau mais
  30. // contient toujours qu'un seul index
  31. $balise_auteur = entite2charset($plugin['auteur'][0]);
  32. $auteurs = normaliser_auteur_licence($balise_auteur, 'auteur');
  33. $balise_licence = entite2charset($plugin['licence'][0]);
  34. $licences = normaliser_auteur_licence($balise_licence, 'licence');
  35. // -- on merge les tableaux recuperes dans auteur et licence
  36. $champs['auteur'] = $champs['licence'] = $champs['copyright'] = '';
  37. if ($t = array_merge($auteurs['auteur'], $licences['auteur']))
  38. $champs['auteur'] = serialize($t);
  39. if ($t = array_merge($auteurs['licence'], $licences['licence']))
  40. $champs['licence'] = serialize($t);
  41. if ($t = array_merge($auteurs['copyright'], $licences['copyright']))
  42. $champs['copyright'] = serialize($t);
  43. // Extrait d'un nom et un slogan normalises
  44. // Slogan : si vide on ne fait plus rien de special, on traitera ça a l'affichage
  45. $champs['slogan'] = $plugin['slogan'] ? entite2charset($plugin['slogan']) : '';
  46. // Nom : on repere dans le nom du plugin un chiffre en fin de nom
  47. // et on l'ampute de ce numero pour le normaliser
  48. // et on passe tout en unicode avec le charset du site
  49. $champs['nom'] = trim(entite2charset($plugin['nom']));
  50. // Extraction de la compatibilite SPIP et construction de la liste des branches spip supportees
  51. $champs['compatibilite_spip'] = ($plugin['compatibilite']) ? $plugin['compatibilite'] : '';
  52. $champs['branches_spip'] = ($plugin['compatibilite']) ? compiler_branches_spip($plugin['compatibilite']) : '';
  53. // Construction du tableau des dependances necessite, lib et utilise
  54. $dependances['necessite'] = $plugin['necessite'];
  55. $dependances['librairie'] = $plugin['lib'];
  56. $dependances['utilise'] = $plugin['utilise'];
  57. $champs['dependances'] = serialize($dependances);
  58. // Champs non supportes par la DTD plugin et ne pouvant etre deduits d'autres balises
  59. $champs['lien_demo'] = '';
  60. $champs['lien_dev'] = '';
  61. $champs['credit'] = '';
  62. return $champs;
  63. }
  64. function normaliser_nom($nom, $langue='', $supprimer_numero=true) {
  65. include_spip('inc/texte');
  66. // On extrait les traductions de l'eventuel multi
  67. // Si le nom n'est pas un multi alors le tableau renvoye est de la forme '' => 'nom'
  68. $noms = extraire_trads(str_replace(array('<multi>', '</multi>'), array(), $nom, $nbr_replace));
  69. $multi = ($nbr_replace > 0 AND !$langue) ? true : false;
  70. $nouveau_nom = '';
  71. foreach ($noms as $_lang => $_nom) {
  72. $_nom = trim($_nom);
  73. if (!$_lang)
  74. $_lang = 'fr';
  75. if ($supprimer_numero)
  76. $nbr_matches = preg_match(',(.+)(\s+[\d._]*)$,Um', $_nom, $matches);
  77. else
  78. $nbr_matches = 0;
  79. if (!$langue OR $langue == $_lang OR count($noms) == 1)
  80. $nouveau_nom .= (($multi) ? '[' . $_lang . ']' : '') .
  81. (($nbr_matches > 0) ? trim($matches[1]) : $_nom);
  82. }
  83. if ($nouveau_nom)
  84. // On renvoie un nouveau nom multi ou pas sans la valeur de la branche
  85. $nouveau_nom = (($multi) ? '<multi>' : '') . $nouveau_nom . (($multi) ? '</multi>' : '');
  86. return $nouveau_nom;
  87. }
  88. // Eliminer les textes superflus dans les liens (raccourcis [XXX->http...])
  89. // et normaliser l'esperluete pour eviter l'erreur d'entite indefinie
  90. function normaliser_lien($url) {
  91. if (!preg_match(',https?://[^]\s]+,', $url, $r))
  92. return '';
  93. $url = str_replace('&', '&amp;', str_replace('&amp;', '&', $r[0]));
  94. return $url;
  95. }
  96. // - elimination des multi (exclue dans la nouvelle version)
  97. // - transformation en attribut des balises A
  98. // - interpretation des balises BR et LI et de la virgule et du espace+tiret comme separateurs
  99. function normaliser_auteur_licence($texte, $balise) {
  100. include_spip('inc/filtres');
  101. include_spip('inc/lien');
  102. include_spip('inc/svp_outiller');
  103. // On extrait le multi si besoin et on selectionne la traduction francaise
  104. $t = normaliser_multi($texte);
  105. $res = array('auteur' => array(), 'licence' => array(),'copyright' => array());
  106. foreach(preg_split('@(<br */?>)|<li>|,|\s-|\n_*\s*|&amp;| & | et @', $t['fr']) as $v) {
  107. // On detecte d'abord si le bloc texte en cours contient un eventuel copyright
  108. // -- cela generera une balise copyright et non auteur
  109. $copy = '';
  110. if (preg_match('/(?:\&#169;|©|copyright|\(c\)|&copy;)[\s:]*([\d-]+)/i', $v, $r)) {
  111. $copy = trim($r[1]);
  112. $v = str_replace($r[0], '', $v);
  113. $res['copyright'][] = $copy;
  114. }
  115. // On detecte ensuite un lien eventuel d'un auteur
  116. // -- soit sous la forme d'une href d'une ancre
  117. // -- soit sous la forme d'un raccourci SPIP
  118. // Dans les deux cas on garde preferentiellement le contenu de l'ancre ou du raccourci
  119. // si il existe
  120. $href = $mail = '';
  121. if (preg_match('@<a[^>]*href=(\W)(.*?)\1[^>]*>(.*?)</a>@', $v, $r)) {
  122. $href = $r[2];
  123. $v = str_replace($r[0], $r[3], $v);
  124. }
  125. elseif (preg_match(_RACCOURCI_LIEN,$v, $r)) {
  126. if (preg_match('/([^\w\d._-]*)(([\w\d._-]+)@([\w\d.-]+))/', $r[4], $m)) {
  127. $mail = $r[4];
  128. }
  129. else {
  130. $href = $r[4];
  131. }
  132. $v = ($r[1]) ? $r[1] : str_replace($r[0], '', $v);
  133. } else
  134. $href = '';
  135. // On detecte ensuite un mail eventuel
  136. if (!$mail AND preg_match('/([^\w\d._-]*)(([\w\d._-]+)@([\w\d.-]+))/', $v, $r)) {
  137. $mail = $r[2];
  138. $v = str_replace($r[2], '', $v);
  139. if (!$v) {
  140. // On considere alors que la premiere partie du mail peut faire office de nom d'auteur
  141. if (preg_match('/(([\w\d_-]+)[.]([\w\d_-]+))@/', $r[2], $s))
  142. $v = ucfirst($s[2]) . ' ' . ucfirst($s[3]);
  143. else
  144. $v = ucfirst($r[3]);
  145. }
  146. }
  147. // On detecte aussi si le bloc texte en cours contient une eventuelle licence
  148. // -- cela generera une balise licence et non auteur
  149. // cette heuristique n'est pas deterministe car la phrase de licence n'est pas connue
  150. $licence = array();
  151. if (preg_match('/\b((gnu|free|creative\s+common|cc)*[\/|\s|-]*(apache|lgpl|agpl|gpl|fdl|mit|bsd|art\s+|attribution|by)(\s+licence|\-sharealike|-nc-nd|-nc-sa|-sa|-nc|-nd)*\s*v*(\d*[\.\d+]*))\b/i', $v, $r)) {
  152. if ($licence = definir_licence($r[2], $r[3], $r[4], $r[5])) {
  153. $res['licence'][] = $licence;
  154. }
  155. }
  156. // On finalise la balise auteur ou licence si on a pas trouve de licence prioritaire
  157. if ($href)
  158. $href = !preg_match(',https?://,', $href, $matches) ? "http://" . $href : $href;
  159. $v = trim(textebrut($v));
  160. if ((strlen($v) > 2) AND !$licence)
  161. if ($balise == 'auteur')
  162. $res['auteur'][] = array('nom' => $v, 'url' => $href, 'mail' => $mail);
  163. else
  164. $res['licence'][] = array('nom' => $v, 'url' => $href);
  165. }
  166. return $res;
  167. }
  168. // Expanse les multi en un tableau de textes complets, un par langue
  169. function normaliser_multi($texte) {
  170. include_spip('inc/filtres');
  171. if (!preg_match_all(_EXTRAIRE_MULTI, $texte, $regs, PREG_SET_ORDER))
  172. return array('fr' => $texte);
  173. $trads = array();
  174. foreach ($regs as $reg) {
  175. foreach (extraire_trads($reg[1]) as $k => $v) {
  176. // Si le code de langue n'est pas precise dans le multi c'est donc fr
  177. $lang = ($k) ? $k : 'fr';
  178. $trads[$lang]= str_replace($reg[0], $v, isset($trads[$k]) ? $trads[$k] : $texte);
  179. }
  180. }
  181. return $trads;
  182. }
  183. ?>