From 984689248addcc355f6aef50a56e5f21dab76fc2 Mon Sep 17 00:00:00 2001
From: "Committo,Ergo:sum" <esj@rezo.net>
Date: Wed, 9 May 2007 11:45:04 +0000
Subject: [PATCH] =?UTF-8?q?Revision=20de=20l'interface=20aux=20jeux=20de?=
 =?UTF-8?q?=20fonctions=20generer=5Furl=5F$objet,=20command=C3=A9s=20en=20?=
 =?UTF-8?q?=20particulier=20par=20la=20globale=20$type=5Furls.?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Ces fonctions n'admettaient auparavant qu'un seul argument, index de la clé primaire dans la table correspondante. En conséquence, il n'était pas possible d'exploiter à fond les possibilités des raccourcis données par la RegExp:

define('_RACCOURCI_URL', ',^\s*(\w*?)\s*(\d+)(\?(.*?))?(#([^\s]*))?$,S');

qui autorise explicitement paramètres supplémentaires et ancre, lesquels étaient
raoutés ultérieurement, et mal à propos en cas de redirection.

A présent, les fonctions generer_url_*objet sont appelées avec les 2 arguments supplémentaires trouvés dans le raccourci, le premier étant censé etre une suite n1=v1&n2=v2 et le deuxième une ancre. Les définitions standards de ces jeux de
fonctions (urls/page urls/html urls/propres et inc/urls) admettent ces nouveaux arguments et les injectent dans les URL construites. Dans le cas où les URLs sont en fait des scripts qui provoqueront  une redirection, l'ancre est fourni sous la forme "ancre=nom", le script de redirection synthétisant "#$ancre" dans l'URL finale.

Compatibilité:

- totale pour les sites sans mes_options.php personnelle;

