Revisions : SPIP
Les articles publiés sur le site
-
Evolution #4103 : Autoriser /local/cache-gd2/ et /local/cache-vignette/ dans robots.txt
11 mai 2021, par b bDites, vu que la modif est plutôt mineure ça vaudrait le coup de la reporter en 3.2 puisque c'est une LTS ?
-
Anomalie #3882 : Ancres des notes de bas de page pour les URL arborescente
11 mai 2021, par cedric -Ç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 fonctionpage_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#L157Mais 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, '<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, '')) !== false) { - $head = substr_replace($head, $bbase, $pos + 6, 0); + $href_base = url_absolue('./'); + $base = "\n<base href=\"$href_base\" />"; + if (($pos = strpos($head, ''))!==false){ + $head = substr_replace($head, $base, $pos+6, 0); } elseif (preg_match(",]*>,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, '')) !== 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, ''))!==false){ $head = substr_replace($head, $base, $pos+6, 0); } elseif (preg_match(",]*>,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='/documentation/site/revisions-spip?debut_articles=370#") !== false) { $texte = str_replace("href='/documentation/site/revisions-spip?debut_articles=370#", "href='$base#", $texte); } if (strpos($texte, "href=\"#") !== false) { $texte = str_replace("href=\"#", "href=\"$base#", $texte); } } } }
-
Anomalie #3882 : Ancres des notes de bas de page pour les URL arborescente
10 mai 2021Et fichiers pour tester.
Il s'agit de squelettes-dist/article.html éclaté en 2 parties. À placer dans squelettes/
-
Anomalie #3882 : Ancres des notes de bas de page pour les URL arborescente
10 mai 2021J'oubliais : j'ai testé ça avec la version Git 4.0 à jour.
Mais j'ai le bug aussi en 3.2
-
Anomalie #3882 : Ancres des notes de bas de page pour les URL arborescente
10 mai 2021Bonsoir,
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Ç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, '')) !== false
- Et que je mets explicitement juste après le 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.
- je commente :