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 b

    Dites, 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 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, '<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 2021

    Et 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 2021

    J'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 2021

    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

    Ç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.