- vraisemblablement assurée pour ceux définissant un jeu de fonctions generer_url_$objet car:
	-- PHP ne dit rien en présence d'arguments excédentaires
	-- les variantes generer_url_ecrire_$objet admettaient certes déjà un 2e argument, mais son utilisation comportait un bug suggérant qu'il n'avait jamais utilisé en dehors du noyau de Spip où il était transparent (cet argument est donc maintenant en 4e position, et permet de forcer le statut de l'objet)
	-- le 2e argument generer_url_forum n'avait jamais été utilisé;
	-- ce sont à présent ces fonctions qui doivent rajouter la suite d'arguments supplémentaires et l'ancre, mais il est douteux que certaines comptaient dessus sinon la faute de conception motivant ce dépot aurait été signalée depuis longtemps;

- pour le sous-jeu de fonctions calculer_url_$objet, il reçoit à présent en 3e argument ce qu'a calculé le generer_url_$objet correspondant, ce qui leur facilite le travail. A noter une curieuse dissymétrie pour le raccourci des sites, qui dans ce cas retoune l'URL du site et non du script (conservée telle quelle).

A signaler également que la RegExp des raccourcis était assez laxiste, cherchanten vain des fonctions generer_url_$objet avec $objet n'étant pas nécessairement un \w+.
---
 ecrire/action/redirect.php         |  46 +++++-----
 ecrire/balise/formulaire_admin.php |   2 +-
 ecrire/inc/agenda.php              |  12 +--
 ecrire/inc/documents.php           |  23 ++---
 ecrire/inc/forum.php               |  13 ++-
 ecrire/inc/notifications.php       |   2 +-
 ecrire/inc/texte.php               | 109 ++++++++++-------------
 ecrire/inc/urls.php                | 134 +++++++++++++++++------------
 ecrire/urls/html.php               |  32 +++----
 ecrire/urls/page.php               |  38 ++++----
 ecrire/urls/propres.php            |  57 +++++++-----
 11 files changed, 242 insertions(+), 226 deletions(-)

diff --git a/ecrire/action/redirect.php b/ecrire/action/redirect.php
index 289d04bcd4..2c5f6f98c4 100644
--- a/ecrire/action/redirect.php
+++ b/ecrire/action/redirect.php
@@ -20,38 +20,40 @@ charger_generer_url();
 // http://doc.spip.org/@action_redirect_dist
 function action_redirect_dist()
 {
-  global $id_article, $id_auteur, $id_breve, $id_forum, $id_mot, $id_rubrique, $id_site, $id_syndic, $var_mode;
+  global $var_mode, $redirect;
 
-
-  if ($id_article = intval($id_article)) {
-	$url = generer_url_article($id_article);
+  if ($id_article = intval(_request('id_article'))) {
+	$redirect = generer_url_article($id_article,'',_request('ancre'));
 }
-  else if ($id_breve = intval($id_breve)) {
-	$url = generer_url_breve($id_breve);
+  else if ($id_breve = intval(_request('id_breve'))) {
+	$redirect = generer_url_breve($id_breve,'',_request('ancre'));
 }
-  else if ($id_forum = intval($id_forum)) {
-	$url = generer_url_forum($id_forum);
+  else if ($id_forum = intval(_request('id_forum'))) {
+	$redirect = generer_url_forum($id_forum,'',_request('ancre'));
 }
-  else if ($id_rubrique = intval($id_rubrique)) {
-	$url = generer_url_rubrique($id_rubrique);
+  else if ($id_rubrique = intval(_request('id_rubrique'))) {
+	$redirect = generer_url_rubrique($id_rubrique,'',_request('ancre'));
 }
-  else if ($id_mot = intval($id_mot)) {
-	$url = generer_url_mot($id_mot);
+  else if ($id_mot = intval(_request('id_mot'))) {
+	$redirect = generer_url_mot($id_mot,'',_request('ancre'));
 }
-  else if ($id_auteur = intval($id_auteur)) {
-	$url = generer_url_auteur($id_auteur);
+  else if ($id_auteur = intval(_request('id_auteur'))) {
+	$redirect = generer_url_auteur($id_auteur,'',_request('ancre'));
 }
-  else if ($id_syndic = intval($id_syndic) OR $id_syndic = intval($id_site)) {
-	$url = generer_url_site($id_syndic);
+  else if ($id_syndic = intval(_request('id_syndic')) OR $id_syndic = intval(_request('id_site'))) {
+	$redirect = generer_url_site($id_syndic,'',_request('ancre'));
 }
 else {
-	$url = _DIR_RESTREINT_ABS;
-}
-
 // Ne pas masquer cette eventuelle erreur (aide a detecter des lignes vides
 // dans inc-urls ou mes_fonctions/mes_options)
- header("Location: " . (!$var_mode ?  $url : ($url . (strpos($url,'?') ? '&' : '?') ."var_mode=" . $var_mode)));
+	$redirect = _DIR_RESTREINT_ABS;
+}
+	if ($var_mode) {
+		$var_mode = (strpos($redirect,'?') ? '&' : '?') ."var_mode="
+		. $var_mode;
+		$redirect = strpos($redirect,'#')
+		  ? str_replace('#', "$var_mode#", $redirect)
+		  : "$redirect$var_mode";
+	}
 }
-
-
 ?>
diff --git a/ecrire/balise/formulaire_admin.php b/ecrire/balise/formulaire_admin.php
index c476096b4c..22caea8224 100644
--- a/ecrire/balise/formulaire_admin.php
+++ b/ecrire/balise/formulaire_admin.php
@@ -185,7 +185,7 @@ function balise_FORMULAIRE_ADMIN_dyn($float='', $debug='') {
 			$env['id_'.$id] = ${'id_'.$id};
 			$g = 'generer_url_ecrire_'.$obj;
 			$env['voir_'.$obj] = str_replace('&amp;', '&',
-				$g(${'id_'.$id}, 'prop'));
+				$g(${'id_'.$id}, '','', 'prop'));
 		}
 	}
 
diff --git a/ecrire/inc/agenda.php b/ecrire/inc/agenda.php
index 0aa65521f5..d166721e88 100644
--- a/ecrire/inc/agenda.php
+++ b/ecrire/inc/agenda.php
@@ -1399,10 +1399,10 @@ function sql_calendrier_interval_articles($avant, $apres, &$evenements) {
 		if (autoriser('voir','article',$id))
 			$evenements[$amj][]=
 			    array(
-				  'CATEGORIES' => calendrier_categories('spip_articles', $id, 'id_article'),
-				  'DESCRIPTION' => $row['descriptif'] ? $row['descriptif'] : $langues[$row['lang']],
+				'CATEGORIES' => calendrier_categories('spip_articles', $id, 'id_article'),
+				'DESCRIPTION' => $row['descriptif'] ? $row['descriptif'] : $langues[$row['lang']],
 				'SUMMARY' => $row['titre'],
-				'URL' => generer_url_article($id, 'prop'));
+				'URL' => generer_url_article($id, '','','prop'));
 	}
 }
 
@@ -1416,10 +1416,10 @@ function sql_calendrier_interval_rubriques($avant, $apres, &$evenements) {
 		if (autoriser('voir','rubrique',$id))
 			$evenements[$amj][]=
 			    array(
-				  'CATEGORIES' => calendrier_categories('spip_rubriques', $id, 'id_rubrique'),
+				'CATEGORIES' => calendrier_categories('spip_rubriques', $id, 'id_rubrique'),
 				'DESCRIPTION' => $row['descriptif'],
 				'SUMMARY' => $row['titre'],
-				'URL' => generer_url_rubrique($id, 'prop'));
+				'URL' => generer_url_rubrique($id, '','', 'prop'));
 	}
 }
 
@@ -1433,7 +1433,7 @@ function sql_calendrier_interval_breves($avant, $apres, &$evenements) {
 		if (autoriser('voir','breve',$id))
 			$evenements[$amj][]=
 			array(
-			      'URL' => generer_url_breve($id, 'prop'),
+			      'URL' => generer_url_breve($id, '','', 'prop'),
 			      'CATEGORIES' => calendrier_categories('spip_breves', $ir, 'id_breve'),
 			      'SUMMARY' => $row['titre']);
 	}
diff --git a/ecrire/inc/documents.php b/ecrire/inc/documents.php
index 8784359761..cf74e08861 100644
--- a/ecrire/inc/documents.php
+++ b/ecrire/inc/documents.php
@@ -39,23 +39,18 @@ function get_spip_doc($fichier) {
 }
 
 // http://doc.spip.org/@generer_url_document_dist
-function generer_url_document_dist($id_document) {
+function generer_url_document_dist($id_document, $args='', $ancre='') {
 	if (intval($id_document) <= 0)
 		return '';
 	$row = spip_fetch_array(spip_query("SELECT fichier,distant FROM spip_documents WHERE id_document="._q($id_document)));
-	if ($row) {
-
-		// Cette variable de configuration peut etre posee par un plugin
-		// par exemple acces_restreint
-		if ($GLOBALS['meta']["creer_htaccess"] == 'oui'
-		AND $row['distant'] != 'oui')
-			return parametre_url(
-				generer_url_action('acceder_document', "arg=$id_document"),
-				'file', $row['fichier'], '&');
-		else
-			return get_spip_doc($row['fichier']);
-	}
-	return '';
+	if (!$row) return '';
+	// Cette variable de configuration peut etre posee par un plugin
+	// par exemple acces_restreint
+	if ($GLOBALS['meta']["creer_htaccess"] == 'oui'
+	AND $row['distant'] != 'oui') {
+	  $args .= ($args ? "&" : '') . "arg=$id_document&file=" . $row['fichier'] . ($ancre ? "&ancre=$ancre" : '');
+		return generer_url_action('acceder_document', $args);
+	} else	return get_spip_doc($row['fichier']);
 }
 
 //
diff --git a/ecrire/inc/forum.php b/ecrire/inc/forum.php
index d66aa2cd41..55bc4c975f 100644
--- a/ecrire/inc/forum.php
+++ b/ecrire/inc/forum.php
@@ -257,23 +257,22 @@ function racine_forum($id_forum){
 } 
 
 // http://doc.spip.org/@generer_url_forum_dist
-function generer_url_forum_dist($id_forum, $show_thread=false) {
+function generer_url_forum_dist($id_forum, $args='', $ancre='') {
 	if (!$id_forum) return '';
 	list($type, $id, $id_thread) = racine_forum($id_forum);
-	if ($id_thread>0 AND $show_thread)
-		$id_forum = $id_thread;
+	if (!$ancre) $ancre = "forum$id_forum";
 	switch($type) {
 		case 'article':
-			return generer_url_article($id)."#forum$id_forum";
+			return generer_url_article($id, $args, $ancre);
 			break;
 		case 'breve':
-			return generer_url_breve($id)."#forum$id_forum";
+			return generer_url_breve($id, $args, $ancre);
 			break;
 		case 'rubrique':
-			return generer_url_rubrique($id)."#forum$id_forum";
+			return generer_url_rubrique($id, $args, $ancre);
 			break;
 		case 'site':
-			return generer_url_site($id)."#forum$id_forum";
+			return generer_url_site($id, $args, $ancre);
 			break;
 		default:
 		  return '';
diff --git a/ecrire/inc/notifications.php b/ecrire/inc/notifications.php
index 3d471d837b..dbf34d1c98 100644
--- a/ecrire/inc/notifications.php
+++ b/ecrire/inc/notifications.php
@@ -88,7 +88,7 @@ function notifier_publication_article($id_article) {
 
 			// URL de l'article
 			charger_generer_url();
-			$url = url_absolue(generer_url_article($id_article, true));
+			$url = url_absolue(generer_url_article($id_article, '','', 'publie'));
 
 			$titre = nettoyer_titre_email($row['titre']);
 
diff --git a/ecrire/inc/texte.php b/ecrire/inc/texte.php
index 01ae4bb8a7..9f16bc0844 100644
--- a/ecrire/inc/texte.php
+++ b/ecrire/inc/texte.php
@@ -16,7 +16,6 @@ include_spip('inc/filtres');
 include_spip('inc/charsets');
 include_spip('inc/lang');
 
-
 //
 // Gerer les variables de personnalisation, qui peuvent provenir
 // des fichiers d'appel, en verifiant qu'elles n'ont pas ete passees
@@ -514,13 +513,13 @@ function typo($letexte, $echapper=true) {
 	return $letexte;
 }
 
-// traitement des raccourcis issus de [TITRE->RACCOURCInnn] et connexes
+// analyse des raccourcis issus de [TITRE->RACCOURCInnn] et connexes
 
-define('_RACCOURCI_URL', ',^(\S*?)\s*(\d+)(\?.*?)?(#[^\s]*)?$,S');
+define('_RACCOURCI_URL', ',^\s*(\w*?)\s*(\d+)(\?(.*?))?(#([^\s]*))?\s*$,S');
 
 // http://doc.spip.org/@typer_raccourci
 function typer_raccourci ($lien) {
-	if (!preg_match(_RACCOURCI_URL, trim($lien), $match)) return false;
+	if (!preg_match(_RACCOURCI_URL, $lien, $match)) return array();
 	$f = $match[1];
 	// valeur par defaut et alias historiques
 	if (!$f) $f = 'article';
@@ -539,37 +538,28 @@ function typer_raccourci ($lien) {
 // associe a une fonction generer_url_raccourci()
 //
 // Valeur retournee selon le parametre $pour:
-// 'tout' : <a href="L">T</a>
+// 'tout' : tableau [U,C,T,L] (vise <a href="U" class='C' hreflang='L'>T</a>)
 // 'titre': seulement T ci-dessus (i.e. le TITRE ci-dessus ou dans table SQL)
-// 'url':   seulement L (i.e. generer_url_RACCOURCI)
+// 'url':   seulement U  (i.e. generer_url_RACCOURCI)
 
 // http://doc.spip.org/@calculer_url
 function calculer_url ($lien, $texte='', $pour='url') {
-	$lien = vider_url($lien); # supprimer 'http://' ou 'mailto:'
+	$lien = vider_url($lien); # 'http://' ou 'mailto:' seuls == ""
 	if ($match = typer_raccourci ($lien)) {
-		@list($f,$objet,$id,$params,$ancre) = $match;
-		// chercher la fonction nommee generer_url_$raccourci
-		// ou calculer_url_raccourci si on n'a besoin que du lien
-		$f=(($pour == 'url') ? 'generer' : 'calculer') . '_url_' . $f;
+		@list($f,,$id,,$param,,$ancre) = $match;
 		charger_generer_url();
-		if (function_exists($f) OR function_exists($f .= '_dist')) {
-			if ($pour == 'url') {
-				$url = $f($id);
-				if ($params)
-					$url .= (strstr($url, '?') ? '&amp;' : '?')
-						. substr($params,1);
-				return $url . $ancre;
-			}
-
-			$res = $f($id, $texte, $ancre);
-			if ($pour == 'titre')
+		$g = 'generer_url_' . $f;
+		if (function_exists($g) OR function_exists($g .= '_dist')) {
+			$res = $g($id, $param, $ancre);
+			if ($pour == 'url') return $res;
+			$g = 'calculer_url_' . $f;
+			if (function_exists($g) OR function_exists($g .= '_dist')) { 
+				if ($pour == 'tout')
+					return $g($id, $texte, $res);
+				$res = $g($id, $texte, $res);
 				return $res[2];
-			if ($params)
-				$res[0] .= (strstr($res[0], '?') ? '&amp;' : '?')
-					. substr($params,1);
-			$res[0] .= $ancre;
-			return $res;
-		}
+			}
+		} else spip_log("raccourci indefini $f");
 	}
   
 	$lien = ltrim($lien);
@@ -606,8 +596,7 @@ function calculer_url ($lien, $texte='', $pour='url') {
 }
 
 // http://doc.spip.org/@calculer_url_article_dist
-function calculer_url_article_dist($id, $texte='') {
-	$lien = generer_url_article($id);
+function calculer_url_article_dist($id, $texte, $lien) {
 	$s = spip_query("SELECT titre,lang FROM spip_articles WHERE id_article=$id");
 	$row = spip_fetch_array($s);
 	if (!trim($texte))
@@ -618,60 +607,58 @@ function calculer_url_article_dist($id, $texte='') {
 }
 
 // http://doc.spip.org/@calculer_url_rubrique_dist
-function calculer_url_rubrique_dist($id, $texte='')
+function calculer_url_rubrique_dist($id, $texte, $lien)
 {
-	$lien = generer_url_rubrique($id);
 	$s = spip_query("SELECT titre,lang FROM spip_rubriques WHERE id_rubrique=$id");
 	$row = spip_fetch_array($s);
-	if (!trim($texte))
+	if (!trim($texte)) {
 		$texte = supprimer_numero($row['titre']);
-	if (!trim($texte))
-	    $texte = $id;
+		if (!trim($texte))
+		  $texte = $id;
+	}
 	return array($lien, 'spip_in', $texte, $row['lang']);
 }
 
-// http://doc.spip.org/@calculer_url_mot_dist
-function calculer_url_mot_dist($id, $texte='')
-{
-	$lien = generer_url_mot($id);
-	$s = spip_query("SELECT titre FROM spip_mots WHERE id_mot=$id");
-	$row = spip_fetch_array($s);
-	if (!trim($texte))
-		$texte = supprimer_numero($row['titre']);
-	if (!trim($texte))
-	    $texte = $id;
-	return array($lien, 'spip_in', $texte);
-}
-
 // http://doc.spip.org/@calculer_url_breve_dist
-function calculer_url_breve_dist($id, $texte='')
+ function calculer_url_breve_dist($id, $texte, $lien)
 {
-	$lien = generer_url_breve($id);
 	$s = spip_query("SELECT titre,lang FROM spip_breves WHERE id_breve=$id");
 	$row = spip_fetch_array($s);
-	if (!trim($texte))
+	if (!trim($texte)) {
 		$texte = supprimer_numero($row['titre']);
-	if (!trim($texte))
-	    $texte = $id;
+		if (!trim($texte))
+		  $texte = $id;
+	}
 	return array($lien, 'spip_in', $texte, $row['lang']);
 }
 
 // http://doc.spip.org/@calculer_url_auteur_dist
-function calculer_url_auteur_dist($id, $texte='')
+ function calculer_url_auteur_dist($id, $texte, $lien)
 {
-	$lien = generer_url_auteur($id);
 	if ($texte=='') {
 		$s = spip_query("SELECT nom FROM spip_auteurs WHERE id_auteur=$id");
-	$row = spip_fetch_array($s);
+		$row = spip_fetch_array($s);
 		$texte = $row['nom'];
 	}
 	return array($lien, 'spip_in', $texte); # pas de hreflang
 }
 
+// http://doc.spip.org/@calculer_url_mot_dist
+function calculer_url_mot_dist($id, $texte, $lien)
+{
+	if (!trim($texte)) {
+		$s = spip_query("SELECT titre FROM spip_mots WHERE id_mot=$id");
+		$row = spip_fetch_array($s);
+		$texte = supprimer_numero($row['titre']);
+		if (!trim($texte))
+		  $texte = $id;
+	}
+	return array($lien, 'spip_in', $texte);
+}
+
 // http://doc.spip.org/@calculer_url_document_dist
-function calculer_url_document_dist($id, $texte='')
+ function calculer_url_document_dist($id, $texte, $lien)
 {
-	$lien = generer_url_document($id);
 	if ($texte=='') {
 		$s = spip_query("SELECT titre,fichier FROM spip_documents WHERE id_document=$id");
 		$row = spip_fetch_array($s);
@@ -685,7 +672,7 @@ function calculer_url_document_dist($id, $texte='')
 }
 
 // http://doc.spip.org/@calculer_url_site_dist
-function calculer_url_site_dist($id, $texte='')
+function calculer_url_site_dist($id, $texte, $lien)
 {
 	# attention dans le cas des sites le lien pointe non pas sur
 	# la page locale du site, mais directement sur le site lui-meme
@@ -702,9 +689,8 @@ function calculer_url_site_dist($id, $texte='')
 }
 
 // http://doc.spip.org/@calculer_url_forum_dist
-function calculer_url_forum_dist($id, $texte='')
+function calculer_url_forum_dist($id, $texte, $lien)
 {
-	$lien = generer_url_forum($id);
 	if (!trim($texte)) {
 		$s = spip_query("SELECT titre FROM spip_forum WHERE id_forum=$id AND statut='publie'");
 		$row = spip_fetch_array($s);
@@ -715,7 +701,6 @@ function calculer_url_forum_dist($id, $texte='')
 	return array($lien, 'spip_in', $texte); # pas de hreflang
 }
 
-
 //
 // Tableaux
 //
diff --git a/ecrire/inc/urls.php b/ecrire/inc/urls.php
index 5f819339f5..a98f46a372 100644
--- a/ecrire/inc/urls.php
+++ b/ecrire/inc/urls.php
@@ -16,69 +16,89 @@ if (!defined("_ECRIRE_INC_VERSION")) return;
 // des items des tables SQL principales, selon le statut de publication
 
 // http://doc.spip.org/@generer_url_ecrire_article
-function generer_url_ecrire_article($id_article, $statut='') {
-	$args = "id_article=" . intval($id_article);
-	if (!$statut)
-		$statut = spip_fetch_array(spip_query("SELECT statut FROM spip_articles WHERE $args"));
-	if ($statut['statut'] == 'publie')
-		return generer_url_action('redirect', $args);
-	else	return generer_url_ecrire('articles', $args);
+function generer_url_ecrire_article($id, $suite='', $ancre='', $statut='') {
+	$a = "id_article=" . intval($id);
+	if (!$statut) {
+		$statut = spip_fetch_array(spip_query("SELECT statut FROM spip_articles WHERE $a"), SPIP_NUM);
+		$statut = $statut[0];
+	}
+	if ($suite) $a .= "&$suite";
+	if ($statut == 'publie') {
+		$a .= "&ancre=" . $ancre;
+		return generer_url_action('redirect', $a);
+	} else	return generer_url_ecrire('articles', $a) . ($ancre ? "#$ancre" : '');
 }
 
 // http://doc.spip.org/@generer_url_ecrire_rubrique
-function generer_url_ecrire_rubrique($id_rubrique, $statut='') {
-	$args = "id_rubrique=" . intval($id_rubrique);
-	if (!$statut)
-		$statut = spip_fetch_array(spip_query("SELECT statut FROM spip_rubriques WHERE $args"));
-	if ($statut['statut'] == 'publie')
-		return generer_url_action('redirect', $args);
-	else	return generer_url_ecrire('naviguer',$args);
+function generer_url_ecrire_rubrique($id, $suite='', $ancre='', $statut='') {
+	$a = "id_rubrique=" . intval($id);
+	if (!$statut) {
+		$statut = spip_fetch_array(spip_query("SELECT statut FROM spip_rubriques WHERE $a"), SPIP_NUM);
+		$statut = $statut[0];
+	}
+	if ($suite) $a .= "&$suite";
+	if ($statut == 'publie') {
+		$a .= "&ancre=" . $ancre;
+		return generer_url_action('redirect', $a);
+	} else	return generer_url_ecrire('naviguer',$a) . ($ancre ? "#$ancre" : '');
 }
 
 // http://doc.spip.org/@generer_url_ecrire_breve
-function generer_url_ecrire_breve($id_breve, $statut='') {
-	$args = "id_breve=" . intval($id_breve);
-	if (!$statut)
-		$statut = spip_fetch_array(spip_query("SELECT statut FROM spip_breves WHERE $args"));
-	if ($statut['statut'] == 'publie')
-		return generer_url_action('redirect', $args);
-	else	return generer_url_ecrire('breves_voir',$args);
+function generer_url_ecrire_breve($id, $suite='', $ancre='', $statut='') {
+	$a = "id_breve=" . intval($id);
+	if (!$statut) {
+		$statut = spip_fetch_array(spip_query("SELECT statut FROM spip_breves WHERE $a"), SPIP_NUM);
+		$statut = $statut[0];
+	}
+	if ($suite) $a .= "&$suite";
+	if ($statut == 'publie') {
+		$a .= "&ancre=" . $ancre;
+		return generer_url_action('redirect', $a);
+	} else	return generer_url_ecrire('breves_voir',$a) . ($ancre ? "#$ancre" : '');
 }
 
 // http://doc.spip.org/@generer_url_ecrire_mot
-function generer_url_ecrire_mot($id_mot, $statut='') {
-	$args = "id_mot=" . intval($id_mot);
-	if (!$statut)
-		return generer_url_action('redirect', $args);
-	else	return generer_url_ecrire('mots_edit',$args);
+function generer_url_ecrire_mot($id, $suite='', $ancre='', $statut='') {
+	$a = "id_mot=" . intval($id);
+	if ($suite) $a .= "&$suite";
+	if (!$statut) {
+		$a .= "&ancre=" . $ancre;
+		return generer_url_action('redirect', $a);
+	} else	return generer_url_ecrire('mots_edit',$a) . ($ancre ? "#$ancre" : '');
 }
 
 // http://doc.spip.org/@generer_url_ecrire_site
-function generer_url_ecrire_site($id_syndic, $statut='') {
-	$args = "id_syndic=" . intval($id_syndic);
-	if (!$statut)
-		return generer_url_action('redirect', $args);
-	else	return generer_url_ecrire('sites',$args);
+function generer_url_ecrire_site($id, $suite='', $ancre='', $statut='') {
+	$a = "id_syndic=" . intval($id);
+	if ($suite) $a .= "&$suite";
+	if (!$statut) {
+		$a .= "&ancre=" . $ancre;
+		return generer_url_action('redirect', $a);
+	} else	return generer_url_ecrire('sites',$a) . ($ancre ? "#$ancre" : '');
 }
 
 // http://doc.spip.org/@generer_url_ecrire_auteur
-function generer_url_ecrire_auteur($id_auteur, $statut='') {
-	$args = "id_auteur=" . intval($id_auteur);
-	if (!$statut)
-		return generer_url_action('redirect', $args);
-	else
-		return generer_url_ecrire('auteur_infos',$args);
+function generer_url_ecrire_auteur($id, $suite='', $ancre='', $statut='') {
+	$a = "id_auteur=" . intval($id);
+	if ($suite) $a .= "&$suite";
+	if (!$statut) {
+		$a .= "&ancre=" . $ancre;
+		return generer_url_action('redirect', $a);
+	} else	return generer_url_ecrire('auteur_infos',$a) . ($ancre ? "#$ancre" : '');
 }
 
 // http://doc.spip.org/@generer_url_ecrire_forum
-function generer_url_ecrire_forum($id_forum, $statut='') {
-	return generer_url_action('redirect', "id_forum=$id_forum");
+function generer_url_ecrire_forum($id, $suite='', $ancre='', $statut='') {
+	$a = "id_forum=" . intval($id);
+	if ($suite) $a .= "&$suite"; 
+	$a .= "&ancre=" . $ancre;
+	return generer_url_action('redirect', $a);
 }
 
 // http://doc.spip.org/@generer_url_ecrire_document
-function generer_url_ecrire_document($id_document, $statut='') {
+function generer_url_ecrire_document($id, $suite='', $ancre='', $statut='') {
 	include_spip('inc/documents');
-	return generer_url_document_dist($id_document);
+	return generer_url_document_dist($id);
 }
 
 // http://doc.spip.org/@generer_url_ecrire_statistiques
@@ -93,43 +113,43 @@ if (!_DIR_RESTREINT) {
 
   if (!function_exists('generer_url_article')) {
 // http://doc.spip.org/@generer_url_article
-	function generer_url_article($id, $stat='')
-		{ return generer_url_ecrire_article($id, $stat);}
+	function generer_url_article($id, $args='', $ancre='', $stat='')
+		{ return generer_url_ecrire_article($id, $args, $ancre, $stat);}
   }
   if (!function_exists('generer_url_rubrique')) {
 // http://doc.spip.org/@generer_url_rubrique
-	function generer_url_rubrique($id, $stat='')
-		{ return generer_url_ecrire_rubrique($id, $stat);}
+	function generer_url_rubrique($id, $args='', $ancre='', $stat='')
+		{ return generer_url_ecrire_rubrique($id, $args, $ancre, $stat);}
   }
   if (!function_exists('generer_url_breve')) {
 // http://doc.spip.org/@generer_url_breve
-	function generer_url_breve($id, $stat='')
-		{ return generer_url_ecrire_breve($id, $stat);}
+	function generer_url_breve($id, $args='', $ancre='', $stat='')
+		{ return generer_url_ecrire_breve($id, $args, $ancre, $stat);}
   }
   if (!function_exists('generer_url_mot')) {
 // http://doc.spip.org/@generer_url_mot
-	function generer_url_mot($id, $stat='')
-		{ return generer_url_ecrire_mot($id, $stat);}
+	function generer_url_mot($id, $args='', $ancre='', $stat='')
+		{ return generer_url_ecrire_mot($id, $args, $ancre, $stat);}
   }
   if (!function_exists('generer_url_site')) {
 // http://doc.spip.org/@generer_url_site
-	function generer_url_site($id, $stat='')
-		{ return generer_url_ecrire_site($id, $stat);}
+	function generer_url_site($id, $args='', $ancre='', $stat='')
+		{ return generer_url_ecrire_site($id, $args, $ancre, $stat);}
   }
   if (!function_exists('generer_url_auteur')) {
 // http://doc.spip.org/@generer_url_auteur
-	function generer_url_auteur($id, $stat='')
-		{ return generer_url_ecrire_auteur($id, $stat);}
+	function generer_url_auteur($id, $args='', $ancre='', $stat='')
+		{ return generer_url_ecrire_auteur($id, $args, $ancre, $stat);}
   }
   if (!function_exists('generer_url_forum')) {
 // http://doc.spip.org/@generer_url_forum
-	function generer_url_forum($id, $stat='')
-		{ return generer_url_ecrire_forum($id, $stat);}
+	function generer_url_forum($id, $args='', $ancre='', $stat='')
+		{ return generer_url_ecrire_forum($id, $args, $ancre, $stat);}
   }
   if (!function_exists('generer_url_document')) {
 // http://doc.spip.org/@generer_url_document
-	function generer_url_document($id, $stat='')
-		{ return generer_url_ecrire_document($id, $stat);}
+	function generer_url_document($id, $args='', $ancre='', $stat='')
+		{ return generer_url_ecrire_document($id, $args, $ancre, $stat);}
   }
  }
 ?>
\ No newline at end of file
diff --git a/ecrire/urls/html.php b/ecrire/urls/html.php
index c6bd0cc9cb..5358a161b2 100644
--- a/ecrire/urls/html.php
+++ b/ecrire/urls/html.php
@@ -37,39 +37,39 @@ if (!defined("_ECRIRE_INC_VERSION")) return; // securiser
 if (!function_exists('generer_url_article')) { // si la place n'est pas prise
 
 // http://doc.spip.org/@generer_url_article
-function generer_url_article($id_article) {
-	return "article$id_article.html";
+function generer_url_article($id_article, $args='', $ancre='') {
+	return "article$id_article.html" . ($args ? "?$args" : '') . ($ancre ? "#$ancre" : '');
 }
 
 // http://doc.spip.org/@generer_url_rubrique
-function generer_url_rubrique($id_rubrique) {
-	return "rubrique$id_rubrique.html";
+function generer_url_rubrique($id_rubrique, $args='', $ancre='') {
+	return "rubrique$id_rubrique.html" . ($args ? "?$args" : '') . ($ancre ? "#$ancre" : '');
 }
 
 // http://doc.spip.org/@generer_url_breve
-function generer_url_breve($id_breve) {
-	return "breve$id_breve.html";
+function generer_url_breve($id_breve, $args='', $ancre='') {
+	return "breve$id_breve.html" . ($args ? "?$args" : '') .($ancre ? "#$ancre" : '');
 }
 
 // http://doc.spip.org/@generer_url_mot
-function generer_url_mot($id_mot) {
-	return "mot$id_mot.html";
+function generer_url_mot($id_mot, $args='', $ancre='') {
+	return "mot$id_mot.html" . ($args ? "?$args" : '') .($ancre ? "#$ancre" : '');
 }
 
 // http://doc.spip.org/@generer_url_site
-function generer_url_site($id_syndic) {
-	return "site$id_syndic.html";
+function generer_url_site($id_syndic, $args='', $ancre='') {
+	return "site$id_syndic.html" . ($args ? "?$args" : '') .($ancre ? "#$ancre" : '');
 }
 
 // http://doc.spip.org/@generer_url_auteur
-function generer_url_auteur($id_auteur) {
-	return "auteur$id_auteur.html";
+function generer_url_auteur($id_auteur, $args='', $ancre='') {
+	return "auteur$id_auteur.html" . ($args ? "?$args" : '') .($ancre ? "#$ancre" : '');
 }
 
 // http://doc.spip.org/@generer_url_document
-function generer_url_document($id_document) {
+function generer_url_document($id_document, $args='', $ancre='') {
 	include_spip('inc/documents');
-	return generer_url_document_dist($id_document);
+	return generer_url_document_dist($id_document, $args, $ancre);
 }
 
 
@@ -108,9 +108,9 @@ function recuperer_parametres_url($fond, $url) {
 //
 
 // http://doc.spip.org/@generer_url_forum
-function generer_url_forum($id_forum, $show_thread=false) {
+function generer_url_forum($id_forum, $args='', $ancre='') {
 	include_spip('inc/forum');
-	return generer_url_forum_dist($id_forum, $show_thread);
+	return generer_url_forum_dist($id_forum, $args, $ancre);
 }
  }
 ?>
diff --git a/ecrire/urls/page.php b/ecrire/urls/page.php
index bbb6147fed..654bb7218c 100644
--- a/ecrire/urls/page.php
+++ b/ecrire/urls/page.php
@@ -26,43 +26,45 @@ define ('_debut_urls_page', get_spip_script('./').'?');
 
 
 // http://doc.spip.org/@composer_url_page
-function composer_url_page($page,$id) {
-	return _debut_urls_page . $page . _separateur_urls_page
-	. $id . _terminaison_urls_page;
+function composer_url_page($page,$id, $args='', $ancre='') {
+	$url = _debut_urls_page . $page . _separateur_urls_page
+	  . $id . _terminaison_urls_page;
+	if ($args) $args = strpos($url,'?') ? "&args" : "?$args";
+	return $url . $args . ($ancre ? "#$ancre" : '');
 }
 
 // http://doc.spip.org/@generer_url_article
-function generer_url_article($id_article) {
-	return composer_url_page('article', $id_article);
+function generer_url_article($id_article, $args='', $ancre='') {
+	return composer_url_page('article', $id_article, $args, $ancre);
 }
 
 // http://doc.spip.org/@generer_url_rubrique
-function generer_url_rubrique($id_rubrique) {
-	return composer_url_page('rubrique', $id_rubrique);
+function generer_url_rubrique($id_rubrique, $args='', $ancre='') {
+	return composer_url_page('rubrique', $id_rubrique, $args, $ancre);
 }
 
 // http://doc.spip.org/@generer_url_breve
-function generer_url_breve($id_breve) {
-	return composer_url_page('breve', $id_breve);
+function generer_url_breve($id_breve, $args='', $ancre='') {
+	return composer_url_page('breve', $id_breve, $args, $ancre);
 }
 
 // http://doc.spip.org/@generer_url_mot
-function generer_url_mot($id_mot) {
-	return composer_url_page('mot', $id_mot);
+function generer_url_mot($id_mot, $args='', $ancre='') {
+	return composer_url_page('mot', $id_mot, $args, $ancre);
 }
 
 // http://doc.spip.org/@generer_url_site
-function generer_url_site($id_syndic) {
-	return composer_url_page('site', $id_syndic);
+function generer_url_site($id_syndic, $args='', $ancre='') {
+	return composer_url_page('site', $id_syndic, $args, $ancre);
 }
 
 // http://doc.spip.org/@generer_url_auteur
-function generer_url_auteur($id_auteur) {
-	return composer_url_page('auteur', $id_auteur);
+function generer_url_auteur($id_auteur, $args='', $ancre='') {
+	return composer_url_page('auteur', $id_auteur, $args, $ancre);
 }
 
 // http://doc.spip.org/@generer_url_document
-function generer_url_document($id_document) {
+function generer_url_document($id_document, $args='', $ancre='') {
 	include_spip('inc/documents');
 	return generer_url_document_dist($id_document);
 }
@@ -117,9 +119,9 @@ function recuperer_parametres_url(&$fond, $url) {
 //
 
 // http://doc.spip.org/@generer_url_forum
-function generer_url_forum($id_forum, $show_thread=false) {
+function generer_url_forum($id_forum, $args='', $ancre='') {
 	include_spip('inc/forum');
-	return generer_url_forum_dist($id_forum, $show_thread);
+	return generer_url_forum_dist($id_forum, $args, $ancre);
 }
  }
 ?>
diff --git a/ecrire/urls/propres.php b/ecrire/urls/propres.php
index 16a4324c1e..18a9a3048f 100644
--- a/ecrire/urls/propres.php
+++ b/ecrire/urls/propres.php
@@ -136,69 +136,82 @@ function _generer_url_propre($type, $id_objet) {
 }
 
 // http://doc.spip.org/@generer_url_article
-function generer_url_article($id_article) {
+function generer_url_article($id_article, $args='', $ancre='') {
+  spip_log("generer_url_article($id_article, $args='', $ancre");
 	$url = _generer_url_propre('article', $id_article);
 	if ($url)
-		return _debut_urls_propres . $url . _terminaison_urls_propres;
+		$url = _debut_urls_propres . $url . _terminaison_urls_propres  . ($args ? "?$args" : '');
 	else
-		return get_spip_script('./')."?page=article&id_article=$id_article";
+		$url = get_spip_script('./')."?page=article&id_article=$id_article" . ($args ? "&$args" : '');
+	if ($ancre) $url .= "#$ancre";
+	return $url;
 }
 
 // http://doc.spip.org/@generer_url_rubrique
-function generer_url_rubrique($id_rubrique) {
+function generer_url_rubrique($id_rubrique, $args='', $ancre='') {
 	$url = _generer_url_propre('rubrique', $id_rubrique);
 	if ($url)
-		return _debut_urls_propres . '-'.$url.'-'._terminaison_urls_propres;
+		$url = _debut_urls_propres . '-'.$url.'-'._terminaison_urls_propres . ($args ? "?$args" : '');
 	else
-		return get_spip_script('./')."?page=rubrique&id_rubrique=$id_rubrique";
+		$url = get_spip_script('./')."?page=rubrique&id_rubrique=$id_rubrique" . ($args ? "&$args" : '');
+	if ($ancre) $url .= "#$ancre";
+	return $url;
 }
 
 // http://doc.spip.org/@generer_url_breve
-function generer_url_breve($id_breve) {
+function generer_url_breve($id_breve, $args='', $ancre='') {
 	$url = _generer_url_propre('breve', $id_breve);
 	if ($url)
-		return _debut_urls_propres . '+'.$url.'+'._terminaison_urls_propres;
+		$url = _debut_urls_propres . '+'.$url.'+'._terminaison_urls_propres . ($args ? "?$args" : '');
 	else
-		return get_spip_script('./')."?page=breve&id_breve=$id_breve";
+		$url = get_spip_script('./')."?page=breve&id_breve=$id_breve"  . ($args ? "&$args" : '');
+	if ($ancre) $url .= "#$ancre";
+	return $url;
 }
 
 // http://doc.spip.org/@generer_url_forum
-function generer_url_forum($id_forum, $show_thread=false) {
+function generer_url_forum($id_forum, $args='', $ancre='') {
 	include_spip('inc/forum');
-	return generer_url_forum_dist($id_forum, $show_thread);
+	return generer_url_forum_dist($id_forum, $args, $ancre);
 }
 
 // http://doc.spip.org/@generer_url_mot
-function generer_url_mot($id_mot) {
+function generer_url_mot($id_mot, $args='', $ancre='') {
 	$url = _generer_url_propre('mot', $id_mot);
 	if ($url)
-		return _debut_urls_propres . '+-'.$url.'-+'._terminaison_urls_propres;
+		$url = _debut_urls_propres . '+-'.$url.'-+'._terminaison_urls_propres . ($args ? "?$args" : '');
 	else
-		return get_spip_script('./')."?page=mot&id_mot=$id_mot";
+		$url = get_spip_script('./')."?page=mot&id_mot=$id_mot" . ($args ? "&$args" : '');
+	if ($ancre) $url .= "#$ancre";
+	return $url;
 }
 
 // http://doc.spip.org/@generer_url_auteur
-function generer_url_auteur($id_auteur) {
+function generer_url_auteur($id_auteur, $args='', $ancre='') {
 	$url = _generer_url_propre('auteur', $id_auteur);
 	if ($url)
-		return _debut_urls_propres . '_'.$url.'_'._terminaison_urls_propres;
+		$url = _debut_urls_propres . '_'.$url.'_'._terminaison_urls_propres . ($args ? "?$args" : '');
 	else
-		return get_spip_script('./')."?page=auteur&id_auteur=$id_auteur";
+		$url = get_spip_script('./')."?page=auteur&id_auteur=$id_auteur" . ($args ? "&$args" : '');
+	if ($ancre) $url .= "#$ancre";
+	return $url;
 }
 
 // http://doc.spip.org/@generer_url_site
-function generer_url_site($id_syndic) {
+function generer_url_site($id_syndic, $args='', $ancre='') {
 	$url = _generer_url_propre('site', $id_syndic);
 	if ($url)
-		return _debut_urls_propres . '@'.$url.'@'._terminaison_urls_propres;
+		$url = _debut_urls_propres . '@'.$url.'@'._terminaison_urls_propres . ($args ? "?$args" : '');
 	else
-		return get_spip_script('./')."?page=site&id_syndic=$id_syndic";
+		$url = get_spip_script('./')."?page=site&id_syndic=$id_syndic" . ($args ? "&$args" : '');
+	if ($ancre) $url .= "#$ancre";
+	return $url;
 }
 
 // http://doc.spip.org/@generer_url_document
-function generer_url_document($id_document) {
+function generer_url_document($id_document, $args='', $ancre='') {
 	include_spip('inc/documents');
-	return generer_url_document_dist($id_document);
+	return generer_url_document_dist($id_document, $args, $ancre);
 }
 
 // http://doc.spip.org/@recuperer_parametres_url
-- 
GitLab