source: spip-zone/_squelettes_/MiniGriSpip/spip19/MGS_1.6/mes_fonctions.php @ 103869

Last change on this file since 103869 was 103869, checked in by spip.franck@…, 7 years ago

En finir une fois pour toute avec spip-contrib car maintenant, c'est contrib.spip

  • Property svn:executable set to *
File size: 18.4 KB
Line 
1<?php
2
3// MiniGriSpip 1.6.0 - 2007 (c) FredoMkb
4
5
6function nombre_articles_rubrique($id_rubrique) {
7// Fonction pour retourner le nombre d'articles publies existants dans une rubrique ($id_rubrique)
8       
9        global $table_prefix; // Pour pouvoir utiliser des prefixes personnalises autres que "spip"
10        $requete = mysql_query("SELECT id_article FROM ".$table_prefix."_articles WHERE id_rubrique=$id_rubrique AND statut='publie'");
11        $nbr = mysql_num_rows($requete);
12        mysql_free_result($requete);
13        return $nbr;
14}
15
16function numero_message_forum_article($id_article,$id_forum) {
17// Fonction pour retourner le numero incremental d'un message du forum ($id_forum) d'un article ($id_article) lors d'une reponse
18       
19        global $table_prefix; // Pour pouvoir utiliser des prefixes personnalises autres que "spip"
20        $requete = mysql_query("SELECT id_forum FROM ".$table_prefix."_forum WHERE id_article=$id_article AND id_forum<=$id_forum AND statut='publie'");
21        $nbr = mysql_num_rows($requete);
22        mysql_free_result($requete);
23        return $nbr;
24}
25
26function nombre_articles_auteur($id_auteur) {
27// Fonction pour retourner le nombre d'articles rediges par un auteur ($id_auteur)
28       
29        global $table_prefix; // Pour pouvoir utiliser des prefixes personnalises autres que "spip"
30        $requete = mysql_query("SELECT id_article FROM ".$table_prefix."_auteurs_articles WHERE id_auteur=$id_auteur");
31        $nbr = mysql_num_rows($requete);
32        mysql_free_result($requete);
33        return $nbr;
34}
35
36function statut_article($id_article) {
37// Fonction pour retourner le "statut" d'un article ($id_article) soit ('prepa', 'prop', 'publie', 'refuse', 'poubelle')
38       
39        global $table_prefix; // Pour pouvoir utiliser des prefixes personnalises autres que "spip"
40        $requete = mysql_query("SELECT statut FROM ".$table_prefix."_articles WHERE id_article=$id_article");
41        $statuts = mysql_fetch_assoc($requete);
42        mysql_free_result($requete);
43        return $statuts[statut];
44}
45
46function nombre_articles_publies_auteur($id_auteur) {
47// Fonction pour retourner le nombre d'articles publies par un auteur ($id_auteur)
48       
49        global $table_prefix; // Pour pouvoir utiliser des prefixes personnalises autres que "spip"
50        $articles = array();
51        $requete = mysql_query("SELECT id_article FROM ".$table_prefix."_auteurs_articles WHERE id_auteur=$id_auteur");
52        while ($ligne = mysql_fetch_assoc($requete)) array_push($articles,$ligne);
53        mysql_free_result($requete);
54        $nbr = 0;
55        foreach ($articles as $val) {
56                $statut = statut_article($val[id_article]);
57                if ($statut == 'publie') {$nbr += 1;};
58        }
59        return $nbr;
60}
61
62function asciihtml($textHtml) {
63// Fonction pour retourner le texte Html fourni ($textHtml) converti en codes Ascii Html ($asciiHtml).
64// Exemple d'utilisation : [(#TEXT|asciihtml)]
65// Petite adaptation d'un code issu d'une contribution sur Spip'Contrib proposee par Jean Luc Girard et Coyote, merci a eux.
66// Voir : <https://contrib.spip.net/Crypter-une-adresse-email>
67
68        $asciiHtml = '';
69        for ($i = 0; $i < strlen($textHtml); $i++) {
70          $asciiHtml .= '&#'.ord($textHtml[$i]).';';
71        }
72      return $asciiHtml;
73}
74
75function fileofurl($theUrl) {
76// Fonction pour retourner le nom du document pointe par une adresse Url.
77        $docNomList = explode("/", $theUrl);
78        $docNom = $docNomList[sizeof($docNomList)-1];
79        return $docNom;
80}
81
82
83function nombre_publications_date($dateStart,$dateEnd) {
84// Fonction pour retourner le nombre d'articles, de breves et commentaires publies existants dans une date donnee ($date)
85       
86        global $table_prefix; // Pour pouvoir utiliser des prefixes personnalises autres que "spip"
87        $requete = mysql_query("SELECT * FROM ".$table_prefix."_articles WHERE date>='$dateStart' AND date<'$dateEnd' AND statut='publie'");
88        $nbr_articles = mysql_num_rows($requete);
89        $requete = mysql_query("SELECT * FROM ".$table_prefix."_breves WHERE date_heure>='$dateStart' AND date_heure<'$dateEnd' AND statut='publie'");
90        $nbr_breves = mysql_num_rows($requete);
91        $requete = mysql_query("SELECT * FROM ".$table_prefix."_forum WHERE date_heure>='$dateStart' AND date_heure<'$dateEnd' AND statut='publie'");
92        $nbr_forums = mysql_num_rows($requete);
93        mysql_free_result($requete);
94       
95        $total = $nbr_articles + $nbr_breves + $nbr_forums;
96        $resultat = '';
97        if ($total > 0) {
98                $resultat = $resultat.' title=" - Articles publies : '.$nbr_articles." \n".' - Breves publiees : '.$nbr_breves." \n".' - Commentaires publies : '.$nbr_forums.' "';
99        }
100        return $resultat;
101}
102
103function cal_site($theDate=null, $locale=null, $calPage=null, $calJour=null, $calMois=null) {
104// Fonction pour generer un calendrier indiquant les articles, breves et commentaires publies
105
106        // Si la date n'est pas fournie, alors on prend la date actuelle
107        if (!isset($theDate)) { $theDate = date('Y-m-d'); }
108        // Si une date est presente dans l'adresse Url, alors on prend celle-ci
109        $laDate = $_GET['date'];
110        if (isset($laDate)) { $theDate = $laDate; }
111
112        // Si la localisation n'est pas fournie, alors on regle le francais par defaut
113        if (!isset($locale)) { $locale = array('fr', 'fr_FR', 'fr_FR.UTF-8'); }
114        // On regle la localisation selon la valeur obtenue
115        setlocale (LC_TIME, $locale);
116
117        // On defini les pages Html de construction des liens
118        if (!isset($calPage)) { $calPage = 'calendrier'; }
119        if (!isset($calJour)) { $calJour = 'inc/inc-cal-jour'; }
120        if (!isset($calMois)) { $calMois = 'inc/inc-cal-mois'; }
121
122        // On separe les differents elements de la date fournie
123        $day = date('j', strtotime($theDate));
124        $month = date('n', strtotime($theDate));
125        $year = date('Y', strtotime($theDate));
126       
127        // On verifie la validite de la date avant de generer le calendrier
128        // <http://www.php.net/manual/fr/function.setlocale.php>
129        if (checkdate($month, 1, $year)) {
130               
131                // Date actuelle
132                $now = date('Y-m-d');
133                $nowDay = date('j', strtotime($now));
134                $nowMonth = date('n', strtotime($now));
135                $nowYear = date('Y', strtotime($now));
136               
137                // Nettoyage de l'adresse Url pour construir les liens
138                $requete = $_SERVER['argv'][0];
139                $debut = '?'.$requete.'&';
140                $debut = preg_replace('#var_mode=.*?([\&])#i','',$debut);
141                $debut = preg_replace('#date=.*?([\&])#i','',$debut);
142                $debut = rtrim($debut, '&');
143                $debut = str_replace('?&','?',$debut);
144                $debut = str_replace('&&','&',$debut);
145               
146                // On remplace l'affichage jour par l'affichage mois, et vise-versa
147                $debutMois = str_replace($calJour,$calMois,$debut);
148                $debutJour = str_replace($calMois,$calJour,$debut);
149
150                // On defini les differentes dates a utiliser
151                // <http://www.php.net/manual/fr/function.mktime.php>
152                $dateNow = mktime(0, 0, 0, $nowMonth, $nowDay, $nowYear);
153                $dateLien = mktime(0, 0, 0, $month, $day, $year);
154                $dateLienJour1 = mktime(0, 0, 0, $month, 1, $year);
155                $dateLienJourPlus1 = mktime(0, 0, 0, $month, $day + 1, $year);
156                $dateLienJourMoins1 = mktime(0, 0, 0, $month, $day - 1, $year);
157                $dateLienMoisPlus1 = mktime(0, 0, 0, $month + 1, 1, $year);
158                $dateLienMoisMoins1 = mktime(0, 0, 0, $month - 1, 1, $year);
159               
160                // On definie le 'lundi' comme premier jour de la semaine et le 'dimanche' comme le dernier
161                if (!$day = date("w", $dateLienJour1)) $day = 7; 
162       
163                // Le Calendrier
164                $cal = "";
165               
166                // Recuperation du nombre d'articles, breves et commentaires publies pendant le mois considere
167                $dateMois = strftime("%G-%m-%d", $dateLienJour1);
168                $dateMoisPlus1 = strftime("%G-%m-%d", $dateLienMoisPlus1);
169                $titreMois = nombre_publications_date($dateMois, $dateMoisPlus1);
170               
171                // Construction des liens des mois precedent, actuel et suivant
172                $lienMoisMoins = '<a href="'.$debutMois.'&date='.strftime("%G-%m-%d", $dateLienMoisMoins1).'" title="'.strftime("%B %G", $dateLienMoisMoins1).'">&laquo;</a>';
173                $lienMoisLien = '<a href="?page='. $calPage.'&cal='.$calMois.'&date='.strftime("%G-%m-%d", $dateLienJour1).'"'.$titreMois.'>'.strftime("%B %G", $dateLien).'</a>';
174                $lienMoisPlus = '<a href="'.$debutMois.'&date='.strftime("%G-%m-%d", $dateLienMoisPlus1).'" title="'.strftime("%B %G", $dateLienMoisPlus1).'">&raquo;</a>';
175               
176                // On affiche le nom entier du mois considere suivant la localisation, et les liens vers les mois precedent et suivant
177                // <http://www.php.net/manual/fr/function.strftime.php>
178                $cal = $cal.'<table border=0><tr class="cal_titre"><th>'.$lienMoisMoins.'</th><th colspan=5>'.$lienMoisLien.'</th><th>'.$lienMoisPlus.'</th></tr><tr>';
179       
180                // On affiche les abreviations des jours de la semaine suivant la localisation (Lun, Mar, Mer, Jeu, Ven, Sam, Dim)
181                for ($i = 8; --$i;) {
182                        $cal = $cal.'<th>'. strftime("%a", mktime(0, 0, 0, $month, 16 - $i - $day, $year)).'</th>'; 
183                }
184           
185                // On affiche les eventuelles cellules vides au debut du mois
186                $cal = $cal.'</tr><tr>'.str_repeat('<td></td>', --$day); 
187       
188                // On genere les differents jours du calendrier du mois
189                // <http://www.php.net/manual/fr/function.checkdate.php>
190                while (checkdate($month, ++$i, $year)) { // $i==0 after for :-)
191                        // Recuperation du nombre d'articles, breves et commentaires publies pendant le jour considere
192                        $dateJour = strftime("%G-%m-%d", mktime(0, 0, 0, $month, $i, $year));
193                        $dateJourPlus1 = strftime("%G-%m-%d", mktime(0, 0, 0, $month, $i + 1, $year));
194                        $titreJour = nombre_publications_date($dateJour,$dateJourPlus1);
195                       
196                        // Pour le style de la cellule du calendrier contenant la date actuelle
197                        if ($dateJour == $now) { $sel = ' class="cal_sel"'; } else { $sel = ""; };
198                       
199                        // S'il y a des publications alors on construit le lien
200                        if ($titreJour == '') {
201                                $cal = $cal.'<td'.$sel.'>'.$i.'</td>';
202                        } else {
203                                $cal = $cal.'<td'.$sel.'><a href="?page='.$calPage.'&cal='.$calJour.'&date='.$dateJour.'"'.$titreJour.'>'.$i.'</a></td>';
204                        }
205                       
206                        // Nouvelle rangee du tableau au bout de 7 jours
207                        if (!(++$day % 7)) $cal = $cal.'</tr><tr>'; 
208       
209        }
210                // Fin du tableau calendrier
211                $cal = $cal.'</tr></table>';
212                // Lien de la date actuelle
213                $cal = $cal.'<p class="cal_now"><a href="'.$debutJour.'&date='.strftime("%G-%m-%d",$dateNow).'">'.strftime("Aujourd'hui %A %e %B %G",$dateNow).'</a></p>';
214               
215                // Retour du calendrier
216                return $cal;
217        } 
218} 
219
220function filets_sep($texte) {
221// Fonction pour generer des filets de separation selon les balises presentes dans le texte fourni.
222// Il y a par defaut 10 filets possibles, de 0 a 9, mais on peut en ajouter d'autres au besoin.
223       
224        // On memorise le modele d'expression rationnelle a utiliser pour chercher les balises.
225        $modele = '#[\n\r]__(\d+)__[\n\r]#iU';
226       
227        // On verifie si des balises filets existent dans le texte fourni.
228        preg_match_all($modele, $texte, $test);
229
230        if ($test !== false) {
231                // On isole les textes presents dans les balises "cadre" et "code".
232                preg_match_all('#<cadre>(.*?)</cadre>#is', $texte, $listeCadre);
233                preg_match_all('#<code>(.*?)</code>#is', $texte, $listeCode);
234                $listeCadreTexte = $listeCadre[0];
235                $listeCodeTexte = $listeCode[0];
236               
237                // On modifie le format des balises filets presents dans les balises "cadre" pour ne pas les traiter.
238                foreach ($listeCadreTexte as $texteCadreOrig) {
239                        $texteCadreNew = preg_replace('#__(\d+)__#iU','__-$1-__',$texteCadreOrig);
240                        $texte = str_replace($texteCadreOrig,$texteCadreNew,$texte);
241                };
242       
243                // On modifie le format des balises filets presents dans les balises "code" pour ne pas les traiter.
244                foreach ($listeCodeTexte as $texteCodeOrig) {
245                        $texteCodeNew = preg_replace('#__(\d+)__#iU','__-$1-__',$texteCodeOrig);
246                        $texte = str_replace($texteCodeOrig,$texteCodeNew,$texte);
247                };
248       
249                // On remplace les balises filets dans le texte par le code Html correspondant.
250                $texte = preg_replace($modele,'<html><p class="filet_sep_$1"></p></html>',$texte); 
251               
252                // On remet les balises filets presents dans les balises "cadre" et "code" a leur format initial.
253                $texte = preg_replace('#__-(\d+)-__#iU','__$1__',$texte); 
254        };
255
256        // Traitement des anciens filets, pour assurer une compatibilite descendente.
257        $texte = str_replace('__l__','<html><p class="filet_sep_long"></p></html>',$texte);
258        $texte = str_replace('__m__','<html><p class="filet_sep_moyen"></p></html>',$texte);
259        $texte = str_replace('__c__','<html><p class="filet_sep_court"></p></html>',$texte);
260
261        return $texte;
262}
263
264
265function chercher_remplacer($chercher,$remplacer,$texte) {
266// Fonction pour faire des recherches-remplacements dans le texte fourni
267       
268        return str_replace($chercher,$remplacer,$texte);
269}
270
271function conversion_minuscules(&$value, $key) {
272// Fonction pour convertir du texte en minuscules
273        $value = strtolower($value);
274        return $value;
275}
276
277function somm_table($texteOrig, $titreSommaire = '') {
278// Fonction pour creer un sommaire sous forme d'une liste ou d'un tableau Spip.
279// La fonction verifie l'existence d'un intertitre "Sommaire" par defaut,
280// ou le titre de sommaire fourni par l'tuilisateur (pour des articles multilingues).
281// Si un intertitre sommaire existe, alors on analyse le texte fourni pour isoler
282// tous les intertitres afin de pouvoir fabriquer le sommaire, avec des liens
283// internes vers tous les intertitres et de liens de retour vers le sommaire.
284// Le sommaire ainsi cree sera place juste en dessous du titre "Sommaire".
285       
286        // Si l'utilisateur n'a pas fourni le titre sommaire a utiliser,
287        // alors on utilise le titre par defaut en francais.
288        if (empty($titreSommaire)) {
289                $titreSommMin = 'sommaire';
290        } else {
291                $titreSommMin = strtolower($titreSommaire);
292        };
293       
294        // Test de l'existence d'un intertitre 'Sommaire' pour generer un tableau
295        // ou 'Sommaire-' (avec un trait d'union a la fin) pour generer une liste.
296        $test = preg_match('#\{\{\{\[?\#?'.$titreSommMin.'-?\]?}\}\}#i', $texteOrig);
297
298        // Si un des intertitres sommaire existe, alors on genere le sommaire.
299        if ($test) {
300       
301                // On isole les textes presents dans les balises "cadre" et "code".
302                preg_match_all('#<cadre>(.*?)</cadre>#is', $texteOrig, $listeCadre);
303                preg_match_all('#<code>(.*?)</code>#is', $texteOrig, $listeCode);
304                // On place les resultast, avec les balises, dans des variables.
305                $listeCadreTexte = $listeCadre[0];
306                $listeCodeTexte = $listeCode[0];
307               
308                // On modifie le format des balises intertitre dans les balises "cadre" pour ne pas les traiter.
309                foreach ($listeCadreTexte as $texteCadreOrig) {
310                        $texteCadreNew = preg_replace('#(\{\{)(\{.*?\})(\}\})#i','$1-$2-$3',$texteCadreOrig);
311                        $texteOrig = str_replace($texteCadreOrig,$texteCadreNew,$texteOrig);
312                };
313
314                // On modifie le format des balises intertitre dans les balises "code" pour ne pas les traiter.
315                foreach ($listeCodeTexte as $texteCodeOrig) {
316                        $texteCodeNew = preg_replace('#(\{\{)(\{.*?\})(\}\})#i','$1-$2-$3',$texteCodeOrig);
317                        $texteOrig = str_replace($texteCodeOrig,$texteCodeNew,$texteOrig);
318                };
319
320                // Recuperation des tous les intertitres presents dans le texte nettoye.
321                preg_match_all('#\{\{\{(.*?)\}\}\}#i', $texteOrig, $listeOrig);
322               
323                // On place le resultat a utiliser dans une variable.
324                $listeTitresOrig = $listeOrig[1];
325
326                // On verifie qu'il y reste des intertitres a traiter.
327                if (count($listeTitresOrig) > 0) {
328               
329                        // On verifie si le sommaire demande est sous forme de liste ou tableau.       
330                        $testType = preg_match('#\{\{\{\[?\#?'.$titreSommMin.'-\]?\}\}\}#i', $texteOrig);
331                       
332                        // On verifie si la numerotation automatique est demandee.     
333                        $testNro = preg_match('#\{\{\{\[?\#'.$titreSommMin.'-?\]?\}\}\}#i', $texteOrig);
334                       
335                        // On initialise les autres variables.
336                        $newSomm = '';
337                        $esp = '&nbsp; &nbsp;';
338                        $nb = 1;
339                       
340                        // Boucle sur chaque element de la liste des intertitres originaux.
341                        foreach ($listeTitresOrig as $titreOrig) {
342                                $masquer = preg_match('#^\[(.*?)\]$#i', $titreOrig); // On test s'il faut masquer.
343                                $titreClean = rtrim(trim($titreOrig, '[#'),'-]'); // On supprime les eventuels indesirables.
344                                $titreClean = ucfirst($titreClean); // On met la premiere lettre en majuscule.
345                                $titreMin = strtolower($titreClean); // On converti en minuscules.
346
347                                if ($titreMin == $titreSommMin) {
348                                        // Si le titre considere est 'sommaire', alors on fabrique le debut du sommaire.
349                                        $titreSommOrig = '{{{'.$titreOrig.'}}}';
350                                        // On insere l'ancre et l'intertitre, ou l'ancre seulement s'il faut masquer l'intertitre.
351                                        if ($masquer) {
352                                                $titreSommNew = '[somm<-]'."\n";
353                                        } else {
354                                                $titreSommNew = '[somm<-]'."\n".'{{{'.$titreClean.'}}}'."\n\n";
355                                        }
356                                } else {
357                                        // On insere la numerotation automatique si elle est demandee.
358                                        if ($testNro) { $titreClean = $nb.'. '.$titreClean; };
359
360                                        // On fabrique la liste ou le tableau et on place les ancres et liens des intertitres.
361                                        if ($testType) {
362                                                // On fabrique le sommaire sous forme de liste.
363                                                $newSomm = $newSomm.'- [{{<html>'.$titreClean.'</html>}}->#inter'.$nb.']'."\n";
364                                        } else {
365                                                // On fabrique le sommaire sous forme de tableau.
366                                                $newSomm = $newSomm.'|['.$esp.'{{<html>'.$titreClean.'</html>}}'.$esp.'->#inter'.$nb.']|'."\n";
367                                        };
368                                        // On insere l'ancre et l'intertitre, ou l'ancre seulement s'il faut masquer l'intertitre.
369                                        if ($masquer) {
370                                                $titreNew = '[inter'.$nb.'<-]'."\n";
371                                        } else {
372                                                $titreNew = '[inter'.$nb.'<-]'."\n".'{{{[<html>'.$titreClean.'</html>->#somm]}}}';
373                                        }
374                                        // On remplace les intertitres par d'autres avec une ancre et un lien vers le sommaire.
375                                        $texteOrig = str_replace('{{{'.$titreOrig.'}}}', $titreNew, $texteOrig);
376                                        $nb++;
377                                };
378                        };
379                        $newSomm = '<html><div class="somm_table"></html>'."\n".$newSomm."\n".'<html></div></html>';
380                        // On remplace l'intertitre "Sommaire" original par le nouveau sommaire.
381                        $texteOrig = str_replace($titreSommOrig, $titreSommNew.$newSomm, $texteOrig);
382                };
383                // On remet les balises intertitres dans les balises "cadre" et "code" a leur format initial.
384                $texteOrig = preg_replace('#\{\{-\{(.*?)\}-\}\}#i','{{{$1}}}',$texteOrig); 
385               
386                // On efface tous les eventuels intertitres vides.
387                $texteOrig = str_replace('{{{}}}', '', $texteOrig);
388        };
389        // Retour du texte avec le sommaire ou le texte original a defaut.
390        return $texteOrig;
391}
392
393
394function visites_site($day) {
395// Fonction pour afficher le nombre de visites enregistrees sur le site.
396// Le parametre "today" retourne les visites du jour courant.
397// Le parametre "all" retourne le total des visites depuis l'ouverture du site.
398// Ce code est librement inspire du squelette Sarka-Spip <http://sarka-spip.com/>
399
400        global $table_prefix; // Pour pouvoir utiliser des prefixes personnalises autres que "spip"
401        $r = 0;
402        if ( $day == 'today' ) {
403                $today = date('Y-m-d',strtotime(date('Y-m-d')));
404                $query = "SELECT visites AS visites FROM ".$table_prefix."_visites WHERE date='$today'";
405                $result = spip_query($query);
406                $visit_today = 0;
407                if ($row = @spip_fetch_array($result)) {
408                        $visit_today = $row['visites'];
409                }
410                $r = $visit_today;
411        }
412        else if ( $day == 'all' ) {
413                $query = "SELECT SUM(visites) AS total_absolu FROM ".$table_prefix."_visites";
414                $result = spip_query($query);
415                $visit_all = 0;
416                if ($row = @spip_fetch_array($result)) {
417                        $visit_all = $row['total_absolu'];
418                }
419                $r = $visit_all;
420        }
421        return $r;
422}
423
424
425
426?>
Note: See TracBrowser for help on using the repository browser.