Ancres des notes de bas de page pour les URL arborescente #3882

Closed
opened 6 years ago by Yohooo · 14 comments
Yohooo commented 6 years ago

Lorsque les URL arborescentes sont activées, les ancres générées par Spip (donc, aussi des notes de bas de pages ) pointent vers l'URL de base.

Cela est dû à l'ajout de la balise "bsae href" dans le head
Dans ce cas, les ancres générées par Spip doivent donc pointer vers : #URL_SITE_SPIP/[ma_page]/#[mon_ancre]

Lorsque les URL arborescentes sont activées, les ancres générées par Spip (donc, aussi des notes de bas de pages ) pointent vers l'URL de base. Cela est dû à l'ajout de la balise "bsae href" dans le head Dans ce cas, les ancres générées par Spip doivent donc pointer vers : #URL_SITE_SPIP/[ma_page]/#[mon_ancre]
b_b commented 6 years ago
Owner

Salut, quelle version de SPIP ? As-tu une url à partager pour décortiquer le problème ?

Salut, quelle version de SPIP ? As-tu une url à partager pour décortiquer le problème ?
b_b commented 6 years ago
Owner
There is no content yet.
Poster

La dernière version de spip.

Visible sur plusieurs sites.
J'ai pris l'habitude de corriger le pb en ajoutant un filtre :

|replace{'href="#',href="#URL_ARTICLE#}

... sur les balises #TEXTE, #NOTES et #CHAPO

La dernière version de spip. Visible sur plusieurs sites. J'ai pris l'habitude de corriger le pb en ajoutant un filtre : <pre> |replace{'href="#',href="#URL_ARTICLE#} </pre> ... sur les balises _#TEXTE_, _#NOTES_ et _#CHAPO_
b_b commented 6 years ago
Owner

As-tu une url à partager pour décortiquer le problème ?

Visible sur plusieurs sites.

Oui, mais lesquels ? :)

> As-tu une url à partager pour décortiquer le problème ? > Visible sur plusieurs sites. Oui, mais lesquels ? :)
b_b commented 6 years ago
Owner

Sur SPIP 3.2 dev avec les urls arbos, sur l'url http://localhost/trunk/actualites/article/notes-de-bas-de-page :

  • j'ai bien un base href <base href="http://localhost/trunk/" />
  • l'url d'une note est http://localhost/trunk/actualites/article/notes-de-bas-de-page#nb1 et elle est bien fonctionnelle

=> ça marche chez moi ©
Version cible mise à 3.1
Statut changé à En cours

Sur SPIP 3.2 dev avec les urls arbos, sur l'url `http://localhost/trunk/actualites/article/notes-de-bas-de-page` : - j'ai bien un base href `<base href="http://localhost/trunk/" />` - l'url d'une note est `http://localhost/trunk/actualites/article/notes-de-bas-de-page#nb1` et elle est bien fonctionnelle => ça marche chez moi © **Version cible mise à 3.1** **Statut changé à En cours**
Poster

Problème rencontré sous spip 3.1

Un exemple sur cet article avec les notes de bas de page :
http://vps321533.ovh.net/aide-a-destination-des-redacteurs/article/quelques-exemples-de-raccourcis

Les ancres du sommaire (généré via le plugin) et des notes de bas de page fonctionnent grâce à 2 filtres insérés derrière les balises #TEXTE, #CHAPO et #NOTES :

