From 696976d0810f8badd9f479c944f02bdf0effd89d Mon Sep 17 00:00:00 2001
From: Antoine Pitrou <pitrou@free.fr>
Date: Mon, 28 Apr 2003 13:27:34 +0000
Subject: [PATCH] corrections dates

---
 ecrire/inc_filtres.php3 |  16 +++++++
 ecrire/inc_version.php3 |  17 -------
 inc-calcul-squel.php3   | 104 +++++++++++++++++++++-------------------
 inc-calcul.php3         |   4 +-
 spip_image.php3         |   6 +--
 5 files changed, 76 insertions(+), 71 deletions(-)

diff --git a/ecrire/inc_filtres.php3 b/ecrire/inc_filtres.php3
index e256a6b5e8..cb5dbc811a 100644
--- a/ecrire/inc_filtres.php3
+++ b/ecrire/inc_filtres.php3
@@ -165,6 +165,22 @@ function antispam($texte) {
 // Date, heure, saisons
 //
 
+function normaliser_date($date) {
+	if ($date) {
+		if (ereg("^[0-9]{8,10}$", $date))
+			$date = date("Y-m-d H:i:s", $date);
+		if (ereg("^([12][0-9]{3})([-/]00)?( [-0-9:]+)?$", $date, $regs))
+			$date = $regs[1]."-01-01".$regs[3];
+		else if (ereg("^([12][0-9]{3}[-/][01]?[0-9])([-/]00)?( [-0-9:]+)?$", $date, $regs))
+			$date = ereg_replace("/","-",$regs[1])."-01".$regs[3];
+		else if ($GLOBALS['flag_strtotime']) {
+			$date = date("Y-m-d H:i:s", strtotime($date));
+		}
+		else $date = ereg_replace('[^-0-9/: ]', '', $date);
+	}
+	return $date;
+}
+
 function vider_date($letexte) {
 	if (ereg("^0000-00-00", $letexte)) return '';
 	return $letexte;
diff --git a/ecrire/inc_version.php3 b/ecrire/inc_version.php3
index f43265681b..b13ab32baf 100644
--- a/ecrire/inc_version.php3
+++ b/ecrire/inc_version.php3
@@ -739,23 +739,6 @@ function email_valide($adresse) {
 }
 
 
-// normaliser la date
-function normaliser_date($date) {
-	if ($date) {
-		if (ereg("^([12][0-9]{3})(-00)?( .*)?$", $date, $regs))
-			$date = $regs[1]."-01-01".$regs[2];
-		else if (ereg("^([12][0-9]{3}[/-][01]?[0-9])(-00)?( .*)?$", $date, $regs))
-			$date = ereg_replace("/","-",$regs[1])."-01".$regs[3];
-		else if ($GLOBALS['flag_strtotime']) {
-			if ($date_str = strtotime($date))
-				$date = date("Y-m-d H:i:s", $date_str);
-		}
-	}
-	return $date;
-}
-
-$date = normaliser_date($date);
-
 //
 // Traduction des textes de SPIP
 //
diff --git a/inc-calcul-squel.php3 b/inc-calcul-squel.php3
index 264ac430cd..1bf10cda2f 100644
--- a/inc-calcul-squel.php3
+++ b/inc-calcul-squel.php3
@@ -241,7 +241,7 @@ function parser_boucle($texte, $id_parent) {
 					if (ereg('\#(PS)', $milieu)) {
 						$s .= ",$table.ps";
 					}
-					
+
 					$req_select[] = $s;
 				}
 				else $req_select[] = "$table.*";
@@ -304,7 +304,7 @@ function parser_boucle($texte, $id_parent) {
 					if ($param == 'inverse') {
 						if ($req_order) $req_order .= ' DESC';
 					}
-	
+
 					// Special rubriques
 					else if ($param == 'meme_parent') {
 						$req_where[] = "$table.id_parent=\$id_parent";
@@ -319,7 +319,7 @@ function parser_boucle($texte, $id_parent) {
 					else if ($param == 'branche') {
 						$req_where[] = "$table.id_rubrique IN (\".calcul_branche(\$id_rubrique).\")";
  					}
-	
+
 					// Restriction de valeurs (implicite ou explicite)
 					else if (ereg('^([a-zA-Z_]+) *((!?)(<=?|>=?|==?) *"?([^<>=!"]*))?"?$', $param, $match)) {
 						// Variable comparee
@@ -390,45 +390,48 @@ function parser_boucle($texte, $id_parent) {
 						else if (($type == 'breves' OR $type == 'forums') AND $col == 'id_secteur')
 							$col = 'id_rubrique';
 
-						// Cas particulier : expressions de date redac
-						$datecompare='date';
-						if (ereg("^(date|mois|annee|age|age_relatif|jour_relatif|annee_relatif)_redac(_redac)?$", $col, $regs)) {
-							$col_date = 'date_redac';
-							$col = $regs[1];
-							if ($regs[2])
-								$datecompare='date_redac';
-						}
-
 						// Cas particulier : expressions de date
-						if ($col == 'date')
-							$col = $table.$col_date;
-						else if ($col == 'mois') {
-							$col = "MONTH($table.$col_date)";
-							$col_table = '';
-						}
-						else if ($col == 'annee') {
-							$col = "YEAR($table.$col_date)";
-							$col_table = '';
-						}
-						else if ($col == 'age') {
-							$col = "(LEAST((UNIX_TIMESTAMP(now())-UNIX_TIMESTAMP($table.$col_date))/86400, TO_DAYS(now())-TO_DAYS($table.$col_date), DAYOFMONTH(now())-DAYOFMONTH($table.$col_date)+30.4368*(MONTH(now())-MONTH($table.$col_date))+365.2422*(YEAR(now())-YEAR($table.$col_date))))";
-							$col_table = '';
-						}
-						else if ($col == 'age_relatif') {
-							$col = "LEAST((UNIX_TIMESTAMP('(\$$datecompare)')-UNIX_TIMESTAMP($table.$col_date))/86400, TO_DAYS('(\$$datecompare)')-TO_DAYS($table.$col_date), DAYOFMONTH('(\$$datecompare)')-DAYOFMONTH($table.$col_date)+30.4368*(MONTH('(\$$datecompare)')-MONTH($table.$col_date))+365.2422*(YEAR('(\$$datecompare)')-YEAR($table.$col_date)))";
-							$col_table = '';
-						}
-						else if ($col == 'jour_relatif') {
-							$col = "LEAST(TO_DAYS('(\$$datecompare)')-TO_DAYS($table.$col_date), DAYOFMONTH('(\$$datecompare)')-DAYOFMONTH($table.$col_date)+30.4368*(MONTH('(\$$datecompare)')-MONTH($table.$col_date))+365.2422*(YEAR('(\$$datecompare)')-YEAR($table.$col_date)))";
-							$col_table = '';
-						}
-						else if ($col == 'mois_relatif') {
-							$col = "(MONTH('(\$$datecompare)')-MONTH($table.$col_date)+12*(YEAR('(\$$datecompare)')-YEAR($table.$col_date)))";
-							$col_table = '';
-						}
-						else if ($col == 'annee_relatif') {
-							$col = "YEAR('(\$$datecompare)')-YEAR($table.$col_date)";
-							$col_table = '';
+						if (ereg("^(date|mois|annee|age|age_relatif|jour_relatif|mois_relatif|annee_relatif)(_redac)?$", $col, $regs)) {
+							$col = $regs[1];
+							if ($regs[2]) {
+								$date_orig = "$table.date_redac";
+								$date_compare = 'date_redac';
+							}
+							else {
+								$date_orig = "$table.$col_date";
+								$date_compare = 'date';
+							}
+
+							if ($col == 'date')
+								$col = $date_orig;
+							else if ($col == 'mois') {
+								$col = "MONTH($date_orig)";
+								$col_table = '';
+							}
+							else if ($col == 'annee') {
+								$col = "YEAR($date_orig)";
+								$col_table = '';
+							}
+							else if ($col == 'age') {
+								$col = "(LEAST((UNIX_TIMESTAMP(now())-UNIX_TIMESTAMP($date_orig))/86400, TO_DAYS(now())-TO_DAYS($date_orig), DAYOFMONTH(now())-DAYOFMONTH($date_orig)+30.4368*(MONTH(now())-MONTH($date_orig))+365.2422*(YEAR(now())-YEAR($date_orig))))";
+								$col_table = '';
+							}
+							else if ($col == 'age_relatif') {
+								$col = "LEAST((UNIX_TIMESTAMP('\$$date_compare')-UNIX_TIMESTAMP($date_orig))/86400, TO_DAYS('\$$date_compare')-TO_DAYS($date_orig), DAYOFMONTH('\$$date_compare')-DAYOFMONTH($date_orig)+30.4368*(MONTH('\$$date_compare')-MONTH($date_orig))+365.2422*(YEAR('\$$date_compare')-YEAR($date_orig)))";
+								$col_table = '';
+							}
+							else if ($col == 'jour_relatif') {
+								$col = "LEAST(TO_DAYS('\$$date_compare')-TO_DAYS($date_orig), DAYOFMONTH('\$$date_compare')-DAYOFMONTH($date_orig)+30.4368*(MONTH('\$$date_compare')-MONTH($date_orig))+365.2422*(YEAR('\$$date_compare')-YEAR($date_orig)))";
+								$col_table = '';
+							}
+							else if ($col == 'mois_relatif') {
+								$col = "(MONTH('\$$date_compare')-MONTH($date_orig)+12*(YEAR('\$$date_compare')-YEAR($date_orig)))";
+								$col_table = '';
+							}
+							else if ($col == 'annee_relatif') {
+								$col = "YEAR('\$$date_compare')-YEAR($date_orig)";
+								$col_table = '';
+							}
 						}
 
 						if ($type == 'forums' AND ($col == 'id_parent' OR $col == 'id_forum'))
@@ -448,7 +451,7 @@ function parser_boucle($texte, $id_parent) {
 						if ($match[3] == '!') $where = "NOT ($where)";
 						$req_where[] = $where;
 					}
-	
+
 					// Selection du classement
 					else if (ereg('^par[[:space:]]+([^}]*)$', $param, $match)) {
 						$tri = trim($match[1]);
@@ -523,7 +526,7 @@ function parser_boucle($texte, $id_parent) {
 				$req_where[] = "$table.statut='publie'";
 				$req_group = " GROUP BY $table.$id_objet";
 				break;
-			
+
 			case 'syndic_articles':
 				$req_select[]='syndic.nom_site AS nom_site';
 				$req_select[]='syndic.url_site AS url_site';
@@ -698,7 +701,7 @@ function parser_champs_etendus($texte) {
 						$champ->fonctions[] = $f;
 					}
 				}
-				
+
 				if ($fonctions) {
 					$fonctions = explode('|', substr($fonctions, 1));
 					reset($fonctions);
@@ -722,7 +725,7 @@ function parser_champs_etendus($texte) {
 			break;
 		}
 	}
-	return $result;	
+	return $result;
 }
 
 function parser_texte($texte, $id_boucle) {
@@ -1351,12 +1354,13 @@ function calculer_champ($id_champ, $id_boucle, $nom_var)
 		break;
 
 	case 'DATE':
-		$code = "\$GLOBALS['date']";	// uniquement hors-boucles, pour la date passee dans l'URL ou le contexte inclusion
+		// Uniquement hors-boucles, pour la date passee dans l'URL ou le contexte inclusion
+		$code = "\$contexte['date']";
 		break;
 
 	case 'DATE_NOUVEAUTES':
 		$milieu = "if (lire_meta('quoi_de_neuf') == 'oui' AND lire_meta('majnouv'))
-			\$$nom_var = date('Y-m-d H:i:s', lire_meta('majnouv'));
+			\$$nom_var = normaliser_date(lire_meta('majnouv'));
 		else
 			\$$nom_var = \"'0000-00-00'\";
 		";
@@ -2070,7 +2074,7 @@ function calculer_boucle($id_boucle, $prefix_boucle)
 	//
 	// Fermeture de la boucle spip_fetch_array et liberation des resultats
 	//
-	
+
 	if ($flag_parties) {
 		$texte .= '
 		}
@@ -2123,7 +2127,7 @@ function calculer_texte($texte)
 				if (ereg("^([_0-9a-zA-Z]+)[[:space:]]*(=[[:space:]]*([^}]+))?$", $param, $args)) {
 					$var = $args[1];
 					$val = $args[3];
-					if ($val) 
+					if ($val)
 						$code .= "	\$retour .= '\$contexte_inclus[$var] = \'".addslashes($val)."\'; ';\n";
 					else
 						$code .= "	\$retour .= '\$contexte_inclus[$var] = \''.addslashes(\$contexte[$var]).'\'; ';\n";
@@ -2269,7 +2273,7 @@ function calculer_squelette($squelette, $fichier) {
 			$texte .= "\n\n";
 		}
 	}
-	
+
 	// Calculer le code PHP de la racine
 	$texte .= "function $func(\$contexte) {\n";
 	$texte .= " global \$pile_boucles, \$id_instance_cond;\n \$pile_boucles = Array();\n \$id_instance_cond = -1;\n"; // pour #TOTAL_BOUCLE
diff --git a/inc-calcul.php3 b/inc-calcul.php3
index 41acf92b9a..a56aaaddb4 100644
--- a/inc-calcul.php3
+++ b/inc-calcul.php3
@@ -312,7 +312,7 @@ function executer_squelette($squelette, $contexte) {
 		}
 
 		// L'inclusion du squelette permet de definir les fonctions associees
-		// aux boucles, et de recuperer le nom de la fonction principale	
+		// aux boucles, et de recuperer le nom de la fonction principale
 		include($squelette_cache);
 
 		// Si le squelette compile est vide, pour une raison inconnue
@@ -430,6 +430,7 @@ function calculer_page_globale($fond) {
 	global $fichier_requete;
 	global $id_rubrique_fond;
 
+	// Generer le contexte
 	$contexte = '';
 	$contexte_defaut = array('id_parent', 'id_rubrique', 'id_article', 'id_auteur',
 		'id_breve', 'id_forum', 'id_secteur', 'id_syndic', 'id_syndic_article', 'id_mot', 'id_groupe', 'id_document');
@@ -439,6 +440,7 @@ function calculer_page_globale($fond) {
 			$contexte[$val] = (int) $GLOBALS[$val];
 		}
 	}
+	if ($GLOBALS['date']) $contexte['date'] = normaliser_date($GLOBALS['date']);
 
 	// Calcul de la rubrique associee a la requete
 	// (selection de squelette specifique)
diff --git a/spip_image.php3 b/spip_image.php3
index 3bdbfe6a7c..9164ff2f59 100644
--- a/spip_image.php3
+++ b/spip_image.php3
@@ -291,12 +291,12 @@ function ajout_doc($orig, $source, $dest, $mode, $id_document, $doc_vignette='',
 	//
 	// Creer une vignette automatiquement
 	//
-	$creer_preview=lire_meta("creer_preview");
-	$taille_preview=lire_meta("taille_preview");
+	$creer_preview = lire_meta("creer_preview");
+	$taille_preview = lire_meta("taille_preview");
 	$gd_formats = lire_meta("gd_formats");
+
 	$format_img = strtolower(substr($dest_path, strrpos($dest_path,".")+1, strlen($dest_path)));
 	if ($format_img == "jpeg") $format_img == "jpg";
-
 	if ($taille_preview < 10) $taille_preview = 120;
 
 	if ($mode == 'document' AND $format_img AND ereg($format_img, $gd_formats) AND $creer_preview == 'oui') {
-- 
GitLab