svp_fonctions.php 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821
  1. <?php
  2. /**
  3. * Déclarations de fonctions
  4. *
  5. * @plugin SVP pour SPIP
  6. * @license GPL
  7. * @package SPIP\SVP\Fonctions
  8. **/
  9. /**
  10. * Retourne un texte expliquant l'intervalle de compatibilité avec un plugin ou SPIP
  11. *
  12. * Retourne par exemple "2.0 <= SPIP < 3.1"
  13. *
  14. * @param string $intervalle
  15. * L'intervalle tel que déclaré dans paquet.xml. Par exemple "[2.1;3.0.*]"
  16. * @param string $logiciel
  17. * Nom du plugin pour qui est cette intervalle
  18. * @return string
  19. * Texte expliquant l'intervalle
  20. **/
  21. function svp_afficher_intervalle($intervalle, $logiciel){
  22. if (!strlen($intervalle)) return '';
  23. if (!preg_match(',^[\[\(\]]([0-9.a-zRC\s\-]*)[;]([0-9.a-zRC\s\-\*]*)[\]\)\[]$,Uis',$intervalle,$regs)) return false;
  24. $mineure = $regs[1];
  25. $majeure = preg_replace(',\.99$,', '.*', $regs[2]);
  26. $mineure_inc = $intervalle{0}=="[";
  27. $majeure_inc = substr($intervalle,-1)=="]";
  28. if (strlen($mineure)){
  29. if (!strlen($majeure))
  30. $version = $logiciel . ($mineure_inc ? ' &ge; ' : ' &gt; ') . $mineure;
  31. else
  32. $version = $mineure . ($mineure_inc ? ' &le; ' : ' &lt; ') . $logiciel . ($majeure_inc ? ' &le; ' : ' &lt; ') . $majeure;
  33. }
  34. else {
  35. if (!strlen($majeure))
  36. $version = $logiciel;
  37. else
  38. $version = $logiciel . ($majeure_inc ? ' &le; ' : ' &lt; ') . $majeure;
  39. }
  40. return $version;
  41. }
  42. /**
  43. * Traduit un type d'état de plugin
  44. *
  45. * Si l'état n'existe pas, prendra par défaut 'developpement'
  46. *
  47. * @see plugin_etat_en_clair()
  48. * @param string $etat
  49. * Le type d'état (stable, test, ...)
  50. * @return string
  51. * Traduction de l'état dans la langue en cours
  52. **/
  53. function svp_afficher_etat($etat) {
  54. include_spip('plugins/afficher_plugin');
  55. return plugin_etat_en_clair($etat);
  56. }
  57. /**
  58. * Retourne un texte HTML présentant la liste des dépendances d'un plugin
  59. *
  60. * Des liens vers les plugins dépendants sont présents lorsque les plugins
  61. * en dépendance sont connus dans notre base.
  62. *
  63. * @param string $balise_serialisee
  64. * Informations des dépendances (tableau sérialisé) tel que stocké
  65. * en base dans la table spip_paquets
  66. * @param string $dependance
  67. * Type de dépendances à afficher (necessite ou utilise).
  68. * Une autre valeur indique qu'on demande la liste des librairies dépendantes.
  69. * @param string $sep
  70. * Séparateur entre les noms de dépendances
  71. * @param string $lien
  72. * Type de lien affecté au plugin référencé dans la base locale. Prend les valeurs :
  73. *
  74. * - local : le lien pointe vers la page publique du plugin sur le site lui-même. Il faut
  75. * donc que le site propose des pages publiques pour les plugins sinon une 404 sera affichée;
  76. * - pluginspip : le lien pointe vers la page du plugin sur le site de référence Plugins SPIP;
  77. * - non : aucun lien n'est affiché.
  78. * @return string
  79. * Texte informant des dépendances
  80. **/
  81. function svp_afficher_dependances($balise_serialisee, $dependance='necessite', $sep='<br />', $lien='local') {
  82. $texte = '';
  83. $t = unserialize($balise_serialisee);
  84. $dependances = $t[$dependance];
  85. if (is_array($dependances)) {
  86. ksort($dependances);
  87. foreach($dependances as $_compatibilite => $_dependance) {
  88. $compatibilite = ($_compatibilite !== 0)
  89. ? _T('svp:info_compatibilite_dependance', array('compatibilite' => svp_afficher_intervalle($_compatibilite, 'SPIP')))
  90. : '';
  91. if ($compatibilite)
  92. $texte .= ($texte ? str_repeat($sep, 2) : '') . $compatibilite;
  93. foreach ($_dependance as $_plugin) {
  94. if ($texte)
  95. $texte .= $sep;
  96. if (($dependance == 'necessite' ) OR ($dependance == 'utilise')) {
  97. if ($plugin = sql_fetsel('id_plugin, nom', 'spip_plugins', 'prefixe=' . sql_quote($_plugin['nom']))) {
  98. $nom = extraire_multi($plugin['nom']);
  99. if ($lien == 'non')
  100. $logiciel = $nom;
  101. else {
  102. $url = ($lien == 'local')
  103. ? generer_url_entite($plugin['id_plugin'], 'plugin')
  104. : "http://plugins.spip.net/{$_plugin['nom']}.html";
  105. $bulle = _T('svp:bulle_aller_plugin');
  106. $logiciel = '<a href="' . $url . '" title="' . $bulle . '">' . $nom . '</a>';
  107. }
  108. } else {
  109. // Cas ou le plugin n'est pas encore dans la base SVP.
  110. // On affiche son préfixe, cependant ce n'est pas un affichage devant perdurer
  111. $logiciel = $_plugin['nom'];
  112. }
  113. $intervalle = '';
  114. if (isset($_plugin['compatibilite'])) {
  115. $intervalle = svp_afficher_intervalle($_plugin['compatibilite'], $logiciel);
  116. }
  117. $texte .= ($intervalle) ? $intervalle : $logiciel;
  118. }
  119. else
  120. // On demande l'affichage des librairies
  121. $texte .= '<a href="' . $_plugin['lien'] . '" title="' . _T('svp:bulle_telecharger_librairie') . '">' . $_plugin['nom'] . '</a>';
  122. }
  123. }
  124. }
  125. return $texte;
  126. }
  127. /**
  128. * Teste si un plugin possède des dépendances
  129. *
  130. * @param string $balise_serialisee
  131. * Informations des dépendances (tableau sérialisé) tel que stocké
  132. * en base dans la table spip_paquets
  133. * @return bool
  134. * Le plugin possède t'il des dépendances ?
  135. **/
  136. function svp_dependances_existe($balise_serialisee) {
  137. $dependances = unserialize($balise_serialisee);
  138. foreach($dependances as $_dependance) {
  139. if ($_dependance)
  140. return true;
  141. }
  142. return false;
  143. }
  144. /**
  145. * Retourne un texte HTML présentant les crédits d'un plugin
  146. *
  147. * Des liens vers les crédits sont présents lorsqu'ils sont déclarés
  148. * dans le paquet.xml.
  149. *
  150. * @param string $balise_serialisee
  151. * Informations des crédits (tableau sérialisé) tel que stocké
  152. * en base dans la table spip_paquets
  153. * @param string $sep
  154. * Séparateur entre les différents crédits
  155. * @return string
  156. * Texte informant des crédits
  157. **/
  158. function svp_afficher_credits($balise_serialisee, $sep=', ') {
  159. $texte = '';
  160. $credits = unserialize($balise_serialisee);
  161. if (is_array($credits)) {
  162. foreach ($credits as $_credit) {
  163. if ($texte)
  164. $texte .= $sep;
  165. // Si le credit en cours n'est pas un array c'est donc un copyright
  166. $texte .=
  167. (!is_array($_credit))
  168. ? PtoBR(propre($_credit)) // propre pour les [lien->url] des auteurs de plugin.xml ...
  169. : ($_credit['url'] ? '<a href="' . $_credit['url'] . '">' : '') .
  170. $_credit['nom'] .
  171. ($_credit['url'] ? '</a>' : '');
  172. }
  173. }
  174. return $texte;
  175. }
  176. /**
  177. * Retourne un texte HTML présentant la liste des langues et traducteurs d'un plugin
  178. *
  179. * Des liens vers les traducteurs sont présents lorsqu'ils sont connus.
  180. *
  181. * @param array $langues
  182. * Tableau code de langue => traducteurs
  183. * @param string $sep
  184. * Séparateur entre les différentes langues
  185. * @return string
  186. * Texte informant des langues et traducteurs
  187. **/
  188. function svp_afficher_langues($langues, $sep=', '){
  189. $texte = '';
  190. if ($langues) {
  191. foreach ($langues as $_code => $_traducteurs) {
  192. if ($texte)
  193. $texte .= $sep;
  194. $traducteurs_langue = array();
  195. foreach ($_traducteurs as $_traducteur) {
  196. if (is_array($_traducteur))
  197. $traducteurs_langue[] =
  198. ($_traducteur['lien'] ? '<a href="' . $_traducteur['lien'] . '">' : '') .
  199. $_traducteur['nom'] .
  200. ($_traducteur['lien'] ? '</a>' : '');
  201. }
  202. $texte .= $_code . (count($traducteurs_langue) > 0 ? ' (' . implode(', ', $traducteurs_langue) . ')' : '');
  203. }
  204. }
  205. return $texte;
  206. }
  207. /**
  208. * Retourne un texte HTML présentant des statistiques d'un dépot
  209. *
  210. * Liste le nombre de plugins et de paquets d'un dépot
  211. * Indique aussi le nombre de dépots si l'on ne demande pas de dépot particulier.
  212. *
  213. * @param int $id_depot
  214. * Identifiant du dépot
  215. * @return string
  216. * Code HTML présentant les statistiques du dépot
  217. **/
  218. function svp_afficher_statistiques_globales($id_depot=0){
  219. $info = '';
  220. $total = svp_compter('depot', $id_depot);
  221. if (!$id_depot) {
  222. // Si on filtre pas sur un depot alors on affiche le nombre de depots
  223. $info = '<li id="stats-depot" class="item">
  224. <div class="unit size4of5">' . ucfirst(trim(_T('svp:info_depots_disponibles', array('total_depots'=>'')))) . '</div>
  225. <div class="unit size1of5 lastUnit">' . $total['depot'] . '</div>
  226. </li>';
  227. }
  228. // Compteur des plugins filtre ou pas par depot
  229. $info .= '<li id="stats-plugin" class="item">
  230. <div class="unit size4of5">' . ucfirst(trim(_T('svp:info_plugins_heberges', array('total_plugins'=>'')))) . '</div>
  231. <div class="unit size1of5 lastUnit">' . $total['plugin'] . '</div>
  232. </li>';
  233. // Compteur des paquets filtre ou pas par depot
  234. $info .= '<li id="stats-paquet" class="item">
  235. <div class="unit size4of5">' . ucfirst(trim(_T('svp:info_paquets_disponibles', array('total_paquets'=>'')))) . '</div>
  236. <div class="unit size1of5 lastUnit">' . $total['paquet'] . '</div>
  237. </li>';
  238. return $info;
  239. }
  240. /**
  241. * Retourne un texte indiquant un nombre total de paquets
  242. *
  243. * Calcule le nombre de paquets correspondant à certaines contraintes,
  244. * tel que l'appartenance à un certain dépot, une certaine catégorie
  245. * ou une certaine branche de SPIP et retourne une phrase traduite
  246. * tel que «78 paquets disponibles»
  247. *
  248. * @param int $id_depot
  249. * Identifiant du dépot
  250. * Zéro (par défaut) signifie ici : «dans tous les dépots distants»
  251. * (id_dépot>0) et non «dans le dépot local»
  252. * @param string $categorie
  253. * Type de catégorie (auteur, communication, date...)
  254. * @param string $compatible_spip
  255. * Numéro de branche de SPIP. (3.0, 2.1, ...)
  256. * @return string
  257. * Texte indiquant un nombre total de paquets
  258. **/
  259. function svp_compter_telechargements($id_depot=0, $categorie='', $compatible_spip=''){
  260. $total = svp_compter('paquet', $id_depot, $categorie, $compatible_spip);
  261. $info = _T('svp:info_paquets_disponibles', array('total_paquets'=>$total['paquet']));
  262. return $info;
  263. }
  264. /**
  265. * Retourne un texte indiquant un nombre total de contributions pour un dépot
  266. *
  267. * Calcule différents totaux pour un dépot donné et retourne un texte
  268. * de ces différents totaux. Les totaux correspondent par défaut aux
  269. * plugins et paquets, mais l'on peut demander le total des autres contributions
  270. * avec le second paramètre.
  271. *
  272. * @param int $id_depot
  273. * Identifiant du dépot
  274. * Zéro (par défaut) signifie ici : «dans tous les dépots distants»
  275. * (id_dépot>0) et non «dans le dépot local»
  276. * @param string $contrib
  277. * Type de total demandé ('plugin' ou autre)
  278. * Si 'plugin' : indique le nombre de plugins et de paquets du dépot
  279. * Si autre chose : indique le nombre des autres contributions, c'est
  280. * à dire des zips qui ne sont pas des plugins, comme certaines libraires ou
  281. * certains jeux de squelettes.
  282. * @return string
  283. * Texte indiquant certains totaux tel que nombre de plugins, nombre de paquets...
  284. **/
  285. function svp_compter_depots($id_depot, $contrib='plugin'){
  286. $info = '';
  287. $total = svp_compter('depot', $id_depot);
  288. if (!$id_depot) {
  289. $info = _T('svp:info_depots_disponibles', array('total_depots'=>$total['depot'])) . ', ' .
  290. _T('svp:info_plugins_heberges', array('total_plugins'=>$total['plugin'])) . ', ' .
  291. _T('svp:info_paquets_disponibles', array('total_paquets'=>$total['paquet']));
  292. }
  293. else {
  294. if ($contrib == 'plugin') {
  295. $info = _T('svp:info_plugins_heberges', array('total_plugins'=>$total['plugin'])) . ', ' .
  296. _T('svp:info_paquets_disponibles', array('total_paquets'=>$total['paquet']-$total['autre']));
  297. }
  298. else {
  299. $info = _T('svp:info_contributions_hebergees', array('total_autres'=>$total['autre']));
  300. }
  301. }
  302. return $info;
  303. }
  304. /**
  305. * Retourne un texte indiquant un nombre total de plugins
  306. *
  307. * Calcule le nombre de plugins correspondant à certaines contraintes,
  308. * tel que l'appartenance à un certain dépot, une certaine catégorie
  309. * ou une certaine branche de SPIP et retourne une phrase traduite
  310. * tel que «64 plugins disponibles»
  311. *
  312. * @param int $id_depot
  313. * Identifiant du dépot
  314. * Zéro (par défaut) signifie ici : «dans tous les dépots distants»
  315. * (id_dépot>0) et non «dans le dépot local»
  316. * @param string $categorie
  317. * Type de catégorie (auteur, communication, date...)
  318. * @param string $compatible_spip
  319. * Numéro de branche de SPIP. (3.0, 2.1, ...)
  320. * @return string
  321. * Texte indiquant un nombre total de paquets
  322. **/
  323. function svp_compter_plugins($id_depot=0, $categorie='', $compatible_spip='') {
  324. $total = svp_compter('plugin', $id_depot, $categorie, $compatible_spip);
  325. $info = _T('svp:info_plugins_disponibles', array('total_plugins'=>$total['plugin']));
  326. return $info;
  327. }
  328. /**
  329. * Compte le nombre de plugins, paquets ou autres contributions
  330. * en fonction de l'entité demandée et de contraintes
  331. *
  332. * Calcule, pour un type d'entité demandé (depot, plugin, paquet, catégorie)
  333. * leur nombre en fonction de certaines contraintes, tel que l'appartenance
  334. * à un certain dépot, une certaine catégorie ou une certaine branche de SPIP.
  335. *
  336. * Lorsque l'entité demandée est un dépot, le tableau des totaux possède,
  337. * en plus du nombre de dépots, le nombre de plugins et paquets.
  338. *
  339. * @note
  340. * Attention le critère de compatibilite SPIP pris en compte est uniquement
  341. * celui d'une branche SPIP
  342. *
  343. * @param string $entite
  344. * De quoi veut-on obtenir des comptes. Peut être 'depot', 'plugin',
  345. * 'paquet' ou 'categorie'
  346. * @param int $id_depot
  347. * Identifiant du dépot
  348. * Zéro (par défaut) signifie ici : «dans tous les dépots distants»
  349. * (id_dépot>0) et non «dans le dépot local»
  350. * @param string $categorie
  351. * Type de catégorie (auteur, communication, date...)
  352. * @param string $compatible_spip
  353. * Numéro de branche de SPIP. (3.0, 2.1, ...)
  354. * @return array
  355. * Couples (entite => nombre).
  356. **/
  357. function svp_compter($entite, $id_depot=0, $categorie='', $compatible_spip=''){
  358. $compteurs = array();
  359. $group_by = array();
  360. $where = array();
  361. if ($id_depot)
  362. $where[] = "t1.id_depot=" . sql_quote($id_depot);
  363. else
  364. $where[] = "t1.id_depot>0";
  365. if ($entite == 'plugin') {
  366. $from = 'spip_plugins AS t2, spip_depots_plugins AS t1';
  367. $where[] = "t1.id_plugin=t2.id_plugin";
  368. if ($categorie)
  369. $where[] = "t2.categorie=" . sql_quote($categorie);
  370. if ($compatible_spip) {
  371. $creer_where = charger_fonction('where_compatible_spip', 'inc');
  372. $where[] = $creer_where($compatible_spip, 't2', '>');
  373. }
  374. $compteurs['plugin'] = sql_count(sql_select('t2.id_plugin', $from, $where));
  375. }
  376. elseif ($entite == 'paquet') {
  377. if ($categorie) {
  378. $ids = sql_allfetsel('id_plugin', 'spip_plugins', 'categorie='.sql_quote($categorie));
  379. $ids = array_map('reset', $ids);
  380. $where[] = sql_in('t1.id_plugin', $ids);
  381. }
  382. if ($compatible_spip) {
  383. $creer_where = charger_fonction('where_compatible_spip', 'inc');
  384. $where[] = $creer_where($compatible_spip, 't1', '>');
  385. }
  386. $compteurs['paquet'] = sql_countsel('spip_paquets AS t1', $where);
  387. }
  388. elseif ($entite == 'depot') {
  389. $champs = array('COUNT(t1.id_depot) AS depot',
  390. 'SUM(t1.nbr_plugins) AS plugin',
  391. 'SUM(t1.nbr_paquets) AS paquet',
  392. 'SUM(t1.nbr_autres) AS autre');
  393. $compteurs = sql_fetsel($champs, 'spip_depots AS t1', $where);
  394. }
  395. elseif ($entite == 'categorie') {
  396. $from = array('spip_plugins AS t2');
  397. $where_depot = $where[0];
  398. $where = array();
  399. if ($id_depot) {
  400. $ids = sql_allfetsel('id_plugin', 'spip_depots_plugins AS t1', $where_depot);
  401. $ids = array_map('reset', $ids);
  402. $where[] = sql_in('t2.id_plugin', $ids);
  403. }
  404. if ($compatible_spip) {
  405. $creer_where = charger_fonction('where_compatible_spip', 'inc');
  406. $where[] = $creer_where($compatible_spip, 't2', '>');
  407. }
  408. if ($categorie)
  409. $where[] = "t2.categorie=" . sql_quote($categorie);
  410. else
  411. $group_by = array('t2.categorie');
  412. $compteurs['categorie'] = sql_countsel($from, $where, $group_by);
  413. }
  414. return $compteurs;
  415. }
  416. /**
  417. * Compile la balise #SVP_CATEGORIES
  418. *
  419. * Cette balise retourne un tableau listant chaque type de catégorie
  420. * en index, associé à sa traduction en valeur.
  421. *
  422. * Accepte 2 paramètres :
  423. * 1) le type du tri (ordre_cle ou ordre_alpha)
  424. * 2) une catégorie (dans ce cas, limite le tableau à cette seule catégorie si elle existe)
  425. *
  426. * @example
  427. * #SVP_CATEGORIES
  428. * #SVP_CATEGORIES{ordre_alpha}
  429. * #SVP_CATEGORIES{ordre_cle,auteur}
  430. *
  431. * @balise svp_categories
  432. * @see calcul_svp_categories()
  433. * @param Champ $p
  434. * Pile au niveau de la balise
  435. * @return Champ
  436. * Pile complétée par le code à générer
  437. **/
  438. function balise_SVP_CATEGORIES($p) {
  439. // tri, peut être 'ordre_cle' ou 'ordre_alpha'
  440. if (!$tri = interprete_argument_balise(1,$p)) {
  441. $tri = "'ordre_cle'";
  442. }
  443. // catégorie (pour n'en prendre qu'une au lieu de toutes)
  444. if (!$categorie = interprete_argument_balise(2,$p)) {
  445. $categorie = "''";
  446. }
  447. $p->code = 'calcul_svp_categories(' . $tri . ',' . $categorie . ')';
  448. return $p;
  449. }
  450. /**
  451. * Retourne un tableau listant chaque type de catégorie
  452. * en index, associé à sa traduction en valeur.
  453. *
  454. * @param string $tri
  455. * Type de tri (ordre_cle ou ordre_alpha)
  456. * @param string $categorie
  457. * Restreindre le tableau de retour à cette catégorie si elle existe
  458. * @return array
  459. * Couples (type de catégorie => Texte de la catégorie)
  460. **/
  461. function calcul_svp_categories($tri='ordre_cle', $categorie='') {
  462. $retour = array();
  463. include_spip('inc/svp_phraser'); // pour $GLOBALS['categories_plugin']
  464. $svp_categories = $GLOBALS['categories_plugin'];
  465. if (is_array($svp_categories)) {
  466. if (($categorie) AND in_array($categorie, $svp_categories))
  467. $retour[$categorie] = _T('svp:categorie_' . strtolower($categorie));
  468. else {
  469. if ($tri == 'ordre_alpha') {
  470. sort($svp_categories);
  471. // On positionne l'absence de categorie en fin du tableau
  472. $svp_categories[] = array_shift($svp_categories);
  473. }
  474. foreach ($svp_categories as $_alias)
  475. $retour[$_alias] = svp_traduire_categorie($_alias);
  476. }
  477. }
  478. return $retour;
  479. }
  480. /**
  481. * Compile la balise #SVP_BRANCHES_SPIP
  482. *
  483. * Cette balise retourne une liste des branches de SPIP
  484. *
  485. * Avec un paramètre indiquant une branche, la balise retourne
  486. * une liste des bornes mini et maxi de cette branche.
  487. *
  488. * @example
  489. * #SVP_BRANCHES_SPIP : array('1.9', '2.0', '2.1', ....)
  490. * #SVP_BRANCHES_SPIP{3.0} : array('3.0.0', '3.0.99')
  491. *
  492. * @balise svp_branches_spip
  493. * @see calcul_svp_branches_spip()
  494. *
  495. * @param Champ $p
  496. * Pile au niveau de la balise
  497. * @return Champ
  498. * Pile complétée par le code à générer
  499. **/
  500. function balise_SVP_BRANCHES_SPIP($p) {
  501. // nom d'une branche en premier argument
  502. if (!$branche = interprete_argument_balise(1,$p)) {
  503. $branche = "''";
  504. }
  505. $p->code = 'calcul_svp_branches_spip('.$branche.')';
  506. return $p;
  507. }
  508. /**
  509. * Retourne une liste des branches de SPIP, ou les bornes mini et maxi
  510. * d'une branche donnée
  511. *
  512. * @param string $branche
  513. * Branche dont on veut récupérer les bornes mini et maxi
  514. * @return array
  515. * Liste des branches array('1.9', '2.0', '2.1', ....)
  516. * ou liste mini et maxi d'une branche array('3.0.0', '3.0.99')
  517. **/
  518. function calcul_svp_branches_spip($branche) {
  519. $retour = array();
  520. include_spip('inc/svp_outiller'); // pour $GLOBALS['infos_branches_spip']
  521. $svp_branches = $GLOBALS['infos_branches_spip'];
  522. if (is_array($svp_branches)) {
  523. if (($branche) AND in_array($branche, $svp_branches))
  524. // On renvoie les bornes inf et sup de la branche specifiee
  525. $retour = $svp_branches[$branche];
  526. else {
  527. // On renvoie uniquement les numeros de branches
  528. $retour = array_keys($svp_branches);
  529. }
  530. }
  531. return $retour;
  532. }
  533. /**
  534. * Traduit un type de catégorie de plugin
  535. *
  536. * @param string $alias
  537. * Type de catégorie (auteur, communication, date...)
  538. * @return string
  539. * Titre complet et traduit de la catégorie
  540. **/
  541. function svp_traduire_categorie($alias) {
  542. $traduction = '';
  543. if ($alias) {
  544. $traduction = _T('svp:categorie_' . strtolower($alias));
  545. }
  546. return $traduction;
  547. }
  548. /**
  549. * Traduit un type de dépot de plugin
  550. *
  551. * @param string $type
  552. * Type de dépot (svn, git, manuel)
  553. * @return string
  554. * Titre complet et traduit du type de dépot
  555. **/
  556. function svp_traduire_type_depot($type) {
  557. $traduction = '';
  558. if ($type) {
  559. $traduction = _T('svp:info_type_depot_' . $type);
  560. }
  561. return $traduction;
  562. }
  563. /**
  564. * Calcule l'url exacte d'un lien de démo en fonction de son écriture
  565. *
  566. * @param string $url_demo
  567. * URL de démonstration telle que saisie dans le paquet.xml
  568. * @param boolean $url_absolue
  569. * Indique que seules les url absolues doivent être retournées par la fonction.
  570. * Tous les autres types d'url renvoient une chaine vide
  571. * @return string
  572. * URL calculée en fonction de l'URL d'entrée
  573. **/
  574. function svp_calculer_url_demo($url_demo, $url_absolue=false) {
  575. $url_calculee = '';
  576. $url_demo = trim($url_demo);
  577. if (strlen($url_demo) > 0) {
  578. $url_elements = @parse_url($url_demo);
  579. if (isset($url_elements['scheme']) AND $url_elements['scheme']) {
  580. // Cas 1 : http://xxxx. C'est donc une url absolue que l'on conserve telle qu'elle.
  581. $url_calculee = $url_demo;
  582. }
  583. else {
  584. if (!$url_absolue) {
  585. if (isset($url_elements['query']) AND $url_elements['query']) {
  586. // Cas 2 : ?exec=xxx ou ?page=yyy. C'est donc une url relative que l'on transforme
  587. // en url absolue privée ou publique en fonction de la query.
  588. $egal = strpos($url_elements['query'], '=');
  589. $page = substr($url_elements['query'], $egal+1, strlen($url_elements['query']) - $egal - 1);
  590. if (strpos($url_elements['query'], 'exec=') !== false) {
  591. $url_calculee = generer_url_ecrire($page);
  592. }
  593. else {
  594. $url_calculee = generer_url_public($page);
  595. }
  596. }
  597. elseif (isset($url_elements['path']) AND $url_elements['path']) {
  598. // Cas 3 : xxx/yyy. C'est donc une url relative que l'on transforme
  599. $url_calculee = generer_url_public($url_demo);
  600. }
  601. }
  602. }
  603. }
  604. return $url_calculee;
  605. }
  606. /**
  607. * Critère de compatibilité avec une version précise ou une branche de SPIP.
  608. *
  609. * Fonctionne sur les tables spip_paquets et spip_plugins
  610. *
  611. * Si aucune valeur n'est explicité dans le critère, tous les enregistrements
  612. * sont retournés.
  613. *
  614. * Le ! (NOT) fonctionne sur le critère BRANCHE
  615. *
  616. * @critere compatible_spip
  617. * @example
  618. * {compatible_spip}
  619. * {compatible_spip 2.0.8} ou {compatible_spip 1.9}
  620. * {compatible_spip #ENV{vers}} ou {compatible_spip #ENV{vers, 1.9.2}}
  621. * {compatible_spip #GET{vers}} ou {compatible_spip #GET{vers, 2.1}}
  622. *
  623. * @param string $idb Identifiant de la boucle
  624. * @param array $boucles AST du squelette
  625. * @param Critere $crit Paramètres du critère dans cette boucle
  626. * @return void
  627. */
  628. function critere_compatible_spip_dist($idb, &$boucles, $crit) {
  629. $boucle = &$boucles[$idb];
  630. $table = $boucle->id_table;
  631. // Si on utilise ! la fonction LOCATE doit retourner 0.
  632. // -> utilise uniquement avec le critere BRANCHE
  633. $op = ($crit->not == '!') ? '=' : '>';
  634. $boucle->hash .= '
  635. // COMPATIBILITE SPIP
  636. $creer_where = charger_fonction(\'where_compatible_spip\', \'inc\');';
  637. // version/branche explicite dans l'appel du critere
  638. if (isset($crit->param[0][0])) {
  639. $version = calculer_liste(array($crit->param[0][0]), array(), $boucles, $boucle->id_parent);
  640. $boucle->hash .= '
  641. $where = $creer_where('.$version.', \''.$table.'\', \''.$op.'\');
  642. ';
  643. }
  644. // pas de version/branche explicite dans l'appel du critere
  645. // on regarde si elle est dans le contexte
  646. else {
  647. $boucle->hash .= '
  648. $version = isset($Pile[0][\'compatible_spip\']) ? $Pile[0][\'compatible_spip\'] : \'\';
  649. $where = $creer_where($version, \''.$table.'\', \''.$op.'\');
  650. ';
  651. }
  652. $boucle->where[] = '$where';
  653. }
  654. /**
  655. * Retourne la liste des plugins trouvés par une recherche
  656. *
  657. * @filtre construire_recherche_plugins
  658. * @param string $phrase
  659. * Texte de la recherche
  660. * @param string $categorie
  661. * Type de catégorie de plugin (auteur, date...)
  662. * @param string $etat
  663. * État de plugin (stable, test...)
  664. * @param string|int $depot
  665. * Identifiant de dépot
  666. * @param bool|string $afficher_exclusions
  667. * Afficher aussi les paquets déjà installés (true ou 'oui')
  668. * ou ceux qui ne le sont pas (false) ?
  669. * @param bool|string $afficher_doublons
  670. * Afficher toutes les versions de paquet (true ou 'oui')
  671. * ou seulement la plus récente (false) ?
  672. * @return array
  673. * Tableau classé par pertinence de résultat
  674. * - 'prefixe' => tableau de description du paquet (si pas de doublons demandé)
  675. * - n => tableau de descriptions du paquet (si doublons autorisés)
  676. **/
  677. function filtre_construire_recherche_plugins($phrase='', $categorie='', $etat='', $depot='', $afficher_exclusions=true, $afficher_doublons=false) {
  678. // On traite les paramètres d'affichage
  679. $afficher_exclusions = ($afficher_exclusions == 'oui') ? true : false;
  680. $afficher_doublons = ($afficher_doublons == 'oui') ? true : false;
  681. $tri = ($phrase) ? 'score' : 'nom';
  682. $version_spip = $GLOBALS['spip_version_branche'].".".$GLOBALS['spip_version_code'];
  683. // On recupere la liste des paquets:
  684. // - sans doublons, ie on ne garde que la version la plus recente
  685. // - correspondant a ces criteres
  686. // - compatible avec la version SPIP installee sur le site
  687. // - et n'etant pas deja installes (ces paquets peuvent toutefois etre affiches)
  688. // tries par nom ou score
  689. include_spip('inc/svp_rechercher');
  690. $plugins = svp_rechercher_plugins_spip(
  691. $phrase, $categorie, $etat, $depot, $version_spip,
  692. svp_lister_plugins_installes(), $afficher_exclusions, $afficher_doublons, $tri);
  693. return $plugins;
  694. }
  695. /**
  696. * Retourne le nombre d'heures entre chaque actualisation
  697. * si le cron est activé.
  698. *
  699. * @return int
  700. * Nombre d'heures (sinon 0)
  701. **/
  702. function filtre_svp_periode_actualisation_depots() {
  703. include_spip('genie/svp_taches_generales_cron');
  704. return _SVP_CRON_ACTUALISATION_DEPOTS ? _SVP_PERIODE_ACTUALISATION_DEPOTS : 0;
  705. }
  706. /**
  707. * Retourne 'x.y.z' à partir de '00x.00y.00z'
  708. *
  709. * Retourne la chaine de la version x.y.z sous sa forme initiale,
  710. * sans remplissage à gauche avec des 0.
  711. *
  712. * @see normaliser_version()
  713. * @param string $version_normalisee
  714. * Numéro de version normalisée
  715. * @return string
  716. * Numéro de version dénormalisée
  717. **/
  718. function denormaliser_version($version_normalisee='') {
  719. $version = '';
  720. if ($version_normalisee) {
  721. $v = explode('.', $version_normalisee);
  722. foreach($v as $_nombre) {
  723. $n = ltrim($_nombre, '0');
  724. // On traite les cas du type 001.002.000-dev qui doivent etre transformes en 1.2.0-dev.
  725. // Etant donne que la denormalisation est toujours effectuee sur une version normalisee on sait
  726. // que le suffixe commence toujours pas '-'
  727. $vn[] = ((strlen($n)>0) AND substr($n, 0, 1)!='-' ) ? $n : "0$n";
  728. }
  729. $version = implode('.', $vn);
  730. }
  731. return $version;
  732. }
  733. /**
  734. * Teste l'utilisation du répertoire auto des plugins.
  735. *
  736. * Ce répertoire permet de télécharger dedans des plugins
  737. * lorsqu'il est présent.
  738. *
  739. * @return bool
  740. * Le répertoire de chargement des plugins auto est-il présent
  741. * et utilisable ?
  742. */
  743. function test_plugins_auto() {
  744. static $test = null;
  745. if (is_null($test)) {
  746. include_spip('inc/plugin'); // pour _DIR_PLUGINS_AUTO
  747. $test = (defined('_DIR_PLUGINS_AUTO') and _DIR_PLUGINS_AUTO and is_writable(_DIR_PLUGINS_AUTO));
  748. }
  749. return $test;
  750. }
  751. ?>