|replace{'href="#',href="#URL_ARTICLE#}|replace{"href='#",href='#URL_ARTICLE#}
  • Lorsque je retire le "" ( via le couteau kiss ), les ancres marchent (mais je rencontre d'autres problèmes -> ce n'est pas une solution)
  • Le problème n'est pas lié à un plugin particulier
  • j'utilise le htaccess de base de spip , mon site étant dans un sous-répertoire, j'ai essayé de dé-commenter les lignes 26 et 27 mais cela ne change rien.

Je me rappelle avoir rencontré le même type de problème sur d'autres site si bien que j'ai pris l'habitude d'ajouter les filtres ci dessus sur mes balises texte. J'ai essayé de re-soulever le capot après m'être rendu compte que le premier filtre ne marchait pas avec les ancres remontantes du plugin sommaire d'article n'était pas corrigé. C'est pour cela que j'ai ajouté un deuxieme filtre.

Sur le Forum de Spip, certains rencontrent ce problème à plusieurs reprise sans autre solution que de changer de type d'URL ou de supprimer le la balise "base href" :

J'ai oublié une config ou c'est un dysfonctionnement de Spip ?

Problème rencontré sous spip 3.1 Un exemple sur cet article avec les notes de bas de page : http://vps321533.ovh.net/aide-a-destination-des-redacteurs/article/quelques-exemples-de-raccourcis Les ancres du sommaire (généré via le plugin) et des notes de bas de page fonctionnent grâce à 2 filtres insérés derrière les balises #TEXTE, #CHAPO et #NOTES : <pre> |replace{'href="#',href="#URL_ARTICLE#}|replace{"href='#",href='#URL_ARTICLE#} </pre> * Lorsque je retire le "<base href="http://vps321533.ovh.net/" />" ( via le couteau kiss ), les ancres marchent (mais je rencontre d'autres problèmes -> ce n'est pas une solution) * Le problème n'est pas lié à un plugin particulier * j'utilise le htaccess de base de spip , mon site étant dans un sous-répertoire, j'ai essayé de dé-commenter les lignes 26 et 27 mais cela ne change rien. Je me rappelle avoir rencontré le même type de problème sur d'autres site si bien que j'ai pris l'habitude d'ajouter les filtres ci dessus sur mes balises texte. J'ai essayé de re-soulever le capot après m'être rendu compte que le premier filtre ne marchait pas avec les ancres remontantes du plugin sommaire d'article n'était pas corrigé. C'est pour cela que j'ai ajouté un deuxieme filtre. Sur le Forum de Spip, certains rencontrent ce problème à plusieurs reprise sans autre solution que de changer de type d'URL ou de supprimer le la balise "base href" : * http://forum.spip.net/fr_251075.html * http://forum.spip.net/fr_231410.html J'ai oublié une config ou c'est un dysfonctionnement de Spip ?
Owner

Laurent Lefebvre a écrit :

Les ancres du sommaire (généré via le plugin) ...

Je viens de tester sur SPIP 3.1.3 avec Plugin Table des matières 2.3.3, je ne reproduis pas le problème...

  • Le problème n'est pas lié à un plugin particulier

Tu as tout désactivé puis réactivé 1 par 1 pour voir ?

J'ai oublié une config ou c'est un dysfonctionnement de Spip ?

En fait dans ta description initiale, il y a un truc qui ne va pas:

Lorsque les URL arborescentes sont activées, les ancres générées par Spip (donc, aussi des notes de bas de pages ) pointent vers l'URL de base.
Cela est dû à l'ajout de la balise "bsae href" dans le head

Euh, non: ce que cette balise fait c'est de dire au navigateur "si tu trouves une URL relative, sache que tu dois y référer via "href=...", ça ne devrait pas supprimer l'URI arbo relatives (et ça ne le fait pas chez moi)

Dans ce cas, les ancres générées par Spip doivent donc pointer vers : #URL_SITE_SPIP/[ma_page]/#[mon_ancre]

Euh non, plutôt vers unrep/unautrerep/article/titrearticle#ancre
La disparition de l'uri relative n'est pas normale.

Quels sont les "autres problèmes" que tu évoques quand tu supprimes le base href ?

Laurent Lefebvre a écrit : > Les ancres du sommaire (généré via le plugin) ... Je viens de tester sur SPIP 3.1.3 avec Plugin Table des matières 2.3.3, je ne reproduis pas le problème... > * Le problème n'est pas lié à un plugin particulier Tu as tout désactivé puis réactivé 1 par 1 pour voir ? > J'ai oublié une config ou c'est un dysfonctionnement de Spip ? En fait dans ta description initiale, il y a un truc qui ne va pas: > Lorsque les URL arborescentes sont activées, les ancres générées par Spip (donc, aussi des notes de bas de pages ) pointent vers l'URL de base. > Cela est dû à l'ajout de la balise "bsae href" dans le head Euh, non: ce que cette balise fait c'est de dire au navigateur "si tu trouves une URL relative, sache que tu dois y référer via "href=...", ça ne devrait pas supprimer l'URI arbo relatives (et ça ne le fait pas chez moi) > Dans ce cas, les ancres générées par Spip doivent donc pointer vers : #URL_SITE_SPIP/[ma_page]/#[mon_ancre] Euh non, plutôt vers unrep/unautrerep/article/titrearticle#ancre La disparition de l'uri relative n'est pas normale. Quels sont les "autres problèmes" que tu évoques quand tu supprimes le base href ?
Owner

SPIP s'occupe de changer automatiquement les URLs de type ancre dès lors qu'on utilise des URLs aborescentes.
ça se passe là :
https://core.spip.net/projects/spip/repository/entry/spip/ecrire/public/assembler.php#L663

Il n'est nécessaire de passer aucun filtre sur les texte ou notes etc, c'est géré automatiquement par SPIP
Statut changé à Fermé

SPIP s'occupe de changer automatiquement les URLs de type ancre dès lors qu'on utilise des URLs aborescentes. ça se passe là : https://core.spip.net/projects/spip/repository/entry/spip/ecrire/public/assembler.php#L663 Il n'est nécessaire de passer aucun filtre sur les texte ou notes etc, c'est géré automatiquement par SPIP **Statut changé à Fermé**
Owner

Je ne suis pas sur que cela soit totalement réglé ....
voir aussi: http://forum.spip.net/fr_251075.html

Je viens de tester:

  • site en SPIP 3.1
  • URLs arbo et .htaccess avec un RewriteBase /
  • dans le head du squelette public on a bien ''

les balises notes générées par le raccourci [[ ...]], les urls générées sont en relatifs et non en absolues
et donc cela renvoie sur la page d'accueil au lieu de la page courante

Je ne suis pas sur que cela soit totalement réglé .... voir aussi: http://forum.spip.net/fr_251075.html Je viens de tester: - site en SPIP 3.1 - URLs arbo et .htaccess avec un RewriteBase / - dans le head du squelette public on a bien '<base href="#URL_SITE_SPIP/" />' les balises notes générées par le raccourci `[[ ...]]`, les urls générées sont en relatifs et non en absolues et donc cela renvoie sur la page d'accueil au lieu de la page courante

Bonsoir,

Alors, j'ai un peu creusé, et en fait ça dépend directement de la structure du squelette de base.
Il faut que #TEXTE et #NOTE soient dans le même fichier de squelette que </head>

Ça doit être quelque chose du côté de https://core.spip.net/projects/spip/repository/entry/spip/ecrire/public/assembler.php#L696

D'ailleurs, si :

  • je commente :
		//and ($poshead = strpos($texte, '</head>')) !== false
  • Et que je mets explicitement juste après le <head> de mon squelette :
<base href="#URL_SITE_SPIP/" />

ça marche !

En espérant que ça permette de circonscrire le bug.

J'ai essayé de comprendre la fonction. J'ai l'impression qu'elle essaye de poser le et de réécrire les ancres dans le même temps. D'où le bug quand ça devrait être fait dans 2 squelettes différents.

Bonsoir, Alors, j'ai un peu creusé, et en fait ça dépend directement de la structure du squelette de base. Il faut que #TEXTE et #NOTE soient dans le même fichier de squelette que </head> Ça doit être quelque chose du côté de https://core.spip.net/projects/spip/repository/entry/spip/ecrire/public/assembler.php#L696 D'ailleurs, si : * je commente : ``` //and ($poshead = strpos($texte, '</head>')) !== false ``` * Et que je mets explicitement juste après le <head> de mon squelette : ``` <base href="#URL_SITE_SPIP/" /> ``` ça marche ! En espérant que ça permette de circonscrire le bug. J'ai essayé de comprendre la fonction. J'ai l'impression qu'elle essaye de poser le <base href> et de réécrire les ancres dans le même temps. D'où le bug quand ça devrait être fait dans 2 squelettes différents.

J'oubliais : j'ai testé ça avec la version Git 4.0 à jour.

Mais j'ai le bug aussi en 3.2

J'oubliais : j'ai testé ça avec la version Git 4.0 à jour. Mais j'ai le bug aussi en 3.2

Et fichiers pour tester.

Il s'agit de squelettes-dist/article.html éclaté en 2 parties. À placer dans squelettes/

Et fichiers pour tester. Il s'agit de squelettes-dist/article.html éclaté en 2 parties. À placer dans squelettes/
Owner

Ça marche chez moi (tm) en prod depuis des années, avec un squelette Z (donc le head et les #NOTES ne sont pas du tout dans un même fichier), donc non, c'est un peu plus compliqué que ça
La fonction page_base_href() est appelée dans https://git.spip.net/spip/spip/src/branch/master/ecrire/public/evaluer_page.php#L96 donc pour chaque inclusion, et aussi avant l'affichage final https://git.spip.net/spip/spip/src/branch/master/ecrire/public.php#L157

Mais de fait, en relisant le code il semble qu'on puisse être mis en echec si le base est inséré trop tot, car ensuite ça ne fonctionne plus
Peux tu essayer ce patch ?

$ git diff ecrire/public/assembler.php
diff --git a/ecrire/public/assembler.php b/ecrire/public/assembler.php
index a7dcd82044..224999f281 100644
--- a/ecrire/public/assembler.php
+++ b/ecrire/public/assembler.php
`` -722,30 +722,36 `` function page_base_href(&$texte) {
 	) {
 		$head = substr($texte, 0, $poshead);
 		$insert = false;
+		$href_base = false;
 		if (strpos($head, ' n'a de href c'est bon quand meme !
+			// si aucun  n'a de href il faut en inserer un
+			// sinon juste re-ecrire les ancres si besoin
 			$insert = true;
 			include_spip('inc/filtres');
 			$bases = extraire_balises($head, 'base');
 			foreach ($bases as $base) {
-				if (extraire_attribut($base, 'href')) {
+				if ($href_base = extraire_attribut($base, 'href')) {
 					$insert = false;
+					break;
 				}
 			}
 		}
-		if ($insert) {
+
+		if ($insert){
 			include_spip('inc/filtres_mini');
 			// ajouter un base qui reglera tous les liens relatifs
-			$base = url_absolue('./');
-			$bbase = "\n";
-			if (($pos = strpos($head, '<head>')) !== false) {
-				$head = substr_replace($head, $bbase, $pos + 6, 0);
+			$href_base = url_absolue('./');
+			$base = "\n";
+			if (($pos = strpos($head, '<head>'))!==false){
+				$head = substr_replace($head, $base, $pos+6, 0);
 			} elseif (preg_match(",<head[^>]*>,i", $head, $r)) {
-				$head = str_replace($r[0], $r[0] . $bbase, $head);
+				$head = str_replace($r[0], $r[0] . $base, $head);
 			}
 			$texte = $head . substr($texte, $poshead);
+		}
+		if ($href_base) {
 			// gerer les ancres
 			$base = $_SERVER['REQUEST_URI'];
 			// pas de guillemets ni < dans l'URL qu'on insere dans le HTML

ou si tu préfères le code intégral de la fonction corrigée :

// https://code.spip.net/`page_base_href
function page_base_href(&$texte) {
	static $set_html_base = null;
	if (is_null($set_html_base)) {
		if (!defined('_SET_HTML_BASE'))
			// si la profondeur est superieure a 1
			// est que ce n'est pas une url page ni une url action
			// activer par defaut
		{
			$set_html_base = ((
				$GLOBALS['profondeur_url'] >= (_DIR_RESTREINT ? 1 : 2)
				and _request(_SPIP_PAGE) !== 'login'
				and !_request('action')) ? true : false);
		} else {
			$set_html_base = _SET_HTML_BASE;
		}
	}

	if ($set_html_base
		and isset($GLOBALS['html']) and $GLOBALS['html']
		and $GLOBALS['profondeur_url'] > 0
		and ($poshead = strpos($texte, '</head>')) !== false
	) {
		$head = substr($texte, 0, $poshead);
		$insert = false;
		$href_base = false;
		if (strpos($head, ' n'a de href il faut en inserer un
			// sinon juste re-ecrire les ancres si besoin
			$insert = true;
			include_spip('inc/filtres');
			$bases = extraire_balises($head, 'base');
			foreach ($bases as $base) {
				if ($href_base = extraire_attribut($base, 'href')) {
					$insert = false;
					break;
				}
			}
		}

		if ($insert){
			include_spip('inc/filtres_mini');
			// ajouter un base qui reglera tous les liens relatifs
			$href_base = url_absolue('./');
			$base = "\n";
			if (($pos = strpos($head, '<head>'))!==false){
				$head = substr_replace($head, $base, $pos+6, 0);
			} elseif (preg_match(",<head[^>]*>,i", $head, $r)) {
				$head = str_replace($r[0], $r[0] . $base, $head);
			}
			$texte = $head . substr($texte, $poshead);
		}
		if ($href_base) {
			// gerer les ancres
			$base = $_SERVER['REQUEST_URI'];
			// pas de guillemets ni < dans l'URL qu'on insere dans le HTML
			if (strpos($base,"'") or strpos($base,'"') or strpos($base,'<')) {
				$base = str_replace(array("'",'"','<'),array("%27",'%22','%3C'), $base);
			}
			if (strpos($texte, "href='#") !== false) {
				$texte = str_replace("href='#", "href='$base#", $texte);
			}
			if (strpos($texte, "href=\"#") !== false) {
				$texte = str_replace("href=\"#", "href=\"$base#", $texte);
			}
		}
	}
}
Ça marche chez moi (tm) en prod depuis des années, avec un squelette Z (donc le head et les #NOTES ne sont pas du tout dans un même fichier), donc non, c'est un peu plus compliqué que ça La fonction `page_base_href()` est appelée dans https://git.spip.net/spip/spip/src/branch/master/ecrire/public/evaluer_page.php#L96 donc pour chaque inclusion, et aussi avant l'affichage final https://git.spip.net/spip/spip/src/branch/master/ecrire/public.php#L157 Mais de fait, en relisant le code il semble qu'on puisse être mis en echec si le base est inséré trop tot, car ensuite ça ne fonctionne plus Peux tu essayer ce patch ? <pre> $ git diff ecrire/public/assembler.php diff --git a/ecrire/public/assembler.php b/ecrire/public/assembler.php index a7dcd82044..224999f281 100644 --- a/ecrire/public/assembler.php +++ b/ecrire/public/assembler.php `` -722,30 +722,36 `` function page_base_href(&$texte) { ) { $head = substr($texte, 0, $poshead); $insert = false; + $href_base = false; if (strpos($head, '<base') === false) { $insert = true; } else { - // si aucun <base ...> n'a de href c'est bon quand meme ! + // si aucun <base ...> n'a de href il faut en inserer un + // sinon juste re-ecrire les ancres si besoin $insert = true; include_spip('inc/filtres'); $bases = extraire_balises($head, 'base'); foreach ($bases as $base) { - if (extraire_attribut($base, 'href')) { + if ($href_base = extraire_attribut($base, 'href')) { $insert = false; + break; } } } - if ($insert) { + + if ($insert){ include_spip('inc/filtres_mini'); // ajouter un base qui reglera tous les liens relatifs - $base = url_absolue('./'); - $bbase = "\n<base href=\"$base\" />"; - if (($pos = strpos($head, '<head>')) !== false) { - $head = substr_replace($head, $bbase, $pos + 6, 0); + $href_base = url_absolue('./'); + $base = "\n<base href=\"$href_base\" />"; + if (($pos = strpos($head, '<head>'))!==false){ + $head = substr_replace($head, $base, $pos+6, 0); } elseif (preg_match(",<head[^>]*>,i", $head, $r)) { - $head = str_replace($r[0], $r[0] . $bbase, $head); + $head = str_replace($r[0], $r[0] . $base, $head); } $texte = $head . substr($texte, $poshead); + } + if ($href_base) { // gerer les ancres $base = $_SERVER['REQUEST_URI']; // pas de guillemets ni < dans l'URL qu'on insere dans le HTML </pre> ou si tu préfères le code intégral de la fonction corrigée : <pre> // https://code.spip.net/`page_base_href function page_base_href(&$texte) { static $set_html_base = null; if (is_null($set_html_base)) { if (!defined('_SET_HTML_BASE')) // si la profondeur est superieure a 1 // est que ce n'est pas une url page ni une url action // activer par defaut { $set_html_base = (( $GLOBALS['profondeur_url'] >= (_DIR_RESTREINT ? 1 : 2) and _request(_SPIP_PAGE) !== 'login' and !_request('action')) ? true : false); } else { $set_html_base = _SET_HTML_BASE; } } if ($set_html_base and isset($GLOBALS['html']) and $GLOBALS['html'] and $GLOBALS['profondeur_url'] > 0 and ($poshead = strpos($texte, '</head>')) !== false ) { $head = substr($texte, 0, $poshead); $insert = false; $href_base = false; if (strpos($head, '<base') === false) { $insert = true; } else { // si aucun <base ...> n'a de href il faut en inserer un // sinon juste re-ecrire les ancres si besoin $insert = true; include_spip('inc/filtres'); $bases = extraire_balises($head, 'base'); foreach ($bases as $base) { if ($href_base = extraire_attribut($base, 'href')) { $insert = false; break; } } } if ($insert){ include_spip('inc/filtres_mini'); // ajouter un base qui reglera tous les liens relatifs $href_base = url_absolue('./'); $base = "\n<base href=\"$href_base\" />"; if (($pos = strpos($head, '<head>'))!==false){ $head = substr_replace($head, $base, $pos+6, 0); } elseif (preg_match(",<head[^>]*>,i", $head, $r)) { $head = str_replace($r[0], $r[0] . $base, $head); } $texte = $head . substr($texte, $poshead); } if ($href_base) { // gerer les ancres $base = $_SERVER['REQUEST_URI']; // pas de guillemets ni < dans l'URL qu'on insere dans le HTML if (strpos($base,"'") or strpos($base,'"') or strpos($base,'<')) { $base = str_replace(array("'",'"','<'),array("%27",'%22','%3C'), $base); } if (strpos($texte, "href='#") !== false) { $texte = str_replace("href='#", "href='$base#", $texte); } if (strpos($texte, "href=\"#") !== false) { $texte = str_replace("href=\"#", "href=\"$base#", $texte); } } } } </pre>

Merveilleux Cédric !

J'ai testé en 4.0 et en 3.2.11 (merci pour le code complet que j'ai copié/collé à la place de l'ancien dans les 2 versions de SPIP) et ça corrige les ancres en url arbo.

Merci à toi.

Merveilleux Cédric ! J'ai testé en 4.0 et en 3.2.11 (merci pour le code complet que j'ai copié/collé à la place de l'ancien dans les 2 versions de SPIP) et ça corrige les ancres en url arbo. Merci à toi.
Sign in to join this conversation.
No Milestone
No project
No Assignees
6 Participants
Notifications
Due Date

No due date set.

Dependencies

This issue currently doesn't have any dependencies.

Loading…
There is no content yet.